- C#從入門到精通(第2版)
- 龍馬高新教育策劃 國家863中部軟件孵化器編著
- 644字
- 2019-01-02 05:29:09
第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. 編寫一段程序,求兩個正整數的最大公約數和最小公倍數。