1 / 37

C# 程式設計

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 ;

gwidon
Download Presentation

C# 程式設計

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C# 程式設計 C#程式設計 – 南華大學資管系 1 第三部分

  2. 迴圈結構:單迴圈 (Counting for-loop) (P.6-2) • 控制變數(計數變數)的使用 for (變數初始值; 條件; 變數更新) { // 在for-loop中宣告的變數為區域變數 ST (程式敘述區塊) } 初始值 false 條件 true C#程式設計 {ST} 變數更新 2

  3. 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

  4. 練習: 數字累加 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

  5. 程式練習:數字系統的轉換 • 將十進位數轉換為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

  6. 程式碼 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

  7. 討論: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

  8. 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

  9. 雙迴圈(巢狀迴圈)1/2 (P. 6-15) • 在迴圈之中包含有其它的迴圈 • 練習 • 在迴圈之中包含有其它的迴圈 • 練習 -善用控制變數 a: 由第一列依次列到第n列, 可以用變數i來控制正在列印 的列數 (外迴圈) b: 在印第i列時,由數字1依序 印到數字i,可以用變數j控制 正在列印的數字 (內迴圈) C#程式設計 9

  10. 雙迴圈(巢狀迴圈)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

  11. 雙迴圈-九九乘法表 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

  12. 一維陣列 1/2 • 處理大量同類型的資料,例如:班上50位同學的程設成績。 • 宣告50個變數是不適當的作法,對於運算(平均、最高分等)也很不方便。 • 可使用陣列來處理。 C#程式設計 12

  13. 一維陣列 2/2 • 陣列是同類型資料所構成的資料結構。用一塊連續的記憶體來儲存這些資料。 • 共用同一陣列名稱,利用索引(index)來區分每一個元素。 陣列名稱[ index ] index = 0, 1, ….. (n-1) // index由0開始 • 可利用單迴圈來走訪(存取)一維陣列的各個元素 C#程式設計 13

  14. 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

  15. 一維陣列的處理 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

  16. 一維陣列的應用 • 可作為查表的工具(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

  17. “王一”“李二”“陳三”“趙四”"馬五" 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

  18. 成績的處理 - 資料顯示 1/3 C#程式設計 • 一開始,表單載入時先顯示成績資料 • 將陣列資料宣告為實體成員,方便後續的處理 18

  19. 成績的處理 - 資料顯示 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

  20. 成績的處理 – 輸出的畫面 C#程式設計 20

  21. 成績的處理 - “計算”鈕的事件處理程序 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

  22. 成績的處理 -“計算”鈕的事件處理程序 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

  23. 成績的處理 -“計算”鈕的事件處理程序 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

  24. 成績的處理- “計算”鈕的事件處理程序 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

  25. 成績的處理-“計算”鈕的事件處理程序 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

  26. 成績的處理-“計算”鈕的事件處理程序 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

  27. 一維陣列的線性搜尋 • 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

  28. 練習:個人成績的搜尋 1/2 (a) 介面加上:名字: 找到,則列出名字、數學成績、國文成績 找不到,則顯示錯誤訊息:”??? 該筆資料不存在 ???” C#程式設計 搜尋成績 28

  29. 練習:個人成績的搜尋 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

  30. 練習:數字比對遊戲 1/8 • 起始狀態 • 輸入盒(txtInput)的MaxLength = 4 • 先將輸入盒、確定鈕、答案鈕的Enabled狀態設為false,僅允許按重玩鈕,以產生新的一組數字 (4個不同的數字) C#程式設計 30

  31. 練習:數字比對遊戲 2/8 • 如何儲存這4個數字:使用一維整數陣列 int[] answer = new int [4]; 必須宣告為實體成員變數(why?) • 如何隨機產生這4個不同的數字 (a) Random rd = new Random(); (b) 呼叫rd.Next( 0, 10 ) // 0~9 C#程式設計 31

  32. 練習:數字比對遊戲 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

  33. 練習:數字比對遊戲 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

  34. 練習:數字比對遊戲 5/8 • 按”答案”鈕 • 利用MessageBox顯示答案(存在Answer陣列中) string output = “答案: ”; for ( int i = 0; i < 4; i++ ) output += answer[i]; MessageBox.Show( output , ”答案” , …..OK, …..Information); C#程式設計 34

  35. 練習:數字比對遊戲 6/8 • “確定鈕”的處理 1. 取得使用者的輸入: string input = txtInput.Text; 2. guessCtr += 1;// 猜測次數加1 string message = “第” + guessctr + ”次” + input + ”: ” ; // 後接幾A幾B C#程式設計 35

  36. 練習:數字比對遊戲 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

  37. 練習:數字比對遊戲 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

More Related