第一篇:C++程序設(shè)計—電話簿管理系統(tǒng)
XXXXXXXXXXXC/C++程序設(shè)計實訓(xùn)
電話簿管理系統(tǒng)
學生姓名 ×××× 學 號 ×××× 所在學院 ×××× 專業(yè)名稱 ×××× 班 級 ×××× 指導(dǎo)教師
XXX
XXXXXXXXXXXXXXXX XXXXXXXXXXXX
目 錄
1.前言··················································································································· 3 2.設(shè)計目的··········································································································· 3 3.功能描述··········································································································· 3 4.總體設(shè)計··········································································································· 4
1、功能模塊設(shè)計···························································································· 4
2、數(shù)據(jù)結(jié)構(gòu)設(shè)計···························································································· 6
3、函數(shù)功能描述···························································································· 7 5.程序?qū)崿F(xiàn)··········································································································· 7
1、源程序(略)···························································································· 7
2、運行結(jié)果···································································································· 7 6.小結(jié)··················································································································· 9
1.前言
隨著科技的進步和信息產(chǎn)業(yè)的飛速發(fā)展,電話簿成為了現(xiàn)代生活中一個重要的工具。本電話簿管理系統(tǒng)利用計算機對通訊錄進行統(tǒng)一管理,包括添加、修改、查詢記錄等功能,實現(xiàn)通訊錄管理工作的系統(tǒng)化、規(guī)范化和自動化,為人們的工作和生活提供便利。本程序是利用結(jié)構(gòu)數(shù)組實現(xiàn)此電話簿管理系統(tǒng)。
2.設(shè)計目的
本程序旨在訓(xùn)練基本編程能力,了解管理信息系統(tǒng)的開發(fā)流程,熟悉C語言的文件和結(jié)構(gòu)數(shù)組的各種基本操作。本程序中涉及結(jié)構(gòu)體、數(shù)組、文件等方面的知識。通過本程序的訓(xùn)練,能對C語言的文件操作有一個更深刻的了解,掌握利用數(shù)組存儲結(jié)構(gòu)實現(xiàn)電話簿管理的原理,為進一步開發(fā)出高質(zhì)量的信息管理系統(tǒng)打下堅實的基礎(chǔ)。
3.功能描述
如圖1所示,電話簿管理系統(tǒng)主要利用數(shù)組來實現(xiàn),其數(shù)組元素是結(jié)構(gòu)體類型,整個系統(tǒng)由如下幾大功能模塊組成。
電話簿管理系統(tǒng)輸入記錄模塊查詢記錄模塊更新記錄模塊輸出記錄模塊從文件讀入從鍵盤讀入按姓名查詢按電話查詢修改記錄刪除記錄插入記錄排序記錄輸出至文件輸出至屏幕(1)輸入記錄模塊。輸入記錄模塊主要完成將數(shù)據(jù)存入數(shù)組中的工作。在此電話簿管理系統(tǒng)中,記錄可以從以文本形式存儲的數(shù)據(jù)文件中讀入,也可從鍵盤逐個輸入記錄。記錄由與聯(lián)系人有關(guān)的基本信息字段構(gòu)成。當從數(shù)據(jù)文件中讀入記錄時,它就是在以記錄為單位存儲的數(shù)據(jù)文件中,將記錄逐條復(fù)制到結(jié)構(gòu)體類型的數(shù)組元素中。
(2)查詢記錄模塊。查詢記錄模塊主要完成在數(shù)組中查找滿足相關(guān)條件的記錄。在此電話簿管理系統(tǒng)中,用戶可以按照聯(lián)系人姓名或聯(lián)系人電話號碼在數(shù)組中進行查找。若找到該記錄,則以表格形式打印出此記錄的信息;否則,返回一個-1的值,并打印出未找到該記錄的提示信息。
(3)更新記錄模塊。更新記錄模塊主要完成對記錄的維護。在此電話簿管理系統(tǒng)中,它實現(xiàn)對記錄的修改、刪除、插入和排序操作。一般而言,系統(tǒng)進行了這些操作之后,需要將修改的數(shù)據(jù)存入源數(shù)據(jù)文件。
(4)輸出記錄模塊。輸出記錄模塊主要完成兩個任務(wù)。第一,它實現(xiàn)對記錄的存盤操作,即將數(shù)組中各元素中存儲的記錄信息寫入數(shù)據(jù)文件中。第二,它實現(xiàn)將數(shù)組中存儲的記 圖1 電話簿管理系統(tǒng)功能模塊 錄信息以表格的形式在屏幕上打印顯示出來。
4.總體設(shè)計
1、功能模塊設(shè)計
(1)主控main()函數(shù)執(zhí)行流程
電話簿管理系統(tǒng)執(zhí)行主流程如圖2所示。它先以可讀寫的方式打開文本類型的數(shù)據(jù)文件,此文件默認為“c:telephon”,若該文件不存在,則新建此數(shù)據(jù)文件。當打開文件操作成功后,從文件中一次讀出一條記錄,添加到新建的數(shù)組中,然后執(zhí)行顯示主菜單和進入主循環(huán)操作,進行按鍵判斷。值得一提的是,文本類型文件與二進制類型文件不同,它可以使用Windows自帶的記事本打開并查看到存儲的文件內(nèi)容。
開始以可讀寫的方式打開一個數(shù)據(jù)文件將此文件的內(nèi)容讀出,并存入一個新的結(jié)構(gòu)體類型的數(shù)組中調(diào)用emnu()菜單函數(shù)進入while(1)主循環(huán)輸入0~8中的一個數(shù)值,選擇相應(yīng)操作輸入是否為0?是否判斷鍵值,調(diào)用相應(yīng)函數(shù),完成相應(yīng)功能是否已對修改進行了存盤?否調(diào)用Save()函數(shù),進行寫數(shù)據(jù)文件操作是結(jié)束
圖2 主控函數(shù)執(zhí)行流程圖
在判斷鍵值時,有效的輸入為0-8之間的任意數(shù)值,其他輸入都被視為錯誤按鍵。若輸入為0(即變量select=0),則會繼續(xù)判斷是否在對記錄進行了更新操作之后進行了存盤操作,若未存盤,則全局變量saveflag=1,系統(tǒng)會提示用戶是否需要進行數(shù)據(jù)存盤操作,用戶輸入 Y或y,系統(tǒng)會進行存盤操作。最后,系統(tǒng)執(zhí)行退出電話簿管理系統(tǒng)的操作。
若選擇1,則調(diào)用Add()函數(shù),執(zhí)行增加記錄操作;若選擇2,則調(diào)用Disp()函數(shù),執(zhí)行將記錄以表格形式打印輸出至屏幕的操作;若選擇3,則調(diào)用Del()函數(shù),執(zhí)行刪除記錄操作;若選擇4,則調(diào)用Qur()函數(shù),執(zhí)行查詢記錄操作:若選擇5,則調(diào)用Modify()函數(shù),執(zhí)行修改記錄操作;若選擇6,則調(diào)用lnsert()函數(shù),執(zhí)行插入記錄操作;若選擇7,則調(diào)用SelectSort()函數(shù),執(zhí)行按升序排序記錄的操作;若選擇8,則調(diào)用Save()函數(shù),執(zhí)行將記錄存入磁盤中的數(shù)據(jù)文件的操作:若輸入為0-8之外的值,則調(diào)用Wrong()函數(shù),給出按鍵錯誤的提示。
(2)輸入記錄模塊
輸入記錄模塊主要實現(xiàn)將數(shù)據(jù)存入數(shù)組中。當從數(shù)據(jù)文件中讀出記錄時,它調(diào)用fread(&tele[count],sizeof(TELEBOOK), l,fp)文件讀取函數(shù),執(zhí)行一次從文件中讀取一條電話簿記錄信息存入某個數(shù)組元素中的操作,并且這個操作在main()中調(diào)用執(zhí)行,即在電話簿管理系統(tǒng)進入顯示菜單界面時,該操作己經(jīng)執(zhí)行了。若該文件中沒有數(shù)據(jù),則系統(tǒng)會提示數(shù)組為空,沒有任何記錄可操作,此時,用戶應(yīng)選擇1,調(diào)用Add()函數(shù),進行記錄的輸入,即完成在數(shù)組中添加元素的操作。
(3)查詢記錄模塊
查詢記錄模塊主要實現(xiàn)在數(shù)組中按聯(lián)系人姓名或電話查找滿足條件的記錄。在查詢函數(shù)Qur()中,為了遵循模塊化編程的原則,對在數(shù)組中進行的記錄定位操作設(shè)計成了一個單獨的函數(shù)int Locate(TELEBOOK temp[],int n,char findmess[],char nameorphonenum[]),參數(shù)findmess[]保存要查找的具體內(nèi)容,nameorphonenum[]保存要查找的字段(值為字特串類型的name或phonenum),若找到該記錄,則返回指向該記錄的數(shù)組元素的下標;否則,返回一個-1的值。
(4)更新記錄模塊
更新記錄模塊主要實現(xiàn)了對記錄的修改、刪除、插入和排序操作。因為記錄是以數(shù)組的結(jié)構(gòu)形式存儲的,所以這些操作都在數(shù)組中完成。下面分別介紹這4個功能模塊。
1)修改記錄
修改記錄操作需要對數(shù)組中目標元素的數(shù)據(jù)域中的值進行修改,它分兩步完成。第一步,輸入要修改的聯(lián)系人姓名,輸入后調(diào)用定位函數(shù)Locate()在數(shù)組中逐個對聯(lián)系人姓名字段的值進行比較,直到找到該聯(lián)系人姓名的記錄;第二步,若找到該記錄,修改除記錄編號之外的各字段的值,并將存盤標記變saveflag置1,表示已經(jīng)對記錄進行了修改,但還未執(zhí)行存盤操作。
2)刪除記錄
刪除記錄操作完成刪除指定聯(lián)系人姓名或電話號碼的記錄,它也分兩步完成。第一步,輸入要修改的聯(lián)系人姓名或電話號碼,輸入后調(diào)用定位函數(shù)Locate()在數(shù)組中逐個對聯(lián)系人姓名或電話號碼字段的值進行比較,直到找到該聯(lián)系人姓名或電話號碼的記錄,返回指向該記錄的數(shù)組元素下標;第二步,若找到該記錄,則從該記錄所在元素的后續(xù)元素起,依次向前移一個元素位置,有值的數(shù)組元素個數(shù)減1,其具體過程如圖3所示,在刪除了數(shù)組元素A2后,數(shù)組元素A3和A4向前移動了一個位置
A0刪除A2前A0刪除A2后A1A1A2A3A3A4A4
圖3 數(shù)組中刪除記錄示意圖
3)插入記錄 插入記錄操作完成在指定記錄編號的隨后位置插入新的記錄。首先,它要求用戶輸入某個記錄編號,新的記錄將插入在該記錄之后、然后,提示用戶輸入一條新的記錄的信息,這些信息保存在新結(jié)構(gòu)體類型的數(shù)組元素的各字段中;最后,將該元素插入在已經(jīng)確認位置的記錄編號之后。它的具體插入執(zhí)行過程如圖4所示,新元素B1準備插入至已有5個元素的數(shù)組中,插入位置為元素A2之后。這具體過程為:先調(diào)用Locate()函數(shù)找到A2在數(shù)組中的下標,從A4開始,往后移動,至A2停止移動,然后在原A3的位置插入元素B1。
插入B1A0插入B1前A0插入B1后A1A2B1A3A4A1A2A3A4
圖4 數(shù)組中插入記錄示意圖
4)排序記錄
選擇排序法也屬于內(nèi)部排序法中的一種,它是運用字段值比較后,從欲排序的數(shù)組元素中,按指定規(guī)則選出其字段值最小的元素,并依原則交換數(shù)組元素位置后,更新欲排序的數(shù)組元素,以達到排序的目的。這里我們采用這種排序法來實現(xiàn)按照記錄編號或聯(lián)系人姓名字段的值從低到高對記錄進行升序排序。對按照記錄編號排序方式而言,我們將按其數(shù)值大小來排序;對按照聯(lián)系人姓名排序方式而言,我們將按其姓名字符ASCII碼的大小來排序。
選擇排序的方法為:從欲排序的n個數(shù)組元素中,以線性查找的方式找出最小的元素和第一個元素交換,再從剩下的(n-1)個數(shù)組元素中,找出最小的元素和第二個元素交換,以此類推,直到所有元素均已排序完成。
將相鄰的兩個數(shù)組元素的電話簿字段的值進行比較,若左邊的值小于右邊的值,則將此兩個元素的值進行交換;若左邊的值大于等于右邊的值,則此兩個值的位置不變。右邊的值繼續(xù)和下一個值做比較,重復(fù)此動作,直到比較到最后一個值,最終實現(xiàn)了升序排序。選擇排序法是最簡單的排序法,但選擇排序法所需的排序時間比其他排序法長。
(5)輸出記錄模塊
當把記錄輸出至文件時,調(diào)用fwrite(&temp[i],sizeof(TELEBOOK),L,fp)函數(shù),將數(shù)組元素temp[i ]中各字段的值,寫入文件指針fp所指的文件:當把記錄輸出至屏幕時,調(diào)用void Disp()函數(shù),將數(shù)組中存儲的記錄信息以表格的形式在屏幕上打印出來。
2、數(shù)據(jù)結(jié)構(gòu)設(shè)計
本程序定義了結(jié)構(gòu)體telebook,用于存放聯(lián)系人的基本信息。這里僅有3 個與聯(lián)系人有關(guān)的字段,讀者可以按照需要擴展相關(guān)字段。
typedef struct telebook { char num[4];char name[10];char phonenum[15];char address[20];}TELEBOOK;其各字段的值的含義如下: ? num[4]:保存記錄編號。? name[10]:保存聯(lián)系人姓名。? phonenum[15]:保存聯(lián)系人的電話號碼。? address[20]:保存聯(lián)系人地址。
3、函數(shù)功能描述
1)printheader()函數(shù)原型:void printheader()printheader()函數(shù)用于在表格形式顯示記錄時,打印輸出表頭信息。2)printdata()函數(shù)原型:void printdata(TELEBOOK pp)printdatan()數(shù)用于以表格顯示的方式,打印輸出單個數(shù)組元素pp中的記錄信息。3)Disp()函數(shù)原型:void Disp(TELEBOOK temp[],int n)Disp()函數(shù)用于顯示temp數(shù)組中存儲的n條記錄,內(nèi)容為telebook結(jié)構(gòu)中定義的內(nèi)容。其余函數(shù)功能描述省略,請同學們在自己寫的時候?qū)懲暾?/p>
5.程序?qū)崿F(xiàn)
1、源程序(略)
2、運行結(jié)果
(1)主界面
圖5 主界面
當用戶剛進入電話簿管理系統(tǒng)時,其主界面如圖5所示。此時,系統(tǒng)己經(jīng)將“c:telephon”文件打開,若文件不為空,則將數(shù)據(jù)從文件中逐條記錄讀出,并寫入數(shù)組中。用戶可選擇0-8之間的數(shù)值,調(diào)用相應(yīng)功能進行操作。當輸入為0時,退出此管理系統(tǒng)。
(2)輸入記錄
當用戶輸入1并按Enter鍵后,即可進入數(shù)據(jù)輸入界面。其輸入記錄過程如圖6所示,這里輸入了3條記錄。當用戶輸入為0的記錄編號時,它會結(jié)束輸入過程,返回到主菜單界面。
(3)顯示記錄
當用戶執(zhí)行了輸入記錄或已經(jīng)從數(shù)據(jù)文件中讀取了記錄之后,即可輸入2并按Enter鍵,查看當前數(shù)組中的記錄情況,如圖7所示,此時表中有3條記錄。
圖6 輸入記錄
圖7 顯示記錄
(4)刪除記錄
當用戶輸入3并按Enter鍵后,即可進入記錄刪除界面。其刪除記錄過程如圖8所示,這里按聯(lián)系人姓名刪除了一條姓名為A1的記錄。
圖8 刪除記錄
(5)查找記錄
當用戶輸入4并按Enter鍵后,即可進入記錄查找界面。其查找記錄過程如圖9所示,8 用戶可按姓名或電話號碼進行記錄查找。
圖9 查找記錄
(6)修改記錄
當用戶輸入5并按Enter鍵后,即可進入記錄修改界面。其修改記錄過程如圖10所示,這里修改了姓名為a2的聯(lián)系電話和地址字段。
圖11 修改記錄
(7)插入記錄
當用戶輸入6并按Enter鍵后,即可進入記錄插入界面。其插入過程如圖11所示,這里在記錄編號為3的記錄后插入了一條記錄編號為5的記錄。
(8)排序記錄
當用戶輸入7并按Enter鍵后,即可進入記錄排序界面。用戶可以選擇按照記錄編號或聯(lián)系人姓名進行排序,圖12為按記錄編號進行記錄升序排序的結(jié)果。
(9)保存記錄
當用戶輸入8并按Enter鍵后,即可進入記錄保存界面。其保存結(jié)果提示信息如圖13所示,這里有3條記錄已經(jīng)存儲至磁盤數(shù)據(jù)文件c:telephon中。
6.小結(jié)
本文介紹了電話簿管理系統(tǒng)的設(shè)計思路及其編程實現(xiàn),重點介紹了功能模塊的設(shè)計原理和利用數(shù)組存儲結(jié)構(gòu)實現(xiàn)電話簿管理的過程。通過本程序的開發(fā)使我熟悉C語言下的文件和數(shù)組操作,了解管理信息系統(tǒng)(MIS)的開發(fā)原理,并注意利用選擇排序法來實現(xiàn)數(shù)組元素 排序的特點。
利用本電話簿管理系統(tǒng)可以對通訊錄進行日常維護和管理。
第二篇:C++課程設(shè)計電話簿管理
C++課程設(shè)計
————簡單電話簿管理
報告內(nèi)容: 一.程序功能簡介 二.課程設(shè)計要求 三.課程設(shè)計說明 四.參考數(shù)據(jù)結(jié)構(gòu) 五.具體功能及實現(xiàn)六.源程序及注釋 七.感想與心得
學號:050930109 姓名:陳浩 指導(dǎo)老師:臧洌 日期:2010年6月20日
一.程序功能簡介
一個基本的電話簿管理程序,具有插入、刪除、顯示、修改和查詢聯(lián)系人電話碼的功能。主菜單如右圖所示,每個菜單項功能如下:
1.增加記錄菜單:請輸入用戶姓名,如果該用戶已經(jīng)存在則添加失敗,否則,輸入用戶的電話號碼,進行添加。
2.修改某條記錄:請輸入用戶姓名,如果沒有該用戶顯示“ 該用戶不存在”信息,否則,輸出原電話號碼,然后輸入新的電話號碼,進行修改。3.刪除記錄:
輸入用戶姓名,進行刪除(刪除時要進行確認)。4.查詢:輸入用戶姓名,進行查找。
5.排序:根據(jù)子菜單,選擇不同的排序方式。6.顯示:逐屏顯示(每屏顯示10條記錄)。7.全刪:進行全部刪除(要確認)。
二.課程設(shè)計要求
請選擇以下功能 1-增加記錄 2-修改記錄 3-刪除記錄
4-查找(按姓名)5-排序 6-顯示記錄
1.用漢化菜單實現(xiàn)。
2.提供按姓名查詢電話號碼的功能。
3.顯示功能(提供逐屏顯示的功能,每屏顯示10條記錄)。4.刪除和修改時要進行確認。
5.將電話簿記錄以文件的形式存在磁盤上;每次操作時將電話簿調(diào)出,操作完畢后存盤。
三.課程設(shè)計說明
1.程序采用數(shù)組數(shù)據(jù)結(jié)構(gòu)實現(xiàn)。2.用類來實現(xiàn)數(shù)據(jù)的封裝。
四.參考數(shù)據(jù)結(jié)構(gòu)
1.“電話簿”稱為用戶信息表,用數(shù)組實現(xiàn)。用戶信息表由若干用戶信息構(gòu)成,每個用戶信息是一個數(shù)組元素。
2.“user.txt”是一個文件,用于保存“用戶信息表”中的信息。當系統(tǒng)啟動時,從該文件中讀入信息,當退出系統(tǒng)時,將“用戶信息表”中的信息寫到該文件中。該文件中信息存放形式如下:
ZhangHong 5221369 LiLi 84891112
ZhaoQiang 5221498
其中 ??name(姓名)占20列 ??phone_num(電話號碼)占12列
五.具體功能及實現(xiàn)
定義Fphone類,通過其私有成員數(shù)組name[20]和phone[12]分別記錄用戶姓名與電話號碼,定義UserDatabase類記錄用戶信息,通過公有成員函數(shù)實現(xiàn)對數(shù)據(jù)的操作。
六.源程序及注釋
#include
//用戶信息類的定義 {
char name[M];
// 姓名
char phone_num[N];
//電話號碼 public: Fphone(char *na=“",char *ph=”“){ strcpy(name,na);
strcpy(phone_num,ph);} char*getname();
//獲取姓名
char*getphone_num();
//獲取電話號碼
void setname(char*a);
//設(shè)置姓名
void setphone_num(char*a);//設(shè)置電話號碼
void disp();
//顯示用戶信息 };char *Fphone::getname()
{ return name;} char *Fphone::getphone_num(){ return(phone_num);} void Fphone::setname(char *a){ strcpy(name,a);
} void Fphone::setphone_num(char*a){ strcpy(phone_num,a);} void Fphone::disp(){ cout<<”姓名:“<
//用戶信息表中的元素個數(shù),即當前記錄總數(shù)
int Maxu;
//最多的用戶
Fphone *user;
//指向用戶信息表的指針
public: UserDatabase()
//構(gòu)造函數(shù),初始化用戶信息表,將user.txt文件中數(shù)據(jù)讀到User[]中
{ nElem=0;
Maxu=50;
user=new Fphone[Maxu];
fstream in;
in.open(”user.txt“,ios::in|ios::nocreate);//打開文件
for(int i=0;(!in.eof());i++)
{ in>>user[i].getname();in>>user[i].getphone_num();
nElem++;
}
in.close();}
~UserDatabase()
//析構(gòu)函數(shù),將user[]寫入user.txt文件中
{ fstream out;
Fphone *p=NULL;
p=user;
out.open(”user.txt“,ios::out,filebuf::sh_none);
for(int i=0;i { out< <<((p+i)->getphone_num())< }delete []user; out.close();} void clear() //刪除所有用戶信息 { char ord; cout<<”確定刪除嗎?(選擇:[y]是;[n]否)aa“< do { cin>>ord; if(ord=='N'||ord=='n')return; else if(ord=='Y'||ord=='y') { delete[Maxu]user; } user=0;cout<<”刪除成功啦!“< user->setname(na); user->setphone_num(ph_num); } else if(nElem { if(strcmp((user+i)->getname(),na)>0) {(user+i+1)->setname(((user+i)->getname())); (user+i+1)->setphone_num(((user+i)->getphone_num())); } else break; } (user+i+1)->setname(na); (user+i+1)->setphone_num(ph_num); nElem++;} else cout <<”空間不足,無法添加!“< //返回user指針 { return(user);} void delete_record(Fphone *p,int k) //刪除用戶信息 { char con;cout<<”確認刪除?(Y/N)“;cin>>con;if(con=='N'||con=='n')return;else if(con=='Y'||con=='y'){ for(int i=k;i { user[i]=user[i+1];} nElem--; cout<<”已刪除!“< return;} else { cout<<”輸入錯誤!“< system(”pause“); return;} } void modify_record(Fphone *p,char*ph_num)//修改用戶信息 { p->setphone_num(ph_num);} Fphone *query(char *na) //按姓名查找 順序查找,這里也可以用折半 { Fphone *p=user; int i=0; while(1) { if(strcmp(p->getname(),na)==0) return p; p++; if(i++==nElem) break;} return NULL;} void sorta_name()//按姓名升序排序 插入排序法 { Fphone temp;int i,j;for(i=1;i for(j=i-1;j>=0&&(strcmp(temp.getname(),user[j].getname())<0);j--) { strcpy(user[j+1].getname(),user[j].getname()); strcpy(user[j+1].getphone_num(),user[j].getphone_num()); } strcpy(user[j+1].getname(),temp.getname()); strcpy(user[j+1].getphone_num(),temp.getphone_num());} } void sorta_phonenum()//按電話號碼升序排序 選擇排序法 { int i,j,p;Fphone temp;for(i=0;i for(j=i+1;j if(strcmp(user[j].getphone_num(),user[p].getphone_num())<0)p=j; if(p!=i) { strcpy(temp.getname(),user[p].getname()); strcpy(temp.getphone_num(),user[p].getphone_num()); strcpy(user[p].getname(),user[i].getname()); strcpy(user[p].getphone_num(),user[i].getphone_num()); strcpy(user[i].getname(),temp.getname()); strcpy(user[i].getphone_num(),temp.getphone_num()); } } } void sort_name()//按姓名降序排序,將排成升序的對象數(shù)組逆向放置 { Fphone temp;int i,m=(nElem+1)/2;for(i=0;i strcpy(temp.getphone_num(),user[i].getphone_num()); strcpy(user[i].getname(),user[nElem-i-1].getname()); strcpy(user[i].getphone_num(),user[nElem-i-1].getphone_num()); strcpy(user[nElem-i-1].getname(),temp.getname()); strcpy(user[nElem-i-1].getphone_num(),temp.getphone_num());} } void sort_phonenum()//按電話號碼降序排序 冒泡排序法 { Fphone temp;int i,m=(nElem+1)/2;for(i=0;i strcpy(temp.getphone_num(),user[i].getphone_num()); strcpy(user[i].getname(),user[nElem-i-1].getname()); strcpy(user[i].getphone_num(),user[nElem-i-1].getphone_num()); strcpy(user[nElem-i-1].getname(),temp.getname()); strcpy(user[nElem-i-1].getphone_num(),temp.getphone_num());} } void disp(){ int i,n=0;cout< cout< < n++; if(n%10==0) { system(”pause“); system(”cls“); } } cout< 請選擇以下功能:“< 1-增加記錄“< 2-修改記錄“< 3-刪除記錄“< 4-查找(按姓名)“< 5-排序“< 6-顯示記錄“< 7-全刪“< 0-退出“< 輸入選擇:“< “< “< 歡迎使用電話簿管理系統(tǒng) “< 祝您使用愉快 “< “< system(”cls“); menu(); int k; cin>>k; switch(k) { case 1: { system(”cls“) cout<<”*****************************************“< cout<<” 增加記錄 “< Fphone *t=NULL; char w; do { cout<<”請輸入您要增加的用戶的姓名“; cin>>na; t=(s.query(na)); if(t) { cout<<”用戶已經(jīng)存在,添加失??!!“< else { cout<<”請輸入用戶的電話號碼“; cin>>ph_num; s.add_record(na,ph_num);cout<<”您添加的信息為:“;cout<<”姓名:“< } cout<<”是否繼續(xù)?(Y or N)“< cin>>w;} while(w=='Y');break;} case 2: { system(”cls“); cout<<”***************************************“< 修改記錄 “< char na[M],ph_num[N]; Fphone *t=NULL; char w; do { cout<<”請輸入您要修改的用戶的姓名“; cin>>na; t=s.query(na); if(!t) cout<<”沒有該用戶!“< else { cout<<”該用戶原號碼為:“< cout<<”請輸入新的電話號碼“; cin>>ph_num; s.modify_record(t,ph_num); cout<<”成功修改“< } cout<<”是否繼續(xù)?(Y or N)“< cin>>w; } while(w=='Y'); break;} case 3: { system(”cls“); cout<<”********************************************“< 刪除記錄 “< cout<<”************** ***************************“< char w; char na[M]; int k; Fphone *p; do { cout<<”請輸入您要刪除的用戶的姓名“; cin>>na; p=s.query(na); if(p==0) cout<<”沒有該用戶!“< else {(*p).disp(); k=p-s.getuser(); s.delete_record(p,k); } cout<<”是否繼續(xù)?(Y or N)“< cin>>w; } while(w=='Y'); break;} case 4: { system(”cls“); cout<<”*********************************“< cout<<” 查詢記錄 “< cout<<”**********************************“< char na[M];int p=1; Fphone *t=NULL; char w; do { cout<<”請輸入您要查詢的用戶的姓名“; cin>>na; t=s.query(na); if(t) { cout<<”姓名:“< cout<<”電話號碼:“< } else cout<<”對不起,沒有此人信息!“< cout<<”是否繼續(xù)?(Y or N)“< cin>>w;} } case 5: { while(w=='Y');break;system(”cls“); cout<<” 請選擇排序方式 “< cout<<” 1.按姓名(升序) “< cout<<” 2.按電話號碼(升序) “< cout<<” 3.按姓名(降序) “< cout<<” 4.按電話號碼(降序) “< cout<<” 請輸入你的選擇: “< int k; cin>>k; switch(k) { case 1: s.sorta_name(); cout<<”排序完成“< system(”cls“); break; case 2: s.sorta_phonenum(); cout<<”排序完成“< system(”cls“); break; case 3: s.sort_name(); cout<<”排序完成“< system(”cls“); break; case 4: s.sort_phonenum(); cout<<”排序完成“< system(”cls“); break; } } case 6: { system(”cls“); cout<<”*****************************************“< cout<<” 顯示記錄 “< cout<<”*****************************************“< s.disp(); system(”pause“);break; } } } case 7: { system(”cls“); cout<<”您確定要刪除所有記錄嗎?(Y or N)“< char q; cin>>q; if(q=='Y'||q=='y') { cout<<”*********************************“< cout<<” 全部刪除記錄 “< cout<<”*********************************“< s.clear(); } else break; system(”pause“); break;} case 0: { system(”cls“); cout<<”謝謝使用,再見!“< exit(0);} default: cout<<”不存在該選擇,請重新輸入要進行的操作:“< system(”pause"); break;} 七.感想與心得 1.電話簿管理程序較長,算法比較復(fù)雜,調(diào)試的過程中遇到了各種各樣的問題。各種各樣的小錯誤尋找起來十分困難。在今后編寫程序時應(yīng)當隨編隨找錯。 2.課設(shè)讓我們把這一學期所學的C++知識得到了很好的應(yīng)用,開拓了我們的思路,所謂溫故而而知新,這次課設(shè)也讓我們對以前的知識有了一個全面的回顧,加深了對已學知識的理解。 3.課設(shè)過程艱辛,花費時間很長,需要很強的耐力和信心。而這也是對我們的一次考驗,養(yǎng)成了堅持不懈和吃苦耐勞的精神??傊?,C++課設(shè)讓我們學到了很多,也收獲了很多,這必將成為我人生中的一個深刻的回憶。 #include |%-10s |%-15s |%-16s|n” #define DATA p->num ,p->name ,p->phonenum p->address #define END “----------------n” #define N 100 int saveflag=0; typedef int Status;typedef struct telebook{ char num[15]; char name[15]; char phonenum[15]; char address[20];}TELEBOOK; void menu(){ system(“cls”); textcolor(13); gotoxy(10,5); cprintf(“ The telephone-book Management System n”); gotoxy(10,8); cprintf(“*****************************************************n”); gotoxy(10,9); cprintf(“* input record display record * n”); gotoxy(10,10); cprintf(“* delete record search record * n”); gotoxy(10,11); cprintf(“* modify record insert record * n”); gotoxy(10,12); cprintf(“* sort record save record * n”); gotoxy(10,13); cprintf(“* 0 input record * n”); gotoxy(10,14); cprintf(“*****************************************************n”);} ,void printheader(){ printf(HEADER1); printf(HEADER2); printf(HEADER3);} void printdata(TELEBOOK pp){ TELEBOOK *p; p = &pp; printf(FORMAT,DATA);} void Disp(TELEBOOK temp[],int n){ int i; if(n==0) { printf(“n======>Not telephone record!n”); getchar(); return; } printf(“nn”); printheader(); i=0; while(i { printdata(temp[i]); i++; printf(HEADER3); } getchar();} void Wrong(){ printf(“nnnnn********Error:input has wrong!press any key to continue*******n”); getchar();} void Nofind(){ printf(“n========>Not find this telephone record!n”);} Status Locate(TELEBOOK temp[],int n,char findmess[],char nameorphonenum[]) /*find the locate*/ { int i=0; if(strcmp(nameorphonenum,“phonenum”)==0) { while(i { if(strcmp(temp[i].phonenum,findmess)==0)return i; i++; } } else if(strcmp(nameorphonenum,“name”)==0) { while(i { if(strcmp(temp[i].name,findmess)==0)return i; i++; } } return-1;} void stringinput(char *t,int lens,char *notice){ char n[255]; do{ printf(notice); scanf(“%s”,n); if(strlen(n)>lens)printf(“n exceed the required length!n”); }while(strlen(n)>lens); strcpy(t,n);} Status Add(TELEBOOK temp[],int n) /*increase record*/ { char ch,num[10]; int i,flag=0; system(“cls”); Disp(temp,n); while(1) { while(1) { stringinput(num,10,“input number(press '0' retrun menu):”); flag = 0; if(strcmp(num,“0”)==0) { return n;} i=0; while(i { if(strcmp(temp[i].num,num)==0) { flag = 1; break; } i++; } if(flag==1) { getchar(); printf(“==>The number %s is existing,try again?(Y/N):”,num); scanf(“%c”,&ch); if(ch=='Y'&&ch=='y')continue; else return n; } else break; } strcpy(temp[n].num,num); stringinput(temp[n].name,15,“Name:”); stringinput(temp[n].phonenum,15,“Telephone:”); stringinput(temp[n].address,15,“Adress:”); saveflag=1; n++; } return n;} void Qur(TELEBOOK temp[],int n)/*search the record*/ { int select; char searchinput[20]; int p = 0; if(n<=0) { system(“cls”); printf(“n====>No telephone record!n”); getchar(); return; } system(“cls”); printf(“n=====>1 Search by name =====>2 Search by telephonenumber!n”); printf(“ Please choice(1,2):”); scanf(“%d”,&select); if(select==1) { stringinput(searchinput,10,“input the existing name:”); p = Locate(temp,n,searchinput,“name”); if(p!=-1) { printheader(); printdata(temp[p]); printf(END); printf(“press any key to return ”); getchar(); } else { Nofind(); getchar(); } } else if(select==2) { stringinput(searchinput,15,“input the exiseing telephone number:”); p = Locate(temp,n,searchinput,“phonenum”); if(p!=-1) { printheader();printdata(temp[p]); printf(END); printf(“press any key to return ”); getchar(); } else { Nofind();getchar();} } else Wrong();getchar();} Status Del(TELEBOOK temp[],int n){ int sel; char findmess[20]; int p=0,i=0; if(n<=0) { system(“cls”); printf(“n======>No telephone!n”); getchar(); return n; } system(“cls”); Disp(temp,n); printf(“ ===>1 Name ====>2 Telephone Please choice[1,2]:”); scanf(“%d”,&sel); if(sel==1) { stringinput(findmess,15,“input the existing name:”); p = Locate(temp,n,findmess,“name”); getchar(); if(p!=-1) { for(i=p+1;i { strcpy(temp[i-1].num,temp[i].num); strcpy(temp[i-1].name,temp[i].name); strcpy(temp[i-1].phonenum,temp[i].phonenum); strcpy(temp[i-1].address,temp[i].address); } printf(“n==>delete successn”); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } else if(sel==2) { stringinput(findmess,15,“input the existing telephone number:”); p = Locate(temp,n,findmess,“phonenum”); getchar(); if(p!=-1) { for(i=p+1;i { strcpy(temp[i-1].num,temp[i].num); strcpy(temp[i-1].name,temp[i].name); strcpy(temp[i-1].phonenum,temp[i].phonenum); strcpy(temp[i-1].address,temp[i].address); } printf(“n======>delete success!n”); n--; getchar(); saveflag = 1; } else Nofind(); getchar(); } else Nofind(); getchar(); return n;} void Modify(TELEBOOK temp[],int n){ char findmess[20]; int p = 0; if(n==0) { system(“cls”); printf(“n=======>No telephone book recorderdn”); getchar(); return; } system(“cls”); printf(“modify telephone book recorder”); Disp(temp,n); stringinput(findmess,10,“input the existing name:”); p = Locate(temp,n,findmess,“name”); if(p!=-1) { printf(“Number : %sn”,temp[p].num); printf(“Name : %sn”,temp[p].name); stringinput(temp[p].name,15,“input new name:”); printf(“Telephone:%s n”,temp[p].phonenum); stringinput(temp[p].phonenum,15,“input new phonenum:”); printf(“Address:%sn”,temp[p].address); stringinput(temp[p].address,30,“input new address:”); printf(“n==========>modify success!n”); getchar(); saveflag = 1; } else { Nofind(); getchar(); } return;} Status Insert(TELEBOOK temp[],int n){ char ch,num[10],snum[10]; TELEBOOK newinfo; int flag = 0,i =0,kkk = 0; system(“cls”); Disp(temp,n); while(1) { stringinput(snum,10,“Please input insert location after the Number:”); flag = 0;i = 0; while(i { if(strcmp(temp[i].num,snum)==0){kkk = i;flag = 1;break;} i++; } if(flag==1)break; else { getchar(); printf(“n=====>The number %s is not existing,try again?(Y/N)”,snum); scanf(“%c”,&ch); if(ch=='Y'||ch=='y')continue; else return n; } } while(1) { stringinput(num,10,“input the new Number:”); i = 0;flag = 0; while(i { if(strcmp(temp[i].num,num)==0){flag = 1;break;} i++; } if(flag==1){ getchar(); printf(“n=======>Sorry,The number %s is existing,try again(Y/N)”,num); scanf(“%c”,&ch); if(ch=='y'||ch=='Y')continue; else return n; } else break; } strcpy(newinfo.num,num); stringinput(newinfo.name,15,“Name:”); stringinput(newinfo.phonenum,15,“Telephone:”); stringinput(newinfo.address,15,“Address:”); saveflag = 1; for(i=n-1;i>kkk;i--) { strcpy(temp[i+1].num,temp[i].num); strcpy(temp[i+1].name,temp[i].name); strcpy(temp[i+1].phonenum,temp[i].phonenum); strcpy(temp[i+1].address,temp[i].address); } strcpy(temp[kkk+1].num,newinfo.num); strcpy(temp[kkk+1].name,newinfo.name); strcpy(temp[kkk+1].phonenum,newinfo.phonenum); strcpy(temp[kkk+1].address,newinfo.address); n++; Disp(temp,n); printf(“nn”); getchar(); return n;} void SelectSort(TELEBOOK temp[],int n){ int i=0,j=0,indexmin; char charflag[10]; TELEBOOK newinfo; if(n<=0) { system(“cls”); printf(“====>Not telephone record!n”); getchar(); return; } system(“cls”); Disp(temp,n); printf(“The order is sorted by number:n”); for(i=0;i { indexmin = i; for(j=i+1;j if(strcmp(temp[i].num,temp[j].num>0)) indexmin = j; if(indexmin!=i) { strcpy(newinfo.num,temp[i].num); strcpy(newinfo.name,temp[i].name); strcpy(newinfo.phonenum,temp[i].phonenum); strcpy(newinfo.address,temp[i].address); strcpy(temp[indexmin].num,newinfo.num); strcpy(temp[indexmin].name,newinfo.name); strcpy(temp[indexmin].phonenum,newinfo.phonenum); strcpy(temp[indexmin].address,newinfo.address); } } Disp(temp,n); saveflag = 1; printf(“n=======>sort complete!n”); getchar(); return;} void Save(TELEBOOK temp[],int n){ FILE *fp; int i = 0; fp = fopen(“c: elephonebook”,“w”); if(fp==NULL) { printf(“n=====>open file error!n”); getchar(); return; } for(i=0;i { if(fwrite(&temp[i],sizeof(TELEBOOK),1,fp)==1) continue; else break; } if(i>0) { getchar();printf(“nn=====>save file comlete,toal save's record is save's record number is:%dn”,i); getchar(); saveflag = 0; } else { system(“cls”); printf(“the current link is empty , no telephone record is saved!n”); getchar(); fclose(fp); } } void main(){ TELEBOOK tele[N]; FILE *fp; int select; char ch; int count=0; fp = fopen(“C: elephonebook”,“a+”); if(fp==NULL) { printf(“n========>can not open file!n”); exit(0); } while(!feof(fp)) { if(fread(&tele[count],sizeof(TELEBOOK),1,fp)==1) count++; } fclose(fp); printf(“n==>open file sucess, the total records number is :%d.n”,count); getchar(); menu(); while(1) { system(“cls”); menu(); printf(“n Please Enter you choice(0-9):”); scanf(“%d”,&select); if(select==0) { if(saveflag==1) { getchar(); printf(“n==>Wether save the modified record to file?(Y/N):”); scanf(“%c”,&ch); if(ch=='Y'||ch=='y') Save(tele,count); } printf(“n===>thank you for useness!”); getchar(); break; } switch(select) { case 1:count=Add(tele,count);break; case 2:system(“cls”);Disp(tele,count);break; case 3:count = Del(tele,count);break; case 4:Qur(tele,count);break; case 5:Modify(tele,count);break; case 6:count = Insert(tele,count);break; case 7:SelectSort(tele,count);break; case 8:Save(tele,count);break; default :Wrong();getchar();break; } } getch();} 項目設(shè)計題目(學生成績管理系統(tǒng)) 學號: 姓名: 自評成績: 成績: 1.選題意義、依據(jù) 學生成績系統(tǒng)的設(shè)計從學生的應(yīng)用中而來,學生了解該系統(tǒng)的組成和運行過程,它貼近學生的生活能使學生更加方便的使用各個語句、函數(shù)、結(jié)構(gòu)體等。 依據(jù)學生期末成績表的格式。 2.系統(tǒng)功能設(shè)計與分析(功能模塊說明) 系統(tǒng)主要用于從一個文件夾讀入學生信息(101 張三 78 87 102 李斯 103 王紅 79 87 104 趙子龍 72 75 76 李洪磊 88 98 89),包括學生學號、姓名、成績(數(shù)學、英語、數(shù)據(jù)庫),程序中引用了八個函數(shù) void Cscore(int);void Rank(int ave);void Listnumber(int i); void Listscore(int i);void Lookup(int);void Alter(int);void Dele(int &i);void Insert(int &i);系統(tǒng)主要實現(xiàn)的功能有:查詢、修改、刪除、插入、成績單(以學號排名)和成績單(以名次排名)。 Cscore 函數(shù)主要是對學生進行排名。具有相同總分的學生具有相同的名次,例如:第三名和第四名具有相同的總分則在表中不會出現(xiàn)第四名,將出現(xiàn)兩個第三名緊接著出現(xiàn)第五名學生的情況。 Rank 函數(shù)主要用于按平均分對學生進行備注。把學生分為四個等級:>90分為excellent,80—90分為medium,60—80分為qualified,<60分為disqualified。Listnumber 函數(shù)主要用于把學生的信息(學號 姓名 數(shù)學 英語 數(shù)據(jù)庫 總分平均分 名次 備注)以學號排名的順序用表的形式輸出,方便學生查看。Listnumber 函數(shù)中還調(diào)用了Cscore 和Rank 函數(shù)。 Listscore 函數(shù)是把學生的信息以總成績排名的形式輸出。 Lookup 函數(shù)主要運用學號或姓名形式查詢單個學生信息,如果存在則輸出該學生信息(學號 姓名 數(shù)學 英語 數(shù)據(jù)庫 總分平均分 名次 備注),否則輸出“Input message is error.”。 Alter 函數(shù)是修改指定學號的學生信息。主要用于修改指定學號學生的各科成績并輸出修改后的學生信息(學號 姓名 數(shù)學 英語 數(shù)據(jù)庫 總分平均分 名次 備注)。 Delete 函數(shù)用于刪除指定學生的信息??捎脙煞N方式刪除:以學號形式刪除學生信息,以姓名形式刪除學生信息。若要刪除了學生不存在則輸出“message error.”。 Insert 函數(shù)用來插入學生的信息,一次調(diào)用Insert 函數(shù)可以添加多個學生的信息。Insert 函數(shù)中還調(diào)用了Cscore 和Rank 函數(shù)。 3.涉及的主要知識點說明 (1)系統(tǒng)主要運用了函數(shù)的聲明、定義、調(diào)用(值調(diào)用和地址調(diào)用)。 (2)對文件的讀入操作。 (3)在平均分的求取上采用四舍五入的方式,運用了類型轉(zhuǎn)換。(4)多次運用if和for嵌套,在for嵌套中又運用了break語句。(5)運用了switch。 (6)對字符數(shù)組的比較中運用了strcmp,還運用toupper把小寫字母轉(zhuǎn)換成大寫。 (7)對學生信息進行的插入和有序刪除操作。(8)運用iomanip對輸出進行美觀。 4.創(chuàng)新性說明(怎么解決) 創(chuàng)新性:系統(tǒng)可以對具有相同總分學生的學生輸出相同的名次。若存在三個相同的分數(shù)都為第二名,則在輸出時出現(xiàn)三個第二名不會出現(xiàn)第三、四名,緊接著出現(xiàn)第五名。 解決方法:(1)用一個數(shù)組記錄具有相同分數(shù)的人數(shù),數(shù)組下標和學生信息所具有的下標相同;(2)刪除相同的總分只保留其中一個分數(shù);(3)對刪除相同總分的分數(shù)按從高到底進行排序;(4)對各個學生的總分進行排名。 5.源代碼 //****************************************************************** //Student achievement program //This program has eight functions of students grade,including list //score ranking,lookup,alter,delete,insert and rank.From the file read in //student achievement.Scores of people have the same same place.//****************************************************************** #include void Cscore(int);void Rank(int ave);void Listnumber(int i);void Listscore(int i);void Lookup(int);void Alter(int);void Dele(int &i);void Insert(int &i); using namespace std;const int MAX=100; struct student //定義學生信息結(jié)構(gòu)體 { int num;char name[8];int math;int english;int database;int sum;int average;int score;}stu[MAX]; int main() //主函數(shù) { int i,k;char ch;string filename;ifstream infile; cout<<“Please input the filenames: ”;cin>>filename;infile.open(filename.c_str());if(!infile){ cout<<“Can't open the input file.”< return 1;} for(i=0;i infile>>stu[i].num>>stu[i].name>>stu[i].math>>stu[i].english>>stu[i].database; stu[i].sum=stu[i].math+stu[i].english+stu[i].database; stu[i].average=int(float(stu[i].sum)/3+0.5);} i=i-1;cout< 學生成績管理系統(tǒng) ”< cout<<“Y or N 進入菜單欄 ”< <<“ 菜單:”< <<“ 1)查 詢”< <<“ 2)修 改”< <<“ 3)刪 除”< <<“ 4)插 入”< <<“ 5)成績單(以學號排名)”< 6)成績單(以名次排名)”< cout<<“***請選擇 1--4 中任何一個:”< cin>>k; cout< switch(k){ case 1:Lookup(i);break; case 2:Alter(i);break; case 3:Dele(i);break; case 4:Insert(i);break; case 5:Listnumber(i);break; case 6:Listscore(i);break; default :cout<<“error input!”< cout< cin>>ch; ch=toupper(ch);} cout<<“Thank you for using!”< <<“Bye bye!”< void Cscore(int i) //對學生分數(shù)進行排名 { int h[MAX],b[MAX],score[MAX+1],n,k,j;int sum0[MAX],s;n=i;for(j=0;j sum0[j]=stu[j].sum;} for(j=0;j h[j]=0;for(k=0;k h[j]++; //具有同一分數(shù)的人數(shù) } } //end for } //end for for(j=0;j //刪除多個同一分數(shù)只保留其中一個分數(shù) { for(k=j+1;k if(sum0[j]==sum0[k]) { sum0[k]=sum0[i-1]; i--; k--; } } } //end for for(j=0;j //按從高到底的順序?qū)偡诌M行排名 { for(k=j+1;k if(sum0[j] { s=sum0[j]; sum0[j]=sum0[k]; sum0[k]=s; } //end if } //end for } //end for b[0]=0;score[0]=1;for(j=0;j //對學生成績進行排名 { for(k=0;k if(sum0[j]==stu[k].sum) { score[j+1]=score[j]+b[j]; stu[k].score=score[j+1]; b[j+1]=h[k]; } //end if } //end for } //end for } void Rank(int ave) //對學生等級輸出 { if(ave>=90) { cout<<“excellent”; } else if(ave>=80) { cout<<“medium”; } else if(ave>=60) { cout<<“qualified”; } else { cout<<“disqualified”; } cout< void Listnumber(int i){ int j;Cscore(i);cout<<“學號 姓名 數(shù)學 英語 數(shù)據(jù)庫 總分 平均分 名次 備注 ”< cout< < cout< cout< cout< Rank(stu[j].average);} } void Listscore(int i){ int j,k;Cscore(i);cout<<“學號 姓名 數(shù)學 英語 數(shù)據(jù)庫 總分 平均分 名次 備注 ”< for(k=0;k { if(stu[k].score==j) { cout< < cout< cout< cout< Rank(stu[k].average); } } } } void Lookup(int i) //運用學號或姓名形式查詢單個學生信息 { int j,k,n,numb;char name1[8]; cout<<“Please select you check score ways.”< //以學號形式查詢學生信息 { cout<<“Please input student number: ”; cin>>numb; for(j=0;j { if(numb==stu[j].num) { k=j; break; } } } else //以姓名形式查詢學生信息 { cout<<“Please input student name: ”; cin>>name1; for(j=0;j if(strcmp(stu[j].name,name1)==0) { k=j; break; } } if(k==MAX){ cout<<“Input message is error.”< //如果學生存在則輸出學生信息 { Cscore(i); cout<<“學號 姓名 數(shù)學 英語 數(shù)據(jù)庫 總分 平均分 名次 備注 ”< cout<第三篇:電話簿管理系統(tǒng)
第四篇:學生成績管理系統(tǒng)C++程序設(shè)計