elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda programación C con un bug
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda programación C con un bug  (Leído 2,072 veces)
Nikola__Tesla

Desconectado Desconectado

Mensajes: 3


Tengo electricidad de endesa gratis


Ver Perfil
Ayuda programación C con un bug
« en: 14 Mayo 2014, 16:49 pm »

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.
Código:
#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;
}


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ayuda programación C con un bug
« Respuesta #1 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.

EI: dejemos que haga sus propio codigo por favor.


« Última modificación: 14 Mayo 2014, 18:23 pm por Eternal Idol » En línea

Nikola__Tesla

Desconectado Desconectado

Mensajes: 3


Tengo electricidad de endesa gratis


Ver Perfil
Re: Ayuda programación C con un bug
« Respuesta #2 en: 14 Mayo 2014, 21:50 pm »

Lo que me sorprende del bug de mi código es que he descubierto que si en la funcion factor cambio
Código:
char amarillo[]="amarillo";
por
Código:
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
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Ayuda programación C con un bug
« Respuesta #3 en: 14 Mayo 2014, 22:11 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.
En línea

Nikola__Tesla

Desconectado Desconectado

Mensajes: 3


Tengo electricidad de endesa gratis


Ver Perfil
Re: Ayuda programación C con un bug
« Respuesta #4 en: 14 Mayo 2014, 22:32 pm »

Olvide decir que aumente a 10 y seguía dando error
En línea

MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: Ayuda programación C con un bug
« Respuesta #5 en: 14 Mayo 2014, 23:23 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:

Código
  1. int valor1(char col1[8])
  2. int valor2(char col2[8])
  3. float factor(char fac[8])
  4. int tolerancia(char num2[8])

Por esto:

Código
  1. int valor1(char col1[])
  2. int valor2(char col2[])
  3. float factor(char fac[])
  4. int tolerancia(char num2[])

Saludos



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".
« Última modificación: 14 Mayo 2014, 23:34 pm por MeCraniDOS » En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda de programación
Programación General
Costabrava2 4 2,547 Último mensaje 9 Agosto 2012, 04:03 am
por kilmaxer
ayuda programación
Programación General
Belisner 9 3,694 Último mensaje 21 Septiembre 2012, 13:22 pm
por Belisner
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines