




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 軟件綜合設(shè)計(jì)家譜管理系統(tǒng) 院 系: 計(jì)算機(jī)科學(xué)技術(shù)學(xué)院二系 班 級(jí): 計(jì)11 2班 姓 名: 劉文秀(15) 合 作 者: 姜雪(05) 、岳奉宜(33) 指導(dǎo)教師: 薛曼玲 2013 年 12 月 01 日軟件綜合設(shè)計(jì)任務(wù)書(shū)一、題目:家譜管理系統(tǒng) 二、設(shè)計(jì)要求(1)劉文秀(組長(zhǎng))、姜雪和岳奉宜組成課程設(shè)計(jì)小組。(2)小組成員分工協(xié)作完成。要求每個(gè)成員有自己相對(duì)獨(dú)立的模塊,同時(shí)要了解其他組員完成的內(nèi)容。(3)查閱相關(guān)資料,自學(xué)具體課題中涉及到的新知識(shí)。(4)采用結(jié)構(gòu)化、模塊化程序設(shè)計(jì)方法設(shè)計(jì),功能要完善,界面美觀。(5)所設(shè)計(jì)的系統(tǒng)應(yīng)有菜單、動(dòng)畫(huà)和音樂(lè)。(6)按要求寫(xiě)出課程設(shè)計(jì)報(bào)告,并于設(shè)計(jì)
2、結(jié)束后1周內(nèi)提交。其主要內(nèi)容包括:封皮、課程設(shè)計(jì)任務(wù)書(shū),指導(dǎo)教師評(píng)語(yǔ)與成績(jī)、目錄、概述、軟件需求分析、總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)、程序的調(diào)試與測(cè)試、總結(jié)與體會(huì)、結(jié)束語(yǔ)、程序清單(帶中文注釋)、參考文獻(xiàn)等。報(bào)告一律用A4紙打印,正文的中文字體為宋體,西文字體用Time New Roma,一律用小四號(hào)字,行距采用“固定值”18磅,首行縮進(jìn)2字符。1級(jí)標(biāo)題中文字體為黑體,西文字體為T(mén)ime New Roma,采用三號(hào)字;段落為居中、段前18磅、段后12磅、行距采用“固定值”18磅,首行縮進(jìn):無(wú),段中不分頁(yè),與下段同頁(yè)。僅一級(jí)標(biāo)題上目錄。三、課程設(shè)計(jì)工作量由于是設(shè)計(jì)小組團(tuán)結(jié)協(xié)作完成設(shè)計(jì)任務(wù),一般每人的程序量在
3、400行有效程序行以上,不得抄襲。四、課程設(shè)計(jì)工作計(jì)劃2013年12月2日,指導(dǎo)教師講課,學(xué)生根據(jù)題目準(zhǔn)備資料,需求分析;2013年12月3日,設(shè)計(jì)小組進(jìn)行總體方案設(shè)計(jì)和任務(wù)分工;2013年12月4日2013年12月10日,每人完成自己承擔(dān)的程序模塊并通過(guò)獨(dú)立編譯;2013年12月11日12日,將各模塊集成為一個(gè)完整的系統(tǒng),并錄入足夠的數(shù)據(jù)進(jìn)行調(diào)試運(yùn)行;2013年12月13日,驗(yàn)收、開(kāi)始撰寫(xiě)課程設(shè)計(jì)報(bào)告;2013年12月18日前,提交課程設(shè)計(jì)報(bào)告和軟件。 指導(dǎo)教師簽章: 教研室主任簽章 指導(dǎo)教師評(píng)語(yǔ)與成績(jī)指導(dǎo)教師評(píng)語(yǔ):課程設(shè)計(jì)驗(yàn)收成績(jī): 課程設(shè)計(jì)報(bào)告成績(jī): 課程設(shè)計(jì) 總成績(jī): 指導(dǎo)教師簽章 年
4、 月 日目 錄第1章 概述11.1 課題研究的目的和技術(shù)發(fā)展現(xiàn)狀11.2 課題研究的主要內(nèi)容11.3 課題研究的難點(diǎn)1第2章 需求分析22.1 性能需求22.2 功能需求2第3章 可行性分析23.1 經(jīng)濟(jì)可行性分析23.2 技術(shù)可行性分析2第4章 概要設(shè)計(jì)34.1 程序設(shè)計(jì)的基本思想34.2 總體功能模塊圖34.3相關(guān)應(yīng)用技術(shù)3第5章 詳細(xì)設(shè)計(jì)45.1日期信息的合法性檢驗(yàn)45.2 添加成員孩子模塊55.3 添加成員兄弟模塊85.4 按照出生日期對(duì)家譜排序95.5 由兄弟、孩子二叉樹(shù)生成家譜文件125.6 按照姓名、出生日期查找家譜成員13第6章 調(diào)試分析與測(cè)試結(jié)果146.1 測(cè)試方法146.2
5、 測(cè)試過(guò)程146.3 測(cè)試結(jié)論15第7章 結(jié)束語(yǔ)19參考文獻(xiàn)20附 錄20第1章 概述1.1 課題研究的目的和技術(shù)發(fā)展現(xiàn)狀本家譜管理系統(tǒng)是以電子家譜的形式記載父系家族世襲、人物為中心。電子能準(zhǔn)確記錄家族成員出生卒年,以及生活地點(diǎn)、家庭成員等信息。一般情況下是不會(huì)出現(xiàn)信息丟失情況。更不需要擔(dān)心傳統(tǒng)家譜隨著年代的久遠(yuǎn)字跡不清晰,有破損等情況的出現(xiàn)。所以本課題的研究目的是讓大家不但能夠非常容易的記錄家族情況,而且能清楚的了解本家族信息,使用起來(lái)非常方便?,F(xiàn)有的計(jì)算機(jī)技術(shù)足以支撐電子家譜的開(kāi)發(fā)。家譜的科學(xué)管理不但有助于民族文化和地方文化的發(fā)展,而且有其自身的積極意義。例如本電子家譜是利用Visval
6、C+ 6.0開(kāi)發(fā)完成的。電子家譜的出現(xiàn)無(wú)疑讓家譜煥然一新,但是傳統(tǒng)家譜更能凸顯出歷史的韻味,文化的內(nèi)涵。這是電子家譜所不能夠替代的,電子家譜不可能成為文物。開(kāi)發(fā)人員應(yīng)該清楚的認(rèn)識(shí)到這一點(diǎn)。1.2 課題研究的主要內(nèi)容家譜,又稱族譜、祖譜、宗譜等。一種以表譜形式,記載一個(gè)以血緣關(guān)系為主題的家族世系繁衍。本課題研究的主要內(nèi)容是以電子家譜的形式記錄、查詢父系家族歷史信息為主要內(nèi)容。1.3 課題研究的難點(diǎn)建立輸入文件以存放最初家譜中各成員的信息,以及能夠?qū)π薷暮蟮募易V存盤(pán)以備以后使用。用戶界面的設(shè)計(jì)不夠完美。功能上的設(shè)計(jì)難度很大。第2章 需求分析2.1 性能需求系統(tǒng)的核心是利用對(duì)話框的連接和文本處理來(lái)存
7、儲(chǔ)和修改家族管理系統(tǒng)的信息聯(lián)系,其中的每一個(gè)動(dòng)作都可能影響到其他的功能。使用方便,易于傳播,數(shù)據(jù)共享等性能。易于維護(hù)。2.2 功能需求² 建立輸入文件以存放最初家譜中各成員的信息。² 成員的信息中均應(yīng)包含以下內(nèi)容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加其它信息、但不是必需的。² 能對(duì)修改后的家譜存盤(pán)以備以后使用。² 能從文件中讀出已有的家譜,形成樹(shù)狀關(guān)系。² 家譜建立好之后,以圖形方式顯示出來(lái)。² 顯示第n代所有人的信息。² 按照姓名查詢,輸出成員信息(包括其本人、父親、孩子的信息)。²
8、 按照出生日期查詢成員名單。² 輸入兩人姓名,確定其關(guān)系。² 某人添加孩子。² 刪除某人(若其還有后代,則一并刪除)。² 修改某人信息。² 按出生日期對(duì)家譜中所有人排序。² 打開(kāi)一家譜時(shí),若家譜中某人的生日在打開(kāi)家譜的那一天,應(yīng)給出提示 。 第3章 可行性分析3.1 經(jīng)濟(jì)可行性分析對(duì)系統(tǒng)開(kāi)發(fā)規(guī)模進(jìn)行估算屬此軟件項(xiàng)目屬于小規(guī)模軟件開(kāi)發(fā)。所以開(kāi)發(fā)人員三到五人即可。開(kāi)發(fā),維護(hù)等成本相對(duì)較低。所以從經(jīng)濟(jì)可行性分析的角度來(lái)看此家譜管理系統(tǒng)適于開(kāi)發(fā)。3.2 技術(shù)可行性分析根據(jù)軟件系統(tǒng)功能、性能要求的各項(xiàng)約束條件從技術(shù)的角度實(shí)現(xiàn)系統(tǒng)的可行性。家譜信
9、息以樹(shù)的形式一次讀入內(nèi)存,而個(gè)人的各種資料雖然目前條目不多,但隨著程序的升級(jí),以后可能越來(lái)越大。我把樹(shù)形結(jié)構(gòu)和個(gè)人信息記錄的文檔分為兩個(gè)文件保存在外存中,一個(gè)文件串行化的記錄家譜樹(shù)的結(jié)構(gòu)化信息,保持少量個(gè)人信息作為識(shí)別標(biāo)志;另一個(gè)文檔保存完整的個(gè)人信息。索引時(shí),以樹(shù)形中的少量信息為依據(jù)在另一個(gè)文件中找到全部個(gè)人信息資料。第4章 概要設(shè)計(jì)4.1 程序設(shè)計(jì)的基本思想家譜管理系統(tǒng)的總體設(shè)計(jì)思路是先為程序搭建好一個(gè)人結(jié)構(gòu)框架,家庭成員之間的關(guān)系,用樹(shù)形結(jié)構(gòu)(家族樹(shù))表示,這是本家譜管理系統(tǒng)的邏輯結(jié)構(gòu)。根據(jù)MFC的特點(diǎn),采用CfamilytreeDlg類實(shí)現(xiàn)用戶窗口界面指令對(duì)于家譜的各種操作。有文件控制
10、和家譜控制兩大模塊, 按生日查找、刪除成員、文件輸入輸出、修改成員信息、按名字查找、成員關(guān)系顯示、按代數(shù)顯示等各種操作。然后再根據(jù)需求分析逐步增強(qiáng)程序的功能和性能。4.2 總體功能模塊圖 4.3相關(guān)應(yīng)用技術(shù) 1.定義“家譜”類型 2.用結(jié)構(gòu)Date存儲(chǔ)日期 3.用結(jié)構(gòu)QuickSortNode存儲(chǔ)快速排序數(shù)組值(為快速排序而設(shè)) 4.根據(jù)家譜的特點(diǎn),采用孩子-兄弟的二叉樹(shù)鏈表表示法(鏈表的基本單位為以結(jié)構(gòu)ersonNode表示的結(jié)點(diǎn)),各種操作以COperationFamilytree類來(lái)實(shí)現(xiàn)。 5.根據(jù)MFC的特點(diǎn),采用CfamilytreeDlg類實(shí)現(xiàn)用戶窗口界面指令對(duì)于家譜的各種操作。第
11、5章 詳細(xì)設(shè)計(jì)5.1日期信息的合法性檢驗(yàn) 圖5-1 日期信息的合法性檢查 Int COperationFamilytree:ReadNode(FILE *fp, Person &T,char* parentname)/本函數(shù)從文件fp中讀取信息到結(jié)點(diǎn)T中,并讀取結(jié)點(diǎn)的父親名字到字符數(shù)組parentname中/分別讀取結(jié)點(diǎn)值,為:姓名,出生日期(年,月,日),婚否,地址,健在否,(如過(guò)世,還有死亡日期)fscanf(fp,"%s%d%d%d%d%s%d",T->,&T->info.birthday.year,&T->
12、info.birthday.month,&T->info.birthday.day,&T->info.marry,T->info.addr,&T->info.live);if(T->info.live=0)fscanf(fp,"%d%d%d",&T->info.deathday.year,&T->info.deathday.month,&T->info.deathday.day);fscanf(fp,"%s",parentname);if(!IsDateVal
13、id(T->info.birthday)/出生日期合法性檢查returnFILE_DATA_NOT_PRACTICAL;if(T->info.live=0)/若過(guò)世,死亡日期合法性檢查if(!IsDateValid(T->info.deathday)returnFILE_DATA_NOT_PRACTICAL;return OK;5.2 添加成員孩子模塊 圖5-2 添加成員孩子流程圖Int COperationFamilytree:CreateFamilytree(CString filename)/本函數(shù)建立一新家譜DestroyFamilytree();/建立一新家譜之前,
14、清空原有家譜FILE* fp;if(fp=fopen(filename,"r")=0)/打開(kāi)文件filenamereturn READ_FILE_ERROR;T=new PersonNode;/定義根結(jié)點(diǎn)if(!T)return NOT_ENOUGH_MEMORY;T->child=0;T->sibling=0;T->parent=0;Person parentT, temp;/定義兩個(gè)臨時(shí)結(jié)點(diǎn)char parentnameMAX_CHARNUM;/定義一個(gè)臨時(shí)字符串?dāng)?shù)組/讀取根結(jié)點(diǎn)值,(姓名,出生日期(年,月,日),婚否,地址,健在否,(如過(guò)世,還有死亡
15、日期)int result;result=ReadNode(fp,T,parentname);if(result=FILE_DATA_NOT_PRACTICAL)delete T; /若不合法,刪除申請(qǐng)的堆空間T=0;return result;if(strcmp(T->,parentname)=0)/根結(jié)點(diǎn)名字與其父親名字相同,說(shuō)明為空樹(shù)delete T;T=0;return PEDIGREE_EMPTY;temp=new PersonNode;/申請(qǐng)一結(jié)點(diǎn)if(!temp)/申請(qǐng)失敗DestroyFamilytree();/釋放申請(qǐng)空間return NOT_ENOU
16、GH_MEMORY;result=ReadNode(fp,temp,parentname);while(strcmp(temp->,parentname)&&strcmp(temp->,"end")/讀取信息結(jié)束的條件是兩個(gè)人的名字同為endif(result=FILE_DATA_NOT_PRACTICAL)/若數(shù)據(jù)不合法,釋放已申請(qǐng)空間,然后返回delete temp;DestroyFamilytree();return result;parentT=0; Find(T,parentT,parentname)
17、; /找到parentname所在結(jié)點(diǎn)parentTif(parentT) /如果parentT存在,說(shuō)明parentname在家譜中/并且parentname為temp的父親int cmp;cmp=CompareDate(temp->info.birthday,parentT->info.birthday);if(cmp<0)/若孩子出生日期比父親大,則不對(duì)delete temp;DestroyFamilytree();returnFILE_DATA_NOT_PRACTICAL;temp->child=temp->sibling=0;temp->paren
18、t=parentT;/temp的父指針指向parentT;if(parentT->child)/parentname已經(jīng)有孩子InsertSibling(parentT->child,temp);/ifelse/parentname無(wú)孩子,則temp應(yīng)為parentT->child=temp;/parentname的第一個(gè)孩子/ifelse/parentT不存在,說(shuō)明家譜中不存在parentname此人DestroyFamilytree();/返回出錯(cuò)信息return FILE_DATA_ERROR;temp=new PersonNode;/申請(qǐng)一結(jié)點(diǎn)if(!temp)/申請(qǐng)
19、失敗DestroyFamilytree();/釋放申請(qǐng)空間return NOT_ENOUGH_MEMORY;result=ReadNode(fp,temp,parentname);/繼續(xù)讀取數(shù)據(jù)/whileif(temp)delete temp;fclose(fp);return OK;5.3 添加成員兄弟模塊 圖5-3 添加成員兄弟模塊void SaveNode(FILE *fp, Person &pNode)/本函數(shù)向文件fp中存取一結(jié)點(diǎn)pNodechar ch='n'if(pNode)fprintf(fp,"%s %d %d %d %d %s %d &q
20、uot;,pNode->,pNode->info.birthday.year,pNode->info.birthday.month,pNode->info.birthday.day,pNode->info.marry,pNode->info.addr,pNode->info.live);if(pNode->info.live=0)fprintf(fp," %d %d %d ",pNode->info.deathday.year,pNode->info.deathday.month,pNode-&g
21、t;info.deathday.day);if(pNode->parent) /家譜結(jié)束fprintf(fp," %s ",pNode->parent->);elsefprintf(fp," %s","-1");fprintf(fp," %c",ch);int COperationFamilytree:SaveFamilytree(CString filename)/本函數(shù)保存家譜到文件filename中FILE* fp;if(fp=fopen(filename,"w&
22、quot;)=0)/打開(kāi)文件filenamereturn WRITE_FILE_ERROR;PreOrderTraverse(fp,T,SaveNode);/從根結(jié)點(diǎn)開(kāi)始存儲(chǔ)家譜數(shù)據(jù)/置家譜數(shù)據(jù)結(jié)束標(biāo)記(一結(jié)點(diǎn)的名字與其父結(jié)點(diǎn)的名字同為end)fprintf(fp,"%s %d %d %d %d %s %d %s","end",1999,12,2,1,"end",1,"end");fclose(fp);return OK;void COperationFamilytree:PreOrderTraverse(FILE
23、* fp,Person &T, void (_cdecl *Visit)(FILE* fp,Person &)/本函數(shù)把所有以T結(jié)點(diǎn)為根結(jié)點(diǎn)的結(jié)點(diǎn)值存到文件fp中if(T)(*Visit)(fp,T);PreOrderTraverse(fp,T->child,Visit);PreOrderTraverse(fp,T->sibling,Visit);5.4 按照出生日期對(duì)家譜排序void CFamilytreeDlg:OnFamilytreeSort() / TODO: Add your command handler code hereRefreshList();Q
24、uickSortNode* order;int totalNums=0;operFamilytree.GetPersonNums(operFamilytree.GetRoot(),totalNums);order=new QuickSortNodetotalNums+1;if(!order)AfxMessageBox("內(nèi)存不足!");return;AfxMessageBox("排序后結(jié)果請(qǐng)見(jiàn)下部列表。");operFamilytree.SortByBirthday(order);for(int i=1;i<totalNums+1;i+)Displ
25、ayInListCtrl(orderi.oneself);delete order;void COperationFamilytree:SortByBirthday(QuickSortNode *order)/本函數(shù)對(duì)順序表order以出生日期的大小排序int totalNums=0;QuickSortNode* startaddr=order;startaddr+;GetPersonNums(T,totalNums);CopyInfoFromBiTreeToArray(T,startaddr);QuickSort(order,1,totalNums);int COperationFamily
26、tree:Partition(QuickSortNode *order, int low, int high)/本函數(shù)供QuickSort函數(shù)調(diào)用/交換順序表order中從low到high的記錄,便樞軸記錄到位,并返回其所在位置,此時(shí)/在它之前(后)的記錄均不大(小)于它order0=orderlow;/用子表的第一個(gè)記錄做樞軸記錄Date pivotkey=orderlow.birthday;/樞軸記錄關(guān)鍵字while(low<high)/從表的兩端交替地向中間掃描while(low<high&&(CompareDate(orderhigh.birthday,pi
27、votkey)=1|CompareDate(orderhigh.birthday,pivotkey)=0)-high;orderlow=orderhigh;/將比樞軸記錄小的記錄移到低端orderlow.birthday=orderhigh.birthday; /樞軸記錄到位orderlow.oneself=orderhigh.oneself;while(low<high&&(CompareDate(orderlow.birthday,pivotkey)=-1|CompareDate(orderlow.birthday,pivotkey)=0)+low;orderhigh
28、=orderlow;/將比樞軸記錄大的記錄移到高端orderlow=order0; /樞軸記錄到位return low;/返回樞軸位置void COperationFamilytree:QuickSort(QuickSortNode *order, int low, int high)/本函數(shù)對(duì)順序表orderlow.high作快速排序int pivotloc;if(low<high)/長(zhǎng)度大于1pivotloc=Partition(order,low,high);/將orderlow.high一分為二QuickSort(order,low,pivotloc-1);/對(duì)低子表遞歸排序,p
29、ivotloc是樞軸位置QuickSort(order,pivotloc+1,high);/對(duì)高子表遞歸排序void COperationFamilytree:GetPersonNums(Person&T,int& personNums)/本函數(shù)返回以T為根結(jié)點(diǎn)的所有結(jié)點(diǎn)數(shù),并把結(jié)果存入personNums中/初始值personNums必須為0if(T)personNums+;GetPersonNums(T->child,personNums);/遞歸調(diào)用GetPersonNums(T->sibling,personNums);void COperationFami
30、lytree:CopyInfoFromBiTreeToArray(Person &T, QuickSortNode *&order)/本函數(shù)先序遍歷以T為根結(jié)點(diǎn)的所有結(jié)點(diǎn),并把每一個(gè)結(jié)點(diǎn)的出生日期信息及其指針值/依次存入順序表order中if(T)(*order).birthday=T->info.birthday;(*order).oneself=T;order+;CopyInfoFromBiTreeToArray(T->child,order);CopyInfoFromBiTreeToArray(T->sibling,order);5.5 由兄弟、孩子二叉
31、樹(shù)生成家譜文件void SaveNode(FILE *fp, Person &pNode)/本函數(shù)向文件fp中存取一結(jié)點(diǎn)pNodechar ch='n'if(pNode)fprintf(fp,"%s %d %d %d %d %s %d",pNode->,pNode->info.birthday.year,pNode->info.birthday.month,pNode->info.birthday.day,pNode->info.marry,pNode->info.addr,pNode->i
32、nfo.live);if(pNode->info.live=0)fprintf(fp," %d %d %d ",pNode->info.deathday.year,pNode->info.deathday.month,pNode->info.deathday.day);if(pNode->parent) /家譜結(jié)束fprintf(fp," %s ",pNode->parent->);elsefprintf(fp," %s","-1");fprintf(fp
33、," %c",ch);int COperationFamilytree:SaveFamilytree(CString filename)/本函數(shù)保存家譜到文件filename中FILE* fp;if(fp=fopen(filename,"w")=0)/打開(kāi)文件filenamereturn WRITE_FILE_ERROR;PreOrderTraverse(fp,T,SaveNode);/從根結(jié)點(diǎn)開(kāi)始存儲(chǔ)家譜數(shù)據(jù)/置家譜數(shù)據(jù)結(jié)束標(biāo)記(一結(jié)點(diǎn)的名字與其父結(jié)點(diǎn)的名字同為end)fprintf(fp,"%s %d %d %d %d %s %d %s&q
34、uot;,"end",1999,12,2,1,"end",1,"end");fclose(fp);return OK;void COperationFamilytree:PreOrderTraverse(FILE* fp,Person &T, void (_cdecl *Visit)(FILE* fp,Person &)/本函數(shù)把所有以T結(jié)點(diǎn)為根結(jié)點(diǎn)的結(jié)點(diǎn)值存到文件fp中if(T)(*Visit)(fp,T);PreOrderTraverse(fp,T->child,Visit);PreOrderTraverse
35、(fp,T->sibling,Visit);5.6 按照姓名、出生日期查找家譜成員void COperationFamilytree:Find(Person& T,Person& Tname,char* name)/本函數(shù)以T為根結(jié)點(diǎn)開(kāi)始,搜索結(jié)點(diǎn)信息中名字等于name的結(jié)點(diǎn)if(T) /如果T存在if(strcmp(T->,name)=0)/T結(jié)點(diǎn)姓名和name相同,把T結(jié)點(diǎn)指針傳給TnameTname=T;elseFind(T->sibling,Tname,name);/對(duì)T的兄弟遞歸搜索Find(T->child,Tname,na
36、me);/對(duì)T的孩子遞歸搜索void COperationFamilytree:Find(Person &T, Person*& Tname,int month, int day)/本函數(shù)以T為根結(jié)點(diǎn)開(kāi)始,搜索結(jié)點(diǎn)信息中生日等于month,day的結(jié)點(diǎn),/并把所有符合條件的結(jié)點(diǎn)指針值存入以Tname為起始地址的地址數(shù)組中if(T)/如果T存在if(T->info.birthday.month=month&&T->info.birthday.day=day)/T結(jié)點(diǎn)生日與所給相同,把T結(jié)點(diǎn)指針傳給Tname,同時(shí)Tname指針前進(jìn)*Tname=T;Tn
37、ame+;elseFind(T->sibling,Tname,month,day);/對(duì)T的兄弟遞歸搜索Find(T->child,Tname,month,day);/對(duì)T的孩子遞歸搜索第6章 調(diào)試分析與測(cè)試結(jié)果 6.1 測(cè)試方法該課程設(shè)計(jì)只有一個(gè)主要類,即對(duì)孩子兄弟二叉樹(shù)的操作類。該類主要包括文件讀取函數(shù)、創(chuàng)建孩子兄弟二叉樹(shù)函數(shù)、在樹(shù)中查找函數(shù)、遍歷函數(shù)以及對(duì)樹(shù)中結(jié)點(diǎn)進(jìn)行加入、刪除、修改的函數(shù)。由于樹(shù)存儲(chǔ)結(jié)構(gòu)的特殊性,故編制這些算法時(shí)大量使用了遞歸,雖然這樣做可能會(huì)降低程序的執(zhí)行效率,但程序的易讀性較強(qiáng)。6.2 測(cè)試過(guò)程在調(diào)試時(shí),遇到的幾個(gè)問(wèn)題如下:(1)建立樹(shù)時(shí),由于新申請(qǐng)結(jié)點(diǎn)
38、的孩子指針、兄弟指針、及雙親指針均未賦空值。而在以后的函數(shù)中對(duì)樹(shù)進(jìn)行遞歸操作時(shí)均以這些指針值中的一個(gè)或幾個(gè)是否為空作為遞歸結(jié)束條件。從而導(dǎo)致調(diào)用這些函數(shù)時(shí)出現(xiàn)系統(tǒng)保護(hù)異常(使用了不安全的指針)。(2)剛開(kāi)始刪除結(jié)點(diǎn)時(shí),只考慮到刪除其本身結(jié)點(diǎn)的情況,而刪除其孩子結(jié)點(diǎn)的情況未考慮到,故在刪除某些結(jié)點(diǎn)時(shí)使樹(shù)出現(xiàn)了“斷鏈”現(xiàn)象。故在程序代碼中對(duì)刪除某一結(jié)點(diǎn)進(jìn)行操作時(shí),首先要判斷此結(jié)點(diǎn)是否有孩子及兄弟,然后進(jìn)行相應(yīng)操作。(3)剛開(kāi)始進(jìn)行程序概要設(shè)計(jì)時(shí),曾考慮到用控制臺(tái)下的文本方式作為程序界面,實(shí)際操作后發(fā)現(xiàn)并不理想。一方面字符形式的界面友好性較差,另一方面顯示整個(gè)家譜樹(shù)的信息時(shí)不方便。故考慮用VC+中M
39、FC類自帶的樹(shù)型控件顯示家譜層次,而用列表控件顯示家譜中的信息。用后效果不錯(cuò)。6.3 測(cè)試結(jié)論 (1)按下按鈕“打開(kāi)家譜”,打開(kāi)一個(gè)家譜文件(*.ftf) (2)按下按鈕“新建家譜”,新建一個(gè)家譜文件(*.ftf) (3)按下按鈕“保存家譜”,將修改過(guò)的家譜保存(4)按下按鈕“另存家譜”,將修改過(guò)的家譜另存為一個(gè)家譜文件(*.ftf)(5)按下按鈕“刪除該人”,將樹(shù)型控件中選中的成員及其后代刪除 (6)按下按鈕“增加孩子”,給樹(shù)型控件中選中的成員增加一個(gè)孩子 (7)按下按鈕“更改資料”,更改樹(shù)型控件中選中的成員的資料 (8)按下按鈕“按照姓名查找”,將家譜中特定名字的成員的信息顯示在列表控件中 (9)按下按鈕“確定兩人關(guān)系”,將家譜中某兩人的關(guān)系顯示出來(lái) (10)按下按鈕“出生日期排序”,將家譜中的所有成員按出生日期排序并顯示在列表控件中 (11)按下按鈕“按照生日查找”,將家譜中特定日期出生的成員的信息顯示在列表控件中 (12)選擇菜單項(xiàng)目“關(guān)于”,顯示該程序的版權(quán)信息 (13)選擇菜單項(xiàng)目“退出”,結(jié)束該程序的運(yùn)行 第7章 結(jié)束語(yǔ) 通過(guò)這次大作業(yè),體會(huì)很深刻,將一直以來(lái)學(xué)到的東西都運(yùn)用到實(shí)際上來(lái),學(xué)以致用,對(duì)所學(xué)知識(shí)有了更深刻的理解,同時(shí)還發(fā)現(xiàn)了許多平時(shí)在書(shū)本上沒(méi)有遇見(jiàn)過(guò)的問(wèn)題,促進(jìn)了自己對(duì)知識(shí)的渴望,遇見(jiàn)了問(wèn)題,就希望能夠通過(guò)查找課外書(shū)來(lái)解決
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 古鎮(zhèn)策劃運(yùn)營(yíng)合同范本
- 芳香除臭化學(xué)品:空氣清新劑戰(zhàn)略市場(chǎng)規(guī)劃報(bào)告
- 公司遷址代辦合同范本
- 歷年小學(xué)英語(yǔ)試卷
- 醫(yī)療衛(wèi)生招聘測(cè)試題(含參考答案)
- 個(gè)人股份轉(zhuǎn)讓協(xié)議書(shū)
- 鉗工四級(jí)理論知識(shí)題庫(kù)(附參考答案)
- 個(gè)人犯錯(cuò)萬(wàn)能檢討書(shū)
- 雙向鋼塑格柵買(mǎi)賣合同范例
- 家校共育之道
- DeepSeek入門(mén)寶典培訓(xùn)課件
- 西安2025年陜西西安音樂(lè)學(xué)院專職輔導(dǎo)員招聘2人筆試歷年參考題庫(kù)附帶答案詳解
- 《作文中間技巧》課件
- 廣東省2025年中考物理仿真模擬卷(深圳)附答案
- 2025屆八省聯(lián)考 新高考適應(yīng)性聯(lián)考英語(yǔ)試題(原卷版)
- 新蘇教版一年級(jí)下冊(cè)數(shù)學(xué)第1單元第3課時(shí)《8、7加幾》作業(yè)
- 2024年山東電力高等??茖W(xué)校高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 《平面廣告賞析》課件
- 人教鄂教版六年級(jí)下冊(cè)科學(xué)全冊(cè)知識(shí)點(diǎn)
- (正式版)HGT 22820-2024 化工安全儀表系統(tǒng)工程設(shè)計(jì)規(guī)范
評(píng)論
0/150
提交評(píng)論