Programar em C++
141 pág.

Programar em C++


DisciplinaLinguagem de Programação Estruturada128 materiais1.055 seguidores
Pré-visualização34 páginas
entendermos um pouco mais sobre Buffer, se faz necessário recordar um pouco sobre o funcionamento da
memória e suas operações relacionadas a Buffer.
Bufferização é um meio de sincronização entre dispositivos de velocidades diferentes, tais quais memória e
dispositivos de armazenamento mecânicos, como discos magnéticos. Para evitar que as operações do dispositivo
mais lento interfiram no desempenho do programa pode-se fazer com que os dados sejam colocados em uma
memória mais rápida e depois sejam enviadas ao dispositivo mais lento a medida que ele tenha disponibilidade para
recebê-los, desta forma temos os seguintes modos de escrita em dispositivos de saída:
\u2022 unbuffered \u2013 significa que qualquer mensagem ou dados serão escritos imediatamente. É o caso da escrita no
dispositivo cerr;
\u2022 buffered - significa que os dados serão mantidos num buffer de memória até que o dispositivo de destino solicite,
ou que um comando de descarregamento seja executado, ou quando o buffer estiver cheio. O problema é que se o
programa é interrompido antes do buffer ser escrito esses dados são perdidos.
Entrada e saída de dados 50
cout
cout << &quot;hello&quot;; // mostra a palavra hello no ecrã(monitor)
cout << 120; // mostra o número 120 no ecrã(monitor)
cout << hello; // mostra o conteúdo do pedaço de memoria a que chamamos de &quot;hello&quot; no ecrã(monitor)
cout << &quot;hello, tenho &quot; << age<< &quot; anos de idade&quot;; /* mostra a primeira string depois 
 vai buscar o
 conteúdo da variável 
 age de 
depois a string \u201canos de idade\u201d
 */
cout << &quot;Primeira frase. &quot;;
cout << &quot;Segunda frase.\n&quot; << &quot;Terceira frase.&quot;; /* imprime:
 Primeira frase. 
Segunda frase.
 Terceira frase.
 */
O cout (c+out) usado em conjugação com o operador de inserção \u201c<<\u201d permite enviar dados para o &quot;stream out&quot; que
por definição é o ecrã (monitor).
Então podemos enviar as constantes, as variáveis, a conjugação das duas se nos apetecer, separadas pelo operador de
inserção.
Temos ainda diversos recursos de formatação através de &quot;escapes sequences&quot; que detalharemos no tópico logo a
seguir, o recurso usado aqui concatena as várias frases na mesma linha. Temos de dizer explicitamente &quot;quebra de
linha&quot;, através do &quot;\n&quot;, que faz com que a sequência logo após, seja escrita na próxima linha.
Uma característica muito importante do C++, presente nas instruções logo acima, é o polimorfismo notável na
operação de apresentação dos dados na saída; Note que os tipos de dados que são passados para o cout são diversos,
ou seja, não importa qual o tipo de dado que será entregue ao cout, de alguma maneira ele sempre formatará de uma
maneira legível no monitor. Nos capítulos mais adiante veremos como fazer com que tipos de dados diferentes sejam
tratados pelo mesmo objeto.
Escape Sequences
A um conjunto de caracteres, nós chamamos de string. Mas no exemplo anterior quando usamos o &quot;\n&quot;, nós antes
dissemos que o cout com o operador << iria colocar no monitor todos os caracteres que estivessem entre aspas.
Acontece que existem estas strings especiais \u2013 chamadas de &quot;escape sequences&quot; - que de alguma forma alteram o
sentido das strings. Existem muitas destas sequências. As mais conhecidas são estas:
Escape Sequences (as mais comuns)
\u2022 \n nova linha muda o cursor para uma linha abaixo
\u2022 \r retorno
\u2022 \t tabulador muda o cursor para o próximo ponto de tabulação
\u2022 \v tabulador vertical
\u2022 \b deleção reversa
\u2022 \f alimentador de página
\u2022 \a alerta (bipe) faz o computador emitir um sinal sonoro
\u2022 \' aspas simples (') imprime aspas simples
\u2022 \&quot; aspas duplas (&quot;) imprime aspas duplas
\u2022 \? sinal de interrogação (?)
Entrada e saída de dados 51
\u2022 \\ barra oposta (contrabarra) (\)
cin
O objecto cin obtém informação do &quot;standard input&quot; (que usualmente é o teclado). Este objecto está tal como o cout
declarado no cabeçalho da biblioteca <iostream>
A sintaxe mais comum da instrução para obter dados do cin é:
\u2022 cin >> [variable name];
Aqui temos o operador de extracção &quot;>>&quot; que diz que tudo o que o teclado escrever, coloque esses dados na variável
que me segue. Este operador consegue até traduzir o conceito de dados de fora para dentro.
#include <iostream>
using namespace std;
int main(void)
 {
 int testScore;
 cin >> testScore;
 cout << &quot;Your test score is &quot; << testScore << &quot;\n&quot;;
#ifdef WIN32
 system (&quot;pause&quot;); /* Necessário apenas para sistemas Microsoft®, em 
modo gráfico.
 Em UNIX®, variantes e similares use um terminal
 de texto e 
 esta função não será necessária. */
#endif
 return 0;
 }
