Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: uchihacrawler en Enero 03, 2015, 06:09:56 pm

Título: Problema al llamar a etiquetas
Publicado por: uchihacrawler en Enero 03, 2015, 06:09:56 pm
Buenas a todos,
Estoy empezando en el tema de la programación en C, y para empezar he creado un programa que te calcula la impedancia equivalente de las resistencia que tengas en paralelo en un circuito.
El programa es el siguiente:

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main()
{
float resistencia1, resistencia2, resistencia3, resistencia4, equivalente, equivalente1;
float op;
printf(":::::::::::::::::::::::::::::::::::\n");
printf(":         CALCULAR LA             :\n");
printf(":    IMPEDANCIA EQUIVALENTE       :\n");
printf(":      CREADO POR CRAWLER         :\n");
printf(":::::::::::::::::::::::::::::::::::\n");
printf("Cuantas resistencias tienes en paralelo? \n");
scanf("%f", op);
if (op == 2)
{
goto resistencias2;
}
if (op == 3)
{
goto resistencias3;
}
if (op == 4)
{
goto resistencias4;
}

resistencias3:
printf("Introduce el valor de las 3 resistencias: \n");
scanf("%f %f %f", &resistencia1, &resistencia2, &resistencia3);
if (resistencia1==0||resistencia2==0||resistencia3==0)
{
printf("Una resistencia no pued ser 0 \n");
system("PAUSE");
return 0;
}
equivalente1 = ((1 / resistencia1) + (1 / resistencia2) + (1 / resistencia3));
equivalente = (1 / equivalente1);
printf("La impedancia equivalente es: %f \n", equivalente);
system("PAUSE");
return 0;

resistencias2:
printf("Introduce el valor de las 2 resistencias: \n");
scanf("%f %f", &resistencia1, &resistencia2);
if (resistencia1==0||resistencia2==0)
{
printf("Una resistencia no pued ser 0 \n");
system("PAUSE");
return 0;
}
equivalente1 = ((1 / resistencia1) + (1 / resistencia2));
equivalente = (1 / equivalente1);
printf("La impedancia equivalente es: %f \n", equivalente);
system("PAUSE");
return 0;

resistencias4:
printf("Introduce el valor de las 4 resistencias: \n");
scanf("%f %f %f %f", &resistencia1, &resistencia2, &resistencia3, &resistencia4 );
if (resistencia1==0||resistencia2==0||resistencia3==0||resistencia4==0)
{
printf("Una resistencia no pued ser 0 \n");
system("PAUSE");
return 0;
}
equivalente1 = ((1 / resistencia1) + (1 / resistencia2) + (1 / resistencia3) + (1 / resistencia4));
equivalente = (1 / equivalente1);
printf("La impedancia equivalente es: %f \n", equivalente);
system("PAUSE");
return 0;
}

De momento no detecto el fallo, o las tiquetas no se utilizan así? Alguien me puede echar una mano? Se lo agradecería mucho ;)

Saludos!

Crawler
Título: Re:Problema al llamar a etiquetas
Publicado por: stakewinner00 en Enero 03, 2015, 06:15:12 pm
Usar GOTO en C es un sacrilegio, mejor cambia esos GOTOs por ifs primero, posiblemente te sea más sencillo solucionar el problema usando ifs.
Hacer llamadas a al sistema con system también es un sacrilegio, pero no tan grave como usar GOTO.
Título: Re:Problema al llamar a etiquetas
Publicado por: uchihacrawler en Enero 03, 2015, 06:18:09 pm
Me he fijado que después del
Código: [Seleccionar]
scanf("%i", op);

Me habia dejado el "&" delante de "op"

Pero solo me salta a la etiqueta 3, que es la primea que pongo...
Título: Re:Problema al llamar a etiquetas
Publicado por: uchihacrawler en Enero 03, 2015, 06:29:59 pm
Buenas,

Como comentaba, soy bastante nuevo, y cuando digo bastante me refiero a que he empezado hace 3 días, de programación solo he tocado ensamblador en la uni.
He modificado los GOTO a IF e ELSE IF. Lo de llamar al sistema, he visto que es la forma de que la consola se quede en PAUSA y no me salga de la aplicación, o eso he entendido...
Ahora el programa me queda así:
Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main()
{
float resistencia1, resistencia2, resistencia3, resistencia4, equivalente, equivalente1;
int num;
printf(":::::::::::::::::::::::::::::::::::\n");
printf(":         CALCULAR LA             :\n");
printf(":    IMPEDANCIA EQUIVALENTE       :\n");
printf(":      CREADO POR CRAWLER         :\n");
printf(":::::::::::::::::::::::::::::::::::\n");
printf("Cuantas resistencias tienes en paralelo? \n");
scanf("%f", &num);
if (num == 2)
{
printf("Introduce el valor de las 2 resistencias: \n");
scanf("%f %f", &resistencia1, &resistencia2);
equivalente1 = ((1 / resistencia1) + (1 / resistencia2));
equivalente = (1 / equivalente1);
printf("La impedancia equivalente es: %f \n", equivalente);
system("PAUSE");
return 0;
}
else if (num == 3)
{
printf("Introduce el valor de las 3 resistencias: \n");
scanf("%f %f %f", &resistencia1, &resistencia2, &resistencia3);
if (resistencia1==0||resistencia2==0||resistencia3==0)
{
printf("Una resistencia no pued ser 0 \n");
system("PAUSE");
return 0;
}
equivalente1 = ((1 / resistencia1) + (1 / resistencia2) + (1 / resistencia3));
equivalente = (1 / equivalente1);
printf("La impedancia equivalente es: %f \n", equivalente);
system("PAUSE");
return 0;
}
else if (num == 4)
{
printf("Introduce el valor de las 4 resistencias: \n");
scanf("%f %f %f %f", &resistencia1, &resistencia2, &resistencia3, &resistencia4 );
if (resistencia1==0||resistencia2==0||resistencia3==0||resistencia4==0)
{
printf("Una resistencia no pued ser 0 \n");
system("PAUSE");
return 0;
}
equivalente1 = ((1 / resistencia1) + (1 / resistencia2) + (1 / resistencia3) + (1 / resistencia4));
equivalente = (1 / equivalente1);
printf("La impedancia equivalente es: %f \n", equivalente);
system("PAUSE");
return 0;
}
else
{
printf ( "No era ni 2, ni 3, ni 4\n" );
system("PAUSE");
return 0;
}
}

Pero aunque el numero que ponga sea 2, 3 o 4, me salta al último ELSE, y me da el mensaje de "No era ni 2, ni 3, ni 4\n" ...

Gracias por tu tiempo,

Saludos!
Título: Re:Problema al llamar a etiquetas
Publicado por: stakewinner00 en Enero 03, 2015, 06:43:56 pm
Si es un "int num" tienes que leer un int no un float, en el primer scanf canvia el %f por %d.

PD: Podrías usar un algoritmo que no estuviera limitado a 4, 5  o N número de resistencias y crear uno que sirviera para infinitas resistencias.
Título: Re:Problema al llamar a etiquetas
Publicado por: uchihacrawler en Enero 03, 2015, 06:58:56 pm
Buaa, es verdad, haciendo pruebas y cambiando las variables, de float a int, me había olvidado de canviar el %f por el %i, ahora me va perfecto.
A ver si consigo hacer lo que propones.
Gracias stakewinner00
Título: Re:Problema al llamar a etiquetas
Publicado por: ravenheart en Enero 09, 2015, 08:31:14 pm
A ver si consigo hacer lo que propones.

Sin usar goto ;-)