PDA

View Full Version : [C]Problema con istruzione "switch"


retnI W
18-08-2010, 15:51
Un programma stupido ed inefficiente (manca un costrutto ciclico per essere "buono") scritto solo per allenarmi coni tipi complessi e il costrutto switch!

#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 ();
}

Quando compilo ed eseguo, inserisco 2 per definire la categoria ma il programma salta direttamente al printf fuori dello switch non permettendomi di selezionare la categoria stessa. Cosa c'è che non va? Avevo pensato ad un errore nella parte:

case 2: printf ("inserire a = autista, c = controllore\n");
scanf ("%c", &dipendente.categoria);
break;

...ditemi voi, grazie!

tuccio`
18-08-2010, 16:05
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);

do {
dipendente.categoria = getchar();
} while (dipendente.categoria != 'a' && dipendente.categoria != 'c');


o


fflush(stdin);
dipendente.categoria = getchar();

retnI W
18-08-2010, 16:18
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"

retnI W
18-08-2010, 16:34
Effettivamente modificando il tipo del campo dipendente.categoria da char a int e modificando la parte esecutiva a dovere, tutto funziona.


#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 ();
}


Quindi per non avere problemi mi sconsigliare le variabili "char" per le scelte? Il mio obiettivo è quello di creare programmi lineari e sintatticamente corretti dovendo dare SOLO un esame di informatica (a breve) nel mio corso di laurea.

Darecon
18-08-2010, 17:58
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.. :)

cionci
19-08-2010, 02:13
Se vuoi usare i char ti conviene usare l' fflush(stdin)
Il comportamento di fflush su stdin non è ratificato dallo standard. In teoria fflush(stdin) potrebbe anche non fare niente.

Darecon
19-08-2010, 08:53
Il comportamento di fflush su stdin non è ratificato dallo standard. In teoria fflush(stdin) potrebbe anche non fare niente.

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?

cionci
19-08-2010, 09:30
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.

tuccio`
19-08-2010, 13:32
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"non l'ho provato, ma sono sicuro che mi darebbe lo stesso problema, non è una questione di compilatore, è semplicemente il modo in cui viene gestito l'input nella libreria standard, che bufferizza tutto quello che si inserisce per motivi di efficienza