四则运算2

在第一次的基础上,本次老师又提出了新的要求:

1.题目避免重复

2.可定制(数量\打印方式)

3.控制参数
是否有乘除法

是否有括号(最多支持十个数参与运算)

数值范围

加减有无负数
除法有无余数

 

分析:

首先需要解决有无括号的问题,再在它的基础上完成其他要求。基本思路是定义两个数组分别存放操作数和运算符,再将两个数组合成一个数组,在运算符和操作数前后开辟空间来存放括号,开辟的空间内若操作数前随机显示为左括号,则在其后几个操作数后添加右括号,若有操作数左右括号都存在,则左右括号位置置为空,避免重复没有想到明确的思路,数量可在循环里添加变量实现,乘除法通过if else语句,数值范围用输入的数带入随机函数产生,后两项着实理解不透

 

源代码:

#include<iostream>
#include<time.h>
using namespace std;
void main()
{
    srand((int)time(NULL));//设置随机种子,使得程序每次运行的结果都不同
    int subject_number;    //出题数量
    int a[100];    //将数字存入数组a
    char b[100];    //将运算符存入数组b
    char c[100];    //将左括号存入数组c
    char d[100];    //将右括号存入数组d
    int  e[100];    //合成总数组
    char random_bracket;    //随机生成括号
    int random_number = 0;    //运算数字字数
    int i = 0;
    int operation_character = 0;    
    int fuhao = 0;    //判定运算符
    int j;
    int k;
    int l;
    int p;
    int min, Max;    //定义输入的值得范围的最值
    int random_have;       //定义左、右括号的是否存在的随机变量
    char review_array;    //检查数组中左右括号之间是否还存在左右括号
    char left;    //左括号变量
    char right;    //左括号变量
    char sign = 'a ';   //符号赋初值
    bool result = 0;   //定义是否需要乘除法的变量
    bool need = 0;
    random_number = rand() % 10 + 2;    //随机生成2~10个数
    cout << "*************************************************" << endl;
    cout << "请输入产生数字的范围(最小和最大):";
    cin >> min >> Max;
    cout << "是否需要乘除法[0(yes)/1(no)]";
    cin >> result;
    cout << "请输入出题数量";
    cin >> subject_number;
        if (0 == result)
        {
            for (j = 0; j < subject_number; j++)    //设置题目数量
            {
                for (i = 0; i < random_number; i++)
                {
                    operation_character = rand() % (Max - min + 1) + min;
                    a[i] = operation_character;
                    fuhao = rand() % 4 + 1;
                    switch (fuhao)
                    {
                    case 1:sign = '+'; break;
                    case 2:sign = '-'; break;
                    case 3:sign = '*'; break;
                    case 4:sign = '/'; break;
                    }
                    b[i] = sign;
                    e[4 * i] = ' ';
                    e[4 * i + 1] = a[i];
                    e[4 * i + 3] = b[i];
                    e[4 * i + 2] = ' ';
                }
                random_have = rand() % 2 + 1;  //随机确定有无括号
                switch (random_have)
                {
                case 1:
                    left = '(';
                    right = ')';
                    break;
                case 2:
                    left = ' ';
                    right = ' ';
                    break;
                }

                for (i = 0; i < random_number; i++)
                {
                    for (k = 0; k < (random_number - 1) / 2; k++)
                    {
                        e[4 * k] = left;
                        if (left == '(')
                        {
                            e[4 * k + 10] = right;
                        }
                    }
                    if ((e[4 * i] == left)&&(e[4 * i + 2] == right))
                    {
                        e[4 * i] = ' ';
                        e[4 * i + 2] = ' ';
                    }
                    cout << (char)e[4 * i] << e[4 * i + 1] << (char)e[4 * i + 2] << (char)e[4 * i + 3];
                }

                cout << '\b' << "=" << endl;//使用退格符'\b'来消除数组b最后一个多出来的符号
            }
        }
        else
        {
            for (j = 0; j < subject_number; j++)    //设置题目数量
            {
                for (i = 0; i < random_number; i++)
                {
                    operation_character = rand() % (Max - min + 1) + min;
                    a[i] = operation_character;
                    fuhao = rand() % 4 + 1;
                    switch (fuhao)
                    {
                    case 1:sign = '+'; break;
                    case 2:sign = '-'; break;
                    case 3:sign = '*'; break;
                    case 4:sign = '/'; break;
                    }
                    b[i] = sign;
                    e[4 * i] = ' ';
                    e[4 * i + 1] = a[i];
                    e[4 * i + 3] = b[i];
                    e[4 * i + 2] = ' ';
                }
                random_have = rand() % 2 + 1;  //随机确定有无括号
                switch (random_have)
                {
                case 1:
                    left = '(';
                    right = ')';
                    break;
                case 2:
                    left = ' ';
                    right = ' ';
                    break;
                }

                for (i = 0; i < random_number; i++)
                {
                    for (k = 0; k < (random_number - 1) / 2; k++)
                    {
                        e[4 * k] = left;
                        if (left == '(')
                        {
                            e[4 * k + 10] = right;
                        }
                    }
                    if ((e[4 * i] == left) && (e[4 * i + 2] == right))
                    {
                        e[4 * i] = ' ';
                        e[4 * i + 2] = ' ';
                    }
                    cout << (char)e[4 * i] << e[4 * i + 1] << (char)e[4 * i + 2] << (char)e[4 * i + 3];
                }

                cout << '\b' << "=" << endl;//使用退格符'\b'来消除数组b最后一个多出来的符号
            }
        }
}

结果截图:

 

 

实验总结:

此次作业完成的质量很差,用了很长时间,试了很多思路,发现基础还是薄弱,老师提示的递归思路自己不会使用,数组使用过程也是磕磕绊绊小错不断,if()里两个等号的错误还是会犯,基本功能缺失很多,虽然本次作业完成质量不高,但是给了自己信心,让自己发现了很多弱点,要多看书,要有大致完全的思路再开始动手,不要惧怕新知识

posted @ 2016-03-12 08:37  四季信风  阅读(295)  评论(2编辑  收藏  举报