2009-02-09

搬家了

這個網誌已經搬家了喔!!

請到 http://blog.corausir.org/

這邊有更多的資料 更多你想知道的~

包括 視覺設計與程式設計 喔!

2009-01-25

JVD04FLEX 河洛之數

題目敘述 : 

河洛之數

請設計一程式,運用陣列,迴圈及亂數來排列出數字範圍 1 ~ 9
且為 3 X 3 的數字矩陣,其縱向 橫向 對角線之 3 個數字總和皆
為 15 ,每次執行之矩陣排列皆不相同,並於命令列中列出該矩陣
之數字排列

1.矩陣內之數字皆不能重複出現
2.程式每次執行矩陣數字排列皆不相同
3.矩陣中之縱向橫向對角線數字之總和皆為 15

評分:

1.矩陣內之數字皆不能重複出現 - 2 分
2.程式每次執行矩陣數字排列皆不相同 - 3 分
3.矩陣中之縱向橫向對角線數字之總和皆為 15 - 10 分

總分 15 分

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

by Author :

題目原本是利用亂數取 然後比對三個數字相家是否為 15 的迴圈
但是這樣就只能比出 9 個的河洛之數
所以我就改成可以讓使用者輸入維度 自動產生河洛之數
至於每次執行都會換 就只要將整個方塊旋轉 90 度就可以了
這個部份我就沒寫了

河洛之數的填入方式很有多種
我選了以下的方式
1.將數字 1 填入第一行的中間隔
2.下一個數字填入 上一個數字的上 (N-1)/2 右 (N-1)/2 的格子內
3.如果要填入的格子已經有數字了 就把數字填上一個數字的正下方的格子

幾個特別的地方
AS:
1.動態產生 DataGrid 的欄位內容
FLEX:
1.NumericStepper 的使用方法

