Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problema con código C

Estas en el tema de Problema con código C en el foro de C/C++ en Foros del Web. Hola muy buenas, he comenzado hace poco mi pequeña andadura por este lenguaje, y quise programar un sencillo juego de "los chinos", ese en el ...
  #1 (permalink)  
Antiguo 21/08/2014, 17:26
Avatar de nalsac  
Fecha de Ingreso: agosto-2014
Mensajes: 4
Antigüedad: 9 años, 8 meses
Puntos: 0
Problema con código C

Hola muy buenas, he comenzado hace poco mi pequeña andadura por este lenguaje, y quise programar un sencillo juego de "los chinos", ese en el cual sacas un número y tienes que intuir cuantos sacarán los demás y acertar el resultado total.

El caso es que hay dos líneas en el código (línea 19 y 51) en las que aparece un -48, porque por algún motivo que se escapa a mi entendimiento, al introducir 1 y mostrar la variable que ha de contener ese 1, muestra un 49, y al hacer la prueba con un 2 el valor almacenado es 50. Esto me ha ocurrido en 2 líneas del código, y la verdad estaría muy agradecido si alguien pudiera decirme que está pasando.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. int main(void){
  6.  
  7.  
  8.     int chin_jug, chin_pc1, chin_pc2, tot_chin, prediccion, error;
  9.     char continuar ='s';
  10.  
  11. do{
  12.  
  13.     do{
  14.    
  15.     printf("\nIntroduce el número de chinos que quieres usar\n(De 1 a 3)\n");
  16.  
  17.  
  18.    
  19.     chin_jug=getchar()-48; //Sin motivo aparente al realizar la entrada del número se suma 48
  20.     fflush(stdin);
  21.    
  22.     if(chin_jug>=0 && chin_jug<=3){
  23.         error = 0;
  24.     }else{
  25.         printf("\nHas introducido un número de chinos no válido\n\n");
  26.         error = 1;
  27.     }
  28.     }while(error==1);
  29.  
  30.  
  31.  
  32.     //printf("\nseñor=%d\n", chin_jug);
  33.  
  34.    
  35.     printf("\nEl npc 1 está eligiendo su jugada\n");
  36.     chin_pc1 = rand() % 4;
  37.     printf("\nEl npc 2 está eligiendo su jugada\n");
  38.     chin_pc2 = rand() % 4;
  39.    // printf("\npc1=%d\n", chin_pc1);
  40.    // printf("\npc2=%d\n", chin_pc2);
  41.  
  42.    
  43.     tot_chin = (chin_jug + chin_pc1 + chin_pc2);
  44.    // printf("\ntotal=%d\n",tot_chin);
  45.    
  46.  
  47.     printf("\n¿Cuántos chinos hay en juego?\n");
  48.  
  49.    
  50.  
  51.     prediccion = getchar()-48;//Otra vez suma 48 al resultado sin motivo aparente
  52.     fflush(stdin);
  53.     printf("%d",prediccion);
  54.  
  55.    
  56.     if(prediccion == tot_chin){
  57.             printf("\n¡Enhorabuena! has acertado, había %d chinos en juego\n", tot_chin);
  58.         }else{
  59.             printf("\n¡Fallaste! Había %d chinos en juego\n", tot_chin);
  60.         }
  61.  
  62.     printf("\n¿Quieres jugar otra vez?\n\ns/n\n");
  63.  
  64.     continuar=getchar();
  65.     fflush(stdin);
  66.  
  67.     system("cls");
  68.    
  69.  
  70. }while (continuar=='s');
  71.  
  72. }
  #2 (permalink)  
Antiguo 21/08/2014, 20:08
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Problema con código C

Eso es así por que cuando entras con el numero uno no estas entrando con un entero si no con un char.
Creo que no sabes como funciona la tabla asc2 o si lo sabes te lo voy a refrescar algo la memoria. =)
La función getchar() como su nombre indica sirve para obtener un char y no un int. Si por ejemplo elijo el numero 1 en realidad según la tabla estoy eligiendo ¡tachaaaa!...el 49 XD
Debes usar otra función para obtener enteros como scanf mismo por que getchar te va dar el numero en decimal correspondiente al 1 en la tabla asc2. Eso lo puede mirar en la tabla asc2 que te dejo aqui: http://www.elcodigoascii.com.ar/codi...digo-ascii.gif

Como puedes ver el numero que representa el uno es el 49 y no hay ningún bug en tu programa si no que como dije la funcion getch guarda el numero en decimal que representa las letras de tu teclado. Por ejemplo si pulso la letra a me guarda el numero 97, o si pulso una B mayúscula me guarda el numero que representa la B mayúscula que es el 66 en decimal.
Otra cosa a destacar es que por ejemplo no puedes leer 2 numeros con getchar(). Por ejemplo si tengo: int mivariable = getchar(); y le entro con un numero 27 por ejemplo, lo que va pasar es que solo va leer el 2 y va omitir el 7 por que getchar solo lee un caracter.
Para leer cadenas esta la función gets() que en español es get + la s de string, y eso te le una cadena de caracteres.
Tienes que usar la funcion scanf para leer ese entero que quieres de esta forma: scanf("%d",&mivariable); por que es el modificador %d que se encarga de guardar lo que entras por teclado como un entero al cual le puedes aplicar sumas restas o las demas ecuaciones que se te antoje XD.
Otro consejo que te doy es olvidar el fflush por que tiene comportamiento impredecible con cadenas de caracteres y en cada sistema operativo puede producir diferentes efectos (impredecibles XD).
Si tienes problemas para tomar un numero y quieres ignorar el enter mejor usas scanf("%d%*c",&mivariable);, el scanf tal como lo ves aquí toma un entero con el especificador de formato %d y ignora la primera tecla asc2 que no sea numérica como el enter con el especificador %*c, y así puedes prescindir de usar el fflush.
Espero que te sirva por que es un tema algo lioso pero no dificil de entender. Tu solo recuerda que getchar() y getch() solo leen char y uno solo no 2 chars como puede ser 22 por que se lo toma como un string.
si quieres leer un solo numero te puede servir si le tienes en cuenta que lo que estas leyendo es el código asc2 y no el numero en si. Un ejemplo para leer el numero 1 seria

int caracter;
caracter = getchar();
//si pulsas el 1 mostra el mensaje
if ( caracter == 49 ){
printf("Es el numero 1");
}
//si no pulsaste el 1 se muestra este otro mensaje
else{
printf("No lo es")
}

El problema es que si intentas poner un 11 a lo mejor si te entra o no se por que no lo he probado, supongo que tomara el primer 1 y cuando pulses el enter el segundo 1 se pierde y creo que si entra en "Es el numero 1" y si pasa eso es un bug por que no tiene el comportamiento que queríamos¿No? =D

Bueno te dejo ya pa no liarte mas jeje.

Busca informacion sobre getchar y getch para entender como funcionan ya ademas echa un ojo al funcionamiento de la tabla asc2 en C para entender mejor el problema.
Es muy muy util saber esas cosas ;)
  #3 (permalink)  
Antiguo 22/08/2014, 00:13
 
Fecha de Ingreso: agosto-2014
Ubicación: RIMAC
Mensajes: 1
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Problema con código C

Hola nalsac, bueno revisando el código nos damos cuenta de que usas la función 'getchar()' para capturar un valor por teclado y almacenarlo en una variable, aquí se encuentran los dos errores simples de solucionar.
La función 'getchar' es para capturar un carácter, no un entero y ya que tu variable 'chin_jug' es de tipo entero si o si te va a salir un error 'basura' ( no se sabe que puede pasar ) en este caso al valor capturado 'chin_jug' el compilador le sumo 48.

Lo que debes hacer es usar la función adecuada, te recomiendo que uses el 'scanf()'
es propia del lenguaje C. Te dejo las partes del código que debes agregar

scanf( "%d" , &chin_jug ); // recuerda el scanf lee el parámetro por referencia
// chin_jug=getchar(); // lo comentas o lo eliminas
fflush(stdin);
printf( "\n%d\n" , chin_jug ); // para visualizar la correcta grabación



scanf("%d",&prediccion);
// prediccion = getchar();// lo comentas o lo eliminas
fflush(stdin);
printf("%d",prediccion);

Espero te sirva y recuerda usar la función adecuada para la operación que desees realizar.
Un manual o una página manual xd te ayudará mucho.
Suerte!
  #4 (permalink)  
Antiguo 22/08/2014, 03:27
Avatar de nalsac  
Fecha de Ingreso: agosto-2014
Mensajes: 4
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Problema con código C

En primer lugar muchas gracias a ambos por tan rápida y clara respuesta.
Acabo de implementar los cambios al código y todo funciona correctamente, curiosamente nada más localizar que había un "extraño +48" mi cabeza automáticamente me dijo, es algo relacionado con la tabla ascii y la conversión de un int a un char, o algo similar, pero ni por asomo me di cuenta de que era por la función getchar. Igualmente muchas gracias por las respuestas, marco el tema como solucionado. :D

Etiquetas: int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:16.