zheo escribió:¿Comprobais que dada esa longitud de lados se puede formar un triángulo?
Por otro lado, para lo de la introducción de datos tienes que cambiar las líneas 32 y 33:
scanf(" %c", &otra_vez);
if(otra_vez == 's'){
Delante del %c hay ahora un espacio. El fallo que tenías es porque el caracter retorno de carro (el enter) se queda en el buffer, y cuando haces un scanf, lo recoge.
Por otro lado tienes que poner el caracter entre comillas, para indicar que es un literal.
El fallo viene porque cuando el semiperímetro es más pequeño que uno o que los tres lados, éste sale negativo, y la raíz de un negativo no es un número real.
Por otro lado hay un error en el programa de bpsc. Al meter los lados 4,5,6.4 da un error, cuando es un triángulo rectángulo válido:
4^2 + 5^2 = 6.4^2
Esos mismos datos en el programa de Moki_X dan como resultado del área 9.99999, que es correcto (debería ser 10, pero hay que contar con los errores de redondeo)
Tienes toda la razón en los fallos. Ya lo he corregido. Se ve que el scanf coje el carro y por eso no funcionaba bien.
Respecto a lo que dices del error, es porque he introducido un parametro para que no se haga la operación para triangulos que la suma de sus dos catetos sea más pequeña que la hipotenusa (que hasta donde yo se se debe de cumplir esto para poder formar un triangulo).
if(lado+lado2<lado3 || lado+lado3<lado2 || lado2+lado3<lado){
[...]
}
De todos modos mirando esto he visto algunos errores y he rehecho el código, jeje. Ahí va el resultado, creo que ahora si que funciona bien:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
/* declaración de variables */
float hipotenusa,cateto1,cateto2,area,s;
char otra_vez;
/* Cabecera */
printf("*CALCULADOR DE AREAS DE TRIANGULO*\n\n\n");
/* Introducción de datos */
INTRODUCCION_DATOS:
printf("Introduce el valor de la hipotenusa: ");
scanf("%f",&hipotenusa);
printf("Introduce el valor del cateto 1: ");
scanf("%f",&cateto1);
printf("Introduce el valor del cateto 2: ");
scanf("%f",&cateto2);
if(cateto1+cateto2>hipotenusa){
printf("\n\nEstos, son los datos que has introducido:\n Hipotenusa = %f \n Cateto 1 = %f\n Cateto 2 = %f\n\n", hipotenusa, cateto1, cateto2);
/*OPERACIONES*/
s=(hipotenusa+cateto1+cateto2)/2;
area=sqrt(s*(s-hipotenusa)*(s-cateto1)*(s-cateto2));
printf("El area para de tu triangulo es\nAREA = %g\n\n",area);
printf("Quieres calcular otro area?(s/n) ");
scanf("\n\n%c",&otra_vez);
/*CALCULAR OTRO AREA*/
if(otra_vez == 's'){
goto INTRODUCCION_DATOS;
}
else{
system("EXIT");
}
}
else {
printf("\n\nNo se puede calcular el area.\n");
printf("La suma de catetos no puede ser mayor que la hipotenusa\n\n");
goto INTRODUCCION_DATOS;
}
system("PAUSE");
}
Devuelve un error con números grandes, pero supongo que es porque ocupa más espacio de la memoria asignada o algo por el estilo :S
Moki_X, gracias por tú código también. Así he podido comparar y ver que basicamente era el mismo código (además de hacer algun tipo de mejora jeje), lo que me fallaba era el if ese mal puesto y alguna de las correcciones que me dijo zheo.
Ya teneis programa para calcular areas de triangulos (o eso creo jeje
![burla2 [burla2]](/images/smilies/nuevos/burla_ani1.gif)
)
A ver si alguien sabe esto:
En clase han dicho algo de "fflush(sdio);" para borrar el buffer y que funcione de nuevo el scanf (según parece es un problema del compilador), pero lo he probado poniendolo delante del scanf y na, me da error al compilar, lo que ni idea de si es así, hay que incluir alguna libreria, o no se... :S
Por cierto, aunque no venga al caso, la librería
solo está disponible para windows, ¿no?