(一)改錯題
輸出華氏攝氏溫度轉換表:輸入兩個整數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
源程序(有錯誤的程序)
#include <stdio.h>
int main(void)
{
int fahr , lower, upper; /* fahr表示華氏度 */
double celsius; /* celsius表示攝氏度 */
printf("Enter lower:");
scanf("%d",&lower);
printf("Enter upper:");
scanf("%d",&upper);
printf("fahr celsius\n"); /* 顯示表頭 */
/* 溫度轉換 */
for (fahr = lower , fahr <= upper, fahr ++) ;
celsius = 5 /9 * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius);
return 0;
}
將源代碼輸入后,執行編譯命令,發現存在錯誤;
錯誤(一):
錯誤原因:for 語句后面多加了分號。
改正方法:將for語句括號后面的分號刪掉。
錯誤(二):
錯誤原因:在for語句后面括號中,分別表示fahr初值,判斷范圍以及步長的語句之間應該用分號分開,而不是逗號。
改正方法:將for語句后括號中判斷語句前后的兩個逗號改成分號。
改正后經編譯無錯誤,如圖所示:
輸入給出的樣例1后,輸出結果有錯誤,如圖所示:
錯誤(三):
錯誤原因:
發現第16行的輸出語句中對應華氏度數的格式化輸出符號有問題,在聲明時以及輸出時均為int型,但是輸出時卻格式化為浮點型。
改正方法:將對應華氏度的輸出符號改為整形輸出的“%d”,對應攝氏度的符號改為符合樣例數據的“%.1f”。
改正后,繼續輸入給定的樣例1,結果發現:
錯誤(四):
錯誤原因:源代碼第五行定義的celsius屬於double類型,而第十四行所定義的式子全部為整型,轉換錯誤。
改正方法:在第十四行的代碼celsius=后面加(double)進行強行轉換。
改正后如圖所示:
再次進行編譯無錯誤,輸入樣例1,發現結果仍舊與給定輸出樣例不符:
錯誤(五):
錯誤原因:經仔細對源代碼進行檢查發現在for語句的循環體中沒有加大括號。
改正方法:將for語句的循環體放進大括號里,其中printf語句也包括在內。
改正后如圖所示:
錯誤(六):
錯誤原因:改正后,編譯無錯誤,輸入樣例1,結果與預期不符,題中輸出樣例為2行,但源代碼運行后輸出結果為4行。原題中給出的循環,華氏度的溫度增加2,而在源代碼的for語句中,每次循環華氏度只增加1。
改正方法:將循環后華氏度的增量改變為+2。
改正后如圖所示:
輸入樣例1,結果與預期相符:
輸入樣例2,結果與預期相符:
經過多次改正后的代碼:
#include <stdio.h>
int main(void)
{
int fahr , lower, upper; /* fahr表示華氏度 /
double celsius; / celsius表示攝氏度 */
printf("Enter lower:");
scanf("%d",&lower);
printf("Enter upper:");
scanf("%d",&upper);
printf("fahr celsius\n"); /* 顯示表頭 */
/* 溫度轉換 */
for (fahr = lower ; fahr <= upper; fahr=fahr+2)
{
celsius =(double) 5 /9 * (fahr - 32.0);
printf("%d %.1f\n", fahr, celsius);
}
return 0;
}
(二)學習總結
1.有如下程序:
#include <stdio.h>
int main()
{
int i,num,odd,even;
odd = 0;
even = 0;
for(i = 1; i <= 10;i++)
{
scanf("%d",&num);
if(num % 2 == 0)
{
even++;
}
else
{
odd++;
}
}
printf("%d %d",even,odd);
return 0;
}
詳細描述程序的執行過程,即說明程序的每一步是執行的哪條代碼,執行順序如何。循環需描述前兩次循環和最后一次循環的詳細執行過程。最后說明程序實現的功能是什么。
回答: (1)先聲明變量,然后再給代碼賦初值;
(2)進入循環語句,開始輸入數字,循環次數為10;
(3)在循環語句中輸入一個數就要進行一次判斷,判斷該數是為奇數還是偶數,若為奇數,在奇數個數上加1(偶數一樣),最后輸出奇數和偶數的個數。
(4)前兩次的循環,先輸入一個數,判斷奇數還是偶數。然后再次輸入一個數,進行第二次循環,繼續判斷奇數和偶數。
當輸入第十個數就是最后一次循環,仍然判斷是奇數還是偶數。
(5)最后程序實現的是判斷並計算輸入的10個數中,奇數個數和偶數的個數。
2.增量運算符
(1)運行下面程序,結果是什么?增量運算符在單獨使用時,前綴和后綴形式有區別嗎?
#include <stdio.h>
int main()
{
int i,j;
i = 2;
j = 2;
i++;
++j;
printf("i = %d\n",i);
printf("j = %d\n",j);
return 0;
}
回答:運行此程序,結果如圖所示:
增量運算符在單獨使用時,對於此程序來說,前綴和后綴的形式沒有區別。
(2)運行下面的程序,結果是什么?兩條輸出語句的執行過程是怎樣的?說明什么問題?這兩條輸出語句執行完后,i和j的值分別是多少?
#include <stdio.h>
int main()
{
int i,j;
i = 2;
j = 2;
printf("%d\n",i++);
printf("%d\n",++j);
return 0;
}
回答:運行此程序,結果如圖所示:
第一條輸出語句是先運行,后加一;而第二天語句是先進行加一,后運行。對於此程序而言,前綴與后綴的形式影響到了輸出(前綴是先進行加減,后運行;后綴是先運行,后進行加減。)。兩條輸出語句執行完后,i j的值均為3。
3.有些循環語句后面有{},有些沒有,有些語句有縮進,運行下面的四個小程序,運行結果有什么不同?循環體的認定與縮格形式是否有關?與{}是否有關?那么,應該如何正確判斷一個循環語句中的循環體?下面的程序中,哪幾種格式是正確的縮進格式。
(1)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("*");
printf("\n");
return 0;
}
運行結果:
(2)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("*");
printf("\n");
return 0;
}
運行結果:
(3)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("*");
printf("\n");
}
return 0;
}
運行結果:
(4)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("*");
}
printf("\n");
return 0;
}
運行結果:
經過對四個小程序進行運行,發現:
<1>循環體的認定與縮進格式沒有關系,而是與{}有關系。
<2>判斷一個循環語句中的循環體看{}。
<3>第四個是正確的循環題縮進格式。
4.對其他你認為需要進行總結的內容進行總結。
(1)for語句中的判斷語句是為了讓程序能夠有限次的進行循環,如果for語句中沒加任何判斷語句,就會進行無限循環;
(2)切記for循環語句應該用大括號括起來;
(3)for語句中三個語句中間用分號隔開;
(4)循環體結束后進行輸出,輸出語句在循環體外。
(三)實驗總結
1.統計學生平均成績與及格人數
(1)題目:
本題要求編寫程序,計算學生們的平均成績,並統計及格(成績不低於60分)的人數。題目保證輸入與輸出均在整型范圍內。
(2)流程圖:
(3)源代碼及其輸入樣例運行結果:
(4)實驗分析:
問題1:存在除數為0的情況;
原因:注意看題,輸入的人數可能為0;
解決辦法:加入條件判斷句(if語句),判斷輸入人數是否為0,再執行循環體語句。
問題2:計算及格人數的時候不正確;
原因:系統會隨機給及格人數的變量賦初值;
解決辦法:在定義變量的時候給變量賦初值。
(5)PTA提交列表:
2.到底是不是太胖了
(1)題目:
據說一個人的標准體重應該是其身高(單位:厘米)減去100、再乘以0.9所得到的公斤數。
真實體重與標准體重誤差在10%以內都是完美身材(即 | 真實體重 − 標准體重 | < 標准體重×10%)。
已知市斤是公斤的兩倍。現給定一群人的身高和實際體重,請你告訴他們是否太胖或太瘦了。
(2)流程圖:
(3)源代碼及其輸入樣例運行結果:
(4)實驗分析:
問題1:輸出結果一直不對;
原因:存在整型與小數之間的轉換;
解決辦法:定義變量的時候,注意變量屬於int還是double型(注意:整型/整型=整型)。
(5)PTA提交列表:
3.統計學生成績
(1)題目
本題要求編寫程序讀入N個學生的百分制成績,統計五分制成績的分布。百分制成績到五分制成績的轉換規則:
• 大於等於90分為A;
• 小於90且大於等於80為B;
• 小於80且大於等於70為C;
• 小於70且大於等於60為D;
• 小於60為E。
(2)流程圖:
(3)源代碼及其輸入樣例運行結果:
(4)實驗分析:
問題1:運用“if”語句需要判斷的太多;
原因:分數間包括的較多;
解決辦法:運用“swich語句”,將分數除以10以后,再進行運算。
(5)PTA提交列表:
4.找出最小值
(1)題目
本題要求編寫程序,找出給定一系列整數中的最小值。
(2)流程圖:
(3)源代碼及其輸入樣例運行結果:
(4)實驗分析:
問題1:在比較大小的問題中,將輸入的第一個數賦min或者max應該放在循環體的什么位置;
原因:給min或max一個初始值便於與后來輸入的各個數進行比較;
解決辦法:將賦值語句放在循環體外,因此循環體應該進行輸入(n-1)次。
(5)PTA提交列表:
(四)博客互評
1.李曉曉:http://www.cnblogs.com/Reloaded/p/7795161.html
評價:解釋的內容頗為詳細,使我了解到的東西很多,有自己的獨特的思想和思路,向他學習。
2.劉苗苗:http://www.cnblogs.com/liumiaomiao520/p/7795587.html
評價:條理清晰,內容完全,重點的東西標注詳細,沒有出現格式不完美的情況,繼續加油!
3.范凱華:http://www.cnblogs.com/fkh1/p/7812032.html
評價:整體內容工整,沒有出現特別大的問題,注意實驗分析內容不大完整,提出個小小的建議:下次截屏的時候可以只要運算結果,截全屏會顯得很大,但是不大美觀,繼續努力哦!