在程序的三種基本結構中,第二種即為選擇結構,其基本特點是:程序的流程由多路分支組成,在程序的一次執行過程中,根據不同的情況,只有一條支路被選中執行,而其他分支上的語句被直接跳過。
C語言中,提供if語句和switch語句選擇結構,if語句用於兩者選一的情況,而switch用於多分支選一的情形。
3.3.1 if語句
1.if語句的兩種基本形式首先,我們看一個例子,由此了解選擇結構的意義及設計方法。
[例3-5]輸入三個數,找出並打印其最小數。
分析:設三個數為A、B、C,由鍵盤讀入,我們用一個變量MIN來標識最小數,A、B、C與MIN皆定義為int型變量。
每次比較兩個數,首先比較A和B,將小的一個賦給MIN,再把第三個數C與MIN比較,再將小的一個賦給MIN,則最後MIN即為A、B、C中最小數。
算法如下:
1)輸入A、B、C。
2)將A與B中小的一個賦給MIN。
3)將MIN與C中小的一個賦給MIN。
4)輸出MIN。
將第2)步細化為:若A<B,則MIN<==A,否則:MIN<==B;其流程圖見圖3-1。
第3)步細化為:若C<MIN,則MIN<==C;其流程圖見圖3-2。
對應圖3-1和圖3-2,正是if語句的兩種基本形式,與圖3-2對應的if語句的格式為:
if <表達式> 語句
當表達式為真時,執行語句,表達式為假時跳過語句。
與圖3-1對應的if語句的格式為:
if〈表達式〉
語句1
else
語句2
當表達式為真時,執行語句1,表達式為假時執行語句2。無論如何,語句1與語句2每次只能有一個被執行。
要注意的是:if或if...else,包括後面要講到的嵌套if,即if...elseif...被看成是一條語句,即使其中的語句是包含多條語句的復合語句,仍然如此。
下面是例3-5的源程序:
main()
{
int a,b,c,min;
printf("input a,b,c:");
scanf("%d%d%d",&a,&b,&c);
if(a<b)
min=a;
else
min=b;
if(c<min)
min=c;
printf("There sult is%d\n",min);
}
執行情況如下:
RUN
inputa,b,c:3 5 2
Theresultis:2
這裡順便提一下程序書寫的縮排問題,所謂縮排,就是下一行與上一行相比,行首向右縮進若字符,如上例的min=a、min=b等。適當的縮排能使程序的結構、層次清晰、一目了然,增加程序的易讀性。應該從一開始就養成一個比較好的書寫習慣,包括必要的注釋、適當的空行以及縮排。
2.復合語句
if語句中,有時需要執行的語句不止一條,這就要用到復合語句。復合語句,就是用一對花括號括起來的一條或多條語句,形式如下:
{
語句1;
語句2;
.......
語句n;
}
無論包括多少條語句,復合語句從邏輯上講,被看成是一條語句。復合語句在分支結構、循環結構中,使用十分廣泛。
[例3-6]讀入兩個數x、y,將大數存入x,小數存入y。
分析:x、y從鍵盤讀入,若x>=y,只需順序打出,否則,應將x,y中的數進行交換,然後輸出。兩數交換必須使用一個中間變量t,定義三個浮點數x、y、t。
算法:
1)讀入x、y;
2)大數存入x,小數存入y;
3)輸出x、y。
第2)步求精:
若x<y,則交換x與y;
再求精,x與y交換;
①t<==x
②x<==y
③y<==t
算法的流程圖見圖3-3,程序如下:
#include <stdio.h>
main()
{
float x,y,t;
printf("input x,y:");
scanf("%f%f",&x,&y);
if(x<y)
{
t=x;
x=y;
y=t;
}
printf("result:%7.3f\t%7.3f\n",x,y);
}
執行結果:
input x,y:43.256.7
result:56.70043.200