(一)改錯題
計算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:
錯誤原因:第9行最后沒加分號。
改正方法:在“x”后加分號。
錯誤信息2:
錯誤原因:第7行的if括號里的語句后加了分號,無法與else配對。
改正方法:去掉if一行中的分號。
錯誤信息3:
錯誤原因:else后邊不能加語句。
改正方法:去掉else后括號里的語句。
錯誤信息4:
錯誤原因:輸語句中引號后要加逗號。
改正方法:在15行的“x”前加逗號。
錯誤信息5:
錯誤原因:x與y兩個變量之間要用逗號隔開。
改正方法:在x與y之間加上逗號。
錯誤信息6:
錯誤原因:題目要求輸出時保留一位小數,且把“l”錯寫成“1”。
改正方法:將“%.lf”改為“%.1f”。
錯誤信息7:
錯誤原因:if后不用賦值單等號而用等於雙等號。
改正方法:將單等號改為雙等號。
錯誤信息8:
錯誤原因:輸入語句里不能有等號。
改正方法:去掉等號。
錯誤信息9:
錯與原因:輸入語句中要加地址符。
改正方法:在x前加&。
錯誤信息10:
錯與原因:運行后發現輸入10.0后,括號里是10.00。
改正方法:將第15行的括號里的“%.2f”改為“%.1f”。
錯誤信息11:
錯與原因:運行后發現格式與所給示例不同,換行了,“\n”多余。
改正方法:將“\n”去掉。
錯誤信息12:
錯誤原因:第一個輸入示例運行正確后,輸入第二個事例結果錯誤,x,y定義為double型,輸入語句里應用“%lf”。
改正方法:輸入語句里將“%f”改為“%lf”。
改正后運行結果正確,如圖:
正確源程序為:
(二)學習總結
1.if(a)if(b) x=x+1;else y=y+1; 的確切含義是什么?這個else應該和哪個if配對?如何明確表達這種配對方法?將該段代碼按照規范化的格式進行書寫。
答:此程序段的確切含義是若a且b,則執行x=x+1;否則,則執行y=y+1。else應和第二個if配對。
正確表達:
if(a&&b)
{
x=x+1;
}
else
{
y=y+1;
}
2.C語言的表達式 (-10< x <10)能夠表達x在區間(-10,10)嗎?為什么?如果不能,正確的表達式應該怎么寫?
答:不能,C語言中自左向右判斷,所以先判斷x>-10是否正確,而無法判斷x<10。
正確表達式為:
(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時,a為非法字符,輸入結束,則a=123,而b被賦值為1。若想b=a,則輸入輸出語句中d所對應的%d改為%c。如圖:
scanf()函數的返回值是成功讀入數據的個數,如果沒有讀取任何數據,則返回0。運行程序(2),分別輸入123 45和123a,看看輸出結果是什么?為什么?
程序(2)
#include <stdio.h>
int main()
{
int a, b,n;
n = scanf("%d %d", &a, &b);
printf("n = %d\n", n);
return 0;
}
答:輸出結果如圖:
輸入123 45后n=2,說明成功讀入2個數據,scanf()函數的返回值為2。
輸入123a后n=1,說明只成功讀入1個數據,因為有一個非法字符a,所以停止輸入,所以只有一個數據。
修改程序(1),當輸入非法數據時,輸出“Input error!".樣例如下:
答:修改后的程序如圖:
#include <stdio.h>
int main()
{
int a, b,n;
n = scanf("%d %d", &a, &b);
if(n==2)
{
printf("a = %d,b = %d\n",a,b);
}
else
{
printf("Input error!");
}
return 0;
}
輸入123 45和123a后結果如圖:
4.總結:
(1)判斷條件是否成立要用到關系運算符,關系運算符的結合方向為自左向右,關系運算符的優先級低於算術運算符,高於賦值運算符。
(2)邏輯運算符中“且”用“&&”表示,“或”用“||”表示。
(3)復合語句的分支中要使用花括號,使if與else一 一對應。
(4)字符常量用來存放字符常量,只能放一個字符,用char聲明,輸入輸出時用“%c”表示。
(三)實驗總結
1.計算分段函數[2]
(1)題目
本題目要求計算下列分段函數f(x)的值:
(2)流程圖
(3)源代碼
#include <stdio.h>
#include <math.h>
int main (void)
{
double x,relust;
scanf("%lf",&x);
if (x>=0)
{
relust=pow(x,0.5);
}
else
{
relust=pow((x+1),2)+2*x+1/x;
}
printf("f(%.2f) = %.2f",x,relust);
return 0;
}
(4)測試數據及運行結果
(5)實驗分析
問題:流程圖中無法賦值。
原因:流程圖與源程序的算術運算符弄混了。
解決辦法:記牢流程圖與源程序運算符的區別。
2.算術入門之加減乘除
(1)題目
對於輸入的兩個整數,按照要求輸出其和差積商。
(2)流程圖
(3)源代碼
#include <stdio.h>
int main (void)
{
int a,b,c,d,f,h;
double g;
scanf("%d %d",&a,&b);
c=a+b;
d=a-b;
f=a*b;
printf("%d + %d = %d\n%d - %d = %d\n%d * %d = %d\n",a,b,c,a,b,d,a,b,f);
g=(double)a/b;
h=a%b;
if (h==0)
{
printf("%d / %d = %.0f",a,b,g);
}
else
{
printf("%d / %d = %.2f",a,b,g);
}
return 0;
}
(4)測試數據及運行結果
(5)實驗分析
問題:a與b的商為小數。
原因:沒有判斷a/b的余數是否為0。
解決辦法:注意判斷a/b的余數是否為0。
3.輸出三角形面積和周長
(1)題目
本題要求編寫程序,根據輸入的三角形的三條邊a、b、c,計算並輸出面積和周長。注意:在一個三角形中, 任意兩邊之和大於第三邊。三角形面積計算公式:area=√s(s−a)(s−b)(s−c),其中s=(a+b+c)/2。
(2)流程圖
(3)源代碼
#include <stdio.h>
#include <math.h>
int main (void)
{
int a,b,c;
double s,area,perimeter;
scanf("%d %d %d",&a,&b,&c);
perimeter=a+b+c;
s=perimeter/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
if ((a+b>c)&&(a+c>b)&&(b+c>a))
{
printf("area = %.2f; perimeter = %.2f",area,perimeter);
}
else
{
printf("These sides do not correspond to a valid triangle");
}
return 0;
}
(4)測試數據及運行結果
(5)實驗分析
問題:輸入第二個示例后,運行結果與示例不同。
原因:是否為三角形的條件應用&&而不是||。
解決辦法:將||改為&&。
4.出租車計價
(1)題目
本題要求根據某城市普通出租車收費標准編寫程序進行車費計算。具體標准如下:
• 起步里程為3公里,起步費10元;
• 超起步里程后10公里內,每公里2元;
• 超過10公里以上的部分加收50%的回空補貼費,即每公里3元;
• 營運過程中,因路阻及乘客要求臨時停車的,按每5分鍾2元計收(不足5分鍾則不收費)。
(2)流程圖
(3)源代碼
#include <stdio.h>
int main (void)
{
int t;
double x,y;
scanf("%lf %d",&x,&t);
if (x<=3)
{
y=10;
}
else if (x<=10)
{
y=10+2*(x-3);
}
else if (x>10)
{
y=10+(10-3)*2+(x-10)*3;
}
if (t>=5)
{
y=y+t/5*2;
}
else
{
y=0+y;
}
printf("%.0f",y);
return 0;
}
(4)測試數據及運行結果
(5)實驗分析
問題:流程圖過於復雜。
原因:判斷完x<=10后多加了一個選擇框,判斷是否x>10。
解決辦法:去掉判斷是否x>10的選擇框。
(四)PTA提交列表
PTA中完成選擇結構(1)習題集的提交列表截圖。
如圖: