随机生成四则运算式2

  1. 题目避免重复
  2. 可定制(数量/打印方式)
  3. 可以控制下列参数
    1. 是否有乘除法
    2. 是否有括号(最多可以支持十个数参与运算)
    3. 数值范围
    4. 加减有无负数
    5. 除法有无余数
  4. 设计思路:这次我用了很多子函数,比如操作数和算符以及结果的输出,这样来说方便了许多。

    #include<iostream>
    using namespace std;
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    void main()
    {
    srand((int)time(NULL));
    void peizhi(bool&p1, bool&p2, bool&p3, bool&p4);

    int sfys1();//生成算符余数函数(有乘除)
    int sfys2();//生成算符余数函数(无乘除)
    int czs();//生成操作数
    char suanfu1(int sfys1);//根据算符余数,给出算符的函数(有乘除)
    char suanfu2(int sfys2);//根据算符余数,给出算符的函数(无乘除)
    void kuohao1();//无乘除的括号
    void kuohao2();//有乘除的括号
    void sc1();//输出类型1,无乘除法
    void sc2();//输出类型2,有乘除法
    void sc3();//输出类型3,加减无负数
    void sc4();//输出类型4,除法无余数

    bool pz1, pz2, pz3, pz4;

    peizhi(pz1, pz2, pz3, pz4);

    //无乘除法无括号加减有负数的表达式
    if (pz1==0&&pz2==0&&pz3==1)
    {

    for (int i = 0; i < 30; i++)
    {

    sc1();
    }

    }

    //无乘除法无括号加减无负数的表达式
    else if (pz1==0&&pz2==0&&pz3==0)
    {
    for (int i = 0; i < 30; i++)
    {

    sc3();
    }
    }

    //无乘除法有括号加减有负数的表达式
    else if (pz1 == 0 && pz2 == 1&&pz3==1)
    {
    int bianhuan1;
    bianhuan1= (int)(rand() * 2) / RAND_MAX;
    for (int i = 0; i < 30; i++)
    {
    bianhuan1 = (int)(rand() * 2) / RAND_MAX;
    if (bianhuan1 == 0)
    {
    sc1();
    }
    else
    {
    kuohao1();
    }
    }
    }

    //无乘除法有括号加减无负数的表达式
    else if (pz1 == 0&& pz2 == 1&&pz3==0)
    {
    int bianhuan1;
    bianhuan1 = (int)(rand() * 2) / RAND_MAX;
    for (int i = 0; i < 30; i++)
    {
    bianhuan1 = (int)(rand() * 2) / RAND_MAX;
    if (bianhuan1 == 0)
    {
    sc3();
    }
    else
    {
    kuohao1();
    }
    }
    }

    //有乘除法无括号有负数有余数
    else if (pz1 == 1 && pz2 == 0 && pz3 == 1 && pz4 == 1)
    {
    for (int i = 0; i < 30; i++)
    {

    sc2();
    }
    }

    //有乘除法无括号无负数有余数
    else if (pz1 == 1 && pz2 == 0 && pz3 == 0 && pz4 == 1)
    {
    for (int i = 0; i < 30; i++)
    {

    sc3();
    }
    }

    //有乘除法无括号无负数无余数
    else if (pz1 == 1&& pz2 == 0 && pz3 == 0 && pz4 == 0)
    {
    for (int i = 0; i < 30; i++)
    {

    sc4();
    }
    }
    //有乘除法有括号无负数无余数
    else if (pz1 == 1&& pz2 == 1 && pz3 == 0 && pz4 == 0)
    {
    int bianhuan1;
    bianhuan1 = (int)(rand() * 2) / RAND_MAX;
    for (int i = 0; i < 30; i++)
    {
    bianhuan1 = (int)(rand() * 2) / RAND_MAX;
    if (bianhuan1 == 0)
    {
    sc4();
    }
    else
    {
    kuohao2();
    }
    }
    }
    }
    void peizhi(bool&p1, bool&p2, bool&p3, bool&p4)
    {
    cout << "请选择设置:0/1"<<endl;
    cout << "是否有乘除法?" << endl;
    cin >> p1;
    cout << endl;
    cout << "是否有括号(最多可以支持十个数参与运算)" << endl;
    cin >> p2;
    cout << endl;
    cout << "加减有无负数" << endl;
    cin >> p3;
    cout << endl;
    cout << "除法有无负数" << endl;
    cin >> p4;
    cout << endl;

    }

    //根据算符余数,给出算符的函数(有乘除)
    char suanfu1(int sfys1)
    {

    switch (sfys1)
    {
    default:
    break;
    case 0:
    return '+'; break;
    case 1:
    return '-'; break;
    case 2:
    return'*'; break;
    case 3:
    return'/'; break;


    }
    }

    //生成算符余数函数(有乘除)
    int sfys1()
    {
    int suanfuNum;
    suanfuNum = (rand() * 100) / RAND_MAX;
    int suanfu = suanfuNum % 4;
    return suanfu;
    }

    //根据算符余数,给出算符的函数(无乘除)
    char suanfu2(int sfys2)
    {

    switch (sfys2)
    {
    default:
    break;
    case 0:
    return '+'; break;
    case 1:
    return '-'; break;


    }
    }

    //生成算符余数函数(无乘除)
    int sfys2()
    {
    int suanfuNum;
    suanfuNum = (rand() * 100) / RAND_MAX;
    int suanfu = suanfuNum % 2;
    return suanfu;
    }

    //生成操作数
    int czs()
    {
    int czsNum;
    czsNum = (rand() * 100) / RAND_MAX;
    return czsNum;
    }

    //生成括号运算式(无乘除)
    void kuohao1()
    {

    cout << '(' << czs() << suanfu2(sfys2()) << czs() << ')' << suanfu2(sfys2()) << czs()<<"="<<endl;
    }

    //生成括号运算式(有乘除)
    void kuohao2()
    {

    cout << '(' << czs() << suanfu1(sfys1()) << czs() << ')' << suanfu1(sfys1()) << czs()<<"=" << endl;
    }

    //输出类型1
    void sc1()
    {
    cout << czs() << suanfu2(sfys2()) << czs() << "="<<endl;
    }

    //输出类型2
    void sc2()
    {
    int opNum1 = czs(), opNum2 = czs();
    char op = suanfu1(sfys1());
    if (op == '/')
    {
    while (opNum2== 0)
    {
    opNum1 = czs();
    opNum2 = czs();
    }
    cout << opNum1 << op << opNum2 << "=" << endl;
    }
    else
    {
    cout << opNum1 << op << opNum2 << "=" << endl;
    }
    }

    //输出类型3,加减无负数
    void sc3()
    {
    int opNum1 = czs(), opNum2 = czs();
    char op = suanfu2(sfys2());
    if (op == '-')
    {
    while (opNum1 - opNum2 < 0)
    {
    opNum1 = czs();
    opNum2 = czs();
    }
    cout << opNum1 << op << opNum2 << "=" << endl;
    }
    else
    {
    cout << opNum1 << op << opNum2 << "=" << endl;
    }
    }

    //输出类型4,除法无余数
    void sc4()
    {
    int opNum1 = czs(), opNum2 = czs();
    char op = suanfu1(sfys1());
    if (op == '-')
    {
    while (opNum1 - opNum2 < 0)
    {
    opNum1 = czs();
    opNum2 = czs();
    }
    cout << opNum1 << op << opNum2 << "=" << endl;
    }
    else if (op == '/')
    {
    while (opNum1%opNum2 != 0||opNum2==0)
    {
    opNum1 = czs();
    opNum2 = czs();
    }
    cout << opNum1 << op << opNum2 << "=" << endl;
    }
    else
    {
    cout << opNum1 << op << opNum2 << "=" << endl;
    }
    }

  5. 总结:这次的实验对于我来说真的是很有难度,自己也花了很长时间,但还是对自己不满意,对于编程中的一些东西我还是要认真再学习。

    项目计划总结:

    日期&&任务 听课 编写程序 阅读相关书籍 网上查找资料   日总计
    周一 2 1 2 2 5
    周二   3    1 4
    周三          
    周四 2 2      
    周五   5  1 1  
    周六     2   2
    周日     2    
    周总计 4 14 7 4 6

    时间记录日志:

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    3/7 14:00 15:50 10 100 听课 软件工程上课
      16:00 18:20   140 编写程序 编写老师布置的作业
      19:00 21:00  10 110 阅读书籍 《构建之法》
      21:00 24:00 20 160 网上查找资料,编程 作业2,讨论问题
    3/8 16:00 18:00  10 110 查资料,编写程序 作业2
      21:00 21:50   50 阅读书籍 《构建之法》
    3/9            
    3/10 14:00 15:50  10 100 听课 软件工程上课
      19:00 21:20  20 100 查资料,编写程序 休息,聊天,作业2
    3/11 8:00 10:05  5 120 写博客 发表本周博客
      16:10 18:30  10 140 修改程序,写博客  测试程序,发表博客
      19:00 19:40   40 阅读书籍 《构建之法》
      19:45 21:45 10 110 写博客,修改程序 休息,聊天,发表博客
    3/12 9:00 9:30   30 阅读书籍 计划阅读《构建之法》
    3/13 19:00 19:30   30 阅读书籍  

    缺陷记录日志:

    还有一些功能没有实现,还是自己水平不够。

原文地址:https://www.cnblogs.com/wanzitou/p/5269519.html