PDA

View Full Version : problema con switch e ricorsione


*MATRIX*
25-10-2005, 20:31
#include <stdio.h>
#include <stdlib.h>

int main()
{
char risposta;
printf("Vuoi giocare?premi r per ricominicare e per terminare (r/e):");
scanf("%c",&risposta);
switch (risposta)
{
case 'r': {printf("ricomincia");
main();
break;}
case 'e': {printf("esci \n");
break;}
default: {printf("ERROR\n");
main();
break; }
}
system("pause");
return(0);
}


allora questo è uno switch se inserisco r dovrebbe farmi ripartire il programma se premo e esce se non metto uno di questi due dovrebbe dare errore e ricominciare

il problema e che non funziona correttamente

se premo r lo esegue poi se ripremo r fa un giro a vuoto ed esce scritto ERROR e ricomincia

poi mi da tre volte premere un tasto per continuare

mi date una mano?

leadergl
25-10-2005, 21:10
nei programmi ricorsivi si "definiscono" due fasi, una di PUSH ed una di POP che corrispondono a ciò che succede durante una chiamata ricorsiva...

Esempio (molto alla buona):

int pippo()
{
eseguire ancora pippo?
se si
pippo()
se no
...
fine se
stampa a video "ciao"
}

adesso mentre io eseguo "pippo" ed effettuo la mia chiamata ricorsiva nell'IF sto effettuando la fase di PUSH, ovvero entro sempre più nelle chiamate ricorsive, ma nel momento in cui io entro nella parte dell'IF relativa al NO uscirò progressivamente dalle mie chiamate ricorsive eseguendo la parte di codice mancante che prima non ho eseguito...e di conseguenza stamperò a video "ciao" tante volte quante ho richiamato "pippo" più una che è quella della fase attuale...

non so se mi sono spiegato...cmq è per questo motivo che ti stampa "premere un tasto" 3 volte...

redcloud
25-10-2005, 21:26
se premo r lo esegue poi se ripremo r fa un giro a vuoto ed esce scritto ERROR e ricomincia
Credo che questo possa dipendere dal fatto che scanf accetta un carattere. La prima volta che invii r, metti nello stdout r\n. scanf quindi prende il primo carattere e lo confronta con lo switch. Nello stdout è ancora rimasto \n. La seconda volta che premi r, inserisci nello stdout ancora r\n, ma siccome c'è anche \n, il risultato è che hai nello stdout \nr\n. scanf quindi prende il primo carattere che è \n e lo confronta con lo switch dandoti giustamente ERRORE.

Siccome sono un pò arruginito col C, prendi questo che ti ho detto con le tenaglie :D anzi mi scuso se ti sto fuorviando ma vorrei cogliere l'occasione per fare un ripasso.

*MATRIX*
25-10-2005, 21:30
vi ringrazio per le risposte

ma non riesco a risolvere

HELP

*MATRIX*
25-10-2005, 21:56
#include <stdio.h>
#include <stdlib.h>

int main()
{
char risposta;
printf("Vuoi giocare?premi r per ricominicare e per terminare (r/e):");
scanf("%c",&risposta);
switch (risposta)
{
case 'r': {printf("ricomincia\n");

break;}
case 'e': {printf("esci \n");
system("pause");
return(0);
break;}
default: {printf("ERROR\n");
break; }
}
main();
}


ho risolto per il problema del "premi un tasto per continuare "

MA continua a dare l'altro problema
se premo r fa un ciclo a vuoto scrivendo Error
e poi mi rifà la domanda

kapo04
26-10-2005, 06:36
prova ad usare fflush(stdin);
lo metti prima dello scanf,e anche dopo,oppure forse basta solo dopo.... Serve per ripulire il buffer di lettura.

leadergl
26-10-2005, 07:14
Ecco risolti i tuoi problemi...

#include <stdio.h>
#include <stdlib.h>

int main()
{
char c;

printf("\nVuoi giocare? \nPremi 'r' per ricominicare ed 'e' per terminare (r/e): ");
fflush(stdin);
scanf("%c",&c);
switch (c)
{
case 'r': {
printf("ricomincia\n");
main();
break;
}
case 'e': {
printf("esci\n");
system("pause");
break;
}
default: {
printf("ERROR\n");
main();
break;
}
}
}

Ziosilvio
26-10-2005, 08:43
Invece di usare:
char risposta;
scanf("%c",&risposta");
prova a usare:
int risposta;
risposta = getchar();
while (getchar() != '\n')
;
Ossia: invece di leggere un carattere solo con una funzione complicata, leggi un int (getchar deve poter segnalare il fallimento dell'azione con un valore, EOF, che deve ovviamente essere diverso da qualsiasi char) con una funzione piccolina, e usi la stessa funzione piccolina per buttar via tutte le parti dell'input che non servono.

P.S.: Per la centesima volta: il comportamento di fflush su stream di input è indefinito, ragion per cui fflush(stdin) non è standard e non è portabile.

*MATRIX*
26-10-2005, 18:47
;) grazie dei consigli ora va tutto bene

quel menù mi è servito anche per un programma più lungo chiamando delle funzioni invece del printf

vi ringrazio ancora :)