计算器2,可以多数计算
2026-10-15 20:05:47
发布于:广东
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
double jia(double ji1,double ji2){
return ji1+ji2;
}
double jian(double ji1,double ji2){
return ji1-ji2;
}
double cheng(double ji1,double ji2){
return ji1*ji2;
}
double chu(double ji1,double ji2){
if(ji2==0){
cout<<"除数不能为0"<<endl;
return 0;
}
return ji1/ji2;
}
double mu(double ji1,double ji2){
double q=1;
int exp = static_cast<int>(ji2);
for(int i=1;i<=exp;i++){
q=q*ji1;
}
return q;
}
double abs_val(double x){
if(x < 0)
return -x;
else
return x;
}
const int MAX=100;
double numStack[MAX]; //数字栈
char opStack[MAX]; //运算符栈
int numTop = -1;
int opTop = -1;
//数字栈操作
void numPush(double x){ numStack[++numTop]=x; }
double numPop(){ return numStack[numTop--]; }
//符号栈操作
void opPush(char c){ opStack[++opTop]=c; }
char opPop(){ return opStack[opTop--]; }
//取栈顶
char getOpTop(){ return opStack[opTop]; }
//运算符优先级
int priority(char op)
{
if(op == '(') return 0;
if(op == '+' || op == '-') return 1;
if(op == '*' || op == '/') return 2;
if(op == '.') return 3; //幂运算 . 优先级最高
return -1;
}
//调用你写好的四则、幂函数
double calc(double a,double b,char op)
{
switch(op)
{
case '+': return jia(a,b);
case '-': return jian(a,b);
case '*': return cheng(a,b);
case '/': return chu(a,b);
case '.': return mu(a,b);
default: return 0;
}
}
//表达式求值函数(数组栈实现,修复幂右结合,修复负号)
double eval(string s)
{
//每次计算前重置栈!重要
numTop = -1;
opTop = -1;
int i=0;
int len = s.size();
while(i<len)
{
char ch = s[i];
if(ch == ' ') {i++;continue;}
//======== 处理负号:两种情况 (1)开头负号 (2)左括号后面的负号 ========
if(ch == '-')
{
if( i == 0 || s[i-1] == '(' )
{
i++;
//读取负数
double num = 0;
int dot = 0;
double frac = 1;
while(i<len && ((s[i]>='0'&&s[i]<='9') || s[i]=='.'))
{
if(s[i]=='.')
{
dot = 1;
}
else
{
if(!dot)
num = num*10 + (s[i]-'0');
else
{
frac /=10;
num += (s[i]-'0') * frac;
}
}
i++;
}
numPush(-num);
continue;
}
}
//读取数字(小数也支持)
if( (ch>='0'&&ch<='9') || ch == '.' )
{
double num = 0;
int dot = 0;
double frac = 1;
while(i<len && ((s[i]>='0'&&s[i]<='9') || s[i]=='.'))
{
if(s[i]=='.')
{
dot = 1;
}
else
{
if(!dot)
num = num*10 + (s[i]-'0');
else
{
frac /=10;
num += (s[i]-'0') * frac;
}
}
i++;
}
numPush(num);
continue;
}
if(ch == '(')
{
opPush(ch);
i++;
}
else if(ch == ')')
{
//遇到右括号,计算直到左括号
while(getOpTop() != '(')
{
char op = opPop();
double b = numPop();
double a = numPop();
numPush(calc(a,b,op));
}
opPop(); //弹出左括号
i++;
}
else //运算符 + - * / .
{
// 幂运算是右结合:priority(getOpTop()) > current,其他左结合 >=
while(opTop != -1 )
{
char topOp = getOpTop();
if( topOp == '.' )
{
if( priority(topOp) > priority(ch) )
{
char op = opPop();
double b = numPop();
double a = numPop();
numPush(calc(a,b,op));
}
else break;
}
else
{
if( priority(topOp) >= priority(ch) )
{
char op = opPop();
double b = numPop();
double a = numPop();
numPush(calc(a,b,op));
}
else break;
}
}
opPush(ch);
i++;
}
}
//剩余运算符全部计算
while(opTop != -1)
{
char op = opPop();
double b = numPop();
double a = numPop();
numPush(calc(a,b,op));
}
return numStack[numTop];
}
//===== main部分保持原样 =====
int main(){
cout << fixed << setprecision(4);
char op;
double ji1,ji2;
//【只输出一次总提示】
cout<<"====计算器===="<<endl;
cout<<"普通计算:数字 运算符 数字"<<endl;
cout<<"绝对值:| 数字"<<endl;
cout<<"输入w进入多数表达式计算,q退出整个程序"<<endl;
while(true)
{
cout<<"\n请输入:";
cin >> op;
if(op == 'q'){
break;
}
if(op == '|'){
cin >> ji1;
cout << abs_val(ji1) << endl;
}
else if(op == 'w')
{
cin.ignore(); //吃掉换行符
string expr;
cout<<"-----多数表达式模式(支持括号,幂用英文.,输入e退出此模式)-----"<<endl;
while(true)
{
cout<<"表达式>";
getline(cin, expr);
if(expr == "e") //输入e退出多数计算,回到主菜单
{
cout<<"退出多数计算模式"<<endl;
break;
}
if(expr.empty()) continue;
double res = eval(expr);
cout<<"结果 = "<< res << endl;
}
}
else
{
cin.putback(op);
if( cin >> ji1 >> op >> ji2 )
{
if(op == '+'){
cout<<jia(ji1,ji2);
}
else if(op == '-'){
cout<<jian(ji1,ji2);
}
else if(op == '*'){
cout<<cheng(ji1,ji2);
}
else if(op == '/'){
cout<<chu(ji1,ji2);
}
else if(op == '.'){
cout<<mu(ji1,ji2);
}
else{
cout<<"未知运算符!";
}
cout << endl;
}
else{
cin.clear();
cin.ignore(1024,'\n');
cout << "输入格式错误!" << endl;
}
}
}
cout<<"程序结束"<<endl;
return 0;
}
这里空空如也












有帮助,赞一个