(一)改錯題
輸出三角形的面積和周長,輸入三角形的三條邊a、b、c,如果能構成一個三角形,輸出面積area和周長perimeter(保留2位小數);否則,輸出“These sides do not correspond to a valid triangle”。
輸入輸出樣例1:
Enter 3 sides of the triangle: 5 5 3
area = 7.15; perimeter = 13.00
輸入輸出樣例2:
Enter 3 sides of the triangle: 1 4 1
These sides do not correspond to a valid triangle
源程序(有錯誤的程序)
#include <stdio.h>
#include <math.h>
int main(void)
{
double a,b,c;
double area,perimeter,s;
printf("Enter 3 sides of the triangle: ");
scanf( "%lf%lf%lf",&a,&b,&c );
if( a + b > c || b + c > a || a + c > b)
s = ( a + b + c ) / 2;
area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c );
perimeter = a + b + c;
printf("area = %.2f; perimeter = %.2f\n",area,perimeter);
else
printf("These sides do not correspond to a valid triangle\n");
return 0;
}
錯誤信息1:
錯誤原因:少加了一個右括號
改正方法:在( s - c )后再加一個右括號
錯誤信息2:
錯誤原因:if后面的語句和else后面的語句沒加大括號
改正方法:把if和else后面的語句分別用大括號括起來
錯誤信息3:
輸出內容錯誤
錯誤原因:if里面的判斷之間應該用&&連接,||代表或者
改正方法:將||改為&&
(二)學習總結
1.在編程解決問題的過程中,我們會用到多個if語句,if...else if... 語句以及switch語句,查閱資料,總結一下這三種情況的區別何在,並分別舉例加以說明。禁止大段復制,要自己對資料進行歸納總結,並給出你參考的資料鏈接。
2.對其他你認為需要進行總結的內容進行總結。
答:if類型的語句的判斷條件可以用來表示一個范圍,而switch則是一個具體的數值。出現多個if語句的時候會對每一個條件都進行判斷。最后的else會和最近的if配對。而if和else if的語句,一旦滿足了其中的一個條件就會終止判斷。
判斷條件較多時可以使用if else if語句和switch語句,而兩者的區別則是switch...case會生成一個跳轉表來指示實際的case分支的地址,而這個跳轉表的
索引號與switch變量的值是相等的。從而,switch...case不用像if...else if那樣遍歷條件分支直到命中條件,而只需訪問對應 索引號的表項從而到達定位分支的目的。
所以從效率上來說由於if...else if的遍歷性,代碼執行效率是不高的。
舉例:例如選擇結構二的第三道編程題,計算天數,需要進行多次判斷。而因為知道具體的月份,所以用switch會更加簡單。
而在選擇結構一的第九題計算階梯電價中,因為用戶的用電量是隨機的,所以用能夠表示范圍的if語句會更好一點
資料鏈接一 資料鏈接二
(三)實驗總結
1.比較大小
(1)題目
本題要求將輸入的任意3個整數從小到大輸出。
(2)流程圖
(3)源代碼
#include<stdio.h>
int main()
{
int a,b,c,x,y,z;
scanf("%d%d%d",&a,&b,&c);
if(a>b && a>c)
{
x = a;
if(b>c)
{
y = b,z = c;
}
else
{
y = c;
z = b;
}
}
else if(b>a && b>c)
{
x = b;
if(a>c)
{
y = a;
z = c;
}
else
{
y = c;
z = a;
}
}
else
{
x = c;
if(a>b)
{
y = a;
z = b;
}
else
{
y = b;
z = a;
}
}
printf("%d->%d->%d",z,y,x);
return 0;
}
(4)實驗分析
問題一:if語句錯誤
原因:&應該是兩個而不是一個
解決辦法:再加上一個&
問題二:答案輸出錯誤
原因:有一個if后面的語句沒加括號
解決辦法:將在if后面的語句括起來
(5)本題PTA提交列表
-
高速公路超速處罰
(1)題目
按照規定,在高速公路上行使的機動車,超出本車道限速的10%則處200元罰款;若超出50%,就要吊銷駕駛證。請編寫程序根據車速和限速自動判別對該機動車的處理。
(2)流程圖
(3)源代碼#include<stdio.h> int main() { int a,b; double c; scanf("%d%d",&a,&b); c = (a-b)*1.0/b; if(c<0.1) printf("OK"); else if(c>=0.1 && c<0.5) printf("Exceed %0.0f%%. Ticket 200",c*100); else printf("Exceed %0.0f%%. License Revoked",c*100); return 0; }
(4)實驗分析
問題一:不能正確輸出百分數
原因:%lf后面應該加上兩個百分號
解決辦法:在%lf后面加兩個百分號
(5)本題PTA提交列表
3.計算油費
(1)題目
現在90號汽油6.95元/升、93號汽油7.44元/升、97號汽油7.93元/升。為吸引顧客,某自動加油站推出了“自助服務”和“協助服務”兩個服務等級,分別可得到5%和3%的折扣。
(2)流程圖
(3)源代碼
#include<stdio.h>
int main()
{
int p;
double l,y;
char f;
scanf("%lf%d %c",&l,&p,&f);
switch(p)
{
case 90:
if(f == 'm')
{
y = l*6.95*0.95;
}
else
{
y = l*6.95*0.97;
}
break;
case 93:
if(f == 'm')
{
y = l*7.44*0.95;
}
else
{
y = l*7.44*0.97;
}
break;
case 97:
if(f == 'm')
{
y = l*7.93*0.95;
}
else
{
y =l*7.93*0.97;
}
}
printf("%0.2f",y);
return 0;
}
(4)實驗分析
switch和if后面的語句要記得用括號括起來,並且后面不能加分號。其他語句后面都要分號。表示等於是兩個等號,一個代表賦值
(5)本題PTA提交列表
4.12-24小時制
(1)題目
編寫一個程序,要求用戶輸入24小時制的時間,然后顯示12小時制的時間。
(2)流程圖
(3)源代碼
#include<stdio.h>
int main()
{
int h,m,h1,m1;
scanf("%d:%d",&h,&m);
if(h<12)
{
h1 = h;
m1 = m;
printf("%d:%d AM",h1,m1);
}
else if(h == 12)
{
h1 = h = 12;
m1 = m;
printf("%d:%d PM",h1,m1);
}
else if(h>12 && h <24)
{
h1 = h-12;
m1 = m;
printf("%d:%d PM",h1,m1);
}
else
{
h1 = 0;
m1 = m;
printf("%d:%d AM",h1,m1);
}
return 0;
}
(4)實驗分析
要注意各個時間點的區分,if,else if后面的語句要用括號括起來,判斷條件后面不加分號。輸出要符合題目格式要求。注意區分中英文符號
5)本題PTA提交列表
(四)博客互評
劉長森
李仁正
潘久朋