您的位置:首页 > 其它

四则运算2

2016-03-12 08:37 225 查看
在第一次的基础上,本次老师又提出了新的要求:

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()里两个等号的错误还是会犯,基本功能缺失很多,虽然本次作业完成质量不高,但是给了自己信心,让自己发现了很多弱点,要多看书,要有大致完全的思路再开始动手,不要惧怕新知识
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: