Upload
harriet-valdez
View
84
Download
0
Embed Size (px)
DESCRIPTION
陣列. 鄭士康 國立台灣大學 電機工程學系 / 電信工程研究所 / 資訊網路與多媒體研究所. 綱要. 一維陣列 亂數產生器 猜數字遊戲 一維陣列的排序、倒排、搜尋 整個陣列的設值與複製 矩形二維陣列 井字遊戲 Tic-tac-toe * 不規則二維陣列 *高維陣列 foreach 敘述. 綱要. 一維陣列 亂數產生器 猜數字遊戲 一維陣列的排序、倒排、搜尋 整個陣列的設值與複製 矩形二維陣列 井字遊戲 Tic-tac-toe * 不規則二維陣列 *高維陣列 foreach 敘述. p1 = 2; p2 = 3; p3 = 5; - PowerPoint PPT Presentation
Citation preview
1
陣列陣列
鄭士康鄭士康國立台灣大學國立台灣大學
電機工程學系電機工程學系 // 電信工程研究所電信工程研究所 //資訊網路與多媒體研究所資訊網路與多媒體研究所
2
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
3
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
4
前五個質數前五個質數p1 = 2;p1 = 2;
p2 = 3;p2 = 3;
p3 = 5;p3 = 5;
p4 = 7;p4 = 7;
p5 = 11;p5 = 11;
p[0] = 2;p[0] = 2;
p[1] = 3;p[1] = 3;
p[2] = 5;p[2] = 5;
p[3] = 7;p[3] = 7;
p[4] = 11;p[4] = 11;
. . .. . .
Console.WriteLine(p[i-Console.WriteLine(p[i-1]);1]);
5
一維陣列一維陣列• 一維陣列與陣列索引一維陣列與陣列索引
int[] p = new int [5];p[0]
p[1]
p[2]
p[3]
p[4]
6
程式程式 Array1D.ProgramArray1D.Program 片段片段const int N = 5;const int N = 5;int[] p = new int[N];int[] p = new int[N];p[0] = 2;p[0] = 2;p[1] = 3;p[1] = 3;p[2] = 5;p[2] = 5;p[3] = 7;p[3] = 7;p[4] = 11;p[4] = 11;int i;int i;for (i = 0; i < N; ++i)for (i = 0; i < N; ++i){{ Console.WriteLine(p[i]);Console.WriteLine(p[i]);}}
7
注意事項注意事項• 「索引在陣列的界限之外」 錯誤 「索引在陣列的界限之外」 錯誤
– 語意錯誤 語意錯誤 – 需要仔細閱讀程式碼,或以偵錯器追蹤索引的需要仔細閱讀程式碼,或以偵錯器追蹤索引的
變化過程 變化過程
8
陣列元素宣告並設值的兩種寫法陣列元素宣告並設值的兩種寫法int[] p = new int[5] { 2, 3, 5, 7, 11 };int[] p = new int[5] { 2, 3, 5, 7, 11 };
int[] p = { 2, 3, 5, 7, 11 };int[] p = { 2, 3, 5, 7, 11 };
9
程式程式 Array1D2.ProgramArray1D2.Program 片段片段int[] p = { 2, 3, 5, 7, 11 };int[] p = { 2, 3, 5, 7, 11 };
int i;int i;
for (i = 0; i < p.Length; ++i)for (i = 0; i < p.Length; ++i)
{ {
Console.WriteLine(p[i]);Console.WriteLine(p[i]);
}}
10
複利公式複利公式
年數利率本金本利和 1
11
程式程式 Array1D3.ProgramArray1D3.Program 片段片段Console.Write("Console.Write("輸入年數輸入年數 : ");: ");int n = Int32.Parse(Console.ReadLine());int n = Int32.Parse(Console.ReadLine());double[] m = new double[n];double[] m = new double[n];int i;int i;for (i = 0; i < n; ++i)for (i = 0; i < n; ++i){{ m[i] = c*Math.Pow(1.0 + p, i+1);m[i] = c*Math.Pow(1.0 + p, i+1);}}for (i = 0; i < n; ++i)for (i = 0; i < n; ++i){{ Console.WriteLine("Console.WriteLine("第第 {0}{0}年後的本利和為年後的本利和為 {1}", {1}", i+1, i+1,
m[i]);m[i]);
}}
12
練習練習• 寫一程式,用迴圈輸入寫一程式,用迴圈輸入 33 位同學成績到一位同學成績到一
維陣列,再用迴圈把所有成績顯示出來維陣列,再用迴圈把所有成績顯示出來 . . • 修改上述程式修改上述程式 , , 使同學人數可以在程式執使同學人數可以在程式執
行時決定行時決定 ..
13
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
14
亂數亂數• 依一定機率分佈隨機產生的數依一定機率分佈隨機產生的數• 均勻分佈之亂數通常以整數除法的餘數產均勻分佈之亂數通常以整數除法的餘數產
生生• 亂數產生器亂數產生器• 亂數種子與亂數數列亂數種子與亂數數列
15
UsingRandom.ProgramUsingRandom.Program 片段片段int seed = 123;int seed = 123;Random rand = new Random(seed);Random rand = new Random(seed);int[] count = new int[10];int[] count = new int[10];for (k = 0; k < 10; ++k)for (k = 0; k < 10; ++k){{ count[k] = 0;count[k] = 0;}}const int N = 1000;const int N = 1000;for (i = 0; i < N; ++i)for (i = 0; i < N; ++i){{ k = rand.Next() % 10;k = rand.Next() % 10; ++count[k];++count[k];}}
16
產生不固定的亂數數列產生不固定的亂數數列Random rand = new Random();Random rand = new Random();
17
練習練習• 產生一萬個產生一萬個 00 到到 99 之間的亂數,統計各點之間的亂數,統計各點
數出現次數,以星號繪出對應長條圖數出現次數,以星號繪出對應長條圖 , , 每每個星號代表出現個星號代表出現 5050 次次
• 例如:例如:0 0 ****************************************11 ******************************************22 **************************************33 ****************************************44 **********************************55 ********************************************66 ************************************. . .. . .9 *********************9 *********************
18
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
19
遊戲規則遊戲規則• 電腦先隨機產生一個四個位數都不同的四電腦先隨機產生一個四個位數都不同的四
位數作為謎底位數作為謎底– 最高位數字最高位數字 (( 千位數千位數 )) 可以是可以是 00
• 接著使用者猜測一個四位數接著使用者猜測一個四位數• 電腦比較所猜的數字與謎底電腦比較所猜的數字與謎底
– 假設使用者所猜的四個位數中有假設使用者所猜的四個位數中有 mm 位數,不論位數,不論位置,在謎底中出現;而其中位置,在謎底中出現;而其中 nn 位數,其數值位數,其數值與位置都與謎底相同,則電腦告知使用者與位置都與謎底相同,則電腦告知使用者 nnAAmmBB 的訊息的訊息
• 使用者產生下一次所猜的數字 使用者產生下一次所猜的數字
20
nAmBnAmB 一例一例• 謎底為謎底為 05670567• 所猜數字為所猜數字為 55665566• 55 、、 55 、、 66 、、 66 均出現在謎底中,所以均出現在謎底中,所以 mm
等於等於 44• 其中一個其中一個 55 一個一個 66 與謎底的第二與第三位與謎底的第二與第三位
數之位置與數值均相同,所以數之位置與數值均相同,所以 nn 等於等於 22• 電腦顯示電腦顯示 2A4B 2A4B
21
虛擬碼虛擬碼1 1 利用亂數產生一個四位數字都不同的四位數利用亂數產生一個四位數字都不同的四位數 xx 2 2 xx 的四個位數為的四個位數為 xdxd[0]~[0]~xdxd[3][3]3 do 3 do {{3.1 3.1 使用者輸入所猜四位數使用者輸入所猜四位數 yy3.2 3.2 決定並輸出決定並輸出 nAnBnAnB3.3 if( 3.3 if( nn == 4 ) == 4 ) {{3.3.1 3.3.1 輸出猜對訊息輸出猜對訊息3.3.2 break3.3.2 break }} } while ( } while ( 猜測次數未達上限 猜測次數未達上限 ))4 4 輸出謎底與猜測次數輸出謎底與猜測次數
22
決定決定 nAmBnAmB 虛擬碼虛擬碼// // 謎底謎底 xdxd[0]~[0]~xdxd[3][3]// // 使用者輸入使用者輸入 ydyd[0]~[0]~ydyd[3][3]for(for(ii=0; =0; ii<4; ++<4; ++ii)){{ for(for(jj=0; =0; jj<4; ++<4; ++jj)) {{ if( if( ydyd[[ii] != ] != xdxd[[jj] ) continue] ) continue ++++mm if( if( ii == == jj ) ++ ) ++nn breakbreak }}}}
23
第第 00 版版 GuessingNumber.PrograGuessingNumber.Programm
片段 片段 (1/3)(1/3)xd[0] = '0';xd[0] = '0';xd[1] = '5';xd[1] = '5';xd[2] = '6';xd[2] = '6';xd[3] = '7';xd[3] = '7';char[] yd = new char[4];char[] yd = new char[4];dodo{{ Console.Write("Console.Write("猜一個四位數猜一個四位數 : "); : "); yd = Console.ReadLine().ToCharArray();yd = Console.ReadLine().ToCharArray(); ++nGuess;++nGuess; n = 0;n = 0; m = 0;m = 0;
24
第第 00 版版 GuessingNumber.PrograGuessingNumber.Programm
片段 片段 (2/3)(2/3) for(i=0; i<4; ++i)for(i=0; i<4; ++i) {{ for(j=0; j<4; ++j)for(j=0; j<4; ++j) {{ if( yd[i] != xd[j] ) continue;if( yd[i] != xd[j] ) continue; ++m;++m; if( i == j ) ++n;if( i == j ) ++n; break;break; }} }} Console.WriteLine("{0}A{1}B", n, m);Console.WriteLine("{0}A{1}B", n, m);
25
第第 00 版版 GuessingNumber.PrograGuessingNumber.Programm
片段 片段 (3/3)(3/3) if( n == 4 )if( n == 4 ) {{ Console.WriteLine("Console.WriteLine("恭喜恭喜 !!您猜對了您猜對了 ");"); break;break; }}} while( nGuess < maxNGuess );} while( nGuess < maxNGuess );
26
亂數產生四位數字都不同的四位數亂數產生四位數字都不同的四位數 ::虛擬碼虛擬碼
1 1 設定陣列設定陣列 dd[0]~[0]~dd[9][9] 為’為’ 0’~’9’0’~’9’2 for(2 for(ii=0;=0; i i<4; ++<4; ++ii)) {{ dodo {{ 產生一個產生一個 00 到到 99 之間的亂數之間的亂數 kk 檢查檢查 dd[[kk]] 是否與先前的是否與先前的 xdxd 元素重複元素重複 } while( } while( dd[[kk]] 已出現過 已出現過 )) xdxd[[ii] = ] = dd[[kk]] }}
27
GuessingNumber.ProgramGuessingNumber.Program 片段 片段 (1/2)(1/2)
char[] d = { '0', '1', '2', '3', '4',char[] d = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };'5', '6', '7', '8', '9' };bool again;bool again;Random rand = new Random();Random rand = new Random();for (i = 0; i < 4; ++i)for (i = 0; i < 4; ++i) {{ dodo {{ k = rand.Next() % 10;k = rand.Next() % 10; again = false;again = false;
28
GuessingNumber.ProgramGuessingNumber.Program 片段 片段 (2/2)(2/2)
for(j=0; j<i; ++j){for(j=0; j<i; ++j){ if (d[k] != xd[j]) continue;if (d[k] != xd[j]) continue; again = true;again = true; break;break; }} } while( again );} while( again ); xd[i] = d[k];xd[i] = d[k];}}
29
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
30
排序、倒排、搜尋排序、倒排、搜尋• 進階課程如演算法與資料結構討論的對象進階課程如演算法與資料結構討論的對象• 一般程式設計的書籍也常介紹初步的方法,一般程式設計的書籍也常介紹初步的方法,
作為陣列處理的範例作為陣列處理的範例• 大多現代的程式語言,包括大多現代的程式語言,包括 C#C# ,都已有現,都已有現
成的函式庫來完成這些工作成的函式庫來完成這些工作• 只說明如何利用這類函式,而不觸及它們只說明如何利用這類函式,而不觸及它們背後的演算法 背後的演算法
31
UsingArrayProcessingFunctionUsingArrayProcessingFunctionss 片段片段
// // 排序排序Array.Sort(a);Array.Sort(a);
// // 倒排倒排Array.Reverse(a);Array.Reverse(a);
// // 搜尋搜尋 11與與 22的位置的位置int idx = Array.IndexOf(a, 1);int idx = Array.IndexOf(a, 1);Console.WriteLine("First index of 1 in a is {0}", Console.WriteLine("First index of 1 in a is {0}",
idx);idx);idx = Array.IndexOf(a, 2);idx = Array.IndexOf(a, 2);Console.WriteLine("First index of 2 in a is {0}", Console.WriteLine("First index of 2 in a is {0}",
idx);idx);idx = Array.LastIndexOf(a, 1);idx = Array.LastIndexOf(a, 1);
32
某班學期成績表某班學期成績表
學號 學期成績B645330 88
B645331 92
B645332 86
33
鍵鍵 (Key)(Key) 與項與項 (Item)(Item)• 鍵鍵
– 排序所根據的一維陣列排序所根據的一維陣列• 項項
– 跟著鍵同時變動,同樣多元素的一維陣列跟著鍵同時變動,同樣多元素的一維陣列
34
SortingDataArraySortingDataArray 片段 片段 (1/2)(1/2)int N_STUDENTS = 3;int N_STUDENTS = 3;string[] registerNumber = new string[N_STUDENTS];string[] registerNumber = new string[N_STUDENTS];registerNumber[0] = "B645330";registerNumber[0] = "B645330";registerNumber[1] = "B645331";registerNumber[1] = "B645331";registerNumber[2] = "B645332";registerNumber[2] = "B645332";int[] score = new int[N_STUDENTS];int[] score = new int[N_STUDENTS];score[0] = 88;score[0] = 88;score[1] = 92;score[1] = 92;score[2] = 86;score[2] = 86;
35
SortingDataArraySortingDataArray 片段 片段 (2/2)(2/2)Array.Sort(score, registerNumber);Array.Sort(score, registerNumber);Array.Reverse(registerNumber);Array.Reverse(registerNumber);Array.Reverse(score);Array.Reverse(score);Console.WriteLine("Console.WriteLine(" 名次 名次 \t \t 學號 學號 \t \t 成績成績 ");");for (k = 0; k < N_STUDENTS; ++k)for (k = 0; k < N_STUDENTS; ++k){{ Console.WriteLine(Console.WriteLine( (k+1) + "\t" + registerNumber[k] + "\t" + (k+1) + "\t" + registerNumber[k] + "\t" + score[k]);score[k]);}}
36
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
37
ArrayAssignmentAndCopyArrayAssignmentAndCopy片段片段
int seed = 123;int seed = 123;Random rand = new Random(seed);Random rand = new Random(seed);const int N = 10;const int N = 10;int[] a = new int[N];int[] a = new int[N];
for (k = 0; k < N; ++k)for (k = 0; k < N; ++k){{ a[k] = rand.Next() % 10;a[k] = rand.Next() % 10;}}
// // 陣列直接設值的副作用陣列直接設值的副作用 ::以偵錯器觀察以偵錯器觀察 bb和和 aa的變化的變化int[] b = a;int[] b = a;Array.Sort(b); //aArray.Sort(b); //a已隨已隨 bb改變改變
38
ArrayAssignmentAndCopyArrayAssignmentAndCopy片段片段
// // 陣列複製的效果陣列複製的效果 ::以偵錯器觀察以偵錯器觀察 cc和和 aa的變化的變化int[] c = new int[N];int[] c = new int[N];for (k = 0; k < N; ++k)for (k = 0; k < N; ++k){{ c[k] = a[k];c[k] = a[k];}}Array.Reverse(c); //aArray.Reverse(c); //a不隨不隨 cc倒轉倒轉
// // 陣列複製的效果陣列複製的效果 ::以偵錯器觀察以偵錯器觀察 dd和和 aa的變化的變化int[] d = new int[N];int[] d = new int[N];Array.Copy(a, d, N);Array.Copy(a, d, N);Array.Reverse(d); //aArray.Reverse(d); //a不隨不隨 dd倒轉倒轉
39
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
40
某班學生各科成績表某班學生各科成績表 學號 \科目 計算機概論 計算機程式設計
B645330 90 84
B645331 88 86
B645332 86 92
41
Array2D.ProgramArray2D.Program 片段 片段 (1/3)(1/3)const int N_STUDENTS = 3;const int N_STUDENTS = 3;
const int N_SUBJECTS = 2;const int N_SUBJECTS = 2;
string[] registerNumber = new string[N_STUDENTS];string[] registerNumber = new string[N_STUDENTS];
registerNumber[0] = "B645330";registerNumber[0] = "B645330";
registerNumber[1] = "B645331";registerNumber[1] = "B645331";
registerNumber[2] = "B645332";registerNumber[2] = "B645332";
string[] subject = new string[N_SUBJECTS];string[] subject = new string[N_SUBJECTS];
subject[0] = "subject[0] = "計算機概論計算機概論 ";";
subject[1] = "subject[1] = "計算機程式設計計算機程式設計 ";";
int[,] score = new int[N_STUDENTS,int[,] score = new int[N_STUDENTS, N_SUBJECTS];N_SUBJECTS];
42
Array2D.ProgramArray2D.Program 片段 片段 (2/3)(2/3)score[0, 0] = 90;score[0, 0] = 90;score[0, 1] = 84;score[0, 1] = 84;score[1, 0] = 88;score[1, 0] = 88;score[1, 1] = 86;score[1, 1] = 86;score[2, 0] = 86;score[2, 0] = 86;score[2, 1] = 92;score[2, 1] = 92;double[] individualAverage = new double[N_STUDENTS];double[] individualAverage = new double[N_STUDENTS];double[] subjectAverage = new double[N_SUBJECTS];double[] subjectAverage = new double[N_SUBJECTS];
43
Array2D.ProgramArray2D.Program 片段 片段 (3/3)(3/3)for (int i = 0; i < N_STUDENTS; i++)for (int i = 0; i < N_STUDENTS; i++) {{ int sum = 0;int sum = 0; for (int j = 0; j < N_SUBJECTS; j++)for (int j = 0; j < N_SUBJECTS; j++) {{ sum += score[i,j];sum += score[i,j]; }} individualAverage[i] = (double)sum / individualAverage[i] = (double)sum / N_SUBJECTS;N_SUBJECTS;}}
44
矩形陣列矩形陣列int[ , ] score = new int [3, 2];
score[0,0] score[0,1]
score[1,0] score[1,1]
score[2,0] score[2,1]
score[0,0]
score[0,1]
score[1,0]
score[1,1]
score[2,0]
score[2,1]
45
處理列處理列 score[0,0] score[0,1]
score[1,0] score[1,1]
score[2,0] score[2,1]
for(i=0; i<N_STUDENTS; ++i) {for(i=0; i<N_STUDENTS; ++i) { for(j=0; j<N_SUBJECTS; ++j) {for(j=0; j<N_SUBJECTS; ++j) {. . .. . .
}}}}
i = 0
i = 1
i = 2
j = 0 j = 1
46
處理行處理行 score[0,0] score[0,1]
score[1,0] score[1,1]
score[2,0] score[2,1]
for(j=0; j<N_SUBJECTS; ++j) {for(j=0; j<N_SUBJECTS; ++j) { for(i=0; i<N_STUDENTS; ++i) {for(i=0; i<N_STUDENTS; ++i) {. . .. . .
}}}}
i = 0
i = 1
i = 2
j = 0 j = 1
47
處理列處理列
i=0
i
j=0 j
for(i=0; i<data.GetUpperBound(0); ++i) { for(j=0; j<data.GetUpperBound(1); ++j) {
. . . }}
data[i,j]
48
處理行處理行
i=0
i
for(j=0; j<data.GetUpperBound(1); ++j) { for(i=0; i<data.GetUpperBound(0); ++i) {
. . . }}
data[i,j]
j=0 j
49
Array2D2.ProgramArray2D2.Program 片段 片段 (1/(1/2)2)
string[] registerNumber = { string[] registerNumber = { "B645330", "B645331", "B645332" };"B645330", "B645331", "B645332" };int[,] score = { {90, 84},int[,] score = { {90, 84}, {88, 86},{88, 86}, {86, 92} };{86, 92} };int nStudents = score.GetUpperBound(0)+1;int nStudents = score.GetUpperBound(0)+1;int nSubjects = score.GetUpperBound(1)+1;int nSubjects = score.GetUpperBound(1)+1;double[] individualAverage = new double[nStudents];double[] individualAverage = new double[nStudents];double[] subjectAverage = new double[nSubjects];double[] subjectAverage = new double[nSubjects];
50
Array2D2.ProgramArray2D2.Program 片段 片段 (2/(2/2)2)
Console.WriteLine( Console.WriteLine( ""學號學號 \\\\科目科目 \t\t計算機概論計算機概論 \t\t計算機程式設計計算機程式設計 \t\t兩科平均成兩科平均成績績 ");");
for (int i = 0; i < nStudents; ++i)for (int i = 0; i < nStudents; ++i) {{ Console.Write(registerNumber[i]+" \t");Console.Write(registerNumber[i]+" \t"); for(int j=0; j<nSubjects; ++j)for(int j=0; j<nSubjects; ++j) {{ Console.Write(score[i,j]+" \t\t");Console.Write(score[i,j]+" \t\t"); }} Console.WriteLine("{0:F2}",Console.WriteLine("{0:F2}", individualAverage[i]);individualAverage[i]);}}
51
練習練習• 寫一程式,設值及印出寫一程式,設值及印出 33 階魔方陣階魔方陣 ((河圖洛河圖洛
書書 ))
52
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
53
井字遊戲井字遊戲
54
棋盤棋盤
0 1 2
0
1
2
0 1 2
0
1
2
0 1 2
3 4 5
6 7 8
55
虛擬碼虛擬碼11 board board[0,0]~[0,0]~boardboard[2,2][2,2] 設為設為 ' '(' '( 引號內是一個空引號內是一個空白白 ))
22 dodo{{2.1 2.1 顯示棋盤顯示棋盤2.2 2.2 使用者輸入使用者輸入 'x''x' 位置位置2.3 if( 2.3 if( 使用者獲勝 使用者獲勝 || || boardboard 已無空格已無空格 ) break) break2.4 2.4 以亂數決定一個以亂數決定一個 'o''o' 位置位置2.5 if( 2.5 if( 電腦獲勝 電腦獲勝 ) break) break } while( } while( boardboard仍有空格 仍有空格 ))3 3 輸出棋盤及訊息輸出棋盤及訊息
56
判斷使用者或電腦獲勝的演算法判斷使用者或電腦獲勝的演算法 1 1 設使用者或電腦最新位置在設使用者或電腦最新位置在 i0i0, , j0j02 2 檢查是否成列檢查是否成列 ( ( boardboard[[i0i0, 0] == , 0] == boardboard[[i0i0, 1] == , 1] == boardboard[[i0i0, 2] ) , 2] ) 3 3 檢查是否成行檢查是否成行 ( ( boardboard[0,[0, j0 j0] == ] == boardboard[1, [1, j0j0] == ] == boardboard[2,[2, j0 j0] )] )4 4 檢查主對角線是否均為‘檢查主對角線是否均為‘ x’ x’ 或 ‘或 ‘ o’o’ ( ( boardboard[0, 0] == [0, 0] == boardboard[1, 1] == [1, 1] == boardboard[2, 2] == ‘x[2, 2] == ‘x
’ ’ 或 ‘或 ‘ o’ )o’ )5 5 檢查次對角線是否均為‘檢查次對角線是否均為‘ x’ x’ 或 ‘或 ‘ o’o’ ( ( boardboard[0, 2] == [0, 2] == boardboard[1, 1] == [1, 1] == boardboard[2, 0] == ‘x[2, 0] == ‘x
’ ’ 或 ‘或 ‘ o’ ) o’ )
57
決定新位置列索引與行索引的決定新位置列索引與行索引的虛擬碼虛擬碼
1 do1 do {{1.1 1.1 產生一個產生一個 00 到到 88的亂數的亂數 kk1.2 1.2 ioio = = k k / 3 / 31.3 1.3 jo jo == k k % 3 % 3 } while( } while( boardboard[[ioio, , jojo] ] 不是空白 不是空白 ))
0 1 2
0
1
2
0 1 2
3 4 5
6 7 8
58
顯示棋盤的程式片段顯示棋盤的程式片段char[,] board = { {' ', ' ', ' '},char[,] board = { {' ', ' ', ' '}, {' ', 'o', ' '},{' ', 'o', ' '}, {' ', ' ', ' '} };{' ', ' ', ' '} };Console.WriteLine(" 0 1 2 ");Console.WriteLine(" 0 1 2 ");Console.WriteLine(" ");Console.WriteLine(" ");Console.WriteLine("0 {0} | {1} | {2} ",Console.WriteLine("0 {0} | {1} | {2} ", board[0, 0], board[0, 1], board[0, 2]);board[0, 0], board[0, 1], board[0, 2]);Console.WriteLine(" ---+---+---");Console.WriteLine(" ---+---+---");Console.WriteLine("1 {0} | {1} | {2} ", Console.WriteLine("1 {0} | {1} | {2} ", board[1, 0], board[1, 1], board[1, 2]);board[1, 0], board[1, 1], board[1, 2]);Console.WriteLine(" ---+---+---");Console.WriteLine(" ---+---+---");Console.WriteLine("2 {0} | {1} | {2} ", Console.WriteLine("2 {0} | {1} | {2} ", board[2, 0], board[2, 1], board[2, 2]);board[2, 0], board[2, 1], board[2, 2]);Console.WriteLine(" ");Console.WriteLine(" ");
59
由使用者輸入決定由使用者輸入決定 XX 位置 的程式片位置 的程式片段段
Console.Write(Console.Write(
"" 輸入輸入 xx 位置的座標位置的座標 , , 以逗點分隔以逗點分隔 : ");: ");
string[] input = new string[2];string[] input = new string[2];
input = Console.ReadLine().Split(',');input = Console.ReadLine().Split(',');
int ix = Convert.ToInt16(input[0]);int ix = Convert.ToInt16(input[0]);
int jx = Convert.ToInt16(input[1]);int jx = Convert.ToInt16(input[1]);
board[ix, jx] = 'x';board[ix, jx] = 'x';
60
加入迴圈加入迴圈bool hasVacancies = true;bool hasVacancies = true;
dodo
{{
//// 此註解代表先前的兩段程式敘述此註解代表先前的兩段程式敘述} while( hasVacancies );} while( hasVacancies );
61
判斷使用者是否獲勝判斷使用者是否獲勝userWin =userWin = ( (board[ix, 0] == board[ix, 1]) &&( (board[ix, 0] == board[ix, 1]) && (board[ix, 1] == board[ix, 2]) ) ||(board[ix, 1] == board[ix, 2]) ) || ( (board[0, jx] == board[1, jx]) &&( (board[0, jx] == board[1, jx]) && (board[1, jx] == board[2, jx]) ) ||(board[1, jx] == board[2, jx]) ) || ( (board[0, 0] == 'x') &&( (board[0, 0] == 'x') && (board[1, 1] == 'x') &&(board[1, 1] == 'x') && (board[2, 2] == 'x') ) ||(board[2, 2] == 'x') ) || ( (board[0, 2] == 'x') &&( (board[0, 2] == 'x') && (board[1, 1] == 'x') &&(board[1, 1] == 'x') && (board[2, 0] == 'x') );(board[2, 0] == 'x') );
62
注意事項注意事項• boardboard[[i0i0, 0] == , 0] == boardboard[[i0i0, 1] == , 1] == boardboard[[i0i0, ,
2]2] 不可以直接翻譯成不可以直接翻譯成board[ix, 0] == board[ix, 1] == board[ix, 2]board[ix, 0] == board[ix, 1] == board[ix, 2]
• 會被解讀為會被解讀為( board[ix, 0] == board[ix, 1] ) == ( board[ix, 0] == board[ix, 1] ) ==
board[ix, 2]board[ix, 2]
括弧內的比較結果為括弧內的比較結果為 boolbool 型別,無法與字元型別,無法與字元型別的型別的 board[ix, 2]board[ix, 2] 進行進行 ====運算運算
63
檢查是否仍有空格檢查是否仍有空格 hasVacancies = false;hasVacancies = false;for (int i = 0; i < 3; ++i)for (int i = 0; i < 3; ++i){{ for (int j = 0; j < 3; ++j)for (int j = 0; j < 3; ++j) {{ if (board[i, j] == ' ')if (board[i, j] == ' ') {{ hasVacancies = true;hasVacancies = true; break;break; }} }}}}
64
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
65
對稱矩陣與下三角矩陣對稱矩陣與下三角矩陣
51111085
1141974
1093163
876212
54321
51111085
041974
003163
000212
00001
66
程式 程式 Array2DAArray2DA/* /*
* * 以下三角矩陣以下三角矩陣 * *
* / x \* / x \
* | x x |* | x x |
* | x x x |* | x x x |
* | x x x x |* | x x x x |
* \ x x x x x /* \ x x x x x /
* *
* * 示範不規則二維陣列之使用示範不規則二維陣列之使用 * *
* 9/29/2008* 9/29/2008
*/*/
67
不規則二維陣列不規則二維陣列int[][] a = new int [3][];
a[0]= new int[1];
a[1]= new int[2];
a[2]= new int[3];
a[0][0]
a[1][1]
a[2][0] a[2][2]
68
Array2DA.ProgramArray2DA.Program 片段 片段 (1/(1/2)2)
const int N_ROW = 5;const int N_ROW = 5;int[][] lowerTriangularMatrix = new int[N_ROW][];int[][] lowerTriangularMatrix = new int[N_ROW][];for (int i = 0; i < N_ROW; ++i)for (int i = 0; i < N_ROW; ++i) {{ lowerTriangularMatrix[i] = new int[i + 1];lowerTriangularMatrix[i] = new int[i + 1];}}lowerTriangularMatrix[0][0] = 1;lowerTriangularMatrix[0][0] = 1;lowerTriangularMatrix[1][0] = 2; lowerTriangularMatrix[1][0] = 2; lowerTriangularMatrix[1][1] = 21;lowerTriangularMatrix[1][1] = 21;
69
Array2DA.ProgramArray2DA.Program 片段 片段 (2/(2/2)2)
for (int i = 0; i < N_ROW; i++)for (int i = 0; i < N_ROW; i++) {{ for (int j = 0; j <for (int j = 0; j < lowerTriangularMatrix[i].Length; j++)lowerTriangularMatrix[i].Length; j++) { {
Console.Write(Console.Write( lowerTriangularMatrix[i][j] + lowerTriangularMatrix[i][j] + "\t");"\t"); }} Console.WriteLine();Console.WriteLine();}}
70
不規則二維陣列記憶配置不規則二維陣列記憶配置lowerTriangularMatrix[1]
lowerTriangularMatrix[2]
lowerTriangularMatrix[3]
lowerTriangularMatrix[4]
[1][0][1][1][2][0][2][1][2][2][3][0][3][1][3][2][3][3][4][0][4][1][4][2][4][3][4][4]
lowerTriangularMatrix[0] [0][0]
71
練習練習• 宣告如下稀疏矩陣宣告如下稀疏矩陣 (sparse matrix),(sparse matrix), 分別分別
設定各列長度為設定各列長度為 33 、、 22 、、 44 、、 33 、、 11 ,再,再設各元素的值後輸出 設各元素的值後輸出
00005
00974
013103
000212
00451
72
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
73
三維陣列三維陣列
i0 1 2 3
0
1
0
1
2
k
j
74
Array3D.ProgramArray3D.Program 片段片段int[,,] a = { { {1, 2}, {-1, 1}, {0, 5} },int[,,] a = { { {1, 2}, {-1, 1}, {0, 5} }, { {2, 4}, {1, 3}, {3, 7} },{ {2, 4}, {1, 3}, {3, 7} }, { {4, 0}, {8, -3}, {9, 6} },{ {4, 0}, {8, -3}, {9, 6} }, { {-2, 3}, {5, -2}, {1, 1} } };{ {-2, 3}, {5, -2}, {1, 1} } };for (int i=0;i<a.GetUpperBound(0)+1;++i)for (int i=0;i<a.GetUpperBound(0)+1;++i) {{ for (int j=0;j<a.GetUpperBound(1)+1;++j)for (int j=0;j<a.GetUpperBound(1)+1;++j) {{ for (int k=0;k<a.GetUpperBound(2)+1;++k)for (int k=0;k<a.GetUpperBound(2)+1;++k) {{ Console.Write("a[{0}, {1}, {2}] = {3} \t",Console.Write("a[{0}, {1}, {2}] = {3} \t", i, j, k, a[i, j, k]);i, j, k, a[i, j, k]); }} Console.WriteLine();Console.WriteLine(); }}}}
75
綱要綱要1.1. 一維陣列一維陣列2.2. 亂數產生器亂數產生器3.3. 猜數字遊戲猜數字遊戲4.4. 一維陣列的排序、倒排、搜尋一維陣列的排序、倒排、搜尋5.5. 整個陣列的設值與複製整個陣列的設值與複製6.6. 矩形二維陣列矩形二維陣列7.7. 井字遊戲井字遊戲 Tic-tac-toeTic-tac-toe8.8. ** 不規則二維陣列不規則二維陣列9.9. ** 高維陣列高維陣列10.10.foreach foreach 敘述敘述
76
UsingForEach.Program UsingForEach.Program 片段片段string[,] strArray = {string[,] strArray = {
{"Demonstrating", "the", "use", "of", {"Demonstrating", "the", "use", "of",
"foreach"},"foreach"},
{"\nGood", "for", "high", "dimensional", "array"} {"\nGood", "for", "high", "dimensional", "array"}
};};
foreach (string str in strArray)foreach (string str in strArray)
{{
Console.Write(str+" ");Console.Write(str+" ");
}}
Console.WriteLine();Console.WriteLine();
77
用多層迴圈的寫法用多層迴圈的寫法for (int i = 0; i<strArray.GetUpperBound(0)+1; ++i)for (int i = 0; i<strArray.GetUpperBound(0)+1; ++i){{ for (int j = 0; j<strArray.GetUpperBound(1)+1; ++for (int j = 0; j<strArray.GetUpperBound(1)+1; ++
j) {j) { Console.Write(strArray[i, j] + " ");Console.Write(strArray[i, j] + " "); }}}}