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

结对编程-四则运算

时间:2024-04-16 13:34:38浏览次数:26  
标签:std rand 结对 编程 int 四则运算 运算符 num op

要求:小学老师要每周给同学出300道四则运算练习题。

简易版:式子中只有一个一个运算符号。

首先定义一个时间种子,用于生成0-100的随机数,以及生成四个运算符号,实现如下

char op[] = { '+','-','*','/' };//运算符号
int a, t, b;
void random() {//随机生成数字
    srand(time(0));//时间种子
    a = rand() % 101;//生成0到100之间的随机数
    t = rand() % 4;//生成运算符下标
    b = rand() % 100 + 1;//由于分母不能为0,所以得生成1-100;
    std::cout << a << op[t] << b << "=";
}

其次就是直接判断是什么运算符号,然后直接计算即可,需要注意的是由于有除法可能会存在小数点的精度误差,所以为了保证答案正确,所以在判断打哪是否正确的时候判断来两个数的大小是否小于某个精度

double calc() {
    if (op[t] == '+') {
        return a + b;
    }
    else if (op[t] == '-') {
        return a - b;
    }
    else if (op[t] == '/') {
        return (double)a / (double)b;
    }
    else if (op[t] == '*') {
        return a * b;
    }
}

random();//获取表达式
double ans;
std::cin >> ans;

if (fabs(calc() - ans) <= 1e-2){//可能会出现精度误差由于除法的存在
    std::cout << "回答正确!\n";
    ok++;
}
else {
    std::cout << "回答错误!\n正确答案为:" << calc() << "\n";
}

然后在加入一些提示用于,简易的计算器就完成了。

#include<iostream>
#include<string>
char op[] = { '+','-','*','/' };//运算符号
int a, t, b;
void random() {//随机生成数字
    srand(time(0));//时间种子
    a = rand() % 101;//生成0到100之间的随机数
    t = rand() % 4;//生成运算符下标
    b = rand() % 100 + 1;//由于分母不能为0,所以得生成1-100;
    std::cout << a << op[t] << b << "=";
}

double calc() {
    if (op[t] == '+') {
        return a + b;
    }
    else if (op[t] == '-') {
        return a - b;
    }
    else if (op[t] == '/') {
        return (double)a / (double)b;
    }
    else if (op[t] == '*') {
        return a * b;
    }
}

int main() {
    int num; 
    std::cout << "请输入你要挑战的算术式的数量:\n";
    std::cin >> num;
    int sum = num;
    int ok = 0;
    while (num--) {
        random();//获取表达式
        double ans;
        std::cin >> ans;

        if (fabs(calc() - ans) <= 1e-2){//可能会出现精度误差由于除法的存在
            std::cout << "回答正确!\n";
            ok++;
        }
        else {
            std::cout << "回答错误!\n正确答案为:" << calc() << "\n";
        }
    }
    std::cout << "本次一共有算术式:" << sum << "\n";
    std::cout << "你一共答对了:" << ok << "题\n";
    printf("你的正确率为:%.2lf", ok*1.0 / sum);
    return 0;
}

运算效果:

 

进阶版,每个表达式不一定只有一个运算符号,

首先还是随机生成数据方面,可以发现这样的表达式一定是一个数字一个符号这样重复,最后再加上一个数字构成的,于是我们可以随机生成1-4之间的数,然后循环,来表达出这样的式子

  

std::string frandom() {//随机生成数字,一个式子可以多个运算符
    srand(time(0));//时间种子
    int p = rand() % 3 + 1;//可以自己设置运算符的数量
    std::string f;
    for (int i = 1; i <= p; i++) {
        a = rand() % 100+1;//生成0到100之间的随机数
        t = rand() % 4;//生成运算符下标
        f += std::to_string(a);
        f += opp[t];
    }
    b = rand() % 100 + 1;//由于分母不能为0,所以得生成1-100;
    f += std::to_string(b);
    return f;
}

其次就是计算方面,需要一点数据结构的知识,来进行判断一下优先级大小,然后再利用栈存储数字来计算

std::stack<double> num;
std::stack<char> op;
//优先级表
std::unordered_map<char, int> pr{ {'+', 1}, {'-', 1}, {'*',2}, {'/', 2} };

