es una calculadora de operaciones básicas con fracciones

Iniciado por HolyGrace, 19 Febrero 2018, 00:52 AM

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

HolyGrace

Hola a todos

Deseo que tengan un buen día, hoy estoy en busca de ayuda con un programa que estoy realizando en c++ (lo compilo con el programa Dev-C++) en fin, en visto alguno temas (la verdad pocos) sobre el bucle que se produce al ingresar un carácter en una variable, no se si me explique bien, el programa en general es una calculadora de operaciones básicas con fracciones, la condición es que en el menú del programa no acepte caracteres ni otras opciones que no aparezcan en el listado del menú. Pude ver en otro tema del foro la misma pregunta pero la verdad no entendí, espero me puedan ayudar, aquí dejo el código.

Código (cpp) [Seleccionar]
#include<iostream>
#include<math.h>
#include<conio.h>
#include<locale.h>

using namespace std;

int main()
{

setlocale(LC_CTYPE, "Spanish");
int opc;
float n1,d1,n2,d2,sum1,sum2,res1,res2,mul1,mul2,div1,div2,ans;

do{

system("cls");    //Funcion para limpiar la pantalla//

//Menú Principal//

cout<<"\t\t\t\tBIENVENIDO\n";
cout<<"\n¿Qué operación desea hacer?\n";
cout<<"\n1. Suma\n";
cout<<"2. Resta\n";
cout<<"3. Multiplicación\n";
cout<<"4. División\n";
cout<<"5. Salir\n\n";


cout<<"Elija una opción: ";cin>>opc;

system("cls");

switch(opc)
{
case 1:

cout<<"\nIntroduzca el valor del numerador de la primer fracción:\n";cin>>n1;
cout<<"Introduzca el valor del denominador de la primer fracción:\n";cin>>d1;
cout<<"Introduzca el valor del numerador de la segunda fracción:\n";cin>>n2;
cout<<"Introduzca el valor del denominador de la segunda fracción:\n";cin>>d2;

system("cls");

cout<<"El resultado de ";
cout<<n1;
cout<<"/";
cout<<d1;
cout<<" + ";
cout<<n2;
cout<<"/";
cout<<d2;
cout<<" es:\n";

if (d1 == d2){

sum1 = (n1 + n2);

cout<<"\nResultado en fracción:\n";
cout<<sum1<<"/"<<d1;

ans = sum1/d1;

cout<<"\n\nResultado de la división:\n";
cout<<ans;
cout<<"\n";

cout<<"Presione una tecla para volver al menu principal";
getch();

}
else if (d1 != d2){

sum1 = (n1*d2) + (d1*n2);
sum2 = d1*d2;

cout<<"\nResultado en fracción:\n";
cout<<sum1<<"/"<<sum2;

ans = sum1/sum2;

cout<<"\n\nResultado de la división:\n";
cout<<ans;
cout<<"\n";

cout<<"Presione una tecla para volver al menu principal";
getch();
}
break;

case 2:

cout<<"\nIntroduzca el valor del numerador de la primer fracción:\n";cin>>n1;
cout<<"Introduzca el valor del denominador de la primer fracción:\n";cin>>d1;
cout<<"Introduzca el valor del numerador de la segunda fracción:\n";cin>>n2;
cout<<"Introduzca el valor del denominador de la segunda fracción:\n";cin>>d2;

system("cls");

cout<<"El resultado de ";
cout<<n1;
cout<<"/";
cout<<d1;
cout<<" - ";
cout<<n2;
cout<<"/";
cout<<d2;
cout<<" es:\n";

if (d1 == d2){

res1 = (n1 - n2);

cout<<"\nResultado en fracción:\n";
cout<<res1<<"/"<<d1;

ans = res1/d1;

cout<<"\n\nResultado de la división:\n";
cout<<ans;
cout<<"\n";

cout<<"Presione una tecla para volver al menu principal";
getch();
}
else if (d1 != d2){

res1 = (n1*d2) - (d1*n2);
res2 = d1*d2;

cout<<"\nResultado en fracción:\n";
cout<<res1<<"/"<<res2;

ans = res1/res2;

cout<<"\n\nResultado de la división:\n";
cout<<ans;
cout<<"\n";

cout<<"Presione una tecla para volver al menu principal";
getch();
}
break;

case 3:

cout<<"\nIntroduzca el valor del numerador de la primer fracción:\n";cin>>n1;
cout<<"Introduzca el valor del denominador de la primer fracción:\n";cin>>d1;
cout<<"Introduzca el valor del numerador de la segunda fracción:\n";cin>>n2;
cout<<"Introduzca el valor del denominador de la segunda fracción:\n";cin>>d2;

system("cls");

cout<<"El resultado de ";
cout<<n1;
cout<<"/";
cout<<d1;
cout<<" * ";
cout<<n2;
cout<<"/";
cout<<d2;
cout<<" es:\n";

mul1 = n1*n2;
mul2 = d1*d2;

cout<<"\nResultado en fracción:\n";
cout<<mul1<<"/"<<mul2;

ans = mul1/mul2;

cout<<"\n\nResultado de la división:\n";
cout<<ans;
cout<<"\n";

cout<<"Presione una tecla para volver al menu principal";
getch();

break;

case 4:

cout<<"\nIntroduzca el valor del numerador de la primer fracción:\n";cin>>n1;
cout<<"Introduzca el valor del denominador de la primer fracción:\n";cin>>d1;
cout<<"Introduzca el valor del numerador de la segunda fracción:\n";cin>>n2;
cout<<"Introduzca el valor del denominador de la segunda fracción:\n";cin>>d2;

system("cls");

cout<<"El resultado de ";
cout<<n1;
cout<<"/";
cout<<d1;
cout<<" / ";
cout<<n2;
cout<<"/";
cout<<d2;
cout<<" es:\n";

div1 = n1*d2;
div2 = d1*n2;

cout<<"\nResultado en fracción:\n";
cout<<div1<<"/"<<div2;

ans = div1/div2;

cout<<"\n\nResultado de la división:\n";
cout<<ans;
cout<<"\n";

cout<<"Presione una tecla para volver al menu principal";
getch();

break;

case 5:

return 0;
break;

default:

cout<<"Opción Invalida\n";

system("pause");

}
}while (opc != 5);

}




· Los códigos deben ir en etiquetas GeSHi
· No se debe escribir en mayúsculas
· Los titulos deben ser descriptivos
>aquí las reglas del foro
-Engel Lex

MAFUS

Pon un ejemplos malo y qué es lo que esperas.

HolyGrace

Cita de: MAFUS en 19 Febrero 2018, 01:26 AM
Pon un ejemplos malo y qué es lo que esperas.

Que dices?

colcrt

podría en vez de salir del programa en el ultimo case retornarlo al menu con la opción goto

HolyGrace

#4
Mmm no te entiendo muy bien, me dices que modifique el último caso? Pero ese es para salír del programa

colcrt

ahora q lo pienso puedes dejar el case 5 como la salida del programa y el default que retorne al menu algo así

switch (variable) {
  case 2:
      Console.WriteLine("variable is >= 2");
      goto case 1;
  case 1:
      Console.WriteLine("variable is >= 1");
      break;
}

MAFUS

Digo que pongas una captura de pantalla del programa fallando o hagas un copia-pega del terminal. Para saber qué ocurre.

marcebond

#7
Lo tenías hecho, solo te faltaba el bucle, he refactorizado tu código y añadido el bucle

Código (cpp) [Seleccionar]

#include <iostream>
#include <string>
#include <locale.h>

using namespace std;

void leerOpcion(unsigned short* opcion) {
    cout
        << "Calculadora de fracciones" << endl << endl
        << "1. Suma" << endl
        << "2. Resta" << endl
        << "3. Multiplicación" << endl
        << "4. División" << endl
        << "0. Salir" << endl << endl
        << "Opción: ";
    cin >> *opcion;
}

void leerFraccion(float* numerador, float* denominador) {
    char separador;
    while (separador != '/') {
        cout << endl << "Fracción [numerador/denominador]: ";
        cin >> *numerador >> separador >> *denominador;
        if (separador != '/') {
            cout << "[ERROR] Se esperaba '/' como separador";
        }
    }
}

int main() {
    setlocale(LC_CTYPE, "Spanish");
    unsigned short opcion;
    float n1, d1, n2, d2, numerador, denominador;

    do {
        system("cls");
        leerOpcion(&opcion);

        if (opcion != 0) {
            cin.get();
            leerFraccion(&n1, &d1);
            cin.get();
            leerFraccion(&n2, &d2);
            switch (opcion) {
                case 1:
                    numerador = d1 == d2 ? n1 + n2 : d1 * d2 + d1 * n2;
                    denominador = d1 == d2 ? d1 : d1 * d2;
                    break;

                case 2:
                    numerador = d1 == d2 ? n1 - n2 : n1 * d2 - d1 * n2;
                    denominador = d1 == d2 ? d1 : d1 * d2;
                    break;

                case 3:
                    numerador = n1 * n2;
                    denominador = d1 * d2;
                    break;

                case 4:
                    numerador = n1 * d2;
                    denominador = d1 * n2;
                    break;
            }
            cout
                << "Resultado: " << numerador << "/" << denominador << endl
                << "División: " << numerador / denominador << endl
                << "Pulse una tecla para continuar...";
            cin.ignore();
            cin.get();
        }
    } while (opcion != 0);
}


Te sugiero no utilices conio, un saludo!