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

第6章 程序的基本結(jié)構(gòu)

本章視頻教學(xué)錄像:38分鐘

一個(gè)C#應(yīng)用程序是由許多語(yǔ)句組合而成的。在C#程序設(shè)計(jì)中如何組織程序語(yǔ)句,實(shí)現(xiàn)程序功能,這是我們需要掌握的基本技能。程序中的語(yǔ)句可以逐條執(zhí)行,也可以根據(jù)某一條件的不同取值選擇執(zhí)行不同的代碼,或者根據(jù)條件重復(fù)執(zhí)行一段代碼,本章介紹的順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)就能滿足這些要求。

本章要點(diǎn)(已掌握的在方框中打鉤)

□ 順序結(jié)構(gòu)

□ 分支結(jié)構(gòu)

□ 循環(huán)結(jié)構(gòu)

6.1 順序結(jié)構(gòu)

本節(jié)視頻教學(xué)錄像:2分鐘

順序結(jié)構(gòu)是程序代碼中最基本的結(jié)構(gòu),簡(jiǎn)單地說(shuō)就是逐條執(zhí)行程序中的語(yǔ)句,從程序開(kāi)始執(zhí)行到程序結(jié)束為止。例如,

    01 double x;                      //定義一個(gè)double型變量x
    02 int y=3;                      //定義一個(gè)int型變量y,讓y的值為3,可以讀為把3賦給y
    03 int z=8;                       //定義一個(gè)int型變量z,把8賦給z
    04 x=y+z+Math.Sin(3.65);         //將表達(dá)式的結(jié)果賦給x,Math.Sin是使用Math類庫(kù)中的Sin
                                  方法求正弦值

程序中包含4條語(yǔ)句,構(gòu)成一個(gè)順序結(jié)構(gòu)的程序。語(yǔ)句1定義一個(gè)double型變量x,語(yǔ)句2定義int型變量y并賦值,語(yǔ)句3定義int型變量z并賦值,語(yǔ)句4根據(jù)y、z的值進(jìn)行運(yùn)算并將結(jié)果賦值給x。

可以看出,順序結(jié)構(gòu)中,每一條語(yǔ)句都需要執(zhí)行并且只執(zhí)行一次,語(yǔ)句執(zhí)行的先后次序與語(yǔ)句在順序結(jié)構(gòu)程序中出現(xiàn)的先后次序一致。

提示

當(dāng)程序中的語(yǔ)句符合順序結(jié)構(gòu)的特點(diǎn)時(shí),即每條語(yǔ)句都需要執(zhí)行且只需要執(zhí)行一次,則可以使用順序結(jié)構(gòu)。

6.2 分支結(jié)構(gòu)

本節(jié)視頻教學(xué)錄像:12分鐘

與我們?nèi)粘I钪械脑S多情況類似,程序設(shè)計(jì)過(guò)程中,經(jīng)常需要根據(jù)條件進(jìn)行判斷,然后選擇要執(zhí)行的語(yǔ)句序列。分支結(jié)構(gòu)就是根據(jù)條件的不同選擇執(zhí)行程序中的不同分支,每個(gè)分支對(duì)應(yīng)一個(gè)語(yǔ)句序列。本節(jié)主要介紹實(shí)現(xiàn)分支結(jié)構(gòu)的條件語(yǔ)句,有時(shí)也稱為選擇語(yǔ)句。

6.2.1 條件語(yǔ)句

條件語(yǔ)句就是對(duì)條件進(jìn)行判斷,根據(jù)判斷結(jié)果選擇執(zhí)行不同的分支。C#中提供了多種形式的條件語(yǔ)句,包括if語(yǔ)句、if…else語(yǔ)句和switch語(yǔ)句。

⑴ 單分支結(jié)構(gòu)的if語(yǔ)句。

語(yǔ)法格式如下。

    if(條件表達(dá)式)
    {語(yǔ)句序列}

如果條件成立(條件表達(dá)式的值為true),就執(zhí)行條件表達(dá)式后面的語(yǔ)句序列中的語(yǔ)句。如果條件不成立(條件表達(dá)式的值為false),則跳過(guò)語(yǔ)句序列,繼續(xù)執(zhí)行if語(yǔ)句之后的語(yǔ)句。一般情況下,語(yǔ)句序列要用花括號(hào)括起來(lái)。例如,

    01 int score=int.Parse(Console.ReadLine());   //輸入成績(jī),保存在變量score中
    02 if(score>=60)                             //條件為score大于等于60
    03 {
    04    Console.WriteLine("及格!");            //條件成立,則輸出"及格!"
    05 }
    06 if(score<60)                              //條件為score小于60
    07 {
    08    Console.WriteLine("不及格!");          //條件成立,則輸出"不及格!"
    09 }

使用ReadLine()方法從鍵盤輸入成績(jī),調(diào)用int.Parse()方法將輸入值轉(zhuǎn)換為int類型,保存在變量score中。第一個(gè)if語(yǔ)句的條件表達(dá)式為“score >= 60”,當(dāng)條件成立,輸出“及格! ”;條件不成立則跳過(guò)第一個(gè)if語(yǔ)句,轉(zhuǎn)去執(zhí)行第二個(gè)if語(yǔ)句。第二個(gè)if語(yǔ)句的條件表達(dá)式為“score < 60”,當(dāng)條件成立,輸出“不及格! ”;條件不成立則跳過(guò)第二個(gè)if語(yǔ)句,程序結(jié)束。兩個(gè)if語(yǔ)句的條件表達(dá)式是相互獨(dú)立,互不影響的。

提示

if語(yǔ)句中的條件表達(dá)式的值應(yīng)為bool型,表達(dá)式的值為true則條件成立,表達(dá)式的值為false則條件不成立。

下面的例子進(jìn)一步說(shuō)明了if語(yǔ)句的使用。

【范例6-1】 輸入學(xué)生成績(jī),輸出學(xué)生的成績(jī)等級(jí)。

⑴ 在Visual Studio 2013中新建控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為“ScoreByIf”。

⑵ 在program.cs的main方法中輸入以下代碼。

        01  Console.WriteLine("請(qǐng)輸入成績(jī)(0-100):");
        02  int score=int.Parse(Console.ReadLine());
    03  if(score>=90)
    04  {
    05         Console.WriteLine("優(yōu)秀!");
    06  }
    07  if(score>=80&&score<90)
    08  {
    09         Console.WriteLine("良好!");
    10  }
    11  if(score>=70&&score<80)
    12  {
    13         Console.WriteLine("中等!");
    14  }
    15  if(score>=60&&score<70)
    16  {
    17         Console.WriteLine("及格!");
    18  }
    19  if(score<60)
    20  {
    21         Console.WriteLine("不及格!");
    22  }
    23  Console.ReadKey();

⑶ 雙分支結(jié)構(gòu)的if…else語(yǔ)句。

語(yǔ)法格式如下。

    if(條件表達(dá)式)
    {語(yǔ)句序列1}
    else
    {語(yǔ)句序列2}

其作用是如果條件表達(dá)式值為true,執(zhí)行if后面的語(yǔ)句序列1;如果條件表達(dá)式值為false,執(zhí)行else后面的語(yǔ)句序列2。

    int score=int.Parse(Console.ReadLine());      //輸入成績(jī),保存在變量score中
    if(score>=60)                                //條件為score大于等于60
    {
        Console.WriteLine("及格!");             //條件成立,則輸出"及格!"
    }
    else
    {
        Console.WriteLine("不及格!");           //條件不成立,則輸出"不及格!"
    }

對(duì)比if語(yǔ)句的例子,可以看出,以上代碼實(shí)現(xiàn)了使用一個(gè)if…else語(yǔ)句體現(xiàn)兩個(gè)if語(yǔ)句的功能。思考一下,什么時(shí)候可以這樣做?

⑷ 多分支結(jié)構(gòu)。

