elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C/C++] Conversor Julios <-> Electrón-Voltios
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C/C++] Conversor Julios <-> Electrón-Voltios  (Leído 3,590 veces)
Álvaro G. Tenorio

Desconectado Desconectado

Mensajes: 8


Ver Perfil
[C/C++] Conversor Julios <-> Electrón-Voltios
« en: 5 Octubre 2013, 20:34 pm »

Este es un pequeño proyecto de media hora.

El programa realiza conversiones entre Julios y Electrón-Voltios en los dos sentidos posibles según indique el usuario, pretende ser una ayuda para no tener que insertar números largos en la calculadora para resolver problemas problemas de
Química de 2º de Bachillerato. Pero es más bien un pequeño reto de programación para principiantes (como yo).

Compilado con MinGW.

Funciona perfectamente bajo Windows, funciona parcialmente bajo GNU/Linux por la códificación de la funcion LimpiarPantalla(); pero no es nada grave. El código está escrito en C usando sólo las cabeceras estándar y está comentado completamente en español.

El programa es software libre y contiene copyleft, lo cual quiere decir que puesdes redistribuir, modificar el código y demás sólamente bajo los términos de la Licencia General Pública de GNU (GPL).

Versión 0.0.1 (No creo que haga falta ninguna otra versión a no ser que
aprenda a hacer GUIs y lo actualice, pero la simplicidad es buena para aprender).

Aquí el código:

Código
  1. /*Cabeceras incluidas*/
  2. #include <stdio.h>  /*Cabecera estándar*/
  3. #include <stdlib.h> /*Cabecera estándar*/
  4.  
  5. /*Funciones declaradas (prototipos)*/
  6. void limpiarBuffer (void);     /*Limpia el buffer de entrada*/
  7. void limpiarPantalla (void);   /*Limpia la pantalla de la consola del sistema*/
  8. void menu (void);              /*Imprime un pequeño menú de bienvenida*/
  9. void sentidoConversion (void); /*Indica el sentido en el que se realizará la conversión*/
  10. void J_Ev (void);              /*Realiza la conversion de Julios a Electron-Voltios*/
  11. void Ev_J (void);              /*Realiza la conversion de Electron-Voltios a Julios*/
  12. void reinicio (void);          /*Reinicia o finaliza el programa*/
  13.  
  14. /*Funcion main*/
  15. int main (void)
  16. {
  17.    menu();
  18.    sentidoConversion();
  19.    reinicio();
  20.  
  21.    return 0;
  22. }
  23.  
  24. /*Funciones definidas (cuerpos de las funciones)*/
  25.  
  26. void limpiarBuffer (void) /*Limpia el buffer de entrada*/
  27. {
  28.    while (getchar() != '\n');
  29. }
  30.  
  31. void menu (void) /*Imprime un pequeño menú de bienvenida*/
  32. {
  33.    printf("--->Conversor Julios <-> Electron-Voltios\n");
  34. }
  35.  
  36. void limpiarPantalla (void) /*Limpia la pantalla de la consola del sistema*/
  37. {
  38.    system("cls");
  39. }
  40.  
  41. void sentidoConversion (void) /*Indica el sentido en el que se realizará la conversión*/
  42. {
  43.    /*Declaración de variables*/
  44.    unsigned char eleccion = 0; /*Valor por defecto en 0*/
  45.  
  46.    /*Trámites con el usuario*/
  47.    printf("Como desea realizar la conversion?:\n");
  48.    printf("[1] -> Julios -> Electron-Voltios\n");
  49.    printf("[2] -> Electron-Voltios -> Julios\n");
  50.    printf("Su eleccion: ");
  51.    scanf("%hhu", &eleccion);
  52.    limpiarBuffer();
  53.  
  54.    /*Derivar a una u otra funcion según la decisión del usuario*/
  55.    switch (eleccion)
  56.    {
  57.        case 1:
  58.            limpiarPantalla();
  59.            J_Ev();
  60.            break;
  61.        case 2:
  62.            limpiarPantalla();
  63.            Ev_J();
  64.            break;
  65.        default:
  66.            printf("ERROR: Inserte 1 o 2 segun el sentido de la conversion que desee.\n");
  67.            printf("Pulse [ENTER] para continuar...");
  68.            getchar();
  69.            limpiarPantalla();
  70.            sentidoConversion();
  71.            break;
  72.    }
  73. }
  74.  
  75. void J_Ev (void) /*Realiza la conversion de Julios a Electron-Voltios*/
  76. {
  77.    /*Declaración de variables*/
  78.    double J;
  79.    double Ev;
  80.    const double cargaElectron = 1.6e-19;
  81.  
  82.    /*Trámites con el usuario*/
  83.    printf("Julios a convertir: ");
  84.    scanf("%lf", &J);
  85.    limpiarBuffer();
  86.    printf("Convirtiendo...\n");
  87.  
  88.    /*Conversion*/
  89.    Ev = J/cargaElectron;
  90.    printf("%lg J = %lg Ev\n", J, Ev);
  91. }
  92.  
  93. void Ev_J (void) /*Realiza la conversion de Electron-Voltios a Julios*/
  94. {
  95.    /*Declaración de variables*/
  96.    double J;
  97.    double Ev;
  98.    const double cargaElectron = 1.6e-19;
  99.  
  100.    /*Trámites con el usuario*/
  101.    printf("Electron-Voltios a convertir: ");
  102.    scanf("%lf", &Ev);
  103.    limpiarBuffer();
  104.    printf("Convirtiendo...\n");
  105.  
  106.    /*Conversion*/
  107.    J = Ev*cargaElectron;
  108.    printf("%lg Ev = %lg J\n", J, Ev);
  109. }
  110.  
  111. void reinicio (void) /*Reinicia o finaliza el programa*/
  112. {
  113.    /*Declaración de variables*/
  114.    unsigned char eleccion = 0; /*Valor por defecto en 0*/
  115.  
  116.    /*Trámites con el usuario*/
  117.    printf("Desea realizar otra conversion?\n");
  118.    printf("[1] -> Si\n");
  119.    printf("[2] -> No\n");
  120.    printf("Su eleccion: ");
  121.    scanf("%hhu", &eleccion);
  122.    limpiarBuffer();
  123.  
  124.    /*Derivar a una u otra funcion según la decisión del usuario*/
  125.    switch (eleccion)
  126.    {
  127.        case 1:
  128.            limpiarPantalla();
  129.            main();
  130.            break;
  131.        case 2:
  132.            break;
  133.        default:
  134.            printf("ERROR: Inserte 1 o 2 la opcion que desee.\n");
  135.            printf("Pulse [ENTER] para continuar...");
  136.            getchar();
  137.            limpiarPantalla();
  138.            break;
  139.    }
  140. }
  141.  

Probablemente la química no sea de vuestra competencia, pero la informática sí, agradecería opiniones sobre el código, estoy abierto a críticas para mejorar.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C/C++] Conversor Julios <-> Electrón-Voltios
« Respuesta #1 en: 6 Octubre 2013, 00:27 am »

Ahí veo que sobran muchas cosas.

void limpiarpantalla() sobra. pones el system("cls");, y es más legible, a mi parecer.

Tienes por separado "menu" y "sentidoconversion". Un menu es donde eliges las opciones, por tanto, el menu es esas 2 funciones unidas.


En línea

MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [C/C++] Conversor Julios <-> Electrón-Voltios
« Respuesta #2 en: 6 Octubre 2013, 10:57 am »

En el main se pone el esqueleto del programa

Código
  1. int main (void)
  2. {
  3.    menu();
  4.    sentidoConversion();
  5.    reinicio();
  6.  
  7.    return 0;
  8. }
  9.  


1. Hay muchas cosas que sobran
2. Llamas a una función dentro de otra, si quieres reutilizar algo te dará problemas

Estas 3 funciones sobran


Código
  1. void limpiarBuffer (void) /*Limpia el buffer de entrada*/
  2. {
  3.    while (getchar() != '\n');
  4. }
  5.  
  6. void menu (void) /*Imprime un pequeño menú de bienvenida*/
  7. {
  8.    printf("--->Conversor Julios <-> Electron-Voltios\n");
  9. }
  10.  
  11. void limpiarPantalla (void) /*Limpia la pantalla de la consola del sistema*/
  12. {
  13.    system("cls");
  14. }

Estas creando una variable tipo char para almacenar un numero

Código
  1. unsigned char eleccion = 0; /*Valor por defecto en 0*/

Esta cosa rara...

Código
  1. scanf("%hhu", &eleccion);

En todos los scanf y algunos printf pones esto, si lo que quieres es coger o mostrar solo un decimal, se pone con punto

Código
  1. scanf("%lf", &J);
  2.  
  3. printf("%lg J = %lg Ev\n", J, Ev);

Citar
pero la simplicidad es buena para aprender

El código es muy enrevesado para ser simple y poder aprender

Pero bueno, lo que te digo de la función main es esto, quizás te funciona mejor este codigo


