|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2005
Messaggi: 2090
|
[C]Problema con istruzione "switch"
Un programma stupido ed inefficiente (manca un costrutto ciclico per essere "buono") scritto solo per allenarmi coni tipi complessi e il costrutto switch!
Codice:
#include <stdio.h> #define LunghezzaNome 20 void main () { int comando; typedef struct {char nome[LunghezzaNome]; char categoria; int retribuzione; }dipendenti; dipendenti dipendente; printf ("inserire 0 per uscire, 1 per definire il nome, 2 per definire la categoria, 3 per definire la retribuzione\n"); scanf ("%d", &comando); switch (comando) { case 0: printf ("arrivederci!!"); break; case 1: scanf ("%s", &dipendente.nome); break; case 2: printf ("inserire a = autista, c = controllore\n"); scanf ("%c", &dipendente.categoria); break; case 3: scanf ("%d", &dipendente.retribuzione); break; } printf ("inserire 0 per uscire, 1 per visualizzare il nome, 2 per visualizzare la categoria, 3 per visualizzare la retribuzione\n"); scanf ("%d", &comando); switch (comando) { case 0: printf ("arrivederci!!"); break; case 1: printf ("%s\n", dipendente.nome); break; case 2: if (dipendente.categoria == 'a') printf ("autista\n"); else if (dipendente.categoria == 'c') printf ("controllore\n"); break; case 3: printf ("%d\n", dipendente.retribuzione); break; } getch (); } case 2: printf ("inserire a = autista, c = controllore\n"); scanf ("%c", &dipendente.categoria); break; ...ditemi voi, grazie!
__________________
Ci sono porte che ti lasciano entrare e uscire Ma non sono mai aperte. (T. Yorke) Ultima modifica di retnI W : 18-08-2010 alle 16:09. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
probabilmente è qualche errore legato al fatto che quando inserisci il numero premi anche invio mandando un \n che viene bufferizzato e poi preso come carattere nello scanf, proverei una delle due al posto della riga scanf ("%c", &dipendente.categoria);
Codice:
do { dipendente.categoria = getchar(); } while (dipendente.categoria != 'a' && dipendente.categoria != 'c'); Codice:
fflush(stdin); dipendente.categoria = getchar(); |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2005
Messaggi: 2090
|
Grazie. Ho risolto con la prima alternativa. Ma sei vai a compilare, accade anche a te il problema? E' un problema di compilazione oppure dipende dal calcolatore o da come viene caricato il programma in memoria? Se avessi usato una variabile intera anzichè un carattere non avrei riscontrato l'errore?
esempio: "inserire 1 = autista, 2 = controllore"
__________________
Ci sono porte che ti lasciano entrare e uscire Ma non sono mai aperte. (T. Yorke) |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2005
Messaggi: 2090
|
Effettivamente modificando il tipo del campo dipendente.categoria da char a int e modificando la parte esecutiva a dovere, tutto funziona.
Codice:
#include <stdio.h> #define LunghezzaNome 20 void main () { int comando; typedef struct {char nome[LunghezzaNome]; int categoria; int retribuzione; }dipendenti; dipendenti dipendente; printf ("inserire 0 per uscire, 1 per definire il nome, 2 per definire la categoria, 3 per definire la retribuzione\n"); scanf ("%d", &comando); switch (comando) { case 0: printf ("arrivederci!!"); break; case 1: scanf ("%s", &dipendente.nome); break; case 2: printf ("inserire 1 = autista, 2 = controllore\n"); scanf ("%d", &dipendente.categoria); break; case 3: scanf ("%d", &dipendente.retribuzione); break; } printf ("inserire 0 per uscire, 1 per visualizzare il nome, 2 per visualizzare la categoria, 3 per visualizzare la retribuzione\n"); scanf ("%d", &comando); switch (comando) { case 0: printf ("arrivederci!!"); break; case 1: printf ("%s\n", dipendente.nome); break; case 2: if (dipendente.categoria == 1) printf ("autista\n"); else if (dipendente.categoria == 2) printf ("controllore\n"); break; case 3: printf ("%d\n", dipendente.retribuzione); break; } getch (); }
__________________
Ci sono porte che ti lasciano entrare e uscire Ma non sono mai aperte. (T. Yorke) |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
|
Se vuoi usare i char ti conviene usare l' fflush(stdin) e non farti troppi problemi, altrimenti usa gli interi, alla file se e' solo per un esame tanto vale, basta che capisci come implementare l'algoritmo..
![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
|
Acc, non lo sapevo.. Pero' sia su gcc sia su compilatore ms dovrebbe andare.. E se lo scopo e' solo far funzionare il programma per l'esame nno credo sia cosi' grave.. no?
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
La soluzione migliore e soprattutto aderente allo standard è svuotare lo stdin dopo aver fatto la scanf con
while(getchar() != '\n'); Sicuramente la scanf almeno uno '\n' lo lascia. Inoltre per saltare il primo switch basta immettere un carattere qualsiasi diverso da 0, 1, 2, 3 ![]() Ultima modifica di cionci : 19-08-2010 alle 09:33. |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:55.