C語言程序設計第四次作業——選擇結構(2)


(一)改錯題

輸出三角形的面積和周長,輸入三角形的三條邊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;        
}

對源程序進行編譯,采用每次修改第一個錯誤並重新編譯的方法,記錄每個錯誤的錯誤信息、分析錯誤原因並給出正確的語句。

錯誤信息:

錯誤原因:area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c ); 最后面丟掉了半個括號

改正方法:area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c ));

錯誤信息:

錯誤原因:if與else中的語句沒有加括號

改正方法:在每一個條件前后加括號

    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");
      } 

錯誤信息:

錯誤原因:三角形判定兩邊之和大於第三邊判定關系有誤

改正方法:三角形兩邊之和大於第三邊應該是並且的關系用&&連接而不是||, if( a + b > c && b + c > a && a + c > b)

以下是我改正后的程序:

#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.在編程解決問題的過程中,我們會用到多個if語句,if...else if... 語句以及switch語句,查閱資料,總結一下這三種情況的區別何在,並分別舉例加以說明。禁止大段復制,要自己對資料進行歸納總結,並給出你參考的資料鏈接。

答:1.if與if else

①if是條件判斷語句,只有if的條件成立(表達式的值為真)后,才會執行if部分的代碼,否則將會執行else的代碼。
如果是if...else if,則滿足第一個if執行第一個if里的代碼,如果不滿足第一個if,而滿足第二個if,則執行第二個if(即else if)的代碼,如果都不滿足,就不執行,如果后面有else(不帶if的else),則只要前面的if和else if都沒執行,就執行最后一個else。

②if,else if都需要接判斷表達式。else不需要判斷表達式。
使用else if和else,必須緊跟在if之后,形參if-esle if組或if-else對。 沒有對應的if語句,else if和else語句都會在編譯時報錯。

if(condition1) /*如果滿足條件1*/
{
}
else if(condition2)/*否則,如果滿足條件2*/
{
}
else/*否則*/
{
} 

2.if與switch
if語句每執行一次都要先判斷條件表達式是true還是false,為true時執行相應語句,若為false則繼續判斷下一個表達式,直到最后一個else結束。線性執行。
switch語句只需在入口時計算表達式的值,然后查找跳轉表,執行對應語句,否則default。
區別一:
switch…case…只能用於case值為常量的分支結構,而if…else…更加靈活。
區別二:
if判斷條件為邏輯表達式,可以是布爾類型的合法表達式、可以是常量、枚舉等。而switch 通常處理算術表達式,或字符。。
區別三:
switch 進行一次條件判斷后直接執行到程序的條件語句。而if…else 有幾種條件,就得判斷多少次。
區別四:
相比if語句,switch語句是以空間換時間的分支結構。因為它要生成跳轉表,所以占用較多的代碼空間。當case常量分布范圍很大但實際有效值又比較少的情況, switch…case的空間利用率將變得很低。
區別五:
分支較多時,使用switch的效率高於if,除非第一個if條件就為真。。
其次,當分支較多時,使用if…else…代碼可讀性不如switch…case…高。

if…else…
if (表達式1)
{
語句1;
}
else if (表達式2)
{
語句2;
}
else if (表達式3)
{
語句3;
}
else if (表達式4)
{
語句4;
}
...
else
{
語句n+1;
}

switch…case…

switch (表達式)
{
case 值1:語句1;break;
case 值2:語句2;break;
case 值3:語句3;break;
case 值4:語句4;break;
case 值5:語句5;break;
...
default:語句n+1;break;
}

參考鏈接:http://bbs.itheima.com/thread-3126-1-1.html

2.對其他你認為需要進行總結的內容進行總結。
答:在switch中,有些情況不需要每個case后邊都加break,比如計算一年至今有多少天。 有一些截圖在此無法上傳成功,仍是一串字符,目前還無法解決,只能尋找替代品。

(三)實驗總結

本次實驗總結,學號末位數是單數的同學完成選擇結構(2)中的1、5、7、9題,學號末位數是雙數的同學完成選擇結構(2)中的2、4、6、8題。

  1. 比較大小

(1)題目

本題要求將輸入的任意3個整數從小到大輸出。

(2)流程圖

(3)源代碼

#include<stdio.h>
int main()
{
    int a,b,c,n,max,min;
    scanf("%d %d %d",&a,&b,&c);
    if(a>=b&&b>=c)
    {
        max = a;
        n = b;
    min = c;
    }
    else if(a>b&&b<c&&a>c)
    {
        max = a;
        n = c;
    min = b;
    }
    else if(b>a&&a>c)
    {
        max = b;
    n = a;
        min = c;	
}
else if(b>a&&c>a&&b>c)
    {
        max = b;
    n = c;
        min = a;
}
     else if(a>b&&b<c&&a<c)
    {
        max = c;
        n = a;
        min = b;
    }
        else if(b>a&&c>a&&b<c)
    {
        max = c;
        n = b;
        min = a;
 	}
    else if(c>a&&a>b)
    {
        max = c;
        n = a;
    min = b;
    }
    else if(c>a&&a<b&&c>b)
    {
        max = c;
    n = b;
       min = a;
}
    else if(c>a&&a<b&&c<b)
    {
        max = b;
        n = c;
        min = a;	
    }   
    printf("%d->%d->%d",min,n,max);
 
        return 0;
}

