942 Spring C++ 程式作業一:
簡易檔案匣與檔案設計
簡易檔案匣與檔案設計
作業目標:
-
複習 C 語言中各種流程控制: for, while, if, switch, 函式等等,
-
複習 C 語言中各種基本資料型態以及 struct 的運用
-
複習 linked list 資料結構的基本運作
-
練習 C 語言中基本的鍵盤輸入與螢幕輸出
-
請使用 C 語言語法實作 (如果你的程式副檔名用 .c 的話, VC6 會自動以 ANSI C 的
語法來檢查你的程式)
請下載範例執行程式, 資料檔案prog1a.in,
執行結果如附件所示
輸入 prog1 < prog1a.in 可以自動執行基本的測試,
(你也可以直接執行 prog1 以交談的方式來執行)
程式基本要求
這個作業希望大家模擬一個簡單的資料匣管理程式,
假設操作者在一個資料匣中可以存放多筆資料,
可以對這些儲存下來的資料做一些基本的處理。
這樣的應用程式的基本架構擴充之後有許多應用,
第一當然是大家熟悉的檔案系統, 或是名片管理系統,
或是公司組織架構, 或是巢狀 HTML 語法的表示。
-
程式的基本功能如下:
-
在輸入一筆資料時必須輸入資料檔案的名稱和資料檔案的內容,
-
在一個資料匣中不可以有兩個相同檔案名稱的檔案
-
允許程式操作者查詢資料匣中目前有哪些檔案
-
允許程式操作者查詢某一個指定檔案的內容
-
程式實作時請注意下列事項:
-
在記憶體中請以 C 語言的 struct 語法定義資料匣的結構來存放資料匣內的各個檔案,
這個資料匣也請設定它的名稱為 "root", 例如:
typedef struct
{
...
} Folder;
-
在記憶體中請以 C 語言的 struct 語法定義記錄檔案資料的結構,
這個結構中最主要的成員包括檔案的名稱和檔案的內容, 例如:
typedef struct
{
...
} File;
-
資料檔案的名稱和資料檔案的內容在記憶體中請用字元陣列來儲存,
字元陣列的記憶體請以 malloc() 動態的配置方法來取得,
另外請記得在不需使用的時候以 free() 釋放所取得的記憶體
char buf1[100], *buf2;
...
scanf("%s", buf1);
...
buf2 = (char *) malloc(strlen(buf1)+1);
strcpy(buf2, buf1);
...
...
free(buf2);
-
因為在這個資料匣中打算存放的檔案個數不確定,
假設未來允許程式操作者隨時增加一個檔案,
刪除任意檔案,
因此在資料匣的結構內請設計一個 linked list
資料結構來存放多筆檔案的結構,
目前基本的程式要求裡只需要能夠在 linked list
中增加節點, 程式結束時要能夠釋放所有的節點,
同時能夠搜尋每一個節點的資料內容就可以了。
-
你的程式的主要邏輯應該是一個迴圈,
不斷地讀取使用者的輸入,
完成使用者所要求的工作
-
為了簡化這個程式,
目前在這個資料匣裡暫時不存放子資料匣,
但是如果在這個資料匣中允許存放子資料匣的話,
其實你所實作的是一個一般化的樹狀架構,
每一個存放的檔案是一個終端節點 (leaf),
每一個子資料匣是一個內部節點 (internal node),
每一個內部節點可以有任意個數的子節點
-
你可以自己加入其它你想到的功能,
如果有做的話,
請在心得中說明,
才能夠酌量加分
程式實作格式要求:
-
請務必以函式的語法,
將程式分解成多個邏輯上功能相近的段落,
以限制區域變數的使用,
減少程式錯誤的機會,
增加程式的可閱讀性,
每一個函式的大小應該維持在 30 列到 50 列以內
-
命名:
除掉暫時變數 i,j, ... 之外,
程式中所用到的變數名稱, 自定結構的名稱, 欄位的名稱,
以及函式的名稱請用有意義的英文單字或片語, 例如
寫一個在資料匣中搜尋檔名的函式, 它的名稱可以定為
FindFileInFolder(), 一個檔案串列指標的欄位名稱可以定為
ptrToFileList 等等,
如此在閱讀程式的時候, 程式碼本身可以是自己的註解,
不需要另外在以註解來解釋你的變數或是函式的用途
-
程式排版請依照大括號一層一層內縮對齊, 例如:
int i, j;
...
if (i>0)
{
for (j=0; j<10; j++)
{
...
}
...
}
else
{
...
...
}
-
請不要使用全域 (Global) 的變數
進一步增加程式的功能
原則上你想要增加什麼功能都是可以的,
記得在心得中寫出來,
這樣我才會注意到,
也才能夠幫你加一些分數,
現在程式很簡單,
有時間的話你可以多增加一些功能,
例如刪除檔案,
子資料匣,
刪除資料匣,
檔案名稱排序,
檔案內容資料搜尋等等。