
課程設計
編號:
學號:2
教學院計算機學院
課程名稱數據結構課程設計
題目簡易家譜系統
專業計算機科學與技術
班級(1)班
姓名陳建輝
同組人員周海濤,石義灃,明廷柱
指導教師程細才
2013年1月8日
課程設計(論文)
1
目錄
一概述..................................................2
1.課程設計的目的......................................2
2.課程設計的要求......................................2
二總體方案設計..........................................3
1.簡單家譜系統整體設計思路............................3
2.簡單家譜系統的主要特點及功能.......................5
三詳細設計..............................................7
1.查詢全部的家譜成員信息.............................7
2.確定指定成員在家族中的輩份..........................7
3.在家譜中添加新成員,并追加到文件中..................9
四程序的調試與運行結果說明.............................12
1.實驗結果截圖:......................................12
2.調試時遇到的問題..................................12
五課程設計總結.........................................13
附錄一:程序源代碼.......................................16
附錄二:參考文獻.........................................25
課程設計(論文)
2
一概述
1.課程設計的目的
1.理解和掌握該課程中的有關基本概念,程序設計思想和方法。
2.培養綜合運用所學知識獨立完成課題的能力。
3.培養勇于探索、嚴謹推理、實事求是、有錯必改,用實踐來檢驗理論,
全方位考慮問題等科學技術人員應具有的素質。
4.掌握從資料文獻、科學實驗中獲得知識的能力,提高學生從別人經驗中
找到解決問題的新途徑的悟性,初步培養工程意識和創新能力。
2.課程設計的要求
設計要求:輸入家族成員情況,建立樹結構,統計家族成員人數,能查詢
家族成員輩份情況。
系統功能:
1.輸入、修改與刪除家譜信息功能
2.查詢功能:
1)某家譜成員的所有子孫的集合
2)某家譜成員的所有祖先的集合
3)某家譜成員的所有同輩成員的集合
4)求某家譜成員的所有上一輩成員的集合
5)給出兩個家譜成員,確定他們的關系
課程設計(論文)
3
二總體方案設計
1.簡單家譜系統整體設計思路
此次課程設計的整體思路是采用遍歷算法,整個樹的定義使用兩個結
構體來表示,一個結構體專門用于存放每一個節點的信息,另一個節點中
定義了三個指針域,分別為父指針域(兄長指針域),兄弟指針域,子指針
域,整個樹的輸入采用文件導入的方式,首先將文件導入到樹中,文件包
含每一個家族成員的信息,以及一個標志位flag,標志位的值為0,1,2,0
表示此節點沒有兄弟節點,1表示此節點至少有一個子節點,2表示此節點
至少有一個兄弟節點,使用的算法是先定義一個鏈式隊列,將文件中第一
個節點的內容讀取放入開辟的樹的節點的空間里,然后將樹節點放入隊列
中,此時隊列不為空,以隊列不為空為判斷條件,進行while循環,判斷
flag的值,循環體中再進行文件讀取,循環中進行判斷,若flag為0,則
繼續判斷隊列是否為空,為空就結束循環,若不為空,則繼續出隊列,取
標志位進行判斷,若標志位為1,則生成新節點,用剛剛出列的節點的子指
針域進行指向新節點,新節點的父指針域指向出列的節點,剩余的域為空,
然后將新生成的節點插入到隊列中,若flag為1,則進行兄弟節點的插入,
繼續循環,若flag不為0,則在進行判斷,若為2,則繼續進行兄弟節點
的插入,以此類推,根據文件的讀取,將樹生成,本程序中所有的算法都
基于以上所介紹的算法。
關于IO的設計:
考慮到題目要求家譜信息以樹形的形式一次讀入內存,而個人的各種資
料現在雖然條目不多,但隨著程序的升級,以后可能變得越來越大。
我把樹形結構和個人信息記錄的文檔分為兩個文件保存在外存中,一個文
件串行化地記錄家譜樹的結構信息,保存少量個人信息作為識別標志;另
一個文件保存完整的個人信息,所有的個人信息以線性記錄的方式記錄在
其中。當程序運行要讀入家譜結構時,只讀入保存少量記錄的文件并建立
起樹形結構。索引時,以樹形中的少量信息為依據在另一個文件中找到全
部的各人信息資料。
這樣的好處主要有兩點:
1.由于樹形結構是串行化記錄于外存,一個節點記錄多次,信息大量冗余,
課程設計(論文)
4
如果樹形節點中保留全部信息,必將造成大量的空間浪費;只保存作為索
引的少量信息在樹形結構中,節約了空間。
2.由于結構的精簡,在家譜初始化時讀入內存需要的時間相應減少,節約
了裝載時間。
這樣做存在的問題:
每次執行修改,添加,刪除,查詢時都要直接訪問外存來取得或寫入數據。
內外存訪問上的巨大時間差的存在,使得進行這些操作相對來說并不顯得
很高效。
關于樹形的結構:
在樹形結構的選擇上,根據實際中多子女的現象選擇一般樹,考慮到家譜中
成員可能存在的不定成員數問題,拋棄了以數組為基礎的一般樹方案,決
定用鏈表來實現。
樹形結構的外存保存。為了提高效率,樹形結構在程序初始化時由外存文
件一次讀入內存,此后不管插入還是修改,刪除都不再對外存的樹結構保
存文件進行操作,只在內存中處理,程序退出時對外存樹結構文件進行一
次更新。也就是說,不管在程序運行中中對家譜結構進行多少種,多少次
的操作,外存的樹結構文件始終只會被程序訪問兩次。
關于功能的設計(以基本要求為準):
1.插入:用戶按提示輸入資料,在樹形中插入節點,在個人完整記錄
文件中添加插入人的所有信息并保存。
2.刪除:用戶輸入被刪除人的識別關鍵字(即名字),在樹形結構中刪
除此人,在個人記錄文件中不處理。
3.修改:用戶輸入被刪除任的識別關鍵字(即名字),從個人完整記錄
文件中讀出該人所有信息供用戶進行修改,然后寫回。
4.查詢:完成了關鍵字查找部分和關系查找部分,讀出個人全部信息
并顯示。
關于個人資料單元:
由于樹形節點要涉及到大量的邏輯操作,要用到一些運算符的重載,個人
資料在樹形單元定義為class類,而寫入文件的單元存萃是數據,定義為簡
單的struct類。
定義為struct和class類,使得不管是樹形結構插入刪除還是IO都是對
整個結構體進行的操作,這樣,如果要往結構體中添加若干個新信息條目
課程設計(論文)
5
或取消一些不必要的信息條目,需要修改的代碼非常之少,方便了以后的
升級。
2.簡單家譜系統的主要特點及功能
本系統的主要特點是算法簡潔,易于閱讀,用戶交互界面良好。
主要實現功能:
1.確定指定成員在家族中的輩份
2.輸出指定輩的所有成員
3.在家譜中添加新成員,并追加到文件中
4.輸出指定家庭的所有成員
5.退出本系統
各功能的算法思想:
1.讀出家譜并顯示
存儲結構用棧,按照先顯示雙親,然后顯示其所有孩子的順序顯示所有家
庭成員。
2.確定指定成員在家族中的輩份
用求成員所在的二叉樹中的層數(按層遍歷二叉樹)來確定,這里采用的是
遞歸算法
3.輸出指定輩的所有成員
此處定義了一個新的結構體類型(增加存儲節點所在的層數),定義如下:
typedefstructcc
{
structcc*child,*next;//next指向同輩份的人物
charName[];
}JPNode;
并用一個隊列來比較顯示同輩分的所有成員。
4.在家譜中添加新成員,并追加到文件中
首先,輸入一個新成員的名字;
然后,輸入其雙親;
之后,再添加到整個存儲二叉鏈表中。
然后,再將新的存儲結構寫回到文件中。
二叉鏈表的結點類型為:typedefstructnode
{
課程設計(論文)
6
ElemTypedata[10];//存放成員的名字
structnode*child;//其孩子指針
structnode*brother;//其兄弟指針
}BTNode;
5.輸出指定家庭的所有成員
首先,設一個棧,并設一個標記位,先置1;
然后,找到輸入的要待顯示的成員,將標記位置0;
再次,顯示其孩子和兄弟,依次下去直到顯示完其所有的親戚。
6.退出本系統。
課程設計(論文)
7
三詳細設計
1.查詢全部的家譜成員信息
該部分程序所完成的具體功能是把賈府中所有的成員信息按照輩份依次顯
示出來,首先從賈無名開始,然后下一輩份的賈演、賈源等……最后是賈蓉的
信息。每個輩份之間都有間隔。
設計思想:利用隊列遍歷所有的結點,在遍歷的同時依次輸出每個結點的
值(即為家庭成員的信息)。
代碼如下:
voidDis_Family(JPNode*p)
{
charname[NAME_length];
JPNode*here=NULL;
printf("請輸入該家庭的首個成員:");scanf("%s",name);
here=Find_Name(p,name);
if(here==NULL){printf("無該家庭!n");return;}
printf("n");
DispJP(here);
}
2.確定指定成員在家族中的輩份
該部分代碼所完成的具體功能是查詢某一個家庭成員的信息。首先手動輸
入你要查詢的那個成員的名字,然后利用隊列依次查找該成員的信息,如果該
家譜中存在這個成員則輸出該成員的有關信息;如果家譜中不存在該成員,則
輸出提示信息:家譜中無此人!
設計思想:有兩個函數,一個函數(queryElemt)利用隊列遍歷所有的節
點,在遍歷的同時即可查找所輸入的成員是否存在該家譜中;另外一個函數
(queryElemtoFamily)用于輸入你要查找的成員的輩分和輸出查找的結果。
代碼如下:
課程設計(論文)
8
intbeifen(JPNode*p,charname[])
{
staticintn=1;
staticintlevel=0;
if(p==NULL)returnlevel;
if(Equal(p->Name,name)==1)return(level=n);
n++;beifen(p->child,name);
n--;beifen(p->next,name);//向右查詢n不必加(先加后減)!
returnlevel;
}
voidBei_Fen(JPNode*p)
{
charname[NAME_length];
intn=0;
printf("請輸入要查明輩分的人的姓名:");scanf("%s",name);
n=beifen(p,name);
if(n==0)printf("該家族中無此人!n");
elprintf("n%s是%s家族中的第%d輩n",name,p->Name,n);
}
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
/*輸出指定輩的所有成員*/
voidchabei(JPNode*p,intbei)
{
staticintn=1;
staticinttag=0;
if(p==NULL)return;
if(bei==n){tag=1;printf("%s",p->Name);}
n++;chabei(p->child,bei);
課程設計(論文)
9
n--;chabei(p->next,bei);//向右查詢n不必加(先加后減)!
if(tag==0)printf("該家族中還沒有這一輩呢....n");
}
voidDisp_Pei(JPNode*p)
{
intbei;
printf("n你想要查看那一輩的成員:");
scanf("%d",&bei);
printf("n....該家族中輩分為%d的成員有....nn",bei);
chabei(p,bei);
printf("n");
}
3.在家譜中添加新成員,并追加到文件中
該部分程序所完成的具體功能是:輸入你要添加人的名字,比如吳長,他
會被添加到文件中。
設計思想:首先確定他的父母,然后把他添加到他的父母的根節點之下。
代碼如下:
intEqual(charconst*p,charconstq[])//判斷兩個字符串是否相等
{
while(*p++==*q++)if(*p=='0'&&*q=='0')return(1);
return(0);
}
JPNode*Find_Name(JPNode*s,char*parent)//定位家譜中的成員。返回其
指針(地址)
{
staticJPNode*here=NULL;
if(s==NULL)returnhere;
if(Equal(s->Name,parent)==1)return(here=s);
課程設計(論文)
10
here=Find_Name(s->child,parent);
here=Find_Name(s->next,parent);
returnhere;
}
voidPrint_FILE(JPNode*p,FILE*fp)
{
staticintlevel=0;
inti;
if(p!=NULL)
{
for(i=0;i
fprintf(fp,"%sn",p->Name);
}
elreturn;
level++;
Print_FILE(p->child,fp);
level--;
Print_FILE(p->next,fp);
}
voidADD_number(JPNode*p)//在家譜中添加新成員,并寫入文件
{
charparent[NAME_length],name[NAME_length];
FILE*fp=NULL;
JPNode*here=NULL;
JPNode*s=(JPNode*)malloc(2*sizeof(void*)+strlen(name)+1);
s->next=s->child=NULL;
printf("請輸入要添加的新成員的雙親姓名:");scanf("%s",parent);
printf("請輸入要添加的新成員的姓名:");scanf("%s",name);
strcpy(s->Name,name);
課程設計(論文)
11
here=Find_Name(p,parent);
if(here->child==NULL)here->child=s;
el
{
here=here->child;
while(here->next!=NULL)here=here->next;
here->next=s;
}
fp=fopen("jiapu_","w");
Print_FILE(p,fp);
fclo(fp);
}
課程設計(論文)
12
四程序的調試與運行結果說明
1.實驗結果截圖:
2.調試時遇到的問題
(1)當選擇功能3(添加新成員),添加完成員后,寫回文件時出現了錯誤,
原本添加的為其中一個結點的孩子,結果寫回文件時卻成了該結點的孫子,也就
是本是要添加為此結點的孩子的兄弟,結果卻成了其孩子的孩子。最后經過單步
跟蹤發現寫入文件的函數編寫錯誤,缺少判斷條件,經過修改后,此問題得到了
課程設計(論文)
13
解決。
(2)當選擇功能0(顯示此家譜),沒有按照事先存儲在txt中的文件顯示,
通過認真檢查程序中顯示成員的函數(按層遍歷)、不斷調試,發現并不是該顯
示函數的錯誤,因為在功能4(輸出指定家庭的所有成員)中,也是通過調用該
函數實現輸出功能,于是,檢查txt文件中事先存儲的家譜成員,發現是由于“(”
與“)”沒有匹配好,導致沒有按照預期想法創建二叉樹造成的錯誤,通過修改
txt文件,使得錯誤得以解決。
五課程設計總結
本組的課程任務為簡易家譜,在組長的帶領下,經過我們共同的努力,本
程序主要任務已基本完成。另外本程序功能完善,具有良好的交互性,可以滿
足用戶多種需求。美中不足的是本系統沒有采用之前我所設想的遞歸,我們這
課程設計(論文)
14
次改用隊列來建樹、查找等,這樣代碼少有一定的冗余,如果時間充分,我們
會更加精進,爭取采用代碼量相對較少的遞歸算法,另外更加完善一些功能,
包括增加日志功能,給不同級別的人員設置管理權限,比如說家譜管理員在獲
得本族長的同意下修改某個成員的信息,而其他成員只具備瀏覽的功能。
在本程序簡易家譜的創作過程中,我們組員各抒己見,意見很不一致,包
括是采用遞歸算法,還是采用隊列;數據成員的結構如何定義,甚至包括成員
的名字,大家的意見都不統一。但是在探討的過程中,我們也理解自己思維的
不足,也見識了另外不同的編程思想,這也讓我體會到了交流的魅力。只有我
們大家坦誠布公的把自己想法說出來,然后我們在理性的分析算法的優劣與可
行性,這樣就能結合大家共同的智慧,組織大家共同的力量,為共同的目標努
力奮斗。次大作業的推薦學時是20個學時,但回想起來,光這篇報告就寫了有
三四個學時,由于我本身編程能力不強,構思,寫代碼,修改,調試的時間加
起來絕對是有余了。雖然付出不少,但在前期的設計組織中,中期的代碼編寫
和后期的修改調試中都學到了不少。
起初我的家譜中數據并不是以結構的形式打包,讀入,寫出操作的時候代
碼異常繁瑣,這是恰好看到一本編程書上有用結構輸入輸出的范例,深深感到
結構化確實是方便多了,而且讀寫不容易出錯。當時我的代碼本已經寫了有一
大半,思慮再三,還是決定進行大換血,家譜數據的改變讓程序來了個大換血,
提高了效率的同時,代碼幾乎變了一多半。我想,當時唯一不變的就只有對整
個程序越來越清醒地認識和對將要完成的代碼的更準確地把握。
代碼完成之后,一編譯,至少有五六十個錯誤提示,而且最末debug一行
欄的最后一行提示因為先前的錯誤而中斷編譯,有的是指針指向錯誤,有的是
忘了分號,括號,更多的是一些賦值錯誤,前面的錯誤都好改,賦值錯誤就比
較麻煩了,因為要使用賦值的地方太多,逐行改代碼雖然也可以,但實在是一
個巨大工程。所謂巧招必是險招——至少對我是這樣——說來慚愧,我只有嘗
試著寫以前從未是過的運算符重載函數,為此專門翻找出了大一的C++教材,
溫習了一番運算符重載才戰戰兢兢地搞定了賦值問題。
試運行時出現了更多的問題,而且更具有隱蔽性,幾次為了一個邏輯錯誤
而來回反復地翻看代碼,嘿嘿,再加上網上有代碼的傳說,讓人有想直接放棄
的沖動,但一想到寫代碼的辛苦,覺得放棄了實在可惜。那幾天吃飯,睡覺,
走路,看電視,隨時隨地,都記掛著那幾處錯誤,腦子都會浮現出代碼的影子,
不自覺地開始找錯誤。哎~那種感覺!~不知道是充實還是急迫地煩惱,最后終
于找到了,根本來不急高興,只有松了一口氣和一陣的疲憊。
現在程序終于完成了,心里的石頭也下了地。至于成績,不想了~~
課程設計(論文)
15
另外,通過本次課程設計,我覺得自己最大的收獲就是:
(1)學會了怎樣將課堂所學知識運用到較為實際的應用中來
由于對二叉鏈表的存儲比較感興趣,我選做的是家譜,開始覺得無從下手,但是
經過仔細分析后,漸漸找到一點思路(首先創建,然后分別實現各個功能,最后
利用菜單實現選擇功能并輸出結果)。
(2)鍛煉提出問題、解決問題和自學的能力
家譜的實現要求讀、寫文件,于是“如何將文件從文檔中讀出”,“怎么寫入文
件”都是要滿足要求必須解決的問題。為此,我查找了很多資料,最后自學、解
決這一問題
(3)增加了對編程的熱愛和興趣
本次編寫家譜程序的過程中,我體驗到了編程的酸甜苦辣:開始,由于即將運用
所學知識設計實際問題而激動興奮;后來編寫程序過程中,在想不出算法如何實
現或者追求空間、時間上高效率的算法時會比較糾結;以及遇到BUG時,追蹤數
據的痛苦;當然,還有解決問題后的激動與自豪。所有這些都增強了我對編程的
熱愛、提高了我對計算機專業的興趣。
課程設計(論文)
16
附錄一:程序源代碼
#include
#include
#include
#include
#defineNAME_length50//名字最大長度
#defineLINE_length100//文本行最大長度
typedefstructcc
{
structcc*child,*next;//next指向同輩份的人物
charName[];
}JPNode;
voidclear(charp[],intn)//清空字符數組p
{
while(n-->0)
*p++='0';
}
staticJPNode*last=NULL;
staticintlast_level=0;
voidAddJP(JPNode**head,charconstname[],intlevel)
{
JPNode**s=head,*r=NULL;
JPNode*p=(JPNode*)malloc(2*sizeof(void*)+strlen(name)+1);
p->child=p->next=NULL;
strcpy(p->Name,name);
if(*s==NULL)
{
課程設計(論文)
17
*s=p;
last=p;
return;
}
if(level-last_level==1){last->child=p;last=
p;last_level=level;return;}
if((level==last_level)&&(*s!=NULL)){last->next=p;last=
p;last_level=level;return;}
r=*s;//r指向家譜樹
last_level=level;
while(level-->0)//找到相同的輩分
{
while(r->next!=NULL)r=r->next;
r=r->child;
}//以兄弟連接
while(r->next!=NULL)r=r->next;
r->next=p;
last=p;
}
voidCreatJP(JPNode**head)
{
charname[NAME_length]="",line[LINE_length]="";
char*p=NULL;
intlevel=0,i=0;//輩分,以制表符個
數表示
FILE*fp=NULL;
fp=fopen("jiapu_","r");
if(fp==NULL){printf("openerror!n");exit(1);}
while(level=0,i=0,fgets(line,LINE_length,fp)!=NULL)
課程設計(論文)
18
{
p=line;
while(*p++=='t')level++;//計算輩分,計算完后p指向名
字開始處
while(line[i++]!='n')
;
line[i-1]='0';//讀入的換行符用字符串結束標識
符替換
strcpy(name,p-1);
AddJP(head,name,level);
clear(name,NAME_length);clear(line,LINE_length);
}
fclo(fp);
}
voidDispJP(JPNode*p)//從p指向的結點顯示該家族
{
staticintlevel=0;
inti;
if(p!=NULL)
{
for(i=0;i
printf("%sn",p->Name);
}
elreturn;
level++;
DispJP(p->child);
level--;
DispJP(p->next);
}
課程設計(論文)
19
////////////////////////////////////////////////////////////////////
///////
/*在家譜中添加新成員,并追加到文件中*/
intEqual(charconst*p,charconstq[])//判斷兩個字符串是否相等
{
while(*p++==*q++)if(*p=='0'&&*q=='0')return(1);
return(0);
}
JPNode*Find_Name(JPNode*s,char*parent)//定位家譜中的成員。返回其
指針(地址)
{
staticJPNode*here=NULL;
if(s==NULL)returnhere;
if(Equal(s->Name,parent)==1)return(here=s);
here=Find_Name(s->child,parent);
here=Find_Name(s->next,parent);
returnhere;
}
voidPrint_FILE(JPNode*p,FILE*fp)
{
staticintlevel=0;
inti;
if(p!=NULL)
{
for(i=0;i
fprintf(fp,"%sn",p->Name);
}
elreturn;
level++;
課程設計(論文)
20
Print_FILE(p->child,fp);
level--;
Print_FILE(p->next,fp);
}
voidADD_number(JPNode*p)//在家譜中添加新成員,并寫入文件
{
charparent[NAME_length],name[NAME_length];
FILE*fp=NULL;
JPNode*here=NULL;
JPNode*s=(JPNode*)malloc(2*sizeof(void*)+strlen(name)+1);
s->next=s->child=NULL;
printf("請輸入要添加的新成員的雙親姓名:");scanf("%s",parent);
printf("請輸入要添加的新成員的姓名:");scanf("%s",name);
strcpy(s->Name,name);
here=Find_Name(p,parent);
if(here->child==NULL)here->child=s;
el
{
here=here->child;
while(here->next!=NULL)here=here->next;
here->next=s;
}
fp=fopen("jiapu_","w");
Print_FILE(p,fp);
fclo(fp);
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
/*輸出指定家庭的所有成員*/
課程設計(論文)
21
voidDis_Family(JPNode*p)
{
charname[NAME_length];
JPNode*here=NULL;
printf("請輸入該家庭的首個成員:");scanf("%s",name);
here=Find_Name(p,name);
if(here==NULL){printf("無該家庭!n");return;}
printf("n");
DispJP(here);
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
/*確定指定成員在家族中的輩份*/
intbeifen(JPNode*p,charname[])
{
staticintn=1;
staticintlevel=0;
if(p==NULL)returnlevel;
if(Equal(p->Name,name)==1)return(level=n);
n++;beifen(p->child,name);
n--;beifen(p->next,name);//向右查詢n不必加(先加后減)!
returnlevel;
}
voidBei_Fen(JPNode*p)
{
charname[NAME_length];
intn=0;
printf("請輸入要查明輩分的人的姓名:");scanf("%s",name);
n=beifen(p,name);
課程設計(論文)
22
if(n==0)printf("該家族中無此人!n");
elprintf("n%s是%s家族中的第%d輩n",name,p->Name,n);
}
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
/*輸出指定輩的所有成員*/
voidchabei(JPNode*p,intbei)
{
staticintn=1;
staticinttag=0;
if(p==NULL)return;
if(bei==n){tag=1;printf("%s",p->Name);}
n++;chabei(p->child,bei);
n--;chabei(p->next,bei);//向右查詢n不必加(先加后減)!
if(tag==0)printf("該家族中還沒有這一輩呢....n");
}
voidDisp_Pei(JPNode*p)
{
intbei;
printf("n你想要查看那一輩的成員:");
scanf("%d",&bei);
printf("n....該家族中輩分為%d的成員有....nn",bei);
chabei(p,bei);
printf("n");
}
/////////////////////////////////////////////////////////////////
voidmenu(void);
intmain(void)
課程設計(論文)
23
{
JPNode*JP=NULL;//家譜無結點
charch='1',cc;
CreatJP(&JP);
while(ch)
{
system("cls");
menu();
printf("n...請選擇:");
scanf("%c",&ch);
//ch=getchar();
switch(ch)
{
ca'1':ADD_number(JP);break;
ca'2':Dis_Family(JP);break;
ca'3':Bei_Fen(JP);break;
ca'4':Disp_Pei(JP);break;
default:ch='0';break;
}
getche();while((cc=getchar())!='n');
}
return0;
}
voidmenu(void)
{
printf("n****************家譜操作菜單****************n");
printf("
*(1)在家譜中添加新成員,并追加到文件中。*n
*(2)輸出指定家庭的所有成員。*n
課程設計(論文)
24
*(3)確定指定成員在家族中的輩份(第幾代)。*n
*(4)輸出指定輩的所有成員。*n
*(0)退出操作!*n
********************************************n");
}
課程設計(論文)
25
附錄二:參考文獻
如:
[1]譚浩強,C程序設計題解與上機指導(第二版),北京,清華大學出版社,2000年9月。
[2]嚴蔚敏,吳偉民,數據結構,北京,清華大學出版社,2004年6月。
[3]殷人昆,陶永雷,謝若陽等,數據結構,北京,清華大學出版社,2005年3月。
[4]沈晴霓,聶青,蘇京霞,現代程序設計──C++與數據結構面向對象的方法與實現,
北京,北京理工大學出版社,2002年3月。
[5]朱戰立,張選平,數據結構學習指導與典型題解,西安,西安交通大學出版社,2002
年7月。
[6]羅文劼,王苗,石強,數據結構習題解答與實驗指導,北京,中國鐵道出版社,2004
年11月。
課程設計(論文)
26
簡易家譜課程設計成績評定表
1、課程設計答辯或質疑記錄
1)
2)
3)
2、答辯情況
a)未能完全理解題目,答辯情況較差□
b)部分理解題目,答辯情況較差□
c)理解題目較清楚,問題回答基本正確□
d)理解題目透徹,問題回答流利□
3、課程設計報告
a)內容:不完整□完整□詳細□
b)方案設計:較差□合理□非常合理□
c)實現:未實現□部分實現□全部實現□
d)文檔格式:不規范□基本規范□規范□
考勤成績:,占總成績比例10%
答辯成績:,占總成績比例30%
課程設計論文成績:,占總成績比例60%
課程設計總成績:
指導教師簽字:
年月日
課程設計(論文)
27
本文發布于:2023-03-08 00:26:32,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/16782063925831.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:家譜樹.doc
本文 PDF 下載地址:家譜樹.pdf
| 留言與評論(共有 0 條評論) |