做業二:四則運算已改

要求:算法

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

    應用於小學生本身對四則運算的檢測。數組

  • 設計思想:

     

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

相關文章
相關標籤/搜索