Ir ao conteúdo
  • Cadastre-se

Como fazer um laço ser reutilizado depois de encerrado? para criar um menu com submenus.


Yakchimi
Ir à solução Resolvido por Midori,

Posts recomendados

seguinte gente, sou iniciante em programação, escolhi aprender logo C++ porque estou familiarizado (GameMaker), e me deparei com um empecilho na formação de menus. criei uma calculadora onde o usuario deve escolher a opção da operação, sendo 1-soma, 2-subtração, 3-multiplicação, 4-divisão, 5-potencialização, 6-porcentagem. em que :5.1-quadrado, 2-cubo, 3-quarta potência, 4-quinta potência, 5-sexta potência; 6.1-encontrar a porcentagem de um valor,2-encontrar o valor de uma porcentagem.

 

mas quando eu acesso os submenus 5 ou 6, e retonro ao menu principal o menu no qual eu fechei não abre mais, pois a condição necessária para fechar o submenu se torna verdadeira e ele não abre mais. ja tentei um gatilho para essa condição se tornar false novamente mas n vai, tipo, aperte 0 para retornar ao menu anterior (encerrando assim o laço do submenu escolhido) e ao mesmo tempo tornando o valor da variavel diferente de 0, mas n vai.

#include <stdio.h>#include <stdlib.h>#include <locale.h>#include <cstdio>#include <iostream>using namespace std;int main(){		setlocale(LC_ALL, "Portuguese");	system("title C A L C U L A D O R A - B Y   M A X");//titulo	int val1, val2;	int opcao;	int opcao2;	int opcao3;				for(;opcao!=0;){			cout<<"################################################################################"<<"\n\n\t\t\t\tCalculadora MAX";			cout<<"\n\nEscolha a opção.";			cout<<"\n\n1.Soma\n2.Subtração\n3.Multiplicação\n4.Divisão\n5.Potencialização\n6.Porcentagem\n0.Sair\n\nSua opção: ";			cin>>opcao;					switch (opcao){			case 1:				printf("################################################################################\n");				printf("\n\nDigite o primeiro valor a ser somado: ");				cin>>val1;				printf("\nAgora digite o segundo valor a ser somado: ");				cin>>val2;				cout<<"\n\nO resultado de "<<val1<<" + "<<val2<<" é "<<val1+val2<<"\n\n";				system("pause");				break;			case 2:				printf("################################################################################\n");				printf("\n\nDigite o primeiro valor a ser subtraído: ");				cin>>val1;				printf("\nAgora digite o segundo valor a ser subtraído: ");				cin>>val2;				cout<<"\n\nO resultado de "<<val1<<" - "<<val2<<" é "<<val1-val2<<"\n\n";				system("pause");				break;			case 3:				printf("################################################################################\n");				printf("\n\nDigite o primeiro valor a ser multiplicado: ");				cin>>val1;				printf("\nAgora digite o segundo valor a ser multiplicado: ");				cin>>val2;				cout<<"\n\nO resultado de "<<val1<<" * "<<val2<<" é "<<val1*val2<<"\n\n";				system("pause");				break;			case 4:				printf("################################################################################\n");				printf("\n\nDigite o primeiro valor a ser dividido: ");				cin>>val1;				printf("\nAgora digite o segundo valor a ser dividido: ");				cin>>val2;				cout<<"\n\nO resultado de "<<(float)val1<<" dividido por "<<(float)val2<<" é "<<(float)val1/val2<<"\n\n";				system("pause");				break;			case 5:				while(opcao2!=0){				printf("################################################################################\n");				printf("\n\nCalculadora de potenciação.\n\n1Quadrado.\n2Cubo.\n3Quarta Potência.\n4Quinta Potência.\n5Sexta Potência.\n0.Voltar.\n\nEscolha uma das opções ou digite voltar para retornar ao menu anterior: ");				cin>>opcao2;				switch(opcao2){					case 1:						printf("\n\nDigite o valor a ser potencializado ao quadrado: ");						cin>>val1;						printf("\n\nO quadrado de %d é %d\n\n",val1,val1*val1);						system("pause");						break;					case 2:						printf("################################################################################\n");						printf("\n\nDigite o valor a ser potencializado ao cubo: ");						cin>>val1;						printf("\n\nO cubo de %d é %d\n\n",val1,val1*val1*val1);						system("pause");						break;					case 3:						printf("################################################################################\n");						printf("\n\nDigite o valor a ser potencializado à quarta potência: ");						cin>>val1;						printf("\n\n%d elevado à quarta potência é %d\n\n",val1,val1*val1*val1*val1);						system("pause");						break;					case 4:						printf("################################################################################\n");						printf("\n\nDigite o valor a ser potencializado à quinta potência: ");						cin>>val1;						printf("\n\n%d elevado à quinta potência é %d\n\n",val1,val1*val1*val1*val1*val1);						system("pause");						break;					case 5:						printf("################################################################################\n");						printf("\n\nDigite o valor a ser potencializado à sexta potência: ");						cin>>val1;						printf("\n\n%d elevado à quinta potência é %d\n\n",val1,val1*val1*val1*val1*val1*val1);						system("pause");						break;					case 0:						break;						default:							printf("################################################################################\n");							printf("\n\nOpção inválida. Tente novamente ou digite voltar para retornar ao menu anterior.\n\n");					}				}				break;			case 6:				while(opcao3!=0){				printf("################################################################################\n");				printf("\n\nCalculadora de porcentagem.\n\n1.Saber a porcentagem de um valor.\n2.Saber o valor da porcentagem.\n0.Voltar.\n\nEscolha uma das opções ou digite voltar para retornar ao menu anterior: ");				cin>>opcao3;				switch(opcao3){					case 1:						printf("################################################################################\n");						printf("\n\nDigite o valor total: ");						cin>>val1;						printf("\n\nAgora digite o valor a ser encontrada a porcentagem: ");						cin>>val2;						cout<<"\n\n"<<val2<<" é "<<(float)val2*100/val1<<"% de "<<val1<<"\n\n";						system("pause");						break;					case 2:						printf("################################################################################\n");						printf("\n\nDigite o valor total: ");						cin>>val1;						printf("\n\nAgora digite a porcentagem desejada para encontrar o valor inteiro: ");						cin>>val2;						cout<<"\n\n"<<(float)val1*val2/100<<" é "<<val2<<"% de "<<val1<<"\n\n";						system("pause");						break;					case 0:						break;						default:							printf("################################################################################\n");							printf("\n\nOpção inválida. Tente novamente ou digite voltar para retornar ao menu anterior.\n\n");						}					}				break;				case 0:					break;				default:					printf("################################################################################\n");					printf("\n\nOpção inválida. Tente novamente ou digite sair para fechar o programa\n\n.");		}	}}

onde eu estou errando, ou será q n tem como fazer menu com submenu utilizando laços?

Link para o comentário
Compartilhar em outros sites

coloquei no case 0 dos submenus a chamada para main() mas ele nao retorna ao menu anterior ele simplesmente chama a funçao ate eu fechar o laço da switch primeira abrindo varios main() e deixandp pesado.

coloquei no case 0 dos submenus a chamada para main() mas ele nao retorna ao menu anterior ele simplesmente chama a funçao ate eu fechar o laço da switch primeira abrindo varios main() e deixandp pesado.

atualização:

fiz assim

antes do primeiro laço coloquei um rotulo chamado menu1 e no submenu 5 e 6 no case 0 coloquei goto menu1 assim os laços dos submenus nao se fecham e nem acumulam...

soul...vou dar uma olhada na sua dica ver como funciona ainda n entendi sireito o do e o while....estava trancado nessa dos submenus...estava pensando ate em criar um temporizador para mudar o valor da condicao dos para reabrirem

qualquer coisa te falo...valeu

Link para o comentário
Compartilhar em outros sites

coloquei no case 0 dos submenus a chamada para main() mas ele nao retorna ao menu anterior ele simplesmente chama a funçao ate eu fechar o laço da switch primeira abrindo varios main() e deixandp pesado.

atualização:

fiz assim

antes do primeiro laço coloquei um rotulo chamado menu1 e no submenu 5 e 6 no case 0 coloquei goto menu1 assim os laços dos submenus nao se fecham e nem acumulam...

soul...vou dar uma olhada na sua dica ver como funciona ainda n entendi sireito o do e o while....estava trancado nessa dos submenus...estava pensando ate em criar um temporizador para mudar o valor da condicao dos para reabrirem

qualquer coisa te falo...valeu

coloquei no case 0 dos submenus a chamada para main() mas ele nao retorna ao menu anterior ele simplesmente chama a funçao ate eu fechar o laço da switch primeira abrindo varios main() e deixandp pesado.

atualização:

fiz assim

antes do primeiro laço coloquei um rotulo chamado menu1 e no submenu 5 e 6 no case 0 coloquei goto menu1 assim os laços dos submenus nao se fecham e nem acumulam...

soul...vou dar uma olhada na sua dica ver como funciona ainda n entendi sireito o do e o while....estava trancado nessa dos submenus...estava pensando ate em criar um temporizador para mudar o valor da condicao dos para reabrirem

qualquer coisa te falo...valeu

atualização 2:

Soul estou tendo um problema com os loops infinitos que geram erro.

se estiver num submenu e a entrada digitada for diferente de um numero (se n for numerica) o programa buga e entra num loop infinito.

se estiver no menu principal e a entrada nao for numerica ele fecha o programa.

ou seja o default so acontece se um numero for digitado...sabe onde estou errando?

para usar o goto nos submenus troquei o while(opcao1!=0) por um for(;;).

coloquei no case 0 dos submenus a chamada para main() mas ele nao retorna ao menu anterior ele simplesmente chama a funçao ate eu fechar o laço da switch primeira abrindo varios main() e deixandp pesado.

atualização:

fiz assim

antes do primeiro laço coloquei um rotulo chamado menu1 e no submenu 5 e 6 no case 0 coloquei goto menu1 assim os laços dos submenus nao se fecham e nem acumulam...

soul...vou dar uma olhada na sua dica ver como funciona ainda n entendi sireito o do e o while....estava trancado nessa dos submenus...estava pensando ate em criar um temporizador para mudar o valor da condicao dos para reabrirem

qualquer coisa te falo...valeu

atualização 2:

Soul estou tendo um problema com os loops infinitos que geram erro.

se estiver num submenu e a entrada digitada for diferente de um numero (se n for numerica) o programa buga e entra num loop infinito.

se estiver no menu principal e a entrada nao for numerica ele fecha o programa.

ou seja o default so acontece se um numero for digitado...sabe onde estou errando?

para usar o goto nos submenus troquei o while(opcao1!=0) por um for(;;).

Link para o comentário
Compartilhar em outros sites

  • Solução

Eu acho que você está se complicando em algum simples.

Sugiro que você tente focar em resolver a questão do while da forma que falei acima. Você já conseguiu aplicar?

E goto? Essa instrução era usada antes do paradigma estruturado. Quase ninguém mais usa e se usar será em codição especial o que acredito não ser o seu caso.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Soul, consegui utilizar o do while, realmente é bem mais simples. eu utilizei porque n estava entendendo como fazê-lo, ou até mesmo qual o fim que ele teria e porque seria diferente de um simples while ou for, mas quando eu tentei fazer um cod simples, só para testar, e aprendi como usá-lo e como ele trabalha.

ele, diferente dos outros laços, for e while, lê os comandos para depois testar a condição, isso permite, após a condição estar verificada, o que nos outros casos, ao encerrar o laço ele não abriria novamente, mas nesse laço mesmo a condição se tornando verdadeira o comando é executado, pois testa depois, e ai a condição vai ser novamente testada após a execução dos comandos.

 

se tornou uma mão na roda.

só tem um porém agora, nesse código, no submenu, se eu entrar com um caracter alfabetico, ele gera um erro que me coloca num loop infiinito, e no menu principal, ele encerra o programa, eu queria saber se tem como fazer para que, mesmo eu digitando um caracter que não seja numérico, uma letra, ele utilize o default: ao invés de bugar ou encerrar o programa?

#include <stdio.h>#include <stdlib.h>#include <locale.h>#include <cstdio>#include <iostream>using namespace std;int main(){		setlocale(LC_ALL, "Portuguese");	system("title C A L C U L A D O R A - B Y   M A X");//titulo	int val1, val2;//as variaveis para a entrada dos valores e seu resultado	int opcao;//a variavel para a opcao da operacao	int opcao2;//a variavel para a opcao da operacao em um submenu	int opcao3;//a variavel para a opcao da operacao em um submenu		do{//quando a opcao escolhida for zero encerrara o programa			cout<<"################################################################################"<<"\n\n\t\t\t\tCalculadora MAX";			cout<<"\n\nEscolha a opção.";			cout<<"\n\n1.Soma\n2.Subtração\n3.Multiplicação\n4.Divisão\n5.Potencialização\n6.Porcentagem\n0.Sair\n\nSua opção: ";//opcoes das operacoes			cin>>opcao;						switch(opcao){				case 1:				printf("################################################################################\n");				printf("\n\nDigite o primeiro valor a ser somado: ");				cin>>val1;				printf("\nAgora digite o segundo valor a ser somado: ");				cin>>val2;				cout<<"\n\nO resultado de "<<val1<<" + "<<val2<<" é "<<val1+val2<<"\n\n";				system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal				break;			case 2:				printf("################################################################################\n");				printf("\n\nDigite o primeiro valor a ser subtraído: ");				cin>>val1;				printf("\nAgora digite o segundo valor a ser subtraído: ");				cin>>val2;				cout<<"\n\nO resultado de "<<val1<<" - "<<val2<<" é "<<val1-val2<<"\n\n";				system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal				break;			case 3:				printf("################################################################################\n");				printf("\n\nDigite o primeiro valor a ser multiplicado: ");				cin>>val1;				printf("\nAgora digite o segundo valor a ser multiplicado: ");				cin>>val2;				cout<<"\n\nO resultado de "<<val1<<" * "<<val2<<" é "<<val1*val2<<"\n\n";				system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal				break;			case 4:				printf("################################################################################\n");				printf("\n\nDigite o primeiro valor a ser dividido: ");				cin>>val1;				printf("\nAgora digite o segundo valor a ser dividido: ");				cin>>val2;				cout<<"\n\nO resultado de "<<(float)val1<<" dividido por "<<(float)val2<<" é "<<(float)val1/val2<<"\n\n";				system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal				break;			case 5:				do{				printf("################################################################################\n");				printf("\n\nCalculadora de potenciação.\n\n1Quadrado.\n2Cubo.\n3Quarta Potência.\n4Quinta Potência.\n5Sexta Potência.\n0.Voltar.\n\nEscolha uma das opções ou digite voltar para retornar ao menu anterior: ");				cin>>opcao2;				switch(opcao2){					case 1:						printf("\n\nDigite o valor a ser potencializado ao quadrado: ");						cin>>val1;						printf("\n\nO quadrado de %d é %d\n\n",val1,val1*val1);						system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal						break;					case 2:						printf("################################################################################\n");						printf("\n\nDigite o valor a ser potencializado ao cubo: ");						cin>>val1;						printf("\n\nO cubo de %d é %d\n\n",val1,val1*val1*val1);						system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal						break;					case 3:						printf("################################################################################\n");						printf("\n\nDigite o valor a ser potencializado à quarta potência: ");						cin>>val1;						printf("\n\n%d elevado à quarta potência é %d\n\n",val1,val1*val1*val1*val1);						system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal						break;					case 4:						printf("################################################################################\n");						printf("\n\nDigite o valor a ser potencializado à quinta potência: ");						cin>>val1;						printf("\n\n%d elevado à quinta potência é %d\n\n",val1,val1*val1*val1*val1*val1);						system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal						break;					case 5:						printf("################################################################################\n");						printf("\n\nDigite o valor a ser potencializado à sexta potência: ");						cin>>val1;						printf("\n\n%d elevado à quinta potência é %d\n\n",val1,val1*val1*val1*val1*val1*val1);						system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal						break;						default:							printf("################################################################################\n");							printf("\n\nOpção inválida. Tente novamente ou digite voltar para retornar ao menu anterior.\n\n");					}//essa chave fecha o switch do submenu 5				}while(opcao2!=0);//esse while fecha o do ainda dentro do submenu 5				break;//encerra o case 5				case 6:					do{					printf("################################################################################\n");				printf("\n\nCalculadora de porcentagem.\n\n1.Saber a porcentagem de um valor.\n2.Saber o valor da porcentagem.\n0.Voltar.\n\nEscolha uma das opções ou digite voltar para retornar ao menu anterior: ");				cin>>opcao3;				switch(opcao3){					case 1:						printf("################################################################################\n");						printf("\n\nDigite o valor total: ");						cin>>val1;						printf("\n\nAgora digite o valor a ser encontrada a porcentagem: ");						cin>>val2;						cout<<"\n\n"<<val2<<" é "<<(float)val2*100/val1<<"% de "<<val1<<"\n\n";						system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal						break;					case 2:						printf("################################################################################\n");						printf("\n\nDigite o valor total: ");						cin>>val1;						printf("\n\nAgora digite a porcentagem desejada para encontrar o valor inteiro: ");						cin>>val2;						cout<<"\n\n"<<(float)val1*val2/100<<" é "<<val2<<"% de "<<val1<<"\n\n";						system("pause");//exibe o resultado antes de fechar a opcao e retornar ao menu principal						break;						printf("################################################################################\n");						printf("\n\nOpção inválida. Tente novamente ou digite voltar para retornar ao menu anterior.\n\n");						}//essa chave fecha o switch dentro do submenu 6				}while(opcao3!=0);//esse while fecha o do ainda dentro do submenu 6				break;//encenrra o case 6			}//essa chave fecha o switch do menu principal	}while(opcao!=0);//esse while fecha o do dentro de main(), ou seja, o do da função	cout<<"\n\nVocê encerrou o programa. Até mais.\n\n";}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...