Programar em C++/Alô, Mundo!

Olá mundo!

editar

É comum, no aprendizado de uma linguagem de programação, que seu primeiro programa faça com que o computador exiba "Olá mundo!". Na linguagem C++ este primeiro programa já introduz muitos conceitos sobre a linguagem. Veja o código do nosso primeiro programa:

#include <iostream>

using namespace std;

int main ()
{
  cout << "Olá mundo!"; 
  return 0;
}

Assim como para começar a dirigir não é necessário saber toda a mecânica do carro, para programar não precisamos logo de início nos prender a todos os detalhes.

No programa acima, vamos dar atenção apenas ao conteúdo que se encontra entre as chaves:

 {
   cout << "Olá mundo!";
   return 0;
 }
  • cout << "Olá mundo!";

A palavra cout vem de Console OUT (saída do console), onde geralmente temos a saída no monitor. O cout é seguido do operador << e da frase que se quer informar entre aspas: "Olá mundo!", intuitivamente, isso nos leva a ideia de que a sequência de caracteres será levada ao cout.

  • return 0;

Este comando termina o programa, o estudaremos melhor no capítulo sobre funções e retornos.


ATENÇÃO:

Caso seu sistema operacional seja o Microsoft Windows, você deve adicionar imediatamente antes de return 0; a seguinte linha:

  • system ("pause");

A função system() executa um comando do Windows. É como se o próprio usuário digitasse pause no prompt do MSDOS. Este comando deve ser evitado, pois diminui a portabilidade do programa, já que pause só existe nos sistemas Microsoft. No entanto, se está usando Windows é necessário adicionar esta linha, caso contrário o computador escreveria "Olá mundo!" e fecharia o programa antes que pudéssemos ler qualquer coisa. Uma forma elegante de lidar com estas peculiaridades do Windows é usar predefinições, de forma que o programa seja portável para qualquer sistema operacional:

#if defined(_MSC_VER)
// estas linhas serão executadas apenas quando o programa
// for compilado por alguma versão do Microsoft Visual C
  system("pause"); 
#endif

Em sistemas parecidos com UNIX, como GNU/Linux ou FreeBSD, pode-se usar um terminal de linha de comando facilmente, pois os mesmos possuem o recurso facilmente acessível, mesmo quando o usuário está usando a interface gráfica. Por isso, para esses sistemas um comando para solicitar pausa ao sistema não é necessário.

Entrada de dados e comentários no código

editar

Comentário é um recurso muito útil em programação. Ele permite que o programador adicione texto ao programa para facilitar o entendimento do programa por parte de outros programadores, ou até dele mesmo. Os comentários são usados para explicar trechos de código, adicionar cláusulas e qualquer texto em geral.

Vamos agora para um programa mais completo com entrada de dados e comentários dentro do código:

// Este é um comentário de uma linha

/*
  Este é 
  um comentário
  de várias
  linhas 
*/

#include <iostream>

using namespace std;

int main ()
{
  int x;
  cout << "Digite um número: ";
  cin >> x;
  cout << "\nVocê digitou o número: " << x << endl;
  return 0;
}

Comentários no programa

editar

Observemos esta linha:

 // Este é um comentário de uma linha

Esta é uma linha de comando para o preprocessador (ou precompilador).

O que é o preprocessador? Durante o processo de montagem do programa em formato binário existem três fases principais: O preprocessamento, a compilação e a fase de ligação (link). O preprocessador é um programa invocado pelo compilador para remover comentários e substituir certas partes do programa conforme a necessidade do código criado pelo programador.

O preprocessador faz algumas alterações no texto fonte, que basicamente consistem em eliminar pedaços de código e/ou substituí-los por outros (copy-paste). Enfim, o mesmo altera o código fonte contendo comandos iniciados com # e outros comandos específicos, por outro código sem comandos de preprocessamento, puramente em linguagem C++.

Ao analisar o código, o preprocessador encontra a sequência // e vai eliminar o texto que está a seguir até ao fim da linha.

