作业二:四则运算已改

要求:

  • 除了整数以外,还能支持真分数的四则运算。
  • 对实现的功能进行描述,并且对实现结果要求截图。
  • 题目:自动生成四则运算题目
  • 主要功能:

    应用于小学生自己对四则运算的检测。

  • 设计思想:

     

    这是一个进行数学计算的程序,且要求拥有多种功能,包括(1)选项菜单集成各功能函数模块(2)出题(每次出10道题目)(3)答题并评分(4)答错的题给出正确答案(5)显示答卷。总体看来,大多数功能要求调用错题,所以面临的两个难题便是出题和保存答题者做错的题以便其它函数调用。另外,由于除法的特殊性——其除数不能为0。又因为这是一个用于100以内整数的四则运算的程序,又对除法这个特殊成员提出了新的要求——要使得到的结果为整数。所以有必要把除法单独拿出来作为一个函数处理。

  • 源代码:
    #include "stdio.h"
    #include <stdlib.h>
    #include <time.h>
    #include <ctype.h>                      /* 字符操作函数*/
    
        /* 定义全局变量*/
        int sy[10],sr[10],jd[10],jg[10];     /* sy,fh,sr,jd,jg分别保存第一运算数,运算
                                                       符, 第二运算数,输入结果,正确结果*/                
        int fs=0;                 /* s接收键盘输入的结果,score保存成绩*/
        char fh[10];              /* fh保存运算符号*/  
        
    
    
    void chufa(int *s1,int *s2,int *s3)
    {
        int i,b=1,c,jg;         /*i为控制循环变量,jg,jd分别保存输入结果和正确答案*/
        int cs[20]={0},sy,sr;          /*cs为除数数组,sy保存被除数,sr为从cs中抽取的除数*/
        srand( (unsigned)time( NULL ) );
        FA: sy=rand()%100;
        if(sy==0)   goto FA;
        for(i=1;i<=sy;i++)         /*产生除数数组的循环*/
        {    
            if(sy%i==0)  {  cs[b]=i;  b++;}
            else  continue;
        }                          /*循环结束*/
        c=rand()%b;            /*随机抽取除数*/
        if(c==0)  c=c+1;
        sr=cs[c];
        jg=sy/sr;
        *s1=sy;                    /*指针变量*/
        *s2=sr;
        *s3=jg;
    }
    
    
    /* 自动生成10道运算题目,数值在0-99之间
       每出1道题后等待操作者输入运算结果
       判断输入的结果是否正确,正确则加10分
       给出最终得分*/
    
    /* 算法:用随机函数rand()产生0-32767之间的整数,与100取余数后得到0-99之间的整数
             运算符也由随机数产生,rand()%4 得到0-3之间的随机数,约定0:减法,1:加法,
             2:乘法,3:除法。for循环控制题目数量,每次循环先产生题目并显示出来,将计
             算结果保存在jg中然后再等待做题的人从键盘输入计算结果保存在s中,将jg与s进
             行比较判定正确性做完10道题后(循环结束),显示测试结果并进行评价*/
    
    void jisuan()
    {    
        int p;                    /* p为随机产生的运算符号,规定0为加法,1为减法,2为乘法,3为除法*/
        int i,gh;                 /* i为循环控制变量,gh用于临时交换数据*/
        printf("你将进行的是100以内数字的四则运算!\n");
        srand( (unsigned)time( NULL ) ); /* 随即数种子由系统时间函数产生*/
        
        /* 循环产生10道100之内的加减乘除法运算题目*/
        for(i=0;i<10;i++)
        {
            sy[i]=rand()%100;              /* 随机产生第一个操作数(1-99)*/
            sr[i]=rand()%100;              /* 随机产生第二个操作数(1-99)*/
            p=rand()%4;                   /* 随机产生运算符(0-3)*/
            
            if(p==0)                    /* 转换成运算符号,p为0表示做加法*/
            {    fh[i]='+'; jg[i]=sy[i]+sr[i]; }        /* fh为‘+’,jg为sy[i]+sr[i]*/
            else  if(p==1)                  /* p为1,表示做减法*/
            {    fh[i]='-';  
            if(sy[i]<sr[i]) { gh=sy[i]; sy[i]=sr[i];sr[i]=gh; }  /* 如果sy<sr则交换sy,sr,以保证结果为正数*/
                jg[i]=sy[i]-sr[i];                  /* fh为‘-’,jg为sy-sr*/
            }    
            else  if(p==2)                  /* p为2表示做乘法*/
            {   fh[i]='*'; jg[i]=sy[i]*sr[i]; }        /* fh为‘*’,jg为sy*sr*/              
            else  if(p==3)
            {   
                fh[i]='/';                  /* p为3表示做除法*/
                chufa(&sy[i],&sr[i],&jg[i]);  
            }
            printf("第%2d题: %2d %c %2d = ? ",i+1,sy[i],fh[i],sr[i]);  /* 显示题目*/
    
            scanf("%d",&jd[i]);              /* 等待键盘输入计算结果*/ 
            if(jd[i]==jg[i])  fs+=10;        /* 如果输入的结果与计算机运算结果相符则加10分*/ 
            }                                /* 循环结束*/    
        printf("\n测试结束!\n\n");    
    }
    
    
    /* 主菜单选项,分为显示答卷、错题的正确解、再进行一次练习、系统对成绩的评价、退出系统等选项*/
    /* 算法:使用printf()函数显示菜单项,用sacnf()函数接收选项字符while条件限定选项的合法性,非法字符则重新输入并返回主函数*/
       
    char caidan()
    {
       char  c='0';                     /*定义变量*/
       printf("\n**********  数学四则运算测试软件  **********\n\n\n");
       printf("          1.显示答卷        2.错题正解\n\n");
       printf("          3.系统评估        4.错题重做\n\n");
       printf("          5.再次练习        0.退出系统\n\n"); 
       printf("\n********************************************");
       printf("\n请输入选项(0-5):");      /*提示输入选项*/
       do
       {   scanf("%c",&c);   }          /*输入选项*/
       while(!(c>='0'&&c<'6'));              /*验证选项是否合法,若否则重输*/ 
       return c;                        /*返回选择项*/
    }
    
    
    /*对成绩结果进行评价,便于做题都了解自己的情况,进行有针对性的学习.按分数的不同层次进行评价*/
    /*算法:用条件函数switch对成绩score进行分段并给出相应的评价,结果score的数据从主函数获得*/
    
    void pingjia()
    {
        printf("你的成绩是%d分.\n",fs);  /* 显示测试结果*/
        switch(fs)                                      /*显示评价*/
        {  case  100: printf("全都答对了,好厉害!\n");  break;
           case  90:  printf("优秀!差一点就满分了!\n");  break;
           case  80:
           case  70:  printf("良好!请继续努力,下次取得更好的成绩!\n");  break;
           case  60:  printf("及格!成绩不太理想哟!再接再励吧!\n");  break;
           case  50:
           case  40:
           case  30:
           case  20:
           case  10:  printf("多花点功夫吧,不然你会后悔的!!\n");  break;
           case  0:   printf("你认真答题了吗!再做一次吧!!!!\n");  break;
        }
        printf("\n\n");
    }           
    
    
    
    /*显示答卷*/
    /*各数据从主函数中获取*/
    
    void dajuan()
    {
        int j;
        printf("你的答卷为:\n");
        for(j=0;j<10;j++)
            printf("%2d %c %2d = %2d\n",sy[j],fh[j],sr[j],jd[j]);
        printf("\n\n");
    }
    
    
    /*对错题给出正确的答案*/
    /*各数据从主函数中获取*/
    
    void zhengjie()
    {
        int k;
        printf("你答错的题的正确答案为:\n");
        for(k=0;k<10;k++)
        {   if(jd[k]==jg[k])   continue;
            else
            {
                printf("%2d %c %2d = %2d\n",sy[k],fh[k],sr[k],jg[k]);
            }
        }
        printf("\n\n");
    }
    
    /*将错题给出,让做题者再次对其进行计算*/
    /*各数据从主函数中获取*/
    
    void chongzuo()
    {
        int m,n;
        printf("以下是你做错的题,请重做:\n");
        for(m=0;m<10;m++)                      /*用循环对错题进行选择*/
            if(jd[m]==jg[m])    continue;       /*做对的题则跳过*/
            else  
            {   printf("%2d %c %2d =?",sy[m],fh[m],sr[m]);
                scanf("%d",&jd[m]);
                if(jd[m]==jg[m])  printf("恭喜!你做对了!\n");/*再次对输入的答案进行检验*/
                else                                        /*若仍未做对,则用此函数*/
                {   
                    for(n=0;n<3;n++)
                    {  printf("你仍未做对!你还有%d次机会:   ",2-n);/*再次计算*/
                          printf("%2d %c %2d =?",sy[m],fh[m],sr[m]);
                              scanf("%d",&jd[m]);                         
                              if(jd[m]==jg[m])   { printf("恭喜!你做对了!\n");  break;}/*跳出循环*/
                    }
                
                 }                                       
            }                                                /*循环结束*/
        printf("\n\n");
    }
    
    
    /*主函数*/
    
    int main()
    {
        int key=1;
        jisuan();
        while(key)
        {
            switch(caidan())
            {
                case  '1':   {   printf("\n\n\n"); dajuan();    }     break;
                case  '2':   {   printf("\n\n\n"); zhengjie();  }     break;
                case  '3':   {   printf("\n\n\n"); pingjia();   }     break;
                case  '4':   {   printf("\n\n\n"); chongzuo();  }     break;
                case  '5':   {   printf("\n\n\n"); jisuan();    }     break;
                case  '0':    key=0;
            }
        }
    }

     

  • 程序运行截图:

          

         

      

     

  • 总结: 

       此程序采用的是C语言,通过这次实践让我学到了更多知识,也增强了自己的动手能力,同时也对C程序加深了理解,已经成为一个我应该懂得一点的技术。我会在以后的学习和生活中努力思考,善于发现和解决问题,开动脑筋,去发现更多新的东西。

 

posted @ 2016-03-13 20:46  vivi.shaonan  阅读(255)  评论(4编辑  收藏  举报