No tiene errores el codigo, pero no funciona como deberia ser

Iniciado por Ditarex, 7 Mayo 2014, 07:45 AM

0 Miembros y 1 Visitante están viendo este tema.

Ditarex

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 (cpp) [Seleccionar]
#include <iostream>
#include <conio.h>

using namespace std;

bool mala_opcion = false;

int x;
int y;
int eleccion;

void sumar(int, int);
void restar(int, int);
void multiplicar(int, int);
double dividir(int, int);

int main(){
cout << "------C A L C U L A D O R A------\n" << endl;
cout << "Escoja escribiendo el numero, el tipo de calculo que desea realizar:" << endl;
cout << "\n 1) Sumar          2) Restar\n" << " 3) Multiplicar    4) Dividir\n " << endl;
while(!mala_opcion){
cin >> eleccion;
switch(eleccion){
case 1:
int x;
int y;
cout << "\n\n  Introduzca el valor 'x': " << endl;
cin >> x;
cout << "\n\n  Introduzca el valor 'y': " << endl;
cin >> y;
sumar(x, y);
mala_opcion = true;
break;
case 2:
cout << "\n\n  Introduzca el valor 'x': " << endl;
cin >> x;
cout << "\n\n  Introduzca el valor 'y': " << endl;
cin >> y;
restar(x, y);
mala_opcion = true;
break;
case 3:
cout << "\n\n  Introduzca el valor 'x': " << endl;
cin >> x;
cout << "\n\n  Introduzca el valor 'y': " << endl;
cin >> y;
multiplicar(x, y);
mala_opcion = true;
break;
case 4:
cout << "\n\n  Introduzca el valor 'x': " << endl;
cin >> x;
cout << "\n\n  Introduzca el valor 'y': " << endl;
cin >> y;
dividir(x, y);
mala_opcion = true;
break;
default:
cout << "\n  Has introducido un comando incorrecto, vuelva a repetir." << endl;
break;
}
}
getch();
return 0;
}

void sumar(int, int){
cout << "\n\nResultado de la Suma:  " << x + y << endl;
}

void restar(int, int){
cout << "\n\nResultado de la Resta:  " << x - y << endl;
}

void multiplicar(int, int){
cout << "\n\nResultado de la Multiplicacion:  " << x * y << endl;
}

double dividir(int, int){
cout << "\n\nResultado de la Division:  " << x / y << endl;
}


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.

eferion

Código (cpp) [Seleccionar]

int x;
int y;

// ...

int main(){
// ...
while(!mala_opcion){
cin >> eleccion;
switch(eleccion){
case 1:
int x;
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 (cpp) [Seleccionar]

cout << "\n\n  Introduzca el valor 'x': " << endl;
cin >> x;
cout << "\n\n  Introduzca el valor 'y': " << endl;
cin >> y;
sumar(x, y);

// ...

void sumar(int, int){
cout << "\n\nResultado de la Suma:  " << x + y << endl;
}


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 (cpp) [Seleccionar]

double dividir(int, int){
cout << "\n\nResultado de la Division:  " << x / y << endl;
}


"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 (cpp) [Seleccionar]

#include <iostream>

using namespace std;

void sumar(int, int);
void restar(int, int);
void multiplicar(int, int);
void dividir(int, int);

int main()
{
  cout << "------C A L C U L A D O R A------" << endl;
  cout << "Escoja escribiendo el numero, el tipo de calculo que desea realizar:" << endl;
  cout << " 1) Sumar          2) Restar" << endl << " 3) Multiplicar    4) Dividir" << endl;

  bool repetir = false; // esta se corresponde con mala_opcion, el nombre y su uso no son para nada claros

  do // no tiene sentido comprobar "repetir" en la primera iteracion
  {
    int eleccion;
    cin >> eleccion;
    switch(eleccion)
    {
      case 1:
        int x, y;
        cout << endl << "Introduzca el valor 'x': " << endl;
cin >> x;
cout << "Introduzca el valor 'y': " << endl;
cin >> y;
sumar(x, y);
break;

      case 2:
        int x, y;
        cout << endl << "Introduzca el valor 'x': " << endl;
        cin >> x;
        cout << "Introduzca el valor 'y': " << endl;
        cin >> y;
        restar(x, y);
        break;

      case 3:
        int x, y;
        cout << endl << "Introduzca el valor 'x': " << endl;
        cin >> x;
        cout << "Introduzca el valor 'y': " << endl;
        cin >> y;
        multiplicar(x, y);
        break;

      case 4:
        int x, y;
        cout << endl << "Introduzca el valor 'x': " << endl;
        cin >> x;
        cout << "Introduzca el valor 'y': " << endl;
        cin >> y;
        dividir(x, y);
break;

      default:
        cout << endl << "Has introducido un comando incorrecto, vuelva a repetir." << endl;
        repetir = true;
        break;
    }
  }

  cin.get();
  return 0;
}

void sumar(int x, int y)
{
cout << endl <<  "Resultado de la Suma:  " << x + y << endl;
}

void restar(int x , int y){
cout << endl << "Resultado de la Resta:  " << x - y << endl;
}

void multiplicar(int x, int y){
cout << endl << "Resultado de la Multiplicacion:  " << x * y << endl;
}

void dividir(int x, int y){
  // Hay dos formas de hacer cast... estilo C y estilo C++:
  double dividendo, divisor;

  // Estilo C
  // Es mas inseguro y es mejor evitarlo... pero al principio es mas sencillo de usar
  dividendo = (double)x;
  divisor = (double)y;

  // Estilo C++
  // La opcion recomendada, aunque conviene revisar los diferentes tipos de casting que hay
  dividendo = static_cast< double >( x );
  divisor = static_cast< double >( y );

  cout << endl << "Resultado de la Division:  " << dividendo / divisor << endl;
}

Ditarex

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!

eferion

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

Buena suerte.