C部落格作業03--函式
阿新 • • 發佈:2018-11-10
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
- if p%i==0 then
- 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
- if prime(i)&&prime(n-i) then
- 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