Duvida em relação ao código.. HELP [RESOLVIDO]

1. Duvida em relação ao código.. HELP [RESOLVIDO]

Davyd Charles Pereira Santiago da Silveira
davydcharles

(usa Outra)

Enviado em 26/09/2015 - 13:03h

Estou fazendo um programa em c++ mais preciso que só seja aceito tipo int na hora da leitura do numero mais não estou conseguindo fazer um repita pra dar uma massagem de erro e solicitar um novo numero..
segue abaixo o código:
int main()
{
int cont = 0;
int numero;
Fila * objFila = new Fila();
Numero * objNumero;
int op = menu();
while(op != 0){
switch (op){
case 1:
if(cont == 5){
cout<<"Nao pode adicionar mais na Fila.\n"<<endl;
}
else {

cout<<"Digite o numero: "; //nesta parte aqui preciso preciso lançar o erro apos a leitura.
cin>>numero;
if(!(int)numero)





objNumero = new Numero();
objNumero->setNumero(numero);
objFila->enfilerar(objNumero);
objNumero = 0;
cont++;
delete objNumero;
}
break;

case 2:
objNumero = objFila->desenfileirar();
if(objNumero == 0){
cout<<"FILA VAZIA!"<<endl;
}
else{
cout<<"Relatorio da Fila:"<<endl;
Fila * Filaux = new Fila();
while (objNumero){
cout<<objNumero->getNumero()<<endl;
Filaux->enfilerar(objNumero);
objNumero = objFila->desenfileirar();
}
delete objFila;
objFila = Filaux;
Filaux = 0;
}
break;

default:
break;

}
op = menu();
}
return 0;
delete objFila;

}


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/09/2015 - 06:28h

Eu não li o código todo, mas como você falou em ler um inteiro e reler caso apareça outra coisa, vou falar só sobre isso.

O jeito mais fácil e universal é ler uma linha inteira como string, usando std::getline(), e então tentar extrair da string o número que você quer. A vantagem de ler a linha como string é que você garante que o buffer de entrada vai ficar num estado consistente, mesmo que você venha a descobrir que a entrada digitada não corresponde ao formato de que você gostaria. Se durante a tentativa de extração do número de dentro da string você encontrar um caráter não-numérico, você considera a leitura inválida, mostra uma mensagem de erro, e simplesmente manda ler de novo.

int num;
while(std::cin){
std::string linha;
size_t num_len;
std::cout << "Digite um número: ";
std::getline(std::cin, linha));
stoi(linha, &num_len);
if(std::cin && num_len>0 && num_len==linha.length())
break; // Leitura bem sucedida.
if(std::cin.eof()){
std::cerr << "\nFim prematuro do arquivo.\n";
exit(1);
}
std::cerr << "O dado lido não parece um número válido.\n";
}


Dá para fazer de outro jeito? Sim. O código abaixo dá uma ideia.

#include <iostream>
#include <limits>
#include <cstdlib>

int main(){
int num;
while(std::cin){
std::cout << "Digite um número: ";
std::cin >> num;
if(std::cin)
break;
if(std::cin.eof()){
std::cerr << "Fim de arquivo prematuro.\n";
std::exit(1);
}
std::cerr << "O dado digitado parece não ser um número.\n";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
std::cout << "O número lido foi " << num << ".\n";
}


Note porém, que esse código ainda teria de ser expandido para fazer o mesmo que o outro. Por exemplo, ele não trata linhas vazias ou espaços antes do número (vai ficar “engolindo” essas linhas ou espaços, sem reexibir a mensagem, até aparecer alguma outra coisa), e também não sabe tratar o caso em que o caráter não-numérico aparece colado no fim do número (se você digitar, por exemplo, “25a”, ele assume que a leitura foi válida, salva 25 em num, e deixa o 'a' e q quebra de linha no buffer de leitura, o que pode confundir o usuário em operações de leitura futuras).





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts