一、PTA實驗作業
題目1:7-4 換硬幣
1. 本題PTA提交列表


2. 設計思路
- 1、定義fen5:5分硬幣數量, fen2:2分硬幣數量, fen1:1分硬幣數量, total:硬幣總數量,count:換法總數
- 2、輸入一個金額
- 3、fen5從money/5開始,fen2從money/2開始,fen1從money開始,若fen55+fen22+fen1=money,輸出結果,並且count累加一,然后fen5,fen2,fen1減去一
- 4、當fen5或fen2或fen1小於等於0時退出循環
- 5、輸出count
3.本題調試過程碰到問題及解決辦法
- 1、一開始我用的是從一開始依次累加的辦法,但是這與題目結果是從大到小的樣例不符合,所以答案一直錯誤。

- 2、接着我犯了一個比較低級的錯誤,那就是忘了給count賦初值,所以雖然我在devc上得到的結果是對的,但到了pta就一直提示答案錯誤。這個錯誤向同學請教后才發現。
7-5 梅森數
1. 本題PTA提交列表

2. 設計思路
- 1、定義n為給定的正整數,number為每次的2的n次方減1的值
- 2、輸入n
- 3、如果n'等於1,直接輸出None
- 4、當i小於等於n時,number=2的i次方減1,i加一
- 5、當j小於等於number/2+1時,如果number%j==0,退出循環;如果j>number/2 && number!=1,輸出number並換行,j加一
- 6、當j大於j大於number/2+1時,跳到步驟4
- 7、當i大於n時,結束循環
3.本題調試過程碰到問題及解決辦法
- 1、這題的錯誤明顯是在j的循環條件判斷錯了,j應該要在小於number/2+1的時候循環,但我當時比較粗心,以為只要小於number/2就行了。多虧了devc的調試,我發現在i=2也就是剛開始時就無法進入循環,經過仔細觀察,我才發現j的循環條件判斷錯誤。


- 2、上面問題改正后發現自己忘了寫n=1的情況,所以又補充了一下,結果忘了在printf后面打分號,導致編譯錯誤。
7-7 歌唱比賽評分系統
1. 本題PTA提交列表

2. 設計思路
- 1、定義n為評委人數,repeat為重復計算次數,score為評委打的分數,sum為分數和,max為最大分數,min為最小分數
- 2、輸入repeat
- 3、當i小於等於repeat時,輸入評委數,輸入第一個分數值,令sum=0,max和min=第一個輸入的分數值;再將第一次輸入的分數值的值賦給sum,i自增一
- 4、當j小於n時,輸入下一個分數值,sum=sum+score,如果輸入的score大於max,令max=score,如果score小於min,令min=score,j自增一
- 5、當j大於n時,sum=sum-max-min;輸出平均值並跳到步驟3
- 6、當i大於repea時,結束循環
3.本題調試過程碰到問題及解決辦法
-1、這題一開始我將輸入n放在最外面,這樣在repeat大於一的情況下就無法重復輸入n在進行判斷了。

- 2、一開始,我將最大值最小值賦初值都放在第二個循環內,這樣的話每次輸入的分數都會變成最大最小值,與題意不符。
- 3、上述兩個問題在向同學請教並改正后,我再次提交,卻又錯了,我輸入題目樣例沒錯,然后又試了repeat大於一的情況才發現問題是我忘了每次循環后sum都要回到0,這樣才不會影響下一次循環的結果。

- 4、更改完上述問題后我再次提交,但又錯了,我在devc上試了各種數據,都沒發現錯誤,很郁悶的向同學請教,對比了他的代碼,才發現在最后的輸出結果我少了個換行符- -。
二、同學代碼結對互評
1.互評同學名稱:鄭佳亮
2.我的代碼、互評同學代碼截圖
- 我的代碼
#include<stdio.h>
int main ()
{
int money,fen5,fen2,fen1,count=0;
scanf("%d",&money);
for(fen5=money/5;fen5>0;fen5--)
for(fen2=money/2;fen2>0;fen2--)
for(fen1=money;fen1>0;fen1--)
if(fen5*5+fen2*2+fen1*1==money) {
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",fen5,fen2,fen1,fen5+fen2+fen1);
count++;
}
printf("count = %d",count);
return 0;
}
- 佳亮的代碼
#include<stdio.h>
int main(void)
{
int fen1,fen2,fen5,total,x,count;
scanf("%d",&x);
count=0;
for(fen5=x/5;fen5>=1;fen5--)
for(fen2=x/2;fen2>=1;fen2--)
for(fen1=x;fen1>=1;fen1--)
if(fen1+fen2*2+fen5*5==x){
count++;
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",fen5,fen2,fen1,fen1+fen2+fen5);
}
printf("count = %d",count);
return 0;
}
3.我和同學代碼不同在哪里?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪里出問題。
點評:
a、看了佳亮的博客,我發現我們剛開始都犯了同一個錯誤,那就是循環條件是從一開始累加的,這樣導致了結果與題目輸出不符合。雖然從數學角度講是正確的,但這不符合C語言題目要求,事實上,我有很多題目都是運算結果正確,但輸出形式和題目有些許的偏差導致的錯誤,這一點我需要好好改正。
b、最后提交的代碼上看,雖然題目輸入金額使用x,我覺得將輸入的金額用用money表示會更好,因為這樣更見名知義。
三、截圖本周題目集的PTA最后排名。

四、本周學習總結
1.你學會了什么?
- 1、從大的方面講我學會了使用嵌套循環
- 2、細節上,我從具體的題目中學會要把一些語句放在合適的循環條件中,就像歌唱比賽那一題,我將輸入n,賦初值放在第二個循環內,使得數據的運行發生錯誤,導致結果錯誤
- 3、還有,通過梅森數和菱形這兩題,我學會了要判斷好循環條件,梅森數中我漏了一個加一導致了結果錯誤,好在有devc可以幫助我
2.本周的內容,你還不會什么?
- 1、嵌套循環雖然會了,但是我覺得自己並不熟練,還要多多練習
- 2、做題的時候有時覺得不理解題目甚至毫無思路,我認為這可能是我數學知識不夠豐富造成的,我應該試着提升一下自己邏輯思維能力
- 3、做題時對題目輸出要求不夠仔細,我很多題都是錯在與輸出有些許差別上,雖然結果是對的,但是輸出的時候確與答案不像,要么順序不對(如換硬幣),要么沒有換行(如歌唱比賽),又或者循環包括范圍太大(最后一題餐飲服務我的第二個循環范圍過大,輸出結果與答案一樣,但就是提交時一直錯誤),這只能下次做題時更加細心來解決了!
