Hola necesito ayuda con codigo en C

Iniciado por heomp, 3 Mayo 2014, 04:26 AM

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

heomp

Hola que tal, veran soy nuevo en esto de la programacion y tengo unas dudas, loque trato de hacer es un test de capitales, lo que no se hacer es como imprimir mis preguntas una por una y a la vez con su respuesta, he aqui mi codigo:


#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
void capitalesmundo();
int main ()
{
   int r;
   printf("\n\n\t\tBIENVENIDO AL TEST DEDICADO A LA GEOGRAFIA\n\n");
   system("pause");
   system("cls");
   printf("Que desea hacer:\n");
   printf("1.-TEST Capitales del Mundo\n");
   printf("2.-SALIR\n");
   printf("R.- ");
   scanf("%d",&r);
   switch(r)
   {
       case 1: capitalesmundo(); break;
       default: printf("Gracias por usar este juego, hasta la proxima");
   }
}

void capitalesmundo()
{
   char preguntas[15][50]={"¿Cual es la capital de Mexico?",
                            "¿Cual es la capital de Canada?",
                            "¿Cual es la capital de Estados Unidos Americanos?",
                            "¿Cual es la capital de España?",
                            "¿Cual es la capital de Reino Unido?",
                            "¿Cual es la capital de Italia?",
                            "¿Cual es la capital de China?",
                            "¿Cual es la capital de Japon?",
                            "¿Cual es la capital de Brasil?",
                            "¿Cual es la capital de Argentina?",
                            "¿Cual es la capital de Francia?",
                            "¿Cual es la capital de Chile?",
                            "¿Cual es la capital de Peru?",
                            "¿Cual es la capital de Venezuela?",
                            "¿Cual es la capital de Alemania?",};

     char respuestas[15][3][50]={  {"Ciudad de México","Buenos Aires","Tokio"},
                                   {"Mexico","Otawa","Brasilia"},
                                   {"Washington ","Paris","Tokio"},
                                   {"Madrid","Roma","Oslo"},
                                   {"Barcelona","Londres","Berna"},
                                   {"Varsovia","Berlin","Roma"},
                                   {"Kabul","Pekin","Tokio"},
                                   {"Tokio","Doha","Damasco"},
                                   {"Lima","Brasilia","Bogota"},
                                   {"Buenos Aires","Quito","La Habana"},
                                   {"Estocolmo","Monaco","Paris"},
                                   {"Kingston","Santiago de Chile","San Salvador"},
                                   {"Montevideo","San Juan","Lima"},
                                   {"Managua","Puerto Principe","Caracas"},
                                   {"Berlin","Tirana","Viena"},    };
   int buenas[15]={0,1,0,0,1,2,1,0,1,0,2,1,2,2,1};
   int i,j;
   printf("\n\n\t\tHola escojiste CAPITALES DEL MUNDO\n\n");
   printf("En este juego podras ver cuanto sabes de geografia, SUERTE.\n\n");
   system("pause");
   system("cls");
   for (i=0; i<14; i++)
   {
       for (j=0; j<50; j++)
       printf("%c",preguntas[i][j]);
       printf("\n");
   }
   printf("\n");
}


mi codigo imprime todas las respuestas pero no quiero eso les agradeceria si me ayudan gracias :)

rir3760

Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

Y deberías evitar el uso de la biblioteca conio de Borland, mas informacion en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

----

Cita de: heomp en  3 Mayo 2014, 04:26 AMlo que no se hacer es como imprimir mis preguntas una por una y a la vez con su respuesta
Primero hay que reducir las cadenas del array "preguntas" quitando el texto duplicado "¿Cual es la capital de ", de esta forma:
char preguntas[15][50] = {
   "Mexico",
   "Canada",
   "Estados Unidos Americanos",
...
};

Para evitar el desperdicio de memoria lo mejor es utilizar un array de punteros pero como comentas que eres un principiante habrá que dejarlo para después.

A continuación modificas el bucle para que imprima la pregunta y pida la respuesta al usuario:
for (i = 0; i < 14; i++){
   /* 1) Imprimir la pregunta */
   printf("Cual es la capital de %s?\n", preguntas[i]);
   
   /* 2) Obtener la respuesta del usuario (scanf o fgets) */
   
   /* 3) Comparar la respuesta del usuario con la correcta (strcmp) y notificar */
}


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

heomp

Cita de: rir3760 en  3 Mayo 2014, 05:03 AM
Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

Y deberías evitar el uso de la biblioteca conio de Borland, mas informacion en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

----
Primero hay que reducir las cadenas del array "preguntas" quitando el texto duplicado "¿Cual es la capital de ", de esta forma:
char preguntas[15][50] = {
   "Mexico",
   "Canada",
   "Estados Unidos Americanos",
...
};

Para evitar el desperdicio de memoria lo mejor es utilizar un array de punteros pero como comentas que eres un principiante habrá que dejarlo para después.

A continuación modificas el bucle para que imprima la pregunta y pida la respuesta al usuario:
for (i = 0; i < 14; i++){
   /* 1) Imprimir la pregunta */
   printf("Cual es la capital de %s?\n", preguntas[i]);
   
   /* 2) Obtener la respuesta del usuario (scanf o fgets) */
   
   /* 3) Comparar la respuesta del usuario con la correcta (strcmp) y notificar */
}


Un saludo



Gracias por a haberme ayudado me sirvió demasiado, solo un pequeño inconveniente se que (strcmp) se utiliza para comparar cadenas el problema es que no se como utilizarlo, ya que en mi código tengo que comparar mis respuestas

char respuestas[15][3][50]={  {"Ciudad de México","Buenos Aires","Tokio"},
                                             {"Mexico","Otawa","Brasilia"},
                                             {"Washington ","Paris","Tokio"},
                                              ...};


con mi arreglo donde tengo guardado mis respuestas correctas
int buenas[15]={0,1,0,0,1,2,1,0,1,0,2,1,2,2,1};
he visto ejemplos en Internet pero la mayoría utiliza apuntadores, y pues no he visto ese tema, si no es mucha molestia te agradeciera si me explicas como hacerlo gracias.

engel lex

Si buscas en Google sobre strcmp, veras que es muy simple, se le pasan las 2 cadenas y devuelve un valor entero, si el valor es 0 son iguales, no tiene demasiada dificultad
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

rir3760

Cita de: heomp en  3 Mayo 2014, 19:23 PMsolo un pequeño inconveniente se que (strcmp) se utiliza para comparar cadenas el problema es que no se como utilizarlo, ya que en mi código tengo que comparar mis respuestas [...] con mi arreglo donde tengo guardado mis respuestas correctas
int buenas[15]={0,1,0,0,1,2,1,0,1,0,2,1,2,2,1};
No se que estaba pensando (un lapsus) ya que no es necesario pedir la respuesta al usuario como una cadena. En su lugar cada pregunta la imprimes junto con las respuestas a elegir:
Cual es la capital de Mexico?
1) Ciudad de México
2) Buenos Aires
3) Tokio

Y la respuesta elegida por el usuario se lee como un entero (1, 2 o 3), a este le restas uno y lo comparas con la respuesta correcta almacenada en el array "buenas", de esta forma:
for (i = 0; i < 15; i++){
   /* 1) Se presenta cada pregunta al usuario */
   printf("Cual es la capital de %s?\n", preguntas[i]);
   for (j = 0; j < 3; j++)
      printf("%d) %s\n", j + 1, respuestas[i][j]);
   
   /* 2) Se obtiene la respuesta elegida (1 a 3) */
   scanf("%d", &j);
   
   /* 3) Se verifica si es la respuesta correcta */
   if (buenas[i] == j - 1){
      puts("Correcta");
   }else {
      puts("Incorrecta");
   }
}


Solo falta validar que el numero ingresado por el usuario este en el rango valido (mayor o igual a uno y menor o igual a tres).

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

Blaster

#5
Cita de: heomp en  3 Mayo 2014, 19:23 PM
Gracias por a haberme ayudado me sirvió demasiado, solo un pequeño inconveniente se que (strcmp) se utiliza para comparar cadenas el problema es que no se como utilizarlo, ya que en mi código tengo que comparar mis respuestas con mi arreglo donde tengo guardado mis respuestas correctas

Yo te propongo que guardes el pais con sus respectivas capitales en una matriz de punteros, de esta manera

Código (cpp) [Seleccionar]
char *pregunta[][2] = { "Mexico", "Cuidad de Mexico",
                       "Argentina", "Buenos Aires",
                       "Francia", "Paris" };


Y luego que vayas preguntando y verificando las respuestas de esta manera

Código (cpp) [Seleccionar]
for( i = 0; i < 3; i++ ){
  printf("Cual es la capital de %s?\n", pregunta[i][0]);
  scanf(" %[^\n]", respuesta);

  if (!strcmp(respuesta, pregunta[i][1]))
     puts("Correcta");
  else
     puts("Incorecta");
}