Sunday, May 8, 2011

The "Hello, world" Example / O progama "Alo, mundo!"

On this post we write the "Hello, world!" program.
We talk about functions, command blocks, text indentation.
Come back soon, I am typing the english version of this post.


Criaremos o exemplo "Alo, mundo!" e comentaremos algumas partes de um programa em C.
Falaremos sobre Funções, blocos de comandos, indentação.



Preparação
Neste post usaremos um editor de textos e o compilador MinGW. Em posts anteriores comentamos sobre instalar editores de textos simples e o MinGW.
Instalação do Notepad++
Instalando o MinGW
Citaremos neste post o code segment, o data segment e constantes. Já comentamos sobre isto no post sobre gerenciamento de memória.

Monte uma pasta chamada:

C:\Prog\Alo

Funções
Funções são o alicerce da programação em C.
Uma função é uma sequência de instruções a serem executadas.
Algumas funções básicas foram criadas pelo desenvolvedor do compilador e as demais funções necessárias ao funcionamento do programa devem ser escritas por nós.

Nos próximos posts trataremos mais profundamente de funções, mas, para este post você deve saber que após o nome da função devem ser adicionados os caracteres ( e ). Ex.:
uma_funcao()
no exemplo acima, "uma_funcao" é um apelido dado a um lugar no Code Segment. É neste local que a programação desta função fica gravada. Você pode imaginar que dentro da palavra "uma_funcao" existe um pequeno programa que é executado sempre que o executável se depara com ela.

Podem haver valores entre os ( ), como nos exemplos:
funcao_recebe_num( 7 )
funcao_recebe_texto("Banana")
funcao_recebe_valores(6, "banana")

Estes valores entre os parenteses são chamados de parâmetros da função. Eles são enviados para a função utilizá-los.

Blocos de comandos
Os programas em C são formados por blocos de comandos. Um bloco de comandos é um par de { }.

Um bloco de comandos pode conter somente um comando, como neste exemplo:
{um_comando();}
Repare que no final de cada comando deve ser adicionado um ;
Ele é importante para indicar ao compilador que um comando terminou naquele ponto.

Um bloco pode ter também mais de um comando:
{um_comando(); outro_comando(65); mais_um_comando("cebola");}

Por questões de legibilidade podemos quebrar os comandos em várias linhas:
{
  um_comando(); 
  outro_comando(65);
  mais_um_comando( "cebola");
}
Enter, espaços, tab, podem ser adicionados a vontade entre os comandos para torná-lo mais legível. Todos são ignorados pelo compilador.

Alinhando os comandos
No exemplo acima escrevemos os comandos um pouco afastados para a direita para indicar que estão dentro do bloco. Você pode conseguir este afastamento usando o caractere Tab ou com espaços em branco. Nos nossos exemplos usaremos sempre avanços de dois espaços em branco.

Levar o texto mais a direita é chamado em ingles de indent, e trazer de volta para a esquerda, outdent.

Como, no Brasil, os pioneiros da programação não sabiam inglês, o alinhamento do texto mais a direita de passou a se chamar "indentação".

Blocos aninhados
Podemos criar blocos dentro de outros blocos, chamados de blocos aninhados, como no esquema a seguir:
{
  funcao1();
  funcao1();
  {
    funcao2();
    funcao2();
  }
  {
    funcao3();
    {
      funcao4();
    }
  }
}
No exemplo acima temos a funcao2() dentro de um bloco aninhado, por isto funcao2() fica mais a direita que funcao1().
Não há limide de níveis de aninhamento que os blocos podem ter. No exemplo acima Temos funcao4() dentro de um bloco, que está dentro de um bloco.

É muito importante indentar corretamente pois reduz o tempo necessário para se entender ou alterar um código. Se você duvida, verifique se existem blocos aninhados no exemplo sem identação abaixo, e quais blocos estáo dentro de quais. Note que você até consegue entender o que foi escrito, mas com maior gasto de tempo e de energia mental. Então este é um exemplo que jamais deverá ser seguido:
{
funcao1();
funcao1();
{
funcao2();
funcao2();
}
{
funcao3();
{
funcao4();
}
}
}

Entenda que ninguém é doido. Se uma regra como "sempre indente seu código" foi criada, não é por que os mais antigos são otários. Quando uma regra destas é criada, leia-se: "faça data forma para ganhar dinheiro mais rapidamente".

Um programa pode ter vários blocos de comandos, aninhados ou não, como segue:
{
  funcao1();
  funcao2();
}
{
  funcao3();
  funcao4();
}

A função main
Uma vez que podemos ter inúmeros blocos de comando no nosso programa, o compilador precisa de uma pista sobre onde o a execução inicia.
Então os criadores de C convencionaram que o programa iniciará em uma função de nome obrigatório: a função main.
O bloco principal, então, tem a seguinte aparência:
main()
{
  comando();
  comando();
  comando();
  ...
}

Criando o programa
Abra o editor de textos. No nosso exemplo usaremos o Notepad++.
Crie um novo documento e salve-o como:
C:\Prog\Alo\alo.c

Digite agora o bloco principal:
{

}

Salvando o trabalho
Salve o seu trabalho agora. Você deve salvar após inserir cada item. Você não quer perder o seu trabalho se houver um blecaute!
Descubra qual é a tecla de atalho do seu editor de textos para salvar o documento. Na maioria das vezes é Ctrl+S. Este é o caso do Notepad++.
Então, apos cada linha de comandos, pressione Ctrl+S.
Geralmente os editores de texto tem uma sinalização indicando que o seu trabalho foi alterado e ainda não foi salvo. No caso do Notepad++ um * junto ao nome do arquivo no topo da janela indica que o trabalho não foi salvo ainda. Assim que o salvamos, o * some.

Indicando a função main
Acima dele indique que ele será o bloco main digitando como segue:
int main(int c, char* argv[])
{

}
Salve o seu trabalho agora. Esta é a última vez que lembraremos que o trabalho deve ser salvo após cada item ser inserido.

Em um próximo post explicaremos o que cada palavra da linha main significa.

Já temos um programa
Já temos o necessário para um programa. Se ele fosse agora compilado e linkado, funcionaria perfeitamente. Ele inicia no { faz absolutamente nada e termina em }

Saída de dados
Um programa tem entradas de dados, executa um processamento e tem uma saída de dados com o resultado do processamento.
Para a saída de dados usaremos a função printf. O seu nome significa print formated=imprimir formatado. Ela recebe, na forma de parâmetros, os dados a serem enviados à saída de dados e como ela deverá formatá-los. No nosso caso vamos fazê-la exibir a frase: "Alo, mundo!". Digite a printf como segue:
int main(int c, char* argv[])
{
  printf("Alo, mundo!\n");
}

Em posts futuros explicaremos os parâmetros que podem ser enviados a printf. Por hora diremos que o valor entre aspas indica que é uma constante do tipo texto e que \n indica a printf que deverá enviar para a tela o caractere de quebra de linha (tecla return do teclado).

O protótipo de uma função
Se tentássemos compilar o progrma agora ele geraria um erro pois a palavra printf não é conhecida dele como main é.

Devemos escrever no topo do nosso programa uma explicação de como se usa a printf. Assim o compilador passará a reconhecer esta palavra como válida e saberá se a estamos usando de maneira correta.

Esta explicação de uma função que colocamos no topo do programa é chamada de protótipo da função.

Então precisamos colocar acima de main o protótipo da printf.

Diretivas do Pré-processador
A printf precisa de um protótipo. O problema é que nós não sabemos como!
Mas, calma. Contornamos este problema da seguinte forma:
Os criadores dos compiladorer escrevem os protótipos de todas as funções que eles oferecem em arquivos .h que acompanham o compilador.
A extensão .h é a abreviação de header=cabeçalho
A printf é descrita no arquivo stdio.h

Mais tarde falaremos mais sobre o que fazem as diretivas do pré-processador, e o que é o pré-processador. Mas para este exemplo você tem que saber que as diretivas são comandos que iniciam pelo caractere #