Código
  1. #include <stdio.h>
  2.  
  3. #define CargaElectron 1.6e-19
  4.  
  5. float Julios_EV(float Julios);  //Realiza la conversion de Julios a Electron-Voltios
  6. float EV_Julios(float EV);      //Realiza la conversion de Electron-Voltios a Julios
  7.  
  8. int main ()
  9. {
  10.    int Opcion;
  11.  
  12.    float Valor, Resultado;
  13.  
  14.    printf("Conversor Julios <-> Electron-Voltios\n");
  15.  
  16.    do
  17.    {
  18.  
  19.        printf("\n  [1] Julios -> Electron-Voltios"
  20.               "\n  [2] Electron-Voltios -> Julios"
  21.               "\n  [3] Salir");
  22.  
  23.        printf("\n\nEscoje una opcion: ");
  24.        scanf("%d", &Opcion);
  25.  
  26.        switch(Opcion)
  27.        {
  28.            case 1:
  29.            {
  30.                printf("\nCuantos Julios deseas convertir: ");
  31.                scanf("%f",&Valor);
  32.                Resultado = Julios_EV(Valor);
  33.  
  34.                printf("\n\n%.2f Julios son %.2f EV\n",Valor,Resultado);
  35.  
  36.                break;
  37.  
  38.            }
  39.            case 2:
  40.            {
  41.                printf("\nCuantos EV deseas convertir: ");
  42.                scanf("%f",&Valor);
  43.                Resultado = EV_Julios(Valor);
  44.  
  45.                printf("\n\n%.2f EV son %.2f Julios\n",Valor,Resultado);
  46.  
  47.                break;
  48.  
  49.            }
  50.            case 3:
  51.            {
  52.                break;
  53.            }
  54.            default:
  55.            {
  56.                printf("\nOpcion Incorrecta!\n"); //Error
  57.                break; //Salimos
  58.            }
  59.        }
  60.    }while(Opcion!=3);
  61.  
  62.    return 0;
  63. }
  64.  
  65. float Julios_EV(float Julios)  //Realiza la conversion de Julios a Electron-Voltios
  66. {
  67.  
  68.    float EV;
  69.  
  70.    EV = Julios/CargaElectron;
  71.  
  72.    return EV;
  73. }
  74.  
  75. float EV_Julios(float EV)      //Realiza la conversion de Electron-Voltios a Julios
  76. {
  77.  
  78.    float Julios;
  79.  
  80.    Julios = EV * CargaElectron;
  81.  
  82.    return Julios;
  83. }

Estoy seguro de que se puede optimizar mucho mas, pero para que te hagas una idea.

Saludos


Modificado

Revisa estas dos funciones, los valores que dan los printf, a ver si ves el error

Código
  1. void J_Ev (void) /*Realiza la conversion de Julios a Electron-Voltios*/
  2. {
  3.    /*Declaración de variables*/
  4.    double J;
  5.    double Ev;
  6.    const double cargaElectron = 1.6e-19;
  7.  
  8.    /*Trámites con el usuario*/
  9.    printf("Julios a convertir: ");
  10.    scanf("%lf", &J);
  11.    limpiarBuffer();
  12.    printf("Convirtiendo...\n");
  13.  
  14.    /*Conversion*/
  15.    Ev = J/cargaElectron;
  16.    printf("%lg J = %lg Ev\n", J, Ev);
  17. }
  18.  
  19. void Ev_J (void) /*Realiza la conversion de Electron-Voltios a Julios*/
  20. {
  21.    /*Declaración de variables*/
  22.    double J;
  23.    double Ev;
  24.    const double cargaElectron = 1.6e-19;
  25.  
  26.    /*Trámites con el usuario*/
  27.    printf("Electron-Voltios a convertir: ");
  28.    scanf("%lf", &Ev);
  29.    limpiarBuffer();
  30.    printf("Convirtiendo...\n");
  31.  
  32.    /*Conversion*/
  33.    J = Ev*cargaElectron;
  34.    printf("%lg Ev = %lg J\n", J, Ev);
  35. }

Pista, el último printf

Modificado 2

Por cierto...

Código
  1. const double cargaElectron = 1.6e-19;

Se declaran al inicio

Saludos
« Última modificación: 6 Octubre 2013, 11:06 am por MeCraniDOS » En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
Álvaro G. Tenorio

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: [C/C++] Conversor Julios <-> Electrón-Voltios
« Respuesta #3 en: 6 Octubre 2013, 12:24 pm »

¿Qué problema hay con el main();?

Voy a modificar cuando pueda el código para unir la función menu(); y sentidoConversion(); ya me di cuenta de que es inútil tanta división de funciones.

Asimismo eliminaré las funciones de limpiarBuffer(); y limpiarPantalla(); Pero mi pregunta es: ¿si a estas funciones les pusiera un inline delante a efectos de código compilado no tendrían el mismo rendimiento?

Uso un unsigned char para guardar números pequeños del 0 al 255. En cuanto al %hhu es el modificador de formato de scanf para variables de unsigned char

