软件开发与创新第二次实验——结对编程:计算题出题系统

一.结对情况

本人:2252209
结对搭档:2211323

二.程序设想思路

根据题目我和搭档总结出如下几个关键点:
1.四则运算随机出题
2.两个运算符,三个数字
3.提供算式答案并对用户输入答案进行检查,答案在0-100

我们在基础要求上新增点如下:
1.为提高用户使用观感,开头结尾增加一些文字说明
2.在用户输入完答案后,系统自动进行检查,若答案错误则给出提示和标准答案
3.细节点:题目序号的添加,“正确和错误”的提示
4.将答案范围扩展为:0-200

三.制作过程

前半部分由本人负责编写代码,2211323辅助帮助发现问和查找题解决方案;后半部分交换进行。在代码完成编写后,2211323同学又再次进行修改。

四.代码

点击查看代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 生成随机的四则运算题目
void generate_question(int index, char* question, int* answer) {
    char operators[4] = { '+', '-', '*', '/' };
    char operator1 = operators[rand() % 4];
    char operator2 = operators[rand() % 4];
    int num1 = rand() % 20 + 1;
    int num2 = rand() % 20 + 1;
    int num3 = rand() % 20 + 1;

    // 确保答案在20以内
    if (operator1 == '/' && (num2 == 0 || num1 % num2 != 0)) {
        num2 = rand() % 10 + 1;
    }

    sprintf(question, "%d. %d %c %d %c %d", index, num1, operator1, num2, operator2, num3);

    switch (operator1) {
    case '+':
        switch (operator2) {
        case '+':
            *answer = num1 + num2 + num3;
            break;
        case '-':
            *answer = num1 + num2 - num3;
            break;
        case '*':
            *answer = num1 + num2 * num3;
            break;
        case '/':
            *answer = num1 + num2 / num3;
            break;
        }
        break;
    case '-':
        switch (operator2) {
        case '+':
            *answer = num1 - num2 + num3;
            break;
        case '-':
            *answer = num1 - num2 - num3;
            break;
        case '*':
            *answer = num1 - num2 * num3;
            break;
        case '/':
            *answer = num1 - num2 / num3;
            break;
        }
        break;
    case '*':
        switch (operator2) {
        case '+':
            *answer = num1 * num2 + num3;
            break;
        case '-':
            *answer = num1 * num2 - num3;
            break;
        case '*':
            *answer = num1 * num2 * num3;
            break;
        case '/':
            *answer = num1 * num2 / num3;
            break;
        }
        break;
    case '/':
        switch (operator2) {
        case '+':
            *answer = num1 / num2 + num3;
            break;
        case '-':
            *answer = num1 / num2 - num3
			            break;
        case '*':
            *answer = num1 / num2 * num3;
            break;
        case '/':
            *answer = num1 / num2 / num3;
            break;
        }
        break;
    }
}
			// 检查用户答案是否正确
int check_answer(int correct_answer, int user_answer) {
    if (correct_answer == user_answer) {
        printf("回答正确!\n");
        return 1;
    }
    else {
        printf("答案错误,正确答案是 %d\n", correct_answer);
        return 0;
    }
}

int main() {
    srand(time(NULL)); // 初始化随机数种子

    printf("欢迎来到四则运算题目挑战!\n");
    int correct_count = 0;

    for (int i = 1; i <= 50; i++) {
        char question[20];
        int correct_answer, user_answer;

        generate_question(i, question, &correct_answer);
        printf("题目: %s\n", question);
        printf("请输入答案:");
        scanf("%d", &user_answer);

        if (check_answer(correct_answer, user_answer)) {
            correct_count++;
        }
    }

    printf("今日五十道题已完成,明天再来!\n");

    return 0;
}

