942 Spring C++ 程式作業四:
        簡易檔案匣與檔案設計 (二)

說明

這個作業還有下次的作業延續 作業一, 但是需要使用物件導向的方式來設計, 基本的功能類似檔案系統介面的操作與管理, 可以新增檔案, 可以新增資料匣, 可以搜尋檔案名稱, 可以搜尋檔案內容, 可以刪除檔案與資料匣

範例執行程式prog4_v1.exe, 資料檔案prog4a.in, 下載後可以直接透過鍵盤交談式執行,也可以用

直接執行資料檔案中的命令, 程式結束後會將所建立的資料匣及檔案架構存檔, 下次執行會重新讀入

作業目標:

  1. 練習以 C++ 語法實作指定的類別架構 (包括繼承與組合)

  2. 練習物件間的分工合作 (封裝與委託)

  3. 練習序列化 (Serialization) 地讀檔案與存檔案

  4. 練習 iostream 中基本的鍵盤輸入與螢幕輸出

  5. 練習使用 string 與 vector 等等基本的樣板類別

  6. 練習覆蓋 (overriding) 基礎類別中的介面函式

  7. 練習使用多型指標

  8. 練習使用異質容器

程式要求

  1. 程式功能要求如下:

    1. 於階層式資料匣中移動

    2. 新增檔案: 輸入資料檔案的名稱和資料檔案的內容, 在一個資料匣中不可以有兩個相同檔案名稱的檔案

    3. 新增資料匣: 輸入資料匣的名稱, 在一個資料匣中不可以有兩個相同名稱的子資料匣

    4. 刪除指定檔案

    5. 刪除指定資料匣以及所有內部的檔案及子資料匣

    6. 允許操作者查詢目前資料匣中有哪些檔案與子資料匣

    7. 允許操作者查詢子資料匣中有哪些檔案與子資料匣

    8. 允許操作者查詢某一個指定檔案的內容

    9. 允許操作者以檔名搜尋第一個具有指定名稱的檔案或資料匣

    10. 允許操作者以檔案內容的關鍵字串搜尋第一個包括此字串的檔案

    11. 計算檔案大小或是資料匣內所有檔案的大小總和

    12. 程式結束時自動將輸入的資料儲存在檔案裡

    13. 程式開始時自動由檔案中讀入上一次執行時的資料: 請運用建構元實作

  2. 程式實作時請注意下列事項:

    1. 請運用 memory_leak.h, memory_leak.cpp 記憶體的錯誤

    2. 這個類別架構是一個非常常用的樣式 (pattern), 如下圖左邊的三個類別 Entry, File 和 Folder, 我們稱為 Composite Pattern
      這個樣式主要用來實作樹狀的架構, 其中每一個 File 類別的物件是樹狀架構中的葉節點 (Leaf node), 每一個 Folder 類別的物件是樹狀架構中的內部節點 (Internal node), 這兩種物件都有一個共同的特性就是它們都是上層節點的子節點, 因此我們把這種共同的架構歸納出來成為它們的父類別 Entry 類別。 Folder 類別的物件裡面需要記住其下層物件 (可以是 File 物件 或是 Folder 物件), 因此我們看到 Folder 類別可以和多個 Entry 類別的物件有關係, 圖中 Folder 類別旁邊中空的菱形是 UML 語法中代表聚合 Aggregation 的意思, 表示一個 Folder 裡容納多個 Entry, 同時所包含的 Entry 物件的生命週期和 Folder 沒有關係 (刪除 Folder 物件時, 不見得一定要刪除所有容納的物件, 例如可以將所容納的物件移到其他資料匣下)。

    3. 在上面的架構裡, Folder 類別中的 entries 物件成員 是一個異質的陣列, 請注意很多搜尋與列印的動作中, 都會運用到 Entry * 型態的多型指標, 將 File 和 Folder 類別的物件一視同仁, 以簡化處理的機制。

    4. 你可以參考在這幾個類別圖中我所列的界面函式來實作, 但是並不限定於這些界面。

  3. 書面報告之要求:

    1. 除了基本的心得, 程式架構說明外

    2. 請特別分析一下你的程式裡是否有不斷重複的程式架構, 有沒有什麼辦法簡化

進一步增加程式的功能

原則上你想要增加什麼功能都是可以的, 記得在心得中寫出來, 這樣我才會注意到, 可以多得到一些分數, 例如移動檔案, 移動子資料匣, 複製檔案與資料匣, 檔案名稱排序等等。

C++ 程式設計課程 首頁

製作日期: 5/12/2006 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@cs.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程系 Lagoon