- C程序設計語言
- 魏東平 朱連章 于廣斌編著
- 810字
- 2018-12-29 14:37:51
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次。