四则运算
| 博客班级 | 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
{
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
{
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
{
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(op2op1);
break;
case '/':
coll4.push(op2/op1); //注意是op2(op)op1而不是op1(op)op2
break;
}
}
}
}
int main()
{
deque
stack
deque
stack
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 |

浙公网安备 33010602011771号