C語言程序設計第四次作業-選擇結構


(一)改錯題

輸出三角形的面積和周長,輸入三角形的三條邊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. 高速公路超速處罰
    (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提交列表

(四)博客互評
劉長森
李仁正
潘久朋


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM