软件工程作业之小学数学题目

 

       软件描述:该软件实现小学数学题目生成以及对运算结果进行判断,最后统计出正确题目以及错误的题目,便于学生及时改正自己的错误,另外,该软件存在比较明显的缺陷,不能进行四则混合运算。希望在以后的学习实践中可以进一步完善自己的软件。

 

  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.编码过程,对于自己的编码过程应该条理化,结构化。一个软件一般都有很多的功能需要去实现,这时我们就应该考虑代码的层次化结构,对于每一个功能应该有合理的划分,这样不仅仅便于自己书写代码,而且也方便调试,还有一点好处,如果运行一旦出错,这样的合理布局有利于我们去调试自己的程序,及时发现自己问题所在。

     这些就是我在此次软件开发中所得到的一点心得体会,在以后的学习工作中我们可能会遇到越来越多的问题,这都是对于我们自己一个很好的锻炼。

posted @ 2016-03-12 14:40  口平音  阅读(310)  评论(5编辑  收藏  举报