结对编程-C++四则运算

  1. 小学老师要每周给同学出300道四则运算练习题。
    –这个程序有很多种实现方式:

C/C++
C#/VB.net/Java
Excel
Unix Shell
Emacs/Powershell/Vbscript
Perl
Python
–两个运算符,100 以内的数字,不需要写答案。

–需要检查答案是否正确,并且保证答案在 0..100 之间

–尽可能地多设置一些条件

  1. 也可以让同学们自选一个小应用程序进行结对编程的开发
  2. 请两位同学以结对编码(一个同学coding,另一个同学在旁边审核代码,之后再交换角色)的方式完成本次实验,并把程序、运算结果、博客体会等截屏发到其中一位同学的博客上,并在博客中体现另一位同学的学号(仅学号不体现姓名)

结对同学学号:2252527
在我开始编程的时候,我首先先想的是先编写一个生成一个0-100的随机数的函数getNumber(),这先需要引入这个头文件才能使用rand()函数来生成随机数,但是如何将这个随机数规定在0-100之间呢,我最先想的是直接让rand()%101,但是我想这个老师如果想改动这个区间为20-100之间又应该怎么生成20-100之间的数呢,于是我想到了先生成一个区间内的最大值和最小值,让rand()%(max-min+1)+min,这样的话最后生成出来的数就是介于max和min之间,想要改动这个区间只需要更改max和min就可以了.
再然后就是随机生成一个运算符的函数getOperator()了,这个我最先想的是先生成一个数组,这个数组内有加减乘除这四个运算符,然后通过rand()函数随机生成一个数再%4,这样就可以随机选择数组内的加减乘除了,但是后面发现了一个问题就没有采用这个方式,这个问题待会再讲,再然后需要一个函数来判断结果是否在0-100之间的整数,这个非常简单,只需要让answer>=0,<=100并且%1==0就好了.
接下来就是main()函数的内容,就是先用前面的生成随机数的函数getNumber()随机生成两个数,然后再用getOpetator()随机生成一个运算符,再规定它们的运算结果不能超过100和小于0,并且必须是整数就ok了,然后就是用户输入答案,答案正确就显示回答正确,答案错误就显示回答错误并显示正确答案,这些没什么好说的,在编写完程序后结果大概就是这个样子

在我编写随机数的时候,我的搭档给了我一个建议,他说在编写随机数生成的程序时,通常会使用一个种子来初始化随机数生成器。种子是一个起始值,用于确定随机数序列的起始状态。如果不使用种子或者每次都使用相同的种子,那么每次运行程序生成的随机数序列都会是相同的,这样就失去了随机性。
使用当前时间作为种子是一种常见的做法,因为时间是一个变化的值,每次运行程序时都会有所不同,这样可以确保每次生成的随机数序列都是不同的,增加了随机性。
我觉得他说的非常有道理,于是我在主函数main()中添加了srand(time(0))这行代码,这需要引入一个新的头文件来获取当前时间.
最后,我再来解释一下为什么我不采用原来生成随机运算符的方法,因为在我运行程序之后我发现大多数题目好像都是加法和减法,乘法和除法比较少见,我觉得这是因为在生成乘法的时候,随机生成的数的乘积很容易超过100从而并没有显示,同理除法也是一样的,除出来的很可能并不是整数而被抛弃,于是我就想能不能提高乘法和除法的运算出现的频率?我看到了我的随机生成数的函数getNumber()的区间正好是0-100,于是我就取了个巧,让它来帮我决定生成运算符的概率,我让它随机生成一个数,然后因为这个数是随机的,它取到小于等于20的数的概率是20%,我就可以当rand()<=20的时候取'+',这样取到加号的概率就是20%,同理这样可以控制每个运算符出现的概率,这样我就可以提高生成乘法和除法的概率了.
通过结对编程,我深刻认识到合作的力量。与搭档一起面对编程挑战,我们各自发挥所长,共同探索解决方案。在交流合作的过程中,我不仅学会了更好地表达自己的想法,也懂得了倾听和理解他人的观点。结对编程的过程中,我们发现了彼此的不足之处,并互相激励着努力提升技术水平。尽管偶尔会有分歧,但正是这些分歧促使我们更深入地思考问题,最终找到更加完善的解决方案。总的来说,结对编程不仅提高了编程效率,也锻炼了团队协作和沟通能力,是一次非常宝贵的经历。
最后,代码如下

点击查看代码
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

//生成随机数
int getNumber(int min, int max) {
    return rand() % (max - min + 1) + min; //生成 min 到 max 之间的随机数
}

//生成随机运算符
char getOperator() {
    int randNum = getNumber(1, 100); //生成1到100之间的随机数

    //根据随机数的值确定运算符的选择概率
    if (randNum <= 20) { //20% 的概率选择 +
        return '+';
    }
    else if (randNum <= 40) { //20% 的概率选择 -
        return '-';
    }
    else if (randNum <= 70) { //30% 的概率选择 *
        return '*';
    }
    else { //剩余 30% 的概率选择 /
        return '/';
    }
}

//检查答案是否在0到100之间并且为整数
bool isValidAnswer(int answer) {
    return answer >= 0 && answer <= 100 && answer % 1 == 0;
}

int main() {
    srand(time(0)); //使用当前时间作为随机数种子

    for (int i = 0; i < 300; ++i) {
        int num1, num2;
        char op;

        do {
            num1 = getNumber(0, 100); //生成0到100之间的数
            num2 = getNumber(0, 100); //生成0到100之间的数
            op = getOperator();
        } while ((op == '+' && num1 + num2 > 100) || //加法结果不能超过100
            (op == '-' && num1 - num2 < 0) || //减法结果不能是负数
            (op == '*' && num1 * num2 > 100) || //乘法结果不能超过100
            (op == '/' && (num1 % num2 != 0 || num2 == 0 || num1 / num2 > 100))); //除数与被除数之间是倍数关系,且除法结果不超过100

        //输出题目
        cout << "题目 " << i + 1 << ": " << num1 << " " << op << " " << num2 << " = ?" << endl;

        //输入答案
        int userAnswer;
        cout << "请输入答案:";
        cin >> userAnswer;

        //计算正确答案
        int correctAnswer;
        switch (op) {
        case '+':
            correctAnswer = num1 + num2;
            break;
        case '-':
            correctAnswer = num1 - num2;
            break;
        case '*':
            correctAnswer = num1 * num2;
            break;
        case '/':
            correctAnswer = num1 / num2;
            break;
        }

        //检查答案是否正确
        if (userAnswer == correctAnswer && isValidAnswer(userAnswer)) {
            cout << "回答正确!" << endl;
        }
        else {
            cout << "回答错误!正确答案是:" << correctAnswer << endl;
        }

        cout << endl;
    }

    return 0;
}
posted @ 2024-04-16 22:38  ShiC丶  阅读(13)  评论(0编辑  收藏  举报