Mais uma forma de adicionar comentários:

/*
 Este é 
 um comentário
 de várias
 linhas 
*/

A linguagem C++ permite também fazer comentários por mais do que uma linha. Chama-se comentário por bloco e o que faz é eliminar tudo o que encontrar entre a sequência inicial /* e o final */.

A vantagem de termos esta possibilidade é poder comentar o nosso código. Existem algumas regras de boa conduta para comentários que foram criadas por pessoas que já têm muito tempo nisto:

  • Uma é criar logo no topo um comentário a dizer o que é o nosso programa, e o que faz numa forma geral;
  • Outra é fazer comentários a cada função que aparece no código a explicar;
  • Outra é comentar uma linha mais obscura, mais difícil de entender, que não é óbvia;
  • A outra é não comentar tudo. O comentar deve ser para sobressair.

Esta última regra pode ser esquecida quando o programa é didático, neste caso pode-se usar o programa como texto comentado.

Incluindo cabeçalhos

editar

#include <iostream>

O símbolo # é uma chamada de atenção ao compilador a dizer que aquela linha é para o preprocessador, depois temos o "include" (que basicamente diz para incluir código). Incluir o quê?

Deve incluir o ficheiro/arquivo iostream. (in+out+stream, "fluxo de entrada e saída", padrão) (na maioria das vezes, como entrada padrão temos o teclado e como saída temos o monitor) (este ficheiro/arquivo contém declarações das funções e definições que o nosso código fonte irá necessitar)

Este código que será incluído é chamado de cabeçalho devido a uma característica evidente, o fato de ser código de declaração inicial do programa, que deve estar no topo do arquivo/ficheiro.

Existem outros arquivos (ficheiros cabeçalho), o iostream é para fluxos de entrada e saída, mas temos muitos mais para matemática, manipulação de tempo, tratamento de caracteres, etc...

Na maioria das vezes, os arquivos de cabeçalho fazem parte de uma biblioteca. Podemos ver na parte dos anexos, algumas bibliotecas que existem juntamente com as funções de cada uma. Nós próprios podemos criar uma biblioteca com código e nosso próprio cabeçalho. E até podemos comprar bibliotecas existentes comercialmente, através de empresas especializadas em desenvolvimento, que também terão seus arquivos/ficheiros de cabeçalhos.

Mas, o que são bibliotecas? São arquivos com um conjunto de códigos que alguém fez antes. As que enunciamos antes são as "standard", são aquelas que têm as funcionalidades básicas, pertencentes aos padrões da linguagem. Repare-se que precisamos da biblioteca até para escrever (no ecrã)/(na tela) (stream + out) que nos permite utilizar o cout.

O ficheiro/arquivo iostream está envolvido em < >, isto significa que o preprocessador deve procurar o ficheiro/arquivo no sítio/diretório usual (que é onde o compilador usa como padrão para os "includes"). Se tivéssemos o ficheiro/arquivo iostream envolvido em "" significaria que o preprocessador deveria procurá-lo dentro de uma lista de diretórios de inclusão, "includes", iniciando pelo diretório atual.

As bibliotecas são compostas por 2 partes: um índice de todas as funções e definições e declarações, o cabeçalho, e depois a definição de todas as funções existentes no índice, arquivos de código.

As diretivas de preprocessamento não terminam com o ponto e vírgula como nas instruções.

Namespace

editar

using namespace std;

Observando esta linha, alguns tradicionais programadores em linguagem C, têm uma novidade: namespaces são espaços de nomes dentro do código, eles funcionam, entre outras coisas, como um meio de evitar duplicação de nomes dentro de um projeto extenso, que geralmente contam com inúmeros arquivos.

O C++ usa os namespaces para organizar os diferentes nomes usados nos programas. Cada nome usado no ficheiro/arquivo biblioteca "standard iostream" faz parte do "namespace" chamado de std.

