2008年11月20日 星期四

QuickSort using C++

QuickSort:一種遞迴技術的排序

(a) 分割步驟:選取未經過排序陣列的第一個元素,並決定它經過排序之後的陣列中的最後位置。

假設此陣列未經排序的第一個元素為21
21 32 5 67 0 12 4 23 53 14

經過排序後,我們找到21在陣列中的最後位置。
12 4 5 14 0 21 67 53 32 23

換句話說,以21為基準,其左邊的所有元素值皆小於它,右邊的所有元素值皆大於它。

我們因此可以將此陣列分成兩個子陣列。
子陣列I:12, 4, 5, 14, 0 (左邊 五個元素)
子陣列II: 67, 53, 32, 23 (右邊 四個元素)

(b) 遞回步驟:對每個位排序的子陣列,執行步驟(a)

(b1)每次對子陣列執行步驟(a)時,必會找到一個元素放在排序過陣列的最後位置上。{同上述(a)之解釋 keypoint: 把21 32 5 67 0 12 4 23 53 14 視為一個子陣列}

(b2)當子陣列由一個元素所組成時,則此唯一個元素必是已經排序過的,因此,這個元素已位在它最後的位置上。

我們如何決定每個子陣列第一個元素的最終位置呢?
EX:
37 2 6 4 89 8 10 12 68 45

(A)從陣列最右邊的元素開始,將每個元素與37比較,直到找出某個小於37的元素。然後將37和這個元素作交換。第一個比37小的元素是12,因此,37會和12交換。
12 2 6 4 89 8 10 37 68 45

(B)從陣列最左邊開始,但是在元素12之後,將每個元素與37比較,直到找到比37大的元素為止。

參考資料: C++程式設計藝術 第四版 DEITEL&DEITEL, Pearson

2008年7月17日 星期四

Partial class

*部份類別(Partial classes) .NET Compact Framework 2.0 的新功能 :
*可在不同的原始程式碼檔案宣告 partial classes, 只要宣告在同一個 「命名空間」和「組件即可」
*在編譯時期, 編譯器會自動將分散於各處的 partial classes 組合成所屬的單一類別

資料來源: Windows Mobile 6 應用程式設計與操控實務(博碩出版)

[圖1]在資料夾 DeviceApplication7 --> Class1.cs 宣告一partial class 叫做 Toyota

[圖2]在資料夾 DeviceApplication7 --> Class2.cs 宣告一partial class 叫做 Toyota

[圖3]放到主程式作執行測試

[圖4]執行結果 ok!


[圖5]錯誤用法

第一支 Mobile 6.0 程式

[圖1]點選螢幕

[圖2]加入簡易程式

[圖3]執行

[圖4]點選按鈕的部份

[圖5]加入程式並執行


可以比較[圖1]和[圖3]兩個方法的不同處

2008年1月11日 星期五

lab recursive method

Write a recursive method to compute Fibonacci series.

Hint:

fib(n)=fib(n-1)+fib(n-2)

1.main

















2.

















( 修正)
1. 把Fabonacci() 改為 static。

















2.
因為就軟體工程的角度而言,第一個寫法用fab來呼叫Fabonacci(),但fab的意義為何?很難理解,因此可能會導致團隊其他的程式設計師誤用、或不知道如何呼叫Fabonacci()。
改用static,就很明顯可知,如果要使用Fabonacci(),用Class Recursion即可呼叫出來。

















Other example: BackwardWriting

Java 96-1 期末報告

到圖書館挑選三本Java課本,寫下這些書名與作者出版社與出版日期,每本書各挑選一個習題進行個人研究,說明以下
  • 你為什麼挑選這個習題(只有題目,沒有範例或解答),
  • 這個習題讓你學到什麼概念,
  • 請你製作一個講義說明這個習題。

Due: 1/11/2008 at 18:00

參考書:


























BackwardWriting

參考課本: JBuilder 程式實務設計作者:楊宗誌。出版社: 文魁資訊股份有限公司。
出版日期: 2001年 12月。

題目:
寫一個程式,讓使用者輸入一字串,然後將此字串內容反順序列印出來。(例如輸入"Java",則列印 "vavJ")

1.

















每一個Backward() method 都要做
(1)傳入扣除第一個字元的字串給Backward()的程序。

(除非字串為"空字串",就不用作)
(2)回傳第一個字元的程序

※順序為先做(1)再做(2)

recursion 的情形,其實就是因為在做method aa()第1個程序時,就執行下一個 method bb(),因此要再回頭做第2個程序時,必須要等到,做完目前method bb()的程序。
因此讓人有"Go & Back"的感覺。

以本題為例,
第一個Backward("和氣生財") 還沒做完,就再做第二個method Backward("氣生財");回傳"和"的程序就先放著。
第二個Backward("氣生財") 還沒做完,就再做第三個method Backward("生財");回傳"氣"的程序就先放著。
第三個Backward("生財") 還沒做完,就再做第四個method Backward("財");回傳"生"的程序就先放著。
第四個Backward("財") 還沒做完,就再做第五個method Backward(" ");回傳"財"的程序就先放著。

此時,
第五個method( )完成,就再回到第四個method() "補"作回傳"財"的程序
第四個method( )完成,就再回到第三個method() "補"作回傳"生"的程序
第三個method( )完成,就再回到第二個method() "補"作回傳"氣"的程序
第二個method( )完成,就再回到第一個method() "補"作回傳"和"的程序
第一個method( )完成。

2.main

















心得:
到底是〝和氣→生財〞,還是〝財生→氣和〞呢?
一個是理想面;一個是現實面。

2008年1月10日 星期四

Testing Random Generator

參考書: Java程式設計 (Java for Students)
作者: Douglas Bell . Mike Parr
出版社: PEARSON
出版日期: 2007年 7月

題目: 檢查亂數產生器
檢查亂數產生器類別 (第6章) 是否真的能隨機產生數字。請在程式中建立可產生亂數的方法,亂數範圍從 1 至 100。呼叫此方法 100 次,然後將數字出現的頻率儲存在陣列中。最後,再顯示頻率的長條圖。如果亂數產生器可隨機產生數字,長條圖中的每列長條高度應該十分相近。

1.main

(1) 定義一個陣列 array[31]

(2) 隨機產生的數字各自存入其 array
Ex: 3 存到 array[3], 5 存到 array[5]

(3) array[0] 用在找出 1 ~ 30 中出現的最大次數。


(4)再用 array[0] 依序和所有數字做比較,等於者可以產生一個"^"符號,否則產生一個"空白"。

2.main


















3.取5個執行結果作分析。

執行結果

(1) "298次"為共同次數

















(2) "300次"為共同次數

















(3) "299次"為共同次數

















(4) "305次" 為共同次數

















(5) "298次" 為共同次數

















從分布圖也可以約略看出,在任意產生10000個數字中,每個數字共同出現的次數加總可以達9000次左右,接近10000,因此每個數字出現的機率近乎相同。

心得:
這個程式大略呈現,電腦隨機產生數字的機率分布。但畢竟是機率,所以看似均勻的分布中,還是會有可能存在極端分布的情形。

Gamble

參考書: JBuilder X
作者:洪國勝、張建原 編著。
出版社: 文魁資訊股份有限公司。
出版日期:2004年 2月

題目:
請寫一個擲骰子的程式,規則如下:
(1)由電腦擲三顆骰子,並由骰子的點數分佈,沒入或賠償使用者的籌碼,例如使用者的總籌碼有10000元,押100元於1,押200元於4,但電腦出現骰子的點數分佈為4,4,5,則沒入100元,但賠償使用者400元,所以使用者籌碼應變為10300元。
(2)若使用者每次都各押6個點數為100元,連續10000次後,使用者原來的10000元會變為多少?
(3)請將步驟(2)重複執行1000次 ,計算每次的餘額平均,其平均數除以10000即為期望值,此期望值為何?

1.main

















2.main

















3.Class Banker

















4.Class gambler

















5.Gambler2

















6.Gambler3

















7.期望值理論





















8.執行結果(1)

















9.執行結果(2)

















心得:
正所謂10賭9輸,由此程式可得知。

2008年1月4日 星期五

Lab Array

Study Display 6.1, and then write a program that can sort numbers in ascending order.

1.BubbleSort


















2.SystemIO

















3.AdvanceBubbleSort

















4.Running by AdvancedBubbleSort

















迴圈只要執行 4 + 3 + 2 + 1 = 10 次

5.Running by BubbleSort

















迴圈需要執行 4* 4 = 16 次

細說分明:
BubbleSort:
1.






















2.
















3.AdvancedBubbleSort



















驗證理論 by 程式:

1.BubbleSort


















2.


















3.AdvancedBubbleSort


















4.