Há mais um pormenor. O computador está á espera de um &quot;Return&quot; (&quot;ENTER&quot;, ou &quot;New Line&quot;, ou Espaço em
Branco ) para finalizar a entrada de dados na variável, até lá o cursor aparece a piscar.
Bem, na verdade, este ponto é muito importante, por que\u2026 Vejamos mais a baixo a questão de termos 2 entradas.
Pergunta: declaramos uma variável int testScore e se colocarmos um valor que não seja um int? Isto não é a mesma
situação do capítulo anterior porque antes o programa ainda não tinha compilado, e agora temos entrada de dados
quando o programa já está compilado e a correr/rodar.
Assim se no exemplo anterior colocarmos o nome \u201cJeff\u201d, que é uma string, e o programa está a espera de um int, o
que acontece é que o cin não vai colocar &quot;jeff&quot; na variável (ele ignora a entrada). E quando o cout é chamado ele vai
colocar o valor que está na variável.
Então porque é que me apareceu o número \u2013858993460 quando corri/rodei o programa? É que na memória física do
computador existem dados da área onde a variável está alocada fisicamente, e quando declarei o testScore o
compilador apenas reserva aquela memória mas não apaga o que lá está.
Pergunta: O que é que acontece quando inserimos um número maior do que o limite do tipo quando o programa
executar? É o caso de &quot;overflow&quot; - estouro de memória, mas quando o programa corre/roda.
Entrada e saída de dados 52
Aqui já não temos a questão de dar a volta ao intervalo permitido, aqui temos o caso em que vai ser colocado um
número estranho. Isto não está perfeitamente explicado.
Chama-se prompt quando é dito ao utilizador o que deve fazer, o que não deixar como no exemplo anterior o cursor
a piscar sem o utilizador saber o que fazer. Além de que temos o problema de overflow em execução, portanto é bom
que o utilizador cumpra os requerimentos.
De uma maneira muito conveniente, os dados recebidos pelo cin são tratados de forma a tornar o processo
polimórfico, da mesma forma que no caso de cout, assim temos como receber os dados da maneira que precisamos,
ou seja, quando declaramos uma variável int e a usamos para receber um dado do cin, o mesmo é convertido na
entrada para inteiro, quando usamos uma variável de outro tipo, a entrada é convertida para o tipo da variável.
Lendo um caractere
Ler um caractere até é simples, basta utilizar o objeto cin e será guardado o valor digitado na variável.
 char nivel;
 cout << &quot;Entre um nível: &quot;;
 cin >> nivel;
Porém teremos de pressionar a tecla ENTER depois de digitar o caractere. Isto leva a várias questões.
O problema \u201cpressione uma tecla para continuar...\u201d
 #include <iostream>
 using namespace std;
 int main(void)
 {
 char ch;
 do {
 cout << &quot;Pressione S ou s para sair, qualquer outra tecla para continuar: &quot;; 
 cin >> ch; 
 if (ch != 'S' && ch != 's')
 cout << &quot;Deseja continuar?&quot;<<endl;
 else
 cout << &quot;Saindo...&quot;<<endl;
 } while (ch != 'S' && ch != 's');
#ifdef