天天看點

執行個體講解 C 語言的分支結構

  既然是執行個體分析,當然要有例子。好吧,先給出一個實驗題:輸入一個百分制成績,要求輸出該成績是及及格。

  很顯然,應該使用分支結構将及格及不及格兩種情況分别列印。給出解答程式如下:

#include

void main() {

    int n;

    printf("Please input the score: ");

    scanf("%d", &n);

    if (n < 60) {

        printf("不及格/n");

    }

    else {

        printf("及格了/n");

    }

}

  這樣一個程式非常簡單,但它展示了 if 分支結構最基本的用法:

if (條件) {語句1} else {語句2}

  當條件為真時執行語句1,條件為假時執行語句2。在 C 語言中,所有非 0 值表示真,0 表示假。if 結構中的括号并不是必須的,當你的大括号中隻包含一個語句時,可以将大括号省略。如例1中的 if 語句,可以改寫為:

if (a < 60) printf("不及格/n");

else printf("及格了/n");

  這樣,程式似乎簡潔了不少。但如果以後需要添加語句時,就可能因為忘了添加大括号而造成錯誤。是以,推薦使用不省略大括号的寫法。

  基本 if 語句還可以簡化——省略 else 分支。如例1,我們還可寫成:

#include

void main() {

    int n;

    printf("Please input the score: ");

    scanf("%d", &n);

    if (n < 60) {

        printf("不及格/n");

        return;

    }

    printf("及格了/n");

}

  例2 描述的是:如果分值小于 60 分,列印出“不及格”,并且結束 main() 函數。如果分值不小于 60 分的情況,if 分支中的所有語句都沒有執行,直接執行了 printf("及格了/n"),列印出 “及格了”。

  想一想,如果在 if 語句中不使用 return; 語句強制結束 main() 函數,會怎樣?結果是在分值小于 60 分的情況下,将“不及格”及“及格了”都列印出來了。原因是顯而易見的:因為列印“及格了”的語句不在 else 分支中,更不在 if 結構中,無論什麼情況都要執行。

  if 語句可以變得更複雜——嵌套,即 if 結構中再套 if 結構。如上題中,我們再加上一點點容錯處理,先判斷輸入的分值是否在 0 到 100 之間:

#include

void main() {

    int n;

    printf("Please input the score: ");

    scanf("%d", &n);

    if (n >= 0 && n <= 100) {

        if (n < 60) {

            printf("不及格/n");

            return;

        }

        printf("及格了/n");

    }

    else {

        printf("輸入分值錯誤!");

    }

}

  例3 描述:如果 n 在 0 到 100 之間,再進行及格和不及格的判斷,否則列印錯誤資訊。  這樣以來,或許就有點糊塗了:這個 else 到底是哪一個 if 的呢?每一個 if 或者 else 後面,都應該跟一個語句或者由一對大括号括起來的一組語句。而且也隻能跟一個語句或者一組由大括号括起來的語句。由大括号的成對關系,便容易判斷了。  例3 是在 if 分支中嵌套 if 結構,else 分支中同樣可以嵌套 if 結構,請看例4:

#include

void main() {

    int n;

    printf("Please input the score: ");

    scanf("%d", &n);

    if (n < 0 || n > 100) {

        printf("輸入分值錯誤!");

    }

    else {

        if (n < 60) {

            printf("不及格/n");

            return;

        }

        printf("及格了/n");

    }

}

  當然,if 分支和 else 分支在較複雜的程式中,也可能同時嵌套 if 結構,希望讀者能夠舉一反三,這裡就不多說了。  現在我們把實驗題改一改,不是要求輸入是否及格,而是要求輸入百分制成績對應的 A-E 等級。怎麼辦?對,用一個再一個的嵌套——多重嵌套:

#include

