第八周结对编程实验(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;
}
(3).运算结果 ![](https://img2024.cnblogs.com/blog/3607098/202504/3607098-20250411135752478-1374012415.png) ![](https://img2024.cnblogs.com/blog/3607098/202504/3607098-20250411135821679-1028799801.png) (4).结对编程作业体会 这次软件开发与创新课程设计的实验中,我们需要生成四则运算练习题的编程作业,在实验中我们收获颇丰。在实现过程中,我们深刻体会到了随机数生成、条件判断和循环控制在本次实验中的重要性。为了确保生成的题目符合要求,我们从问题出发不断调整代码逻辑,根据题目答案处于1到1000内的要求对答案范围进行严格限制,由于面向对象为小学生我们因此将答案设定为整数。本次实验让我对程序设计的严谨性有了更深刻的认识。同时,我们强化了我们将复杂问题分解为多个小问题的能力,并逐一解决。虽然过程中遇到了不少困难,但通过查阅资料和不断尝试修改,我们最终成功实现了本次实验的各种要求。这次作业锻炼了我们的编程能力,也锻炼了我们的逻辑思维和解决问题的能力。

本次实验由
2352412与2352432共同完成

posted @ 2025-04-11 14:04  AmnesiaAway  阅读(35)  评论(0)    收藏  举报