您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!
該章內(nèi)容:本章我們學習三大結(jié)構(gòu)之一:選擇結(jié)構(gòu),采用選擇結(jié)構(gòu)來解決問題稱為判斷問題,它的求解規(guī)則是在不同的條件下進行不同的操作。選擇結(jié)構(gòu)比順序結(jié)構(gòu)要復雜一些。本章是考試的重點章節(jié)。
學習方法:先了解選擇結(jié)構(gòu)相關(guān)的基礎(chǔ)知識,然后做選擇結(jié)構(gòu)簡單的習題,逐步加入復雜的語句。最終一定要學會如何寫簡單的選擇結(jié)構(gòu)的程序。
知識點:語句和表達式之間的聯(lián)系;分號的使用;復合語句
重要程度:★★★★
1、C語言中的邏輯值
C語言中的邏輯值只有兩個:“真”和“假”。用非零來代表“真”,用零來代表“假”。
C語言中只有一個數(shù)值表示假,就是0。其它的數(shù)據(jù)都是表示真,如:1.1,2.9,-2等等。
1、關(guān)系運算符和關(guān)系表達式
所謂的關(guān)系運算就是比較運算,將兩個數(shù)進行比較,判斷比較的結(jié)果是否符合條件。
1.1 C語言中的關(guān)系運算符
C語言提供了6種關(guān)系運算符,如表1所示。
表1 C語言中的6種關(guān)系運算符及其優(yōu)先級
優(yōu)先級 |
優(yōu)先級相同(高) |
優(yōu)先級相同(低) |
||||
關(guān)系運算符 |
> (大于) |
>= (大于等于) |
< (小于) |
<= (小于等于) |
== (等于) |
!= (不等于) |
注意:
1)由兩個字符組成的運算符之間不可以加空格,如<=就不能寫成:< =。
2)前四種關(guān)系運算符(>、>=、<、<=)的優(yōu)先級相同,后兩種關(guān)系運算符(==、!=)的優(yōu)先級相同,前四種關(guān)系運算符的優(yōu)先級高于后兩種關(guān)系運算符。
3)關(guān)系運算符的優(yōu)先級低于算術(shù)運算符。如“+”的優(yōu)先級高于“<”。
4)關(guān)系運算符的優(yōu)先級高于賦值運算符。如“=”的優(yōu)先級低于“==”。(注意“=” “==”的區(qū)別)。(考試的重點)
5)關(guān)系運算符都是雙目運算符,自左至右的結(jié)合性。如4<5<2則等價于(4<5)<2(考試重點)。
1.2 關(guān)系表達式
關(guān)系表達式:用關(guān)系運算符將表達式連接起來的式子稱為關(guān)系表達式。
關(guān)系表達式的值:關(guān)系表達式的值若為真,則結(jié)果為1;若為假,則結(jié)果為0。(只有0和1兩種。。
如,3>2>1的值為1;若變量a中的值為10,變量b中的值為6,則關(guān)系表達式a>b的值為“真”,即為1。而關(guān)系表達式(a>5)<(b>10)的值為“假”,即為0。
1.1 C語言中的邏輯運算符
C語言提供了3種邏輯運算符,如表2所示。
表2 C語言中的3種邏輯運算符及其優(yōu)先級
優(yōu)先級 |
優(yōu)先級低 優(yōu)先級高 |
||
邏輯運算符 |
|| (邏輯“或”) |
&&(邏輯“與”) |
! (邏輯“非”) |
注意:
(1)&&和||運算符是雙目運算符,如(a>b)&&(x<y)。!運算符是單目運算符,應該出現(xiàn)在運算對象的左邊,如!(a<b)。邏輯運算符具有自左向右的結(jié)合性。
(2)在關(guān)系運算符、算術(shù)運算符、賦值運算符、邏輯運算符四者中,優(yōu)先級從高到低依次為:! (邏輯“非”)、算術(shù)運算符、關(guān)系運算符、&&(邏輯“與”)、||(邏輯“或”)、賦值運算符。
1.2 邏輯表達式和邏輯表達式的值
邏輯表達式:用邏輯運算符將表達式連接起來的式子稱為邏輯表達式。
邏輯運算的對象可以是C語言中任意合法的表達式。如,!(a<b),(a+b)&&(x=8),(a=b)||(c+2),'d'&&'c'等都是合法的表達式。
邏輯表達式的值:邏輯表達式的運算規(guī)則如表3所示。邏輯表達式的值若為真,則結(jié)果為1;若為假,則結(jié)果為0。(表達式的值也只有0和1兩種。。。
表3 邏輯運算的規(guī)則
A |
b |
!a |
!b |
a&&b |
a||b |
非0 非0 0 0 |
非0 0 非0 0 |
0 0 1 1 |
0 1 0 1 |
1 0 0 0 |
1 1 1 0 |
例1:設(shè)有定義:int a=5,b=6,c=7;則以下選項中值為0的表達式是
A)(!a==0)&& (a<b<c) B)(b<c)&&!c||1
C)a&&b D)(a+4)||( a+b)&&(c-a)
正確答案為A。
考試重點考察點:
1、在C語言中,由&&或||組成的邏輯表達式,在特定的情況下會產(chǎn)生“短路”的現(xiàn)象。在邏輯表達式的求解中,并不是所有的運算對象都被執(zhí)行,只是在必須執(zhí)行下一個邏輯運算符才能求出表達式的解時,才執(zhí)行該邏輯運算符。(若“&&”的左邊的運算對象的值為0,則不再對右邊的運算對象進行運算,直接得出整個表達式的值為0;若“||”的左邊的運算對象為1,則不再對右邊的運算對象進行運算,直接得出整個表達式的值為1。)
(1)若執(zhí)行下列語句
a=0;b=1;
c=a++&&(b=6);
各變量的值為:a為1,b為1,c為0,由于(b=6)沒被執(zhí)行到,故b的值不變。
(2)執(zhí)行語句
a=1;b=1;c=0;
d=--a||b--||(c=b+3);
后,結(jié)果:a為0,b為0,c為0,d為1,表達式中的(c=b+3)沒有被執(zhí)行到,c值不變。
2、用C語言正確表示數(shù)學意義上的a<b<c,
正確的表示方法是 a<b&&b<c。因為a<b<c在C語言執(zhí)行中,假定a=8,b=7,c=6,在數(shù)學中,a<b<c是不成立的。但是在C語言中,8<7<6會首先首先執(zhí)行8<7得到0,再接著算0<6,這樣就成合法了。所以一定注意C語言考試中這個a<b<c樣子的是考試陷阱。
知識點:if語句的三種形式使用;if和else的搭配;嵌套的if語句的使用
重要程度:★★★★
1、if語句的三種形式
1.1 if語句
if只管后面一個分號;要管多個用大括號把多個語句括起來。
程序1:
if(a<b)
{t=a; a=b; b=t;}
--------------------------
程序2:
if(a<b)
t=a; a=b; b=t;
程序1、2注意兩者的區(qū)別 。!
圖1 if語句的流程圖
1.2 if-else語句
它的一般格式如下:
if(表達式)
語句1;
else
語句2;
例如:對兩數(shù)大小的比較,輸出大數(shù)。用if-else語句實現(xiàn):
if(x>y)
printf(“%d”,x);
else
printf(“%d”,y);
圖2 if-else語句的流程圖
例1:若有以下程序
main( )
{
int a=5,b=4,c=6,t=0;
if(a<b) {t=a;a=b;b=t;}
if(a<c) t=a;a=c;c=t;
printf("%d %d %d\n",a,b,c);
}
執(zhí)行后輸出結(jié)果是
答案:645
分析:程序的第一行在定義a、b、c、t四個變量時初始化了值。接下來,第一個if語句的表達式為:a<b,a變量里存放的是整數(shù)5,b變量里存放的是整數(shù)4,可以判斷該表達式為“假”,那么程序應該跳過if的子句。子句是一條復合語句則{t=a;a=b;b=t;}被跳過。第二個if語句的表達式為:a<c,因為變量a的值為5,變量c的值為6,因此該表達式的值為“真”,執(zhí)行該if的語句“t=a;”,t的值被賦為5。該if語句執(zhí)行完成后,還有兩個其它的語句“a=c;c=t;”執(zhí)行后這兩條語句后,a的值被賦為6,c的值被賦為5。因此,最后輸出a、b、c變量的值應該分別為6、4、5。若將if(a<b) {t=a;a=b;b=t;}改為if(a<b) t=a;a=b;b=t;,請讀者自行分析結(jié)果。
1.3 if-else-if 語句結(jié)構(gòu)
它的一般格式如下:(只有一個語句被執(zhí)行)
if(表達式1)
語句1;
else if(表達式2)
語句2 ;
else if(表達式3)
語句3 ;
……
else
語句n ;
圖2 if-else-if 語句的流程圖
例2:有如下程序
main( )
{ float x=2.0,y;
if(x<0.0) y=0.0;
else if(x<10.0) y=1.0/x;
else y=1.0;
printf("%f\n",y);
}
該程序的輸出結(jié)果是(。
A) 0.000000 B) 0.250000 C) 0.500000 D) 1.000000
分析:首先x的初值為2.0。判斷x<0.0,其為假,則跳過語句“y=0.0;”,接著又判斷x<10.0,其為真,則執(zhí)行“y=1.0/x;”,然后將其輸出。因此答案選C。
注意:
(1)if后面圓括號中的表達式,可以是任意合法的C語言表達式,可以是任意類型的數(shù)據(jù)。
(2)if子句和else子句中如果只有一條語句,則該語句后的分號不能省。
2、if語句的嵌套(概念考得多)
if語句的嵌套:在if語句中又包含一個或多個if語句稱為if語句的嵌套。一般形式如下:
if(表達式1)
if(表達式2) 語句1;
else 語句2;
else
if(表達式3) 語句3;
else 語句4;
其執(zhí)行過程:若表達式1為“真”,則執(zhí)行其嵌套的if-else語句,否則,執(zhí)行else后的內(nèi)嵌if-else語句。其中if-else語句在語法上是一條語句。
特別注意:C語言的語法規(guī)定:else子句總是與前面最近的不帶else的if相結(jié)合,與書寫格式無關(guān)。
|
知識點:條件運算符號的使用(唯一的三目);條件表達式的運算;
重要程度:★★★★(口訣是“真前假后”)
1、條件運算符
條件運算符由兩個運算符組成:?:。條件運算符要求有三個運算對象,稱三目運算符,它是C語言中唯一的一個三目運算符。
2、條件表達式(“真前假后”口訣)
表達式1 ? 表達式2:表達式3
其執(zhí)行過程:先求解表達式1,若為非0(真)則求解表達式2,并將表達式2的值作為整個表達式的值。若表達式1的值為0(假),則求解表達式3,表達式3的值就是整個表達式的值。
例1:以下程序的輸出結(jié)果是(。。
main()
{
int a=5,b=4,c=6,d;
printf("%d\n",d=a>b?(a>c?a:c):(b));
}
A) 5 B)
4 C) 6 D)
不確定
分析:這是一個條件表達式的嵌套,先判斷a>b為“真”,則需要求解表達式a>c?a:c的值。因此又對a>c進行判斷,其為“假”,那么c就是整個表達式的值。答案選C。
3、條件運算符的優(yōu)先級
條件運算符優(yōu)先于賦值運算,但低于邏輯運算,關(guān)系運算符和算術(shù)運算符。條件運算符的結(jié)合方向為“自右向左”。如有以下表達式:
a>b?a:c>d?c:d 等價于 a>b?a:(c>d?c:d)
如果a=1,b=2,c=3,d=4,則表達式的值等于4。
知識點:switch語句的執(zhí)行方式;switch語句和 break的搭配;
重要程度:★★★★
1、switch語句
switch語句的一般形式如下:
switch(表達式)
{ case 常量表達式1:語句1;
case 常量表達式2:語句2;
……
case 常量表達式n:語句n;
default: 語句塊n+1;
}
其中語句1,語句2等等,可以是一條語句,也可以是若干語句。也可以是嵌套的switch語句。
注意:
(1)switch后圓括號中的表達式的值必須是實型或字符型,不能為實型。
(2)case后面是常量表達式,但常量表達式中不能有變量。
(3)default可以出現(xiàn)在語句體中的任何位置,但最多只能有一個。它通常出現(xiàn)在語句體的最后。
2、switch語句的執(zhí)行過程
首先求解switch后圓括號中表達式的值,然后匹配case標號,有匹配成功則執(zhí)行后面語句,只需要匹配一次成功,后面就不用再匹配了。(通過三個例子掌握switch的使用!)
例1:按照學生的考試成績,打印出相應的等級。90分以上的輸出“A”等級,80分以上的輸出“B”等級,依此類推,60分以下輸出“E”等級。程序如下:
main( )
{ int score;
scanf("%d",& score); /* score中存放學生的成績 */
printf("score=%d: ",score);
switch(score/10)
{ case 10:printf("A\n");
case 9:printf("A\n");
case 8:printf("B\n");
case 7:printf("C\n");
case 6:printf("D\n");
default:printf("E\n");
}
}
輸入99分,可以知道case 9 是匹配成功的,所以就不用再匹配,直接執(zhí)行后面的case剩下的語句。直到遇到break結(jié)束。
現(xiàn)將上面程序修改如下:
main( )
{ int score;
scanf("%d",&score);
printf("score=%d: ",score);
switch(score/10)
{ case 10:printf("A\n");break;
case 9:printf("A\n"); break;
case 8:printf("B\n"); break;
case 7:printf("C\n"); break;
case 6:printf("D\n"); break;
default:printf("E\n"); break;
}
}
此時score變量取值為75時,輸出結(jié)果為:score=75:C
現(xiàn)將上面程序修改如下:
main( )
{ int score;
scanf("%d",&score);
printf("score=%d: ",score);
switch(score/10)
{ case 10:printf("A\n");
case 9:printf("A\n");
case 8:printf("B\n");
case 7:printf("C\n"); break;
case 6:printf("D\n");
default:printf("E\n"); break;
}
}
此時score變量取值為95時,輸出結(jié)果為:score=75:ABC.
考試核心:
1、 switch的概念題目非常重要,switch后圓括號中、case后的表達式的要求牢記。
2、 switch語句有break和沒有break之間的區(qū)別,注意,只要匹配成功一次,后面不需要繼續(xù)的匹配了,直接執(zhí)行匹配的語句直到遇到break語句。
3、 switch嵌套switch的題目是考試的重點,請多次練習。
(1)以下程序運行后的輸出結(jié)果是:2,1
main()
{
int x=1,y=0,a=0,b=0;
switch(x)
{
case 1: switch(y)
{case 0: a++; break;
case 1: b++; break;
}
case 2: a++;b++;break;
}
printf(”%d %d\n”,a,b);
}
(2)
有以下程序,程序運行后的輸出結(jié)果是——A
A、1 B、2 C、3 D、4
main()
{
int a=15,b=21,m=0;
switch(a%3)
{
case 0: m++;break;
case 1: m++;
switch(b%2)
{default: m++;
case 0: m++; break;
}
}
printf(”%d\n”, m);
}
知識點:goto是關(guān)鍵字;goto語句的含義;
重要程度:★
1、goto語句
goto語句的作用是,無條件的把程序的執(zhí)行轉(zhuǎn)向語句標號所在的位置。濫用goto語句將使程序的流程毫無規(guī)律,可讀性差,對于初學者來說應盡量不用。(記住這句話就可以了!)
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08