软件工程作业之小学数学题目
?
? ? ? ?軟件描述:該軟件實現小學數學題目生成以及對運算結果進行判斷,最后統計出正確題目以及錯誤的題目,便于學生及時改正自己的錯誤,另外,該軟件存在比較明顯的缺陷,不能進行四則混合運算。希望在以后的學習實踐中可以進一步完善自己的軟件。
?
1 /* 2 需求分析: 3 4 1.自動生成小學四則運算題目,題目的數量(n)可以由老師給出。 5 2.除整數之外,還需要支持真分數四則運算。 6 3.對于除不盡的結果顯示商和與余數。 7 8 設計思路: 9 10 第一步:隨機產生兩個100以內的整數,并且兩個數的運算關系隨機。 11 第二部:對于真分數采用(n/m)形式表示,算符隨機生成。 12 第三部:將運算后的結果采用數組方式保存,方便老師批改。 13 14 注意事項: 15 16 1.對于減法而言,被減數應該不小于減數,避免結果為負。 17 2.對于分數的表示應該注意真分數(分子小于分母,且為最簡形式) 18 3.分數運算后結果應該化為最簡。 19 4.運算過程中不應該出現負數。 20 21 */ 22 23 #include <stdio.h> 24 #include <stdlib.h> 25 #include <string.h> 26 #include <time.h> 27 #include <iostream> 28 29 using namespace std; 30 31 int n; //定義出題數量n; 32 int num1[101],num2[101]; //用來保存產生的隨機數 33 int f1[101][2],f2[101][2]; //用來產生分數分子分母,f[i][0]存分子,f[i][1]存分母 34 int ques[101][2]; //存儲計算機計算的正確結果 35 int anser[101][2]; //回答問題答案 36 int fp,fq; //fp:分子,fq:分母 37 int gy,gb; 38 39 /*最大公約數,最小公倍數*/ 40 void gcd(int x,int y) 41 { 42 int k,r,w; 43 r=x;w=y; 44 while(y!=0) 45 { 46 k=x%y; 47 x=y; 48 y=k; 49 } 50 gy=x; 51 gb=(r*w)/gy; 52 } 53 54 /*加法函數*/ 55 int add(int x,int y) 56 { 57 int sum=0; 58 sum=x+y; 59 return sum; 60 } 61 /*減法函數*/ 62 int sub(int x,int y) 63 { 64 int sub=0; 65 int temp; 66 if(x<y) 67 { 68 temp=x; 69 x=y; 70 y=temp; 71 } 72 sub=x-y; 73 return sub; 74 } 75 /*乘法函數*/ 76 int mul(int x,int y) 77 { 78 int mul=0; 79 mul=x*y; 80 return mul; 81 } 82 /*除法函數*/ 83 int dive(int x,int y) 84 { 85 int res=0; 86 res=x%y; 87 return res; 88 } 89 90 /*分數加法*/ 91 void fadd(int x,int y,int m,int n) 92 { 93 gcd(y,n);x=(gb/y)*x;m=(gb/n)*m; 94 fp=x+m;fq=gb; 95 gcd(fp,fq); 96 fp=fp/gy;fq=fq/gy; 97 } 98 /*分數減法*/ 99 void fsub(int x,int y,int m,int n) 100 { 101 int temp,ran; 102 gcd(y,n);x=(gb/y)*x;m=(gb/n)*m; 103 ran=gb; 104 if(x<m){temp=m-x;} 105 else {temp=x-m;} 106 gcd(temp,ran); 107 fp=temp/gy;fq=ran/gy; 108 } 109 /*分數乘法*/ 110 void fmul(int x,int y,int m,int n) 111 { 112 fp=x*m;fq=y*n; 113 gcd(fp,fq); 114 fp=fp/gy;fq=fq/gy; 115 } 116 /*分數除法*/ 117 void fdive(int x,int y,int m,int n) 118 { 119 fp=x*n;fq=y*m; 120 gcd(fp,fq); 121 fp=fp/gy;fq=fq/gy; 122 } 123 /*顯示整數減法的打印函數*/ 124 void print(int x,int y,char c) 125 { 126 int temp; 127 if(x<y) 128 { 129 temp=x; 130 x=y; 131 y=temp; 132 } 133 printf("%4d%3c%4d = ",x,c,y); 134 } 135 /*顯示分數減法的打印函數*/ 136 void fprint(int x,int y,int m,int n,char c) 137 { 138 int temp,ran; 139 gcd(y,n); 140 x=(gb/y)*x;m=(gb/n)*m; 141 if(x<m) 142 { 143 x=x/(gb/y);m=m/(gb/n); 144 temp=x;x=m;m=temp; 145 ran=y,y=n;n=ran; 146 } 147 else 148 { 149 x=x/(gb/y);m=m/(gb/n); 150 } 151 printf("%4d/%d%3c%4d/%d = ",x,y,c,m,n); 152 } 153 154 int main() 155 { 156 int i,j,r,xx,yy; 157 int temp,zi,mu; 158 int fz1,fm1,fz2,fm2; 159 char str1[10],ch; 160 int right,wrong[101]; 161 memset(str1,sizeof(str1),' '); 162 memset(ques,sizeof(ques),0); 163 memset(anser,sizeof(anser),0); 164 int math,ans=0,input=0,rest=0,rest1=0,rest2=0; 165 printf("\t\t\t 小學數學計算題單\t\n\n"); 166 printf("請輸入需要打印題目數量:"); 167 scanf("%d",&n); 168 srand((int)time(NULL)); //設定隨機數種子 169 for(i=0,j=0;i<2*n;i++,j++) 170 { 171 num1[j]=rand()%50+1; 172 num2[j]=rand()%50+1; 173 } 174 srand((int)time(NULL)); //設定隨機數種子 175 for(i=0;i<n;i++) 176 { 177 for(r=0;r<2;r++) 178 { 179 f1[i][r]=rand()%20+1; 180 f2[i][r]=rand()%20+1; 181 } 182 } 183 for(i=0;i<n;i++) 184 { 185 if(f1[i][0]>f1[i][1]) 186 { 187 temp=f1[i][0];f1[i][0]=f1[i][1];f1[i][1]=temp; 188 } 189 if(f2[i][0]>f2[i][1]) 190 { 191 temp=f2[i][0];f2[i][0]=f2[i][1];f2[i][1]=temp; 192 } 193 if((f1[i][0]==f1[i][1])) 194 { 195 f1[i][0]=f1[i][0]/2; 196 if(f1[i][0]==0){f1[i][0]=f1[i][0]+2;} 197 } 198 if((f2[i][0]==f2[i][1])) 199 { 200 f2[i][0]=f2[i][0]/3; 201 if(f2[i][0]==0){f2[i][0]=f2[i][0]+5;} 202 } 203 } 204 for(i=0;i<n;i++) 205 { 206 gcd(f1[i][0],f1[i][1]); 207 f1[i][0]=f1[i][0]/gy; 208 f1[i][1]=f1[i][1]/gy; 209 210 gcd(f2[i][0],f2[i][1]); 211 f2[i][0]=f2[i][0]/gy; 212 f2[i][1]=f2[i][1]/gy; 213 } 214 srand((int)time(NULL)); //設定隨機數種子 215 for(i=0;i<n;i++) 216 { 217 printf("\n第%d題:",i+1); 218 xx=num1[i];yy=num2[i]; 219 fz1=f1[i][0];fm1=f1[i][1]; 220 fz2=f2[i][0],fm2=f2[i][1]; 221 math=rand()%8+1; 222 switch(math) 223 { 224 case 1: //整數加法 225 printf("%4d%3c%4d = ",xx,'+',yy); 226 scanf("%4d",&input); 227 anser[i][0]=input; 228 anser[i][1]=0; 229 ans=add(xx,yy); 230 ques[i][0]=ans; 231 ques[i][1]=0; 232 break; 233 case 2: //整數減法 234 print(xx,yy,'-'); 235 scanf("%4d",&input); 236 anser[i][0]=input; 237 anser[i][1]=0; 238 ans=sub(xx,yy); 239 ques[i][0]=ans; 240 ques[i][1]=0; 241 break; 242 case 3: //整數乘法 243 printf("%4d%3c%4d = ",xx,'*',yy); 244 scanf("%4d",&input); 245 anser[i][0]=input; 246 anser[i][1]=0; 247 ans=mul(xx,yy); 248 ques[i][0]=ans; 249 ques[i][1]=0; 250 break; 251 case 4: //整數除法 252 printf("%4d%3c%4d = ",xx,'/',yy); 253 scanf("%4d",&input); 254 anser[i][0]=input; 255 gets(str1); 256 rest1=str1[6]-'0'; 257 rest2=str1[7]-'0'; 258 if(str1[0]==0){anser[i][1]=0;} 259 else if(str1[7]==0){anser[i][1]=rest1;} 260 else{anser[i][1]=rest1*10+rest2;} 261 rest=dive(xx,yy); 262 ans=(int)(xx/yy); 263 ques[i][0]=ans; 264 ques[i][1]=rest; 265 break; 266 case 5: //分數加法 267 printf("%4d/%d%3c%4d/%d = ",fz1,fm1,'+',fz2,fm2); 268 fadd(fz1,fm1,fz2,fm2); 269 ques[i][0]=fp; 270 ques[i][1]=fq; 271 scanf("%d%c%d",&zi,&ch,&mu); 272 anser[i][0]=zi; 273 anser[i][1]=mu; 274 break; 275 case 6: //分數減法 276 fprint(fz1,fm1,fz2,fm2,'-'); 277 fsub(fz1,fm1,fz2,fm2); 278 ques[i][0]=fp; 279 ques[i][1]=fq; 280 scanf("%d%c%d",&zi,&ch,&mu); 281 anser[i][0]=zi; 282 anser[i][1]=mu; 283 break; 284 case 7: //分數乘法 285 printf("%4d/%d%3c%4d/%d = ",fz1,fm1,'*',fz2,fm2); 286 fmul(fz1,fm1,fz2,fm2); 287 ques[i][0]=fp; 288 ques[i][1]=fq; 289 scanf("%d%c%d",&zi,&ch,&mu); 290 anser[i][0]=zi; 291 anser[i][1]=mu; 292 break; 293 case 8: //分數除法 294 printf("%4d/%d%3c%4d/%d = ",fz1,fm1,'/',fz2,fm2); 295 fdive(fz1,fm1,fz2,fm2); 296 ques[i][0]=fp; 297 ques[i][1]=fq; 298 scanf("%d%c%d",&zi,&ch,&mu); 299 anser[i][0]=zi; 300 anser[i][1]=mu; 301 break; 302 default: 303 break; 304 } 305 } 306 right=0;memset(wrong,sizeof(wrong),0); 307 for(i=0,j=0;i<n;i++) 308 { 309 if((ques[i][0]==anser[i][0])&&(ques[i][1]==anser[i][1])) 310 { right++; } 311 else 312 { wrong[j]=i+1;j++;} 313 } 314 printf("\n總共答對%d題\n",right); 315 printf("\n回答錯誤題目:\n"); 316 for(i=0;i<j;i++) 317 { 318 printf(" 第%d題\n",wrong[i]); 319 } 320 return 0; 321 }軟件截圖:
?
?
?
總結:
? ? ? 1.在這次的軟件實踐開發作業中不僅僅鍛煉了自己軟件設計的能力,也使自己對軟件開發有了更加深刻的認識和學習,明白如何去開發軟件,對于一個軟件的開發,我們應該先去做一個基本的用戶調查,了解用戶需要什么樣的軟件,需要什么樣的功能,然后根據用戶的需求合理的去設計軟件,并且制定自己的軟件開發流程,對自己將要做的軟件有一個初步的認識。
? ? ?2.對于自己的軟件開發也應該注意開發過程中有可能遇到的問題,可能來自用戶,也有可能來自于自己的設計開發,所以對于出現的問題應該提早做好應對準備,以免在后來開發過程腳忙手亂。
? ? ?3.編碼過程,對于自己的編碼過程應該條理化,結構化。一個軟件一般都有很多的功能需要去實現,這時我們就應該考慮代碼的層次化結構,對于每一個功能應該有合理的劃分,這樣不僅僅便于自己書寫代碼,而且也方便調試,還有一點好處,如果運行一旦出錯,這樣的合理布局有利于我們去調試自己的程序,及時發現自己問題所在。
? ? ?這些就是我在此次軟件開發中所得到的一點心得體會,在以后的學習工作中我們可能會遇到越來越多的問題,這都是對于我們自己一個很好的鍛煉。
轉載于:https://www.cnblogs.com/199489KPY/p/5268694.html
總結
以上是生活随笔為你收集整理的软件工程作业之小学数学题目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 0311-操作系统实验0
- 下一篇: Spring.Net学习笔记(2)-依赖