Ir ao conteúdo
  • Cadastre-se
Eizy

C++ C++ Validar inteiro digitado

Recommended Posts

Fala galera, preciso de uma ajuda ai de vocês pra tirar essa dúvida

Quero saber de um jeito para que quando o usuário digitar algo diferente de inteiros ou seja caracteres ele retorne para o menu...

Ja tentei algumas formas porém a variável continua com o loop. Se tiver alguma opção para limpar a variável..

 

NO CASO QUERO VALIDAR O MENU

#include <iostream>
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
#include<locale.h>
using namespace std;
int validar(int cod){
	if(isalnum(cod))
	{	
		return 0;
	}
	else
	{
		return 1;
	}
}
/*<-----------TELA DE CARREGAMENTO----------->*/
void carregando(int *cr = new int[101]){
	for(int i = 0; i < 101; i++)
	{
		system("cls");
		*(cr + i) = i;
		cout << "Voltando ao menu principal\n"<< "Aguarde....."<<*(cr+i)<<"%";
		int randow = rand() % 10;
		Sleep(randow);
	}
}
/*<------ENTRADA DE ERROS-------->*/
void error(){
       system("cls");
	   cout <<"Ops... Acho que você esqueceu de alguma coisa! Volte ao menu\n\n";
	   system("pause");
	   carregando();	
}
/*<---------CADASTRO DE PRODUTOS--------->*/
void cadastro(char itens[3][50],int qtd[3],int &valido)
{
	for(int i = 0; i < 3; i++)
	{
		cout << "\nProduto: ";
		cin >> itens[i];
		cout <<"Estoque: ";
		cin >> qtd[i];
	}
	valido = 1;
	cout << "\nProdutos incluidos com sucesso! Volte ao menu.\n\n";
	system("pause");
	carregando();
}
/* <------EXIBIR PRODUTOS INCLUIDOS-------->*/
void exibir(char itens[3][50], int qtd[3],char &resposta)
{
	cout << "\n***ESTOQUE***\n\n";
	for(int i = 0;i < 3;i++){
		cout <<itens[i] << ": " << qtd[i] << endl;
	}
	resposta = 's';
	cout << "\nPressione para voltar ao menu\n\n";
	system("pause");
	carregando();
}
/*<----------REMOVER ESTOQUE--------->*/
void excluir(char itens[3][50],int qtd[3], char &resposta){
	int cod;
	cout << "\n***MENU REMOVER***\n";
	for(int i = 0; i < 3; i++)
	{
		cout << endl << i+1 << " - " << itens[i] <<"\n";	
	}
	cout << "\n\nDigite: ";
	cin >> cod;
	qtd[cod-1]--;
	system("cls");
	cout <<"\nEXCLUIDO COM SUCESSO\n";
	cout << itens[cod-1] << " Total: " << qtd[cod-1] << endl;
	cout <<"\nVoltando ao menu\n";
	system("pause");
	resposta = 's';
	carregando();
	
}
/*<----------INCLUIR ESTOQUE--------->*/
void incluir(char itens[3][50],int qtd[3], char &resposta){
	int cod;
	cout << "\n***MENU INCLUIR***\n";
	for(int i = 0; i < 3 ; i++)
	{
		cout << endl << i+1 << " - " << itens[i] <<"\n";	
	}
	cout << "\n\nDigite: ";
	cin >> cod;
	qtd[cod-1]++;
	system("cls");
	cout <<"\nINCLUIDO COM SUCESSO\n";
	cout << itens[cod-1] << " Total: " << qtd[cod-1] << endl;
	cout <<"\nVoltando ao menu\n";
	system("pause");
	resposta = 's';
	carregando();
	
}
/* <---------MENU DE ESCOLHA--------> */
void menu(int cod, char itens[3][50],int qtd[3],char &resposta, int &valido)
{
	
	cout << "***MENU***\n1 - INCLUIR ESTOQUE\n2 - EXIBIR ESTOQUE\n3 - REMOVER ESTOQUE\n4 - INCLUIR ESTOQUE\n5 - SAIR\n\nDigite: ";
	cin >> cod;
	switch(cod)
	{
	case 1:
		cadastro(itens,qtd,valido);
		break;
	case 2:
		if(valido == 1)
			exibir(itens,qtd,resposta);	
		else
			error();
		break;
	case 3:
		if(valido == 1)
			excluir(itens,qtd,resposta);
		else
			error();
		break;
	case 4:
		if(valido == 1)
			incluir(itens,qtd,resposta);
		else
			error();
		break;
	case 5:
		resposta = 'n';
		break;
	default:
		error();
		resposta = 's';
		break;
	}
}
/* <---------PROGRAMA PRINCIPAL--------> */
int main(int argc, char *argv[])
{	setlocale(LC_ALL,"Portuguese");
	int cod=NULL,estoque[3], valido = 0;
	char resposta = 's',itens[3][50];
	do{
		system("cls");
		menu(cod,itens,estoque,resposta,valido);
		
		
		
		if(resposta !='s'){
		do{
			system("cls");
		cout << "FIQUE MAIS UM POUCO! S/N: ";
		cin >> resposta;
		}while(resposta != 's' && resposta !='S' && resposta !='n' && resposta !='N');
		}
		else
			continue;
	}while(resposta == 's' || resposta == 'S');
	return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 minutos atrás, Eizy disse:

Quero saber de um jeito para que quando o usuário digitar algo diferente de inteiros ou seja caracteres ele retorne para o menu

Ola @Eizy antes que o procedimento de inserção possa acontecer, o procedimento avalia se o tipo de variável e condizente com tipo de input, por exemplo:

ENTRADA

Teste de cin para tipos int 

Se cin >> [espera um inteiro aqui] e a entrada e tal qual acima. Então se tinha zero antes, continua com zero depois que falhou , porém  se não tinha Zero no valor na variável agora tem, porque zero será gravado nela. Talvez isso lhe de uma ideia do que fazer agora.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode usar a função good, um pequeno exemplo:

int main()
{
    int valor_inteiro = 0;
    cout << "Informe um valor inteiro: ";
    cin >> valor_inteiro;
    
    if (!cin.good())
        cout << "voce inseriu um valor nao inteiro.";

    return 0;
}

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@cyer @Mauro Britivaldo valeu galera, porém fazer com que diga que esta errado seguiu meu raciocínio deste o principio maaas o maior problema e que mesmo que volte e eu ate tente colocar cod = 0 ele ainda ira retornar com a entrada antiga apontando que digitei errado e voltando ao looping.

 

Existe alguma maneira de limpar esta variável da memoria zerar ou algo similar para que ele deixei de entrar no IF apos retornar?

Compartilhar este post


Link para o post
Compartilhar em outros sites
11 minutos atrás, Eizy disse:

@cyer @Mauro Britivaldo valeu galera, porém fazer com que diga que esta errado seguiu meu raciocínio deste o principio maaas o maior problema e que mesmo que volte e eu ate tente colocar cod = 0 ele ainda ira retornar com a entrada antiga apontando que digitei errado e voltando ao looping.

 

Existe alguma maneira de limpar esta variável da memoria zerar ou algo similar para que ele deixei de entrar no IF apos retornar?

Agora acho que entendi melhor, de fato a entrada errada não sai do stdin (Buffer de entrada). Então você tem que limpar.

para C eu uso estes comandos: 

char ch = getchar ();
while (ch != EOF && ch != '\n') ch = getchar ();

Suponho que o equivalente em C++ seja:

char ch; cin >> ch;
while (ch != EOF && ch != '\n') cin >> ch;

Tente essa alternativa para liquidar o buffer de entrada.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mauro Britivaldo Então continuo na mesma questão ainda não limpando,  talvez eu tenha que recorrer ao atoi porém ainda quero uma solução para validar o inteiro sem que aja looping, talvez isso ocasione por estar num modulo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Eizy Por última dica, tente os métodos da função. Melhor exemplo que pude fazer:

#include <iostream>
#include <string.h>

using namespace std;

int main() {
   unsigned int choose;

   Reload:
   cout << "MENU INICIAR" << endl;
   cout << "OPTION: 1 2 3 ou 4: ";
   cin >> choose;
   switch (choose) {
      case 1: cout << "Option: " << choose << "Muito bem!" << endl; break;
      case 2: cout << "Option: " << choose << "Muito bem!" << endl; break;
      case 3: cout << "Option: " << choose << "Muito bem!" << endl; break;
      case 4: cout << "Option: " << choose << "Muito bem!" << endl; break;
      default :
         cin.clear();
         cin.ignore();
         goto Reload;
         }
   return 0;
   }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
int main()
{
    int valor_inteiro = 0;

inicio:
    cout << "Informe um valor inteiro: ";
    cin >> valor_inteiro;

    if (!cin.good())
    {
        cout << "voce inseriu um valor nao inteiro.\n";
        
        // Limpa a entrada do usuário
        cin.clear();
        cin.ignore(INT_MAX, '\n');
        
      	// Espera 2.5 segundos para dar tempo do usuário ler a mensagem
        Sleep(2500);
        
      	// Limpa a tela
      	system("cls");
      	
      	// Volta para o inicio
        goto inicio;
    }
    cin.get();
    return EXIT_SUCCESS;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe os erros na sintaxe, é que não leio sobre C++, somente C.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agradeço a ajuda de ambos @Mauro Britivaldo e @cyer me ajudaram muito agora deu certo! Obrigado.

Vou criar um post sobre vetores pra tirar uma outra dúvida, ficarei feliz se me ajudarem também. valeu

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×