Views: 36
此篇會把常用的控制程式執行順序教完,預計有
- if ..else 判斷
- inline if ,行內if
- switch case 也是判斷
- array 陣列
- List 也是陣列
- for迴圈
- foreach迴圈
- while 迴圈
- do while迴圈
布林與布林運算子
布林代數 WIKI
布林運算C# 微軟說明
運算子 | 寫法 |
大於 | > |
小於 | < |
大於等於 | >= |
小於等於 | <= |
等於 | == |
不等於 | != <> |
反向 | ! |
AND (條件都成立) | & && |
OR (條件只要一邊成立就可) | ||| |
程式語言中,所有的判斷都是靠布林運算在進行,結果只有通過true或不通過false,簡單的說非黑及白。
這邊先簡單看一下,到時候我們if會一起學,先有個印象就好。布林運算在本科中是一門稱為數位邏輯的課程,一學期兩學分,這邊我們只有簡單的帶過。
if 判斷式
if(條件)
{
//條件成立執行這邊
}
else{
//條件不成立執行這邊
}
範例
int score = 90;
if(score >= 80)
{
Console.WriteLine("及格");
}else
{
Console.WriteLine("不及格,加油好嗎。");
}
if省略else
if(條件)
{
//條件成立時執行
}
這個作法很常用喔。
範例 a b c 找出最大值與最小值
int a = 50;
int b = 90;
int c = 40;
// 找出最大值
int max = a;
if (b > max)
{
max = b;
}
if (c > max)
{
max = c;
}
// 找出最小值
int min = a;
if (b < min)
{
min = b;
}
if (c < min)
{
min = c;
}
Console.WriteLine($"最大值: {max}");
Console.WriteLine($"最小值: {min}");
這個題目我在面試時候有遇過,多數是找最大值就好。
省略大跨號{}
if(條件)
//這邊只能放一行,條件成立時執行
範例
bool open = false;
//其他程式碼
//...
if(open == true)
door.Open();
//其他程式碼
注意,這樣寫的時候,下面那行要進行縮排(按tab 空四格),這是程式設計界約定成俗的作法。
不過有些公司文化蠻反對這種寫法
巢狀if (nested if) 或稱多層 if
盡量別用超過三層
if(條件1)
{
if(條件2)
{
//條件2成立執行這邊
if(條件3){
//條件3成立執行這邊
}else{
//條件3不成立執行這邊
}
}
else{
//條件2不成立執行這邊
}
}
else{
//條件1不成立執行這邊
}
(⚠️這樣寫實際上很難維護⚠️)
範例
int score = 90;
if(score > 80)
{
Console.WriteLine("及格");
}
else
{
if(score > 60){
Console.WriteLine("不及格,加油好嗎。");
}
else
{
Console.WriteLine("算了,沒救了。");
}
}
else if
用法
if(條件1)
{
//條件1成立執行的程式
}else if(條件2)
{
//前面的條件不成立,但條件2成立執行的程式
}else if (條件3)
{
//前面的條件不成立,但條件3成立執行的程式
}else{
//前面條件都不成立時執行的程式,這個else也可以省略
}
說明:就是用在前次判斷不成立時,就會依序找下一個else if,
範例
int score = 90;
if(score > 80)
{
//分數>80會執行
Console.WriteLine("及格");
}else if(score > 60)
{
// 60 < 分數 > 80
Console.WriteLine("不及格邊緣。");
}else if(score > 40)
// 40 < 分數 > 60
Console.WriteLine("算了,沒救了。");
}else{
//分數小於等於40
Console.WriteLine("是在hello");
}
布林值判斷
這邊開始把之前的布林判斷加入,主要講解後面幾個 !(NOT) &&(AND) ||(OR)
複習一下
!
,NOT運算 ,反相。&&
,AND運算,及,兩者同時成立為True。||
,OR運算,或,兩者只要一邊成立為True。
註:工程師通常這幾個詞都直接念英文。
&
跟 &&
的差別,&會對左右兩邊的進行求值,而&&會先對左邊的,如果左邊是True才對右邊的繼續求值,在多數時候可以減少運算次數,所以會直接使用&&
範例
假設
- 男生存款>3000萬,天菜,快點跟我結婚。
- 男生存款介於2000萬-3000萬,可以交往看看。
- 男生存款介於2000萬-3000萬,身高>180,快點跟我結婚。
- 其他,保持聯絡
這邊其實要先整理一下邏輯如下,我們要使用else if來解。
- 男生存款>=3000萬,天菜,快點跟我結婚。
- 男生存款>=2000萬 + 身高>180,快點跟我結婚。
- 上面都不成立時,當男生存款>=2000萬,可以交往看看。
- 其他,保持聯絡
//個人條件設定
int high = 180;
int money = 1000 * 10000;
if ( money >= (3000 * 10000) )
{
//存款>=3000萬
Console.WriteLine("天菜快跟我結婚");
}
else if(money >= (2000 * 10000) && (high >= 180)){
Console.WriteLine("天菜快跟我結婚");
}
else if(money >= (2000 * 10000))
{
//當男生存款>=2000萬
Console.WriteLine("可以交往看看");
}
else
{
//不考慮交往
Console.WriteLine("保持聯絡");
}
inline if
這是以前程式設計就有的神奇寫法,用再簡化if的寫法。
變數 = 條件 ? 條件成立的值 : 條件不成立的值 ;
等同於
if(條件)
{
變數 = 條件成立的值;
}
else
{
變數 = 條件不成立的值;
}
範例 判斷分數是否及格
int score = 90 ;
string result = score > 60 ? "及格" : "不及格" ;
Console.WriteLine( $"成績判定結果: {result } ") ;
一開始可能會覺得很難讀,不過這個寫法程式寫久了就會很常用。
範例 判斷基數偶數
int number = 3 ;
string result = (number % 2) == 1 ? "奇數" : "偶數" ;
Console.WriteLine($"數字{number} 為{result}") ;
更多的inline if ,使用它模擬switch或elseif
inline if可以弄成連續多個條件比較
結果 = 條件1 ? 條件1成立 :
條件2 ? 條件2成立 :
條件3 ? 條件3成立 :
條件4 ? 條件4成立 :
......
:都不成立
範例 分數等級判斷
string result = score > 90 ? "A" :
score > 80 ? "B" :
score > 60 ? "C" :
"D"
Switch Case
這個很像else if ,但參考的條件比較嚴格
我自己其實比較少用switch,通常要用的時候才會查一下。
一般用法
switch (變數)
{
case 第一個條件:
//做某件事
break;
case 第二個條件:
//做某件事
break;
case 第三個條件:
//做某件事;
break;
default:
//都不成立時候要做
break;
}
⚠️注意,每個case後都要加上break; ,代表這個case要執行的程式碼結束。⚠️
範例:
switch (garde)
{
case "A":
Console.WriteLine("過於優秀") ;
break;
case "B":
Console.WriteLine("尚可") ;
break;
case "C":
Console.WriteLine("勉勉強強") ;
break;
default:
Console.WriteLine("重修") ;
break;
}
數值範圍的用法範例
int score = 90;
string grade;
switch (score)
{
case int n when (n >= 90):
grade = "A";
break;
case int n when (n >= 70):
grade= "B";
break;
case int n when (n >= 60):
grade = "C";
break;
default:
grade = "D";
break;
}
Console.WriteLine($"Score: {score} , Grade: {grade}");
Console.ReadKey();
Array陣列
如果要在電腦中輸入很多相同的資料,例如全班的分數,就會使用陣列來做。
型別 變數名稱 = new 型別[長度];
// 定義一個陣列
int[] array1 = new int[5];
// 定義陣列 加上初始值
int[] array2 = [1, 2, 3, 4, 5, 6];
// 定義二維陣列
int[,] multiDimensionalArray1 = new int[2, 3];
// 定義二維陣列,並加上初始值
int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } };
// 宣告鋸齒陣列
int[][] jaggedArray = new int[6][];
// 定義鋸齒陣列0;
jaggedArray[0] = [1, 2, 3, 4];
- 陣列的位置稱為索引(Index)
- 陣列索引從0開始。
- 陣列有幾個位置稱為陣列長度,取得陣列長度寫法是 numbers.Length();
- 讀寫超出陣列索引範圍的程式碼會導致程式掛掉。
C# 宣告陣列
型別 變數名稱 = new 型別[長度];
範例
int[] numbers = new int[5]; // 建立一個數字Array,長度為6
string[] names = new name[8]; //建立一個字串array,長度為9
//初始值
int [] numbers = new int[]{3,6,9,7,2}; //建立一個陣列int[4]
//定義一個星期
string[] weekDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
Console.WriteLine(weekDays[0]);
Console.WriteLine(weekDays[1]);
Console.WriteLine(weekDays[2]);
Console.WriteLine(weekDays[3]);
Console.WriteLine(weekDays[4]);
Console.WriteLine(weekDays[5]);
Console.WriteLine(weekDays[6]);
C#陣列操作 存入值
陣列名稱[索引] = 值;
int[] numbers = new int[5];
numbers[0] = 9999; //存入999
C# 陣列操作 取值
變數 = 陣列名稱[索引];
int [] numbers = new int[]{3,6,9,7,2}; //建立一個陣列int[4]
int first;
first = numbers[0];
Console.WriteLine($"First of numbers = {first }");
複製陣列 Array.Copy
官方說明 Array.Copy Method (System) | Microsoft Learn
int[] originalArray = new int[5] { 1, 2, 3, 4, 5 };
// 創建一個新陣列,其大小為5
int[] newArray = new int[5];
// 使用Array.Copy來複製元素
Array.Copy(originalArray, newArray, originalArray.Length);
增加陣列大小
陣列大小一旦定義好是無法變更的,所以通常做法是定義一個新的,然後複製原本的過去。
int[] originalArray = new int[5] { 1, 2, 3, 4, 5 };
// 創建一個新陣列,其大小為10
int[] newArray = new int[10];
// 使用Array.Copy來複製元素
Array.Copy(originalArray, newArray, originalArray.Length);
// 現在newArray包含舊陣列的元素並且大小為10
這個大概知道就好,要用的時候再google作法就好。
尋找陣列內的值
通常有三種方法
- 用For迴圈
- 用IndexlOf
- 用Linq
通常用IndexlOf或Linq,看情況,這邊先教IndexOf
使用 IndexOf
注意,這個只能完全比對。
寫法
結果 = Array.IndexOf(陣列,要找的值);
說明: 如果有找到,會回傳所在的Index,如果沒找到回傳-1
int[] array = { 1, 2, 3, 4, 5 };
int valueToFind = 3;
int index = Array.IndexOf(array, valueToFind);
if (index != -1)
{
Console.WriteLine($"找到了,位置 {index}");
}
else
{
Console.WriteLine("找不到");
}
// 宣告並初始化字串陣列
string[] array = { "apple", "banana", "cherry", "date", "fig", "grape" };
// 要搜尋的字串,這邊要跟陣列內的值一模一樣才找的到。
string valueToFind = "cherry";
// 使用 Array.IndexOf 方法搜尋字串
int index = Array.IndexOf(array, valueToFind);
// 檢查搜尋結果
if (index != -1)
{
Console.WriteLine($"找到了,位置 {index}");
}
else
{
Console.WriteLine("找不到");
}
取得陣列長度
陣列名稱.Length
//陣列
string[] array = { "apple", "banana", "cherry", "date", "fig", "grape" };
int arrLength = array.Length;
清除陣列內容
直接初始化就好
//陣列
string[] array = { "apple", "banana", "cherry", "date", "fig", "grape" };
// 所有元素都會被設置為預設值空字串
array = new int[array.Length];
排序sort
電腦的排序分兩種
- asc 小到大
- desc 大到小
//asc 由小排到大
Array.Sort(目標陣列);
//desc 由大排到小
Array.Sort(目標陣列, (x, y) => y.CompareTo(x));
LIST
LIST比起Array靈活非常多,多數工程師比較喜歡用List這個物件。
大概有幾個理由,List可以新增、插入、刪除資料,Array對長度作變動都需要重建Array,但List不能多為度,通常會使用Array是已知資料大小的狀況下,這樣效能會優於List,不過List實在太香了(?)。
List常用的方法
- Add() 新增
- Remove() 移除特定對象
- AddRang() 把另一個List或Array加入這個List
- Sum()加總
- Avg()平均
- Count算有幾個
- Any() List裡面有東西會回傳true
- Where(n=>n == “值”)
Array轉List
// 宣告並初始化一個整數陣列
int[] array = { 1, 2, 3, 4, 5 };
// 使用 List<T> 的建構函數將陣列轉換為列表
List<int> list = new List<int>(array);
//另一個方法(我比較常用)
List<int> list = array.ToList();
建立List與Add() 加入值
List<資料型態> myList = new List<資料型態>();
//或
List<資料型態> myList = new List<資料型態>(){初始值...};
//加入值
myList.Add(資料);
//取值
變數 = myList[索引];
範例
List<string> students = new List<string>();
//加入
students.Add("Marry");
students.Add("Jake");
students.Add("Harry");
string name;
//取值
name = students[0];
移除特定值 Remove
List<string> students = new List<string> { "孔子", 老子", "莊子", "老黃", "蘇媽" };
// 要移除的學生名稱
string studentToRemove = "孔子";
// 移除特定的學生名稱
// 用一個旗標來存是否有成功移除,如果找不到removed = false
bool removed = students.Remove(studentToRemove);
if (removed)
{
Console.WriteLine($"學生 '{studentToRemove}' 已經被退學");
}
else
{
Console.WriteLine($"學生 '{studentToRemove}' 查無此人");
}
取得陣列大小 Count
List<string> students = new List<string> { "孔子", 老子", "莊子", "老黃", "蘇媽" };
int count = students.Count;
Console.WriteLine($"向日葵小班共有{Count}個學生");
Loop(迴圈)
微軟官方說明 Iteration statements -for, foreach, do, and while – C# reference | Microsoft Learn
電腦除了計算以外,再來是常用在做重複的事情,稱為迴圈,迴圈有分幾種
- for跟foreach
- wihile
- do while
for loop (for迴圈)
for(int i = 0 ; i < 10 ;i++ )
{
Console.WriteLine($"i= {i}");
}
Console.WriteLine("執行結束,按任意鍵繼續");
Console.ReadKey();
說明
int i = 0
設定迴圈初始值,稱為initializer section
i < 10
迴圈會繼續跑的條件,稱為condition
i++
每跑完一次會執行這段,稱為step或iterator section
範例1+2+….9+10
int sum = 0;
for(int i = 1 ; i <= 10 ;i++ )
{
sum = sum + i;
Console.WriteLine($"i= {i}");
}
Console.WriteLine($"加總結果 sum = {sum}");
Console.WriteLine("執行結束,按任意鍵繼續");
Console.ReadKey();
執行結果
範例 5+7+9+11+…19
int sum = 0;
for(int i = 5 ; i <= 19 ;i+=2 )
{
sum = sum + i;
Console.WriteLine($"i= {i}");
}
Console.WriteLine($"加總結果 sum = {sum}");
Console.WriteLine("執行結束,按任意鍵繼續");
Console.ReadKey();
說明:這邊主要關鍵在於step是2,i = i + 2;
輸出結果
範例 反著數,5 4 3 2 1 boom
for(int i = 5 ; i > 0 ;i-- )
{
Console.WriteLine($"i= {i}");
}
Console.WriteLine($"BOOM!!!");
Console.WriteLine("執行結束,按任意鍵繼續");
Console.ReadKey();
範例 for 無限迴圈
for(;;)
{
//無限迴圈要執行的內容
}
string input;
Console.WriteLine("請輸入內容,輸入exit離開");
for (; ;) //如果要迴圈無限執行 可以這樣寫
{
Console.Write("請輸入:");
input = Console.ReadLine();
Console.WriteLine("輸入的內容是:" + input);
if (input == "exit")
{
break; //這是直接結束整個迴圈
}
}
Console.WriteLine("執行結束,按任意鍵繼續");
Console.ReadKey();
範例 印出陣列內容
int[] numbers = new int[] {5,9,7,10,33,15 };
for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine($"numbers [{i}]:{numbers [i]}");
}
範例 計算平均
//這邊數字可以改成自己想要的
int[] numbers = new int[] {5,9,7,10,33,15 };
int sum = 0;
for (int i = 0; i < numbers.Length; i++)
{
sum += numbers[i];
}
Console.WriteLine("總和為:" + sum);
Console.WriteLine("平均為:" + sum / numbers.Length);
Console.WriteLine("執行結束,按任意鍵繼續");
Console.ReadKey();
跳脫迴圈 continue; break;
- continue; 跳過這次執行
- break ; 跳出整個迴圈
Continues;
跳過這輪for剩下的程式碼
我用一個簡單的範例,假如我要計算1加到100,但是跳過數字50。
int sum = 0;
int skipNumber = 50;
for (int i = 1; i <= 100; i++)
{
//遇到50時候跳過這輪
if (i == skipNumber)
{
continue;
}
sum += i; //等同 sum = sum + i;
}
break;
直接離開迴圈,這個也很常使用。
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 要找的數字
int target = 7;
//紀錄位置
int index = -1;
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] == target )
{
index = i;
// 因為已經找到了使用 break 離開整個迴圈
break;
}
}
Console.WriteLine("尋找完成");
if(index != -1)
{
Console.WriteLine($"數字 {target} 在索引 {i}");
}else{
Console.WriteLine($"數字 {target} 不在此陣列");
}
Console.WriteLine("執行結束,按任意鍵繼續");
Console.ReadKey();
範例 計算輸入數字是否為質數
說明:
讓使用者輸入一個數字,由程式判斷是否為質數。
這邊有幾個技巧
- 限制使用者輸入的數字要大於等2
- 只需要檢查到√n ,例如100只要檢查到10即可,可以大幅縮減需要檢查的數量。
int number;
// 使用 for(;;) 迴圈,不斷提示使用者輸入,直到輸入有效的整數
for (; ; )
{
// 提示使用者輸入一個數字
Console.WriteLine("請輸入一個大於或等於2的數字:");
// 讀取使用者輸入到number,然後記錄能否正常轉型
bool isValid = int.TryParse(Console.ReadLine(), out number);
// 檢查輸入是否有效且大於或等於2
if (isValid && number >= 2)
{
break; // 跳出迴圈
}
// 如果輸入無效,提示錯誤訊息
Console.WriteLine("輸入錯誤。請重新輸入一個有效的整數,且必須大於或等於2。");
}
// 判斷該數字是否為質數
bool isPrime = true;
for (int divisor = 2; divisor <= Math.Sqrt(number); divisor++)
{
// 如果 number 能被 divisor 整除,則 number 不是質數
if (number % divisor == 0)
{
//非質數則跳出迴圈
isPrime = false;
break;
}
}
// 顯示結果
if (isPrime)
{
Console.WriteLine($"{number} 是質數。");
}
else
{
Console.WriteLine($"{number} 不是質數。");
}
// 等待使用者按下任意鍵後結束程式
Console.WriteLine("按下任意鍵結束...");
Console.ReadKey();
foreach 迴圈
foreach迴圈是for迴圈的簡易版,如果你是需要逐一取出陣列內容,使用foreach會比for好寫,而且效率會好上一些。
foreach(var item in 陣列)
{
//對item做一些事
}
範例
List<string> students = new List<string>();
students.Add("馬克");
students.Add("店小二");
students.Add("蛋頭");
Console.WriteLine("學生名單");
int i = 1;
foreach (var student in students)
{
Console.WriteLine($"{i}. {student}");
i++;
}
// 等待使用者按下任意鍵後結束程式
Console.WriteLine("按下任意鍵結束...");
Console.ReadKey();
while迴圈跟do wile迴圈
話說這兩個在生涯中其實很少用到,通常都用for
+ if
直接替代就好,do while
跟while
差別是while
會先檢查條件是不是符合,do while
則是先執行{}
內的程式碼一次再檢查
while迴圈
while(執行條件)
{
//條件成立執行
}
//無限迴圈
while(true)
{
}
範例 1+2+3+4+5
int sum = 0;
int number = 1;
while (number <= 5)
{
Console.WriteLine($"sum = {sum} number = {number }");
sum += number;
number++;
Console.WriteLine($"sum = {sum} number = {number }");
Console.WriteLine($"------------------------------");//分隔線
}
Console.WriteLine($"迴圈結束");
Console.WriteLine($"sum = {sum} number = {number}")
// 等待使用者按下任意鍵後結束程式
Console.WriteLine("按下任意鍵結束...");
Console.ReadKey();
do while迴圈
do
{
}while(繼續執行條件)
範例 選擇要執行的功能
Console.WriteLine("請輸入要執行的功能(1~4),或按下 q 離開程式");
Console.WriteLine("1. 九九乘法表");
Console.WriteLine("2. 計算 1+2+3+...+n");
Console.WriteLine("3. 計算 1+3+5+...+n");
Console.WriteLine("4. 計算 1+1/2+1/3+...+1/n");
selectFunction = Console.ReadLine();
switch (selectFunction)
{
case "1":
Console.WriteLine("執行九九乘法表");
//相關程式
break;
case "2":
Console.WriteLine("計算 1+2+3+...+n");
//相關程式
break;
case "3":
Console.WriteLine("計算 1+3+5+...+n");
//相關程式
break;
case "4":
Console.WriteLine("計算 1+1/2+1/3+...+1/n");
//相關程式
break;
case "q":
Console.WriteLine("離開程式");
break;
default:
Console.WriteLine("輸入錯誤,請重新輸入");
break;
}
} while (selectFunction != "q");
// 等待使用者按下任意鍵後結束程式
Console.WriteLine("按下任意鍵結束...");
Console.ReadKey();
綜合範例 跟電腦剪刀石頭布
輸入 1= 剪刀 ,2 = 石頭 ,3= 布
電腦隨機出拳
// 宣告選項
string[] options = { "剪刀", "石頭", "布" };
//輸入
Console.WriteLine("請輸入你的選擇: 1= 剪刀, 2= 石頭, 3= 布");
int playerChoice;
//判斷輸入有沒有問題
bool isValid = int.TryParse(Console.ReadLine(), out playerChoice);
if (!isValid || playerChoice < 1 || playerChoice > 3)
{
Console.WriteLine("無效的輸入。請輸入1, 2或3。");
return;
}
// 減去1以符合陣列索引
playerChoice--;
// 電腦隨機出拳
// 回傳 0-2
Random random = new Random();
int computerChoice = random.Next(0, 3);
// 顯示玩家和電腦的選擇
Console.WriteLine($"你選擇了: {options[playerChoice]}");
Console.WriteLine($"電腦選擇了: {options[computerChoice]}");
// 判斷勝負,先處理平手部分
if (playerChoice == computerChoice)
{
Console.WriteLine("平手!");
}
//只要判斷玩家贏的狀況
else if ((playerChoice == 0 && computerChoice == 2) || // 剪刀贏布
(playerChoice == 1 && computerChoice == 0) || // 石頭贏剪刀
(playerChoice == 2 && computerChoice == 1)) // 布贏石頭
{
Console.WriteLine("你贏了!");
}
else //其他都是電腦贏的狀況
{
Console.WriteLine("你輸了!");
}
0 Comments