下面是使用纯代码做的计算器,输入输出都在控制台,没有制作界面,算法就是递归下降分析算法,直接输入算式即可,如1+1
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
// 定义全局变量,用于指向当前正在解析的字符
char* expr;
// 解析表达式
double parseExpression();
// 解析项
double parseTerm();
// 解析因子
double parseFactor();
// 解析数字
double parseNumber();
// 解析表达式
double parseExpression()
{
// 解析左边的项
double left = parseTerm();
// 如果当前字符是加号或减号,则继续解析
while (*expr == '+' || *expr == '-')
{
// 取出运算符
char op = *expr++;
// 解析右边的项
double right = parseTerm();
// 根据运算符的类型进行计算
if (op == '+')
{
left += right;
}
else
{
left -= right;
}
}
// 返回计算结果
return left;
}
// 解析项
double parseTerm()
{
// 解析左边的因子
double left = parseFactor();
// 如果当前字符是乘号或除号,则继续解析
while (*expr == '*' || *expr == '/')
{
// 取出运算符
char op = *expr++;
// 解析右边的因子
double right = parseFactor();
// 根据运算符的类型进行计算
if (op == '*')
{
left *= right;
}
else
{
left /= right;
}
}
// 返回计算结果
return left;
}
// 解析因子
double parseFactor()
{
double result;
// 如果当前字符是左括号,则解析括号内的表达式
if (*expr == '(')
{
// 跳过左括号
expr++;
// 解析括号内的表达式
result = parseExpression();
// 跳过右括号
expr++;
}
// 如果当前字符是数字,则解析数字
else if (isdigit(*expr) || *expr == '.')
{
result = parseNumber();
}
// 如果当前字符是负号,则解析负号后面的因子
else if (*expr == '-')
{
// 跳过负号
expr++;
// 解析负号后面的因子
result = -parseFactor();
}
// 如果当前字符是正号,则解析正号后面的因子
else if (*expr == '+')
{
// 跳过正号
expr++;
// 解析正号后面的因子
result = parseFactor();
}
// 如果当前字符既不是括号也不是数字,则报错
else
{
cout << "Error: invalid expression" << endl;
exit(1);
}
// 如果当前字符是乘方运算符,则解析乘方运算
if (*expr == '^')
{
// 跳过乘方运算符
expr++;
// 解析乘方运算的底数
result = pow(result, parseFactor());
}
// 如果当前字符是开方运算符,则解析开方运算
else if (*expr == '√')
{
// 跳过开方运算符
expr++;
// 解析开方运算的底数
result = sqrt(parseFactor());
}
// 返回计算结果
return result;
}
// 解析数字
double parseNumber()
{
// 存储解析的结果
double result = 0.0;
// 存储小数位的分母
double divisor = 1.0;
// 标记数字是否是负数
bool negative = false;
// 如果当前字符是负号,则设置标记
if (*expr == '-')
{
negative = true;
// 跳过负号
expr++;
}
// 如果当前字符是正号,则跳过正号
else if (*expr == '+')
{
expr++;
}
// 循环解析数字的每一位
while (isdigit(*expr))
{
// 将当前数字加入到结果中
result = result * 10 + (*expr++ - '0');
}
// 如果当前字符是小数点,则继续解析小数部分
if (*expr == '.')
{
// 跳过小数点
expr++;
// 循环解析小数的每一位
while (isdigit(*expr))
{
// 将当前数字加入到结果中
result = result * 10 + (*expr++ - '0');
// 将分母乘以 10
divisor *= 10;
}
}
// 将小数部分除回去
result /= divisor;
// 如果数字是负数,则取负
if (negative)
{
result = -result;
}
// 返回计算结果
return result;
}
int main()
{
// 读入表达式
char s[100];
cout << "输入表达式: ";
cin >> s;
// 解析表达式
expr = s;
double result = parseExpression();
// 输出结果
cout << "计算结果: " << result << endl;
return 0;
}
下面是运行界面
输入要计算的算式然后回车