當前位置:編程學習大全網 - 編程語言 - 告訴我壹個C++課程設計最好帶 代碼的

告訴我壹個C++課程設計最好帶 代碼的

我們以前做的課程設計,有完整的文件,要的話給個郵箱

面向對象課程設計——通信錄

本章課程設計是設計壹個實用的小型通信錄,具有查詢和刪除功能,並且能夠打開或修改指定文件及將多個文件組成壹個文件,它完全使用類來實現,充分體現了面向對象的程序設計特點。

本章的參考程序使用雙向鏈表保存數據的底層數據結構,並使用C++標準庫提供的list來實現這個鏈表的結構,由於利用list類,所以實現起來很簡單。雖然這種方法超出壹般的教材,但只要學習下壹個標準庫,還是容易理解的。C++推薦使用標準庫,這也是目前編程的方向,所以設計本章作為所選內容,以便學生熟悉和了解C++的標準庫。

壹、功能設計要求

設計要求實現的功能較多,所以將它們分為幾個部分敘述。

1. 建立文件

(1) 存儲文件可以使用默認文件名或指定文件名。

(2) 可以不保存輸入記錄,但需要確認是否保存輸入記錄。

(3) 如果已經有文件,只能在其後追加

(4) 新增的記錄可以不存入原文件中,也可以用原來的文件覆蓋內存的內容。

(5) 可以將指定文件的內容追加到目前內存的鏈表後面。

2. 文件的存取和顯示

(1) 可以單獨存取文件。

(2) 可以隨時顯示內存中記錄的全部內容。

(3) 可以直接存取默認文件或指定文件。

3. 刪除記錄

(1) 可以按“姓名”或“電話”方式刪除記錄並更新內存鏈表內容。

(2) 能給出被刪除記錄的信息。

(3) 如果已經是空表,刪除時應該給出提示信息並返回主菜單。

(4) 如果沒有要刪除的信息,輸出沒有找到的信息。

(5) 刪除操作僅限於內存,只要執行記錄時,才能覆蓋原記錄。

4. 查詢記錄

(1) 可以按“姓名”或“電弧“方式查詢記錄。

(2) 能給出查詢記錄的信息。

(3) 如果查詢的信息不存在,輸出“沒有找到“的信息。

5. 整體性能

(1) 應可以隨時檢索|、刪除或增加新記錄,也可以保存或取消新的記錄。

(2) 姓名可由字符和數字混合編碼。

(3) 電話號碼可由字符和數字組成。

(4) 將輸出信息加上欄頭,例如:

姓名 電話

李玉梅 (86)-10-62543321

張三 86 551 9823555

Les Hancock 13912345678

Zhang San 0551-36994698

(5) 使用菜單實現功能的正確選擇。

6. 測試程序

(1) 應列出測試大綱對程序進行測試

(2) 應保證測試用例能測試到程序的各種邊緣情況。

二、使用List類的成員函數

List 對象的定義方式是:

List<T>obj;

其中T 是鏈表所存儲的數據類型,也就是鏈表的每壹個結點的數據類型。

List 類中使用typedef定義的常用的數據類型是iterator和const_iterator,可將它們看成是指向每條記錄的指針和指向記錄的const指針。

在通信錄程序中使用到的list類的成員函數如下:

1. bool list ::empty()const

當且僅當list為空時,就返回true.

2.size_t list::size()const

返回鏈表中記錄的元素個數。該函數的運行復雜度是線性的,即O(N)。

3.iterator list::begin()

返回壹個iterator,指向此鏈表的開頭。

4.iterator list::end()

返回壹個iterator,指向此鏈表的尾端,這裏的尾端指的是鏈表的最後壹個元素之後,即鏈表中實際存有函數的範圍是[begin(),end()].

5.const_iterator list::begin()const

返回壹個const_iterator,指向此鏈表的開頭。

6.const_iterator list::end()const

