Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Renato Utsch

Problema - Reconhecendo valores do char

Recommended Posts

E ae pessoal, é o seguinte:

 

Eu estou fazendo um menu para o meu programa, que é escrito em C++ e roda em console.

 

Caso alguém saiba uma maneira de fazer um menu mais eficiente, por favor me avisem, quero meu programa rodando o mais rápido e eficientemente possível. Por enquanto estou usando if's para detectar qual tecla foi digitada.

 

O código está o seguinte:

 

// Start of _console program

#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
char  menu_valor; // Seleciona a o valor da linguagem no menu de linguagem e o valor no menu de opções
(pulando uma parte do programa)
cout << "(P,E,Q):                   -> ";
    cin >> menu_valor;

    // Verifica o valor digitado...
        if (menu_valor == 'P' || menu_valor == 'p')
    {
        // Se o valor de menu quiser dizer em Português...
    }
    else
    {
        if (menu_valor == 'E' || menu_valor == 'e')
        {
            // Se o valor de menu quiser dizer em Inglês...
        }
        else
        {
            if (menu_valor == 'Q' || menu_valor == 'q')
            {
                // Caso tiver pressionado Q ou q...
                exit(0);
            }
            else
            {
            goto menu_language; // Vai voltar pra menu caso estiver errado
            }
        }
    }

Tudo bem. Se digitar P, detecta. se digitar p, detecta, se digitar Q, detecta, se digitar q, detecta, etc... Se digitar algo fora dos padrões, volta para o início desse menu e pede para escolher uma opção válida.

 

O problema é que se o cara digitar, por exemplo, psdkdkdksdkskdskdks, ainda vai ser validado como p, como se os outros caracteres não tivessem sido digitados, e se, por exmplo, o cara digitar pq, q vai sobrepor o p e vai sair.

 

Tem algum jeito de eu detectar se há mais de um caractere no "char", para voltar ao menu falando que foi uma opção inválida?

 

 

Obrigado antecipadamente!

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

a oq da pra você fazer é verificar se é somente um caracter ou n, algo assim:

 

#include <iostream>
#include <windows.h>
#include <cstdio>
using namespace std;

int main(){
    char  menu_valor[2]; 
    while(true){
        cout << "(P,E,Q):                   -> ";
        cin >> menu_valor;
        if (strlen(menu_valor)==1){
            if (menu_valor[0] == 'Q' || menu_valor[0] == 'q') exit(1);//break;
            else if (menu_valor[0] == 'P' || menu_valor[0] == 'p'){
                printf("p");
            }
            else if (menu_valor[0] == 'E' || menu_valor[0] == 'e'){
                printf("e");
            }
        }
    }
    return 0;
}

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

strlen (provavelmente strlength)

 

Nossa,era isso que estava procurando, vlwzão cara!

 

Imaginava que existiria algo assim...

 

 

Caso resolvido, pode fechar aqui.

 

@edit:

 

Fui testar no meu programa, olha o que deu:

 

Antes é só com a variável char chamada menu_valor e depois com a variável char chamada menu_valor[2] (isso seria uma matriz não é? faria alguma diferença?)

 

Aqui a imagem de erro do meu compilador:

 

http://i24.servimg.com/u/f24/12/64/88/13/ndeuce10.png

 

 

Código fonte:

 

cout << "(P,E,Q):                   -> ";
    cin >> menu_valor;
    // Verifica o valor digitado...
    if(strlen(menu_valor)== '1' ) // Verifica se o tamanho do char é 1
    {
        switch(menu_valor)
        {
            case 'P':
                // Se pressionar P...
                break;

            case 'p':
                // Se pressionar p...
                break;

            case 'E':
                // Se pressionar E...
                break;

            case 'e':
                // Se pressionar e...
                break;

            case 'Q':
                // Se pressionar Q...
                exit(0);
                break;

            case 'q':
                // Se pressionar q...
                exit(0);
                break;

            default:
                // Se pressionar alguma outra coisa...
                goto menu_language;
        }
    }
    else
    {
        goto menu_language;
    }

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

posta o programa ai pra eu dar uma olhada.

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Ainda estou aprendendo os princípios de POO e Programação Estruturada, então se estiver feio não me culpe =) Logo logo vou dar uma ajeitada, é só pra armazenar minhas ideias por enquanto.

 

 

Código fonte:

 

#include <iostream>
#include <windows.h>
#include <cstdio>
using namespace std;
int main()
{
    /// Configuração básica da tela
    ///
    ///
	// Inicia uma variável para poder emitir cores coloridas
	HANDLE hOut;
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    //
    //
	/// Variáveis de cor
	///
	/// Base:
	// SetConsoleTextAttribute(hOut,BACKGROUND_<color> | FOREGROUND_<color> | <extras>);
	///
	/// Easy colors:
	//     SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY); // Makes red prompting blue background
	//     SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Makes green prompting and blue background
    //     SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Makes yellow prompting and blue background
	//     SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); // Makes white prompting and blue background
	///
	///
	/// Inicialização da Janela do Prompt:
	SetConsoleTitle("EvilVaccinator by LordEvil");         // Seta o título do console
	system("mode con: cols=80 lines=25");      // Faz a tela ter 80 colunas e 25 linhas, sem barra de rolagem


	///
	/// Inicializando variáveis básicas:
	float ProgramVersion = 0.01f; // Versão do EvilVaccinator armazenada aqui
    char  menu_valor; // Seleciona a o valor da linguagem no menu de linguagem e o valor no menu de opções
	/// Iniciando o programa

    // Iniciando e calculando janela do prompt
	system("color 1F");                              // Colore a tela com a cor azul e texto branco
	system("cls");                                   // Limpa a tela para caso tiver algum uso anterior

	// Menu de seleção de linguagem
	do {
	    system("cls");
        cout << "\n";
        SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY); // Makes red prompting
        cout << "                                EvilVaccinator" << endl;
        SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); // Makes white prompting
        cout << "\n";
        cout << "                                                         Version " << ProgramVersion << endl;
        cout << "\n";
        SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Makes yellow prompting
        cout << "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ" << endl;
        SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); // Makes white prompting
        cout << "\n\n\n\n";
        cout << "                    P - Portugues\n\n" <<
                "                    E - English\n\n" <<
                "                    Q - Quit\n\n";
        cout << "\n\n\n\n";
        SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Makes yellow prompting
        cout << "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ" << endl;
        SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); // Makes white prompting
        cout << "(P,E,Q):                   -> ";
        cin >> menu_valor;
	} while((menu_valor != 'P' || menu_valor != 'p' || menu_valor != 'E' || menu_valor != 'e' ||
           menu_valor != 'Q' || menu_valor != 'q') && (strlen(menu_valor) != '1'));

    switch(menu_valor)
    {
        case 'P':
            // Se pressionar P...
            break;

        case 'p':
            // Se pressionar p...
            break;

        case 'E':
            // Se pressionar E...
            break;

        case 'e':
            // Se pressionar e...
            break;

        case 'Q':
            // Se pressionar Q...
            exit(0);
            break;

        case 'q':
            // Se pressionar q...
            exit(0);
            break;
        }
	return 0;
}

O problema é que se eu digitar por exemplo Qxxxx o Q ainda funciona... só pra vce saber/lembrar...

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara ve desse jeito:

#include <iostream>
#include <windows.h>
#include <cstdio>
using namespace std;
int main()
{
        HANDLE hOut;
        hOut = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTitle("EvilVaccinator by LordEvil");
        system("mode con: cols=80 lines=25");
        float ProgramVersion = 0.01f;
        char  menu_valor[2];
        /// Iniciando o programa
        system("color 1F");
        system("cls");
        while (true){
            system("cls");
            cout << "\n";
            SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
            cout << "                                EvilVaccinator" << endl;
            SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
            cout << "\n";
            cout << "                                                         Version " << ProgramVersion << endl;
            cout << "\n";
            SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
            cout << "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ" << endl;
            SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
            cout << "\n\n\n\n";
            cout << "                    P - Portugues\n\n" <<
                    "                    E - English\n\n" <<
                    "                    Q - Quit\n\n";
            cout << "\n\n\n\n";
            SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
            cout << "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ" << endl;
            SetConsoleTextAttribute(hOut,BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
            cout << "(P,E,Q):                   -> ";
            //cin.getline (menu_valor,1);
            scanf("%s%*c", &menu_valor);
            if (strlen(menu_valor) == 1 && (menu_valor[0] == 'P' || menu_valor[0] == 'p' || menu_valor[0] == 'E' || menu_valor[0] == 'e' ||
           menu_valor[0] == 'Q' || menu_valor[0] == 'q') ) break;
        }

    switch(menu_valor[0])
    {
        case 'P':
            // Se pressionar P...
            cout << "P";
            break;

        case 'p':
            // Se pressionar p...
            cout << "p";
            break;

        case 'E':
            // Se pressionar E...
            cout << "E";
            break;

        case 'e':
            // Se pressionar e...
            cout << "e";
            break;

        case 'Q':
            // Se pressionar Q...
            cout << "Q";
            exit(0);
            break;

        case 'q':
            // Se pressionar q...
            cout << "q";
            exit(0);
            break;
        }
        return 0;
}

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.