(一)改錯題
計算f(x)的值:輸入實數x,計算并輸出下列分段函數f(x)的值,輸出時保留1位小數。
輸入輸出樣例1:
Enterr x: 10.0
f(10.0) = 0.1
輸入輸出樣例2:
Enter x: 234
f(234.0) = 234.0
源程序(有錯誤的程序)
#include <stdio.h> int main(void){ double x,y;printf("Enter x: \n"); scanf("=%f", x);if(x = 10);{ y = 1 / x}else (x != 10){y = x;}printf("f(%.2f) = %.lf\n" x y); return 0; }
錯誤信息1:
錯誤原因:第九行的算式后面沒有加分號。
改正方法:在第九行的算式后面加上分號。
錯誤信息2:
錯誤原因:第七行判斷語句后面多加了分號。
改正方法:刪去第七行后面的分號。
錯誤信息3:
錯誤原因:第十一行else語句后面多了條件。
改正方法:刪去第十一行后面的條件。
錯誤信息4:
錯誤原因4:第十五行引號后面少了逗號。
改正方法:在第十五行引號后面加上逗號。
錯誤信息5:
錯誤原因:第十五行變量之間少了逗號。
改正方法:在第十五行變量之間加上逗號。
錯誤信息6:
錯誤原因:第一個輸出語句多加了\n。
改正方法:刪去\n。
錯誤信息7:
錯誤原因:最后的輸出語句x對應的值錯了。
改正方法:把第十五行的輸出語句中的變量 x 對應的 %.2f 改為 %.1f 。
錯誤信息8:
錯誤原因:輸入語句后面沒有加取地址符。
改正方法:在輸入語句x前面加上取地址符。
錯誤信息9:
錯誤原因:第十五行的輸出語句中變量 y 對應的為 %.lf 。
改正方法:把第十五行的輸出語句中的變量 y 對應的 %.lf 改為 %.1f 。
錯誤信息10:
錯誤原因:第六行的輸入語句中 &x 對應的為 =%f。
改正方法:把第六行的輸入語句中 &x 對應的 =%f 改為 %lf。
錯誤信息11:
錯誤原因:判斷語句條件錯誤。
改正方法:條件中再加一個“=”號。
(二)學習總結
1.if(a)if(b) x=x+1;else y=y+1; 的確切含義是什么?這個else應該和哪個if配對?如何明確表達這種配對方法?將該段代碼按照規范化的格式進行書寫。
答:確切含義為若同時符合條件a,b則運行x=x+1;若不符合條件a,則運行y=y+1。
else和離它最近的第二個if配對。
代碼:
if(a)
{if(b){x=x+1;}
}
else
{y=y+1;
}
2.C語言的表達式 (-10< x <10)能夠表達x在區間(-10,10)嗎?為什么?如果不能,正確的表達式應該怎么寫?
答:不能。因為條件從左到右運行。
正確表達式應為:
if(x>-10 && x<10)
3.C語言中輸入數據時,如果遇到非法字符,則認為輸入結束。運行程序(1),輸入123a,看看輸出結果是什么?你能解釋是為什么嗎?,
程序(1)
#include <stdio.h>
int main()
{ int a, b;scanf("%d %d", &a, &b);printf("a = %d, b = %d\n", a, b);return 0;
}
輸入123a后結果為:
原因:遇到非法字符%d不能識別,所以輸出結果錯誤,有問題,123a為一個數據,相當于b沒有輸入數據,所以輸出為隨機數1。
scanf()函數的返回值是成功讀入數據的個數,如果沒有讀取任何數據,則返回0。運行程序(2),分別輸入123 45和123a,看看輸出結果是什么?為什么?
程序(二)
#include <stdio.h>
int main()
{ int a, b,n;n = scanf("%d %d", &a, &b);printf("n = %d\n", n);return 0;
}
輸出結果:
當你成功輸入兩個變量的時候第一次兩個變量都合法,所以n讀出為2。當你輸入123a的時候含有非法字符,它不能讀取出來,所以n只能讀出一個整形常量,所以n=1。
修改程序(1),當輸入非法數據時,輸出“Input error!".樣例如下:
4.對其他你認為需要進行總結的內容進行總結。
在用else if語句的時候要注意每個else和if的對應關系,每個else,if語句執行時要加上中括號。
注意else if后面不能加分號。
不能忘了在輸入語句后面的變量前面加取地址符。
(三)實驗總結
(1)題目
判斷一個5位數是不是回文數。例如12321是一個回文數,即它的個位與萬位相同,十位與千位相同。
(2)流程圖
(3)源代碼# include<stdio.h>
int main()
{
int n,w,q,s,g;
scanf("%d",&n);
w=n/10000;
g=n%10;
q=n/10%10;
s=n%10000/1000;
if(w==g && q==s )
{
printf("yes");
}
else
printf("no");return 0;
}
(4)測試數據及運行結果
(5)實驗分析
問題1:一開始不會分離各個位數。
解決辦法:通過詢問老師會了。
(1)題目
本題要求根據火車的出發時間和達到時間,編寫程序計算整個旅途所用的時間。
(2)流程圖
(3)源代碼# include <stdio.h>
int main()
{
int a,b,c,d,s,f,m,n;
scanf("%d %d",&m,&n);
a = m/100;
b = n/100;
c = m%100;
d = n%100;
f = (b-a)*60+(d-c);
s = f/60;
f = f%60;
if(0<s<10)
{
if(0<f<10)
{
printf("%02d:%02d",s,f);
}
else
{
printf("%02d:%d",s,f);
}
}
else
{
if(24>=s>=10)
{
if(0<f<10)
{
printf("%d:%02d",s,f);
}
else
{
printf("%d:%d",s,f);
}
}
}return 0;
}
(4)測試數據及運行結果
(5)實驗分析
問題:一開始沒有考慮小于10分鐘的情況。
解決辦法:加了一個判斷條件。
(1)題目
中國有句俗語叫“三天打魚兩天曬網”。假設某人從某天起,開始“三天打魚兩天曬網”,問這個人在以后的第N天中是“打魚”還是“曬網”?
(2)流程圖
(3)源代碼# include <stdio.h>
int main()
{
int n,m;scanf("%d",&n);m = n%5;if (1000>=n>0);{if(m==0){printf("Drying in day %d",n);}else{if(m<=3){printf("Fishing in day %d",n);}else{printf("Drying in day %d",n);}}}return 0;
}
(4)測試數據及實驗結果
(1)題目
為了提倡居民節約用電,某省電力公司執行“階梯電價”,安裝一戶一表的居民用戶電價分為兩個“階梯”:月用電量50千瓦時(含50千瓦時)以內的,電價為0.53元/千瓦時;超過50千瓦時的,超出部分的用電量,電價上調0.05元/千瓦時。請編寫程序計算電費。
(2)流程圖
(3)源代碼# include <stdio.h>
int main()
{
int n;
double m;
scanf("%d",&n);
if(n>=0)
{
if(n<=50)
{
m = n0.53;
printf("cost = %.2f",m);
}
else
{
m = 500.53+(n-50)*0.58;
printf("cost = %.2f",m);
}
}
else
{
printf("Invalid Value!");
}
return 0;
}
(4)測試數據及運行結果
(四)PTA提交列表