一、PTA實驗作業
題目1:編程打印空心字符菱形
1. 本題PTA提交列表
2. 設計思路(流程圖)
3.本題調試過程碰到問題及解決辦法
-
思考過程:將問題拆解為菱形問題和字母變化問題兩部分
1>先解決大體菱形問題,需注意高度height為總高,並不是菱形邊長。
2>菱形分為上下兩部分,空格和字符規律性變化。
3>一個大循環解決總高,再嵌套兩個循環進去上下兩部分。
4>在上下兩部分中,控制輸出的空格個數與具體的字符。 -
部分正確:第一次提交每一行的字母變換不正確。
解決辦法:利用循環變量i每次遞增的性質使每次字母遞加。 -
嵌套順序錯誤:應該是先判斷上上半部分還是下半部分,再判斷是否該輸出空格或字母。
-
代碼太過復雜:尤其是下半部分的循環條件,並不是一下子想出來的,而是用DEV調試很多遍試出來的,花了很長的時間,自己也不是很清楚。感覺自己的代碼缺少合理性,讓人看不懂,並不能很直觀明確的反映出各種條件和循環。第一眼看到這個題覺得菱形不是很困難,但當開始做起來的時候發現字母變化才是難點,自己坐在電腦前研究了三四個小時,才將大體弄出來。
-
調試過程:
題目2:梅森數
1. 本題PTA提交列表
2. 設計思路
- 第一步:定義整型變量n,i,j放循環變量,result放輸出結果
- 第二步:輸入正整數n
- 第三步:if語句判斷n。
- 第四步:若n等於1,輸出None
- 第五步:若n大於等於2小於20,進入循環
- 第六步:循環變量i賦值為1,循環條件為i小於等於n
- 第七步:賦值result等於pow(2,i)-1
- 第八步:進入下一個循環,j賦值為2,循環條件為j小於等於result
- 第九步:進入if判斷是否為素數,若result對j取余等於0,跳出循環。若j小於result/2且result不等於1,輸出result.
- 第十步:j遞加,重復第九步。
- 第十一步:i遞加,重復第七八九十步。
- 第十二步:循環結束。
3.本題調試過程碰到問題及解決辦法
-
題目理解不到位:只關注到怎么計算梅森數,忽略了它是素數的前提,第一次的代碼並沒有對結果是否為素數的判斷,導致DEV運行結果總是會出現15,詢問了同學后得知要判斷素數。
-
部分正確:取最大值n和n等於2的測試點錯誤
解決辦法:加入if語句對n等於2的條件判斷,可n取最大值的錯誤仍然存在,並且不知道錯在哪里。 -
部分正確:取最大值n的測試點錯誤
解決辦法:雖然在DEV上運行結果正確,但PTA仍然顯示部分正確,后來在檢查代碼時,為了更加簡潔將n等於2與大於2小於等於20合並起來,再提交答案就正確了。 -
調試過程:
題目3:歌唱比賽評分系統
1. 本題PTA提交列表
2. 設計思路
- 第一步:定義整型變量 n放成績個數,max放最大值,min放最小值,repeat重復次數,i,j放循環變量
- 第二步:定義雙精度浮點型變量grade放成績,total放總成績並賦值0
- 第三步:輸入重復次數repeat
- 第四步:進入循環進行repeat次運算 ,i=1,循環條件為i小於等於repeat
- 第五步:輸入成績個數及第一個成績
- 第六步:賦值total,max,min都為第一個成績
- 第七步:進入每一次的數據的循環,j=1,循環條件為j小於等於n-1
- 第八步:讀取下一個成績
- 第九步:用if語句比較max和grade的大小關系,若max小於等於grade,賦值max等於grade
- 第十步:用if語句比較mim和grade的大小關系,若min大於等於grade,賦值min等於grade
- 第十一步:賦值total等於total加grade
- 第十二步:j遞加,重復第八九十十一步
- 第十二步:i遞加,重復第五六七八九十十一十二步
- 第十二步:輸出成績
3.本題調試過程碰到問題及解決辦法
-
答案錯誤:這道題與第八題一樣需要repeat,剛開始理解成對一組數據進行repeat次計算,所以並沒有將輸入n值放入循環內,導致PTA答案錯誤
解決辦法:將將輸入n值放入第一個循環內。
-
調試過程:
-
格式錯誤:最后輸出沒有加\n,若需要第二次計算,第二個n的輸入位置在第一次的結果后面。所以格式錯誤。
-
調試過程:
二、同學代碼結對互評
1.互評同學名稱
楊峻森
2.我的代碼、互評同學代碼截圖
- 我的代碼
- 峻森的代碼
對比
-
我: 這道題我用了一百三十多行代碼,先用switch將各個等級的數量弄出來,再利用五個switch輸出五個等級各自對應的星號。而峻森同學只用了四十多行就寫出來了,主要的區別在與輸出時的那部分,它很好地利用上了循環嵌套分別輸出了不同等級對應的星號,而我並沒有使用循環嵌套,而是第一時間想到了switch,而且后來再看代碼發現也並不需要那么多switch語句來實現輸出。這反映出了一個問題:我缺少簡化代碼的能力,總是定性思維,不會利用起各種語句的特性來簡化代碼,菱形那道題目也是一樣的,代碼最后雖然正確,但是循環體復雜難懂,沒有老師課上解答的簡潔明了
-
峻森:峻森同學的代碼美中不足為缺少了注釋,而且變量名字也很隨意。希望他能在良好的編程基礎上再加一點良好的習慣。成為更強的程序員。
三、截圖本周題目集的PTA最后排名。
四、本周學習總結
1.你學會了什么?
課本中
-
函數的定義與使用:
使用自定義函數時,需要函數聲明,定義,調用,結果返回。
函數聲明:
函數類型 函數名 (參數表); ps:函數聲明是一句c語言,以分號結束。
函數定義:
函數類型 函數名 (形式參數表) /*函數首部*/
{
函數實現過程 /*函數體*/
}
函數調用:
函數名 (實際參數表)
形參表:
類型1 形參1 類型2 形參2······
-
實參與形參:
-
實參:主調函數的參數,可以為常量,變量,表達式。
-
形參:調用函數的參數,必須為變量。
-
聯系:將實參的值單向復制給形參的過程成為參數傳遞。
-
不返回結果的函數:
函數類型為void,不直接返回一個值。
-
全局變量:
定義在在函數外而不屬於任何函數的變量為全局變量。解決了return語句只能返回一個函數結果的問題,實現了多函數間的數據交流與表示。
-
局部變量:
定義在函數內部或復合語句中的變量為全局變量。
-
同名情況:
局部變量與全局變量同名時,局部變量起作用。函數的局部變量與復合語句的局部變量同名時,復合語句中的起作用。
-
靜態變量:
特殊的局部變量。靜態變量賦初值只在函數第一次調用時起作用,若沒有賦初值,系統將自動賦值為0.
static 類型名 變量表
做題中
-
金字塔,菱形類打印題目:
利用循環嵌套解決,重點找出是解決空格,輸出與題目輸入的關系式。菱形則需要分為上下兩部分來解決。
-
循環內外語句:
在PTA最后兩題中,就需要分清n值得輸入在循環內還是循環外,及在哪一個循環中。若沒有弄清楚,會導致循環卡住。
-
畫流程圖:
解決了寫算法無法表述循環嵌套的問題。
-
偽代碼:
學會了可以先寫偽代碼,再根據偽代碼編寫程序。
2.本周的內容,你還不會什么?
- 對於循環嵌套還不夠清楚,雖然這周題目集都是用循環嵌套會下意識使用多重循環,但要是平時做題很容易忽視掉這種循環模式,而且這種嵌套式循環會出現許多很細小的問題,例如循環內重新賦值,語句在循環內外的不同,循環條件的判斷·····可能是現在代碼還不夠復雜,沒能發現嵌套循環的方便。
- 對菱形類題目還不夠熟練,還需要多多練習。
- 全局變量,局部變量,靜態變量這三個僅僅會識別計算,並不能運用到自己的代碼里。