C語言基礎知識(三)

第二部分:選擇結構
1、C語言程序有3種基本結構:順序結構、選擇結構和循環結構
1)順序結構:所謂順序結構,就是從上到下的所有語句都會依次執行
2)選擇結構:選擇結構中存在一條(或多條)分支語句,當滿足分支的條件時語句纔會執行,否則不會執行
3)循環結構:循環結構即是在某些條件的控制下重複執行一段代碼語句,當滿足循環條件時執行循環語句,否則不執行循環語句。
4)流程圖:開始/結束使用圓角矩形,一般語句使用矩形,選擇語句使用菱形,各形狀使用有向箭頭連接起來。
2、選擇結構if-else
if(表達式)-else是最常見的2分支判斷選擇結構,常見的if()-else有3種形式:
⒈if(表達式)
{
語句塊
……
}
⒉if(表達式)
{
語句塊1
……
}
else
{
語句塊2
……
}
⒊if(表達式1)
{
語句塊1
……
}
else if(表達式2)
{
語句塊2
……
}
....
else
{
語句塊n
}
……
1)if(表達式)
用法:
if(表達式)
{
語句塊;
……
}
說明:
當程序執行到if語句時,會判斷if()內表達式的真假,若爲真,則會執行語句塊,否則跳過語句塊
示例:
int main()
{
int a = 5;
if(a>0)
{
printf("a大於0\n");//滿足if條件,這條語句會執行
}
a = -5;
if(a>0)
{
printf("a大於0\n");//不滿足if條件,這條語句不會執行
}
return 0;
}
執行結果:輸出一條"a大於0"
2)if(表達式)-else
用法:
if(表達式)
{
語句塊1;
……
}
else
{
語句塊2;
……
}
說明:
當程序執行到if語句時,會判斷if()內表達式的真假,若爲真,則會執行if下語句塊1;若爲假,則會執行else下語句塊2
示例:
int main()
{
int a = 5;
if(a>0)
{
printf("a大於0\n");
}
else
{
printf("a小於0\n");
}
a = -5;
if(a>0)
{
printf("a大於0\n");
}
else
{
printf("a小於0\n");
}
return 0;
}
3)多個if(表達式)-else
用法:
if(表達式1)
{
語句塊1
……
}
else if(表達式2)
{
語句塊2
……
}
……//可使用多個
else//最後一個以else結尾
{
語句塊3
……
}
說明:當程序執行到if(表達式1)時,會判斷表達式1的真/假。當表達式1爲真時,執行語句塊1;
否則,執行if(表達式2),會判斷表達式2的真/假
依次進行每個if(表達式)的判斷
如果以上if(表達式)都爲假,則執行最後的else語句後的語句塊3
實際上多個if()-else表達式就是使用多個2分分支判斷實現了多重分支判斷
示例:
程序輸入成績,爲0~100之間的整數。之後輸出成績代表的分數段:
90~100爲優,80~89爲良,70~79爲中,60~69爲及格,0~59爲不及格,其他則輸出錯誤信息
#include<stdio.h>
#include<stdlib.h>
int main()
{
int score;
printf("請輸入學生成績:");
scanf("%d",&score);
if(score<=100 && score>=90)
{
printf("成績爲優\n");
}
else if(score<90 && score>=80)
{
printf("成績爲良\n");
}
else if(score<80 && score>=70)
{
printf("成績爲中\n");
}
else if(score<70 && score>=60)
{
printf("成績爲及格\n");
}
else if(score<60 && score>=0)
{
printf("成績爲不及格\n");
}
else
{
printf("輸入非法數據\n");
}
return 0;
}
4、如果if()或者else表達式下未使用{}限制,則只會執行if()或else下的第一條語句。
示例:
#include<stdio.h>
int main()
{
int a = 5;
if(a>0)
printf("a是正數\n");
else
a = -3;
printf("a不是正數\n");
printf("a is %d\n",a);
return 0;
}
程序輸出結果:
a是正數
a不是正數
a is 5
儘管在本例中,else下的兩句表達式縮進相同(以代表兩句都隸屬於else語句塊)但是由於else後沒有{},因此實際上隸屬於else的語句只有第一句(即a=-3,如果能執行的話),而printf()語句則會照常執行。因此我們建議使用{}將if()和else後的語句都括起來,以免出現邏輯錯誤
上面輸入成績輸出分數段的示例等價於:
#include<stdio.h>
int main()
{
int score;
printf("請輸入學生成績:");
scanf("%d",&score);
if(score<=100 && score>=90)
printf("成績爲優\n");
else if(score<90 && score>=80)
printf("成績爲良\n");
else if(score<80 && score>=70)
printf("成績爲中\n");
else if(score<70 && score>=60)
printf("成績爲及格\n");
else if(score<60 && score>=0)
printf("成績爲不及格\n");
else
printf("輸入非法數據\n");
return 0;
}

5、if()的嵌套使用
在if()-else語句中又包含一個或多個if()-else語句稱爲if()的嵌套使用。一般形式如下:
if(表達式1)
{
if(表達式2)
{
語句塊1
……
}
else
{
語句塊2
……
}
}
else
{
if(表達式3)
{
語句塊3
……
}
else
{
語句塊4
……
}
}
程序的執行邏輯:
表達式1爲真:
表達式2爲真:
執行語句塊1
否則:
執行語句塊2
否則:
表達式3爲真:
執行語句塊3
否則
執行語句塊4
示例:輸入一個整數,判斷這個整數是正整數、0還是負整數
1)使用多個if()-else
int main()
{
int input;
scanf("%d",&input);
if(input>0)
printf("輸入的是正整數\n");
else if(input==0)
printf("輸入的是0\n");
else
printf("輸入的是負整數\n");
return 0;
}
2)使用if()嵌套
int main()
{
int input;
scanf("%d",input);
if(input>0)
printf("輸入的是正整數\n");
else
{
if(input==0)
printf("輸入的是0\n");
else
printf("輸入的是負整數\n");
}
return 0;
}

6、if()和else的配對
(當沒有{}限定的時候)當else與if配對的時候,else總是與它上面最近的未配對的if()結合
if()
if()語句1
else 語句2
if()語句3
else 語句4
在這段程序中,雖然編程人員將else 語句2放在與第一個if()同一縮進上以表示該else與首個if()結合,但實際上這個else是與它的上一個if(即if()語句1)結合。因此在使用if()-else語句(尤其在嵌套使用時)一定要使用{}來限定

7、switch()語句
if()-else語句只能判斷2個分支,若要判斷多個分支則需要if()-else的多次使用或嵌套使用,十分不便
switch()語句是多分支選擇語句。通過switch()的多分支判斷可以簡便地實現多分支選擇結構
switch()語句的一般形式如下:
switch(表達式)
{
case 常量1:
語句1;
break;
case 常量2:
語句2;
break;
……//多個case結構
case 常量n:
語句n;
break;
default:
語句n+1;
}
說明:
1)switch(表達式)表達式的值應是一個整數(包括字符數據)
2)switch()下的{}是一段語句塊,這段語句包含若干個以case開頭的語句塊和至多一個以default開頭的語句塊
3)case後需要一個常量(或常量表達式),case和default都是標號作用。首先判斷switch(表達式)的表達式的值,之後與各個case之後的值進行比對,如果某個case後的值與表達式的值相同,則跳轉到此case語句;如果所有的case都不匹配,則跳轉到default後的語句
4)可以沒有default語句。若沒有default語句,則如果沒有匹配的case,則程序不執行任何語句
5)各個case之間的先後順序以及default的位置不影響程序執行結果,不過我們強烈推薦按一定順序排列case語句,default語句放在最後
6)每個case語句後的常量值必須各不相同,否則會發生互相矛盾現象
7)break語句用來終止switch()語句。如果case語句後沒有break語句,則當匹配到合適的case後,程序會一直執行接下來的語句直至遇到break或switch()結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章