Usar scanf()
es problemático. Si el usuario tipeó -5 +10 -15 -15
en la primera línea de entrada, luego presionó regresar, procesaría los 4 números sucesivamente con scanf()
. Es probable que esto no sea lo que querías. Además, por supuesto, si el usuario escribe +3 or more
, la primera conversión se detiene una vez que se lee el espacio, y todas las conversiones posteriores fallan en o
o or
, y el código entra en un bucle. Debe verificar el valor de retorno desde scanf()
para saber si fue capaz de convertir cualquier cosa.
Los problemas de lectura anticipada son suficientemente grave que yo iría a la alternativa casi estándar de utilizar fgets()
para leer una línea de datos, y luego usando sscanf()
(ese extra s
es lo más importante) para analizar un número.
Para determinar si un número de coma flotante tiene una parte fraccionaria, así como una parte entera, se puede utilizar la función de modf()
or modff()
- este último desde su adj
es una float
:
#include <math.h>
double modf(double x, double *iptr);
float modff(float value, float *iptr);
El valor de retorno es el parte fraccional firmada de x
; el valor en iptr
es la parte entera. Tenga en cuenta que modff()
puede no estar disponible en los compiladores (bibliotecas de tiempo de ejecución) que no son compatibles con C99. En ese caso, puede que tenga que usar double
y modf()
. Sin embargo, probablemente sea tan simple restringir al usuario a ingresar enteros con el formato %d
y un tipo entero para adj
; eso es lo que habría hecho desde el principio.
Otro punto de detalle: ¿realmente desea contar números inválidos en el número total de intentos?
#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);
}
Claramente, estoy ignorar deliberadamente la posibilidad de que alguien pueda escribir en más de 4095 caracteres antes de escribir retorno.
En un nivel binario, ningún número de coma flotante tiene un decimal. http://en.wikipedia.org/wiki/IEEE_754-2008 –
Estamos hablando de carrozas aquí. Siempre "tiene un decimal". Use un 'doble' en su lugar. (FYI @Chris y quiero decir lo mismo) –
@TomvanderWoerdt: ¿Qué diferencia hace 'double'? –