Ayuda programación C con un bug

Iniciado por Nikola__Tesla, 14 Mayo 2014, 16:49 PM

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

Nikola__Tesla

Hola a todos estoy empezando con C y he hecho un programa para calcular el valor de las resistencias eléctricas mediante el código de colores. El problema es que al poner como color del factor multiplicador (el tercer color) como amarillo, me da el mensaje de error el SEGUNDO, y cambiando el segundo color me sigue dando el mismo error, hasta que cambio el factor multiplicador a otro color que no sea el amarillo y todo perfecto. Si desactivo el mecanismo de error me sale 1000000 ohmios cuando meto "verde-azul-amarillo-oro", que debería dar 560000 ohmios, que el programa transforma posteriormente, 560K.  He estado buscando errores por todos lados y es que no me explico que puede ser. A ver si me podeis echar una mano.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void ayuda(void)
{
    system("cls");
    printf("Bienvenido al manual de ayuda de Ohmium v3.0!");
    printf("\n\nPara empezar a usar el programa, entre en la primera\n");
    printf("opcion, y valla introduciendo los colores uno a uno\n");
    printf("en minusculas y sin acentos, tal y como se muestra en la\n");
    printf("siguiente lista:\n");
    printf("\n negro\n marron\n rojo\n naranja\n amarillo\n verde\n azul\n");
    printf(" violeta\n gris\n blanco\n oro\n plata\n nada\n\n");
    printf("PULSE CUALQUIER TECLA PARA REINICIAR EL PROGRAMA");
    system("pause>nul");
    system("cls");
}
int valor1(char col1[8])
{
    int val;
    char negro[]="negro";
    char marron[]="marron";
    char rojo[]="rojo";
    char naranja[]="naranja";
    char amarillo[]="amarillo";
    char verde[]="verde";
    char azul[]="azul";
    char violeta[]="violeta";
    char gris[]="gris";
    char blanco[]="blanco";
    int com0,com1,com2,com3,com4,com5,com6,com7,com8,com9;
    com0=strcmp(negro,col1);
    com1=strcmp(marron,col1);
    com2=strcmp(rojo,col1);
    com3=strcmp(naranja,col1);
    com4=strcmp(amarillo,col1);
    com5=strcmp(verde,col1);
    com6=strcmp(azul,col1);
    com7=strcmp(violeta,col1);
    com8=strcmp(gris,col1);
    com9=strcmp(blanco,col1);
    if (com0==0) val=0;
    else if (com1==0) val=10;
    else if (com2==0) val=20;
    else if (com3==0) val=30;
    else if (com4==0) val=40;
    else if (com5==0) val=50;
    else if (com6==0) val=60;
    else if (com7==0) val=70;
    else if (com8==0) val=80;
    else if (com9==0) val=90;
    else error(1);
    return val;
}
int valor2(char col2[8])
{
    int num;
    char negro[]="negro";
    char marron[]="marron";
    char rojo[]="rojo";
    char naranja[]="naranja";
    char amarillo[]="amarillo";
    char verde[]="verde";
    char azul[]="azul";
    char violeta[]="violeta";
    char gris[]="gris";
    char blanco[]="blanco";
    int com0,com1,com2,com3,com4,com5,com6,com7,com8,com9;
    com0=strcmp(negro,col2);
    com1=strcmp(marron,col2);
    com2=strcmp(rojo,col2);
    com3=strcmp(naranja,col2);
    com4=strcmp(amarillo,col2);
    com5=strcmp(verde,col2);
    com6=strcmp(azul,col2);
    com7=strcmp(violeta,col2);
    com8=strcmp(gris,col2);
    com9=strcmp(blanco,col2);
    if (com0==0) num=0;
    else if (com1==0) num=1;
    else if (com2==0) num=2;
    else if (com3==0) num=3;
    else if (com4==0) num=4;
    else if (com5==0) num=5;
    else if (com6==0) num=6;
    else if (com7==0) num=7;
    else if (com8==0) num=8;
    else if (com9==0) num=9;
    else error(2);
    return num;
}
float factor(char fac[8])
{
    float num;
    char negro[]="negro";
    char marron[]="marron";
    char rojo[]="rojo";
    char naranja[]="naranja";
    char amarillo[]="amarillo";
    char verde[]="verde";
    char azul[]="azul";
    char plata[]="plata";
    char oro[]="oro";
    int com0,com1,com2,com3,com4,com5,com6,com7,com8;
    com0=strcmp(negro,fac);
    com1=strcmp(marron,fac);
    com2=strcmp(rojo,fac);
    com3=strcmp(naranja,fac);
    com4=strcmp(amarillo,fac);
    com5=strcmp(verde,fac);
    com6=strcmp(azul,fac);
    com7=strcmp(oro,fac);
    com8=strcmp(plata,fac);
    if (com0==0) num=1;
    else if (com1==0) num=10;
    else if (com2==0) num=100;
    else if (com3==0) num=1000;
    else if (com4==0) num=10000;
    else if (com5==0) num=100000;
    else if (com6==0) num=1000000;
    else if (com7==0) num=0.1;
    else if (com8==0) num=0.01;
    else error(3);
    return num;
}
int tolerancia(char num2[8])
{
    int tol;
    char marron[]="marron";
    char rojo[]="rojo";
    char plata[]="plata";
    char oro[]="oro";
    char nada[]="nada";
    int com0,com1,com2,com3,com4;
    com0=strcmp(marron,num2);
    com1=strcmp(rojo,num2);
    com2=strcmp(oro,num2);
    com3=strcmp(plata,num2);
    com4=strcmp(nada,num2);
    if (com0==0) tol=1;
    else if (com1==0) tol=2;
    else if (com2==0) tol=5;
    else if (com3==0) tol=10;
    else if (com4==0) tol=20;
    else error(4);
    return tol;
}
void error(int tipo)
{
    if (tipo==1 || tipo==2) //primeras dos cifras
    {
        system("cls");
        printf("\nHa habido un error al introducir el %d color \n",tipo);
        printf("Asegurese de que ha introducido uno de los siguientes colores:");
        printf("\n negro\n marron\n rojo\n naranja\n amarillo\n verde\n azul\n");
        printf(" violeta\n gris\n blanco\n");
        printf("Pulse cualquier tecla para reiniciar el programa");
        system("pause>nul");
        system("cls");
        cadena();
    }
    else if (tipo==3) //tercera cifra
    {
        system("cls");
        printf("\nHa habido un error al introducir el tercer color\n",tipo);
        printf("Asegurese de que ha introducido uno de los siguientes colores:");
        printf("\n negro\n marron\n rojo\n naranja\n amarillo\n verde\n azul\n");
        printf(" oro\n plata\n");
        printf("Pulse cualquier tecla para reiniciar el programa");
        system("pause>nul");
        system("cls");
        cadena();
    }
    else if (tipo==4) //cuarta cifra
    {
        system("cls");
        printf("\nHa habido un error al introducir el cuarto color\n",tipo);
        printf("Asegurese de que ha introducido uno de los siguientes numeros:");
        printf("\n negro\n marron\n oro\n plata\n nada\n");
        printf("Pulse cualquier tecla para reiniciar el programa");
        system("pause>nul");
        system("cls");
        cadena();
    }
    else if (tipo==5)
    {
        system("color 04");
        printf("ERROR GENERALIZADO, PULSE CUALQUIER TECLA PARA SALIR");
        system("pause>nul");
        system("exit");
    }
}
void cadena(void)
{
    int opcion;
    opcion=1;
    while (opcion==1)
    {
        printf("BIENVENIDO A OHMIUM v3.0!\n");
        printf("Pulse 1 para empezar\n");
        printf("Pulse 2 para ver el manual de ayuda\n");
        //seleccion de comienzo u ayuda
        printf("(1/2): ");
        int po;
        fflush(stdin);
        scanf("%d",&po);
        if (po==1)
        {
            //Recogida de datos
            system("cls");
            printf("Introduzca el primer color: ");
            char prim[8];
            fflush(stdin);
            gets(prim);
            system("cls");
            printf("Introduzca el segundo color: ");
            char segu[8];
            fflush(stdin);
            gets(segu);
            system("cls");
            printf("Introduzca el tercer color: ");
            char terce[8];
            fflush(stdin);
            gets(terce);
            system("cls");
            printf("Introduzca el cuarto color: ");
            char cuar[8];
            fflush(stdin);
            gets(cuar);
            //Comienzo del calculo
            int val1,val2,val4;
            val1=valor1(prim);
            val2=valor2(segu);
            float val3;
            val3=factor(terce);
            val4=tolerancia(cuar);
            int res1;
            res1=val1+val2;
            float res2;
            res2=res1*val3;
            //clasificacion del resultado
            system("cls");
            float resf2;
            if (res2<=990)
            {
                resf2=res2;
                system("color 02");
                printf("La resistencia tiene un valor de %g ohmios ñ %d\n",resf2,val4);
                printf("PULSE CUALQUIER TECLA PARA CONTINUAR");
                system("pause>nul");
                system("color 07");
            }
            else if ((res2==1000) || (res2==2000) || (res2==3000) || (res2==4000) || (res2==5000) || (res2==6000) || (res2==7000) || (res2==8000) || (res2==9000))
            {
                float num;
                num=res2/1000;
                char resf1[2];
                sprintf(resf1,"%gK",num);
                resf1[2]='\0';
                system("color 02");
                printf("La resistencia tiene un valor de %s ñ %d\n",resf1,val4);
                printf("PULSE CUALQUIER TECLA PARA CONTINUAR");
                system("pause>nul");
                system("color 07");
            }
            else if ((res2>=1100 && res2<=1900) || (res2>=2100 && res2<=2900) || (res2>=3100 && res2<=3900) || (res2>=4100 && res2<=4900) || (res2>=5100 && res2<=5900) || (res2>=6100 && res2<=6900) || (res2>=7100 && res2<=7900) || (res2>=8100 && res2<=8900) || (res2>=9100 && res2<=9900))
            {
                char num1[3];
                sprintf(num1,"%g",res2);
                char resf1[3];
                sprintf(resf1,"%cK%c",num1[0],num1[1]);
                resf1[3]='\0';
                system("color 02");
                printf("La resistencia tiene un valor de %s ñ %d\n",resf1,val4);
                printf("PULSE CUALQUIER TECLA PARA CONTINUAR");
                system("pause>nul");
                system("color 07");
            }
            else if (res2>=10000 && res2<=99000)
            {
                float num;
                num=res2/1000;
                char resf1[3];
                sprintf(resf1,"%gK",num);
                resf1[3]='\0';
                system("color 02");
                printf("La resistencia tiene un valor de %s ñ %d\n",resf1,val4);
                printf("PULSE CUALQUIER TECLA PARA CONTINUAR");
                system("pause>nul");
                system("color 07");
            }
            else if (res2>=100000 && res2<=990000)
            {
                float num;
                num=res2/1000;
                char resf1[4];
                sprintf(resf1,"%gK",num);
                resf1[4]='\0';
                system("color 02");
                printf("La resistencia tiene un valor de %s ñ %d\n",resf1,val4);
                printf("PULSE CUALQUIER TECLA PARA CONTINUAR");
                system("pause>nul");
                system("color 07");
            }
            else if ((res2==1000000) || (res2==2000000) || (res2==3000000) || (res2==4000000) || (res2==5000000) || (res2==6000000) || (res2==7000000) || (res2==8000000) || (res2==9000000))
            {
                float num;
                num=res2/1000000;
                char resf1[2];
                sprintf(resf1,"%gM",num);
                resf1[2]='\0';
                system("color 02");
                printf("La resistencia tiene un valor de %s ñ %d\n",resf1,val4);
                printf("PULSE CUALQUIER TECLA PARA CONTINUAR");
                system("pause>nul");
                system("color 07");
            }
            else if ((res2>=1100000 && res2<=1900000) || (res2>=2100000 && res2<=2900000) || (res2>=3100000 && res2<=3900000) || (res2>=4100000 && res2<=4900000) || (res2>=5100000 && res2<=5900000) || (res2>=6100000 && res2<=6900000) || (res2>=7100000 && res2<=7900000) || (res2>=8100000 && res2<=8900000) || (res2>=9100000 && res2<=9900000))
            {
                char num1[10];
                sprintf(num1,"%f",res2);
                char resf1[3];
                sprintf(resf1,"%cM%c",num1[0],num1[1]);
                resf1[3]='\0';
                system("color 02");
                printf("La resistencia tiene un valor de %s ñ %d\n",resf1,val4);
                printf("PULSE CUALQUIER TECLA PARA CONTINUAR");
                system("pause>nul");
                system("color 07");
            }
            else if (res2>=10000000 && res2<=99000000)
            {
                float num;
                num=res2/1000000;
                char resf1[3];
                sprintf(resf1,"%gM",num);
                resf1[3]='\0';
                system("color 02");
                printf("La resistencia tiene un valor de %s ñ %d\n",resf1,val4);
                printf("PULSE CUALQUIER TECLA PARA CONTINUAR");
                system("pause>nul");
                system("color 07");
            }
            else if (res2>=100000000 && res2<=990000000)
            {
                float num;
                num=res2/1000000;
                char resf1[4];
                sprintf(resf1,"%gM",num);
                resf1[4]='\0';
                system("color 02");
                printf("La resistencia tiene un valor de %s ñ %d\n",resf1,val4);
                printf("PULSE CUALQUIER TECLA PARA CONTINUAR");
                system("pause>nul");
                system("color 07");
            }
            system("cls");
            printf("Pulse 1 para volver calcular otra resistencia\n");
            printf("Pulse 2 para salir\n");
            printf("(1/2): ");
            fflush(stdin);
            scanf("%d",&opcion);
            system("color 07");
            system("cls");
        }
        else ayuda();
    }
    system("exit");
}