O objeto de saída padrão, cout, está definido dentro do "namespace" std, ele é um objeto da classe "ostream" "output stream", para acessá-lo temos que referenciá-lo como "std::cout". Para evitar que tenhamos que informar "std::" todas as vezes que precisarmos usar os recursos deste "namespace", podemos informar que estamos usando-o dentro do arquivo atual, conforme vemos na linha declarada no início deste tópico.

O "namespace" permite que as variáveis sejam localizadas em certas regiões do código. Declarar o "namespace std" permite que todos os objetos e funções da biblioteca "standard input-output" possam ser usados sem qualquer qualificações específicas, desta maneira, não é mais necessário o uso de "std::".

Este é um conceito avançado que podemos explorar mais, vamos deixá-lo para depois.

Função "main"

editar

int main(){}

Como na linguagem C, a função principal de entrada do programa a partir do sistema operacional é a função main. Por isso mesmo ela é obrigatória em qualquer programa. Se não existisse uma "main function", não haveria entrada para que o sistema iniciasse o programa.

Todas as funções são declaradas e usadas com o operador ( ), assim é que o compilador reconhece que estas são funções. A ideia de ter funções é permitir o encapsulamento de uma ideia ou operação, dar um nome a isso e depois chamar essa operação de várias partes do programa simplesmente usando o seu nome. As funções declaradas como membros de uma classe de objetos podem ser chamadas de métodos.

Do ponto de vista funcional, um código dentro de uma função executa operações em outra parte do programa, que não é aquela de onde foi chamada, por este motivo as mesmas contam com um mecanismo de passagem de dados, ao declarar uma função indicamos quais os dados que entram e o que ela deve fornecer a quem lhe chamou. Pode-se dizer que, tal qual uma função matemática, a função em C/C++ poderá ser substituída, depois de sua execução, pelo valor que ela retorna, este valor será especificado antes do nome da função na declaração da mesma, conforme vemos no início deste tópico.

O int significa que a função vai retornar um inteiro. Existem outros tipos de dados como, por exemplo, os seguintes:

  • int que é a abreviatura de inteiro;
  • char que é a abreviatura de caratere;
  • float que é a abreviatura de "floating point number", ou seja, uma representação para número real.

Vejamos um exemplo:

Quando criamos uma função soma, obviamente só para ilustração pois isso não é necessário, podemos fazer:

int soma(int a, int b)
{ return a + b;
}

Agora imagine que tenhamos que somar 2 e 3, colocando o resultado em outra variável chamada valor, para isto faremos:

valor = soma(2, 3);

Primeiro analisamos qual é o resultado e depois substituímos a função pelo valor que ela retorna:

valor = 5;

Simples, não?

; - Final de sequência de instruções

O ponto e vírgula funciona como ponto final, separa as instruções e contextos. Repare que apenas as funções, ou melhor, as definições de funções e as diretivas de preprocessamento é que não têm o ";"

É importante notar que o código poderia ser todo escrito quase numa linha tipo:

int main (){int a; cout << "Hello world! Digite um número:\n"; cin >> a;cout <<
 "Você digitou o número: " << a<<"\n";return 0;}

É realmente o ";" que faz a terminação das instruções.

Ao encontrar as chaves "{}", o compilador reconhece como um delimitador de bloco, ou "body", corpo. O corpo de uma função ou bloco de código começa com "{" e termina com "}", como temos as instruções agrupadas, já não há necessidade de colocar o ";" no final para indicar onde é o fim do bloco.

No nosso exemplo existem 2 instruções no corpo da função. As instruções são executadas por ordem: do topo até ao fim a menos que existam funções que alterem o fluxo da leitura ou que existam códigos de controle de execução "execution control codes", que alteram o caminho de execução.

Entrada e saída (cin/cout)

editar

cout << "Hello world! Digite um número:\n";

