Saltar para o conteúdo
Topos Uranos

Resumo

Um programa transforma entradas em saídas, e esta aula estuda os dois extremos dessa transformação e o que pode falhar entre eles. Ensina a escrever com std::print e std::println, com marcadores e especificações de formato que fixam a largura, o alinhamento e as casas decimais; a ler números com std::cin; a prever o que acontece quando o usuário digita algo diferente do que foi pedido, coisa que, com um sistema de entrada como o de C++, não produz um aviso, mas um fluxo em estado de erro e uma variável com um zero; e a classificar os erros de um programa em quatro tipos, segundo o momento em que se manifestam: de compilação, de ligação, de execução e de lógica. Termina com a leitura metódica das mensagens do compilador.

Objetivos de aprendizagem

  1. Escrever programas que leiam dados com std::cin e escrevam resultados com std::println, usando especificações de formato para a largura e as casas decimais.
  2. Prever a saída exata de um programa com várias chamadas a std::print e std::println, quebras de linha incluídas.
  3. Descrever o que acontece quando a entrada não tem a forma esperada (letras em lugar de um número) e verificar o estado da leitura.
  4. Classificar um erro como de compilação, de ligação, de execução ou de lógica, e localizá-lo a partir de sua manifestação.

O programa e sua fronteira

Na aula Do problema ao algoritmo, cada problema foi especificado pelo que entra e pelo que sai. Um programa realiza essa especificação: recebe dados, transforma-os e entrega resultados. Ora, os dados não nascem dentro do programa, mas fora dele, no teclado de quem o usa, num arquivo ou em outro programa; e os resultados tampouco ficam dentro, mas vão para uma tela, para um arquivo ou para outro programa. A comunicação com esse exterior se faz por dois canais que o sistema operacional abre para todo programa ao colocá-lo em marcha: a entrada padrão, que num terminal é o que se digita no teclado, e a saída padrão, que é o que o terminal mostra. C++ os representa como fluxos (streams): sequências de caracteres que se consomem ou se produzem em ordem, um após o outro.

Os dois extremos não são simétricos. A saída é decidida pelo programa, e por isso pode ser escrita com exatidão: cada caractere que aparece na tela é o que o programa mandou escrever. A entrada, ao contrário, é decidida por outro: o programa pede um número, mas quem está diante do teclado pode digitar uma palavra, um número com vírgula decimal, um número grande demais ou nada. Se isso é assim, a entrada é uma fronteira não confiável, e todo programa que lê dados deve prever o que fará quando o recebido não tiver a forma esperada. Esta aula ensina primeiro a escrever, depois a ler, depois o que acontece quando a leitura fracassa e, por último, a reconhecer os erros, os do programa e não os do usuário, segundo o momento em que se manifestam.