• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Problema risolto Ciclo do

oscarandrea

Utente Colossal
Autore del topic
23 Novembre 2013
3.293
101
Miglior risposta
0
Oggi stavo scrivendo un programma in c e mi sono accorto che se nel ciclo do non rispetti il tipo di "carattere" ripete all'infito per farvi capire ho fatto un esempio,questo "programma" funziona ma se ad esempio invece di numeri metto una lettera ripete all'infito la scritta "digita un numero" why? non dovrebbe restituire un errore? O.o
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
 
Oggi stavo scrivendo un programma in c e mi sono accorto che se nel ciclo do non rispetti il tipo di "carattere" ripete all'infito per farvi capire ho fatto un esempio,questo "programma" funziona ma se ad esempio invece di numeri metto una lettera ripete all'infito la scritta "digita un numero" why? non dovrebbe restituire un errore? O.o
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Il codice non presenta errori. Avviandolo personalmente non mi ha dato problemi. Potresti spiegarmi meglio?

P.S: per correttezza, è ciclo do-while non do
 
Ultima modifica:
Il codice non presenta errori. Avviandolo personalmente non mi ha dato problemi. Potresti spiegarmi meglio?

P.S: per correttezza, è ciclo do-while non do
si ma infatti questo è solo un esempio ^^ la mia domanda è siccome con i numeri funziona se metto lettere non dovrebbe darmi errori? invece no continua all'infinito
 
si ma infatti questo è solo un esempio ^^ la mia domanda è siccome con i numeri funziona se metto lettere non dovrebbe darmi errori? invece no continua all'infinito

Ciò che è racchiuso tra le parentesi graffe si ripeterà nel caso in cui la condizione espressa tra le parentesi tonde risultasse falsa. Associ alla variabile a il carattere 'b'. Quest'ultimo carattere è minore/uguale di 0? No, non essendo un valore numerico. La condizione, tuttavia, risulterà falsa. Qui termina l'esecuzione del programma per l'incompatibilità tra le variabili (char, che digita l'utente e int l'effettivo tipo della variabile).
 
Ultima modifica:
Ciò che è racchiuso tra le parentesi graffe si ripeterà nel caso in cui la condizione espressa tra le parentesi tonde risultasse falsa. Associ alla variabile a il carattere 'b'. Quest'ultimo carattere è minore/uguale di 0? No, non essendo un valore numerico. La condizione, tuttavia, risulterà falsa. Per questo si ripete il ciclo.

ma si ripete non una volta ma all'infinito! prova
 
La condizione dentro la parentesi del while è sbagliata, se l'utente scrive 0 il programma continuerà a chiedere in input un numero, questo perché 0 non è un numero negativo quindi bisogna togliere l'uguale. Per quanto riguarda i caratteri, cosa vorresti fare esattamente ?
 
Non mi si ripete all'infinito. Il programma termina semplicemente come detto prima

A me si esce la scritta "inserisci un numero positivo" all'infinito

- - - Aggiornato - - -

La condizione dentro la parentesi del while è sbagliata, se l'utente scrive 0 il programma continuerà a chiedere in input un numero, questo perché 0 non è un numero negativo quindi bisogna togliere l'uguale. Per quanto riguarda i caratteri, cosa vorresti fare esattamente ?
non capisco perchè se inserisco caratteri invece di ripetermi la domanda la ripete all'infinito e non fa rispondere
 
è quello il codice ma se quando mi chiede di inserire un numero inserisco una lettera si ripete all'infinito

Il codice è quello solo che hai modificato la dichiarazione di a da int a char ? E pretendi che funzioni ? a è un carattere non un numero, non è così che va scritto il programma. In presenza di caratteri hai alcune opzioni su cui giocare :

1. ripete il ciclo finché la variabile non è uguale ad un determinato carattere, o a più di uno
2. ripetere il ciclo finché la variabile non è diversa da uno o più caratteri
3. ripetere il ciclo finché la variabile non è uguale ad un determinato carattere, o caratteri, ma diversa da uno o più caratteri
etc..

Che programma devi scrivere esattamente ?
 
Il codice è quello solo che hai modificato la dichiarazione di a da int a char ? E pretendi che funzioni ? a è un carattere non un numero, non è così che va scritto il programma. In presenza di caratteri hai alcune opzioni su cui giocare :

1. ripete il ciclo finché la variabile non è uguale ad un determinato carattere, o a più di uno
2. ripetere il ciclo finché la variabile non è diversa da uno o più caratteri
3. ripetere il ciclo finché la variabile non è uguale ad un determinato carattere, o caratteri, ma diversa da uno o più caratteri
etc..

Che programma devi scrivere esattamente ?
ma infatti non pretendo che funzioni xD era una curiosità! non mi spiegavo perchè il ciclo continua all'infinito
 
ma infatti non pretendo che funzioni xD era una curiosità! non mi spiegavo perchè il ciclo continua all'infinito

Nemmeno io me lo spiego, teoricamente qualsiasi operazioni eseguibile sugli interi è possibile eseguirla sui caratteri in quanto i caratteri sono degli interi, di fatto, ma di piccole dimensioni difatti ad ogni carattere è associato il corrispettivo numero.
 
Nemmeno io me lo spiego, teoricamente qualsiasi operazioni eseguibile sugli interi è possibile eseguirla sui caratteri in quanto i caratteri sono degli interi, di fatto, ma di piccole dimensioni difatti ad ogni carattere è associato il corrispettivo numero.

che poi ripete la domanda all'infinito....prova tu quel codice
 
che poi ripete la domanda all'infinito....prova tu quel codice

Questo è l'output che ottengo stampando il numero del carattere e il relativo carattere :

zwyg4z.png


Forse il problema deriva dal fatto che la variabile viene sovrascritta e questo causa problemi, altrimenti non saprei come spiegarlo. Volendo si potrebbe utilizzare l'Intelltrace per vedere cosa succede alla variabile ma si dovrebbero scorrere i vari file header che permettono, ad esempio, l'esecuzione della printf con il relativo file .asm e onestamente mi scoccerebbe scorrere tutta quella roba con l'Intellitrace.
 
La funzione scanf "consuma" dal buffer di input soltanto i caratteri coerenti con la stringa di formato e lascia nel buffer i caratteri che non sono del tipo corretto. Quindi la scanf non preleverà il testo dal buffer e questo, al prossimo giro, sarà ancora disponibile nel buffer. Questo fatto crea il ciclo infinito.

Ma la scanf restituisce anche il numero di caratteri considerati nell'input e se restituisce 0 vuol dire che nessun carattere era del tipo che si aspettava. Basta controllare questo valore; se è 0 allora si può eseguire un codice che consuma il contenuto del buffer per risolvere. Ovvero

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
 
@nothing Quindi se si volesse controllare se l'utente ha inserito un carattere, una stringa o un intero basta controllare se scanf restituisce 0 ? Se questo avviene allora l'utente ha inserito qualcosa che scanf non si aspettava e quanto digitato rimane nel buffer, ho capito bene ?
 
Se usi %d e quindi la scanf si attende delle cifre, se non arriva nessuna cifra ma solo delle lettere, allora la scanf restituisce 0.

Se usi %s per una stringa, è normale che non otterrai 0 perché qualsiasi carattere va bene. Quindi il controllo può essere utilizzata per gli interi non per le stringhe.