對四則運算的一些要求如下:
1、題目避免重復;2、可定制(數量/打印方式);3、可以控制下列參數:
是否有乘除法、數值范圍、加減有無負數、除法有無余數、否支持分數 (真分數, 假分數, …);
一、設計思想
設計思想融合在內容四——開發過程中。
二、源代碼
1 //劉**,2015年3月,30道四則運算及其各種限制 2 #include <iostream> 3 using namespace std; 4 5 void main() 6 { 7 int a0[1000],b0[1000],c0[1000],a1[1000],b1[1000],c1[1000],a2[1000],b2[1000],c2[1000],a3[1000],b3[1000],c3[1000],C[1000],a,b,c; 8 int i,j,A0,A1,A2,A3,B0,B1,B2,B3; 9 int num,line,k; 10 int min,max,m; 11 int CC,FS,YS; 12 13 k=0; 14 A0=0;A1=0;A2=0;A3=0; 15 B0=0;B1=0;B2=0;B3=0; 16 cout<<"*************四則運算1.0*************"<<endl; 17 18 cout<<"請依次輸入輸出算式數量和每行顯示數量:"<<endl; 19 cin>>num>>line; 20 21 cout<<"請問是否要有乘除法?有請輸入\"1\",無請輸入\"0\""<<endl; 22 cin>>CC; 23 while(1) //判斷輸入是否合法 24 { 25 if(CC != 1&&CC != 0) 26 { 27 cout<<"輸入不合法,請重新輸入\"1\"或\"0\":"; 28 cin>>CC; 29 } 30 else 31 break; 32 } 33 34 cout<<"請問是否要加減結果有負數?有請輸入\"1\",無請輸入\"0\""<<endl; 35 cin>>FS; 36 while(1) //判斷輸入是否合法 37 { 38 if(FS != 1&&FS != 0) 39 { 40 cout<<"輸入不合法,請重新輸入\"1\"或\"0\":"; 41 cin>>FS; 42 } 43 else 44 break; 45 } 46 47 cout<<"請問是否要除法結果有余數?有請輸入\"1\",無請輸入\"0\""<<endl; 48 cin>>YS; 49 while(1) //判斷輸入是否合法 50 { 51 if(YS != 1&&YS != 0) 52 { 53 cout<<"輸入不合法,請重新輸入\"1\"或\"0\":"; 54 cin>>YS; 55 } 56 else 57 break; 58 } 59 60 cout<<"請輸入兩個值確定算式中a,b的取值范圍(請保證前一個值小於后一個值):"<<endl; 61 cin>>min>>max; 62 while(1) //判斷輸入是否合法 63 { 64 if(min>=max) 65 { 66 cout<<"輸入不合法,請重新輸入:"; 67 cin>>min>>max; 68 } 69 else 70 break; 71 } 72 73 m=max-min+1; 74 for(i=0;i<1000;i++) 75 { 76 a0[i]=0;b0[i]=0; 77 a1[i]=0;b1[i]=0; 78 a2[i]=0;b2[i]=0; 79 a3[i]=0;b3[i]=0; 80 } 81 for(i=0;;i++) 82 { 83 a=min+rand()%m; 84 b=min+rand()%m; 85 c=rand()%4; 86 if(CC==0) //如果CC=0,去除c=2,3的情況 87 { 88 if(c==2||c==3) 89 continue; 90 } 91 if(FS==0) //如果FS=0,去除c=0,1下結果小於0的情況 92 { 93 if(c==0) 94 { 95 if(a+b<0) 96 continue; 97 } 98 else if(c==1) 99 { 100 if(a-b<0) 101 continue; 102 } 103 } 104 if(YS==0) //如果YS=0,且是除法,去除a,b相除有余數的情況 105 { 106 if(c==3) 107 if(0 != a%b) 108 continue; 109 } 110 111 //將算式分為加、減、乘、除四組 112 if(c==0) //加法 113 { 114 for(j=0;j<=A0;j++) 115 { 116 if(a==a0[j]&&b==b0[j]) 117 { 118 B0++;break; 119 } 120 } 121 if(B0>0) 122 { 123 B0=0;continue; 124 } 125 else 126 { 127 a0[A0]=a; 128 b0[A0]=b; 129 c0[A0]=a+b; 130 A0++; 131 } 132 } 133 else if(c==1) //減法 134 { 135 for(j=0;j<=A1;j++) 136 { 137 if(a==a1[j]&&b==b1[j]) 138 { 139 B1++;break; 140 } 141 } 142 if(B1>0) 143 { 144 B1=0;continue; 145 } 146 else 147 { 148 a1[A1]=a; 149 b1[A1]=b; 150 c1[A1]=a+b; 151 A1++; 152 } 153 } 154 else if(c==2) //乘法 155 { 156 for(j=0;j<=A2;j++) 157 { 158 if(a==a2[j]&&b==b2[j]) 159 { 160 B2++;break; 161 } 162 } 163 if(B2>0) 164 { 165 B2=0;continue; 166 } 167 else 168 { 169 a2[A2]=a; 170 b2[A2]=b; 171 c2[A2]=a+b; 172 A2++; 173 } 174 } 175 else //除法 176 { 177 if(b==0) 178 continue; 179 for(j=0;j<=A3;j++) 180 { 181 if(a==a3[j]&&b==b3[j]) 182 { 183 B3++;break; 184 } 185 } 186 if(B3>0) 187 { 188 B3=0;continue; 189 } 190 else 191 { 192 a3[A3]=a; 193 b3[A3]=b; 194 c3[A3]=a+b; 195 A3++; 196 } 197 } 198 if(num==A0+A1+A2+A3) //限制算式數量 199 break; 200 } 201 //輸出 202 for(i=0;i<A0;i++) // + 203 { 204 k++; 205 if(a0[i]<0) 206 cout<<"("<<a0[i]<<")"; 207 else 208 cout<<a0[i]<<" "; 209 cout<<"+"; 210 if(b0[i]<0) 211 cout<<"("<<b0[i]<<")"; 212 else 213 cout<<" "<<b0[i]<<" "; 214 cout<<"="; 215 if(k%line==0) 216 cout<<endl; 217 else 218 cout<<"\t"; 219 } 220 for(i=0;i<A1;i++) // - 221 { 222 k++; 223 if(a1[i]<0) 224 cout<<"("<<a1[i]<<")"; 225 else 226 cout<<a1[i]<<" "; 227 cout<<"-"; 228 if(b1[i]<0) 229 cout<<"("<<b1[i]<<")"; 230 else 231 cout<<" "<<b1[i]<<" "; 232 cout<<"="; 233 if(k%line==0) 234 cout<<endl; 235 else 236 cout<<"\t"; 237 } 238 for(i=0;i<A2;i++) // * 239 { 240 k++; 241 if(a2[i]<0) 242 cout<<"("<<a2[i]<<")"; 243 else 244 cout<<a2[i]<<" "; 245 cout<<"*"; 246 if(b2[i]<0) 247 cout<<"("<<b2[i]<<")"; 248 else 249 cout<<" "<<b2[i]<<" "; 250 cout<<"="; 251 if(k%line==0) 252 cout<<endl; 253 else 254 cout<<"\t"; 255 } 256 for(i=0;i<A3;i++) // / 257 { 258 k++; 259 if(a3[i]<0) 260 cout<<"("<<a3[i]<<")"; 261 else 262 cout<<a3[i]<<" "; 263 cout<<"/"; 264 if(b3[i]<0) 265 cout<<"("<<b3[i]<<")"; 266 else 267 cout<<" "<<b3[i]<<" "; 268 cout<<"="; 269 if(k%line==0) 270 cout<<endl; 271 else 272 cout<<"\t"; 273 } 274 cout<<"請在此輸入各式的結果:"<<endl; 275 for(i=0;i<num;i++) 276 cin>>C[i]; 277 int t=0,corr=0; 278 //判斷輸入結果的對錯 279 for(i=0;i<A0;i++) 280 { 281 if(c0[i]==C[t]) 282 {t++;corr++;} 283 else 284 { 285 t++; 286 cout<<"第"<<t<<"題答錯!"<<endl; 287 } 288 } 289 for(i=0;i<A1;i++) 290 { 291 if(c1[i]==C[t]) 292 {t++;corr++;} 293 else 294 { 295 t++; 296 cout<<"第"<<t<<"題答錯!"<<endl; 297 } 298 } 299 for(i=0;i<A2;i++) 300 { 301 if(c2[i]==C[t]) 302 {t++;corr++;} 303 else 304 { 305 t++; 306 cout<<"第"<<t<<"題答錯!"<<endl; 307 } 308 } 309 for(i=0;i<A3;i++) 310 { 311 if(c3[i]==C[t]) 312 {t++;corr++;} 313 else 314 { 315 t++; 316 cout<<"第"<<t<<"題答錯!"<<endl; 317 } 318 } 319 if(line==corr) 320 cout<<"恭喜你都答對了!!!!!!"<<endl; 321 }
三、運行結果截圖
四、開發過程
整個程序都在一個cpp文件中,而且都在一個main函數中,程序開始時就想要將程序分割為一個個調用函數,鑒於能力有限,對於各個函數之間的值傳遞不熟練,且涉及到很多數組,所以暫且寫在了一個函數里面。
關於判斷是否重復的解決。函數主要使用了for循環,首先隨機出一個算式的兩個參數和一個符號,根據符號的不同分為四組,以此減少驗證是否重復時的驗證次數。每組中有兩個數組來存放兩個參數。當每獲得兩個隨機數,就和相應組內進行比較,前一個和前一個數組中數值比較,后一個和后一個數組中數值比較,有相同的就continue跳過,不保存在數組中。這種比較方式就忽略了兩個參數顛倒產生兩個式子的情況,例如5+4和4+5,單這種情況可以當做交換率的考核。
關於出題數量和打印方式的限制解決。使用兩個參數num、line,num限制出題數量,line限制輸出時每行輸出數量。將for循環設為無限循環,在循環的最后讓四組數量相加等於num即可break跳出循環。
最后一個限制有很多要求,目前完成了除分數的前幾個要求。解決方法就是在for循環剛開始時,兩個參數和符號都產生后,加上對各個限制的判斷,不符合就continue跳過。數值范圍則使用x=min+rand%(max-min)產生符合數值范圍的隨機數。
分數沒有解決,一開始的想法就是用四個數組分別表示兩個參數的分子和分母,根據我的分組判斷的做法,那就還要再聲明16個數組,這十六個數組不能在使用一開始for循環內的產生算式的算法,需要新的代碼來實現要求,新的代碼其實也就是在以前for循環的算法中加上每個式子加上兩個數組進行運算,可有了式子的兩個參數后,問題產生,怎么讓兩個參數滿足限制條件,最基本的就是怎么讓產生的分數在數值范圍內,如果要求有負數又怎么辦?因此分數還沒有實現。
五、時間記錄日志
學生:劉** 日期:2015.3
教師:王** 課程:軟件工程
日期 |
開始時間 |
結束時間 |
中斷時間 |
凈時間 |
活動 |
備注 |
3/18 |
6:00 |
10:30 |
20 |
250 |
沒課 |
明天交作業 |
3/19 |
4:20 |
5:50 |
|
90 |
編程 |
馬上交作業 |