返回壹個const_iterator,指向此鏈表的尾端,這裏的尾端指的是鏈表的最後壹個元素之後,即鏈表中實際存有元素的範圍是[begin(),end()]。

7.void list::push_bace(constT&t)

將元素t安插於鏈表尾。

8.iterator list::erase(iterator pos)

刪除pos所指向的元素,返回指向被刪除元素後面壹個元素的iterator.

9.void list::clear()

刪除鏈表中的所有元素。

三、結構和類

在通信錄中***定義了1個結構和3個數,下面對它們加以說明。

1、結構Record

首先要定義通信錄中每壹條記錄的內容的結構,它的每個域對應著記錄中的壹項信息。這裏使用類string的對象來定義Record域的信息項。

sruct Record

{

sring name; //姓名

string tel; //電話號碼

};

如果使用字符串,其長度必須事先定義,使用string類,存儲對象需要的長度則隨機具體對象的實際長度而定。

在使用VS7(Microsoft Visual Studio.NET 2003)和VC(Microsoft Visual C++.NET 2003)軟件時,不會有任何問題。但在使用Visual C++6.0時,由於VC6本身存在壹些問題,所以也給本設計帶來壹個問題:使用getline()函數需要再按壹次“回車”鍵,從而產生交互錯誤。本程序將在實際設計中做進壹步說明,此處不再贅述。

2、類RecordList

類RedcordList 是壹個針對通信錄做了特殊處理的鏈表,它繼承於list<Record*>,即以指向Record的指針為元素的鏈表。

Class RecordList : public list<Record*>

{

fiend ostream& operator<<(ostream& os, const RecordList& c_rl);

fiend istream& operator>>(istream& is, RecordList& rl);

public:

void clear();

iterator erase(iterator where);

~RecordList();

};

類RecordList可以直接使用類list中定義的所以函數,但重寫了clear()函數、erase()函數和增加了析構函數,並重載了輸入、輸出操作符。這是因為類list的刪除元素的操作只會釋放存儲元素的空間;對於本程序來說,就是只釋放Record指針,卻並不會釋放該指針所指向的對象。因此,類RecordList覆蓋了基類中的clear()函數、erase()函數,使得其在刪除元素時首先釋放該元素(即Record指針所指向的Record對象),然後再調用基類中被覆蓋的同名函數以實現刪除元素的功能。增加了析構函數是為了鏈表被銷毀的同時,也銷毀其所記錄的所有對象。重載了輸入、輸出操作符是便於從輸入、輸出流中還原或保存鏈表。

3、類AddressList

AddressList類是處理通信錄的底層類,針對增加記錄、刪除記錄、查詢記錄以及保存和讀取記錄等操作進行與底層數據結構相關的處理,該類不涉及任何與用戶界面與用戶交互相關的操作。

該類以“包含”關系(has-a)持有壹個RecordList類的對象recList,作為保護型數據成員,這是存取記錄的底層數據結構。

Class AddressList

{

potected:

RecordList recList; //RecordList類的對對象作為數據成員

Public:

Typedef RecordList::iterator Iterator;

//從通信錄中尋找壹個記錄

vtual Iterator findRecord(string patten,int type,Iterator from);

//其他成員函數

vrtual void addRecord(Record*rec);

virtual Iterator removeRecord(Iterator it);

virtual void saveRecords(ostream& os);

virtual int loadRecords(istream* is);

virtual ~AddressList();

const int size() const {return (int)recList.size();}

const bool empty() const {return recList.empty();}

virtual void clear() {recList.clear();}

Iterator first() {return recList.begin();}

Iterator pastEnd() {return recList.end;}

};

在類AddressList中定義的壹些函數直接使用了類RecordList的函數,沒有增加太多的功能,如addRecord()只是用了類RecordList繼承自基類的push_back(), removeRecord()只是調用了類Record重寫了的erasse().