修改后代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 生成随机的四则运算题目
void generate_question(int index, char* question, int* answer) {
    char operators[4] = { '+', '-', '*', '/' };
    char leandrg[2] = {'(',')'};
    char operator1 = operators[rand() % 4];
    char operator2 = operators[rand() % 4];
    int num1 = rand() % 20 + 1;
    int num2 = rand() % 20 + 1;
    int num3 = rand() % 20 + 1;
    int have = rand() % 2;//0代表没有括号,1代表有括号
    int lerg = rand() % 2;//0代表左括号,1代表右括号
    // 确保答案在20以内

      
    
    
    switch (have)
    {
    case 0:switch (operator1) {
       case '+':
            switch (operator2) {
            case '+':
            *answer = num1 + num2 + num3;
            break;
            case '-':
            *answer = num1 + num2 - num3;
            break;
            case '*':
            *answer = num1 + num2 * num3;
            break;
            case '/':

                    *answer = num1 + num2 / num3;
                
            break;
        }
        break;
        case '-':
        switch (operator2) {
            case '+':
            *answer = num1 - num2 + num3;
            break;
            case '-':
            *answer = num1 - num2 - num3;
            break;
            case '*':
            *answer = num1 - num2 * num3;
            break;
            case '/':
 
           
                    *answer = num1 - num2 / num3;
                
            break;
        }
        break;
        case '*':
        switch (operator2) {
            case '+':
            *answer = num1 * num2 + num3;
            break;
            case '-':
            *answer = num1 * num2 - num3;
            break;
            case '*':
            *answer = num1 * num2 * num3;
            break;
            case '/':

                    *answer = num1 * num2 / num3;
                

            break;
        }
        break;
        case '/':
        switch (operator2) {
            case '+':
            *answer = num1 / num2 + num3;
            break;
            case '-':
            *answer = num1 / num2 - num3;

            break;
            case '*':
            *answer = num1 / num2 * num3;
            break;
            case '/':
       
            if (num2 / num3 == 0) {
                generate_question(index, question, answer);
            }
            else {
                *answer = num1 / num2 / num3;
            }
            break;
        }
        
        //leandrg
        break;
    }
          break;
    case 1:
        switch (lerg)
        {
        case 0:switch (operator1) {//左括号
            case '+':
            switch (operator2) {
                case '+':
                *answer = num1 + num2 + num3;
                break;
                case '-':
                *answer = num1 + num2 - num3;
                break;
                case '*':
                *answer = (num1 + num2) * num3;
                break;
                case '/':
                *answer = (num1 + num2)/ num3;
                break;
            }
            break;
            case '-':
            switch (operator2) {
                case '+':
                *answer = num1 - num2 + num3;
                break;
                case '-':
                *answer = num1 - num2 - num3;
                break;
                case '*':
                *answer = (num1 - num2) *num3;
                break;
                case '/':
                *answer = (num1 - num2) / num3;
                break;
            }
            break;
            case '*':
            switch (operator2) {
                case '+':
                *answer = num1 * num2 + num3;
                break;
                case '-':
                *answer = num1 * num2 - num3;
                break;
                case '*':
                *answer = num1 * num2 * num3;
                break;
                case '/':
                *answer = num1 * num2 / num3;
                break;
            }
            break;
            case '/':
            switch (operator2) {
                case '+':
                *answer = num1 / num2 + num3;
                break;
                case '-':
                *answer = num1 / num2 - num3;

                break;
                case '*':
                *answer = num1 / num2 * num3;
                break;
                case '/':
                    if (num2 / num3 == 0) {
                        generate_question(index, question, answer);
                    }
                    else {
                        *answer = num1 / num2 / num3;
                    }
                break;
            }
            
            break;
            break;
        }
              
             
              break;
        case 1:switch (operator1) {//右括号
        case '+':
            switch (operator2) {
            case '+':
                *answer = num1 + num2 + num3;
                break;
            case '-':
                *answer = num1 +( num2 - num3);
                break;
            case '*':
                *answer = num1 + (num2 * num3);
                break;
            case '/':
 
                    *answer = num1 + num2 / num3;
                
                break;
            }
            break;
        case '-':
            switch (operator2) {
            case '+':
                *answer = num1 - (num2 + num3);
                break;
            case '-':
                *answer = num1 - (num2 - num3);
                break;
            case '*':
                *answer = num1 - (num2 * num3);
                break;
            case '/':

                    *answer = num1 - num2 / num3;

            }
            break;
        case '*':
            switch (operator2) {
            case '+':
                *answer = num1 * (num2 + num3);
                break;
            case '-':
                *answer = num1 * (num2 - num3);
                break;
            case '*':
                *answer = num1 * num2 * num3;
                break;
            case '/':

                    *answer = num1 * num2 / num3;
                
                break;
            }
            break;
        case '/':
            switch (operator2) {
            case '+':
                *answer = num1 / (num2 + num3);
                break;
            case '-':
                *answer = num1 / (num2 - num3);

                break;
            case '*':
                *answer = num1 / num2 * num3;
                break;
            case '/':
                if (num2 / num3 == 0) {
                    generate_question(index, question, answer);
                }
                else {
                    *answer = num1 / num2 / num3;
                }
                break;
            }
            
            break;
        }

           
            break;
        }
        break;

    }
    int result = *answer;
    if (result < 0 || result > 200) {
        generate_question(index, question, answer);
    }
    else {
        if (operator1 == '/' && (num2 == 0 || num1 % num2 != 0)) {
            num2 = rand() % 10 + 1;
        }
        if (have == 0) {
            sprintf(question, "%d. %d %c %d %c %d", index, num1, operator1, num2, operator2, num3);

        }
        else {
            if (lerg == 0) {
                sprintf(question, "%d. %c %d %c %d %c %c %d", index, leandrg[0], num1, operator1, num2, leandrg[1], operator2, num3);


            }
            else {
                sprintf(question, "%d. %d %c %c %d %c %d %c", index, num1, operator1, leandrg[0], num2, operator2, num3, leandrg[1]);
            }
        }
    }
    
}

