




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
*******************實踐教學*******************蘭州理工大學計算機與通信學院2011年春季學期數據結構課程設計題目:教學計劃編制問題專業班級: 軟件一班姓名:學號:指導教師:成績: 前言本學期開設了算法與數據結構,通過學習算法與數據結構,大家對編程有了更多的了解,為了讓大家將自己所學的知識應用到實際當中,學校開設了算法與數據結構課設,通過這次課設大家可以更好地將c語言應用到實際當中,而且可以更好的掌握算法與數據結構,將數據結構和c語言有效的結合起來,使大家的編程能力得到更大的提高。TOC\o"1-5"\h\z\o"CurrentDocument"摘要 1關鍵字 1\o"CurrentDocument"正文 2.采用類c語言定義相關的數據類型 2.各模塊的偽碼算法 3\o"CurrentDocument"3函數調用關系圖 64試調分析 75測試結果 8\o"CurrentDocument"總結 9參考文獻 9\o"CurrentDocument"致謝 10附件I1.源程序[帶注釋](結構體文件) 10\o"CurrentDocument"2.運行結果 28摘要大學的每個專業都要制定教學計劃。假設任何專業都有固定的學習年限,每學年含兩學期,每學期的時間長度和學分上限值均相等。每個專業開設的課程都是確定的,而且課程在開設時間的安排必須滿足先修關系。每門課程有哪些先修課程是確定的,可以有任意多門,也可以沒有。每門課恰好占一個學期。此程序就可以滿足這些要求,輸出正確的結果,幫助我們實現教學計劃編制關鍵字:數據結構,計劃,編制正文1采用類c語言定義相關的數據類型typedefcharVertexType[MAX_NAME];intTotalTerms; //學期總數intMaxScores; //學分上限typedefstructArcNode(intadjvex;//該弧所指向的頂點的位置弧的節點結構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[]).各模塊的偽碼算法(1)-圖的鄰接表存儲表示-intadjvex;該弧所指向的頂點的位置弧的節點結構structArcNode*nextarc; 指向下一■條弧的指針
}ArcNode;鏈表結點}ArcNode;鏈表結點typedefstruct 鏈接表{VertexTypedata;頂點信息intgrades;存儲學分信息ArcNode*firstarc; 指向第一■條依附該頂點的弧的指針}VNode,AdjList[MAX_VERTEX_NUM];頭結點typedefstruct{AdjListvertices;vertices存儲課程名intvexnum,arcnum;圖的當前頂點數和弧數}ALGraph;voidOUTPUT。輸出菜單(2)采用鄰接表存儲結構輸出提示,按提示操作程序printf("請輸入教學計劃的課程數:");printf(”請輸入各個課程的先修課程的總和(弧總數):");printf("請輸入%4個課程的課程號(最多%4個字符,數字+字母):",G.vexnum,MAX_NAME);printf("請輸入下列課程的先修課程(無先修課程輸入0結束后也輸入0)\n");(3)輸出圖G的信息voidDisplay(ALGraphG)printfC^向圖\n");printf("%d個頂點”,G.vexnum);拓撲排序ArcNode*p; //對輸出頂點計數while(!StackEmpty(S)){Pop(S,i);printf("%s(%d^),",G.vertices[i].data,G.vertices[i].grades);Temp[j++]=G.vertices[i];//將當前的拓撲序列保存起來++count; //輸出i號頂點并計數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函數調用關系圖采用鄰接表存儲空槍輸出圖G的信息采用鄰接表存儲空槍輸出圖G的信息拓撲排序4試調分析-根據問題描述及要求,可知設計中需要定義先修關系的AOV網圖中的頂點及弧邊的結構體,在運行結果中將圖的信息顯示出來,利用先修關系將課程排序,最后解決問題一一輸出每學期的課程。end采用第二種策略:使課程盡可能地集中在前幾個學期中根據教學計劃中的課程及其關系和學分定義圖的頂點和邊的結構體創建圖CreateGraph():結合先修關系的AOV網,采用鄰接鏈表存儲菜單OUTPUT():顯示代號所對應課程及課程的先修課程前插法main拓撲排序TopoSort(G):將課程排序后并決定出每學期所學課程輸出圖G的信息Display(G):將圖的頂點和弧邊輸出
5測試結果測試數據:輸入的內容如下:課程編號課程名稱 學分先決條件01程序設計基礎2 無02離散數學3 0103數據結構401,0204匯編語]30105語言的設計和分析 203,0406計算機原理3 1107編譯原理405,0308操作系統403,0609高等數學7無10線性代數50911普通物理20912數值分析309,10,01學期總數:6;學分上限:10;該專業共開設12門課,課程號從C1到C12,學分順序為2,3,4,3,2,3,4,4,7,5,2,3。兩種編譯都輸出結果:第一學期學的課程有:高等數學第二學期學的課程有:普通物理線性代數計算機原理第三學期學的課程有:課程設計基礎數據結構離散數學第四學期學的課程有:操作系統匯編語言語言的設計與分析第五學期學的課程有:編譯原理數值分析第六學期學的課程有:總結我們在實驗過程中遇到的最大難題是兩個課程排序算法的編寫。剛開始的時候沒有任何的思路,網上也只有拓撲排序的算法,對于課程設計要求的排序算法沒有任何頭緒。經過請教老師和同學以及翻閱了一些相關書籍,并在網上的搜索有了排序算法的大體思路。經過三天的修改,終于寫出了符合要求的排序算法經過此次課程設計,自己解決編程中從在的問題,我們認識到了理論與實踐結合的重要性,僅僅只是從課本上學到算法原理是遠遠不夠的。在實踐中,我們總會出現許多錯誤。這就要求我們以一個腳踏實地的態度來處理問題。我們深刻地認識到自己寫程序的不足,使我們學到了好多有用的知識,讓我們明白了算法與編程的密切關系,使我們受益匪淺。參考文獻1《數據結構》(c語言描述)冶金工業出版社2《C程序設計》 譚浩強3王連相,馮鋒編著.C/C++程序設計.北京:中國科學技術出版社,20054嚴蔚敏,吳偉民編著.數據結構(C語言版).北京:清華大學出版社,19975嚴蔚敏,吳偉民編著.數據結構題集(C語言版).北京:清華大學出版社,致謝首先感謝我的指導老師張永老師,他在我的課程設計過程中提出了指導性的方案和架構,并指引我閱讀相關的資料和書籍,使我在不熟悉的領域中仍能迅速掌握新的技術。并且在課設期間多次親身檢查給出我程序中的不足,也為我拓寬思路,不至于我的程序過于單一,非常感謝張永老師我的同學在設計完成后對程序的測試,沒有他們,也許就難以發現一些潛在的錯誤,在此一并表示感謝。附件11.源程序代碼^/^^s************************************************************************************| 結構體名| 作用 | 備注||| CourseHead|||用于在處理數據時保存各個信息 ||1.該門課程是否已經編排 |動態數組|2.給課程的直接先修課的個數 |與CourseLink一起構成鏈表|3.以該門課程為先修的后修課程結點|存儲結構|4.課程的名字5.課程號6.學分|| CourseLink|||CourseHead的鏈 |動態結點|1.課程在CourseHead的下標 |與CourseHead一起構成鏈表|2.下一個CourseLink的地址 |存儲結構|| Topo|||保存符合要求的課程安排情況 |動態結點,頭結點不保存|1.課程安排的平均性 |課程安排情況,但是保存|2.ArryInTopo型數組存儲安排情況|課程安排平均的總數目|3.下一中課程安排的結點地址 ||| ArrylnTopo||保存某一門課的開課時間 |動態數組,|1.該門課在CourseHead的下標 |它在Topo的內部|2.該課程的開課時間 |結構體文件||保存可以選擇的課程|動態結點
ZeroI1.課程在CourseHead的下標 I在編程是因為遞歸的需要ZeroI2.下一個課程結點的地址 I即時地加上去的結構體*************************************************************************************^^^^//*該結構體用于保存課程的學分和該課程在一維數組的下標因為用到鏈表存儲結構(表頭是先修課程,鏈是與以該課程的為先修的課程)所以有若下*/)#include<malloc.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<windows.h>#include<conio.h>//該結構體用于具體運算//該結構體用于具體運算//關聯了課程的關系//該課程在一維數組的下標,綁定他〃下一門與他同一尾節點的課程//表頭結點的結構體〃標記該門課程是否已經編排//給課程的直接先修課的個數//以該門課程為先修的后修課程//課程的名字//課程號//學分intIndex;與課程的關系CourseLink*next;);structCourseHead(intflag;intpriornum;CourseLink*first;charName[30];charOfcourse[4];floatScore;);〃保存課程的序號//〃保存課程的序號//保存課程的開課時間//標記是否平均分配,也就是課程安//一個一維數組保存拓撲排序--保存intIndex;intTime;);structTopo(intlevel;排效果標記ArryInTopo*toporesualt;課程的序號);structZero//保存可以選擇的課程(intzero;Zero*next;〃課程在原始數據里的下標
〃下一個課程結點的地址);structZero//保存可以選擇的課程(intzero;Zero*next;〃課程在原始數據里的下標
〃下一個課程結點的地址);//**************函數介紹小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小Topo*next;〃拓撲排序的下一種情況Topo*next;voidInitData();// 1調用一下兩個函數完成數據初始化voidInitData(intnum);// 2由課程數目num來完成數據的細節floatInitData(char*b);// 2方便判斷輸入數據的準確性而已voidStartTopoSort();// 1初始化要用到的各個數據再調用下面這個函數voidTopoSort(inttopotempsum,inttime);//.2遞歸函數,完成拓撲排序,用到以下四個函數voidCheck(intindex);// 3當選擇course[index]時,相應的鏈表的//3頭結點的priornum項要減一voidCheckBack(intindex);// 3當退選course[index]時,相應的鏈表的//3頭結點的priornum項要力□一intZERO();// 3統計該層遞歸可以選擇的課程// 并且完成可選課程的記錄voidIfsuccessed();// 3當課程安排成功時將課程安排記錄保存//并對課程安排做評價voidPrint();// 1根據客戶要求輸出相應的課程安排voidprintf0();// 1界面voidprintf1(int);// 1負責輸出課程信息,并且還調用下面voidprintf2();// 2 輸出課程的聯系voidprintf1(FILE*);// 1負責將課程信息寫入文件,并且還調用下面voidprintf2(FILE*);// 2 將課程的聯系寫入文件//**************函數介紹小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小//**************函數介紹小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小intTime=0;數floatMaxSource=0.0;上限intSourceNum=0;CourseHead*coursehead;數組Topo*topo;排情況,排平均的總數目ArryInTopo*topotemp;種拓撲排序情況Zero*ZeroTemp;的課程的index他的值也在變化//全局變量 學期總//全局變量 一學期的學分//全局變量 學期總//全局變量 一學期的學分//全局變量 課程總數//全局變量 鏈表的有節點//全局變量 保存課程的安// 頭結點保存課程安//全局變量數組臨時保存某一//全局變量鏈式保存入度為零// 隨著遞歸的進行程的數目voidmain()(chari;printf0();do(printf("按任意非<Esc>鍵開始,按<Esc>退出!\n\n");i=getch();fflush(stdin); //刷新輸入流if(i!=27)(system("cls"); //刷新屏幕printf0();InitData(); //輸入數據StartTopoSort(); //處理數據
//按要求輸出結果//按要求輸出結果}while(i!=27);)〃@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@數據初始化全部完成voidInitData()(〃輸入學期總數〃輸入一學期的學分上〃輸入課程總數//輸入課程有關的各個Time二〃輸入學期總數〃輸入一學期的學分上〃輸入課程總數//輸入課程有關的各個MaxSource=InitData("一學期的學分上限");限SourceNum二int(InitData("課程總數"));InitData(SourceNum);信息}〃@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@數據初始化全部完成floatInitData(char*b) 〃輸入學期總數,一學期的學分上限,課程總數(intflag=0;floata=0;do(if(flag==1)printf("請重新輸入%$\口 ",b);elseprintf("請輸入%$:\n ",b);scanf("%f",&a);fflush(stdin);flag=1;}while(a<=0.0); 〃嚴格檢查輸入數據的準確性returna;}voidInitData(intnum)/*輸入課程有關的各個信息:每門課的Source->name[];課程號(固定占3位的字母數字串)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(" 警告!課程號必須是是三位\口\口由");信8=1;)for(j=0;flag==0&&j<i;++j)if(strcmp(coursehead[i].Ofcourse,coursehead[j].Ofcourse)==0)(printf(" 警告!已經有了一個同樣的課程號!\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);〃嚴格控制輸入數據的正確性}printf1(1); 〃輸出已經輸入的課程信息〃以下是輸入課程的關系intSort=0,NUM=0; //先修課的序號冼修課的的個數chartemp[4]; 〃保存輸入的課程號do(printf(”請輸入課程號與它的先修課的的個數(輸入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(" 警告!先修課數目值無意義!\n\n");if(Sort==SourceNum)printf(" 警告!該課程不存在!\n\n");if(Sort<SourceNum&&coursehead[Sort].priornum!=0)(printf(" 警告!該課程已經輸入過!\n\n");Sort二SourceNum;)if(Sort!=SourceNum&&NUM<SourceNum) 〃輸入各個關系for(i=1;i<=NUM;++i)(if(i==1)coursehead[Sort].priornum二NUM;〃先修課程數目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//不存在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)); 〃判斷關系是否結束}// 所有的數據存儲結構初始化已經完成voidStartTopoSort()//初始化要用到的各個數據{ //再調用遞歸函數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); //調用遞歸函數TopoSort完成課程安排)voidTopoSort(inttempsum,inttime){ 〃遞歸完成拓撲排序//tempsum,已經安排的課程的數目//要安排課程的time學期inti=0,j=0;intzero=ZERO(); //index課程的后繼課程中前驅為零的個數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〃將Zero*ZeroTemp鏈里的數據賦給〃局部變量int*ZeroArry賦值,方便操//該層遞歸在ZeroArry[i]E經選擇的課程//已經安排的課程的數目//該層遞歸選擇的課程的學分的和〃標記某一種課程選擇是否正確作intxuan=1;的數目intsum=tempsum;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=j 1 1 0//則表示在這種情況下在數組int*ZeroArry里面//選擇ZeroArry[1-1],ZeroArry[2-1]的課程〃不選ZeroArry[3-1]//并且是i從1到pow(2,zero)-1,〃這樣可以不重不漏地將所有情況都考慮進去sum二tempsum;//已經安排的第sum課程ScoreNum=0;flag=0;ClassInTime[time-1]=0;//每一次循環都必須將數據初始化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;//全局變量數組ArryInTopo*topotemp記錄選課情況Check(ZeroArry[xuan-1]);//將課程Course[index]的后繼課程的入度減一ScoreNum+=coursehead[ZeroArry[xuan-1]].Score;〃選擇的課程的學分的和sum++;ClassInTime[time-1]++;//更改全局變量time學期課程的數目)j二j*2; //也可以用j=j<<1;)if(sum==SourceNum){ //課程安排成功Ifsuccessed();flag=1;)if(ScoreNum!=0&&ScoreNum<=MaxSource&&time<Time)TopoSort(sum,time+1);//繼續遞歸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循環用于在i=i+1之前將所有的數據還原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);//平均每學期的課程數目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++; 〃課程安排平均的數目+1))intZERO() //統計某層遞歸可以選擇的課程{ //并且完成可選課程的記錄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; //返回可選課程的個數)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]課程"推選"時,要將與他有關的課程的入度數還原{CourseLink*courselinktemp;courselinktemp二coursehead[index].first;while(courselinktemp!二NULL){coursehead[courselinktemp->Index].priornum++;courselinktemp二courselinktemp->next;)//根據客戶要求輸出相應)//根據客戶要求輸出相應的課程安排
printf1(1);inti=0,j=1,flag=1;FILE*f;//刷新屏幕Topo*pp二//刷新屏幕(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");elsef二fopen("所有情況.txt","w");printf1(f);if(flag==0)return;else(pp=topo->next;jT;while(pp!=NULL)(if(flag==1&&pp->level==1||flag==2)(printf("排!\n\n",j);printf("開課時間學分先修課數目\口”);fprintf(f,"第%d種課程安課程名稱 課程號第第%d種課程安課程名稱 課程號第%d種課程安fprintf(覃 開課時間 課程名稱 課程號學分先修課數目\口”);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() //界面(j(*X11"1^1 <-tJ,**************\n\n");printf("數據結構課程設計\n\n");printf("課題:《教學計劃編制》\n\n");printf("指導老師:張永\n\n");printf("試驗者:李子超\口\口”);;printf("班級:軟件一班\n\n");printf("學號:09240103\n\n");jXIV"1^1 <-tJ,**************\n\n");}//負責輸出課程信息//負責輸出課程信息〃若a=1則刷新屏幕if(a==1)system("cls");inti=0;for(i=0;i<80;++i)printf("%c",6);printf("\n\n");printf(" 課程基本信息\n\n");//—序號 課程名----課程號---學分---qianxuprintf("序號 課程名課程號學分必修課數目\n");for(i=0;i<SourceNum;++i)printf("%8d%16s%10s%7.1f%5d\n”,i+1,coursehead[i].Name,coursehead[i].Ofcourse,coursehead[i].Score,coursehead[i].priornum);printf("\n\n");printf2(); 〃輸出課程的聯系//printf(" 注意!!每一學期的學分的上線為:%f\n",MaxSource);printf("學期總數:%d 課程總數:%d 一學期的學分上限:%3.1f\n",Time,SourceNum,MaxSource);for(i=0;i<80;++i)printf("%c",6);printf("\n\n");)voidprintf2() 〃輸出課程的聯系(inti=0,p=0;CourseLink*courselinktemp二NULL;for(i=0;i<SourceNum;++i)(p=0;courselinktemp二coursehead[i].first;while(courselinktemp)(if(p==0)(printf("%5
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 預制菜在2025年餐飲業環保政策下的機遇與挑戰報告
- 保險承保題目及答案
- 安全職稱考試題庫及答案
- 康復醫療器械市場創新產品應用前景預測:2025年需求分析報告
- 安全生產禁令試題及答案
- 培訓課件有沒有版權
- 2025年成人教育終身學習平臺運營效率與市場占有率研究報告
- 個人養老金制度2025年對能源行業投資的影響與機遇分析報告
- 智慧交通系統2025年交通流量預測技術應用與智能交通設施報告001
- 胖東來管理培訓課件
- AHU維修與保養記錄
- CMBS盡調清單目錄
- 機械原理課程設計-自動打印機設計說明書
- 建設工程消防設計審查申報表
- 2020新版個人征信報告模板
- FBI教你破解身體語言(完整版)(54頁)ppt課件
- 內科護理學消化系統試習題及答案
- 華北電力大學-任建文-電力系統PPT(第1章)
- 《文殊真實名經》
- 對敏視達雷達回波進行基于PHIDP的dBZ和ZDR訂正_2014年4月5日~18日
- 蘇教版五年級數學下冊-復習知識點整理資料(共9頁)
評論
0/150
提交評論