| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  18-08-2010, 16:51 | #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. | 
|   |   | 
|  18-08-2010, 17:05 | #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(); | 
|   |   | 
|  18-08-2010, 17:18 | #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) | 
|   |   | 
|  18-08-2010, 17:34 | #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) | 
|   |   | 
|  18-08-2010, 18:58 | #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..    | 
|   |   | 
|  19-08-2010, 03:13 | #6 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | |
|   |   | 
|  19-08-2010, 09:53 | #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?
		 | 
|   |   | 
|  19-08-2010, 10:30 | #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  Ovviamente è un comportamento che non si dovrebbe volere. Ultima modifica di cionci : 19-08-2010 alle 10:33. | 
|   |   | 
|  19-08-2010, 14:32 | #9 | |
| Senior Member Iscritto dal: Apr 2010 Città: Frosinone 
					Messaggi: 416
				 | Quote: 
 | |
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 12:17.









 
		 
		 
		 
		







 
  
 



 
                        
                        










