C/Visual C - Condicional para 2 variables

 
Vista:

Condicional para 2 variables

Publicado por yamakasiz (7 intervenciones) el 06/06/2003 07:35:53
Bueno necesito urgente resolver un problema ya que me juego el curso en este trabajo, así que por favor SOS!!!

Tengo un array que me guarda 2 datos en un fichero (pregunta y respuesta) y un contador para guardar 5 preguntas seguidas de sus 5 respuestas.

El orden en que los guarda es:

Pregunta
Respuesta que da el usuario
Respuesta correcta
...............................

Quiero que si la respuesta de la pregunta 1 es igual a la respuesta correcta de la 1 me diga Bien, sinó MAL. He probado con

if (respuesta[1]==resp[1]) /* respuesta es la del usuario y resp
{ la respuesta correcta */
printf(\"BIEN\");
}

está antes de cerrar el fichero.

Me sale un error que el codicional no es valido.

Por favor ayuda.

Un saludo y gracias por adelantado.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Condicional para 2 variables

Publicado por chuidiang (677 intervenciones) el 06/06/2003 08:36:42
Habría que saber de qué tipo son respuesta y resp, así como respuesta[i] y resp[i].
Para comparar cadenas (supongo que las respuestas son cadenas de texto), usa la función strcmp(), que devuelve 0 si ambas cadenas son iguales.
Viendo tu problema, no estaría de más que antes de comparar, tanto la respuesta correcta como la de usuario las pases a minúsculas o mayúscuas, para evitar que "Si" sea distinto de "si". Para ello mira las funciones toupper() y tolower()

Se bueno.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Condicional para 2 variables

Publicado por yamakasiz (7 intervenciones) el 06/06/2003 18:13:00
Muchas gracias por responer. Weno me explico mejor:

tengo en un fichero 5 preguntas con sus 5 respuestas(guardadas desde otro programa) y necesito que al mostrar una pregunta por pantalla me diga si la respuesta (siempre numerica) es correcta o no mirando si es igual a la respuesta que hay en el fichero.
El código que uso es este. Pregunta es la pregunta que hay en el fichero, correcta es la respuesta correcta( tb aparece en el fichero) y respuesta es la que introduce el usuario pro teclado. Todo es numerico (int) menos la la pregunta que es cadena de caracteres (char)

