PDA

Visualizza la versione completa : [C] problemi uscita da ciclo di input


ARMANDO888
12-01-2014, 12:16
Salve ragazzi, scusate l'assenza ma sono stato impegnato. Comunque ho risolto tutti i problemi con c::b.

Adesso ho un problema riguardo un file sorgente che è questo:


#include<stdio.h>


main()


{
int product;
float price1=2.98, price2=4.50, price3=9.98, price5=6.67, price4=4.49;
float tot1=0, tot2=0, tot3=0, tot4=0, tot5=0;


printf("Enter the code of sale products\n");
printf("Enter the EOF to end the input\n");


while((product = getchar() ) != EOF)
{


switch(product)
{


case '1':
tot1=tot1+price1;
break;


case '2':
tot2=tot2+price2;
break;


case '3':
tot3=tot3+price3;
break;


case '4':
tot4=tot4+price4;
break;


case '5':
tot5=tot5+price5;
break;


case '\n':
case ' ':
break;


default:
printf("Incorrect code number product entered\n");
printf("Enter a new code number\n");
break;
}
}


printf("\n Total earning for each product sale:");


printf("Total product1 %.2f\n", tot1);
printf("Total product2 %.2f\n", tot2);
printf("Total product3 %.2f\n", tot3);
printf("Total product4 %.2f\n", tot4);
printf("Total product5 %.2f\n", tot5);


return 0;
}


il problema è che il terminale, quando inserisco -1 oppure <ctrl-z> (io uso windows 7), invece di terminare la funzione while e eseguire le istruzioni printf successive, dice per -1, di inserire un carattere nuovo valido (come ho scritto in default), mentre per <ctrl-z> dice di inserire un nuovo carattere valido per ogni code, però dovrebbe passare alle funzioni printf dopo il while!. Dove è il problema? Lo stesso problema me lo da anche con l'esercizio rappresentativo del Deitel

oregon
12-01-2014, 12:24
Magari nel titolo dovresti indicare qualcosa di più utile ... e i tag CODE per il codice perché non si capisce molto ...

Per quanto riguarda il problema, perché inserisci -1 ?

ARMANDO888
12-01-2014, 12:29
Perchè sul deitel c'è scritto che in genere a EOF corrisponde il valore -1 e quindi lo utilizzo come valore sentinella per terminare il programma, ma dice anche che che nel sistema operativo windows corrisponde <ctrl-z>

Scara95
12-01-2014, 12:32
Per cortesia, almeno usa i tag [ CODE ]

-1 sono 2 caratteri ed in ogni caso non controlli da nessuna parte per un -1
Per quanto riguarda l'EOF, su ubuntu+gcc funziona correttamente, non ho windows a portata di mano.

ARMANDO888
12-01-2014, 12:35
Scusa , intendi che il file sorgente che ho postato funziona correttamente su linux con EOF? Io comunque usa c::b

oregon
12-01-2014, 12:35
Non -1 ASCII ma -1 binario ... non va bene ...

Utilizza Ctrl-Z e Return (oppure F6 e Return) per terminare

ARMANDO888
12-01-2014, 12:41
Grazie 1000 funziona, ma non capisco perchè il deitel dice che che posso usare il -1, potete darmi una spiegazione dettagliata di perchè questo modo non funziona?

MItaly
12-01-2014, 12:41
Magari nel titolo dovresti indicare qualcosa di più utile ... e i tag CODE per il codice perché non si capisce molto ...

Esatto. Per chiarezza: quando incolli il codice in un post sul forum inseriscilo tra tag CODE, ovvero:

scrivi

incolla il codice
scrivi

In questa maniera il codice mantiene l'indentazione e viene attivata l'evidenziazione della sintassi, che rende il codice molto più leggibile.
Inoltre, posta codice indentato (altrimenti non ci si capisce una mazza), e specifica titoli significativi per le discussioni - un buon 50% delle discussioni qui riguarda qualche genere di problema con dei sorgenti C.

Per l'ultima volta sistemo io, alla prossima chiudo direttamente la discussione.

MItaly
12-01-2014, 12:43
Grazie 1000 funziona, ma non capisco perchè il deitel dice che che posso usare il -1, potete darmi una spiegazione dettagliata di perchè questo modo non funziona?
EOF (che in genere è -1) non è un carattere "vero", ma un valore "magico" restituito da getchar() per indicare che è finito lo stream di input. È sostanzialmente il modo che getchar() usa per indicare che ha provato a leggere un carattere, ma erano finiti.
Ctrl-Z, a sua volta, è una combinazione di caratteri che si usa per dire alla finestra della console che l'input è finito.

Scara95
12-01-2014, 12:44
- : 0010 1101
1: 0011 0001

-1: 0010 1101 0011 0001
-1 binario: 1111 1111

Loading