Luis Vasquez
[05/09/2007]
Parte 2: Apresentando a Linguagem C
2.1 Introdução
A Linguagem C tornou-se uma das linguagens mais utilizadas entre os bons programadores principalmente pelo alto domínio que esta oferece sobre a máquina. Em C é possível programar desde programas complexos de alto nível, inclusive com janelas gráficas, até à linguagem mais baixa, mexendo diretamente em endereços de memória e outras facilidades, que na verdade não são tão fáceis assim. Por esses e outros motivos mais, é que o kernel do sistema operacional Linux é compilado em C e uma grande parte do sistema que compõe o Windows também.
Vale lembrar que não vamos nos aprofundar em C. Na verdade estamos somente a utilizando como ferramenta para nossos estudos. Portanto, se você desejar se aprofundar nesta linguagem, ao termino deste estudo procure livros específicos, e boa sorte!
Porque C? Apesar desta linguagem possuir ferramentas muito complexas, C possui sua sintaxe básica bastante simples e muito semelhante ao famoso pseudo-código, na maioria dos casos, a única diferença é que em C os nomes dos comandos são escritos em inglês.
Não está cedo para iniciar com C? Uma boa parte dos livros de algoritmos computacionais primeiro escrevem “milhares” de pseudo antes de utilizar uma linguagem real. Outros não utilizam uma linguagem real. A questão é: não é possível compilar e testar um algoritmo em pseudo. E como você vai saber se está fazendo certo? Olhando no livro? Para mim programar é semelhante a matemática: A gente da uma lida no assunto, entende e mão à massa! Acredito que só é possível aprender a programar, programando, pelo menos aprender bem!
2.2 Tipos de dados em C
Vimos na seção 1.3 que os algoritmos computacionais dispõem de quatro tipos de dados. A linguagem C não dispõe do tipo primitivo booleano.
2.3 Identificadores
Os identificadores são os nomes das variáveis que utilizamos em nosso programa. Sendo assim, para uma linha: int num; num é o identificador para um tipo int. Os identificadores, em C, não podem ter espaços em branco nem caracteres especiais. Também não podemos começar escritos com números. Vejamos alguns identificadores válidos: idade, Idade, ida_de, idade1. Agora alguns identificadores inválidos: 1idade, idade 1, idade*, idadeé.
É importante notar que C diferencia letras maiúsculas de letras minúsculas. Logo idade é diferente de Idade. Ou seja, ao nomearmos duas variáveis com Idade e idade, idade será um identificado e Idade será outro.
2.4 Bibliotecas
Na seção 1.2 falamos sobre bibliotecas e a definimos como um conjunto de funções (mais adiante entenderemos o que são e para que servem as funções) prontas para serem utilizadas em nossos programas. Para escrever um programa simples em C, você precisará incluir pelo menos uma biblioteca: a stdio.h que é responsável por gerenciar as entradas e saídas de dados de seu programa. Como já dissemos, nosso objetivo não é se aprofundar em C, portanto, vamos em todos os programas incluir as bibliotecas stdio.h e a stdlib.h sem se preocuparmos se as mesmas são necessárias ou não. Naturalmente, se for verificada a necessidade de incluir mais uma outra assim o faremos. O comando responsável por incluir as bibliotecas em seu algoritmo é o #include seguido do nome da biblioteca entre “<>”. Para incluirmos stdio.h, escreveríamos o código a seguir: #include
2.5 A função main
Todo e qualquer programa escrito em C precisa possuir pelo menos uma função, a main. As funções servem para dividirmos nosso algoritmo em partes (ainda veremos isso melhor mais à frente) e garantirmos, assim, um código mais enxuto e otimizado. Quando compilamos um algoritmo escrito em C, o compilador de imediato procura a função main e começa a execução a partir dela. Inicialmente, todo algoritmo lógico de nosso programa deve ficar dentro da função main delimitado por chaves “{}”. Se não existir a função main o algoritmo não pode ser compilado.
As funções podem receber e enviar dados para outras funções. No entanto, vamos nos limitar a um padrão onde em nossos algoritmos, até o momento certo, as funções main não enviaram nem receberam dados de outras funções.
A sintaxe de uma função é
2.6 Escrevendo, compilando e executando programas em C
Independente do Sistema Operacional utilizado ou de qualquer outro fator, existe uma forma de escrever os programas de forma que seja fácil sua leitura (apesar do fato de que a forma em que um algoritmo é arrumado não influenciará em sua execução). Um algoritmo enxuto, com certeza, é um grande diferencial no meio acadêmico e uma necessidade a nível profissional. Imagine um grupo de programadores trabalhando em equipe, onde cada um adota uma forma de arrumar seu algoritmo. Seria praticamente impossível obter um bom desempenho considerando o tempo que eles iriam perder ao tentar entender o que o colega escreveu. Os algoritmos escritos aqui seguem o layout conservador da linguagem C.
2.6.1 Usando Linux
Um algoritmo escrito em C, independente da plataforma usada, deve ser salvo como um arquivo de extensão *.c e pode ser escrito em qualquer editor de textos. Aconselho o Kate para usuários do KDE e o Gedit para usuários do Gnome. Estes editores possuem opções facilitadoras à programação como exibir números de linhas e até mesmo coloração de palavras reservados1 da linguagem, o que é “uma mão na roda” quando temos um algoritmo de muitas linhas e desejamos visualizar algo.
O compilador mais famoso do Linux é o gcc, ele é usado para compilar o kernel, e, por isso geralmente já vem embutido nas distribuições. Caso a sua não o tenha baixe-o e instale-o em sua máquina. O gcc trabalha com comando via terminal e o comando usado para compilar um programa é:
$ gcc arquivo.c -o nome_do_programa_que_será_gerado
Por exemplo, vamos compilar um programa teste.c e seu nome, já compilado, será testei:
$ gcc teste.c -o testei
Nota: O arquivo gerado pelo gcc é um executável.
Para executar seu executável, assim como qualquer outro em Linux, abra o terminal e entre no diretório onde se encontra seu executável e digite:
$ ./nome_do_executável
O ./ diz ao terminal que o executável encontra-se no diretório atual, caso contrário ele irá procurar o executável no sistema, como não encontrará exibirá uma mensagem de erro: “command not found”, comando não encontrado.
2.6.2 Usando Windows
Como já vimos, um algoritmo escrito em C, independente da plataforma usada, deve ser saldo como um arquivo de extensão *.c e pode ser escrito em qualquer editor de textos. Para os usuários do Windows a coisa fica mais simples. Pois temos compiladores que já possuem seu editor de textos próprio e a compilação é feita apenas pressionando um botão. Um ótimo compilador gratuito é o Dev c++. No Windows também é gerado um executável ao compilar-se um programa, claro que um executável do Windows, e, como qualquer outro executável do Windows para abri-lo basta darmos um duplo clique!
2.7 Algoritmos em C
Agora que já falamos sobre a funcionalidade básica da linguagem C, vamos por fim escrevermos algoritmos em C e vermos como compila-lo e executa-lo.
Reescrevendo o “Calcula quadrado”:
Entendendo o programa Prog_C-01: Nas linhas 1 e 2 é realizada a inclusão das bibliotecas stdio.h e stdlib.h. Na linha 4 temos a função main de modo que não recebe nem envia dados para outras função (envia e recebe void = vazio).
A linha 5 declara as variáveis num e resultado do tipo int. Note que para duas variáveis do mesmo tipo, vale declara-las na mesma linha, separando-as com uma vírgula.
Na linha 7 imprimimos a mensagem que se encontra entre aspas duplas utilizando o printf (note que é imprime em inglês acrescido da letra “f”). “\n” equivale a um ENTER, e faz com que o cursor, quando o programa for executado, seja posicionado uma linha abaixo. No printf além do texto está escrito entre aspas duplas, o mesmo deve está entre parênteses.
Na linha 8, lemos o valor digitado pelo usuário e o armazenamos na variável num utilizando o scanf. Notamos algo diferente no scanf. O %d é o que chamamos de mascara, e serve para informar ao scanf qual o tipo de dado você deseja ler. %d indica um valor inteiro (ao longo de nossos estudos veremos todas as outras mascaras). O & que aparece antes da variável que irá receber o valor lido (num) serve para indicar o endereço de memória onde se encontra esta variável. A princípio o que precisamos saber é que toda vez que usarmos o scanf colocaremos o & antes da variável. Observe que utiliza-se uma vírgula para separar-se a mascara e a variável, e que ambas se encontram entre parênteses.
A linha 11 se comporta da mesma maneira em que escrevemos o algoritmos em pseudo-código. Ou seja, resultado recebe num vezes num.
Modificamos a linha 12 para verificarmos outro comportamento do printf. Agora estamos imprimindo texto junto a valores de variáveis. O valor que será impresso na tela é somente o que se encontra dentro das aspas duplas, sendo que onde encontram-se as mascaras, serão impressos os dados contidos nas variável separadas por vírgulas e escritas após as aspas duplas. Como o compilador saberá qual mascara pertence a qual variável? É simples! Ele busca as variáveis obedecendo a ordem em que as mascaras aparecem.
A chave “}” da linha 14 determina o final da função main e, conseqüentemente, do programa.
1- As palavras reservadas são os comandos existentes, nomes de funções especiais e nomes de constantes nativas. Alguns exemplos, respectivamente: #include, main e true.