C# 流程語句分為:順序結構,選擇結構,迴圈結構。 1. 順序結構 順序結構指的是程式一步步向下執行。 int a =10; int b =a; a++; 2. 選擇結構 C# 提供以下類型的選擇語句。 聲明描述 if聲明 一個if語句包含一個布爾表達式後跟一個或多個語句。 if...else聲明 ...
1. 順序結構
順序結構指的是程式一步步向下執行。
int a =10; int b =a; a++;
2. 選擇結構
C# 提供以下類型的選擇語句。
聲明 | 描述 |
---|---|
if聲明 | 一個if語句包含一個布爾表達式後跟一個或多個語句。 |
if...else聲明 | 一個if語句可以跟著一個可選的else語句,當布爾表達式是假的,其執行。 |
嵌套if語句 | 您可以在另一個if or else if語句中使用一個if or else if語句。 |
switch語句 | switch語句允許一個變數來針對值的列表平等進行測試。 |
嵌套的switch語句 | 您可以在另一個switch語句中使用一個switch語句。 |
if ... else
if .. else 語法
if(bool 表達式) { ... } else if(bool 表達式) // 可選的 { ... } else // 可選的 { ... }
例1:
int score =90; if(score >= 60) { Console.WriteLine("及格"); } else { Console.WriteLine("不及格"); }
例2:
static void Main(string[] args) { int a = 90; Console.WriteLine(GetGrade(a)); } public static string GetGrade(int score) { if (score>=60) { return "及格"; } else { return "不及格"; } } // 簡寫 public static string GetGrade(int score) { if (score>=60) { return "及格"; } return "不及格"; }
例3:
static void Main(string[] args) { int a = 90; Console.WriteLine(GetGrade(a)); } public static string GetGrade(int score) { if (score<60) { return "不及格"; } else if(score>=60 && score<=70) { return "一般"; } else if (score > 70 && score <= 80) { return "良好"; } else { return "優秀"; } }
如果if 或者 else 後面 只有一條語句,則 “{}” 可以省略,但一般不建議省略
if (score<60) return "不及格";
? : 運算符
我們已經在前面的章節中講解了 條件運算符 ? :,可以用來替代 if...else 語句。它的一般形式如下:
Exp1 ? Exp2 : Exp3;
其中,Exp1、Exp2 和 Exp3 是表達式。請註意,冒號的使用和位置。
? 表達式的值是由 Exp1 決定的。如果 Exp1 為真,則計算 Exp2 的值,結果即為整個 ? 表達式的值。如果 Exp1 為假,則計算 Exp3 的值,結果即為整個 ? 表達式的值。
switch...case
一個 switch 語句允許測試一個變數等於多個值時的情況。每個值稱為一個 case,且被測試的變數會對每個 switch case 進行檢查。
C# 中 switch 語句的語法:
switch(expression){ case constant-expression : statement(s); break; case constant-expression : statement(s); break; /* 您可以有任意數量的 case 語句 */ default : /* 可選的 */ statement(s); break; }
switch 語句必須遵循下麵的規則:
-
switch 語句中的 expression 必須是一個整型或枚舉類型,或者是一個 class 類型,其中 class 有一個單一的轉換函數將其轉換為整型或枚舉類型。
-
在一個 switch 中可以有任意數量的 case 語句。每個 case 後跟一個要比較的值和一個冒號。
-
case 的 constant-expression 必須與 switch 中的變數具有相同的數據類型,且必須是一個常量。
-
當被測試的變數等於 case 中的常量時,case 後跟的語句將被執行,直到遇到 break 語句為止。
-
當遇到 break 語句時,switch 終止,控制流將跳轉到 switch 語句後的下一行。
-
不是每一個 case 都需要包含 break。如果 case 語句為空,則可以不包含 break,控制流將會 繼續 後續的 case,直到遇到 break 為止。
-
C# 不允許從一個 case 部分繼續執行到下一個 case 部分。如果 case 語句中有已經執行,則必須包含 break 或其他跳轉語句。
-
一個 switch 語句可以有一個可選的 default 語句,在 switch 的結尾。default 語句用於在上面所有 case 都不為 true 時執行的一個任務。default 也需要包含 break 語句,這是一個良好的習慣。
-
C# 不支持從一個 case 標簽顯式貫穿到另一個 case 標簽。如果要使 C# 支持從一個 case 標簽顯式貫穿到另一個 case 標簽,可以使用 goto 一個 switch-case 或 goto default。
實例
以下實例用於判斷當前是星期幾:
static void Main(string[] args) { int day = 4; switch (day) // 數字,字元串,枚舉 { case 1: // 只能寫常量 Console.WriteLine("Monday"); break; case 2: Console.WriteLine("Tuesday"); break; case 3: Console.WriteLine("Wednesday"); break; case 4: Console.WriteLine("Thursday"); break; case 5: Console.WriteLine("Friday"); break; case 6: Console.WriteLine("Saturday"); break; case 7: Console.WriteLine("Sunday"); break; default: Console.WriteLine("Sunday"); break; } }
C# 8.0 可將switch 進行優化:
static void Main(string[] args) { int day =4; string week = day switch { 1=>"Monday", 2=>"Tuesday", 3=>"Wednesday", 4=>"Thursday", 5=>"Friday", 6=>"Saturday", 7=>"Sunday", _=>"Sunday" // 預設 }; Console.WriteLine(week); }
執行結果根據當天日期有所不同,我這裡執行這天的結果為:
Thursday
C# 9.0 藉助於模式匹配
// c# 9.0 : 模式匹配,結合switch int score = 88; string result = score switch { >0 and <60 => "不及格", >=60 and <=69 => "合格", >=70 and <=79 => "中等", >=80 and <=89 => "良", _ => "優秀" }; Console.WriteLine(result);
以下實例判斷學生的成績,包含了 default 語句:
static void Main(string[] args) { /* 局部變數定義 */ char grade = 'B'; switch (grade) { case 'A': Console.WriteLine("很棒!"); break; case 'B': case 'C': Console.WriteLine("做得好"); break; case 'D': Console.WriteLine("您通過了"); break; case 'F': Console.WriteLine("最好再試一下"); break; default: Console.WriteLine("無效的成績"); break; } Console.WriteLine("您的成績是 {0}", grade); Console.ReadLine(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
做得好 您的成績是 B
if 與 switch 的區別
一:從“優缺點”分析 if…else 優點:使用靈活,代碼空間小 ;
缺點:效率低,因為 if else 必須遍歷所有的可能值;
switch…case 優點:代碼結構清晰,效率高;
C# 9.0 以後,已經完全可以代替if else 結構了。
強化練習
-
業務場景:消費者在圖書商城購買圖書,下單後需要在支付頁面顯示訂單優惠後的價格。具體優惠規則如下:
規則編號 | 規則名稱 | 描述 |
---|---|---|
1 | 規則一 | 所購圖書總價在100元以下的沒有優惠 |
2 | 規則二 | 所購圖書總價在100到200元的優惠20元 |
3 | 規則三 | 所購圖書總價在200到300元的優惠50元 |
4 | 規則四 | 所購圖書總價在300元以上的優惠100元 |
現在需要根據上面的規則計算優惠後的價格。
// 表示購物金額 int money = 666; // 所購圖書總價在100元以下的沒有優惠 if (money < 100) { money = money; } else if (money >= 100 && money <= 200) { //所購圖書總價在100到200元的優惠20元 money -= 20; } else if (money>200 && money<=300) { money -= 50; } else { money -= 100; } Console.WriteLine(money); // switch 精簡代碼
// ...大家自行補上
3. 迴圈結構
1. 為什麼需要迴圈結構
例如:求1-10之間的和
int sum = 1+2+3+4+5+6+7+8+9+10;
如是讓你:求 1-1000之間的和。你該怎麼辦?此時就需要用到迴圈結構來解決這個問題。
2. 什麼是迴圈結構
有的時候,可能需要多次執行同一塊代碼。一般情況下,語句是順序執行的:函數中的第一個語句先執行,接著是第二個語句,依此類推。
編程語言提供了允許更為複雜的執行路徑的多種控制結構。
迴圈語句允許我們多次執行一個語句或語句組,下麵是大多數編程語言中迴圈語句的一般形式:
3. 迴圈類型
C# 提供了以下幾種迴圈類型。點擊鏈接查看每個類型的細節。
迴圈類型 | 描述 |
---|---|
while 迴圈 | 當給定條件為真時,重覆語句或語句組。它會在執行迴圈主體之前測試條件。 |
for | 多次執行一個語句序列,簡化管理迴圈變數的代碼。 |
do...while 迴圈 | 除了它是在迴圈主體結尾測試條件外,其他與 while 語句類似。 |
嵌套迴圈 | 您可以在 while、for 或 do..while 迴圈內使用一個或多個迴圈。 |
foreach 迴圈 | 對一個集合或者數組進行迴圈遍歷 |
4. 迴圈控制語句
迴圈控制語句更改執行的正常序列。當執行離開一個範圍時,所有在該範圍中創建的自動對象都會被銷毀。
C# 提供了下列的控制語句。點擊鏈接查看每個語句的細節。
控制語句 | 描述 |
---|---|
break 語句 | 終止 loop 或 switch 語句,程式流將繼續執行緊接著 loop 或 switch 的下一條語句。 |
continue 語句 | 引起迴圈跳過主體的剩餘部分,立即重新開始測試條件。 |
5. while 迴圈
只要給定的條件為真,C# 中的 while 迴圈語句會重覆執行一個目標語句。
語法
C# 中 while 迴圈的語法:
while(condition) { statement(s); }
在這裡,statement(s) 可以是一個單獨的語句,也可以是幾個語句組成的代碼塊。condition 可以是任意的表達式,當為任意非零值時都為真。當條件為真時執行迴圈。
當條件為假時,程式流將繼續執行緊接著迴圈的下一條語句。
在這裡,while 迴圈的關鍵點是迴圈可能一次都不會執行。當條件被測試且結果為假時,會跳過迴圈主體,直接執行緊接著 while 迴圈的下一條語句。
static void Main(string[] args) { /* 局部變數定義 */ int a = 10; /* while 迴圈執行 */ while (a < 20) { Console.WriteLine("a 的值: {0}", a); a++; } Console.ReadLine(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
a 的值: 10 a 的值: 11 a 的值: 12 a 的值: 13 a 的值: 14 a 的值: 15 a 的值: 16 a 的值: 17 a 的值: 18 a 的值: 19
6. for 迴圈
一個 for 迴圈是一個允許您編寫一個執行特定次數的迴圈的重覆控制結構。
C# 中 for 迴圈的語法:
for ( init; condition; increment ) { statement(s); }
下麵是 for 迴圈的控制流:
-
init 會首先被執行,且只會執行一次。這一步允許您聲明並初始化任何迴圈控制變數。您也可以不在這裡寫任何語句,只要有一個分號出現即可。
-
接下來,會判斷 condition。如果為真,則執行迴圈主體。如果為假,則不執行迴圈主體,且控制流會跳轉到緊接著 for 迴圈的下一條語句。
-
在執行完 for 迴圈主體後,控制流會跳回上面的 increment 語句。該語句允許您更新迴圈控制變數。該語句可以留空,只要在條件後有一個分號出現即可。
-
條件再次被判斷。如果為真,則執行迴圈,這個過程會不斷重覆(迴圈主體,然後增加步值,再然後重新判斷條件)。在條件變為假時,for 迴圈終止。
實例:求1-100的和
static void Main(string[] args) { int sum =0; /* for 迴圈執行 */ for (int a = 1; a <= 100; a = a + 1) { sum+=a;// sum = sum +a; } Console.WriteLine(sum) ; Console.ReadLine(); }
輸出結果:
5050
7. do...while 迴圈
不像 for 和 while 迴圈,它們是在迴圈頭部測試迴圈條件。do...while 迴圈是在迴圈的尾部檢查它的條件。
do...while 迴圈與 while 迴圈類似,但是 do...while 迴圈會確保至少執行一次迴圈。
C# 中 do...while 迴圈的語法:
do { statement(s); }while( condition );
請註意,條件表達式出現在迴圈的尾部,所以迴圈中的 statement(s) 會在條件被測試之前至少執行一次。
如果條件為真,控制流會跳轉回上面的 do,然後重新執行迴圈中的 statement(s)。這個過程會不斷重覆,直到給定條件變為假為止。
流程圖
static void Main(string[] args) { /* 局部變數定義 */ int a = 10; /* do 迴圈執行 */ do { Console.WriteLine("a 的值: {0}", a); a = a + 1; } while (a < 20); Console.ReadLine(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
a 的值: 10 a 的值: 11 a 的值: 12 a 的值: 13 a 的值: 14 a 的值: 15 a 的值: 16 a 的值: 17 a 的值: 18 a 的值: 19
8. 迴圈控制語句
迴圈控制語句更改執行的正常序列。當執行離開一個範圍時,所有在該範圍中創建的自動對象都會被銷毀。
C# 提供了下列的控制語句。點擊鏈接查看每個語句的細節。
控制語句 | 描述 |
---|---|
break 語句 | 終止 loop 或 switch 語句,程式流將繼續執行緊接著 loop 或 switch 的下一條語句。 |
continue 語句 | 引起迴圈跳過主體的剩餘部分,立即重新開始測試條件。 |
break
C# 中 break 語句有以下兩種用法:
-
當 break 語句出現在一個迴圈內時,迴圈會立即終止,且程式流將繼續執行緊接著迴圈的下一條語句。
-
它可用於終止 switch 語句中的一個 case。
如果您使用的是嵌套迴圈(即一個迴圈內嵌套另一個迴圈),break 語句會停止執行最內層的迴圈,然後開始執行該塊之後的下一行代碼。
實例
static void Main(string[] args) { /* 局部變數定義 */ int a = 10; /* while 迴圈執行 */ while (a < 20) { Console.WriteLine("a 的值: {0}", a); a++; if (a > 15) { /* 使用 break 語句終止 loop */ break; } } Console.ReadLine(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
a 的值: 10 a 的值: 11 a 的值: 12 a 的值: 13 a 的值: 14 a 的值: 15
continue
C# 中的 continue 語句有點像 break 語句。但它不是強迫終止,continue 會跳過當前迴圈中的代碼,強迫開始下一次迴圈。
對於 for 迴圈,continue 語句會導致執行條件測試和迴圈增量部分。對於 while 和 do...while 迴圈,continue 語句會導致程式控制回到條件測試上。
static void Main(string[] args) { /* 局部變數定義 */ int a = 10; /* do 迴圈執行 */ do { if (a == 15) { /* 跳過迭代 */ a = a + 1; continue; } Console.WriteLine("a 的值: {0}", a); a++; } while (a < 20); Console.ReadLine(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
a 的值: 10 a 的值: 11 a 的值: 12 a 的值: 13 a 的值: 14 a 的值: 16 a 的值: 17 a 的值: 18 a 的值: 19
9. 嵌套迴圈
C# 允許在一個迴圈內使用另一個迴圈,下麵演示幾個實例來說明這個概念。
語法
C# 中 嵌套 for 迴圈 語句的語法:
for ( init; condition; increment ) { for ( init; condition; increment ) { statement(s); } statement(s); }
C# 中 嵌套 while 迴圈 語句的語法:
while(condition) { while(condition) { statement(s); } statement(s); }
C# 中 嵌套 do...while 迴圈 語句的語法:
do { statement(s); do { statement(s); }while( condition ); }while( condition );
關於嵌套迴圈有一點值得註意,您可以在任何類型的迴圈內嵌套其他任何類型的迴圈。比如,一個 for 迴圈可以嵌套在一個 while 迴圈內,反之亦然。
實例:列印9 * 9乘法表
for (int i = 1; i < 10; i++) { for (int j = i; j < 10; j++) // j=i,可以避免 1* 9 和 9 * 1 這種重覆情況 { Console.WriteLine($"{i} * {j} = {i * j}"); } }
優化輸出, 列印三次之後才換行:
int index = 0; for (int i = 1; i < 10; i++) { for (int j = i; j < 10; j++) { if ((index++) %3 ==0) { Console.WriteLine("\n");// 換行 } Console.Write($"{i} * {j} = {i*j}\t"); } }
輸出結果:
1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 1 * 4 = 4 1 * 5 = 5 1 * 6 = 6 1 * 7 = 7 1 * 8 = 8 1 * 9 = 9 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 7 = 21 3 * 8 = 24 3 * 9 = 27 4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 7 = 28 4 * 8 = 32 4 * 9 = 36 5 * 5 = 25 5 * 6 = 30 5 * 7 = 35 5 * 8 = 40 5 * 9 = 45 6 * 6 = 36 6 * 7 = 42 6 * 8 = 48 6 * 9 = 54 7 * 7 = 49 7 * 8 = 56 7 * 9 = 63 8 * 8 = 64 8 * 9 = 72 9 * 9 = 81
10. 無限迴圈(死迴圈)
如果條件永遠不為假,則迴圈將變成無限迴圈。for 迴圈在傳統意義上可用於實現無限迴圈。由於構成迴圈的三個表達式中任何一個都不是必需的,您可以將某些條件表達式留空來構成一個無限迴圈。
static void Main(string[] args) { for (; ; ) { Console.WriteLine("Hey! I am Trapped"); }