第八周结对编程实验(2352432 2352412)
(1)、算法设计思路:
1. 功能概述
程序的主要功能包括:
生成随机数学题目:包括加、减、乘、除四种运算符,并确保题目合法(如除法结果为整数)。
用户答题:用户输入答案,程序判断对错,并允许用户多次尝试。
实时正确率反馈:在答题过程中,实时显示当前正确率。
分组练习:将题目分为若干组,每组完成后再进入下一组。
统计结果:练习结束后,显示总答题数、正确题数和最终正确率。
2. 数据结构设计
题目结构体 Problem:
包含题目数据(操作数 a, b, c 和运算符 op1, op2)。
包含正确答案 correct_answer、用户答案 user_answer、是否答对 is_correct、以及尝试次数 attempts。
3. 核心模块设计
一、 随机题目生成
生成随机数:
使用 rand() 函数生成 1 到 100 的随机整数,作为操作数。
生成随机运算符:
从 {'+', '-', '*', '/'} 中随机选择一个运算符。
合法性检查:
对于除法运算,确保除数不为零,且结果为整数(通过调整随机数生成逻辑实现)。
计算正确答案:
根据运算符优先级,先计算乘法或除法,再计算加法或减法。
确保计算结果在合法范围内(如 0 到 1000)。
4. 用户输入处理
输入验证:
使用 fgets() 获取用户输入,并使用 sscanf() 转换为整数。
如果输入无效(非整数),提示用户重新输入。
答题逻辑:
用户输入答案后,与正确答案比较。
如果答案错误,允许用户重新尝试,最多尝试 MAX_ATTEMPTS 次。
如果超过最大尝试次数,显示正确答案并进入下一题。
5. 分组练习
题目分组:
将总题目数 TOTAL_PROBLEMS 分为若干组,每组 GROUP_SIZE 道题。
逐组练习:
每次完成一组题目后,显示当前正确率,并进入下一组。
用户可以逐步完成所有题目,避免一次性完成大量题目导致疲劳。
6. 实时正确率计算
公式:
正确率 = (正确题数 / 总答题数) * 100。
更新逻辑:
每完成一道题后,更新正确题数和总答题数,并重新计算正确率。
实时显示正确率,帮助用户了解自己的答题表现。
7.统计结果
统计内容:
总答题数、正确题数、最终正确率。
显示方式:
练习结束后,以表格形式显示统计结果,便于用户查看。
(2)、程序代码:
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#define TOTAL_PROBLEMS 300
#define GROUP_SIZE 10
#define MAX_ATTEMPTS 3
typedef struct {
int a, b, c;
char op1, op2;
int correct_answer;
int user_answer;
int is_correct;
int attempts;
} Problem;
// 生成随机数(1-100)
int generate_number() {
return rand() % 100 + 1;
}
// 生成随机运算符
char generate_operator() {
char operators[] = {'+', '-', '*', '/'};
return operators[rand() % 4];
}
// 计算表达式结果
int calculate(int a, char op1, int b, char op2, int c) {
int result;
if (op1 == '*' || op1 == '/') {
if (op1 == '*') result = a * b;
else result = a / b;
if (op2 == '*') result *= c;
else if (op2 == '/') result /= c;
else if (op2 == '+') result += c;
else result -= c;
} else {
if (op2 == '*' || op2 == '/') {
int temp = (op2 == '*') ? b * c : b / c;
result = (op1 == '+') ? a + temp : a - temp;
} else {
result = (op1 == '+') ? a + b : a - b;
result = (op2 == '+') ? result + c : result - c;
}
}
return result;
}
// 生成有效的题目
void generate_valid_problem(Problem *p) {
do {
p->a = generate_number();
p->b = generate_number();
p->c = generate_number();
p->op1 = generate_operator();
p->op2 = generate_operator();
// 处理除法运算
if (p->op1 == '/') {
while (p->b == 0 || p->a % p->b != 0) {
p->b = generate_number();
}
}
if (p->op2 == '/') {
while (p->c == 0 || p->b % p->c != 0) {
p->c = generate_number();
}
}
p->correct_answer = calculate(p->a, p->op1, p->b, p->op2, p->c);
} while (p->correct_answer < 0 || p->correct_answer > 1000);
}
// 获取用户输入
int get_user_answer() {
int answer;
char input[20];
while (1) {
fgets(input, sizeof(input), stdin);
if (sscanf(input, "%d", &answer) == 1) {
return answer;
}
printf("输入无效,请输入整数: ");
}
}
// 练习一组题目
void practice_group(Problem *problems, int start, int end, int *correct_count, int *total_answered) {
for (int i = start; i < end; ) {
Problem *p = &problems[i];
printf("\n第%d题: %d %c %d %c %d = ",
i+1,
p->a,
p->op1,
p->b,
p->op2,
p->c);
p->attempts++;
(*total_answered)++;
p->user_answer = get_user_answer();
if (p->user_answer == p->correct_answer) {
printf(" 正确!");
p->is_correct = 1;
(*correct_count)++;
} else {
printf(" 错误");
if (p->attempts < MAX_ATTEMPTS) {
printf(",剩余尝试次数: %d", MAX_ATTEMPTS - p->attempts);
// 保持i不变以重试当前题目
} else {
i++; // 移动到下一题
printf(",正确答案: %d", p->correct_answer);
}
}
// 计算实时正确率
float accuracy = (*total_answered > 0) ?
(float)(*correct_count) / *total_answered * 100 : 0;
printf(" | 当前正确率: %.1f%%\n", accuracy);
// 仅在答对或达到最大尝试次数时移动到下一题
if (p->user_answer == p->correct_answer) {
i++;
} else if (p->attempts >= MAX_ATTEMPTS) {
i++;
}
}
}
// 显示统计信息
void show_stats(int correct, int total) {
printf("\n======== 最终统计 ========\n");
printf("总答题数: %d\n", total);
printf("正确题数: %d\n", correct);
printf("正确率: %.1f%%\n", (float)correct/total*100);
printf("=========================\n");
}
int main() {
srand(time(NULL));
Problem problems[TOTAL_PROBLEMS];
int correct_count = 0;
int total_answered = 0;
// 生成所有题目
for (int i = 0; i < TOTAL_PROBLEMS; i++) {
generate_valid_problem(&problems[i]);
}
// 分组练习
for (int group = 0; group < TOTAL_PROBLEMS/GROUP_SIZE; group++) {
printf("\n=== 第%d组题目 ===\n", group+1);
practice_group(problems,
group*GROUP_SIZE,
(group+1)*GROUP_SIZE,
&correct_count,
&total_answered);
}
show_stats(correct_count, total_answered);
return 0;
}
本次实验由
2352412与2352432共同完成
浙公网安备 33010602011771号