// 检查用户答案是否正确
int check_answer(int correct_answer, int user_answer) {
    if (correct_answer == user_answer) {
        printf("回答正确!\n");
        return 1;
    }
    else {
        printf("答案错误,正确答案是 %d\n", correct_answer);
        return 0;
    }
}

int main() {
    srand(time(NULL)); // 初始化随机数种子

    printf("欢迎来到四则运算题目挑战!\n");
    int correct_count = 0;

    for (int i = 1; i <= 50; i++) {
        char question[20];
        int correct_answer, user_answer;

        generate_question(i, question, &correct_answer);
        printf("题目: %s\n", question);
        printf("请输入答案:");
        scanf("%d", &user_answer);

        if (check_answer(correct_answer, user_answer)) {
            correct_count++;
        }
    }

    printf("今日五十道题已完成,明天再来!\n");

    return 0;
}

五.代码运行截图

1.修改器代码运行截图

image

image

2.修改后代码运行截图

image

image

六.运行环境

基于Windows 11家庭版设备,使用Visual Studio Installer编译器,运用C语言进行代码编写。

七.代码运用的知识点及主要函数介绍

1.随机数生成:

使用 rand() 函数和 srand() 函数生成随机数,配合 time() 函数作为种子,确保每次运行程序时生成的随机数不同。

2.字符数组和字符串操作:

使用字符数组来存储生成的题目字符串,并利用 sprintf() 函数将题目格式化为字符串。

3.条件语句和嵌套条件:

使用 if 语句进行条件判断,根据运算符的不同生成对应的算术表达式,并且确保除法运算时被除数不为0。

4.generate_question(int index, char question, int answer)**:

这个函数用于生成一个包含题目和答案的字符串,并将正确答案存储到一个指针所指向的位置。
参数 index 是题目的序号,用于标识题目。
参数 question 是一个字符数组,用于存储生成的题目字符串。
参数 answer 是一个指向整型变量的指针,用于存储生成的题目的正确答案。

5.check_answer(int correct_answer, int user_answer):

这个函数用于检查用户输入的答案是否正确,并输出相应的提示信息。
参数 correct_answer 是正确的答案。
参数 user_answer 是用户输入的答案。
返回值是一个整数,表示用户答案是否正确,1 表示正确,0 表示错误。

6.Switch case 的使用:

解决了对于多个条件出现的选择判断,题目中,我们使用了两个随机数来代表括号的出现和位置,两个0 1 分别代表存在与否,在左边还是在右边,由于是否存在括号,对运算的影响很大,所以需要另外的Switch case对运算符,以及括号的出现和位置进行判断,同时,我们使用了判断递归的方式来限制题目的结果在0~200之内,如果不满足,将内部重新调用函数,且只有在满足的情况下,才会将算式打印出来了,与答案对应。

八.此次实验体会

我的体会:

结对编程是一种非常有趣和有益的编程实践方式。通过与队友一起编写代码,我体会到了许多:

1.与队友合作编程时,我们可以分享彼此的知识和经验,学习到不同的编程技巧和方法。这种知识交流可以加速个人的学习和成长。

2.在编写代码过程中,可能会遇到各种各样的问题。结对编程能够让两个人共同思考问题,并找到解决方案。有时候一个人可能会忽略一些细节或者陷入思维定势,而有了队友的帮助和观点,问题往往可以更快地得到解决。

3.代码质量提高:两个人一起编写代码,可以相互审查、检查,从而减少错误和漏洞。通过互相检查代码,可以提高代码的质量和稳定性。

4.逻辑思维的训练:在生成题目和检查答案的过程中,需要考虑各种情况,如运算符的组合、被除数不能为零等,这锻炼了我的逻辑思维能力。

总体来讲,对于一个题目或者说一个大一点的代码作业的书写,不应该直接动手,而是先思考整个框架,有几个大循环,几个内循环,怎样做出条件的选择,应当获取什么值,值是怎么得到的等等,有框架再下手,会轻松很多,也会很快的写出,然后以后应该多写一些大型代码作业(更多的是思路大),写完之后的愉悦性真的很高。

搭档的体会:

1.功能模块化的重要性:将生成题目和检查答案的功能分别封装成函数,使得代码结构清晰,易于理解和维护。这种模块化的设计让代码更加灵活,可以方便地扩展和修改。

2.随机数生成的应用:通过使用随机数生成器 rand() 和种子函数 srand(),我们能够生成各种不同的题目,增加了程序的趣味性和挑战性。

3.输入输出的处理:通过使用 printf() 和 scanf() 函数进行输入输出,实现了与用户的交互,使程序具有了实用性。

4.在结对编程中,两个人共同完成一项任务,因此也会共同分享责任和成就感。当完成一个功能或者解决一个难题时,可以与队友分享喜悦和成就,增强团队的凝聚力和向心力。
image

posted @ 2024-04-19 23:04  叽咕曲奇  阅读(64)  评论(0)    收藏  举报