软件工程作业之小学数学题目
软件描述:该软件实现小学数学题目生成以及对运算结果进行判断,最后统计出正确题目以及错误的题目,便于学生及时改正自己的错误,另外,该软件存在比较明显的缺陷,不能进行四则混合运算。希望在以后的学习实践中可以进一步完善自己的软件。
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.编码过程,对于自己的编码过程应该条理化,结构化。一个软件一般都有很多的功能需要去实现,这时我们就应该考虑代码的层次化结构,对于每一个功能应该有合理的划分,这样不仅仅便于自己书写代码,而且也方便调试,还有一点好处,如果运行一旦出错,这样的合理布局有利于我们去调试自己的程序,及时发现自己问题所在。
这些就是我在此次软件开发中所得到的一点心得体会,在以后的学习工作中我们可能会遇到越来越多的问题,这都是对于我们自己一个很好的锻炼。