教學計劃編制系統(tǒng)_第1頁
教學計劃編制系統(tǒng)_第2頁
教學計劃編制系統(tǒng)_第3頁
教學計劃編制系統(tǒng)_第4頁
教學計劃編制系統(tǒng)_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

6*******************實踐教學*******************蘭州理工大學計算機與通信學院2011年春季學期數(shù)據(jù)結構課程設計題目:教學方案編制問題專業(yè)班級:軟件一班姓名:學號:指導教師:成績:_____________________前言本學期開設了算法與數(shù)據(jù)結構,通過學習算法與數(shù)據(jù)結構,大家對編程有了更多的了解,為了讓大家將自己所學的知識應用到實際當中,學校開設了算法與數(shù)據(jù)結構課設,通過這次課設大家可以更好地將c語言應用到實際當中,而且可以更好的掌握算法與數(shù)據(jù)結構,將數(shù)據(jù)結構和c語言有效的結合起來,使大家的編程能力得到更大的提高。目錄摘要------------------------------------------------------------------------------------1關鍵字----------------------------------------------------------------------------1正文------------------------------------------------------------------------------------21.采用類c語言定義相關的數(shù)據(jù)類型-----------------------------------------22.各模塊的偽碼算法-------------------------------------------------------------33函數(shù)調用關系圖-----------------------------------------------------------------64試調分析--------------------------------------------------------------------------75測試結果--------------------------------------------------------------------------8總結--------------------------------------------------------------------------------9參考文獻------------------------------------------------------------------------------9致謝---------------------------------------------------------------------------------10附件Ⅰ1.源程序[帶注釋]〔結構體文件〕---------------------------------------------------------102.運行結果----------------------------------------------------------------------------28摘要大學的每個專業(yè)都要制定教學方案。假設任何專業(yè)都有固定的學習年限,每學年含兩學期,每學期的時間長度和學分上限值均相等。每個專業(yè)開設的課程都是確定的,而且課程在開設時間的安排必須滿足先修關系。每門課程有哪些先修課程是確定的,可以有任意多門,也可以沒有。每門課恰好占一個學期。此程序就可以滿足這些要求,輸出正確的結果,幫助我們實現(xiàn)教學方案編制關鍵字:數(shù)據(jù)結構,方案,編制正文1采用類c語言定義相關的數(shù)據(jù)類型typedefcharVertexType[MAX_NAME];intTotalTerms;//學期總數(shù)intMaxScores;//學分上限typedefstructArcNode{intadjvex;//該弧所指向的頂點的位置弧的節(jié)點結構structArcNode*nextarc;//指向下一條弧的指針}ArcNode;/*查找圖中某個頂點位置*/intLocateVex(ALGraphG,VertexTypeu)/*輸出圖G的信息*/voidDisplay(ALGraphG)*求頂點的入度*/voidFindInDegree(ALGraphG,intindegree[])structName{charc[20];}name;voidpuanduan(VertexTypestr,structNamename[],intn)/*棧定義*/typedefintSElemType;//棧類型#defineStack_NUM20//存儲空間初始分配量#defineStack_MoreNUM5//存儲空間分配增量typedefstructSqStack*拓撲排序*/intTopoSort(ALGraphG,AdjListTemp,structNamename[])2.各模塊的偽碼算法〔1〕-圖的鄰接表存儲表示-intadjvex;該弧所指向的頂點的位置弧的節(jié)點結構structArcNode*nextarc;指向下一條弧的指針}ArcNode;鏈表結點typedefstruct鏈接表{VertexTypedata;頂點信息intgrades;存儲學分信息ArcNode*firstarc;指向第一條依附該頂點的弧的指針}VNode,AdjList[MAX_VERTEX_NUM];頭結點typedefstruct{AdjListvertices;vertices存儲課程名intvexnum,arcnum;圖的當前頂點數(shù)和弧數(shù)}ALGraph;voidOUTPUT()輸出菜單〔2〕采用鄰接表存儲結構輸出提示,按提示操作程序printf("請輸入教學方案的課程數(shù):");printf("請輸入各個課程的先修課程的總和(弧總數(shù)):");printf("請輸入%d個課程的課程號(最多%d個字符,數(shù)字+字母):",G.vexnum,MAX_NAME);printf("請輸入以下課程的先修課程(無先修課程輸入0結束后也輸入0)\n");〔3〕輸出圖G的信息voidDisplay(ALGraphG)printf("有向圖\n");printf("%d個頂點",G.vexnum);拓撲排序ArcNode*p;//對輸出頂點計數(shù)while(!StackEmpty(S)){Pop(S,i);printf("%s(%d分),",G.vertices[i].data,G.vertices[i].grades);Temp[j++]=G.vertices[i];//將當前的拓撲序列保存起來++count;//輸出i號頂點并計數(shù)for(p=G.vertices[i].firstarc;p;p=p->nextarc)//對i號頂點的每個鄰接點的入度減1{k=p->adjvex;if(!(--indegree[k]))//假設入度減為0,那么入棧Push(S,k);〔4〕voidmain()初始化strucNamename[N]={{"C1"},{"C2"},{"C3"},{"C4"},{"C5"},{"C6"},{"C7"},{"C8"},{"C9"},{"C10"},{"C11"},{"C12"}};3函數(shù)調用關系圖Display(G)Display(G)CreateGraph(G)輸出圖G的信息TopoSort(G,Temp,name)name);TopoSort(G,Temp,name);TopoSort(G,Temp,name);TopoSort(G,Temp,name);TopoSort(G,Temp,name);TopoSort(G,Temp,name)TopoSort(G,Temp,name)采用鄰接表存儲結構拓撲排序voidmain()-4試調分析-根據(jù)問題描述及要求,可知設計中需要定義先修關系的AOV網(wǎng)圖中的頂點及弧邊的結構體,在運行結果中將圖的信息顯示出來,利用先修關系將課程排序,最后解決問題——輸出每學期的課程。end采用第二種策略:使課程盡可能地集中在前幾個學期中根據(jù)教學方案中的課程及其關系和學分定義圖的頂點和邊的結構體創(chuàng)立圖CreateGraph〔〕:結合先修關系的AOV網(wǎng),采用鄰接鏈表存儲菜單OUTPUT():顯示代號所對應課程及課程的先修課程前插法main拓撲排序TopoSort(G):將課程排序后并決定出每學期所學課程

輸出圖G的信息Display(G):將圖的頂點和弧邊輸出5測試結果測試數(shù)據(jù):輸入的內容如下:

課程編號

課程名稱

學分

先決條件

01

程序設計根底

2

02

離散數(shù)學

3

01

03

數(shù)據(jù)結構

4

01,02

04

匯編語言

3

01

05

語言的設計和分析

2

03,04

06

計算機原理

3

11

07

編譯原理

4

05,03

08

操作系統(tǒng)

4

03,06

09

高等數(shù)學

7

10

線性代數(shù)

5

09

11

普通物理

2

09

12

數(shù)值分析

3

09,10,01

學期總數(shù):6;學分上限:10;該專業(yè)共開設12門課,課程號從C1到C12,學分順序為2,3,4,3,2,3,4,4,7,5,2,3。兩種編譯都輸出結果:第一學期學的課程有:高等數(shù)學

第二學期學的課程有:普通物理線性代數(shù)計算機原理

第三學期學的課程有:課程設計根底數(shù)據(jù)結構離散數(shù)學

第四學期學的課程有:操作系統(tǒng)匯編語言語言的設計與分析

第五學期學的課程有:編譯原理數(shù)值分析第六學期學的課程有:總結我們在實驗過程中遇到的最大難題是兩個課程排序算法的編寫。剛開始的時候沒有任何的思路,網(wǎng)上也只有拓撲排序的算法,對于課程設計要求的排序算法沒有任何頭緒。經(jīng)過請教老師和同學以及翻閱了一些相關書籍,并在網(wǎng)上的搜索有了排序算法的大體思路。經(jīng)過三天的修改,終于寫出了符合要求的排序算法經(jīng)過此次課程設計,自己解決編程中從在的問題,我們認識到了理論與實踐結合的重要性,僅僅只是從課本上學到算法原理是遠遠不夠的。在實踐中,我們總會出現(xiàn)許多錯誤。這就要求我們以一個腳踏實地的態(tài)度來處理問題。我們深刻地認識到自己寫程序的缺乏,使我們學到了好多有用的知識,讓我們明白了算法與編程的密切關系,使我們受益匪淺。參考文獻1《數(shù)據(jù)結構》〔c語言描述〕冶金工業(yè)出版社2《C程序設計》譚浩強3王連相,馮鋒編著.C/C++程序設計.北京:中國科學技術出版社,20054嚴蔚敏,吳偉民編著.數(shù)據(jù)結構〔C語言版〕.北京:清華大學出版社,19975嚴蔚敏,吳偉民編著.數(shù)據(jù)結構題集〔C語言版〕.北京:清華大學出版社,致謝首先感謝我的指導老師張永老師,他在我的課程設計過程中提出了指導性的方案和架構,并指引我閱讀相關的資料和書籍,使我在不熟悉的領域中仍能迅速掌握新的技術。并且在課設期間屢次親身檢查給出我程序中的缺乏,也為我拓寬思路,不至于我的程序過于單一,非常感謝張永老師我的同學在設計完成后對程序的測試,沒有他們,也許就難以發(fā)現(xiàn)一些潛在的錯誤,在此一并表示感謝。附件11.源程序代碼〔/*************************************************************************************結構體文件|結構體名|作用|備注__________________________________________________________________________________||用于在處理數(shù)據(jù)時保存各個信息|||1.該門課程是否已經(jīng)編排|動態(tài)數(shù)組|CourseHead|2.給課程的直接先修課的個數(shù)|與CourseLink一起構成鏈表||3.以該門課程為先修的后修課程結點|存儲結構||4.課程的名字5.課程號6.學分|_________________________________________________________________________________|CourseLink| CourseHead的鏈|動態(tài)結點||1.課程在CourseHead的下標|與CourseHead一起構成鏈表||2.下一個CourseLink的地址|存儲結構_________________________________________________________________________________||保存符合要求的課程安排情況|動態(tài)結點,頭結點不保存|Topo|1.課程安排的平均性|課程安排情況,但是保存||2.ArryInTopo型數(shù)組存儲安排情況|課程安排平均的總數(shù)目||3.下一中課程安排的結點地址|__________________________________________________________________________________||保存某一門課的開課時間|動態(tài)數(shù)組,|ArryInTopo|1.該門課在CourseHead的下標|它在Topo的內部||2.該課程的開課時間|___________________________________________________________________________________||保存可以選擇的課程|動態(tài)結點|Zero|1.課程在CourseHead的下標|在編程是因為遞歸的需要||2.下一個課程結點的地址|即時地加上去的結構體___________________________________________________________________________________**************************************************************************************//*該結構體用于保存課程的學分和該課程在一維數(shù)組的下標因為用到鏈表存儲結構(表頭是先修課程,鏈是與以該課程的為先修的課程)所以有假設下*/〕#include<malloc.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<windows.h>#include<conio.h>#include<fstream.h>structCourseLink//該結構體用于具體運算{//關聯(lián)了課程的關系intIndex;//該課程在一維數(shù)組的下標,綁定他與課程的關系CourseLink*next;//下一門與他同一尾節(jié)點的課程};structCourseHead//表頭結點的結構體{ intflag;//標記該門課程是否已經(jīng)編排intpriornum;//給課程的直接先修課的個數(shù)CourseLink*first;//以該門課程為先修的后修課程charName[30];//課程的名字charOfcourse[4];//課程號floatScore;//學分};structArryInTopo{ intIndex;//保存課程的序號 intTime;//保存課程的開課時間};structTopo{ intlevel;//標記是否平均分配,也就是課程安排效果標記 ArryInTopo*toporesualt;//一個一維數(shù)組保存拓撲排序--保存課程的序號 Topo*next;//拓撲排序的下一種情況};structZero//保存可以選擇的課程{ intzero;//課程在原始數(shù)據(jù)里的下標 Zero*next;//下一個課程結點的地址};//**************函數(shù)介紹********************************************voidInitData();//......................1調用一下兩個函數(shù)完成數(shù)據(jù)初始化voidInitData(intnum);//.................2由課程數(shù)目num來完成數(shù)據(jù)的細節(jié)floatInitData(char*b);//..............2方便判斷輸入數(shù)據(jù)的準確性而已voidStartTopoSort();//..................1初始化要用到的各個數(shù)據(jù)再調用下面這個函數(shù)voidTopoSort(inttopotempsum,inttime);//.2遞歸函數(shù),完成拓撲排序,用到以下四個函數(shù)voidCheck(intindex);//...................3中選擇course[index]時,相應的鏈表的 //3頭結點的priornum項要減一voidCheckBack(intindex);//...............3當退選course[index]時,相應的鏈表的 //3頭結點的priornum項要加一 intZERO();//............................3統(tǒng)計該層遞歸可以選擇的課程 //并且完成可選課程的記錄voidIfsuccessed();//......................3當課程安排成功時將課程安排記錄保存 //并對課程安排做評價voidPrint();//............................1根據(jù)客戶要求輸出相應的課程安排voidprintf0();//..........................1界面voidprintf1(int);//......................1負責輸出課程信息,并且還調用下面voidprintf2();//...........................2輸出課程的聯(lián)系voidprintf1(FILE*);//......................1負責將課程信息寫入文件,并且還調用下面voidprintf2(FILE*);//...........................2將課程的聯(lián)系寫入文件//**************函數(shù)介紹********************************************intTime=0;//全局變量學期總數(shù)floatMaxSource=0.0;//全局變量一學期的學分上限intSourceNum=0;//全局變量課程總數(shù)CourseHead*coursehead;//全局變量鏈表的有節(jié)點數(shù)組Topo*topo;//全局變量保存課程的安排情況,//頭結點保存課程安排平均的總數(shù)目ArryInTopo*topotemp;//全局變量數(shù)組臨時保存某一種拓撲排序情況Zero*ZeroTemp;//全局變量鏈式保存入度為零的課程的index//隨著遞歸的進行他的值也在變化int*ClassInTime;//全局變量臨時保存每一學期課程的數(shù)目voidmain(){chari; printf0(); do { printf("按任意非<Esc>鍵開始,按<Esc>退出!\n\n");i=getch(); fflush(stdin);//刷新輸入流 if(i!=27) { system("cls");//刷新屏幕printf0(); InitData();//輸入數(shù)據(jù) StartTopoSort();//處理數(shù)據(jù)Print();//按要求輸出結果 } if(i==27) return; }while(i!=27);}//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@數(shù)據(jù)初始化全部完成voidInitData(){ Time=int(InitData("學期總數(shù)"));//輸入學期總數(shù) MaxSource=InitData("一學期的學分上限");//輸入一學期的學分上限 SourceNum=int(InitData("課程總數(shù)"));//輸入課程總數(shù)InitData(SourceNum);//輸入課程有關的各個信息}//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@數(shù)據(jù)初始化全部完成floatInitData(char*b)//輸入學期總數(shù),一學期的學分上限,課程總數(shù){intflag=0; floata=0; do { if(flag==1) printf("請重新輸入%s\n",b); else printf("請輸入%s:\n",b); scanf("%f",&a); fflush(stdin); flag=1; }while(a<=0.0);//嚴格檢查輸入數(shù)據(jù)的準確性 returna;}voidInitData(intnum)/*輸入課程有關的各個信息:每門課的課程名Source->name[];課程號(固定占3位的字母數(shù)字串)Source->OfSource[];學分Source->Source;直接先修課的課程號*/{inti=0,j=0; intflag=0;//標記出錯coursehead=(CourseHead*)malloc(num*sizeof(CourseHead)); //為全局變量course和coursehead分配內存 CourseLink*courselink=NULL; CourseLink*courselinktemp=NULL; for(i=0;i<num;++i) { coursehead[i].Name[0]='\0'; coursehead[i].Ofcourse[0]='\0'; coursehead[i].Score=0; coursehead[i].flag=0; coursehead[i].first=NULL; coursehead[i].priornum=0; } //為全局變量course和coursehead完成初始化 for(i=0;i<num;++i)//............輸入每一門課程的信息 { do {flag=0; if(flag==1) printf("輸入的信息不符合要求,請檢查后再輸入!\n請重新輸入第%d門課程的課程名(限長12位),課程號(固定占3位),學分\n",i); printf("請輸入第%d門課程的課程名(限長14位),課程號(固定占3位),學分\n",i+1);scanf("%s%s%f",coursehead[i].Name,coursehead[i].Ofcourse,&(coursehead[i].Score)); fflush(stdin); //正確輸入課程名 if(strlen(coursehead[i].Name)>28) { printf("警告!課程名太長,請簡寫!\n\n");flag=1; } //正確輸入課程號 if(strlen(coursehead[i].Ofcourse)!=3) { printf("警告!課程號必須是是三位\n\n\n");flag=1; } for(j=0;flag==0&&j<i;++j) if(strcmp(coursehead[i].Ofcourse,coursehead[j].Ofcourse)==0) {printf("警告!已經(jīng)有了一個同樣的課程號!\n\n"); flag=1; break; } if(coursehead[i].Score>MaxSource||coursehead[i].Score<=0.0) { printf("警告!學分必須是在0到最大限制%3.1f之間,請檢查后再輸入\n\n",MaxSource);flag=1; }//正確輸入學分 }while(flag==1); //嚴格控制輸入數(shù)據(jù)的正確性 }printf1(1);//輸出已經(jīng)輸入的課程信息//以下是輸入課程的關系intSort=0,NUM=0;//先修課的序號,先修課的的個數(shù)chartemp[4];//保存輸入的課程號do{printf("請輸入課程號與它的先修課的的個數(shù)(輸入00結束):\n");scanf("%s%d",temp,&NUM);fflush(stdin);Sort=SourceNum; for(i=0;i<SourceNum;++i) if(strcmp(temp,coursehead[i].Ofcourse)==0) { Sort=i; break; }if(NUM>=SourceNum) printf("警告!先修課數(shù)目值無意義!\n\n"); if(Sort==SourceNum) printf("警告!該課程不存在!\n\n"); if(Sort<SourceNum&&coursehead[Sort].priornum!=0) { printf("警告!該課程已經(jīng)輸入過!\n\n");Sort=SourceNum; } if(Sort!=SourceNum&&NUM<SourceNum)//輸入各個關系 for(i=1;i<=NUM;++i) { if(i==1) coursehead[Sort].priornum=NUM; //先修課程數(shù)目 flag=0; do { printf("請"); if(flag==1){printf("重新");flag=0;} printf("輸入課程%s的第%d個直接先修課的課程號\n",coursehead[Sort].Ofcourse,i); scanf("%s",temp); fflush(stdin);//*********************檢查輸入的課程號的正確性 for(j=0;j<SourceNum;++j) if(strcmp(temp,coursehead[j].Ofcourse)==0&&Sort!=j) { break; } //課程號不與自己相同 if(j==SourceNum) {printf("警告!輸入的課程號有誤!!\n\n");flag=1;} //課程號存在 if(flag==0) { courselinktemp=NULL;courselink=coursehead[Sort].first; while(courselink!=NULL) { if(courselink->Index==j) { printf("警告!課程不能互為先修課!\n\n");flag=1; break; }courselink=courselink->next; } }//不存在a--->b&&b--->a的情況 if(flag==0) { courselinktemp=NULL;courselink=coursehead[j].first; while(courselink!=NULL) { if(courselink->Index==Sort) { printf("警告!關系重復了!\n\n");flag=1; break; }courselink=courselink->next; } }//**********************檢查輸入的課程號的正確性//######################輸入正確時給相應的地方賦值if(flag==0) { courselink=(CourseLink*)malloc(sizeof(CourseLink)); courselink->Index=Sort; courselink->next=coursehead[j].first; coursehead[j].first=courselink; } //######################輸入正確時給相應的地方賦值 }while(flag==1);//輸入有錯那么重新輸入//TheEndofdo{}while(); printf1(0); } //TheEndoffor(){}}while(!(Sort==SourceNum&&NUM==0));//判斷關系是否結束}//..........................所有的數(shù)據(jù)存儲結構初始化已經(jīng)完成voidStartTopoSort()//初始化要用到的各個數(shù)據(jù){//再調用遞歸函數(shù)TopoSort(inttopotempsum,inttime) //來完成課程的具體安排inti=0; topotemp=(ArryInTopo*)malloc(SourceNum*sizeof(ArryInTopo)); for(;i<SourceNum;++i) {topotemp[i].Time=0; topotemp[i].Index=0; } //為全局變量ArryInTopo*topotemp完成初始化 topo=(Topo*)malloc(sizeof(Topo)); topo->level=0; topo->toporesualt=NULL; topo->next=NULL; //為全局變量Topo*topo完成初始化 ZeroTemp=(Zero*)malloc(sizeof(Zero));ZeroTemp->next=NULL; ZeroTemp->zero=0; //為全局變量Zero*ZeroTemp完成初始化,頭結點不用 ClassInTime=(int*)malloc(Time*sizeof(int)); for(i=0;i<Time;i++)ClassInTime[i]=0; //為全局變量int*ClassInTime完成初始化 TopoSort(0,1);//調用遞歸函數(shù)TopoSort完成課程安排}voidTopoSort(inttempsum,inttime){//遞歸完成拓撲排序//tempsum,已經(jīng)安排的課程的數(shù)目//要安排課程的time學期 inti=0,j=0;intzero=ZERO();//index課程的后繼課程中前驅為零的個數(shù) if(zero==0)return;//沒有課程可選,返回 int*ZeroArry; ZeroArry=(int*)malloc(zero*sizeof(int)); Zero*zerolink=ZeroTemp->next;for(i=0;i<zero;++i) { ZeroArry[i]=zerolink->zero; zerolink=zerolink->next; }//將Zero*ZeroTemp鏈里的數(shù)據(jù)賦給 //局部變量int*ZeroArry賦值,方便操作intxuan=1;//該層遞歸在ZeroArry[i]已經(jīng)選擇的課程的數(shù)目 intsum=tempsum;//已經(jīng)安排的課程的數(shù)目 doubleScoreNum=0;//該層遞歸選擇的課程的學分的和 intflag=0;//標記某一種課程選擇是否正確 for(i=1;i<int(pow(2,zero));++i) {//這是本人寫這個程序的唯一的得意之處 //將課程的選擇情況用二進制的0,1表示 //例如i=6那么i=110(2) //i分別與j100(2),10(2),1(2)進行“與”運算 //分別得到j100(2),10(2),0(2)//j==j110 //那么表示在這種情況下在數(shù)組int*ZeroArry里面 //選擇ZeroArry[1-1],ZeroArry[2-1]的課程 //不選ZeroArry[3-1] //并且是i從1到pow(2,zero)-1, //這樣可以不重不漏地將所有情況都考慮進去 sum=tempsum; //已經(jīng)安排的第sum課程 ScoreNum=0; flag=0; ClassInTime[time-1]=0; //每一次循環(huán)都必須將數(shù)據(jù)初始化for(j=1,xuan=1;xuan<=zero;xuan++) {if((j&i)==j)//選擇ZeroArry[xuan-1]的課程 { coursehead[ZeroArry[xuan-1]].flag=1; //標記已選 topotemp[sum].Index=ZeroArry[xuan-1];topotemp[sum].Time=time; //全局變量數(shù)組ArryInTopo*topotemp記錄選課情況 Check(ZeroArry[xuan-1]); //將課程Course[index]的后繼課程的入度減一 ScoreNum+=coursehead[ZeroArry[xuan-1]].Score; //選擇的課程的學分的和 sum++; ClassInTime[time-1]++; //更改全局變量time學期課程的數(shù)目 } j=j*2;//也可以用j=j<<1; } if(sum==SourceNum) {//課程安排成功 Ifsuccessed(); flag=1; } if(ScoreNum!=0&&ScoreNum<=MaxSource&&time<Time)TopoSort(sum,time+1); //繼續(xù)遞歸 for(j=1,xuan=1;xuan<=zero;xuan++) { if((j&i)==j) { CheckBack(ZeroArry[xuan-1]); coursehead[ZeroArry[xuan-1]].flag=0; } j=j*2; }//這個for循環(huán)用于在i=i+1之前將所有的數(shù)據(jù)復原 if(flag==1) { ClassInTime[time-1]=0; return; } }ClassInTime[time-1]=0;free(ZeroArry);}voidIfsuccessed()//當課程安排成功時將課程安排記錄保存{ //并對課程安排做評價inti=0;Topo*temp;temp=(Topo*)malloc(sizeof(Topo));temp->level=0; temp->toporesualt=(ArryInTopo*)malloc(SourceNum*sizeof(ArryInTopo));temp->next=NULL;temp->next=topo->next;topo->next=temp; //當某一種課程安排成立時新建一個 //Topo*temp結點,并且連接到全局變量topo后面for(i=0;i<SourceNum;++i) {temp->toporesualt[i].Index=topotemp[i].Index;temp->toporesualt[i].Time=topotemp[i].Time; }//完成對結點Topo*temp的內容的添加//下面對該種安排做一個評估 intAverage=int(SourceNum/Time);//平均每學期的課程數(shù)目 for(i=0;i<Time;++i)if(ClassInTime[i]<Average||ClassInTime[i]>Average+1||ClassInTime[Time-1]==0) break; //判斷是否平均 if(i==Time) { temp->level=1;//標記課程安排平均 topo->level++;//課程安排平均的數(shù)目+1 }}intZERO()//統(tǒng)計某層遞歸可以選擇的課程{ //并且完成可選課程的記錄 Zero*p=ZeroTemp->next; Zero*zerotemp=NULL; ZeroTemp->next=NULL; while(p!=NULL) { zerotemp=p->next; free(p); p=zerotemp; } //釋放全局變量Zero*ZeroTemp的內存//為記錄新的入度為零的課程做準備 p=ZeroTemp; intzero=0; inti=0;for(i=0;i<SourceNum;++i) if(coursehead[i].priornum==0&&coursehead[i].flag==0) {//入度為零,并且還沒有被選中 zerotemp=(Zero*)malloc(sizeof(Zero)); p->next=zerotemp; p=zerotemp; zerotemp->zero=i; zerotemp->next=NULL; zero++;//完成對全局變量Zero*ZeroTemp重新賦值 } returnzero;//返回可選課程的個數(shù)}voidCheck(intindex)//將課程coursehead[index]的后繼課程的入度減一{ CourseLink*courselinktemp=NULL; courselinktemp=coursehead[index].first; while(courselinktemp!=NULL) {coursehead[courselinktemp->Index].priornum--; courselinktemp=courselinktemp->next; }}voidCheckBack(intindex)//當coursehead[index]課程"推選"時,要將與他有關的課程的入度數(shù)復原{CourseLink*courselinktemp; courselinktemp=coursehead[index].first; while(courselinktemp!=NULL) {coursehead[courselinktemp->Index].priornum++; courselinktemp=courselinktemp->next; }}voidPrint()//根據(jù)客戶要求輸出相應的課程安排{ printf1(1);//刷新屏幕 inti=0,j=1,flag=1; FILE*f; Topo*pp=topo->next; do { printf("課程編排結束!!\n\n"); printf("請選擇操作!\n");printf("選項(0/1/2):\n");printf("(0)重新初始化課程信息!\n"); printf("(1)學習負擔盡量均勻!\n"); printf("(2)所有課程安排情況!\n"); do { if(!(flag==1||flag==2||flag==0)) printf("注意!!!請輸入合法選擇!\n");scanf("%d",&flag); fflush(stdin); }while(!(flag==1||flag==2||flag==0)); //嚴格控制輸入的準確性 printf("以下是所有符合您要求的課程安排情況!\n");printf1(1);//刷新屏幕 if(flag==1) f=fopen("分配均勻.txt","w"); else f=fopen("所有情況.txt","w"); printf1(f); if(flag==0)return; else { pp=topo->next; j=1;while(pp!=NULL) { if(flag==1&&pp->level==1||flag==2) { printf("第%d種課程安排!\n\n",j); printf("開課時間課程名稱課程號學分先修課數(shù)目\n"); fprintf(f,"第%d種課程安排!\n\n",j); fprintf(f,"開課時間課程名稱課程號學分先修課數(shù)目\n"); for(i=0;i<SourceNum;++i) {printf("%8d%20s%11s%7.1f%10d\n",pp->toporesualt[i].Time,coursehead[pp->toporesualt[i].Index].Name,coursehead[pp->toporesualt[i].Index].Ofcourse,coursehead[pp->toporesualt[i].Index].Score,coursehead[i].priornum); fprintf(f,"%8d%20s%11s%7.1f%10d\n",pp->toporesualt[i].Time,coursehead[pp->toporesualt[i].Index].Name,coursehead[pp->toporesualt[i].Index].Ofcourse,coursehead[pp->toporesualt[i].Index].Score,coursehead[i].priornum); } fprintf(f,"\n\n"); printf("\n\n"); j++; } pp=pp->next; } //輸出完畢 printf("一共%d種符合您要求的課程安排!\n\n",j-1);fprintf(f,"一共%d種符合您要求的課程安排!\n\n",j-1); fclose(f); } }while(1);}voidprintf0()//界面{printf("*****************************************************************************\n

溫馨提示

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

評論

0/150

提交評論