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


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

      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("			    小学数学计算题单	
    
    ");
    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("
    第%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("
    总共答对%d题
    ",right);
    315     printf("
    回答错误题目:
    ");
    316     for(i=0;i<j;i++)
    317     {
    318         printf("  第%d题
    ",wrong[i]);
    319     }
    320     return 0;
    321 }

    软件截图:

    总结:

          1.在这次的软件实践开发作业中不仅仅锻炼了自己软件设计的能力,也使自己对软件开发有了更加深刻的认识和学习,明白如何去开发软件,对于一个软件的开发,我们应该先去做一个基本的用户调查,了解用户需要什么样的软件,需要什么样的功能,然后根据用户的需求合理的去设计软件,并且制定自己的软件开发流程,对自己将要做的软件有一个初步的认识。

         2.对于自己的软件开发也应该注意开发过程中有可能遇到的问题,可能来自用户,也有可能来自于自己的设计开发,所以对于出现的问题应该提早做好应对准备,以免在后来开发过程脚忙手乱。

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

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

  • 相关阅读:
    hdoj:2075
    hdoj:2072
    hdoj:2071
    hdoj:2070
    hdoj:2069
    test001
    hdoj:2067
    hdoj:2061
    hdoj:2058
    hdoj:2057
  • 原文地址:https://www.cnblogs.com/199489KPY/p/5268694.html
Copyright © 2020-2023  润新知