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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  No tiene errores el codigo, pero no funciona como deberia ser
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No tiene errores el codigo, pero no funciona como deberia ser  (Leído 2,601 veces)
Ditarex

Desconectado Desconectado

Mensajes: 8


Ver Perfil
No tiene errores el codigo, pero no funciona como deberia ser
« en: 7 Mayo 2014, 07:45 am »

Hola a todos, queria proguntarles por si me podrian ayudar en un codigo que se supone que es una calculadora. Ejecuto el codigo y todo bien, me pide que ingrese el numero de una de las 4 opciones de calculo, procedo a una de ellas y me pregunta un valor 'x' y luego un valor 'y'. El error es que al darme el resultado siempre me da 0, y esto ocurre en Sumar, Restar, Multiplicar, en dividir, se ve que habré de retornar un valor en double, pero respecto a lo otro a mi parecer no le veo la solucion, no se si he de usar mas variables aunque en teoria tendria que funcionar a si ya que estoy usando un switch, vean el codigo:

Código
  1. #include <iostream>
  2. #include <conio.h>
  3.  
  4. using namespace std;
  5.  
  6. bool mala_opcion = false;
  7.  
  8. int x;
  9. int y;
  10. int eleccion;
  11.  
  12. void sumar(int, int);
  13. void restar(int, int);
  14. void multiplicar(int, int);
  15. double dividir(int, int);
  16.  
  17. int main(){
  18. cout << "------C A L C U L A D O R A------\n" << endl;
  19. cout << "Escoja escribiendo el numero, el tipo de calculo que desea realizar:" << endl;
  20. cout << "\n 1) Sumar          2) Restar\n" << " 3) Multiplicar    4) Dividir\n " << endl;
  21. while(!mala_opcion){
  22. cin >> eleccion;
  23. switch(eleccion){
  24. case 1:
  25. int x;
  26. int y;
  27. cout << "\n\n  Introduzca el valor 'x': " << endl;
  28. cin >> x;
  29. cout << "\n\n  Introduzca el valor 'y': " << endl;
  30. cin >> y;
  31. sumar(x, y);
  32. mala_opcion = true;
  33. break;
  34. case 2:
  35. cout << "\n\n  Introduzca el valor 'x': " << endl;
  36. cin >> x;
  37. cout << "\n\n  Introduzca el valor 'y': " << endl;
  38. cin >> y;
  39. restar(x, y);
  40. mala_opcion = true;
  41. break;
  42. case 3:
  43. cout << "\n\n  Introduzca el valor 'x': " << endl;
  44. cin >> x;
  45. cout << "\n\n  Introduzca el valor 'y': " << endl;
  46. cin >> y;
  47. multiplicar(x, y);
  48. mala_opcion = true;
  49. break;
  50. case 4:
  51. cout << "\n\n  Introduzca el valor 'x': " << endl;
  52. cin >> x;
  53. cout << "\n\n  Introduzca el valor 'y': " << endl;
  54. cin >> y;
  55. dividir(x, y);
  56. mala_opcion = true;
  57. break;
  58. default:
  59. cout << "\n  Has introducido un comando incorrecto, vuelva a repetir." << endl;
  60. break;
  61. }
  62. }
  63. getch();
  64. return 0;
  65. }
  66.  
  67. void sumar(int, int){
  68. cout << "\n\nResultado de la Suma:  " << x + y << endl;
  69. }
  70.  
  71. void restar(int, int){
  72. cout << "\n\nResultado de la Resta:  " << x - y << endl;
  73. }
  74.  
  75. void multiplicar(int, int){
  76. cout << "\n\nResultado de la Multiplicacion:  " << x * y << endl;
  77. }
  78.  
  79. double dividir(int, int){
  80. cout << "\n\nResultado de la Division:  " << x / y << endl;
  81. }

PD: La funcion de dividir no la tengo asi, aqui la puse que la estaba arreglando, ya la tengo bien arreglada pero el resto no se como solucionarlo.

Muchas gracias por adelantado, saludos.


« Última modificación: 7 Mayo 2014, 07:48 am por Ditarex » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: No tiene errores el codigo, pero no funciona como deberia ser
« Respuesta #1 en: 7 Mayo 2014, 08:49 am »

Código
  1. int x;
  2. int y;
  3.  
  4. // ...
  5.  
  6. int main(){
  7. // ...
  8. while(!mala_opcion){
  9. cin >> eleccion;
  10. switch(eleccion){
  11. case 1:
  12. int x;
  13. int y;

si te fijas tienes x e y declaradas dos veces... la primera declaración se corresponde con variables globales ( mejor no usarlas... uno de los motivos es el que hace que tu programa falle ). Debido a que dentro de main has declarado dos variables iguales, las que se van a usar en esa sección del código son las locales... las globales ni se enteran.

por otro lado:

Código
  1. cout << "\n\n  Introduzca el valor 'x': " << endl;
  2. cin >> x;
  3. cout << "\n\n  Introduzca el valor 'y': " << endl;
  4. cin >> y;
  5. sumar(x, y);
  6.  
  7. // ...
  8.  
  9. void sumar(int, int){
  10. cout << "\n\nResultado de la Suma:  " << x + y << endl;
  11. }

la función "sumar" recibe dos argumentos pero no los usa absolutamente para nada... está tirando de las variables globales... que como hemos comentado hace un momento no se han enterado de las asignaciones.

Y para terminar...

Código
  1. double dividir(int, int){
  2. cout << "\n\nResultado de la Division:  " << x / y << endl;
  3. }

"dividir" debería retornar un double... pero no hay return. Además, la división entre dos enteros va a ser otro entero... sin decimales.

Esto tiene varias soluciones diferentes, yo te propongo la más limpia.

Los pasos a seguir son los siguientes:

1. Elimina las variables globales (todas)
2. Pon nombre a los argumentos de las funciones y usa esas variables dentro de cada función
3. No uses conio.h
4. Para no perder los decimales, hacemos un cast a double en el caso de "dividir"
5. Modificamos "dividir" para que no retorne un double ( no es necesario )
6. "\n" y "endl", ambas introducen un salto de linea... no hace falta combinarlas

Y este es el resultado:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void sumar(int, int);
  6. void restar(int, int);
  7. void multiplicar(int, int);
  8. void dividir(int, int);
  9.  
  10. int main()
  11. {
  12.  cout << "------C A L C U L A D O R A------" << endl;
  13.  cout << "Escoja escribiendo el numero, el tipo de calculo que desea realizar:" << endl;
  14.  cout << " 1) Sumar          2) Restar" << endl << " 3) Multiplicar    4) Dividir" << endl;
  15.  
  16.  bool repetir = false; // esta se corresponde con mala_opcion, el nombre y su uso no son para nada claros
  17.  
  18.  do // no tiene sentido comprobar "repetir" en la primera iteracion
  19.  {
  20.    int eleccion;
  21.    cin >> eleccion;
  22.    switch(eleccion)
  23.    {
  24.      case 1:
  25.        int x, y;
  26.        cout << endl << "Introduzca el valor 'x': " << endl;
  27. cin >> x;
  28. cout << "Introduzca el valor 'y': " << endl;
  29. cin >> y;
  30. sumar(x, y);
  31. break;
  32.  
  33.      case 2:
  34.        int x, y;
  35.        cout << endl << "Introduzca el valor 'x': " << endl;
  36.        cin >> x;
  37.        cout << "Introduzca el valor 'y': " << endl;
  38.        cin >> y;
  39.        restar(x, y);
  40.        break;
  41.  
  42.      case 3:
  43.        int x, y;
  44.        cout << endl << "Introduzca el valor 'x': " << endl;
  45.        cin >> x;
  46.        cout << "Introduzca el valor 'y': " << endl;
  47.        cin >> y;
  48.        multiplicar(x, y);
  49.        break;
  50.  
  51.      case 4:
  52.        int x, y;
  53.        cout << endl << "Introduzca el valor 'x': " << endl;
  54.        cin >> x;
  55.        cout << "Introduzca el valor 'y': " << endl;
  56.        cin >> y;
  57.        dividir(x, y);
  58. break;
  59.  
  60.      default:
  61.        cout << endl << "Has introducido un comando incorrecto, vuelva a repetir." << endl;
  62.        repetir = true;
  63.        break;
  64.    }
  65.  }
  66.  
  67.  cin.get();
  68.  return 0;
  69. }
  70.  
  71. void sumar(int x, int y)
  72. {
  73. cout << endl <<  "Resultado de la Suma:  " << x + y << endl;
  74. }
  75.  
  76. void restar(int x , int y){
  77. cout << endl << "Resultado de la Resta:  " << x - y << endl;
  78. }
  79.  
  80. void multiplicar(int x, int y){
  81. cout << endl << "Resultado de la Multiplicacion:  " << x * y << endl;
  82. }
  83.  
  84. void dividir(int x, int y){
  85.  // Hay dos formas de hacer cast... estilo C y estilo C++:
  86.  double dividendo, divisor;
  87.  
  88.  // Estilo C
  89.  // Es mas inseguro y es mejor evitarlo... pero al principio es mas sencillo de usar
  90.  dividendo = (double)x;
  91.  divisor = (double)y;
  92.  
  93.  // Estilo C++
  94.  // La opcion recomendada, aunque conviene revisar los diferentes tipos de casting que hay
  95.  dividendo = static_cast< double >( x );
  96.  divisor = static_cast< double >( y );
  97.  
  98.  cout << endl << "Resultado de la Division:  " << dividendo / divisor << endl;
  99. }
  100.  


En línea

Ditarex

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: No tiene errores el codigo, pero no funciona como deberia ser
« Respuesta #2 en: 7 Mayo 2014, 12:38 pm »

Redacté todos mis fallos y despues de tus correcciones reintenté de nuevo hacerla entera, solo que lo unico que copio fue la funcion dividir ya que no entendia sobre los tipos de casting, hoy me pondré a repasar sobre ese apartado. Muchas gracias eferion, me di cuenta que lo tube todo muy mal sincronizado, llevo unos 15 dias o 20 aprendiendo c++ y esta correccion me hizo entender ciertos problemas que siempre tuve. Gracias por poner su esfuerzo en ayudarme, me ha servido todo para poder seguir avanzando en mi aprendizaje.

Le debo una, gracias otra vez!
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: No tiene errores el codigo, pero no funciona como deberia ser
« Respuesta #3 en: 7 Mayo 2014, 12:56 pm »

Tranquilo, uno no nace sabiendo y es necesario darse unos cuantos golpes para aprender.

Buena suerte.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines