扩展要求:题目含有可嵌套绝对值符号
作业完成人:熊丰(D23382405),周帆(D23382401)
目录:
1.代码仓库地址
SZYS: 四则运算 (gitee.com)
2.成员分工
熊丰最主要完成四则运算结对项目的代码编程,周帆编制PSP表格,并对表格进行分析,同时完成相对应的学习日志。
3.PSP表格与分析
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 80 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 80 | 60 |
Development | 开发 | 240 | 210 |
· Analysis | · 需求分析 (包括学习新技术) | 40 | 30 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 20 |
· Design | · 具体设计 | 40 | 40 |
· Coding | · 具体编码 | 40 | 30 |
· Code Review | · 代码复审 | 20 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 10 | 10 |
Reporting | 报告 | 100 | 90 |
· Test Repor | · 测试报告 | 40 | 30 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 40 |
合计 | 420 | 360 |
分析:在Planning阶段,估计耗时为80分钟,实际耗时为60分钟。估计值与真实值之间存在20分钟的差异。因为在实际执行过程中,一些计划中的任务完成得更加高效,在估计时未考虑到某些影响因素。
在Development阶段,估计耗时为240分钟,实际耗时为210分钟。估计值与真实值之间存在30分钟的差异。因为在开发过程中,某些任务完成得更加高效,或者在估计时未考虑到某些复杂性。
在Reporting阶段,估计耗时为100分钟,实际耗时为90分钟。估计值与真实值之间存在10分钟的差异。这个差异可能是由于在实际执行过程中,一些报告任务完成得更加高效。
总体来说,根据给定的PSP表格,估计值与真实值之间存在一些差异。这些差异可能是由于估计时未考虑到某些因素,或者在实际执行过程中出现了一些意外情况。为了提高估计的准确性,可以在以后的项目中进行经验总结,并根据实际情况进行调整和改进。
4.设计实现过程
这段代码实现了一个随机生成带有绝对值运算的数学题目的程序,即可以实现单绝对值运算,也可以实现双绝对值运算,下面是代码的设计实现过程说明:
- 引入必要的头文件:代码中使用了stdio.h、stdlib.h、time.h和math.h头文件。
- 定义随机生成一个-100到100之间的整数的函数randomInt():该函数使用rand()函数生成一个0到200之间的随机整数,然后通过取余并减去100的方式将其范围限制在-100到100之间。
- 定义随机生成运算符的函数randomOperator():该函数定义了一个包含四个运算符的字符数组operators[],然后使用rand()函数生成0到3之间的随机整数作为索引,从运算符数组中取出对应的运算符返回。
- 定义计算表达式值的函数calculate():该函数接受两个操作数和一个运算符作为参数,根据运算符的类型进行相应的运算并返回结果。
- 定义随机生成绝对值表达式的函数randomAbsoluteValue():该函数接受一个整数作为参数,并使用sprintf()函数将该整数插入到一个包含绝对值符号的字符串中,然后返回该字符串。
- 定义计算绝对值表达式值的函数calculateAbsoluteValue():该函数接受一个绝对值表达式字符串作为参数,使用sscanf()函数从字符串中提取出整数,并使用fabs()函数计算该整数的绝对值并返回。
- 在main()函数中,首先使用srand()函数设置随机数种子为当前时间,以确保每次运行程序时生成的随机数序列不同。
- 接着,程序要求用户输入题目数量,并使用scanf()函数读取用户输入的整数。如果输入无效(即不是一个整数),则输出错误信息并返回1。
- 使用while循环生成题目,循环条件是生成的题目数量小于用户输入的题目数量。
- 在循环中,首先使用randomInt()函数生成两个随机整数num1和num2,然后使用randomOperator()函数分别生成两个随机运算符op1和op2。
- 调用calculate()函数计算表达式num1 op1 num2的结果,并将结果保存在result变量中。
- 判断结果是否在0到100之间,并且计算表达式num1 op1 num2和num1 op2 num2的结果是否相等。如果满足这两个条件,则继续执行下面的代码,否则重新生成题目。
- 使用randomAbsoluteValue()函数分别生成两个随机的绝对值表达式absValue1和absValue2。
- 调用calculateAbsoluteValue()函数计算绝对值表达式的值,并将结果保存在absResult1和absResult2变量中。
- 使用printf()函数输出带有独立的绝对值运算的题目,题目格式为"|num1 op1 absValue1| op2 |num2 op2 absValue2| = ?"。
- 生成的题目数量加1。
- 循环继续,直到生成的题目数量达到用户输入的题目数量。
- main()函数返回0,表示程序成功执行完毕。
5.单元测试
在本程序中,可以进行以下单元测试:
- 编译代码:将代码保存为一个名为absolute_value_calculator.c的文件,然后使用C编译器(如gcc)编译代码。
- 运行程序:执行编译后生成的可执行文件。
- 输入题目数量:根据程序提示,输入一个整数作为题目数量。
- 观察输出:程序会生成指定数量的带有独立绝对值运算的数学题目,并输出到控制台。
- 检查结果:检查输出的题目是否符合预期,并验证答案是否正确。
编译代码及运行程序:
测试程序及检查输出
6.学习日志与体会
学习日志 10.25– 10.28
学习时段:19:00 - 21:30
学习内容:
(1)确定代码实现要求;
(2)学习了如何在代码中加入题目含有可嵌套绝对值符号;
(3)对程序的性能进行分析
通过上述代码的编写与测试,收获了以下几点:
- 随机数生成:通过使用rand()函数和srand()函数结合时间作为随机数种子,可以生成不同的随机数序列。
- 字符串处理:使用sprintf()函数将整数转换为字符串,并使用sscanf()函数从字符串中提取整数。
- 条件判断和循环控制:通过使用if语句和while循环,可以根据条件判断来控制程序的流程。
- 函数的使用:将代码模块化,将一些功能相似的代码封装成函数,提高代码的可读性和复用性。
- 错误处理:通过检查用户输入的有效性,可以避免程序崩溃或产生错误的结果。