一、源代码地址:https://github.com/lqzlqzlqz/-2
二、 PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
||
· Estimate |
· 估计这个任务需要多少时间 |
12x60 | 18x60 |
Development |
开发 |
||
· Analysis |
· 需求分析 (包括学习新技术) |
6x60 |
6x60 |
· Design Spec |
· 生成设计文档 |
60 | 60 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 | 无 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 | 30 |
· Design |
· 具体设计 |
4x60 | 8x60 |
· Coding |
· 具体编码 |
6x60 | 12x60 |
· Code Review |
· 代码复审 |
30 | 30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 | 30 |
Reporting |
报告 |
30 | 30 |
· Test Report |
· 测试报告 |
60 | 60 |
· Size Measurement |
· 计算工作量 |
10 | 10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
60 | 60 |
合计 |
12x60 |
三、解题思路
看到这个题目我内心是崩溃的,因为之前关于c++的知识全部都忘记了,需要花一定时间去复习。在进行简单的复习后,根据老师的要求,形成了以下解题思路。
需要随机生成的运算符和运算数通过随机函数生成;通过构造分数结构体来生成包含分数的计算式;核对结果,先计算乘除后加减的方法较为合适;通过时间函数,计算答题时间来调整最后分数;题目的难度则根据运算符个数来判断,超过5个即为难,得附加分;在每次循环前通过srand((unsigned)time(NULL)),避免题目重复;题目所给的要求基本都能达到。
在具体实施前,将循环语句,if语句等可能会用到的语句复习一遍;再利用几个简单的c++小程序找回编程的感觉看到一大堆代码不会很烦;这中间比较难得应该是核对答案,要用计算机能看懂的方法来进行四则运算;最后将一些细节处理,比如具体加减分的规则。
三. 设计实现过程
1.在主函数前先定义函数方便计算:四则运算函数,求最大公约数函数,构造fengshu结构体。进入主函数,根据用户输入的题目数来产生相应的算式;接着进入一个主循环,先随机生成算式,再利用四则运算计算结果,最后核对结果,输出相应提示;主循环结束后输出本次测试的情况,再根据用户输入,判断是否结束测试。
2.结果核对。得到一个随机算式后,先计算乘除,将结果赋予算式右边的数,运算符变加法,最后进行加减法。
四、代码说明
1.构造fengshu结构体
fengshu jisuan(fengshu n1,fengshu n2 ,char op )
2.求最大公约数函数
int gys(int x, int y)
{
return y ? gys(y, x%y) : x;
}
3.四则运算函数
fengshu jisuan(fengshu n1,fengshu n2 ,char op )
{
fengshu jieguo;
switch (op) {
case ‘+‘: {
jieguo.a = n1.a*n2.b + n2.a*n1.b;
jieguo.b = n1.b*n2.b;
break;
}
case ‘-‘: {
jieguo.a = n1.a*n2.b - n2.a*n1.b;
jieguo.b = n1.b*n2.b;
break;
}
case ‘*‘: {
jieguo.a = n1.a*n2.a;
jieguo.b = n1.b*n2.b;
break;
}
case ‘/‘: {
jieguo.a = n1.a*n2.b;
jieguo.b = n1.b*n2.a;
break;
}
default: {
jieguo.a = 0;
jieguo.b = 1;
}
}
int t;
t = gys(jieguo.a, jieguo.b);
jieguo.a = jieguo.a / t;
jieguo.b = jieguo.b / t;//约分
return jieguo;
}
4.计算结果
五、测试运行
六、项目小结
这次作业的完成可以说是非常艰难的,因为之前学的也没有用心,基础不够扎实,虽然专门抽时间去学习和复习,但是一到编程序就会有各种小问题,导致整个程序运行不下去,这次的收获和总结如下:
1.看程序不慌了。一大堆代码出现在面前就心乱如麻,不知从何下手,但是结果这几天的苦练,看了不少代码,能够耐心地读下去,对以前的知识也忽想起一部分,看到代码没有之前那么没有头绪了。
2.学习东西以解决问题为导向。在做这个作业的时候,由于基本功不扎实,拿着以前的教材看了很久,这样效率不高,看完之后面对一堆代码也是心里没底,还不如直接分析这份作业的问题,去网上查找相关资料,看不懂的地方再返回来看书本,这样能节省很多时间。
3.在接下来的学习中还要加强c++基本知识的学习。在解决如何计算结果的时候,找到一个后缀计算法,思路能理解,但是具体的代码实现没有搞明白,照葫芦画瓢搬到自己程序上来,结果运行不了,花了很多时间也没有找到解决方法,在计算过程中进行了测试,输出结果不对,不知道是自己计算代码出问题?还是其他的参数或者函数定义有问题?后来换了一种简单的计算方法,还是不行,在确认自己计算的程序没问题后,返回去再看其他代码是不是写错了,最后发现是在定义四则运算函数时出了问题,之前是用了3个else if来进行不同情况的计算,换成switch语句后,输出结果就对了,虽然问题解决了,但是错在哪还是没搞明白。两种编法我都传到源代码地址了。
4.简单的问题也是一种锻炼。现在完成这次作业后,回头看,这个问题也不难嘛。解题思路没有出问题,在具体编写代码的过程中各种小问题不断,而且往往这种小疏漏也很难发现,翻来覆去地被这些小问题困扰,心情也变得很差,有的时候很难进展下去。经过折磨的几天,终于把作业交了,中间浪费的时间实在可惜,循环语句中控制循环的参数记错,给参数赋值的位置不对等等小问题,这也是基本功不扎实的表现,希望接下来继续学习,把为都解决了。