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

Programa Ahorcado - Un error

Estas en el tema de Programa Ahorcado - Un error en el foro de C/C++ en Foros del Web. Hola, soy nuevo por aqui como se daran cuenta. Tengo que entregar un trabajo de programacion en C, lo tengo que hacer con el Qt. ...
  #1 (permalink)  
Antiguo 10/11/2011, 15:55
Avatar de AlmaVagabunda  
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 13 años, 1 mes
Puntos: 1
Información Programa Ahorcado - Un error

Hola, soy nuevo por aqui como se daran cuenta.

Tengo que entregar un trabajo de programacion en C, lo tengo que hacer con el Qt.

El caso, es que llevo 3 dias volviendome loco (aun estoy aprendiendo, hace dos meses no sabia nada). El programa compila y ejecuta, pero me salen 3 errores. Y ademas, una instruccion que deberia hacer, no consigo que la haga.

En concreto es cuando un jugador acierta la palabra, deberia imprimir en pantalla que ha ganado y que si se juega otra partida, para que el otro jugador elija otra, pero no funciona, la palabra queda completada, pero sigue pidiendo letra... solo sale de ahi cuando fallas todos los intentos.

Ese es mi mayor problema.
Despues otro, que no me lo han pedido, pero me gustaria saber como ponerlo, es limitar al usuario que solo ponga letras a la hora de elegir la palabra a adivinar, y si pone numeros que avise de que no puede ser. Pero si hay que cambiar demasiado codigo, lo descarto, es simplemente algo que me hacia ilusion hacer.

Y el ultimo, que he dicho al principio, me salen 3 pequeños errores, y no consigo saber de que son.

He decidido publicar aqui mis dudas por que he visto que el foro es muy bueno, ya he solucionado algunas dudas haciendo visitas sin registrarme, pero bueno, ya me toco a mi ser el pregunton jajaja.

