942 Spring C++ 程式作業一:
        簡易檔案匣與檔案設計

簡易檔案匣與檔案設計

作業目標:

  1. 複習 C 語言中各種流程控制: for, while, if, switch, 函式等等,

  2. 複習 C 語言中各種基本資料型態以及 struct 的運用

  3. 複習 linked list 資料結構的基本運作

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

  5. 請使用 C 語言語法實作 (如果你的程式副檔名用 .c 的話, VC6 會自動以 ANSI C 的 語法來檢查你的程式)

請下載範例執行程式, 資料檔案prog1a.in, 執行結果如附件所示

  輸入 prog1 < prog1a.in 可以自動執行基本的測試, (你也可以直接執行 prog1 以交談的方式來執行)

程式基本要求

這個作業希望大家模擬一個簡單的資料匣管理程式, 假設操作者在一個資料匣中可以存放多筆資料, 可以對這些儲存下來的資料做一些基本的處理。 這樣的應用程式的基本架構擴充之後有許多應用, 第一當然是大家熟悉的檔案系統, 或是名片管理系統, 或是公司組織架構, 或是巢狀 HTML 語法的表示。

  1. 程式的基本功能如下:

    1. 在輸入一筆資料時必須輸入資料檔案的名稱和資料檔案的內容,

    2. 在一個資料匣中不可以有兩個相同檔案名稱的檔案

    3. 允許程式操作者查詢資料匣中目前有哪些檔案

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

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

    1. 在記憶體中請以 C 語言的 struct 語法定義資料匣的結構來存放資料匣內的各個檔案, 這個資料匣也請設定它的名稱為 "root", 例如:
          typedef struct 
          {
              ...
          } Folder;
      

    2. 在記憶體中請以 C 語言的 struct 語法定義記錄檔案資料的結構, 這個結構中最主要的成員包括檔案的名稱和檔案的內容, 例如:
          typedef struct 
          {
              ...
          } File;
      

    3. 資料檔案的名稱和資料檔案的內容在記憶體中請用字元陣列來儲存, 字元陣列的記憶體請以 malloc() 動態的配置方法來取得, 另外請記得在不需使用的時候以 free() 釋放所取得的記憶體
          char buf1[100], *buf2;
          ...
          scanf("%s", buf1);
          ...
          buf2 = (char *) malloc(strlen(buf1)+1);
          strcpy(buf2, buf1);
          ...
          ...
          free(buf2);
      

    4. 因為在這個資料匣中打算存放的檔案個數不確定, 假設未來允許程式操作者隨時增加一個檔案, 刪除任意檔案, 因此在資料匣的結構內請設計一個 linked list 資料結構來存放多筆檔案的結構, 目前基本的程式要求裡只需要能夠在 linked list 中增加節點, 程式結束時要能夠釋放所有的節點, 同時能夠搜尋每一個節點的資料內容就可以了。

    5. 你的程式的主要邏輯應該是一個迴圈, 不斷地讀取使用者的輸入, 完成使用者所要求的工作

  3. 為了簡化這個程式, 目前在這個資料匣裡暫時不存放子資料匣, 但是如果在這個資料匣中允許存放子資料匣的話, 其實你所實作的是一個一般化的樹狀架構, 每一個存放的檔案是一個終端節點 (leaf), 每一個子資料匣是一個內部節點 (internal node), 每一個內部節點可以有任意個數的子節點

  4. 你可以自己加入其它你想到的功能, 如果有做的話, 請在心得中說明, 才能夠酌量加分

程式實作格式要求:

  1. 請務必以函式的語法, 將程式分解成多個邏輯上功能相近的段落, 以限制區域變數的使用, 減少程式錯誤的機會, 增加程式的可閱讀性, 每一個函式的大小應該維持在 30 列到 50 列以內

  2. 命名: 除掉暫時變數 i,j, ... 之外, 程式中所用到的變數名稱, 自定結構的名稱, 欄位的名稱, 以及函式的名稱請用有意義的英文單字或片語, 例如 寫一個在資料匣中搜尋檔名的函式, 它的名稱可以定為 FindFileInFolder(), 一個檔案串列指標的欄位名稱可以定為 ptrToFileList 等等, 如此在閱讀程式的時候, 程式碼本身可以是自己的註解, 不需要另外在以註解來解釋你的變數或是函式的用途

  3. 程式排版請依照大括號一層一層內縮對齊, 例如:
        int i, j;
        ...
        if (i>0)
        {
            for (j=0; j<10; j++)
            {
                ...
            }
            ...
        }
        else
        {
            ...
            ...
        }
    

  4. 請不要使用全域 (Global) 的變數

進一步增加程式的功能

原則上你想要增加什麼功能都是可以的, 記得在心得中寫出來, 這樣我才會注意到, 也才能夠幫你加一些分數, 現在程式很簡單, 有時間的話你可以多增加一些功能, 例如刪除檔案, 子資料匣, 刪除資料匣, 檔案名稱排序, 檔案內容資料搜尋等等。

C++ 程式設計課程 首頁

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