1052 C++ 程式作業二:
電話及電子郵件管理程式

繳交時間: 106/04/13 星期四 21:00

電話及電子郵件管理程式

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

這個程式所完成的功能應該是大家很熟悉的, 所以大家一定都有很多點子可以發揮, 在這個應用程式裡希望大家能夠很快地開始以物件化的方式思考程式的架構, 在這個程式裡其實有很多物件化的觀念需要大家去練習, 請跳脫你原來設計 C 程式時 top-down 的功能分解方式, 從刻劃物件的組成與描述物件的功能開始著手,以 bottom-up 的方式來思考個別物件如何組合出應用程式的功能。

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

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

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

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

  4. 嘗試以 UML 描述類別以及類別之間的關聯 (可以用手畫, 用 Powerpoint, Visio, StarUML, 或是 VC2010 Ultimate 的類別圖表 等等)

  5. 嘗試設計類別/物件的介面

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

  7. 建構元與解構元的製作

  8. 檔案串流的使用

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

  10. 請撰寫各個類別各個功能獨立的單元測試函式, 你有設計的成員函式或是界面就應該要同時設計它可以派上用場的環境來呼叫看看

  11. 請注意記憶體的配置 new/new[] 與釋放 delete/delete[], 請以 memory_leak 工具檢查程式是不是有記憶體遺失的問題

功能要求


程式請以文字選單方式提供操作者下列的操作功能:

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

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

  3. 維護修改資料
  4. 刪除資料

  5. 存檔/讀檔

基本程式要求

以下的要求請盡量想辦法達到, 如果不符合的話請一定要解釋設計的原因

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

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

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

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

  5. 如下圖所示, 請不要用單一陣列配合 struct 來組織所有的 人名/班級/電話/電子郵件 等等資料, 這種撰寫程式的模型我們稱為資料儲藏式模型 (Repository Model), 是關聯式資料庫裡最主要的模型, 但是不是我們在這門課程裡要求的物件導向模型 (不要老是想到燒烤店吃蚵仔煎)。 直接一點也就是說在你交過來的作業裡不可以只有一個單一類別, 或是根本就連一個類別都沒有。 (個別類別裡的資料如果你需要用陣列的話不在此限) 物件導向基本上是希望程式設計者以「貼近待解決的問題」的方式來思考,而不要以「貼近機器模型」或是「貼近抽象的資料模型」的方式來思考 。

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

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

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

  8. 如果有配置記憶體, 請使用 new/delete, new[]/delete[] 取代 free/malloc, 並且請以 memory_leak 的功能自行檢查是否有 memory leakage

  9. 請以 VC 2010 撰寫, 使用文字介面完成與操作者之間的輸入/輸出界面

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

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

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

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

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

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

  6. 如果某一個類別的功能太多,考量是否應該分成多個類別以合作的方式來完成整個功能

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

進一步增加程式功能

  1. 姓名, 電話, 電子郵件, 網址, ...資料內都允許有空格

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

  3. 二進位方式存檔

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

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

請隨時找我或是在 FB 上給我訊息!!

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

作業繳交注意事項

  1. 請於時限內 (106/04/13 21:00前) 上傳程式檔案 (逾時無法上傳, 請預先測試你的帳號與密碼), 上傳網頁

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

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

  4. 如果你有使用特別的演算法, 請畫圖說明此演算法高階概念上的作法

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

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

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