四则运算的扩展

 扩展:

  接受用户输入答案,并显示结果和答对个数。

附上代码:

  1 #include<iostream>

  2 #include<conio.h>

  3 #include<cstdlib>

  4 #include<ctime>

  5 #include <iomanip>

  6 using namespace std;

  7 

  8 void Rand_Cal_one(int digits[],char characters[],int range)  //随机产生运算数(包含乘除)

  9 {

 10     for(int i=0;i<6;i++){

 11         if(i<3){

 12             digits[i]=rand()%range;//生成四则运算的计算随机数

 13             continue;

 14         }

 15         else if(i<5){

 16             digits[i]=rand()%4;//随机产生标志判断计算符号

 17             continue;

 18         }

 19         else{

 20             digits[i]=rand()%2;//随机产生标志数判断括号位置

 21         }

 22     }

 23 }

 24 

 25 void Rand_Cal_two(int digits[],char characters[],int range)  //随机产生运算数(不含乘除)

 26 {

 27     for(int i=0;i<6;i++){

 28         if(i<3){

 29             digits[i]=rand()%range;//生成四则运算的计算随机数

 30             continue;

 31         }

 32         else if(i<5){

 33             digits[i]=rand()%2;//随机产生标志判断计算符号

 34             continue;

 35         }

 36         else{

 37             digits[i]=rand()%2;//随机产生标志数判断括号位置

 38         }

 39     }

 40 }

 41 

 42 void Demo(int digits[],char characters[],char * Arithmetic_arr[],double results[],int m,int n) //产生符合要求的运算式

 43 {

 44     char character1,character2;

 45     int character3,character4,range;

 46     cout<<"请输入数字范围(最大值):"<<endl;

 47     cin>>range;

 48     cout<<"请选择是否带括号: Y表示带括号,N表示不带括号"<<endl;

 49     cin>>character1;

 50     cout<<"请选择是否有乘除: Y表示有乘除,N表示无乘除"<<endl;

 51     cin>>character2;

 52     cout<<"请选择每行容纳算是数量:"<<endl;

 53     cin>>character3;

 54     

 55     if(character3!=1){    

 56         cout<<"请选择行间距(1-n):"<<endl;    

 57         cin>>character4;

 58     }

 59     

 60     cout<<"-------------------"<<m<<"道算式题如下-------------------------"<<endl;

 61     

 62     for(int k=0; k<m; k++){

 63         int flag=k+1;

 64 P:

 65         if (character2=='Y'){

 66             Rand_Cal_one(digits,characters,range);

 67         }

 68         else{

 69             Rand_Cal_two(digits,characters,range);

 70         }

 71         Arithmetic_arr[k]=new char[n];    

 72         if(k!=0){    

 73             for(int i=0;i<k;i++){        

 74                 if( digits[0]==Arithmetic_arr[i][0]                    //避免重复

 75                     && characters[digits[3]]==Arithmetic_arr[i][1]

 76                     && digits[1]==Arithmetic_arr[i][2]

 77                     && characters[digits[4]]==Arithmetic_arr[i][3]

 78                     && digits[2]==Arithmetic_arr[i][4]

 79                     &&digits[5]==Arithmetic_arr[i][5]){

 80                     

 81                     goto P;    

 82                 }

 83             }

 84         }

 85         

 86         Arithmetic_arr[k][0]=digits[0];        //第一个操作数

 87         Arithmetic_arr[k][1]=characters[digits[3]];//第一个运算符

 88         Arithmetic_arr[k][2]=digits[1];        //第二个操作数

 89         Arithmetic_arr[k][3]=characters[digits[4]];//第二个运算符

 90         Arithmetic_arr[k][4]=digits[2];        //第三个操作数

 91         Arithmetic_arr[k][5]=digits[5];   //存放括号位置标志

 92         

 93         if (character1=='Y'){

 94             double result1=1,result2=1;

 95             switch(digits[5]){    

 96             case 0:

 97                   //计算括号里面的值,并赋值在result中

 98                 switch(characters[digits[3]])

 99                 {

100                 case '+':result1=(double)digits[0]+(double)digits[1];break;

101                 case '-':result1=(double)digits[0]-(double)digits[1];break;

102                 case '*':result1=(double)digits[0]*(double)digits[1];break;

103                 case '/':result1=(double)digits[0]/(double)digits[1];break;

104                 }

105                 switch(characters[digits[4]])

106                 {

107                 case '+':results[k]=(double)result1+(double)digits[2];break;

108                 case '-':results[k]=(double)result1-(double)digits[2];break;

109                 case '*':results[k]=(double)result1*(double)digits[2];break;

110                 case '/':results[k]=(double)result1/(double)digits[2];break;

111                 }

112                 if((characters[digits[3]]=='/'&&digits[1]==0)||(characters[digits[4]]=='/'&&digits[2]==0))//数学规则,商不能为0

113                 {

114                     goto P;

115                 }

116                 else

117                 {

118                     if((characters[digits[3]]=='+'||characters[digits[3]]=='-')        //括号在前

119                         &&(characters[digits[4]]=='*'||characters[digits[4]]=='/'))    //排除无用括号

120                     {

121                         cout<<"(";

122                         if((int)Arithmetic_arr[k][0]<0)

123                         {

124                             cout<<"("<<(int)Arithmetic_arr[k][0]<<")";

125                         }

126                         else

127                             cout<<(int)Arithmetic_arr[k][0];

128                         cout<<Arithmetic_arr[k][1];

129                         if((int)Arithmetic_arr[k][2]<0)

130                         {

131                             cout<<"("<<(int)Arithmetic_arr[k][2]<<")";

132                         }

133                         else

134                             cout<<(int)Arithmetic_arr[k][2];

135                         cout<<")"<<Arithmetic_arr[k][3];

136                         if((int)Arithmetic_arr[k][4]<0)

137                         {

138                             cout<<"("<<(int)Arithmetic_arr[k][4]<<")";

139                         }

140                         else

141                             cout<<(int)Arithmetic_arr[k][4];

142                         cout<<"=";

143 

144                         if(flag%character3==0) {cout<<endl;}

145                         else {cout<<setw(character4);}

146                         

147                         break;

148                     }

149                     else 

150                     {

151                         goto P;

152                     }

153                 }

154                 

155             case 1:  //括号在后

156                 switch(characters[digits[4]])

157                 {

158                 case '+':result2=(double)digits[1]+(double)digits[2];break;

159                 case '-':result2=(double)digits[1]-(double)digits[2];break;

160                 case '*':result2=(double)digits[1]*(double)digits[2];break;

161                 case '/':result2=(double)digits[1]/(double)digits[2];break;

162                 }

163                 switch(characters[digits[3]])

164                 {

165                 case '+':results[k]=(double)digits[0]+(double)result2;break;

166                 case '-':results[k]=(double)digits[0]-(double)result2;break;

167                 case '*':results[k]=(double)digits[0]*(double)result2;break;

168                 case '/':results[k]=(double)digits[0]/(double)result2;break;

169                 }

170                 if((characters[digits[4]]=='/'&&digits[2]==0)||(characters[digits[3]]=='/'&&result2==0))    //数学规则,商不能为0

171                 {

172                     goto P;

173                 }

174                 else

175                 {

176                     if((characters[digits[3]]=='*'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-'))

177                         ||(characters[digits[3]]=='/'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-'||characters[digits[4]]=='*'))

178                         ||(characters[digits[3]]=='-'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-')))    //排除无用括号    

179                     {    

180                         if((int)Arithmetic_arr[k][0]<0)

181                         {

182                             cout<<"("<<(int)Arithmetic_arr[k][0]<<")";

183                         }

184                         else

185                             cout<<(int)Arithmetic_arr[k][0];

186                         cout<<Arithmetic_arr[k][1];

187                         cout<<"(";

188                         if((int)Arithmetic_arr[k][2]<0)

189                         {

190                             cout<<"("<<(int)Arithmetic_arr[k][2]<<")";

191                         }

192                         else

193                             cout<<(int)Arithmetic_arr[k][2];

194                         cout<<Arithmetic_arr[k][3];

195                         if((int)Arithmetic_arr[k][4]<0)

196                         {

197                             cout<<"("<<(int)Arithmetic_arr[k][4]<<")";

198                         }

199                         else

200                             cout<<(int)Arithmetic_arr[k][4];

201                         cout<<")"<<"=";

202                         

203                         if(flag%character3==0) {cout<<endl;}

204                         else {cout<<setw(character4);}

205                         break;

206                     }

207                     

208                     else 

209                     {

210                         goto P;

211                     }

212                 }

213             }    

214         }

215         else{

216             

217             if((int)Arithmetic_arr[k][0]<0)

218             {

219                 cout<<"("<<(int)Arithmetic_arr[k][0]<<")";

220             }

221             else

222                 cout<<(int)Arithmetic_arr[k][0];

223             cout<<Arithmetic_arr[k][1];

224             if((int)Arithmetic_arr[k][2]<0)

225             {

226                 cout<<"("<<(int)Arithmetic_arr[k][2]<<")";

227             }

228             else

229                 cout<<(int)Arithmetic_arr[k][2];

230             cout<<Arithmetic_arr[k][3];

231             if((int)Arithmetic_arr[k][4]<0)

232             {

233                 cout<<"("<<(int)Arithmetic_arr[k][4]<<")";

234             }

235             else

236                 cout<<(int)Arithmetic_arr[k][4];

237             cout<<"=";

238             if(flag%character3==0) {cout<<endl;}

239             else {cout<<setw(character4);}

240         }

241     }        

242 }

243 

244 int main()

245 {

246     while(1)

247     {

248         cout<<"------------------小学生四则运算产生器-------------------"<<endl;

249         

250         srand((unsigned)time(NULL));    //为rand()函数生成不同的随机种子

251         

252         int num1,num2=6,num3;

253         

254         cout<<"请输入定制数目(输入零结束):"<<endl;      //题目数

255         

256         cin>>num1;

257 

258         cout<<"答案小数精确度:"<<endl;      //题目数

259         

260         cin>>num3;

261         

262         if(num1==0){

263 

264             cout<<"---------------------谢谢使用!!!----------------------"<<endl;

265             exit(0);

266         }

267         

268         char ** Arithmetic_arr=new char*[num1];  //存放运算式动态数组

269 

270         double * results=new double[num1];

271 

272         double * answer=new double[num1];  //正确答案数组results与接收答案数组answer

273         

274         int digits[6];                    //存放计算的随机数字的数组,前三个为随机运算数字,第四第

275                                         //五为随机产生运算符号标志数,第六为判断括号位置标志数。

276         int count=0;

277 

278         char characters[6]={'+','-','*','/','(',')'};    //存放加减乘除及括号等字符数组

279         

280         Demo(digits,characters,Arithmetic_arr,results,num1,num2);  //调用计算函数

281         

282         delete [] Arithmetic_arr;  //释放动态数组空间

283 

284         cout<<"---------------------------------------------------------"<<endl;

285 

286         cout<<"请输入结果:"<<endl;

287 

288         for(int i=0;i<num1;i++)

289         {

290             cout<<""<<i+1<<"题答案是:    ";

291             cin>>answer[i];

292         }

293         for(int j=0;j<num1;j++)

294         {

295             if(results[j]==answer[j])

296             {

297                 count++;

298             }

299         }

300         cout<<"---------------------------------------------------------"<<endl;

301         cout<<"按回车显示答案!"<<endl;

302         cout<<"---------------------------------------------------------"<<endl;

303 

304         getch();

305 

306         for(int k=0;k<num1;k++)

307         {

308             cout<<""<<k+1<<"题正确答案是:    "<<fixed<<setprecision(num3)<<results[k]<<endl;

309         }

310         cout<<"---------------------------------------------------------"<<endl;

311 

312         cout<<"答对的题目个数为"<<count+1<<""<<endl;

313 

314         cout<<endl<<"------------------请输入任意键继续!---------------------"<<endl;

315         

316         getch();

317         

318         system("CLS");

319     }

320     return 0;

321 }


运行结果截图:

四则运算的扩展

结论:

  程序的结构很重要,良好的可扩展性便于日后添加新的功能。

你可能感兴趣的:(四则运算)