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

第6章 程序的基本結構

本章視頻教學錄像:38分鐘

一個C#應用程序是由許多語句組合而成的。在C#程序設計中如何組織程序語句,實現程序功能,這是我們需要掌握的基本技能。程序中的語句可以逐條執行,也可以根據某一條件的不同取值選擇執行不同的代碼,或者根據條件重復執行一段代碼,本章介紹的順序結構、分支結構和循環結構就能滿足這些要求。

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

□ 順序結構

□ 分支結構

□ 循環結構

6.1 順序結構

本節視頻教學錄像:2分鐘

順序結構是程序代碼中最基本的結構,簡單地說就是逐條執行程序中的語句,從程序開始執行到程序結束為止。例如,

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

程序中包含4條語句,構成一個順序結構的程序。語句1定義一個double型變量x,語句2定義int型變量y并賦值,語句3定義int型變量z并賦值,語句4根據y、z的值進行運算并將結果賦值給x。

可以看出,順序結構中,每一條語句都需要執行并且只執行一次,語句執行的先后次序與語句在順序結構程序中出現的先后次序一致。

提示

當程序中的語句符合順序結構的特點時,即每條語句都需要執行且只需要執行一次,則可以使用順序結構。

6.2 分支結構

本節視頻教學錄像:12分鐘

與我們日常生活中的許多情況類似,程序設計過程中,經常需要根據條件進行判斷,然后選擇要執行的語句序列。分支結構就是根據條件的不同選擇執行程序中的不同分支,每個分支對應一個語句序列。本節主要介紹實現分支結構的條件語句,有時也稱為選擇語句。

6.2.1 條件語句

條件語句就是對條件進行判斷,根據判斷結果選擇執行不同的分支。C#中提供了多種形式的條件語句,包括if語句、if…else語句和switch語句。

⑴ 單分支結構的if語句。

語法格式如下。

    if(條件表達式)
    {語句序列}

如果條件成立(條件表達式的值為true),就執行條件表達式后面的語句序列中的語句。如果條件不成立(條件表達式的值為false),則跳過語句序列,繼續執行if語句之后的語句。一般情況下,語句序列要用花括號括起來。例如,

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

使用ReadLine()方法從鍵盤輸入成績,調用int.Parse()方法將輸入值轉換為int類型,保存在變量score中。第一個if語句的條件表達式為“score >= 60”,當條件成立,輸出“及格! ”;條件不成立則跳過第一個if語句,轉去執行第二個if語句。第二個if語句的條件表達式為“score < 60”,當條件成立,輸出“不及格! ”;條件不成立則跳過第二個if語句,程序結束。兩個if語句的條件表達式是相互獨立,互不影響的。

提示

if語句中的條件表達式的值應為bool型,表達式的值為true則條件成立,表達式的值為false則條件不成立。

下面的例子進一步說明了if語句的使用。

【范例6-1】 輸入學生成績,輸出學生的成績等級。

⑴ 在Visual Studio 2013中新建控制臺應用程序,項目名稱為“ScoreByIf”。

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

        01  Console.WriteLine("請輸入成績(0-100):");
        02  int score=int.Parse(Console.ReadLine());
    03  if(score>=90)
    04  {
    05         Console.WriteLine("優秀!");
    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();

⑶ 雙分支結構的if…else語句。

語法格式如下。

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

其作用是如果條件表達式值為true,執行if后面的語句序列1;如果條件表達式值為false,執行else后面的語句序列2。

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

對比if語句的例子,可以看出,以上代碼實現了使用一個if…else語句體現兩個if語句的功能。思考一下,什么時候可以這樣做?

⑷ 多分支結構。

if語句實現多分支結構的語法如下。

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

注意,當表達式1的值為true,執行語句序列1,然后if語句的執行結束。只有當表達式1的值為false時,才需要考慮表達式2的值,表達式2的值為true,則執行語句序列2,然后結束if語句。只有當表達式2的值為false,才需要考慮表達式3的值。依此類推,只有表達式1、2、3…n-1的值都為false時,才需要考慮表達式n的值,這時如果表達式n的值為true,則執行語句序列n,然后結束if語句,否則執行語句序列n+1。

【范例6-2】 使用多分支結構實現成績等級評定。

⑴ 在Visual Studio 2013中新建控制臺應用程序,項目名稱為“ScoreByIfelse”。

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

    01  Console.WriteLine("請輸入成績(0-100):");
    02  int score=int.Parse(Console.ReadLine());
    03  if(score>=90)
    04  {
    05         Console.WriteLine("優秀!");
    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();

【范例分析】

使用多分支結構可以讓程序看起來更加簡潔,但是要注意多分支結構中多個條件表達式之間的關系。例如,上面的代碼中要執行條件表達式“score >= 80”后的語句“Console.WriteLine("良好!");”的前提是條件表達式“score >= 90”為false,也就是說,當條件score >= 80 && score < 90成立時才執行語句“Console.WriteLine("良好!");”

6.2.2 switch語句

分支結構也可以使用switch語句來實現,switch語句能夠根據表達式的值來選擇要執行的代碼。if語句只能測試單個條件,如果需要測試多個條件,則需要書寫冗長的代碼。而switch語句能有效地避免冗長的代碼,并能測試多個條件。switch語句的語法如下。

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

switch語句的執行過程是:計算switch語句中表達式的值,再依次與1~n個常量比較,當表達式的值與某個case后面的常量相等時,則執行該case后面的語句,然后執行break語句,跳出switch結構。程序執行時,從匹配常量的相應case處入口,一直執行到break語句或到達switch結構的末尾為止。如果幾個常量都不等于switch中表達式的值,則執行default處的語句。

每個case后面的語句可以是單條語句或空語句,也可以是多條語句,而構成一個程序段。這里的語法上允許有多條語句,因此不必加花括號寫成復合語句的形式。

【范例6-3】 使用switch語句實現成績等級評定。

⑴ 在Visual Studio 2013中新建控制臺應用程序,項目名稱為“ScoreBySwitch”。

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

    01   Console.WriteLine("請輸入成績(0-100):");
    02   int score=int.Parse(Console.ReadLine());
    03   switch(score/10)
    04   {
    05         case 10:
    06         case 9:
    07         Console.WriteLine("優秀!");
    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();

【范例分析】

在這個程序中,從鍵盤上輸入學生成績,存入變量score中,使用score/10作為switch語句的表達式,表達式的值為整型,與case后的常量表達式的值類型相同。當表達式score/10的值與某個case后的常量表達式的值相等時,跳轉到該case結構后的語句序列開始執行,直到switch語句結束或者遇到break語句。可以多種情況共用一個語句序列,如score/10的值為9和10兩種情況,學生成績等級都是“優秀”,case 10后面為空,與case 9共用一個語句序列。這種特性的使用需要特別注意,需要在每個語句序列的最后加上break語句,保證被執行語句序列得到執行后跳轉到switch語句的結束位置。

6.3 循環結構

本節視頻教學錄像:11分鐘

在程序開發中,經常需要反復執行某段代碼。為了避免重復輸入相同代碼,同時提高程序代碼的可讀性,引入了循環結構,需要反復執行的代碼稱為循環體。循環結構使用循環條件控制循環體代碼的執行與否,循環條件中通常使用一個特殊的變量——循環變量,根據循環變量的值來確定循環條件是否成立。C#提供的循環語句有for語句、while語句、do_while語句和foreach語句。

6.3.1 for循環

for循環語句語法為:

    for(表達式1;表達式2;表達式3)
    {
    循環體
    }

for語句的執行過程如下。

① 計算表達式1,為循環變量賦初值。

② 計算表達式2,檢查循環條件,若表達式2的值為true, 則執行一次循環體;若其為false,控制轉出循環結構。

③ 執行完一次循環體后,計算表達式3,對控制變量進行增量或減量操作,再重復第⑵步操作。

提示

for后面括號中的3個表達式之間用分號(“;”)分開。表達式1和表達式3一般為賦值表達式,表達式1為循環控制變量賦初值,表達式3改變循環變量的值。表達式2一般為關系表達式或邏輯表達式,作為控制循環體結束條件,當表達式值為true時,循環繼續;當表達式值為false時,循環停止。

【范例6-4】 用for循環計算1+2+3+…+100的和。

⑴ 在Visual Studio 2013中新建控制臺應用程序,項目名稱為“SumByFor”。

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

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

【范例分析】

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

6.3.2 while循環

while循環的語法為:

    while (表達式)
    {
        循環體
    }

while循環執行的過程是:先計算while后面圓括號內表達式的值,判斷循環條件是否成立。當表達式值為true時,執行循環體,然后再次判斷表達式的值;當表達式的值仍為“true”時,則再次執行循環體語句,重復上述執行過程;當表達式的值為false時則退出循環。

【范例6-5】 用while循環計算1+2+3+…+100的和。

⑴ 在Visual Studio 2013中新建控制臺應用程序,項目名稱為“SumByWhile”。

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

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

提示

while循環中只有一個表達式,相當于for循環的表達式2,即循環條件。為循環變量賦初值需要在while循環之前進行,修改循環變量的值的語句通常放在循環體的最后。按照這一原則,我們可以很方便地實現for循環和while循環的相互轉換。

6.3.3 do-while循環

循環語句可以分為兩大類,即“當”型循環和“直到”型循環。

for循環和while循環屬于“當”型循環,循環執行時,首先判斷循環條件是否成立,當條件成立則執行循環體,然后再次判斷循環條件,條件成立則再次執行循環體,如此反復,當循環條件不成立時則結束循環。

do-while循環的語法為:

    do
    {
        循環體
    } while (表達式);

do-while語句實現了另一種循環——“直到”型循環,先無條件執行一次循環體,然后判斷循環條件,條件成立則再次執行循環體,然后再次判斷條件,條件成立則第三次執行循環體,依此類推,直到循環條件不成立結束循環。

【范例6-6】 用do-while循環計算1+2+3+…+100的和。

⑴ 在Visual Studio 2013中新建控制臺應用程序,項目名稱為“SumByDoWhile”。

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

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

6.3.4 foreach循環

foreach循環用于遍歷整個集合或數組,可以獲取集合中的所有對象,不需要給出循環變量和循環條件,也不需要給循環變量賦初值和修改循環變量的值。foreach循環簡單易用、代碼簡潔,在以后的學習中會經常用到。語法如下。

    foreach(數據類型 局部變量in集合或者數組)
    {
        循環體
    }

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

例如,

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

6.4 循環嵌套

本節視頻教學錄像:6分鐘

循環嵌套是C#程序設計的一種高級技巧。循環嵌套就是在循環體中還可以使用循環語句,前面講過的幾種循環都可以互相嵌套。在程序設計過程中使用循環嵌套需要注意區分外層循環和內層循環,外層循環執行一次,內層循環執行一遍。外層循環和內層循環的循環控制要互相獨立,互不影響。

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

⑴ 在Visual Studio 2013中新建控制臺應用程序,項目名稱為“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();

程序輸出結果如下圖所示。

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

⑴ 在Visual Studio 2013中新建控制臺應用程序,項目名稱為“PrimeNumber”。

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

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

在上面的代碼中出現了break語句,它的功能是跳出break語句所處的循環,轉去執行循環結構后面的語句。類似的,C#中提供了continue語句,continue語句的功能是結束本次循環,通常配合if語句使用,當某個條件成立則終止本次循環,即忽略循環體中continue后面的語句,接著進入本循環結構的下一次循環。

6.5 高手點撥

本節視頻教學錄像:4分鐘

6.5.1 循環變量的使用

循環變量在循環結構中的作用至關重要,循環變量賦值不當,程序就無法正常執行,多數循環結構程序出錯都與循環變量的錯誤使用有關。要正確使用循環變量,需要注意以下幾點。

循環變量的聲明和賦初值要在循環體之外,for循環中循環變量的聲明和賦初值通常通過for語句后括號內的表達式1實現。如果把為循環變量賦初值的語句放在循環體首部,則循環體每次執行都將為循環變量賦初值,有可能出現死循環。

例如,

    int i;
    while(i<=100)     //while循環,當i小于等于100時循環
    {
        i=1;                //錯誤,每次執行循環體都將為循環變量賦初值
        …                    //循環體
        i++;
    }

在循環體的最后一般要有語句修改循環變量的值,使循環條件有可能不成立,從而終止循環結構的執行,for循環中通常使用for語句后的表達式3來修改循環變量的值。需要注意的是,如果循環結構在for語句中定義循環變量,該變量被視為局部變量,當循環執行完畢后變量即被釋放,在循環語句之外再次引用該循環變量將出錯。

例如,

    for(int i=0;i<=100;i++)
    {
        …
    }
    Console.WriteLine(i);     //錯誤,循環變量i已經不存在

循環嵌套時,外層循環和內層循環的循環變量是相互獨立的,必須定義兩個不同的循環變量,否則循環嵌套將無法按照我們的預期執行。注意,內層循環體中可以引用外層循環的循環變量,但不能修改外層循環變量的值。

例如,

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

6.5.2 特殊形式的循環結構

1. 無條件循環

需要注意的是,while(true){ }形式的循環結構也是經常使用的,循環體無條件執行。但在循環體中通常使用一個條件語句,當某個條件成立時,使用break語句終止當前循環語句,轉去執行循環語句之后的語句。

例如,

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

2.提前終止循環語句或提前終止循環體的一次執行

循環結構中,需要提前終止循環語句,這時通常使用條件語句,當某個條件成立時,使用break語句結束循環語句,轉去執行循環體之后的語句。此處與無條件循環中的情況類似。

某次執行循環體時,需要提前終止循環體的該次執行。這時通常使用條件語句,當某個條件成立時,使用continue語句結束循環體的本次執行,轉去執行表達式3,修改循環變量,然后根據表達式2的值判斷是否繼續循環體的下一次執行。

例如,

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

6.6 實戰練習

操作題

1. 按照復印中心的收費規定,復印前50張為每張0.5元,以后為每張0.2元。試編寫一段程序,要求輸入復印張數,然后顯示總價格。

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

主站蜘蛛池模板: 乐清市| 怀来县| 通州市| 丹寨县| 彰化县| 桓台县| 鹤峰县| 扶绥县| 朔州市| 蓬溪县| 宝应县| 武隆县| 聊城市| 锦州市| 南开区| 三穗县| 岳阳县| 五峰| 治县。| 阿克陶县| 玛曲县| 宜兴市| 治县。| 秭归县| 乐业县| 巴林左旗| 芒康县| 颍上县| 衡东县| 石河子市| 眉山市| 隆昌县| 邵东县| 天门市| 老河口市| 琼海市| 鸡东县| 南通市| 大姚县| 石狮市| 抚宁县|