2009-01-24

JVD03FLEX 亂數排序器

題目敘述 : 

亂數排序器

1.程式執行後顯示「請輸入欲產生之亂數個數 : 」
2.輸入任一數值 N 後按下 enter 鍵 , 程式將亂數產生 N 個三位數數值並顯示在畫面上 (亂數不可重複)
3.產生的 N 個亂數須由小至大遞增排序

評分:

1.程式執行後顯示「請輸入欲產生之亂數個數 : 」 - 2 分
2.輸入任一數值 N 後按下 enter 鍵 , 程式將亂數產生 N 個三位數數值並顯示在畫面上 (亂數不可重複) - 8 分
3.產生的 N 個亂數須由小至大遞增排序 - 5 分

總分 15 分

Author: 山羊
URL: http://gjo4rul4.blogspot.com

by Author :

這次排序器用到的幾個可以學習到的東西...

我把本來題目要印在顯示區的畫面顯示在 LIST 元件中
讓大家也可以學到 LIST 元件的用途

這個排序範例又想起以前上資料結構的課程
想當年沒好好上課 >"< 寫到排序又在想半天... 還上了 GOOGLE 翻了些資料~ 沒想到拿到的程式碼都不知道在寫甚麼~ 最後就用自己的方式實作出來~ @@" 本來還想寫兩三個排序法之間的速度 不過....應該也沒人有興趣吧 哈! 所以就直接寫快速排序法囉~ 也有人稱作是二元樹排序法 排序次數好像是 N 的 log-n 的次數~ 我忘了 = = 請不要計較囉 幾個特別的地方 AS3 1.可視元件的 .visible 顯示屬性 2.FLEX 的輸入焦點設定 focusManager.setFocus(可視元件) 3.ENTER 的 KEYCODE = 13 4.LIST 物件的 dataProvider FLEX 1.框架的使用 2.隱藏屬性 3.偵聽 KEYDOWN 事件 4.限制輸入內容

----------------------------------

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" fontSize="14">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.events.AbstractEvent;

/*
題目敘述 :

亂數排序器

1.程式執行後顯示「請輸入欲產生之亂數個數 : 」
2.輸入任一數值 N 後按下 enter 鍵 , 程式將亂數產生 N 個三位數數值並顯示在畫面上 (亂數不可重複)
3.產生的 N 個亂數須由小至大遞增排序

評分:

1.程式執行後顯示「請輸入欲產生之亂數個數 : 」 - 2 分
2.輸入任一數值 N 後按下 enter 鍵 , 程式將亂數產生 N 個三位數數值並顯示在畫面上 (亂數不可重複) - 8 分
3.產生的 N 個亂數須由小至大遞增排序 - 5 分

總分 15 分

Author: 山羊
URL: http://gjo4rul4.blogspot.com

by Author :

這次排序器用到的幾個可以學習到的東西...

我把本來題目要印在顯示區的畫面顯示在 LIST 元件中
讓大家也可以學到 LIST 元件的用途

這個排序範例又想起以前上資料結構的課程
想當年沒好好上課 >"< 寫到排序又在想半天...
還上了 GOOGLE 翻了些資料~ 沒想到拿到的程式碼都不知道在寫甚麼~
最後就用自己的方式實作出來~ @@"

本來還想寫兩三個排序法之間的速度
不過....應該也沒人有興趣吧 哈!
所以就直接寫快速排序法囉~ 也有人稱作是二元樹排序法 排序次數好像是 N 的 log-n 的次數~
我忘了 = = 請不要計較囉

幾個特別的地方
AS3
1.可視元件的 .visible 顯示屬性
2.FLEX 的輸入焦點設定 focusManager.setFocus(可視元件)
3.ENTER 的 KEYCODE = 13
4.LIST 物件的 dataProvider
FLEX
1.框架的使用
2.隱藏屬性
3.偵聽 KEYDOWN 事件
4.限制輸入內容

*/
//清空顯示區資料 以及顯示輸入區
private function clickHandler():void{
//關閉執行按鈕的顯示屬性
this.button.visible = false ;
this.printOutArea.text = "";
this.printOutArea.text += "請輸入欲產生之亂數個數 : \n";
//打開使用者輸入的 textInput 因為我用了 HBOX 包起來 所以直接顯示 HBOX
this.hbox.visible = true ;
//將程式的焦點 轉移到文字輸入區
focusManager.setFocus(this.textInput);
}
//偵聽鍵盤輸入的內容 - 輸入事件 KeybordEvent
private function keyDownListener(event:KeyboardEvent):void{
// ENTER 的 KEYCODE 是 13
if(event.keyCode == 13){
this.hbox.visible = false;
//產生亂數與排序
generateRandomNumber();
this.button.visible = true;
//清空輸入區
this.textInput.text = "";
}
}
//建立亂數陣列與排序後陣列
private function generateRandomNumber():void{
var arc1:ArrayCollection = new ArrayCollection();
var array:Array = new Array();

//依序建立數字清單
for(var i:int=1;i<=999;i++){
arc1.addItem(i);
}
//亂數取出數字 並且放入 亂數陣列中
for(var k:int=0;k<parseInt(this.textInput.text);k++){
var removeIndex:int = Math.floor(Math.random()*arc1.length);

array.push(arc1.getItemAt(removeIndex));
arc1.removeItemAt(removeIndex);
}
//將亂數陣列放入 list1 的 dataProvider , list 物件類都會有提供這個屬性
//可以放入 array 或是 ArrayCollection 或是 XML 等物件 它會自動處理並顯示在 LIST 容器內
this.list1.dataProvider = array;
//將排序過的陣列放入 list2 的 dataProvider ?資料提供者
this.list2.dataProvider = sort(array);

}
//排序 -- 輸入:數字陣列 輸出:數字陣列
/*
簡易說明快速排序法
快速排序法類似二元樹
他將取出的第一個數字 當作樹根
然後將 比樹根小的數字 放在左邊(陣列)
比樹根大的數字放在右邊(陣列)
然後再將左右兩邊的陣列依序在分析一次
一直到大與小兩邊都剩下一個為止
小數(陣列) 基準數 大數(陣列) 組合在一起
就將數列排序好了
*/
private function sort(array:Array):Array{
//設定基準數 - 傳入陣列的第一個數字
var base:int = array[0];
//小數陣列
var smallArray:Array = new Array();
//大樹陣列
var bigArray:Array = new Array();
//排序後的陣列
var sortArray:Array = new Array();
//依序比對 基準數 與 第二個開始的所有數字
for(var i:int=1;i<array.length;i++){
//如果 陣列的第i個數字 比 基準數小
if(array[i]<base){
//把數字塞入小數陣列
smallArray.push(array[i]);
}else{
//把數字塞入大數陣列
bigArray.push(array[i]);
}
}
//如果小數的陣列 超過一個數字
if(smallArray.length >1){
//將小數陣列再傳入 排序方法中 再排一次
smallArray = sort(smallArray);
}
//如果大數的陣列 超過一個數字
if(bigArray.length >1){
//將大數陣列再傳入 排序方法中 再排一次
bigArray = sort(bigArray);
}
//將小數陣列中所有的數字塞入排序後的陣列
for(var a:int=0;a<smallArray.length;a++){
sortArray.push(smallArray[a]);
}
//將基準數放入排序後的陣列
sortArray.push(base);
//將大數陣列中所有的數字塞入排序的陣列
for(var b:int=0;b<bigArray.length;b++){
sortArray.push(bigArray[b]);
}
//回傳排序完成的陣列
return sortArray;
}


]]>
</mx:Script>
<mx:TextArea width="350" height="79" id="printOutArea"/>
<!--
這裡應該很多初學者會看不懂
我用 HBOX 包了 兩個 VBOX
HBOX 代表水平排列的框架 VBOX 代表垂直排列的框架
所以 先把 LABEL與 LIST用 垂直框架裝起來
再用水平框架把兩個垂直框架裝起來
-->
<mx:HBox>
<mx:VBox>
<mx:Label text="亂數陣列"/>
<mx:List width="118" id="list1"></mx:List>
</mx:VBox>
<mx:VBox>
<mx:Label text="排序後的陣列"/>
<mx:List width="118" id="list2"></mx:List>
</mx:VBox>
</mx:HBox>

<mx:Button label="執行" id="button" click="clickHandler()"/>
<!--可視物件的 visible 屬性 可以先暫時將 物件隱藏-->
<mx:HBox id="hbox" visible="false">
<mx:Label text="輸入數字 0-9 完請按 ENTER : "/>
<!--
偵聽事件 KeyDown 可以偵聽鍵盤輸入了甚麼按鍵
maxChars 代表最多允許三個字元
屬性 restrict 是設定文字輸入限制 0-9 代表只允許輸入 0~9 的數字
"a-zA-Z" 代表允許 大小寫英文 "0-5\-" \代表跳脫字 表示可以輸入 - EX:03-12345
"0-9^5" ^代表不允許輸入的字 EX.12346789
-->
<mx:TextInput id="textInput" keyDown="keyDownListener(event)" maxChars="3" restrict="0-9"/>
</mx:HBox>


</mx:Application>

沒有留言: