一、版本控制
git地址:https://git.coding.net/liu-xin/arithmetic.git
二、需求分析
1.控制台输入参数n控制四则运算题目的数量。
2.随机生成四则运算题目,运算符分别使用符号+-*÷来表示。
3.随机生成数字在 0 和 100 之间,随机生成运算符在3个到5个之间。
4.每个练习题要包含2种以上运算符,计算结果不得出现负数与非整数。
5.题目和答案按格式输出在“result.txt”中,文件目录与程序目录一致。
6.输出格式:
学号
题目=答案
7.(附加题)支持随机生成有括号的运算式,并求得正确解。其中括号数量必须大于2对,小于运算符个数。
8.(拓展题)支持真分数的随机生成题目和结果计算。注意:真分数应自动化简为最简形式。
三、功能设计
1.基本功能:支持控制台输入参数,从而控制随机生成题目数量,输出到与此时.exe文件路径相同的“result.txt”文件中,输出内容为学号、题目和答案。
2.扩展功能:1)输出到“result.txt”内容更具有可读性,分别标注序号。
2)设计模式二,若是输入两个参数可实现软件交互性:随机生成题目,手动输入结果,对结果进行反馈,判断对错,错了给出正确答案。
3)基于模式二的基础上实现题目统计:答对题目x道,一共有题目t道。
四.设计实现:
我将每一个功能实现都用函数写,主函数进行调用,提升了代码的易改、可读性。具体设计如下:
1)建立栈结构体。
2)利用栈进行数字与运算符的存储与计算操作。
3)利用rand()生成随机数和运算符。
4)判断运算符优先级时,为优先级编码赋值更容易进行比较。
5)用StrReplace(char strRes[],char from[], char to[])函数将 "/"转化为"÷"。(但是在后来的使用中,我采用直接输出方式,没用到的此函数,就直接删除掉了。)
6)利用重定向进行“result.txt”文件输出。
五、算法详解
1.生成随机数:
用rand()函数进行随机数生成的时候,应该先声明srand((unsigned)time(NULL));用来生成真正的不重复的随机数,否则就会生成伪随机数,即出现相同数字的情况。要想实现生成不同的随机数,就需要使srand()函数设置不同的种子,我们知道时间是一直在改变的,所以我们可以通过利用计算机不同的时间来获得不同的种子。time(NULL)返回的是系统的时间,从1970.1.1零点零分算起,单位为秒,所以会生成不同随机数,注意:调用时需要用time.h头文件。具体代码如下:
随机数生成:
//获取随机数函数: int getnum() { int n; n =rand()%100; //对100取余操作 srand((unsigned)time(NULL));//srand()就是给rand()提供种子seed return n; }
获取随机运算符
//获取随机运算符函数 char getsign() { char signal[4]={'+','-','*','/'}; return signal[rand()%4]; }
2.判断优先级
判断优先级的时候,我为运算符赋值,将字符型转化为整型更容易判断比较。
//判断优先级 int get_pri(int ope) { switch(ope) { case '(': return 0; case '+': case '-': return 1; case '*': case '/': return 2; default : return -1; } }
3.控制台实现文件输出
int main(int argc,char *argv[]) { //srand((unsigned)time(NULL)); srand(time(0)); int total; char in[200]; char out[200]; getcwd(in, sizeof(in)); //获取本地文件直接地址 strcat(in, "\\"); strcpy(out, in); strcat(out, "result.txt"); freopen(out, "w", stdout); // freopen重定向使输出到out.txt中 scanf("%d",&total); printf("2018103000\n"); f1(total); return 0; }
六、测试运行
1.基本功能
我将可执行文件放在桌面进行测试,命名为1.exe(单纯只是为了自己测试运行的时候方便)。打开控制台输入文件名1,进入到文件中,输入4,随机生成5个题目和正确结果在“result.txt”中。
2.基本功能优化:
输出到“result.txt”内容更具有可读性,分别标注序号。
3.拓展功能:答题测评
控制台输入.exe的名字(1.exe),输入空格,接着输入2,代表模式二,输入生成题目数量,进行答题功能。
七、总结
本次设计模块化原则主要通过通过功能写函数实现,利用不同函数将不同功能进行实现,逻辑清晰,易读易改。在本次软件设计中遇到了很多困难,比如创建栈,随机生成表达式,字符转换,控制台输入,文件输出等,虽然刚开始觉得自己不可能完成,但随着自己网上学习的过程中,难点逐一突破后,自己渐渐在遇到问题时,不是选择逃避,而是进行问题攻克。这次作业不仅锻炼了自己的代码能力,更培养了自己学习兴趣。
八、PSP
PSP | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 60 | 67 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 60 | 67 |
Development | 开发 | 1050 | 1417 |
Analysis | 需求分析 (包括学习新技术) | 180 | 245 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 27 |
Design | 具体设计 | 60 | 138 |
Coding | 具体编码 | 480 | 597 |
Code Review | 代码复审 | 120 | 211 |
Test | 测试(自我测试,修改代码,提交修改) | 180 | 199 |
Reporting | 报告 | 180 | 206 |
Test Report | 测试报告 | 60 | 72 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 120 | 134 |