-------------------------------
<?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.controls.Text;
import mx.containers.VBox;
import mx.controls.Alert;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.DataGrid;
import mx.collections.ArrayCollection;
/*
題目敘述 :

河洛之數

請設計一程式,運用陣列,迴圈及亂數來排列出數字範圍 1 ~ 9
且為 3 X 3 的數字矩陣,其縱向 橫向 對角線之 3 個數字總和皆
為 15 ,每次執行之矩陣排列皆不相同,並於命令列中列出該矩陣
之數字排列

1.矩陣內之數字皆不能重複出現
2.程式每次執行矩陣數字排列皆不相同
3.矩陣中之縱向橫向對角線數字之總和皆為 15

評分:

1.矩陣內之數字皆不能重複出現 - 2 分
2.程式每次執行矩陣數字排列皆不相同 - 3 分
3.矩陣中之縱向橫向對角線數字之總和皆為 15 - 10 分

總分 15 分

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

by Author :

題目原本是利用亂數取 然後比對三個數字相家是否為 15 的迴圈
但是這樣就只能比出 9 個的河洛之數
所以我就改成可以讓使用者輸入維度 自動產生河洛之數
至於每次執行都會換 就只要將整個方塊旋轉 90 度就可以了
這個部份我就沒寫了

河洛之數的填入方式很有多種
我選了以下的方式
1.將數字 1 填入第一行的中間隔
2.下一個數字填入 上一個數字的上 (N-1)/2 右 (N-1)/2 的格子內
3.如果要填入的格子已經有數字了 就把數字填上一個數字的正下方的格子

幾個特別的地方
AS:
1.動態產生 DataGrid 的欄位內容
FLEX:
1.NumericStepper 的使用方法

*/
//將河洛之數塞入 ArrayCollection 中傳回
private function hardro(dimensions:int):ArrayCollection{

var numbers:int = dimensions * dimensions ;
var yNumbers:ArrayCollection = new ArrayCollection();

var currentX:int = 0;
var currentY:int = 0;
//先把陣列都填入 0
for(var dimension:int=0;dimension<dimensions;dimension++){
var xNumbers:ArrayCollection = new ArrayCollection();
for(var dimension2:int=0;dimension2<dimensions;dimension2++){
xNumbers.addItem(0);
}
yNumbers.addItem(xNumbers);
}
var flag:Boolean = true;
//開始填入河洛之數
for(var i:int=1;i<=numbers;i++){
if(flag){
//第一個數字 填入 X: 2 Y: 0 的位置
flag = false;
currentX = Math.floor(dimensions / 2);
currentY = 0;
yNumbers.getItemAt(currentY).setItemAt(i,currentX);
}else{
var oldX:int = currentX;
var oldY:int = currentY;
//如果下一格的 X 座標已經超過陣列索引 修改索引值
if(currentX + (dimensions-1)/2 > dimensions -1 ){
currentX = (currentX + (dimensions-1)/2) - dimensions;
}else{
currentX = currentX + (dimensions-1)/2
}
//如果下一格的Y 座標已經超過陣列 修改索引值
if(currentY - (dimensions-1)/2 < 0){
currentY = dimensions + (currentY - (dimensions-1)/2);
}else{
currentY = currentY - (dimensions-1)/2;
}

if((yNumbers.getItemAt(currentY)).getItemAt(currentX) == 0){
//如果這個格子還沒有被填入資料過 就塞入新的數字
yNumbers.getItemAt(currentY).setItemAt(i,currentX);
}else{
//格子已經被填過發生衝突

//把X索引值改回來
currentX = oldX ;
//但是Y索引值必須要 +1
currentY = oldY+1 ;
//如果Y索引超過範圍 修改索引值
if(currentY > dimensions-1){
currentY = oldY+1 - dimensions ;
}
//塞入數值
yNumbers.getItemAt(currentY).setItemAt(i,currentX);
}
}
}
//傳回陣列
return yNumbers;


}
private function clickHandler():void{
var userDimensions:int = this.userDimensions.value;

if(userDimensions %2 == 0){
//雙數的河洛不適合用這個公式 必須再寫另一個種喔 ~~
Alert.show("只可以輸入奇數 3 5 7 9 等等喔! ","錯誤!");
}else{
//開始計算河洛之數
//建立一個 DataGrid 準備塞入資料
var dg:DataGrid = new DataGrid();
//所有的欄位定義必須要先放入 Array 陣列中
var columns:Array = new Array();
//計算河洛之數的結果
var arg:ArrayCollection = hardro(userDimensions);
//建立所需的欄位資料
for(var i:int=0;i<userDimensions;i++){
var dataGridColumn:DataGridColumn = new DataGridColumn();
//欄位的資料是 dataProvider 的哪個欄位
dataGridColumn.dataField = i.toString();
//欄位寬度
dataGridColumn.width = 40;
//放入陣列中
columns.push(dataGridColumn);
}
//設定 dataGrid 的欄位內容
dg.columns = columns ;
//設定高度
dg.height = 27 * userDimensions ;
//關閉垂直捲軸
dg.verticalScrollPolicy = "off" ;
//不顯示欄位名稱
dg.showHeaders = false;
//加入資料提供者
dg.dataProvider = arg;
//這段是先建立個 VBOX 然後把 TEXT 與 dataprovider 放在一起
var vbox:VBox = new VBox();
var text:Text = new Text();
text.text = "此河洛之數不管直線橫線的總和皆為\n";
var tmp:int = 0;
for(var j:int=0;j<(arg.getItemAt(0)).length;j++){
tmp += (arg.getItemAt(0)).getItemAt(j);
}
text.text += tmp;
//把 DataGrid 與 text 加入 vbox 內
vbox.addChild(dg);
vbox.addChild(text);
//最後把他家在場景上
this.addChild(vbox);
}
}
]]>
</mx:Script>
<mx:Label text="河洛之數 FLEX 版"/>
<mx:HBox>
<!--數字選擇器 minimum:最小值 maximum:最大值 value:目前值 stepSize:遞增量-->
<mx:NumericStepper id="userDimensions" minimum="3" maximum="200" stepSize="1" value="3" />
<mx:Label text="欲建立的河洛之數 維度"/>
</mx:HBox>
<mx:Button label="執行" click="clickHandler()"/>
</mx:Application>

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>

2009-01-22

JVD02FLEX 顯示系統時間 - 使用 FLEX-AS3 實作 JAVA 應用程式

題目敘述:

顯示系統時間

依不同的格式顯示目前系統中的日期與時間
1. 2003/5/7 上午 8:6
2. 2003/5/7 上午 08:06:47
3. 2003 年 5 月 7 日 上午08時06分47秒
4. 2003 年 5 月 7 日 星期三 上午08時06分47秒