void eval() { // 操作
    int a = num.top();//第二个操作数
    num.pop(); // 左节点 
    int b = num.top();//第一个操作数
    num.pop();
    char p = op.top();//运算符
    op.pop();
    int r = 0;//结果 
    //计算结果
    if (p == '+') r = b + a;
    if (p == '-') r = b - a;
    if (p == '*') r = b * a;
    if (p == '/') r = b / a;
    num.push(r);//结果入栈
}



double calc(std::string s) {
    for (int i = 0; i < s.size(); i++) {
        if (isdigit(s[i])) {
            int x = 0, j = i;//计算数字
            while (j < s.size() && isdigit(s[j])) {
                x = x * 10 + s[j++] - '0'; // 迭代计算压入的数字 
            }
            num.push(x);//数字入栈
            i = j - 1;
        }
        //左括号无优先级,直接入栈
        else if (s[i] == '(') {
            op.push(s[i]);
        }
        //括号特殊,遇到左括号直接入栈,遇到右括号计算括号里面的
        else if (s[i] == ')') {
            while (op.top() != '(')//一直计算到左括号
                eval();
            op.pop();//左括号出栈
        }
        else {
            while (op.size() && pr[op.top()] >= pr[s[i]])//待入栈运算符优先级低,则先计算 
                eval();
            op.push(s[i]);//操作符入栈
        }
    }
    while (op.size()) eval();//剩余的进行计算
    return num.top();//输出结果

}

 

 

完整代码

#include<iostream>
#include<stack>
#include<unordered_map>
#include<string>
char opp[] = { '+','-','*','/' };//运算符号
int a, t, b;

std::stack<double> num;
std::stack<char> op;
//优先级表
std::unordered_map<char, int> pr{ {'+', 1}, {'-', 1}, {'*',2}, {'/', 2} };


std::string frandom() {//随机生成数字,一个式子可以多个运算符
    srand(time(0));//时间种子
    int p = rand() % 3 + 1;//可以自己设置运算符的数量
    std::string f;
    for (int i = 1; i <= p; i++) {
        a = rand() % 100+1;//生成0到100之间的随机数
        t = rand() % 4;//生成运算符下标
        f += std::to_string(a);
        f += opp[t];
    }
    b = rand() % 100 + 1;//由于分母不能为0,所以得生成1-100;
    f += std::to_string(b);
    return f;
}

void eval() { // 操作
    int a = num.top();//第二个操作数
    num.pop(); // 左节点 
    int b = num.top();//第一个操作数
    num.pop();
    char p = op.top();//运算符
    op.pop();
    int r = 0;//结果 
    //计算结果
    if (p == '+') r = b + a;
    if (p == '-') r = b - a;
    if (p == '*') r = b * a;
    if (p == '/') r = b / a;
    num.push(r);//结果入栈
}



double calc(std::string s) {
    for (int i = 0; i < s.size(); i++) {
        if (isdigit(s[i])) {
            int x = 0, j = i;//计算数字
            while (j < s.size() && isdigit(s[j])) {
                x = x * 10 + s[j++] - '0'; // 迭代计算压入的数字 
            }
            num.push(x);//数字入栈
            i = j - 1;
        }
        //左括号无优先级,直接入栈
        else if (s[i] == '(') {
            op.push(s[i]);
        }
        //括号特殊,遇到左括号直接入栈,遇到右括号计算括号里面的
        else if (s[i] == ')') {
            while (op.top() != '(')//一直计算到左括号
                eval();
            op.pop();//左括号出栈
        }
        else {
            while (op.size() && pr[op.top()] >= pr[s[i]])//待入栈运算符优先级低,则先计算 
                eval();
            op.push(s[i]);//操作符入栈
        }
    }
    while (op.size()) eval();//剩余的进行计算
    return num.top();//输出结果

}

int main() {
    int num; 
    std::cout << "请输入你要挑战的算术式的数量:\n";
    std::cin >> num;
    int sum = num;
    int ok = 0;
    while (num--) {
        std::string f=frandom();//获取表达式
        std::cout << f << "=\n";
        double ans;
        std::cin >> ans;

        if (ans==calc(f)){//这里为了定义除法只保留整数位
            std::cout << "回答正确!\n";
            ok++;
        }
        else {
            std::cout << "回答错误!\n正确答案为:" << calc(f) << "\n";
        }
    }
    std::cout << "本次一共有算术式:" << sum << "\n";
    std::cout << "你一共答对了:" << ok << "题\n";
    printf("你的正确率为:%.2lf", ok*1.0 / sum);
    return 0;
}
View Code

 

