Programação Básica em C++
127 pág.

Programação Básica em C++


DisciplinaAlgoritmos14.867 materiais175.380 seguidores
Pré-visualização25 páginas
obtém sua entrada do teclado. Portanto, quando o programa acima é executado, o programa
espera que o usuário digite alguma coisa. Cada caractere digitado é mostrado no monitor. O usuário pode
digitar diversos caracteres na mesma linha, inclusive backspace para corrigir caracteres já digitados. No
momento que ele teclar RETURN , o primeiro caractere da sequência digitada é o resultado da função
cin.get(). Portanto, na instrução do programa acima o caractere (ou melhor, o seu código ASCII) é atribuído
a variável ch. Note que o usuário pode ter digitado diversos caracteres antes de teclar RETURN , mas a
função cin.get() só começará a ler o que foi digitado depois que for teclado RETURN . Além disso, com
uma chamada da função cin.get() só o primeiro caractere da sequência digitada é lida.
Você deve saber que o caractere de nova linha, \n, que tem o código ASCII 10, é automaticamente
adicionado na sequência de caracteres de entrada quando o RETURN é teclado. Isso não tem importância
quando a função cin.get() é chamada uma única vez, mas isto pode causar problemas quando ele é usado
dentro de um laço.
No inicício de qualquer programa que usa cin.get(), você deve incluir
#include <iostream>
using namespace std;
Esta diretiva do pré-processador diz ao compilador para incluir informações sobre cin, cin.get() e EOF
(mais sobre EOF adiante.).
Considere o seguinte programa:
#include <iostream>
using namespace std;
int main(){
char ch;
cout << &quot;Entre com uma letra: &quot;;
cin.get(ch);
if( ch < \u2019A\u2019 || ch > \u2019z\u2019 )
cout << &quot;Voce nao teclou uma letra!&quot;;
else
cout << &quot;Voce teclou &quot; << ch
<< &quot;, e seu codigo ASCII eh &quot; << (int) ch << endl;
}
Um exemplo da execução do programa:
Entre com uma letra: A
Voce teclou A, e seu codigo ASCII eh 65.
No exemplo de execução acima o usuário teclou A e depois RETURN .
Outro exemplo de execução do programa:
Entre com uma letra: AbcD
Voce teclou A, e seu codigo ASCII eh 65.
120
Neste caso o usuário digitou quatro caracteres e depois teclou RETURN . Embora quatro caracteres
tenham sido digitados, somente uma chamada a função cin.get() foi feita pelo programa, portanto só um
caractere foi lido. O valor atribuído ao argumento da função é o código ASCII do primeiro caractere lido.
O tipo do resultado da função cin.get() é int e não char. O valor retornado pela função é o código
ASCII do caractere lido.
29.2.2 Marcando o final da entrada
Frequentemente quando você está digitando a entrada para o programa, você quer dizer ao programa que
você terminou de digitar o que queria. Em ambiente Unix, digitando ^D (segure a tecla de Ctrl e pressione
D) você diz ao programa que terminou a entrada do programa. Em ambiente MS-Windows, você faz isto
digitando ^Z (segure a tecla de Ctrl e pressione Z).
Isto envia uma indicação para a função cin.get(). Quando isso ocorre, o valor de ch depois de executar
cin.get(ch); será um valor especial do tipo inteiro chamado EOF (que significa end of file \u2013 final do arquivo).
Considere o seguinte programa exemplo que conta o número de caracteres digitados (incluindo o carac-
tere de \u201cpróxima linha\u201d):
#include <iostream>
using namespace std;
int main()
{
int total = 0;
char ch;
// Le o proximo caractere em ch e para quando encontrar
// final do arquivo
cin.get(ch);
while( ! cin.eof() ) {
total++;
cin.get(ch);
}
cout << endl << total << &quot; caracteres digitados&quot; << endl;
}
Só para esclarecer: você deve teclar RETURN depois de entrar com o comando ^D (ou ^Z no MS-
Windows).
29.2.3 Para evitar problemas com a entrada...
(Observação: nesta seção, espaços em branco são relevantes e são mostrados como unionsq)
Quando você executa um programa, cada caractere que você digita é lido e considerado como parte do
fluxo de entrada. Por exemplo, quando você usa cin.get(), você deve teclar RETURN no final. Como
mencionado anteriormente, o primeiro caractere digitado é lido pelo cin.get(). Mas, o caractere de nova
linha continua no fluxo de entrada (porque você teclou RETURN ).
De qualquer forma, se você executar um cin.get() depois de um cin ou de um cin.get() você lerá o
caractere de nova linha deixado no fluxo de entrada.
Da mesma forma, quando você usa cin para ler informações, ele somente lê o que é necessário. Se voce
usar cin para ler um número inteiro e digitar 42unionsqunionsq (seguido de RETURN ), o cin lê 42, mas deixa unionsqunionsq (e
o caractere de nova linha do RETURN ) no fluxo de entrada.
121
Outro caso \u201cproblemático\u201d é quando o cin é usado num laço. Se você digitar um valor do tipo errado,
o cin lerá o valor errado e a execução do laço continuará na sentença após o cin . Na próxima iteração do
laço o cin vai tentar ler novamente, mas o \u201clixo\u201d deixado da iteração anterior ainda estará lá, e portanto a
chamada corrente do cin também não dará certo. Este comportamento resultará num laço infinito (um laço
que nunca termina), ou terminará e terá um resultado errado.
Há uma maneira simples de resolver este problema; toda vez que você usar cin.get() (para ler um
caracter só) ou cin , você deve ler todo o \u201clixo\u201d restante até o caractere de nova linha. Colocando as seguinte
linhas após chamadas a cin.get() ou cin o problema é eliminado:
// Pula o restante da linha
while( cin.get(c) != \u2019\n\u2019 );
Note que isso não é necessário após todas as chamadas a cin.get() ou cin . Só depois daquelas chamadas
que precedem cin.get() (ou cin ), especialmente em um laço.
29.3 Validação de entrada
Muitas vezes queremos em nossos programas que eles obtenham um certo tipo de dado do usuário (por
exemplo, valores inteiros) mas queremos também tratar a condição em que o usuário digita um dado real ou
texto no lugar, exigindo uma reentrada de dados.
O exemplo abaixo nos mostra como fazer isto, usando a sentença com cin como expressão de um if
ou while.
Exemplo 1:
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
void cleanInput()
{
char cc;
if (cin.fail())
{
cin.clear();
while (cin.get(cc) && cc != \u2019\n\u2019);
}
}
void printStatInput()
{
cout << &quot;\tGood: &quot; << cin.good()
<< &quot; Fail: &quot; << cin.fail()
<< &quot; Bad: &quot; << cin.bad()
<< &quot; EOF: &quot; << cin.eof() << endl << endl;
}
122
int main ()
{
int b=1111, c=2222, d=3333;
float x=1.111, y=2.222;
void * cinerr;
cout << &quot;b c d = &quot; << b << &quot; &quot; << c << &quot; &quot; << d << endl;
cout << &quot;x y = &quot; << x << &quot; &quot; << y << endl;
while (! (cinerr = cin >> b))
{
cleanInput();
cout << &quot;cin 1 = &quot; << cinerr << &quot; b = &quot; << b << endl;
printStatInput();
cout << &quot;Entrada 1: &quot;;
}
cout << &quot;** cin 1 = &quot; << cinerr << &quot; b = &quot; << b << endl;
while (! (cinerr = cin >> b >> c >> d))
{
cleanInput();
cout << &quot;cin 2 = &quot; << cinerr << &quot; b c d = &quot; << b << &quot; &quot; << c << &quot; &quot; << d << endl;
printStatInput();
cout << &quot;Entrada 2: &quot;;
}
cout << &quot;** cin 2 = &quot; << cinerr << &quot; b c d = &quot; << b << &quot; &quot; << c << &quot; &quot; << d << endl;
cinerr = cin >> x;
cout << &quot;cin 3 = &quot; << cinerr << &quot; x = &quot; << x << endl;
printStatInput();
if (!cinerr)
{
/* Limpar condição de erro em cin, se houver. */
cout << &quot;Limpando condições de erro de CIN&quot; << endl;
cin.clear();
printStatInput();
}
cout << &quot;Ultima entrada: &quot;;
cinerr = cin >> x >> y;
cout << &quot;cin 4 = &quot; << cinerr << &quot; x y = &quot; << x << &quot; &quot; << y << endl;
printStatInput();
return 0;
}
123
cin » ... retorna um valor especial4. Se nulo, a entrada não foi aceita e o valor da variável em que houve
erro fica inalterado. As variáveis posteriores na leitura em que houve erro também mantém seus valores
inalterados. Execuções subsequentes de cin somente podem ser feitas após a execução de cin.clear(), para
eliminar a condição de erro. Caso isto não seja feito, após o primeiro erro de leitura, todos os cin » ...
subsequentes darão erro.
Também podem ocorrer problemas de conversão de tipos em cin. Observe o exemplo abaixo:
int b;
float x;
cin
Victor
Victor fez um comentário
Valeu estava atrás de uma apostila sobre o assunto.
0 aprovações
Carregar mais