(c+out) Podemos utilizar este objeto porque pusemos o header e o namespace std. As informações serão direcionadas através do iostream, um subsistema de entrada e saída da biblioteca padrão. O que este objeto nos permite é enviar o que temos entre aspas para a saída (out), que é o monitor neste caso.

Quem já conhece a linguagem C, certamente está familiarizado com os streams da biblioteca padrão, o stdin, o stdout e o stderr... A linguagem C++ implementa os mesmos dispositivos sob a forma de objetos.

O cout envia dados para o "standard output device", que é usualmente o monitor, a abstração do elemento de saída padrão é observada na presença de um objeto que representa a saída física de dados para o meio externo.

Observa-se que temos o operador <<, neste caso podemos verificar mais uma das funcionalidades da linguagem, pois este operador é usado para deslocamento de bits na sua funcionalidade padrão, neste caso a sua função foi substituída por outra, transferir os dados a sua direita para o "output stream" do seu lado esquerdo.

O cout é um objeto da biblioteca "standard C++" que tem como uma de suas funções imprimir strings no "standard output" (que normalmente é o/a ecrã/tela).

Da mesma forma que podemos formatar o texto enviado a saída padrão na linguagem C, também podemos fazê-lo com os objetos do C++, por exemplo, se acrescentássemos "<< hex <<" entre uma variável e a saída:

cout<< hex << n;

O resultado seria impresso em hexadecimal;

Para entrada de dados temos:

cin >> a;

O que esta linha faz é colocar o valor que foi digitado numa área de memória que foi chamada de "a".

Da mesma forma que o cout existe para saída de dados, temos outro objeto para entrada através do teclado, este objeto é chamado de Console IN - cin, seguindo a mesma analogia. Observe que o operador >> é usado para dar ideia de que os dados estão vindo do cin para a variável "a".

cout << "Você digitou o número: " << a << "\n";

Aqui voltamos a utilizar o objeto cout primeiro para imprimir no/na ecrã/tela a frase "Você digitou o número: ", depois vai buscar o valor que está naquela área de memória a que chamamos de "a" e por fim coloca o fim de linha através de "\n", em C++ podemos usar um finalizador de linha chamado endl, o uso do mesmo é mais eficiente pois descarrega os dados do stream logo após a finalização da linha.

função system("pause")

editar

system ("pause");

A maioria dos compiladores quando estão executando em modo gráfico fecha o console de saída assim que o programa finaliza. Isto impede que possamos ver o que aconteceu, principalmente quando o programa contém apenas umas poucas instruções.

A função system(), faz parte do padrão da linguagem C, ela executa uma chamada de sistema, ou seja, ela passa um comando para o sistema, que neste caso é "pause", como já informamos no início deste capítulo, este comando é destinado a sistemas da Microsoft®. Coloquei esta linha para que o programa não finalizasse sem que pudéssemos ver uma janela com o resultado, se não o fizesse a janela abriria e fecharia sem que pudéssemos ver o aconteceu durante a execução do programa.

Em sistemas como GNU/Linux, FreeBSD, Solaris®, etc... temos acesso a terminais de console e compiladores em linha de comando, assim basta compilar o programa sem esta linha e depois executá-lo, para ver o resultado.

Retornando valor

editar

return 0

Faz com que a função retorne o valor zero, como esta função é a principal do programa, por onde o sistema operativo/operacional iniciou a execução do mesmo, este retorno é recebido pelo sistema, é comum que valores diferentes de zero sejam interpretados como erro do programa.

Esta instrução manda retornar o valor zero para o sistema operativo/operacional (Windows, Unix, ...). Este zero representa a dizer que o programa finalizou normalmente. Pode acontecer que o programa não finalize como seria de esperar, ele tem um crash (ou porque ficou com falta de memória.). O sistema operativo/operacional necessita de lidar com estas terminações anormais de uma forma diferente das normais. Por isso é que o programa diz ao sistema operativo/operacional que terminou normalmente.

Questão: porque é que o sistema operativo necessita de saber que o programa terminou bem?