elrincondelc.com
Inicio :: Foros
Usuario: Clave: Regístrate
Salir


programa que adivina número

 
Publicar Nuevo Tema   Responder al Tema    Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
Autor Mensaje
UNOMAS



Registrado: 29 Nov 2011
Mensajes: 2

MensajePublicado: 29/11/2011 1:39 am Responder citando
Título: programa que adivina número

Hola a todos,

He mirado si había alguna pregunta simiar, pero no lo he encontrado. Estoy empezando con la programación y tengo una pequeña duda.

Estoy creando un programa en el que se le pida al usuario adivinar un número. Si lo adivina, paarece el mensaje "right" En caso contrario aparecería el mensaje "lo siento el númer es x". Si el usuario introduce una letra, aparecería un mensaje diciéndole que no ha introducido un número

Código:
#include<stdio.h>
#include<ctype.h>
main()
{
int iRandomNum;
char iResp;
//srand(time(NULL));

//iRandomNum =(rand() %2) + 1;
iRandomNum=3;
printf("\nAdivina un número del 1 al 10: ");
scanf("%c", &iResp);

//printf("%d",isdigit(iResp));
if (isdigit(iResp)==0){
printf("no number");
}
//else
//printf("number");

else if ((iResp==iRandomNum)){
printf("\nRight!\n");
}
else
printf("\nLo siento. El número es %d\n", iRandomNum);



}


El caso es que si introduzco una letra me dice correctamente que no es un número pero si introduzco el número 3 que es el número a adivinar, me sale el mensaje de lo siento el número es 3...

¿qué estoy haciendo mal?

Muchas gracias[/code]
Volver arriba
Ver perfil del usuario Enviar mensaje privado
rir3760



Registrado: 01 Oct 2004
Mensajes: 7502
Ubicación: Mexico

MensajePublicado: 29/11/2011 6:40 am Responder citando
Título:

El error es leer el dígito como un carácter y después compararlo con un entero ya que los valores no coinciden.

Para explicarlo mejor en el juego de caracteres ASCII:
Código:
'0' == 48
'1' == 49
'2' == 50
etc.


Para solucionarlo debes restarle '0' al carácter:
Código:
else if (iResp - '0' == iRandomNum){
   puts("Right!");
}


O leer el dígito como un numero:
Código:
int iResp;

/* ... */

puts("Adivina un numero del 1 al 10:");
scanf("%1d", &iResp);


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
UNOMAS



Registrado: 29 Nov 2011
Mensajes: 2

MensajePublicado: 29/11/2011 7:59 am Responder citando
Título:

Muchas gracias por responser rir3760! La primera opción funciona perfectamente. Pero me preguntaba por qué tengo que añadirle el '0'? Qué significa?

Por otro lado, la segunda opción que me has dado, sigue fallando. concretamente, introduzca lo que introduzca me sale el mensaje de No number. He modificado esta parte del código:
Código:
if (isdigit(iResp)){
printf("no number");
}

Sin embargo cuando meto una letra, no me sale el mensaje de no number...Cuando meto el número 3 o un número equivocado, sí me salen los mensajes correspondientes correctamente.
Muchas gracias[/code]
Volver arriba
Ver perfil del usuario Enviar mensaje privado
rir3760



Registrado: 01 Oct 2004
Mensajes: 7502
Ubicación: Mexico

MensajePublicado: 29/11/2011 8:39 am Responder citando
Título:

UNOMAS escribió:
Muchas gracias por responser rir3760! La primera opción funciona perfectamente. Pero me preguntaba por qué tengo que añadirle el '0'? Qué significa?

Porque:
Código:
'0' es otra forma de representar al numero 48
'1' es otra forma de representar al numero 49
'2' es otra forma de representar al numero 50
'3' es otra forma de representar al numero 51
...

'3' == 51
'0' == 48

==>

'3' - '0' == 51 - 48 == 3


UNOMAS escribió:
Por otro lado, la segunda opción que me has dado, sigue fallando. concretamente, introduzca lo que introduzca me sale el mensaje de No number.

Porque esa parte ya no aplica cuando utilizas scanf en esta forma:
Código:
scanf("%1d", &iResp);

Le estas indicando a la funcion que lea un entero compuesto por un digito y este solo puede ser 0 .. 9.

Si quieres realizar la validacion debes verificar el valor de retorno de scanf (1 si todo va bien).

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Mostrar mensajes anteriores:   
Publicar Nuevo Tema   Responder al Tema    Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1 Todas las horas están en GMT - 8 Horas

 
Saltar a:  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com, 1999-2007

Un proyecto de UrlanHeat.com