Download presentation
Presentation is loading. Please wait.
1
第8章 字串與陣列 8-1 字串處理 8-2 一維陣列的處理 8-3 建立多維陣列 8-4 不規則陣列與參數傳遞 8-5 陣列排序與搜尋
2
8-1 字串處理 8-1-1 字串的基礎 8-1-2 字串長度與大小寫轉換 8-1-3 插入、刪除、取出和連接字串
8-1-4 子字串的搜尋、取代與比較
3
8-1-1 字串的基礎-說明 C#語言內建的string資料型別就是.NET Framework中System.String類別的別名。在C#程式碼可以使用文字值的字串(一組char字元集合使用「"」號括起)來建立字串物件,如下所示: string str = "C#程式設計"; string str1; str1 = "ASP.NET網頁設計"; 上述程式碼建立str和str1字串且指定字串內容。
4
8-1-1 字串的基礎-參考資料型別 C#語言的字串是一種參考資料型別,所以字串內容並不能更改,也就是說,一旦建立字串後,就無法改變其值,只能重新指定成新的字串值或另一個字串變數,如下所示: string str = "C#程式設計"; str = "ASP.NET網頁設計";
5
8-1-1 字串的基礎-運算子 (字串連接運算子)
字串連接運算子可以連接兩個運算元的字串成為一個字串,也就是將第2個運算元的字串附加在第1個運算元的最後,如下所示: string str = "good " + "morning"; 上述程式碼使用「+」號連接兩個字串,所以str變數的值成為"good morning"。
6
8-1-1 字串的基礎-運算子 (比較運算子) 雖然string資料型別是一種參考資料型別,但是,C#比較運算子(例如:「==」和「!=」)比較的是string 物件的值,而不是參考的位址,如下所示: string str1 = "book"; string str2 = "book"; if ( str1 == str2 ) { … } 上述if條件是比較str1和str2字串的值,所以結果為true。
7
8-1-1 字串的基礎-運算子 ([]運算子) string str = "test"; char c = str[2];
[]運算子可以如同陣列(詳細的說明請參閱<第8-2節:一維陣列的處理>)一般,從字串中取出指定位置的字元,如下所示: string str = "test"; char c = str[2]; 上述程式碼可以取出第3個字元([]運算子的位置是從0起算),即's'。
8
8-1-2 字串長度與大小寫轉換-屬性 String物件提供相關屬性可以取得字串長度,其範例和說明如下表所示:
9
8-1-2 字串長度與大小寫轉換-方法 英文字串內容大小寫轉換和刪除空白字元的相關方法說明與範例,如下表所示:
10
8-1-2 字串長度與大小寫轉換-Visual C#專案
Visual C#專案:Ch8_1_2 在Windows應用程式的TextBox控制項輸入字串後,即可按下按鈕取得字串長度、轉換成小寫和刪除空白字元,如下圖所示:
11
8-1-3 插入、刪除、取出和連接字串-說明 String物件提供方法可以插入、刪除、取出和連接字串,其相關方法的說明與範例,如下表所示:
12
8-1-3 插入、刪除、取出和連接字串- Visual C#專案
Visual C#專案:Ch8_1_3 在Windows應用程式輸入字串、起始位置和長度後,選取字串方法即可取出所需的子字串,如下圖所示:
13
8-1-4 子字串的搜尋、取代與比較- 子字串的搜尋
在String物件提供子字串搜尋方法,可以在字串中搜尋所需的子字串。其相關方法的說明與範例,如下表所示:
14
8-1-4 子字串的搜尋、取代與比較- 取代子字串
String物件的Replace()方法只能取代字串中的字元,並不能取代子字串,我們可以自行使用Substring()方法來建立字串取代功能。例如:找到子字串是位在搜尋字串output的位置pos,其長度為len,如下所示: output = txtInput.Text; strLeft = output.Substring(0, pos); strRight = output.Substring(pos + len); txtInput.Text = strLeft + txtReplace.Text + strRight; 取代的字串運算式,如下所示: 原始字串 = [右字串] + [子字串] + [左字串] 取代字串 = [右字串] + [取代字串] + [左字串]
15
8-1-4 子字串的搜尋、取代與比較- 字串比較 String物件的字串比較是一個字元一個字元比較字元的內碼值,直到分出大小為止。其相關方法的說明與範例,如下表所示:
16
8-1-4 子字串的搜尋、取代與比較- Visual C#專案
Visual C#專案:Ch8_1_4 在Windows應用程式使用字串方法來建立類似文書編輯工具的搜尋和取代功能,如下圖所示:
17
8-2 一維陣列的處理 8-2-1 陣列的基礎 8-2-2 宣告一維陣列 8-2-3 foreach迴圈與System.Array類別
ViLLE – 5.1 宣告一維陣列 8-2-3 foreach迴圈與System.Array類別
18
8-2-1 陣列的基礎-說明 「陣列」(Arrays)是一種程式語言的基本資料結構,屬於一種循序性的資料結構。日常生活最常見的範例是一排信箱,如下圖所示:
19
8-2-1 陣列的基礎-為何使用陣列 string name1, name2, name3, name4, name5;
如果程式需要使用很多相同型別的變數時,我們可以宣告一堆變數。例如:大樓的住戶名稱,如下所示: string name1, name2, name3, name4, name5; 上述程式碼宣告5個字串變數name1~5,使用不同名稱來區分各住戶。如果使用陣列變數,只需要宣告一個陣列變數,如下所示: string[] name = new string[5]; 上述程式碼宣告一個一維陣列變數,只需使用陣列變數名稱加上索引值,就可以存取指定陣列元素的值。
20
8-2-1 陣列的基礎-C#陣列 C#語言的陣列是對應.NET Framewok的System.Array類別,它是一種參考資料型別,可以將相同資料型別的變數集合起來,使用一個名稱來代表,以索引值存取元素,每一個元素相當於是一個變數,如下圖所示:
21
8-2-2 宣告一維陣列-語法 陣列是一組變數,如果在程式中需要使用很多相同資料型別的變數時,我們可以直接宣告陣列,而不用宣告一堆變數,然後透過陣列索引來存取陣列元素的值。 C#陣列在宣告時就需指定陣列大小的尺寸,其宣告語法如下所示: 資料型別[] 陣列_名稱 = new 資料型別[尺寸];
22
8-2-2 宣告一維陣列-範例 例如:宣告和建立字串陣列names[],如下所示:
string[] names = new string[5]; 上述陣列的大小為5,索引值範圍是從0起算至括號值減一的4。
23
8-2-2 宣告一維陣列-指定一維陣列的初值 在宣告陣列的同時,就可以一併指定陣列元素的初值,如下所示:
int[] grades = {98, 75, 56, 88, 67}; 或 string[] names = new string[5] {"陳會安", "江小魚", "陳允傑", "楊過", "小龍女"};
24
8-2-2 宣告一維陣列-存取一維陣列的元素 如果陣列沒有指定初值,我們可以使用指定敘述來指定陣列值,如下所示:
names[0] = "陳會安"; names[1] = "江小魚"; names[2] = "陳允傑"; names[3] = "楊過"; names[4] = "小龍女"; 取出陣列值的程式碼,如下所示: myName = names[2]; myGrade = grades[2];
25
8-2-2 宣告一維陣列-Visual C#專案 Visual C#專案:Ch8_2_2
在Windows應用程式建立學生姓名字串陣列和成績的整數陣列,學號就是陣列索引值,只需輸入學號的索引值,就可以取得陣列元素值,即學生姓名和成績,如下圖所示:
26
ViLLE – 5.1 宣告一維陣列 請啟動ViLLE,在【五. 陣列】目錄下,選【1. 宣告一維陣列】,按【Run】鈕模擬執行此範例程式,如下圖所示:
27
8-2-3 foreach迴圈與System.Array類別- 走訪陣列(語法)
foreach迴圈和for迴圈敘述十分相似,不過foreach迴圈通常是使用在集合物件或陣列,可以顯示集合物件或陣列的所有元素,特別適合在不知道有多少元素的集合物件或陣列時,其基本語法如下所示: foreach ( 變數 in 陣列 ) { 程式敘述; }
28
8-2-3 foreach迴圈與System.Array類別- 走訪陣列(範例)
例如:走訪一維陣列grades[]來計算總分,如下所示: foreach (int element in grades) { sum += element; } 上述變數grades[]為陣列,迴圈可以一一取出所有的陣列元素,指定給變數element,請注意!element變數是在foreach迴圈敘述中宣告。
29
8-2-3 foreach迴圈與System.Array類別- System.Array方法(說明)
C#陣列就是System.Array類別的物件,如果使用for、while或do/while迴圈存取陣列元素,可以搭配System.Array類別的方法來取得陣列邊界,其相關方法的說明,如下表所示:
30
8-2-3 foreach迴圈與System.Array類別- System.Array方法(範例)
low = grades.GetLowerBound(0); high = grades.GetUpperBound(0); for ( index = low; index <= high; index++ ) { output += names[index] + "\t" + grades[index] + "\r\n"; }
31
8-2-3 foreach迴圈與System.Array類別- Visual C#專案
Visual C#專案:Ch8_2_3 在Windows應用程式按下按鈕,就可以顯示學生姓名、成績、所有學生成績的平均和總分,如下圖所示:
32
8-3 建立多維陣列-說明 「二維陣列」(Two-dimensional Array)或多維陣列都是一維陣列的擴充。如果將一維陣列想像成一度空間的線,二維陣列就是二度空間的平面,三維陣列即空間。 在日常生活中的二維陣列應用非常廣泛,只要是平面的表格,都可以轉換成二維陣列來表示。例如:月曆、功課表和成績單等。
33
8-3 建立多維陣列-宣告二維陣列 C#語言的多維陣列擁有多個索引,對比前述信箱就是多排信箱。例如:儲存學生成績的二維陣列,其宣告如下所示:
int[,] grades = new int[2,3]; 或 int[,] grades = new int[2,3] { { 54, 68, 93}, { 67, 78, 89}}; 上述程式碼宣告一個2列和3欄的2x3二維陣列grades[,],使用「,」逗號分隔索引,1個逗號是二維;2個就是三維陣列。
34
8-3 建立多維陣列-指定元素值 在宣告2x3的二維陣列後,如果沒有指定元素初值,我們可以使用指定敘述來指定二維陣列的元素值,如下所示:
grades[0,0] = 54; grades[0,1] = 68; grades[0,2] = 93; grades[1,0] = 67; grades[1,1] = 78; grades[1,2] = 89;
35
8-3 建立多維陣列-圖例 二維陣列擁有2個索引,左索引(Left Index)指出元素位在哪一列,右索引(Right Index)指出位在哪一欄,使用2個索引值就可以存取指定的二維陣列元素。
36
8-3 建立多維陣列-走訪二維陣列 在建立二維陣列且指定元素值後,走訪二維陣列需要是使用二層巢狀迴圈,如下所示:
for (i = 0; i <= 1; i++) for (j = 0; j <= 2; j++) sums[i] += grades[i, j];
37
8-3 建立多維陣列-Visual C#專案 Visual C#專案:Ch8_3
在Windows應用程式輸入學生的各科成績後,就可以計算學生的總分和平均分數,如下圖所示:
38
8-4 不規則陣列與參數傳遞 8-4-1 不規則陣列 8-4-2 傳遞字串與陣列參數 ViLLE – 5.3 傳遞陣列參數
39
8-4-1 不規則陣列-說明 在C#語言的多維陣列支援不規則陣列,也就是在多維陣列的每一維可以不定大小,簡單的說,陣列元素不只可以是變數值,還可以是另一個陣列。 C#語言的不規則陣列(Jagged Array)是讓陣列元素可以是另一個陣列,換句話說,二維陣列的第1維元素值是另一個一維陣列,而且可以是不同尺寸的一維陣列。
40
8-4-1 不規則陣列-宣告 在C#程式碼宣告不規則陣列的語法和之前的二維陣列有一些不同,每一維陣列是一個「[]」;二維就是「[][]」。例如:因為每一班學生人數並不相同,所以我們準備宣告儲存3個班級學生姓名的不規則陣列,如下所示: string[][] classes = new string[3][]; classes[0] = new string[2]; classes[1] = new string[3]; classes[2] = new string[2];
41
8-4-1 不規則陣列-指定元素值 然後就可以使用指定敘述來指定元素值,如下所示: classes[0][0] = "陳會安";
42
8-4-1 不規則陣列- 不規則陣列的初值 在宣告不規則陣列時,我們可以在建立元素陣列時指定初值,如下所示:
string[][] classes = new string[3][]; classes[0] = new string[] {"陳會安", "江小魚"}; classes[1] = new string[] {"張無忌", "楊過", "小龍女"}; classes[2] = new string[] {"陳允傑", "陳允東"}; 在宣告二維的不規則陣列時就指定初值,如下所示: string[][] classes = new string[][] { new string[] {"陳會安", "江小魚"}, new string[] {"張無忌", "楊過", "小龍女"}, new string[] {"陳允傑", "陳允東"} };
43
8-4-1 不規則陣列- 走訪不規則陣列 在建立二維的不規則陣列後,走訪二維不規則陣列也是使用二層巢狀迴圈,我們需要使用GetLength()方法來取得每一維的陣列尺寸,如下所示: for (i = 0; i < classes.GetLength(0); i++) { for (j = 0; j < classes[i].GetLength(0); j++) output += classes[i][j] + "\t"; output += "\r\n"; }
44
8-4-1 不規則陣列- Visual C#專案 Visual C#專案:Ch8_4_1
在Windows應用程式測試C#不規則陣列,我們準備建立不規則陣列儲存三個班的學生姓名資料,因為每一班的學生數不同,最後顯示每一班的學生清單,如下圖所示:
45
8-4-2 傳遞字串與陣列參數-說明 C#函數的參數如果是字串或陣列,因為字串與陣列都屬於參考資料型別,此時傳值和傳址參數(或傳出參數)的差異,如下表所示:
46
8-4-2 傳遞字串與陣列參數-陣列參數 例如:在C#函數中使用指定敘述將參數指定成其他陣列,如下所示:
public void replace(int[] a) { int[] b = {10, 20, 30}; a = b; ……… } 函數將參數的陣列a指定成新陣列b,並不會影響原參數陣列a,因為傳值方式並不能將參數指定成新陣列。
47
8-4-2 傳遞字串與陣列參數-字串參數 雖然字串也是參考資料型別,不過,因為字串並不能更改字元(成員)。如果字串內容變更,C#語言是建立一個新字串(變數本身),換句話說,傳值參數並無法更改字串內容,如果函數需要更改字串內容,請使用傳址參數來傳遞。
48
8-4-2 傳遞字串與陣列參數-Visual C#專案
Visual C#專案:Ch8_4_2 在Windows應用程式建立最大值和字串取代函數,可以取得陣列最大值和取代字串,函數參數是使用傳值方式來傳遞陣列,字串則是使用傳址方式呼叫,如下圖所示:
49
ViLLE – 5.3 傳遞陣列參數 請啟動ViLLE,在【五. 陣列】目錄下,選【3. 傳遞陣列參數】,按【Run】鈕模擬執行此範例程式,如下圖所示:
50
8-5 陣列排序與搜尋 8-5-1 陣列的排序 8-5-2 陣列的搜尋
51
8-5-1 陣列的排序-基礎 排序工作是將一些資料依照特定原則排列成遞增或遞減的順序。例如:整數陣列data[]的內容,如下所示:
data[0]=89 data[1]=34 data[2]=78 data[3]=45 上述陣列以整數值的大小,將陣列內容依遞增的順序來排序。其排序結果如下所示: data[0]=34 data[1]=45 data[2]=78 data[3]=89 上述陣列data[]已經完成排序,其大小順序如下所示: data[0] < data[1] < data[2] < data[3]
52
8-5-1 陣列的排序-泡沫排序法(說明) 泡沫排序法(Bubble Sort)是使用交換方式來進行排序,可以將較小元素逐漸移動至陣列開始,較大元素慢慢浮向陣列的最後,如同水缸中的泡沫,慢慢往上浮,故稱為泡沫排序法。
53
8-5-1 陣列的排序-泡沫排序法(過程) 泡沫排序法的排序過程是使用交換方法,在陣列中找尋最大值,例如:原始陣列內容,如下:
data[0]=89 data[1]=34 data[2]=78 data[3]=45 陣列依序比較陣列元素0和1,元素1和2,元素2和3,如果各組的第1個元素比較大,就交換元素,如下所示: data[0]=89 > data[1]=34 => data[0]=34 data[1]=89 交換 data[1]=89 > data[2]=78 => data[1]=78 data[2]=89 交換 data[2]=89 > data[3]=45 => data[2]=45 data[3]=89 交換 陣列的最大值89一步步往陣列尾端移動。完成後,陣列索引3的元素是最大值。接著重複上述步驟,每次縮小1個元素後,再重新比較陣列元素,可以完成陣列元素的排序。
54
8-5-1 陣列的排序-泡沫排序法(函數) public void bubble(int[] data) {
int i, j, len, temp; len = data.GetUpperBound(0); for (i = len; i >= 0; i--) for( j = 0; j <= (len-1); j++ ) if ( data[j + 1] < data[j] ) temp = data[j + 1]; // 交換 data[j + 1] = data[j]; data[j] = temp; }
55
8-5-1 陣列的排序-Visual C#專案 Visual C#專案:Ch8_5_1
在Windows應用程式輸入4個數字,按下按鈕可以將4個數字從小到大進行排序,如下圖所示:
56
8-5-2 陣列的搜尋-基礎 搜尋是在資料中找出是否存在與鍵值相同的資料,如果資料存在,就進行後續的資料處理。例如:查尋電話簿是為了找朋友的電話號碼,然後與他連絡。在書局找書也是為了找到後買回家閱讀。 搜尋方法依照搜尋的資料分為兩種,如下所示: 沒有排序的資料:針對沒有排序的資料執行搜尋,我們需要從資料的第1個元素開始比較,從頭到尾以確認資料是否存在。 已經排序的資料:因為資料已經排序,所以搜尋就不需從頭開始一一比較。例如:在電話簿找電話,相信沒有人是從電話簿的第1頁開始找,而是直接從姓名出現的頁數開始找,因為電話簿已經依照姓名進行排序。
57
8-5-2 陣列的搜尋-線性搜尋法 線性搜尋法(Sequential Search)是從陣列的第1個元素開始走訪整個陣列,然後一個一個比較是否擁有搜尋的鍵值,因為需要走訪整個陣列,陣列資料是否排序都無所謂。 換句話說,在C#程式可以使用迴圈來走訪陣列,以便一一比較陣列元素是否有指定的鍵值,如下所示: for (i = 0; i <= len; i++) if ( key == data[i] ) { lblOutput.Text = "找到鍵值在位置: " + i; isFound = true; break; }
58
8-5-2 陣列的搜尋-二元搜尋法 二元搜尋法(Binary Search)是一種分割資料的搜尋方法,搜尋資料是已經排序的資料。二元搜尋法先檢查排序資料的中間元素,如果等於鍵值就是找到;如果小於鍵值,表示資料在前半段;否則在後半段。然後繼續分割半段資料來重覆上述操作,直到找到或已經沒有資料可以分割為止。 例如:data[]陣列索引的上下範圍分別是low和high,中間元素mid是(low + high)/2。在執行二元搜尋時分成三種情況,如下所示: 搜尋鍵值小於陣列的中間元素:鍵值在資料陣列的前半部。 搜尋鍵值大於陣列的中間元素:鍵值在資料陣列的後半部。 搜尋鍵值等於陣列的中間元素:找到搜尋的鍵值。
59
8-5-2 陣列的搜尋-二元搜尋法程式碼 do { mid = (low + high) / 2;
if ( data[mid] == key ) lblOutput.Text = "找到鍵值在位置: " + mid; isFound = true; break; } else if ( data[mid] > key ) high = mid - 1; // 前半段 low = mid + 1; // 後半段 } while ( low <= high );
60
8-5-2 陣列的搜尋-Visual C#專案 Visual C#專案:Ch8_5_2
在Windows應用程式建立線性和二元搜尋,可以在陣列執行搜尋,因為二元搜尋需要已排序資料,所以提供上一節泡沫排序法來排序陣列資料,如下圖所示:
61
End
Similar presentations