評分項目

1. 顯示當地時間 TITLE 文字及上下各一分隔線 - 3 分
2. 是否能顯示 『2003/5/7 上午 8:6』 之系統日期時間 - 3 分
3. 是否能顯示 『2003/5/7 上午 08:06:47』 之系統日期時間 - 3 分
4. 是否能顯示 『2003 年 5 月 7 日 上午08時06 分 7秒』 之系統日期時間 - 3 分
5. 是否能顯示 『2003 年 5 月 7 日 星期三 上午08 時 06 分 47 秒』 之系統日期時間 - 3 分

總分 : 15 分

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

by Author :
這個範例是介紹如何使用 DateFormatter 來快速格式化日期欄位
當然還有置換字串的方法
再補充的部分是 ADOBE 對於 DateFormatter 所提供的範例
因此我放在一起 , 主要多了一個驗證器的使用方式


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

<?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.events.ValidationResultEvent;
/*
題目敘述:

顯示系統時間

依不同的格式顯示目前系統中的日期與時間
1. 2003/5/7 上午 8:6
2. 2003/5/7 上午 08:06:47
3. 2003 年 5 月 7 日 上午08時06分47秒
4. 2003 年 5 月 7 日 星期三 上午08時06分47秒

評分項目

1. 顯示當地時間 TITLE 文字及上下各一分隔線 - 3 分
2. 是否能顯示 『2003/5/7 上午 8:6』 之系統日期時間 - 3 分
3. 是否能顯示 『2003/5/7 上午 08:06:47』 之系統日期時間 - 3 分
4. 是否能顯示 『2003 年 5 月 7 日 上午08時06 分 7秒』 之系統日期時間 - 3 分
5. 是否能顯示 『2003 年 5 月 7 日 星期三 上午08 時 06 分 47 秒』 之系統日期時間 - 3 分

總分 : 15 分

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

by Author :
這個範例是介紹如何使用 DateFormatter 來快速格式化日期欄位
當然還有置換字串的方法
再補充的部分是 ADOBE 對於 DateFormatter 所提供的範例
因此我放在一起 , 主要多了一個驗證器的使用方式
*/

private function clickHandler():void{
//清空印出區域
this.printOutArea.text = "";
//印出 TITLE 與分隔線
this.printOutArea.text += "-----------------------------\n";
this.printOutArea.text += " 當地時間 \n";
this.printOutArea.text += "-----------------------------\n";
//套用 第一組 日期格式化物件 --> 因為印出來是 AM 與 PM 所以用置換方法 改成上午與下午
// 利用 .formate() 方法 取回格式化後字串
this.printOutArea.text += this.df1.format(new Date()).replace("AM","上午").replace("PM","下午") + "\n";
//套用 第二組 日期格式化物件 --> 因為印出來是 AM 與 PM 所以用置換方法 改成上午與下午
this.printOutArea.text += this.df2.format(new Date()).replace("AM","上午").replace("PM","下午") + "\n";
//套用 第三組 日期格式化物件 --> 因為印出來是 AM 與 PM 所以用置換方法 改成上午與下午
this.printOutArea.text += this.df3.format(new Date()).replace("AM","上午").replace("PM","下午") + "\n";
//套用 第四組 日期格式化物件 --> 因為印出來是 AM 與 PM 所以用置換方法 改成上午與下午
//第四組因為格式化並不會印出中文 所以 要判斷星期幾 並且套換成中文
if(this.df4.format(new Date()).indexOf("Mon")!=-1){
this.printOutArea.text += this.df4.format(new Date()).replace("AM","上午").replace("PM","下午").replace("Mon","星期一") + "\n";
}
if(this.df4.format(new Date()).indexOf("Tue")!=-1){
this.printOutArea.text += this.df4.format(new Date()).replace("AM","上午").replace("PM","下午").replace("Tue","星期二") + "\n";
}
if(this.df4.format(new Date()).indexOf("Wed")!=-1){
this.printOutArea.text += this.df4.format(new Date()).replace("AM","上午").replace("PM","下午").replace("Wed","星期三") + "\n";
}
if(this.df4.format(new Date()).indexOf("Thu")!=-1){
this.printOutArea.text += this.df4.format(new Date()).replace("AM","上午").replace("PM","下午").replace("Thu","星期四") + "\n";
}
if(this.df4.format(new Date()).indexOf("Fri")!=-1){
this.printOutArea.text += this.df4.format(new Date()).replace("AM","上午").replace("PM","下午").replace("Fri","星期五") + "\n";
}
if(this.df4.format(new Date()).indexOf("Sat")!=-1){
this.printOutArea.text += this.df4.format(new Date()).replace("AM","上午").replace("PM","下午").replace("Sat","星期六") + "\n";
}
if(this.df4.format(new Date()).indexOf("Sun")!=-1){
this.printOutArea.text += this.df4.format(new Date()).replace("AM","上午").replace("PM","下午").replace("Sun","星期日") + "\n";
}
}
//驗證結果事件
private var vResult:ValidationResultEvent;
//格式化日期
private function formatHandler():void{
vResult = dateVal.validate();
//如果驗證結果是合法的結果 才進行 日期格式的轉換
if (vResult.type==ValidationResultEvent.VALID) {
formattedDate.text = df2.format(dob.text);
}
//錯誤的話就清空結果字串欄位
else {
formattedDate.text= "";
}
}
]]>
</mx:Script>
<!--建立 四組 DateFormatter 日期格式化物件 屬性 formatString 輸入遮罩字串-->
<mx:DateFormatter id="df1" formatString="YYYY/M/D A L:N"/>
<mx:DateFormatter id="df2" formatString="YYYY/M/D A LL:NN:SS"/>
<mx:DateFormatter id="df3" formatString="YYYY年M月D日 ALL時NN分SS秒"/>
<mx:DateFormatter id="df4" formatString="YYYY年M月D日 EEE ALL時NN分SS秒"/>
<!--寫標題 輸出區 執行-->
<mx:Label text="JAVA 實力評量 JVD02 使用 FLEX 實作"/>
<mx:TextArea width="350" height="170" id="printOutArea"/>
<mx:Button label="執行" click="clickHandler()"/>
<!--補充的部分為 ADOBE 對於 DateFormatter 的使用範例-->
<mx:Label text="========補充========" color="#FF0A0A"/>
<mx:Label text="請輸入日期格式 (mm/dd/yyyy)"/>
<mx:HBox>
<mx:TextInput id="dob"/>
<mx:Button label="驗證" click="formatHandler()"/>
</mx:HBox>
<mx:HBox>
<mx:Label text="格式化日期"/>
<!--TextInput 屬性 editable 代表是否為一個可修改的欄位 -->
<mx:TextInput editable="false" id="formattedDate"/>
</mx:HBox>
<!--日期驗證器 屬性 source 代表 Binding {dob} 至個物件(這裡是一個文字欄位)
署另 inputFormat 代表可以輸入的日期格式 -->
<mx:DateValidator id="dateVal" source="{dob}" property="text" inputFormat="mm/dd/yyyy"/>

</mx:Application>

2009-01-21

JVD01FLEX 樂透程式 - 使用 FLEX-AS3 實作 JAVA 應用程式

今天大掃除找到以前學 JAVA 的書
裡面有很多題目
所以就想說把他的題目用 FLEX-AS3 來實作
不過前面當然是很簡單囉~
如果有朋友自學或是剛入門的也可以看看囉~@@

希望不會後面太難 然後我自己寫不出來了 哈~~

本文章同時發表於 http://gjo4rul4.blogspot.com

第一彈 JVD01FLEX 樂透程式 - 使用 FLEX-AS3 實作 JAVA 應用程式 

題目敘述:
請使用 MATH 或 RANDOM 類別所提供的亂數函數及陣列來設計一模擬樂透彩開獎的程式
程式執行後會產生 6 個號碼以及 1 個特別號

1.每次執行程式皆會亂數產生 6 個號碼及 1 個特別號
2.號碼之間不可重複出現
3.所有號碼介於 01 ~ 42 之間
4.個位數號碼顯示時請漁號碼前加入 "0" 例如 7 要顯示 07

評分項目
每次執行程式皆會亂數產生 6 個號碼及 1 個特別號 - 4
號碼之間不可重複出現 - 4
所有號碼介於 01 ~ 42 之間 - 4
個位數號碼顯示時請於號碼前加入 "0" 如 7 要顯示 07 - 3

