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:
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...
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:
#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;
}