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

第4章 控制語句

控制語句用于控制程序的流程,以實現(xiàn)程序的各種結(jié)構(gòu)方式。一個應(yīng)用程序通常包含了復(fù)雜的邏輯,要實現(xiàn)這些邏輯,必須進行程序的流程控制。程序的結(jié)構(gòu)通常包含順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)三大基本結(jié)構(gòu)。順序結(jié)構(gòu)是程序設(shè)計中最簡單的結(jié)構(gòu),程序在這種結(jié)構(gòu)下由上到下依次執(zhí)行。分支結(jié)構(gòu)是指程序中出現(xiàn)多個不同的處理情況,需要根據(jù)不同條件采取不同的處理方式。循環(huán)結(jié)構(gòu)是指在程序設(shè)計過程中出現(xiàn)了需要按照某種規(guī)律反復(fù)執(zhí)行的邏輯。

它們由特定的語句定義符組成。C語言有9種控制語句。可分成以下3類。

(1)條件判斷語句:if語句、switch語句。

(2)循環(huán)執(zhí)行語句:dowhile語句、while語句、for語句。

(3)其他語句:break語句、goto語句(此語句盡量少用,因為它不利結(jié)構(gòu)化程序設(shè)計,濫用它會使程序流程無規(guī)律、可讀性差)、continue語句、return語句。

控制語句在程序設(shè)計中具有至關(guān)重要的作用,在代碼中它們的使用頻率也非常高,因此需要將這些語句練習(xí)得非常熟練。接下來將就這些語句進行詳細(xì)的介紹。

4.1 分支語句

順序結(jié)構(gòu)的程序雖然能解決計算、輸出等問題,但不能做判斷再選擇。對于要先做判斷再執(zhí)行的問題就要使用分支結(jié)構(gòu)。分支結(jié)構(gòu)主要用于實現(xiàn)流程的改變,根據(jù)判斷條件的真假來選擇執(zhí)行不同的分支。

分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序執(zhí)行的。分支結(jié)構(gòu)的程序設(shè)計方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句。

分支結(jié)構(gòu)適合于帶有邏輯或關(guān)系比較等條件判斷的計算。因此,當(dāng)程序中面對兩個或兩個以上的選擇時,可以利用分支語句根據(jù)條件判斷具體選擇將要執(zhí)行的一組語句。在C#語言中,if語句和switch語句都可以提供這樣的功能。

4.1.1 if…else…語句

if語句是最為常用的選擇語句,它根據(jù)布爾表達(dá)式的真假值來判斷是否執(zhí)行后面跟的嵌套語句。其形式為:

            if(布爾表達(dá)式)
            布爾表達(dá)式為真時執(zhí)行的語句序列

            if(布爾表達(dá)式1)
            布爾表達(dá)式1為真時執(zhí)行的語句序列
            else
            布爾表達(dá)式1為假時執(zhí)行的語句序列

當(dāng)布爾表達(dá)式值為真時,那么執(zhí)行if后面的內(nèi)嵌語句,為假則程序繼續(xù)往下執(zhí)行。如果有else語句,則執(zhí)行else后面的內(nèi)嵌語句,否則繼續(xù)執(zhí)行下一條語句。else分支與最近的if語句構(gòu)成一個if else對。if語句并不一定必須有else分支。其流程如圖4-1所示。

圖4-1 if else語句結(jié)構(gòu)

總的來說,if語句按照下面的方式來執(zhí)行。

(1)求布爾表達(dá)式的值。

(2)如果布爾表達(dá)式的值為真,程序?qū)⑻D(zhuǎn)到分語句的第一個嵌套語句執(zhí)行。當(dāng)程序執(zhí)行到此嵌套語句的結(jié)尾時,程序控制將轉(zhuǎn)移到if語句的結(jié)尾。

(3)如果布爾表達(dá)式的值為假,而且分語句中有else分支,則程序跳轉(zhuǎn)到分語句的第二個嵌套語句執(zhí)行。當(dāng)程序執(zhí)行到嵌套語句的結(jié)尾時,程序控制將轉(zhuǎn)移到if語句的結(jié)尾。

(4)如果布爾表達(dá)式的值為假,而且分語句中沒有else分支,則程序控制將轉(zhuǎn)移到if語句的結(jié)尾。

【例4-1】 判斷輸入的數(shù)是否大于3。

新建控制臺程序“ex_if”,輸入代碼如下:

            static void Main(string[] args)
                 {inta;
                 a=Convert.ToInt32(Console.ReadLine());
                 if(a>3){
                 Console.WriteLine("您輸入的數(shù)大于或等于3.");}
                 else{
                 Console.WriteLine("您輸入的數(shù)小于3.");}
                 Console.ReadLine();
            }

運行效果如圖4-2所示。

圖4-2 運行效果

還有一種if…else if語句,其形式為:

        if( 布爾表達(dá)式1)
        {
            布爾表達(dá)式1為真時執(zhí)行的語句序列
        }
        else if( 布爾表達(dá)式2)
        {
            布爾表達(dá)式2為真時執(zhí)行的語句序列
        }
        else if( 布爾表達(dá)式3)
        {
            布爾表達(dá)式3為真時執(zhí)行的語句序列
        }
        ……
        else
        {
            所有條件均為假時執(zhí)行的語句序列
        }

下面給出if…else if語句的示例。

【例4-2】 判斷輸入數(shù)的性質(zhì)。

