Saturday, February 27, 2010

費氏數列(Fibonacci Number)

讀資料結構,有時候會突然撞牆,每每已了解的知識,太久不用就會忘掉!
費氏數列(Fibonacci Number)是種很有趣的數列,
他的規則如下:








所以大致排列方式為

+-----+---+---+---+---+---+---+---+--------+
| n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ...... |
+-----+---+---+---+---+---+---+---+--------+
| Fib | 0 | 1 | 1 | 2 | 3 | 5 | 8 | ...... |
+-----+---+---+---+---+---+---+---+--------+

如果用樹狀圖會更容易了解





























使用遞迴的方式,可以得到費氏數列的值:

#include
int X(int n){
if(n<=1) return n;
else return X(n-1)+X(n-2);
}
int main(){
printf("%d", X(6));
getch();
return 0;
}

Monday, February 08, 2010

以陣列實作堆疊

在學習資料結構時,最重要的一個課題就是堆疊、駐列等結構。以下簡介以陣列實作堆疊的案例:

先簡介一些必要變數與函數:

#define N 100 //堆疊最大容量;
int stack[N]; //宣告stack;
int sp; //堆疊的指標;

StackOverflow()當堆疊已經滿的時候告知使用者"Stack Over flow",也就是不能再push資料;
StackUnderflow()當堆疊已經空的時候高知使用者"Stack Under flow",也就是不能再pop資料;

void StackOverflow(){
printf("\nStack Over flow");
}
void StackUnderflow(){
printf("\nStack Under flow");
}

CreateStack()當需要堆疊stack時,讓其指標初始位置定在-1,因為C語言的陣列是從0開始編排;

void CreateStack(){
sp=-1;
}

IsStackEmpty()判斷堆疊stack是否已空;
IsStackFull()判斷堆疊stack是否已滿;

bool IsStackEmpty(){
return (sp==-1);
}
bool IsStackFull(){
return (sp==(N-1));
}

AddStack(int item)將一筆資料item丟入堆疊stack中,過程須判斷stack還有沒有空間;

void AddStack(int item){ //void AddStack(ItemType item){
if(IsStackFull())StackOverflow();
else stack[++sp]=item;
}

DeleteStack()將堆疊stack最上面的一筆資料移除,但實際上只是將stack的指標sp往下移動,在過程中要先判斷stack是否已空,而不能在移動sp;

int DeleteStack(){ //ItemType DeleteStack(){
if(IsStackEmpty()) StackUnderflow();
else return stack[sp--];
}

StackTop()將堆疊stack最上面的值複製出來;

int StackTop(){ //ItemType StackTop(){
if(IsStackEmpty()) StackUnderflow();
else return stack[sp];
}


以下是一個簡單的堆疊範例:

#include
#include
/***************************************
#ifndef _STDBOOL_H
#define _STDBOOL_H
#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1
#endif
***************************************/

#define N 100 //const int N=100;
int stack[N]; //ItemType stack[N];
int sp;
void StackOverflow(){
printf("\nStack Over flow");
}
void StackUnderflow(){
printf("\nStack Under flow");
}
void CreateStack(){
sp=-1;
}
bool IsStackEmpty(){
return (sp==-1);
}
bool IsStackFull(){
return (sp==(N-1));
}
void AddStack(int item){ //void AddStack(ItemType item){
if(IsStackFull())StackOverflow();
else stack[++sp]=item;
}
int DeleteStack(){ //ItemType DeleteStack(){
if(IsStackEmpty()) StackUnderflow();
else return stack[sp--];
}
int StackTop(){ //ItemType StackTop(){
if(IsStackEmpty()) StackUnderflow();
else return stack[sp];
}
void Status(){
int i;
printf("sp:%d\n", sp);
printf("stack:\n");
for(i=0; i<=sp; i++){
printf("%d\t", i);
}
printf("\n");
for(i=0; i<=sp; i++){
printf("%d\t", stack[i]);
}
}
int main(){
int input, copy;
char ch;
CreateStack();
Status();
do{
printf("\nInput:");
scanf("%d", &input);
AddStack(input);
Status();
printf("\nDo you want to input a number?(y/n):");
ch=_getche();
}while(ch=='y');
do{
printf("\nDo you want to delete a number?(y/n):");
ch=_getche();
if(ch=='y')
DeleteStack();
printf("\n");
Status();
}while(ch=='y');
copy=StackTop();
printf("\ncopy:%d", copy);
getch();
return 0;
}

