PDA

Visualizza la versione completa : Problema ciclo while (programmazione C)


Fr4nkWeb
10-11-2014, 16:53
Ciao a tutti. Ho iniziato ora a ri-studiare (seriamente) il linguaggio C.

Nonostante non sia un programmatore neofita, non riesco a capire dove si trova l'errore in questo blocco:

do {

printf("Inserisci l'operatore (+, -, *, /): ");
scanf("%c", &op);

if (op != '+' && op != '-' && op != '*' && op != '/') {

printf("\nErrore di inserimento!\n\n");
i = 0;

} //end if
else {
i = 1;
} //end else

} //end do

while (i == 0);

Una volta compilato e avviato, il programma esegue tutte le istruzioni contenute nel DO senza contare la presenza dell'IF, per poi tornare indietro e svolgere tutto come dovrebbe. Mi spiego, l'output ottenuto è:

[...]

Inserisci l'operatore (+, -, *, /):
Errore di inserimento!

Inserisci l'operatore (+, -, *, /):
//solo a questo punto è possibile inserire effettivamente l'operatore e da qui in poi tutto regolare.

[...]

Vorrei capire se si tratta di un mio errore, oppure se (cosa che escludo al 90%) è un errore nella compilazione.

Vi prego sto impazzendo!
Grazie!

(compilo con gcc per mac da terminale)

Fr4nkWeb
10-11-2014, 16:56
Aggiungo anche che questa cosa succede ogni volta che annido un if dentro un while. Le sto provando tutte :'(

oregon
10-11-2014, 17:04
Aggiungo anche che questa cosa succede ogni volta che annido un if dentro un while. Le sto provando tutte :'(

Ma la prima volta inserisci il dato con la scanf?

Scara95
10-11-2014, 17:06
Scanf lascia il buffer sporco, non rimuove tutti i caratteri.
Aggiungi
while(getchar()!=0); dopo l'ultima scanf prima del ciclo e dopo la scanf nel ciclo.

oregon
10-11-2014, 17:10
Esatto ma ...

while(getchar()!='\n');

Scara95
10-11-2014, 17:24
Esatto ma ...

while(getchar()!='\n');

Oddio, grazie, devo essere proprio fuso...

Fr4nkWeb
10-11-2014, 17:30
Grazie mille! Ho capito!

Non ho pensato che scanf utilizzasse un buffer... mannaggia!

In ogni caso, così funziona:




do {

printf("Inserisci l'operatore (+, -, *, /): ");
scanf("%c", &op);

while (getchar() != '\n');

if (op != '+' && op != '-' && op != '*' && op != '/') {

printf("\nErrore di inserimento!\n\n");
i = 0;

} //end if
else {
i = 1;
} //end else

} //end do


while (i == 0);



Grazie ancora a tutti!

oregon
10-11-2014, 17:46
Okay, ma in futuro usa i tag CODE per mostrare del codice ...

M.A.W. 1968
10-11-2014, 17:53
In ogni caso, così funziona:


do {

printf("Inserisci l'operatore (+, -, *, /): ");
scanf("%c", &op);

while (getchar() != '\n');

if (op != '+' && op != '-' && op != '*' && op != '/') {

printf("\nErrore di inserimento!\n\n");
i = 0;

} //end if
else {
i = 1;
} //end else

} //end do


while (i == 0);



Funzionerà anche, ma prova ad analizzare il seguente codice e cerca di comprendere perché, pur essendo volutamente lontano dall'ottimalità, è comunque nettamente migliore di quello che hai scritto finora.


i = 0;

do
{
printf("Inserisci l'operatore (+, -, *, /): ");
scanf("%c", &op);
while (getchar() != '\n');

if (NULL != strchr("+-/*", op))
{
i = 1;
}
else
{
puts("Errore di inserimento!");
}
}
while (i == 0);

Fr4nkWeb
10-11-2014, 18:02
Funzionerà anche, ma prova ad analizzare il seguente codice e cerca di comprendere perché, pur essendo volutamente lontano dall'ottimalità, è comunque nettamente migliore di quello che hai scritto finora.


i = 0;

do
{
printf("Inserisci l'operatore (+, -, *, /): ");
scanf("%c", &op);
while (getchar() != '\n');

if (NULL != strchr("+-/*", op))
{
i = 1;
}
}
while (i == 0);


Sono d'accordo, mi sono però dimenticato di specificare che il codice che ho scritto era per risolvere un esercizio consegnato dalla prof., che pretende si utilizzino esclusivamente costrutti che ha spiegato a lezione (già con getchar() sono andato oltre...).
Purtroppo se vi facessi vedere come ha scritto lei la soluzione vi spaventereste da tanto che è ridondante e contorta.

In ogni caso mistero risolto! Grazie ancora.

Loading