1、结对项目完成人员及项目分工:
林丽 肖任楷
本次项目的分工如下:
林丽负责其中README文件,生成一个0到100之间的随机整数,计算表达式的值,避免重复的题目并确保答案在0到100之间的代码撰写,总体审查代码完整性,并撰写设计思路和设计实现,肖任楷完成生成一个随机的运算符和题目数量等代码的撰写,共同完成项目的里程碑,同时完成相对应的学习日志。二人合力进行相关构思,以及解决开发过程中相关问题。
2、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 2880 | 2880 |
· Analysis | · 需求分析 (包括学习新技术) | 1440 | 1440 |
· Design Spec | · 生成设计文档 | 0 | 0 |
· Design Review | · 设计复审 | 0 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 0 | 0 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 5760 | 5760 |
· Code Review | · 代码复审 | 60 | 120 |
· Test | · 测试(自我测试,修改代码,提交修改) | 1000 | 2000 |
Reporting | 报告 | 0 | 0 |
· Test Repor | · 测试报告 | 60 | 120 |
· Size Measurement | · 计算工作量 | 60 | 0 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 180 |
合计 | 11360 | 11900 |
分析:由表中,可以看到我们在代码复审阶段,实际花费时间比预计用时久,这个差异可能是由于在实际执行过程中,对代码复审流程不熟悉,花费了更多时间看代码复审相关视频,进行学习。
此外,在测试阶段,实际花费时间明显高于预计花费时间,原因在于,我们对单元测试内容不了解,花费了很长时间学习单元测试内容相关视频,在实操阶段也遇到了很多困难,但好在最后磕磕绊绊完成了任务。
由上表我们可以看出实际耗时往往比预估耗时的时间要长,主要原因在于个人能力不足,对代码不熟悉所造成的。
3、学习日志
2023.10.16学习日志
学习时间:09:50——11:55
学习内容:(1)确定任务分工
(2)确定代码实现要求
2023.10.17学习日志
学习时间:14:30——17:20
学习内容:(1)寻找开源项目,学习他人类似代码思路
(2)设计相应的代码模块,设计总体框架
2023.10.19学习日志
学习时间:09:50——11:55
学习内容:(1)学习如何用c语言生成随机数
(2)学习如何用c语言生成加减乘除运算符
(3)编写代码,并完成代码,基本实现四则运算的相关功能。
2023.10.20学习日志
学习时间:19:30——22:30
学习内容:(1)单元测试内容
(2)对程序的性能分析
(3)实现代码上传到仓库
收获体会:
首先,我学习了如何使用C语言的基本语法和数据类型。C语言是一种结构化语言,它的代码通常按照函数的形式组织,每个函数都有特定的任务。在编写四则运算练习题的过程中,我学习了如何定义函数、如何使用循环和条件语句、如何处理用户输入和输出等。
其次,我学会了如何使用随机数生成器。在编写四则运算练习题的过程中,我需要生成随机的运算符和数字,以便模拟真实的计算环境。我学习了如何使用C语言的rand()函数生成随机数,并了解了如何使用取余运算符(%)来生成0到3之间的随机数,从而随机选择运算符。
此外,我还学习了如何使用数组。在编写四则运算练习题的过程中,我需要存储用户输入的数字和运算符。数组是一种存储多个数据元素的数据类型,它可以帮助我轻松地存储和访问这些数据。
最后,我学会了如何调试代码。在编写四则运算练习题的过程中,我遇到了很多错误和问题。通过使用调试器,我可以逐步执行代码并查看变量的值,从而找出问题所在并解决它们。
总之,通过编写四则运算练习题,我不仅学会了C语言的基本语法和数据类型,还学会了如何使用随机数生成器、数组和调试器等工具。这些技能将对我的编程之旅产生积极的影响。
自我效率评价:
首先,知识储备不足,例如,对于文件操作、指针操作、结构体等高级特性,我还不够熟悉,需要进一步学习和实践。
其次,调试技能有待提高:在编写练习题的过程中,我们遇到了很多错误和问题,有些问题比较难以发现和解决。虽然我们使用了调试器来逐步执行代码并查看变量的值,但我们还需要进一步提高调试技能,以便更快地找到问题所在并解决它们。
综上所述,我们认为我们自己在编写四则运算练习题后存在的不足包括知识储备不足、调试技能有待提高、编程规范需要加强和算法设计能力有待提高。为了不断提高自己的编程能力,需要继续学习和实践,加强自己的知识储备和技能水平。
4、解题思路
1、确定问题建模:首先,需要明确问题的模型,即如何表示和处理四则运算练习题中的数学表达式。在这个问题中,数学表达式由运算符(加、减、乘、除)和操作数组成,其中操作数可以是整数或浮点数。为了方便处理,选择将数学表达式转化为字符串形式,并使用数组来存储这些字符串。
2、随机生成运算符和数字:接下来,需要生成随机的运算符和数字,以便模拟真实的计算环境。为了实现这一目标,我们队使用C语言的rand()函数生成随机数,并使用取余运算符(%)来限制随机数的范围。例如,使用rand() % 4来生成0到3之间的随机数,从而随机选择运算符(加、减、乘、除)。同时,我们还使用rand()函数生成随机的数字,以便操作数。
3、计算表达式的结果:一旦我们有了随机的运算符和数字,我们就需要计算表达式的结果。为了实现这一目标,我们使用switch语句来根据不同的运算符选择相应的计算方法。例如,对于加法运算符,我们使用两个操作数的和来计算结果;对于乘法运算符,我们使用两个操作数的积来计算结果。
4、整合答案:最后,需要整合答案,以便用户能够看到计算的结果。为了实现这一目标,使用printf()函数将结果输出到屏幕上。
综上所述,我们的解题思路是确定问题建模、随机生成运算符和数字、计算表达式的结果以及整合答案。通过这个解题思路,能够编写出高效的四则运算练习题程序。
5、代码实现流程
结对——四则运算
仓库地址:https://gitee.com/hezhiyong_edu/pair-programming-xl.git
建立README文档:
建立里程碑:
仓库操作记录:
第一阶段代码完成的需求功能:
- 有四则运算;2、题目数量可以指定;3、运算数在0-100之间;4、有答题功能并能验证答案是否正确;5、判分;6、题目不重复。
缺陷:1、题目中不含2个运算符;2、答案不在0-100之间。
第一阶段代码:
#include <stdlib.h>
#include <stdio.h>
int compute(int a, int b,int op)
{
int answer, result;
switch (op)
{
case 1://加分运算
printf("%d+%d=", a, b);
result = a + b ;
break;
case 2://减分运算
printf("%d-%d=", a, b);
result = a - b;
break;
case 3://乘分运算
printf("%d*%d=", a, b);
result = a * b;
break;
case 4://除分运算
if (b != 0)//分母不能为0
{
printf("%d/%d=", a, b);
result = a / b;
}
break;
default:
printf("其它!\n");
break;
}
scanf_s("%d", &answer);//输入答案
if (result == answer)//答案正确返回1,错误返回0
{
return 1;
}
else
{
return 0;
}
}
void print(int flag)
{
if (flag)
{
printf("回答正确!\n");
}
else
{
printf("回答错误!\n");
}
}
void menu()
{
int n;
printf("***欢迎进入小学生算术四则运算测试系统***\n");
printf("1.加法运算\n");
printf("2.减法运算\n");
printf("3.乘法运算\n");
printf("4.除法运算\n");
printf("请选择考试内容:\n");
}
main()
{
int a, b, i, result, zfs = 0, zct = 0, op = 0, k, n;
menu();
scanf_s("%d", &k);
printf("请输入答题数量:");
scanf_s("%d", &n);
for (i = 0; i < n; i++)//循环n次,每次计算1道题
{
a = rand() % 10 + 1;//随机生成两个数
b = rand() % 10 + 1;
if (k == 1) //判断输入的数
op = 1;
else if (k == 2)
op = 2;
else if (k == 3)
op = 3;
else if (k == 4)
op = 4;
else
op = rand() % 4 + 1;
result = compute(a, b, op);//调用四则运算函数,答案正确返回1,错误返回0
print(result);//调用判断回答是否正确函数
if (result)//计算总分
zfs = zfs + 10;
else
zct++;//回答错误题数+1
}
printf("分数=%d,回答错误题数=%d\n", zfs, zct);
}
运算结果展示:
第二阶段:完善功能设计
任务1:完善缺陷1(题目中包含2个运算符)
任务2:完善缺陷2(答案在0-100之间)
程序改进:
运行最终代码:
对应的代码仓库操作:
将最初代码关联到master分支,新建dev1分支,在dev1分支里进行程序的改进和测试,最终Pull Requestd 到master分支,合并分支。
单元测试:
单元测试完整代码:
#include "pch.h"
#include "CppUnitTest.h"
#include "calculator.c"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
//检验计算功能
int compute(int a, int b, int c, int op)
{
// int answer, result;
switch (op)
{
case 1://全加运算
printf("%d+%d+%d=", a, b, c);
result = a + b + c;
break;
case 2://全减运算
if ((a > b) && ((a - b) > c))//保证结果为正数
{
printf("%d-%d-%d=", a, b, c);
result = a - b - c;
}
break;
case 3://全乘运算
printf("%d*%d*%d=", a, b, c);
result = a * b * c;
break;
case 4://全除运算
if ((b != 0) && (c != 0))//分母不能为0
{
printf("%d/%d/%d=", a, b, c);
result = a / b / c;
}
break;
case 5://加减混合运算
if ((a + b) > c)//保证结果为正数
{
printf("%d+%d-%d=", a, b, c);
result = a + b - c;
}
break;
case 6://乘加混合运算
printf("%d*%d+%d=", a, b, c);
result = a * b + c;
break;
case 7://乘减混合运算
if ((a * b) > c)
{
printf("%d*%d-%d=", a, b, c);
result = a * b - c;
}
break;
case 8://除加混合运算
if (b != 0)
{
printf("%d/%d+%d=", a, b, c);
result = a / b + c;
}
break;
case 9://除减混合运算
if (b != 0)
{
printf("%d/%d-%d=", a, b, c);
result = a / b - c;
}
break;
case 10://乘除混合运算
if (c != 0)
{
printf("%d*%d/%d=", a, b, c);
result = a * b / c;
}
break;
default:
printf("其它!\n");
break;
}
return result;
}
Assert::AreEqual(compute(2, 3, 1, 1), 6);//全加运算
Assert::AreEqual(compute(7, 2, 3, 2), 2);//全减运算
Assert::AreEqual(compute(2, 3, 1, 3), 6);//全乘运算
Assert::AreEqual(compute(7, 2, 3, 4), 1);//全除运算(只取整数部分)
Assert::AreEqual(compute(2, 3, 1, 5), 4);//加减运算
Assert::AreEqual(compute(7, 2, 3, 6), 17);//乘加运算
Assert::AreEqual(compute(2, 3, 1, 7), 5);//乘减运算
Assert::AreEqual(compute(7, 2, 3, 8), 6);//除加运算(只取整数部分)
Assert::AreEqual(compute(3, 3, 1, 9), 0);//除减运算(只取整数部分)
Assert::AreEqual(compute(7, 2, 3, 10), 4);//乘除运算(只取整数部分)
}
};
}
测试结果:
代码性能测试: