这次题目的要求是:1、题目避免重复;2、可定制(数量、打印方式);3、可以控制下列参数:是否有乘除法、是否有括号、数值范围、加减有无负数、除法有无余数。刚拿到这个题目的时候有点懵,因为要求很多,感觉很难,后来又仔细分析了一下,将题目进行分解,感觉稍微有了点思路。
首先题目避免重复的话就应该跟之前的四则运算一样用一个时间种子;然后就是打印题目的数量以及数值范围,这个可以让用户进行输入;然后可以用switch语句控制是否有乘除法,是否有括号;当有乘除法时要判断除数是否为0,为0的话就交换除数和被除数的位置;另外还要判断是否有余数,可以用求余运算,如果判断出来有余数,就可以通过被除数减去余数得到一个新的数值,然后输出的时候直接输出这个新的数值除以除数;当判断加减有无负数时,可以判断减数和被减数的大小,若被减数小于减数,则将两者交换位置,否则直接输出;当有括号时,我想的是用堆栈,但是具体怎样实现还没有想出来。
我本来是打算用2个小时的时间编出来,实际则用了3个小时还要多一点,具体代码如下:
1 //张晓菲,2016/3/12 2 //要求:1、题目避免重复; 3 // 2、可定制(数量、打印方式); 4 // 3、可以控制下列参数:是否有乘除法、是否有括号、数值范围、加减有无负数、除法有无余数。 5 6 #include<iostream> 7 #include<time.h> 8 #include <cmath> 9 #include<string> 10 using namespace std; 11 12 void main() 13 { 14 srand( (unsigned)time( NULL ) );//时间种子防止每次产生的随机数相同 15 int num1,num2,max,oper; 16 int ran[10]; 17 int i; 18 19 cout<<"请输入要打印的数量:"; 20 cin>>num1; 21 if(num1<=0) 22 { 23 cout<<"请重新输入要打印的数量:"; 24 cin>>num1; 25 } 26 27 cout<<"请输入可以允许随机产生的最大数值:"; 28 cin>>max; 29 if(max<=0) 30 { 31 cout<<"请重新输入可以允许的最大数值:"; 32 cin>>max; 33 } 34 35 cout<<"请输入允许几个操作数:"; 36 cin>>num2; 37 if(num2<=1) 38 { 39 cout<<"请重新输入允许几个操作数(1<x<=3):"; 40 cin>>num2; 41 } 42 43 cout<<"请选择是否有乘除法(1:是 0:否):"; 44 cin>>i; 45 46 for(int x=0;x<num1;x++) 47 { 48 for(int j=0;j<num2;j++) 49 { 50 ran[j]=rand()%(max+1); 51 } 52 oper=rand()%4;//oper用来决定进行什么四则运算 53 switch(i)//用于选择是否有乘除法 54 { 55 case 0://没有乘除 56 switch(num2) 57 { 58 case 2://有两个操作数 59 switch(oper) 60 { 61 case 0: 62 case 1: 63 cout<<ran[0]<<"+"<<ran[1]<<"="<<endl;//进行加运算 64 break; 65 case 2: 66 case 3: 67 if(ran[0]<ran[1]) 68 { 69 int a=ran[0]; 70 ran[0]=ran[1]; 71 ran[1]=a; 72 } 73 cout<<ran[0]<<"-"<<ran[1]<<"="<<endl;//进行减运算 74 break; 75 } 76 break; 77 case 3://有3个操作数 78 switch(oper) 79 { 80 case 0: 81 cout<<ran[0]<<"+"<<ran[1]<<"+"<<ran[2]<<"="<<endl; 82 break; 83 case 1: 84 if(ran[1]<ran[2]) 85 { 86 int a=ran[1]; 87 ran[1]=ran[2]; 88 ran[2]=a; 89 } 90 cout<<ran[0]<<"+"<<ran[1]<<"-"<<ran[2]<<"="<<endl; 91 break; 92 case 2: 93 if((ran[0]-ran[1]-ran[2])<0)//判断结果是否为负数,如果是,则将减号变为加号输出 94 { 95 cout<<ran[0]<<"+"<<ran[1]<<"+"<<ran[2]<<"="<<endl; 96 } 97 else 98 cout<<ran[0]<<"-"<<ran[1]<<"-"<<ran[2]<<"="<<endl; 99 break; 100 case 3: 101 if(ran[0]<ran[1])//判断ran[0]-ran[1]是否大于0,小于则交换位置 102 { 103 int a=ran[0]; 104 ran[0]=ran[1]; 105 ran[1]=a; 106 } 107 cout<<ran[0]<<"-"<<ran[1]<<"+"<<ran[2]<<"="<<endl; 108 break; 109 } 110 break; 111 } 112 break; 113 case 1://有乘除 114 switch(num2) 115 { 116 //如果有两个操作数 117 case 2: 118 switch(oper) 119 { 120 case 0: 121 cout<<ran[0]<<"+"<<ran[1]<<"="<<endl;//进行加运算 122 break; 123 case 1: 124 if(ran[0]<ran[1]) 125 { 126 int a=ran[0]; 127 ran[0]=ran[1]; 128 ran[1]=ran[0]; 129 } 130 cout<<ran[0]<<"-"<<ran[1]<<"="<<endl;//进行减运算 131 break; 132 case 2: 133 cout<<ran[0]<<"*"<<ran[1]<<"="<<endl; 134 break; 135 case 3: 136 if(ran[1]==0) 137 ran[1]=rand()%100;//判断除数是否为0,如果是,则重新生成 138 if(ran[0]%ran[1]!=0) 139 ran[0]=ran[0]-ran[0]%ran[1]; 140 cout<<ran[0]<<"/"<<ran[1]<<"="<<endl;//进行除运算 141 break; 142 } 143 break; 144 145 //如果有三个操作数 146 case 3: 147 int oper1,oper2; 148 oper1=rand()%16; 149 oper2=rand()%16; 150 string list[16]; 151 //固定表达式的形式,一共四种:A+B-C、A-B*C、A*B/C、A/B+C 152 switch(oper1) 153 { 154 case 0: 155 case 1: 156 case 2: 157 case 3: 158 list[oper1]='+'; 159 list[oper2]='-'; 160 break; 161 case 4: 162 case 5: 163 case 6: 164 case 7: 165 list[oper1]='-'; 166 list[oper2]='*'; 167 break; 168 case 8: 169 case 9: 170 case 10: 171 case 11: 172 list[oper1]='*'; 173 list[oper2]='/'; 174 break; 175 case 12: 176 case 13: 177 case 14: 178 case 15: 179 list[oper1]='/'; 180 list[oper2]='+'; 181 break; 182 } 183 //形如A/B+C的式子,判断B是否为0以及A/B是否能除尽 184 if(oper1==12||oper1==13||oper1==14||oper1==15) 185 { 186 if(ran[1]==0) 187 ran[1]=rand()%(max+1); 188 if(ran[0]%ran[1]!=0) 189 ran[0]=ran[0]-ran[0]%ran[1]; 190 cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 191 } 192 //形如A+B/C的式子,判断C是否为0以及B/C是否能除尽 193 if(oper1==8||oper1==9||oper1==10||oper1==11) 194 { 195 if(ran[2]==0) 196 ran[2]=rand()%(max+1); 197 if(ran[1]%ran[2]!=0) 198 ran[1]=ran[1]-ran[1]%ran[2]; 199 cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 200 } 201 //形如A-B*C的式子,判断结果是否为负数,如果为负数,则判断A-B是否小于0,不小于则直接输出(A-B)*C,小于则交换AB位置 202 if(oper1==4||oper1==5||oper1==6||oper1==7) 203 { 204 if((ran[0]-(ran[1]*ran[2]))<0) 205 { 206 if(ran[0]-ran[1]>=0) 207 cout<<'('<<ran[0]<<list[oper1]<<ran[1]<<')'<<list[oper2]<<ran[2]<<endl; 208 else 209 { 210 int a=ran[0]; 211 ran[0]=ran[1]; 212 ran[1]=a; 213 cout<<'('<<ran[0]<<list[oper1]<<ran[1]<<')'<<list[oper2]<<ran[2]<<endl; 214 } 215 } 216 else 217 cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 218 } 219 //形如A+B-C的式子,判断结果是否为负数,如果是,则交换B和C的位置 220 221 if(oper1==0||oper1==1||oper1==2||oper1==3) 222 { 223 if(((ran[0]+ran[1])-ran[2])<0) 224 { 225 int a=ran[1]; 226 ran[1]=ran[2]; 227 ran[2]=a; 228 } 229 cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 230 } 231 break; 232 } 233 break; 234 } 235 } 236 }
运行结果如下图:
这次是否有括号这个功能用户不能选择,没有支持分数的运算,也没让它输出到文件,还有我设定只能有两个或三个操作数,如果操作数再多的话我就不知道该怎么办了,感觉自己用的方法很笨很啰嗦,但是不知道怎么能更简单,虽然感觉自己的编程能力挺不好的,但是通过这么一次次的努力,也提升了不少,希望以后自己更加努力,然后有一个更大的提升。
时间记录: