順序結構的程序雖然能解決計算、輸出等問題,但不能做判斷再選擇。對於要先做判斷再選擇的問題就要使用分支結構。
分支結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。分支結構的程序設計方法的關鍵在於構造合適的分支條件和分析程序流程,根據不同的程序流程選擇適當的分支語句。
分支結構適合於帶有邏輯或關系比較等條件判斷的計算,設計這類程序時往往都要先繪制其程序流程圖,然后根據程序流程寫出源程序,這樣做把程序設計分析與語言分開,使得問題簡單化,易於理解。程序流程圖是根據解題分析所繪制的程序執行流程圖。
學習分支結構不要被分支嵌套所迷惑,只要正確繪制出流程圖,弄清各分支所要執行的功能,嵌套結構也就不難了。嵌套只不過是分支中又包括分支語句而已,不是新知識,只要對雙分支的理解清楚,分支嵌套是不難的。下面我介紹幾種基本的分支結構。

1、if條件語句
①if(條件){分支體}
如果判斷條件成立就執行分支體,否則直接跳過。其執行過程可表示為下圖:

這種分支結構中的分支體可以是一條語句,此時“{}”可以省略,也可以是多條語句即復合語句。它有兩條分支路徑可選,一是當條件為真,執行分支體,否則跳過分支體,這時分支體就不會執行。
如:要計算x的絕對值,根據絕對值定義,我們知道,當x>=0時,其絕對值不變,而x<0時其絕對值是為x的反號,因此程序段為:if(x<0)x=-x;
②if(條件){分支1} else {分支2}
這是典型的分支結構,如果條件成立,執行分支1,否則執行分支2,分支1和分支2都可以是1條或若干條語句構成。
其執行過程可表示為下圖:

如:求ax^2+bx+c=0的根
分析:因為當b^2-4ac>=0時,方程有兩個實根,否則(b^2-4ac<0)有兩個共軛復根。其程序段如下:
d=b*b-4*a*c;
if(d>=0)
{x1=(-b+sqrt(d))/2a;
x1=(-b-sqrt(d))/2a;
printf("x1=%8.4f,x2=%8.4f\n",x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf("x1=%8.4f+%8.4fi\n"r, i);
printf("x2=%8.4f-%8.4fi\n"r,i);
}
③ if...else if語句
其語句格式為:
if(條件1) {分支1};
else if(條件2) {分支2}
else if(條件3) {分支3}
……
else if(條件n) {分支n}
else {分支n+1}
意思是,從上到下依次檢測判斷條件,當某個判斷條件成立時,則執行其對應的分支,然后跳到整個 if else 語句之外繼續執行其他代碼。如果所有判斷條件都不成立,則執行語句塊n,然后繼續執行后續代碼。
也就是說,一旦遇到能夠成立的判斷條件,則不再執行其他的分支,所以最終只能有一個分支被執行。
嵌套分支語句雖可解決多個入口和出口的問題,但超過3重嵌套后,語句結構變得非常復雜,對於程序的閱讀和理解都極為不便,建議嵌套在3重以內,超過3重可以用下面的語句。
例如,使用多個 if else 語句判斷輸入的字符的類別:
#include <stdio.h>
int main(){
char c;
printf("Input a character:");
c=getchar();
if(c<32)
printf("This is a control character\n");
else if(c>='0'&&c<='9')
printf("This is a digit\n");
else if(c>='A'&&c<='Z')
printf("This is a capital letter\n");
else if(c>='a'&&c<='z')
printf("This is a small letter\n");
else
printf("This is an other character\n");
return 0;
}
運行結果:
Input a character:e↙
This is a small letter
在使用 if 語句時還應注意以下兩點:
在 if 語句中,判斷條件必須用括號括起來。
語句塊由{ }包圍,但要注意的是在}之后不需要再加分號;(當然加上也沒錯)。
④if嵌套分支語句
當if語句中的執行語句又是if語句時,則形成了if語句嵌套。
if(條件表達式)
if語句;
或者
if(條件表達式)
if語句;
else
if語句;
demo:修改下面的程序使程序:輸入a和b的值,判斷最大值是否大於100,是則輸出最大值。
int main(void)
{
int a = 0;
int b = 0;
printf("請依次輸入a和b的值:");
scanf("%d%d",&a,&b);
if(a < b)
if(b > 100)
printf("max:%d\n",b);
else
if(a > 100)
printf("max:%d\n",a);
return 0;
}
注意:C語言規定,else總是與它前面最近的為配對的if配對。
所以修改后應為:
int main(void)
{
int a = 0;
int b = 0;
printf("請依次輸入a和b的值:");
scanf("%d%d",&a,&b);
if(a < b)
{
if(b > 100)
printf("max:%d\n",b);
}
else
{
if(a > 100)
printf("max:%d\n",a);
}
return 0;
}
demo:輸入a、b、c的值,判斷並輸出最大值
int main(void)
{
int a = 0;
int b = 0;
int c = 0;
int max = 0;
printf("請依次輸入a、b、c的值:");
scanf("%d%d%d", &a, &b,&c);//
if (a > b)
{
if (a > c)
max = a;
else
max = c;
}
else//b > a
{
if (b > c)
max = b;
else
max = c;
}
printf("max:%d\n", max);
return 0;
}
2、switch開關語句
C語言雖然沒有限制 if else 能夠處理的分支數量,但當分支過多時,用 if else 處理會不太方便,而且容易出現 if else 配對出錯的情況。對於這種情況,實際開發中一般使用 switch 語句代替。
該語句也是多分支選擇語句,到底執行哪一塊,取決於開關設置,也就是表達式的值與常量表達式相匹配的那一路。
switch 是另外一種選擇結構的語句,用來代替簡單的、擁有多個分枝的 if else 語句,基本格式如下:
switch(表達式){
case 整型數值1: 語句 1;
case 整型數值2: 語句 2;
......
case 整型數值n: 語句 n;
default: 語句 n+1;
}
它的執行過程是:
1) 首先計算“表達式”的值,假設為 m。
2) 從第一個 case 開始,比較“整型數值1”和 m,如果它們相等,就執行冒號后面的所有語句,也就是從“語句1”一直執行到“語句n+1”,而不管后面的 case 是否匹配成功。
3) 如果“整型數值1”和 m 不相等,就跳過冒號后面的“語句1”,繼續比較第二個 case、第三個 case……一旦發現和某個整型數值相等了,就會執行后面所有的語句。假設 m 和“整型數值5”相等,那么就會從“語句5”一直執行到“語句n+1”。
4) 如果直到最后一個“整型數值n”都沒有找到相等的值,那么就執行 default 后的“語句 n+1”。
需要重點強調的是,當和某個整型數值匹配成功后,會執行該分支以及后面所有分支的語句。例如:
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\n");
case 2: printf("Tuesday\n");
case 3: printf("Wednesday\n");
case 4: printf("Thursday\n");
case 5: printf("Friday\n");
case 6: printf("Saturday\n");
case 7: printf("Sunday\n");
default:printf("error\n");
}
return 0;
}
運行結果:
Input integer number:4↙
Thursday
Friday
Saturday
Sunday
error
輸入4,發現和第四個分支匹配成功,於是就執行第四個分支以及后面的所有分支。這顯然不是我們想要的結果,我們希望只執行第四個分支,而跳過后面的其他分支。為了達到這個目標,必須要在每個分支最后添加break;語句。
break 是C語言中的一個關鍵字,專門用於跳出 switch 語句。所謂“跳出”,是指一旦遇到 break,就不再執行 switch 中的任何語句,包括當前分支中的語句和其他分支中的語句;也就是說,整個 switch 執行結束了,接着會執行整個 switch 后面的代碼。
使用 break 修改上面的代碼:
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
case 4: printf("Thursday\n"); break;
case 5: printf("Friday\n"); break;
case 6: printf("Saturday\n"); break;
case 7: printf("Sunday\n"); break;
default:printf("error\n"); break;
}
return 0;
}
運行結果:
Input integer number:4↙
Thursday
由於 default 是最后一個分支,匹配后不會再執行其他分支,所以也可以不添加break;語句。
最后需要說明的兩點是:
1) case 后面必須是一個整數,或者是結果為整數的表達式,但不能包含任何變量。請看下面的例子:
case 10: printf("..."); break; //正確
case 8+9: printf("..."); break; //正確
case 'A': printf("..."); break; //正確,字符和整數可以相互轉換
case 'A'+19: printf("..."); break; //正確,字符和整數可以相互轉換
case 9.5: printf("..."); break; //錯誤,不能為小數
case a: printf("..."); break; //錯誤,不能包含變量
case a+10: printf("..."); break; //錯誤,不能包含變量
2) default 不是必須的。當沒有 default 時,如果所有 case 都匹配失敗,那么就什么都不執行。
今天就分享到這里啦,希望對大家學習有所幫助!
最后
特別推薦一個分享C/C++和算法的優質內容,學習交流,技術探討,面試指導,簡歷修改...還有超多源碼素材等學習資料,零基礎的視頻等着你!
還沒關注的小伙伴,可以長按關注一下:
