962 C++ 程式作業三:             
     簡易錄影帶/碟片租售店管理程式
(線上繳交截止時間 97/05/12(一) 24:00)

這個作業要大家寫的程式的應用對象應該不算太陌生, 像是百視達或是亞藝影音這些連鎖店大家都很熟悉, 大家除了很少看到 VHS 錄影帶之外, VCD 和 DVD 的影音光碟片都是生活必備的東西, 所以大家一定都能夠想像程式的基本要求, 也一定有很多點子可以發揮。

在這個作業裡希望大家能夠以物件化的方式、 在應用程式領域 (application domain) 裡以實際看到、接觸到的物件來設計程式的架構, 並且在這個架構上設計程式的各種功能。 在這個程式裡有很多物件的觀念需要大家去練習, 請盡量跳脫你原來設計 C 程式時 top-down 的功能分解方式, 從刻劃物件系統裡各個物件的基本型態、 描述物件間的界面、 與物件系統的組成開始著手吧。

作業目標:

    下面這些目標就是我們在前半學期課堂裡 以及實習課程裡所談論到的, 在這個作業裡你應該盡量去應用所學到的概念和方法

  1. 熟悉製作 C++ 物件程式的工具, 包括 Visual Studio 提供的一些輔助界面, 分檔案編譯連結的基本方法

  2. 了解設計物件系統的基本流程

  3. 嘗試將系統中出現的各種物件以類別語法描述出來,建立應用軟體的靜態模型

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

  5. 嘗試以類別語法定義物件的介面、定義物件的狀態儲存方法 (請注意有許多資料不需要以資料成員的方式記錄在物件內, 請特別區分哪些資料該作為資料成員)

  6. 封裝所有的實作細節

  7. 練習 bottom-up 的程式設計方法實作應用系統的功能
  8. 練習使用標準 C++ 的函式庫 (iostream, vector, string, list, ...)

基礎系統描述

基本上這個作業應用在一個碟片的出租連鎖店, 它在全省各大都市有多家營業據點。

每一個據點的基本資料包括城市、店名 (例如台北仁愛店)、 電話、傳真、地址、網址、統一編號、負責人等等。

每一家店裡都詳細記錄店內可供出租商品, 包括影帶、VCD、和 DVD等等不同的貨品、 每一個商品基本資料包括影片標題、第幾片、 出片商、演員/表演者、序號、出片年月、租售價格 (以星期計算或是以日計算)、 商品原價值、商品折舊率、商品上架日期、商品存放位置、 內容分類 (愛情文藝、冒險動作、奇幻科幻、驚悚恐怖、幽默喜劇、溫馨小品)、 內容摘要說明...

每一家店裡都有自己招募的會員, 每一個會員的基本資料包括會員編號、姓名、住址、聯絡電話、email、 累計剩餘會費、碟片租借記錄等等。

功能要求

  1. 新增某一分店碟片

  2. 新增某一分店會員

  3. 查詢碟片 (某一分店或是連鎖查詢全部分店)
    1. 給定片名查詢,給定演員查詢,給定序號查詢
    2. 依分類內容分別瀏覽所有資料

  4. 查詢某一分店會員資料
    1. 給定姓名查詢
    2. 給定電話號碼查詢

  5. 維護 (修改基本資料、刪除) 某一分店碟片資料

  6. 維護 (修改基本資料、刪除) 某一分店會員資料

  7. 存檔/讀檔 (demo 時請設計一具有 20 碟片,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 來組織所有的 店名/碟片/屬性 或是 店名/會員 資料, 也就是說在你交過來的作業裡不可以只有一兩個單一類別, 或是根本就連一個類別都沒有。 (個別類別裡的資料如果你需要用陣列的話不在此限)

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

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

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

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

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

  10. 請在設計類別裡各個界面以及各個功能時,同時設計單元測試函式

  11. 請注意記憶體的配置與釋放,以及記憶體遺漏的偵測

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

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

  2. 在我們的碟片出租店管理程式裡你可以先定義 "分店"、"影帶"、"碟片"、"會員"、 這四個類別, 讓每個店裡可以有 n 張碟片, 可以新增, 可以刪除, 可以修改, 讓每個店裡可以有 n 個會員, 可以新增, 可以刪除, 可以修改

  3. 我們的碟片出租店程式裡總共會有哪些類別的物件呢?

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

  5. 這些物件之間如何合作提供整個程式的各種功能?

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

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

進一步增加程式功能

  1. 碟片的 "內容分類" 可以是抽象的物件, 這些物件的維護 (新增、修改、刪除)

  2. 列印所有分店聯絡方式

  3. 計算店內 (所有分店) 碟片總現值 (包括折舊)

  4. 二進位方式存檔與讀檔

  5. 其它你自己想到的功能, 原則上你想要增加什麼功能都是可以的, 記得在心得中寫出來, 這樣我才會注意到, 也才能夠幫你加一些分數

作業討論區 線上繳交網頁

C++ 程式設計課程 首頁

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