仓库:https://coding.net/u/librarian1/p/Calculate_Operations/git
- 目录
- 需求分析
- 功能设计
- 设计实现
- 算法详解
- 测试运行
- 代码展示
- 总结
- 展示PSP
1.需求分析
- 输入n,生成n道加减乘除
要求:数范围0~100 ,4-6个;运算符3~5个,至少2种 ;数与结果不出现负数和非整数,除数不为0。 - 附加:支持括号,大于2个但不超过运算符数 ;支持真分数的加减,自动化简 ;真分数2-3个,三哥时包括加减。
2.功能设计
- 基本功能
输入n ,判断合法
随机生成符合要求的算符和算子,计算结果并判断合法(正负和分母不为0),输出并生成文件result.txt,判断创建文件 。 - 扩展功能
随机产生带括号的正整数运算或真分数运算。
3.设计实现
4.算法详解
生成算子算符 —— 算结果并判断合法——生成算式(加括号)——输出
如何使用调度场算法
先随机生成一串算子(真分数或整数)和一串算符,存入两个链表
算子:A B C D
算符:x y z
2.算结果并判断合法
情况1:如果是真分数加减不用加括号
逐步计算出结果,一旦过程出现负数或分母为零,则跳出A x B y C z D (全是加减运算)
情况2:整数加减乘除,有优先级
逐步计算出结果,一旦过程出现负数或分母为零,则跳出A x B y C z D
注意:这其中会出现
A + B * C
从左至右的运算,但之后输出算式会是(A + B)* C
。
3.生成算式(加括号)
情况1:如果是真分数加减直接输出
情况2:整数加减乘除
设置2个整型priority1 ,priority2 对算子串中前后两个算子进行优先级判断,+
和-
为低优先级0,×
和/
为高优先级1。
如果priority1 ,priority2 为01
那么在两端加括号,否则00 10 11
则不加。
5.测试运行
6.代码展示
int priority1 = 0, priority2 = 0; // 加减乘除优先级
p = OperatorL.first;
q = CharaL.first;
String operation = p.data + "";
……
else //生成分数算式
{
while(!(q == null))
{
p = p.next;
String fchara = q.character;
priority1 = priority2 = 0;
if(!(q.next == null)) //如果不是最后一个算子,那么判断前后算子优先级
{
String lchara = q.next.character;
if(fchara == "+" || fchara == "-")
priority1 = 0;
else if(fchara == "*" || fchara == "/")
priority1 = 1;
if(lchara == "+" || lchara == "-")
priority2 = 0;
else if(lchara == "*" || lchara == "/")
priority2 = 1;
}
if(priority1 == 0 && priority2 == 1)
{
operation ="(" + operation + q.character
+ p.data + ")"; //低优先级在高优先级前,那么两边加括号
}
else
{
operation = operation + q.character + p.data;
}
q = q.next;
}
7.总结:
我在设计阶段大概画出了算法流程和类,所以编程的时候就先生成空方法和空类的框架,再具体的模块中输代码,其中需要多次调用的方法greatestcommondivisor和链表方法都单独列出,使代码简洁。这种自上而下的编程确实比逐步编程高效,但只有在比较复杂和庞大的项目中才得以体现。
8.展示PSP
任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|
计划 | 10 | 10 |
· 估计这个任务需要多少时间,并规划大致工作步骤 | 10 | 10 |
开发 | 440 | 860 |
· 需求分析 (包括学习新技术) | 20 | 30 |
· 生成设计文档 | 20 | 10 |
· 设计复审 (和同事审核设计文档) | 5 | 5 |
· 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· 具体设计 | 60 | 90 |
· 具体编码 | 240 | 540 |
· 代码复审 | 30 | 60 |
· 测试(自我测试,修改代码,提交修改) | 60 | 120 |
报告 | 25 | 12 |
· 测试报告 | 10 | 5 |
· 计算工作量 | 5 | 2 |
· 事后总结, 并提出过程改进计划 | 10 | 5 |
我在具体编码的时间和测试的时间比预计高出许多,但在这一过程中算法反而不是我编程过程中所遇到的难题,但是因为对编程不熟练,出现了很多编译错误,其中一个NullPointer的错误让我调试了一个多小时。
同时我也体会到了注释的重要性,如果注释了不确定或不理解的地方,那么debug的时候会省下大量的时间。