C++實(shí)現(xiàn)多功能計(jì)算器
在現(xiàn)代編程實(shí)踐中,C++以其高效性、可擴(kuò)展性和面向?qū)ο蟮奶匦员粡V泛應(yīng)用。本文旨在介紹如何使用C++編寫一個(gè)功能更加豐富的計(jì)算器程序,該程序不僅能夠執(zhí)行基本的數(shù)學(xué)運(yùn)算,還能處理更復(fù)雜的表達(dá)式,并提供用戶友好的交互界面。
一、功能設(shè)計(jì)
多功能計(jì)算器將包含以下特性:
- 支持加、減、乘、除四則運(yùn)算。
- 支持括號(hào),以處理運(yùn)算優(yōu)先級(jí)。
- 提供用戶輸入驗(yàn)證,確保輸入的表達(dá)式合法。
- 支持連續(xù)運(yùn)算,即用戶可以在一次輸入中完成多個(gè)運(yùn)算。
- 顯示運(yùn)算結(jié)果和可能的錯(cuò)誤信息。
二、代碼實(shí)現(xiàn)
為了實(shí)現(xiàn)上述功能,我們需要編寫一個(gè)能夠解析和計(jì)算數(shù)學(xué)表達(dá)式的程序。下面是一個(gè)簡(jiǎn)化版的C++多功能計(jì)算器程序:
#include <iostream>
#include <stack>
#include <cctype>
#include <sstream>
using namespace std;
double compute(double a, double b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return (b != 0) ? a / b : throw invalid_argument("除數(shù)不能為0");
default: throw invalid_argument("無(wú)效的運(yùn)算符");
}
}
double evaluateExpression(string s) {
stack<double> values;
stack<char> ops;
for (size_t i = 0; i < s.size(); ++i) {
if (isdigit(s[i])) {
size_t j = i;
while (j < s.size() && (isdigit(s[j]) || s[j] == '.')) j++;
double value = stod(s.substr(i, j - i));
values.push(value);
i = j - 1;
} else if (s[i] == ' ') {
continue;
} else if (s[i] == '(') {
ops.push(s[i]);
} else if (s[i] == ')') {
while (!ops.empty() && ops.top() != '(') {
double val2 = values.top(); values.pop();
double val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
values.push(compute(val1, val2, op));
}
if (!ops.empty()) ops.pop(); // 彈出'('
} else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
while (!ops.empty() &&
(s[i] == '+' || s[i] == '-' ||
(s[i] == '*' || s[i] == '/') && (ops.top() == '*' || ops.top() == '/'))) {
double val2 = values.top(); values.pop();
double val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
values.push(compute(val1, val2, op));
}
ops.push(s[i]);
}
}
while (!ops.empty()) {
double val2 = values.top(); values.pop();
double val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
values.push(compute(val1, val2, op));
}
return values.top();
}
int main() {
string expression;
cout << "請(qǐng)輸入一個(gè)數(shù)學(xué)表達(dá)式: ";
getline(cin, expression);
try {
double result = evaluateExpression(expression);
cout << "結(jié)果是: " << result << endl;
} catch (const invalid_argument& e) {
cout << "錯(cuò)誤: " << e.what() << endl;
}
return 0;
}
三、代碼解析
- compute函數(shù):執(zhí)行基本的數(shù)學(xué)運(yùn)算。它接收兩個(gè)double類型的操作數(shù)和一個(gè)char類型的運(yùn)算符,然后根據(jù)運(yùn)算符執(zhí)行相應(yīng)的運(yùn)算并返回結(jié)果。
- evaluateExpression函數(shù):使用兩個(gè)棧,一個(gè)用于值,一個(gè)用于運(yùn)算符,來(lái)實(shí)現(xiàn)表達(dá)式求值。該函數(shù)按照運(yùn)算符的優(yōu)先級(jí)處理表達(dá)式,并正確處理括號(hào)。
- main函數(shù):程序的入口點(diǎn)。它首先提示用戶輸入一個(gè)數(shù)學(xué)表達(dá)式,然后調(diào)用evaluateExpression函數(shù)計(jì)算表達(dá)式的結(jié)果,并將結(jié)果打印到屏幕上。如果在計(jì)算過(guò)程中發(fā)生錯(cuò)誤,程序會(huì)捕獲異常并顯示錯(cuò)誤信息。
四、程序運(yùn)行
用戶可以在控制臺(tái)中輸入一個(gè)數(shù)學(xué)表達(dá)式,例如 "3 + 4 * (2 - 1) / 5",然后程序會(huì)計(jì)算表達(dá)式的結(jié)果并顯示。如果用戶輸入了一個(gè)無(wú)效的表達(dá)式,程序會(huì)顯示一個(gè)錯(cuò)誤信息。
五、結(jié)論
這個(gè)C++多功能計(jì)算器程序展示了如何使用棧來(lái)處理復(fù)雜的數(shù)學(xué)表達(dá)式,并提供了用戶友好的交互界面。通過(guò)擴(kuò)展這個(gè)程序,可以添加更多的功能,比如支持更多的數(shù)學(xué)函數(shù)、提供圖形用戶界面等。