官术网_书友最值得收藏!

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;
            }
主站蜘蛛池模板: 霍林郭勒市| 弥渡县| 武山县| 济源市| 葫芦岛市| 云安县| 府谷县| 原阳县| 凤翔县| 紫金县| 从江县| 万盛区| 宜昌市| 九龙坡区| 长沙市| 桂阳县| 榕江县| 永城市| 永春县| 常熟市| 西乌珠穆沁旗| 诏安县| 西和县| 岳普湖县| 榆林市| 莱西市| 南宫市| 阳谷县| 波密县| 绥棱县| 新宾| 四平市| 图片| 新竹县| 伊通| 湖南省| 沂水县| 正定县| 广灵县| 宜良县| 于田县|