(一)改錯題
輸出華氏攝氏溫度轉換表:輸入兩個整數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;
}
錯誤信息1:
錯誤原因:for循環中,末尾不用加分號
改正方法:將分號去掉,改為 for (fahr = lower , fahr <= upper, fahr ++)
錯誤信息2:
錯誤原因:for循環語句中,括號內部表達式用分號隔開
改正方法:將逗號改為分號,為 for (fahr = lower ; fahr <= upper; fahr ++)
錯誤信息3:
錯誤原因:編譯沒有問題,但輸出結果錯誤,經查找,far定義為整浮點型型,輸出格式為
改正方法:將輸出%3.0f改為%3d
錯誤信息4:
錯誤原因:輸出錯誤,繼續找錯,發現溫度轉化式有錯誤
改正方法:改為celsius = 5 * (fahr - 32.0) / 9;
錯誤信息5:
錯誤原因:輸出結果不對,繼續查找,發現for語句沒有加大括號,致運行錯誤
改正方法:加上花括號為
for (fahr = lower , fahr <= upper, fahr ++) ;
{
celsius = 5 /9 * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius);
}
錯誤信息6:
錯誤原因:輸出4組數據,經思考,每次fahr增加2,程序中增加1
改正方法: fahr ++改為fahr=fahr+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 = 5 * (fahr - 32.0) / 9;
printf("%3d %6.1f\n", fahr, celsius);
}
return 0;
}
(二)學習總結
1.
源程序
執行過程:
①定義了四個整型變量 i,num,odd,even,並賦odd初值為0,賦even初值為0;
②進入for語句循環,賦 i 值為1;
③判斷循環條件 i<=10,此時 i =1,i<10成立,進入循環;
④執行循環,輸入一個整數,存儲到num這個變量中;
⑤判斷num與2求余是否為0;
⑥若為0,則執行even++,即even的值加一;若為假,即余數不為0,則執行odd++,即odd的值加1;
⑦判斷完成后,執行i++,i值加1,此時i值為2;
⑧接着判斷循環條件,i=2<10成立,進入循環;
⑨再次輸入一個數,再次判斷if條件
⑩循環十次之后,i值為11,此時i=11>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 的值,為2,在給 i 值加1;第二條 先給 j 值加1,在輸出此時 j 的值,為3。
說明增量運算符在作為表達式的一部分時,前綴與后綴是不一樣的,前綴是先給變量加上或減去一個值,再參加運算;而后綴則是該變量先參加運算,再給該變量加上或減去一個值。
兩條輸出語句執行完后,i 和 j 的值都為3。
3.有些循環語句后面有{},有些沒有,有些語句有縮進,運行下面的四個小程序,運行結果有什么不同?循環體的認定與縮格形式是否有關?與{}是否有關?那么,應該如何正確判斷一個循環語句中的循環體?下面的程序中,哪幾種格式是正確的縮進格式。
(1)
結果為一行的五個 *
(2)
結果仍為一行的五個 *
(3)
結果為一列的五個 *
(4)
結果為一行的五個 *
由此看出:循環體的認定與縮格形式無關,與{}有關;要正確判斷一個循環語句中的循環體,要看{},看{}將那些內容包括在內;
四種程序中,2、3、4都是正確的縮進格式。
4.對其他你認為需要進行總結的內容進行總結。
關於符合運算符,符合運算符的優點體現在它的方便,比如表達式 n=n+1就可以寫成n+=1,大大提高了編程的效率,節省了時間。
(三)實驗總結
- 統計學生平均成績與及格人數
(1)題目
本題要求編寫程序,計算學生們的平均成績,並統計及格(成績不低於60分)的人數。題目保證輸入與輸出均在整型范圍內。
(2)流程圖
(3)源代碼
include <stdio.h>
int main ()
{
int i,N,G,count,sum;
double average;
scanf("%d",&N);
count=0;
sum=0;
if(N == 0)
{
}
else
{
for(i=1;i<=N;i++)
{
scanf("%d",&G);
sum = sum + G;
average = (double)sum / N;
if(G>=60)
{
count = count + 1;
}
else
{
count = count;
}
}
}
printf("average = %.1f\n",average) ;
printf("count = %d",count);
return 0;
}
(4)實驗分析
問題:
原因:未給count賦初值
解決辦法:給count賦初值為0
(5)本題PTA提交列表
2.到底是不是太胖了
(1)題目
據說一個人的標准體重應該是其身高(單位:厘米)減去100、再乘以0.9所得到的公斤數。真實體重與標准體重誤差在10%以內都是完美身材(即 | 真實體重 − 標准體重 | < 標准體重×10%)。已知市斤是公斤的兩倍。現給定一群人的身高和實際體重,請你告訴他們是否太胖或太瘦了。
(2)流程圖
(3)源代碼
include <stdio.h>
int main()
{
int i,N,H,W;
double bz;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%d %d",&H,&W);
bz = (H-100)0.92;
if(W-bz<bz0.1 && bz-W<bz0.1)
{
printf("You are wan mei!\n");
}
else if(W-bz>=bz*0.1)
{
printf("You are tai pang le!\n");
}
else
{
printf("You are tai shou le!\n");
}
}
return 0;
}
(4)實驗分析
問題1:完美情況時,只考慮了真實體重-標准體重>標准體重*0.1的情況
原因:考慮不全面,沒有仔細閱讀題目要求
解決辦法:增添了缺少的步驟
問題2:邊界測試150錯誤
原因:不了解程序的情況
解決辦法:老師幫忙
(5)本題PTA提交列表
3.統計學生成績
(1)題目
本題要求編寫程序讀入N個學生的百分制成績,統計五分制成績的分布。百分制成績到五分制成績的轉換規則:
大於等於90分為A;
小於90且大於等於80為B;
小於80且大於等於70為C;
小於70且大於等於60為D;
小於60為E。
(2)流程圖
(3)源代碼
include <stdio.h>
int main()
{
int N,A=0,B=0,C=0,D=0,E=0,i,grade;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%d",&grade);
if(grade>=90 && grade<=100)
{
A++;
}
else if(grade>=80 && grade<90)
{
B++;
}
else if(grade>=70 && grade<80)
{
C++;
}
else if(grade>=60 && grade<70)
{
D++;
}
else
{
E++;
}
}
printf("%d %d %d %d %d",A,B,C,D,E);
return 0;
}
(4)實驗分析
本題只要仔細,不馬虎,就不會有錯,此題是循環中簡單的一題
(5)本題PTA提交列表
4.找出最小值
(1)題目
本題要求編寫程序,找出給定一系列整數中的最小值。
(2)流程圖
(3)源代碼
include <stdio.h>
int main()
{
int n,x,i,min;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(i==1)
{
min=x;
}
else
{
if(min>x)
{
min=x;
}
else
{
min=min;
}
}
}
printf("min = %d",min);
return 0;
}
(4)實驗分析
本題屬於簡單題,只要用心的話就可以做對,就可以無停頓的寫下程序
(5)本題PTA提交列表
(四)博客互評
郭玉霖的博客鏈接:http://www.cnblogs.com/HBQ521/
姚慶虎的博客鏈接:http://www.cnblogs.com/yaole10086/
T磊?的博客鏈接:http://www.cnblogs.com/8426224ll/