Pongo lo del %lg no para que sólo muestre un decimal sino para que sólo muestre los decimales significativos (los que no son 0).

Quizá si sea enrevesado por todos los comentarios y una dicisión absurda en infinitas funciones inútiles, pero, ¿no es mejor dividir el programa en funciones para que el main(); quede escueto? al menos eso me recomendaron a mi, pues yo antes solía programar unos main(); elefantiásicos...

Ya vi el error de los printf(); cosas de copiar y pegar, lo modificaré en cuanto pueda, muchas gracias, sino se queda ahí...

Por último que me recomiendas: declarar las constantes como globales al principio del código tal que así:

Código
  1. const double cargaElectron = 1.6e-19;

o por el contrario definirlas como constantes con una directiva al preprocesador:

Código
  1. #define cargaElectron 1.6e-19L
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C/C++] Conversor Julios <-> Electrón-Voltios
« Respuesta #4 en: 6 Octubre 2013, 12:42 pm »

Lo de las constantes, yo creo que un #define iría mejor.

En cuanto a lo de limpiarPantalla y buffer, hazlo como quieras. inline es practicamente lo mismo que poner "system("cls");". En cambio, me parece más limpio ponerlo con el system. ahorrarte funciones.

Por mi parte, algo tan sencillo, lo haría sin funciones xD un While(1) o un goto para mantener el ciclo infinito, y listo xd

Por cierto: la función reinicio, llama a main. Y main, llama a la función reinicio. Espero que me entiendas. Esa función reinicio se llama constantemente, y nunca se llega a cerrar hasta que le des a "NO". Suponiendo que hagas 20 calculos con el programa, tendrías abiertas 20 funciones reinicio y otro tanto de main.

Si es un ejercicio, bien, pero si es un programa, yo me lo replantearía. Yo me desharía de la función "reinicio", y lo metería en el main. Si quieres mantener la función reinicio, yo haría que retorne un valor, el valor "1" o "2", y que en main, cierre el bucle si es "2".

Pero tu verás
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [C/C++] Conversor Julios <-> Electrón-Voltios
« Respuesta #5 en: 6 Octubre 2013, 14:10 pm »

Lo de las constantes, yo creo que un #define iría mejor.

Depende. Usar constantes tiene sus ventajas:
* Type-safe
* Se puede usar como parámetro en funciones que requieran el paso de punteros y/o referencias.
* Crea símbolos en depuración, lo que facilita el proceso de debug.

Define también tiene alguna ventaja sobre const... pero en c++ lo más lógico y recomendable es usar const.
En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: [C/C++] Conversor Julios <-> Electrón-Voltios
« Respuesta #6 en: 6 Octubre 2013, 14:18 pm »

Sobre la función limpiarPantalla(), ya he puesto esto varias veces: puedes hacerla portable mediante el uso del preprocesador.

Código
  1. inline void limpiarPantalla()
  2. {
  3. #ifdef __unix__ /* Estamos en un Unix[-like] */
  4. system("clear");
  5. #elif defined _WIN32 /* Windows */
  6. system("cls");
  7. #else
  8. #warning limpiarPantalla not supported
  9. #endif
  10. }
  11.  
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C/C++] Conversor Julios <-> Electrón-Voltios
« Respuesta #7 en: 6 Octubre 2013, 14:20 pm »

Depende. Usar constantes tiene sus ventajas:

Me refiero en ese código :o no pasa referencias.

En línea

Álvaro G. Tenorio

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: [C/C++] Conversor Julios <-> Electrón-Voltios
« Respuesta #8 en: 7 Octubre 2013, 15:32 pm »

Si te digo la verdad no se me había ocurrido eso de que la función seguía activa con su correspondiente gasto de memoria, ya estoy modificando el código, en cuanto pueda lo copio y lo modifico aquí.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Conversor de asf a avi
Multimedia
theskull 6 4,435 Último mensaje 24 Febrero 2004, 19:33 pm
por theskull
Conversor AVI a WMA?
Multimedia
jormalgi 3 2,331 Último mensaje 21 Febrero 2005, 17:11 pm
por jormalgi
conmutador de Baterías de 12 voltios
Electrónica
luis456 0 2,856 Último mensaje 6 Mayo 2018, 15:23 pm
por luis456
Windows 95 dentro de Electron como app
Foro Libre
EFEX 0 1,013 Último mensaje 25 Agosto 2018, 19:57 pm
por EFEX
Conmutador de carga de dos baterías de 12 voltios « 1 2 »
Electrónica
luis456 17 9,133 Último mensaje 19 Abril 2022, 23:52 pm
por Minusfour_cierralo_o_baneamefull
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines