随着又一次软件工程课的来临,老师再一次给我们布置了新的作业,这次作业是上一次的改良版,有了更多的要求
一.题目避免重复
二.定制(数量/打印方式)
三.控制参数
1.是否有乘除法
2.是否有括号
3.数值范围
4.加减有无负数
5.除法有无余数
题目避免重复,可以通过存入算式到数组,生成之后的算式时比较,如果重复则重新生成。
控制是否有乘除法可以通过改变随机生成时的参数来实现。
难度最大的就是生成括号了,这个需要考虑生成括号的位置,个数,括号的叠加等等。
位置可以通过设置数组代替,对应数字只有左右两边两个位置才能生成括号,可以通过左括号数组和右括号数组来控制。每生成一个左括号,就在合适的位置生成一个右括号。
数字范围可以通过控制rand生成随机数的参数来实现。
因为涉及到数字之间的比较,加减有无负数,除法有无余数暂时还未想到办法实现
以下便是我这次作业的源代码:
1 //练习二,练习一问题扩充 可以控制:是否有乘除,是否有括号,数值范围 2 //赵承圣 2016.3.11 3 #include<iostream> 4 #include<ctime> 5 #include<string> 6 using namespace std; 7 8 void main() 9 { 10 //数据定义部分 11 srand((int)time(NULL)); 12 int control[2],num_max,num_min,num_num,bracket_num; 13 string item[30]; 14 char symbol[4]; //随机计算符号数组 15 symbol[0] = '+'; 16 symbol[1] = '-'; 17 symbol[2] = '*'; 18 symbol[3] = '/'; 19 20 // 输入部分 21 cout<<"是否有乘除(2 否/4 是): "; 22 cin>>control[0]; 23 cout<<"是否有括号(1 否/0 是): "; 24 cin>>control[1]; 25 cout<<"数字最大取值: "; 26 cin>>num_max; 27 cout<<"数字最小取值: "; 28 cin>>num_min; 29 30 31 //算式生成部分 32 for(int count=0;count<30;count++) 33 { 34 num_num=rand()%10; 35 if(num_num==0||num_num==1) 36 { 37 count--; 38 continue; 39 } 40 41 //定义并初始化动态数组 num:数字数组 symnum:符号选择数组 sym:符号数组 42 int *num=new int[num_num]; 43 int *symnum=new int[num_num-1]; 44 char *sym=new char[num_num-1]; 45 46 int bracket_leftposition,bracket_rightposition; //定义左、右括号生成的位置 47 int *bracket_left_time=new int[num_num]; //定义左、右括号生成次数数组,下标为数字位置 48 int *bracket_right_time=new int[num_num]; 49 string *bracket_left=new string[num_num](); //定义左右括号字符串型数组 50 string *bracket_right=new string[num_num](); 51 for(int rcount=0;rcount<num_num;rcount++) //左、右括号生成次数初始化 52 { 53 bracket_left_time[rcount]=0; 54 bracket_right_time[rcount]=0; 55 } 56 57 if(control[1]==0) 58 { 59 bracket_num=rand()%5+1; //生成括号次数 60 for(int bcount=0;bcount<bracket_num;bcount++) 61 { 62 bracket_leftposition=rand()%num_num; //随机生成左右括号的位置 63 bracket_rightposition=rand()%num_num; 64 if(bracket_leftposition==bracket_rightposition) //先剔除部分一次性在一个数左右同时生成左右括号的情况 65 { 66 break; 67 } 68 bracket_left_time[bracket_leftposition]++; //该位置数左括号生成次数+1 69 if(bracket_left_time[bracket_leftposition]==1) 70 { 71 bracket_left[bracket_leftposition]="("; 72 } 73 if(bracket_left_time[bracket_leftposition]==2) 74 { 75 bracket_left[bracket_leftposition]="(("; 76 } 77 if(bracket_left_time[bracket_leftposition]==3) 78 { 79 bracket_left[bracket_leftposition]="((("; 80 } 82 bracket_right_time[bracket_rightposition]++; 83 if(bracket_right_time[bracket_rightposition]==1) 84 { 85 bracket_right[bracket_rightposition]=")"; 86 } 87 if(bracket_right_time[bracket_rightposition]==2) 88 { 89 bracket_right[bracket_rightposition]="))"; 90 } 91 if(bracket_right_time[bracket_rightposition]==3) 92 { 93 bracket_right[bracket_rightposition]=")))"; 94 } 95 for(int bpcount=0;bpcount<num_num;bpcount++) //再次扫描数字左右括号生成次数相等的情况并排除 96 { 97 if(bracket_left_time[bpcount]==bracket_right_time[bpcount]) 98 { 99 bracket_right[bpcount]=""; 100 bracket_left[bpcount]=""; 101 } 102 } 103 } 104 } 105 //给参与计算的数赋值(指定数值范围) 106 for(int cnum=0;cnum<num_num;cnum++) 107 { 108 num[cnum]=rand()%(num_max-num_min+1)+num_min; 109 } 110 111 //随机生成式子的各个位置的符号 112 for(int snum=0;snum<num_num-1;snum++) 113 { 114 symnum[snum]=rand()%control[0]; 115 sym[snum]=symbol[symnum[snum]]; 116 } 117 118 //输出算式 119 for(int ph=0;ph<num_num-1;ph++) 120 { 121 cout<<bracket_left[ph]<<num[ph]<<bracket_right[ph]<<sym[ph]; 122 } 123 cout<<bracket_left[num_num-1]<<num[num_num-1]<<bracket_right[num_num-1]<<endl; 124 125 if(count==29) 126 { 127 delete []num; 128 delete []symnum; 129 delete []sym; 130 delete []bracket_left_time; 131 delete []bracket_right_time; 132 delete []bracket_left; 133 delete []bracket_right; 134 } 135 136 } 137 system("pause"); 138 }
此程序在生成括号处出现问题,因时间关系暂时未解决。
以下便是结果截图
PS:括号问题已解决,因存在一条冗余代码影响了结果,在本文中已修改!