440 likes | 1.06k Views
C# 程式設計. 1. 第三部分. 迴圈結構 : 單迴圈 (Counting for-loop) (P.6-2). 控制變數 ( 計數變數 ) 的使用 for ( 變數初始值 ; 條件 ; 變數更新 ) { // 在 for-loop 中宣告的變數為區域變數 ST ( 程式敘述區塊 ) }. 初始值. false. 條件. true. {ST}. 變數更新. 2. s = s + 1 ; s = s + 2 ; s = s + 3 ; s = s + 4 ;
E N D
C# 程式設計 C#程式設計 – 南華大學資管系 1 第三部分
迴圈結構:單迴圈 (Counting for-loop) (P.6-2) • 控制變數(計數變數)的使用 for (變數初始值; 條件; 變數更新) { // 在for-loop中宣告的變數為區域變數 ST (程式敘述區塊) } 初始值 false 條件 true C#程式設計 {ST} 變數更新 2
s= s + 1; s = s + 2; s = s +3; s = s + 4; s = s + 5; 數字的累加: 1加到n的總和 • 若n是5 → s = 1 + 2 + 3 + 4 + 5; • 但是n不固定 → s = 1 + 2 + 3 + 4 + ….. + n; -利用累加和for-loop的技巧。 s = 0; //儲存總和,一開始設總和為Ø int s = Ø; for (int i = 1; i <= n; i++){ s = s + i; } //此處可以存取s的值,但不能存取i的值。Why?? 累加的數值會改變 (a) 使用控制變數(i)來表示累加值的變化。 s = s + i ; (b) i 的值由1變化到n (此例為5),每次遞增 1 (重覆) C#程式設計 3
練習: 數字累加 1. 取得起始值與終止值。 int start = Convert.ToInt32(txtStart.Text); int end = Convert.ToInt32(txtEnd.Text); 2. 設總和為0 int sum = 0; 3. 利用單迴圈累加i的值 for (int i= start; i <= end; i++) sum += i; 4. 輸出結果:lblResult.Text = start + ”加到” + end + ” = ” + sum; C#程式設計 4
程式練習:數字系統的轉換 • 將十進位數轉換為n進位數,n為2、8或16 (int) • 變數a:儲存10進位數 (int) • 變數s:儲存結果 (string) • 只要a > 0就要進行轉換 • 餘數r = a%n; • 將r串接到目前結果的左側: s = r + s; • 取得尚未轉換的部分: a = a / n; • 回到步驟1 (迴圈結構) C#程式設計 5
程式碼 1. int a , n , r ; string s = "" ; 2. a = Convert.ToInt32(txtNum.Text); 3. if (rdb2.Checked) n = 2; else if (rdb8.Checked) n = 8; else n = 16; 4. for( ; a > 0 ; a = a / n /*尚未轉換的部分*/) { r = a % n ; // 取得餘數 s = r + s ; // 串到左邊 } 5. lblResult.Text = s; C#程式設計 6
討論:16進位的轉換正確嗎?? • 10到15要對應成A到F,而其餘(0到9)則不變。 switch( r ) { case 10:s = "A“ + s; break; case 11:s = "B“ + s; break; case 12:s = "C“ + s; break; case 13:s = "D“ + s; break; case 14:s = "E“ + s; break; case 15:s = "F“ + s; break; default:s = r + s; break; } C#程式設計 7
while迴圈 (前測試條件迴圈) (P.6-8) while( 條件 ){ //在while-loop中宣告的變數為區域變數 ST (程式敘述區塊) } • 用while迴圈改寫數字累加中的for迴圈 int sum = 0; int i = start; //初始值 while( i<= end ){ //條件 sum += i; i = i + 1; //控制變數更新 } C#程式設計 8
雙迴圈(巢狀迴圈)1/2 (P. 6-15) • 在迴圈之中包含有其它的迴圈 • 練習 • 在迴圈之中包含有其它的迴圈 • 練習 -善用控制變數 a: 由第一列依次列到第n列, 可以用變數i來控制正在列印 的列數 (外迴圈) b: 在印第i列時,由數字1依序 印到數字i,可以用變數j控制 正在列印的數字 (內迴圈) C#程式設計 9
雙迴圈(巢狀迴圈)2/2 (P.6-15) 1. 取得列數:int n = Convert.ToInt32(txtRows.Text); 2. 利用雙迴圈:產生輸出的字串 string res = “”; for (int i = 1; i <= n; i++) { //第i列 for (int j = 1; j <= i; j++) //數字j res += j; res += “\r\n”; //跳行 } 3. 將結果顯示在文字盒上 txtOutput.Text = res; C#程式設計 10
雙迴圈-九九乘法表 a. 由第一列依序印到第9列(變數i)。 b. 由第一項依序印到第9項(變數j)。 c. 第i列的第j項 i + “*” + j + “=” + (i*j) d. 程式碼:string res = “”; for (int i = 1; i <= 9; i++ ) { for (int j = 1; j <= 9; j++) res += (i + ”*” + ”j” + “=” + (i*j) + ”\t”); res += “\r\n”; //跳行 } txtOutput.Text = res; C#程式設計 11
一維陣列 1/2 • 處理大量同類型的資料,例如:班上50位同學的程設成績。 • 宣告50個變數是不適當的作法,對於運算(平均、最高分等)也很不方便。 • 可使用陣列來處理。 C#程式設計 12
一維陣列 2/2 • 陣列是同類型資料所構成的資料結構。用一塊連續的記憶體來儲存這些資料。 • 共用同一陣列名稱,利用索引(index)來區分每一個元素。 陣列名稱[ index ] index = 0, 1, ….. (n-1) // index由0開始 • 可利用單迴圈來走訪(存取)一維陣列的各個元素 C#程式設計 13
a[0] a[1] a[2] a[3] 一維陣列的處理 1/2 (P.8-17) • 宣告與建立 (參考型態) 資料型態[] 陣列名稱 = new 資料型態 [大小] ; int[ ] a = new int[4] ; a 0 1 2 3 2. 給值(利用assignment operator) a[0] = 98; a[1] = 75 ; a[2] = 56; a[3] = 88 ; C#程式設計 14
一維陣列的處理 2/2 (P.8-17) 3. 也可以建立陣列時,同時初始化內容值。 int[] a = new int[] {98, 75, 56, 88} ; 或 int[] a = {98, 75, 56, 88} ; 4.陣列內容的輸出與計算 -可利用單迴圈走訪每一個元素(取值)。 (a) for (int i = 0; i <= 3; i++) Console.Write( a[i] ); (b) 使用foreach//p.8-21 // 可以不管陣列元素的個數 foreach (int e in a)//int e必須宣告在foreach()之內 Console.Write( e ) ; C#程式設計 15
一維陣列的應用 • 可作為查表的工具(table mapping)。 • 改寫數字系統的轉換。 m 0 1 2 3 … 9 10 11 12 13 14 15 string[] m = {"0", "1", "2", …., "E", "F"}; • 程式碼 //不用switch的作法 for ( ; a > 0 ; a = a / n ){ r = a % n ; //取得餘數 s = m[ r ] + s ; // 查表,串列左邊 } "0" "1" "2" "3" ….. "9" "A" "B" "C" "D" "E" "F" C#程式設計 16
“王一”“李二”“陳三”“趙四”"馬五" 98 80 50 76 69 85 90 78 54 67 多個一維陣列 • 假設有5位學生的名字、數學、國文成績,要如何表示和儲存這些資料。 • 可使用多個一維陣列 string[] name = {“王一”, ”李二”, ”陳三”, ”趙四”, ”馬五”}; int[] math = {98, 80, 50, 76, 69}; int[] chin = {85, 90, 78, 54, 67}; 0 1 2 3 4 name math chin C#程式設計 17
成績的處理 - 資料顯示 1/3 C#程式設計 • 一開始,表單載入時先顯示成績資料 • 將陣列資料宣告為實體成員,方便後續的處理 18
成績的處理 - 資料顯示 2/3 • 資料的顯示 //表單載入時 string res = “名字\t數學\t國文\r\n”; //表頭字串 res += “====\t====\t====\r\n”; //分隔線字串 //利用單迴圈走訪陣列的每個元素 for ( int i = 0; i < 5; i++ ) { res += name[i] + ”\t”; res += math[i] + ”\t”; res += chin[i] + ”\r\n”; // 每一筆佔一列 } res += “====\t====\t====\r\n”; //分隔線字串 txtOutput.Text = res; C#程式設計 19
成績的處理 – 輸出的畫面 C#程式設計 20
成績的處理 - “計算”鈕的事件處理程序 1/6 A. 先處理表格的表頭字串及分隔線字串 string h = “學號\t數學\t國文”; //固定的表頭字串 string sep = “====\t====\t====”; //固定的分隔線字串 //檢查勾選的項目,加上對應的字串 if( chkAvg.Checked ) { h += “\t平均”; sep+=“\t====”; } if( chkFailNum.Checked ) { h += “\t不及格”; sep+=“\t======”; } if( chkRank.Checked ) { h +=“\t名次”; sep += “\t====”; } C#程式設計 21
成績的處理 -“計算”鈕的事件處理程序 2/6 B. 輸出的處理 //先測試表頭及分隔線的輸出 string res = h +”\r\n”+ sep +”\r\n”; /*成績輸出*/ res += sep +”\r\n”; txtOutput.Text = res; //測試成績輸出:固定輸出每人的成績 for( int i = 0; i < 5; i++ ) { res += name[i] + ”\t”; res += math[i] + ”\t”; res += chin[i] + ”\r\n”; } C#程式設計 22
成績的處理 -“計算”鈕的事件處理程序 3/6 C. 各別勾選項目的處理 //注意程式碼的位置 //每人平均的的處理 double[] avg = new double [5]; //暫存平均的結果 if( chkAvg.Checked ) { // 掃描陣列,計算每個人的平均 for( int i = 0; i < 5; i++) avg[i] = (math[i] + chin[i]) / 2.0; } //成績輸出:每人平均的輸出(加在每人的成績後面) if( chkAvg.Checked ) res += avg[i] + “\t”; res += “\r\n”; // 跳行 C#程式設計 23
成績的處理- “計算”鈕的事件處理程序 4/6 //每人不及格科數的處理 int[] fail = new int [5]; //宣告暫存的陣列 if( chkFailNum.Checked ) { for( int i = 0; i < 5; i++ ) { fail[i] = 0; if ( math[i] < 60 ) fail[i] += 1; if ( chin[i] < 60 ) fail[i] += 1; } } //成績輸出:不及格科數的輸出 if( chkFailNum.Checked ) res += (fail[i] + “\t”); C#程式設計 24
成績的處理-“計算”鈕的事件處理程序 5/6 //名次的處理 (用到雙迴圈) int[] rank = new int [5]; if( chkRank.Checked ) { for( int i = 0; i < 5; i++ ) { rank[i] = 1; //先假設名次為1 /*依序和他人比較,只要有人較高分,其名次即遞增1*/ int sum = math[i] + chin[i]; //計算其總分 for( int j = 0; j < 5; j++) { if( math[j] + chin[j] > sum ) rank[i] += 1; } } } //成績輸出:名次的輸出 if( chkRank.Checked ) res += rank[i] + ”\t”; C#程式設計 25
成績的處理-“計算”鈕的事件處理程序 6/6 • //各科平均的處理 int sumMath = 0, sumChin = 0; if( chkCourseAvg.Checked ) { for( int i = 0; i < 5; i++) { sumMath += math[i]; sumChin += chin[i]; } } //各科平均的輸出 if( chkCourseAvg.Checked ) { res += “平均\t”; res +=sumMath/5.0 + ”\t”; res +=sumChin/5.0 + ”\r\n”; } C#程式設計 26
一維陣列的線性搜尋 • break敘述(跳出迴圈,P. 6-25) • 字串的比較運算子(==, != ) (P. 8-3) 在C#中,比較運算子比較的是字串(物件)的值,而不是 字串變數的參考值(位址) (記得,string是一種參考資料型態) • 字串的[]運算子(p.8-4):從字串中取出指定位置的字元 string str = “test”; char c = str[ 2 ]; //字元’s’ • 可利用屬性Length取得字串的長度 str.Length → 4 C#程式設計 27
練習:個人成績的搜尋 1/2 (a) 介面加上:名字: 找到,則列出名字、數學成績、國文成績 找不到,則顯示錯誤訊息:”??? 該筆資料不存在 ???” C#程式設計 搜尋成績 28
練習:個人成績的搜尋 2/2 (b) string n = txtName.Text; int i; bool isFound = false; for ( i = 0; i < 5; i++ ) // 利用迴圈檢查各個元素 if ( n == name[i] ) { isFound = true; break; //跳出迴圈 } if ( isFound ) { txtOutput.Text = “名字:”+ name[i] + “\r\n” + ”數學:”+ math[i] + ”\r\n” + “國文:”+chin[i] + ”\r\n”; } else txtOutput.Text = “??? ” + n + ”的資料不存在 ???\r\n”; C#程式設計 29
練習:數字比對遊戲 1/8 • 起始狀態 • 輸入盒(txtInput)的MaxLength = 4 • 先將輸入盒、確定鈕、答案鈕的Enabled狀態設為false,僅允許按重玩鈕,以產生新的一組數字 (4個不同的數字) C#程式設計 30
練習:數字比對遊戲 2/8 • 如何儲存這4個數字:使用一維整數陣列 int[] answer = new int [4]; 必須宣告為實體成員變數(why?) • 如何隨機產生這4個不同的數字 (a) Random rd = new Random(); (b) 呼叫rd.Next( 0, 10 ) // 0~9 C#程式設計 31
練習:數字比對遊戲 3/8 (c) 4個數字必須不同,必須檢查有否重複 int i = 0; while ( i < 4 ) { // 產生並檢查第i個數字,i = 0, 1, 2, 3 answer[i] = rd.Next( 0, 10 ); // 隨機產生新數字 // 檢查有否和之前的數字重複 (線性搜尋) bool isDuplicate = false for ( int j = 0; j < i; j++ ) if ( answer[j] == answer[i] ) { isDuplicate = true; break; } if ( isDuplicate ) continue; // 有重複,重新產生數字 i++; // 沒有重複,處理下一個數字 } C#程式設計 32
練習:數字比對遊戲 4/8 • 按”重玩”鈕 (a) 利用上述方法產生answer陣列 (b) 此時,將輸入盒、確定鈕、答案鈕的Enabled狀態設為true txtInput.Enabled = true; btnEnter.Enabled = true; btnAnswer.Enabled = true; (c) 將輸入盒和顯示的文字盒清空 txtInput.Text = “”; txtOutput.Text = “”; (d) 我們會記錄並顯示使用者猜測的次數。此時須將記錄的次數重設為0 guessCtr = 0; //宣告為實體成員,初始值為0 C#程式設計 33
練習:數字比對遊戲 5/8 • 按”答案”鈕 • 利用MessageBox顯示答案(存在Answer陣列中) string output = “答案: ”; for ( int i = 0; i < 4; i++ ) output += answer[i]; MessageBox.Show( output , ”答案” , …..OK, …..Information); C#程式設計 34
練習:數字比對遊戲 6/8 • “確定鈕”的處理 1. 取得使用者的輸入: string input = txtInput.Text; 2. guessCtr += 1;// 猜測次數加1 string message = “第” + guessctr + ”次” + input + ”: ” ; // 後接幾A幾B C#程式設計 35
練習:數字比對遊戲 7/8 3. 比對input字串與answer陣列 int A = 0; //紀錄A的個數 intB = 0; //紀錄B的個數 for ( int i = 0; i < 4; i++ ) { // 取得input 字串的第i個數字 int num = input[i] – ‘0’; //判斷num是否存在answer陣列中 (線性搜尋) bool isFound = false; int a; // 在answer陣列中的位置 for ( a = 0; a < 4; a++ ) if ( num == answer[ a ] ) { isFound = true; break; } if( isFound ){ //判斷位置是否相同 if( i == a ) A++; else B++; } } C#程式設計 36
練習:數字比對遊戲 8/8 4. 將幾A幾B的結果輸出 message += (A + ”A” + B + ”B”); // 串接幾A幾B //是否完全猜對4A if ( A == 4 ) { txtOutput.Text += message + “\r\n” + ”你猜對了!!”; //調整按鈕狀態 txtInput.Enabled = false; btnEnter.Enabled = false; } else txtOutput.Text += message + ”\r\n”; C#程式設計 37