int main(void)
{
    system("title Ohmium v3.0");
    cadena();
    return 0;
}

eferion

#1
No es necesario repetir el código en cada función... repetir código es una fea costumbre que suele dar problemas... sobretodo porque vas a tener que corregir el mismo fallo varias veces.

En primer lugar, para almacenar un string, necesitas un buffer que sea, como mínimo, equivalente a la longitud de la cadena más uno ( para el carácter de final de cadena, '\0' )

En tu caso, amarillo tiene longitud 8, luego necesitas un buffer de tamaño 9 o más para poder almacenar esa cadena de forma segura.

EI: dejemos que haga sus propio codigo por favor.

Nikola__Tesla

Lo que me sorprende del bug de mi código es que he descubierto que si en la funcion factor cambio
char amarillo[]="amarillo";
por
char amarillo[]="amarill";
por ejemplo, el programa funciona perfectamente, como si funcionara con todo excepto con la palabra "amarillo" :o. Por tanto, me gustaría saber el por qué de esto o, si no, un sinónimo de amarillo para poner ;D

xiruko

Cita de: eferion en 14 Mayo 2014, 18:06 PM
No es necesario repetir el código en cada función... repetir código es una fea costumbre que suele dar problemas... sobretodo porque vas a tener que corregir el mismo fallo varias veces.

En primer lugar, para almacenar un string, necesitas un buffer que sea, como mínimo, equivalente a la longitud de la cadena más uno ( para el carácter de final de cadena, '\0' )

En tu caso, amarillo tiene longitud 8, luego necesitas un buffer de tamaño 9 o más para poder almacenar esa cadena de forma segura.


Te leíste lo que dijo eferion? Aunque no sé para qué pregunto porque ahí tienes la respuesta a tu problema.

Y no, no es que no funcione con "amarillo" y sí con "amarill", simplemente es porque la primera tiene 8 letras y la segunda 7.

Saludos.

Nikola__Tesla

Olvide decir que aumente a 10 y seguía dando error

MeCraniDOS

#5
Cita de: Nikola__Tesla en 14 Mayo 2014, 22:32 PM
Olvide decir que aumente a 10 y seguía dando error

Quizás no es ese el error, pero cambia las declaraciones de las funciones:

int valor1(char col1[8])
int valor2(char col2[8])
float factor(char fac[8])
int tolerancia(char num2[8])


Por esto:

int valor1(char col1[])
int valor2(char col2[])
float factor(char fac[])
int tolerancia(char num2[])


Saludos




Cita de: Nikola__Tesla en 14 Mayo 2014, 22:32 PM
Olvide decir que aumente a 10 y seguía dando error

Tal y como está el código es un poco difícil averiguar donde está el bug, pero seguro que te falla lo del tamaño, ya que como dice efeiron, "amarillo tiene longitud 8, luego necesitas un buffer de tamaño 9 o más para poder almacenar esa cadena de forma segura.", y con esa declaración de la función, solo mandas "8".
"La física es el sistema operativo del Universo"
     -- Steven R Garman