以下是程式結果:

sp:-1
stack:


Input:33
sp:0
stack:
0
33
Do you want to input a number?(y/n):y
Input:44
sp:1
stack:
0 1
33 44
Do you want to input a number?(y/n):y
Input:55
sp:2
stack:
0 1 2
33 44 55
Do you want to input a number?(y/n):n
Do you want to delete a number?(y/n):y
sp:1
stack:
0 1
33 44
Do you want to delete a number?(y/n):n
sp:1
stack:
0 1
33 44
copy:44

Wednesday, October 14, 2009

MS-DOS指令說明

以下列出一些常用的DOS指令

DIR指令

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

[drive:][path][filename]
指定要顯示的磁碟機、目錄或檔案。

/A 依照指定的檔案屬性來顯示檔案。
attributes D 目錄 R 唯讀檔
H 隱藏檔 A 保存檔
S 系統檔案 - 無意義
L 重新分析點 - 首碼表示否定
/B 使用單純格式 (沒有標頭資訊或摘要)。
/C 顯示檔案大小千位數分隔符號。這是預設值。使用 /-C 來停用
分隔符號的顯示。
/D 與寬的列表格式相同,但是依照欄來排序。
/L 使用小寫顯示。
/N 使用新的長列表格式,檔名會顯示在最右方。
/O 依照指定的排序順序來列出檔案。
sortorder N 依名稱 (英文字母) S 依大小 (最小的在前)
E 依副檔名 (英文字母) D 依照日期與時間 (日期較早的在前)
G 先列出子目錄 - 表示相反的順序
/P 當資料填滿整個螢幕時暫停顯示。
/Q 顯示檔案擁有者。
/R 顯示檔案的替代資料流。
/S 顯示指定目錄及所有子目錄中的檔案。
/T 指定用來顯示或排序的時間欄位
timefield C 建立
A 上次檔案存取時間
W 上次寫入檔案時間
/W 使用寬的列表格式。
/X 顯示對非 8.3 格式的檔案產生的短檔名。這個格式和 /N 相同,
但是短檔名會插入在長檔名之前。如果沒有長檔名存在,該處會
顯示空白。
/4 顯示四位數的年份

參數可能會在 DIRCMD 環境變數預先設定。您可以在任何參數使用連字號字首(-)
來覆蓋預先的設定--例如: /-W。

Saturday, September 26, 2009

線上免費下載

在做網頁時,常常需要很多按鈕圖片,如果平常沒有做好蒐集的工作,往往在要用的時候找不到好用的愛紐圖片。

如果你有以上問題可以到 http://365icon.com/ 這個網站來尋寶。除了圖資豐富外,畫質都相當不錯喔!

寄件者 Blogger
我就挑選很懷舊的"瑪莉歐"的套圖吧!


寄件者 Blogger
這些圖片質感都很不錯,真是個值得推薦的好網站!


寄件者 Blogger

線上免費下載ICON圖檔的網站

常常會有以下問題:
  1. 總覺得自己桌面的icon很醜。
  2. 當使用RocketDock等工具時,icon放大影像都會模糊掉。
  3. 線上下載的套裝icon沒有提供所有應用程式的套圖,總覺得有點缺憾。
如果你有以上的問題,那你可以到http://www.iconfinder.net/找尋你喜歡的icon囉!

寄件者 Blogger
哇! 好多豐富的icon啊! 快去用用看吧!

寄件者 Blogger