PDA

View Full Version : [C] while(var!=un numero) Come si fa?


-Ivan-
29-12-2005, 22:42
Voglio che il ciclo continui fino a che non viene immesso un numero uguale a 1 o superiore o una lettera.
C'è un modo di farlo senza lavorare con il codice ASCII?
Avevo provato con mossa != %d ma non esiste ( :D si sa mai).


while(mossa<1 || mossa !=numero)
{
printf("\n\n Scrivi di seguito il numero corrispondente alla mossa a cui vuoi tornare: ");
scanf("%d",&mossa);
if(mossa<1) printf("\n Immettere un numero almeno pari a 1");
}

andbin
29-12-2005, 23:01
Voglio che il ciclo continui fino a che non viene immesso un numero uguale a 1 o superiore o una lettera.
C'è un modo di farlo senza lavorare con il codice ASCII?
Avevo provato con mossa != %d ma non esiste ( :D si sa mai).


while(mossa<1 || mossa !=numero)
{
printf("\n\n Scrivi di seguito il numero corrispondente alla mossa a cui vuoi tornare: ");
scanf("%d",&mossa);
if(mossa<1) printf("\n Immettere un numero almeno pari a 1");
}

Direi che è più logico un do-while piuttosto che un while:
do
{
printf("\n\n Scrivi di seguito il numero corrispondente alla mossa a cui vuoi tornare: ");
scanf("%d",&mossa);
if(mossa<1)
printf("\n Immettere un numero almeno pari a 1");
} while (mossa < 1);
Se però vuoi anche poter inserire una lettera, la scanf con %d non va più bene.
Dovresti prendere una stringa (%s), controllare prima se è la lettera e poi il numero convertito da stringa.

-Ivan-
29-12-2005, 23:11
Direi che è più logico un do-while piuttosto che un while:
do
{
printf("\n\n Scrivi di seguito il numero corrispondente alla mossa a cui vuoi tornare: ");
scanf("%d",&mossa);
if(mossa<1)
printf("\n Immettere un numero almeno pari a 1");
} while (mossa < 1);
Se però vuoi anche poter inserire una lettera, la scanf con %d non va più bene.
Dovresti prendere una stringa (%s), controllare prima se è la lettera e poi il numero convertito da stringa.

Ma aspetta, con questo codice se l'utente immette per esempio una a il programma va in palla, io dovrei mettere qui:
while (mossa < 1)
anche la condizione "se mossa non è un numero).

andbin
30-12-2005, 11:41
Ma aspetta, con questo codice se l'utente immette per esempio una a il programma va in palla, io dovrei mettere qui:
while (mossa < 1)
anche la condizione "se mossa non è un numero).
Sì, infatti l'ho detto: bisognerebbe modificare la chiamata a scanf e fare un altro tipo di test.
Una possibilità potrebbe essere questa:
char bufmossa[11];
int ripeti;

do {
printf ("\n\n Scrivi di seguito il numero corrispondente alla mossa a cui vuoi tornare: ");

scanf ("%10s", bufmossa);

if (strlen (bufmossa) == 1 && isalpha (bufmossa[0]))
ripeti = 0;
else
ripeti = (atoi (bufmossa) < 1);

if (ripeti)
printf("\n Immettere un numero almeno pari a 1");
} while (ripeti);
In questo modo testi prima se è stato inserito 1 carattere alfabetico A-Z/a-z (e in questo caso esce dal ciclo), altrimenti se il valore numerico inserito è inferiore a 1 (e in questo caso ripete il ciclo).
Naturalmente non è a prova di "bomba". Ci sarebbe il caso in cui inserisci "aaa" ma ti va bene perché la atoi ti restituisce 0, che quindi ti fa ripetere il ciclo.

Purtroppo molte funzioni della libreria standard del "C" non sono a "prova di bomba" (vedi atoi, gets, ecc....). :(

-Ivan-
30-12-2005, 12:29
Sì, infatti l'ho detto: bisognerebbe modificare la chiamata a scanf e fare un altro tipo di test.
Una possibilità potrebbe essere questa:
char bufmossa[11];
int ripeti;

do {
printf ("\n\n Scrivi di seguito il numero corrispondente alla mossa a cui vuoi tornare: ");

scanf ("%10s", bufmossa);

if (strlen (bufmossa) == 1 && isalpha (bufmossa[0]))
ripeti = 0;
else
ripeti = (atoi (bufmossa) < 1);

if (ripeti)
printf("\n Immettere un numero almeno pari a 1");
} while (ripeti);
In questo modo testi prima se è stato inserito 1 carattere alfabetico A-Z/a-z (e in questo caso esce dal ciclo), altrimenti se il valore numerico inserito è inferiore a 1 (e in questo caso ripete il ciclo).
Naturalmente non è a prova di "bomba". Ci sarebbe il caso in cui inserisci "aaa" ma ti va bene perché la atoi ti restituisce 0, che quindi ti fa ripetere il ciclo.

Purtroppo molte funzioni della libreria standard del "C" non sono a "prova di bomba" (vedi atoi, gets, ecc....). :(


Ah non avevo capito cosa intendessi, adesso mi è chiaro.
Non conosco acuni dei comandi che hai utilizzato, adesso mi documento un po'.
Mi sa che ti devo dedicare una statua :D tra liste e pippe varie senza i tuoi consigli mi sa che non andavo molto lontano.

ps:
cmq ho risolto così:


do
{
printf("\n\n Scrivi di seguito il numero corrispondente alla mossa a cui vuoi tornare: ");
scanf("%s",&contieniMossa);
//se uno dei 3 valori è una lettera il ciclo viene ripetuto
If(isalpha(contieniMossa[0]) || isalpha(contieniMossa[1]) || isalpha(contieniMossa[2]))
{
mossa=0;///fa ripetere il ciclo
printf("\n Per immettere un numero valido devi scegliere una mossa dall'elenco\n e digitare il suo numero corrispondente.\n");
}
else
mossa=atoi(contieniMossa);
}
while(mossa<1 || mossa >*nMosseP1+*nMosseP2);

andbin
30-12-2005, 14:01
cmq ho risolto così:

...

Ah ... ok. Io avevo capito, fin dall'inizio, che se si inseriva una lettera, si doveva uscire dal ciclo.