Exite a uma diretiva chamada #include que inclui no nosso arquivo o conteúdo de outro arquivo. Não é a toa que geralmente os arquivos .h que o compilador nos oferece ficam numa pasta chamada "include".

Usaremos a diretiva #include para trazer para o nosso arquivo, o .h que possui o protótipo de printf.

O arquivo stdio.h possui os protótipos das funções que envolvem a entrada e saída de dados, inclusive da printf.

Mas como saber isto? Consultando a documentação que acompanha o seu compilador. Na medida que formos utilizando funções em nossos exemplos, indicaremos os arquivos .h necessários.

Digite a #include do stdio.h como segue:
#include <stdio.h>

int main(int c, char* argv[])
{
  printf("Alo, mundo!\n");
}

Finalmente, o programa está pronto e já pode ser compilado.

Vamos partir do pressuposto que você salvou o programa como alo.c na pasta c:\prog\alo

Abra o prompt do ms-dos.
Entre na pasta onde está o nosso programa com o comando cd como segue:
cd \prog\alo

Você pode verificar se o arquivo foi salvo corretamente digitando o comando "dir" seguido de enter. Você deve ver algo como:
C:\Prog\Alo> dir
 O volume na unidade C é XP
 O número de série do volume é 143B-4126

 Pasta de C:\Prog\Alo

08/05/2011  11:27     DIR          .
08/05/2011  11:27     DIR          ..
08/05/2011  11:12               459 alo.c
               1 arquivo(s)            459 bytes
Todos os comandos que comentarmos aqui só serão executados após a tecla enter, por isto não citaremos mais neste blog a necessidade de pressionar enter após cada comando.

O programa gcc.exe, que está na pasta Bin do MinGW, pode ser chamado de qualquer pasta, pois, durante a sua instalação, nós colocamos a sua pasta bin na variável PATH.

GCC é o compilador C usado pelo grupo GNU.
Adiante também usaremos o GPP, que é o compilador C++ do grupo GNU.

Comentamos sobre isto no post sobre o GCC

Se digitarmos somente "gcc" e o nome do arquivo fonte, ele vai compilar e linkar o programa e gerar somente o aquivo executável. Por default ele cria um programa chamado "a.exe".

Você pode indicar o nome desejado do arquivo executável com a opção -o seguida do nome do arquivo. Digite:
gcc alo.c -o alo.exe

Se você instalou tudo corretamente e digitou o programa sem erros, nada deve ter aparecido, a não ser o prompt do ms-dos aguardando por um novo comando.

Se alguma mensagem aparecer e você não entender, envie-nos na forma de comentários neste post que postaremos um comentário respondendo como corrigir o problema.

Você pode se certificar que o executável foi criado repetindo o comando dir:
C:\Prog\Alo> dir
 O volume na unidade C é XP
 O número de série do volume é 143B-4126

 Pasta de C:\Prog\Alo

08/05/2011  11:27     DIR          .
08/05/2011  11:27     DIR          ..
08/05/2011  11:12               459 alo.c
08/05/2011  11:15            22.526 alo.exe
               2 arquivo(s)         22.985 bytes
               1 arquivo(s)            459 bytes
Repare que após converter o programa para linguagem de máquina e ligá-la a bibliotecas como a stdio, o tamanho do arquivo final ficou bem maior que o do arquivo fonte.

Para testar o programa, digite o seu nome:
C:\Prog\Alo>alo
Alo, mundo!

C:\Prog\Alo>

Veja neste vídeo o que foi feito neste post.
Nele criamos a pasta Prog, que utilizaremos nos exemplos deste blog.
Abaixo da prog criamos a pasta alo.
Digitamos o programa no Notepad++.
Repare que a cor dos textos varia no Notepad++ conforme a sua função no programa.
Este recurso é oferecido por vários editores de código e é chamado de "syntax highlighting".
Depois abrimos uma janela do cmd, compilamos e testamos o programa.


Esperamos que este post tenha sido útil. Tem algum comentário, dúvida, crítica ou elogio? Esreva nos comentários.
english top

No comments: