順序結構的程序雖然能解決計算、輸出等問題,但不能作判斷再選擇。對於要先作判斷再選擇的問題就要使用分支結構。git
分支結構的執行是依據必定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。分支結構的程序設計方法的關鍵在於構造合適的分支條件和分析程序流程,根據不一樣的程序流程選擇適當的分支語句。面試
分支結構適合於帶有邏輯或關係比較等條件判斷的計算,設計這類程序時每每都要先繪製其程序流程圖,而後根據程序流程寫出源程序,這樣作把程序設計分析與語言分開,使得問題簡單化,易於理解。程序流程圖是根據解題分析所繪製的程序執行流程圖。算法
學習分支結構不要被分支嵌套所迷惑,只要正確繪製出流程圖,弄清各分支所要執行的功能,嵌套結構也就不難了。嵌套只不過是分支中又包括分支語句而已,不是新知識,只要對雙分支的理解清楚,分支嵌套是不難的。下面我介紹幾種基本的分支結構。api
若是判斷條件成立就執行分支體,不然直接跳過。其執行過程可表示爲下圖:學習
這種分支結構中的分支體能夠是一條語句,此時「{}」能夠省略,也能夠是多條語句即複合語句。它有兩條分支路徑可選,一是當條件爲真,執行分支體,不然跳過度支體,這時分支體就不會執行。設計
如:要計算x的絕對值,根據絕對值定義,咱們知道,當x>=0時,其絕對值不變,而x<0時其絕對值是爲x的反號,所以程序段爲:if(x<0)x=-x;視頻
這是典型的分支結構,若是條件成立,執行分支1,不然執行分支2,分支1和分支2均可以是1條或若干條語句構成。blog
其執行過程可表示爲下圖:開發
如:求ax^2+bx+c=0的根get
分析:由於當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(條件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語句;
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;
}
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++和算法的優質內容,學習交流,技術探討,面試指導,簡歷修改...還有超多源碼素材等學習資料,零基礎的視頻等着你!
還沒關注的小夥伴,能夠長按關注一下: