視窗程式設計

50
視視視視視視 Class 2 視視 視視視

Upload: guinevere-mckinney

Post on 03-Jan-2016

38 views

Category:

Documents


0 download

DESCRIPTION

視窗程式設計. Class 2 教師:黃聖方. 第四章. 陣列與字串. 4-1 陣列. 陣列的宣告. 陣列的宣告與初始化範例. 4-2 Jagged Array. C# 另外提供一個建立特殊的二維陣列,陣列中的每一列的長度可以不相同,稱為「 Jagged Array 」。其語法如下: DataType [][] arrayname = new DataType[size][] ; 一般建立 Jagged Array 的方式如下: int [][] myjag = new int [3][] ; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 視窗程式設計

視窗程式設計Class 2教師:黃聖方

Page 2: 視窗程式設計

第四章陣列與字串

Page 3: 視窗程式設計

4-1 陣列.壹 陣列的宣告

Page 4: 視窗程式設計

陣列的宣告與初始化範例

Page 5: 視窗程式設計

4-2 Jagged Array

C# 另外提供一個建立特殊的二維陣列,陣列中的每一列的長度可以不相同,稱為「 Jagged Array 」。其語法如下:

DataType [][] arrayname = new DataType[size][] ; 一般建立 Jagged Array 的方式如下:

int [][] myjag = new int [3][] ; myjag[1] = new int[2] ; myjag[2] = new int[4] ; myjag[0] = new int[3] ;

myjag[0][0] myjag[0][1] myjag[0][2]

myjag[1][0] myjag[1][1]

myjag[2][0] myjag[2][1] myjag[2][2] myjag[2][3]

Page 6: 視窗程式設計

陣列方法當變數宣告為陣列時便繼承了 Array 類別的一些方法,因此可以把也宣告為陣列變數當成物件一般來使用,並呼叫其方法。

相關方法可見 VS 中的提示說明。注意,只有一維陣列才可以把陣列當成物件使用。

Page 7: 視窗程式設計

4-3 ArrayList 類別

在 .NET Framework 另外提供一個 ArrayList 類別,讓你可以建立不定長度的陣列,由於此種陣列的資料型別為 Object ,因此在陣列中的陣列元素允許存放任何型別的資料。注意: ArrayList 在 System.Collections 的命名空間之下

Page 8: 視窗程式設計

4-3 ArrayList 類別屬性與方法 說明

Count 屬性 取得 ArrayList中目前陣列中陣列元素的總數目。Length 屬性 取得陣列的長度。Add() 方法 將 custName物件加入到 ArrayList的最後。Insert() 方法 將物件插入到 ArrayList所指定陣列索引 count的位置後面,而後面陣列元素往移。

Remove() 方法 由 ArrayList移除第一個符合指定物件 custName的陣列元素。

Clear() 方法 清除 ArrayList中所有的陣列元素。CopyTo() 方法 將 ArrayList中全部或部分陣列元素複製到另一個一維陣列中。IndexOf() 方法 傳回 ArrayList中第一個符合指定物件的索引值。若找不到,會傳回 -1。

Sort() 方法 將 ArrayList中所有元素以遞增方式排序 (限一維 )。Reverse() 方法 將 ArrayList中所有元素反轉。若對 ArrayList先做 Sort再做 Reverse相當於對 Arr

ayList做降冪排序。BinarySerach() 方法

使用二分化法由 ArrayList找尋所指定的物件,若有找到傳回該物件的索引;若沒找到傳回一個負值。使用此方法之前,必須先將 ArrayList做遞增排序。

ArrayList 成員表格

Page 9: 視窗程式設計

4-4 字元與字串.壹 字串的宣告和初值設定

