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