5 Apresentando a linguagem C O criador da linguagem de programação C foi Dennis Ritchie que, na década de 70, programou-a por meio de um computador DEC PDP-11 rodando sistema operacional Unix. Entretanto, uma linguagem geralmente não nasce do nada. C foi desenvolvida a partir da linguagem B, outra linguagem, agora criada por Ken Thompson com contribuições também de Dennis Ritchie. E não pára por aí: também a linguagem B foi desenvolvida a partir de outra, na verdade foi desenvolvida como uma simplificação da linguagem BCPL. Todas elas são linguagens de programação imperativas. Enquanto que a linguagem B apresentava fraca tipagem (há somente um tipo de dado, que correspondia a uma palavra de máquina) e apresentava grande foco na simplificação e baixo consumo de memória dos computadores da época, a linguagem C tornar-se-ia uma linguagem fortemente tipada e introduziria o conceito de pacotes ou arquivos-cabeçalho, como o pacote de entrada/saída padrão (conhecido como standard I/O ou stdio). 5.1 Case sensitivity Quando desenvolvendo em linguagem C, é importante lembrar que tal linguagem é case sensitive, isto é, há diferenciação entre maiúsculas e minúsculas na declaração de identificadores. Sendo assim, um identificador declarado como soma não será reconhecido façamos referência ao mesmo pela palavra SOMA ou mesmo Soma, pois o programa interpretará como se essas fossem referências para outras variáveis. O inverso também é válido: se tivermos uma constante MAX_ALUNOS declarada em nosso programa, não poderemos referenciá-la por meio de max_alunos. Tal propriedade também se aplica aos comandos da linguagem, isto é, caso tentemos referenciar o comando if como sendo IF ou mesmo If não teremos sucesso, sendo portanto muito importante termos atenção redobrada enquanto digitando nosso código-fonte. Agora, vejamos um primeiro exemplo de programa escrito na linguagem C.
5.2 Primeiro exemplo de programa em C Abaixo, um exemplo de programa bem simples: Código-fonte: Saída: #include <stdio.h> /* Nosso Primeiro Programa */ int main () { printf ("Hello world!\n"); return 0; } Hello world! tela? Que tal agora entendermos como esse código-fonte reproduziu aquela saída em 5.2.1 Analisando o programa por partes A primeira linha ( #include <stdio.h> ) é uma diretiva include e especifica ao compilador o nome de um arquivo a ser incluído no momento da compilação. Ao fazermos isso, todas as funções, variáveis, constantes e structs presentes naquele arquivo estarão disponíveis ao nosso programa em nosso exemplo, isso nos permitirá usar a função printf, declarada em stdio.h, em nosso programa. Diz-se então que stdio.h é um arquivo-cabeçalho (de onde vem a extensão.h header file ), muitas vezes chamado também de biblioteca, por ser um arquivo a armazenar funções e variáveis que poderão ser reusadas por outros códigos-fonte. A próxima linha neste programa ( /* Nosso Primeiro Programa */ ) trata-se de um comentário, isto é, uma sequência de caracteres que será ignorada pelo compilador, não fazendo parte, portanto, do código do programa em si, estando presente no códigofonte como uma forma de fazer um comentário, explicar algo a respeito de todo o programa ou sobre uma parte do mesmo. A terceira linha a ser considerada ( int main() { ) indica que estamos definindo uma função de nome main. Cada linguagem apresenta formas diferentes para determinar qual a rotina principal de um código-fonte, aquela a ser executada assim que um programa é iniciado e em C, nós fazemos isso especificando todo o código principal a
ser executado dentro de uma função main. A palavra int especifica o tipo de retorno da função declarada, neste caso, a função main retornará um inteiro. A função main é delimitada por um par chaves ( { e } ), que determinam onde começa e termina a sequência de instruções a ser executada. Dentro daquelas chaves, as instruções serão executadas sequencialmente, exceto no caso de instruções de controle e repetição, que poderão alterar um pouco o fluxo das instruções. Na próxima linha ( printf("hello world!\n"); ) começamos a ação de verdade. Como foi dito anteriormente, a função printf é uma função da biblioteca stdio e tem como finalidade imprimir texto formatado em tela. Neste exemplo, estaremos imprimindo somente a mensagem Hello world! e efetuando uma quebra de linha ao final ( \n ). E por fim, na próxima linha ( return 0; ) encerramos a execução de nossa função main, retornando um valor inteiro como a sua assinatura requer (neste caso, estaremos retornando o valor zero). Estudemos agora outro programa escrito em C, agora um pouco mais complexo. 5.3 Segundo exemplo de programa em C Código-fonte: #include <stdio.h> int main () { /* Declaracao de variaveis */ int dias; float anos; /* Entrada de Dados */ printf ("Entre com o numero de dias: "); scanf ("%d", &dias); anos = dias/365.25; /* Saida de Dados */ printf ("\n\n%d dias equivalem a %f anos.\n", dias, anos); } return 0;
Saída: Entre com o numero de dias: 300 300 dias equivalem a 8.821355 anos. Mais uma vez, analisemos linha por linha de nosso código-fonte. 5.3.1 Analisando o programa por partes As duas primeiras linhas ( #include <stdio.h> e int main () { ) já foram comentadas no exemplo anterior: tratam-se da diretiva include e da assinatura da função principal. A terceira linha ( /* Declaracao de variaveis */ ) trata-se de um comentário para nos avisar que iniciará agora a seção de declaração de variáveis. Nas duas próximas linhas ( int dias; e float anos; ), então, estamos a declarar as duas variáveis que necessitaremos em nosso programa: a variável dias, que será do tipo int e, portanto, somente poderá receber valores inteiros, e a variável anos, que será do tipo float, sendo assim uma variável de ponto flutuante e, portanto, aceitando receber valores com casas decimais. Em todo programa que criarmos na linguagem C, precisaremos sempre declarar as variáveis antes de podermos utilizar a mesma. Vale lembrar que, por diversas razões, é uma boa prática incluir a declaração das variáveis sempre no início do bloco de código onde as mesmas serão utilizadas, antes de outros comandos. A seguir teremos um novo comentário ( /* Entrada de Dados */ ) avisando-nos que as próximas linhas são utilizadas para a requisição e leitura da entrada de dados, que neste exemplo trata-se do número de dias. As duas próximas linhas ( printf ("Entre com o numero de dias: "); e scanf ("%d", &dias); ) encarregam-se então de imprimir a mensagem Entre com o numero de dias: na tela e em seguida ler (scanf) o valor entrado pelo usuário formatado como um número inteiro ( %d ) e armazená-lo na variável dias. Percebamos que o segundo parâmetro de scanf apresenta o símbolo & junto à variável dias. O & é um operador utilizado para retornar o endereço da variável, sendo assim, o que scanf receberá como parâmetro é o endereço da variável na qual queremos armazenar o valor que o usuário irá informar. Observemos também que há uma vírgula separando os dois parâmetros passados em scanf. Na próxima linha ( anos = dias/365.25; ) realizamos algum cálculo: pegamos o número armazenado na variável dias, dividimos por 365.25 e armazenamos na variável anos. Outra forma de dizer isso é: atribuímos a anos o valor de dias dividido por 365.25.
Já quase no final de nosso programa, temos um comentário ( /* Saida de Dados */ ) especificando que a próxima linha imprimirá a saída desejada e a impressão da mesma ( printf ("\n\n%d dias equivalem a %f anos.\n", dias, anos); ). Perceba que, agora, nosso printf recebe três parâmetros, em vez de somente um, como nos casos anteriores. O primeiro parâmetro é a string formatada, que especifica como as informações devem ser impressas. Os parâmetros seguintes são as variáveis, cujos valores serão incluídos na ordem em que devem aparecer na string. Sendo assim, o %d especifica que deverá se incluído naquela posição da string o valor do segundo parâmetro, formatado como um int. Já o %f especifica que ali será incluído o valor do próximo argumento, formatado como um floating. E, por fim, temos o retorno do valor da função main ( return 0; ), encerrando assim a mesma.