软件开发与创新-结对编程
一.程序简介
该程序主要是面对小学生的一项自动进行四则运算练习题的程序,主要拥有以下功能:
(1)题目生成:自动生成包含两个运算符的三元表达式(如 5 + 3 × 2),支持加减乘除四则运算。
(2)运算符优先级处理:根据乘除优先于加减的规则自动调整运算顺序。
(3)数值范围控制:所有操作数为0-100的整数,但显示为一位小数(如5.0),最终结果四舍五入为整数。
(4)避免除数为零:除法运算中,强制生成非零除数。
(5)结果有效性:确保计算结果在0-1000之间,若生成无效结果(如负数或超限),自动重新生成题目。
(6)分组练习与批改:每轮生成10道题目为一组,用户逐题作答。
(7)实时批改反馈:显示每题正确答案,统计本组正确率及累计正确率。
(8)最终输出总正确率(如总正确率: 270/300 (90.0%))。
用户交互设计:
(1)分组显示:每轮显示=== 第N组题目 ===,降低一次性做题压力。
(2)清晰提示:题目格式为[序号] 数字 运算符 数字 运算符 数字 = (如[1] 7.0 × 3.0 + 2.0 = )。
(3)即时反馈:批改时标注正确/错误,并展示正确答案,帮助用户及时纠错。
二.小组成员
2352629(本人) 2352732(另一位同学)
三.算法设计思路
- 函数功能设计
1.1get_priority 函数:
该函数的作用是确定运算符的优先级。对于乘法(*)和除法(/),其优先级设为 2;对于加法(+)和减法(-),优先级设为 1。这样在后续计算表达式结果时,就能依据运算符优先级来确定运算顺序。
1.2calculate 函数:
此函数用于执行具体的算术运算。它接收两个操作数 a 和 b 以及一个运算符 op,根据运算符的不同,进行相应的加法、减法、乘法或除法运算,并返回运算结果。在进行除法运算时,需要注意除数不能为 0。
1.3compute_result 函数:
该函数用于计算包含两个运算符的表达式的结果。它接收三个操作数 a、b、c 以及两个运算符 op1 和 op2。通过调用 get_priority 函数比较两个运算符的优先级,若 op2 的优先级高于 op1,则先计算 b 和 c 的运算结果,再与 a 进行 op1 运算;反之,则先计算 a 和 b 的运算结果,再与 c 进行 op2 运算。最后将结果四舍五入为整数并返回。 - main 函数的整体流程
2.1初始化部分:
利用 srand(time(0)) 对随机数生成器进行初始化,保证每次运行程序时生成的随机数不同,设定总题目数量 total 为 300,每组题目数量 group_size 为 10,初始化已完成的组数 group_count 为 0,累计正确题目数量 total_correct 为 0。
2..2题目循环生成与批改部分:
运用 for 循环来控制题目生成的总数,每次循环生成一组题目,在每组题目生成过程中,使用另一个 for 循环生成 10 道题目(若剩余题目不足 10 道,则生成剩余数量的题目),针对每道题目,随机生成三个操作数 a、b、c 和两个运算符 op1、op2。在生成除法运算时,要确保除数不为 0,调用 compute_result 函数计算该题的正确答案,并将结果存储在 results 数组中。若结果不在 0 到 1000 的范围内,则重新生成操作数,直至结果有效。
显示题目,让用户输入答案,并将用户答案存储在 answers 数组中,完成一组题目后,对该组题目进行批改。遍历 answers 数组和 results 数组,比较用户答案和正确答案,统计该组正确的题目数量 group_correct,并输出批改结果,更新累计正确题目数量 total_correct,输出该组的正确率和累计正确率。
2.3最终成绩输出部分:
所有题目完成后,输出最终的总正确率。
四.程序代码
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
// 运算符优先级
int get_priority(char op) {
return (op == '*' || op == '/') ? 2 : 1;
}
// 执行运算(返回浮点数结果)
double calculate(double a, char op, double b) {
switch(op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b; // 注意除数不能为0
default: return 0;
}
}
// 计算表达式结果(考虑运算顺序)
int compute_result(double a, char op1, double b, char op2, double c) {
double result;
if (get_priority(op2) > get_priority(op1)) {
result = calculate(a, op1, calculate(b, op2, c));
} else {
result = calculate(calculate(a, op1, b), op2, c);
}
return (int)round(result); // 四舍五入为整数
}
int main() {
srand(time(0));
const int total = 300;
int group_size = 10;
int group_count = 0;
int total_correct = 0;
for (int count = 0; count < total; ) {
printf("\n=== 第%d组题目 ===\n", group_count + 1);
int answers[10] = {0};
int results[10] = {0};
int group_correct = 0;
// 生成一组题目
for (int i = 0; i < group_size && count < total; i++, count++) {
// 生成第一个运算
double a = rand() % 101;
char op1 = "+-*/"[rand() % 4];
double b = 0;
// 处理除法特殊情况
if (op1 == '/') {
do {
b = (rand() % 100) + 1; // 确保除数不为0
} while (fabs(a) < 0.0001 && fabs(b) < 0.0001); // 避免0/0
} else {
b = rand() % 101;
}
// 生成第二个运算
char op2 = "+-*/"[rand() % 4];
double c = 0;
if (op2 == '/') {
do {
c = (rand() % 100) + 1;
} while (fabs(c) < 0.0001);
} else {
c = rand() % 101;
}
// 计算正确答案(四舍五入)
results[i] = compute_result(a, op1, b, op2, c);
// 确保结果有效
while (results[i] < 0 || results[i] > 1000) {
// 重新生成数字
a = rand() % 101;
b = rand() % 101;
c = rand() % 101;
results[i] = compute_result(a, op1, b, op2, c);
}
// 显示题目(显示一位小数)
printf("[%d] %.1f %c %.1f %c %.1f = ",
i+1, a, op1, b, op2, c);
scanf("%d", &answers[i]);
}
// 批改本组题目
printf("\n=== 批改结果 ===\n");
for (int i = 0; i < group_size && i < total - group_count * group_size; i++) {
if (answers[i] == results[i]) {
printf("? 第%d题正确\n", i+1);
group_correct++;
} else {
printf("? 第%d题错误 (正确答案: %d)\n", i+1, results[i]);
}
}
total_correct += group_correct;
printf("本组正确: %d/%d\n", group_correct, group_size);
printf("累计正确: %d/%d (%.1f%%)\n",
total_correct, count, total_correct * 100.0 / count);
group_count++;
}
printf("\n=== 最终成绩 ===\n");
printf("总正确率: %d/%d (%.1f%%)\n",
total_correct, total, total_correct * 100.0 / total);
return 0;
}
五.程序运行结果截图
程序通过对题目进行分组,每组十道题目,对于小数结果实行四舍五入的取舍,当十道题目完成后系统会自动统计正确率,并对题目进行批改,显示正确答案,确保用户可以实时进行练习和了解错误题目。
六.结对编程作业体会
在本次结对编程实验中,我们深刻体会到了合作带来的高效与质量提升。两人一组,一人编码、一人审核,随后交换角色,这种模式让我们对代码有了更全面的把控,编码初期,我们围绕 “生成符合要求的四则运算题” 展开讨论,比如在处理除法时确保除数不为 0,以及如何保证答案在 0 到 1000 之间。当一人编写代码时,另一人能及时发现逻辑漏洞或代码瑕疵。例如,在生成题目循环中,审核同学发现未充分考虑结果范围的检查逻辑,及时提醒补充while (results[i] < 0 || results[i] > 1000)的循环处理,确保每道题答案有效,交换角色后,双方对代码各部分的理解更加深入。编写批改部分时,通过讨论优化了代码结构,使批改逻辑更清晰。这种思想碰撞不仅完善了代码细节,还让我们对程序整体逻辑有了更深刻的认识。此外,结对编程有效提升了效率。两人互相监督、交流,避免了单人编程时可能出现的思路停滞或拖延。遇到问题时,两人共同探讨解决方案,如在运算符优先级处理上,通过交流确保compute_result函数逻辑正确,减少了试错时间,总的来说,结对编程通过互相检查、思想碰撞和角色交换,不仅提升了代码质量与效率,还增强了我们对编程细节的把控能力。这种合作模式让我们意识到,团队协作能更高效地解决问题,同时促进彼此编程能力的提升。