if語(yǔ)句實(shí)現(xiàn)多分支結(jié)構(gòu)的語(yǔ)法如下。

    if(表達(dá)式1)
    { 語(yǔ)句序列1        //表達(dá)式1的值為true時(shí)執(zhí)行的語(yǔ)句}
    else if(表達(dá)式2)
    { 語(yǔ)句序列2        //表達(dá)式2的值為true時(shí)執(zhí)行的語(yǔ)句}
    …
    else if(表達(dá)式n)
    {語(yǔ)句序列n         //表達(dá)式n的值為true時(shí)執(zhí)行的語(yǔ)句}
    else
    {語(yǔ)句序列n+1       //表達(dá)式1到n的值都為false時(shí)執(zhí)行的語(yǔ)句}

注意,當(dāng)表達(dá)式1的值為true,執(zhí)行語(yǔ)句序列1,然后if語(yǔ)句的執(zhí)行結(jié)束。只有當(dāng)表達(dá)式1的值為false時(shí),才需要考慮表達(dá)式2的值,表達(dá)式2的值為true,則執(zhí)行語(yǔ)句序列2,然后結(jié)束if語(yǔ)句。只有當(dāng)表達(dá)式2的值為false,才需要考慮表達(dá)式3的值。依此類推,只有表達(dá)式1、2、3…n-1的值都為false時(shí),才需要考慮表達(dá)式n的值,這時(shí)如果表達(dá)式n的值為true,則執(zhí)行語(yǔ)句序列n,然后結(jié)束if語(yǔ)句,否則執(zhí)行語(yǔ)句序列n+1。

【范例6-2】 使用多分支結(jié)構(gòu)實(shí)現(xiàn)成績(jī)等級(jí)評(píng)定。

⑴ 在Visual Studio 2013中新建控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為“ScoreByIfelse”。

⑵ 在program.cs的main方法中輸入以下代碼。

    01  Console.WriteLine("請(qǐng)輸入成績(jī)(0-100):");
    02  int score=int.Parse(Console.ReadLine());
    03  if(score>=90)
    04  {
    05         Console.WriteLine("優(yōu)秀!");
    06  }
    07  else if(score>=80)
    08
    09         Console.WriteLine("良好!");
    10  }
    11  else if(score>=70)
    12  {
    13         Console.WriteLine("中等!");
    14  }
    15  else if(score>=60)
    16  {
    17         Console.WriteLine("及格!");
    18  }
    19  else
    20  {
    21         Console.WriteLine("不及格!");
    22  }
    23  Console.ReadKey();

【范例分析】

使用多分支結(jié)構(gòu)可以讓程序看起來(lái)更加簡(jiǎn)潔,但是要注意多分支結(jié)構(gòu)中多個(gè)條件表達(dá)式之間的關(guān)系。例如,上面的代碼中要執(zhí)行條件表達(dá)式“score >= 80”后的語(yǔ)句“Console.WriteLine("良好!");”的前提是條件表達(dá)式“score >= 90”為false,也就是說(shuō),當(dāng)條件score >= 80 && score < 90成立時(shí)才執(zhí)行語(yǔ)句“Console.WriteLine("良好!");”

6.2.2 switch語(yǔ)句

分支結(jié)構(gòu)也可以使用switch語(yǔ)句來(lái)實(shí)現(xiàn),switch語(yǔ)句能夠根據(jù)表達(dá)式的值來(lái)選擇要執(zhí)行的代碼。if語(yǔ)句只能測(cè)試單個(gè)條件,如果需要測(cè)試多個(gè)條件,則需要書寫冗長(zhǎng)的代碼。而switch語(yǔ)句能有效地避免冗長(zhǎng)的代碼,并能測(cè)試多個(gè)條件。switch語(yǔ)句的語(yǔ)法如下。

    switch (表達(dá)式)
    {
        case  常量表達(dá)式1: 語(yǔ)句序列1
        break;
        case  常量表達(dá)式2: 語(yǔ)句序列2
        break;
        …
        case  常量表達(dá)式n: 語(yǔ)句序列n
        break;
        default:             語(yǔ)句序列n+1
        break;
    }

switch語(yǔ)句的執(zhí)行過(guò)程是:計(jì)算switch語(yǔ)句中表達(dá)式的值,再依次與1~n個(gè)常量比較,當(dāng)表達(dá)式的值與某個(gè)case后面的常量相等時(shí),則執(zhí)行該case后面的語(yǔ)句,然后執(zhí)行break語(yǔ)句,跳出switch結(jié)構(gòu)。程序執(zhí)行時(shí),從匹配常量的相應(yīng)case處入口,一直執(zhí)行到break語(yǔ)句或到達(dá)switch結(jié)構(gòu)的末尾為止。如果幾個(gè)常量都不等于switch中表達(dá)式的值,則執(zhí)行default處的語(yǔ)句。

每個(gè)case后面的語(yǔ)句可以是單條語(yǔ)句或空語(yǔ)句,也可以是多條語(yǔ)句,而構(gòu)成一個(gè)程序段。這里的語(yǔ)法上允許有多條語(yǔ)句,因此不必加花括號(hào)寫成復(fù)合語(yǔ)句的形式。

【范例6-3】 使用switch語(yǔ)句實(shí)現(xiàn)成績(jī)等級(jí)評(píng)定。

⑴ 在Visual Studio 2013中新建控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為“ScoreBySwitch”。

⑵ 在program.cs的main方法中輸入以下代碼。

    01   Console.WriteLine("請(qǐng)輸入成績(jī)(0-100):");
    02   int score=int.Parse(Console.ReadLine());
    03   switch(score/10)
    04   {
    05         case 10:
    06         case 9:
    07         Console.WriteLine("優(yōu)秀!");
    08         break;
    09         case 8:
    10         Console.WriteLine("良好!");
    11         break;
    12         case 7:
    13         Console.WriteLine("中等!");
    14         break;
    15         case 6:
    16         Console.WriteLine("及格!");
    17         break;
    18         default:
    19         Console.WriteLine("不及格!");
    20         break;
    21   }
    22   Console.ReadKey();

【范例分析】

在這個(gè)程序中,從鍵盤上輸入學(xué)生成績(jī),存入變量score中,使用score/10作為switch語(yǔ)句的表達(dá)式,表達(dá)式的值為整型,與case后的常量表達(dá)式的值類型相同。當(dāng)表達(dá)式score/10的值與某個(gè)case后的常量表達(dá)式的值相等時(shí),跳轉(zhuǎn)到該case結(jié)構(gòu)后的語(yǔ)句序列開(kāi)始執(zhí)行,直到switch語(yǔ)句結(jié)束或者遇到break語(yǔ)句。可以多種情況共用一個(gè)語(yǔ)句序列,如score/10的值為9和10兩種情況,學(xué)生成績(jī)等級(jí)都是“優(yōu)秀”,case 10后面為空,與case 9共用一個(gè)語(yǔ)句序列。這種特性的使用需要特別注意,需要在每個(gè)語(yǔ)句序列的最后加上break語(yǔ)句,保證被執(zhí)行語(yǔ)句序列得到執(zhí)行后跳轉(zhuǎn)到switch語(yǔ)句的結(jié)束位置。

6.3 循環(huán)結(jié)構(gòu)

本節(jié)視頻教學(xué)錄像:11分鐘

在程序開(kāi)發(fā)中,經(jīng)常需要反復(fù)執(zhí)行某段代碼。為了避免重復(fù)輸入相同代碼,同時(shí)提高程序代碼的可讀性,引入了循環(huán)結(jié)構(gòu),需要反復(fù)執(zhí)行的代碼稱為循環(huán)體。循環(huán)結(jié)構(gòu)使用循環(huán)條件控制循環(huán)體代碼的執(zhí)行與否,循環(huán)條件中通常使用一個(gè)特殊的變量——循環(huán)變量,根據(jù)循環(huán)變量的值來(lái)確定循環(huán)條件是否成立。C#提供的循環(huán)語(yǔ)句有for語(yǔ)句、while語(yǔ)句、do_while語(yǔ)句和foreach語(yǔ)句。

6.3.1 for循環(huán)

for循環(huán)語(yǔ)句語(yǔ)法為:

    for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
    {
    循環(huán)體
    }

for語(yǔ)句的執(zhí)行過(guò)程如下。

① 計(jì)算表達(dá)式1,為循環(huán)變量賦初值。

② 計(jì)算表達(dá)式2,檢查循環(huán)條件,若表達(dá)式2的值為true, 則執(zhí)行一次循環(huán)體;若其為false,控制轉(zhuǎn)出循環(huán)結(jié)構(gòu)。

③ 執(zhí)行完一次循環(huán)體后,計(jì)算表達(dá)式3,對(duì)控制變量進(jìn)行增量或減量操作,再重復(fù)第⑵步操作。

提示

for后面括號(hào)中的3個(gè)表達(dá)式之間用分號(hào)(“;”)分開(kāi)。表達(dá)式1和表達(dá)式3一般為賦值表達(dá)式,表達(dá)式1為循環(huán)控制變量賦初值,表達(dá)式3改變循環(huán)變量的值。表達(dá)式2一般為關(guān)系表達(dá)式或邏輯表達(dá)式,作為控制循環(huán)體結(jié)束條件,當(dāng)表達(dá)式值為true時(shí),循環(huán)繼續(xù);當(dāng)表達(dá)式值為false時(shí),循環(huán)停止。

【范例6-4】 用for循環(huán)計(jì)算1+2+3+…+100的和。

⑴ 在Visual Studio 2013中新建控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為“SumByFor”。

⑵ 在program.cs的main方法中輸入以下代碼。

        01 int sum; //定義累加變量sum
    02 sum=0;                        //累加變量賦初始值為0
    03 Console.WriteLine("計(jì)算1+2+3+…+100的和:");
    04 for(int i=1;i<=100;i++)        //循環(huán)變量i從1開(kāi)始到100變化循環(huán),i每次增1
    05  {                            //循環(huán),累加求和
    06    sum=sum+i;                 //累加求和
    07  }
    08  Console.WriteLine("1+2+3+…+100={0}",sum);
    09  Console.ReadKey();

【范例分析】

在這個(gè)程序中,表達(dá)式1(int i=1)為循環(huán)變量i賦初值1,該表達(dá)式只在for循環(huán)開(kāi)始時(shí)執(zhí)行一次。表達(dá)式2(i<= 100)是循環(huán)條件,循環(huán)的每次執(zhí)行都要先判斷循環(huán)條件是否成立,成立則執(zhí)行循環(huán)體,這里是把i的當(dāng)前值累加到變量sum上。表達(dá)式3(i++)在循環(huán)的每一次執(zhí)行結(jié)束后得到執(zhí)行,保證每次循環(huán)i的值都比上一次加1,使得最終循環(huán)條件不成立,循環(huán)終止。

6.3.2 while循環(huán)

while循環(huán)的語(yǔ)法為:

    while (表達(dá)式)
    {
        循環(huán)體
    }

while循環(huán)執(zhí)行的過(guò)程是:先計(jì)算while后面圓括號(hào)內(nèi)表達(dá)式的值,判斷循環(huán)條件是否成立。當(dāng)表達(dá)式值為true時(shí),執(zhí)行循環(huán)體,然后再次判斷表達(dá)式的值;當(dāng)表達(dá)式的值仍為“true”時(shí),則再次執(zhí)行循環(huán)體語(yǔ)句,重復(fù)上述執(zhí)行過(guò)程;當(dāng)表達(dá)式的值為false時(shí)則退出循環(huán)。

【范例6-5】 用while循環(huán)計(jì)算1+2+3+…+100的和。

⑴ 在Visual Studio 2013中新建控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為“SumByWhile”。

⑵ 在program.cs的main方法中輸入以下代碼。

    01 int i,sum;              //定義int變量i用于控制循環(huán)次數(shù),sum用于累加求和
    02 i=1;                   //循環(huán)變量賦初始值為1
    03 sum=0;                 //累加器變量sum賦初值為0
    04 while(i<=100)          //while循環(huán),當(dāng)i小于等于100時(shí)循環(huán)
    05 {                      //循環(huán)體,累加求和
    06    sum=sum+i;          //累加求和
    07    i++;                //循環(huán)變量的值增1
    08 }
    09 Console.WriteLine("1+2+3+…+100={0}",sum);     //輸出累加的結(jié)果5050
    10 Console.ReadKey();

提示

while循環(huán)中只有一個(gè)表達(dá)式,相當(dāng)于for循環(huán)的表達(dá)式2,即循環(huán)條件。為循環(huán)變量賦初值需要在while循環(huán)之前進(jìn)行,修改循環(huán)變量的值的語(yǔ)句通常放在循環(huán)體的最后。按照這一原則,我們可以很方便地實(shí)現(xiàn)for循環(huán)和while循環(huán)的相互轉(zhuǎn)換。

6.3.3 do-while循環(huán)

循環(huán)語(yǔ)句可以分為兩大類,即“當(dāng)”型循環(huán)和“直到”型循環(huán)。

for循環(huán)和while循環(huán)屬于“當(dāng)”型循環(huán),循環(huán)執(zhí)行時(shí),首先判斷循環(huán)條件是否成立,當(dāng)條件成立則執(zhí)行循環(huán)體,然后再次判斷循環(huán)條件,條件成立則再次執(zhí)行循環(huán)體,如此反復(fù),當(dāng)循環(huán)條件不成立時(shí)則結(jié)束循環(huán)。

do-while循環(huán)的語(yǔ)法為:

    do
    {
        循環(huán)體
    } while (表達(dá)式);

do-while語(yǔ)句實(shí)現(xiàn)了另一種循環(huán)——“直到”型循環(huán),先無(wú)條件執(zhí)行一次循環(huán)體,然后判斷循環(huán)條件,條件成立則再次執(zhí)行循環(huán)體,然后再次判斷條件,條件成立則第三次執(zhí)行循環(huán)體,依此類推,直到循環(huán)條件不成立結(jié)束循環(huán)。

【范例6-6】 用do-while循環(huán)計(jì)算1+2+3+…+100的和。

⑴ 在Visual Studio 2013中新建控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為“SumByDoWhile”。

⑵ 在program.cs的main方法中輸入以下代碼。

    01  int i,sum;
    02  i=1;                                          //循環(huán)變量賦初始值
    03  sum=0;
    04  do
    05  {                                             //循環(huán)體
    06         sum=sum+i;                             //累加求和
    07         i++;                                   //改變循環(huán)體變量的值,i每次增1
    08  }while(i<=100);
    09 Console.WriteLine("1+2+3+…+100={0}",sum);     //輸出結(jié)果
    10  Console.ReadKey();

6.3.4 foreach循環(huán)

foreach循環(huán)用于遍歷整個(gè)集合或數(shù)組,可以獲取集合中的所有對(duì)象,不需要給出循環(huán)變量和循環(huán)條件,也不需要給循環(huán)變量賦初值和修改循環(huán)變量的值。foreach循環(huán)簡(jiǎn)單易用、代碼簡(jiǎn)潔,在以后的學(xué)習(xí)中會(huì)經(jīng)常用到。語(yǔ)法如下。

    foreach(數(shù)據(jù)類型 局部變量in集合或者數(shù)組)
    {
        循環(huán)體
    }

foreach語(yǔ)句中,需要根據(jù)集合或者數(shù)組的元素類型,定義一個(gè)相同類型的局部變量。foreach語(yǔ)句執(zhí)行時(shí),首先判斷集合中是否存在元素,若存在,則將集合中的第1個(gè)元素賦值給局部變量,執(zhí)行循環(huán)體,然后判斷集合中是否還有剩余元素。若存在,則將下一個(gè)元素賦值給局部變量,再次執(zhí)行循環(huán)體,依此類推,將集合中所有元素逐個(gè)賦值給局部變量,根據(jù)該局部變量的值執(zhí)行循環(huán)體。

例如,

        //定義數(shù)組week,使用foreach循環(huán)遍歷數(shù)組week,輸出數(shù)組中的每個(gè)元素
    01  string[]week={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};   //定義數(shù)組并賦初值
    02  foreach(string s in week)          //遍歷數(shù)組元素,局部變量s的類型與數(shù)組元素類型相同
    03 {
    04         Console.WriteLine(s);    //輸出局部變量s的當(dāng)前值
    05  }

6.4 循環(huán)嵌套

本節(jié)視頻教學(xué)錄像:6分鐘

循環(huán)嵌套是C#程序設(shè)計(jì)的一種高級(jí)技巧。循環(huán)嵌套就是在循環(huán)體中還可以使用循環(huán)語(yǔ)句,前面講過(guò)的幾種循環(huán)都可以互相嵌套。在程序設(shè)計(jì)過(guò)程中使用循環(huán)嵌套需要注意區(qū)分外層循環(huán)和內(nèi)層循環(huán),外層循環(huán)執(zhí)行一次,內(nèi)層循環(huán)執(zhí)行一遍。外層循環(huán)和內(nèi)層循環(huán)的循環(huán)控制要互相獨(dú)立,互不影響。

【范例6-7】 輸出九九乘法表。

⑴ 在Visual Studio 2013中新建控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為“MultiTable”。

⑵ 在program.cs的main方法中輸入以下代碼。

    01  for(int i=1;i<=9;i++)
    02  {
    03         for(int j=1;j<=i;j++)
    04         {
    05                Console.Write("{0}*{1}={2}",i,j,i*j);
    06                if(i!=j)Console.Write(",");
    07         }
    08                Console.WriteLine();
    09  }
    10  Console.ReadKey();

程序輸出結(jié)果如下圖所示。

【范例6-8】 輸出小于100的素?cái)?shù)。一個(gè)大于1的自然數(shù),除了1和它本身外,不能被其他自然數(shù)整除(除0以外)的數(shù)稱為素?cái)?shù)。

