二柱子升级版

一。实验思路二柱子的老师又提出了新的要求,要求能在线答题,保存错题。为了避免主函数代码过于重复,将“生成某一个范围内的随机数”、“生成随机的分数”、“生成一个运算符”、“判断整数的正负并取相反数”、“把int类型装换为string类型”、以及“含有括号的运算”、“含有真分数的运算”和“不含真分数的运算”等封装成函数。为了避免定义整型变量,计算时强制转化为整型,添加了string字符串类型来存储计算结果,并且将计算结果分为分子分母的形式输入,以保证计算结果的正确性。实验源代码如下:#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<string>
#include<fstream>
#include<iomanip>
#include<cmath>
#define random(x) (rand()%x)
using namespace std;

/*选择打印方式*/
void Output(int sf)
{
    if (sf == 1)//保存文档
    {
        ofstream outfile("formula.txt", ios::out);
        if (!outfile)
        {
            cout << "Open error!!" << endl;
            exit(1);
        }
        outfile << "----------------欢迎!小学生四则运算答题系统:-D----------------" << endl;
        outfile.close();
    }
}

/*判断输入0.1的是否输入正确*/
int Istrue_input(int mnu01)
{
    while (1)
    {
        if (mnu01 != 0 && mnu01 != 1)
        {
            cout << "输入有误,请重新输入(请输入0或1):" << endl;
            cin >> mnu01;
        }
        else
            break;
    }
    return mnu01;
}

/*生成一个某范围内的随机数(正负都有)*/
int Creat_random(int r1, int r2)
{
    int r, shu;
    r = r2 - r1;
    shu = r1 + rand() % r;
    return shu;
}

/*生成一个随机运算符*/
string Create_oper(int lai)
{
    srand((int)time(0));
    string sign;
    int Num_sym, Sign_num;
    if (lai == 0)//加减
        Num_sym = 2;
    else if (lai == 1)//加减乘除
        Num_sym = 4;
    Sign_num = rand() % Num_sym;//生成随机的数字代表运算符
    switch (Sign_num)
    {
    case(0) : sign = ‘+‘; break;
    case(1) : sign = ‘-‘; break;
    case(2) : sign = ‘*‘; break;
    case(3) : sign = ‘/‘; break;
    }
    return sign;
}

/*判断整数正负并取相反数*/
int Opp_zf(int a)
{
    if (a < 0)
        a = -a;
    return a;
}

/*把int类型转换为string类型*/
string Int_str(int shu)
{
    char zhuan[100];
    string str,zuo="(",you=")";
    str=itoa(shu, zhuan, 10);
    if (shu < 0)
        str = zuo + str + you;
    return str;
}

/*生成一个(某范围)真分数*/
void Creat_fen(int r1, int r2, string &fenshu, double &zhi)
{
    int i, r = r2 - r1, up, down, s;
    bool flag;
    string xian = "/", fu = "-", zuo = "(", you = ")";
    string zhuan1, zhuan2;
loop:do
    {
         flag = false;//不能定义全局变量!!
         up = r1 + rand() % r;
         up = Opp_zf(up);
         down = r1 + rand() % r;
         down = Opp_zf(down);
    } while ((up >= down) || (down == 0) || (up == 0));//分子≥分母 or 分母=0 or 分子=0 重新生成

    for (i = 2; i <= up; i++)
    {

        if (up%i == 0 && down%i == 0)
        {
            flag = true;//有公约数
            break;
        }
    }
    if (flag == true)
    {
        goto loop;
    }
    else
    {
        zhi = (double)up / (double)down;
        zhuan1 = Int_str(up);//up/down都是正数不会再加一层括号
        zhuan2 = Int_str(down);
        s = rand() % 2;
        switch (s)
        {
            //正分数
            case(0) :
                fenshu = zuo + zhuan1 + xian + zhuan2 + you;
                break;
            //负分数
            case(1) :
                fenshu = zuo + fu + zhuan1 + xian + zhuan2 + you;
                zhi = -zhi;
                break;
        }
    }

}

void Have_kuohao(int r1, int r2, string &formula,double &zhi)
{
    srand((int)time(0));
    int op,op1, op2;
    int yn, qh;
    string symbol1,symbol2;
    string zhuan,zhuan1, zhuan2;
    string jia = "+", jian = "-", cheng = "*", chu = "/",zuo="(",you=")";

    zhi = (double)Creat_random(r1, r2);
    op1 = Creat_random(r1, r2);
    op2 = Creat_random(r1, r2);
    op = Creat_random(r1, r2);//假设op2做分母不能为0
    while (1)
    {
        if (op == 0)
            op = Creat_random(r1, r2);
        else
            break;
    }
    zhuan1 = Int_str(zhi);
    zhuan2 = Int_str(op);
    symbol1 = Create_oper(1);

    if (symbol1 == "+")
    {
        zhi = (double)op1 + (double)op2;
        formula = zhuan1 + jia + zhuan2;
        yn = rand() % 2;
        switch (yn)
        {
            //外面不加括号
            case(0) : break;
            //外面加括号
            case(1) :
            {
                        formula = zuo + formula + you;
                        qh = rand() % 2;
                        symbol2 = Create_oper(1);
                        switch (qh)
                        {
                            //加到前面
                            case(0) :
                           {
                                    formula = symbol2 + formula;
                                    op = Creat_random(r1, r2);
                                    zhuan = Int_str(op);
                                    if (symbol2 == "+")
                                    {
                                        zhi = (double)op + zhi;
                                        formula = zhuan + jia + formula;
                                    }
                                    else if (symbol2 == "-")
                                    {
                                        zhi = (double)op - zhi;
                                        formula = zhuan + jian + formula;
                                    }
                                    else if (symbol2 == "*")
                                    {
                                        zhi = (double)op * zhi;
                                        formula = zhuan + cheng + formula;
                                    }
                                    else if (symbol2 == "/")
                                    {
                                        if (zhi == 0)//防止出现随机生成的除号后面的值为0;
                                            break;
                                        else
                                        {
                                            zhi = (double)op / zhi;
                                            formula = zhuan + chu + formula;
                                        }
                                    }
                                    break;

                             }
                             //加到后面
                            case(1) :
                            {
                                    formula = formula + symbol2;
                                    op = Creat_random(r1, r2);//防止后面随机产生除号,分母为0
                                    while (1)
                                    {
                                        if (op == 0)
                                            op = Creat_random(r1, r2);
                                        else
                                            break;
                                    }
                                    zhuan = Int_str(op);
                                    if (symbol2 == "+")
                                    {
                                        zhi = zhi + (double)op;
                                        formula = formula + jia + zhuan;
                                    }
                                    else if (symbol2 == "-")
                                    {
                                        zhi = zhi - (double)op;
                                        formula = formula + jian + zhuan;
                                    }
                                    else if (symbol2 == "*")
                                    {
                                        zhi = zhi * (double)op;
                                        formula = formula + cheng + zhuan;
                                    }
                                    else if (symbol2 == "/")
                                    {
                                        zhi = zhi / (double)op;
                                        formula = formula + chu + zhuan;
                                    }
                                    break;
                              }

                        }
                        break;
            }

        }

    }
    else if (symbol1 == "-")
    {
        zhi = (double)op1 - (double)op2;
        formula = zhuan1 + jian + zhuan2;
    }
    else if (symbol1 == "*")
    {
        zhi = (double)op1 * (double)op2;
        formula = zhuan1 + cheng + zhuan2;
    }
    else if (symbol1 == "/")
    {
        zhi = (double)op1 / (double)op2;
        formula = zhuan1 + chu + zhuan2;
    }

}

/*含有真分数*/
void Have_fenshu(int LL, int r1, int r2, string &formula, double &zhi, int jj)
{
    srand((int)time(0));
    string F1, F2, symbol, zhuan;
    double Z1, Z2;//值
    int inter, type;
    inter = Creat_random(r1, r2);//整数
    zhuan = Int_str(inter);
    Creat_fen(r1, r2, F1, Z1);//分数1
    Creat_fen(r1, r2, F2, Z2);//分数2
    symbol = Create_oper(LL);//符号
    type = rand() % 3;//类型

    if (jj == 0)//加减没有负数
    {
        inter = Opp_zf(inter);
        zhuan = Int_str(inter);
        while (1)
        {
            if (Z1 <0)
                Creat_fen(r1, r2, F1, Z1);
            else
                break;
        }
        while (1)
        {
            if (Z2 <0)
                Creat_fen(r1, r2, F2, Z2);
            else
                break;
        }
    }

    switch (type)
    {
        //op1分数
    case(0) :
        formula = F1 + symbol + zhuan;
        if (symbol == "+")
            zhi = Z1 + (double)inter;
        else if (symbol == "-")
        {
            if (jj == 0)
                break;
            else
                zhi = Z1 - (double)inter;
        }
        else if (symbol == "*")
            zhi = Z1 * (double)inter;
        else if (symbol == "/")
        {
            if (inter != 0)
                break;
            else
                zhi = Z1 / (double)inter;
        }
        break;
        //op2分数
    case(1) :
        formula = zhuan + symbol + F1;
        if (symbol == "+")
            zhi = (double)inter + Z1;
        else if (symbol == "-")
            zhi = (double)inter - Z1;
        else if (symbol == "*")
            zhi = (double)inter * Z1;
        else if (symbol == "/")
        {
            if (Z1 != 0)
                zhi = (double)inter / Z1;
            else
                break;
        }
        break;
        //全分数
    case(2) :
        formula = F1 + symbol + F2;
        if (symbol == "+")
            zhi = Z1 + Z2;
        else if (symbol == "-")
        {
            if ((jj == 0) && (Z1 < Z2))
                break;
            else
                zhi = Z1 - Z2;
        }
        else if (symbol == "*")
            zhi = Z1 * Z2;
        else if (symbol == "/")
        {
            if (Z1 != 0)
                zhi = Z1 / Z2;
            else
                break;
        }
        break;
    }

}

/*不含有真分数*/
void Only_integer(int LL, int r1, int r2, string &formula, double &zhi,int jj,int cc)
{
    srand((int)time(0));
    int op1, op2;
    string symbol,zhuan1,zhuan2;
    op1 = Creat_random(r1, r2);//整数1
    op2 = Creat_random(r1, r2);//整数2
    symbol = Create_oper(LL);//符号

    if (jj == 0)//加减不含负号
    {
        op1 = Opp_zf(op1);
        op2 = Opp_zf(op2);
        if ((symbol == "-") && (op1 < op2))
        {
            int temp;
            temp = op1;
            op1 = op2;
            op2 = temp;
        }
    }

    if ((cc == 0) && (symbol == "/"))//除法不含余数(去除负号计算的情况)
    {
        while (1)
        {
            op1 = Opp_zf(op1);
            op2 = Opp_zf(op2);
            if (op1 % op2 != 0)//有余数,重新生成
            {
                op1 = Creat_random(r1, r2);
                op2 = Creat_random(r1, r2);
            }
            else
                break;
        }
    }

    zhuan1 = Int_str(op1);
    zhuan2 = Int_str(op2);
    formula = zhuan1 + symbol + zhuan2;
    if (symbol == "+")
        zhi = op1 + op2;
    else if (symbol == "-")
        zhi = op1 - op2;
    else if (symbol == "*")
        zhi = op1*op2;
    else if (symbol == "/")
        zhi = op1 / op2;
}

void main()
{
    ofstream outfile("formula.txt", ios::out);
    if (!outfile)
    {
        cout << "open error!" << endl;
        exit(1);
    }
    outfile << "----------------欢迎!小学生四则运算答题系统:-D----------------" << endl;

    int i,j,N, R1, R2;
    int SF, KH, FS, Lei,JJ,CC,count=0;
    string question="";//生成的问题
    double Zhi, answer;
    int fenzi, fenmu;
    bool repeat = false;

    cout << "----------------欢迎!小学生四则运算答题系统:-D----------------"<<endl;
    /*选择题目范围和数量*/
    cout << "您想为孩子定制什么范围的题目呢?(可含有负数 && 上限≥下限):" << endl;
    cout << "下限:";
    cin >> R1;
    cout << "上限:";
    cin >> R2;
    while (1)//是否输入合法
    {
        if (R2 < R1)
        {
            cout << "输入的范围不合理,请重新输入(上限≥下限):" << endl;
            cout << "下限:";
            cin >> R1;
            cout << "上限:";
            cin >> R2;
        }
        else
            break;
    }

    cout << "订制多少道题呢?请输入个数:" << endl;
    cout << "(友情提示:您不要为孩子出太多的题目(最多1000道)!谢谢合作!)" << endl;
    cin >> N;
    while (1)//是否输入合法
    {
        if (N<=0||N>1000)
        {
            cout << "输入的题目数量不合理,请重新输入:" << endl;
            cin >> N;
        }
        else
            break;
    }

    /*选择打印方式*/
    cout << "您是否需要保存文档?(0、不需要 1、需要)" << endl;
    cin >> SF;
    SF=Istrue_input(SF);//是否输入合法
    Output(SF);

    cout << "*********下面请按照孩子的学习程度选择题目的难度!!*********"<<endl;
    /*是否含有括号*/
    cout << "是否练习带有括号的难度运算?(0、不需要 1、需要)";
    cin >> KH;
    KH=Istrue_input(KH);//是否输入合法
    if (KH == 1)//含括号
    {
        for (i = 1; i <= N; i++)
        {
            string Formula = "";
            double Zhi;
            Have_kuohao(R1, R2,Formula,Zhi);
        }

    }

    //不含括号
    else if (KH == 0)
    {
        /*加减运算或者四则运算*/
        cout << "请选择:0、只进行加减运算? 1、进行四则运算?";
        cin >> Lei;
        Lei=Istrue_input(Lei);//是否输入合法

        cout << "加减运算中是否有负数?(0、没有 1、有)";
        cin >> JJ;
        JJ = Istrue_input(JJ);

        if (Lei == 1)//乘除
        {
            cout << "除法中是否出现余数?(0、没有 1、有)";
            cin >> CC;
            CC = Istrue_input(CC);
        }

        /*是否含有真分数*/
        cout << "题目中是否含有真分数?(0、不需要 1、需要)";
        cin >> FS;
        Istrue_input(FS);//是否输入合法

        cout << N << "道题目如下:" << endl;
        if (SF == 1)//文件输出
        {
            outfile << N << "道题目如下:" << endl;
        }
        string ku[10000] ;

        for (i = 1; i <= N; i++)
        {
            if (FS == 0)//全整数
                Only_integer(Lei, R1, R2, question, Zhi, JJ, CC);
            else if (FS == 1)//含真分数
                Have_fenshu(Lei, R1, R2, question, Zhi, JJ);

            ku[i] = question;
            for (j = 0; j <i; j++)
            {
                if (ku[j] == ku[i])
                {
                    i = i - 1;
                    repeat = true;//重复
                    break;
                }
            }
            if (!repeat)//不重复
            {
                /*Is_rept(i,str);*/
                cout << i << "、 " << question << " = " << endl;
                if (SF == 1)//文件输出
                {
                    outfile << i << "、 " << question << " = " << Zhi << endl;
                }

                if ((Zhi - (int)Zhi)< 1E-7 && (Zhi - (int)Zhi)> -(1E-7))//可认为它是整数
                {
                    cin >> answer;
                }
                else
                {
                    cout << "    分子:";
                    cin >> fenzi;
                    cout << "    分母:";
                    cin >> fenmu;
                    answer = (double)fenzi / (double)fenmu;
                }

                if ((answer - Zhi) < 1E-7 && (answer - Zhi) > -(1E-7))
                {
                    cout << "                        √" << endl;
                    count++;
                }
                else
                {
                    cout << "                        ×" << endl;
                    cout << "答案是:" << Zhi << endl;
                }
            }
        }

        cout << "您的孩子一共答对了" << count << "道题目!! 恭喜!!" << endl;
        if (SF == 1)//文件输出
        {
            outfile << "您的孩子一共答对了" << count << "道题目!! 恭喜!!" << endl;
        }
        cout << "答错的" << N - count << "道题目请分析原因并改正~~  加油!!" << endl;
        if (SF == 1)//文件输出
        {
            outfile << "答错的" << N - count << "道题目请分析原因并改正~~  加油!!" << endl;
        }
    }
    outfile.close();

}实验结果照片:

实验总结和反思

通过本次实验进一步提高了自己的编程能力,初步的了解了一部分类库,能够初步的运用,初步温习了定义数组时的要求,不同的语言对于定义数组的要求不同,

原文地址:https://www.cnblogs.com/1079928341qqcom/p/9879017.html

时间: 2024-10-16 15:53:58

二柱子升级版的相关文章

二柱子升级版在线答题

题目要求:1.实现在线答题 2.答题结束后可以判断对错 3.可以将错题结果保存起来 #include<iostream.h>#include<stdlib.h>#include<time.h>void boom(){float x,y;int z,t; int first_num,second_num,third_num,fourth_num;srand(time(NULL));int n;float k;float d;float daan[100];int zq=0

二柱子四则运算定制版+升级版

题目:在上次程序的基础上,实现对连除的判断,并且实现多个数的混合运算,要求可以输入结果,并进行判断. 思路:基于上次程序,首先思考混合运算,这里运用两个数组,分别记录随机产生的运算数和运算符号.然后对连除进行判断,,检查运算符号数组里是否有连续的除号,有的话加上括号,避免歧义.最后对运算结果进行计算,并对用户输入的结果进行比较,给出相应提示,回答,计算方面,要优先对括号,乘除进行运算,然后再进行加减运算,每次运算完后都要记录下运算的结果. 代码: //吕广浩 3/19 #include<iost

RIGHT-BICEP单元测试——“二柱子四则运算升级版”

RIGHT-BICEP单元测试 ——“二柱子四则运算升级版” ”单元测试“这对于我们来说是一个全新的专业含义,在上了软件工程这门课,并当堂编写了简单的"求一组数中的最大值"函数的单元测试之后,我们对它有了全新的认识. 单元测试:即为, 老师让我们回去之后将“二柱子四则运算升级版”的程序进行单元测试(二柱子程序的源码我已经上传,这里不再重复,只列举单元测试的部分和分析),如下: PS.这里附上老师上课讲的关于RIGHT-BICEP测试的方法: 6个值得测试的具体部位,他们能够提高我们的测

二柱子四则运算3

二柱子四则运算3 可怜的二柱子……又一次被坑了…… 老师又在上次的“二柱子四则运算2”的基础上增添了要求,如下: 1.学生写的程序必须能判定用户的输入答案是否正确.直到题目结束,告诉用户做对了几道题. 2.程序必须能处理四种运算的混合模式. 注意:连续的减法和除法,应该遵守左结合的规定. 连续除法要打括号,否则会引起歧义. 一.实验思路 二.实验源代码 三.实验总结和反思 最后,附上我和我的小伙伴的工作照……没有正脸.老师们不要介意啦啦啦~~~~ 小伙伴博客内容页:http://www.cnbl

二柱子的难题02

老师又向二柱子提出一些要求,二柱子很崩溃 具体要求如下: 题目避免重复 可定制(数量/打印方式) 可控制参数    1是否有乘除法    2是否有括号    3数值范围    4加减法有无负数    5除法有无余数 可怜的二柱子经过8h的奋战,终于在01版本的基础上改出了满足要求的02版本 1 #include <iostream> 2 #include <iomanip> 3 #include <fstream> 4 #include <ctime> 5

二柱子问题扩充:1、题目避免重复; 2、可定制(数量/打印方式); 3、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;

程序设计思想 程序的主要设计思想为用字符串数组保存生成的运算题,将操作数采用单独算法处理,然后进行类型转换和操作符一起存入数组中,鉴于字符串的特性,可以对字符串的长度进行随意添加而不必考虑长度问题,最后进行字符串数组的输出产生客户要求的运算题; 源代码 #include<stdlib.h> #include<conio.h> #include<time.h> #include<iostream> #include<string> #include

150313 那个可怜的二柱子同学

今天的软件工程概论课,老师出了这么个问题: 可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求: 题目避免重复 可定制(数量.打印方式): 可以控制下列参数:是否有乘除法.数值范围.加减有无负数.除法有无余数.是否支持分数(真分数.假分数): 我想了两种解决方法: 一.使用数据库: 避免重复:随机数及符号大量生成录入数据库,生成md5,数据库查询(Select Distinct MD5,第一整数,符号,第二整数 from 题目表). 定制:输入框,输入题目数量.打印方式可以用[x++ if

二柱子的出题软件

二柱子的软件 支持真分数的四则运算 可定义出题数量 #define _CRT_SECURE_NO_DEPRECATE#include<stdio.h>#include<Windows.h>#include<time.h>int main(){ int a, b, c, d, e, f, g, k; float p, q; printf("请输入想要の数量"); scanf("%d",&k); srand(unsigned(

二柱子2.0编程总结

                                                                                时间记录表: 学生         王美仪                单位(分钟)         日期        2018.10.8             教师         王建民 日期 开始时间 结束时间 中断时间 净时间 活动 备注 2018.10.8 18:30 19:52 0 82 编程 基本完成 2018310.