四则运算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()里两个等号的错误还是会犯,基本功能缺失很多,虽然本次作业完成质量不高,但是给了自己信心,让自己发现了很多弱点,要多看书,要有大致完全的思路再开始动手,不要惧怕新知识