Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: STANHMAL en 7 Julio 2010, 04:45 am



Título: [C] Teorema de Pitágoras
Publicado por: STANHMAL en 7 Julio 2010, 04:45 am
Holas

Esta aburrido así que decidí hacer esta pequeña aplicación, supongo que no tocara explicarla puesto que todo el mundo la conoce  :xD

Código
  1. /************************************
  2.  * Solución al Teorema de Pitágoras *
  3.  ************************************
  4.  *       Creado por STANHMAL        *
  5.  ************************************/
  6.  
  7. #include <stdio.h>
  8. #include <math.h>
  9. #include <stdlib.h>
  10.  
  11. enum stan {continua};
  12.  
  13. int main()
  14. {
  15. int x;
  16. double c, c2, C, C2, h, h2;
  17. enum stan hmal;
  18.  
  19. printf("\n **************************************\n");
  20. printf(" *  Solución al Teorema de Pitágoras  *\n");
  21. printf(" **************************************\n\n");
  22. hmal = continua;
  23. while (hmal == continua) {
  24. printf("\n1. Para hallar un cateto.\n");
  25. printf("2. Para hallar la hipotenusa.\n3. Para salir.\n");
  26. printf("Opción escogida: ");
  27. scanf("%d", &x);
  28.  
  29. if (x == 1) {
  30. printf("Introduzca el valor de un cateto: ");
  31. scanf("%lf", &c);
  32. printf("Introduzca el valor de la hipotenusa: ");
  33. scanf("%lf", &h);
  34. c2 = c * c;
  35. h2 = h * h;
  36. C = sqrt(h2 - c2);
  37. printf("El cateto tiene un valor de: %f\n", C);
  38. printf("\nDesea continuar o salir.\n1. continuar 2. salir ");
  39. scanf("%d", &x);
  40. if (x == 1){
  41. hmal = continua;
  42. }
  43. else if (x == 2) {
  44. exit(0);
  45. }
  46. }
  47. else if (x == 2) {
  48. printf("Introduzca el valor del cateto opuesto: ");
  49. scanf("%lf", &c);
  50. printf("Introduzca el valor del cateto adyacente: ");
  51. scanf("%lf", &C);
  52. c2 = c * c;
  53. C2 = C * C;
  54. h = sqrt(C2 + c2);
  55. printf("El valor de la hipotenusa es: %f\n", h);
  56. printf("\nDesea continuar o salir.\n1. continuar 2. salir ");
  57. scanf("%d", &x);
  58. if (x == 1){
  59. hmal = continua;
  60. }
  61. else if (x == 2) {
  62. exit(0);
  63. }
  64. }
  65. else if (x == 3) {
  66. exit(0);
  67. }
  68. else {
  69. printf("Error, opción no definida.\n");
  70. }
  71. }
  72. return 0;
  73. }
  74.  

Se que se puede acortar el code, pero bueno, es mientras aprendo bien C
espero criticas constructivas ^^

$4!u2


Título: Re: [C] Teorema de Pitágoras
Publicado por: .:BlackCoder:. en 7 Julio 2010, 04:51 am
"Se que se puede acortar el code"
+1
Acortalo lo mas que puedas y ahi si te hago alguna critica... Saludos...


Título: Re: [C] Teorema de Pitágoras
Publicado por: STANHMAL en 7 Julio 2010, 04:55 am
...

Ya ando pensó como acortarlo bastante, haber como me va.

$4!u2


Título: Re: [C] Teorema de Pitágoras
Publicado por: leogtz en 7 Julio 2010, 07:00 am
Tal vez debieras limpiar el buffer de entrada.
Usar fflush(stdout).
Y no hace falta que uses exit(0), con el return 0 bastaba.


Título: Re: [C] Teorema de Pitágoras
Publicado por: Ari Slash en 7 Julio 2010, 07:47 am
el buffer de entrada es fflush(stdin) xD


Título: Re: [C] Teorema de Pitágoras
Publicado por: leogtz en 7 Julio 2010, 07:51 am
el buffer de entrada es fflush(stdin) xD

Sin comentarios.  :-\


Título: Re: [C] Teorema de Pitágoras
Publicado por: do-while en 7 Julio 2010, 08:15 am
Leo, el bufer de entrada es stdin. El de salida es stdout.

fflush solo se puede utilizar con bufers de salida, para obligar a que se vacien, por ejemplo cuando hay un bufer asociado a un fichero de salida, y se quiere escribir la informacion del bufer en el fichero antes de que este completo...

fflush(stdin), funciona solo bajo windows. Al aplicar fflush a cualquier flujo que no sea de salida, el comportamiento queda indefinido.

Revisa este post (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html) de Littlehorse.

¡Saludos!


Título: Re: [C] Teorema de Pitágoras
Publicado por: leogtz en 7 Julio 2010, 08:46 am
Leo, el bufer de entrada es stdin. El de salida es stdout.

fflush solo se puede utilizar con bufers de salida, para obligar a que se vacien, por ejemplo cuando hay un bufer asociado a un fichero de salida, y se quiere escribir la informacion del bufer en el fichero antes de que este completo...

fflush(stdin), funciona solo bajo windows. Al aplicar fflush a cualquier flujo que no sea de salida, el comportamiento queda indefinido.

Revisa este post (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html) de Littlehorse.

¡Saludos!
Tal vez debieras limpiar el buffer de entrada.
Usar fflush(stdout).
Y no hace falta que uses exit(0), con el return 0 bastaba.

Lo de "Usar fflush(stdout)" no tiene nada que ver con la primera línea, es por eso que está en una segunda línea. Yo sé que el buffer de entrada es stdin y sé también que fflush() con un buffer de entrada da como resultado un comporamiento indefinido en algunos compiladores.

La segunda recomendación no tiene nada que ver con la primera.


Título: Re: [C] Teorema de Pitágoras
Publicado por: globsharp en 7 Julio 2010, 13:19 pm
Estaría interesante aligerar el main repartiendo la funcionalidad entre diferentes procedimientos, normalmente el main solo debería encargarse de invocar a dichos procedimientos :)



Título: Re: [C] Teorema de Pitágoras
Publicado por: STANHMAL en 7 Julio 2010, 15:32 pm
ya acorte un poco el código, a ver que tal me quedo.

Y no hace falta que uses exit(0), con el return 0 bastaba.

te refieres a reemplazar el exit por el return?
porque si es así, lo probé y no sirvió.

y con respecto al flash fflush, bueno, no lo entiendo muy bien.

$4!u2


Título: Re: [C] Teorema de Pitágoras
Publicado por: leogtz en 7 Julio 2010, 19:16 pm

Y no hace falta que uses exit(0), con el return 0 bastaba.

te refieres a reemplazar el exit por el return?
porque si es así, lo probé y no sirvió.


Debería de servir, mira:

Código:
leo@lein:~/Escritorio/c_proyect$ cat code.c | indent
/************************************
* Solución al Teorema de Pitágoras *
************************************
*       Creado por STANHMAL        *
************************************/

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

enum stan
{ continua };

int
main ()
{
  int x;
  double c, c2, C, C2, h, h2;
  enum stan hmal;

  printf ("\n **************************************\n");
  printf (" *  Solución al Teorema de Pitágoras  *\n");
  printf (" **************************************\n\n");
  hmal = continua;
  while (hmal == continua)
    {
      printf ("\n1. Para hallar un cateto.\n");
      printf ("2. Para hallar la hipotenusa.\n3. Para salir.\n");
      printf ("Opción escogida: ");
      scanf ("%d", &x);

      if (x == 1)
        {
          printf ("Introduzca el valor de un cateto: ");
          scanf ("%lf", &c);
          printf ("Introduzca el valor de la hipotenusa: ");
          scanf ("%lf", &h);
          c2 = c * c;
  h2 = h * h;
  C = sqrt (h2 - c2);
  printf ("El cateto tiene un valor de: %f\n", C);
  printf ("\nDesea continuar o salir.\n1. continuar 2. salir ");
  scanf ("%d", &x);
  if (x == 1)
    {
      hmal = continua;
    }
  else if (x == 2)
    {
      exit (0);
    }
}
      else if (x == 2)
{
  printf ("Introduzca el valor del cateto opuesto: ");
  scanf ("%lf", &c);
  printf ("Introduzca el valor del cateto adyacente: ");
  scanf ("%lf", &C);
  c2 = c * c;
  C2 = C * C;
  h = sqrt (C2 + c2);
  printf ("El valor de la hipotenusa es: %f\n", h);
  printf ("\nDesea continuar o salir.\n1. continuar 2. salir ");
  scanf ("%d", &x);
  if (x == 1)
    {
      hmal = continua;
    }
  else if (x == 2)
    {
      exit (0);
    }
}
      else if (x == 3)
{
  return 0;
}
      else
{
  printf ("Error, opción no definida.\n");
}
    }
  return 0;
}
leo@lein:~/Escritorio/c_proyect$