Aqui les dejo el codigo que tengo, espero que no sea mucha cosa, no me gusta molestar.
Un saludo, y muchas gracias a todos los que ayudan en el foro ;)
Código c:
Ver original
  1. //INCLUIMOS LAS LIBRERIAS NECESARIAS PARA QUE EL CODIGO SE EJECUTE CORRECTAMENTE.
  2.  
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <conio.h>
  6. #include <string.h>
  7.  
  8. int main(void) {
  9.  
  10.     //DECLARACION VARIABLES A UTILIZAR EN EL PROGRAMA.
  11.     int i=5, j=0, puntosJug1 = 0, puntosJug2 = 0, turno = 1, medidaCad, centinela;
  12.     char palabra[50], cadena[51];
  13.     char jugar, letra;
  14.  
  15.     do {
  16.         //CONTROLAMOS LOS TURNOS DE CADA JUGADOR MEDIANTE ESTE IF-ELSE.
  17.         if (turno%2!=0) {
  18.             //CONTROLAMOS EL DATO QUE INTRODUCE EL USUARIO.
  19.             do {
  20.                 printf("Introduce la palabra a adivinar Jugador 1: ");
  21.                 scanf("%s", palabra);
  22.                 fflush(stdin);
  23.                 system("cls");
  24.             }
  25.  
  26.             while (strlen(palabra) > 50);
  27.             medidaCad = strlen(palabra);
  28.             strcpy(cadena, "--------------------------------------------------");
  29.             cadena[medidaCad] = '\0';
  30.  
  31.             do {
  32.                 //INICIALIZAMOS LA VARIABLE CENTINELA.
  33.                 centinela = 0;
  34.                 printf("Palabra: %s\n", cadena);
  35.                 printf("Intentos restantes: %d\n\n", i);
  36.  
  37.                 do {
  38.                     printf("Introduce una letra minuscula (Jug.2): ");
  39.                     scanf("%c", &letra);
  40.                     fflush(stdin);
  41.                 }
  42.  
  43.                 while (letra < 'a' || letra > 'z');
  44.  
  45.                 for (j=0;j<strlen(palabra);j++){
  46.  
  47.                     if (palabra[j] == letra)
  48.                     {
  49.                         cadena[j] = letra;
  50.                         centinela = 1;
  51.                     }
  52.                 }
  53.  
  54.                 if (centinela != 1)i--;
  55.                 printf("\n\n");
  56.             }
  57.  
  58.             while(i != 0 || cadena==palabra);
  59.       //AQUI ES DONDE ESTA EL CODIGO QUE DEBERIA EJECUTARSE SI SE ACIERTA LA PALABRA, PARANDO , IMPRMIENDO LA FRASE Y SUMANDO 1 PUNTO AL JUGADOR. PERO NO CONSIGO QUE FUNCIONE
  60.             if (cadena==palabra) {
  61.                 printf("Has acertado la palabra!!");
  62.                 puntosJug2++;
  63.             }
  64.  
  65.             else puntosJug1++;
  66.         }
  67.  
  68.         else{
  69.             //INICIALIZAMOS LA VARIABLE CENTINELA.
  70.             centinela = 0;
  71.  
  72.             //CONTROLAMOS EL DATO QUE INTRODUCE EL USUARIO.
  73.             do {
  74.                 printf("Introduce la palabra a adivinar Jugador 2: ");
  75.                 scanf("%s", palabra);
  76.                 fflush(stdin);
  77.                 system("cls");
  78.             }
  79.  
  80.             while (strlen(palabra) > 50);
  81.             medidaCad=strlen(palabra);
  82.             strcpy(cadena, "--------------------------------------------------");
  83.             cadena[medidaCad]='\0';
  84.  
  85.             do{
  86.                 //INICIALIZAMOS LA VARIABLE CENTINELA.
  87.                 centinela = 0;
  88.                 printf("Palabra: %s\n", cadena);
  89.                 printf("Intentos restantes: %d\n\n", i);
  90.  
  91.                 do{
  92.                     printf("Introduce una letra minuscula (Jug.1): ");
  93.                     scanf("%c", &letra);
  94.                     fflush(stdin);
  95.                 }
  96.  
  97.                 while (letra < 'a' || letra > 'z');
  98.  
  99.                 for (j=0;j<strlen(palabra);j++) {
  100.  
  101.                     if (palabra[j]==letra) {
  102.                         cadena[j]=letra;
  103.                         centinela=1;
  104.                     }
  105.                 }
  106.  
  107.                 if (centinela != 1)i--;
  108.                 printf("\n\n");
  109.             }
  110.  
  111.             while(i!=0 || cadena==palabra);
  112.  
  113.             if (cadena==palabra) {
  114.                 printf("Has acertado la palabra!!");
  115.                 puntosJug1++;
  116.             }
  117.  
  118.             else puntosJug2++;
  119.         }
  120.  
  121.         do{
  122.             printf("Quereis jugar mas partidas? <S o N>: ");
  123.             scanf("%c", &jugar);
  124.             fflush(stdin);
  125.         }
  126.  
  127.         while (jugar != 'S' && jugar != 's' && jugar != 'N' && jugar != 'n');
  128.         //INCREMENTAMOS LA VARIABLE TURNO PARA QUE PREGUNTE AL OTRO JUGADOR.
  129.         turno++;
  130.         system("cls");
  131.         //INICIALIZAMOS LOS VALORES QUE NECESITAMOS PONER EN SU ESTADO INICIAL.
  132.         i=5;
  133.         j=0;
  134.     }
  135.  
  136.     while (jugar == 'S' || jugar == 's');
  137.     printf("Puntuacion final: (Jug.1) %d - %d (Jug.2)\n", puntosJug1, puntosJug2);
  138.  
  139.     //FUNCIÓN QUE NOS PERMITE CONTROLAR LA SALIDA DEL PROGRAMA, DANDOLE A 1 TECLA.
  140.     system ("pause");
  141.     return(0);
  142. }

Última edición por AlmaVagabunda; 10/11/2011 a las 16:18 Razón: Titulo muy general
  #2 (permalink)  
Antiguo 10/11/2011, 17:47
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: Programa Ahorcado - Un error

Priemro de todo deberias cambiar : while(i != 0 || cadena==palabra);
por while(i!=0 && strcmp(cadena,palabra)!= 0);

Para comparar cadenas de caracteres hay que usar una funcion. Ya que el == usado asi solo compara direcciones de memoria. strcmp devuelve 0 si la camdena es igual.

Ademas necesitas usar el AND (&&). para chequer las dos condiciones.

Lo de los numeros ya esta chequeado, en este DO

Código C++:
Ver original
  1. do {
  2.                     printf("Introduce una letra minuscula (Jug.2): ");
  3.                     scanf("%c", &letra);
  4.                     fflush(stdin);
  5. }while (letra < 'a' || letra > 'z');


Por ultimo una sugerencia asi aprender mas, te recomendaria leer mas sobre arrays, asi evitas escribir dos veces el codigo, uno para cada jugador.

Saludos
  #3 (permalink)  
Antiguo 10/11/2011, 18:00
Avatar de AlmaVagabunda  
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Programa Ahorcado - Un error

Recien probado, y funciona correctamente. Muchisimas gracias.
Estaba mirando justo esa funcion para comparar, pero no me salia.
Gracias de nuevo!!
En los proximos dias que termine unos examenes, mirare sobre arrays.

Un gran abrazo! ;)
  #4 (permalink)  
Antiguo 10/11/2011, 18:18
Avatar de AlmaVagabunda  
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Programa Ahorcado - Un error

Perdon, se me olvido.

Lo de la letra se que ya lo tenia (ya me costo mi rato entenderlo jajaja)
Pero lo que necesito es que cuando se inicia el juego, que hay que escribir una palabra, varias letras, hacer que no acepte ningun numero o caracter especial aunque este mezclado con letras, solo un conjunto de letras.

No se si me explique, estoy euforico por haber arreglado esa tonteria :)

Es posible hacerlo sin mucha complicacion? tendre que aprender mas? jajaja

Un saludo

Edit:
Por cierto, los dos errores que me salen, son de los dos for que tengo en el codigo, y dice lo siguiente:
comparison between signed and unsigned integer expressions

¿Que significa?

Edit2:
Ya no me sale el error, no se por que, pero ya no sale :)
Edit3:
Debo de ser menos inocente... volvio el error grrr

Última edición por AlmaVagabunda; 10/11/2011 a las 18:41
  #5 (permalink)  
Antiguo 10/11/2011, 19:21
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: Programa Ahorcado - Un error

Código C:
Ver original
  1. int sololetras(char * cadena)
  2. {
  3.      int i;
  4.      for (i=0 ; i < strlen(cadena); i++ )
  5.            if (cadena[i] < 'a' || cadena[i] > 'z' ) return 0;
  6.      return 1;
  7. }

y ahora modificas este linea while (strlen(palabra) > 50); por :

Código C:
Ver original
  1. while (strlen(palabra) > 50 && !sololetras(palabra) );

saludos
  #6 (permalink)  
Antiguo 11/11/2011, 03:41
Avatar de AlmaVagabunda  
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Programa Ahorcado - Un error

No consigo que funcione.

el:
Código C:
Ver original
  1. int sololetras(char * cadena)
Es la cabecera de la funcion, lo que seria el main, no?

Y el:
Código C:
Ver original
  1. {
  2.      int i;
  3.      for (i=0 ; i < strlen(cadena); i++ )
  4.            if (cadena[i] < 'a' || cadena[i] > 'z' ) return 0;
  5.      return 1;
  6. }
Donde lo pongo? He probado justo antes del while, tambien justo despues del scanf, y no consigo que funcione, que estoy haciendo mal?
  #7 (permalink)  
Antiguo 11/11/2011, 08:08
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: Programa Ahorcado - Un error

Asi no se declaran las funciones...no las tenes que cortar en dos.

Código C++:
Ver original
  1. int sololetras(char * cadena)
  2.     {
  3.          int i;
  4.          for (i=0 ; i < strlen(cadena); i++ )
  5.                if (cadena[i] < 'a' || cadena[i] > 'z' ) return 0;
  6.          return 1;
  7.     }
  8.  
  9.  
  10. int main()
  11. {
  12. // resto del codigo
  13. }
  #8 (permalink)  
Antiguo 11/11/2011, 08:54
Avatar de AlmaVagabunda  
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Programa Ahorcado - Un error

Soy muy pesado, lo se.
Pero no consigo que funcione, compila perfectamente, pero cuando meto numeros solos, o con letras, sigue ejecutandose en vez de volver a solicitar.

No se bien trabajar con modulos, y me pierdo un poco.
Se supone que la funcion sololetras, coje la cadena palabra, y mira caracter a caracter si hay numero, si lo hay devuelve un 0, no?
Y luego en el while
Código C++:
Ver original
  1. while (strlen(palabra) > 50 && !sololetras(palabra) );
lo de !sololetras(palabra) ¿esta bien?

Soy un poco terco jejeje
Muchas gracias por preocuparte sam90 ;)

Un abrazo!
  #9 (permalink)  
Antiguo 11/11/2011, 10:13
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: Programa Ahorcado - Un error

Proba asi:

while (strlen(palabra) > 50 || 0==sololetras(palabra) );

El error fue mio.
  #10 (permalink)  
Antiguo 11/11/2011, 10:31
Avatar de AlmaVagabunda  
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Programa Ahorcado - Un error

Ahora si!! funciona perfecto.

Muchas gracias por todo! pense que nunca iba a acabarlo :)

Un abrazo

Etiquetas: ahorcado, funcion, programa, string, variables, cadenas
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 10:35.