算法與數(shù)據(jù)結(jié)構(gòu)課設(shè)1排序重構(gòu)問題2.數(shù)據(jù)刪除問題3.課程選修問題_第1頁
算法與數(shù)據(jù)結(jié)構(gòu)課設(shè)1排序重構(gòu)問題2.數(shù)據(jù)刪除問題3.課程選修問題_第2頁
算法與數(shù)據(jù)結(jié)構(gòu)課設(shè)1排序重構(gòu)問題2.數(shù)據(jù)刪除問題3.課程選修問題_第3頁
算法與數(shù)據(jù)結(jié)構(gòu)課設(shè)1排序重構(gòu)問題2.數(shù)據(jù)刪除問題3.課程選修問題_第4頁
算法與數(shù)據(jù)結(jié)構(gòu)課設(shè)1排序重構(gòu)問題2.數(shù)據(jù)刪除問題3.課程選修問題_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

摘要此次算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計主要解決三個問題,主要為排序重構(gòu)問題、數(shù)據(jù)刪除問題、課程選修問題。第一道題是排序重構(gòu)問題。具體要求是由題目給出的一個順序序列按照題目給定的相關(guān)計算方法得到新的序列,然后對計算方法進(jìn)行逆推得到新的順序序列,由于計算方法我們得到的序列并不唯一。第二道題是數(shù)據(jù)刪除問題。主要實現(xiàn)對重復(fù)的數(shù)據(jù)的刪除,采用單鏈表對數(shù)據(jù)進(jìn)行操作和運行等,通過該題的設(shè)計過程,可以熟練掌握對隨機產(chǎn)生數(shù)組和單鏈表的操作和節(jié)點的刪除以及遞歸函數(shù)。第三道題是課程選修問題。學(xué)生需要修一定數(shù)量的課程才能畢業(yè),而這些課程會有一些必須遵循的選修順序。假設(shè)每個學(xué)期都開所有課程,并且學(xué)生所修課程數(shù)量不限制。給出課程和先修課程的列表,主要實現(xiàn)對對輸入的字符串進(jìn)行重新排序,以最短字符在最前的順序??梢赃M(jìn)一步了解課本上排序的的相關(guān)知識。關(guān)鍵字:數(shù)據(jù)結(jié)構(gòu);算法分析;刪除;排序;重構(gòu)

一.排序重構(gòu)問題令A(yù)為一個由N個已特殊排序數(shù)組成的數(shù)列:A1,A2,…,AN,其中A1=0。令B為N(N-1)/2個數(shù)(定義為Bij=Ai-Aj(i>j))組成的數(shù)列。例如,A=0,1,5,8,那么D=1,3,4,5,7,8。請完成:編寫程序,根據(jù)A構(gòu)造D;編寫程序,構(gòu)造與D相對應(yīng)的某一個數(shù)列A,注意A不是唯一的。(4)1.采用類語言定義相關(guān)的數(shù)據(jù)類型數(shù)據(jù)結(jié)構(gòu):結(jié)構(gòu)體。typedefstruct{intdata[MAX];//一維數(shù)組intflag[MAX];//表示判斷的變量intsize;}array;2.算法設(shè)計首先用題目給的順序序列按照題目給的規(guī)律生成序列D,然后根據(jù)D生成A,經(jīng)過分析我們發(fā)現(xiàn)后來生成的A里面的元素一定是D里面的元素,即A為D的子集,這樣得到算法:從D里面找到和A的個數(shù)一樣的元素,然后按照題目給的那個算法生成D1,當(dāng)D1和D完全相等的時候,我們找到的那幾個元素就是A的一個組合。3.函數(shù)的調(diào)用關(guān)系圖如圖所示:開始開始輸入A輸入A生成A生成A生成D圖.1-14.調(diào)試分析剛開始看這題時,感覺好難而且編程時還沒有思路,后來上網(wǎng)查閱了資料還有和同學(xué)們討論了之后,最終解決了。由于采用了三重循環(huán)進(jìn)行組合計算,所以算法時間復(fù)雜度為O(n^3),空間復(fù)雜度O(n)5.測試結(jié)果如圖所示:圖.1-2輸入:4;0158輸出:B=:134578數(shù)組:01580378滿足條件6.源程序(帶注釋)typedefstruct{intdata[MAX];intflag[MAX];intsize;}array;intCREATE_NEW_A(){FILE*fp;arrayb,a;//b原始數(shù)據(jù)存儲.a,構(gòu)造的用于判斷的結(jié)構(gòu)體inti,j,z;a.data[0]=0;printf("數(shù)組:\n");for(i=0;i<b.size;i++)for(j=i+1;j<b.size;j++)for(z=j+1;z<b.size;z++){a.data[1]=b.data[i];a.data[2]=b.data[j];a.data[3]=b.data[z];a.size=4;COMPARE(&a,ch);}printf("滿足條件\n");return0;}intmax;intCOMPARE(array*a,charch[MAX]){FILE*fp;arrayd;arrayb;inti,j,k=0,n,x,y,z;for(i=0;i<a->size;i++){x=a->data[i];for(j=i+1;j<a->size;j++){y=a->data[j];b.data[k]=y-x;k++;}}b.size=k;sort(&b);fwrite(&b,1,sizeof(array),fp);fclose(fp);if((fp=fopen("數(shù)組B.c","rb"))==NULL){printf("文件打開失??!\n");exit(0);}while(!feof(fp)){fread(&d,1,sizeof(array),fp);}fclose(fp);for(i=0;i<d.size;i++){if(b.data[i]!=d.data[i])break;}if(i==d.size){for(i=0;i<a->size;i++)printf("%d",a->data[i]);printf("\n");}return0;}二.?dāng)?shù)據(jù)刪除問題編寫刪除具有N個數(shù)據(jù)項的數(shù)組A中所有重復(fù)項的程序,返回A中仍有的數(shù)據(jù)項。要求運行時間在O(NlogN)。1.采用類語言定義相關(guān)的數(shù)據(jù)類型typedefstructStackNode{ //結(jié)點結(jié)構(gòu)體 chardata; structStackNode*next;}StackNode,*LinkStackPtr;typedefstructLinkStack{ //鏈棧結(jié)構(gòu)體 LinkStackPtrtop; intcount;}LinkStack;2.算法設(shè)計產(chǎn)生隨機數(shù)組。利用隨機數(shù)組創(chuàng)建鏈表。用x數(shù)組中的n個數(shù)據(jù)創(chuàng)建一個單鏈表,返回表頭節(jié)點地址。刪除重復(fù)節(jié)點:遞歸函數(shù)。從輸入?yún)?shù)節(jié)點出發(fā),刪去值相同的多余節(jié)點的算法。3.函數(shù)的調(diào)用關(guān)系圖如圖所示:MMain()for()刪除for()刪除for()排序圖.2-14.調(diào)試分析a、時間復(fù)雜度的問題讓我很為難,一開始不知道如何下手好,后來查找課本決定使用二分查找。b、算法的時間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(n)5.測試結(jié)果如圖所示:圖.2-2輸入10個數(shù):123151321463223預(yù)期結(jié)果:12313152132466.源程序(帶注釋)#include<stdio.h>main(){inti,j,t;inta[10];printf("請輸入10個數(shù):\n");for(i=0;i<10;i++)//輸入scanf("%d",&a[i]);printf("輸入的10個數(shù)是:");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");Afor(i=0;i<10;i++)//排序{for(j=i+1;j<10;j++){if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}}}printf("10個數(shù)排序后是:");for(i=0;i<10;i++){printf("%d",a[i]);}printf("\n");for(i=0;i<9;i++)//刪除重復(fù)數(shù)字{if(a[i]==a[i+1])//如果后一個數(shù)等于前一個數(shù),就把后一個數(shù)刪掉(ps:這里已經(jīng)排過序,所以可以這樣做來刪除重復(fù)數(shù)字){for(j=i+1;j<9;j++)//這里的刪除用的直接覆蓋a[j]=a[j+1];}}printf("刪除重復(fù)數(shù)字后:");for(i=0;i<10;i++){if(i>0&&a[i-1]==a[i])//只輸出前面不重復(fù)的數(shù)break;printf("%d",a[i]);}printf("\n");}

三.課程選修問題學(xué)生需要修一定數(shù)量的課程才能畢業(yè),而這些課程會有一些必須遵循的選修順序。假設(shè)每個學(xué)期都開所有課程,并且學(xué)生所修課程數(shù)量不限制。給出課程和先修課程的列表,求出一個滿足最小學(xué)期數(shù)要求的時間表。以你的專業(yè)情況為背景設(shè)計。1.采用類語言定義相關(guān)的數(shù)據(jù)類型structstring{ chars[MaxSize];};typedefstructstringDataType;2.算法設(shè)計在設(shè)計這個題目的的時候,要用到關(guān)鍵路徑。算法如下:voidinsert(){ voidmain(); FILE*fp; structcoursec; intcount; inti; if((fp=fopen("course.txt","a+"))==NULL) { printf("cannotopenfile\n"); } printf("\n請輸入課程門數(shù):\n"); scanf("%d",&count);printf("課程編號課程名稱課程性質(zhì)總學(xué)時授課學(xué)時實驗或上機學(xué)時學(xué)分開課學(xué)期:\n");錄入并瀏覽選課信息進(jìn)入選課操作查詢并統(tǒng)計3.函數(shù)的調(diào)用關(guān)系圖如圖所示:學(xué)生選課系統(tǒng)學(xué)生選課系統(tǒng)修改與刪除課程信息錄入選課信息修改與刪除課程信息錄入選課信息查詢選課信息瀏覽選課信息查詢選課信息瀏覽選課信息按學(xué)分查詢按性質(zhì)查詢性質(zhì)名稱學(xué)分編號按學(xué)分查詢按性質(zhì)查詢性質(zhì)名稱學(xué)分編號圖.3-1intmain(void)調(diào)試分析intmain(void)Voidsearch()Voidbrowser()Voidsearch()Voidbrowser()Voidinsert()Voidxuanke()Voidxuanke_situation()圖.3-2假定有n門課程,每門課程有:課程編號,課程名稱,課程性質(zhì)(公共課、必修課、選修課),總學(xué)時,授課學(xué)時,實驗或上機學(xué)時,學(xué)分,開課學(xué)期等信息,學(xué)生可按要求(如總學(xué)分不得少于60)自由選課。試設(shè)計一選修課程系統(tǒng),使之能提供以下功能:1、系統(tǒng)以菜單方式工作2、課程信息錄入功能(課程信息用文件保存)3、課程信息瀏覽功能4、課程信息查詢功能查詢方式按學(xué)分查詢按課程性質(zhì)查詢5、學(xué)生選修課程(可選項)通過課程設(shè)計的實踐環(huán)節(jié)的教學(xué),可以加深學(xué)生對課堂所學(xué)基礎(chǔ)知識的掌握與理解,提高學(xué)生對所學(xué)內(nèi)容的綜合運用能力;同時也可以通過查詢相關(guān)資料,培養(yǎng)學(xué)生自學(xué)能力、接受新知識的能力,提高學(xué)習(xí)興趣;增強學(xué)生程序設(shè)計能力,掌握編程技巧,并可培養(yǎng)學(xué)生實際上機調(diào)試程序的能力?!袄碚撆c實踐”相結(jié)合,使學(xué)生得到很好的鍛煉,為以后學(xué)習(xí)、工作打下堅實的基礎(chǔ)。在輸入字符串的時候用空格間隔字符串,使得結(jié)果不能正常輸入。字符串之間的間隔輸入不能用空格,必須用換行。算法的時間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(n)5.測試結(jié)果如下圖所示:學(xué)生選課系統(tǒng):圖.3-3錄入選課信息:圖.3-4輸入選課信息:01英語必修363604201302大物選修202002201403算法數(shù)據(jù)結(jié)構(gòu)必修3630652015輸出結(jié)果:01英語必修363604201302大物選修202002201403算法數(shù)據(jù)結(jié)構(gòu)必修3630652015瀏覽選課信息:圖.3-5輸入:2輸出:1英語必修36360420132大物選修20200220143算法數(shù)據(jù)結(jié)構(gòu)必修3630652015查詢選課信息:圖.3-6輸入:3;再輸入:1;再輸入:5輸出:3算法與數(shù)據(jù)結(jié)構(gòu)必修3630652015統(tǒng)計選課情況:圖.3-7輸入:4輸出:135402161英語135402162大物135402163算法數(shù)據(jù)結(jié)構(gòu)6.源程序(帶注釋)structcourse{ intnum; charname[20]; charkind[10]; inttime; intttime; intetime; intmark; intterm;};structstudent{ intsnum; intcnum; charcname[20];};/*課程信息錄入*/voidinsert(){ voidmain(); FILE*fp; structcoursec; intcount; inti; if((fp=fopen("course.txt","a+"))==NULL) { printf("cannotopenfile\n"); } printf("\n請輸入課程門數(shù):\n"); scanf("%d",&count); printf("課程編號課程名稱課程性質(zhì)總學(xué)時授課學(xué)時實驗或上機學(xué)時學(xué)分開課學(xué)期:\n"); fclose(fp);main();}/*課程信息瀏覽*/voidbrowser(){ voidmain(); FILE*fp; structcoursec; inta; if((fp=fopen("course.txt","r"))==NULL) { printf("\nCannotopencourse!\n"); } printf("課程編號課程名稱課程性質(zhì)總學(xué)時授課學(xué)時實驗或上機學(xué)時學(xué)分開課學(xué)期:\n"); fclose(fp); printf("\n1-返回主菜單;2-退出選課系統(tǒng)\n"); scanf("%d",&a); if(a==1) main(); else exit(0);}/*課程信息查詢*/voidsearch(){ voidmain(); FILE*fp; structcoursec; intscore; charkind[10]; inta; intb; printf("1.按學(xué)分查詢,2.按課程性質(zhì)查詢.\n"); printf("請選擇查詢方式,輸入選項數(shù)字:"); scanf("%d",&b); if(b==1) { printf("\n請輸入您要查詢的學(xué)分:\n"); scanf("%d",&score);if((fp=fopen("course.txt","r"))==NULL) { printf("\nCannotopencourse!\n"); } printf("課程編號課程名稱課程性質(zhì)總學(xué)時授課學(xué)時實驗或上機學(xué)時學(xué)分開課學(xué)期:\n"); } } elseif(b==2){ printf("\n請輸入您要查詢的課程性質(zhì):\n"); scanf("%s",&kind);if((fp=fopen("course.txt","r"))==NULL) { printf("\nCannotopencourse!\n"); } printf("課程編號課程名稱課程性質(zhì)總學(xué)時授課學(xué)時實驗或上機學(xué)時學(xué)分開課學(xué)期:\n"); } } else{ printf("輸入錯誤!"); exit(1); } fclose(fp); printf("\n1-返回主菜單;2-退出選課系統(tǒng)\n"); scanf("%d",&a); if(a==1) main(); else exit(0);}/*統(tǒng)計選課情況*/voidxuanke_situation(){ voidmain(); inttotal=0; inta; FILE*fp; structstudents; if((fp=fopen("student.txt","r"))==NULL) { printf("\nCannotopenstudent!\n"); } printf("學(xué)號課程編號課程名稱\n"); printf("\n選課學(xué)生總?cè)藬?shù)為:%d人",total); fclose(fp); printf("\n1-返回主菜單;2-退出選課系統(tǒng)\n"); scanf("%d",&a); if(a==1) main(); else exit(0);}/*學(xué)生選修課程*/voidxuanke(){ voidmain();structstudents; structcoursec; inta; FILE*fp; printf("\n請輸入您的學(xué)號及您要選擇的課程編號:"); scanf("%d%d",&s.snum,&um); if((fp=fopen("course.txt","r"))==NULL) { printf("\nCannotopencourse!\n"); } if(um==c.num) break; } fclose(fp); if((fp=fopen("student.txt","a+"))==NULL) { printf("\nCannotopenstudent!\n"); } fprintf(fp,"%d%d%s\n",s.snum,um,); fclose(fp); printf("\n1-返回主菜單;2-退出選課系統(tǒng)\n"); scanf("%d",&a); if(a==1) main(); else exit(0);}/*主菜單*/voidmain(){ intn,w=0; printf("********************************************************************************\n"); printf("學(xué)生選課系統(tǒng)菜單\n"); printf("********************************************************************************\n"); printf("1-錄入選課信息\n"); printf("2-瀏覽選課信息\n"); printf("3-查詢選課信息\n"); printf("4-統(tǒng)計選課情況\n"); printf("5-進(jìn)入選課操作\n"); printf("0-退出選課系統(tǒng)\n"); printf("********************************************************************************\n"); printf("請選擇輸入選項前數(shù)字:"); scanf("%d",&n); do { if(n>5||n<0) {printf("\n輸入錯誤!請重新輸入!\n"); scanf("%d",&n); } elsew=1; }while(w==0); switch(n) {case1:insert();break; case2:browser();break; case3:search();break; case4:xuanke_information();break; case5:xuan_ke();break; case0:exit(0); }return;}PAGEPAGE27總結(jié)在兩周的學(xué)習(xí)和實踐過程中,通過解決排序重構(gòu)、數(shù)據(jù)刪除、課程選修這三個實際問題,讓我對算法與數(shù)據(jù)結(jié)構(gòu)有了更深的了解,對數(shù)據(jù)結(jié)構(gòu)也產(chǎn)生了更加濃厚的興趣,同時也是對我解決實際問題能力的一次提升。記得老師給我們上課時就要不斷的通過走算法的方式,掌握所學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)、算法等,而上機則能進(jìn)一步鞏固自己所學(xué)的知識、提高自己的學(xué)習(xí)能力。在上機的同時也改正了自己對某些算法的錯誤使用,使自己能在通過程序解決問題時抓住關(guān)鍵算法,能夠很好的構(gòu)造出解決問題的數(shù)據(jù)結(jié)構(gòu)、算法的設(shè)計思想和流程圖,并用C語言描繪出關(guān)鍵算法。首先對于這次的課程設(shè)計題目而言,主要是對算法與數(shù)據(jù)結(jié)構(gòu)知識點的運用。首先是對問題的分析,明白題目的具體要求,并且我認(rèn)為在細(xì)節(jié)方面的具體設(shè)計,是對個人分析問題、解決問題能力的一個很好的鍛煉。通過這個過程的鍛煉,不僅能對所學(xué)的知識點有很好的掌握,而且還是對個人能力的很好的訓(xùn)練。其次,以前我對數(shù)據(jù)結(jié)構(gòu)(C語言描述)的一些標(biāo)準(zhǔn)庫函數(shù)不太了解,還有對函數(shù)調(diào)用的正確使用不夠熟悉,對C語言中經(jīng)常出現(xiàn)的錯誤也不了解,通過實踐,使我在這幾個方面的認(rèn)識有所提高。讓自己有一定的能力去改正一些常見的錯誤語法,很高興這兩周的學(xué)習(xí)讓我對數(shù)據(jù)結(jié)構(gòu)(C語言描述)有了新的認(rèn)識,所以以后在學(xué)習(xí)過程中,我會更加注視實踐操作,使自己更好地學(xué)好計算機。在這次課程設(shè)計的實驗中,我收獲了許多知識,通過查找大量資料,請教老師,以及不懈的努力,也培養(yǎng)了獨立思考、動手操作的能力。我學(xué)會了許多學(xué)習(xí)和解決實際問題的方法,讓我受益匪淺。課程設(shè)計對我來說,趣味性強,不僅鍛煉能力,而且可以學(xué)到很多東西,在與老師和同學(xué)的交流過程中,互動學(xué)習(xí),將知識融會貫通,也增強了我和同學(xué)之間的團(tuán)隊合作的能力。讓我們知道只要努力,集中精力解決問題,一定會有收獲的,過程也是很重要的。在這次課程設(shè)計中我們要學(xué)會利用時間,在規(guī)定的時間內(nèi)完成我們的任務(wù),要逐漸養(yǎng)成用C語言編寫程序的良好習(xí)慣。這些對我來說都是一種鍛煉,一個知識積累的過程,一種能力的提高。要打好基礎(chǔ),才能用更好的辦法,更簡潔明了的程序解決實際問題,只有這樣才能進(jìn)一步的取得更好的成績。我們會更加努力,努力的去彌補自己的缺點,發(fā)展自己的優(yōu)點,去充實自己,只有在了解了自己的長短之后,我們會更加珍惜擁有的,更加努力的去完善它,增進(jìn)它。當(dāng)然我現(xiàn)在的水平還是很有限,但我還會繼續(xù)努力的,在解決實際

溫馨提示

  • 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

提交評論