运算效果

 

标签:std,rand,结对,编程,int,四则运算,运算符,num,op
From: https://www.cnblogs.com/yang-zy/p/18137887

相关文章

  • 结对编程 c++语言实现四则运算练习题
    结对同学:2252813程序要求:两个运算符,100以内的数字,不需要写答案。需要检查答案是否正确,并且保证答案在0-100之间通过阅读题目要求,我们决定使用c++语言完成编程,需要满足两个功能,首先生成一个包含两个运算符的算式,参与运算的数字在100之内。下一步检查答案是否正确,并且保证答......
  • Python中两种网络编程方式:Socket和HTTP协议
    本文分享自华为云社区《Python网络编程实践从Socket到HTTP协议的探索与实现》,作者:柠檬味拥抱。在当今互联网时代,网络编程是程序员不可或缺的一项技能。Python作为一种高级编程语言,提供了丰富的网络编程库,使得开发者能够轻松地实现各种网络应用。本文将介绍Python中两种主要的网络......
  • 结对编程-四则运算
    这是一个由c++实现的简单的四则运算程序,使用者总共需要完成300题整数四则运算。结对伙伴:2252721程序要求两个运算符,100以内的数字,不需要写答案。需要检查答案是否正确,并且保证答案在0-100之间。需要符合运算规则通过仔细阅读分析题目要求,我和我的同伴决定使用c++来完成这......
  • 结对编程-C++四则运算
    合作伙伴:22528071.项目要求要求实现四则运算练习题。这个程序有很多种实现方式:·C/C++·C#/VB.net/Java.Excel·UnixShell.Emacs/Powershell/Vbscript.Perl·Python·两个运算符,100以内的数字,不需要写答案。·需要检查答案是否正确,并且保证答案在0……100......
  • 四则运算结对编程
     这次结对编程由我和王振宇同学共同完成,使用C++语言代码及注释如下#include<iostream>usingnamespacestd;//实现加法运算doubleadd(doublex,doubley){returnx+y;}//实现减法运算doublesubtract(doublex,doubley){returnx-y;}//实现乘法运算do......
  • 结对编程——Java实现四则运算
    任务要求请两位同学以结对编码(一个同学coding,另一个同学在旁边审核代码,之后再交换角色)的方式完成本次实验,并把程序、运算结果、博客体会等截屏发到其中一位同学的博客上,并在博客中体现另一位同学的学号(仅学号不体现姓名)。小学老师要每周给同学出300道四则运算练习题。–这个程......
  • 通义灵码×西安交通大学携手打造“云工开物-高校训练营”,解锁 AI 时代编程学习与实战
    作为大学生如何利用AI“整活儿”?欢迎各位同学关注阿里云与西安交通大学计算机学院携手打造的“云工开物-高校训练营”,带你走近AI编程助手“通义灵码”。通义灵码是阿里推出的免费AI编程工具,拥有实时代码续写与优化、自然语言生成代码、单元测试生成、代码注释生成、代码解释......
  • 4A 安全之授权:编程的门禁,你能解开吗?
    概述在安全管理系统里面,授权(Authorization)的概念常常是和认证(Authentication)、账号(Account)和审计(Audit)一起出现的,并称之为4A。就像上一文章提到的,对于安全模块的实现,最好都遵循行业标准和最佳实践,授权也不例外。作为安全系统的一部分,授权的职责如下:确保授权过程的可控:常见的......
  • Java并发编程实战读书笔记
    1.线程池模型    netty实战中讲到的线程池模型可以描述为:1.从线程池中选择一个空间的线程去执行任务,2.任务完成时,把线程归还给线程池。这个模型与连接池类似。    根据jdk源码的研究,具体的实现模型是,线程池ThreadPoolExecutor中有一个静态内部类Worker,使用装饰器模式扩......
  • 简单四则运算程序实现
    功能要求小学老师要每周给同学出300道四则运算练习题。–这个程序有很多种实现方式:C/C++C#/VB.net/JavaExcelUnixShellEmacs/Powershell/VbscriptPerlPython–两个运算符,100以内的数字,不需要写答案(实现)–需要检查答案是否正确,并且保证答案在0..100之间(实现)–尽可......