Tipos de triángulos en C

Iniciado por alex2424, 3 Mayo 2012, 21:30 PM

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

alex2424

Buenas, estoy empezando a darle caña a C como mi primer lenguage.

El problema es: (no me lo plantea nadie, estoy por libre)
A partir de 3 datos recibidos por el usuario (longitus de los lados de un triangulo) determinar que tipo de triangulo se forma.

El programa me funciona pero seguramente habré cometido barbaridades con los goto y tanto "if". Mi idea es conseguir un código eficiente y legible.

#include <stdio.h>

int main()
{
float a;
float b;
float c;

printf( "Introduce el primer lado: " );
scanf( "%f", &a );
printf( "Introduce el tercer lado: " );
scanf( "%f", &b );
printf( "Introduce el segundo lado: " );
scanf( "%f", &c );
printf( "Los lados valen %f, %f y %f \n", a, b, c);
if (a == b && b == c)
{
if (a==0){
 goto notr;
 }
printf("El triangulo es equilatero");
goto end;
notr:
printf("\nLos datos proporcionados no forman un triángulo");
goto end;
}
if (a>b && a>c){
if (a >= (b + c)) goto notr;
printf( "El primer lado dado, %f, es ", a);
if (b*b+c*c==a*a) printf("la hipotenusa, por lo \nque ls triangulo es rectángulo\n");
else if (b == c) printf ("el mayor, y los otros \nson iguales por lo que el triángulo es isóceles\n");
else printf ("el mayor, y el triángulo es escaleno\n");
}
else if (b>c && b>a){
if (b >= (a + c)) goto notr;
printf( "El segundo lado dado, %f, es ", b);
if (a*a+c*c==b*b) printf("la hipotenusa, por lo \nque el triangulo es rectángulo\n");
else if (a == c) printf ("el mayor, y los otros \nson iguales por lo que el triángulo es isóceles\n");
else printf ("el mayor, y el triángulo es escaleno\n");
}
else if (c>b && c>a){
if (c >= (b + a)) goto notr;
printf( "El tercer lado dado, %f, es ", c);
if (b*b+a*a==c*c) printf("la hipotenusa, por lo \nque el triangulo es rectángulo\n");
else if (b == a) printf ("el mayor, y los otros \nson iguales por lo que el triángulo es isóceles\n");
else printf ("el mayor, y el triángulo es escaleno\n");
}
end:
return 0;
}
¿Por qué has de firmar?

s00rk

Bueno viendo tu codigo yo pues lo dejaria asi:

Código (cpp) [Seleccionar]

#include <stdio.h>

int main()
{
float a;
float b;
float c;

printf( "Introduce el primer lado: " );
scanf( "%f", &a );
printf( "Introduce el tercer lado: " );
scanf( "%f", &b );
printf( "Introduce el segundo lado: " );
scanf( "%f", &c );
printf( "Los lados valen %f, %f y %f \n", a, b, c);

if(a == 0 || a >= (b + c) || b >= (a + c) || c >= (b + a))
{
printf("\nLos datos proporcionados no forman un triángulo");
}else if(a == b && b == c)
{
printf("El triangulo es equilatero");
}else if(a > b && a > c)
{
printf( "El primer lado dado, %f, es ", a);
if( (b*b+c*c) == (a*a) )
printf("la hipotenusa, por lo \nque ls triangulo es rectángulo\n");
else if (b == c)
printf ("el mayor, y los otros \nson iguales por lo que el triángulo es isóceles\n");
else
printf ("el mayor, y el triángulo es escaleno\n");
}else if( b > c && b > a)
{
printf( "El segundo lado dado, %f, es ", b);
if( (a*a+c*c) == (b*b) )
printf("la hipotenusa, por lo \nque el triangulo es rectángulo\n");
else if( a == c )
printf ("el mayor, y los otros \nson iguales por lo que el triángulo es isóceles\n");
else
printf ("el mayor, y el triángulo es escaleno\n");
}else if( c > b && c > a )
{
printf( "El tercer lado dado, %f, es ", c);
if ( (b*b+a*a) == (c*c) )
printf("la hipotenusa, por lo \nque el triangulo es rectángulo\n");
else if( b == a )
printf ("el mayor, y los otros \nson iguales por lo que el triángulo es isóceles\n");
else
printf ("el mayor, y el triángulo es escaleno\n");
}
return 0;
}

STANHMAL

Intenta no usar goto, son mala practica de programación.

$4!u2
Power Metal vs Reggaeton



Que es mi ordenador mi tesoro que todo el mundo ha de temer. Mi ley, el ratón y el módem. Mi única patria, la red

Slava_TZD

#3
Te complicas mucho para decir de que tipo de triángulo se trata. Intenta no usar GOTO, como te dicen arriba, es una mala práctica. ¿Querías un código legible, simple y funcional?

Código (C++) [Seleccionar]
#include<stdio.h>
int main()
{
 int ladoa=0,ladob=0,ladoc=0;  
 
 printf("\nIntroduce el lado 1: ");scanf("%i",&ladoa);
 printf("Introduce el lado 2: ");scanf("%i",&ladob);
 printf("Introduce el lado 3: ");scanf("%i",&ladoc);
 
 if(ladoa==ladob && ladob==ladoc) {
 printf("Equilatero\n"); }
 else if(ladoa==ladob && ladob!=ladoc || ladob==ladoc && ladoc!=ladoa || ladoc==ladoa && ladoa!=ladob) {
 printf("Isosceles\n"); }
 else{
 printf("Escaleno\n"); }
}


Código (bash) [Seleccionar]
[08:25] kyperf@Hagher:~$ ./trian

Introduce el lado 1: 20

Introduce el lado 2: 20

Introduce el lado 3: 20
Equilatero



The fact is, even if you were to stop bombing us, imprisoning us, torturing us, vilifying us, and usurping our lands, we would continue to hate you because our primary reason for hating you will not cease to exist until you embrace Islam.

alex2424

tengo que estudiar lo de las condiciones en if, las comprendo pero no me siento comodo con ellas.El codigo de s00rk es bueno pero en este ultimo, (Si no me equivoco) en:
else if(ladoa==ladob && ladob!=ladoc || ladob==ladoc && ladoc!=ladoa || ladoc==ladoa && ladoa!=ladob)
no es necesario el "&& ladox!=ladoy) porque de ser iguales el programa hubiese mostrado "equilatero" y saltado al final del if.

Otra cosa, lo del codigo en colores, ¿es una funcionalidad del foro o es externo?
¿Por qué has de firmar?

Ferno

Cita de: alex2424 en  4 Mayo 2012, 18:36 PM
Otra cosa, lo del codigo en colores, ¿es una funcionalidad del foro o es externo?

Al escribir una respuesta, selecciona el código y en la opción que dice "GeSHi" arriba a la derecha de este cuadro de texto (donde están las opciones para darle formato) elige el lenguaje correcto.