Ayuda con pequeño código en C

Hola de nuevo. Tengo una duda con este código:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
    /* declaración de variables */
     float lado;
     float lado2;
     float lado3;
     float area;
     float s;
    /* Cabecera */
     printf("**********************************************\n");
     printf("***** CALCULADOR DE AREAS DE TRIANGULO *******\n");
     printf("**********************************************\n\n");
     /* Introducción de datos */
     INTRODUCCION_DATOS:
     printf("Introduce el valor de uno de los lados, al que llamaremos lado\n");
     scanf("%f", &lado);
     printf("Introduce el valor de otro de los dos lados, al que llamaremos lado2\n");
     scanf("%f", &lado2);
     printf("Introduce el valor del ultimo lado al que llamaremos lado3\n");
     scanf("%f", &lado3);
     if(lado+lado2<lado3 || lado+lado3<lado2 || lado2+lado3<lado){
                         printf("\n\nOK. Estos, son los datos que has introducido:\n Lado 1 = %f \n Lado 2 = %f\n Lado 3 = %f\n\n", lado, lado2, lado3);
                         /*OPERACIONES*/
                         s=(lado+lado2+lado3)/2;
                         area=sqrt(s*(s-lado)*(s-lado2)*(s-lado3));
                         printf("El area para de tu triangulo es\nAREA = %f\n\n", area);
                         }
                         else {
                              printf("\n\nNo se puede calcular el area.\n");
                              printf("La suma de dos de los lados no puede ser mayor que el lado mas grande\n\n");
                              goto INTRODUCCION_DATOS;
                              }
     system("PAUSE");
                              }


El ejercicio pide que hagamos un programita que calcule las areas de los triangulos. Yo he hecho el que veis arriba (basado en la formula de Herón), la historia es que a pesar de que creo que está bien no me da el resultado como debería de ser :S

¿Debo de usar "float" y "%f" para los números decimales, no? Lo he probado usando "int" y "%d", pero al ser enteros pues obviamente no me vale para cualquier calculo :S A ver si alguien puede ayudarme.

gracias

PD: Perdón si no está bien anidado, pero es que todavía no tengo mucha idea jeje
PD2: Foro de programación ya, por favor! XD

EDITO:

Quiero añadirle que después de calcular el primer area te de la opción de calcular una segunda area. Lo hago así:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
    /* declaración de variables */
     float lado;
     float lado2;
     float lado3;
     char otra_vez;
     float area;
     float s;
    /* Cabecera */
     printf("**********************************************\n");
     printf("***** CALCULADOR DE AREAS DE TRIANGULO *******\n");
     printf("**********************************************\n\n");
     /* Introducción de datos */
     INTRODUCCION_DATOS:
     printf("Introduce el valor de uno de los lados, al que llamaremos lado\n");
     scanf("%f", &lado);
     printf("Introduce el valor de otro de los dos lados, al que llamaremos lado2\n");
     scanf("%f", &lado2);
     printf("Introduce el valor del ultimo lado al que llamaremos lado3\n");
     scanf("%f", &lado3);
     if(lado+lado2<lado3 || lado+lado3<lado2 || lado2+lado3<lado){
                         printf("\n\nOK. Estos, son los datos que has introducido:\n Lado 1 = %f \n Lado 2 = %f\n Lado 3 = %f\n\n", lado, lado2, lado3);
                         /*OPERACIONES*/
                         s=(lado+lado2+lado3)/2;
                         area=sqrt(s*(s-lado)*(s-lado2)*(s-lado3));
                         printf("El area para de tu triangulo es\nAREA = %f\n\n", area);
                         printf("Quieres calcular otro area?(s/n)\n\n");
                         scanf("%c", &otra_vez);
                         if(otra_vez == s){
                                         goto INTRODUCCION_DATOS;
                                         }
                                         else{
                                              system("EXIT");
                                              }
                         }
                         else {
                              printf("\n\nNo se puede calcular el area.\n");
                              printf("La suma de dos de los lados no puede ser mayor que el lado mas grande\n\n");
                              goto INTRODUCCION_DATOS;
                              }
     system("PAUSE");
                              }


y aunque me sale el texto para pulsar s/n no me deja pulsar s u n, sinó que se salta el scanf :S 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í :S

gracias por la ayuda desde ya
Hola bspz,
primero de todo deberias de incializar las variables que usas, como el lado, lado2, etc...

Pienso que lo más sencillo sería pedirle al usuario sólo 2 datos, base y altura.

El área de un triángulo es (base * altura) / 2

Creo que así debería ser más fácil.

Salu2, y no te desanimes.
danitxu escribió:Hola bspz,
primero de todo deberias de incializar las variables que usas, como el lado, lado2, etc...

Pienso que lo más sencillo sería pedirle al usuario sólo 2 datos, base y altura.

El área de un triángulo es (base * altura) / 2

Creo que así debería ser más fácil.

Salu2, y no te desanimes.


Hola, gracias por la respuesta! Verás el problema es que hay que hacer el programa a partir de la introducción de los lados como datos, ya que sino también hubiera tirado por donde tú dices jeje (base*altura)/2

La formula de Herón es la siguiente, por si alguien no la sabe y le puede servir para revisar el código:

s= (lado1 + lado2 + lado3)/2

A= Raiz(s*(s-a)*(s-b)*(s-c))

Saludos!
(sqrt(s*(s-lado)*(s-lado2)*(s-lado3))

¿De donde sale está fórmula? :)
danitxu escribió:(sqrt(s*(s-lado)*(s-lado2)*(s-lado3))

¿De donde sale está fórmula? :)


contestamos a la vez... lo he puesto arriba [+risas]
Esto... calcular te lo tiene que calcular bien...

Creo que para el problema que dices habia que usar getchar(); despues del scanf. por lo menos exo me explicó mi profe :P

A lo mejor eres tu el que falla :P nu se.

Mira lo que hice yo. a lo mejor te ayuda:

#include
#include

int main()
{

float lado1,lado2,lado3,s,area;

printf("Introduce el lado 1: ");
scanf("%f",&lado1);

printf("Introduce el lado 2: ");
scanf("%f",&lado2);

printf("Introduce el lado 3: ");
scanf("%f",&lado3);

s=(lado1+lado2+lado3)/2;

area=sqrt(s*(s-lado1)*(s-lado2)*(s-lado3));

printf("El área del triángulo es: %g\n",area); /* El %g es para que no te salgan tantos decimales.
Por pura razón de estética */

}


EDITO: Grr... no me va! al parecer falla algo al calcular el semiperímetro!. Pero si eso es lo más facil del mundo!
¿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)
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] )

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?
Es fflush(stdin), pero NO es ANSI C (Sólo funciona en Windows porque así lo quiso Bill Gates).

es la librería estándar de C, así que está en todos lados.

Si tienes dudas sobre C te recomiendo ->> http://www.elrincondelc.com

Salu2 ;)
handyman escribió:Es fflush(stdin), pero NO es ANSI C (Sólo funciona en Windows porque así lo quiso Bill Gates).

No sólo eso, sino que incluso en windows, dependiendo del compilador, puede funcionar o no.
Pero no uses gotoooooo. Mete todo dentro de una estructura do...while que se repita mientras otra_vez sea igual a 's'.
Alberich escribió:Pero no uses gotoooooo. Mete todo dentro de una estructura do...while que se repita mientras otra_vez sea igual a 's'.


Un GOTO en mi facultad era un cerote y pa'septiembre XD
Te enseñan con goto!?????????????????????????????

Tenia un profesor en la politecnica de madrid que decía que la programación con goto es basura y de programadores pesimos.

como te enseñan eso?


P.D.: ewok, cerote cerote de los grandes, ni lo miraban.
Pues sí, lo del GOTO tendiras que cambiarlo por un "While"
:-)
Aracem escribió:Te enseñan con goto!?????????????????????????????

Tenia un profesor en la politecnica de madrid que decía que la programación con goto es basura y de programadores pesimos.

como te enseñan eso?


P.D.: ewok, cerote cerote de los grandes, ni lo miraban.

Doy fe de ello. Ibas al campus de vallecas? Que profesor era? Te lo digo porque yo hice informática de gestión ahí.

Saludos!
A la superior, en monteprincipe/boadilla del monte.

El profesor era el Burgos, un buen profesor aunque estaba mas para alla que para aca, y como todos, corrigiendo un cabron XD

Ahora estoy en la autonoma y siguen igual, pon un goto que casi te hechan de la uni XD
Ah, vale, yo es que hice la técnica!
Conozco a varios que se fueron para alla, es mas, tengo un amigo del curro, se llama Santi (alto y con el pelo un pco rubio) que está alli.
Uf, ni idea, no me suena, es que hace dos años que acabé (bueno, acabar acabar... desde entonces estoy con el tfc) y entré en el 2000
mi profe de C al año siguiente nos dió visual basic y el primer dia nos pregunta:

- ¿Quien sabe porque odio el Visual Basic?
...
...
...
Nadie responde...
- Porque hay que usar goto para el tratamiento de errores.
jonkoman escribió:Nadie responde...
- Porque hay que usar goto para el tratamiento de errores.

No jodas! Es la única manera de hacerlo? [snif]

Al menos eso no pasa con VB.NET.
OFFTOPIC: En mi uni damos Introducción a la programación (que ya aprobé [Ooooo]) estructura de datos y tal en PASCAL... me siento marginado entre tanto C [mad] es más, en fundamentos de redes usamos ADA ya que un año lo hicieron con C y todo era problemas por la libertad que te da para hacer barbaridades y que el compilador ni se cosque XD.

Es cosa rara por lo que parece cursar esas asignaturas en pascal y no en C no?
Pues yo también empecé con Pascal, vamos que C se daba en una optativa de 2º, pero sin embargo era obligatorio para muchas prácticas de 2º y 3º... una contradicción!

El lenguaje en el que empieces es lo de menos, lo importante es aprender a programar.

Saludos
juas escribió:Es cosa rara por lo que parece cursar esas asignaturas en pascal y no en C no?


Yo mi primera asignatura de programación de la carrera la cursé con Pascal. Para aprender los conceptos de la programación es lo mejor que hay, ayuda mucho el hecho de que sea tan simple y tan verbose (no me sale ahora la palabra en castellano [ayay]).

Por algo se diseño desde un principio como un lenguaje didáctico ;)
yo es q de C ya no me acuerdo de casi nada de estas pijaditas.....

donde este un buen c# o java....

y para aprender q mitico el turboPascal con su ventanita de color azul
Alberich escribió:Pero no uses gotoooooo. Mete todo dentro de una estructura do...while que se repita mientras otra_vez sea igual a 's'.


La verdad es que si que nos dijeron que no usaramos goto, pero acostumbrado de los bats y chorradas... se me pasó XD

Gracias por el aviso!

#include <stdio.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 */
     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);
     do{
        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);
                                    }
                                    else {
                                    printf("\n\nNo se puede calcular el area.\n");
                                    printf("La suma de catetos no puede ser mayor que la hipotenusa\n\n");
                                    printf("Quieres calcular otro area?(s/n) ");
                                    scanf("\n\n%c",&otra_vez);
                                    }
        }while(otra_vez == 's');
}



Gracias de nuevo :-P
Vale, pero el do no va ahí, así te repetirá el resultado una y otra vez, pero no te volverá a preguntar los lados. XD

Ponlo debajo de /* Introducción de datos */
zheo escribió:¿Comprobais que dada esa longitud de lados se puede formar un triángulo?


Una pequeña aclaracion. Con 3 rectas de longitud cualquiera siempre se puede formar un tirangulo, por lo que no es necesario comprobar si con esas longitudes introducidas se puede formar un triangulo, ya que siempre habra uno. Otra cosa es si te pidiesen un triangulo especifico, como equilatero, rectangulo o isosceles.
s4ur0n escribió:
Una pequeña aclaracion. Con 3 rectas de longitud cualquiera siempre se puede formar un tirangulo, por lo que no es necesario comprobar si con esas longitudes introducidas se puede formar un triangulo, ya que siempre habra uno. Otra cosa es si te pidiesen un triangulo especifico, como equilatero, rectangulo o isosceles.

Cierto, estaba pensando en triángulos rectángulos. -1 para mí :P
s4ur0n escribió:Una pequeña aclaracion. Con 3 rectas de longitud cualquiera siempre se puede formar un tirangulo, por lo que no es necesario comprobar si con esas longitudes introducidas se puede formar un triangulo, ya que siempre habra uno. Otra cosa es si te pidiesen un triangulo especifico, como equilatero, rectangulo o isosceles.


Si uno de los segmentos es más corto que la suma de los otros dos no se puede formar un triángulo, simplemente porque los extremos no llegan a unirse.
Alberich escribió:

Si uno de los segmentos es más corto que la suma de los otros dos no se puede formar un triángulo, simplemente porque los extremos no llegan a unirse.


Cierto, un owned para mi persona xD. Por cierto, es justamente al contrario de como lo dices. Si la suma de los dos mas pequeños es menor o igual que la longitud del segmento mayor no se formara un triangulo.
s4ur0n escribió:Por cierto, es justamente al contrario de como lo dices. Si la suma de los dos mas pequeños es menor o igual que la longitud del segmento mayor no se formara un triangulo.


LOL

Al rico owned

XD
Alberich escribió:

LOL

Al rico owned

XD


Esto va por etapas, primero fue un falso owned para zheo (al final tenia razon), luego vino el mio y ya terminamos con el tuyo, para al final llegar a la conclusion de que zheo tenia razon y se deberia de comprobar la formacion de un triangulo xD.
s4ur0n escribió: zheo tenia razon

Pues si la tenía fue de rebote por que cuando me lo dijiste lo pensé y concluí que tenías toda razón, así que owned también para mi [Ooooo]
mira que lo dije antes... xD

Por cierto Alberich, gracias por decirme ese error, la verdad es que se me pasó, estaba confiado ya :Ð

#include <stdio.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 */
          do{
     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);
                                    }
                                    else {
                                    printf("\n\nNo se puede calcular el area.\n");
                                    printf("La suma de catetos no puede ser mayor que la hipotenusa\n\n");
                                    printf("Quieres calcular otro area?(s/n) ");
                                    scanf("\n\n%c\n\n",&otra_vez);
                                    }
        }while(otra_vez == 's');
}


Estoy ahora liado con otros programilla sencillo de estos que te saque un menu con dos opciones 1- hacer el seno de un numero (con la funcion sin(); de la librería math.h) y 2- Hacer la serie de Taylor del sin sin la librería math.h (este punto me tiene loco ya XD).

Aun es prematuro pegaros el código y puede tener varios errores, así que de momento no lo pegaré XD Por cierto, os agradecería que de momento no pegarais codigo al respecto que se me van los ojos jaja

gracias por la ayuda :-D
34 respuestas