Compilar, ejecutar y checar el estado de error:
Código:
leo@lein:~/Escritorio/c_proyect$ gcc code.c -o code -lm
leo@lein:~/Escritorio/c_proyect$
leo@lein:~/Escritorio/c_proyect$ ./code ; echo -e "Error : $?"

 **************************************
 *  Solución al Teorema de Pitágoras  *
 **************************************


1. Para hallar un cateto.
2. Para hallar la hipotenusa.
3. Para salir.
Opción escogida: 3
Error : 0
leo@lein:~/Escritorio/c_proyect$
El return hace su trabajo.


Título: Re: [C] Teorema de Pitágoras
Publicado por: STANHMAL en 7 Julio 2010, 19:25 pm
:S si tienes razón.

ya se que paso, es que también había reemplazado los otros exits  :xD

Gracias Leo.  ;D


Título: Re: [C] Teorema de Pitágoras
Publicado por: .:BlackCoder:. en 7 Julio 2010, 19:28 pm
Yo lo hice asi... Se puede recortar un poco mas pero pes ya va a empezar el juego...

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6. int main()
  7. {
  8. int x=1;
  9. double c, C, h;
  10.  
  11. printf("\n **************************************\n");
  12. printf(" *  Solución al Teorema de Pitágoras  *\n");
  13. printf(" **************************************\n\n");
  14. while (x == 1) {
  15. printf("\n1. Para hallar un cateto.\n");
  16. printf("2. Para hallar la hipotenusa.\n3. Para salir.\n");
  17. printf("Opción escogida: ");
  18. scanf("%d", &x);
  19.  
  20. if (x == 1) {
  21. printf("Introduzca el valor de un cateto: ");
  22. scanf("%lf", &c);
  23. printf("Introduzca el valor de la hipotenusa: ");
  24. scanf("%lf", &h);
  25. if (c<h){
  26. C = sqrt(h*h - c*c);
  27. printf("El cateto tiene un valor de: %f\n", C);
  28. printf("\nDesea continuar o salir.\n1. continuar 2. salir ");
  29. scanf("%d", &x);}
  30. else {printf("Error matematico"); x=3;}
  31. }
  32. else if (x == 2) {
  33. printf("Introduzca el valor del cateto opuesto: ");
  34. scanf("%lf", &c);
  35. printf("Introduzca el valor del cateto adyacente: ");
  36. scanf("%lf", &C);
  37. h = sqrt(C*C + c*c);
  38. printf("El valor de la hipotenusa es: %f\n", h);
  39. printf("\nDesea continuar o salir.\n1. continuar 2. salir ");
  40. scanf("%d", &x);
  41. }
  42. else if (x>3 || x<1)
  43. printf("Error, opción no definida.\n");
  44. else printf ("Saliendo\n\n");
  45. }
  46. getchar();/*Tengo que ver cual es el pedo con el buffer aqui*/
  47. return 0;
  48. }

Saludos...

PD: No le hice la tarea el de el ya servia  :xD


Título: Re: [C] Teorema de Pitágoras
Publicado por: STANHMAL en 7 Julio 2010, 19:39 pm
2 cosas

la primera:

Código
  1. else if (x>3 || x<1)
  2. printf("Error, opción no definida.\n");
  3. else printf ("Saliendo\n\n");
  4.  

que no le hace falta: {} ?

Código
  1. else if (x>3 || x<1) {
  2. printf("Error, opción no definida.\n");
  3.                            }
  4. else {
  5.                                    printf ("Saliendo\n\n");
  6.                            }
  7.  

la segunda:

PD: No le hice la tarea el de el ya servia  :xD

No es tarea  :rolleyes:


Título: Re: [C] Teorema de Pitágoras
Publicado por: leogtz en 7 Julio 2010, 20:14 pm
2 cosas

la primera:

Código
  1. else if (x>3 || x<1)
  2. printf("Error, opción no definida.\n");
  3. else printf ("Saliendo\n\n");
  4.  

que no le hace falta: {} ?

Código
  1. else if (x>3 || x<1) {
  2. printf("Error, opción no definida.\n");
  3.                            }
  4. else {
  5.                                    printf ("Saliendo\n\n");
  6.                            }
  7.  

la segunda:

PD: No le hice la tarea el de el ya servia  :xD

No es tarea  :rolleyes:

Cuando es una única línea puedes omitir las llaves {}


Título: Re: [C] Teorema de Pitágoras
Publicado por: STANHMAL en 7 Julio 2010, 20:16 pm
...

Cada día se aprende algo nuevo.


Título: Re: [C] Teorema de Pitágoras
Publicado por: .:BlackCoder:. en 8 Julio 2010, 00:17 am
 :¬¬ Aprende a decir gracias... Te ayude a "recortar" y te "critique" el code, se puede decir q le hice algunas mejoras siguiendo TU code...  :¬¬


Título: Re: [C] Teorema de Pitágoras
Publicado por: [L]ord [R]NA en 8 Julio 2010, 01:14 am
Esta bueno el code para haberlo hecho para matar el aburrimiento, yo deberia de seguir tu ejemplo y dejar de Facebookear cuando me encuentro aburrido.

:¬¬ Aprende a decir gracias... Te ayude a "recortar" y te "critique" el code, se puede decir q le hice algunas mejoras siguiendo TU code...  :¬¬

:¬¬ no tiene porque decir gracias porque no te pidio que lo hicieras...



Título: Re: [C] Teorema de Pitágoras
Publicado por: .:BlackCoder:. en 8 Julio 2010, 01:23 am
El pidio criticas contructivas... Lo cual hice pero con el code ya arreglado (para mi es mejor el code que decirle lo q se podria hacer) pero ya q coño  :-\

Saludos...

PD: Cuando te hacen un favor sin pedirlo no agradeces?



Título: Re: [C] Teorema de Pitágoras
Publicado por: [L]ord [R]NA en 8 Julio 2010, 01:24 am
El pidio criticas contructivas... Lo cual hice pero con el code ya arreglado (para mi es mejor el code que decirle lo q se podria hacer) pero ya q coño  :-\

Saludos...

PD: Cuando te hacen un favor sin pedirlo no agradeces?



Nop, quien hace un favor sin que se lo pidan no lo hace para esperar un agradecimiento.


Título: Re: [C] Teorema de Pitágoras
Publicado por: .:BlackCoder:. en 8 Julio 2010, 01:59 am
Eso si es verdad  :xD... Pero yo si espero al menos las gracias jeje... Mejor no las espero mas

Saludos...


Título: Re: [C] Teorema de Pitágoras
Publicado por: STANHMAL en 8 Julio 2010, 02:24 am
 :xD

...

Te voy a decir la verdad, cuando hice el post de las llaves {} (el siguiente citado.)

...

esperaba que respondieras tu, y resulto respondiendo Leo, y se me pazo darte la gracias, ahora te las doy ^^

Gracias man, tu code me sirvió de mucho, me refiero a manera de aprendizaje no de tarea xD.

PD: odio facebook

$4!u2


Título: Re: [C] Teorema de Pitágoras
Publicado por: .:BlackCoder:. en 8 Julio 2010, 02:35 am
A la orden  :D
PD: odio facebook

+1