[ Foro de C ]

No entiendo por que no me hace la operacion

30-Dec-2013 01:13
Alexander Arias
4 Respuestas

He tratado de organizarlo de varias manera y aun no entiendo por que su resultado me da 0, alguien que me pueda decir que esta mal o de que otra forma puedo hacerlo.

La funcion de este programa es calcular el indice academico, pidiendo las asignaturas una a una.


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    char calificacion;
    float creditos;
    char cont;
    float res=1;
    float temp=0;
    float acumulado=0;
    int p=0;
    printf("Bienvenido a la aplicación de cálculo de índice: \n\n");

    do
    {
        p++;
        printf("\nIntroduzca la calificación obtenida en la asignatura #%d: ",p);
        fflush(stdin);
        scanf("%c",&calificacion);

        if (calificacion=='A'){calificacion=4;}
        else if (calificacion=='B'){calificacion=3;}
        else if (calificacion=='C'){calificacion=2;}
        else if (calificacion=='F'){calificacion=0;}

        printf("\nIntroduzca la cantidad de créditos de la asignatura #%d: ",p);
        scanf("%d",&creditos);

        res=calificacion*creditos;
        res+=acumulado;
        res=acumulado;

        printf("\n\nacumulado: %f",acumulado);

        creditos+=temp;
        creditos=temp;

        printf("\n\ntemp: %f", temp);

        printf("\n\nDesea introducir otra asignatura (S/N) ? ");
        fflush(stdin);
        scanf("%c",&cont);

    }while (cont!='N');

    printf("\n\nTu índice trimestral es de: %5.2f\n",(float)acumulado/temp );

    return 0;
}



30-Dec-2013 02:45
Nacho Cabanes (+83)

Es habitual que el problema lo dé la lectura de caracteres y números entremezclados, pero en tu caso has usado "fflush",  que suele minimizar los problemas.

En estos casos, lo ideal es que emplees el depurador de tu entorno, o que añadas algún "printf" auxiliar, para comprobar los valores de las variables.

En un primer vistazo, veo dos problemas:


if (calificacion=='A'){calificacion=4;}


y las líneas similares, que cambian el valor de una misma variable de "carácter" a "entero" y que no dejan un valor por defecto, de modo que si pones una "a" en vez de una "A" obtendrás valores erróneos, y


scanf("%d",&creditos);


que guarda como entero un valor de una variable que es "float", lo que también puede dar problemas, porque la codificación interna de esos dos tipos de datos es distinta.

Convierte las líneas a partir de la 21 en


        scanf("%c",&calificacion);
 
        if (calificacion=='A'){calificacion=4;}
        else if (calificacion=='B'){calificacion=3;}
        else if (calificacion=='C'){calificacion=2;}
        else if (calificacion=='F'){calificacion=0;}
        
        printf("Calificacion: #%c#\n", calificacion);
 
        printf("\nIntroduzca la cantidad de créditos de la asignatura #%d: ",p);
        scanf("%d",&creditos);
        
        printf("Creditos: #%f#\n", creditos);


Y verás que el valor de "calificacion" es incorrecto (puedes probar a usar "getchar" para vaciar el buffer del teclado en vez de "fflush") y que el de "creditos" también lo es incorrecto (cambia el "%d" del scanf por un "%f"),


31-Dec-2013 02:52
Alexander Arias

ya le modifique y arregle todo eso y todavia me sigue dando el mismo fallo, use el printf para chekear los resultados de "calificacion" y "creditos" y sigue dando cero. Cambie el tipo de dato a "int" con su correspodiente "%d" y sigue dando cero, he buscado informacion pero no he encontrado nada que hable sobre eso.


31-Dec-2013 03:43
Nacho Cabanes (+83)

No has puesto el fuente completo. Insisto en que no es sólo por el "%d". También es importante que haya un "fflush" o un "getchar" después de cada lectura, para que los "\n" sobrantes no te falseen la lectura posterior.

Yo lo haría así:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int main()
{
    char calificacion;
    int calificacionNumerica;
    float creditos;
    char continuar;
    float res=1;
    float temp=0;
    float acumulado=0;
    int p=0;
    printf("Bienvenido a la aplicación de cálculo de índice: \n\n");
 
    do
    {
        p++;
        printf("\nIntroduzca la calificación obtenida en la asignatura #%d: ",p);
        calificacion = getchar();
        getchar(); // Para absorber el \n
 
        if (calificacion == 'A') calificacionNumerica = 4;
        else if (calificacion == 'B') calificacionNumerica = 3;
        else if (calificacion == 'C') calificacionNumerica = 2;
        else /*if (calificacion=='F')*/ calificacionNumerica = 0;
        
        printf("Calificacion: #%c#\n", calificacion);
 
        printf("\nIntroduzca la cantidad de créditos de la asignatura #%d: ",p);
        scanf("%f",&creditos);
        getchar(); // Para absorber el \n
        
        printf("Creditos: #%f#\n", creditos);
 
        res = calificacionNumerica*creditos;
        res += acumulado;
        acumulado = res;  // Estaba al revés
 
        printf("\n\nacumulado: %f",acumulado);
 
        creditos += temp;
        temp = creditos;   // Estaba al revés
 
        printf("\n\ntemp: %f", temp);
 
        printf("\n\nDesea introducir otra asignatura (S/N) ? ");
        continuar = getchar();
        getchar(); // Para absorber el \n
 
    }
    while (continuar != 'N');
 
    printf("\n\nTu índice trimestral es de: %5.2f\n",
		(float) acumulado / temp );
 
    return 0;
}


Como puedes ver, también he cambiado algún fragmento que parecía estar al revés de lo que debería. Por ejemplo, en los pares de líneas como ésta, la segunda anula a la primera, así que le he dado la vuelta:


res+=acumulado;
res=acumulado;


Además de eso, también he hecho algún otro cambio menor, como crear una nueva variable "calificacionNumerica", en vez de usar "calificacion" tanto para textos como para números, y también he quitado el último "if", para dejar un valor por defecto.


02-Jan-2014 18:32
Alexander Arias

Muchisimas gracias por la ayuda, es mi primera materia de programacion por lo que no tengo mucha experiencia pero me qedo claro como lo has explicado, gracias nuevamente!!






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)