实现一个自动生成小学四则运算题目的命令行程序

一.

这个作业属于哪个课程 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

三.效能分析

四.设计实现过程
在给定的代码中,主要有以下几个函数:

  1. jianhua: 这个函数用于简化分数,将分数化为最简形式。

  2. chufa: 这个函数用于进行除法运算,包括整除、带分数和真分数。

  3. chachong: 这个函数用于检查生成的题目是否重复,避免生成重复的题目。

  4. shengcheng: 这个函数是主要的函数,用于生成题目。它根据输入的数量和范围,在指定范围内生成不重复的题目,并同时计算出题目的答案。

  5. dayintimu: 这个函数用于打印题目到控制台。

  6. dayindaan: 这个函数用于打印答案到控制台。

这些函数之间的关系如下:

  • shengcheng 函数是整个程序的核心,它负责生成题目并调用其他函数来辅助生成答案和检查重复。

  • chachong 函数在生成题目时用于检查是否有重复的题目,避免生成相同的题目。

  • chufa 函数用于处理除法运算,包括整除、带分数和真分数的情况。

  • jianhua 函数是 chufa 函数的一个辅助函数,用于简化分数。

  • dayintimudayindaan 函数负责打印题目和答案到控制台。

在进行修改的过程中,关键的函数是 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:

graph TD; A(开始) --> B(检查参数是否有效) B -->|无效| C[输出错误信息并结束程序] B -->|有效| D(初始化变量 i, sum) D --> E{i < n} E -->|是| F(生成随机数 num1, num2, operator) F --> G(计算 sum) G --> H{sum是否整数} H -->|是| I(处理整数情况) H -->|否| J(处理分数情况) I --> K(填充答案和题目数组) J --> K K --> L(检查重复) L -->|是| M(重来) L -->|否| N{题目是否生成完成} N -->|是| O(输出题目和答案) N -->|否| P(增加 i) P --> E O --> A
posted @ 2024-03-24 19:44  ssscgf  阅读(69)  评论(0编辑  收藏  举报