(4)實驗分析

問題1:此實驗一開始輸入格式沒有讀懂。
原因:來才發現格式單純的只是“->”
解決辦法:只需按題目輸出即可。
問題2:編程忘記了a=b=c的情況。
解決辦法:在if中加入a=b=c條件即可。
問題:在流程圖里邊我無法在輸出用數字以及->輸出。
解決辦法:只能用字母加->表示。

(5)本題PTA提交列表

4.高速公路超速處罰

(1)題目

按照規定,在高速公路上行使的機動車,超出本車道限速的10%則處200元罰款;若超出50%,就要吊銷駕駛證。請編寫程序根據車速和限速自動判別對該機動車的處理。

(2)流程圖

(3)源代碼

# include <stdio.h>
int main(void)
{
    int a,b;
    double c;
    scanf("%d %d",&a,&b);
        if(b*110<=100*a&&a*100<b*150)
    {
   	    c=(a-b)*100.0/b;
	    printf("Exceed %.f%%. Ticket 200",c);
    }
    else if(b*150<=a*100)
    {
	    c=(a-b)*100.0/b;
	    printf("Exceed %.f%%. License Revoked",c);
    }

    else
    {
	    printf("OK");
    }  

    return 0;	
}

(4)實驗分析

問題1:當b=150時,輸出的是Exceed %.f%%. Ticket 200",c,
原因:b的范圍沒有弄清楚。
解決辦法:b=150應該放在下邊那個判斷條件里。

(5)本題PTA提交列表

6.計算油費

(1)題目

現在90號汽油6.95元/升、93號汽油7.44元/升、97號汽油7.93元/升。為吸引顧客,某自動加油站推出了“自助服務”和“協助服務”兩個服務等級,分別可得到5%和3%的折扣。
本題要求編寫程序,根據輸入顧客的加油量a,汽油品種b(90、93或97)和服務類型c(m - 自助,e - 協助),計算並輸出應付款。

(2)流程圖

(3)源代碼

# include <stdio.h>
int main(void)
{
    int a,b;
    char op;
    double money;
    scanf("%d %d %c",&a,&b,&op);
    switch(b)
    {
	case 90:
		money=6.95*a;
		break;
	case 93:
		money=7.44*a;
		break;
	case 97:
		money=7.93*a;
		break;
    }
    if(op=='m')
        {
	    money=money*0.95;
    }
    else
    {
	    money=money*0.97;
    }

    printf("%.2f",money);

    return 0;

 } 

(3)實驗分析

問題1:

原因:在一開始編程序的時候忘記了字符變量是什么。
解決方法:現在知道了字符型變量if里邊應該用單引號,應該切忌;
問題2:在流程圖里邊服務類型的選擇我有一些搞不懂。
原因:服務類型如果用選擇的話,選擇條件不知道如何寫。
解決方法:把選擇去掉,直接對服務類型賦值。

(5)本題PTA提交列表

8.12-24小時制

(1)題目
編寫一個程序,要求用戶輸入24小時制的時間,然后顯示12小時制的時間。

(2)流程圖

(3)源代碼

# include <stdio.h>
int main(void)
    {
int a,b;
scanf("%d:%d",&a,&b);
if(a>12)
{
                if(a==24)
	    {
		printf("0:%d AM",b);
	    }
	    else
	    {
	              a=a-12;
	              printf("%d:%d PM",a,b);			
	    } 
 }
 else
    {
	    if(a==12)
	    {
	        printf("%d:%d PM",a,b);
	    }
	    else
	        printf("%d:%d AM",a,b);
    }

    return 0;
} 

(4)實驗分析

問題1:流程圖里邊輸出是還是無法表示數字,比如我令m=分鍾,輸出的時候還是m這個字母。
原因:可能這個軟件就無法輸出數字。
解決方法:就只能看左邊的紅色的字符表示。

(5)本題PTA提交列表

(四)博客互評

每個同學至少評論三篇其他同學的博客作業,依次列出你所評論的博客地址。對於同學對你的博客作業提出的問題,應積極進行回答,存在的錯誤應及時改正。希望大家能夠在互評的過程中取長補短,共同進步。

http://www.cnblogs.com/yiqiekaoziji/p/7772484.html 我們不一樣(徐振剛)
http://www.cnblogs.com/zhaochenyu/p/7769166.html 永恆破碎(趙晨宇)
http://www.cnblogs.com/yjy751522356/p/7773477.htm l 幕曦


免責聲明!

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



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