Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Caster en 20 Octubre 2012, 18:44 pm



Título: Calculadora hecha en C
Publicado por: Caster en 20 Octubre 2012, 18:44 pm
Pues acabo de terminar esta calculadora y queria vuestra opinion, algunas cosas mas que le pueda implementar,si encontrais algun fallo, etc

Aqui os dejo el codigo:

main.c
Código
  1. #include <stdio.h>
  2. #include "funciones.h"
  3.  
  4. int main() {
  5.  
  6. int op;
  7.  
  8. do {
  9.  
  10. imprimir_menu();
  11.  
  12.  
  13. scanf("%d", &op);
  14. while (getchar() != '\n')
  15. ;
  16. system("cls");
  17. switch (op) {
  18.  
  19. case 1:
  20. sumar();
  21. break;
  22.  
  23. case 2:
  24. restar();
  25. break;
  26.  
  27. case 3:
  28. multiplicar();
  29. break;
  30.  
  31. case 4:
  32. dividir();
  33. break;
  34.  
  35. case 5:
  36. potencia();
  37. break;
  38.  
  39. case 6:
  40. raiz_cuadrada();
  41. break;
  42.  
  43. case 7:
  44. seno();
  45. break;
  46.  
  47. case 8:
  48. coseno();
  49. break;
  50.  
  51. case 9:
  52. tangente();
  53. break;
  54.  
  55. case 10:
  56. break;
  57.  
  58. default:
  59. printf("Ha elejido una opcion incorrecta\n");
  60. break;
  61. }//fin del switch
  62.  
  63. }while (op != 10);
  64.  
  65. return 0;
  66. }

funciones.h
Código
  1. #include <math.h> //para potencia y raiz cuadrada
  2.  
  3. void imprimir_menu(void) {
  4. system("cls"); //limpia la pantalla al volverse a ejecutar el do-while del archivo main.c
  5. printf("Elija una opcion:\n\n");
  6. printf("*********************************\n");
  7. printf("*\t [1] Sumar\t\t*\n");
  8. printf("*\t [2] Restar\t\t*\n");
  9. printf("*\t [3] Multiplicar\t*\n");
  10. printf("*\t [4] Dividir\t\t*\n");
  11. printf("*\t [5] Potencia\t\t*\n");
  12. printf("*\t [6] Raiz cuadrada\t*\n");
  13. printf("*\t [7] Seno\t\t*\n");
  14. printf("*\t [8] Coseno\t\t*\n");
  15. printf("*\t [9] Tangente\t\t*\n");
  16. printf("*\t [10] Salir\t\t*\n");
  17. printf("*********************************\n\n");
  18. return;
  19. }
  20.  
  21.  
  22.  
  23. void sumar(void) {
  24. double num1, num2;
  25. printf("\nIntroduzca los dos numeros a sumar: \n");
  26. scanf("%lf %lf", &num1, &num2);
  27. while (getchar() != '\n')
  28. ;
  29. printf("\n%lf", num1 + num2);
  30. return;
  31.  
  32.  
  33. }
  34.  
  35. void restar(void) {
  36. double num1, num2;
  37. printf("\nIntroduzca los dos numeros a restar: \n");
  38. scanf("%lf %lf", &num1, &num2);
  39. while (getchar() != '\n')
  40. ;
  41. printf("\n%lf", num1 - num2);
  42. return;
  43.  
  44.  
  45. }
  46.  
  47. void multiplicar(void) {
  48. double num1, num2;
  49. printf("\nIntroduzca los dos numeros a multiplicar: \n");
  50. scanf("%lf %lf", &num1, &num2);
  51. while (getchar() != '\n')
  52. ;
  53. printf("\n%lf", num1 * num2);
  54. return;
  55.  
  56.  
  57. }
  58.  
  59. void dividir(void) {
  60. double num1, num2;
  61. printf("\nIntroduzca los dos numeros a dividir: \n");
  62. scanf("%lf %lf", &num1, &num2);
  63. while (getchar() != '\n')
  64. ;
  65. printf("\n%lf", num1 / num2);
  66. return;
  67.  
  68.  
  69. }
  70.  
  71. void potencia(void) {
  72. double num1, num2;
  73. printf("\nIntroduzca la base: \n");
  74. scanf("%lf", &num1);
  75. while (getchar() != '\n')
  76. ;
  77. printf("Introduzca el exponente: \n");
  78. scanf("%lf", &num2);
  79. while (getchar() != '\n')
  80. ;
  81. printf("\n%lf", pow(num1, num2));
  82. return;
  83.  
  84.  
  85. }
  86.  
  87. void raiz_cuadrada(void) {
  88. double num1;
  89. printf("\nIntroduzca el numero: \n");
  90. scanf("%lf", &num1);
  91. while (getchar() != '\n')
  92. ;
  93. printf("La raiz cuadrada es: %lf \n", sqrt(num1));
  94.  
  95. return;
  96.  
  97.  
  98. }
  99.  
  100. void seno(void) {
  101. double num1;
  102. printf("\nIntroduzca el numero: \n");
  103. scanf("%lf", &num1);
  104. while (getchar() != '\n')
  105. ;
  106. printf("El seno es: %lf \n", sin(num1));
  107.  
  108. return;
  109.  
  110.  
  111. }
  112.  
  113. void coseno(void) {
  114. double num1;
  115. printf("\nIntroduzca el numero: \n");
  116. scanf("%lf", &num1);
  117. while (getchar() != '\n')
  118. ;
  119. printf("El coseno es: %lf \n", cos(num1));
  120.  
  121. return;
  122.  
  123.  
  124. }
  125.  
  126. void tangente(void) {
  127. double num1;
  128. printf("\nIntroduzca el numero: \n");
  129. scanf("%lf", &num1);
  130. while (getchar() != '\n')
  131. ;
  132. printf("La tangente es: %lf \n", tan(num1));
  133.  
  134. return;
  135.  
  136.  
  137. }


Título: Re: Calculadora hecha en C
Publicado por: barnix456 en 6 Noviembre 2012, 21:53 pm
hola Caster, muy bueno el tema, yo estoy empezando en C, precisamente en funciones, tengo una duda, perdona si es algo tonta, yo programo en linux, uso C::B quiero ejecuatar tu codigo, pero mi duda, es por que pones un archivo main.c y de funciones.h, como hago para juntarlo, el funciones.h se debe poner en algun lado especifico para que se ha llamado desde el main, o o todo se pone dentro de un mismo archivo, espero entiendas mi duda...! y de nuevo muy bueno  ;D


Título: Re: Calculadora hecha en C
Publicado por: Stakewinner00 en 6 Noviembre 2012, 21:59 pm
Una pregunta, que ventaja representa declarar las funcione mediante un include respecto a ponerlas directamente al código main?

SI el código es corto creo que es más molesto ir cambiando de archivo que ir a buscar la función.


Título: Re: Calculadora hecha en C
Publicado por: barnix456 en 6 Noviembre 2012, 22:05 pm
Citar
Una pregunta, que ventaja representa declarar las funcione mediante un include respecto a ponerlas directamente al código main?

creo que esa era mi pregunta y no la supe hacer, por que no declararlas, llamarlas y que esten dentro del mismo main


Título: Re: Calculadora hecha en C
Publicado por: Stakewinner00 en 6 Noviembre 2012, 22:30 pm
creo que esa era mi pregunta y no la supe hacer, por que no declararlas, llamarlas y que esten dentro del mismo main

No fue eso, es que no ley el comentario, me surgio la duda y no pare a leer los comentarios  :D


Título: Re: Calculadora hecha en C
Publicado por: barnix456 en 6 Noviembre 2012, 23:57 pm
si de echo, lo estoy uniendo en un solo main, lo terminare de unir en solo main y vere que tal funciona, aver si lo publico, en la noche...  :D


Título: Re: Calculadora hecha en C
Publicado por: BatchianoISpyxolo en 7 Noviembre 2012, 00:16 am
Hay diversos motivos por los que se usan los headers de C o los módulos en general.

Una de las ideas es facilitar la lectura del código, optimizar la depuración del código y hacer más portable el código.

Imaginad que tenéis todas las librerías que uséis escritas en un mismo archivo o_O. Lo que hacéis es incluirlas y así quedan representadas por la directiva #include en vuestro código (el preprocesador luego incluirá el código de esas librerías en el archivo donde se incluyan).

Otra idea es la de encapsulación de código. Una parte interfaz (o pública) y otra parte implementación (o privada). De tal manera que el programador puede elegir qué información es visible para otros usuarios y cuál no.

Los archivos con extensión .h (headers o encabezados) contienen la información pública. Tipos de datos y encabezados de funciones para su posterior acceso. Y los archivos con extensión .c ( c files o archivos c ) contienen la parte privada o de implementación relacionanda con su encabezado.

Por ejemplo, imaginemos que implementamos un árbol binario y cada nodo guarda un entero. Posteriormente nosotros queremos un árbol binario que represente cadenas de caracteres. Pues tan solo yendo al header del árbol binario, podemos modificar ese tipo y todo el código nos servirá para represenar árboles binarios cuyos nodos representan cadenas de caracteres... De esa manera se incentiva la abstracción del código...

¡Saludos!


Título: Re: Calculadora hecha en C
Publicado por: barnix456 en 7 Noviembre 2012, 14:42 pm
Muchas gracias por la explicacion..!  ;D


Título: Re: Calculadora hecha en C
Publicado por: barnix456 en 7 Noviembre 2012, 15:16 pm
yo no se mucho, aun estoy aprendiendo a programar en C, y basado en tu codigo, que la verdad no supe que hacer con el .h y el .c, pues decidi unirlo en uno solo, le hice algunos cambios, pero nada significativo, pero igual se los dejo....

Código:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void sumar(void);
void restar(void);
void multiplicar(void);
void dividir(void);
void potencia(void);
void raiz_cuadrada(void);
void seno(void);
void coseno(void);
void tangente(void);
void main()
{
    int op;

    printf("\t\tElija una opcion:\n\n");
printf("\t*********************************\n");
printf("\t*\t [1] Sumar\t\t*\n");
printf("\t*\t [2] Restar\t\t*\n");
printf("\t*\t [3] Multiplicar\t*\n");
printf("\t*\t [4] Dividir\t\t*\n");
printf("\t*\t [5] Potencia\t\t*\n");
printf("\t*\t [6] Raiz cuadrada\t*\n");
printf("\t*\t [7] Seno\t\t*\n");
printf("\t*\t [8] Coseno\t\t*\n");
printf("\t*\t [9] Tangente\t\t*\n");
printf("\t*\t [10] Salir\t\t*\n");
printf("\t*********************************\n\n");
scanf("%d", &op);

switch (op) {

case 1:
sumar();
getchar();
break;

case 2:
restar();
getchar();
break;

case 3:
multiplicar();
getchar();
break;

case 4:
dividir();
getchar();
break;

case 5:
potencia();
getchar();
break;

case 6:
raiz_cuadrada();
getchar();
break;

case 7:
seno();
getchar();
break;

case 8:
coseno();
getchar();
break;

case 9:
tangente();
getchar();
break;

case 10:
break;

default:
            printf("Ha elejido una opcion incorrecta\n");
            break;
}
}

void sumar(void)
{
    float num1, num2;
printf("\nIntroduzca los dos numeros a sumar: \n");
scanf("%f %f", &num1, &num2);
    printf("\n%.2f", num1 + num2);
return;
}
void restar(void)
{
    float num1, num2;
printf("\nIntroduzca los dos numeros a restar: \n");
scanf("%f %f", &num1, &num2);
printf("\n%.2f", num1 - num2);
return;
}
void multiplicar(void)
{
    float num1, num2;
printf("\nIntroduzca los dos numeros a multiplicar: \n");
scanf("%f %f", &num1, &num2);
printf("\n%.2f", num1 * num2);
return;
}
void dividir(void)
{
    float num1, num2;
printf("\nIntroduzca los dos numeros a dividir: \n");
scanf("%f %f", &num1, &num2);
printf("\n%.2f", num1 / num2);
return;
}
void potencia(void)
{
    float num1, num2;
printf("\nIntroduzca la base: \n");
scanf("%f", &num1);
printf("Introduzca el exponente: \n");
scanf("%f", &num2);
printf("\n%.2f", pow(num1, num2));
return;
}
void raiz_cuadrada(void)
{
    float num1;
printf("\nIntroduzca el numero: \n");
scanf("%f", &num1);
printf("La raiz cuadrada es: %.2f \n", sqrt(num1));
return;
}
void seno(void)
{
    float num1;
printf("\nIntroduzca el numero: \n");
scanf("%f", &num1);
printf("El seno es: %.2f \n", sin(num1));
return;
}
void coseno(void)
{
    float num1;
printf("\nIntroduzca el numero: \n");
scanf("%f", &num1);
printf("El coseno es: %.2f \n", cos(num1));
return;
}
void tangente(void)
{
    float num1;
printf("\nIntroduzca el numero: \n");
scanf("%f", &num1);
printf("La tangente es: %.2f \n", tan(num1));
return;
}


