Как сделать так, чтобы калькулятор выводил полное выражение после вычисления ответа? - PullRequest
0 голосов
/ 06 октября 2018

Я создаю калькулятор для класса C ++ и пытаюсь вывести полное уравнение вместо того, чтобы программа выкладывала ответ.Мне трудно понять, как это изменить в каждом случае.Я экспериментировал с утверждением if, но в итоге это не сработало.Любая критика приветствуется в моем коде, но я ищу относительно простое решение, чтобы я мог вывести полное уравнение, а не просто ответ, чтобы создать более удобный для пользователя опыт.

Вот мой код:

#include "pch.h"
#include <iostream>
#define _USE_MATH_DEFINES
#include <cmath>
#include <math.h>

using namespace std;

//---------- Function Prototypes -----------
void print_menu();
double get_value();
double divide(double, double);
double subtraction(double, double);
double multiplication(double, double);
double SARCC(double, double);
double VolRCC(double, double);
double SARCCone(double, double);
void ShowProgramHeader();

//--------------  Main -------------------
int main() {
    ShowProgramHeader();
    double operand1, operand2, answer;
    int choice, valid_choice;
    do {
        print_menu();
        cin >> choice;
        valid_choice = 1;           // assume choice is valid
        switch (choice) {
        case 0:                    // program will exit
            break;
        case 1:                    // addition
            operand1 = get_value();
            operand2 = get_value();
            answer = operand1 + operand2;
            break;
        case 2:                    // division
            operand1 = get_value();
            operand2 = get_value();
            answer = divide(operand1, operand2);
            break;
        case 3: // subtraction
            operand1 = get_value();
            operand2 = get_value();
            answer = subtraction(operand1, operand2);
            break;
        case 4: // multiplication
            operand1 = get_value();
            operand2 = get_value();
            answer = multiplication(operand1, operand2);
            break;
        case 5: // SA right circular cylinder
            operand1 = get_value();
            operand2 = get_value();
            answer = SARCC(operand1, operand2);
            break;
        case 6: // Vol. right circular cylinder
            operand1 = get_value();
            operand2 = get_value();
            answer = VolRCC(operand1, operand2);
            break;
        case 7: // SA right circular cone
            operand1 = get_value();
            operand2 = get_value();
            answer = SARCCone(operand1, operand2);
            break;
        default:
            valid_choice = 0;   // choice is invalid
            cout << "Invalid Choice." << endl;  
        }
        if (valid_choice) {   // if choice is valid, print the answer
                cout << endl << "Answer= " << answer  <<  endl;
        }
    } while (choice != 0);    // if not 0, loop back to start
    return 0;
}

//--------------  Functions -------------------

//----------------- get_value function ----------------
double get_value() {
    double temp_value;
    cout << "Please, enter a value: ";
    cin >> temp_value;
    cout << "Thanks." << endl;
    return temp_value;
}
//-------------------- print_menu function -------------
void print_menu() {
    cout << endl;
    cout << "Add (1)" << endl;
    cout << "Divide (2)" << endl;
    cout << "Subtract (3)" << endl;
    cout << "Multiply (4)" << endl;
    cout << "Surface Area of Right Circular Cylinder (5)" << endl;
    cout << "Volume of Right Circular Cylinder (6)" << endl;
    cout << "Surface Area of Right Circular Cone (7)" << endl;
    cout << "Exit (0)" << endl;
    cout << "Enter your choice: ";
}
//---------- Show Program Header function ----------
void ShowProgramHeader() {
    cout << "Grant Dearing" << "\n" << "CS120-02" << "\n" << "Lab 6" << "\n" << "5 October 2018" << endl;
}
//----------- Subtraction Function --------------
double subtraction(double subtractor, double subtractee) {
    return (subtractee - subtractor);
}
//----------- Multiplication Function ---------
double multiplication(double multiplier1, double multiplier2) {
    return (multiplier1 * multiplier2);
}
//----------- Divison Function ---------
double divide(double dividend, double divisor) {
    if (divisor == 0) {
        return 0;  // avoids divide by zero errors
    }
    else 
        return (dividend / divisor);
    }
//---------- SA Right Circular Cylinder --------
double SARCC(double radius, double height) {
        return ((2 * M_PI*radius*height) + (2 * M_PI*pow(radius, 2)));
}
//--------- Vol Right Circular Cylinder --------
double VolRCC(double radius, double height) {
    return (M_PI*pow(radius, 2)*height);
}
//---------- SA Right Circular Cone --------
double SARCCone(double radius, double height) {
    return ((M_PI*radius)*(radius + (sqrt(pow(height, 2) + pow(radius, 2)))));
}

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Простой способ решить эту проблему - получить большое значение cout << var1 << ' + ' << var2 << ' = ' << answer << endl; для каждого вида вычислений, который может выполнять ваш калькулятор.Это может занять довольно много времени, когда вы делаете площадь поверхности конуса или чего-то еще, и есть риск, что формула, которую вы говорите, что вы оцениваете, и формула, которую вы на самом деле оцениваете, могут не совпадать, если вы допустите ошибку.

Правильный способ решения этой проблемы, вероятно, заключается в использовании системы дерева выражений .У вас будет класс (ExpressionNode), представляющий экземпляр операции, такой как сложение, деление или возведение в степень, или просто буквальное число, например 5 или Pi.У этого класса будет метод для вычисления выражения, которое он представляет, и для возврата double, при необходимости сначала вычисляя левый и правый аргументы операции.У него также будет метод печать выражения, которое оно представляет, либо печать числа, если оно является просто числом, либо печать левого аргумента '+', а затем правого аргумента, если он представляетсложение и т. д.

Тогда ваши различные функции калькулятора будут принимать входные данные и возвращать не окончательные вычисленные значения, а деревья выражений, представляющие, как вычислять эти значения, а основной цикл выводит выражение, которое вычисляетответьте, а затем оцените его и напечатайте результат.

Если вы не хотите реализовывать все это самостоятельно, библиотека Boost предоставляет библиотеку "Proto" , которая дает вам деревья выражений испособы их оценки, но его документация предполагает, что вы знаете кое-что о том, как работает синтаксический анализ выражений в деревьях выражений, что такое «терминалы» и так далее.Но в их уроке есть пример калькулятора.

0 голосов
/ 06 октября 2018

Кроме того, попробуйте что-то вроде

   case 1:                    // addition
        operand1 = get_value();
        operand2 = get_value();
        answer = operand1 + operand2;
        cout << operand1 << " + " << operand2 << " = " << answer << endl;
        break;

Затем просто сделайте то же самое для всех остальных случаев и удалите строку cout << endl << "Answer= " << answer << endl;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...