2003 Spring C++ 程式作業二:
(手機)電話簿管理程式

(手機)電話簿管理程式

這個程式要大家寫的東西又是大家很熟悉的應用了, 所以大家一定都能夠很快地知道程式的基本要求, 也一定都有很多點子可以發揮, 所以我也就不用在這裡放上示範的執行程式了, 在這個應用程式裡希望大家能夠很快地開始以物件化的方式思考程式的架構, 在這樣子的程式裡其實有很多很多物件化的觀念需要大家去練習, 請盡量跳脫你原來設計 C 程式時 top-down 的功能分解方式, 先從刻劃物件的組成與描述物件的功能開始著手吧。

這個程式希望大家能夠練習下列:

  1. 熟悉運用 C++ 製作物件導向程式的工具, 包括 Visual Studio 提供的一些輔助, 分檔案編譯連結的基本形式。

  2. 了解設計物件導向程式的基本流程

  3. 嘗試將系統中的類別/物件描述出來,建立軟體的靜態模型

  4. 嘗試以 UML 表示類別及類別之間的相關架構 (可以用手畫,或是用 Powerpoint, Visio, PowerDesigner,或是 Rose 等等)

  5. 嘗試定義類別/物件的介面

  6. 小心地封裝所有的製作細節

  7. 請特別注意識別名稱(identifier) (包括變數名稱,類別名稱與函式名稱)的命名, 實在不知道怎樣用英文命名的話可以查詢漢英字典或是同義字 (thesaurus) 辭典也許可以給你一些幫助

  8. 請撰寫類別的測試函式

  9. 請注意記憶體的配置與釋放

功能要求

  1. 新增資料 (每個人可能有多個電話號碼)

  2. 查詢資料
    1. 給定姓名查詢, 給定電話號碼查詢
    2. 依 (固定) 群組分別瀏覽所有資料

  3. 維護資料

  4. 刪除資料 (人/電話)

  5. 存檔/讀檔

基本程式要求

以下的要求為嚴格的要求, 如果不符合的話請不要繳交過來

  1. 請不要用全域 (global) 的變數

  2. 請不要用 friend function 或是 friend class (除非你要製作 List 之類的容器類別)

  3. 類別內請不要用 public 的資料成員

  4. 請不要用 struct 來描述物件 (struct 相當於 class 裡所有的資料成員都是 public), (除非你的 struct 實在只是為了整理單純的資料, 例如在製作類似 List 的容器類別時你需要定義每一個 Node, 就算在這個時候你也可以考慮在 List 類別內自行定義 struct)

  5. 如下圖所示, 請不要用單一陣列配合 struct 來組織所有的 人名/電話/屬性 資料, 也就是說在你交過來的作業裡不可以只有一個單一類別, 或是根本就連一個類別都沒有。 (個別類別裡的資料如果你需要用陣列的話不在此限)

  6. 請盡量不要替類別內 private 的資料成員定義 get/set 成員函式, 也就是說你的介面 (interface) 應該 盡可能地 完成一些除了存取資料之外的功能

    例如:你有一個 PhoneNumber 的類別, 這樣的物件裡面負責維護著 private 的電話號碼的資料, 如果你在設計程式的時候希望替 PhoneNumber 類別定義一個介面叫做 char *getPhoneNumber() 的成員函式, 請稍後, 你應該可以再進一步想一下, 為什麼你需要這個函式呢? 比方說你希望拿到電話號碼然後列印在螢幕上, 那麼你可以考慮替 PhoneNumber 類別定一個介面叫做 printOnScreen(ostream &out), 如此你就不需要把讓 PhoneNumber 管理的資料拋到類別外面了, 這樣的情況也會發生在類別資料存檔/讀檔的時候...

  7. 請用 new/delete, new[]/delete[] 取代 free/malloc

  8. 請以 MFC debugger 的功能自行檢查是否有 memory leakage

  9. 請以 VC 6.0 撰寫, 使用文字介面

請先自行構思你的程式, 然後再參考下面的說明

  1. 你可以先拿我們給大家的 3 Bags 程式來熟悉一下, 可以嘗試著先寫一個只有一個 Bag 的應用程式, 這個 Bag 裡可以有 n 個球 (Ball), 所以程式需要有 Bag 和 Ball 的類別, 功能可以包括加入一個球和移除一個球

  2. 在我們的電話簿程式裡你可以先定義 "人" 和 "電話" 這兩個類別, 讓每個人可以有 n 個電話, 可以新增, 可以刪除, 可以修改

  3. 我們的電話簿程式裡總共會有哪些類別的物件呢?

  4. 這些物件的關係是什麼?

  5. 這些物件之間如何合作?

  6. 如果某一個物件的功能太多,考量是否應該分成多個物件合作的方式來完成其功能

  7. 還是沒有頭緒的話, 請參考 簡易成績資料庫

進一步增加程式功能

  1. 姓名電話資料內都允許有空格

  2. 群組新增/刪除

  3. 同一個人可以屬於不同群組

  4. 二進位方式存檔

  5. 其它你自己想到的功能

C++ 程式設計課程 首頁

製作日期: 3/26/2003 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@cs.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 理工學院 資訊科學系