新建控制臺程序“ex_if_elseif”,輸入代碼如下:

        static void Main(string[] args)
              {   int a;
                  a= Convert.ToInt32(Console.ReadLine());
                  if (a<0)
                  {
                      Console.WriteLine("您輸入的數(shù)是負(fù)數(shù).");
                  }
                  else if(a==0)
                  {
                      Console.WriteLine("您輸入的數(shù)是0.");
                  }
                  else
                  {
                      Console.WriteLine("您輸入的數(shù)是正數(shù).");
                  }
                  Console.ReadLine();
              }

運行效果如圖4-3所示。

圖4-3 運行效果

4.1.2 switch語句

switch語句包括關(guān)鍵字switch和其后的括號表達(dá)式(我們稱之為switch控制表達(dá)式),以及switch塊組成。switch塊包括含零個或多個由括號包圍的switch分支。每個switch分支又由一個或多個switch標(biāo)號和跟在它們后面的語句列表組成。switch語句可根據(jù)一個控制表達(dá)式的值選擇相應(yīng)的內(nèi)嵌語句分支來執(zhí)行。具體定義方式如下。

switch語句常用形式為:

            switch (表達(dá)式)
            {
                case常量表達(dá)式1:
                    語句序列1
                case常量表達(dá)式2:
                    語句序列2
                ……
            //每一個switch語句最多只能有一個default標(biāo)號分支
                [default: 語句序列]
            }

具體來說,switch語句是按照如下方式執(zhí)行的。

(1)首先計算出switch表達(dá)式的值并轉(zhuǎn)換到控制類型。

(2)如果switch表達(dá)式的值等于某一個switch分支的常量表達(dá)式的值,那么程序控制跳轉(zhuǎn)到這個case標(biāo)號后的語句列表中。

(3)如果switch表達(dá)式的值無法與switch語句中任何一個case常量表達(dá)式的值匹配且switch語句中有default分支,則程序控制會跳轉(zhuǎn)到default標(biāo)號后的語句列表中。

(4)如果switch表達(dá)式的值無法與switch語句中任何一個case常量表達(dá)式的值匹配且switch語句中沒有default分支,則程序控制會跳轉(zhuǎn)到switch語句的結(jié)尾。

下面來看一個switch語句的實例。

【例4-3】 判斷成績的等級。

新建一個控制臺程序“ex_switch”,輸入以下代碼:

       using System;
       namespace SwitchExample
       {
           public class Program
           {
             public static void Main()
             {
             Console.Write("請輸入成績:");
             //從鍵盤接收一行字符
             string str = Console.ReadLine();
             //轉(zhuǎn)換為整型
             int i = Int32.Parse(str.Trim());
             if (i > 100 || i < 0)
             {
               Console.WriteLine("成績不在0-100范圍內(nèi)");
             }
             else
             {
               switch (i / 10)
               {
                   case 10:
                       Console.Write("滿分,");
                       goto case 9;
                  case 9:
                      Console.WriteLine("優(yōu)秀");
                       break;
                   case 8:
                   case 7:
                       Console.WriteLine("良好");
                       break;
                   case 6:
                       Console.WriteLine("及格");
                       break;
                   default:
                       Console.WriteLine("不及格");
                       break;
               }
             }
                   Console.ReadLine();
             }
           }
       }

運行效果如圖4-4所示。

圖4-4 運行效果

使用switch語句需要注意以下問題。

(1)switch語句的控制類型由switch表達(dá)式?jīng)Q定。如果switch表達(dá)式的類型是sbyte、byte、short、ushort、int、uint、long、ulong、char、string或枚舉型,那么這就是switch語句的控制類型。否則,必須有一個用戶自定義隱式轉(zhuǎn)換語句,把switch表達(dá)式的類型轉(zhuǎn)換為sbyte、byte、short、ushort、int、uint、long、ulong、char、string控制類型中的一種。如果沒有這樣的一條轉(zhuǎn)換語句或有多條這樣的轉(zhuǎn)換語句存在,將產(chǎn)生編譯錯誤。

(2)在C和C++語言中,允許switch語句中的case標(biāo)簽后不出現(xiàn)break語句,但C#不允許這樣,它要求每個標(biāo)簽項后必須使用break語句或者goto語句,它不允許從一個case中自動遍歷到其他case,否則編譯時會報錯。

(3)C#中的switch語句可以把字符串當(dāng)成常量表達(dá)式類使用,所以其switch語句的控制類型可以是string類型。

(4)對于switch語句中的字符串,它是區(qū)分大小寫的。只有switch表達(dá)式的值與case分支常數(shù)的值完全匹配,此case標(biāo)號后的語句才會被執(zhí)行。

主站蜘蛛池模板: 旅游| 陈巴尔虎旗| 盐山县| 临西县| 高尔夫| 吴江市| 淮北市| 呼伦贝尔市| 方正县| 乾安县| 汉川市| 黎平县| 麟游县| 河池市| 阳山县| 开化县| 南皮县| 都江堰市| 怀集县| 嫩江县| 清河县| 宣汉县| 萍乡市| 永和县| 安岳县| 大足县| 罗田县| 突泉县| 宁强县| 岳阳县| 巍山| 微博| 浠水县| 苗栗县| 赤壁市| 洱源县| 伊金霍洛旗| 四会市| 五华县| 嘉荫县| 绍兴县|