…string address ;string city = " 台中市 ", street = " 中興路一段 " ;int no = 168 ;address = city + street +no ; // 台中市中興路一段 168address+=" 號 "; // 將”號”加到 address 字串變數的後面char char1="MIB 戰警 "[3]; // 取得指定字串由 0 開始算起第 3 個字元char char2=address[5]; // 取得 address 字串由 0 開始算起第 5 個字元…註:這裡的字元是 Unicode 字元,不是 byte ;所以 address[5] 會回傳「興」。

Page 10: 視窗程式設計

4-4 字元與字串.貳 C# .NET 字元類別成員

語法: char.Equals(objectA,objectB) ;功能:若物件 A 與物件 B 相等則傳回 true ,否則傳回 false範例: bool result; char char1=’a’; char char2=’c’; result=char.Equals(char1,char2) ; // false Console.WriteLine(result.ToString()); // 顯示 False

註:字元常數用單引號刮起來。

Page 11: 視窗程式設計

4-4 字元與字串.參 C# .NET 字串類別成員

語法: str1.Equals(str2) ;功能:檢查 str1 字串是否和 str2 字串相等範例: if(str1.Equals(str2)) .... 與 if (str1==str2) .... 功能相同

Page 12: 視窗程式設計

第五章方法的參數傳遞、程式偵錯與例外處理

Page 13: 視窗程式設計

5-1 方法方法擁有自已的名稱,可以使用是合法的 C# .NET 識別字來命名。但其名稱不能和變數、常數或定義在類別內的屬性或其他方法名稱重複。方法內所宣告的變數 ( 即屬性 ) 是屬於區域變數,也就是說 C# .NET在不同方法內所宣告的變數彼此互不相關,其有效範圍侷限在該方法內。所以,在不同的方法內是允許使用相同區域變數名稱。方法具有特定功能,程式碼簡單明確,可讀性高而且易除錯和維護。

Page 14: 視窗程式設計

5-1 方法 (續 )

C# .NET 所提供的方法依其特性可分成三大類: 系統提供的方法

使用者自訂的方法

事件

Page 15: 視窗程式設計

5-2 如何定義方法.壹 定義方法

1. 定義方法的語法如下:

access代表呼叫的權限。

static代表的含意:此函式可不經由物件的建立來呼叫,透過直接撰寫類別來呼叫。

Page 16: 視窗程式設計

靜態方法使用須知

譬如說,你希望在主類別當中的 Main 方法以外,建立一個可供 Main 呼叫的方法 CheckID ,則因為 Main 為預設為靜態方法,那麼被 Main呼叫的 CheckID 也必須宣告為 static 。

原因:靜態方法不需產生物件即可直接呼叫,其所呼叫的方法如果不是靜態的(必須建立物件才可呼叫),那麼不是與靜態的意義互相矛盾嗎?

Page 17: 視窗程式設計

5-2 如何定義方法 (續 )2. 成員存取修飾功能說明如下表:

所使用的成員存取修飾詞 功 能 說 明

public 類別或類別成員存取範圍完全沒有限制。

protected 類別或類別成員存取範圍限於父類別、或繼承自父類別的子類別可使用。

internal 類別或類別成員存取只限於目前專案。

protected internal 類別或類別成員存取只限於目前專案或繼承自父類別。

private 只有本身的類別可存取而己。 (預設 )

Page 18: 視窗程式設計

5-2 如何定義方法 (續 ).貳 如何呼叫方法

1. 在 C# .NET 中呼叫使用者自訂靜態方法的語法有下列兩種方式:

Page 19: 視窗程式設計

5-2 如何定義方法 (續 ) 2. 下圖即為同類別的方法呼叫:

Page 20: 視窗程式設計

5-2 如何定義方法 (續 ) 3. 下圖即為不同類別的方法呼叫:

Page 21: 視窗程式設計

5-3 參數的傳遞方式.壹 傳值呼叫 (Call by value)

在一個方法 A 呼叫另一個方法 B 時,方法 A 的實引數值會拷貝一份給方法 B 中所對應的虛引數,由於兩者的引數並不佔用相同的記憶位址,方法 B 在執行中所對應的參數若有改變時,並不會影響方法A 中的參數值。

Page 22: 視窗程式設計

5-3 參數的傳遞方式(續 )

// Filename: cs_CallValue.sln1. using System;2. namespace cs_CallValue3. {4. class Class15. {6. private static void CallValue(int x, int y)7. { 8. int z;9. x=20;10. y=30;11. Console.WriteLine ("\n 方法內 交換前 : x= {0} y={1} ",x,y);12. z=x; //透過第三個變數來做 x,y 值作互換13. x=y;14. y=z;15. Console.WriteLine ("\n 方法內 交換後 : x= {0} y={1} ",x,y);16. }17. [STAThread]18. static void Main(string[] args)19. {20. Console.WriteLine("\n **** Call By Value 傳值呼叫 **** \n");

【傳值呼叫 _範例】

Page 23: 視窗程式設計

5-3 參數的傳遞方式(續 )

21. int a = 10 ;22. int b = 12 ;23. Console.WriteLine ("\n 呼叫敘述 未進入方法前 : a= {0} b={1} ",a,b);24. CallValue(a, b) ;25. Console.WriteLine ("\n 呼叫敘述 離開方法回原處時 : a= {0} b={1} ",a,

b);26. Console.ReadLine() ;27. }28. }29. }

【傳值呼叫 _範例】

【結果】

Page 24: 視窗程式設計

5-3 參數的傳遞方式(續 )

.貳 參考呼叫 (Call by reference) 方法 A 呼叫方法 B 時,若希望將方法 B 的執行結果回傳給方法 A ,

使用傳值呼叫是無法做到的。若能將實引數和虛引數彼此對應的參數設成佔用相同的記憶位址,此時虛引數一有改變,對應的實引數亦跟著改變,便可將方法 B執行的結果回傳給方法 A ,此種方式稱為「參考呼叫」。

Page 25: 視窗程式設計

5-3 參數的傳遞方式(續 )

// Filename: cs_CallRef.sln1. using System;2. namespace cs_CallRef3. {4. class Class15. {6. private static void CallRef(ref int x, ref int y)7. {8. int z;9. x=20;10. y=30;11. Console.WriteLine ("\n 方法內 交換前 : x= {0} y={1} ",x,y);12. z=x; //透過第三個變數來做 x,y 值作互換13. x=y;14. y=z;15. Console.WriteLine ("\n 方法內 交換後 : x= {0} y={1} ",x,y);16. }17. [STAThread]18. static void Main(string[] args)19. {20. Console.WriteLine("\n **** Call By Reference 參考呼叫 **** \n");

【參考呼叫 _範例】

Page 26: 視窗程式設計

5-3 參數的傳遞方式(續 )

21. int a = 10 ;22. int b = 12 ;23. Console.WriteLine ("\n 呼叫敘述 未進入方法前 : a= {0} b={1} ",a,b);24. CallRef(ref a, ref b) ;25. Console.WriteLine ("\n 呼叫敘述 離開方法回原處 : a= {0} b={1} ",a,b);26. Console.ReadLine() ;27. }28. }29. }

【參考呼叫 _範例】

【結果】

Page 27: 視窗程式設計

5-3 參數的傳遞方式(續 )

.參 傳出參數 (Output parameter)  傳出參數與參考呼叫的實引數和虛引數都是共同佔用相同的記憶位

址。兩者間主要差異在於傳出參數的實引數變數不必設定初值即可作參數傳遞,而參考參數必須先設定初值才能傳遞參數。若在「呼叫敘述」及「被呼叫方法」的引數串列的參數前面有加上 out ,即變為傳出參數。

註:因為 C#強烈要求設計師對使用中的變數給初值;有些參考參數內的值本來就是要在呼叫函數中給,所以一開始給初值的話就很沒有意義,因為設定 out 的話,這樣的參數就可以不用給初值。

Page 28: 視窗程式設計

5-3 參數的傳遞方式(續 )

// Filename:cs_CallOut.sln1. using System;2. namespace cs_CallOut3. {4. class Class15. {6. private static void CallOut(out int x, out int y) 7. {8. int z;9. x=20;10. y=30;11. Console.WriteLine ("\n 方法內 交換前 : x= {0} y={1} ",x,y);12. z=x;13. x=y;14. y=z;15. Console.WriteLine ("\n 方法內 交換後 : x= {0} y={1} ",x,y);16. }17. [STAThread]18. static void Main(string[] args)19. {20. Console.WriteLine("\n **** Call Out 傳出參數 **** \n");

【傳出參數 _範例】

Page 29: 視窗程式設計

5-3 參數的傳遞方式(續 )

21. int a,b ;22. Console.WriteLine ("\n 呼叫敘述 未進入方法前 a 和 b 未設定初值 ");23. CallOut(out a, out b) ;24. Console.WriteLine ("\n 呼叫敘述 離開方法回主程式 : a= {0} b={1} ",a,b);25. Console.ReadLine() ;26. }27. }28. }

【傳出參數 _範例】

【結果】

Page 30: 視窗程式設計

5-4 如何在方法間傳遞陣列資料

欲將整個陣列透過呼叫敘述的實引數,將整個陣列傳給被呼叫方法的虛引數,就必須使用參考呼叫。

// Filename :cs_sendArray1.sln1. using System;2. namespace cs_sendArray3. {4. class Class15. {6. private static int Max(ref int[] number)7. {8. int max = number[0] ;9. int tot = number.Length ;10. for (int i=0 ; i<tot ; i++) 11. {12. if (number[i] > max) 13. max = number[i] ;14. }15. return max ;

【陣列傳遞 _範例】

Page 31: 視窗程式設計

5-4 如何在方法間傳遞陣列資料(續 )

16. }17. static void Main(string[] args)18. {19. int[] num = new int[6] {-103, 190, 0, 32, -56, 100} ;20. int high = num.Length ;21. for (int i=0 ; i<high ; i++) 22. Console.WriteLine (num[i] ) ;23. int max_num = Max(ref num) ; // 呼叫 Max方法,由陣列中找出最大值24. Console.WriteLine ("最大數 =" + max_num.ToString()) ;25. Console.ReadLine() ;26. }27. }28. }

【陣列傳遞 _範例】

【結果】

Page 32: 視窗程式設計

5-5 遞迴方法 在方法內的主體 (Body) 內含有一條敘述可以直接或間接呼叫自己本身,我們稱為「遞迴方法」 (Recursive Method) 。

public static long factorial(int n)

{if (n == 0)

return 1 ; return (n * factorial(n-1)) ; }

【使用遞迴求出階層】

Page 33: 視窗程式設計

5-6 覆寫方法 (Overloading) 覆寫方法 (Overloading) 是指程式中允許一個方法擁有多個不同的定

義,也就是說它可建立多個同名稱但引數不同的方法,以方便使用者減少方法命名的困擾以及增加程式設計的彈性。

public static int max(int a, int b){ ……}public static double max(double a , double b , double c) { ……}[STAThread]static void Main(string[] args){

int x = 6, y = 8 ;double i = 2.33, j = 1.55, k = 7.55 ;Console.WriteLine ("最大數 =" + max(x, y).ToString() ) ; Console.WriteLine ("最大數 =" + max(i, j, k).ToString()) ;}

【覆寫方法 _範例】

……

Page 34: 視窗程式設計

5-7 區塊變數、區域變數、靜態變數與屬性成員

.壹 區塊變數 (block level variables) 區塊變數被定義在某個區塊中,可以是 for 、 switch敘述區塊中

所宣告的變數。例如在某個區塊中所宣告的變數,只能在這個區塊中使用 。

class Class1{

static void Main(string[] args){

for(int i=1 ; i<=6 ; i++) // 區塊變數{ Console.WriteLine(i) ;}

Console.WriteLine(i) ;}

}

【區塊變數 _範例】

Page 35: 視窗程式設計

5-7 區塊變數、區域變數、靜態變數與屬性成員 (續 )

二 . 區域變數 (local variables) 區域變數是在方法 (函式 ) 中區塊外宣告的變數,或是方法的參數,

區域變數一離開方法,其生命週期即馬上結束。

class Class1{

private void MyMethod(string str){

string name = “ 蔡小龍” ; // 區域變數name += str ; // 區域變數int k ; // 區域變數for(int i=1 ; i<=6 ; i++) // 區塊變數 Console.WriteLine(i) ;

Console.WriteLine(i) ;}

}

【區域變數 _範例】

Page 36: 視窗程式設計

5-7 區塊變數、區域變數、靜態變數與屬性成員 (續 )

三 . 靜態變數 (static variables) 若在「類別」內所宣告的變數 ( 即

屬性 )前面若加上 static ,則此變數在類別內變成「靜態變數」 ( 或稱靜態屬性 ) 。靜態變數不能在方法內宣告,該變數的「生命週期」是到程式停止執行為止。右表為各種資料型別的預設初值。

資料型態 預設值

sbyte,byte,short,ushort,int,uint,long,ulong

0

Char ‘\x0000’

Float 0.0f

double 0.0d

decimal 0.0m

bool false

Page 37: 視窗程式設計

//FileName : cs_staticVar.sln1. using System;2. namespace cs_staticVar3. {4. class Class15. {6. private static int age = 25;7. private static string name = " 王志明 ";8. [STAThread]9. static void Main(string[] args)10. {11. Console.WriteLine("Class1 類別靜態變數的資訊 -->{0}的年齡為 {1} 歲 \n",name, age.ToStrin

g()); //印出 Class1 類別靜態變數的資訊 --> 王志明的年齡為 25歲12. Console.WriteLine("Class2 類別靜態變數的資訊 -->{0}的年齡無法取得 ",Class2.name); //印出 Class2 類別靜態變數的資訊 --> 陳春嬌的年齡無法取得13. Console.ReadLine();14. }15. }16. class Class217. {18. private static int age = 29;19. public static string name = " 陳春嬌 ";}}

【靜態變數 _範例】

5-7 區塊變數、區域變數、靜態變數與屬性成員 (續 )

Page 38: 視窗程式設計

四 . 物件屬性 (非靜態成員 ) 物件屬性和靜態變數 ( 有加上 static修飾詞,或稱為靜態成員 ) 一樣,

不同的是因為物件屬性是放在 Heap 區,靜態變數是放在全域變數區,因此物件屬性必需建立該物件實體 (執行個體 ) 才能使用。當物件生命週期結束之後,非靜態的物件屬性生命週期就會跟著結束。

5-7 區塊變數、區域變數、靜態變數與屬性成員 (續 )

class MyClass{

public static int vNo ; //靜態變數,或稱靜態成員public string vName ; // 物件屬性…………

}

【物件屬性 _範例】

Page 39: 視窗程式設計

5-8 程式偵錯 撰寫程式時,常會碰到語法錯誤、邏輯錯誤或執行時期 (run time) 錯誤,可藉用 Visual Studio .NET 所提供的偵錯 (Debug)工具,一步步逐行有耐心去觀察每行的結果找出不正確之處。至於執行時期錯誤,則可使用例外處理技巧。現介紹撰寫程式時常會遇到的上述三種錯誤 (Bug) :

1. 語法錯誤

2. 執行時期錯誤

3. 邏輯錯誤

Page 40: 視窗程式設計

程式偵錯

1. 用滑鼠點選 break point

2. 選擇用 Debug模式執行

3. 用自動變數視窗監看變數內容

在偵錯模式,點選偵錯 ->視窗 ->自動變數

Page 41: 視窗程式設計

5-9 例外處理

當程式在執行時期發生錯誤或不正常狀況,稱之為例外 (Exception) 。C# 的例外處理是採用 C++ 和 Java 的方式並加以改良,讓設計者能夠使用具結構化和易控制的方式來處理執行時期所發生的錯誤,找出其發生原因,再尋求解決方法。

一 . try…catch…finally 語法

try{ try statements; // 受監視的程式碼}catch (exception1 e){ catchStatements ;}catch (exception2 e){ catchStatements ;}finally{ finallyStatements; // 最後執行的程式碼 } 例如,可以寫一些程式碼以回復錯誤發生前的變數內容 )

Page 42: 視窗程式設計

5-9 例外處理 (續 )

二 . Exception 類別 C# 的 Exceptions 是以類別來表示之,所有的例外類別都衍生自內建的 Exce

ption 例外類別,此類別亦是 System 命名空間的一部分。下表列出衍生自 System.Exception 內建例外幾個常用的 Exception 類別:

類  別 說  明

Exception 用 Exception抓取所有的例外情況

ArgumentOutOfRangeException 當引數值超出呼叫方法所規定的範圍時所產生錯誤。

DivideByZeroException 除數為 0時所產生錯誤。

Exception 程式執行時期所產生錯誤。

IndexOutOfRangeException 索引值超出陣列所允許範圍。

InvalidCastException 型態轉換所產生錯誤,如將字母轉為數值。

OverFlowException 溢位時所產生錯誤。

Page 43: 視窗程式設計

5-9 例外處理 (續 )三 . Exception 類別的成員

成 員 說   明

GetBaseException 方法 取得該例外類別所繼承的父類別。

GetObjectData 方法用於子類別中覆寫父類別的 GetObjectData方法,藉以

設定例外狀況的相關資訊。

GetType 方法 取得目前例外物件的型別。

HelpLink 屬性 用來讀取或設定說明檔的路徑。

InnerException 屬性 用來取得造成目前例外的例外物件。

Message 屬性 取得例外的描述訊息。

Source 屬性 例外發生的來源物件。

StackTrace 屬性 取得發生例外的函式。

TargetSite 屬性 取得擲回 (throw) 目前例外狀況的方法。

ToString 方法 取得目前例外狀況的文字說明。

Page 44: 視窗程式設計

5-9 例外處理 (續 )

int a, b, c = 0 ;Console.Write("a = ") ;a = Int32.Parse(Console.ReadLine()) ;Console.Write("b = ") ;b = Int32.Parse(Console.ReadLine()) ;try{ c = a / b ;}catch (Exception e){ Console.WriteLine(e) ;}Console.WriteLine("c = " + c ) ;Console.Read() ;

【例外處理 _範例】

……

【結果】

Page 45: 視窗程式設計

5-9 例外處理 (續 ).肆 自訂例外處理 -使用 throw敘述

遇到特殊錯誤,系統並沒有提供此種判斷,自己也可以寫程式來處理特殊錯誤, throw敘述即可指定用到那個例外類別,當然自己也可以定義的例外類別。

private static void KeyinMonth(out int month){Console.Write("輸入月份 ( 1 - 12 ) : ") ;month = int.Parse(Console.ReadLine()) ;if (month < 1 || month > 12)

throw new ArgumentOutOfRangeException() ;}

[STAThread]static void Main(string[] args){ try{ KeyinMonth(out month) ;} catch (ArgumentOutOfRangeException e){ Console.WriteLine(" 不合理月份 \n") ;} catch (Exception e){ Console.WriteLine(" 其他種錯誤 \n") ;} }

【丢出例外 _範例】

…………

Page 46: 視窗程式設計

5-10 DateTime 、 Math 及 Random類別

.壹 DateTime 類別 .NET Framework 類別庫中的 DateTime 類別可用來設定日期與時

間。以下範例中 dateTime1 是使用 DateTime 類別所建立的日期時間物件實體,此日期時間物件為西元 2002年 1月 23日上午 4 時 5分 6秒 7毫秒。

幾個有關 DateTime好用的方法 將字串轉換成時間:

Parse(String s) --- 將字串 yyyy/mm/dd轉成時間型別 ToShortDateString() --- 去除時間,保留日期轉成字串型別 Day() --- 回傳日期中該月份的天數(可以用來檢查日期是否有超過該月分的

正常天數) DayOfWeek() --- 回傳該日期是禮拜幾 (星期天為 0, 星期一為 1…)

DateTime dateTime1 = new DateTime(2002,1,23,4,5,6,7);

Page 47: 視窗程式設計

5-10 DateTime 、 Math 及 Random類別 (續 )

二 . Math 類別 .NET Framework 類別庫中的 Math( 數學 ) 類別,提供許多有關三角函數、對數以及其他常見的數學函數與常數。

方法名稱 說明

Math.Round 語法:Math.Round(n)功能:傳回數值 n的整數部份,而小數第一位四捨六入。範例:Math.Round(4.5) 傳回值為 4

Math.Abs 語法:Math.Abs(n)功能:傳回同樣數值型別的絕對值。範例:Math.Abs(5.3),傳回值為 5.3。

Math.Pow 語法:Math.Pow(x,y) 功能:傳回數值 x的 y次方,即 xy。範例:Math.Pow(5, 3),傳回值為 125

Page 48: 視窗程式設計

5-10 DateTime 、 Math 及 Random類別 (續 )三 . Random(亂數 ) 類別 在 .NET Framework 類別中庫提供了 Random 類別,此類別為 Syst

em.Random 型別,其功能可用來產生亂數。使用 Random 類別中的方法時,必需建立 Random 物件實體才可使用。以下範例中 rnd1 是使用 Random 類別所建立的亂數物件實體。

Random 類別沒有屬性,此類別常用的方法說明如下表:

Random rnd1 = new Random() ;

方法名稱 說明

Next 語法: rnd1.Next() //傳回亂數大於等 0的亂數,且小於 int型別的最大值 rnd1.Next(n1) //傳回 0到 n1-1的亂數值 rnd1.Next(n1, n2) //傳回 n1到 n2-1的亂數值

NextDouble 語法: rnd1.NextDouble()功能:傳回 0.0到 1.0 之間的亂數。

Page 49: 視窗程式設計

5-10 DateTime 、 Math 及 Random 類別 (續 )

//FileName : cs_Random.sln1. using System;2. namespace cs_Random3. {4. class Class15. {6. [STAThread]7. static void Main(string[] args)8. {9. // 建立 num 陣列, num[0]~num[7]預設值為 010. int[] num = new int[8];11. Random rnd = new Random(); // 建立亂數物件12. int getData;13. bool reapeatData ;14. int tot = 1;15. do16. {17. getData = rnd.Next(1,43);18. reapeatData = false;19. for (int i=1; i<=tot ; i++)20. {21. if(getData == num[i])

【產生 1 到 42 之間不重複的亂數,模擬樂透彩開獎情形 _範例】

Page 50: 視窗程式設計

5-10 DateTime 、 Math 及 Random類別 (續 )

22. {23. reapeatData = true;24. break;25. }26. }27. if (reapeatData == false)28. {29. num[tot] = getData;30. tot++;31. }32. }while(tot < 8);33. Console.WriteLine("本期樂透彩開獎號碼如下: ");34. for (int j=1 ; j<num.Length-1; j++)35. Console.WriteLine(" 第 {0}個號碼: {1}",j.ToString(), num[j].ToString());36. Console.WriteLine(" 特別號號碼: {0}", num[7].ToString());37. Console.ReadLine();}}}

【結果】