结对项目
这个作业属于哪个课程 | 软件工程2024 |
---|---|
这个作业要求在哪里 | 结对项目 |
这个作业的目标 | 1.让学生熟悉一个项目进行的流程; 2.熟悉使用PSP表格记录设计和记录过程; 3.熟悉用git管理项目代码 |
Github链接:GitHub仓库
姓名:姚佳如
学号:3222004642
姓名:李慧娣
学号:3222004637
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 30 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 20 |
Development | 开发 | 670 | 520 |
· Analysis | · 需求分析 (包括学习新技术) | 120 | 60 |
· Design Spec | · 生成设计文档 | 60 | 60 |
· Design Review | · 设计复审 | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 60 | 50 |
· Coding | · 具体编码 | 300 | 220 |
· Code Review | · 代码复审 | 30 | 40 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 50 |
Reporting | 报告 | 80 | 70 |
· Test Repor | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 30 |
· 合计 | 780 | 610 |
二、效能分析
优化性能:
-
srand((unsigned int)time(NULL)); 这行代码用于初始化随机数生成器。这样的初始化在每次循环中执行,可能会降低性能。将其移出循环可以提高性能。
-
再循环中的操作比较多,如果可能的话,减少循环次数或优化循环内部的计算。
-
优化文件写入操作,减少磁盘I/O次数或使用缓冲。
性能分析图如下:
三、设计实现
(一)完成的需求
1.使用 -n 参数控制生成题目的个数
2.使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围
3.生成的题目中计算过程不产生负数,即e1≥ e2
4.生成的题目中如果存在形如e1÷ e2的子表达式,那么其结果应是真分数
5.每道题目中出现的运算符个数不超过3个
6.生成的题目存入执行程序的当前目录下的question.txt文件
7.真分数在输入输出时采用如下格式,真分数五分之三表示为3/5,真分数二又八分之三表示为2'3/8
8.在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的answer.txt文件
9.程序应能支持一万道题目的生成
(二)设计
需求分析过后,我们认为项目大概可分为以下四个部分
-
随机数,随机运算符号的获取
-
四则运算题目的生成
-
各四则运算题目的计算
-
题目以及答案写入文件的操作
针对以上四个部分,我们设计了四个函数: int randomnum(int max)、 char randomchar()、 void writetofile (LinkList headpoint)、 void Awritetofile (LinkList headpoint) (关于题目生成以及计算在main函数中实现)
函数调用关系如下:
四、代码说明
- 使用特定datatype元素类型。
typedef struct{ /* 元素类型*/
int onenum;//算式的第一个数
char fuhao;//算式的符号
int twonum;//算式的第二个数
int key;//答案(直接存放整数答案或作为真分数的整数部分)
char fenhao;//真分数的单引号
int yushu;//分数的分子
char chuhao;//分数的除号
int chushu;//分数的分母
}DataType;
- 以下为计算部分,包含随机数输入、区分符号、计算、存入datatype元素类型
/*随机数输入*/
r_num1 = randomnum(r);
r_num2 = randomnum(r);
r_sign = randomchar();
if(r_sign == '-' ){//如果是减法
if(r_num1 < r_num2){//如果结果为负数,调换算式前后两式的数字,避免结果出现负数
int temp = r_num1;
r_num1 = r_num2;
r_num2 = temp;
}
daan.key = r_num1 - r_num2; //将结果存入元素结构,没有的设置为NULL,以下操作同样
daan.fenhao = NULL;
daan.yushu = NULL;
daan.chuhao = NULL;
daan.chushu = NULL;
}
else if(r_sign == '+')//如果是加法
{
daan.key = r_num1 + r_num2;
daan.fenhao = NULL;
daan.yushu = NULL;
daan.chuhao = NULL;
daan.chushu = NULL;
}
else if(r_sign == '*')//如果是乘法
{
daan.key = r_num1 * r_num2;
daan.fenhao = NULL;
daan.yushu = NULL;
daan.chuhao = NULL;
daan.chushu = NULL;
}
else if(r_sign == '/'){//如果是除法
daan.key = r_num1 % r_num2;
if(daan.key != 0){//如果结果有真分数,做特殊处理
daan.key = r_num1 / r_num2;
daan.fenhao = '\'';
daan.yushu = r_num1 % r_num2;
daan.chuhao = '/';
daan.chushu = r_num2;
}
}
五、测试运行
测试运行结果如下:
以上结果的文件输出结果如下:
六、项目小结
通过这次结对项目,熟悉了进行合作项目的流程,与独立完成项目不同的是,合作时需要沟通和交流,合理的沟通可以促进项目的进行。曲解和冲突在交流中不可避免时,最重要的是,每个人在合作中保持冷静、客观和换位思考。同时在项目合作中还要做好代码规范、合理分工、积极应对。