f=fopen ("preguntas.txt","r");
if (f==NULL)
{
printf ("ERROR");
}
x=0;
fscanf (f, "%d", &correcta[x]);
fscanf (f, "%s", &pregunta[x]);
printf ("%s\n", &pregunta[x]");
scanf ("%d", &respuesta);
if (respuesta[x]==correcta[x])
{
printf ("BIEN");
else
{
printf ("MAL");
}

fclose (f);
}

Alguien sabe como puedo hacerlo? de verdad, es vardaderamente urgente. Lo que quiero es que me vaya mostrando pregunta por pregunta, que me diga si está bien o mal y si está bien que pase a otra pregunta, sinó que se pare.

Un saludo de un estudiante en apuros.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Condicional para 2 variables

Publicado por abi (54 intervenciones) el 07/06/2003 02:18:18
hola! Sobre lo que quieres de que el programa te diga si la respuesta esta bien, y que dijiste que te marcaba un error de validación o algo asi copie el código y en vez de un archivo puse puras variables y no me marca ningún error, a lo mejor hay un problema con el archivo, y para lo otro que quieres con un ciclo do while bastaria, sería más o menos asi:

do {
fscanf (f, "%d", &correcta[x]);
fscanf (f, "%s", &pregunta[x]);
printf ("%s\n", &pregunta[x]");
scanf ("%d", &respuesta);
if (respuesta[x]==correcta[x])
printf ("BIEN");
else
{
printf ("MAL");
}
} while (respuesta[x]==correcta[x]) ;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Condicional para 2 variables

Publicado por abi (54 intervenciones) el 07/06/2003 02:19:51
hola! Sobre lo que quieres de que el programa te diga si la respuesta esta bien, y que dijiste que te marcaba un error de validación o algo asi copie el código y en vez de usar archivo y usar fscanf lo puse con puras variables y no me marca ningún error, a lo mejor hay un problema con el archivo, y para lo otro que quieres de que si la respuesta estab bien continue y si esta mal ya no continue con un ciclo do while bastaria, sería más o menos asi:

do {
fscanf (f, "%d", &correcta[x]);
fscanf (f, "%s", &pregunta[x]);
printf ("%s\n", &pregunta[x]");
scanf ("%d", &respuesta);
if (respuesta[x]==correcta[x])
printf ("BIEN");
else
printf ("MAL");
} while (respuesta[x]==correcta[x]) ;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Condicional para 2 variables

Publicado por chuidiang (677 intervenciones) el 07/06/2003 06:50:07
Si son 5 preguntas siempre, usa un bucle for.

Si el número de preguntas es indeterminado, haz el do como te ha dicho abi, pero pon

do {
...
x++; // hay que incrementar x
} while ( ! feof(f) ) ; // fin de fichero

incrementando x al final de cada pasada. El problema con el código de abi es que sale del bucle cuando fallas una pregunta. Si aciertas todas, seguirá intentando leer el fichero aunque se haya acabado.

Date cuenta que no tienes respuesta[x], has leido respuesta, así que la comparación sería
respuesta == correcta[x]

Si quieres guardar todas las respuestas, haz otro array respuesta[] y lee respuesta[x], dejando la comparación como la tienes.

En cuando a la pregunta y el scanf("%s"). Si lee bien y te muestra bien la pregunta, olvidate de lo que te voy a decir, pero lo normal es que scanf deje de leer cuando encuentra un espacio o tabulador. Si tu pregunta tiene varias palabras, a lo mejor sólo te muestra la primera.

En general el scanf y fscanf es muy puñetero. Para depurar escribe todo lo que estás leyendo (la respuesta también) para ver si es lo que debe ser y se ha leido bien.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Condicional para 2 variables

Publicado por chuidiang (677 intervenciones) el 07/06/2003 06:54:04
Veo otra cosa que a lo mejor te da problemas.
Si has declarado tu array de preguntas como

char pregunta [5][100]; // 100 es el número máximo de caracteres por pregunta

no necesitas el & para leer la pregunta

fscanf (f, "%s", pregunta[x]);

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Condicional para 2 variables

Publicado por yamakasiz (7 intervenciones) el 07/06/2003 13:09:13
Muchas gracias a los 2.

Sobre lo de que me "escanea" hasta un espacio, cierto, y no se como arreglarlo, las preguntas tienen un minimo de 4 palabras y me coje cada palabra como una pregunta, por lo que me rellena las siguientes. Y no se como arreglarlo :( es por el &?

Gracias de nuevo a los 2.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Condicional para 2 variables

Publicado por chuidiang (677 intervenciones) el 07/06/2003 13:38:38
Lo del scanf hasta el primer espacio no tiene remedio. Utiliza la funcion fgets() que lee una linea entera. Si la respuesta está en la misma línea, tendrás luego que separarla usando funciones de cadena. Por ejemplo, si pones de separador entre la pregunta y la respuesta una coma ",", puedes hacer algo como esto

char *posicionComa;
char *cadenaLeida;

.. aqui el bucle y todo el rollo ...
{
cadenaLeida = fgets (fichero);

/* Hacemos que posicionComa apunte a la coma de la cadena leida. La funcion strchar() busca la coma y nos devuelve un puntero a ella. */
posicionComa = strchr (cadenaLeida, ',');

/* Reemplazamos la coma por un fin de cadena. De esta manera la
pregunta queda separada de la respuesta. El printf() de cadenaLeida solo sacará la pregunta. */
*posicionComa = '\0';

/* Pasamos al siguiente caracter despues de lo que era la coma. Se supone que en el siguiente caracter esta la respuesta. */
posicionComa++;

/* Convertimos la respuesta en entero, que ahora está en formato cadena */
int respuesta = atoi (posicionCadena);

...
}

Echa un ojo en las ayudas a la sintaxis exacta de las funciones y sus parametros (strchr() en concreto), que igual no te lo he puesto bien.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Condicional para 2 variables

Publicado por yamakasiz (7 intervenciones) el 07/06/2003 14:35:04
De momento pondre la pregunta separando las palabras por \"-\",

Ya em funciona todo, guardo en el fichero pregunta y correcta, depues me muestra pro pantalla la pregunta, le digo mi respuesta y me lo compara con correcta( el final he utilizado strcmp para comprar cadena de palabras, ya que respuesta y correcta solo tendrá un caracter). Como siempre serán 5 preguntas he utilizado for (x=0; x<2; x++) pero ademas necesito que se acabe en cuanto fallo, tipo while (strcmp(respuesta[x], correcta[x])!=0), si es desigual a 0 es que son incorrectas. Como he utilizado for como meto esta condicion???

Al acabar el for no funciona.
Siento ser tan pesado :(
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Condicional para 2 variables

Publicado por abi (54 intervenciones) el 09/06/2003 01:13:21
hola! Para hacer eso que quieres podrías usar una variable bandera, bueno es lo que yo haría, declararia una variable auxiliar
int aux=0 y dentro del ciclo del for pondria esto:
for (x=0; x<2 && aux=0; x++)
{
if (strcmp(respuesta[x], correcta[x])!=0)
{
aux=1;
//si no quieres usar una bandera, en esta del if en vez de poner aux=1, pones esto:
//break;
}
//tus instrucciones
}
asi cuando sean desiguales aux vale 1 y al momento de continuar con el ciclo se saldría, o si no quieres una variable bandera podrías poner un break; y automaticamente saldría del ciclo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Condicional para 2 variables

Publicado por chuidiang (677 intervenciones) el 09/06/2003 10:41:03
Puedes hacer como te dice abi.

Dentro del bucle pones la comparación y si la respuesta no es correcta, pones un break;

Esto hace que el código vaya automáticamente fuera del bucle.

Una vez fuera del bucle, para saber si has salido por un fallo en la contestación o porque se ha terminado el bucle, te basta ver el valor de la variable del for.

Si has puesto en el for hasta x<2, si has salido porque el bucle ha terminado, x valdrá 2. Si has salido por un error, x valdrá 0 o 1.

Por cierto, para comparar solo dos caracteres, no necesitas el strcmp(), basta con compararlos directamente.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar