數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì).舞伴問(wèn)題_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì).舞伴問(wèn)題_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì).舞伴問(wèn)題_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì).舞伴問(wèn)題_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì).舞伴問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

可編輯版/分類(lèi)號(hào)編號(hào)華北水利水電大學(xué)NorthChinaInstituteofWaterConservancyandHydroelectricPower課程設(shè)計(jì)題目舞伴問(wèn)題院系信息工程學(xué)院專(zhuān)業(yè)計(jì)算機(jī)科學(xué)與技術(shù)姓名賈寧指導(dǎo)教師楊彬第一章需求分析21.1問(wèn)題描述21.2基本要求21.2.1輸入及輸出格式21.2.2程序所完成的功能2第二章概要設(shè)計(jì)32.1數(shù)據(jù)結(jié)構(gòu)32.2程序模塊42.3模塊調(diào)用及算法5第三章詳細(xì)設(shè)計(jì)73.1操作實(shí)現(xiàn)73.2算法實(shí)現(xiàn)8第四章編碼調(diào)試104.1調(diào)試環(huán)境104.2調(diào)試方法104.3調(diào)試項(xiàng)目及調(diào)試結(jié)果104.3.1登陸測(cè)試104.3.2加載學(xué)生信息114.3.3學(xué)生配對(duì)調(diào)試124.3.4顯示總配對(duì)134.3.5查詢(xún)配對(duì)13第五章總結(jié)15參考文獻(xiàn)16附錄系統(tǒng)源代碼17第一章需求分析1.1問(wèn)題描述一班有m個(gè)女生、n個(gè)男生<m不等于n>,舉辦一場(chǎng)舞會(huì).男女生分別編號(hào)坐在舞池兩邊的椅子上,每曲開(kāi)始時(shí),依次從男生和女生中各出一人配對(duì)跳舞,本曲沒(méi)成功配對(duì)者坐著等待下一曲找舞伴,設(shè)計(jì)一個(gè)程序模擬舞伴配對(duì)過(guò)程。1.2基本要求1.2.1輸入及輸出格式輸入男、女學(xué)生的姓名、性別,由程序自動(dòng)為男女生編號(hào),可以順序編號(hào),也可以隨機(jī)編號(hào),輸出每曲配對(duì)情況〔包括男、女生的姓名、性別和編號(hào)。原始數(shù)據(jù)和結(jié)果數(shù)據(jù)要保存到文件中。在讀入男女生信息時(shí),可以從文件中直接讀取學(xué)生的姓名和性別信息。輸出顯示時(shí)顯示每首歌的配對(duì)情況,包括對(duì)應(yīng)配對(duì)學(xué)生的姓名、性別以及編號(hào)??梢暂敵稣麄€(gè)舞池配對(duì)過(guò)程的所有配對(duì)情況。將輸出顯示的內(nèi)容對(duì)應(yīng)寫(xiě)入到指定的文件中。1.2.2程序所完成的功能從文件或者手動(dòng)輸入班級(jí)的學(xué)生信息,包括姓名和性別基本信息,根據(jù)性別使男女生分別坐在舞池兩邊的座位上,學(xué)生的座位編號(hào)順序生成,且一旦編號(hào)確定,將不再發(fā)生變化。每一首歌曲播放時(shí),依次從男女生隊(duì)列中出來(lái)學(xué)生進(jìn)行配對(duì),由于男女生人數(shù)不一致,會(huì)使某個(gè)隊(duì)列中剩下若干學(xué)生配對(duì)不成功,配對(duì)不成功者等待下首歌時(shí)再進(jìn)行配對(duì)。該首歌結(jié)束時(shí),配對(duì)成功的學(xué)生再回到座位上。然后再依次進(jìn)行配對(duì),未成功者等待下首歌再進(jìn)行配對(duì)。配對(duì)成功時(shí),會(huì)顯示本首歌的詳細(xì)配對(duì)情況,以及整個(gè)過(guò)程的配對(duì)情況,并且可以將配對(duì)情況寫(xiě)入到文件。根據(jù)男女生的姓名或者某首歌曲的名字可以查詢(xún)到對(duì)應(yīng)的配對(duì)情況。第二章概要設(shè)計(jì)2.1數(shù)據(jù)結(jié)構(gòu)學(xué)生座位隊(duì)列:ADTStuQueue{數(shù)據(jù)對(duì)象:D={ai|ai∈ElemSet,i=1,2..n;n≥0}數(shù)據(jù)關(guān)系:R={<ai-1,ai>ai∈D,i=1,2..n}voidInitQueue<StuQueue&Q>操作結(jié)果:初始化一個(gè)空的循環(huán)隊(duì)列voidEnQueue<StuQueue&Q,FinalStustu>初始條件:循環(huán)隊(duì)列Q已經(jīng)存在,并且無(wú)信息操作結(jié)果:向Q中循環(huán)加入信息voidEnQueue2<StuQueue&Q,FinalStustu>初始條件:循環(huán)隊(duì)列已存在,非首次進(jìn)循環(huán)隊(duì)列 操作結(jié)果:向Q中添加信息FinalStuDeQueue<StuQueue&Q>初始條件:循環(huán)隊(duì)列已存在操作結(jié)果:使隊(duì)列頭的元素出隊(duì)列,且返回FinalStu類(lèi)型值}ADTStuQueue//學(xué)生座位隊(duì)列音樂(lè)隊(duì)列:ADTMusicList{數(shù)據(jù)對(duì)象:D={ai|ai∈ElemSet,i=1,2..n;n≥0}數(shù)據(jù)關(guān)系:R={<ai-1,ai>ai∈D,i=1,2..n}voidInitMusic<MusicList&MList>操作結(jié)果:創(chuàng)建循環(huán)鏈表voidInsertMusic<MusicList&MList,char*name>初始條件:該鏈表已存在操作結(jié)果:向鏈表中添加數(shù)據(jù)}ADTMusicList;臨時(shí)隊(duì)列:ADTTempQList{數(shù)據(jù)對(duì)象:D={ai|ai∈ElemSet,i=1,2..n;n≥0}數(shù)據(jù)關(guān)系:R={<ai-1,ai>ai∈D,i=1,2..n}voidInitQList<TempQList&TQL>操作結(jié)果:初始化臨時(shí)隊(duì)列voidEnTempQueue<TempQList&TQL,FinalStustu>初始條件:隊(duì)列TQL已存在操作結(jié)果:向TQL中添加信息FinalStuDeTempQueue<TempQList&TQL>初始條件:隊(duì)列TQL存在操作結(jié)果:取出隊(duì)列的對(duì)頭元素,返回FinalStu類(lèi)型}ADTTempQList;2.2程序模塊本系統(tǒng)主要包括登陸模塊、學(xué)生入座、自動(dòng)配對(duì)、顯示配對(duì)過(guò)程以及查詢(xún)配對(duì)信息模塊。登陸:輸入正確的用戶(hù)名以及密碼,方可進(jìn)入系統(tǒng),連續(xù)輸入錯(cuò)誤三次則禁止進(jìn)入系統(tǒng)。學(xué)生入座:以不同的方式獲取學(xué)生信息后,根據(jù)學(xué)生性別依次進(jìn)入兩個(gè)循環(huán)隊(duì)列,并為每個(gè)學(xué)生唯一編號(hào)。自動(dòng)配對(duì):每首歌開(kāi)始時(shí),男女生依次從坐席中出來(lái)進(jìn)行本首歌的配對(duì),配對(duì)不成功者等待下首歌繼續(xù)配對(duì),下首歌時(shí),上首歌未配對(duì)成功者本首歌先進(jìn)行配對(duì)。顯示配對(duì)過(guò)程:在播放歌曲的過(guò)程中,顯示播放的歌曲信息,以及本首歌的配對(duì)信息。查詢(xún)配對(duì):根據(jù)男女生的姓名查出兩人的在哪一首歌進(jìn)行過(guò)配對(duì),根據(jù)歌曲名稱(chēng)查詢(xún)出本首歌的配對(duì)信息。文件操作:將配對(duì)情況及學(xué)生的座位信息寫(xiě)入文件根據(jù)系統(tǒng)模塊的劃分,本系統(tǒng)的功能模塊圖如圖2-1所示圖2-1功能模塊2.3模塊調(diào)用及算法登陸成功后進(jìn)入主界面,進(jìn)入主界面后,需要先運(yùn)行學(xué)生入座模塊,方能進(jìn)行下邊的操作。學(xué)生入座后會(huì)得到相關(guān)的基本信息。之后調(diào)用配對(duì)模塊函數(shù),進(jìn)行學(xué)生的配對(duì)。學(xué)生配對(duì)成功后,才能利用顯示配對(duì)過(guò)程進(jìn)行顯示配對(duì)的情況,后續(xù)的查詢(xún)配對(duì)模塊也必須在配對(duì)成功的基礎(chǔ)上進(jìn)行。模塊間的調(diào)用流程如圖2-2所示圖2-2模塊調(diào)用在進(jìn)行配對(duì)過(guò)程中用到算法,在每首歌配對(duì)時(shí),依次從男女生隊(duì)列中出來(lái)一個(gè)學(xué)生,進(jìn)入到臨時(shí)隊(duì)列,從臨時(shí)隊(duì)列中獲取配對(duì)的情況。在本首歌結(jié)束,下首歌開(kāi)始之前,讓臨時(shí)隊(duì)列中的男女在分別根據(jù)性別入隊(duì),依次循環(huán),每次調(diào)用配對(duì)函數(shù),實(shí)現(xiàn)學(xué)生的循環(huán)配對(duì)。第三章詳細(xì)設(shè)計(jì)3.1操作實(shí)現(xiàn)本系統(tǒng)包含七個(gè)文件。設(shè)計(jì)分有歡迎界面,登陸系統(tǒng),入隊(duì)函數(shù),配對(duì)函數(shù),顯示函數(shù),查詢(xún)函數(shù)等。登陸界面是整個(gè)系統(tǒng)的入口,其主要是讓合法人員進(jìn)入系統(tǒng),入隊(duì)函數(shù)主要讓學(xué)生進(jìn)入男女隊(duì)列,配對(duì)函數(shù)主要是根據(jù)每首歌曲把男女生進(jìn)行配對(duì),顯示函數(shù)主要是顯示男女生的配對(duì)情況,查詢(xún)函數(shù)主要是根據(jù)男女生姓名和歌曲名查找配對(duì)情況。系統(tǒng)首先通過(guò)程序調(diào)用voidmain<>進(jìn)入歡迎界面和系統(tǒng)登陸界面,根據(jù)用戶(hù)的帳號(hào)和密碼登陸成功后進(jìn)入主菜單。根據(jù)用戶(hù)的選擇可分別進(jìn)入:1.學(xué)生就坐;2.每曲配對(duì);3.顯示結(jié)果;4.查詢(xún)配對(duì);5.退出。選擇"1.學(xué)生就坐"項(xiàng),會(huì)顯示學(xué)生信息來(lái)源,包括"1.按班級(jí)獲取<推薦>""2.手動(dòng)輸入..."兩項(xiàng)可供選擇。其中,1是從文件中獲取學(xué)生信息,2是用戶(hù)手動(dòng)輸入學(xué)生信息。選擇"2.每曲配對(duì)"項(xiàng),會(huì)顯示播放歌曲的類(lèi)型,有"1.流行""2.復(fù)古"兩個(gè)音樂(lè)風(fēng)格可供選擇,當(dāng)用戶(hù)選擇其中一個(gè)風(fēng)格并確定播放后,會(huì)顯示出當(dāng)前播放的歌曲名字和所配對(duì)的男女生。選擇"3.顯示結(jié)果"項(xiàng),會(huì)有"1.學(xué)生座位信息"和"2.學(xué)生配對(duì)信息"兩項(xiàng)操作可供選擇。當(dāng)選擇1,會(huì)把學(xué)生就坐后的信息顯示出來(lái),選擇2,會(huì)把每首歌學(xué)生的配對(duì)情況顯示出來(lái)。選擇"4.查詢(xún)配對(duì)"項(xiàng),也有兩個(gè)操作可供選擇,分別是"1.按學(xué)生姓名""按歌曲名"兩項(xiàng)。選擇1,會(huì)根據(jù)用戶(hù)輸入的男女生姓名查看他們的配對(duì)情況,選擇2,會(huì)根據(jù)用戶(hù)輸入的歌曲名稱(chēng)顯示每首歌曲學(xué)生的配對(duì)情況。選擇"5.退出"項(xiàng),會(huì)出現(xiàn)感謝使用系統(tǒng)界面,并按任意鍵退出系統(tǒng)。本系統(tǒng)的主流程圖如圖3-1所示圖3-1主流程3.2算法實(shí)現(xiàn)定義學(xué)生結(jié)構(gòu)體FinalStu,將學(xué)生的信息放到本結(jié)構(gòu)體中,定義兩個(gè)循環(huán)隊(duì)列Boys和Girls隊(duì)列,分別存儲(chǔ)男女生的座位信息。定義MusicList循環(huán)鏈表,用于存放音樂(lè)信息。定義TempQueue隊(duì)列,用于臨時(shí)存放從男女生隊(duì)列中出來(lái)的學(xué)生信息。創(chuàng)建一個(gè)存放每首歌配對(duì)情況的數(shù)組stuTable[],用來(lái)存放播放該首歌曲時(shí)男女生的信息。每一首歌開(kāi)始時(shí),男女生依次用Boys和Girls隊(duì)列中出對(duì),依次進(jìn)入臨時(shí)隊(duì)列TempQueue,從TempQueue中讀取男女生的信息,放到stuTable數(shù)組中,表示該首歌的配對(duì)情況。下首歌開(kāi)始時(shí),讓臨時(shí)隊(duì)列中的學(xué)生再根據(jù)性別依次進(jìn)入男女循環(huán)隊(duì)列。同時(shí)將存放歌曲的MusicList循環(huán)鏈表指針后移,播放下首歌曲,再執(zhí)行上述操作,便可實(shí)現(xiàn)循環(huán)配對(duì)。第四章編碼調(diào)試4.1調(diào)試環(huán)境硬件環(huán)境:Intel1GHZ處理器〔或AMD同類(lèi)處理器,512M或以上內(nèi)存容量,10G或以上硬盤(pán)容量,可連接互聯(lián)網(wǎng)的相關(guān)設(shè)備。軟件環(huán)境〔軟件、操作系統(tǒng):WindowsXP〔或Windows2003或Windowsvista或Windows7操作系統(tǒng),MicrosoftVisualStudio2008。4.2調(diào)試方法為了提高測(cè)試效率,降低測(cè)試成本,本測(cè)試方案采用黑盒法設(shè)計(jì)基本的測(cè)試方案,再用白盒法補(bǔ)充一些方案。在黑盒法測(cè)試方案中,采用等價(jià)劃分技術(shù),把所有可能的數(shù)據(jù)劃分成幾個(gè)等價(jià)類(lèi)。4.3調(diào)試項(xiàng)目及調(diào)試結(jié)果4.3.1登陸測(cè)試用戶(hù)根據(jù)用戶(hù)名及密碼登陸系統(tǒng),內(nèi)置用戶(hù)為Admin,密碼為888888。登陸成功如圖4-1所示,登陸失敗如圖4-2所示圖4-1登陸成功圖4-2登陸失敗4.3.2加載學(xué)生信息可以從文件或者手動(dòng)輸入學(xué)生信息,從文件中選擇時(shí),可以選擇不同的文件,其運(yùn)行結(jié)果如圖4-2及圖4-3所示圖4-3選擇信息來(lái)源圖4-4顯示獲取信息4.3.3學(xué)生配對(duì)調(diào)試在進(jìn)行配對(duì)之前,需要先將音樂(lè)信息加載到系統(tǒng)中,其加載過(guò)程如圖4-5所示圖4-5加載音樂(lè)學(xué)生就位及音樂(lè)加載成功后,開(kāi)始播放音樂(lè),并進(jìn)行配對(duì),其音樂(lè)播放情況及每首歌曲的配對(duì)情況如圖4-6、圖4-7及圖4-8所示圖4-6配對(duì)開(kāi)始圖4-7播放下一首圖4-8循環(huán)配對(duì)4.3.4顯示總配對(duì)在整個(gè)過(guò)程結(jié)束后,停止播放音樂(lè),可以顯示整個(gè)過(guò)程的配對(duì)情況,其結(jié)果如圖4-9所示圖4-9顯示配對(duì)結(jié)果4.3.5查詢(xún)配對(duì)可以根據(jù)男女生的姓名查詢(xún)兩人的配對(duì)情況,當(dāng)輸入兩個(gè)學(xué)生姓名時(shí),顯示在整個(gè)過(guò)程中的配對(duì)情況,其結(jié)果如圖4-10所示圖4-10姓名查詢(xún)配對(duì)根據(jù)每一首歌曲情況查詢(xún)?cè)诒臼赘枨械呐鋵?duì)情況,其結(jié)果如圖4-11所示圖4-11按歌名查找第五章總結(jié)這次的課程設(shè)計(jì)懂得了理論與實(shí)際相結(jié)合是很非常重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為,從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在整個(gè)設(shè)計(jì)過(guò)程中,構(gòu)思是很花費(fèi)時(shí)間的,在構(gòu)思總體架構(gòu)時(shí),需要先將需求分析搞清楚,需要在找到了需要解決的問(wèn)題后,再想辦法解決該問(wèn)題。而不是在設(shè)計(jì)過(guò)程中邊想邊解決,需要先將所有可能的問(wèn)題都考慮到,再依次解決。在整個(gè)系統(tǒng)設(shè)計(jì)完成后,如果再遇到新的問(wèn)題,可以對(duì)系統(tǒng)進(jìn)行適當(dāng)?shù)母?。調(diào)試時(shí)經(jīng)常會(huì)遇到這樣那樣的錯(cuò)誤,有的時(shí)候是因?yàn)橐恍┳罨镜腻e(cuò)誤,如標(biāo)點(diǎn)的中英錯(cuò)誤,括號(hào)的匹配問(wèn)題,數(shù)據(jù)的輸入錯(cuò)誤等。當(dāng)然,也有很多地方是因?yàn)橛缅e(cuò)了解決方法。在設(shè)計(jì)的過(guò)程中,最能體現(xiàn)出的缺點(diǎn)就是基礎(chǔ)不扎實(shí),本可以避免的錯(cuò)誤卻一再出現(xiàn)。在實(shí)現(xiàn)舞池配對(duì)問(wèn)題過(guò)程中,需要使學(xué)生循環(huán)配對(duì),此程序設(shè)計(jì)的是當(dāng)一個(gè)光盤(pán)的音樂(lè)播放結(jié)束時(shí),整個(gè)配對(duì)過(guò)程隨之結(jié)束,而沒(méi)有讓學(xué)生再次進(jìn)去坐席,導(dǎo)致不再?gòu)男聦W(xué)生入座,就無(wú)法實(shí)現(xiàn)配對(duì)。設(shè)計(jì)的是在每首歌開(kāi)始之前學(xué)生進(jìn)入隊(duì)列,可以改為當(dāng)某個(gè)學(xué)生坐席為空時(shí),隨即讓學(xué)生再次進(jìn)入隊(duì)列,可以解決不能重復(fù)換歌曲的問(wèn)題。剛開(kāi)始的時(shí)候我直接在開(kāi)發(fā)環(huán)境下一邊看題一邊寫(xiě)代碼,瞪了半天什么也沒(méi)寫(xiě)出來(lái),于是我便先開(kāi)始在紙上畫(huà)畫(huà)寫(xiě)寫(xiě),將事件的整個(gè)過(guò)程畫(huà)下來(lái),然后考慮怎么才能運(yùn)用代碼來(lái)實(shí)現(xiàn),一邊思考一邊寫(xiě)一些粗略的代碼,最后從上到下執(zhí)行代碼看看是不是符合題目要求。有沒(méi)有什么漏洞。等這些完成以后,再在開(kāi)發(fā)環(huán)境下將代碼完善、編譯和調(diào)試。雖然說(shuō)代碼還有許多要改進(jìn)的地方,有的功能還不夠完善,可畢竟是自己親自寫(xiě)出來(lái)的,對(duì)于程序的條理有了一個(gè)清晰的了解,對(duì)編程也有了更加深刻的認(rèn)識(shí)。參考文獻(xiàn)譚浩強(qiáng).C程序設(shè)計(jì)<第三版>[M].北京:清華大學(xué)出版社,2005.嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)<C語(yǔ)言版>[M].北京:清華大學(xué)出版社,1997.陸麗娜.軟件工程.北京:經(jīng)濟(jì)科學(xué)出版社,2005.姚詩(shī)斌.數(shù)據(jù)庫(kù)系統(tǒng)基礎(chǔ).計(jì)算機(jī)工程與應(yīng)用,1981年第8期附錄系統(tǒng)源代碼#include<iostream>#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<Windows.h>#defineMAXQSIZE20//循環(huán)隊(duì)列最大存儲(chǔ)量#defineSTU_SIZE5//學(xué)生人數(shù)#defineSIZE100intidCount=1000;//全局變量控制學(xué)生id自增intlength;//記錄每首歌配對(duì)的數(shù)量intindex=0;//記錄最終配對(duì)表的下標(biāo)usingnamespacestd;//舞池就坐后的學(xué)生信息結(jié)構(gòu)體structAdmin{charname[15];charpassWord[15]; Admin*next;};Admin*admin;structFinalStu{charname[15];charsex[3];intid;};FinalStustu[STU_SIZE];FinalStustuSeat[STU_SIZE];//用來(lái)存放入座后的學(xué)生信息FinalStustuTable[STU_SIZE][2];//用來(lái)存放沒(méi)收歌曲的配對(duì)情況//舞池座位structStuQueue{ FinalStu*base;intfront;intrear;};StuQueueBoys;//男生隊(duì)列StuQueueGirls;//女生隊(duì)列//初始化學(xué)生坐席voidInitQueue<StuQueue&Q>{ Q.base=<FinalStu*>malloc<MAXQSIZE*sizeof<FinalStu>>;if<Q.base==NULL>return; Q.front=Q.rear=0;}//學(xué)生就坐,首次入隊(duì),需要獲取學(xué)生的idvoidEnQueue<StuQueue&Q,FinalStustu>{inti=100;if<<Q.rear+1>%MAXQSIZE==Q.front>return; strcpy<Q.base[Q.rear].name,>; strcpy<Q.base[Q.rear].sex,stu.sex>; Q.base[Q.rear].id=idCount++; Q.rear=<Q.rear+1>%MAXQSIZE;}//非首次入隊(duì),不需獲取學(xué)生的idvoidEnQueue2<StuQueue&Q,FinalStustu>{ strcpy<Q.base[Q.rear].name,>; strcpy<Q.base[Q.rear].sex,stu.sex>; Q.base[Q.rear].id=stu.id; Q.rear=<Q.rear+1>%MAXQSIZE;}//從坐席上出來(lái)FinalStuDeQueue<StuQueue&Q>{ FinalStustu;if<Q.rear!=Q.front> { stu=Q.base[Q.front]; } Q.front=<Q.front+1>%MAXQSIZE;returnstu;}//存放音樂(lè)信息structMusic{charM_Name[15]; Music*next;};//存放音樂(lè)鏈,循環(huán)鏈表structMusicList{ Music*head; Music*tail;};MusicListML;Music*M_p;//初始化指針voidInitMusic<MusicList&MList>{ MList.head=MList.tail=<Music*>malloc<sizeof<Music>>; MList.head->next=NULL;}//向音樂(lè)鏈表中添加音樂(lè)voidInsertMusic<MusicList&MList,char*name>{ Music*p=<Music*>malloc<sizeof<Music>>; MList.tail->next=p; strcpy<p->M_Name,name>; MList.tail=p; MList.tail->next=MList.head;}//臨時(shí)隊(duì)列,用于存放從男女生隊(duì)列中配對(duì)成成功的學(xué)生信息structTempQueue{ FinalStustu; TempQueue*next;};structTempQList{ TempQueue*front; TempQueue*rear;};TempQListTempQL;//臨時(shí)隊(duì)列,用于存放每次出來(lái)的男女生信息voidInitQList<TempQList&TQL>{ TQL.front=TQL.rear=<TempQueue*>malloc<sizeof<TempQueue>>; TQL.front->next=NULL;}voidEnTempQueue<TempQList&TQL,FinalStustu>{ TempQueue*p=<TempQueue*>malloc<sizeof<TempQueue>>; p->stu=stu; p->next=NULL; TQL.rear->next=p; TQL.rear=p;}FinalStuDeTempQueue<TempQList&TQL>{ FinalStustu; TempQueue*p; p=TQL.front->next;if<p==TQL.rear> { stu=p->stu; TQL.rear=TQL.front; }else { stu=p->stu; TQL.front->next=p->next; } free<p>;returnstu;}//==========配對(duì)信息存放===================structMatchList{charmusicName[20]; FinalStustu[2];};MatchListmatchTable[SIZE];//從鍵盤(pán)讀入學(xué)生信息voidGetInfKey<>{for<inti=0;i<STU_SIZE;i++> { cout<<"輸入第"<<i+1<<"個(gè)學(xué)生的姓名:"; scanf<"%s",stu[i].name>; cout<<"輸入第"<<i+1<<"個(gè)學(xué)生的性別:"; scanf<"%s",stu[i].sex>; }}//學(xué)生入座voidStudentSit<>{for<inti=0;i<STU_SIZE;i++> {if<strcmp<stu[i].sex,"男">==0> EnQueue<Boys,stu[i]>;else EnQueue<Girls,stu[i]>; }}//獲取就坐后的男女生性別、姓名、編號(hào),stuSeat[]存放就坐后的學(xué)生信息,包括學(xué)生編號(hào)voidGetStuSeat<>{inti=0;intj=0; i=Boys.front; j=Girls.front;while<i!=Boys.rear> { stuSeat[i]=Boys.base[i]; i++; }while<j!=Girls.rear> { stuSeat[i]=Girls.base[j]; j++; i++; }}//將就座的學(xué)生信息寫(xiě)入文件intInFileStuSeat<>{ FILE*fp_Seat;intres=0;if<<fp_Seat=fopen<"Seat.txt","wt">>==NULL> { cout<<"讀取學(xué)生座位信息失?。。?!";return-1; } fprintf<fp_Seat,"姓名\t性別\t序號(hào)\n">;for<inti=0;i<STU_SIZE;i++> { fprintf<fp_Seat,"%s\t%s\t%d",stuSeat[i].name,stuSeat[i].sex,stuSeat[i].id>; fprintf<fp_Seat,"\n">; res++; } fclose<fp_Seat>;returnres;}voidPrintStuSeat<>{ cout<<"\t\t\t姓名\t性別\t序號(hào)"<<endl;for<inti=0;i<STU_SIZE;i++> { cout<<"\t\t\t"<<stuSeat[i].name<<"\t"; cout<<stuSeat[i].sex<<"\t"<<stuSeat[i].id<<endl; }}//從文件中獲取管理員信息voidReadAdmin<>{ admin=<Admin*>malloc<sizeof<Admin>>; admin->next=NULL; Admin*q=admin; FILE*fp_Admin;if<<fp_Admin=fopen<"admin.txt","rt">>==NULL> { cout<<"打開(kāi)文件失?。。?!";return; }while<!feof<fp_Admin>> { Admin*p=<Admin*>malloc<sizeof<Admin>>; p->next=NULL; fscanf<fp_Admin,"%s%s",p->name,p->passWord>; q->next=p; q=p; } fclose<fp_Admin>;}//從文件獲取學(xué)生信息voidReadStuFile<intres>{ FILE*fp;if<res==1> {if<<fp=fopen<"student1.txt","rt">>==NULL> { cout<<"打開(kāi)文件失?。。。?<<endl;return; } }elseif<res==2> {if<<fp=fopen<"student2.txt","rt">>==NULL> { cout<<"打開(kāi)文件失?。。?!"<<endl;return; } }inti=0;while<!feof<fp>> { fscanf<fp,"%s%s",stu[i].name,stu[i].sex>; i++;if<i>=STU_SIZE>break; } fclose<fp>;}//加載音樂(lè)信息intLoadMusic<intcd>{charmusic[5][20];//存放從文件中獲取的音樂(lè)名稱(chēng)intres=0; FILE*fp_music;if<cd==1> {if<<fp_music=fopen<"music1.txt","rt">>==NULL> { cout<<"打開(kāi)音樂(lè)文件失?。。?!"<<endl;return-1; } }elseif<cd==2> {if<<fp_music=fopen<"music2.txt","rt">>==NULL> { cout<<"打開(kāi)音樂(lè)文件失?。。?!"<<endl;return-1; } }for<intj=0;j<5;j++> {if<fread<music[j],20*sizeof<char>,1,fp_music>==1> res++; } fclose<fp_music>; InitMusic<ML>;for<inti=0;i<5;i++> { InsertMusic<ML,music[i]>; }returnres;}intInFileMatchTable<>{ FILE*fp_MTable;if<<fp_MTable=fopen<"matchtable.txt","wt">>==NULL> { cout<<"打開(kāi)文件失敗~~~~"<<endl;return-1; } fprintf<fp_MTable,"歌曲名稱(chēng)\t姓名\t性別\t序號(hào)\t姓名\t性別\t序號(hào)\n">;for<inti=0;i<index;i++> { fprintf<fp_MTable,"%s\t\t%s\t%s\t%d\t",matchTable[i].musicName,matchTable[i].stu[0].name,matchTable[i].stu[0].sex,matchTable[i].stu[0].id>; fprintf<fp_MTable,"%s\t%s\t%d\n",matchTable[i].stu[1].name,matchTable[i].stu[1].sex,matchTable[i].stu[1].id>; } fclose<fp_MTable>;return1;}voidStudentSitAgain<>{ FinalStustu;while<TempQL.front!=TempQL.rear> { stu=DeTempQueue<TempQL>;if<strcmp<stu.sex,"男">==0> EnQueue2<Boys,stu>;else EnQueue2<Girls,stu>; }}//播放歌曲voidPlayMusic<>{ cout<<"\t\t正在播放:\t"<<M_p->M_Name;}//下一首voidNextMusic<>{ M_p=M_p->next;if<M_p==ML.head> { M_p=ML.head->next; }}//學(xué)生配對(duì)voidMatch<>{//FinalStustudent[STU_SIZE];intstatici=0;intj=0; length=0;while<Boys.front!=Boys.rear&&Girls.front!=Girls.rear> { EnTempQueue<TempQL,DeQueue<Boys>>;//從男生隊(duì)列中出來(lái)進(jìn)入臨時(shí)隊(duì)列 EnTempQueue<TempQL,DeQueue<Girls>>;//從女生隊(duì)列中出來(lái)進(jìn)入臨時(shí)隊(duì)列 length++;//記錄每首歌的配對(duì)數(shù) }//從臨時(shí)隊(duì)列中將信息賦值給表 TempQueue*tem=TempQL.front->next;while<tem> { strcpy<matchTable[index].musicName,M_p->M_Name>; strcpy<matchTable[index].stu[0].name,tem->>; strcpy<matchTable[index].stu[0].sex,tem->stu.sex>; matchTable[index].stu[0].id=tem->stu.id;//每曲歌的配對(duì)情況 strcpy<stuTable[j][0].name,tem->>; strcpy<stuTable[j][0].sex,tem->stu.sex>; stuTable[j][0].id=tem->stu.id; tem=tem->next;//整個(gè)播放過(guò)程的配對(duì)表 strcpy<matchTable[index].stu[1].name,tem->>; strcpy<matchTable[index].stu[1].sex,tem->stu.sex>; matchTable[index].stu[1].id=tem->stu.id;//每首歌配對(duì)表 strcpy<stuTable[j][1].name,tem->>; strcpy<stuTable[j][1].sex,tem->stu.sex>; stuTable[j][1].id=tem->stu.id; tem=tem->next; index++; j++; }}//顯示每首歌配對(duì)情況voidPrintEachMatch<>{ cout<<endl; cout<<"本首歌的配對(duì)情況:"<<endl; cout<<"姓名\t性別\t序號(hào)\t姓名\t性別\t序號(hào)"<<endl;for<inti=0;i<length;i++>//length為每首歌的配對(duì)長(zhǎng)度 { cout<<stuTable[i][0].name<<"\t"<<stuTable[i][0].sex<<"\t"<<stuTable[i][0].id<<"\t"; cout<<stuTable[i][1].name<<"\t"<<stuTable[i][1].sex<<"\t"<<stuTable[i][1].id<<endl; }}//播放下首歌時(shí)需要進(jìn)行的各種操作voidNext<>{ StudentSitAgain<>; NextMusic<>; PlayMusic<>; Match<>; PrintEachMatch<>;}//獲取要顯示信息的一些操作//顯示界面的一些函數(shù)voidMainMenu<>{ cout<<"\t\t\t\t"<<"主界面"<<endl; cout<<"\t\t\t"<<"1、學(xué)生就坐"; cout<<"\t"<<"2、每曲配對(duì)"<<endl; cout<<"\t\t\t"<<"3、顯示結(jié)果"; cout<<"\t"<<"4、查詢(xún)配對(duì)"<<endl; cout<<"\t\t\t\t5、退出";}//配對(duì)顯示voidPrintMatchTable<>{ cout<<"歌曲名稱(chēng)\t姓名\t性別\t序號(hào)\t姓名\t性別\t序號(hào)"<<endl;for<inti=0;i<index;i++> { cout<<matchTable[i].musicName<<"\t"<<matchTable[i].stu[0].name<<"\t"<<matchTable[i].stu[0].sex<<"\t"<<matchTable[i].stu[0].id<<"\t"; cout<<matchTable[i].stu[1].name<<"\t"<<matchTable[i].stu[1].sex<<"\t"<<matchTable[i].stu[1].id<<endl; }}voidPrintStuRes<>{ cout<<"\t\t\t請(qǐng)選擇學(xué)生信息來(lái)源:"<<endl; cout<<"\t\t\t1、按班級(jí)獲取<推薦>"<<endl; cout<<"\t\t\t2、手動(dòng)輸入..."<<endl;}voidStudentChose<>{ PrintStuRes<>; cout<<"請(qǐng)選擇操作:";intres; cin>>res;switch<res> {case1://從文件讀取數(shù)據(jù)intres; cout<<"請(qǐng)選擇班級(jí):"<<endl; cout<<"1.三年一班\t2.三年二班"<<endl; cin>>res;if<res==1> { ReadStuFile<1>; }elseif<res==2> { ReadStuFile<2>; }break;case2: cout<<"開(kāi)始輸入"<<endl; GetInfKey<>;//鍵盤(pán)鍵入數(shù)據(jù)break;default: cout<<"輸入有誤,再見(jiàn)"<<endl;break; }}voidMusicMenu<>{ cout<<"請(qǐng)選擇要放入的光盤(pán)類(lèi)型:"<<endl; cout<<"1.流行\(zhòng)t2.復(fù)古\n";intres,i;charch; cin>>res;if<res==1> i=LoadMusic<1>;else i=LoadMusic<2>;if<i> { M_p=ML.head->next;//p指向第一首歌 cout<<"歌曲光盤(pán)已就位,是否現(xiàn)在播放<Y/N>"<<endl; cin>>ch; InitQList<TempQL>;//初始化臨時(shí)隊(duì)列if<ch=='Y'||ch=='y'> { system<"cls">; PlayMusic<>; Match<>; PrintEachMatch<>; } cout<<"按n進(jìn)行下一首歌曲、、\n"; cout<<"按q停止播放音樂(lè)、、"<<endl; cin>>ch;while<ch=='n'||ch=='N'> { system<"cls">; Next<>; cout<<"按n進(jìn)行下一首歌曲、、\n"; cout<<"按q停止播放音樂(lè)、、"<<endl; cin>>ch; }if<ch=='q'||ch=='Q'>return; }}voidWelcome<>{ cout<<"\t\t\t\t歡迎進(jìn)入進(jìn)入舞池~~~~"<<endl<<endl; cout<<"\t\t\t按任意鍵繼續(xù)..."; getch<>; system<"cls">;}voidLoadAdmin<>{ Welcome<>;intres=0;inti; ReadAdmin<>;charuserName[15];charkey[15];for<i=0;i<3;i++> { Admin*p=admin->next; cout<<"\t\t\t請(qǐng)輸入您的用戶(hù)名:"; cin>>userName; cout<<"\t\t\t請(qǐng)輸入您的密碼:"; cin>>key;while<p> {if<strcmp<p->name,userName>==0>break; p=p->next; }if<!p> { system<"cls">; cout<<"\t\t\t輸入的用戶(hù)名不存在~~~~~"<<endl;;continue; }if<p> {if<strcmp<p->passWord,key>==0> { system<"cls">; cout<<"\t\t\t\t歡迎回來(lái)."; Sleep<500>; system<"cls">; cout<<"\t\t\t\t歡迎回來(lái).."; Sleep<500>; system<"cls">; cout<<"\t\t\t\t歡迎回來(lái)..."; Sleep<500>;//system<"cls">;break; }else { system<"cls">; cout<<"\t\t\t輸入的密碼錯(cuò)誤、、、"<<endl;;continue; } } }if<i>=3> { cout<<"\t\t\t您今天的機(jī)會(huì)已經(jīng)用完,再見(jiàn)"; exit<0>; }}voidShowMessage<>{ system<"cls">;intres; cout<<"\t\t\t選擇要操作的信息:"<<endl; cout<<"\t\t\t1.學(xué)生座位信息\t2.學(xué)生配對(duì)信息"<<endl; cin>>res;if<res==1> { cout<<"\t\t\t座位信息如下:"<<endl; PrintStuSeat<>;charch; cout<<"是否將該信息寫(xiě)入文件<Y/N>:"; cin>>ch;if<ch=='Y'||ch=='y'> {if<InFileMatchTable<>> { cout<<"數(shù)據(jù)已寫(xiě)入文件..."<<endl; } } }elseif<res==2> { PrintMatchTable<>;charch; cout<<"是否將該信息寫(xiě)入文件<Y/N>:"; cin>>ch;if<ch=='Y'||ch=='y'> {if<InFileMatchTable<>> cout<<"數(shù)據(jù)已寫(xiě)入文件..."<<endl;; } Sleep<3000>; }}voidQuit<>{system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^">; Sleep<200>; system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^歡">; Sleep<200>; system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^歡迎">; Sleep<200>; system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^歡迎下">; Sleep<200>; system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^歡迎下次">; Sleep<200>; system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^歡迎下次使^">; Sleep<200>; system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^歡迎下次使用">; Sleep<200>; system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^歡迎下次使用^o^">; Sleep<200>; system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^歡迎下次使用^o^\n\n\t\t\t\t">; Sleep<200>; system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^歡迎下次使用^o^\n\n\t\t\t\tGoodBye!">; Sleep<200>; system<"CLS">;printf<"\n\n\n\n\n\n\n\n\t\t\t^o^歡迎下次使用^o^\n\n\t\t\t\tGoodBye!\n">;}voidCheckByName<>//根據(jù)姓名查詢(xún)配對(duì)情況{charboyName[15];chargirlName[15]; cout<<"請(qǐng)輸入男生姓名:"; cin>>boyName; cout<<"請(qǐng)輸入女生姓名:"; cin>>girlName;intcount=0;for<inti=0;i<index;i++> {if<strcmp<matchTable[i].stu[0].name,boyName>==0&&strcmp<matchTable[i].stu[1].name,girlName>==0> { count++; } }if<count==0> { cout<<"未找到配對(duì)情況:"; }else { cout<<"\t\t\t查詢(xún)的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論