void main() {

    int n;

    printf("Please input the score: ");

    scanf("%d", &n);

    if (n < 0 || n > 100) {

        printf("輸入分值錯誤!");

    }

    else {

        if (n < 60) {

            printf("E/n");

        }

        else {

            if (n < 70) {

                printf("D/n");

            }

            else {

                if (n < 80) {

                    printf("C/n");

                }

                else {

                    if (n < 90) {

                        printf("B/n");

                    }

                    else {

                        printf("A/n");

                    }

                }

            }

        }

    }

}

  天啊!我頭暈。可不可以簡潔一點?當然,你知道 elseif 語句嗎?Sorry, C 語言沒有。不過,C 語言可以實作類似于 elseif 語句的結構,因為——每個 if 結構都隻是一個語句,else 後面不是可以接一個語句嗎?看我的:

#include

void main() {

    int n;

    printf("Please input the score: ");

    scanf("%d", &n);

    if (n < 0 || n > 100) {

        printf("輸入分值錯誤!");

    }

    else {

        if (n < 60) {

            printf("E/n");

        }

        else if (n < 70) {

            printf("D/n");

        }

        else if (n < 80) {

            printf("C/n");

        }

        else if (n < 90) {

            printf("B/n");

        }

        else {

            printf("A/n");

        }

    }

}

  啊,現在清楚多了,不過用那麼多 else if 真是麻煩。為什麼不用 switch 呢?C 語言的 switch 分支就是常說的 case 分支,也即多分支。if 結構最多隻能有兩條分支,而 switch 最多可以有……數不清條分支!先看看它是怎麼用的:

#include

void main() {

    int n;

    printf("Please input the score: ");

    scanf("%d", &n);

    if (n < 0 || n > 100) {

        printf("輸入分值錯誤!");

    }

    switch (n / 10) {

    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:

        if (n == 100) {

            printf("A/n");

        }

        else {

            printf("E/n");

        }

    }

}

  是不是沒搞懂為什麼有 n / 10 一句?這個語句是取 n 除以 10 的整數商,舍棄餘數。之是以要這樣作,是因為 case 後面隻能接一個常數(或者常量),我沒辦法像在 Foxbase 中一樣使用 case n > 90。  那為什麼要用那麼多 break 呢?break 的意思就是跳出該 switch 語句。每一個 case 實際上隻是一個标号,就好像使用 goto 語句跳到該标号一樣,它會從該标号批示的位置開始,一直執行下去。如果不用 break,你試試,哈哈,除非是滿分,否則都是 E。  哦,還有 default 忘了告訴你。如果所有 case 條件都不比對的時候,就執行 default 後面的部分。當然 default 分支是可以省略的,這樣的話,找不到比對條件就不做任何處理。  有趣吧!不過居然還用了兩個 if 分支,慚愧。既然 switch 分支是多分支,應該能夠包含所有的 if 分支才對啊!再試試:

#include

void main() {

    int n;

    printf("Please input the score: ");

    scanf("%d", &n);

    switch (n / 10) {

    case 10: case 9:

        printf("A/n");

        break;

    case 8:

        printf("B/n");

        break;

    case 7:

        printf("C/n");

        break;

    case 6:

        printf("D/n");

        break;

    case 5: case 4: case 3:

    case 2: case 1: case 0:

        printf("E/n");

        break;

    default:

        printf("輸入分值錯誤!");

    }

}

  現在簡潔了不少耶!不過連續用兩個 case 是什麼意思呢?

  case 不隻是一個标号嗎,連續用兩個 case 也不過就是讓兩個标号表示同一個位置而已。這個技巧很好用的哦!  不過從 case 5 到 case 0,寫了這麼長一串,如果我用一個 if 分支,就可以少寫一些代碼了。是以,使用 switch 的時候并不是不能使用 if,要視情況而定,讓你的代碼最簡潔!switch 結構同樣是可以多重嵌套的——當然套在某個 case 後面,例子我就不用舉了吧,學程式設計的人怎能不會舉一反三?!  說白了,C 語言的分支結構也就兩種,但隻要你靈活運用,這分支可就層出不窮了!  獨孤九劍,重在劍意,不在劍招…… “啪!”在想什麼,該打!

-=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-

             //

  __________/LB/___   OUTINN

 /  _[]_   /____/  /

/_________/| () |/__/  http://outinn.yeah.net/

 |  ____ /-| __ |-/|  Welcome to visit OUTINN!

 |__|==|___| || |__|

 -=--=--=- |_||_| =-  Fancy,  [email protected]

繼續閱讀