1. 程式人生 > >C部落格作業03--函式

C部落格作業03--函式

1. 本章學習總結

1.1 思維導圖

1.2 本章學習體會及程式碼量學習體會

1.2.1 學習體會

這幾周學習了函式,題目還是原樣只是多了種做題的方法。一開始看書感覺宣告,定義啊,還有全域性變數那些,文縐縐的,都看不太下去,還不如直接做題。但是在做課堂派時,發現沒有看書除了簡答題填不出來,連選擇題都可能會做錯。可能實踐都需要理論支撐吧。幾周學習下來覺得掌握的還是可以,可以分得清不同變數的作用範圍和生存週期,函式返回值該如何設定,函式該如何設計。

1.2.2 程式碼累計

2. PTA總分

2.1 截圖PTA中函式題目集的排名得分

2.2 我的總分:145

3. PTA實驗作業

3.1 PTA題目1

6-8 使用函式驗證哥德巴赫猜想
哥德巴赫猜想:任何一個不小於6的偶數均可表示為兩個奇素數之和。
其中函式prime當用戶傳入引數p為素數時返回1,否則返回0;
函式Goldbach按照格式“n=p+q”輸出n的素數分解,其中p≤q均為素數。
又因為這樣的分解不唯一(例如24可以分解為5+19,還可以分解為7+17),要求必須輸出所有解中p最小的解。

3.1.1 演算法分析

  • 判斷素數函式
  • if p<2
    • 返回0
  • else
    • 定義i
    • for i=2 to i<p do
      • if p%i==0 then
        • 返回0
        • end if
          -返回1
    • end for
  • 輸出哥德巴赫數函式
  • 定義i
  • for i=2 to i<=n/2 do
    • if prime(i)&&prime(n-i) then
      • 輸出 n=i+(n-i)
      • break
    • end if
  • end for

3.1.2 程式碼截圖

3.1.3 測試資料

測試資料1

測試資料2

測試資料3

3.1.4 PTA提交列表及說明

Q1:編譯錯誤???
A1:覺得編譯錯誤實在很不應該,在dev試過在copy過去都能錯誤掉,,,
Q2:部分正確
A2:一開始沒有用break結束if語句導致連一個數有多種方法輸出和題目要求不符,後來加了個break,就可以了

4.大作業

4.1函式關係圖

4.2.函式功能介紹

1.函式1

void Screen();
int Menu(int n);
功能:生成介面讓整個遊戲看起來友好,比較有體驗感

void Screen()
{
    printf("----------------------------------------------\n");
    printf("            歡迎來到我們的遊戲 ^_^            \n");
    printf("        輸入1進來遊戲選單,輸入0退出遊戲      \n");
}
int Menu(int n)
{
    scanf("%d",&n);
    while(n!=0&&n!=1)  
    {
        printf("操作錯誤哦,重新再輸入吧\n");
        scanf("%d",&n); 
    }//讓輸入是0或1 
    if(n==1)
    {
        printf("                  選單                        \n");
        printf("         1.等級1:1位數的一步加減乘除計算     \n");
        printf("         2.等級2:2位數的2步加減運算          \n");
        printf("         3.等級3:3位數的2步加減運算          \n");
        printf("            清選擇等級進入遊戲吧              \n");
    }
    else
    {
        printf("希望你玩得愉快,下次再來哦");
        exit(0);
    }
}

2.函式2

void LevelChoose();
void TitieNumber(int n);
功能:等級選擇,然後這個等級選擇將會是後續遊戲的起點,並且在選擇等級後讓使用者輸入想做的題數

void LevelChoose()
{
    
    scanf("%d",&level);
    while(level!=1&&level!=2&&level!=3)
    {
        printf("你選擇的等級不在我們的範圍內,清重新輸入哦\n");
        scanf("%d",&level); 
    }//確保選擇的等級在範圍內 
    TitieNumber(level);//呼叫TitieNumber函式,實參為level傳入到該函式中作為輸出 
}
void TitieNumber(int n)
{
    printf("歡迎來到%d級的遊戲,清選擇想做的題目數量:\n",n);  
    scanf("%d",&number);
}

函式3

void Number();
void Operation();
功能:利用srand()函式隨機生成數字,運算子,來組成算式供給使用者做題,並且各個等級不同

void Number()
{
    switch(level)
    {
        case 1:
            srand(time(NULL));
            num1=rand()%10;
            num2=rand()%10;
            break; 
        case 2:
            srand(time(NULL));
            num1=rand()%100;
            num2=rand()%100;
            num3=rand()%100; 
            break;
        case 3:
            srand(time(NULL));
            num1=rand()%1000;
            num2=rand()%1000;
            num3=rand()%1000; 
            break;
    }
}
void Operation()
{
    int operation_1,operation_2;
    srand(time(NULL));
    operation_1=rand()%4;
    operation_2=rand()%2;
    if(level==1)
    {
        switch(operation_1)
        {
            case 0:ch1='+';break; 
            case 1:ch1='-';break; 
            case 2:ch1='*';break; 
            case 3:ch1='/';break; 
        }
    }
    else
    {
        switch(operation_2)
        {
            case 0:ch2='+';ch3='+';break; 
            case 1:ch2='-';ch3='-';break; 
        }
    }
 } 

函式4

void GameBegin();
double Gameresult();
功能:遊戲開始了,根據選擇的等級隨機生成題目,並且呼叫Gameresult()函式來判斷對錯,並且統計正確和錯誤題數

void GameBegin()
 {
    int response;
        if(level==1)
        {
            printf("你的題目是%.0f %c %.0f =\n",num1,ch1,num2); 
        } 
        else if(level==2)
        {
            printf("你的題目是%.0f %c %.0f %c %.0f =\n",num1,ch2,num2,ch3,num3);
        }
        else
        {
            printf("你的題目是%.0f %c %.0f %c %.0f =\n",num1,ch2,num2,ch3,num3);
        }
        scanf("%d",&response);
        if(response-Gameresult()<0.00001)//呼叫Gameresult()函式來判斷對錯 
        {
            printf("太棒了,你做對啦\n\n"); 
            printf("你還想繼續做題嗎?是的話選1,不繼續按任意鍵哦\n\n");
            right++; 
        }
        else
        {
            printf("啊哦,做錯了呢\n\n");
            printf("正確答案是%d\n\n",Gameresult());
            printf("彆氣餒,再來一題嗎?是的話選1,不繼續按任意鍵哦\n\n");
            wrong++;
        }
        int n;
        scanf("%d",&n);
        printf("\n");
        if(n!=1) //如果使用者想提前退出按任意鍵即可 
        {
            printf("希望你玩得愉快,下次再來哦");
            exit(0); 
        }
        if(right+wrong>number)//如果使用者做的題數超過了一開始輸入的題數給出提示語 
        {
            printf("你的做題數目到了呢\n");
            Accuracy();
            exit(0);
        }
 }
double Gameresult()
 {
    double result;
    switch(ch1)//j一級難度的一步運算i 
    {
        case '+':result=num1+num2;break;
        case '-':result=num1-num2;break;
        case '*':result=num1*num2;break;
        case '/':result=num1/num2;break;
    }
    switch(ch2)//二,三級難度的兩步運算 
    {
        case '+':result=num1+num2;break;
        case '-':result=num1-num2;break;
    }
    switch(ch3)
    {
        case '+':result=result+num3;break;
        case '-':result=result-num3;break;
    }
    return result;
 }

函式4

void Accuracy();
功能:根據之前統計的正確題數和錯誤題數計算正確率,正確率大於百分之75才輸出正確率

void Accuracy()
 {
    if(right/(right+wrong)>0.75) 
    {
        printf("你的正確率有%d%%呢\n歡迎下次再來玩遊戲呀\n",100*right/(right+wrong));
    }
    else 
    {
        printf("你的正確率有點低啊,不過沒關係,多加練習\n");
    }
 }

4.3 執行結果截圖

測試結果1

測試結果2

測試結果3

測試結果4

4.4 除錯碰到問題及解決辦法

Q1:一開始值的傳遞想用函式呼叫,沒有想到全域性變數,然後整個程式碼的思路都亂七八糟的
A1:在大佬的提醒下,想到了還可以用全域性變數,就不用函式呼叫來傳值了
Q2:在隨機產生運算子這裡愣了一下
A2:想用陣列解決來著,但是運算子也不多,於是用來switch
Q3:在測試資料時,發現除法像5/2這種情況就會出錯,因為一開始定義的隨機數都是int型
A3:於是把它們都改成了double型,並且在判斷是否正確時,讓它們的誤差在一定範圍裡是正確的
Q4:還遇到了一個問題就是除法運算中如果被除數為0,就會陷入癱瘓,這個問題還沒有解決,希望有大佬在評論區幫忙一下

4.5 大作業總結

  • 我的編寫過程
    • 先輸出個介面讓整個遊戲比較友好
    • 進入主題,選擇等級,隨機得到算式
    • 然後判斷使用者輸入的數是否正確
    • 這是大概的思路,然後在函式裡面完善各個分支
  • 遇到的問題
    • 值的傳遞卡住了,後來用了全域性變數
    • 程式碼量一大,有的這個地方錯了改一下,另一個相對的地方會忘記改,老是編譯錯誤
    • 產生隨機數這個函式不常用,有些不熟悉,只好靠百度了
    • 直接要退出遊戲的話,原本想用return 0;的,後來我的函式返回型都是void,就用了exit(0);來退出遊戲
    • 整個遊戲的程式碼打了挺久的,都是bug