1032 C++ 程式作業三:
電話及電子郵件管理程式

電話及電子郵件管理程式

這個作業要大家寫的程式, 是一個在系辦管理各個班級同學聯絡方式的應用程式, 聯絡方式包括電話, 手機, 電子郵件, FB, 網址, 地址等等, 程式中可以輸入, 修改, 查詢所有系上同學的資料

這個程式需要的功能應該是大家能夠想像的, 所以在這個應用程式裡希望大家能夠開始以物件化的方式思考程式的架構, 在這個程式裡其實有很多很多物件化的觀念需要大家去練習, 請跳脫你原來設計 C 程式時 top-down 的功能分解方式, 從刻劃物件的組成與描述個別物件的功能開始著手。

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

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

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

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

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

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

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

  7. 建構元, 解構元, Big3 的製作

  8. 檔案串流的使用

  9. 請特別注意識別字(identifier) (包括變數名稱,類別名稱與函式名稱)的命名, 每一個變數的名稱都必須要是有意義的英文字, 實在不知道怎樣用英文命名的話可以用中文查詢 Google 可以給你一些幫助

  10. 請撰寫各個類別裡單元測試的函式, 你有實作的成員函式就應該要設計它可以派上用場的環境來呼叫看看

  11. 請注意記憶體的配置與釋放, 請以 memory_leak 功能檢查自己的程式是不是有記憶體未釋放的問題

功能要求

  1. 新增資料 (每年度都會新增許多同學, 每個人也可能新增一些原來沒有的聯絡方式)

  2. 查詢資料
    1. 給定姓名或是學號查詢
    2. 給定電話號碼 或是電子郵件位址查詢
    3. 依群組 (例如班級 106A) 瀏覽資料

  3. 維護修改與刪除資料

  4. 存檔/讀檔

基本程式要求

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

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

  2. 不要使用標準函式庫裡面的 map 實作

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

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

  5. 如下圖所示, 請不要用並行陣列或是單一陣列配合 struct 來組織所有的 人名/班級/電話/電子郵件 等等資料, 這種撰寫程式的模型我們稱為資料儲藏式模型 (Repository Model), 而不是我們在這門課程裡要求的物件導向模型。 也就是說在你交過來的作業裡不可以只有一個單一類別, 或是根本就連一個類別都沒有。 另外也不要使用外加的關聯式資料庫 。

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

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

  7. 你的程式好不容易建立了許多資料, 一定要存放在檔案裡面, 下一次開啟應用程式的時候可以自動回復前一次的物件組態

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

  9. 請以 memory_leak 的功能自行檢查是否有 memory leakage

  10. 請以 VC 2010 測試, 使用文字人機介面

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

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

  2. 在我們的應用程式裡你可以先定義 "人" 和 "電話" 這兩個類別, 讓每個人可以有幾支電話, 可以新增, 可以修改, 可以查詢基本資料, 先有一個概念以後, 然後再進一步構思整體程式

  3. 我們的應用程式裡總共會有其它哪些類別的物件呢? (系, 班級, 電子郵件, ...)

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

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

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

  7. 如果實作某一個物件的功能時常常需要使用存放在其他物件裡面的資料, 仔細考量是否資料存放的位置是不對的, 由目前存放的物件改到需要常常使用它的物件裡

  8. 還是沒有頭緒的話, 請參考 簡易成績資料庫 簡化版校園資訊系統 I, 或是 簡化版校園資訊系統 II

進一步增加程式功能 (不強制要求)

  1. 班級幹部, 學會幹部等等群組之新增/刪除

  2. 二進位方式存檔

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

如果對於上面的描述有任何不清楚地方的話

請隨時找我, FB 群組, 或是 email 給我!!

這個作業需要設計多個類別, 你很難在一兩天內輕鬆地應付, 主要目的是希望你綜合練習在課堂上以及課本上所提及的方法, 為了希望你能夠在自行思考的情況下完成這個作業, 所以這個作業的描述並不是按步就班地描述每一步該怎麼做, 但是又不希望你完全使用非物件導向的方式來製作程式, 所以在上面的描述裡我只是負面地列出你不該用的方法, 如果你還需要其它提示的話, 歡迎你隨時和我討論作業的內容。

作業繳交注意事項

  1. 請於時限內 (104/05/14 21:00前) 上傳程式檔案 (逾時無法上傳), 上傳網頁

  2. 請注意雖然作業的題目不是很困難, 可是由於你對於 iostream, fstream 可能還不是很熟悉, 對於物件的合作可能還不熟悉, 請你早點開始做, 避免參考同學的程式, 由於程式功能已經有很多的限制了, 所以如果你先看過別人的程式, 你很難寫出和別人不一樣的東西...

  3. 請編輯一個 report.txt (或是 report.doc) 檔案, 說明你的演算法高階的模型, 概念上的作法, 資料結構, 你所完成的功能, 測試結果,... 以及對於此次作業各個部份的問題? (提出問題時請盡量整理你所知道的, 與你所懷疑的, 你所不認同的..., 如此會比空洞的 "我不懂 xxx?", "yyy 是什麼?" 要容易回答, 相對的你也比較容易得到你想要的答案)

  4. report.txt (或是 report.doc) 中請說明你的心得 (心得可以包括你覺得你獲得的觀念, 你 debug 時發現的問題, 你 debug 的心得, 作業的感想, 你自己覺得比較好或是比較特別的設計...)

C++ 物件導向程式設計課程 首頁

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