總分 15

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

by Author :

這個實作的程式 我寫了兩個方法
通常一般寫程式的初學者應該會用方法2
先取出亂數並且判斷陣列中是否重複
雖然這個範例中差異並不會很大
但是如果在 1000 個亂數中要取出 800 個 (或更大的數字)
兩者的效能就會以方法一較有效率

方法1 -> 1000次寫入陣列 800次產生亂數
方法2 -> 800次寫入陣列 800次(以上)產生亂數

-------------以下為程式碼------------


<?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;
/*
題目敘述:
請使用 MATH 或 RANDOM 類別所提供的亂數函數及陣列來設計一模擬樂透彩開獎的程式
程式執行後會產生 6 個號碼以及 1 個特別號

1.每次執行程式皆會亂數產生 6 個號碼及 1 個特別號
2.號碼之間不可重複出現
3.所有號碼介於 01 ~ 42 之間
4.個位數號碼顯示時請漁號碼前加入 "0" 例如 7 要顯示 07

評分項目
每次執行程式皆會亂數產生 6 個號碼及 1 個特別號 - 4
號碼之間不可重複出現 - 4
所有號碼介於 01 ~ 42 之間 - 4
個位數號碼顯示時請於號碼前加入 "0" 如 7 要顯示 07 - 3

總分 15

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

by Author :

這個實作的程式 我寫了兩個方法
通常一般寫程式的初學者應該會用方法2
先取出亂數並且判斷陣列中是否重複
雖然這個範例中差異並不會很大
但是如果在 1000 個亂數中要取出 800 個 (或更大的數字)
兩者的效能就會以方法一較有效率

方法1 -> 1000次寫入陣列 800次產生亂數
方法2 -> 800次寫入陣列 800次(以上)產生亂數


*/

//方法1
private function clickHandler1():void{
//清空印出區域
this.printOutArea.text = "";
//建立集合物件
var arc:ArrayCollection = new ArrayCollection();
//執行 42 次的迴圈 >> 將 42 個數字依序塞入集合物件
for(var i:int=1;i<=42;i++){
//如果 數字 小於 10 的話必須在 數字前面加上 0
if(i<10){
//將數字 "塞入" 集合物件
arc.addItem("0"+i);
}else{
//將數字 "塞入" 集合物件
arc.addItem(i);
}
}
//用亂數取出 6 個號碼
//執行 6 次迴圈
for(var j:int=0;j<6;j++){
//先取出 亂數*集合物件的長度
var number:int = Math.floor(Math.random()*arc.length);
//將集合物件的第 x 個物件取出並印在打印區 x 代表剛剛取出的亂數 ( 但不會超過集合物件的長度 )
this.printOutArea.text = this.printOutArea.text + "第 " + (j+1) + " 個號碼 : "+ arc.getItemAt(number) + "\n";
//將抽到的號碼從集合物件移除
arc.removeItemAt(number);
}
//再抽出最後一個號碼 為特別號 , 這個就不用再移除物件了 因為已經結束了
this.printOutArea.text = this.printOutArea.text + "特別號 : "+ arc.getItemAt(Math.floor(Math.random()*arc.length)) + "\n";

}
//方法2
private function clickHandler2():void{
//清空印出區域
this.printOutArea.text = "";
//建立陣列
var array:Array = new Array();
//陣列必須要有 7 個數字才停止運算
while(array.length < 7){
//建立亂數 1~42 中取 1
var number:int = Math.floor(Math.random()*42)+1;
//數字是否重覆旗標
var hasNumber:Boolean = false;
//逐次比對陣列內所有的數字
for(var i:int=0;i<array.length;i++){
//如果發現陣列已經有得到的亂數就把重複旗標設定為 true
if(number == array[i]){
hasNumber = true;
}
}
//如果沒有發現重複的數值 塞入亂數
if(!hasNumber){
array.push(number);
}

}
//取出依序取出前六個號碼
for(var j:int=1;j<=6;j++){
//如果小於 10 就在 數字前面 + 上 0
if(array[j-1]<10){
this.printOutArea.text = this.printOutArea.text + "第 " + j + " 個號碼 : "+ "0"+array[j-1] + "\n";
}else{
this.printOutArea.text = this.printOutArea.text + "第 " + j + " 個號碼 : "+ array[j-1] + "\n";
}

}
//取出特別號
//如果小於 10 就在 數字前面 + 上 0
if(array[6]<10){
this.printOutArea.text = this.printOutArea.text + "特別號 : "+ "0"+array[6] + "\n";
}else{
this.printOutArea.text = this.printOutArea.text + "特別號 : "+ array[6] + "\n";
}

}

]]>
</mx:Script>
<!--建立三個 FLEX 物件-->
<mx:Text text="JAVA 實力評量 JVD01 使用 FLEX 實作 &#xa;&#xa;模擬樂透彩 (易)&#xa;&#xa;程式執行號產生六個號碼以及一個特別號"/>
<mx:TextArea width="800" height="400" id="printOutArea"/>
<mx:Button label="執行 方法 1" click="clickHandler1()"/>
<mx:Button label="執行 方法 2" click="clickHandler2()"/>
</mx:Application>


2009-01-16

FLEX AS3 使用 SOCKET 連接 POP3

範例檔如下

但是~

還不知道讀回來的資料要怎麼處理 @@ 頭痛~~


<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" fontSize="12">

<mx:Script>

<![CDATA[

public var mysocket:Socket = null;



private function startConnect():void{

this.mysocket = new Socket("pop3.mail2000.com.tw",110);

this.mysocket.addEventListener(ProgressEvent.SOCKET_DATA,process);



}

private function endConnect():void{

this.mysocket.writeUTFBytes("quit\n");



this.mysocket.flush();

this.textArea.text = this.textArea.text +this.mysocket.readUTFBytes(this.mysocket.bytesAvailable);

}



private function process(event:ProgressEvent):void{

var tmpStat:String = this.mysocket.readUTFBytes(this.mysocket.bytesAvailable);



if(tmpStat.indexOf("+OK MPOP3 Server")!= -1){

mysocket.writeUTFBytes("user 帳號\n");

}

if(tmpStat.indexOf("+OK Password required")!= -1){

mysocket.writeUTFBytes("pass 密碼\n");

}



if(tmpStat.indexOf("+OK heydod has")!= -1){

mysocket.writeUTFBytes("retr 1\n");

}

this.textArea.text = this.textArea.text + tmpStat;

mysocket.flush();

}

]]>

</mx:Script>

<mx:TextArea width="100%" height="50%" id="textArea"/>

<mx:HBox width="100%" horizontalAlign="center">

<mx:Button label="連線" click="startConnect()"/>

<mx:Button label="斷線" click="endConnect()"/>

</mx:HBox>



</mx:Application>

2009-01-13

ColdFusion,CFM 將 email 格式轉為address與name

由 CFPOP TAG 讀回來的 寄件人等等的資料都是以 "姓名"<地址> 這種方式儲存
但是要姓名或是地址取出來就麻煩了~

如果不用 JAVAMAIL API 的話應該就是用字串去判斷了
還好 CFM 本身有 JAVA 的底子~ 所以很容易的就可以把字串分開了~

PS. 必須將電子郵件設定為建構子才可以取出地址與名字
PS. 如果 TO 的電子郵件為多個 必須先用 字串切割把每個地址切出來

important : 因為我已經將 POP 取回來的資料放入資料庫中
但是讀出來的資料與 cfpop 讀回來的 from , to 都是一樣的格式

範例碼 ==  請自己摳回去用 DW 整理一下巴 
==============


<cfprocessingdirective pageencoding="utf-8">

<cfcontent type="text/html; charset=utf-8">

<cfset setEncoding("URL", "utf-8")>

<cfset setEncoding("Form", "utf-8")>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>無標題文件</title>

</head>

<cfquery datasource="maildb" name="query">

select *

from maildb

</cfquery>

<CFOBJECT type="java" class="javax.mail.internet.InternetAddress" name="mailObj">

<body>

<table>

<cfoutput query="query">

<tr>

<cfscript>

mailObj.init(m_from);

</cfscript>

<td>#mailObj.getAddress()#</td>

<td>#mailObj.getPersonal()#</td>

<cfscript>

mailObj.init(m_replyto);

</cfscript>

<td>#mailObj.getAddress()#</td>

<td>#mailObj.getPersonal()#</td>

</tr>

</cfoutput>

</table>

</body>

</html>