Título: Re: Calculadora hecha en C
Publicado por: Stakewinner00 en 7 Noviembre 2012, 15:25 pm
Gracias por la explicación.


Título: Re: Calculadora hecha en C
Publicado por: BatchianoISpyxolo en 7 Noviembre 2012, 21:33 pm
@barnix456, bueno tú has insertado todo el código en un mismo archivo y funciona. Pero claro, si tienes programas de 10-20 mil líneas, la cosa se complica.

La idea sería:

funciones.h
Código
  1.  
  2. /* Tipos de datos */
  3.  
  4. /* Encabezados de funciones públicas */
  5.  
  6. void restar(void);
  7. void multiplicar(void);
  8. void dividir(void);
  9. void potencia(void);
  10. void raiz_cuadrada(void);
  11. void seno(void);
  12. void coseno(void);
  13. void tangente(void);

funciones.c
Código
  1.  
  2. /* includes */
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7.  
  8. void sumar(void)
  9. {
  10.    float num1, num2;
  11. printf("\nIntroduzca los dos numeros a sumar: \n");
  12. scanf("%f %f", &num1, &num2);
  13.    printf("\n%.2f", num1 + num2);
  14. return;
  15. }
  16. void restar(void)
  17. {
  18.    float num1, num2;
  19. printf("\nIntroduzca los dos numeros a restar: \n");
  20. scanf("%f %f", &num1, &num2);
  21. printf("\n%.2f", num1 - num2);
  22. return;
  23. }
  24. void multiplicar(void)
  25. {
  26.    float num1, num2;
  27. printf("\nIntroduzca los dos numeros a multiplicar: \n");
  28. scanf("%f %f", &num1, &num2);
  29. printf("\n%.2f", num1 * num2);
  30. return;
  31. }
  32. void dividir(void)
  33. {
  34.    float num1, num2;
  35. printf("\nIntroduzca los dos numeros a dividir: \n");
  36. scanf("%f %f", &num1, &num2);
  37. printf("\n%.2f", num1 / num2);
  38. return;
  39. }
  40. void potencia(void)
  41. {
  42.    float num1, num2;
  43. printf("\nIntroduzca la base: \n");
  44. scanf("%f", &num1);
  45. printf("Introduzca el exponente: \n");
  46. scanf("%f", &num2);
  47. printf("\n%.2f", pow(num1, num2));
  48. return;
  49. }
  50. void raiz_cuadrada(void)
  51. {
  52.    float num1;
  53. printf("\nIntroduzca el numero: \n");
  54. scanf("%f", &num1);
  55. printf("La raiz cuadrada es: %.2f \n", sqrt(num1));
  56. return;
  57. }
  58. void seno(void)
  59. {
  60.    float num1;
  61. printf("\nIntroduzca el numero: \n");
  62. scanf("%f", &num1);
  63. printf("El seno es: %.2f \n", sin(num1));
  64. return;
  65. }
  66. void coseno(void)
  67. {
  68.    float num1;
  69. printf("\nIntroduzca el numero: \n");
  70. scanf("%f", &num1);
  71. printf("El coseno es: %.2f \n", cos(num1));
  72. return;
  73. }
  74. void tangente(void)
  75. {
  76.    float num1;
  77. printf("\nIntroduzca el numero: \n");
  78. scanf("%f", &num1);
  79. printf("La tangente es: %.2f \n", tan(num1));
  80. return;
  81. }


main.c
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "funciones.h" // <- debe estar en el mismo dir o especificar ruta completa
  4.  
  5. void main()
  6. {
  7.    int op;
  8.  
  9.    printf("\t\tElija una opcion:\n\n");
  10. printf("\t*********************************\n");
  11. printf("\t*\t [1] Sumar\t\t*\n");
  12. printf("\t*\t [2] Restar\t\t*\n");
  13. printf("\t*\t [3] Multiplicar\t*\n");
  14. printf("\t*\t [4] Dividir\t\t*\n");
  15. printf("\t*\t [5] Potencia\t\t*\n");
  16. printf("\t*\t [6] Raiz cuadrada\t*\n");
  17. printf("\t*\t [7] Seno\t\t*\n");
  18. printf("\t*\t [8] Coseno\t\t*\n");
  19. printf("\t*\t [9] Tangente\t\t*\n");
  20. printf("\t*\t [10] Salir\t\t*\n");
  21. printf("\t*********************************\n\n");
  22. scanf("%d", &op);
  23.  
  24. switch (op) {
  25.  
  26. case 1:
  27. sumar();
  28. break;
  29.  
  30. case 2:
  31. restar();
  32. break;
  33.  
  34. case 3:
  35. multiplicar();
  36. break;
  37.  
  38. case 4:
  39. dividir();
  40. break;
  41.  
  42. case 5:
  43. potencia();
  44. break;
  45.  
  46. case 6:
  47. raiz_cuadrada();
  48. break;
  49.  
  50. case 7:
  51. seno();
  52. break;
  53.  
  54. case 8:
  55. coseno();
  56. break;
  57.  
  58. case 9:
  59. tangente();
  60. break;
  61.  
  62. case 10:
  63. break;
  64.  
  65. default:
  66.            printf("Ha elejido una opcion incorrecta\n");
  67.            break;
  68. }
  69. }
  70.  

La idea ahora sería compilar funciones.c como objeto. Es decir generar un fichero compilado, aunque no ejecutable.
Usando gcc sería:
Código:
gcc -c funciones.c -o funciones.o

Lo siguiente, compilar main.c junto con funciones.h como objeto:
Usando gcc sería:
Código:
gcc -c main.c funciones.h -o main.o

Finalmente deberíamos generar el ejecutable final compilando los dos archivos objeto (funciones.o y main.o):
Usando gcc sería:
Código:
gcc main.o funciones.o -o ejecutable
(En Windows .exe)

Para agilizar la compilación en módulos se diseñan archivos makefile de tal manera que solo con ejecutar make, compilamos todo nuestro programa.


Título: Re: Calculadora hecha en C
Publicado por: Caster en 8 Noviembre 2012, 18:24 pm
El dividir el programa en varios archivos es solo cuestion de comodidad, es costoso escribir muchas lineas en el mismo archivo, asi si divido el programa, a la hora de volver a tocar el codigo, cambiar cosas, depurarlo, etc me es mucho mas facil y comodo, y si dejo un tiempo el codigo apartado y quiero volver a verlo, conayuda de algunos coments y tenerlo dividido en archivo se hace mas rapido volver a entender el codigo.

Saludos


Título: Re: Calculadora hecha en C
Publicado por: barnix456 en 9 Noviembre 2012, 19:46 pm
@BatchianoISpyxolo muchas gracias por la explicacion, la verdad como estoy empezando en esto, no sabia eso de dividir los programas en ese tipo de cosas, y eso de los makefiles tampoco... eso se ve muy interesante, y aparte es mas practico... :) ahora, interante compilarlo de esa manera, una pregunta, para compilarlo de esa manera, asi por aparte, tiene que ser afuerza en la terminal, o tambien desde algun ide??



Título: Re: Calculadora hecha en C
Publicado por: 0xDani en 9 Noviembre 2012, 23:13 pm
@BatchianoISpyxolo muchas gracias por la explicacion, la verdad como estoy empezando en esto, no sabia eso de dividir los programas en ese tipo de cosas, y eso de los makefiles tampoco... eso se ve muy interesante, y aparte es mas practico... :) ahora, interante compilarlo de esa manera, una pregunta, para compilarlo de esa manera, asi por aparte, tiene que ser afuerza en la terminal, o tambien desde algun ide??



No le temas a la terminal, no se come a nadie  :P


Título: Re: Calculadora hecha en C
Publicado por: barnix456 en 9 Noviembre 2012, 23:34 pm
jajaja buen punto, la verdad, tengo que empezar a meterle mano...!!