- C程序設(shè)計(jì)語(yǔ)言
- 魏東平 朱連章 于廣斌編著
- 717字
- 2018-12-29 14:37:48
4.3.1 if語(yǔ)句的基本形式
1.簡(jiǎn)單if語(yǔ)句
簡(jiǎn)單if語(yǔ)句也叫條件執(zhí)行語(yǔ)句,一般格式為:
if(表達(dá)式)語(yǔ)句;
其中,“表達(dá)式”表示條件,一般為邏輯表達(dá)式,也可以是整型表達(dá)式或者字符型表達(dá)式等,只要其值為非0則表示“真”,為0表示“假”。“語(yǔ)句”部分可以是一條簡(jiǎn)單語(yǔ)句,也可以是一條復(fù)合語(yǔ)句。
例如:
① if(x>max)max=x; ② if(x<a && x>b) { x=(a+b)/2; y=a*x+b; }
簡(jiǎn)單if語(yǔ)句的執(zhí)行過程為:先計(jì)算條件“表達(dá)式”的值,若結(jié)果為“真”則執(zhí)行“語(yǔ)句”,然后執(zhí)行if語(yǔ)句后面的語(yǔ)句。如果結(jié)果為假,則不執(zhí)行“語(yǔ)句”,而直接執(zhí)行if語(yǔ)句之后的語(yǔ)句。圖4.1所示為其執(zhí)行過程的N-S圖。
【例4.1】 輸入任意三個(gè)整數(shù)num1、num2、num3,求三個(gè)數(shù)中的最大數(shù)。
分析:首先取一個(gè)數(shù)預(yù)置為max(最大數(shù)),然后再用max依次與其余的數(shù)逐個(gè)比較,如果發(fā)現(xiàn)有比max大的,就用它給max重新賦值,比較完所有的數(shù)后,max中的數(shù)就是最大數(shù)。
N-S圖如圖4.2所示。

圖4.1 簡(jiǎn)單if語(yǔ)句的執(zhí)行過程

圖4.2 求三個(gè)數(shù)中的最大數(shù)
程序如下:
1 #include<stdio.h> 2 void main() 3 { int a,b,c,max; 4 printf("Please input three numbers:"); 5 scanf("%d,%d,%d",&a,&b,&c); /* 輸入3個(gè)整數(shù),用逗號(hào)分隔 */ 6 max=a; /* 假設(shè)a最大 */ 7 if(b>max)max=b; /* 如果b較大則最大數(shù)為b */ 8 if(c>max)max=c; /* 如果c較大則最大數(shù)為c */ 9 printf("The three numbers are:%d,%d,%d\n",a,b,c); 10 printf("max=%d\n",max); 11 }
2.基本if-else語(yǔ)句
帶有else分支的if語(yǔ)句是if語(yǔ)句的基本形式,一般格式為:
if(表達(dá)式)語(yǔ)句1; else語(yǔ)句2;
其中,“語(yǔ)句1”、“語(yǔ)句2”都可以是一條簡(jiǎn)單語(yǔ)句或復(fù)合語(yǔ)句。一般稱“語(yǔ)句1”為then子句,稱“語(yǔ)句2”為else子句,把if-else語(yǔ)句理解為英語(yǔ)中的“if … then …, else …”結(jié)構(gòu)。
下面是if-else結(jié)構(gòu)的幾種書寫形式:
① if(x<0)y=-1;else y=1; ② if(sum==m) printf("right!\n"); else printf("error!\n"); ③ if(x>1 || x<-1)y=1; else y=sqrt(100-x*x);
if-else語(yǔ)句的執(zhí)行過程為:先計(jì)算條件“表達(dá)式”的值,如果結(jié)果為真則執(zhí)行“語(yǔ)句1”,否則執(zhí)行“語(yǔ)句2”,然后跳到整個(gè)if語(yǔ)句之外繼續(xù)執(zhí)行程序。圖4.3 所示為其執(zhí)行過程的N-S圖。
【例4.2】 鐵路部門規(guī)定,行李托運(yùn)時(shí)重量不超過50千克,按0.95元/千克計(jì)價(jià),超過50千克,超過部分按1.5元/千克計(jì)價(jià)。編程從鍵盤輸入行李重量,計(jì)算并輸出運(yùn)費(fèi)。
分析:設(shè)重量為w,運(yùn)費(fèi)為p,則p與w的關(guān)系為:

算法的N-S圖如圖4.4所示。

圖4.3 if-else語(yǔ)句的執(zhí)行過程

