歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁(yè) 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)多關(guān)鍵字排序高考排序

  • 資源ID:32036374       資源大?。?span id="1t5anar" class="font-tahoma">2.67MB        全文頁(yè)數(shù):23頁(yè)
  • 資源格式: DOC        下載積分:15積分
快捷下載 游客一鍵下載
會(huì)員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺(tái)登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要15積分
郵箱/手機(jī):
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機(jī)號(hào),方便查詢和重復(fù)下載(系統(tǒng)自動(dòng)生成)
支付方式: 支付寶    微信支付   
驗(yàn)證碼:   換一換

 
賬號(hào):
密碼:
驗(yàn)證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會(huì)被瀏覽器默認(rèn)打開,此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁(yè)到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請(qǐng)使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請(qǐng)知曉。

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)多關(guān)鍵字排序高考排序

淮 海 工 學(xué) 院 計(jì)算機(jī)工程學(xué)院課程設(shè)計(jì)報(bào)告設(shè)計(jì)名稱: 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 選題名稱: 多關(guān)鍵字排序 姓 名: 周宣 學(xué) 號(hào): 110821120 專業(yè)班級(jí): 網(wǎng)絡(luò)工程081 系 (院): 計(jì)算機(jī)工程學(xué)院 設(shè)計(jì)時(shí)間: 2009.12.282010.1.12 設(shè)計(jì)地點(diǎn): 軟件工程實(shí)驗(yàn)室、教室 成績(jī):指導(dǎo)教師評(píng)語(yǔ): 簽名: 年 月 日數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 第 22 頁(yè),共 頁(yè)1課程設(shè)計(jì)目的1、訓(xùn)練學(xué)生靈活應(yīng)用所學(xué)數(shù)據(jù)結(jié)構(gòu)知識(shí),獨(dú)立完成問題分析,結(jié)合數(shù)據(jù)結(jié)構(gòu)理論知識(shí),編寫程序求解指定問題。 2.初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計(jì)、程序編碼、測(cè)試等基本方法和技能;3.提高綜合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問題的能力;4.訓(xùn)練用系統(tǒng)的觀點(diǎn)和軟件開發(fā)一般規(guī)范進(jìn)行軟件開發(fā),鞏固、深化學(xué)生的理論知識(shí),提高編程水平,并在此過程中培養(yǎng)他們嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度和良好的工作作風(fēng)。2課程設(shè)計(jì)任務(wù)與要求:任務(wù)題目:多關(guān)鍵字的排序【問題描述】 多關(guān)鍵字的排序有其一定的實(shí)用范圍。例如:在進(jìn)行高考分?jǐn)?shù)處理時(shí),除了需對(duì)總分進(jìn)行排序外,不同的專業(yè)對(duì)單科分?jǐn)?shù)的要求不同,因此尚需在總分相同的情況下,按用戶提出的單科分?jǐn)?shù)的次序要求排出考生錄取的次序。 【基本要求】 (1)假設(shè)待排序的記錄不超過10000,表中記錄的關(guān)鍵字?jǐn)?shù)不超過5,各個(gè)學(xué)科關(guān)鍵字的范圍均為0至100,總分關(guān)鍵字的范圍是0-300。按用戶給定的進(jìn)行排序的關(guān)鍵字的優(yōu)先關(guān)系,輸出排序結(jié)果。 (2)約定按LSD法進(jìn)行多關(guān)鍵字的排序。在對(duì)各個(gè)關(guān)鍵字進(jìn)行排序時(shí)采用兩種策略:其一是利用穩(wěn)定的內(nèi)部排序法,其二是利用“分配”和“收集”的方法。并綜合比較這兩種策略。 【測(cè)試數(shù)據(jù)】 由隨機(jī)數(shù)產(chǎn)生器生成。 【實(shí)現(xiàn)提示】 由于是按LSD方法進(jìn)行排序,則對(duì)每個(gè)關(guān)鍵字均可進(jìn)行整個(gè)序列的排序,但在利用通常的內(nèi)部排序方法進(jìn)行排序時(shí),必須選用穩(wěn)定的排序方法要求:1、在處理每個(gè)題目時(shí),要求從分析題目的需求入手,按設(shè)計(jì)抽象數(shù)據(jù)類型、構(gòu)思算法、通過設(shè)計(jì)實(shí)現(xiàn)抽象數(shù)據(jù)類型、編制上機(jī)程序和上機(jī)調(diào)試等若干步驟完成題目,最終寫出完整的分析報(bào)告。前期準(zhǔn)備工作完備與否直接影響到后序上機(jī)調(diào)試工作的效率。在程序設(shè)計(jì)階段應(yīng)盡量利用已有的標(biāo)準(zhǔn)函數(shù),加大代碼的重用率。 2、.設(shè)計(jì)的題目要求達(dá)到一定工作量(300行以上代碼),并具有一定的深度和難度。3、程序設(shè)計(jì)語(yǔ)言推薦使用C/C+,程序書寫規(guī)范,源程序需加必要的注釋;4、每位同學(xué)需提交可獨(dú)立運(yùn)行的程序;5 、每位同學(xué)需獨(dú)立提交設(shè)計(jì)報(bào)告書(每人一份),要求編排格式統(tǒng)一、規(guī)范、內(nèi)容充實(shí),不少于10頁(yè)(代碼不算);6、課程設(shè)計(jì)實(shí)踐作為培養(yǎng)學(xué)生動(dòng)手能力的一種手段,單獨(dú)考核。3課程設(shè)計(jì)說明書一 需求分析1)選題功能分析【題目的意義】1、 對(duì)高考分?jǐn)?shù)按照總分和不同學(xué)科的分?jǐn)?shù)按照優(yōu)先級(jí)順序排出考生錄取的次序,以滿足不同專業(yè)對(duì)單科分?jǐn)?shù)的要求。2、 對(duì)不同排序策略進(jìn)行綜合比較。【實(shí)現(xiàn)的功能】1、 用C語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)一個(gè)高考成績(jī)排序系統(tǒng)。2、 創(chuàng)建模擬的高考考生成績(jī)表,存放到txt文檔中??忌继?hào)為1,2,3用偽隨機(jī)數(shù)生成器生成各考號(hào)學(xué)生的各個(gè)學(xué)科成績(jī),并計(jì)算總分成績(jī)。3、 由于實(shí)際中高考考生成績(jī)表是已知的(模擬創(chuàng)建的txt文檔),程序能從文件中讀取數(shù)據(jù)。從創(chuàng)建的考生成績(jī)表中讀取數(shù)據(jù),并對(duì)數(shù)據(jù)處理4、 按照學(xué)科的優(yōu)先級(jí)順序,對(duì)學(xué)生的成績(jī)排序。既可以以某一學(xué)科的單科成績(jī)優(yōu)先級(jí)最高排序,也可以先按總分優(yōu)先級(jí)最高來排序。5、 在對(duì)各個(gè)關(guān)鍵字即單科成績(jī)進(jìn)行排序的時(shí)候,分別用穩(wěn)定的內(nèi)部排序法(冒泡法)以及“分配和搜集”的方法進(jìn)行排序。6、 能夠?qū)γ芭莘ㄅ判虿呗院汀胺峙浜退鸭狈椒ㄅ判虿呗赃M(jìn)行的執(zhí)行時(shí)間進(jìn)行比較。7、 輸入數(shù)據(jù):1各科英文首字母的代號(hào),字符型,如smce 2整型數(shù),0-10000 1輸出程序用兩種方法進(jìn)行排序的進(jìn)程和執(zhí)行時(shí)間 2輸出前n名學(xué)生的信息二 概要設(shè)計(jì)1、 偽隨機(jī)生成的數(shù)據(jù)包含語(yǔ)文、數(shù)學(xué)、英語(yǔ)三科成績(jī)??偝煽?jī)?yōu)檎Z(yǔ)文、數(shù)學(xué)、英語(yǔ)三科成績(jī)的和。學(xué)號(hào)按成績(jī)數(shù)組的下標(biāo)賦值,生成學(xué)生成績(jī)記錄,將該記錄保存到txt文檔中2、 從上面的txt文檔中讀取數(shù)據(jù)到一個(gè)二維數(shù)組中,以便對(duì)學(xué)生信息進(jìn)行處理3、 給出排序的優(yōu)先關(guān)系,根據(jù)優(yōu)先關(guān)系由低位向高位逐個(gè)關(guān)鍵字進(jìn)行排序。4、 對(duì)單科成績(jī)進(jìn)行排序的時(shí)候,單科成績(jī)雖然是0-100,但總成績(jī)是0-300,所以要建301個(gè)隊(duì)列進(jìn)行排序,先按“分配”和“搜集”的方法進(jìn)行一趟“基數(shù)排序”;然后再按照穩(wěn)定的內(nèi)部排序法(冒泡法)進(jìn)行排序。將搜集好的或排序好的序列存儲(chǔ),以進(jìn)行對(duì)次優(yōu)先級(jí)的關(guān)鍵字進(jìn)行再排序。5、 將排序好的學(xué)生成績(jī)按照用戶提出的提取人數(shù)的要求,保存到另一個(gè)txt文檔中,并輸出到屏幕6、 系統(tǒng)用到的抽象數(shù)據(jù)類型定義double BubTime1,/按第一個(gè)關(guān)鍵字代表的學(xué)科成績(jī)用冒泡法排序執(zhí)行的時(shí)間 BubTime2,BubTime3,BubTime4,BubTimeSum,/冒泡法排序的總時(shí)間DCTime1,/按第一個(gè)關(guān)鍵字代表的學(xué)科成績(jī)用分配和收集的方法執(zhí)行的時(shí)間DCTime2,DCTime3,DCTime4,DCTimeSum;/分配和收集法排序的總時(shí)間int score100005,/隨機(jī)創(chuàng)建的模擬學(xué)生記錄源數(shù)組bubble100005,/進(jìn)行冒泡法排序時(shí)用來存放學(xué)生記錄源數(shù)組,并且隨排序進(jìn)行數(shù)組中的記錄發(fā)生交換copy100005;/從模擬的學(xué)生記錄源txt文件中讀取學(xué)生記錄到該數(shù)組struct LSD d301;/分配數(shù)組,該處考慮到把總分(0-300)也列入優(yōu)先級(jí)序列中,因此建立了301個(gè)隊(duì)列int *c10000;/用來存放收集到的學(xué)生記錄char x5;/存放有優(yōu)先關(guān)系的學(xué)科代號(hào)序列7、 系統(tǒng)中的各個(gè)函數(shù)模塊 1:void CreatScore(int score100005);/隨機(jī)創(chuàng)建學(xué)生記錄表score。正常高考中該表是已知的,不必創(chuàng)建2:void Collect(struct LSD d301,int *c10000);/LSD法排序中的收集函數(shù),即將分配好的記錄收集到c指針數(shù)組保存3:void InitDivide(struct LSD d301);/用于初始化臨時(shí)分配數(shù)組,在每一次收集后必須做的工作4:double DCSort(struct LSD d301,int *c10000,int n);/分配(Divide)和收集(Collect)排序的方法5:double BubbleSort(int score100005,int n);/冒泡法排序 6:void Print();/將排序結(jié)果文件中的記錄數(shù)據(jù)輸出到屏幕上7:void savesources(int score100005,int n);/將模擬創(chuàng)建的高考學(xué)生信息記錄存放到文件中8:void saveresults(int score100005,int n);/按照用戶的要求(總成績(jī)?cè)谇岸嗌倜膶W(xué)生記錄),將這n條學(xué)生的記錄存放到新的文件中9:void load(int score100005);/從學(xué)生高考記錄源文件中讀取記錄到該二維數(shù)組中8、 各函數(shù)之間的調(diào)用關(guān)系 1:主函數(shù)可以調(diào)用除子函數(shù)2之外的所有函數(shù) 2:子函數(shù)4可以調(diào)用子函數(shù)2和3【功能模塊圖】 MAINInitDivide(d)CreateScore(score)Savesources(score.10000)Lode(copy)DcSort(d,c,0)返回執(zhí)行時(shí)間Collect(d,c)InitDivide(d)BubbleSort(bubble,0)返回執(zhí)行時(shí)間Saveresults(bubble,n)Print()三 詳細(xì)設(shè)計(jì)1.抽象數(shù)據(jù)類型:該數(shù)據(jù)類型是在分配和收集的時(shí)候存放分配成績(jī)數(shù)組1 抽象數(shù)據(jù)類型struct LSDstruct LSD/隊(duì)列的結(jié)構(gòu)類型,鏈表存儲(chǔ)結(jié)構(gòu)類型int *cur;/當(dāng)前位置struct LSD *next;/隊(duì)列中下一個(gè)位置;2 CreatScore(int scoreRecordNumberKeyNumber)函數(shù)/*創(chuàng)建一個(gè)含有RecordNumber名學(xué)生成績(jī)記錄的score,包含語(yǔ)文、數(shù)學(xué)、英語(yǔ)、總分和學(xué)號(hào),隨機(jī)生成語(yǔ)文、數(shù)學(xué)、英語(yǔ)的成績(jī)。*傳遞的參數(shù)是成績(jī)數(shù)組score,無返回值*/void CreatScore(int scoreRecordNumberKeyNumber)/*偽隨機(jī)生成語(yǔ)文、數(shù)學(xué)、英語(yǔ)的成績(jī)*/for(i=0;i< RecordNumber;i+)for(j=0;j<3;j+)scoreij=rand()%101;/成績(jī)的范圍是0-100/*總分成績(jī)初始化*/for(i=0;i< RecordNumber;i+)scorei3=scorei0+scorei1+scorei2;/總成績(jī)?yōu)楦骺瞥煽?jī)之和/*學(xué)號(hào)的初始化*/for(i=0;i< RecordNumber;i+)scorei4=i+1;/學(xué)號(hào)是按從前到后的順序依次賦值的start創(chuàng)建Score10005 含語(yǔ)文、數(shù)學(xué)、英語(yǔ)、總分和學(xué)號(hào)偽隨機(jī)生成語(yǔ)文、數(shù)學(xué)、英語(yǔ)的成績(jī)初始化總分生成學(xué)號(hào),按從前到后順序結(jié)束3收集函數(shù)Collect(struct LSD dQueueNumber,int *cRecordNumber)/*將分配好的成績(jī)數(shù)組d,收集到c指針數(shù)組保存* 傳遞的參數(shù)為分配好的數(shù)組d和收集的指針數(shù)組c,無返回值 */void struct LSD *p;for(i=QueueNumber-1; i>=0; i-)if(di.cur!=NULL)/當(dāng)前隊(duì)列不空,即有學(xué)生的成績(jī)分配到該隊(duì)列p=&di;while(p->cur!=NULL)/當(dāng)前位置有學(xué)生的成績(jī)cj=p->cur;/收集到c指針數(shù)組中j+;p=p->next;/指針p指向該隊(duì)列的下一個(gè)位置當(dāng)前位置有學(xué)生的成績(jī)開始初始化指針數(shù)組建立300個(gè)隊(duì)列隊(duì)列為空YN當(dāng)前位置學(xué)生的成績(jī)收集到指針數(shù)組中指針p指向該隊(duì)列的下一個(gè)位置結(jié)束4初始化分配數(shù)組InitDivide(struct LSD dQueueNumber)/*初始化d數(shù)組即置空,在每一次收集后必須做的工作*傳遞的參數(shù)是struct LSD dQueueNumber,無返回值*/void InitDivide(struct LSD dQueueNumber)for(int i=0;i<QueueNumber;i+)di.cur=NULL;di.next=NULL;5"分配"和"收集"方法排序double DCSort(struct LSD dQueueNumber,int *cRecordNumber,int n)/*"分配"和"收集"方法排序*分配數(shù)組為d,收集數(shù)組為c*進(jìn)行排序的關(guān)鍵字所代表的學(xué)科成績(jī)n在分配數(shù)組中的位置就是n*傳遞的參數(shù)是分配數(shù)組struct LSD dQueueNumber,用來收集的指針數(shù)組int *cRecordNumber,關(guān)鍵字代表的學(xué)科在數(shù)組中的下標(biāo)*/double DCSort(struct LSD dQueueNumber,int *cRecordNumber,int n)/*按關(guān)鍵字代表的學(xué)科成績(jī)將成績(jī)分配到d中*/for(j=0;j<RecordNumber;j+)temp=cjn;/學(xué)生的成績(jī)就是隊(duì)列號(hào)if(dtemp.cur=NULL)/當(dāng)前隊(duì)列為空dtemp.cur=cj;/將cj代表的學(xué)生的成績(jī)添加到該隊(duì)列中p=&dtemp;p1=(struct LSD *)malloc(LENGTH);p1->cur=NULL;p1->next=NULL;p->next=p1;/初始化剛剛添加了學(xué)生記錄的隊(duì)列else/當(dāng)前隊(duì)列不為空p=&dtemp;/*循環(huán),一直到隊(duì)列的結(jié)尾*/while(p->cur!=NULL)p=p->next;p->cur=cj;/將cj代表的學(xué)生的成績(jī)添加到該隊(duì)列中p1=(struct LSD *)malloc(LENGTH);/新申請(qǐng)一個(gè)空間來存放學(xué)生成績(jī)p1->cur=NULL;p1->next=NULL;p->next=p1;/分配完畢Collect(d,c);/將分配好的成績(jī)序列收集到c中InitDivide(d);/初始化分配數(shù)組 return time;/返回執(zhí)行時(shí)間6冒泡法排序double BubbleSort(int bubbleRecordNumberQueueNumber)/*冒泡法排序*傳遞的參數(shù)是學(xué)生成績(jī)記錄int bubbleRecordNumberKeyNumber,關(guān)鍵字所代表學(xué)科成績(jī)?cè)跀?shù)組中的下標(biāo)*/double BubbleSort(int bubbleRecordNumberKeyNumber,int n)for(int i=0;i<RecordNumber;i+)for(int j=0;j<RecordNumber-1-i;j+)if(bubblejn<bubblej+1n)/*交換學(xué)生的各科成績(jī)*/for(int m=0;m<KeyNumber;m+)temp=bubblejm;bubblejm=bubblej+1m;bubblej+1m=temp; return time;/返回排序執(zhí)行的時(shí)間返回執(zhí)行的時(shí)間7 Print()函數(shù)/*從排序結(jié)果存放的文件recordresults.txt中讀取記錄輸出到屏幕上*/void Print() FILE *fp; if(fp=fopen("D:recordresults.txt","rb")=NULL) printf("文件打開失敗!n"); else printf("文件打開成功!n");char t; while(fscanf(fp,"%c",&t)&&!feof(fp)if(t!=EOF)printf("%c",t);/如果讀到結(jié)束符,循環(huán)結(jié)束,輸出結(jié)束fclose(fp);/關(guān)閉文件8 savesources(int scoreRecordNumberKeyNumber,int n)/*保存學(xué)生記錄的函數(shù)*參數(shù)為要保存的學(xué)生記錄和記錄條數(shù)*無返回值*/void savesources(int scoreRecordNumberKeyNumber,int n)FILE *fp;/指向文件的指針if(fp=fopen("D:recordsources.txt","wb")=NULL)/只寫printf("文件打開失敗!n");exit(1);fprintf(fp,"%d",n);/將記錄條數(shù)寫入文件fprintf(fp,"rn");/將換行符號(hào)寫入文件for(i=0;i<n;i+)fprintf(fp,"%-10d%-10d%-10d%-10d%-10d",scorei4,scorei0,scorei1,scorei2,scorei3);/格式寫入記錄fprintf(fp,"rn");/將換行符號(hào)寫入文件fclose(fp);9 saveresults(int scoreRecordNumberKeyNumber,int n)/*保存學(xué)生記錄的函數(shù)*參數(shù)為要保存的學(xué)生記錄和記錄條數(shù)*無返回值*/void saveresults(int scoreRecordNumberKeyNumber,int n)FILE *fp;/指向文件的指針if(fp=fopen("D:recordresults.txt","wb")=NULL)/只寫,打開或建立一個(gè)二進(jìn)制文件,只允許寫數(shù)據(jù)printf("文件打開失敗!n");exit(1);fprintf(fp,"%d",n);/將記錄條數(shù)寫入文件fprintf(fp,"rn");/將換行符號(hào)寫入文件for(i=0;i<n;i+)fprintf(fp,"%-10d%-10d%-10d%-10d%-10d",scorei4,scorei0,scorei1,scorei2,scorei3);/格式寫入記錄fprintf(fp,"rn");/將換行符號(hào)寫入文件fclose(fp);10 load(int scoreRecordNumberKeyNumber)/*讀入函數(shù),把文件中的記錄度入到二維數(shù)組中*參數(shù)為結(jié)構(gòu)體數(shù)組*/void load(int scoreRecordNumberKeyNumber)FILE *fp;if(fp=fopen("D:recordsources.txt","rt")=NULL)/打開文件printf("文件打開失敗!n"); exit(1); fscanf(fp,"%d",&n);/讀入記錄數(shù)for(i=0;i<n;i+)fscanf(fp,"%d %d %d %d %d", &scorei4, &scorei0, &scorei1, &scorei2, &scorei3);/按格式讀入記錄fclose(fp);11算法分析1) LSD算法:這是一種“低位優(yōu)先”的排序方法,借助一趟基數(shù)排序的方法,先按最低位的值對(duì)記錄進(jìn)行初步排序,在此基礎(chǔ)上再按次低位的值進(jìn)行進(jìn)一步排序。以此類推,有低位到高位,每一趟都是在前一趟的基礎(chǔ)上,根據(jù)關(guān)鍵字的某一位對(duì)所有的記錄進(jìn)行排序,直至最高位,這樣就完成了基數(shù)排序的全過程。從算法中可以看出,對(duì)于n個(gè)記錄(每個(gè)記錄含d個(gè)子關(guān)鍵字,每個(gè)子關(guān)鍵字的取值范圍為RADIX個(gè)值)進(jìn)行鏈?zhǔn)脚判虻臅r(shí)間復(fù)雜度為O(d(n+RADIX),其中每一趟分配算法的時(shí)間復(fù)雜度為O(n),每一趟收集的算法的時(shí)間復(fù)雜度為O(RADIX),整個(gè)排序進(jìn)行d趟分配和收集,所需輔助空間為2*RADIX個(gè)隊(duì)列指針。由于需要鏈表作為存儲(chǔ)結(jié)構(gòu),則相對(duì)于其他以順序結(jié)構(gòu)存儲(chǔ)記錄的排序方法而言,還增加了n個(gè)指針域的空間。2) 冒泡法排序:該排序是比較簡(jiǎn)單的交換類排序方法,通過相鄰數(shù)據(jù)元素的交換,逐步將帶排序列變成有序序列的過程。最壞情況下,待排序的記錄按關(guān)鍵字的逆序進(jìn)行排列,此時(shí),每一趟冒泡排序需要進(jìn)行i次比較,3i次移動(dòng)。經(jīng)過n-1趟冒泡排序后,總的比較次數(shù)為N=i=n(n-1)/2,n=1,2,n-1.總的移動(dòng)次數(shù)為3n(n-1)/2次,因此該算法的時(shí)間復(fù)雜度為O(n*n),空間復(fù)雜度為O(1)。另外,冒泡排序法是一種穩(wěn)定的每部排序法。四 測(cè)試成果五 附錄(源程序清單)#include<stdio.h>#include<stdlib.h>#include<time.h>#include<string.h>struct LSD/抽象類型定義,隊(duì)列的結(jié)構(gòu)類型,由于是按LSD法進(jìn)行的排序,所以命名為L(zhǎng)SDint *cur;/當(dāng)前位置struct LSD *next;#define LENGTH sizeof(struct LSD)void CreatScore(int score100005);/隨機(jī)創(chuàng)建學(xué)生記錄表score。正常高考中該表是已知的,不必創(chuàng)建void savesources(int score100005,int n);/將模擬創(chuàng)建的高考學(xué)生信息記錄存放到文件中void load(int score100005);/從學(xué)生高考記錄源文件中讀取記錄到該二維數(shù)組中void Collect(struct LSD d301,int *c10000);/LSD法排序中的收集函數(shù),即將分配好的記錄收集到c指針數(shù)組保存void InitDivide(struct LSD d301);/用于初始化臨時(shí)分配數(shù)組,在每一次收集后必須做的工作double DCSort(struct LSD d301,int *c10000,int n);/分配(Divide)和收集(Collect)排序的方法double BubbleSort(int score100005,int n);/冒泡法排序 void saveresults(int score100005,int n);/按照用戶的要求(總成績(jī)?cè)谇岸嗌倜膶W(xué)生記錄),將這n條學(xué)生的記錄存放到新的文件中void Print();/將排序結(jié)果文件中的記錄數(shù)據(jù)輸出到屏幕上int main()double BubTime1,/按第一個(gè)關(guān)鍵字代表的學(xué)科成績(jī)用冒泡法排序執(zhí)行的時(shí)間BubTime2,BubTime3,BubTime4,BubTimeSum,/冒泡法排序的總時(shí)間DCTime1,/按第一個(gè)關(guān)鍵字代表的學(xué)科成績(jī)用分配和收集的方法執(zhí)行的時(shí)間DCTime2,DCTime3,DCTime4,DCTimeSum;/分配和收集法排序的總時(shí)間int score100005,/隨機(jī)創(chuàng)建的模擬學(xué)生記錄源數(shù)組bubble100005,/進(jìn)行冒泡法排序時(shí)用來存放學(xué)生記錄源數(shù)組,并且隨排序進(jìn)行數(shù)組中的記錄發(fā)生交換copy100005;/從模擬的學(xué)生記錄源txt文件中讀取學(xué)生記錄到該數(shù)組struct LSD d301;/分配數(shù)組,該處考慮到把總分(0-300)也列入優(yōu)先級(jí)序列中,因此建立了301個(gè)隊(duì)列int *c10000;/用來存放收集到的學(xué)生記錄char x5;/存放有優(yōu)先關(guān)系的學(xué)科代號(hào)序列/*初始化c,使其與score函數(shù)"同步"*/for(int i=0;i<10000;i+)ci=scorei;InitDivide(d);/初始化隊(duì)列 /*在實(shí)際中全部學(xué)生的高考記錄是存放在一個(gè)文件中的,程序運(yùn)行時(shí)是從該文件中讀取的源記錄數(shù)據(jù)。*本程序要求隨機(jī)模擬創(chuàng)建該文件,所以下面要?jiǎng)?chuàng)建每個(gè)學(xué)生的記錄(CreatScore())并保存到一個(gè)文件中(save())*調(diào)用這兩個(gè)函數(shù)后就生成了全部學(xué)生的記錄*/CreatScore(score);/偽隨機(jī)生成各科成績(jī),并將考號(hào)和總成績(jī)一并生成在score數(shù)組中savesources(score,10000);/將隨機(jī)生成的記錄信息保存在record.txt中,該文件在程序運(yùn)行的時(shí)候是不變的load(copy);/從源記錄文件record.txt中讀取學(xué)生記錄到數(shù)組copy中/*為了防止改變?cè)从涗?,在進(jìn)行冒泡法排序的時(shí)候用bubble這個(gè)數(shù)組*/for(i=0;i<10000;i+)for(int j=0;j<5;j+)bubbleij=copyij;/將源記錄賦值給bubble數(shù)組printf("請(qǐng)輸入您要按照哪種優(yōu)先級(jí)順序?qū)W(xué)生成績(jī)進(jìn)行排序:比如(總分,數(shù)學(xué),語(yǔ)文,英語(yǔ))n就請(qǐng)輸入smce(即各科的英文首字母序列)");scanf("%s",x);/輸入進(jìn)行排序的關(guān)鍵字的優(yōu)先序列for(i=3;i>=0;i-)printf("nn現(xiàn)在程序正在按%c代表的學(xué)科進(jìn)行成績(jī)分配,請(qǐng)稍后",xi);switch(xi)case c:/ChineseDCTime1=DCSort(d,c,0);/按語(yǔ)文這個(gè)關(guān)鍵字用分配和收集法排序,并返回時(shí)間BubTime1=BubbleSort(bubble,0);/按語(yǔ)文這個(gè)關(guān)鍵字用冒泡法排序break; case m:/MathDCTime2=DCSort(d,c,1);BubTime2=BubbleSort(bubble,1);break;case e:/EnglishDCTime3=DCSort(d,c,2);BubTime3=BubbleSort(bubble,2);break;case s:/SumDCTime4=DCSort(d,c,3);BubTime4=BubbleSort(bubble,3);break;default:printf("您輸入的科目代號(hào)錯(cuò)誤n");/輸入代號(hào)錯(cuò)誤提示break;DCTimeSum=DCTime1+DCTime2+DCTime3+DCTime4;/分配排序法的總時(shí)間等于按照各個(gè)關(guān)鍵字進(jìn)行排序的分時(shí)間的和BubTimeSum=BubTime1+BubTime2+BubTime3+BubTime4;printf("n用分配和收集的方法排序,執(zhí)行的總時(shí)間為:%.3fn",DCTimeSum);printf("用冒泡法排序,執(zhí)行的總時(shí)間為:%.3fn",BubTimeSum);printf("n請(qǐng)問您要提取多少條學(xué)生的成績(jī)信息(0-10000):");int n;scanf("%d",&n);saveresults(bubble,n);/將前n名學(xué)生的記錄保存在結(jié)果文件recordresults.txt中Print();/從結(jié)果文件recordresults.txt中讀取記錄到屏幕上return 0;/*創(chuàng)建一個(gè)含有10000名學(xué)生成績(jī)記錄的score,包含語(yǔ)文、數(shù)學(xué)、英語(yǔ)、總分和學(xué)號(hào),隨機(jī)生成語(yǔ)文、數(shù)學(xué)、英語(yǔ)的成績(jī)。*傳遞的參數(shù)是成績(jī)數(shù)組score,無返回值*/void CreatScore(int score100005)int i,j;srand(time(NULL);/利用時(shí)間設(shè)置隨機(jī)種子產(chǎn)生隨機(jī)數(shù)/*偽隨機(jī)生成語(yǔ)文、數(shù)學(xué)、英語(yǔ)的成績(jī)*/for(i=0;i<10000;i+)for(j=0;j<3;j+)scoreij=rand()%101;/成績(jī)的范圍是0-100/*總分成績(jī)初始化*/for(i=0;i<10000;i+)scorei3=scorei0+scorei1+scorei2;/總成績(jī)?yōu)楦骺瞥煽?jī)之和/*學(xué)號(hào)的初始化*/for(i=0;i<10000;i+)scorei4=i+1;/學(xué)號(hào)是按從前到后的順序依次賦值的/*保存學(xué)生記錄的函數(shù)*參數(shù)為要保存的學(xué)生記錄和記錄條數(shù)*無返回值*/void savesources(int score100005,int n)printf("n程序正在模擬創(chuàng)建10000條高考成績(jī)記錄并保存到文件D:recordresources.txt中,n請(qǐng)稍后n");/輸出提示信息int i;FILE *fp;/指向文件的指針if(fp=fopen("D:recordsources.txt","wb")=NULL)/只寫,打開或建立一個(gè)二進(jìn)制文件,只允許寫數(shù)據(jù)printf("文件打開失敗!n");exit(1);fprintf(fp,"%d",n);/將記錄條數(shù)寫入文件fprintf(fp,"rn");/將換行符號(hào)寫入文件for(i=0;i<n;i+)fprintf(fp,"%-10d%-10d%-10d%-10d%-10d",scorei4,scorei0,scorei1,scorei2,scorei3);/格式寫入記錄fprintf(fp,"rn");/將換行符號(hào)寫入文件fclose(fp);printf("文件創(chuàng)建并保存成功!n您可以通過路徑D:recordsources.txt進(jìn)行查看。nnn"); /*讀入函數(shù),把文件中的記錄度入到二維數(shù)組中*參數(shù)為結(jié)構(gòu)體數(shù)組*/void load(int score100005)int i,n;FILE *fp;if(fp=fopen("D:recordsources.txt","rt")=NULL)/打開文件printf("文件打開失敗!n"); exit(1); fscanf(fp,"%d",&n);/讀入記錄數(shù)for(i=0;i<n;i+)fscanf(fp,"%d %d %d %d %d", &scorei4, &scorei0, &scorei1, &scorei2, &scorei3);/按格式讀入記錄fclose(fp);printf("*排序系統(tǒng)開始運(yùn)行*n");printf("首先是從模擬高考成績(jī)?cè)次募ecordsources.txt中讀取數(shù)據(jù)!n正在讀取數(shù)據(jù),請(qǐng)稍后n");printf("成功從源文件中讀取 %d 條記錄到排序系統(tǒng)中nn", n);/*將分配好的成績(jī)數(shù)組d,收集到c指針數(shù)組保存* 傳遞的參數(shù)為分配好的數(shù)組d和收集的指針數(shù)組c,無返回值 */void Collect(struct LSD d301,int *c10000)int i,j=0;struct LSD *p;for(i=300; i>=0; i-)/因?yàn)榘偝煽?jī)(0-300)的優(yōu)先級(jí),所以共分配的隊(duì)列為0-300if(di.cur!=NULL)/當(dāng)前隊(duì)列不空,即有學(xué)生的成績(jī)分配到該隊(duì)列p=&di;while(p->cur!=NULL)/當(dāng)前位置有學(xué)生的成績(jī)cj=p->cur;/收集到c指針數(shù)組中j+;p=p->next;/指針p指向該隊(duì)列的下一個(gè)位置/*初始化d數(shù)組即置空,在每一次收集后必須做的工作*傳遞的參數(shù)是struct LSD d301*/void InitDivide(struct LSD d301)for(int i=0;i<301;i+)di.cur=NULL;di.next=NULL;/*"分配"和"收集"方法排序*分配數(shù)組為d,收集數(shù)組為c*進(jìn)行排序的關(guān)鍵字所代表的學(xué)科成績(jī)n在分配數(shù)組中的位置就是n*傳遞的參數(shù)是分配數(shù)組struct LSD d301,用來收集的指針數(shù)組int *c10000,關(guān)鍵字代表的學(xué)科在數(shù)組中的下標(biāo)*/double DCSort(struct LSD d301,int *c10000,int n)double time;clock_t t_start;/時(shí)間記錄的開始 clock_t t_end;/時(shí)間記錄的結(jié)束 t_start=clock();/獲取排序開始的時(shí)間int j,temp;struct LSD *p,*p1;/*按關(guān)鍵字代表的學(xué)科成績(jī)將成績(jī)分配到d中*/for(j=0;j<10000;j+)temp=cjn;/學(xué)生的成績(jī)就是隊(duì)列號(hào)if(dtemp.cur=NULL)/當(dāng)前隊(duì)列為空dtemp.cur=cj;/將cj代表的學(xué)生的成績(jī)添加到該隊(duì)列中p=&dtemp;p1=(struct LSD *)malloc(LENGTH);p1->cur=NULL;p1->next=NULL;p->next=p1;/初始化剛剛添加了學(xué)生記錄的隊(duì)列else/當(dāng)前隊(duì)列不為空p=&dtemp;/*循環(huán),一直到隊(duì)列的結(jié)尾*/while(p->cur!=NULL)p=p->next;p->cur=cj;/將cj代表的學(xué)生的成績(jī)添加到該隊(duì)列中p1=(struct LSD *)malloc(LENGTH);/新申請(qǐng)一個(gè)空間來存放學(xué)生成績(jī)p1->cur=NULL;p1->next=NULL;p->next=p1;/分配完畢printf("n分配完畢,下面開始進(jìn)行收集,請(qǐng)稍后n");Collect(d,c);/將分配好的成績(jī)序列收集到c中printf("收集完畢。n");InitDivide(d);/初始化分配數(shù)組t_end = clock();/獲取結(jié)束測(cè)試點(diǎn)的時(shí)間time=(double)(t_end-t_start)/CLOCKS_PER_SEC;printf("本次分配和收集用時(shí): %.3f sn",time); return time;/返回執(zhí)行時(shí)間/*冒泡法排序*傳遞的參數(shù)是學(xué)生成績(jī)記錄int bubble100005,關(guān)鍵字所代表學(xué)科成績(jī)?cè)跀?shù)組中的下標(biāo)*/double BubbleSort(int bubble100005,int n)printf("n下面開始用冒泡法進(jìn)行排序,請(qǐng)稍后n");double time; clock_t t_start; clock_t t_end; t_start=clock();int temp;for(int i=0;i<10000;i+)for(int j=0;j<9999-i;j+)if(bubblejn<bubblej+1n)/*交換學(xué)生的各科成績(jī)*/for(int m=0;m<5;m+)temp=bubblejm;bubblejm=bubblej+1m;bubblej+1m=temp; t_end = clock();time=(double)(t_end-t_start)/CLOCKS_PER_SEC;printf("本次冒泡法排序用時(shí): %.3f snn",time); return time;/返回排序執(zhí)行的時(shí)間/*保存學(xué)生記錄的函數(shù)*參數(shù)為要保存的學(xué)生記錄和記錄條數(shù)*無返回值*/void saveresults(int score100005,int n)int i;FILE *fp;/指向文件的指針if(fp=fopen("D:recordresults.txt","wb")=NULL)/只寫,打開或建立一個(gè)二進(jìn)制文件,只允許寫數(shù)據(jù)printf("文件打開失敗!n");exit(1);fprintf(fp,"%d",n);/將記錄條數(shù)寫入文件fprintf(fp,"rn");/將換行符號(hào)寫入文件for(i=0;i<n;i+)fprintf(fp,"%-10d%-10d%-10d%-10d%-10d",scorei4,scorei0,scorei1,scorei2,scorei3);/格式寫入記錄fprintf(fp,"rn");/將換行符號(hào)寫入文件fclose(fp);/*從排序結(jié)果存放的文件recordresults.txt中讀取記錄輸出到屏幕上*/void Print() FILE *fp; if(fp=fopen("D:recordresults.txt","rb")=NULL) printf("文件打開失敗!n"); else printf("文件打開成功!n");char t; while(fscanf(fp,"%c",&t)&&!feof(fp)if(t!=EOF)printf("%c",t);/如果讀到結(jié)束符,循環(huán)結(jié)束,輸出結(jié)束fclose(fp);/關(guān)閉文件六 用戶手冊(cè)本程序的運(yùn)行環(huán)境為DOS系統(tǒng),執(zhí)行文件為“LSDSort.exe”進(jìn)入程序后的界面如下:用戶此時(shí)可以按路徑D:recordresources.txt文檔中查看模擬高考成績(jī)表自動(dòng)計(jì)算出分配收集法和冒泡法分別所需要的時(shí)間,綜合比較兩種方法按照提示輸入自己要求的各個(gè)成績(jī)的優(yōu)先關(guān)系序列,然后程序自動(dòng)進(jìn)入排序系統(tǒng),最后程序就將分配和收集的過程以及冒泡法排序的過程分別輸出,最后得到排序結(jié)果。然后會(huì)到下面的界面:即提示用戶輸入錄取的學(xué)生數(shù)目,由于把全部成績(jī)輸出對(duì)于高校錄取并沒有用,所以只要按一定的人數(shù)提取記錄就可以了4.課程設(shè)計(jì)心得這次課程設(shè)計(jì)收獲很大,從一開始的迷迷糊糊不明白題意,到現(xiàn)在很清楚該設(shè)計(jì)的各個(gè)方面,我在無數(shù)次的調(diào)試過程中學(xué)到了很多有用的東西1、模塊化的思想。使程序模塊化之后,可以很方便的調(diào)用和對(duì)某個(gè)模塊的修改,我由于一開始對(duì)題目的要求不到位,在最后驗(yàn)收的時(shí)候發(fā)現(xiàn)一些功能未實(shí)現(xiàn)的問題,如果我的程序很亂,函數(shù)之間沒有清晰的調(diào)用關(guān)系,參數(shù)傳遞混亂的話,我就很難修改它,但是我用了模塊化的思想,在很短的時(shí)間之內(nèi)就將程序添加了文件流操作的功能,使程序更加滿足實(shí)際要求,也更加清晰?,F(xiàn)在可以很容易添加一個(gè)不同的功能模塊。2、調(diào)試技巧。在調(diào)試過程中同學(xué)們遇到了很多不同的錯(cuò)誤,比如:錯(cuò)誤提示如下Cpp1.obj : error LNK2001: unresolved external symbol "void _cdecl CreatScore(int (* const)5)" (?CreatScoreYAXQAY04HZ)Debug/Cpp1.exe : fatal error LNK1120: 1 unresolved externals。根據(jù)以前的經(jīng)驗(yàn)知道這是連接上出了錯(cuò),而且以前遇到類似的錯(cuò)誤是因?yàn)閭鬟f的參數(shù)不同而導(dǎo)致的,現(xiàn)在也想到估計(jì)是同樣的問題,但是看程序,參數(shù)傳遞正常。后來在找CreatScore時(shí)發(fā)現(xiàn)我不知道什么時(shí)候把它剪切了,這就好像是聲明了程序要用CreatScore,而且也用了,但是并沒有說明CreatScore是什么,它是怎樣實(shí)現(xiàn)的。 3、調(diào)試技巧。調(diào)試的時(shí)候我一般都是用F10和F20進(jìn)行調(diào)試,問老師的時(shí)候又學(xué)到了設(shè)置斷點(diǎn)的方法調(diào)試程序,這樣可以通過猜想,對(duì)某一段代碼進(jìn)行調(diào)試,省去了很多步驟。4、分析問題的技巧。這個(gè)和設(shè)置斷點(diǎn)的方法類似,例如在判斷打開文件是否成功時(shí),由于有三個(gè)函數(shù)要打開和關(guān)閉文件,而且從無提示都一樣:文件打開失敗。這樣在運(yùn)行程序時(shí),如果文件真的打開失敗了,就很難知道哪塊函數(shù)出問題了,所以可以設(shè)置不同的提示信息,來很清楚的追蹤到程序的運(yùn)行,還有就是發(fā)送錯(cuò)誤報(bào)告,這種問題出現(xiàn)時(shí)總感覺不知道如何下手修改,因?yàn)楹茈y知道錯(cuò)誤的發(fā)生點(diǎn),這是我們就可以設(shè)置輸出提示信息:“程序已經(jīng)運(yùn)行到這里了”這樣我們就可以從它是否輸出該提示信息來了解程序是否正常運(yùn)行到某個(gè)位置。5、在修改錯(cuò)誤的時(shí)候也要有至頂向下的修改方法,因?yàn)楹竺娴腻e(cuò)誤很可能就是勤勉的定義錯(cuò)誤,從上到下改,我們可以發(fā)現(xiàn)有時(shí)候錯(cuò)誤從80多個(gè)一下子就變成兩三個(gè)了,通過這個(gè)我們也可以看到不同的錯(cuò)誤所影響的范圍,對(duì)我們變成中的側(cè)重點(diǎn)也有幫助6、指針和地址的使用。在進(jìn)行文件操作時(shí),我有一個(gè)功能就是從文件中讀取學(xué)生記錄到一個(gè)二維數(shù)組中,感覺寫的沒錯(cuò),可是輸出來的結(jié)果總是一個(gè)符合格式要求的地址結(jié)果,經(jīng)過老師的指導(dǎo),我知道了在讀取的時(shí)候應(yīng)該把數(shù)據(jù)存放在數(shù)組的地址中,而我卻是按賦值的錯(cuò)誤想法做的。7、冒泡法排序。我認(rèn)為這個(gè)排序的算法很簡(jiǎn)單,所以用到的時(shí)候沒有按照書上的算法,直接自己寫了一個(gè)冒泡排序,而且一直深信我的這個(gè)排序是正確的,可是結(jié)果總是出現(xiàn)錯(cuò)誤,排序結(jié)果并不正確,后

注意事項(xiàng)

本文(數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)多關(guān)鍵字排序高考排序)為本站會(huì)員(仙***)主動(dòng)上傳,裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng)(點(diǎn)擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因?yàn)榫W(wǎng)速或其他原因下載失敗請(qǐng)重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!