Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Programma C che non si chiude correttamente
Forum - C/C++ - Programma C che non si chiude correttamente

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
Trusted (Normal User)
Newbie


Messaggi: 14
Iscritto: 06/09/2015

Segnala al moderatore
Postato alle 11:48
Domenica, 06/09/2015
Salve a tutti!
Da poco ho iniziato ad studiare il C. Seguendo gli esercizi del mio manuale mi è stato chiesto di creare un programmma, che preso in input i galloni di benzina e le miglia guidate calcola il rapporto miglia / galloni.

Ora il programma è il seguente:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. /**/
  3. int main ( void )
  4. {
  5.         float gallons; /*Galloni di benzina usati*/
  6.         float miles; /*Miglia percorse*/
  7.         float ridemiles; /*Rapporto miglia percorse galloni usati*/
  8.  
  9.  
  10.         while (gallons != -1){
  11.                 printf("Enter the gallons used (-1 to end): ");
  12.                 scanf("%f", &gallons);
  13.         }
  14.         if (gallons != 0){
  15.                 printf("Enter the miles driven: ");
  16.                 scanf("%f", &miles);
  17.                 ridemiles = miles / gallons;
  18.                 printf("The miles / gallons for this tank was %f\n", ridemiles);
  19.         }
  20.         else{
  21.                 printf("No gallons were entered\n");
  22.         }
  23.         return 0;
  24. }



Inserendo -1 dovrebbe terminare ed passare direttamente all'istruzione else, mentre passa invece al 1° if.
Penso che il problema sia nell'aver dichiarato gallons come float ed quindi non veda -1 ma -1.0000000 . Ma vorrei avere qualche parere da persone più esperte. Grazie a tutti! :rofl:

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 13:05
Domenica, 06/09/2015
Inserendo -1 dovrebbe terminare ed passare direttamente all'istruzione else, mentre passa invece al 1° if

Certo che passa al primo if, perchè non dovrebbe? 0 != -1

PM Quote
Avatar
Trusted (Normal User)
Newbie


Messaggi: 14
Iscritto: 06/09/2015

Segnala al moderatore
Postato alle 14:34
Domenica, 06/09/2015
Beh se il valore di gallons è diverso da -1 allora deve eseguire quelle istruzioni fin qua funziona. Non mi spiego perchè se gallons vale -1 non passi direttamente all'istruzione else :-|

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 14:35
Domenica, 06/09/2015
Aggiungo che si sconsiglia di usare "==" e "!=" su valori in virgola mobile, perché talora (spesso?) gli arrotondamenti li rendono inaffidabili. Sul manuale che ho studiato tempo fa si consigliava di sostituirli con "<" o ">" o, al limite, "<=" o ">=". In effetti mi sono imbattuto davvero in situazioni nelle quali quando tentavo d'usare "==" e "!=" con valori in virgola mobile finivo per creare problemi nei quali, ragionando "alla lettera", uno non si aspetterebbe d'incorrere.

Ad esempio, sul mio IDE (Code::Blocks), questo programma si comporta in modo inatteso:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main() {
  5.     float n1 = 1.0f;
  6.     float n3 = 3.0f;
  7.     float q1, q2;
  8.     float somma;
  9.  
  10.     q1 = n1/n3;     // il debugger dice 0.333333343 anziche' 0.333333333
  11.     q2 = 2*n1/n3;   // il debugger dice 0.666666687 anziche' 0.666666667
  12.     somma = q1+q2;  // il debugger dice 1 anziche' 1.00000003
  13.  
  14.     /*
  15.     Gia' si notano strani errori d'arrotondamento, ma la cosa piu'
  16.     bizzarra salta fuori quando si tenta di confrontare q1+q2 con somma;
  17.     ci si aspetterebbe che l'uguaglianza "regga", eppure...
  18.     */
  19.  
  20.     if( q1+q2 == somma ) {
  21.         // ..il flusso del programma non passa qui...
  22.         printf( "\nUGUALI!\n" );
  23.     }
  24.     else {
  25.         // ...bensi' qui, poffare!
  26.         printf( "\nDIVERSI!\n" );
  27.     }
  28.  
  29.     /*
  30.     Un fenomeno simile salta fuori quando si tenta di confrontare q1+q2
  31.     con 1; anche in questo caso ci si aspetterebbe che l'uguaglianza
  32.     "regga", eppure...
  33.     */
  34.  
  35.     if( q1+q2 == 1 ) {
  36.         // ..il flusso del programma non passa qui...
  37.         printf( "\nUNO!\n" );
  38.     }
  39.     else {
  40.          // ...bensi' qui, poffare!
  41.         printf( "\nNON UNO!\n" );
  42.     }
  43.  
  44.     return 0;
  45. }



