|
|||||||
|
|
|
![]() |
|
|
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 17: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 10:33. |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:41.




















