天天看點

作業二:四則運算已改

要求:

  • 除了整數以外,還能支援真分數的四則運算。
  • 對實作的功能進行描述,并且對實作結果要求截圖。
  • 題目:自動生成四則運算題目
  • 主要功能:

    應用于國小生自己對四則運算的檢測。

  • 設計思想:

    這是一個進行數學計算的程式,且要求擁有多種功能,包括(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程式加深了了解,已經成為一個我應該懂得一點的技術。我會在以後的學習和生活中努力思考,善于發現和解決問題,開動腦筋,去發現更多新的東西。