项目介绍:
- 我们这组选择了第二个项目——四则运算题目生成
- 经过我们组内的分析,我们认为这个项目更适合做成一款基于Unity3D的小游戏
- 由于我并不会Unity3D,所以该项目主要由队友完成,我只负责编写中缀表达式转后缀表达式以及对后缀表达式求值
注:以下部分仅介绍我完成的部分即中缀转后缀并求值
程序分析:
- 表达式的简单介绍
- 中缀表达式:<操作数><操作符><操作数>,例如:a+b
- 前缀表达式:<操作符><操作数><操作数>,例如:+ab
- 后缀表达式:<操作数><操作数><操作符>,例如:ab+
- 我们日常生活中所使用的的表达式都是中缀表达式,但对于编译程序来说,一般使用后缀表达式求值。因为用后缀表达式计算表达式的值,在计算过程中不需考虑操作符的优先级和括号,只需顺序处理表达式的操作符即可。所以我们有必要将中缀转换成后缀。而装换的关键在于个操作符优先级。
2、优先级的设定
操作符ch | ( | *,/,% | +,- | ) | ^ |
in | 1 | 5 | 5 | 3 | 6 |
out | 8 | 4 | 4 | 2 | 7 |
- 表中的in叫做栈内优先级,out叫做栈外优先级。栈外优先级与算术四则运算的优先级一致。一旦它进入操作符栈,它的优先级哟啊提高,以体现优先级相同的操作符先来的先做,就是说,在表达式中运算优先级相同的自左向右计算。就是站内优先级in。
- 左括号“(”的栈内优先级最高,它一来到立即进栈,但当它进入栈中后,其栈内优先级变得极低,以便括号内的其他操作符进栈。除它之外,其他操作符(除右括号“)”外)进入栈中后优先级都升1,这样可体现在中缀表达式中相同的优先级的操作符自左向右计算的要求,让位于栈顶的操作符先退栈并输出。
- 操作符优先级相等的情况只出现在“)”与栈内“(”括号配对时。它将连续退出位于栈顶的操作符,直到遇到“(”为止。然后将“)”退栈以对消括号。
- 右括号“)”的栈外优先级没有用。
int in(char a) //栈内优先级 { if(a=='#') return 0; else if(a=='(') return 1; else if(a=='+'||a=='-') return 3; else if(a=='*'||a=='/') return 5; else if(a=='^') return 6; //指数的栈内优先级要比栈外底。 else if(a==')') return 8; else return 0; }
int out(char a) //栈外优先级 { if(a=='#') return 0; else if(a=='(') return 8; else if(a=='^') return 7; else if(a=='*'||a=='/') return 4; else if(a=='+'||a=='-') return 2; else if(a==')') return 1; else return 0; }
附:PSP2.1表格
PSP2.1 | Personal Software Process Stages |
预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 60 | |
.Estimate | 估计这个任务需要多少时间 | 2000 | |
Development | 开发 | 200 | |
.Analysis | 需求分析(包括学习新技术) | 30 | |
.Design Spec | 生成设计文档 | 60 | |
.Design Review | 设计复审(和同事审核设计文档) | 60 | |
.Coding Standard | 代码规范(为目前的开发指定合适的规范) | 120 | |
.Design | 具体设计 | 60 | |
.Coding | 具体编码 | 200 | |
.00Coed Review | 代码复审 | 30 | |
.Test | 测试(自我测试,修改代码,提交修改) | 60 | |
Reporting | 报告 | 60 | |
.Test Report | 测试报告 | 30 | |
.Size Measurement | 计算工作量 | 30 | |
.Postmortem & Process Improvement Plan |
事后总结,并提出过程改进计划 | 30 | |
合计 | 3030 |