(一)改錯題
(1)輸出華氏攝氏溫度轉換表:
輸入兩個整數lower和upper,輸出一張華氏攝氏溫度轉換表,華氏溫度的取值范圍是{lower,upper},每次增加2℉。計算公式如下:
c = 5×(f-32)/9
其中,c表示攝氏溫度,f表示華氏溫度。
- 輸入輸出樣例1:
Enter lower:32
Enter upper:35
fahr celsius
32 0.0
34 1.1 - 輸入輸出樣例2:
Enter lower:40
Enter upper:30
fahr celsius
(2)源程序(有錯誤的程序):
- 錯誤信息1:
- 錯誤原因1:
for 語句后面多加了分號;在for語句后面括號中,分別表示fahr初值,判斷范圍以及步長的語句之間應該用分號分開,而不是逗號。 - 改正方法1:
將for語句括號后面的分號刪掉即可;將for語句后括號中判斷語句前后的兩個逗號改成分號。 - 錯誤信息2:
- 錯誤原因2:
發現第16行的輸出語句中對應華氏度數的格式化輸出符號有問題,在聲明時以及輸出時均為int型,但是輸出時卻格式化為浮點型。 - 改正方法2:
將對應華氏度的輸出符號改為整形輸出的“%d”,對應攝氏度的符號改為符合樣例數據的“%.1f”。 - 錯誤信息3:
- 錯誤原因3:
源代碼第五行定義的celsius屬於double類型,而第十四行所定義的式子全部為整型,轉換錯誤。 - 改正方法3:
在第十四行的代碼5后面加一個“.0”進行強行轉換。 - 錯誤信息4:
- 錯誤原因4:
for語句的循環體中沒有加大括號。 - 改正方法4:
將for語句的循環體放進大括號里,其中printf語句也包括在內。 - 錯誤信息5:
- 錯誤原因5:
原題中給出的循環,華氏度的溫度增加2,而在源代碼的for語句中,每次循環華氏度只增加1。 - 改正方法5:
將循環后華氏度的增量改變為+2。 - 全部改正后帶入幾組數據進行運行計算如圖:
運行結果都與預期結果相符。 - 正確的代源碼如圖:
(二)學習總結
- 1.有如下程序:
- 問題:
詳細描述程序的執行過程,即說明程序的每一步是執行的哪條代碼,執行順序如何。循環需描述前兩次循環和最后一次循環的詳細執行過程。最后說明程序實現的功能是什么。 - 答:
①先聲明變量,然后再給代碼賦初值。
②進入循環語句,開始輸入數字,循環次數為10。
③在循環語句中輸入一個數就要進行一次判斷,判斷該數是為奇數還是偶數,若為奇數,在奇數個數上加1(偶數一樣),最后輸出奇數和偶數的個數。
④前兩次的循環,先輸入一個數,判斷奇數還是偶數。然后再次輸入一個數,進行第二次循環,繼續判斷奇數和偶數。當輸入第十個數就是最后一次循環,仍然判斷是奇數還是偶數。
⑤最后程序實現的是判斷並計算輸入的10個數中,奇數個數和偶數的個數。 - 2.增量運算符:
(1)運行下面程序,結果是什么?增量運算符在單獨使用時,前綴和后綴形式有區別嗎?
- 答:
運行此程序,結果如圖所示:
增量運算符在單獨使用時,對於此程序來說,前綴和后綴的形式沒有區別。
(2)運行下面的程序,結果是什么?兩條輸出語句的執行過程是怎樣的?說明什么問題?這兩條輸出語句執行完后,i和j的值分別是多少?
- 答:
運行此程序,結果如圖所示:
第一條輸出語句是先運行,后加一;而第二天語句是先進行加一,后運行。對於此程序而言,前綴與后綴的形式影響到了輸出(前綴是先進行加減,后運行;后綴是先運行,后進行加減。)。兩條輸出語句執行完后,i j的值均為3。 - 3.有些循環語句后面有{},有些沒有,有些語句有縮進,運行下面的四個小程序,運行結果有什么不同?循環體的認定與縮格形式是否有關?與{}是否有關?那么,應該如何正確判斷一個循環語句中的循環體?下面的程序中,哪幾種格式是正確的縮進格式。
- 程序1:
- 運行結果1:
- 程序2:
- 運行結果2:
- 程序3:
- 運行結果3:
- 程序4:
- 運行結果4:
經過對四個小程序進行運行,發現:
(1)先看第一個和第二個程序就只有兩個printf這個語句有區別,第二個有縮格,但是輸出的結果是一樣的,一個制表符並不能改變編譯時的順序。可第四個源程序和第一及第二個源程序在看起來卻因為一對花括號看起來並不是那么的一樣了,這也可以從側面印證我們在寫代碼時標准的格式的重要性了。而原因就是因為for語句和if語句有一個相似的點,它只能和for后的第一個分號前的語句結合在一起。而第二個源程序卻將兩個語句縮進在了一起而沒有將它們用花括號把它們統一為一個代碼塊,很明顯雖然編寫者希望兩個語句在一個循環中運行,即目的為運行成第二個源程序所輸出的結果卻輸出了和第一個源代碼相同的結果,所以循環體的認定與縮格形式無關。
(2)再看第二個和第三個程序,區別在於多了一個花括號{},但是輸出結果不同,在比較一下第三個和第四個程序都有花括號{}但是括號的范圍不同,結果不同,當printf("\n")在花括號外面時,就不參與循環,結果就不會換行,所以與{}有關。
(3)正確判斷一個循環語句中的循環體是什么,我覺得是要看最后的輸出格式是什么,根據輸出格式和花括號{}括起來的范圍來看在括號外的語句便不參與循環。 - 4.對其他你認為需要進行總結的內容進行總結。
(1)for語句中的判斷語句是為了讓程序能夠有限次的進行循環,如果for語句中沒加任何判斷語句,就會進行無限循環;在for循環的括號中應該用;來分隔,而不是,。例如,我們這次作業的改錯題中,源程序就誤將,當做;從而產生了編譯器不報錯但會讓輸出結果錯誤的bug。我們當然不希望這種難以在今后檢查出來的錯誤存在。
(2)切記for循環語句應該用大括號括起來;在循環中使用的一些變量要在循環語句之前進行聲明和初始化。
(3)for語句中三個語句中間用分號隔開;
(4)循環體結束后進行輸出,輸出語句在循環體外。
(5)上面也說了大括號的作用,建議是只要以后寫到了循環體系一律加大括號哪怕是就是只循環就近這個語句也要加上,這樣自己看的也清晰明了,在自己檢查時一看就明白了那里是循環體系。記住前綴后綴的結合方式並且知道優先級的情況。良好的變成建議:在一行語句中,依次變量只出現一次增量,減量運算符。
(三)實驗總結
7-1.求奇數分之一序列前N項和
(1)題目:
本題要求編寫程序,計算序列 1 + 1/3 + 1/5 + ... 的前N項之和。
(2)流程圖:
(3)源代碼:
(4)實驗分析:
- 問題:
初次使用for語句難免有些生疏,經常會出現for那一行出現錯誤。 - 原因:
for語句中的括號應用分號分隔開各個語句,而不是逗號。 - 解決方法:
把for后面括號里面的逗號改為分號即可。
(5)本題PTA提交列表:
7-3 奇偶分家
(1)題目:
給定N個正整數,請統計奇數和偶數各有多少個?
(2)流程圖:
(3)源代碼:
(4)實驗分析: - 問題:
if語句后面出現編譯錯誤,如圖:
- 原因:
忘記了if語句的()中的等於號應該用兩個,一個等號是賦值,兩個等號才是等於。 - 解決方法:
把一個等號改為兩個等號即可。
(5)本題PTA提交列表:
7-5 統計字符
(1)題目:
本題要求編寫程序,輸入10個字符,統計其中英文字母、空格或回車、數字字符和其他字符的個數。
(2)流程圖:
(3)源代碼:
(4)實驗分析: - 問題:
編譯錯誤時常出現,如圖:
- 原因:
字符判斷沒有給字符加單引號;C語言中用兩個取地址符表示和。 - 解決方法:
用單引號來引起字符,把一個取地址符改為兩個。
(5)本題PTA提交列表:
7-7 求交錯序列前N項和
(1)題目:
本題要求編寫程序,計算交錯序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N項之和。
(2)流程圖:
(3)源代碼:
(4)實驗分析: - 問題:
if...else語句出現編譯錯誤,如圖:
- 原因:
if...else語句沒有用大括號括起來。 - 解決方法:
在if...else語句中加上大括號即可。
(5)本題PTA提交列表:
(四)博客互評
http://www.cnblogs.com/lrxlrz/p/7809529.html
http://www.cnblogs.com/15030280957liu/p/7821618.html
http://www.cnblogs.com/666888i/p/7821643.html