第一篇:數(shù)據(jù)結(jié)構(gòu)CAI系統(tǒng)項(xiàng)目手冊(cè)
數(shù)據(jù)結(jié)構(gòu)
項(xiàng)目書
項(xiàng)目經(jīng)理: 產(chǎn)品經(jīng)理: 測(cè)試經(jīng)理:
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
一、問題描述:
以數(shù)據(jù)結(jié)構(gòu)教材中樹和圖的內(nèi)容為例,設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)的CAI(計(jì)算機(jī)輔助教學(xué))系統(tǒng),用菜單的形式選擇各項(xiàng)功能。用圖形化界面的形式顯示算法的執(zhí)行過程。
二、程序分析:
二叉樹的遍歷算法演示中,首先定義一個(gè)TREE的結(jié)構(gòu)體,里面存放的數(shù)據(jù)類型分別是char,兩個(gè)TREE類型指針*lchild(左孩子),*rchild(右孩子),兩個(gè)int分別是x和y,分別代表了樹的x坐標(biāo)和y坐標(biāo)。再建立一個(gè)名稱為OUTPUT的結(jié)構(gòu)體里面存放了三種遍歷的x坐標(biāo)和y坐標(biāo)。通過對(duì)Tree *CreatTree();函數(shù)的調(diào)用生成二叉樹再通過void Preorder(Tree *t);void Midorder(Tree *t);void Posorder(Tree *t);這三個(gè)函數(shù)進(jìn)行前中后的遍歷來判斷左右孩子是否存在。
三、程序設(shè)計(jì):
1、結(jié)構(gòu)化函數(shù)設(shè)計(jì)
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
2、設(shè)計(jì)工具
Win-TC, c文件
3、編碼
頭文件:
#include
結(jié)構(gòu)體:
typedef struct TREE {
char data;
/*樹的結(jié)點(diǎn)數(shù)據(jù)*/
struct TREE *lchild;
struct TREE *rchild;
int x;
/*樹的x坐標(biāo)*/
int y;
/*樹的y坐標(biāo)*/ }Tree;
struct OUTPUT {
int x;
/*三種遍歷的x坐標(biāo)*/
int y;
/*三種遍歷的y坐標(biāo)*/
int num;}s;
函數(shù):
·函數(shù)名稱:void DrawTree(Tree *t);·函數(shù)描述:用圖形顯示創(chuàng)建好的樹
·函數(shù)名稱:void Preorder(Tree *t);·函數(shù)描述:前序遍歷
·函數(shù)名稱:void Midorder(Tree *t);·函數(shù)描述:中序遍歷
·函數(shù)名稱:void Posorder(Tree *t);·函數(shù)描述:后序遍歷
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
·函數(shù)名稱:void DrawNode(Tree *t,int color);
·函數(shù)描述:遍歷時(shí)顯示每個(gè)結(jié)點(diǎn)的過程
·函數(shù)名稱:void ClrScr();
·函數(shù)描述:清空樹的區(qū)域
·函數(shù)名稱:void Close(void);·函數(shù)描述:圖形模式結(jié)束
四、測(cè)試與調(diào)試:
1、調(diào)試報(bào)告
一開始的調(diào)試中,我們就碰到了很嚴(yán)重的問題,圖形化的界面一直無法正常的顯示出來,運(yùn)行之后,都是一閃即逝,為此,我們上網(wǎng)查閱了很多信息。加了getch(); 也加了system(“plause”);,這些基本的解決方法毫無用處;又有說要把Egavga.bgi這個(gè)文件和生成的exe文件放在一起,起初使用TC3.0時(shí)也無法正常顯示圖形界面。多番嘗試無果之后打算試試Win-TC,結(jié)果莫名其妙的成功了。并且發(fā)現(xiàn)Egavga.bgi的確要和exe文件放在同一個(gè)文件夾,不在一起時(shí)無法進(jìn)入圖形界面,這是在一次另存為把文件保存到其他文件夾時(shí)發(fā)現(xiàn)的。還有最開始時(shí),對(duì)于一些需要用到的函數(shù)所需的頭文件不是很了解,不過通過網(wǎng)絡(luò)的搜索之后,都一一得到解答。但是直到目前為止,依然有個(gè)比較大的問題,就是系統(tǒng)自動(dòng)生成二叉樹的時(shí)候,經(jīng)常會(huì)出現(xiàn)重復(fù)字母的結(jié)點(diǎn),我們想的是能不能一個(gè)節(jié)點(diǎn)之后就在26個(gè)字母之中把這個(gè)結(jié)點(diǎn)用到的字母抽出去,然后剩下的位置就從剩下的字母中選取,可是二叉樹是一下子全部顯示出來,好像沒有明顯的先后順序,最后還是不會(huì)。
2、測(cè)試結(jié)果
A:主界面---選擇生成樹的方式(自動(dòng)/手動(dòng))
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
B:選擇1后
C:選擇2后
D:按任意鍵后,進(jìn)入二叉樹的演示初始界面---圖形化界面的初始化
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
E:按任意鍵后開始遍歷,并輸出遍歷結(jié)果
五、主要算法分析:
(一)二叉樹的生成
Tree *InitTree(int h,int t,int w){
char ch;
int n;
/*自動(dòng)建立時(shí)隨機(jī)賦值判斷是否是NULL的標(biāo)志*/
Tree *node;
if(way=='2')
/*手動(dòng)建立需要自己輸入*/
scanf(“%c”,&ch);
else
/*自動(dòng)建立的賦值*/
{
n=random(5);
if(n==0&&nodeNUM>=3)
/*隨機(jī)賦值時(shí)候確保自動(dòng)建立的二叉樹有三個(gè)結(jié)點(diǎn)*/
ch=' ';
else
ch=65+random(25);
}
if(ch==' ')
/*輸入空格代表NULL*/
return NULL;
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
else
{
if(h==6||nodeNUM==26)/*如果樹的層次已經(jīng)到5或者結(jié)點(diǎn)樹到達(dá)26個(gè)就自動(dòng)返回NULL*/
return NULL;
node=(Tree*)malloc(sizeof(Tree));
node->data=ch;
node->x=t;
/*樹的x坐標(biāo)是傳遞過來的橫坐標(biāo)*/
node->y=h*50;/*樹的y坐標(biāo)與層次大小有關(guān)*/
nodeNUM++;
node->lchild=InitTree(h+1,t-w,w/2);
node->rchild=InitTree(h+1,t+w,w/2);
}
return node;} 功能:實(shí)現(xiàn)二叉樹的生成功能,用于構(gòu)建二叉樹
(二)圖形化顯示二叉樹
void DrawTree(Tree *t){ if(t!=NULL){ setcolor(BLACK);setfillstyle(SOLID_FILL,BLACK);fillellipse(t->x,t->y,9,9);setcolor(WHITE);circle(t->x,t->y,10);/*畫圓*/ sprintf(str,“%c”,t->data);/*將內(nèi)容轉(zhuǎn)換成字符串輸出*/ outtextxy(t->x-3,t->y-2,str);if(t->lchild!=NULL)
/*左子樹*/ { line(t->x-5,t->y+12,t->lchild->x+5,t->lchild->y-12);DrawTree(t->lchild);} if(t->rchild!=NULL)
/*右子樹*/ { line(t->x+5,t->y+12,t->rchild->x-5,t->rchild->y-12);DrawTree(t->rchild);} } } 功能:利用坐標(biāo)實(shí)現(xiàn)圖形化輸出二叉樹的功能,用于圖形化演示
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
六、心得體會(huì):
項(xiàng)目經(jīng)理-肖毅:
剛開始拿到課設(shè)的題目時(shí),瀏覽一遍之后發(fā)現(xiàn)毫無頭緒,不知從何下手。從大一接觸C語(yǔ)言開始,到后來學(xué)習(xí)C++,到現(xiàn)在的數(shù)據(jù)結(jié)構(gòu),學(xué)到現(xiàn)在,面對(duì)大型完整程序的編寫,依然感覺很是無力。最后我們選擇了數(shù)據(jù)結(jié)構(gòu)CAI系統(tǒng),因?yàn)橛X得可以直接從所學(xué)的一些算法中直接完成,已經(jīng)學(xué)過現(xiàn)成的算法,有了明確的目標(biāo),我們要做的就是將這些算法圖形化的演示出來,不會(huì)毫無思路。雖然的確有些思路了,但是也并沒有我們想象的那么簡(jiǎn)單,從最開始的計(jì)劃完成3個(gè)算法的演示到最后只完成了一個(gè)二叉樹的三種遍歷的演示。另外我們覺得選擇這個(gè)也能夠幫助我們復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu)的一些知識(shí),對(duì)于即將到來的數(shù)據(jù)結(jié)構(gòu)考試也是有所幫助的,雖然查找和排序并沒有完成,但是我們也翻閱數(shù)據(jù)結(jié)構(gòu)課本仔細(xì)研究了書上關(guān)于那些部分的算法,這也是一種復(fù)習(xí),排序和查找也是數(shù)據(jù)結(jié)構(gòu)中很重要的一部分。
確定完題目之后,就要開始著手編寫了,我們組成員的整體水平雖然不是很高,但我們依然能夠憑借自己的努力來完成程序,遇到不會(huì)的問題,我們會(huì)向其他同學(xué)請(qǐng)教,并且自己上網(wǎng)搜索相關(guān)信息,不得不再次感嘆網(wǎng)絡(luò)的強(qiáng)大,網(wǎng)絡(luò)確實(shí)是現(xiàn)代生活中不可缺少的一部分。這次課設(shè)中我和池璐主要負(fù)責(zé)程序的編寫,我們也是邊寫程序邊學(xué)習(xí),我主要負(fù)責(zé)程序中二叉樹圖形化輸出和二叉樹的生成等部分,圖形化輸出需要用到坐標(biāo),我們要將想要輸出的東西放到屏幕上正確的部分,需要經(jīng)過多次嘗試之后才能最后確定坐標(biāo)。同時(shí)也讓其他幾位成員參與編寫并學(xué)習(xí),對(duì)于一些我會(huì)的地方,也會(huì)跟他們講解,為了讓他們更好的理解程序,并完成后期PPT的制作。團(tuán)隊(duì)協(xié)作能力也是考校一個(gè)計(jì)算機(jī)專業(yè)學(xué)生的一個(gè)很重要的因素。
通過這次課設(shè),對(duì)于數(shù)據(jù)結(jié)構(gòu)基本功的知識(shí)是一種強(qiáng)化,更扎實(shí)了數(shù)據(jù)結(jié)構(gòu)的基本功,并學(xué)習(xí)到了很多課堂上沒有學(xué)到過的知識(shí),對(duì)于計(jì)算機(jī)知識(shí)的學(xué)習(xí)之路,光靠課堂所學(xué)是遠(yuǎn)遠(yuǎn)不夠的。實(shí)際程序的編寫也是很重要的,每一個(gè)完整的程序?qū)τ谧约憾际且淮螝v練,這對(duì)于以后的學(xué)習(xí)和未來的工作都是很有幫助的。
項(xiàng)目經(jīng)理-池璐:
在忙碌了一個(gè)星期之后,課設(shè)終于結(jié)束了。“實(shí)踐出真知”,編出一些有用的程序更是對(duì)數(shù)據(jù)結(jié)構(gòu)這門課程學(xué)習(xí)的最好檢驗(yàn)。正是這次的檢驗(yàn),讓我受益良多。
我們?cè)O(shè)計(jì)的是一款教學(xué)CAI輔助程序,用直觀便于理解的動(dòng)態(tài)圖示為學(xué)生展現(xiàn)的是二叉樹的3種遍歷方式。我主要負(fù)責(zé)的是界面設(shè)計(jì)和3種遍歷。界面上我設(shè)計(jì)的比較簡(jiǎn)潔,用一些特殊符號(hào)構(gòu)成了框架。為了方便老師,我設(shè)計(jì)了2種方式,一種為計(jì)算機(jī)自動(dòng)分配二叉樹,另一種是認(rèn)為輸入。3種不同的遍歷方式主要看的是根節(jié)點(diǎn)的位置。例如先序遍歷的根節(jié)點(diǎn)最先被訪問。在算法的設(shè)計(jì)中我也參與了進(jìn)去,與項(xiàng)目經(jīng)理進(jìn)行了探討,最終完成了整個(gè)程序。
當(dāng)然,編程之路并非一帆風(fēng)順。其間我們也遇到了許多問題。比如菜單的編程問題,編程環(huán)境的影響一記圖形函數(shù)的應(yīng)用。在查閱資料后,大部分問題得到了解決,我也學(xué)到了之前不太了解的問題。另外,我計(jì)劃還設(shè)計(jì)一款二分法的CAI程序,由于知識(shí)水平有限,我便看書試圖解決這個(gè)問題。但是最后沒有能夠解決。課設(shè)雖然結(jié)束了,但是學(xué)習(xí)的腳步還沒有就此停下。更多的實(shí)踐等著我把
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
數(shù)據(jù)結(jié)構(gòu)這么課在學(xué)習(xí)生活中運(yùn)用的更加?jì)故欤斫獾母油笍亍_@才是學(xué)好這門課的意義。
產(chǎn)品經(jīng)理-黃友鵬:
通過本次課設(shè),我學(xué)到很多。首先必須承認(rèn),我的基礎(chǔ)很差,本來對(duì)編一大段程序就很頭疼,但是這次以小組方式進(jìn)行,使我能夠向他人學(xué)習(xí),就算是大家都不會(huì)的問題我們也可以分工上網(wǎng)尋找解決的辦法,總之,第一次覺得學(xué)習(xí)也可以變得很輕松。
而且,通過這次課設(shè),我也懂得了好多專業(yè)的名詞,如路演,CAI系統(tǒng)...這些都是我以前沒有接觸過的。
本次課設(shè)我擔(dān)任產(chǎn)品經(jīng)理的職位,這不只是一個(gè)小小的虛銜,這是讓我們提早感受社會(huì),事實(shí)上我也是這么努力的,我自己做了路演PPT,而且目的就是讓別人接收我們的產(chǎn)品,雖然還有很多的不足,但我們努力了,我也很有成就感。
總之,在這次課設(shè)中我學(xué)到了很多,也感覺進(jìn)步了很大。
測(cè)試經(jīng)理-于連明:
這次課設(shè)給了我很大的鍛煉,使我進(jìn)一步理解數(shù)據(jù)結(jié)構(gòu)的重要性。我們小組設(shè)計(jì)的是CAI(Computer Assisted Instruction),也就是計(jì)算機(jī)輔助教學(xué)。目前我們所學(xué)的數(shù)據(jù)結(jié)構(gòu)計(jì)算機(jī)專業(yè)一門重要的專業(yè)技術(shù)基礎(chǔ)課程,有人概括過這樣一個(gè)公式:程序=算法+數(shù)據(jù)結(jié)構(gòu),要設(shè)計(jì)好的程序,除了要設(shè)計(jì)好的算法之外,還必須采用合適的數(shù)據(jù)結(jié)構(gòu)。所以數(shù)據(jù)結(jié)構(gòu)的知識(shí)對(duì)設(shè)計(jì)和實(shí)現(xiàn)計(jì)算機(jī)系統(tǒng)軟件如操作系統(tǒng)、編譯程序和數(shù)據(jù)庫(kù)管理系統(tǒng)等是十分重要的;它對(duì)于編寫應(yīng)用軟件的人來說也是必不可少的。
然而學(xué)習(xí)這門課程有一些困難:
(1)內(nèi)容豐富,學(xué)習(xí)量大,給學(xué)習(xí)帶來困難。
(2)貫穿的動(dòng)態(tài)鏈表存儲(chǔ)結(jié)構(gòu)和遞歸技術(shù)是學(xué)習(xí)中的重點(diǎn)也是難點(diǎn);
(3)所用到的技術(shù)多,而在此之前的各門課程中所介紹的專業(yè)性知識(shí)又不多,因而加大了學(xué)習(xí)難度;在解答問題時(shí)出會(huì)因此而困難重重。
因此我們小組為了解決數(shù)據(jù)結(jié)構(gòu)學(xué)起來困難的麻煩,設(shè)計(jì)了CAI系統(tǒng)。這是一種嶄新的教學(xué)方式,它可以代替教師模擬教學(xué)過程,是通過學(xué)生與計(jì)算機(jī)之間的交互活動(dòng)達(dá)到教學(xué)的目的。其圖文并茂,靈活方便的眾多特點(diǎn),可以激發(fā)我們學(xué)生的學(xué)習(xí)興趣,且發(fā)揮學(xué)生的學(xué)生積極性,提高教學(xué)質(zhì)量。CAI可以將某些非順序信息呈現(xiàn)出來,可以包括一門課程或與某個(gè)對(duì)象有關(guān)的全部知識(shí)。我們即可以瀏覽所有知識(shí),也可以按自己的需要獲取其中任意所感興趣的一部分,學(xué)生可以控制學(xué)習(xí)內(nèi)容和進(jìn)度。
但是我們?cè)O(shè)計(jì)的CAI系統(tǒng)缺乏網(wǎng)絡(luò)支持。它是運(yùn)行在單機(jī)下環(huán)境下的。無法利用網(wǎng)絡(luò)在知識(shí)更新上的方便與快捷的優(yōu)勢(shì)。這樣的CAI課件一旦生產(chǎn)完成就再也無法對(duì)教學(xué)的內(nèi)容進(jìn)行更新和維護(hù),因而是沒有生命力的,將隨著時(shí)間的發(fā)展而逐步被淘汰。這類弊端有待研究解決。
這次課設(shè)也使我明白團(tuán)隊(duì)的合作是非常重要的,團(tuán)結(jié)就是勝利。
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
七、分工協(xié)作:
項(xiàng)目經(jīng)理:肖毅 池璐
職責(zé):負(fù)責(zé)整個(gè)項(xiàng)目小組的人員管理、進(jìn)度管理,主要攻克軟件產(chǎn)品技術(shù)環(huán)節(jié)的問題,負(fù)責(zé)路演環(huán)節(jié)技術(shù)問題的答辯,負(fù)責(zé)項(xiàng)目手冊(cè)中的核心算法部分的書寫及整個(gè)項(xiàng)目手冊(cè)的整理定稿。負(fù)責(zé)進(jìn)行項(xiàng)目中期匯報(bào)及與指導(dǎo)教師的溝通。
產(chǎn)品經(jīng)理:黃友鵬
職責(zé):負(fù)責(zé)整個(gè)產(chǎn)品的框架設(shè)計(jì)、外觀設(shè)計(jì)和功能模塊的升級(jí)設(shè)計(jì),主要負(fù)責(zé)產(chǎn)品的需求分析及性能改良,負(fù)責(zé)手冊(cè)中產(chǎn)品外觀和框架及需求的書寫,負(fù)責(zé)路演環(huán)節(jié)PPT的制作。
測(cè)試經(jīng)理:于連明
職責(zé):負(fù)責(zé)整個(gè)產(chǎn)品的功能模塊部分的設(shè)計(jì)與最終產(chǎn)品測(cè)試環(huán)節(jié),建立產(chǎn)品所需的數(shù)據(jù)資源庫(kù),負(fù)責(zé)路演環(huán)節(jié)產(chǎn)品使用的答辯,負(fù)責(zé)項(xiàng)目手冊(cè)中功能模塊及算法的書寫。
八、附錄:源代碼
/********二叉樹的三種遍歷算法演示********/ #include
typedef struct TREE {
char data;
/*樹的結(jié)點(diǎn)數(shù)據(jù)*/
struct TREE *lchild;
struct TREE *rchild;
int x;
/*樹的x坐標(biāo)*/
int y;
/*樹的y坐標(biāo)*/ }Tree;
struct OUTPUT {
int x;
/*三種遍歷的x坐標(biāo)*/
int y;
/*三種遍歷的y坐標(biāo)*/
int num;}s;
int nodeNUM=0;/*統(tǒng)計(jì)當(dāng)前的結(jié)點(diǎn)數(shù)字,最多26個(gè)*/ char way;
/*自動(dòng)建立樹和手動(dòng)建立樹的標(biāo)志,2手動(dòng),1自動(dòng)*/ char str[3];
/*顯示結(jié)點(diǎn)數(shù)據(jù)的字符串*/
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
void Init();
/*圖形初始化*/ void Close();/*圖形關(guān)閉*/ Tree *CreatTree();
/*文本模式下創(chuàng)建樹的過程*/ Tree *InitTree(int h,int t,int w);/*創(chuàng)建樹,h層次,t橫坐標(biāo),w樹之間的寬度,n樹的建立方式*/ void DrawTree(Tree *t);/*用圖形顯示創(chuàng)建好的樹*/ void Preorder(Tree *t);/*前序遍歷*/ void Midorder(Tree *t);/*中序遍歷*/ void Posorder(Tree *t);/*后序遍歷*/ void DrawNode(Tree *t,int color);
/*遍歷時(shí)顯示每個(gè)結(jié)點(diǎn)的過程*/ void ClrScr();
/*清空樹的區(qū)域*/
void main(){
Tree *root;
randomize();
root=CreatTree();/*創(chuàng)建樹*/
Init();
DrawTree(root);
/*每次遍歷前顯示白色的樹*/
sleep(1);
s.x=100;s.y=300;s.num=1;/*每次遍歷前設(shè)置顯示遍歷順序顯示的x,y坐標(biāo)*/
Preorder(root);
/*前序遍歷*/
getch();
ClrScr();
DrawTree(root);
sleep(1);
s.x=100;
s.y=350;
s.num=1;
Midorder(root);
/*中序遍歷*/
getch();
ClrScr();
DrawTree(root);
sleep(1);
s.x=100;
s.y=400;
s.num=1;
Posorder(root);
/*后序遍歷*/
Close();}
/*清空樹的區(qū)域*/ void ClrScr(){
setcolor(BLACK);
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
setfillstyle(SOLID_FILL,BLACK);
bar(0,20,640,280);}
/*樹的創(chuàng)建*/ Tree *CreatTree(){
Tree *root;
clrscr();
printf(“n”);
printf(“n”);
printf(“
Binary tree traversal
n”);
printf(“
----------------------------n”);
printf(“
**********Please input '1' OR '2' to choose********** n”);
printf(“
*
* n”);
printf(“
*
1.Computer creat
* n”);
printf(“
*
* n”);
printf(“
*
2.People creat
* n”);
printf(“
*
* n”);
printf(“
***************************************************** n”);
way=getch();/*輸入創(chuàng)建樹的方法,1電腦自動(dòng)建立,2人工手動(dòng)建立*/
if(way!='2')
way='1';
/*其他數(shù)字默認(rèn)自動(dòng)建立*/
if(way=='2')/*手動(dòng)建立提示輸入結(jié)點(diǎn),例abc de f g
*/
printf(“
Please creat the tree:
n”);
root=InitTree(1,320,150);
system(“pause”);
return root;}
/*生成二叉樹,h表示層次,t表示橫坐標(biāo),w表示結(jié)點(diǎn)左右子樹的寬度,隨機(jī)數(shù)n確定結(jié)點(diǎn)是空或非空,如n為0,則為空,但要限定確保結(jié)點(diǎn)數(shù)不少于三個(gè)*/ Tree *InitTree(int h,int t,int w){
char ch;
int n;
/*自動(dòng)建立時(shí)隨機(jī)賦值判斷是否是NULL的標(biāo)志*/
Tree *node;
if(way=='2')
/*手動(dòng)建立需要自己輸入*/
scanf(“%c”,&ch);
else
/*自動(dòng)建立的賦值*/
{
n=random(5);
if(n==0&&nodeNUM>=3)
/*隨機(jī)賦值時(shí)候確保自動(dòng)建立的二叉樹有三個(gè)結(jié)點(diǎn)*/
ch=' ';
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
else
ch=65+random(25);
}
if(ch==' ')
/*輸入空格代表NULL*/
return NULL;
else
{
if(h==6||nodeNUM==26)/*如果樹的層次已經(jīng)到5或者結(jié)點(diǎn)樹到達(dá)26個(gè)就自動(dòng)返回NULL*/
return NULL;
node=(Tree*)malloc(sizeof(Tree));
node->data=ch;
node->x=t;
/*樹的x坐標(biāo)是傳遞過來的橫坐標(biāo)*/
node->y=h*50;/*樹的y坐標(biāo)與層次大小有關(guān)*/
nodeNUM++;
node->lchild=InitTree(h+1,t-w,w/2);
node->rchild=InitTree(h+1,t+w,w/2);
}
return node;}
/*用圖形顯示創(chuàng)建好的樹*/ void DrawTree(Tree *t){
if(t!=NULL)
{
setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(t->x,t->y,9,9);
setcolor(WHITE);
circle(t->x,t->y,10);/*畫圓*/
sprintf(str,“%c”,t->data);/*將內(nèi)容轉(zhuǎn)換成字符串輸出*/
outtextxy(t->x-3,t->y-2,str);
if(t->lchild!=NULL)
/*左子樹*/
{
line(t->x-5,t->y+12,t->lchild->x+5,t->lchild->y-12);
DrawTree(t->lchild);
}
if(t->rchild!=NULL)
/*右子樹*/
{
line(t->x+5,t->y+12,t->rchild->x-5,t->rchild->y-12);
DrawTree(t->rchild);
}
}
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
}
/*遍歷時(shí)顯示每個(gè)結(jié)點(diǎn)的過程*/ void DrawNode(Tree *t,int color){
setcolor(RED);
setfillstyle(SOLID_FILL,RED);
fillellipse(t->x,t->y,10,10);
setcolor(YELLOW);
sprintf(str,“%c”,t->data);/*將內(nèi)容轉(zhuǎn)換成字符串輸出*/
outtextxy(t->x-3,t->y-2,str);
setcolor(color);
outtextxy(s.x,s.y,str);
setcolor(YELLOW);
sprintf(str,“%d”,s.num);
/*將遍歷次序用數(shù)字顯示在樹的結(jié)點(diǎn)上*/
outtextxy(t->x-3,t->y-20,str);
s.num++;
sleep(1);}
/*前序遍歷*/ void Preorder(Tree *t){
if(t!=NULL)
{
s.x+=15;
DrawNode(t,YELLOW);
Preorder(t->lchild);
Preorder(t->rchild);
} }
/*中序遍歷*/ void Midorder(Tree *t){
if(t!=NULL)
{
Midorder(t->lchild);
s.x+=15;
DrawNode(t,WHITE);
Midorder(t->rchild);
} }
北京工業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)項(xiàng)目書
/*后序遍歷*/ void Posorder(Tree *t){
if(t!=NULL)
{
Posorder(t->lchild);
Posorder(t->rchild);
s.x+=15;
DrawNode(t,GREEN);
} }
/*圖形初始化*/ void Init(){
int gd=DETECT,gm;
initgraph(&gd,&gm,“c: c”);
cleardevice();/*清除圖形屏幕*/
setcolor(YELLOW);
outtextxy(225,10,“Press anykey to continue”);
setcolor(RED);
outtextxy(20,300,“preorder”);
outtextxy(20,350,“midorder”);
outtextxy(20,400,“posorder”);
getch();}
/*關(guān)閉圖形*/ void Close(){
getch();
closegraph();}
九、參考書目
《數(shù)據(jù)結(jié)構(gòu)(c語(yǔ)言版)》.The Internet.
第二篇:學(xué)籍系統(tǒng)手冊(cè)
學(xué)籍系統(tǒng)升級(jí)結(jié)束。本次系統(tǒng)升級(jí)內(nèi)容: 1 待辦業(yè)務(wù)提示
用戶登錄時(shí),在首頁(yè)彈出窗口,提示本單位各主要業(yè)務(wù)的待辦數(shù)量,用戶可通過鏈接直接訪問對(duì)應(yīng)處理功能。2 問題學(xué)籍處理
2.1 L、G字頭學(xué)籍號(hào)學(xué)生均可進(jìn)行佐證 一組問題學(xué)籍,同時(shí)存在正式學(xué)籍號(hào)和臨時(shí)學(xué)籍號(hào)的學(xué)籍時(shí),臨時(shí)學(xué)籍號(hào)學(xué)籍可以申請(qǐng)佐證。雙G問題學(xué)籍時(shí),兩方G學(xué)籍號(hào)都可以進(jìn)行佐證。2.2 G字頭學(xué)籍號(hào)學(xué)生可刪除
一組問題學(xué)籍中,正式學(xué)籍號(hào)問題學(xué)籍可以發(fā)起刪除處理。2.3 問題學(xué)籍佐證后發(fā)起重新處理
之前通過佐證方式處理結(jié)束的問題學(xué)籍,學(xué)校可以重新發(fā)起問題學(xué)籍處理業(yè)務(wù)。2.4 身份證件號(hào)已發(fā)生變更的處理 新增一類問題學(xué)籍,公安部認(rèn)證不通過的問題學(xué)籍,新增錯(cuò)誤類型“公安部校驗(yàn)不通過:身份證件號(hào)已發(fā)生變更”。處理方式仍為三種:佐證、刪除、變更。2.5 認(rèn)證不通過問題學(xué)籍信息中新增反饋信息項(xiàng) 問題學(xué)籍信息中新增“反饋描述”信息項(xiàng),對(duì)于公安部身份認(rèn)證不通過的問題學(xué)籍,該信息項(xiàng)給出錯(cuò)誤提示信息。2.6 補(bǔ)充了問題學(xué)籍處理流程幫助
系統(tǒng)中提供了《問題學(xué)籍處理流程幫助》文檔,學(xué)校用戶可以在問題學(xué)籍處理功能中下載,教育管理部門用戶可以在問題學(xué)籍審核功能中下載。3 正式學(xué)籍號(hào)下發(fā)的相關(guān)控制
用于新一批正式學(xué)籍號(hào)通過數(shù)據(jù)交換下發(fā)到省級(jí)后,省級(jí)的下發(fā)業(yè)務(wù)邏輯控制。4 無身份證在校學(xué)生列表
學(xué)校學(xué)籍管理員可查詢本學(xué)校沒有身份證號(hào)的在校學(xué)生學(xué)籍,方便聯(lián)系學(xué)生家長(zhǎng)確認(rèn)學(xué)生身份證信息。
各級(jí)教育管理部門可查詢轄區(qū)內(nèi)學(xué)校沒有身份證號(hào)的在校學(xué)生學(xué)籍。5 其他
不允許將正式學(xué)籍號(hào)學(xué)籍的身份證件類型變更為“其他”,包括問題學(xué)籍處理和關(guān)鍵數(shù)據(jù)變更。
不允許將身份證件類型變更為“戶口簿”。
第三篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 飛機(jī)訂票系統(tǒng)
飛機(jī)訂票系統(tǒng)
1.需求分析
描述要求編程解決的問題。以無歧義的陳述說明程序設(shè)計(jì)的任務(wù),強(qiáng)調(diào)的是程序要做什么?明確規(guī)定:
(a)輸入的形式和輸入值的范圍;
(b)輸出的形式;
(c)程序所能達(dá)到的功能;
(d)測(cè)試數(shù)據(jù):包括正確的輸入及其輸出結(jié)果和含有錯(cuò)誤的輸入及其輸出結(jié)果。
2.概要設(shè)計(jì)
給出程序要達(dá)到的具體的要求。描述解決相應(yīng)問題算法的設(shè)計(jì)思想。描述所設(shè)計(jì)程序的各個(gè)模塊(即函數(shù))功能。說明本程序中用到的所有抽象數(shù)據(jù)類型的定義、主程序的流程以及各程序模塊之間的層次(調(diào)用)關(guān)系。
3.詳細(xì)設(shè)計(jì)
實(shí)現(xiàn)概要設(shè)計(jì)中定義的所有數(shù)據(jù)類型,對(duì)每個(gè)操作只需要寫出流程或偽碼算法;對(duì)主程序和其他模塊也都需要寫出流程或偽碼算法(偽碼算法達(dá)到的詳細(xì)程度建議為:按照偽碼算法可以在計(jì)算機(jī)鍵盤直接輸入高級(jí)程序設(shè)計(jì)語(yǔ)言程序);畫出函數(shù)的調(diào)用關(guān)系圖。給出所使用的基本抽象數(shù)據(jù)類型,所定義的具體問題的數(shù)據(jù)類型,以及新定義的抽象數(shù)據(jù)類型。設(shè)計(jì)出良好的輸入輸出界面(清晰易懂)。
4.調(diào)試分析 內(nèi)容包括:
(a)調(diào)試過程中遇到的問題是如何解決的以及對(duì)設(shè)計(jì)與實(shí)現(xiàn)的回顧討論和分析;
(b)算法的時(shí)空分析(包括基本操作和其他算法的時(shí)間復(fù)雜度和空間復(fù)雜度的分析)和改進(jìn)設(shè)想;
(c)經(jīng)驗(yàn)和體會(huì)等。
5.用戶使用說明
說明如何使用你編寫的程序,詳細(xì)列出每一步的操作步驟。
6.測(cè)試結(jié)果
設(shè)計(jì)測(cè)試數(shù)據(jù),或具體給出測(cè)試數(shù)據(jù)。要求測(cè)試數(shù)據(jù)能全面地測(cè)試所設(shè)計(jì)程序的功能。列出你的測(cè)試結(jié)果,包括輸入和輸出。這里的測(cè)試數(shù)據(jù)應(yīng)該完整和嚴(yán)格,最好多于需求分析中所列。
7.測(cè)試情況:給出程序的測(cè)試情況,并分析運(yùn)行結(jié)果
附錄(非必須,按照需要添加)
帶注釋的源程序。可以只列出程序文件名的清單。
需求分析
任務(wù):通過此系統(tǒng)可以實(shí)現(xiàn)如下功能: 錄入:
可以錄入航班情況(數(shù)據(jù)可以存儲(chǔ)在一個(gè)數(shù)據(jù)文件中,數(shù)據(jù)結(jié)構(gòu)、具體數(shù)據(jù)自定)
查詢:
可以查詢某個(gè)航線的情況(如,輸入航班號(hào),查詢起降時(shí)間,起飛抵達(dá)城市,航班票價(jià),票價(jià)折扣,確定航班是否滿倉(cāng)); 可以輸入起飛抵達(dá)城市,查詢飛機(jī)航班情況;
訂票:(訂票情況可以存在一個(gè)數(shù)據(jù)文件中,結(jié)構(gòu)自己設(shè)定)可以訂票,如果該航班已經(jīng)無票,可以提供相關(guān)可選擇航班;
退票: 可退票,退票后修改相關(guān)數(shù)據(jù)文件;
客戶資料有姓名,證件號(hào),訂票數(shù)量及航班情況,訂單要有編號(hào)。
概要設(shè)計(jì)
詳細(xì)設(shè)計(jì)
詳列函數(shù) void list(){
struct airline *info;
int i=0;
info=start;
printf(“起點(diǎn)城市t終點(diǎn)城市t航班號(hào)t起飛時(shí)間t降落時(shí)間t總票數(shù)t余票數(shù)n”);
while(i { display(info); info++; i++; } printf(“nn”);} 查詢函數(shù) void search(){ struct airline *info,*find(); char qiname[10]; char jiangname[10]; int i=0; info=start; printf(“請(qǐng)輸入要起飛城市的名稱:”); scanf(“%s”,qiname); printf(“請(qǐng)輸入要抵達(dá)城市的名稱:”); scanf(“%s”,jiangname); while(i { if(!strcmp(jiangname,info->jiang_name)) { break; } info++; i++; } if(i>=MAXSIZE) { printf(“沒有這條航線!n”); } else { printf(“起飛城市t降落城市t航班號(hào)t起飛時(shí)間t降落時(shí)間t總票數(shù)t余票數(shù)n”); display(info); } } struct airline *find(){ struct airline *info; char number[10]; int i=0; info=start; printf(“請(qǐng)輸入航班號(hào):”); scanf(“%s”,number); while(i { if(!strcmp(number,info->air_num)) { return info; } info++; i++; } printf(“沒有這條航線!n”); return NULL;} 訂票函數(shù) void order(){ struct airline *info; char qiname[10]; char jiangname[10]; int amount; char name[10]; char id[30]; info=start; printf(“請(qǐng)輸入您的起飛城市:”); scanf(“%s”,qiname); printf(“請(qǐng)輸入您的降落城市:”); scanf(“%s”,jiangname); printf(“請(qǐng)輸入您需要的票數(shù):”); scanf(“%d”,&amount); int i=1; while(i<5) { if(!strcmp(info->qi_name,qiname)&&!strcmp(info->jiang_name,jiangname)) { if(amount<=info->ticket_left) { int i; printf(“請(qǐng)輸入您的姓名:”); scanf(“%s”,name); printf(“請(qǐng)輸入您的身份證號(hào):”); scanf(“%s”,id); info->order=insertlink(info->order,amount,name,id); printf(“您的航班信息為:n”); display(info); for(i=0;i { printf(“%s的座位號(hào)是:%dn”,name,info->ticket_all-info->ticket_left+i+1); } info->ticket_left-=amount; printf(“訂票成功!n”); break; } else { info++; i++; } } else { info++; i++; } } } 退票函數(shù) void returnticket(){ struct airline *info; linklist *p1,*p2,*head; char name[10]; if(!(info=find())) { return; } head=info->order; p1=head; printf(“請(qǐng)輸入您的姓名:”); scanf(“%s”,name); while(p1!=NULL) { if(!strcmp(name,p1->name)) { break; } p2=p1; p1=p1->next; } if(p1==NULL) { printf(“您沒有訂過票!n”); return; } else { if(p1==head) { head=p1->next; } else { p2->next=p1->next; } info->ticket_left+=p1->tickets; printf(“%s退票成功!n”,p1->name); free(p1); } info->order=head;} 存儲(chǔ)結(jié)構(gòu) typedef struct passenger { char name[10]; int tickets; char id[30]; struct passenger *next;} linklist;typedef struct airline { char qi_name[10]; char jiang_name[10]; char air_num[10]; char qi_time[10]; char jiang_time[10]; int ticket_all; int ticket_left; linklist *order;} lineinfo;調(diào)試分析 查看航線信息 查詢航線 ① 輸入起飛城市 ② 輸入抵達(dá)城市 ③ 輸出航班信息 辦理訂票業(yè)務(wù) ① 查詢符合的航班 ② 查詢余票量 ③ 輸出航班信息 辦理退票業(yè)務(wù) 源代碼 #include char name[10]; int tickets; char id[30]; struct passenger *next;} linklist; typedef struct airline { char qi_name[10]; char jiang_name[10]; char air_num[10]; char qi_time[10]; char jiang_time[10]; int ticket_all; int ticket_left; linklist *order;} lineinfo; struct airline *start; void display(struct airline *info){ printf(“%st %10st %10st %10st %10st %5dt %5dn”,info->qi_name,info->jiang_name,info->air_num,info->qi_time,info->jiang_time,info->ticket_all,info->ticket_left);} void list(){ struct airline *info; int i=0; info=start; printf(“起點(diǎn)城市t終點(diǎn)城市t航班號(hào)t起飛時(shí)間t降落時(shí)間t總票數(shù)t余票數(shù)n”); while(i { display(info); info++; i++; } printf(“nn”);} void search(){ struct airline *info,*find(); char qiname[10]; char jiangname[10]; int i=0; info=start; printf(“請(qǐng)輸入要起飛城市的名稱:”); scanf(“%s”,qiname); printf(“請(qǐng)輸入要抵達(dá)城市的名稱:”); scanf(“%s”,jiangname); while(i { if(!strcmp(jiangname,info->jiang_name)) { break; } info++; i++; } if(i>=MAXSIZE) { printf(“沒有這條航線!n”); } else { printf(“起飛城市t降落城市t航班號(hào)t起飛時(shí)間t降落時(shí)間t總票數(shù)t余票數(shù)n”); display(info); } } struct airline *find(){ struct airline *info; char number[10]; int i=0; info=start; printf(“請(qǐng)輸入航班號(hào):”); scanf(“%s”,number); while(i { if(!strcmp(number,info->air_num)) { return info; } info++; i++; } printf(“沒有這條航線!n”); return NULL;} linklist *insertlink(linklist *head,int amount,char name[],char id[]){ linklist *p1,*new1; p1=head; new1=(linklist*)malloc(sizeof(linklist)); strcpy(new1->name,name); new1->tickets=amount; new1->next=NULL; strcpy(new1->id,id); if(head==NULL) { head=new1; new1->next=NULL; } else { while(p1->next!=NULL) p1=p1->next; p1->next=new1; } return head;} void order(){ struct airline *info; char qiname[10]; char jiangname[10]; int amount; char name[10]; char id[30]; info=start; printf(“請(qǐng)輸入您的起飛城市:”); scanf(“%s”,qiname); printf(“請(qǐng)輸入您的降落城市:”); scanf(“%s”,jiangname); printf(“請(qǐng)輸入您需要的票數(shù):”); scanf(“%d”,&amount); int i=1; while(i<5) { if(!strcmp(info->qi_name,qiname)&&!strcmp(info->jiang_name,jiangname)) { if(amount<=info->ticket_left) { int i; printf(“請(qǐng)輸入您的姓名:”); scanf(“%s”,name); printf(“請(qǐng)輸入您的身份證號(hào):”); scanf(“%s”,id); info->order=insertlink(info->order,amount,name,id); printf(“您的航班信息為:n”); display(info); for(i=0;i { printf(“%s的座位號(hào)是:%dn”,name,info->ticket_all-info->ticket_left+i+1); } info->ticket_left-=amount; printf(“訂票成功!n”); break; } else { info++; i++; } } else { info++; i++; } } } void returnticket(){ struct airline *info; linklist *p1,*p2,*head; char name[10]; if(!(info=find())) { return; } head=info->order; p1=head; printf(“請(qǐng)輸入您的姓名:”); scanf(“%s”,name); while(p1!=NULL) { if(!strcmp(name,p1->name)) { break; } p2=p1; p1=p1->next; } if(p1==NULL) { printf(“您沒有訂過票!n”); return; } else { if(p1==head) { head=p1->next; } else { p2->next=p1->next; } info->ticket_left+=p1->tickets; printf(“%s退票成功!n”,p1->name); free(p1); } info->order=head;} int menu_select(){ int c; char s[20]; printf(“ 訂票系統(tǒng)n”); printf(“-------------n”); printf(“ 1.查看航線信息 printf(” 2.查詢航線 printf(“ 3.辦理訂票業(yè)務(wù) printf(” 4.辦理退票業(yè)務(wù) printf(“ 5.退出系統(tǒng) printf(”-------------n“); do { printf(”請(qǐng)選擇(1-5):“); scanf(”%s“,s); c=atoi(s); } while(c<1||c>6); return c; n”);n“);n”);n“); n”); } int main(){ struct airline air[MAXSIZE]= { {“harbin”,“beijing”,“1”,“12:00”,“14:00”,30,30},{“harbin”,“shanghai”,“2”,“10:00”,“13:00”,20,20},{“harbin”,“beijing”,“3”,“13:30”,“10:00”,50,50},{“harbin”,“guangzhou”,“4”,“17:00”,“21:00”,50,50},{“harbin”,“dalian”,“5”,“14:00”,“17:00”,40,40} }; start=air; while(1) { system(“cls”); switch(menu_select()) { case 1: list(); break; case 2: search(); break; case 3: order(); break; case 4: returnticket(); break; case 5: exit(0); } getch(); } } 經(jīng)驗(yàn)體會(huì) 1、通過設(shè)計(jì)飛機(jī)訂票系統(tǒng),加深了對(duì)鏈表的運(yùn)用和理解。 2、通過多組測(cè)試數(shù)據(jù),發(fā)現(xiàn)了程序的問題,并做了調(diào)整、3、通過設(shè)計(jì)選擇菜單,對(duì)選擇結(jié)構(gòu)有更深刻的了解。 《數(shù)據(jù)結(jié)構(gòu)》 課程設(shè)計(jì)報(bào)告書 一.課程設(shè)計(jì)題目 圖書借閱管理系統(tǒng) 二.課程設(shè)計(jì)內(nèi)容 實(shí)現(xiàn)圖書管理信息系統(tǒng)的設(shè)計(jì) (一)管理員功能: ①登錄:輸入管理員密碼,若密碼錯(cuò)誤則不得執(zhí)行管理員操作。 ②添加新書:增加新的圖書資料,同時(shí)需檢查新書的圖書編號(hào)是否已存在于原圖書資料中,若已存在則應(yīng)取消添加或提示重新輸入。 ③修改圖書:通過編號(hào)查詢?cè)搱D書資料,若該編號(hào)存在,則顯示已有信息,允許修改,否則提示 無該圖書信息。 ④刪除圖書:通過編號(hào)查詢?cè)搱D書資料,若該編號(hào)存在,則顯示已有信息,允許刪除,否則提示無該圖書信息。刪除對(duì)象包括該圖書資料以及“圖書狀態(tài)”和“借閱人”中與此書相關(guān)的所有記錄。 ⑤查找圖書: A.按書號(hào)查找:通過編號(hào)查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 B.按書名查找:通過書名查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 C.按作者查找:通過作者查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 ⑥查看全部圖書:顯示所有圖書資料,包括書號(hào)、書名、作者、狀態(tài)和借閱人等信息。 ⑦修改讀者:通過姓名查詢?cè)撟x者信息,若該姓名存在,則顯示已有信息,允許修改,否則提示無該讀者信息。 ⑧刪除讀者:通過姓名查詢?cè)撟x者信息,若該姓名存在,則顯示已有信息,允許刪除,否則提示無該讀者信息。刪除對(duì)象包括該讀者姓名、班級(jí)、電話以及“圖書狀態(tài)”和“借閱人”中與此人相關(guān)的所有記錄。 ⑨查看所有讀者:顯示所有讀者資料,包括姓名、班級(jí)、電話等信息。 (二)讀者功能: ①登錄:輸入讀者姓名,若未經(jīng)注冊(cè)則不得進(jìn)入讀者服務(wù)界面。②注冊(cè):新用戶經(jīng)注冊(cè)方可登錄系統(tǒng)并使用讀者服務(wù)功能。③借書: A.輸入所需圖書編號(hào),判斷該編號(hào)是否存在,若不存在則提示重新輸入。 B.若所輸入圖書編號(hào)存在,則判斷該書籍是否已被借出,若已借則不允許執(zhí)行借書操作。 C.若所輸入圖書未借,則提示輸入讀者姓名,判斷所輸入讀者姓名是否存在,若不存在則提示重新輸入。D.若讀者姓名存在,則允許執(zhí)行借書操作。 E.借書處理包括在“圖書狀態(tài)”中加上“已借”標(biāo)記。④還書: A.輸入所借書編號(hào),判斷該編號(hào)是否存在,若不存在則提示重新輸入。B.判斷該書是否已借出,若未借則不允許執(zhí)行還書操作。C.借書處理包括在“圖書狀態(tài)”中加上“未借”標(biāo)記。⑤查詢圖書: A.按書號(hào)查找:通過編號(hào)查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 B.按書名查找:通過書名查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 C.按作者查找:通過作者查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 ⑥查看借閱情況:輸入讀者姓名,若該姓名不存在則提示重新輸入,若該姓名存在則顯示該讀者借閱信息。 三.算法設(shè)計(jì) 1.流程圖(部分示例) ①管理員登錄 ②讀者登錄 ③讀者借閱圖書 ④管理員或讀者按書名查找圖書 2.代碼實(shí)現(xiàn) #include #include //將字符串BookFile替換原文件中的宏名稱book #define ReaderFile “reader.txt” using namespace std;//**********讀者結(jié)構(gòu)體,用于存放讀者基本信息********** class Reader { private: char rname[10]; char rclass[10]; char rtel[10];public: Reader()//構(gòu)造函數(shù),實(shí)現(xiàn)數(shù)據(jù)初始化 {strcpy(rname,“");strcpy(rclass,”“);strcpy(rtel,”“);} //初始化 void set_rname(char *rn)//設(shè)置讀者姓名 {strcpy(rname,rn);} //將rn的字符復(fù)制給rname char * get_rname()//獲得讀者姓名 {return rname;} //返回rname的值 void set_rclass(char *rc)//設(shè)置班級(jí) {strcpy(rclass,rc);} char *get_rclass() //獲得班級(jí) {return rclass;} void set_rtel(char *rt) //設(shè)置電話 {strcpy(rtel,rt);} char *get_rtel() //獲得電話 {return rtel;} void copy(Reader m)//讀者Reader結(jié)構(gòu)體copy函數(shù) {strcpy(rname,m.get_rname());strcpy(rclass,m.get_rclass());strcpy(rtel,m.get_rtel());} };//*********讀者管理結(jié)構(gòu)體,實(shí)現(xiàn)對(duì)讀者用戶的管理********* class ReaderManage { Reader readers[50];//定義讀者結(jié)構(gòu)體數(shù)組對(duì)象,最多50位 int length; void readFile() //讀取讀者文件函數(shù) { ifstream fread;//定義輸入文件流對(duì)象fread length=0; //計(jì)數(shù) if(!fread) {cout<<”讀取磁盤文件失敗!“< fread.open(ReaderFile,ios::binary);//使文件流與文件關(guān)聯(lián),以二進(jìn)制方式打開 int i=0; while((fread.read((char *)&readers[i],sizeof(Reader))))//計(jì)算并返回所占字節(jié)數(shù) i++; length=i; fread.close();//關(guān)閉磁盤文件 } void saveFile()//保存讀者文件 { ofstream fwrite; //定義輸出文件流對(duì)象fwrite if(!fwrite) {cout<<”文件保存失敗!n“;exit(1);} fwrite.open(ReaderFile,ios::binary);//使文件流與文件關(guān)聯(lián),以二進(jìn)制方式打開 fwrite.write((char *)readers,length*sizeof(Reader));//計(jì)算并返回所占字節(jié)數(shù) fwrite.close();//關(guān)閉磁盤文件 } public: ReaderManage()//構(gòu)造函數(shù),讀取讀者文件 {readFile();} ~ReaderManage()//析構(gòu)函數(shù),保存讀者文件 {saveFile();} void add_reader(Reader r)//添加讀者用戶函數(shù) { if(length>=50) {cout<<”對(duì)不起,注冊(cè)人數(shù)已滿!n“;return;} readers[length].copy(r);//調(diào)用讀者結(jié)構(gòu)體copy函數(shù) length++;} int search(char *rn)//按姓名查找讀者函數(shù) { for(int i=0;i if(strcmp(readers[i].get_rname(),rn)==0)//判斷是否相等 return i; return-1; } bool revise(Reader reader,int i)//修改讀者資料函數(shù) { readers[i].copy(reader);//調(diào)用讀者結(jié)構(gòu)體cpoy函數(shù) return true;} void delete_reader(int index)//刪除讀者函數(shù) { for(int i=index;i readers[i].copy(readers[i+1]);//用后面的地址覆蓋前面的地址 length--;} bool log_reader(Reader r)//登錄時(shí)判斷讀者用戶是否存在函數(shù),相當(dāng)于遍歷 { for(int i=0;i if(strcmp(readers[i].get_rname(),r.get_rname())==0) return true; return false; } void reg_reader()//注冊(cè)用戶函數(shù) { char n[10]; //姓名name char c[10]; //班級(jí)class char t[10]; //電話tel Reader reader; cout<<”nt請(qǐng)輸入您的姓名:“; cin>>n; cout<<”nt請(qǐng)輸入您的所在班級(jí):“; cin>>c; cout<<”nt請(qǐng)輸入您的聯(lián)系電話:“; cin>>t; reader.set_rname(n);//調(diào)用讀者結(jié)構(gòu)體設(shè)置讀者姓名函數(shù) reader.set_rclass(c);//調(diào)用讀者結(jié)構(gòu)體設(shè)置讀者班級(jí)函數(shù) reader.set_rtel(t);//調(diào)用讀者結(jié)構(gòu)體設(shè)置聯(lián)系電話函數(shù) add_reader(reader);//調(diào)用讀者結(jié)構(gòu)體添加讀者函數(shù) cout<<”nt注冊(cè)成功!“;} void show_reader()//不帶參的顯示讀者信息函數(shù) { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆讀★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班級(jí)ttt電話n“; for(int i=0;i { cout< cout<<”ttt“< cout<<”ttt“< } } void show_reader(int i)//帶參的顯示讀者信息函數(shù) { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆讀★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班級(jí)ttt電話n“; cout< cout<<”ttt“< cout<<”ttt“< } }; //********書籍結(jié)構(gòu)體,用于存放書籍基本信息******** class Book { private: char bnum[10]; //書號(hào) char bname[20]; //書名 char bauthor[10]; //作者 char rname[10]; //借閱人 public: int tag; //狀態(tài)標(biāo)記判斷指標(biāo)(已借/在架)Book() //構(gòu)造函數(shù)初始化信息 {strcpy(bnum,”“);strcpy(bname,”“);strcpy(bauthor,”“);strcpy(rname,”“);tag=0;} void set_bnum(char *no) //設(shè)置書號(hào) {strcpy(bnum,no);} //把字符串no中的字符復(fù)制到字符串bnum中 char *get_bnum() //獲得書號(hào) { return bnum;} //返回值為bnum void set_bname(char *n) //設(shè)置書名 {strcpy(bname,n);} char *get_bname() //獲得書名 {return bname;} void set_bauthor(char *a) //設(shè)置作者 {strcpy(bauthor,a);} char * get_bauthor() //獲得作者姓名 {return bauthor;} void set_tag(int t) //狀態(tài)設(shè)置 {tag=t;} void set_rname(char *rn) //設(shè)置借閱人 {strcpy(rname,rn);} char *get_rname() //獲得借閱人姓名 {return rname;} void show_tag() //顯示圖書狀態(tài) { if(tag==1) {cout<<”已借“;} else {cout<<”在架“;} } void copy(Book m) //Book結(jié)構(gòu)體copy函數(shù) { strcpy(bnum,m.get_bnum()); //將獲得書號(hào)函數(shù)里的返回值里的字符復(fù)制到bnum strcpy(bname,m.get_bname()); strcpy(bauthor,m.get_bauthor()); tag=0; } };//**********書籍管理結(jié)構(gòu)體,實(shí)現(xiàn)管理書籍功能********** class BookManage { private: Book books[100]; //定義Book書籍結(jié)構(gòu)體數(shù)組對(duì)象,最大容量100本 int length; void saveFile() //保存書籍文件 { ofstream fwrite;//定義輸出文件流ofstream結(jié)構(gòu)體對(duì)象fwrite if(!fwrite) {cout<<”文件保存失敗!n“;exit(1); } fwrite.open(BookFile,ios::binary);//使文件流與文件建立關(guān)聯(lián),以二進(jìn)制方式打開 fwrite.write((char *)books,length*sizeof(Book));//計(jì)算并返回所占字節(jié)數(shù) fwrite.close(); //關(guān)閉磁盤文件 } void readFile() //讀取書籍文件 { ifstream fread;//定義輸入文件流對(duì)象fread length=0; if(!fread) {cout<<”文件讀取失敗!“< Book temp; //定義書籍結(jié)構(gòu)體臨時(shí)對(duì)象temp int i=0; fread.open(BookFile ,ios::binary);//使文件流與文件建立關(guān)聯(lián),以二進(jìn)制方式打開 while((fread.read((char *)&books[i],sizeof(Book)))) i++; //每讀完一次,指針后移一位,直到不能讀出正確結(jié)果為止 length=i; fread.close();} public: BookManage() //構(gòu)造函數(shù),讀取磁盤文件 { length=0; //從頭讀起,計(jì)數(shù),最大100 readFile(); //調(diào)用讀取文件函數(shù) } ~BookManage() //析構(gòu)函數(shù),保存磁盤文件 { saveFile(); //調(diào)用保存文件函數(shù) } bool add(Book book) //添加圖書資料 { if(length>=100) { cout<<”對(duì)不起,儲(chǔ)存已滿,您無法繼續(xù)添加!n“; return-1; } else { books[length].copy(book);//調(diào)用書籍結(jié)構(gòu)體copy函數(shù) length++; return(length-1); } } int bnu_search(char *bnu) //按書號(hào)查找書籍 { for(int i=0;i if(strcmp(books[i].get_bnum(),bnu)==0)//字符串比較,判斷是否相等 return i; return-1; } int bna_search(char *bna) //按書名查找書籍 { for(int i=0;i if(strcmp(books[i].get_bname(),bna)==0)//判斷 return i; return-1; } int bau_search(char *bau)//按作者查找書籍 { for(int i=0;i if(strcmp(books[i].get_bauthor(),bau)==0)//判斷 return i; return-1; } int rn_search(char *rn)//按借閱人查找書籍 { for(int i=0;i if(strcmp(books[i].get_rname(),rn)==0)//判斷 return i; return-1; } void revise(Book book,int i)//帶參的修改書籍函數(shù) {books[i].copy(book);} //調(diào)用Book結(jié)構(gòu)體copy函數(shù) void deleteBook(int index)//帶參的刪除書籍資料函數(shù) { for(int i=index;i books[i].copy(books[i+1]);//用后面的地址將當(dāng)前的地址覆蓋 length--; } void show_book()//不帶參的顯示書籍函數(shù) { cout<<” ☆☆☆☆☆☆☆☆☆☆☆書★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”書號(hào)“; cout.width(10); cout<<”書名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”狀態(tài)“; cout.width(25); cout<<”借閱人n“; for(int i=0;i { cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } } void show_book(int i)//帶參的顯示書籍函數(shù) { cout<<” ☆☆☆☆☆☆☆☆☆☆☆書★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”書號(hào)“; cout.width(10); cout<<”書名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”狀態(tài)“; cout.width(25); cout<<”借閱人n“; cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } void br_book()//讀者借、還書功能函數(shù) { ReaderManage reader; int choi;//選擇 int a; //圖書狀態(tài)指標(biāo)(1已借2在架) char sh[10];//需要還書的書號(hào) char dz[10];//讀者姓名 cin>>sh; int index=bnu_search(sh);//定義一個(gè)變量等于查找到的書號(hào) if(index>=0) { if(books[index].tag==1)//已借 a=1; if(books[index].tag==0)//在架 a=2; switch(a) { case 1: cout<<”nt該書目前狀態(tài)為<已借出>n“; cout<<”nt請(qǐng)選擇您需要的服務(wù):1:還書 0:返回n“; cin>>choi; cin.ignore();//清除以回車結(jié)束的輸入緩沖區(qū)的內(nèi)容,消除上一次輸入對(duì)下一次輸入的影響 if(choi!=1&&choi!=0) { cout<<”nt操作有誤,請(qǐng)重新選擇(0/1)!n“; return; } else if(choi==1) { cout<<”nt請(qǐng)輸入您的姓名:“; cin>>dz; cin.ignore(); int index1=reader.search(dz); if(index1==-1) { cout<<”nt對(duì)不起,系統(tǒng)無該讀者記錄,新用戶請(qǐng)先注冊(cè)!“; return; } else { strcpy(dz,”“);//將讀者姓名已空白代替 books[index].set_rname(dz);//借閱人一項(xiàng)變?yōu)榭瞻?/p> books[index].set_tag(0);//圖書狀態(tài)變?yōu)樵诩?/p> cout<<”nt還書成功!“< } }break; case 2: cout<<”nt該書目前狀態(tài)為<在館>n“; cout<<”nt請(qǐng)您需要的服務(wù):1:借書 0:返回n“; cin>>choi; cin.ignore(); if(choi!=1&&choi!=0) { cout<<”nt操作有誤,請(qǐng)重新選擇(0/1)!n“; return; } else if(choi==1) { cout<<”nt請(qǐng)輸入您的姓名:“; cin>>dz; int index1=reader.search(dz); if(index1==-1) { cout<<”nt對(duì)不起,系統(tǒng)無改讀者記錄,新用戶請(qǐng)先注冊(cè)!“; return; } else { books[index].set_rname(dz); books[index].set_tag(1); cout<<”nt借書成功!“< } }break; } } else { cout<<”nt對(duì)不起,系統(tǒng)無該書記錄!“;} } bool in(int i)//判斷圖書是否在架函數(shù) { if(books[i].tag==1) return false; return true; } };//**********菜單結(jié)構(gòu)體,實(shí)現(xiàn)界面引導(dǎo)********** class Menu { BookManage bm; //定義書籍管理結(jié)構(gòu)體對(duì)象bm ReaderManage rm; //定義讀者管理結(jié)構(gòu)體對(duì)象rm Reader r; //定義讀者結(jié)構(gòu)體對(duì)象r private: int choice; //菜單序號(hào)選擇 int key; //管理員密碼 public: void header() //頁(yè)眉 { system(”color fd“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 圖 書 借 閱 管 理 系 統(tǒng) ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“;} void log_menu() //主界面登錄菜單 { system(”color fd“); header(); cout<<”nttt< 請(qǐng) 選 擇 登 錄 身 份 >n“; cout<<”ntttt1: 管理員nntttt2: 讀 者nntttt0: 退 出nt您的選擇是: “;choice: cin>>choice; cin.ignore(); //清除以回車結(jié)束的輸入緩沖區(qū)的內(nèi)容,消除上一次輸入對(duì)下一次輸入的影響 switch(choice) { case 1: log_admin(); //管理員登錄,需密碼驗(yàn)證 break; case 2: reader_lr(); //讀者登錄或注冊(cè) break; case 0: exit(1); //退出系統(tǒng) break; default: cout<<”nt您的操作有誤,請(qǐng)重新選擇(0→2): “; goto choice; } } void admin_menu() //管理員管理菜單 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 系★統(tǒng)★管★理★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 添加新的圖書資料 2: 修改已有圖書資料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 刪除已有圖書資料 4: 查找已有圖書資料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 查看所有圖書資料 6: 修改讀者用戶信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 7: 刪除讀者用戶信息 8: 查看所有讀者信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 9: 返回系統(tǒng)登錄界面 0: 退出圖書管理系統(tǒng) ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt請(qǐng)選擇您需要的服務(wù)序號(hào): “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: //添加圖書 addBook(); bm.~BookManage(); break; case 2: //修改圖書 reviseBook(); bm.~BookManage(); break; case 3: //刪除圖書 delBook(); bm.~BookManage(); break; case 4: //查找圖書 absearch_menu(); break; case 5: //查看全部圖書 bm.show_book(); cout<<”nt顯示完畢!“; system(”pause“); admin_menu(); break; case 6: //修改讀者 reviseReader(); rm.~ReaderManage(); break; case 7: //刪除讀者 delReader(); rm.~ReaderManage(); break; case 8: //查看所有讀者 rm.show_reader(); cout<<”nt顯示完畢!“; system(”pause“); admin_menu(); break; case 9: //返回系統(tǒng)登錄界面 system(”cls“); log_menu(); case 0: //退出系統(tǒng) exit(1); break; default: cout<<”nt您的操作有誤,請(qǐng)重新選擇(0→7): “; goto choice; } } void reader_menu() //讀者服務(wù)菜單 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 讀★者★服★務(wù)★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 借 閱 圖 書 2: 歸 還 圖 書 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 查 找 圖 書 4: 借 閱 情 況 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 返 上 一 級(jí) 0: 退 出 系 統(tǒng) ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt請(qǐng)選擇您需要的服務(wù)序號(hào): “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: cout<<”nt請(qǐng)輸入您欲借閱的圖書書號(hào): “; bm.br_book(); bm.~BookManage(); break; case 2: cout<<”nt請(qǐng)輸入您欲歸還的圖書書號(hào): “; bm.br_book(); bm.~BookManage(); break; case 3: bsearch_menu(); break; case 4: rn_search(); break; case 5: system(”cls“); reader_lr(); break; case 0: exit(1); break; default: cout<<”nt您的操作有誤,請(qǐng)重新選擇(0→5): goto choice; } } void bsearch_menu() //讀者查找書籍菜單 { system(“color f2”); cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆ 書★籍★查★找★界★面 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 1: 按 書號(hào)查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 2: 按 書名查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 3: 按 作者查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 4: 返 回 上 級(jí) ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 0: 退 出 系 統(tǒng) ☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”; int bsc;//book search choice cout<<“nt請(qǐng)輸入您需要的服務(wù)序號(hào): ”; cin>>bsc; cin.ignore(); switch(bsc){ case 1: bnu_search(); break; case 2: bna_search(); “; break; case 3: bau_search(); break; case 4: reader_menu(); break; case 5: exit(1); default: cout<<”nt操作有誤,請(qǐng)重新選擇<0→4>“; break; } } void absearch_menu() //管理員查找書籍菜單 { system(”color f2“); cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 書★籍★查★找★界★面 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 1: 按 書號(hào)查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 2: 按 書名查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 3: 按 作者查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 4: 返 回 上 級(jí) ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 0: 退 出 系 統(tǒng) ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; int bsc;//book search choice cout<<”nt請(qǐng)輸入您需要的服務(wù)序號(hào): “; cin>>bsc; cin.ignore(); switch(bsc) { case 1: bnu_search(); break; case 2: bna_search(); break; case 3: bau_search(); break; case 4: admin_menu(); break; case 5: exit(1); default: cout<<”nt操作有誤,請(qǐng)重新選擇<0→4>“; break; } } void reader_lr()//讀者登錄或注冊(cè)菜單 { system(”cls“); header(); system(”color f1“); cout<<”nttt< 讀 者 登 錄 界 面 >n“; cout<<”nttt 1: 登 錄t2: 注 冊(cè)nnttt 3: 返 回t0: 退 出nt您的選擇是: “; int rlc;//reader login choice choice: cin>>rlc; cin.ignore(); switch(rlc) { case 1: //已注冊(cè)讀者登錄 cout<<”nt請(qǐng)輸入您的姓名: “; char rn[10];//reader name cin>>rn; r.set_rname(rn); if(rm.log_reader(r)) { cout<<”nt登錄成功!“; system(”pause“); reader_menu(); } else cout<<”nt登錄失敗!新用戶請(qǐng)先注冊(cè)!“; system(”pause“); reader_lr(); break; case 2: //新用戶注冊(cè) rm.reg_reader(); rm.~ReaderManage(); system(”pause“); reader_lr(); break; case 3: system(”cls“); log_menu(); case 0: exit(1); break; default: cout<<”nt您的操作有誤,請(qǐng)重新選擇(0→2): goto choice; } } void log_admin() //管理員登錄 { cout<<“nt請(qǐng)輸入管理員密碼:”; int key; cin>>key; if(key==14125) { cout<<“nt登錄成功!nnt”; system(“pause”); admin_menu(); //管理員操作菜單 } else {cout<<“nt登錄失敗!原因是密碼錯(cuò)誤!n”; cout<<“nt請(qǐng)選擇 <1:返回上一級(jí)菜單 0:退出系統(tǒng)> cin>>choice; cin.ignore(); switch(choice) ”;“; { case 1: system(”cls“); log_menu(); break; case 0: exit(1); break; default: cout<<”nt操作有誤,請(qǐng)重新選擇(0/1)“; } } } void rn_search() //按書號(hào)查找函數(shù) { char rn[10];//reader name cout<<”nt請(qǐng)輸入您的姓名:“; cin>>rn; int index=bm.rn_search(rn); if(index>=0) bm.show_book(index); else cout<<”nt對(duì)不起,系統(tǒng)無您的借閱記錄!“; cout<<”nt“; system(”pause“); reader_menu(); } void bnu_search() //按書號(hào)查找函數(shù) { char bnu[10]; cout<<”nt請(qǐng)輸入您要查找的書號(hào):“; cin>>bnu; int index=bm.bnu_search(bnu); if(index>=0) bm.show_book(index); else cout<<”nt對(duì)不起,系統(tǒng)無該書籍記錄!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bna_search() //按書名查找函數(shù) { cout<<”nt請(qǐng)輸入您要查找的書名:“< char bna[20]; cin>>bna; int index=bm.bna_search(bna); if(index>=0) bm.show_book(index); else cout<<”nt對(duì)不起,系統(tǒng)無該書籍記錄!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bau_search() //按作者查找函數(shù) { cout<<”nt請(qǐng)輸入您要查找的作者:“< char bau[10]; cin>>bau; int index=bm.bau_search(bau); if(index>=0) bm.show_book(index); else cout<<”nt對(duì)不起,系統(tǒng)無該書籍記錄!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void addBook() //新增書籍函數(shù) { char numb[10]; //書號(hào) char nameb[20]; //書名 char authorb[10];//作者 Book book; //書籍結(jié)構(gòu)體對(duì)象book int tag1;input1:cout<<”nt請(qǐng)輸入新書書號(hào):“; cin>>numb; int index=bm.bnu_search(numb); if(index==-1) { cout<<”nt系統(tǒng)目前尚無該書記錄,您可以繼續(xù)操作!n“; cout<<”nt請(qǐng)輸入新書書名:“; cin>>nameb; cout<<”nt請(qǐng)輸入新書作者:“; cin>>authorb; tag1=0; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); book.set_tag(tag1); bm.add(book); cout<<”nt恭喜您!新書資料錄入成功!“; } else { cout<<”nt對(duì)不起,該書號(hào)紀(jì)錄已存在!請(qǐng)重新輸入!“; goto input1; } system(”pause“); admin_menu();} void reviseBook() //修改書籍函數(shù) { char numb[10]; char nameb[20]; char authorb[10]; Book book; int index=-1;input2: cout<<”nt請(qǐng)輸入您要修改書籍的書號(hào):“; cin>>numb; index=bm.bnu_search(numb); if(index==-1) { cout<<”nt對(duì)不起,您輸入的書號(hào)不存在,請(qǐng)重新輸入!“< goto input2; return; } bool sta=bm.in(index);//判斷是否在館 if(sta) { cout<<”nt該書目前處于<在架>狀態(tài),您可以繼續(xù)操作!“; cout<<”nt請(qǐng)輸入更改后的書名:“; cin>>nameb; cout<<”nt請(qǐng)輸入更改后的作者:“; cin>>authorb; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); bm.revise(book,index); cout<<”nt恭喜您!書籍資料修改成功!“;} else cout<<”nt該書已被借出,請(qǐng)于讀者歸還后再進(jìn)行相關(guān)操作!“< system(”pause“); admin_menu(); } void delBook() //刪除書籍函數(shù) { char numb[10]; cout<<”nt請(qǐng)輸入您要?jiǎng)h除書籍的書號(hào):“; cin>>numb; int index=bm.bnu_search(numb); if(index>=0) { cout<<”nt您確定要?jiǎng)h除該書記錄嗎(y/n) “; char y; cin>>y; if(y=='y'||y=='Y') { bm.deleteBook(index); cout<<”nt刪除成功!“; } else cout<<”nt刪除取消!“; } else cout<<”nt對(duì)不起,系統(tǒng)沒有該圖書記錄!“; system(”pause“); admin_menu(); } void reviseReader()//修改讀者用戶函數(shù) { char namer[10]; Reader reader;get1: cout<<”nt請(qǐng)輸入你要修改讀者用戶的姓名: “; cin>>namer; int index=rm.search(namer); if(index==-1) { cout<<”nt對(duì)不起,系統(tǒng)無改讀者記錄,重新輸入請(qǐng)按1,返回請(qǐng)按0: int a; cin>>a;get2: cin.ignore(); switch(a) { case 1: goto get1; break; case 0: system(“pause”); admin_menu(); break; default: cout<<“nt您的操作有誤,請(qǐng)重新選擇(0/1): ”; goto get2; } return; } “; else { char namer[10]; char classr[10]; char telr[10]; Reader reader; cout<<”nt請(qǐng)輸入更改后的讀者姓名:“; cin>>namer; cout<<”nt請(qǐng)輸入更改后的班級(jí)名稱:“; cin>>classr; cout<<”nt請(qǐng)輸入更改后的聯(lián)系電話:“; cin>>telr; reader.set_rname(namer); reader.set_rclass(classr); reader.set_rtel(telr); cout<<”nt是否真的修改該記錄(y/n?):“; char y; cin>>y; if(y=='y'||y=='Y') { rm.revise(reader,index); cout<<”nt修改成功!n“; } else cout<<”nt操作取消!n“; } system(”pause“); admin_menu(); } void delReader() //刪除讀者用戶函數(shù) { cout<<”nt請(qǐng)輸入您要?jiǎng)h除的讀者用戶的姓名:“< char namer[10]; cin>>namer; int index=rm.search(namer); if(index>=0) { cout<<”nt是否真的刪除該記錄(y/n?): “; char y; cin>>y; if(y=='y'||y=='Y') { rm.delete_reader(index); cout<<”nt刪除成功!n“; } else cout<<”nt操作取消!n“; } else cout<<”nt對(duì)不起,系統(tǒng)尚無該讀者記錄!“; system(”pause“); admin_menu(); } };//********主函數(shù)******** int main(){ system(”color fd“);Menu menu;//定義菜單結(jié)構(gòu)體對(duì)象menu cout<<”ttt 文計(jì)091-1 龐麗萍 200990514125 “;cout<<”ttt 當(dāng)前日期:2011-6-22 星期三“;cout<<”ttt 當(dāng)前時(shí)間:08:00 “;cout<<”nttt ★ 歡 “;cout<<”★ 迎 “; } cout<<”★ 進(jìn) “;cout<<”★ 入 ★nn";menu.log_menu();return 0;四.程序正確性驗(yàn)證 1主頁(yè)面 2.管理員登陸頁(yè)面 3.圖書添加 五.課程設(shè)計(jì)過程中出現(xiàn)的問題、原因及解決方法 1.用戶登錄密碼時(shí),不能使用暗碼來保護(hù)密碼。(未解決成功)2.每個(gè)界面都能退出到主頁(yè)面,而不是直接跳出系統(tǒng)。(以解決)3.書名字長(zhǎng)太多影響書籍、作者、數(shù)量等之間的一一對(duì)應(yīng)關(guān)系。(為解決成功) 六.課程設(shè)計(jì)的主要收獲 通過這幾天學(xué)習(xí)設(shè)計(jì)圖書信息管理系統(tǒng),認(rèn)識(shí)到一切看似簡(jiǎn)單的事情只有自己動(dòng)手做,明白了其中的原理才會(huì)更好的把它變成自己的東西。圖書管理系統(tǒng)主要用到了文件的輸入輸出,以及利用簡(jiǎn)單的順序查找知識(shí),加深了對(duì)數(shù)據(jù)結(jié)構(gòu)的理解與應(yīng)用。對(duì)于這次的課程設(shè)計(jì),首先,許多知識(shí)不僅僅只是課本上的,需要我們自己去圖書館或網(wǎng)上收集資料。其次,編程過程終遇到各種錯(cuò)誤,需要我們耐心分析,討論,最后得出正確結(jié)果。第三,程序無錯(cuò),進(jìn)行調(diào)試,然后進(jìn)行加工修改優(yōu)化。 七.對(duì)今后課程設(shè)計(jì)的建議 希望老師可以分小組做課程設(shè)計(jì),題目可以相應(yīng)的增大難度。分組可以鍛煉團(tuán)對(duì)合作能力,隊(duì)員可以相互討論解決問題,彼此能夠激發(fā)更多的思想,做出更完善的作品,同時(shí)也防止了互相拷貝的情況,讓每個(gè)同學(xué)都積極的參與到設(shè)計(jì)中,而不是坐享其成。 《財(cái)務(wù)管理CAI項(xiàng)目》修改意見 中山大學(xué)新華學(xué)院管理學(xué)系李安蘭 針對(duì)該項(xiàng)目立項(xiàng)評(píng)審時(shí)專家提出,財(cái)務(wù)管理課程的內(nèi)容涉及大量的數(shù)學(xué)運(yùn)算,如何利用PPT課件解決的意見,現(xiàn)提出如下解決辦法: 一、從教學(xué)經(jīng)驗(yàn)來看,利用公式編輯程序“Microsoft公式3.0”能解決目前財(cái)務(wù)管理教學(xué)中的所有數(shù)學(xué)公式的輸入問題。 二、學(xué)生在學(xué)習(xí)財(cái)務(wù)管理時(shí),已經(jīng)學(xué)習(xí)了《高等數(shù)學(xué)》等相關(guān)數(shù)學(xué)知識(shí),財(cái)務(wù)管理學(xué)習(xí)中主要是一些基本的數(shù)學(xué)方法的運(yùn)用,很少數(shù)學(xué)推導(dǎo)。目前碰到的最復(fù)雜的也就是等比數(shù)列的求和以及一元回歸方程的運(yùn)用,這些都已經(jīng)在前面的教學(xué)中輸入了ppt課件。 三、財(cái)務(wù)管理是一門理論和實(shí)踐都比較成熟的專業(yè)課,一方面,很多復(fù)雜的數(shù)學(xué)計(jì)算在實(shí)踐中已經(jīng)通過列表等形式簡(jiǎn)化了,比如資金的時(shí)間價(jià)值計(jì)算中涉及的指數(shù)運(yùn)算,財(cái)務(wù)管理就有復(fù)利終值系數(shù)表、復(fù)利現(xiàn)值系數(shù)表、年金終值系數(shù)表、年金現(xiàn)值系數(shù)表等附表,計(jì)算時(shí)比較簡(jiǎn)單;另一方面,教學(xué)中會(huì)運(yùn)用大量的案例教學(xué),利用PPT既節(jié)省板書時(shí)間,又有利于學(xué)生理解案例意思。總之,從08財(cái)務(wù)管理、08市場(chǎng)營(yíng)銷、08電子商務(wù)和08工商管理的教學(xué)實(shí)踐來看,利用公式編輯程序Microsoft公式3.0,PPT課件的制作已經(jīng)得以解決。另外,在教學(xué)過程中,為了強(qiáng)化某個(gè)知識(shí)點(diǎn),會(huì)輔以必要的粉筆板書。從教學(xué)實(shí)踐來看,利用PPT課件教學(xué),不僅增加了數(shù)學(xué)方法的直觀性,更節(jié)省了板書時(shí)間,提高了案例教學(xué)的效果。所以,筆者認(rèn)為財(cái)務(wù)管理CAI課件項(xiàng)目是可行的。第四篇:圖書管理系統(tǒng) 數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì)
第五篇:財(cái)務(wù)管理CAI項(xiàng)目修改意見