⑴ 在Visual Studio 2013中新建控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為“PrimeNumber”。

⑵ 在program.cs的main方法中輸入以下代碼。

    01  Console.WriteLine("小于100之中的素?cái)?shù)有:");      //輸出提示信息
    02  for(int i=2;i<100;i++)                 //外層循環(huán),i從2到100循環(huán)分別判斷i是否是素?cái)?shù)
    03  {
    04         bool isPrime=true;              //定義isPrime變量,標(biāo)志某個(gè)數(shù)是否為素?cái)?shù)
    05         for(int j=2;j<i-1;j++)          //內(nèi)層循環(huán),j從2到i-1循環(huán),看j能否整除i
    06         {
    07                if(i % j==0)                        //如果i能整除以j,說(shuō)明i不是素?cái)?shù)
    08                {
    09                       isPrime=false;             //i不是素?cái)?shù),設(shè)置isPrime=false
    10                       break;                     //跳出內(nèi)層循環(huán),繼續(xù)外層循環(huán)
    11                }
    12         }                                        //內(nèi)層循環(huán)結(jié)束
    13         if(isPrime)                              //i如果是素?cái)?shù)則輸出
    14         {
    15                Console.WriteLine("{0}",i);       //輸出素?cái)?shù)i
    16         }
    17  }                                               //外層循環(huán)結(jié)束
    18  Console.ReadKey();

在上面的代碼中出現(xiàn)了break語(yǔ)句,它的功能是跳出break語(yǔ)句所處的循環(huán),轉(zhuǎn)去執(zhí)行循環(huán)結(jié)構(gòu)后面的語(yǔ)句。類似的,C#中提供了continue語(yǔ)句,continue語(yǔ)句的功能是結(jié)束本次循環(huán),通常配合if語(yǔ)句使用,當(dāng)某個(gè)條件成立則終止本次循環(huán),即忽略循環(huán)體中continue后面的語(yǔ)句,接著進(jìn)入本循環(huán)結(jié)構(gòu)的下一次循環(huán)。

6.5 高手點(diǎn)撥

本節(jié)視頻教學(xué)錄像:4分鐘

6.5.1 循環(huán)變量的使用

循環(huán)變量在循環(huán)結(jié)構(gòu)中的作用至關(guān)重要,循環(huán)變量賦值不當(dāng),程序就無(wú)法正常執(zhí)行,多數(shù)循環(huán)結(jié)構(gòu)程序出錯(cuò)都與循環(huán)變量的錯(cuò)誤使用有關(guān)。要正確使用循環(huán)變量,需要注意以下幾點(diǎn)。

循環(huán)變量的聲明和賦初值要在循環(huán)體之外,for循環(huán)中循環(huán)變量的聲明和賦初值通常通過(guò)for語(yǔ)句后括號(hào)內(nèi)的表達(dá)式1實(shí)現(xiàn)。如果把為循環(huán)變量賦初值的語(yǔ)句放在循環(huán)體首部,則循環(huán)體每次執(zhí)行都將為循環(huán)變量賦初值,有可能出現(xiàn)死循環(huán)。

例如,

    int i;
    while(i<=100)     //while循環(huán),當(dāng)i小于等于100時(shí)循環(huán)
    {
        i=1;                //錯(cuò)誤,每次執(zhí)行循環(huán)體都將為循環(huán)變量賦初值
        …                    //循環(huán)體
        i++;
    }

在循環(huán)體的最后一般要有語(yǔ)句修改循環(huán)變量的值,使循環(huán)條件有可能不成立,從而終止循環(huán)結(jié)構(gòu)的執(zhí)行,for循環(huán)中通常使用for語(yǔ)句后的表達(dá)式3來(lái)修改循環(huán)變量的值。需要注意的是,如果循環(huán)結(jié)構(gòu)在for語(yǔ)句中定義循環(huán)變量,該變量被視為局部變量,當(dāng)循環(huán)執(zhí)行完畢后變量即被釋放,在循環(huán)語(yǔ)句之外再次引用該循環(huán)變量將出錯(cuò)。

例如,

    for(int i=0;i<=100;i++)
    {
        …
    }
    Console.WriteLine(i);     //錯(cuò)誤,循環(huán)變量i已經(jīng)不存在

循環(huán)嵌套時(shí),外層循環(huán)和內(nèi)層循環(huán)的循環(huán)變量是相互獨(dú)立的,必須定義兩個(gè)不同的循環(huán)變量,否則循環(huán)嵌套將無(wú)法按照我們的預(yù)期執(zhí)行。注意,內(nèi)層循環(huán)體中可以引用外層循環(huán)的循環(huán)變量,但不能修改外層循環(huán)變量的值。

