Ir ao conteúdo
  • Cadastre-se

C++ Dificuldades com o comando While


Visitante

Posts recomendados

Eu comecei a aprender C++ faz uns 2 meses, eu estava vendo uma das aulas e fazendo alguns códigos como sempre... 

Porém me deparei com um erro na parte do "while"... eu não soube dizer o que tinha de errado pois estava igual o do professor e o dele deu certo, mas o meu não.

------------------------------------------------

#include <iostream>
#include <locale.h>

//Protótipos das funções

 

void ExibirMenu();
int RetornarEscolha();
void ProcessarEscolha(int escolha);

 

//função principal
int main()
{
    ExibirMenu();
    system("PAUSE");
    return 0;
}

void ExibirMenu()
{
    setlocale(LC_ALL, "portuguese");
    
    do
    {
        std::cout << "*****Tickets Cinema*****" << "\n";
        std::cout << "\n1 - Para Meia Entrada\n";
        std::cout << "\n2 - Para Inteira\n";
        std::cout << "\n3 - Para Sair do Menu\n";
        std::cout << "\nDigite sua opção: ";
        
        ProcessarEscolha(RetornarEscolha());
    } 
    while (escolha != 3);
}

int RetornarEscolha()
{
    int escolha;
    std::cout << "\nDigite sua opção: ";
    std::cin >> escolha;
    return escolha;
}

void ProcessarEscolha(int TipoEscolha)
{
    switch (TipoEscolha)
    {
    case 1: std::cout << "\nMeia Entrada Adquirida!" << "\n";
        break;
    case 2: std::cout << "\nInteira Adquirida!" << "\n";
        break;
    case 3: std::cout << "\nSaindo do Menu... \n";
        break;
    default: std::cout << "\nOperação Inválida!\n";
    }
}

------------------------

desde já agradeço quem puder ajudar...

Link para o comentário
Compartilhar em outros sites

@Jules314 Como a variável escolha foi declarada na função RetornarEscolha, ela não está acessível a outras funções. Para ter acesso você pode mover a declaração para o início, publicamente fora da função,

 

#include <iostream>
#include <locale.h>

//Protótipos das funções

int escolha; 

void ExibirMenu();
int RetornarEscolha();
void ProcessarEscolha(int escolha); 

 

Link para o comentário
Compartilhar em outros sites

void ExibirMenu()
{
    setlocale(LC_ALL, "portuguese");

    do
    {
        std::cout << "*****Tickets Cinema*****" << "\n";
        std::cout << "\n1 - Para Meia Entrada\n";
        std::cout << "\n2 - Para Inteira\n";
        std::cout << "\n3 - Para Sair do Menu\n";
        std::cout << "\nDigite sua opção: ";

        ProcessarEscolha(RetornarEscolha());
    } while (escolha != 3);
}

Os autores e professores costumam definir herança, polimorfismo e encapsulamento como a base da programação orientada a objetos.

 

Empresas, escolas, autores e professores recomendam: nunca use variáveis globais. É sempre um problema e vai sempre dar problema. E vai contra o encapsulamento...

 

Repeti aqui essa construção curiosa de seu programa. Processar um menu é algo comum, como deve imaginar, mas raramente você vai ver

  • uma função de 3 linhas para retornar escolha, chamada sempre do mesmo lugar e só desse lugar
     
  • uma função chamada ExibirMenu() que também processa a escolha chamando ProcessarEscolha() com o argumento RetornarEscoha(), uma função, que como se sabe em geral retorna algo e nesse caso é um int.
     
    Citação

    Só que você inverteu os conceitos de retorno de função e argumento de função

ProcessarEscolha() não retorna nada.

 

O mais simples e legível é usar uma função Menu() declarada

int Menu();

por exemplo. E passar o retorno dela para a função ProcessarEscolha(). Algo assim

#include <iostream>
#include <locale.h>

int Menu();
int Processar(int);

int main()
{
    int escolha = 0;
    setlocale(LC_ALL, "portuguese");
    do
        Processar( escolha = Menu() );
    while (escolha!=3);
    system("PAUSE");
    return 0;
}

int Menu()
{
    int escolha = 0;
    std::cout << "*****Tickets Cinema*****" << "\n";
    std::cout << "\n1 - Para Meia Entrada\n";
    std::cout << "\n2 - Para Inteira\n";
    std::cout << "\n3 - Para Sair do Menu\n";
    std::cout << "\nDigite sua opção: ";
    std::cin >> escolha;
    return escolha;
};


int Processar(int op)
{
    switch (op)
    {
    case 1: std::cout << "\nMeia Entrada Adquirida!" << "\n";
        break;
    case 2: std::cout << "\nInteira Adquirida!" << "\n";
        break;
    case 3: std::cout << "\nSaindo do Menu... \n";
        return 0;
        break;
    default: std::cout << "\nOperação Inválida!\n";
        break;
    };
    return 1;
};

Já serviria

 

Evite funções que retornam void. Em geral é um desperdício. No mínimo uma condição de erro pode ser retornada.

 

setlocale()

 

Um programa de computador não é escrito em geral para rodar na máquina do autor. Claro que muitos programas de aluno e de hobbystas tem essa vida curta e estranha: são rodados muitas vezes apenas no IDE e assim que funcionam são esquecidos ou entregues à escola.

 

Mas você deve se acostumar a deixar as coisas como encontrou. setlocale() muda algo no computador que roda o programa e ao final você devia restaurar para deixar como estava antes. É o politicamente correto.

Para isso existe a função getlocale().

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!