圖4.4 例4.2的算法N-S圖
程序如下:
1 #include<stdio.h> 2 void main() 3 { float w,p ; 4 printf("Please input weight:"); 5 scanf("%f",&w); 6 if(w<=50) 7 p=0.95*w; 8 else 9 p=0.95*50+(w-50)*1.5; 10 printf("price is%.2f\n",p); 11 }
【例4.3】 輸入任意一個(gè)正整數(shù)n,如果n是7的倍數(shù),則輸出該倍數(shù);反之,輸出n除以7的商和余數(shù)。例如,若n為17,則輸出商2和余數(shù)3。
分析:要判斷整數(shù)n是不是整數(shù)m的倍數(shù),可以計(jì)算n除以m的余數(shù)r,如果r為0,則n是m的倍數(shù),即n能夠被7整除。
算法的N-S圖如圖4.5所示。

圖4.5 例4.3的算法N-S圖
程序如下:
1 #include<stdio.h> 2 void main() 3 { int n,r,t; 4 printf("enter a number:"); 5 scanf("%d",&n); 6 if(n%7==0) 7 { t=n/7; 8 printf("quotient is%d\n",t); 9 } 10 else 11 { t=n/7; 12 r=n%7; 13 printf("quotient is%d,remainder is%d\n",t,r); 14 } 15 }
注意,程序中第6~14行構(gòu)成一個(gè)完整的if語(yǔ)句,該if語(yǔ)句的then子句和else子句都是復(fù)合語(yǔ)句。編程時(shí),如果錯(cuò)用復(fù)合語(yǔ)句的“{}”會(huì)導(dǎo)致程序出錯(cuò)。
3.多分支if-else if語(yǔ)句
基本if語(yǔ)句只有兩個(gè)分支。要表示多分支選擇,可以采用if-else if語(yǔ)句。多分支if語(yǔ)句的一般格式為:
if(表達(dá)式1) 語(yǔ)句1; else if(表達(dá)式2) 語(yǔ)句2; …… else if(表達(dá)式n) 語(yǔ)句n; else 語(yǔ)句n+1;
執(zhí)行過程為:先計(jì)算“表達(dá)式1”,如果為“真”,則執(zhí)行“語(yǔ)句1”,然后跳出if語(yǔ)句,轉(zhuǎn)到if語(yǔ)句后的語(yǔ)句(位于“語(yǔ)句n+1”之后)繼續(xù)執(zhí)行程序;若“表達(dá)式1”為“假”,則跳過“語(yǔ)句1”,計(jì)算“表達(dá)式2”;若“表達(dá)式2”為“真”,則執(zhí)行“語(yǔ)句2”,然后跳出if語(yǔ)句,否則再計(jì)算“表達(dá)式3”,……,以此類推。當(dāng)“表達(dá)式n”為“假”(意味著,所有表達(dá)式的值都為“假”)時(shí),執(zhí)行“語(yǔ)句n+1”。圖4.6所示為執(zhí)行過程的N-S圖。
【例4.4】 輸入一個(gè)年份,判斷它是否閏年。
分析:
① 閏年的條件是年份能被4整除,但不能被100整除;或者能被400整除。
② 如果X能被Y整除,則余數(shù)為0,即如果x%y的值等于0,則表示X能被Y整除。

圖4.6 多分支if-else if語(yǔ)句的執(zhí)行流程
③ 用標(biāo)識(shí)符leap表示是否閏年,leap為1表示是閏年,為0則表示非閏年。
判斷某一年份是否閏年的方法是:先輸入年份year;再根據(jù)①進(jìn)行判斷,如果是閏年則將leap置為1,否則將leap置為0;最后根據(jù)leap的值輸出判斷結(jié)果,如圖4.7所示。這種處理兩種狀態(tài)值的方法,對(duì)優(yōu)化算法和提高程序可讀性非常有效,請(qǐng)讀者仔細(xì)體會(huì),并注意在程序中使用。

圖4.7 判斷是否閏年
程序如下:
1 #include<stdio.h> 2 void main() 3 { 4 int year,leap; 5 printf("Please enter year:"); 6 scanf("%d",&year); 7 if(year%400==0)leap=1; 8 else if(year%4==0 && year%100 !=0)leap=1; 9 else leap=0; 10 if(leap)printf("%d is a leap year.\n",year); 11 else printf("%d is not a leap year.\n",year); 12 }
第7~9行是一個(gè)多分支if語(yǔ)句,有3個(gè)分支。第10~11行是if-else語(yǔ)句。在第10行中,條件表達(dá)式“l(fā)eap”是對(duì)“l(fā)eap!=0”的簡(jiǎn)化,這也是C語(yǔ)言程序設(shè)計(jì)中常見的一種簡(jiǎn)化策略。一般地,可以把“x!=0”簡(jiǎn)化為“x”,而把“x==0”簡(jiǎn)化為“!x”。
【例4.5】 根據(jù)輸入的一個(gè)學(xué)生的成績(jī),輸出成績(jī)的等級(jí)(優(yōu)秀、良好、中等、及格、不及格)。成績(jī)等級(jí)劃分辦法如下。
優(yōu)秀:90~100
良好:80~89
中等:70~79
及格:60~69
不及格:0~59
算法的N-S圖如圖4.8所示。

圖4.8 例4.5的算法N-S圖
程序如下:
1 #include<stdio.h> 2 void main() 3 { int score; 4 printf("輸入分?jǐn)?shù):"); 5 scanf("%d",&score); 6 if(score)=90)printf("優(yōu)秀\n"); 7 else if(score)=80)printf("良好\n"); 8 else if(score)=70)printf("中等\n"); 9 else if(score)=60)printf("及格\n"); 10 else printf("不及格\n"); 11 }
4.使用if語(yǔ)句應(yīng)該注意的問題
① 在三種形式的if語(yǔ)句中,在if關(guān)鍵字之后的括號(hào)中均為表達(dá)式。該表達(dá)式通常是邏輯表達(dá)式或關(guān)系表達(dá)式,但也可以是其他表達(dá)式,如賦值表達(dá)式等,甚至也可以是一個(gè)變量或常量。例如,“if( a=5 )……;”和“if( b )……;”都是允許的。只要表達(dá)式的值為非0,即為“真”。因此,對(duì)于“if( a=5 )……;”,表達(dá)式的值恒為5,所以其后的語(yǔ)句總是要執(zhí)行的。當(dāng)然這種情況在程序中不一定會(huì)出現(xiàn),但在語(yǔ)法上是合法的。
又如:
if(a=b) printf("%d",a); else printf("a is 0");
本語(yǔ)句的作用是,把b值賦予a,如為非0則輸出該值,否則輸出“a is 0”字符串。但如果要表達(dá)的真實(shí)意圖并非如此,而是“如果a和b相等,則……”,那么該語(yǔ)句就是“錯(cuò)誤”程序,錯(cuò)在把“==”寫成了“=”。希望讀者注意這種常犯的錯(cuò)誤。
② 在if語(yǔ)句中,條件判斷表達(dá)式必須用括號(hào)括起來(lái),在語(yǔ)句之后必須加分號(hào)。
③ 在if語(yǔ)句的三種形式中,所有的語(yǔ)句都應(yīng)為單條語(yǔ)句,如果要想在滿足條件時(shí)執(zhí)行一組(即多條)語(yǔ)句,則必須把這一組語(yǔ)句用“{}”括起來(lái)組成一個(gè)復(fù)合語(yǔ)句。
④ 由于if語(yǔ)句與其子句(then子句或else子句)之間存在歸屬關(guān)系,因此編程時(shí)把子句縮進(jìn)一格,以體現(xiàn)不同層次。
⑤ else子句部分不能獨(dú)立存在,必須緊跟在then子句之后。所以,對(duì)于以下語(yǔ)句:
if(x>y)z=x;; else z=y;
由于第一行多了一個(gè)分號(hào)“;”(形成一個(gè)空語(yǔ)句),else部分與前面的if部分分開了,將導(dǎo)致出錯(cuò)。
因此,當(dāng)then子句有可能是多條語(yǔ)句時(shí),一個(gè)較好的習(xí)慣是把它們放在“{}”中,形成復(fù)合語(yǔ)句。下面的書寫格式可以避免類似錯(cuò)誤,希望讀者認(rèn)真體會(huì)。
if(x>y) { z=x; } else { z=y; }
- 導(dǎo)游實(shí)務(wù)案例與分析
- 基于納米材料的熒光共振能量轉(zhuǎn)移技術(shù)及其應(yīng)用
- 投資理財(cái)綜合實(shí)訓(xùn)(第二版)
- 北京科技大學(xué)外國(guó)語(yǔ)學(xué)院211翻譯碩士英語(yǔ)[專業(yè)碩士]歷年考研真題及詳解
- 國(guó)際財(cái)務(wù)管理
- 新疆金融高質(zhì)量發(fā)展研究
- 市場(chǎng)營(yíng)銷策劃實(shí)務(wù)
- 國(guó)際私法教程
- 財(cái)經(jīng)應(yīng)用文寫作
- 大數(shù)據(jù)營(yíng)銷
- 美國(guó)大學(xué)物理系通關(guān)寶典:申研必看
- 大專中文傳意
- 軟件測(cè)試中級(jí)英語(yǔ)閱讀與寫作教程(廣東外語(yǔ)外貿(mào)大學(xué)國(guó)際服務(wù)外包人才培訓(xùn)系列教材)
- 物聯(lián)網(wǎng)技術(shù)概論(第3版)
- 華中師范大學(xué)外國(guó)語(yǔ)學(xué)院357英語(yǔ)翻譯基礎(chǔ)[專業(yè)碩士]歷年考研真題及詳解