例如,

    for(int i=0;i<=10;i++)
    {
        for(int k=0;k<=10;k++)
        {
              Console.WriteLine(i);     //內(nèi)層循環(huán)引用外層循環(huán)的循環(huán)變量
        }
    }

6.5.2 特殊形式的循環(huán)結(jié)構(gòu)

1. 無(wú)條件循環(huán)

需要注意的是,while(true){ }形式的循環(huán)結(jié)構(gòu)也是經(jīng)常使用的,循環(huán)體無(wú)條件執(zhí)行。但在循環(huán)體中通常使用一個(gè)條件語(yǔ)句,當(dāng)某個(gè)條件成立時(shí),使用break語(yǔ)句終止當(dāng)前循環(huán)語(yǔ)句,轉(zhuǎn)去執(zhí)行循環(huán)語(yǔ)句之后的語(yǔ)句。

例如,

    while(true)
    {
    …
        if(條件表達(dá)式)break;
        …
    }

2.提前終止循環(huán)語(yǔ)句或提前終止循環(huán)體的一次執(zhí)行

循環(huán)結(jié)構(gòu)中,需要提前終止循環(huán)語(yǔ)句,這時(shí)通常使用條件語(yǔ)句,當(dāng)某個(gè)條件成立時(shí),使用break語(yǔ)句結(jié)束循環(huán)語(yǔ)句,轉(zhuǎn)去執(zhí)行循環(huán)體之后的語(yǔ)句。此處與無(wú)條件循環(huán)中的情況類似。

某次執(zhí)行循環(huán)體時(shí),需要提前終止循環(huán)體的該次執(zhí)行。這時(shí)通常使用條件語(yǔ)句,當(dāng)某個(gè)條件成立時(shí),使用continue語(yǔ)句結(jié)束循環(huán)體的本次執(zhí)行,轉(zhuǎn)去執(zhí)行表達(dá)式3,修改循環(huán)變量,然后根據(jù)表達(dá)式2的值判斷是否繼續(xù)循環(huán)體的下一次執(zhí)行。

例如,

    for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
    {
        …
        if(條件表達(dá)式)continue;
        …
    }

6.6 實(shí)戰(zhàn)練習(xí)

操作題

1. 按照復(fù)印中心的收費(fèi)規(guī)定,復(fù)印前50張為每張0.5元,以后為每張0.2元。試編寫一段程序,要求輸入復(fù)印張數(shù),然后顯示總價(jià)格。

2. 編寫一段程序,求兩個(gè)正整數(shù)的最大公約數(shù)和最小公倍數(shù)。

主站蜘蛛池模板: 平武县| 吉安县| 玉田县| 新余市| 阿图什市| 贡嘎县| 宁国市| 康定县| 海晏县| 垣曲县| 泗阳县| 封开县| 台东市| 肇州县| 渑池县| 尼玛县| 定兴县| 广水市| 隆化县| 赤峰市| 黎川县| 郧西县| 九寨沟县| 潼关县| 晋城| 长宁区| 博兴县| 营山县| 六枝特区| 深泽县| 敖汉旗| 东乌| 余庆县| 无棣县| 门源| 思南县| 苍南县| 绵竹市| 赣州市| 祁阳县| 白银市|