Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

Domanda programmazione (sono nabbo)
(Questo messaggio è stato modificato l'ultima volta il: 24/05/2014, 21:19 da Pocciox.)

1 Life, 1 Avatar <3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
Ciao ragazzi, alla fine della prima informatica abbiamo iniziato a usare il C e dovevo creare una calcolatrice in C. Purtroppo ce la avevo già in c++ ma non va bene.
Mi sapreste dire come si fa a controllare se un int sia davvero un numero ?
Ad esempio, in c ho
int main()
{
float a;
scanf ("%f", &a);
}

ho notato che ovviamente se alla richiesta di input del valore float "a" diamo un carattere o una serie di caratteri o caratteri e numeri l'effetto ovviamente non è quello desiderato se piu tardi utilizziamo la variabile per fare operazioni
Ho bisogno di una funzione o qualche modo per controllare che il numero che viene inserito da tastiera possa essere solo un numero, in caso contrario dia un errore...
Ringrazio chi risponderà Smile

24/05/2014, 21:19
#1
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 24/05/2014, 22:38 da Cyanstack.)

Iscritto
Messaggi: 270
Discussioni: 40
Registrato: 10-2013
Reputazione:
0

Mix: 0
questo dovrebbe andare bene

#include <stdio.h>
#include <conio.h>
    C++ Programming
  1. int main()
  2. {
  3. int controlla;
  4. float number;
  5.  
  6. controlla = scanf("%f", &number);
  7. if ( controlla == 1 )
  8. {
  9. printf("%f",number);
  10. }else if ( controlla == 0 )
  11. {
  12. printf("errore!!");
  13. }
  14. getch();
  15.  
  16. return 0;
  17. }



Praticamente funziona che siccome scanf , se riesce a prendere quello che stai per scrivere quindi un float ( ovvero il "%f" ) da come risultato 1 e se invece non ci riesce da 0, noi questo 1 lo mettiamo in una variabile int

quindi if ( controlla == 1 )
,è come dire

se scanf è riuscito a prendere l'input

esegui codice ( ovvero = printf ("%f",number)Wink

invece se non ci è riuscito // if ( controlla == 0 )

esegui codice ( ovvero = printf ("errore!!"); )

24/05/2014, 22:33
#2
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 24/05/2014, 23:59 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
Sullo scanf c'è qualcos'altro da dire...
dopo l'esempio di Cyan, a qualcuno potrebbe venire in mente di dire, allora metto un ciclo che continua a chiedere all'utente l'input finchè non lo scrive giusto, una cosa tipo:

    C Programming
  1. int ret=0;
  2. float value=0;
  3. while (!ret)
  4. {
  5. ret=scanf("%f",&value);
  6. }



sorpresa! non funziona... perchè ? perchè scanf ha un comportamento subdolo quando gli diamo in input qualcosa che non interpreta nel modo giusto.
Diciamo che invece di scrivere in input un "10.5" scriviamo "A" e diamo invio.
Scanf ci restituisce 0, quindi il ciclo torna a eseguire scanf, ma il carattere A è ancora nel buffer dello STDIN! quindi rivà in errore e torna ad eseguire scanf all'infinito! senza chiedere piu l'input all'utente.

Qualcuno per ovviare a questi problemi preferisce un approccio diverso, ovvero leggere l'input in una stringa e poi eseguire sscanf sull stringa per ottenere lo stesso comportamento.
Però essendo l'input in una stringa ci è piu facile maneggiare la stringa per correggere eventuali errori oppure limitarci ad azzerarla per richiedere un nuovo input, magari senza l'errore sta volta.
Un esempio di codice potrebbe essere questo:

    C Programming
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. int read=0;
  6. char buffer[256];
  7. float value;
  8.  
  9. while (!read)
  10. if (fgets(buffer, sizeof(buffer), stdin))
  11. {
  12. if (read=sscanf(buffer, "%f", &value))
  13. {
  14. printf("%f\n",value);
  15. } else
  16. {
  17. buffer[0]=0;
  18. }
  19. }
  20. }




digger
24/05/2014, 23:58
#3
Cerca

Iscritto
Messaggi: 270
Discussioni: 40
Registrato: 10-2013
Reputazione:
0

Mix: 0
grande dig! ma te hai una soluzione a tutto ? Asd Asd

25/05/2014, 0:05
#4
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
eh, mi piacerebbe Smile purtroppo no Happywide


digger
25/05/2014, 0:10
#5
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 25/05/2014, 12:00 da Cyanstack.)

Iscritto
Messaggi: 270
Discussioni: 40
Registrato: 10-2013
Reputazione:
0

Mix: 0
Ah aggiungo un altra cosa, invece del

    C Programming
  1. else
  2. {
  3. buffer[0]=0;
  4. }



si può usare anche

    C Programming
  1. else
  2. {
  3. fflush(stdin);
  4. }



praticamente il risultato è lo stesso, perché fflush "pulisce" il flusso di dati , quindi stdin.

25/05/2014, 11:58
#6
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 25/05/2014, 14:48 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
Se leggi l'input in una stringa come ho fatto io lo stdin è già svuotato quindi il fflush non serve. Però è vero che puoi usarlo nell'altro caso ovvero nel programma originale, se vedi che c'è un errore svuoti stdin e ritrovi. Però ti perdi la possibilità di smanettare sul buffer di input nel caso tu voglia farlo.


digger
25/05/2014, 14:44
#7
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
int main()
{
int controlla;
float number;

controlla = scanf("%f", &number);
if ( controlla == 1 )
{
printf("%f",number);
}else if ( controlla == 0 )
{
printf("errore!!");
}
getch();

return 0;
}

Ho capito, ma cos'è getch? e invece conio.h?

29/05/2014, 16:10
#8
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 29/05/2014, 17:10 da Cyanstack.)

Iscritto
Messaggi: 270
Discussioni: 40
Registrato: 10-2013
Reputazione:
0

Mix: 0
getch serve per fermare il programma, per esempio

    C Programming
  1. int main ()
  2. {
  3. printf("hello world");
  4. }



se scrivi così appena apri il programma, scrive hello world sulla console e si chiude immediatamente , invece se usi :

    C Programming
  1. int main ()
  2. {
  3. printf("hello world");
  4. getch();
  5. }



il programma stampa a video hello world però non si chiude immediatamente, questo grazie a getch, poi però se premi un qualsiasi tasto va avanti con il programma e quindi si chiude.

conio.h è solo la libreria che contiene getch


P.S. si può usare anche system("pause"); includendo la libreria windows.h

29/05/2014, 17:05
#9
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
Ah infatti io usavo quella!!

30/05/2014, 21:28
#10
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Linguaggi di Programmazione Lelep0w4 10 1,149 20/11/2013, 17:35
Ultimo messaggio: Lelep0w4
  Aiuto programmazione xFrancesco 7 873 16/12/2012, 20:49
Ultimo messaggio: pauldomy
  Domanda:Link per c++??? Pocciox 16 1,598 19/09/2012, 23:12
Ultimo messaggio: Pocciox



Utenti che stanno guardando questa discussione: 1 Ospite(i)