需要特別解釋的是findRecord()函數,它用於從通信錄中尋找壹個符合條件的記錄,並返回指向該記錄的iterator。該函數將從給定的iterator開始,按遞增的順序壹次考查每壹條記錄,直到找到符合條件的記錄或者到達通信錄的末尾。在iterator叠代遍歷記錄時,采用如下的代碼:

Iterator it;

Iterator it_end =recList.end();

for (it=from; it!=it_end();

{

. . .

}

這裏from是叠代開始的位置,it_end是通信錄的末尾,若想遍歷個通信錄找出所有符合條件的記錄,from可以第壹次取值recList.begin(),之後每次取前壹次運行findRecord()所得返回值增1,直到findRecord()返回it_end為止。

4、類AddressBook

類AddressBookshichu是處理通信錄操作的面向用戶使用的類,包含所有功能的用界面及用戶交互的實現。

Class AddressBook : public AddressList

{

protected:

bool isModified; //通信錄是否已被修改還未保存

publc:

AddressBook();

virtual ~AddressBook();

//開始通信錄的用戶界面操作

virtual void start();

//菜單處理函數

virtual void displayRecords();

//顯示記錄

virtual void queryRecord();

//增加記錄

virtual void addRecord();

//刪除記錄

virtual void removeRecords();

//保存記錄

virtual void loadRecords();

//結束程序

virtual void loadRecords();

//清空當前通信錄

virtual void clear();

protected:

//菜單選擇函數

clear menuSelect();

//顯示表頭

void disputable();

};

該類繼承了類AddressList,可以直接使用它的直接基類AddressList的函數。在運行通信錄時只要新建壹個AddressBook類的對象,就可以通過這個對象自動執行與用戶交互的操作。

類AddressBook的構造函數將調用歡迎界面成員函數strat()將調用菜單處理函數handleMenu(),在成員函數handMenu()中,將反復調用菜單選擇函數menuSelect(),然後依據用戶的選擇調用相應的處理函數displayRecords()、queryRecord()、addRecord()、removeRecord()、saveRecord()、loadRecords()、clear()、quit()等。

成員函數displayRecords()會iterator叠代遍歷整個通信錄,顯示所有的記錄。

成員函數addRecord()會首先獲得用戶要求的查詢條件,然後通過前面介紹的方法反復調用類AddressList()函數,找出所有匹配條件的記錄並顯示出來。

成員函數addRecord()將要求用戶輸入必要的信息以構建新的Record對象,然後將指向該對象的指針作為鏈表的元素,通過調用類AddressList的addRecord()函數添加到通信錄的末尾。

成員函數removeRecord()會首先獲得用戶要求的查詢條件,使用該查詢條件來找到用戶想要刪除的確切記錄,將每壹個符合條件的記錄顯示給用戶看,詢問用戶是否確定刪除該記錄;若確定刪除,則調用類RddressList的removeRecord()函數完成刪除記錄。

成員函數saveRecords()讓用戶輸入文件名,然後建立文件輸出流,再調用類AddressList的saveRecords()函數完成。

成員函數loadRecords()會將從文件讀入的記錄追加到當前通信錄的末尾,所以如果希望當前通信錄與文件中記錄的通信錄完全壹致,就應該先調用成員函數clear),再調用成員函數loadRecord(),loadRecord()會首先讓用戶輸入文件名,然後建立文件輸入流,最後調用直接基類AddressList()的clear()函數完成清空操作。

成員函數quit()會首先檢查當前通信錄是否已被改動並提示用戶進行保存,然後運行語句

delete this:

來銷毀自己(AddressBook)的對象,最後運行exit()函數結束程序。

5、類的UML

圖1是使用類的短式形式表示的UML結構圖。

四、參考程序

本設計由3個.cpp文件及相應的3個頭文件組成。

  • 上一篇:Python怎麽return後讓循環繼續運行?
  • 下一篇:因子分析過程?
  • copyright 2024編程學習大全網