《物聯(lián)網(wǎng)軟件基礎(chǔ)課程設(shè)計》指導(dǎo)書_第1頁
《物聯(lián)網(wǎng)軟件基礎(chǔ)課程設(shè)計》指導(dǎo)書_第2頁
《物聯(lián)網(wǎng)軟件基礎(chǔ)課程設(shè)計》指導(dǎo)書_第3頁
《物聯(lián)網(wǎng)軟件基礎(chǔ)課程設(shè)計》指導(dǎo)書_第4頁
《物聯(lián)網(wǎng)軟件基礎(chǔ)課程設(shè)計》指導(dǎo)書_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

物聯(lián)網(wǎng)軟件基礎(chǔ)課程設(shè)計指導(dǎo)書計算機科學(xué)與技術(shù)學(xué)院計工系i=計算機科學(xué)與技術(shù)學(xué)院計工系i=2016年6月12日前言《軟件基礎(chǔ)課程設(shè)計》是物聯(lián)網(wǎng)專業(yè)的重要實踐性課程。目的在于培養(yǎng)學(xué)生分析問題和解決問題的能力,為學(xué)生提供了一個既動手又動腦,獨立實踐的機會。將課本上的數(shù)據(jù)結(jié)構(gòu)、離散數(shù)學(xué)和C語言的理論知識和實際應(yīng)用問題進(jìn)行有機結(jié)合,提高學(xué)生程序設(shè)計、程序調(diào)試及項目開發(fā)能力。為后續(xù)課程:操作系統(tǒng)、軟件工程,編譯原理等課程的學(xué)習(xí)奠定必要的實踐基礎(chǔ)。本課程設(shè)計是利用數(shù)據(jù)結(jié)構(gòu)、離散數(shù)學(xué)、C/C++語言理論和實驗課中學(xué)到的編程知識和編程技巧,通過布置具有一定難度、一定編程量的課程設(shè)計題目,利用C/C++語言作為開發(fā)工具,使學(xué)生通過課程設(shè)計掌握高級編程語言的知識和編程技術(shù),掌握程序設(shè)計的思想和方法,初步具備利用計算機求解實際問題的能力。通過《程序設(shè)計課程設(shè)計》課程的學(xué)習(xí),能夠幫助學(xué)生加深理解數(shù)據(jù)結(jié)構(gòu)、離散數(shù)學(xué)、C語言基本概念,達(dá)到培養(yǎng)學(xué)生良好程序設(shè)計的習(xí)慣和運用C語言編寫程序解決實際問題的能力。使學(xué)生學(xué)會把書本知識用于解決實際問題,起到深化理解和靈活掌握教學(xué)內(nèi)容的目的。同時使學(xué)生在程序設(shè)計方法及上機操作等基本技能和科學(xué)作風(fēng)方面受到比較系統(tǒng)和嚴(yán)格的訓(xùn)練。通過該課程設(shè)計,學(xué)生應(yīng)該掌握C或C++語言程序設(shè)計的方法、數(shù)據(jù)結(jié)構(gòu)和離散數(shù)學(xué)理論知識,熟悉C或C++程序的開發(fā)環(huán)境及C或C++程序的調(diào)試過程,鞏固和加深對理論課中知識的理解,提高學(xué)生對所學(xué)知識的綜合運用能力;學(xué)生應(yīng)該具有如下基本技能:①培養(yǎng)學(xué)生查閱參考資料、手冊的自學(xué)能力,通過獨立思考深入鉆研問題,學(xué)會自己分析、解決問題。②通過對所選題目方案分析比較,確立方案,編制程序與調(diào)試程序。③能熟練調(diào)試程序,在教師的指導(dǎo)下,完成課題任務(wù)。④根據(jù)個人的設(shè)計調(diào)試過程,按課程設(shè)計報告的要求撰寫設(shè)計報告。選用教材及主要參考書:教材呼克佑.C語言程序設(shè)計(計算機專業(yè)).中國宇航出版社,2002嚴(yán)蔚敏.數(shù)據(jù)結(jié)構(gòu)(C語言版)清華大學(xué)出版社,2007宋春花、呂進(jìn)來等.C++面向?qū)ο蟪绦蛟O(shè)計.主要參考書譚浩強.程序設(shè)計題解與上機指導(dǎo)(三版).清華大學(xué)出版社,2005邱仲潘.C語言參考手冊.機械工業(yè)出版社,2004鄭莉.C++語言程序設(shè)計.清華大學(xué)出版社,2010方世昌.離散數(shù)學(xué).西安電子科技大學(xué)出版社,2003TOC\o"1-5"\h\z\o"CurrentDocument"前言1\o"CurrentDocument"課程設(shè)計報告要求4\o"CurrentDocument"課程設(shè)計報告示例迷宮問題5【問題描述】5【需求分析】5【概要設(shè)計】5【詳細(xì)設(shè)計】7【功能的實現(xiàn)】(用C或C++語言描述)11【實例測試及運行結(jié)果】11【實現(xiàn)提示】錯誤!未定義書簽?!居脩羰謨浴垮e誤!未定義書簽。【選作內(nèi)容】錯誤!未定義書簽。設(shè)計題目14\o"CurrentDocument"1.保齡球計分141.1問題描述141.2基本要求141.3測試數(shù)據(jù)15\o"CurrentDocument"2.文本文件單詞的檢索與計數(shù)152.1問題描述152.2設(shè)計需求及分析152.2.1串模式匹配算法的設(shè)計要求152.2.2文本文件單詞的檢索與計數(shù)的設(shè)計要求152.3設(shè)計功能的實現(xiàn)(用C或C++語言描述)162.3.1樸素模式匹配算法162.3.2給定位置的串匹配算法162.3.3建立文本文件172.3.4給定單詞的計數(shù)172.3.5檢索單詞出現(xiàn)在文本文件中的行號、次數(shù)及其位置182.3.6運行主控程序182.4【實例測試及運行結(jié)果】182.4.1運行實例一182.4.2運行實例二182.5【實現(xiàn)提示】18\o"CurrentDocument"停車場管理193.1問題描述193.2設(shè)計需求及分析193.3設(shè)計功能的實現(xiàn)(用C或C++語言描述)193.4實例測試及運行結(jié)果193.5實現(xiàn)提示19交通咨詢系統(tǒng)設(shè)計(最短路徑問題)204.1問題描述204.2設(shè)計需求及分析204.2.1建立圖的存儲結(jié)構(gòu)204.2.2單源最短路徑214.2.3任意一對頂點間最短路徑214.3設(shè)計功能的實現(xiàn)(用C或C++語言描述)224.3.1建立有向圖的存儲結(jié)構(gòu)224.3.2迪杰斯特拉算法224.3.3費洛伊德算法224.3.4運行主控程序224.4實例測試及運行結(jié)果224.4.1運行實例一224.4.2運行實例二23校園導(dǎo)游咨詢245.1問題描述245.2基本要求245.3測試數(shù)據(jù)245.4實現(xiàn)提示24\o"CurrentDocument"學(xué)生管理系統(tǒng)256.1問題描述256.2設(shè)計需求及分析256.3設(shè)計功能的實現(xiàn)(C++語言描述)256.4實例測試及運行結(jié)果366.5實現(xiàn)提示37一、課程設(shè)計報告要求課程設(shè)計要求選做任意四個題目即可。課程設(shè)計報告封面應(yīng)給出專業(yè)、班級、姓名、學(xué)號、指導(dǎo)教師和完成日期,報告開頭給出題目,內(nèi)容包括以下五項:【問題描述】簡要描述問題,然后說明程序設(shè)計的任務(wù),程序要做什么。明確規(guī)定以下內(nèi)容:(1)輸入的形式和輸入值的范圍;(2)輸出的形式;(3)程序所能達(dá)到的功能;(4)測試數(shù)據(jù):包括正確的輸入及其輸出結(jié)果和含有錯誤的輸入及其輸出結(jié)果?!締栴}分析與設(shè)計】分析問題,簡述解決的思想或方法,說明本程序中用到的所有抽象數(shù)據(jù)類型的定義、主程序的流程以及各程序模塊之間的層次(調(diào)用)關(guān)系。實現(xiàn)設(shè)計中定義的所有數(shù)據(jù)類型,對每個操作寫出偽碼算法;對主程序和其他模塊也寫出偽碼算法(偽碼算法的詳細(xì)程度為按照偽碼算法可以在計算機鍵盤直接輸入高級程序設(shè)計語言程序);畫出函數(shù)的調(diào)用關(guān)系圖。【功能實現(xiàn)】(用C或C++描述)〃說明:用C或C++實現(xiàn)代碼設(shè)計?!緦嵗郎y試及運行結(jié)果】列出測試結(jié)果,包括輸入和輸出。測試數(shù)據(jù)應(yīng)該完整、嚴(yán)格。測試分析內(nèi)容包括:(1)測試過程中遇到的問題是如何解決的以及對設(shè)計與實現(xiàn)的回顧討論與分析;(2)算法的時空分析和改進(jìn)設(shè)想;(3)經(jīng)驗和體會?!拘牡皿w會】談?wù)勗谠O(shè)計和調(diào)試過程中的收獲。課程設(shè)計報告示例一一迷宮問題(參考)專業(yè):班級:姓名:學(xué)號:完成日期:【問題描述】編制一個求解迷宮通路的程序。以一個m*n的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設(shè)計一個程序,對任意設(shè)定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結(jié)論。首先實現(xiàn)一個以鏈表作存儲結(jié)構(gòu)的棧類型,然后編寫一個求解迷宮的非遞歸程序。求得的通路以三元組(i,j,d)的形式輸出,其中:(i,j)指示迷宮中的一個坐標(biāo),d表示走到下一坐標(biāo)的方向。如:對于下列數(shù)據(jù)的迷宮,輸出的一條通路為:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2)......【問題分析與設(shè)計】一、問題分析(1)以二維數(shù)組MAZE[M+2][N+2]表示迷宮,其中:MAZE[0][J]和MAZE[M+1][J](0<J<N+1)及MAZE[I][0]和MAZE[I][N+1](0<I<M+1)為添加的一圈障礙。數(shù)組中以元素值為0表示通路,1表示障礙。限定迷宮的大小M,N<10。(2)用戶以文件的形式輸入迷宮的數(shù)據(jù):文件中第一行的數(shù)據(jù)為迷宮的行數(shù)M和列數(shù)N;從第2行至第M+1行(每行N個數(shù))為迷宮值,同一行中的兩個數(shù)字之間用空白字符相隔。(3)迷宮的入口位置和出口位置可由用戶隨時設(shè)定。(4)若設(shè)定的迷宮存在通路,則以長方陣形式將迷宮及其通路輸出到標(biāo)準(zhǔn)輸出文件(即終端)上,其中,字符#'表示障礙,字符“*”表示路徑上的位置,字符“@”表示“死胡同”,即曾經(jīng)經(jīng)過但不能到達(dá)出口的位置,其余用空格符表示。若設(shè)定的迷宮不存在通路,則報告相應(yīng)信息。(5)本程序只求出一條成功的通路。然而,只需要對迷宮求解的函數(shù)作小量修改,便可求得全部路徑。(6)程序執(zhí)行的命令為:1)創(chuàng)建迷宮;2)求解迷宮;3)輸出迷宮的解。二、概要設(shè)計1.設(shè)定棧的抽象數(shù)據(jù)類型定義為:ADTstack(數(shù)據(jù)對象:D={ai|aiEcharset,i=1,2,,n,n>0)數(shù)據(jù)關(guān)系:R1={<ai-1,ai>|ai-1,aiED,i=2......,n}基本操作:InitStack(&S)操作結(jié)果:構(gòu)造一個空棧S。DestroyStack(&S)初始條件:棧S已存在。操作結(jié)果:銷毀棧S。ClearStack(&S)初始條件:棧S已存在。操作結(jié)果:將S清為空棧。StackLength(&S)初始條件:棧S已存在。操作結(jié)果:返回棧S的長度。StackEmpty(&S)初始條件:棧S已存在。操作結(jié)果:若S為空棧,則返回TRUE,否則返回FALSEoGetTop(S,&e)初始條件:棧S已存在。操作結(jié)果:若棧S不空,則以e返回棧頂元素。Push(&S,e)初始條件:棧S已存在。操作結(jié)果:在棧S的棧頂插入新的棧頂元素eoPop(&S,&e)初始條件:棧S已存在。操作結(jié)果:刪除S的棧頂元素,并以e返回其值。StackTraverse(S,visit())初始條件:棧S已存在。操作結(jié)果:從棧底到棧頂依次對S中的每個元素調(diào)用函數(shù)visit().}ADTstack設(shè)定迷宮的抽象數(shù)據(jù)類型為:ADTmaze(數(shù)據(jù)對象:D={a.,」a,E{?'、?#'、?@'、?*'},0<i<m+1,0<j<n+1,m,n<10)ij]j數(shù)據(jù)關(guān)系:R={ROW,COL}TOC\o"1-5"\h\zROW={<a.”.,a,>|a.,a.ED,i=1,,m+1,j=0,,n+1}i-1jiji-1ji,jCOL={<ai,j1,aij>|aij1,aijED,i=0,……,m+1,j=1,……,n+1}基本操作:’’’InitMaze(&M,a,row,col)初始條件:二維數(shù)組a[row+2][col+2]已存在,其中自第1行至第row+1行、每行中自第1列至第col+1列的元素已有值,并且以值0表示通路,以值1表示障礙。操作結(jié)果:構(gòu)成迷宮的字符型數(shù)組,以空白字符表示通路,以字符'#'表示障礙,并在迷宮四周加上一圈障礙。MazePath(&M)初始條件:迷宮M已被賦值。操作結(jié)果:若迷宮M中存在一條通路,則按如下規(guī)定改變迷宮M的狀態(tài):以字符“*”表示路徑上的位置,字符“@”表示“死胡同”;否則迷宮的狀態(tài)不變。PrintMaze(M)初始條件:迷宮M已存在。操作結(jié)果:以字符形式輸出迷宮。}ADTmaze;本程序包含三個模塊voidmain()(初始化do{接受命令;處理命令;}while(命令!=“退出”);}2)棧模塊----實現(xiàn)棧抽象數(shù)據(jù)類型3)迷宮模塊----實現(xiàn)迷宮抽象數(shù)據(jù)類型各模塊之間的調(diào)用關(guān)系如下:主程序模塊迷宮模塊棧模塊求解迷宮中一條通路的偽碼算法:設(shè)定當(dāng)前位置的初值為入口位置;do{若當(dāng)前位置可通,則{將當(dāng)前位置插入棧頂;〃納入路徑若該位置是出口位置,則結(jié)束;〃求得路徑存放在棧中否則切換當(dāng)前位置的東鄰方塊為新的當(dāng)前位置;}否則{若棧不空且棧位置尚有其他方向未被探索,則設(shè)定新的當(dāng)前位置為沿順時針方向旋轉(zhuǎn)找到的棧頂位置的下一相鄰塊;若棧不空但棧頂位置的四周均不可通,貝9{刪去棧頂位置;//后退一步,從路徑中刪去該通道塊,若棧不空,則重新測試新的棧頂位置,直到找到一個可通的相鄰塊或出棧至???;}}}while(棧不空);{棧空說明沒有路徑存在}三、詳細(xì)設(shè)計坐標(biāo)位置類型typedefstruct{intr,c;〃迷宮中行、列的范圍}PosType;

迷宮類型typedefstruct(intm,n;chararr[RANGE][RANGE];//各位置取值’',?#',?@'或*}MazeType;voidInitMaze(MazeType&maze,inta[][],introw,intcol)//按照用戶輸入的row行和col列的二維數(shù)組(元素值為0或1)〃設(shè)置迷宮的初值,包括加上邊緣一圈的值boolMazePath(MazeType&maze,PosTypestart,PosTypeend)//求解迷宮maze中,從入口start到出口end的一條路徑//若存在,則返回TRUE;否則返回FALSEvoidPrintMaze(MazeTypemaze)//將迷宮以字符型方陣的形式輸出到標(biāo)準(zhǔn)輸出文件上3.棧類型〃當(dāng)前位置在路徑上的“序號”〃當(dāng)前的坐標(biāo)位置//往下一坐標(biāo)位置的方向〃棧的元素類型typedefstruct(intstep;PosTypeseat;directiveTypedi;}ElemType;typedefstructNodeType(ElemTypedata;NodeType*next;}NodeType,*LinkType;/結(jié)點類型,指針類型typedefstruct(LinkType〃當(dāng)前位置在路徑上的“序號”〃當(dāng)前的坐標(biāo)位置//往下一坐標(biāo)位置的方向〃棧的元素類型voidInitStack(Stack&S)//初始化,設(shè)S為空棧(S.top=NULL)voidDestroyStack(stack&S)〃銷毀棧S,并釋放所占空間voidClearStack(Stack&S)//將S清為空棧intstackLength(StackS)//返回棧S的長度S.sizeStatusStackEmpty(StackS)//若S為空棧(S.top==NULL),則返回TRUE;否則返回FALSEStatusGetTop(Stacks,ElemTypee)//若棧S不空,則以e帶回棧頂元素并返回TRUE,否則返回FALSE;StatusPush(Stack&S,ElemTypee)//若分配空間成功,則在S的棧頂插入新的棧頂元素e,并返回TRUE,〃否則棧不變,并返回FALSEStatusPop(Stack&S,ElemType&e)//若棧不空,則刪除S的棧頂元素并以e帶回其值,且返回TRUE〃否則返回FALSEvoidStackTraverse(Stacks,Status(*visit)(ElemTypee))〃從棧底到棧頂依次對S中的每個結(jié)點調(diào)用函數(shù)visit其中部分操作的算法:StatusPush(Stack&S,ElemTypee){//若分配空間成功,則在S的棧頂插入新的棧頂元素e,并返回TRUE;〃否則棧不變,并返回FALSEif(MakeNode(p,e)){p->next=s.top;s.top=p;s.size++;returnTRUE;}elsereturnFALSE;}StatusPop(Stack&S,ElemType&e){//若棧不空,則刪除S的棧頂元素并以e帶回其值,且返回TRUE,〃否則返回FALSE,且e無意義if(StackEmpty(S))returnFALSE;else{p=S.top;S.top=S.top->next;e=p->date;S.size--;returnTRUE;}}求迷宮路徑的偽碼算法:StatusMazePath(MazeTypemaze,PosTypestart,PosTypeend){//若迷宮中存在從入口start到出口end的通道,則求得一條存入在棧中//(從棧底到棧頂為從入口到出口的路徑),并返回TRUE;否則返回FALSEInitStack(S);curpos=start;〃設(shè)定“當(dāng)前位置”為“入口位置”curstep=1;found=FALSE;//探索第一步do{if(Pass(maze,curpos)){〃當(dāng)前位置可以通過,即是未曾走到過的通道塊留下足跡FootPrint(maze,curpos);e=(curstep,curpos,1);Push(S,e);〃加入路徑if(Same(curpos,end))found=TRUE;〃到達(dá)終點(出口)else{curpos=NextPos(curpos,1);〃下一位置是當(dāng)前位置的東鄰curstep++;//探索下一步}//else}//ifelse〃當(dāng)前位置不能通過if(!StackEmpty(S)){Pop(S,e);while(e.di==4&&!StackEmpty(S)){MarkPrint(maze,e,seat);Pop(S,e);curstep--;〃留下不能通過的標(biāo)記,并退回一步}//whileif(e.di<4){e.di++;Push(S.e);〃換下一個方向探索curpos=NextPos(e.seat,e.di);〃設(shè)定當(dāng)前位置是該新方向上的相鄰塊}//if}//if}while(!StackEmpty(S)&&!found);returnfound;}//MazePath主函數(shù)和其他函數(shù)的偽碼算法voidmain(){//主程序Initialization();//初始化do{ReadCommand(cmd);//讀入一個操作命令符Interpret(cmd);//解釋執(zhí)行操作命令符}while(cmd!=?q'&&cmd!=?Q');}//mainvoidInitialization(){//系統(tǒng)初始化clrscr();//清屏在屏幕上方顯示操作命令清單:CreatMaze—cMazePath—mPrintMaze—pQuit—q;在屏幕下方顯示操作命令提示框:}//InitializationvoidReadCommand(char&cmd){〃讀入操作命令符顯示鍵入操作命令符的提示信息;do{cmd=getche()}while(cmd[?c',?C',?m、M、p,,?P、q、Q,]);}//ReadCommandvoidInterpret(charcmd){//解釋執(zhí)行操作命令switch(cmd){case?c','C':提示用戶輸入“迷宮數(shù)據(jù)的文件名filename”;從文件讀入數(shù)據(jù)分別存儲在rnum,cnum和二維數(shù)組a2中;InitMaze(ma,a2,rnum,cnum);//倉U建迷宮輸出迷宮建立完畢的信息break;

casetm,,?M,:提示用戶輸入迷宮的入口from和出口term的坐標(biāo)位置;if(MazePath(ma,from,term))//存在路徑提示用戶察看迷宮;else輸出該迷宮沒有從給定的入口到出口的路徑的信息;break;InitStackPushPopStackEmptyStackTseFootPrintMarkPrintPassNextPosSamecase?p,,?P,:PrintMaze(ma)://InitStackPushPopStackEmptyStackTseFootPrintMarkPrintPassNextPosSameInitialization主程序vjReadCommandInterPretv'IInitMazeMazePathPrintMaze【功能實現(xiàn)】(用C或C++語言描述)說明:此內(nèi)容由學(xué)生自己設(shè)計完成。附錄:源程序文件名清單:base.H〃公用的常量和類型stkpas.H〃棧類型maze.H//迷宮類型testmaze.C〃主程序【實例測試及運行結(jié)果】迷宮的測試數(shù)據(jù)如下:左上角(1,1)為入口,右下角(9,8)為出口。

001000001000100000011100010100011111001100001000101101001000000101100101010000提示:當(dāng)入口位置為(1,1),出口位置為(9,8)時,輸出數(shù)據(jù)應(yīng)為:**#@@@#*#@@@#**@@###*####@***#***@#***#*#####*####*###**測試結(jié)果示例:三組測試數(shù)據(jù)和輸出結(jié)果分別如下:1.輸入文件名為:m1.dat,其中迷宮數(shù)據(jù)為:32000000入口位置:11出口位置:32求解路徑后輸出的迷宮:輸入文件名:m2.dat,其中迷宮數(shù)據(jù)為:34000000110000入口位置:11出口位置:34求解路徑后輸出的迷宮:**@@*##***輸入文件名:m3.dat,其中迷宮數(shù)據(jù)同題目中的測試數(shù)據(jù)。入口位置:11出口位置:98求解路徑后輸出的迷宮正確,并和需求分析中所列相同。輸入文件名:m4.dat,其中迷宮數(shù)據(jù)為:49000000100010001000001110011001110100入口位置:11出口位置:49輸出信息為:此迷宮從入口到出口沒有路徑。【心得體會】本次作業(yè)比較簡單,只有一個核心算法,即求迷宮的路徑,所以總的調(diào)試比較順利,只在調(diào)試MazePath算法時,遇到兩個問題:其一是,起初輸出的迷宮中沒有加上?@'的記號,后發(fā)現(xiàn)是因為在MarkPrint函數(shù)中的迷宮參數(shù)丟失“變參”的原因;其二是,由于回退時沒有將curpos隨之減一,致使棧中路徑上的序號有錯。棧的元素中的step域沒有太多用處,可以省略。StackTraverse在調(diào)試過程中很有用,它可以插入在MazePath算法中多處,以察看解迷宮過程中走的路徑是否正確,但對最后的執(zhí)行版本沒有用。本題中三個主要算法:InitMaze,MazePath和PrintMaze的時間復(fù)雜度均為0(m*n),本題的空間復(fù)雜度亦為0(m*n)(棧所占最大空間)經(jīng)驗體會:借助DEBUG調(diào)試器和數(shù)據(jù)觀察窗口,可以加快找到程序中疵點。設(shè)計題目(6選4)1.保齡球計分1.1問題描述打保齡球是用一個滾球去撞擊10個站立的瓶,將瓶擊倒。一局分10輪,每輪可滾球1次或2次,以擊到的瓶數(shù)為依據(jù)計分。一局得分為10輪得分之和,而每輪的得分不僅與本輪的滾球情況有關(guān),還可能與后一輪或后兩輪的滾球情況有關(guān),即:某輪某次滾球擊倒的瓶數(shù)不僅要計入本輪得分,還可能會計入前一輪或兩輪得分。計分規(guī)則如下:若某一輪的第一次滾球就擊倒全部10個瓶,則本輪不再滾球(若是第十輪還需加2次滾球),該輪得分為本次擊倒瓶數(shù)10與以后2次滾球所擊倒瓶數(shù)之和;若某一輪的第一次滾球未擊倒全部10個瓶,則對剩下未倒的瓶再滾球一次,如果這2次滾球擊倒全部10個瓶,則本輪不再滾球(若是第十輪還需加1次滾球),該輪得分為這2次擊倒瓶數(shù)10與以后1次滾球所擊倒瓶數(shù)之和;若某一輪2次滾球未擊倒全部10個瓶,則本輪不在滾球,該輪得分為這2次滾球所擊倒瓶數(shù)之和。1.2基本要求模擬1人打保齡球的過程,用一個二維數(shù)組:intx[11][4];存儲每輪每次擊倒的瓶數(shù)和得分以及累計得分。即:i行中的4個元素x[i][0]、x[i][1]、x[i][2]、x[i][3]分別記錄第i輪的第1次滾球擊倒的瓶數(shù)、第2次滾球擊倒的瓶數(shù)、本輪得分和累計得分;輸入每輪每次滾球擊倒的瓶數(shù),若第1次滾球擊倒的瓶數(shù)為10,則該輪只輸入1次數(shù)據(jù);輸出每輪每次擊倒的瓶數(shù)和得分以及累計得分;例如:一二三四五六七八九十8107991010891082021100110220199192028199202020394867871151341431631831.3測試數(shù)據(jù)如上所示。【注】①鼓勵采用屏幕繪圖模擬打球過程;②思考:模擬N人打保齡球的過程。2.文本文件單詞的檢索與計數(shù)2.1問題描述串是非數(shù)值處理中的主要對象,如在信息檢索、文本編輯、符號處理等許多領(lǐng)域,得到越來越廣泛的應(yīng)用。在高級語言中也引入了串?dāng)?shù)據(jù)類型概念,并且串變量與其他變量(如整型、實型等)一樣,可以進(jìn)行各種運算。然而,在各種不同類型的應(yīng)用中,所處理的串有不同的特點,要想有效地實現(xiàn)串的處理,就必須熟悉串的存儲結(jié)構(gòu)及其基本運算。本課程設(shè)計的目的就是熟悉串類型的實現(xiàn)方法和文本模式匹配方法,熟悉如何利用模式匹配算法實現(xiàn)一般的文本處理技術(shù)。本課程設(shè)計分兩步:首先,設(shè)計出串定位算法(即模式匹配算法)及其實現(xiàn);然后,再利用串定位算法設(shè)計文本文件的檢索及單詞的計數(shù)等操作。2.2設(shè)計需求及分析2.2.1串模式匹配算法的設(shè)計要求在串的基本操作中,在主串中查找模式串的模式匹配算法一一即求子串位置的函數(shù)Index(S,T),是文本處理中最常用、最重要的操作之一。所謂子串的定位就是求子串在主串中首次出現(xiàn)的位置,又稱為模式匹配或串匹配。模式匹配的算法很多,在這里只要求用最簡單的樸素模式匹配算法。該算法的基本思路是將給定子串與主串從第一個字符開始比較,找到首次與子串完全匹配的子串為止,并記住該位置。但為了實現(xiàn)統(tǒng)計子串出現(xiàn)的個數(shù),不僅需要從主串的第一個字符位置開始比較,而且需要從主串的任一給定位置檢索匹配字符串,所以,首先要給出兩個算法:1.標(biāo)準(zhǔn)的樸素模式匹配算法給定位置的匹配算法2.2.2文本文件單詞的檢索與計數(shù)的設(shè)計要求要求編程建立一個文本文件,每個單詞不包含空格且不跨行,單詞由字符序列構(gòu)成且區(qū)分大小寫;統(tǒng)計給定單詞在文本文件中出現(xiàn)的總次數(shù);檢索輸出某個單詞出現(xiàn)在文本中的行號、在該行中出現(xiàn)的次數(shù)以及位置。該設(shè)計要求可分為三個部分實現(xiàn):其一,建立文本文件,文件名由用戶用鍵盤輸入;其二,給定單詞的計數(shù),輸入一個不含空格的單詞,統(tǒng)計輸出該單詞在文本中的出現(xiàn)次數(shù);其三,檢索給定單詞,輸入一個單詞,檢索并輸出該單詞所在的行號、該行中出現(xiàn)的次數(shù)以及在該行中的相應(yīng)位置。建立文本文件給定單詞的計數(shù)檢索單詞出現(xiàn)在文本文件中的行號、次數(shù)及其位置主控菜單程序的結(jié)構(gòu)2.3設(shè)計功能的實現(xiàn)(用C或C++語言描述)〃說明:要求由學(xué)生來完成代碼的編寫。2.3.1樸素模式匹配算法該算法的基本思想是:設(shè)有三個指針一一i,j,k,用i指示主串S每次開始比較的位置;指針j,k分別指示主串S和模式串T中當(dāng)前正在等待比較的字符位置;一開始從主串S的第一個字符(i=0;j=1)和模式T的第一個字符(k=0)比較,若相等,則繼續(xù)逐個比較后續(xù)字符(j++,k++)。否則從主串的下一個字符(i++)起再重新和模式串(j=0)的字符開始比較。依此類推,直到模式T中的所有字符都比較完,而且一直相等,則稱匹配成功,并返回位置i;否則返回-1,表示匹配失敗。順序串的模式匹配算法如下:intindex(SStringS,SStringT){〃求子串T在主串S中首次出現(xiàn)的位置inti,j,k,m,n;m=T.length;//模式串長度賦mn=S.length;//目標(biāo)串長度賦nfor(i=0;i<=n-m;i++){j=0;k=i;//目標(biāo)串起始位置i送入kwhile(j<=m&&s.ch[k]==t.ch[j]){k++;j++;}〃繼續(xù)下一個字符的比較if(j==m)〃若相等,則說明找到匹配的子串,返回匹配位置i,//否則從下一個位置重新開始比較returni;}//endforreturn-1;}//endIndex2.3.2給定位置的串匹配算法該算法要求從串S1(為順序存儲結(jié)構(gòu))中第k個字符起,求出首次與字符串S2相同的子串的起始位置。該算法與上面介紹的模式匹配算法類似,只不過上述算法的要求是從主串的第一個字符開始,該算法是上述算法的另一種思路:從第k個元素開始掃描S1,當(dāng)其元素值與S2的第一個元素的值相同時,判定它們之后的元素值是否依次相同,直到S2結(jié)束為止。若都相同,則返回當(dāng)前位置值;否則繼續(xù)上述過程,直至S1掃描完為止,其實現(xiàn)算法如下:IntPartPosition(SStringS1,SStringS2,intk){inti,j;i=k-1;〃掃描si的下標(biāo),因為c中數(shù)組下標(biāo)是從0開始,串中序號相差1j=0;〃掃描s2的開始下標(biāo)while(i<s1.length&&j<s2.length)if(s1.ch[i]==s2.ch[j]){i++;j++;〃繼續(xù)使下標(biāo)移向下一個字符位置}else{i=i-j+1;j=0;//使i下標(biāo)回溯到原位置的下一個位置,使j指向s2的第一個字符,再重新比較}if(j>=s2.length)returni-s2.length;//表示s1中存在s2,返回其起始位置elsereturn-1;//表示s1中不存在s2,返回-1}〃函數(shù)結(jié)束~~說明:以上兩個算法可統(tǒng)一為一個算法,即在子串定位算法Index(S,T)的參數(shù)中增加一個起始位置參數(shù)即可。2.3.3建立文本文件建立文件的實現(xiàn)思路是:(1)定義一個串變量;(2)定義文本文件;(3)輸入文件名,打開該文件;(4)循環(huán)讀入文本行,寫入文本文件,其過程如下:While(不是文件輸入結(jié)束){讀入一文本行至串變量;串變量寫入文件;輸入是否結(jié)束輸入標(biāo)志;}(5)關(guān)閉文件。2.3.4給定單詞的計數(shù)該功能需要用到前一節(jié)中設(shè)計的模式匹配算法,逐行掃描文本文件。匹配一個,計數(shù)器加1,直到整個文件掃描結(jié)束;然后輸出單詞出現(xiàn)的次數(shù)。其實現(xiàn)過程如下:(1)輸入要檢索的文本文件名,打開相應(yīng)的文件;(2)輸入要檢索統(tǒng)計的單詞;(3)循環(huán)讀文本文件,讀入一行,將其送入定義好的串中,并求該串的實際長度,調(diào)用串匹配函數(shù)進(jìn)行計數(shù)。具體描述如下:While(不是文件結(jié)束){讀入一行并到串中;求出串長度;模式匹配函數(shù)計數(shù);}(4)關(guān)閉文件,輸出統(tǒng)計結(jié)果。2.3.5檢索單詞出現(xiàn)在文本文件中的行號、次數(shù)及其位置這個設(shè)計要求與上一個類似,但要相對復(fù)雜一些。其實現(xiàn)過程描述如下:(1)輸入要檢索的文本文件名,打開相應(yīng)的文件;(2)輸入要檢索統(tǒng)計的單詞;(3)行計數(shù)器置初值0;(4)while(不是文件結(jié)束){讀入一行到指定串中;求出串長度;行單詞計數(shù)器置0;調(diào)用模式匹配函數(shù)匹配單詞定位、該行匹配單詞計數(shù);行號計數(shù)器加1;If(行單詞計數(shù)器!=0)輸出行號、該行有匹配單詞的個數(shù)以及相應(yīng)的位置;}2.3.6運行主控程序主控菜單程序的結(jié)構(gòu)要求內(nèi)容如下:(1)頭文件包含;(2)菜單選項包括:1.建立文件單詞計數(shù)單詞定位退出程序(3)選擇1——4執(zhí)行相應(yīng)的操作,其他字符為非法。2.4【實例測試及運行結(jié)果】2.4.1運行實例一(說明:由學(xué)生自己來給出)2.4.2運行實例二(說明:由學(xué)生自己來給出)2.5【實現(xiàn)提示】(說明:由學(xué)生自己來補充)3.停車場管理3.1問題描述設(shè)停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進(jìn)出。汽車在停車場內(nèi)按車輛到達(dá)時間的先后順序,依次由北向南排列(大門在最南端,最先到達(dá)的第一輛車停放在停車場的最北端),若停車場內(nèi)已停滿n輛汽車,則后來的汽車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當(dāng)停車場內(nèi)某輛車要離開時,在它之后進(jìn)入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進(jìn)入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進(jìn)行管理的模擬程序。3.2設(shè)計需求及分析以棧模擬停車場,以隊列模擬車場外的便道,按照從終端讀入的輸入數(shù)據(jù)序列進(jìn)行模擬管理。每一組輸入數(shù)據(jù)包括三個數(shù)據(jù)項:汽車“到達(dá)”或“離去”信息、汽車牌照號碼以及到達(dá)或離去的時刻。對每一組輸入數(shù)據(jù)進(jìn)行操作后的輸出信息為:若是車輛到達(dá),則輸出汽車在停車場內(nèi)或便道上的停車位置;若是車輛離去,則輸出汽車在停車場內(nèi)停留的時間和應(yīng)交納的費用(在便道上停留的時間不收費)。棧以順序結(jié)構(gòu)實現(xiàn),隊列以鏈表結(jié)構(gòu)實現(xiàn)。3.3設(shè)計功能的實現(xiàn)(用C或C++語言描述)〃說明:此內(nèi)容由學(xué)生自己設(shè)計完成。3.4實例測試及運行結(jié)果設(shè)n=2,輸入數(shù)據(jù)為:(?A',1,5),(?A',2,10),(?D',1,15),(?A',3,20),(?A',4,25),(?A'5,30),(?D,,2,35),(?D',4,40),(?E',0,0)。其中:,A表示到達(dá)(arrival);?D'表示離去(departure);?E'表示輸入結(jié)束(end)。3.5實現(xiàn)提示需另設(shè)一個棧,臨時停放為給要離去的汽車讓路而從停車場退出來的汽車,也用順序存儲結(jié)構(gòu)實現(xiàn)。輸入數(shù)據(jù)按到達(dá)或離去的時刻有序。棧中每個元素表示一輛汽車,包含兩個數(shù)據(jù)項:汽車的牌照號碼和進(jìn)入停車場的時刻?!ㄕf明:要求由學(xué)生來補充。

交通咨詢系統(tǒng)設(shè)計(最短路徑問題)4.1問題描述在交通網(wǎng)絡(luò)非常發(fā)達(dá),交通工具和交通方式不斷更新的今天,人們在出差、旅游或做其他出行時,不僅關(guān)心節(jié)省交通費用,而且對里程和所需要的時間等問題也感興趣。對于這樣一個人們關(guān)心的問題,可用一個圖結(jié)構(gòu)來表示交通網(wǎng)絡(luò)系統(tǒng),利用計算機建立一個交通咨詢系統(tǒng)。圖中的頂點表示城市,邊表示城市之間的交通關(guān)系。這個交通系統(tǒng)可以回答出行旅客提出的各種路徑選擇問題。例如,問題之一:“一位旅客要從A城到B城,他希望選擇一條途中中轉(zhuǎn)次數(shù)最少的路線。”假設(shè)圖中每一站都需要換車,那么這個問題反映到圖上就是要找一條從頂點A到頂點B的所含邊數(shù)目最少的路徑。我們只需要從頂點A出發(fā)對圖作廣度優(yōu)先搜索,一旦遇到頂點B就終止。由此所得廣度優(yōu)先生成樹上,從根頂點A到頂點B的路徑就是中轉(zhuǎn)次數(shù)最少的路徑。路徑上A與B之間的頂點就是路徑的中轉(zhuǎn)站,但這只是一類最簡單的圖的最短路徑問題。系統(tǒng)還可以回答諸如此類的等等的路徑選擇問題。設(shè)計一個交通咨詢系統(tǒng),為出差、旅游或做其他出行的客人提供各種路徑選擇信息查詢服務(wù)。4.2設(shè)計需求及分析設(shè)計一個交通咨詢系統(tǒng),能讓旅客咨詢從任一個城市頂點到另一城市頂點之間的最短路徑(里程)或最低花費或最少時間等問題。對于不同的咨詢要求,可輸入城市間的路程或所需時間或所m需費用。本設(shè)計共分三部分,一是建立交通網(wǎng)絡(luò)圖的存儲結(jié)構(gòu);二是解決單源最短路徑問題;三是實現(xiàn)任兩個城市頂點之間的最短路徑問題。4.2.1建立圖的存儲結(jié)構(gòu)圖的鄰接矩陣是定義如下的n階方陣:,V。鄰接矩陣是表示圖形中頂點之間相鄰關(guān)系的矩陣。設(shè)G=(V,E)是一個圖,結(jié)點集為V="1,V2,[(w),當(dāng)(u,v)或<圖的鄰接矩陣是定義如下的n階方陣:,V。G的鄰接矩陣A=(%)噸=JijG的鄰接矩陣A=(%)噸j[?;?,當(dāng)(v,v)或<v,v>任Eijij當(dāng)鄰接矩陣的行表頭、列表頭順序一定時,一個圖的鄰接矩陣表示是唯一的。圖的鄰接矩陣表示,除了需用一個二維數(shù)組存儲頂點之間的相鄰關(guān)系的鄰接矩陣外,通常還需要使用一個具有n個元素的一維數(shù)組來存儲頂點信息,其中下標(biāo)為i的元素存儲頂點i的信息。因此,圖的鄰接矩陣的存儲結(jié)構(gòu)定義如下:#definfMVNum50〃最大頂點數(shù)typedefstruct{VertexTypevexs[MVNum];〃頂點數(shù)組,類型假定為char型Adjmatrixarcs[MVNum][MVNum];〃鄰接矩陣,假定為int型}MGraph;4.2.2單源最短路徑最短路徑的提法很多。在這里先討論單源最短路徑問題:即已知有向圖(帶權(quán))我們希望找出從某個源點SGV到G中其余各頂點的最短路徑。為了敘述方便,我們把路徑上的開始點稱為源點,路徑的最后一個頂點為終點。那么,如何求得給定有向圖的單源最短路徑呢?迪杰斯特拉(Dijkstra)提出按路徑長度遞增產(chǎn)生諸點的最短路徑算法,稱之為迪杰斯特拉算法。迪杰斯特拉算法求最短路徑的實現(xiàn)思想是:設(shè)G=(V,E)是一個有向圖,結(jié)點集為,V={v,v,...,v},cost是表示G的鄰接矩陣,cost[i][j]表示有向邊<i,j>的權(quán)。若不存在有向邊12n<i,j>,則cost[i][j]的權(quán)為無窮大(這里取值為32767)。設(shè)S是一個集合,其中的每個元素表示一個頂點,從源點到這些頂點的最短距離已經(jīng)求出。設(shè)頂點v1為源點,集合S的初態(tài)只包含一個元素,即頂點v1。數(shù)組dist記錄從源點到其他頂點當(dāng)前的最短距離,其初值為dist[i]=cost[v1][i],i=1,2,,n。從S之外的頂點集合V-S中選出一個頂點w,使dist[w]的值最小。于是從源點到達(dá)w只通過S中頂點,把w加入集合S中,調(diào)整dist中記錄的從源點到V-S中每個頂點v的距離:從原來的dist[v]和dist[w]+cost[w][v]中選擇較小的值作為新的dist[v]。重復(fù)上述過程,直到V-S為空。最終結(jié)果是:S記錄了從源點到該頂點存在最短路徑的頂點集合,數(shù)組dist記錄了源點到V中其余各頂點之間的最短路徑,path是最短路徑的路徑數(shù)組,其中path[i]表示從源點到頂點i之間的最短路徑的前驅(qū)頂點。因此,迪杰斯特拉算法可用自然語言描述如下:初始化S和D,置空最短路徑終點集,置初始的最短路徑值;S[v1]=TRUE;D[v1]=0;//S集初始時只有源點,源點到源點的距離為0;While(S集中頂點數(shù)<n){開始循環(huán),每次求得v1到某個v頂點的最短路徑,并加v到S集中;S[v]=TRUE;更新當(dāng)前最短路徑及距離;}4.2.3任意一對頂點間最短路徑任意一對頂點間最短路徑問題,是對于給定的有向網(wǎng)絡(luò)圖G=(V,E),要對G中任意一對頂點有序?qū)Α皏,w(v豐w)”,找出v到w的最短路徑。要解決這個問題,我們可以依次把有向網(wǎng)絡(luò)圖中每個頂點作為源點,重復(fù)執(zhí)行前面討論的迪杰斯特拉算法n次,即可以求得每對頂點之間的最短路徑。這里還可以用另外一種方法,稱作費洛伊德(Floyd)算法。費洛伊德(Floyd)算法算法的基本思想是:假設(shè)求從頂點vi到v.的最短路徑。如果從vi到v.存在一條長度為arcs[i][j]的路徑,該路徑不一定是最短路徑,還需要進(jìn)行n次試探。首先考慮路徑<Vi,V]>和<V],Vj>是否存在。如果存在,則比較<v.,v.>和<v.,v1,v.>的路徑長度,取長度較短者為當(dāng)前所求得的最短路徑。該路徑是中間頂點序號不大于1的最短路徑。其次,考慮從v.到v.是否包含有頂點v2為中間頂點的路徑<".%...”,若沒有,則說明從v.到v.的當(dāng)前最短路徑就是前一步求出的;若有,那么<".%,..?'”可分解為<*..七>和<v2,...,Vj>,而這兩條路徑是前一次找到的中間頂點序號不大于1的最短路徑,將這兩條路徑長度相加就得到路徑<*..?%...,%.>的長度。將該長度與前一次中求出的從v.到v.的中間頂點序號不大于1的最短路徑比較,取其長度較短者作為當(dāng)前求得的從v.到v.的中間頂點序號不大于2的最短路徑。依此類推,直到頂點vn加入當(dāng)前從v.到v.的最短路徑后,,選出從v.到v.的中間頂點序號不大于n的最短路徑為止。由于圖G中頂點序號不大于n,所以v.到v.的中間頂點序號不大于n的最短路徑,已考慮了所有頂點作為中間頂點的可能性,因此,它就是v.到v.的最短路徑。4.3設(shè)計功能的實現(xiàn)(用C或C++語言描述)4.3.1建立有向圖的存儲結(jié)構(gòu)〃說明:要求由學(xué)生來完成代碼的編寫。4.3.2迪杰斯特拉算法〃說明:要求由學(xué)生來完成代碼的編寫。4.3.3費洛伊德算法〃說明:要求由學(xué)生來完成代碼的編寫。4.3.4運行主控程序〃說明:要求由學(xué)生來完成代碼的編寫。4.4實例測試及運行結(jié)果4.4.1運行實例一(求給定有向圖4-1的最短路徑)

圖4-1一個有向圖具體要求之一:求頂點。到其余頂點的最短路徑;分別求頂點b到頂點d之間的最短路徑、頂點a到頂點d之間的最短路徑。提示:為了操作方便,對于圖的頂點都是用序號來表示的,所以頂點的字母就用其對應(yīng)的序號來操作:如a用1來代替,......。4.4.2運行實例二(求給定有向圖4-2的最短路徑)圖4-2一個簡單的交通網(wǎng)絡(luò)圖圖4-2是一個簡單的交通網(wǎng)絡(luò)圖。具體要求之一:求頂點“北京”到其余各城市之間的最短路徑;并分別求“成都”到“上?!敝g以及“上海,,到“西安,,之間的最短路徑。提示:為了操作方便,對于圖的頂點都是用序號來表示的,所以頂點的城市名稱就用其對應(yīng)的編號來操作:如北京用1來代替,......。校園導(dǎo)游咨詢5.1問題描述設(shè)計一個校園導(dǎo)游程序,為來訪的客人提供各種信息查詢服務(wù)。5.2基本要求(1)設(shè)計你所在學(xué)校的校園平面圖,所含景點不少于10個。以圖中頂點表示校園內(nèi)各景點,存放景點名稱、代號、簡介等信息:以邊表示路徑,存放路徑長度等相關(guān)信息。(2)為來訪客人提供圖中任意景點相關(guān)信息的查詢。(3)為來訪客人提供圖中任意景點的問路查詢,即查詢?nèi)我鈨蓚€景點之間的一條最短的簡單路徑。5.3測試數(shù)據(jù)根據(jù)實際情況自定。5.4實現(xiàn)提示一般情況下,校園的道路是雙向通行的,可設(shè)校園平面圖是一個無向網(wǎng)。頂點和邊均含有相關(guān)信息。6.學(xué)生管理系統(tǒng)6.1問題描述大學(xué)里有各種類型的學(xué)生,校方需要對這些學(xué)生的信息進(jìn)行計算機管理。所開發(fā)的軟件應(yīng)包括各類學(xué)生的添加、修改、刪除和查找等功能??紤]到軟件的可重用性、可擴(kuò)展性和可維護(hù)性,校方?jīng)Q定采用面向?qū)ο蟮某绦蛟O(shè)計方法來開發(fā)系統(tǒng)。學(xué)生信息需要以文件方式保存到計算機硬盤中。另外,系統(tǒng)的用戶界面應(yīng)該盡可能友好,方便用戶使用。6.2設(shè)計需求及分析(1)使用C++語言開發(fā),充分利用面向?qū)ο蟪绦蛟O(shè)計的類、對象、繼承、封裝和多態(tài)性等(2)概念來設(shè)計和實現(xiàn)該管理系統(tǒng)。(3)設(shè)計一個Person(人員)類,考慮到通用性,只抽象出所有類型人員都具有的屬性:name(姓名),id(身份證號),gender(性別),birthday(出生日期)等等。其中“出生日期”為內(nèi)嵌子對象,是一個Date(日期)類型,Date類具有屬性:year(年),month(月),day(日)。用成員函數(shù)實現(xiàn)對人員信息的錄入和顯示等必要功能操作。(4)從Person類派生出Student(學(xué)生)類,添加屬性:studentNo(學(xué)號),schoolName(學(xué)校),classIn(班級)。從Person類派生出Teacher(教師)類,添加屬性:teacherNo(教師編號),schoolName(學(xué)校),department(部門)。(5)從Student類中派生出UnderGraduate(本科生)類,添加屬性:major(專業(yè))。從Student類中派生出Graduate(研究生)類,添加屬性:direction(研究方向),adviserName(導(dǎo)師姓名)。(6)從Graduate類和Teacher類派生出TA(助教博士生)類。(7)寫程序測試上述各類,看能否正常運行。(8)構(gòu)建必要的輔助類,實現(xiàn)對本科生、研究生和助教博士生的添加、修改、刪除、查詢管理。(9)根據(jù)需要定義類的構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、成員函數(shù)。必要時重載函數(shù)。(10)要求將Person類設(shè)置為虛基類,以消除其派生類成員訪問的二義性問題(注意在虛基類各級派生類的構(gòu)造函數(shù)實現(xiàn)時調(diào)用虛基類的構(gòu)造函數(shù))。(11)要求在Person類中定義虛函數(shù)displayDetails(),用于顯示當(dāng)前對象的信息;同時定義虛函數(shù)inputData(),用于從鍵盤獲取當(dāng)前對象的信息°Person類所有派生類也要定義同名虛函數(shù),使程序可以實現(xiàn)動態(tài)多態(tài)性。(12)用菜單方式設(shè)計主控模塊程序。(13)對程序源代碼要給出各部分的詳細(xì)注釋,這也是該題目的考核重點之一。(14)用UML語言描述系統(tǒng)用到的類及其關(guān)系。6.3設(shè)計功能的實現(xiàn)(C++語言描述)〃說明:此內(nèi)容由學(xué)生自己設(shè)計完成?!ㄒ韵麓a僅供參考。程序框架:/*************************************************Copyright(C),2010,TyutFilename:main.cppAuthor:gaobaoluVersion:1.0Date:2010.6.28Description:應(yīng)用程序主函數(shù)*************************************************/#include<cstdlib>#include<iostream>#include"date.h"#include"person.h"#include"student.h"#include"teacher.h"#include"undergraduate.h"#include"graduate.h"#include"ta.h"#include"undergraduateManager.h"usingnamespacestd;intmain(intargc,char*argv[])(intchoiceN;UndergraduateManagerunMan;cout<<********************************************************<<endl;cout<<”*|*||*|*"<<endl;cout<<"*|*|歡迎您使用學(xué)生管理系統(tǒng)|*|*"<<endl;cout<<”*|*||*|*"<<endl;cout<<********************************************************<<endl;do{cout<<"<cout<<"\n\t\t1:本科生管理";cout<<"\n\t\t2:研究生管理";cout<<"\n\t\t3.助教博士生管理";cout<<"\n\t\t0:離開";cout<<endl;cout<<"<cout<<”請選擇:"<<endl;cin>>choiceN;switch(choiceN)case1:unMan.dataManage();break;case2://break;歡迎您使用學(xué)生管理系統(tǒng)>"<<endl;>"<<endl;case3://break;default:break;}}while(choiceN!=0);cout<<"**********************************************************"<<endl;cout<<"*|*|感謝使用學(xué)生管理系統(tǒng)|*|*"<<endl;cout<<"**********************************************************\a"<<endl;}/*************************************************Copyright(C),2010,TyutFilename:undergraduateManager.hAuthor:gaobaoluVersion:1.0Date:2010.6.28Description:本科生管理類*************************************************/#ifndefUNDERGRADUATEMANAGERH#defineUNDERGRADUATE_MANAGER_H#include<iostream>#include<string>#include<fstream>#include"undergraduate.h"usingnamespacestd;/*DefineaClass:UndergraduateManager本科生管理類*/classUndergraduateManager{private:inttop;〃記錄指針Undergraduateundergraduates[100];//本科生記錄public:UndergraduateManager。;//構(gòu)造函數(shù),將Undergraduate.txt讀到undergraduates[]中intqueryByNo(stringsno);//按本科生號查找//找到:返回數(shù)組下標(biāo)〃沒找到:返回-1voidclearStudent();〃刪除所有本科生信息intaddStudent(Undergraduates);//添加本科生,需要先查找是否存在intmodifyStudent(stringsno);//修改學(xué)生信息,需要先查找是否存在intdeleteStudent(stringsno);//刪除本科生,刪除前先查找其是否存在intqueryStudent(stringsno);//查找本科生,查到則顯示,否則提示未查到voiddisplayAll();//輸出所有本科生信息voiddataManage();//本科生庫維護(hù)voiddataSave();voiddataRead();?UndergraduateManager。;//析構(gòu)函數(shù),將undergraduates[]寫入Undergraduate.txt文件中};〃構(gòu)造函數(shù),將Undergraduate.txt讀到undergraduates[]中UndergraduateManager::UndergraduateManager(){dataRead();}//按本科生號查找//找到:返回數(shù)組下標(biāo)//沒找到:返回-1intUndergraduateManager::queryByNo(stringsno){for(inti=0;i<=top;i++)if(undergraduates[i].getStudentNo()==sno)returni;return-1;}〃刪除所有本科生信息voidUndergraduateManager::clearStudent(){top=-1;}//添加本科生,需要先查找是否存在intUndergraduateManager::addStudent(Undergraduates){intp=queryByNo(s.getStudentNo());if(p==-1){top++;undergraduates[top]=s;dataSave();//保存return1;}else{cout<<">此學(xué)生已經(jīng)存在!<"vvendlvvendl;return0;}}//修改科生,刪除前先查找其是否存在intUndergraduateManager::modifyStudent(stringsno){intp=queryByNo(sno);if(p==-1){cout<<">此學(xué)生不存在!<"vvendlvvendl;return0;}else{cout<<”請輸入該生的新信息:"<<endl<<endl;undergraduates[p].inputData();dataSave();//保存return1;}}〃刪除本科生,刪除前先查找其是否存在intUndergraduateManager::deleteStudent(stringsno){intp=queryByNo(sno);if(p==-1){cout<<">此學(xué)生不存在!<"<<endl<<endl;return0;}else{for(inti=p;i<top;i++)undergraduates[i]=undergraduates[i+1];top--;cout<<">刪除完成!<"<<endl<<endl;dataSave();//保存return1;}}//查找科生intUndergraduateManager::queryStudent(stringsno){intp=queryByNo(sno);if(p==-1){cout<<">此學(xué)生不存在!<"<<endl<<endl;return0;}else{cout<<">此學(xué)生存在:<"<<endl<<endl;undergraduates[p].displayDetails();return1;〃輸出所有本科生信息voidUndergraduateManager::displayAll()(for(inti=0;i<=top;i++){cout?"第"vvivv”個學(xué)生情況"?endl?endl;undergraduates[i].displayDetails();〃析構(gòu)函數(shù),將undergraduates[]寫入Undergraduate.txt文件中UndergraduateManager::~UndergraduateManager()(dataSave();}voidUndergraduateManager::dataManage()(intchoice=l;stringsstudentNo;Undergraduates;while(choice!=0)(cout?I********************************************”vvendl*cout?"\t\t本科生維護(hù)\n”;C0Ut?"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"vvendl*cout?"\n\t\t1:新增cout?"\n\t\t2:修改cout?"\n\t\t3:刪除cout?"\n\t\t4:查找cout?"\n\t\t5:顯示cout?"\n\t\t6:全部刪除cout?"\n\t\t0:退出";cout?endl;coutvv“*********************************************“vvendl*cout?"請選擇:"vvendl;cin?choice;switch(choice)(case1:s.inputData();addStudent(s);break;case2:cout<<”請輸入學(xué)號:”;cin>>sstudentNo;modifyStudent(sstudentNo);break;case3:cout<<”請輸入學(xué)號:”;cin>>sstudentNo;deleteStudent(sstudentNo);break;case4:cout<<”請輸入學(xué)號:”;cin>>sstudentNo;queryStudent(sstudentNo);break;case5:displayAll();break;case6:clearStudent();break;default:break;}}}voidUndergraduateManager::dataSave()//存儲資料函數(shù),將read[]寫入Undergraduate.txt文件中{fstreamfile("Undergraduate.dat”,ios::out);for(inti=0;i<=top;i++)file.write((char*)&undergraduates[i],sizeof(undergraduates[i]));file.close();}voidUndergraduateManager::dataRead()//構(gòu)造函數(shù),將Undergraduate.txt讀到read[]中{Undergraduates;top=-1;fstreamfile("Undergraduate.dat”,ios::in);while(1){file.read((char*)&s,sizeof(s));if(!file)break;top++;undergraduates[top]=s;}file.close();}#endif//UNDERGRADUATEMANAGERH/*************************************************Copyright(C),2010,TyutFilename:date.hAuthor:gaobaoluVersion:1.0Date:2010.6.28Description:日期類*************************************************/#ifndefDATE_H#defineDATE_H#include<iostream>usingnamespacestd;/*DefineaClass:Date*//*withattributes:year,month,andday,and*//*operations:getYear,getMonth,....*/classDate{private:intyear;intmonth;intday;public:Date(){year=0;month=0;day=0;}Date(intyy,intmm,intdd){year=yy;month=mm;day=dd;}Date(Date&d){year=d.year;month=d.month;day=d.day;}~Date(){}voidsetYear(intyy){year=yy;}voidsetMonth(intmm){month=mm;}voidsetDay(intdd){day=dd;}intgetYear(){returnyear;}intgetMonth(){returnmonth;}intgetDay(){returnday;}voidinputDate(){cout<<"年:";cin>>year;cout<<"月:";cin>>month;cout<<"日:";cin>>day;}voiddisplayDate()(cout<<year<<"/"<<month<<"/"<<day<<endl;}};#endif//DATE_H/*************************************************Copyright(C),2010,TyutFilename:person.hDate:2010.6.28Author:gaobaoluVersion:Date:2010.6.28Description:人員類*************************************************/#ifndefPERSONH#definePERSON_H#include<iostream>#include<cstring>#include<string>usingnamespacestd;/*DefineaClass:Person*//*withattributes:name,id,gender,birthday*//*operations:getName,getId,andsetId.*//*personisthebaseclass*/〃該類為虛基類classPerson(protected:charname[20];//姓名charid[18];〃身份證號chargender[2];//性別Datebirthday;//出生日期public:Person();Person(char*sname,char*sid,char*sgender,intyy,intmm,intdd);~Person()(}voidsetName(char*sname)(strcpy(name,sname);}char*getName()(returnname;}voidsetId(char*sid)(strcpy(id,sid);}char*getId()(returnid;}voidsetGender(char*sgender)(strcpy(gender,sgender);}char*getGender()(returngender;}voidsetBirthday(Dated)(birthday=d;}DategetBirthday()(returnbirthday;}virtualvoidinputData();//輸入數(shù)據(jù)virtualvoiddisplayDetails();〃顯示數(shù)據(jù)};Person::Person(){strcpy(name,"NA");strcpy(gender,"男");strcpy(id,"000");//注意:這里沒有給birthday賦值,系統(tǒng)會調(diào)用其默認(rèn)構(gòu)造函數(shù)//也可以//Dated(1980,1,1);//birthday=d;}Person::Person(char*sname,char*sid,char*sgender,intyy,intmm,intdd):birthday(yy,mm,dd){strcpy(name,sname);strcpy(id,sid);strcpy(gender,sgender);}voidPerson::inputData(){cout<<”姓名:”;ci

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論