官术网_书友最值得收藏!

4.6 選擇程序設計

【例4.11】 將任意3個整數a、b、c按從大到小的順序輸出。

分析:

① 如果只有兩個整數a、b,可以用一個if語句直接輸出結果,例如:

            if(a>b)printf("%d,%d ",a,b);
            else printf("%d,%d ",b,a);

② 對于3個整數,有6種可能:

a > b > c

a > c > b

b > a > c

b > c > a

c > a > b

c > b > a

若直接輸出,寫出的程序會很“累贅”,例如,

            if(a>b && b>c)printf("%d,%d,%d ",a,b,c);
            if(a>c && c>b)printf("%d,%d,%d ",a,c,b);
            ……
            if(c>b && b>a)printf("%d,%d,%d ",c,b,a);

這樣寫程序不僅“難看”,而且“難懂”,還容易犯錯。

③ 可采用交換法先排序,然后再輸出結果,方法如下:

● 若a < b,則交換a和b;

● 若a < c,則交換a和c,結果a最大;

● 若b < c,則交換b和c,結果a > b > c;

● 輸出a、b、c。

其N-S圖如圖4.9所示。

圖4.9 3個數的排序算法

程序如下:

            1   #include<stdio.h>
            2   void main()
            3    {
            4       int a,b,c,t;
            5       printf("input 3 numbers:");
            6       scanf("%d,%d,%d",&a,&b,&c);
            7       if(a<b)
            8       {   t=a;a=b;b=t;        }
            9       if(a<c)
            10      {   t=a;a=c;c=t;        }
            11      if(b<c)
            12      {   t=b;b=c;c=t;        }
            13      printf("sorted result:%d,%d,%d\n",a,b,c);
            14  }

程序第5~6行是數據輸入部分;第7~12行是數據處理部分,完成排序;第13行是數據輸出部分。這種結構符合結構化程序設計的要求。

【例4.12】 在射擊比賽模擬系統中,靶面被分隔為若干同心圓,如圖4.10所示。如果與10、9、8、7、6環對應的圓的半徑分別為1、2、3、4、5,脫靶計為0環。若以靶心為坐標原點,那么根據中靶點M (x, y) 的坐標,就可以計算出每次擊發的成績。試編程模擬這一計算過程。

分析:要計算M點對應的環數,就要先計算M到靶心的距離r=x2+y2。若r≤1則為10環;若1<r≤2,則為9環;……;以此類推。若r>5,則為0環。

算法N-S圖如圖4.11所示。

圖4.10 例4.12的示意圖

圖4.11 例4.12的算法

程序如下:

            1   #include<stdio.h>
            2   #include<math.h>            /* 用到了數學庫函數sqrt */
            3   void main()
            4   {
            5       float x,y,r;
            6       int score;
            7       printf("input x,y:");
            8       scanf("%f,%f",&x,&y);
            9       r=sqrt(x*x+y*y);
            10      if(r<=1)score=10;
            11      else if(r<=2)score=9;
            12      else if(r<=3)score=8;
            13      else if(r<=4)score=7;
            14      else if(r<=5)score=6;
            15      else score=0;
            16      printf("score:%d\n",score);
            17  }

【例4.13】 求一元二次方程ax2+bx+c=0的實根。如果沒有實根,則輸出提示信息。

分析:根據數學知識,對于一元二次方程,求解的關鍵是判斷disc=b 2-4 ac的值。disc>0時,方程有兩個不相等的實根;disc=0時,方程有兩個相等的實根;disc<0時,方程沒有實根。由此不難畫出算法的N-S圖,如圖4.12所示。

圖4.12 一元二次方程的求根算法

程序如下:

            1   #include "stdio.h"
            2   #include "math.h"
            3   void main()
            4   {
            5       float a,b,c,disc,x1,x2;
            6       printf("Please input a、b、c:");
            7       scanf("%f%f%f",&a,&b,&c);   /* 輸入數據用空白分開 */
            8       if(a==0)
            9           printf("The equation is not a quadratic.\n");
            10      else
            11      {
            12          disc=b*b-4*a*c;
            13          if(disc<0)
            14              printf("The equation has not real roots.\n");
            15          else if(disc>0)
            16          {
            17              x1=(-b+sqrt(disc))/(2*a);
            18              x2=(-b-sqrt(disc))/(2*a);
            19              printf("The equation has distinct real roots:%7.3f and
                          %7.3f\n",x1,x2);
            20          }
            21          else
            22          {
            23              x1=-b/2/a;
            24              printf("The equation has two equal real roots:%7.3f\n",x1);
            25          }
            26      }
            27  }

以下是分別輸入不同參數運行了4次的結果:

      ①  Please input a、b、c:1  5  4 ↙
            The equation has distinct real roots: -1.000 and  -4.000
      ②  Please input a、b、c:1  2  1 ↙
            The equation has two equal real roots: -1.000
      ③  Please input a、b、c:2  3  5 ↙
            The equation has not real roots.
      ④  Please input a、b、c:0  2  5 ↙
            The equation is not a quadratic.

通過以上例子,可以看到選擇程序設計的特點:從整體上看,程序的執行流程還是自頂向下的;從程序的內部具體來看,程序的執行流程是可以根據所給定的條件是否成立來決定的。

對于選擇程序,程序的一次運行只能執行選擇結構的某個分支,其他分支則不被執行。因此,在調試程序的時候,應該選擇不同的輸入數據多次試運行程序,確保每個分支都被調試過,以免遺漏錯誤。以例4.13為例,程序有4個分支,因此至少選擇4組不同類型的數據進行測試,程序最少也要試運行4次。

主站蜘蛛池模板: 本溪市| 忻城县| 高陵县| 东光县| 四会市| 武夷山市| 廊坊市| 盐边县| 望奎县| 岳池县| 蓬溪县| 泰安市| 礼泉县| 德清县| 理塘县| 清徐县| 涿鹿县| 安图县| 遂宁市| 镇宁| 临桂县| 利川市| 富川| 正安县| 台南市| 金华市| 岑巩县| 汶上县| 乌兰察布市| 扶绥县| 台东市| 呈贡县| 太湖县| 沁源县| 清原| 郴州市| 柳林县| 鲜城| 神农架林区| 泉州市| 昂仁县|