首页 > 编程语言 >结对编程-C++四则运算

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

时间:2024-04-16 22:45:20浏览次数:32  
标签:结对 num2 min 四则运算 C++ 生成 运算符 随机数 100

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

在我编写随机数的时候,我的搭档给了我一个建议,他说在编写随机数生成的程序时,通常会使用一个种子来初始化随机数生成器。种子是一个起始值,用于确定随机数序列的起始状态。如果不使用种子或者每次都使用相同的种子,那么每次运行程序生成的随机数序列都会是相同的,这样就失去了随机性。
使用当前时间作为种子是一种常见的做法,因为时间是一个变化的值,每次运行程序时都会有所不同,这样可以确保每次生成的随机数序列都是不同的,增加了随机性。
我觉得他说的非常有道理,于是我在主函数main()中添加了srand(time(0))这行代码,这需要引入一个新的头文件来获取当前时间.
最后,我再来解释一下为什么我不采用原来生成随机运算符的方法,因为在我运行程序之后我发现大多数题目好像都是加法和减法,乘法和除法比较少见,我觉得这是因为在生成乘法的时候,随机生成的数的乘积很容易超过100从而并没有显示,同理除法也是一样的,除出来的很可能并不是整数而被抛弃,于是我就想能不能提高乘法和除法的运算出现的频率?我看到了我的随机生成数的函数generateRandomNumber()的区间正好是0-100,于是我就取了个巧,让它来帮我决定生成运算符的概率,我让它随机生成一个数,然后因为这个数是随机的,它取到小于等于20的数的概率是20%,我就可以当rand()<=20的时候取'+',这样取到加号的概率就是20%,同理这样可以控制每个运算符出现的概率,这样我就可以提高生成乘法和除法的概率了.
最后,我也要感谢我的搭档,在我犯错误的时候能够提醒我并改正.
代码如下

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

using namespace std;

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

// 生成随机运算符
char generateRandomOperator() {
    int randNum = generateRandomNumber(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 = generateRandomNumber(0, 100); // 生成0到100之间的数
            num2 = generateRandomNumber(0, 100); // 生成0到100之间的数
            op = generateRandomOperator();
        } 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;
}

标签:结对,num2,min,四则运算,C++,生成,运算符,随机数,100
From: https://www.cnblogs.com/shic666/p/18139447

相关文章

  • 结对
    publicListgetStationsBetween(StringstartStation,StringendStation,List<List>allSubwayStations){ListstationsBetween=newArrayList<>();Map<String,List>graph=buildGraph(allSubwayStations);//检查起始站和终点站是否存在于地铁网络中if(......
  • C++ 递归与面向对象编程基础
    C++递归递归是一种使函数调用自身的技术。这种技术提供了一种将复杂问题分解为简单问题的方法,从而更容易解决问题。递归可能有点难以理解。理解其工作原理的最佳方法是通过实验来尝试。递归示例将两个数字相加很容易做到,但将一系列数字相加就更复杂了。在下面的示例中,通过将......
  • 【编译原理】正则式转NFA转DFA 代码实现(C/C++)
    直接上代码:#include<bits/stdc++.h>usingnamespacestd;//nfa结构定义structnst{vector<int>a[26],e;//接收a-z会到达的状态,接收eps会到达的状态boolf=0;//=0为可接受态};vector<nst>nfa;set<char>alp;stringstr;set<int>accepted;struc......
  • C++定义,继承和虚函数
    类定义方式一般有两种Baseb和Baseb(3);一种不带参数,一种带参数,这两种实例定义会在范围结束自动释放。Base*c=newBase;和Base*c=newBase(5);没有参数可不加括号。通过new申请的类,需要手动delete释放,否则需要关闭程序才会释放(说的内存泄漏是指程序一直运行期间不断产生......
  • C++ list erase
    原文:https://www.cnblogs.com/yelongsan/p/4050404.htmlSTL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。      在使用list、set或m......
  • 结对编程
    前言小学老师要每周给同学出300道四则运算练习题。–这个程序有很多种实现方式:C/C++C#/VB.net/JavaExcelUnixShellEmacs/Powershell/VbscriptPerlPython–两个运算符,100以内的数字,不需要写答案。–需要检查答案是否正确,并且保证答案在0..100之间–尽可能地多设......
  • 深度解读《深度探索C++对象模型》之默认构造函数
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,主动获得推文。提到默认构造函数,很多文章和书籍里提到:“在需要的时候编译器会自动生成一个默认构造函数”。那么关键的问题来了,到底是什么时候需要?是谁需要?比如下面的......
  • 结对编程
    小学老师要每周给同学出300道四则运算练习题。–这个程序有很多种实现方式:C/C++C#/VB.net/JavaExcelUnixShellEmacs/Powershell/VbscriptPerlPython–两个运算符,100以内的数字,不需要写答案。–需要检查答案是否正确,并且保证答案在0..100之间合作伙伴:2252522代......
  • 结对编程-C#-四则运算
    结对编程-四则运算要求:小学老师要每周给同学出300道四则运算练习题。–这个程序有很多种实现方式:C/C++C#/VB.net/JavaExcelUnixShellEmacs/Powershell/VbscriptPerlPython–两个运算符,100以内的数字,不需要写答案。–需要检查答案是否正确,并且保证答案在0..100之......
  • 第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组
    Preface答辩圈钱杯,去年省赛的题好歹还有些有意思的题(指杜教筛),今年变成煞笔题开会了是吧两个小时多一点就全写完了,然后开始给后面三题写对拍(结果发现其实都没写挂纯在浪费时间)考完感觉AK有望,结果后面发现最后一题漏看条件了,苦露西而且中间EF两题全偷懒开__int128了,反正用下发的......