四则运算

博客班级 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18
作业要求 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11377
作业目标 <能生成四则运算题目吗,提高编程能力>
学号 <3180701319>

二.题目要求

写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:

1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24

2)程序要求能处理用户的输入,判断对错,累积分数

3)程序支持可以由用户自行选择加、减、乘、除运算

4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目

三、代码提交与运行截图.
1)提交你的源代码在你的博客上,注释好各个函数,给出相应解释,并把运行成功的界面粘贴到博客上;

2)要求逻辑清晰,界面整洁
1.源代码:

include

include

include

include

using namespace std;

bool isPra(char c)
{
if(c'('||c')')
return true;
else
return false;
}

int getPri(char c)
{
switch(c)
{
case '+':
case '-':
return 0; //如果是加减,返回0
break;
case '*':
case '/':
return 1; //如果是乘除,返回1
break;
case '(':
case ')':
return -1; //注意,这里将括号设为最低优先级,因此括号不会被弹出,除非遇到右括号
break;
}
}

void check(char c, stack& coll2, deque& coll3)
{
if(coll2.empty())
{
coll2.push(c);
return;
}

if(isPra(c))
{
if(c=='(')
coll2.push(c);
else
{

while(coll2.top()!='(')
{
char ch = coll2.top();
coll3.push_back(ch);
coll2.pop();
}

coll2.pop();
}
}
else
{

char sym = coll2.top();

//比较两符号的优先性
if(getPri(c)<=getPri(sym))
{
//如果c的优先性比栈顶符号小或等于,弹出栈顶元素
coll2.pop();
//并将其压入coll3(后缀表达式)中
coll3.push_back(sym);
//递归调用check,比较当前符号c与下一个栈顶符号的优先性
check(c,coll2,coll3);
}
else
{
//如果c比栈顶符号优先级大,那将c压入coll2(操作符栈)中
coll2.push(c);
}
}
}

//从coll中取出元素,分配元素到coll2和coll3中
void allocate(deque& coll1, stack& coll2, deque& coll3)
{
while(!coll1.empty())
{
char c = coll1.front();
coll1.pop_front();

if(c>='0'&&c<='9')
{
coll3.push_back(c);
}
else
{
//调用check函数,针对不同情况作出不同操作
check(c,coll2,coll3);
}

}

//如果输入结束,将coll2的元素全部弹出,加入后缀表达式中
while(!coll2.empty())
{
char c = coll2.top();
coll3.push_back(c);
coll2.pop();
}
}

//计算后缀表达式
void calculate(deque& coll3, stack& coll4)
{
while(!coll3.empty())
{
char c = coll3.front();
coll3.pop_front();

//如果是操作数,压入栈中
if(c>='0'&&c<='9')
{
//减去'0'得出偏移值,即为真实数值(如果直接转换成int,结果不对,因为char 转换为int是其编码值,例如'1'的编码值为49
int op = c-'0';
coll4.push(op);
}
else //如果是操作符,从栈中弹出元素进行计算
{
int op1 = coll4.top();
coll4.pop();
int op2 = coll4.top();
coll4.pop();
switch(c)
{
case '+':
coll4.push(op2+op1);
break;
case '-':
coll4.push(op2-op1);
break;
case '':
coll4.push(op2
op1);
break;
case '/':
coll4.push(op2/op1); //注意是op2(op)op1而不是op1(op)op2
break;
}
}
}
}

int main()
{
deque coll1; //盛放中缀表达式
stack coll2; //盛放操作符
deque coll3; //盛放后缀表达式
stackcoll4; //计算后缀表达式的辅助容器
string str;
cout<<"请输入表达式,按enter结束:"<<endl;
cin>>str;
for(int i=0;i!=str.size();++i)
{
//逐一加入每个字符,这里使用deque因为deque在两端删除添加的速度最快
coll1.push_back(str[i]);
}

//从coll中取出元素,分配元素到coll2和coll3中
allocate(coll1,coll2,coll3);

//计算后缀表达式
calculate(coll3,coll4);
cout<<"计算结果为:"<<coll4.top()<<endl;
}
2.运行截图:

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 180 120
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 150 130
Development 开发 130 150
Analysis 需求分析(包括学习新技术) 170 90
Design Spec 生成设计文档 60 30
Design Review 设计复审 50 30
Coding Standard 代码规范 60 20
Design 具体设计 120 80
Coding 具体编码 60 130
Code Review 代码复审 60 50
Test 测试(自我测试,修改代码,提交修改) 30 40
Reporting 报告 50 70
Test Report 测试报告 60 40
Size Measurement 计算工作量 20 10
Postmortem & Process Improvement Plan Improvement Plan 事后总结,并提出过程改进计划 30 40
posted @ 2020-11-08 16:10  彦祖的爷爷  阅读(115)  评论(0)    收藏  举报