En C: Error Condiciones [else if], soy novato :$

Nabinski
10 de Mayo del 2004
Hola,
Estoy haciendo una manual que piye x la red sobre C, ahora quiero hacer un programa en el que haya: Strings , condicionales... Uso como compilador el Dev-C++, el programa es el siguiente:
#include <stdio.h>
#include <string.h>

int main()
{
char curs[30], primer, segon, bachillerat;
char sexe[5], noi, noia;
float palier, nota;

printf ("Cicle:");
scanf ("%s", curs);
if ("curs==primer")
{
printf("Sexe: ");
scanf("%s", sexe);
if ("sexe==noia")
{
printf("Palier:");
scanf ("%f", &palier);
if ("palier==0.5")
{
nota=1;
printf("Nota=%f", nota);
}
else if ("palier>1 && palier<3.5");
{
nota=palier+1;
printf("Nota=%f", nota);
}
else if ("palier==4") // el error lo da aki [parse error before else]
{
nota=5;
printf("Nota=%f", nota);
}
else if ("palier==4.5")
{
nota=6;
printf("Nota=%f", nota);
}
else if ("palier==5")
{
nota=7;
printf("Nota=%f", nota);
}
else if ("palier==5.5")
{
nota=8;
printf("Nota=%f", nota);
}
else if ("palier==6")
{
nota=9;
printf("Nota=%f", nota);
}
else if ("palier==6.5")
{
nota=10;
printf("Nota=%f", nota);
}

}

}

return 0;
}

El programa debería preguntar el curso, el sexo y el palier [nota] y deberíad e dar como resultado otra nota.
Toda sugenrencia es buena ;)
Gracias de antemano, x cierto es C no C++.

Alejandro_
10 de Mayo del 2004
El mensaje de error se debe a un ;

else if ("palier>1 && palier<3.5"); // <==== AQUÍ
{
nota=palier+1;
printf("Nota=%f", nota);
}
else if ("palier==4") // el error lo da aki [parse error before else]
{

Cuando el flujo de la ejecución llegue a:

else if ("palier>1 && palier<3.5");

la condición "palier>1 && palier<3.5" será evaluada como true y el punto y coma siguiente indica una sentencia vacía, así que aunque la condición es siempre true, no se hará nada con ello.
Luego se ejecutará el bloque de código encerrado entre llaves. Y después se encuentra con el "else if" que no se correspone con ningún if anterio, lanzando el mensaje de error, afortunadamente.

Bueno, ésta es la razón por la que te aparece el mensaje de error, auque si eres de esos a los que las razones lo tienen sin cuidado, sólo borra el ; de más y ya.

Por otro ladao, cada una de las condiciones de evaluación la pones entre comillas, como en la primera:

if ("curs==primer")

este tipo de expresiones siempre se evalúan como true, porque una cadena de caracteres es algo distinto de cero. (Esa es una explicación. Fascistas: abstenerse de todo comentario).
Como regla general, toda vez que pongas como expresión algo que por su naturaleza sea siempre distinto de cero, será indefectiblemente evaluado como true.

Para hacer una comparación entre dos términos, escribe la expresión sin las comillas.

También, con respecto a la primera de las comparaciones, que quedaria escrita de esta forma:

if (curs==primer)
{
...
}

estarías comparando variables de distinta naturaleza que que curs es un puntero al primer carácter de la cadena curs[30], mientras que primer es un simple carácter (que no está inicializado, cuidado con esto también).

Bueno, tienes bastante trabajo por delante, hay que corregir todo.

Suerte,

Alejandro




Nabinski
10 de Mayo del 2004
Wenaz de nuevo,
Pues lo he arreglao to\' tl komo me dijiste, y:
si dejo
if (curs==primer)
{
...
}
Al ejecutar el programa me pregunta x kurso y se cierra. En cambio si pongo las comillas sigue. Pero claro yo ya me suponia segun mas dicho antes, q si quería agregar un else if a la primer condición teniendo esta (la primera) con comillas siempre staría en true, en resumen, q no funcionaria...
Segun lo que me has dixo quedaría así, agregando ya la segunda condición:
#include <stdio.h>
#include <string.h>

int main()
{
char curs[30], primer, segon, bachillerat;
char sexe[5], noi, noia;
float palier, nota;

printf ("Cicle:");
scanf ("%s", curs);
if (curs==primer) // luego existirá otra condición. else if (curs==segon)
{
printf("Sexe:");
scanf("%s", sexe);
if (sexe==noia)
{
printf("Palier:");
scanf ("%f", &palier);
if (palier==0.5)
{
nota=1;
printf("Nota=%f", nota);
}
else if (palier>1 && palier<3.5)
{
nota=palier+1;
printf("Nota=%f", nota);
}
else if (palier==4)
{
nota=5;
printf("Nota=%f", nota);
}
else if (palier==4.5)
{
nota=6;
printf("Nota=%f", nota);
}
else if (palier==5)
{
nota=7;
printf("Nota=%f", nota);
}
else if (palier==5.5)
{
nota=8;
printf("Nota=%f", nota);
}
else if (palier==6)
{
nota=9;
printf("Nota=%f", nota);
}
else if (palier==6.5)
{
nota=10;
printf("Nota=%f", nota);
}
}
else if (sexe==noi)
{
printf("Palier:");
scanf ("%f", &palier);
if (palier<2.1)
{
nota=1;
printf("Nota=%f", nota);
}
else if (palier>2.45 && palier<6.6)
{
nota=palier-2;
printf("Nota=%f", nota);
}
else if (palier==7)
{
nota=5;
printf("Nota=%f", nota);
}
else if (palier==7.5)
{
nota=6;
printf("Nota=%f", nota);
}
else if (palier==8)
{
nota=7;
printf("Nota=%f", nota);
}
else if (palier==8.5)
{
nota=8;
printf("Nota=%f", nota);
}
else if (palier==9)
{
nota=9;
printf("Nota=%f", nota);
}
else if (palier==9.5)
{
nota=10;
printf("Nota=%f", nota);
}
}
}
system ("pause");
return 0;
}

A ver si me puedes ayudar :(
Gracias de antemano

Alejandro_
10 de Mayo del 2004
Antes que nada, quisiera hacer una aclaración sobre la forma en que se muestran las comillas en los mensajes del foro: resulta que cuando escribo

comillas algo comillas

en el foro leo:

barra invertida comillas algo barra invertida comillas

(lo escribo así porque ya imagino lo ridículo que quedará si pongo las comillas reales)

Bueno, voy a hacer un intento escribiendo esto en un editor y pegándolo después en mi mensaje al foro:

Veamos...

donde dices:

if (curs==primer) // luego existirá otra condición. else if (curs==segon)
{
...
}

la forma de escribir la condición en correcta, lo que pasa es que, como te decía, curs en una cadena de caracteres mientras que primer es un carácter (no inicializado). Esto hace imposible que la expresión sea evaluada como true, ya que siempre será false. Me explico:

escribir curs es lo mismo que escribir &curs[0] (la dirección del primer elemento de la cadena, porque curs es un puntero. Para probarlo podrías escribir algo así:

if(curs == &curs[0]) {
printf("Oh, era cierto!");
}
else {
printf("No, este tío se equivoca!");
}

Entonces, como curs es un puntero, difícilmente vaya a ser == a un carácter.

El otro problema es que la variable primer no fue inicializada antes de usarse, así que en el mejor de los casos, si tu compilador se apiadó de tí, primer == '' (puso un 0 en primer).

Lo mismo pasa con las otras variables que declaras pero que no inicializas; como es el caso de noia y las otras.

Cuando dices
char curs[30], primer, segon, bachillerat;

estás declarando a curs como cadena de 30 caracteres, y a primer, segon y bachillerat como variables que contienen un único carácter. De este modo será lícito asignarles algún carácter como:

primer = 'A';
segon = 'B';
bachillerat = 't';

pero no:

primer = "un primero"; // mal
segon = "un segundo"; // mal
bachillerat = "un bachillerato"; // mal

Si lo que quieres comparar es el primer carácter de la cadena curs, tendrías que poner:

if(curs[0] == primer)
{
...
}

pero no te olvides que la variable primer no está inicializada, así que no contiene ningún carácter válido hasta que alguien se lo ponga.


Alejandro

Alejandro_
10 de Mayo del 2004
Ahora me parece que la idea de poner:

char curs[30], primer, segon, bachillerat;

es la de comparar la cadena de caracteres ingresada por el usuario con las cadenas "primer", "segon" y "bachillerat".

Si es así, entonces, las comparaciones deben hacerse a través de la función strcmp(), de la biblioteca string.h

Lo que quedaría:

if (!strcmp(curs, "primer")) {
... ... ...
}

La función strcmp() devuelve 0 cuando las dos cadenas son iguales.

Y lo mismo tendrías que hacer con todas las comparaciones de cadenas.

También, para evitar las distinciones entre mayúsculas y minúsculas, se puede usar:

if(!stricmp(curs, "primer")) {
... ... ...
}


Espero que sea eso...

Alejandro

Nabinski
10 de Mayo del 2004
Gracias de nuevo x la contestación, pues si ya no me da ese error, pero no entiendo lo último q me explicas :
pero no te olvides que la variable primer no está inicializada, así que no contiene ningún carácter válido hasta que alguien se lo ponga.
A ver si cambio lo de curs y tl, ya no me sale ningun error en el compilador y se me carga pero se sigue cerrando cuando me pregunta curs. El problema está en eso de iniciar Primer, cómo se hace? Como quedaría?

Gracias de antemano

Nabinski
10 de Mayo del 2004
Bueno antes de nada, muchas gracias x la contestación,
Nada mas dejo el post pa decirte que gracias x ayudarme, ya lo he solucionado todo y que te explicas muy muy bien ;)

Un Saludo
P.D: Me interesa sobre todo la razon :)