Variável deixar de existir [RESOLVIDO]

1. Variável deixar de existir [RESOLVIDO]

Carlos Fagiani Junior
terabytes

(usa Slackware)

Enviado em 18/05/2012 - 16:47h

Boa tarde galera, me tirem um dúvida (talvez básica)...


-----------------------
int main() {
int escolha;
switch(escolha) {
case 0: break;
//... restante
case default: printf("Valor inválido.\n"); main(); break;
}
-----------------------

Caso a escolha não exista no menu ele roda o menu novamente.

Na minha lógica esse "break;" do "case default" na ira ser executado. Só quando o novo "main();" terminar. Já testei isso colocando um "printf("teste");" depois do "main();" e ele realmente não executa.

pergunta 1: Posso deixar sem o "break;" mesmo???


Mas isso é o de menos.


Isso quer dizer que ele não vai finalizar o primeiro "main()" e vai executar o "main()" novamente, e com isso a variável "escolha" vai continuar com um valor inválido.

E tome "loop" no programa.

Alguém ai sabe como 'matar' uma variável na memória? Não pode colocar valor "0" ou qualquer outro valor, pq vai continuar o "loop", ela tem que deixar de existir...


Agradeço a todos,,,


  


2. MELHOR RESPOSTA

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 19/05/2012 - 16:37h

Código utilizando um char como opção:


#include <stdio.h>
main(){
char opcao;
do{
printf("\nDigite uma opção ou 0 para sair\n\n>>>");
scanf("%s",&opcao);
fflush(stdin);
switch(opcao){
case '1':
//instruções
break;
case '0':
printf("Obrigado!\n");
break;
default:
printf("Opcao invalida! Tente novamente\n");
break;
}
} while(opcao != '0');
}


Obs.: Um correção, o fflush() terá que ser colocado depois do scanf().

3. Re: Variável deixar de existir [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 18/05/2012 - 17:52h

Você está executando o main() de forma recursiva, isso não pode. O main() tem que ser executado somente uma vez. Para corrigir isso tem que colocar um laço no programa, ou do{}while{} ou while{}.

o mais indicado é o do{}while{}.


int main(){
int escolha;
do{
switch(escolha){
case 0:
//instruções
break;
case default:
printf("Valor inválido.\n");
break;
}
while(escolha > 10 );
}


Nesse exemplo, o laço irá se repetir enquanto digitar valores maiores do que 10, ou seja, tem que escolher uma opção de 0 a 10.

E sim, tem que colocar o break, senão o programa executa tudo depois dele sem interromper.


4. Re: Variável deixar de existir [RESOLVIDO]

Carlos Fagiani Junior
terabytes

(usa Slackware)

Enviado em 18/05/2012 - 18:04h

ummmmmm boa ideia, realmente fica esquisito chamar o "main()" dentro do próprio "main()".

Mas agora surgiu outra dúvida.


Esse meu menu chama outras funções, tipo:

case 1: limpa(); AntecessorSucessor(); break;
case 2: limpa(); DividendoDivisorQuocienteResto(); break;
//restante...

Cada um deles quando finalizam o processo, chamam o main novamente para remostrar o menu...

Isso também não é bom ser feito né??

que legallllll... entendi agora... usando o do{} while{} Eu não vou precisar chamar o main(); toda vez que uma função finalizar.
Porque ela vai manter o loop, até usar o "0" para sair....

Que legal rei_astro, tu abriu meus horizontes agora...


(Vou testar aqui se é isso mesmo que eu falei)

Vlw :D


5. Re: Variável deixar de existir [RESOLVIDO]

Carlos Fagiani Junior
terabytes

(usa Slackware)

Enviado em 18/05/2012 - 18:28h

Funcionou legal, mas a minha segunda dúvida (a mais importante ainda existe)...

como a variável "escolha" vai conter um valor, ele vai ficar em loop, caso se digite algo diferente dos "case".


6. Re: Variável deixar de existir [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 18/05/2012 - 19:40h

terabytes escreveu:

Funcionou legal, mas a minha segunda dúvida (a mais importante ainda existe)...

como a variável "escolha" vai conter um valor, ele vai ficar em loop, caso se digite algo diferente dos "case".


Não entendi a dúvida. pode explicar melhor?

Se se refere ao valor da variável, quando digita um outro valor ele guarda apena o novo valor.


7. Re: Variável deixar de existir [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 18/05/2012 - 19:47h

O correto seria pedir sempre que digite a opção:


printf("Digite uma opção ou 0 para sair");
scanf("%d",&opcao);
do{
switch(opcao){
case 1:
//instruções
break;
...
case 0:
printf("Obrigado!");
break;
default:
printf("Opção inválida! Tente novamente!"
break;
while(opcao != 0);


Espero que tenha entendido.


8. Re: Variável deixar de existir [RESOLVIDO]

Joao
stack_of

(usa Slackware)

Enviado em 18/05/2012 - 21:49h

Posicionar o break antes da chamada de função pode ser uma solução, mas sobrecarregar função em programa é sempre um risco.


9. Re: Variável deixar de existir [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 18/05/2012 - 22:13h

terabytes escreveu:

Cada um deles quando finalizam o processo, chamam o main novamente para remostrar o menu...

Isso também não é bom ser feito né??


O correto é que o main() execute uma única vez. Quando as outras funções terminarem volta para o laço, pois ainda não foi digitado o 0 para sair.


10. Re: Variável deixar de existir [RESOLVIDO]

Carlos Fagiani Junior
terabytes

(usa Slackware)

Enviado em 19/05/2012 - 14:21h


#include <stdio.h>
main(){
int opcao;
printf("Digite uma opção ou 0 para sair");
scanf("%d",&opcao);
do{
switch(opcao){
case 1:
//instruções
break;
case 0:
printf("Obrigado!");
break;
default:
printf("Opcao invalida! Tente novamente");
break;
}
} while(opcao != 0);
}




Cara ou eu estou ficando doido ou o meu gcc que está...

porque compilando esse mesmo teu código, se eu digitar uma letra qualquer ou um número que não seja algum dos "case", ele fica em 'loop' no "default".


Esquisito você ter colocado o "do {" depois do scanf. Ai sim que fica em loop mesmo, se eu digitar uma valor diferente.
Eu colocaria o "do {" antes até mesmo do printf("Digite uma opção ou 0 para sair"); porque quando uma outra instrução finalizasse, ou se fosse escolhido algo errado, ele mostraria o menu novamente e solicitaria o scanf também...

porque do jeito que você escreveu o código, vai ficar confirmando que a "&opcao" tem q cair no defaut eternamente. Já que a "&opcao" não foi alterada.


11. Re: Variável deixar de existir [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 19/05/2012 - 16:24h


#include <stdio.h>
main(){
int opcao;
do{
printf("\nDigite uma opção ou 0 para sair\n\n>>>");
scanf("%d",&opcao);
switch(opcao){
case 1:
//instruções
break;
case 0:
printf("Obrigado!\n");
break;
default:
printf("Opcao invalida! Tente novamente\n");
break;
}
} while(opcao != 0);
}



Desculpe, eu me enganei, você tem razão. O printf() e o scanf() têm que ficar dentro do do{}.

Foi mau. Verifica se funciona agora.

Obs.: Esse código exige um valor inteiro, se digitar um char ele dá loop mesmo. Você pode tentar declarando apcao como char e não como int, mas pra isso tem que colocar o fflush() antes do scanf() para limpar o buffer.


12. Re: Variável deixar de existir [RESOLVIDO]

Carlos Fagiani Junior
TeraByteS

(usa Slackware)

Enviado em 06/06/2012 - 00:50h

Achei um jeito bem melhor de se fazer menus, getch() é melhor que scanf().

No linux compilar com "gcc cpf.c -lncurses -o cpf"

-lncurses mostra onde estão as bibliotecas do curses.h

#include<stdio.h>
#ifndef _WIN32 //Se no existe o identificador do windows, inclui a biblioteca do linux...
#include<curses.h>
#else
#include <conio.h> //Biblioteca para windows
#endif
void main() {
char escolha;

do {
printf("\n(1) Validar CPF individual");
printf("\n(2) Validar varios CPFs");
printf("\n(3) Validar CPF em lote");
printf("\n(4) Exibir CPFs validos");
printf("\n(0) Sair\n");

escolha = getch();

switch(escolha) {
case '1': printf("menu 1\n"); break;
case '2': printf("menu 2"\n); break;
case '3': printf("menu 3"\n); break;
case '4': printf("menu 4"\n); break;
case '0': limpa(1); break;
default: limpa(1); limpa(2); break;
}
} while (escolha != '0');
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts