Error al comparar datos

Iniciado por Luffy97, 3 Diciembre 2015, 10:09 AM

0 Miembros y 1 Visitante están viendo este tema.

Luffy97

Buenas a todos, el otro día hice un programa y tuve un problema... El programa trata de que pongas un numero aleatorio y que tu introduzcas un valor y te diga si lo has acertado o no. El problema viene en cuanto introduces el dato, Si pones numero superior a 10 o menor a 0 de error, si pones una letra también da error, pero si pones primero un numero seguido de una letra me lo acepta como numero. Y quiero solucionar esto de manera que si tu pones un numero que no sea valido tal sea seguido de letra o no te de error. No se si me he explicado bien... Aquí dejo el código:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>

void main() {
srand(time(NULL));
int r, res, i;
bool exit = false, ok;
char retry;
printf("JOC DE ENDEVINAR EL NUMERO\n\n");
do {
r = (rand() % 10) + 1;
i = 0;
do{
printf("Introdueix un numero (1-10): ");
/*-------------------------------------------*/
/*-------------------------------------------*/
/*-------------------------------------------*/
ok = scanf("%i", &res);
/*-------------------------------------------*/
/*-------------------------------------------*/
/*-------------------------------------------*/
while (getchar() != '\n');
if (ok && res >= 1 && res <= 10 ) {
if (res < r)
{
printf("Nº massa baix\n");
}
else if (res > r) {
printf("Nº massa alt\n");
}
else if (res == r) {
printf("Has encertat!\n");
exit = true;
}
i++;
}
else
{
printf("No has introduit un valor disponible\n");
}
}while (i < 12 && exit == false );
printf("Intents realitzats: %d\n", i);
exit = false;
do{
printf("Vols tornar a jugar? (Y/N): ");
scanf("%c", &retry);
retry = towlower(retry);
while (getchar() != '\n');
if (retry == 'n')
{
exit = true;
}
else if (retry == 'y')
{

}
else
{
printf("Introdueix una opcioo vàlida\n");
}
}while (retry != 'y' && retry != 'n');
} while (exit == false);
system("pause");
}



Gracias por su ayuda.
Un saludo.

ivancea96

En primer lugar, pon int main, no void main. El programa ha de retornar un valor numérico.

El caso es, que scanf coge todo el valor numérico que puede.

Una posibilidad, es que tú manualmente busques por caracteres no-numéricos en la cadena de entrada.

Luffy97

Me podries encarrilar un poco, no entiendo muy bien a lo que te refieres...
Gracias.

ivancea96

Puedes leer la linea introducida por el usuario en un char*, y luego recorrer cada caracter para comprobar si hay alguno no numerico.

Si todos son numéricos, utilizas la función int atoi(char*) para transformarlo a un número.

Es una solución más compleja. Si quieres una solución más simple, déjalo como está. Realmente no es un gran problema, mientras haya insertado algún número.

MAFUS

#4
En la libreria ctype hay una macro que te viene muy bien:

int isdigit(int c)

devuelve un valor distinto de 0 si c es un número decimal.

Con ella repasas los caracteres de la cadena y si hay alguno que no sea un número lanzas un mensaje de error. ;)

do-while

¡Buenas!

También puedes utilizar el valor de retorno de scanf.

scanf te devuelve la cantidad de parámetros leídos. Si intentas leer un entero y el usuario introduce un caracter scanf habrá leído cero parámetros y te devolverá cero. Si se introducen números y luego un caracter supongo (no lo he comprobado) que te leerá el numero que haya hasta el primer caracter no numérico. De todas formas el algoritmo sería el siguiente

si(scanf(un numero) == 0)
{
   //ha habido un error de lectura.

   //limpiamos la entrada
   while(getchar()) != '\n'); //la entrada acaba en intro
}
sino
{
   //hemos leido un numero, pero pueden quedar datos en la entrada (al menos el intro final). La limpiamos
   while(getchar()) != '\n'); //la entrada acaba en intro
}


Y completas los dos casos con el código que quieras, claro está.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Luffy97

Muchas Gracias por vuestra ayuda, me ha sido de ayuda.
Un saludo.