L'utilizzo di scanf()
è problematico. Se l'utente digitava -5 +10 -15 -15
sulla prima riga di input, quindi premi Invio, elaboreresti i 4 numeri a turno con scanf()
. Questo probabilmente non è quello che volevi. Inoltre, naturalmente, se l'utente digita +3 or more
, la prima conversione si interrompe una volta letto lo spazio e tutte le successive conversioni non riescono sullo o
o or
e il codice entra in un ciclo. È necessario verificare il valore di ritorno da scanf()
per sapere se è stato in grado di convertire qualsiasi cosa.
I problemi read-ahead sono sufficientemente grave che mi piacerebbe andare per il quasi-standard alternativo di utilizzare fgets()
per leggere una riga di dati, e quindi utilizzando sscanf()
(che in più s
è tutto importante) per analizzare un numero.
Per determinare se un numero in virgola mobile ha una parte frazionaria, nonché una parte intera, è possibile utilizzare la funzione di modf()
or modff()
- quest'ultimo dal vostro adj
è un float
:
#include <math.h>
double modf(double x, double *iptr);
float modff(float value, float *iptr);
Il valore di ritorno è il parte frazionaria firmata di x
; il valore in iptr
è la parte intera. Si noti che modff()
potrebbe non essere disponibile nei compilatori (librerie di runtime) che non supportano C99. In tal caso, potrebbe essere necessario utilizzare double
e modf()
. Tuttavia, è probabilmente altrettanto semplice limitare l'utente a inserire numeri interi con il formato %d
e un tipo intero per adj
; questo è quello che avrei fatto sin dall'inizio.
Un altro punto di dettaglio: vuoi davvero contare i numeri non validi nel numero totale di tentativi?
#include <stdio.h>
#include <math.h>
int main(void)
{
int counter=0;
int ttl=100;
printf("You all know the rules now lets begin!!!\n"
"\n\nWe start with 100. What is\n");
while (ttl != 5)
{
char buffer[4096];
float a_int;
float adj;
printf("YOUR ADJUSTMENT?");
if (fgets(buffer, sizeof(buffer), stdin) == 0)
break;
if (sscanf("%f", &adj) != 1)
break;
if (adj<=20 && adj>=-20 && modff(adj, &a_int) == 0.0)
{
counter++; // Not counting invalid numbers
ttl += adj;
printf("The total is %d\n", ttl);
}
else
{
printf ("I'm sorry. Do you not know the rules?\n");
}
}
if (ttl == 5)
printf("The game is won in %d steps!\n", counter);
else
printf("No-one wins; the total is not 5\n");
return(0);
}
Chiaramente, io sto diligentemente ignorando la possibilità che qualcuno potrebbe digitare in più di 4095 caratteri prima di digitare ritorno.
A livello binario, nessun numero in virgola mobile ha un decimale. http://en.wikipedia.org/wiki/IEEE_754-2008 –
Stiamo parlando di galleggianti qui. Ha sempre "un decimale". Usa invece un 'double'. (FYI @Chris e intendo lo stesso) –
@TomvanderWoerdt: Che differenza fa 'double'? –