Non so se il comportamento sarebbe lo stesso con altri IDE, però nel dubbio...

Edit: Dimenticavo. Uno potrebbe pensare "eh, ma è perché hai usato float che non ha abbastanza precisione; usando double non sarebbe successo". E invece no, anche usando float il risultato non cambia, solo che gli errori di arrotondamento si verificano qualche decimale più in là. Provare per credere.

Ultima modifica effettuata da AldoBaldo il 06/09/2015 alle 14:42


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Trusted (Normal User)
Newbie


Messaggi: 14
Iscritto: 06/09/2015

Segnala al moderatore
Postato alle 14:39
Domenica, 06/09/2015
Grazie ad entrambi, terrò in mente questi "glitch"(se vogliamo chiamarli così) di "==" ed "!=".

In breve dovrei fare in modo che se l'utente immette -1 allora il programma deve terminarsi. Forse l'aggiunta di una flag dichiarata int potrebbe aiutarmi?

Edit: Uso Sublime Text 2 ed MinGW

Ultima modifica effettuata da Trusted il 06/09/2015 alle 14:41
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 14:46
Domenica, 06/09/2015
Io userei come condizione d'uscita un generico "gallons < 0.0f", visto che comunque un consumo negativo sarebbe insensato.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main() {
  5.     float gallons;   /*Galloni di benzina usati*/
  6.     float miles;     /*Miglia percorse*/
  7.     float ridemiles; /*Rapporto miglia percorse galloni usati*/
  8.  
  9.     do {
  10.         printf("Enter the gallons used (-1 to end): ");
  11.         scanf("%f", &gallons);
  12.         if( gallons < 0.0f ) break;
  13.  
  14.         if( gallons > 0.0f ) {
  15.             printf("Enter the miles driven: ");
  16.             scanf("%f", &miles);
  17.             ridemiles = miles / gallons;
  18.             printf("The miles / gallons for this tank was %f\n\n", ridemiles);
  19.         }
  20.         else {
  21.             printf("No gallons were entered\n\n");
  22.         }
  23.     } while( 1 );
  24.  
  25.     return 0;
  26. }


Ultima modifica effettuata da AldoBaldo il 06/09/2015 alle 15:03


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Trusted (Normal User)
Newbie


Messaggi: 14
Iscritto: 06/09/2015

Segnala al moderatore
Postato alle 14:58
Domenica, 06/09/2015
Ok grazie per i consigli. Ora il problema che si pone è come far partire il ciclo. Visto che inizializzando gallons ad 0.0f passerebbe direttamente all'else.
Idee? Essendo programmatore python avrei risolto la cosa con
Codice sorgente - presumibilmente C/C++

  1. while True:

esiste un costrutto simile in C ?8-|

Edit: Visto ora il codice ti ringrazio :rofl: ma la domanda rimane. :-|

Ultima modifica effettuata da Trusted il 06/09/2015 alle 15:00
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:05
Domenica, 06/09/2015
RIVEDI il codice, perché la versione precedente era sbagliata. Ho fatto un edit, ora è ok.
In fondo al ciclo c'è anche la condizione che hai richiesto (while(1)).


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:07
Domenica, 06/09/2015
Dunque, per ottenere un ciclo infinito puoi fare...

Codice sorgente - presumibilmente C/C++

  1. do {
  2.     // codice vario...
  3.     if( condizione_uscita ) break;
  4.     // codice vario...
  5. } while( 1 );
  6.  
  7. // oppure
  8.  
  9. while( 1 ) {
  10.     // codice vario...
  11.     if( condizione_uscita ) break;
  12.     // codice vario...
  13. }



Volendo puoi anche impostare più condizioni d'uscita: quel che ti sbatte fuori dal ciclo è il "break;".

Ultima modifica effettuata da AldoBaldo il 06/09/2015 alle 15:09


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo