一、PTA實驗作業
題目1:7-1 查詢水果價格
給定四種水果,分別是蘋果(apple)、梨(pear)、桔子(orange)、葡萄(grape),單價分別對應為3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。
首先在屏幕上顯示以下菜單:
[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
用戶可以輸入編號1~4查詢對應水果的單價。當連續查詢次數超過5次時,程序應自動退出查詢;不到5次而用戶輸入0即退出;輸入其他編號,顯示價格為0。
輸入格式:
輸入在一行中給出用戶連續輸入的若干個編號。
輸出格式:
首先在屏幕上顯示菜單。然后對應用戶的每個輸入,在一行中按格式“price = 價格”輸出查詢結果,其中價格保留兩位小數。當用戶連續查詢次數超過5次、或主動輸入0時,程序結束。
1. 本題PTA提交列表

2. 設計思路
- 第一步:定義整型變量i存放次數, choice存放用戶選擇,double price 表示價格;
- 第二步:顯示菜單,用printf()函數形式分別換行輸出;
- 第三步:不用輸入,直接進入for循環:for(i=1;i<=5;i++);
- 第四步:在for內輸入用戶選擇;
- 第五步:判斷choice是否為0,是則程序結束;否則,繼續執行下一步;
- 第六步:使用switch()結構,對四種水果選擇進行不同價格給出;
- 第七步:若不是輸入四種水果對應編號,輸出0;
- 第八步:輸出價錢price,保留兩位小數;
3.本題調試過程碰到問題及解決辦法
- (1)首先編譯過程中的思路可以的情況下,不知道如何用代碼表述出來,在【主動輸入0時,程序結束】這里會想着直接用break,調試時,也發現會跳出去,沒法得到結果,知道不能這樣寫,該換種表達法;


- (2)調試時無法進入下一步:調試改正.....




題目2:7-4 換硬幣
將一筆零錢換成5分、2分和1分的硬幣,要求每種硬幣至少有一枚,有幾種不同的換法?
輸入格式:
輸入在一行中給出待換的零錢數額x∈(8,100)。
輸出格式:
要求按5分、2分和1分硬幣的數量依次從大到小的順序,輸出各種換法。每行輸出一種換法,格式為:“fen5:5分硬幣數量, fen2:2分硬幣數量, fen1:1分硬幣數量, total:硬幣總數量”。最后一行輸出“count = 換法個數”。
1. 本題PTA提交列表

2. 設計思路
- 第一步:定義整型變量零錢數額x,fen5:5分硬幣數量, fen2:2分硬幣數量, fen1:1分硬幣數量, total:硬幣總數量”,count:換法個數且int count=0;
- 第二步:輸入零錢數額x;
- 第三步:進入for循環:for(fen5 = x/5; fen5>0; fen5--),fen5 = x/5算出總的fen5錢數,每有一個就在總錢x上作相應減少;
- 第四步:同第三步for循環,對fen2處理;
- 第五步:同第三步for循環,對fen1處理;
- 第六步:檢查是否fen55+fen22+fen1*1==x滿足,若不滿足即出現錯誤,修改;
- 第七步:若滿足fen55+fen22+fen1*1==x,則輸出各硬幣數量及硬幣總數量:fen5:%d, fen2:%d, fen1:%d, total:%d\n",fen5,fen2,fen1,fen5+fen2+fen1;
- 第八步:換法個數作相應增加,跳出循環;
- 第九步:繼續循環,直至x==0;
- 第十步:輸出換法個數;
3.本題調試過程碰到問題及解決辦法
- (1)一開始的結果輸出與答案差別很大,思路是有的,但轉化成程序語言后發現無法實現題目里的效果:
接着調試,還發現count沒有初始值,循環也未用break跳出,導致出現多次count=0,;


- (2)答案與輸出結果不同,總是會多出count一行,經過調試發現把輸出的count寫進了循環里,需要提到循環外面;




題目3:7-7 歌唱比賽評分系統
為學生歌唱比賽設計一個評分系統,評分規則如下:共有n名評委給分(0~100分),要求去掉一個最高分,去掉一個最低分,剩余成績的平均分為最終得分。輸入一個正整數repeat (0<repeat<10),做repeat次下列運算:
輸入一個正整數n(3≤n≤10),表示有n個評委,輸入n個成績,輸出最終得分,結果保留小數點后兩位。
1. 本題PTA提交列表

2. 設計思路
- 第一步:定義整型變量grade存放成績,float score,n個成績,repeat正整數,i大循環次數,j內循環次數,float score存放最后得分;
- 第二步:輸入正整數repeat,提示循環次數;
- 第三步:進入for大循環:for(i=1;i<=repeat;i++),保證每輸入一個成績都能有同樣的操作執行;
- 第四步:定義輸入成績的總分數int sum=0,定義int max=0&&int min=100,保證輸入的后續成績與min、max分別對比后能最后去掉min、max;
- 第五步:輸入n:scanf("%d",&n);
- 第六步:進入小循環:for(j=1;j<=n;j++)來比較出最大最小值;
- 第七步:計算出總分:sum=sum+grade,內循環結束;
- 第八步:計算出去掉小循環得出的min、max后的sum;
- 第九步:計算最后得分:score=1.0*sum/(n-2);
- 第十步:按題目要求輸出:printf("score:%.2f\n",score);
3.本題調試過程碰到問題及解決辦法
- (1)一開始的這題碰到的問題就是不知道怎么實現把最大最小值用嵌套循環的方式找出來,然后詢問他人后明白了要先賦予值然后在循環里要做的就是不斷與輸入的成績進行比較,得出相應的值;
- (2)按自己原來的思路是把成績grade直接都先給min、max,這里的grade是可以實現循環后改變的,但結果錯誤:

接着調試程序,發現一開始score就已經出現了答案,說明在一開始的賦值上就出現問題了,應該把min、max初始值改掉;

- (3)接着(2)后:int min=0;max=100,運行發現還是錯誤的,

繼續調試,發現循環竟然是進不去的,說明在條件滿足上不符合,得修改,詢問同學,知道應該令min=100,max=0,否則否則任何值都比0大,比100小,無法正確得出答案,設置斷點位置進入;



二、同學代碼結對互評
1.互評同學名稱:龔順德
2.我的代碼、互評同學代碼截圖
我的代碼:
int i,j,grade,repeat,n;//i大循環次數,j內循環次數
float score;
scanf("%d",&repeat);
for(i=1;i<=repeat;i++){
int sum=0;
int max=0;
int min=100;//定義好最大最小,方便后續賦值 不能定義min=o,max=100;否則人和值都比0大,比100小
scanf("%d",&n);
for(j=1;j<=n;j++){
scanf("%d",&grade);
if(grade<min)//輸入的成績不斷比較大小,賦到相應的min、max中
min=grade;
if(grade>max)
max=grade;
sum=sum+grade;
}
sum=sum-min-max;
score=1.0*sum/(n-2);
printf("score:%.2f\n",score);
互評同學代碼:
{
int repeat,n,i,k,l,max,min,begin,all,num;
double score;
scanf("%d",&repeat);
for(begin=1;begin<=repeat;begin++){
scanf("%d",&n);
all=0;
scanf("%d",&num);
all=all+num;
max=num;
min=num;
for(i=1;i<=n-1;i++){
scanf("%d",&num);
all=all+num;
if(num>max) max=num;
else if(num<min) min=num;
}
all=all-max-min;
score=all/((n-2)*1.0);
printf("score:%.2f\n",score);
}
3.我和同學代碼不同在哪里?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪里出問題
- (1)基本上的思路是一樣,沒相差太大;不同的就是他用了我一開始想到的把min、max都賦值num,可是他能實現,而我不行,他max=num;
min=num;與我的int max=0,int min=100;放的位置不同,導致各自運行程序的時候會出現差異; - (2)他的沒有注釋,讀起來不太方便,使用了分支結構,定義變量感覺會比自己的更嚴謹,比較能接受自己的這種代碼,相對簡單明了,易於接受;
三、截圖本周題目集的PTA最后排名

四、本周學習總結
1.你學會了什么?
- (1)嵌套循環(即多重循環)的熟練化,記得上次寫博客時就已經有學過循環,只是真正會用還無法做到,在又經過一周的PTA習題和老師講解,對循環的使用知道了大多數情況下如何取用能讓解決一個問題時的程序量減少(即為什么要使用循環和如何實現循環);
- (2)確定循環條件和循環體,並使用break語句處理多循環問題;
- (3)用do-while語句構成的循環,在while后的表達式為零時結束循環;
- (4)平時要注意找正確循環體,易錯就是不知道怎么把信息里需要循環的東西用嵌套循環程序語言經過有限次表達出來,課堂派里的題目在讓自己補充程序的時候錯的最多,總是錯,意識到在讀一個程序方面還不夠;
2.本周的內容,你還不會什么?
- (1)不能正確找出循環體,以及用你程序表達出循環,說明嵌套循環還是存在問題;
- (2)PTA里的題目還是不能寫出來,比如【7-3 編程打印空心字符菱形、7-5 梅森數】等,老師的思路理解但自己獨立寫還是不行;
- (3)課堂派里需要補充程序的經常錯誤;
