实现一个自动生成小学四则运算题目的命令行程序
一.
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13137 |
这个作业的目的 | 合作完成一个随机生成四则运算题目的项目 |
项目作者 | 陈炜烽 麦润泽 |
---|---|
学号 | 3122004776 3122004785 |
Github项目地址 | https://github.com/iFortheFuture/teamwork |
二.PSP表格## Personal Software Process Stages
Personal Software Process Stages | 预估时间 (分钟) | 实际时间 (分钟) |
---|---|---|
Planning | 30 | 30 |
Estimate | 45 | 45 |
Development | 120 | 140 |
Analysis | 60 | 55 |
Design Spec | 90 | 75 |
Design Review | 45 | 50 |
Coding Standard | 30 | 35 |
Design | 120 | 135 |
Coding | 180 | 175 |
Code Review | 60 | 65 |
Test | 90 | 95 |
Reporting | 45 | 30 |
Test Report | 30 | 25 |
Size Measurement | 60 | 55 |
Postmortem | 60 | 45 |
合计 | 1135 | 1055 |
三.效能分析
四.设计实现过程
在给定的代码中,主要有以下几个函数:
-
jianhua
: 这个函数用于简化分数,将分数化为最简形式。 -
chufa
: 这个函数用于进行除法运算,包括整除、带分数和真分数。 -
chachong
: 这个函数用于检查生成的题目是否重复,避免生成重复的题目。 -
shengcheng
: 这个函数是主要的函数,用于生成题目。它根据输入的数量和范围,在指定范围内生成不重复的题目,并同时计算出题目的答案。 -
dayintimu
: 这个函数用于打印题目到控制台。 -
dayindaan
: 这个函数用于打印答案到控制台。
这些函数之间的关系如下:
-
shengcheng
函数是整个程序的核心,它负责生成题目并调用其他函数来辅助生成答案和检查重复。 -
chachong
函数在生成题目时用于检查是否有重复的题目,避免生成相同的题目。 -
chufa
函数用于处理除法运算,包括整除、带分数和真分数的情况。 -
jianhua
函数是chufa
函数的一个辅助函数,用于简化分数。 -
dayintimu
和dayindaan
函数负责打印题目和答案到控制台。
在进行修改的过程中,关键的函数是 shengcheng
,因为它是整个程序的主要逻辑,负责生成题目和调用其他函数来辅助完成任务。
关键函数的流程图见附件1.
五.代码说明
关键代码:
// 生成运算
void shengcheng(int n, int r, int daan[100], int timu[100][10]) {
if (n < 1 || r < 10 || n > 100) {
printf("规定:n应该大于0,小于100,r不能小于10");
return;
}
int i = 0;
float sum = 0;
while (i < n) {
// 生成随机数和运算符
int num1 = rand() % r;
int num2 = rand() % r;
int fuhao[4] = {'+', '-', '*', '/'};
int f = rand() % 4;
int a[5] = {0, 0, 0, 0, 0};
switch (f) {
case 0:
// 加法
sum = num1 + num2;
a[0] = sum;
a[1] = '?';
break;
case 1:
// 减法
sum = num1 - num2;
a[0] = sum;
a[1] = '?';
break;
case 2:
// 乘法
sum = num1 * num2;
a[0] = sum;
a[1] = '?';
break;
case 3:
// 除法
chufa(num1, num2, sum, a);
break;
default:
break;
}
// 把答案和题目填入数组
daan[i] = (int)sum;
timu[i][0] = num1;
timu[i][1] = fuhao[f];
timu[i][2] = num2;
timu[i][3] = '=';
timu[i][4] = a[0];
timu[i][5] = a[1];
if (a[1] != '?') {
timu[i][6] = a[2];
timu[i][7] = a[3];
if (a[3] != '?') {
timu[i][8] = a[4];
timu[i][9] = '?';
}
}
// 检查重复
int flag = 0;
flag = chachong(i, daan, timu);
if (flag == 1) {
i--;
}
i++;
}
}
关键思路与注释说明:
参数检查: 首先,函数检查输入参数 n 是否大于 0 且小于 100, r 是否大于等于 10。若参数不符合规定,则输出错误信息并结束函数。
随机数生成: 使用 rand() 函数生成两个范围在 0 到 r-1 之间的随机整数 num1 和 num2,并生成一个随机运算符。
运算和填充数组: 根据随机生成的运算符,计算运算结果 sum。如果是除法,则调用 chufa 函数处理分数情况。然后将题目和答案填入数组 timu 和 daan 中。
检查重复: 检查当前生成的题目是否与之前的题目重复。如果有重复,则重新生成当前题目。
循环生成: 通过循环执行以上步骤,直到生成了 n 条不重复的题目为止。
六.测试运行
七.项目小结:
成功之处:
完成了基本功能,能够生成指定数量、指定范围的四则运算题目。
代码逻辑清晰,函数模块化,易于理解和维护。
使用了适当的注释,提高了代码的可读性。
结对合作促进了代码质量和效率的提升。
失败或不足之处:
缺乏错误处理机制,对于无效输入或异常情况处理不够完善。
代码中可能存在潜在的漏洞或错误,需要进一步测试和调试。
没有考虑到生成的题目和答案可能会很大,导致数组越界或内存溢出的风险。
结对感受:
在结对编程过程中,我学会了更好地倾听和理解他人的意见,也学会了更有效地表达自己的想法
附件1: