版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 數(shù)據(jù)結(jié)構(gòu)(C++)課程設(shè)計</p><p> 題 目: 教學(xué)計劃編制問題 </p><p> 2013年 07月 04日</p><p><b> 一、設(shè)計題目</b></p><p> 大學(xué)的每個專業(yè)都要編制教學(xué)計劃。假設(shè)任何專業(yè)都有固定的學(xué)習(xí)年限,
2、每學(xué)年含兩學(xué)期,每學(xué)期的時間長度和學(xué)分上限都相等。每個專業(yè)開設(shè)的課程都是確定的,而且課程的開設(shè)時間的安排必須滿足先修關(guān)系。每個課程的先修關(guān)系都是確定的,可以有任意多門,也可以沒有。每一門課程恰好一個學(xué)期。試在這樣的情況下設(shè)置一個教學(xué)計劃編制程序。</p><p> 在大學(xué)的某個專業(yè)中選取幾個課程作為頂點,通過各門課的先修關(guān)系來構(gòu)建個圖,該圖用鄰接表來存儲,鄰接表的頭結(jié)點存儲每門課的信息。</p>
3、<p> 本程序的目的是為用戶編排課程,根據(jù)用戶輸入的信息來編排出每學(xué)期要學(xué)的課程。</p><p><b> 二、需求分析</b></p><p> (一)運(yùn)行環(huán)境(軟、硬件環(huán)境)</p><p><b> 設(shè)計環(huán)境和器材——</b></p><p><b> 硬件:
4、計算機(jī)</b></p><p> 軟件:Microsoft Visula C++</p><p> 在本課程設(shè)計中,系統(tǒng)開發(fā)平臺為Windows XP或Win 7,程序運(yùn)行環(huán)境為Visual C++ 6.0,程序設(shè)計語言為C++。Visual C++一般分為三個版本:學(xué)習(xí)版、專業(yè)版和企業(yè)版,不同版本適合于不同類型的應(yīng)用開發(fā)。實驗中可以使用這三個版本的任意一種,在本課程設(shè)計中
5、,以Visual C++ 6.0為編程環(huán)境。</p><p> Visual C++以擁有“語法高亮”,IntelliSense(自動編譯功能)以及高級除錯功能而著稱。比如,它允許用戶進(jìn)行遠(yuǎn)程調(diào)試和單步執(zhí)行等。還有允許用戶在調(diào)試期間重新編譯被修改的代碼,而不必重新啟動正在調(diào)試的程序。其編譯及建置系統(tǒng)以預(yù)編譯頭文件、最小重建功能及累加鏈接著稱。這些特征明顯縮短程式編輯、編譯及鏈接的時間花費(fèi),在大型軟件計劃上尤其顯
6、著。</p><p> Visual C++ 6.0秉承Visual C++ 以前版本的優(yōu)異特性,為用戶提供了一套良好的開發(fā)環(huán)境,主要包括文本編輯器、資源編輯器、工程創(chuàng)建工具和Debugger調(diào)試器等等。用戶可以在集成開發(fā)環(huán)境中創(chuàng)建工程,打開工程,建立、打開和編輯文本,編譯、鏈接、運(yùn)行和調(diào)試應(yīng)用程序。</p><p> (二)輸入的形式和輸入值的范圍</p><p&
7、gt; 數(shù)據(jù)輸入的方式是鍵盤輸入。輸入的數(shù)據(jù)多是整型的或是浮點型的,還有一些字符(以中文的形式)。輸入的數(shù)值型的數(shù)據(jù)大都是小于100的數(shù)值。</p><p> (三)輸出的形式描述</p><p> 輸出的是教學(xué)編制計劃,就是形如:“第二學(xué)期學(xué)的課程有:普通物理 線性代數(shù) 匯編語言”這樣的形式。</p><p><b> ?。ㄋ模┕δ苊枋?<
8、/b></p><p> 輸入?yún)?shù)包括:學(xué)期總數(shù),一學(xué)期的學(xué)分上限,每門課的課程號(固定占3位的字母數(shù)字串)、學(xué)分和直接先修課的課程號。</p><p> 允許用戶指定下列兩種編排策略之一:一是使學(xué)生在各學(xué)期中的學(xué)習(xí)負(fù)擔(dān)盡量均勻;二是使課程盡可能地集中在前幾個學(xué)期中。</p><p> 若根據(jù)給定的條件問題無解,則報告適當(dāng)?shù)男畔?;否則將教學(xué)計劃輸出到用戶
9、指定的文件中。計劃的表格格式自行設(shè)計。</p><p><b> ?。ㄎ澹y試數(shù)據(jù)</b></p><p><b> 學(xué)期總數(shù):6 </b></p><p><b> 學(xué)分上限:10</b></p><p> 該專業(yè)共開設(shè)12門課,課程號從01~12,學(xué)分順序為2,3,4
10、,2,2,4,4,4,7,5,2,3。</p><p><b> 三、概要設(shè)計</b></p><p> ?。ㄒ唬┏橄髷?shù)據(jù)類型定義描述</p><p> (對各類的成員及成員函數(shù)進(jìn)行抽象描述,參見書或ppt及實驗)</p><p><b> 抽象數(shù)據(jù)類型:</b></p><
11、;p> 為實現(xiàn)上述功能需建立一個結(jié)點類,線性表類,圖類。</p><p> ADT Graph{</p><p> 數(shù)據(jù)對象V:V是具有相同特性的數(shù)據(jù)元素的集合,稱為頂點集.</p><p><b> 數(shù)據(jù)關(guān)系R:</b></p><p><b> R={VR}</b></p&
12、gt;<p> VR={(v,w)|v,w∈V,(v,w)表示v和w之間存在直接先修關(guān)系}</p><p><b> 基本操作P:</b></p><p> void creatpre(AlGraph *CGraph);</p><p> void findindegree(AlGraph *CGraph,int inde
13、gree[]);</p><p> void layout1(AlGraph *CGraph,queue *q);</p><p> void layout2(AlGraph *CGraph,queue *q);</p><p> }ADT Graph</p><p><b> 隊列的定義:</b></p&
14、gt;<p><b> ADT List{</b></p><p> 數(shù)據(jù)對象:D={ai|ai∈ElemSet,i=1,2,…n,n>=0}</p><p> 數(shù)據(jù)關(guān)系:R1={﹤ai-1 ai﹥|ai-1,ai∈D,i=2,…,n}</p><p><b> 基本操作:</b></p&
15、gt;<p> void queue_init(queue *q);</p><p> void queue_in(queue *q,int x);</p><p> int queue_out(queue *q);</p><p> int queue_empty(queue *q);</p><p> }ADT S
16、tack</p><p><b> ?。ǘ┕δ苣K設(shè)計</b></p><p><b> 主程序:</b></p><p> void main()</p><p><b> {</b></p><p> int choice;</p&
17、gt;<p> queue q;</p><p> Queue.queue_init(&q);</p><p> AlGraph CGraph;</p><p> CGraph=Graph.input();</p><p> system(&qu
18、ot;cls");</p><p> Graph.output(CGraph);</p><p> cout<<endl<<endl;</p><p> Judgement.judgingcricle(&CGraph,&q);</p><p>
19、 if(!WhetherCricle)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> cout<<"請選擇編排策略:\t"<<
20、endl;</p><p> cout<<"1.使學(xué)生在各學(xué)期中的學(xué)習(xí)負(fù)擔(dān)盡量均勻;\t"<<endl;</p><p> cout<<"2.使課程盡可能地集中在前幾個學(xué)期中。\t"<<endl;</p><p> cout<<"請選擇:";
21、</p><p> cin>>choice;</p><p> system("cls");</p><p> if(choice==1) </p><p> Edit.layout1(&CGraph,&q);</p><p><b>
22、; else </b></p><p> Edit.layout2(&CGraph,&q);</p><p> cout<<"請選擇繼續(xù)編排策略或退出程序(0退出 1繼續(xù)):\t"<<endl;</p><p> cin>>choice;</p><
23、;p> system("cls");</p><p> if(choice==0)</p><p><b> break; </b></p><p><b> }</b></p><p><b> }</b></p>
24、<p><b> }</b></p><p> ?。ㄈ┠K層次調(diào)用關(guān)系</p><p> 本程序只有兩個模塊,調(diào)用關(guān)系簡單</p><p> 主程序模塊→拓?fù)渑判蚰K</p><p> TopSort流程圖:</p><p> 鄰接表構(gòu)造函數(shù)ALGraph</p>
25、<p> 鄰接表ALGraph的構(gòu)造函數(shù)</p><p><b> 四、詳細(xì)設(shè)計</b></p><p> 教學(xué)計劃編制系統(tǒng)主要是處理課程之間的依賴關(guān)系。表列出了若干門計算機(jī)系本科課程,其中有些課程不要求先修課程,例如,C1是獨立于其他課程的基礎(chǔ)課,而有些課程卻需要有先修課程,比如,學(xué)完程序設(shè)計語言C++和離散數(shù)學(xué)后才能學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)。</p&
26、gt;<p> 先修課程規(guī)定了課程之間的依賴關(guān)系,這種關(guān)系可以用AOV網(wǎng)來表示,其中頂點表示課程,弧表示依賴關(guān)系。</p><p> 程序的主要功能是實現(xiàn)課程的排序,以滿足同一學(xué)期所修的課程相互之間無依賴關(guān)系,并且已修完其所有先修課程。本程序需要基于圖的基本操作來實現(xiàn)</p><p><b> 算法的基本思想:</b></p><
27、;p><b> 1、圖的構(gòu)建:</b></p><p> 建立一個結(jié)點類,類的元素有字符型變量用來存儲字母,整形變量用來存儲位置,該類型的指針,指向下一個元素。建立一個線性表類,完成線性表的構(gòu)建。建立一個圖類,完成圖的信息的讀取,(如有n個點,則建立n個線性表,將每個結(jié)點與其指向的結(jié)點組成一個線性表,并記錄線性表的長度)。</p><p> 2、Topso
28、rt算法:</p><p> 先計算每個點的入度,保存在數(shù)組中。找到第一個入度為0的點,將該點所連的各點的入度減一。再在這些點中找入度為0 的點。如果找到,重復(fù)上述操作。如果找不到,則跳出while循環(huán),再搜索其他的點,看入度是否為0。再重復(fù)上述操作,如果所有的入度為0的點都被尋找到,但個數(shù)少于輸入頂點的個數(shù),說明該圖存在環(huán)。</p><p> 3、 鄰接表類的定義</p>
29、<p> 鄰接表是一種順序存儲與鏈接存儲相結(jié)合的存儲方法。在鄰接表中存在兩種結(jié)點結(jié)構(gòu):頂點表結(jié)點和邊表結(jié)點。</p><p><b> 五、調(diào)試分析</b></p><p> 包括調(diào)試過程中遇到的問題及解決的方法、算法的時間空間復(fù)雜性分析、經(jīng)驗體會。</p><p> ?。ㄒ唬嶒炦^程中出現(xiàn)的問題及解決方法</p>
30、;<p> 我在實驗過程中遇到的最大難題是兩個課程排序算法的編寫。剛開始的時候沒有任何的思路,網(wǎng)上也只有拓?fù)渑判虻乃惴ǎ瑢τ谡n程設(shè)計要求的排序算法沒有任何頭緒。經(jīng)過請教老師和同學(xué)以及翻閱了一些相關(guān)書籍,并在網(wǎng)上的搜索有了排序算法的大體思路。經(jīng)過三天的修改,終于寫出了符合要求的排序算法。</p><p><b> (二)實驗體會</b></p><p>
31、; 上機(jī)實踐是學(xué)生對本門課程所學(xué)知識的一種全面、綜合的能力訓(xùn)練,是與課堂聽講、自學(xué)和練習(xí)相輔相成必不可少的一個教學(xué)環(huán)節(jié),也是對課堂教學(xué)效果的一種檢驗。通常,實習(xí)題中的問題比平時的習(xí)題復(fù)雜得多,也更接近實際。實習(xí)題注重原理與應(yīng)用的結(jié)合,目的讓學(xué)生學(xué)會如何把書上學(xué)到的知識運(yùn)用于解決實際問題的過程中去,培養(yǎng)從事軟件開發(fā)設(shè)計工作所必需的基本技能。同時,通過實踐能使書上的知識變“活”,起到深化理解和靈活掌握教學(xué)內(nèi)容的作用。平時的練習(xí)較偏重于如何
32、編寫功能單一的“小”算法,而實習(xí)題是軟件設(shè)計的綜合訓(xùn)練,包括問題分析,總體結(jié)構(gòu)設(shè)計,用戶界面設(shè)計,程序設(shè)計基本技能和技巧,可以多人合作,有利于一整套軟件工程規(guī)范的訓(xùn)練和科學(xué)作風(fēng)的培養(yǎng)。此外,實踐環(huán)節(jié)中有很重要的一點,就是機(jī)器是比任何教師都嚴(yán)格的主考官。</p><p> 經(jīng)過此次課程設(shè)計,我認(rèn)識到了理論與實踐結(jié)合的重要性,僅僅只是從課本上學(xué)到算法原理是遠(yuǎn)遠(yuǎn)不夠的。在實踐中,我們總會出現(xiàn)許多錯誤。這就要求我們以一
33、個腳踏實地的態(tài)度來處理問題。我深刻地認(rèn)識到自己寫程序的不足,使我們學(xué)到了好多有用的知識,讓我們明白了C++語言的語句用法。</p><p><b> 六、測試結(jié)果</b></p><p> 要求輸入學(xué)期總數(shù)、一個學(xué)期的學(xué)分上限、需要編排課程總數(shù)、課程名、課程號、該課程的學(xué)分,按照出現(xiàn)的每一步來輸入該課程設(shè)計所提供的相關(guān)數(shù)據(jù)。</p><p>
34、; 學(xué)期總數(shù):6;學(xué)分上限:10;該專業(yè)共開設(shè)12門課,課程號從01到12,學(xué)分順序為2,3,4,2,2,4,4,4,7,5,2,3。</p><p> 然后還要輸入課程先修課程總數(shù),可以算出有16種關(guān)系,分別輸出。接著程序會根據(jù)這些數(shù)據(jù),自動生成建立好的鄰接表,用戶可以根據(jù)系統(tǒng)顯示的選擇編排策略進(jìn)行選擇,有兩種編排策略,最后結(jié)果體現(xiàn)在實驗的正確測試結(jié)果里。</p><p> 輸入的
35、內(nèi)容如下:課程編號 課程名稱 學(xué)分 先決條件01 計算機(jī)基礎(chǔ) 2 無02 離散數(shù)學(xué) 3
36、0; 0103 數(shù)據(jù)結(jié)構(gòu) 4 01,02 </p><p> 04 匯編語言 &
37、#160; 2 0105 語言的設(shè)計和分析 2 03,04 </p><p> 06 計算機(jī)原理 4
38、 1007 編譯原理 4 05,03 </p><p> 08 操作系統(tǒng) 4
39、60; 03,06</p><p> 09 高等數(shù)學(xué) 7 無 </p><p> 10 普通物理 &
40、#160; 5 0911 線性代數(shù) 2 0912 數(shù)值分析 3
41、 09,11,01</p><p> 七 、附錄:程序設(shè)計源代碼</p><p> #include<iostream></p><p> #include<string></p><p> #include<cstdio></p><
42、p> #include<cstdlib></p><p> using namespace std;</p><p> #define null 0</p><p> #define MAX_COURSE_NUM 100//最大課程個數(shù)</p><p> typedef struct </p&
43、gt;<p><b> {</b></p><p> char c[3];</p><p> }cid; //課程號</p><p> typedef struct Course </p><p><b> { </b></p><p
44、> cid id[3];</p><p> char name[30];</p><p> float xf;</p><p> }Course;//課程</p><p> typedef struct PreCourse </p><
45、p><b> {</b></p><p> int adjvex;</p><p> struct PreCourse *nextarc; </p><p> }PreCourse;//先修的課程節(jié)點</p><p> typedef struct</p>
46、;<p><b> {</b></p><p> Course course;</p><p> PreCourse *firstarc;</p><p> }CourseNode;//課程節(jié)點</p><p> typedef struct</p>
47、<p><b> {</b></p><p> CourseNode courses[MAX_COURSE_NUM];//鄰接表</p><p> int xqs;</p><p> int num;</p><p> float xfsx;</
48、p><p> }AlGraph;//課程圖</p><p> typedef struct </p><p><b> {</b></p><p> int data[MAX_COURSE_NUM];</p><p> int f,r;</p&g
49、t;<p><b> }queue;</b></p><p> int WhetherCricle=0;</p><p> int jxq;</p><p> class Queue</p><p><b> {</b></p>&
50、lt;p><b> public:</b></p><p> void queue_init(queue *q);</p><p> void queue_in(queue *q,int x);</p><p> int queue_out(queue *q);</p><p> int queue_em
51、pty(queue *q);</p><p><b> }Queue;</b></p><p> void Queue::queue_init(queue *q)//隊初始化</p><p><b> {</b></p><p> q->f=q->r=0;</p&g
52、t;<p><b> }</b></p><p> void Queue::queue_in(queue *q,int x)//入隊</p><p><b> {</b></p><p> if((q->r+1)%MAX_COURSE_NUM==q->f)</p>&l
53、t;p><b> {</b></p><p> cout<<"隊滿\t"<<endl;</p><p><b> exit(0);</b></p><p><b> }</b></p><p> q->r=(q-
54、>r+1)%MAX_COURSE_NUM;</p><p> q->data[q->r]=x;</p><p><b> }</b></p><p> int Queue::queue_out(queue *q)//出隊</p><p><b> {</b><
55、;/p><p> if(q->f==q->r)</p><p><b> {</b></p><p> cout<<"隊空\t"<<endl;</p><p><b> exit(0);</b></p><p>&l
56、t;b> }</b></p><p> q->f=(q->f+1)%MAX_COURSE_NUM;</p><p> return q->data[q->f];</p><p><b> }</b></p><p> int Queue::queue_empty(que
57、ue *q)//隊判空 1為空</p><p><b> {</b></p><p> if(q->f==q->r)</p><p><b> return 1;</b></p><p> else return 0;</p><p><b&
58、gt; }</b></p><p> class Graph</p><p><b> {</b></p><p><b> public:</b></p><p> AlGraph input();</p><p> void output(AlGr
59、aph CGraph);</p><p> void creatpre(AlGraph *CGraph);</p><p><b> }Graph;</b></p><p> void Graph::creatpre(AlGraph *CGraph)//建立先修關(guān)系</p><p><b> {&
60、lt;/b></p><p> system("cls");</p><p> int choice;</p><p> int i,n; </p><p><b> int j;</b></p><p> PreCourse *p,*
61、q;</p><p> cout<<endl<<"建立先修關(guān)系:\t"<<endl;</p><p> cout<<endl<<"輸入的每一門課程號的編號:\t"<<endl;</p><p> for(i=0;i<CGraph-&g
62、t;num;i++)</p><p><b> {</b></p><p> if(i%4==0)</p><p> cout<<endl;</p><p> cout<<"("<<i+1<<")";//輸入課程的編號
63、</p><p> printf("%s\t",CGraph->courses[i].course.id);</p><p><b> }</b></p><p> cout<<endl;</p><p> cout<<"\n請根據(jù)以上的編號,輸入每一
64、門課程的先修課程號的編號(輸入0 表示沒有或結(jié)束):\t"<<endl;</p><p> for(i=0;i<CGraph->num;i++)</p><p><b> {</b></p><p> printf("%s的先修課程:",CGraph->courses[i].co
65、urse.id);</p><p><b> cin>>j;</b></p><p><b> n=0;</b></p><p> while(j)//判斷輸入的課程編號是否正確</p><p><b> {</b></p><
66、;p> while(j<1||j>CGraph->num||j==i+1)</p><p><b> {</b></p><p> if(j==i+1)</p><p> cout<<"先修課程號不可能是本課程號\n";</p><p>
67、<b> else</b></p><p> cout<<"輸入的先修課程號不在該專業(yè)開設(shè)的課程序列中"<<endl;</p><p> cout<<"請重新輸入:";</p><p><b> cin>>j;</b>&
68、lt;/p><p><b> }</b></p><p> p=(PreCourse *)malloc(sizeof(PreCourse));p->adjvex=j-1;</p><p> p->nextarc=null;</p><p><b> if(n==0)</b>
69、;</p><p><b> {</b></p><p> CGraph->courses[i].firstarc=p;</p><p> q=CGraph->courses[i].firstarc;</p><p><b> n++;</b></p><p
70、><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> q->nextarc=p;</p><p><b> q=p;</b></p><p>
71、;<b> n++;</b></p><p><b> }</b></p><p><b> cin>>j;</b></p><p><b> }</b></p><p><b> }</b></p>
72、<p> cout<<"(1)重新建立先修關(guān)系\t"<<"(2)確定\n";</p><p> cout<<"請選擇:";</p><p> cin>>choice;</p><p> if(choice==1)</p>&
73、lt;p> creatpre(CGraph);</p><p><b> jxq=0;</b></p><p><b> }</b></p><p> AlGraph Graph::input()//輸入并建立課程圖</p><p><b> {</b&g
74、t;</p><p> AlGraph CGraph;</p><p> int xqzs=0,kczs=0; </p><p><b> int i;</b></p><p> int choice;</p><p> float xf,xfsx=0;&l
75、t;/p><p> cout<<"教學(xué)計劃編制\n"<<endl;</p><p> cout<<"輸入?yún)?shù):\n";</p><p> cout<<"1.學(xué)期總數(shù):";</p><p> cin>>xqzs;</
76、p><p> CGraph.xqs=xqzs;</p><p> cout<<"2.專業(yè)共開設(shè)課程數(shù):";</p><p> cin>>kczs;</p><p> CGraph.num=kczs;</p><p> cout<<"3.學(xué)分
77、上限(每個學(xué)期的學(xué)分上限都一樣):";</p><p> cin>>xfsx;</p><p> CGraph.xfsx=xfsx;</p><p> cout<<"4.每門課的課程號(固定占3位的字母數(shù)字串)、課程名、學(xué)分——"<<endl;</p><p> for
78、(i=0;i<kczs;i++)//輸入課程號,課程名,學(xué)分</p><p><b> {</b></p><p> cout<<"課程號:";</p><p> scanf("%s",CGraph.courses[i].course.id);</p><
79、;p> cout<<"課程名:";</p><p> scanf("%s",CGraph.courses[i].course.name);</p><p> cout<<"學(xué)分:";</p><p><b> cin>>xf;</b>&
80、lt;/p><p> cout<<endl;</p><p> while(xf>xfsx||xf<=0)//判斷輸入的學(xué)分是否合格</p><p><b> {</b></p><p> cout<<"輸入的學(xué)分有誤,請重新輸入學(xué)分:";</p&g
81、t;<p><b> cin>>xf;</b></p><p><b> }</b></p><p> CGraph.courses[i].course.xf=xf;</p><p> CGraph.courses[i].firstarc=null;</p><p>
82、;<b> }</b></p><p> cout<<"(1)重新輸入\t"<<"(2)確定"<<endl;</p><p> cout<<"請選擇:";</p><p> cin>>choice;</p>
83、<p> if(choice==1)</p><p><b> {</b></p><p> system("cls");</p><p><b> input();</b></p><p><b> }</b></p>
84、<p><b> else </b></p><p><b> {</b></p><p> creatpre(&CGraph);//建立先修關(guān)系</p><p> return CGraph;</p><p><b> }</b><
85、;/p><p><b> }</b></p><p> void Graph::output(AlGraph CGraph)///輸出先修關(guān)系</p><p><b> {</b></p><p> int i,j,n;</p><p> PreCourse *
86、p;</p><p> cout<<"先修關(guān)系如下:\n"<<endl;</p><p> cout<<"課程編號\t"<<"課程名稱\t"<<"先決條件"<<endl;</p><p> for(i=0;i
87、<CGraph.num;i++)</p><p><b> {</b></p><p> printf("%s\t\t%s\t\t",CGraph.courses[i].course.id,CGraph.courses[i].course.name);</p><p><b> j=0;</b&g
88、t;</p><p> p=CGraph.courses[i].firstarc;</p><p><b> while(p)</b></p><p><b> {</b></p><p> n=p->adjvex;</p><p> printf("
89、; %s ",CGraph.courses[n].course.id);</p><p> p=p->nextarc;</p><p><b> j++;</b></p><p><b> }</b></p><p><b> if(j==0)</b>
90、</p><p> cout<<" 無";</p><p> cout<<endl;</p><p><b> }</b></p><p><b> }</b></p><p> class Judgement</p
91、><p><b> {</b></p><p><b> public:</b></p><p> void findindegree(AlGraph *CGraph,int indegree[]);</p><p> void judgingcricle(AlGraph *CGraph,que
92、ue *q2);</p><p> }Judgement;</p><p> void Judgement::findindegree(AlGraph *CGraph,int indegree[])</p><p><b> {</b></p><p><b> int i;</b><
93、;/p><p> PreCourse *p;</p><p> for(i=0;i<CGraph->num;i++)</p><p><b> {</b></p><p> indegree[i]=0;</p><p> p=CGraph->courses[i].first
94、arc;</p><p><b> while(p)</b></p><p><b> {</b></p><p> indegree[i]++;</p><p> p=p->nextarc;</p><p><b> }</b><
95、/p><p><b> }</b></p><p><b> }</b></p><p> void Judgement::judgingcricle(AlGraph *CGraph,queue *q2)//判斷是否有環(huán)和課程入隊</p><p><b> {</b>
96、</p><p> int indegree[MAX_COURSE_NUM];//入度</p><p> int i,m,j,pd=0;</p><p> float xf=0;</p><p> PreCourse *p;</p><p><b> queue q;</b&g
97、t;</p><p> Queue.queue_init(&q);//隊初始化</p><p> findindegree(CGraph,indegree);//找入度</p><p> for(i=0;i<CGraph->num;i++)</p><p><b> {</
98、b></p><p> if(indegree[i]==0&&(xf+CGraph->courses[i].course.xf)<=CGraph->xfsx)</p><p><b> {</b></p><p> Queue.queue_in(&q,i);</p>&
99、lt;p> indegree[i]--;</p><p> xf+=CGraph->courses[i].course.xf;</p><p><b> }</b></p><p><b> }</b></p><p><b> m=0;</b></
100、p><p><b> xf=0;</b></p><p> Queue.queue_in(&q,-1); //把-1入隊 用來判斷</p><p><b> jxq++;</b></p><p><b> while(1)</b></p&g
101、t;<p><b> {</b></p><p> i=Queue.queue_out(&q);</p><p> Queue.queue_in(q2,i);</p><p><b> if(i!=-1)</b></p><p><b> {</b&g
102、t;</p><p><b> m++;</b></p><p> for(j=0;j<CGraph->num;j++)</p><p><b> if(j!=i)</b></p><p><b> {</b></p><p>
103、if(indegree[j]==0&&(xf+CGraph->courses[j].course.xf)<=CGraph->xfsx)</p><p><b> {</b></p><p> Queue.queue_in(&q,j);</p><p> indegree[j]--;&l
104、t;/p><p> xf+=CGraph->courses[j].course.xf;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> p=CGraph
105、->courses[j].firstarc;</p><p><b> while(p)</b></p><p><b> {</b></p><p> if(p->adjvex==i)</p><p><b> {</b></p><p
106、> indegree[j]--;</p><p> if(indegree[j]==0&&(xf+CGraph->courses[j].course.xf)<=CGraph->xfsx)</p><p><b> {</b></p><p> Queue.queue_in(&q,j);&l
107、t;/p><p> indegree[j]--;</p><p><b> pd=1;</b></p><p> xf+=CGraph->courses[j].course.xf;</p><p><b> }</b></p><p><b> }<
108、;/b></p><p> p=p->nextarc;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b>&l
109、t;/p><p><b> else</b></p><p><b> {</b></p><p><b> if(pd)</b></p><p><b> {</b></p><p><b> pd=0;</
110、b></p><p> Queue.queue_in(&q,-1);</p><p><b> jxq++;</b></p><p><b> xf=0;</b></p><p><b> }</b></p><p> else
111、break;</p><p><b> }</b></p><p><b> }</b></p><p> if(jxq>CGraph->xqs)</p><p> {cout<<endl<<"錯誤報告:\n"<<"
112、;在"<<CGraph->xqs<<"學(xué)期內(nèi)是無法修完這些課程"<<endl;</p><p><b> exit(0);}</b></p><p> if(m<CGraph->num)</p><p><b> {</b></
113、p><p> cout<<"\n錯誤報告:"<<endl;</p><p> cout<<"存在循環(huán),因此課程安排不了"<<endl;</p><p> WhetherCricle=1;</p><p><b> }</b><
114、;/p><p> Queue.queue_in(q2,-1);}</p><p> class Edit</p><p><b> {</b></p><p><b> public:</b></p><p> void layout1(AlGraph *CGraph,
115、queue *q);</p><p> void layout2(AlGraph *CGraph,queue *q);</p><p><b> }Edit;</b></p><p> void Edit::layout1(AlGraph *CGraph,queue *q){cout<<"\n學(xué)生在各
116、學(xué)期中的學(xué)習(xí)負(fù)擔(dān)盡量均勻:\n"<<endl;</p><p> int i,j,k,xq=1,ck[20];</p><p><b> float xf;</b></p><p> float m=CGraph->num/CGraph->xqs*1.0f;queue q1=*q;<
117、/p><p> int n;int x;</p><p><b> n=0;</b></p><p><b> ck[0]=-1;</b></p><p> for(i=0;i<20;i++)</p><p> {j=Queue.queue_out(&q1
118、);</p><p><b> ck[i]=j;</b></p><p> if(j==-1) </p><p><b> i--;</b></p><p> if((Queue.queue_empty(&q1))) </p><p><b> b
119、reak;</b></p><p><b> }</b></p><p> for(x=0;x<CGraph->xqs;x++)</p><p><b> {</b></p><p> if(ck[0]!=-1)</p><p><b&g
120、t; {</b></p><p> cout<<"\n第"<<xq++<<"學(xué)期學(xué):";</p><p><b> xf=0;</b></p><p> for(i=0;i<m;i++)</p><p><b>
121、; {</b></p><p><b> k=ck[n];</b></p><p> printf(" %s ",CGraph->courses[k].course.id);</p><p><b> n++;</b></p><p> xf+=CG
122、raph->courses[k].course.xf;}</p><p> cout<<"獲得學(xué)分是:"<<xf<<endl;}</p><p><b> }</b></p><p><b> }</b></p><p> v
123、oid Edit::layout2(AlGraph *CGraph,queue *q){</p><p> cout<<"\n課程盡可能地集中在前幾個學(xué)期中:\n"<<endl;</p><p> int i,j,xq=1;</p><p><b> float xf;</b>&
124、lt;/p><p> cout<<"\n第"<<xq<<"學(xué)期學(xué):";</p><p><b> xq++;</b></p><p><b> xf=0;</b></p><p> queue q1=*q;</p&
125、gt;<p> for(i=1;i<=CGraph->num;)</p><p><b> {</b></p><p> j=Queue.queue_out(&q1);</p><p><b> if(j!=-1)</b></p><p><b>
126、 {</b></p><p> printf(" %s ",CGraph->courses[j].course.id);</p><p><b> i++;</b></p><p> xf+=CGraph->courses[j].course.xf;</p><p>
127、<b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> cout<<"獲得學(xué)分是:"<<xf;</p><p> cout<<"\n第
128、"<<xq++<<"學(xué)期學(xué):";</p><p><b> xf=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> cout<<"獲得
129、學(xué)分是:"<<xf<<endl;</p><p> if(xq<=CGraph->xqs)</p><p><b> {</b></p><p> cout<<"\n第"<<xq++<<"學(xué)期學(xué):無\n"<<
130、;endl;</p><p><b> }</b></p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> int choice;</p><
131、p> queue q;</p><p> Queue.queue_init(&q);</p><p> AlGraph CGraph;</p><p> CGraph=Graph.input();</p><p> system("cls&qu
132、ot;);</p><p> Graph.output(CGraph);</p><p> cout<<endl<<endl;</p><p> Judgement.judgingcricle(&CGraph,&q);</p><p> if(!Whet
133、herCricle)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> cout<<"請選擇編排策略:\t"<<endl;<
134、/p><p> cout<<"1.使學(xué)生在各學(xué)期中的學(xué)習(xí)負(fù)擔(dān)盡量均勻;\t"<<endl;</p><p> cout<<"2.使課程盡可能地集中在前幾個學(xué)期中。\t"<<endl;</p><p> cout<<"請選擇:";</p>
135、;<p> cin>>choice;</p><p> system("cls");</p><p> if(choice==1) </p><p> Edit.layout1(&CGraph,&q);</p><p><b> else &
136、lt;/b></p><p> Edit.layout2(&CGraph,&q);</p><p> cout<<"請選擇繼續(xù)編排策略或退出程序(0退出 1繼續(xù)):\t"<<endl;</p><p> cin>>choice;</p><p> s
137、ystem("cls");</p><p> if(choice==0)</p><p><b> break; </b></p><p><b> }</b></p><p><b> }</b></p><p>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計_教學(xué)計劃編制問題
- 教學(xué)計劃編制數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 教學(xué)計劃編制問題數(shù)據(jù)結(jié)構(gòu)課程設(shè)計說明書
- 數(shù)據(jù)結(jié)構(gòu)----集合運(yùn)算課程設(shè)計報告(c++)
- 教學(xué)計劃編制系統(tǒng)課程設(shè)計文檔
- 教學(xué)計劃編制問題-軟件算法分析與設(shè)計課程設(shè)計
- 地圖著色問題-c++和數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-中南大學(xué)
- 地圖著色問題-c++和數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-中南大學(xué)
- 數(shù)據(jù)結(jié)構(gòu)c++課程設(shè)計報告--拼寫檢測器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計——公交換乘系統(tǒng)(c++)
- c數(shù)據(jù)結(jié)構(gòu)迷宮問題課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計迷宮問題課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告——航班信息查詢系統(tǒng)(c++)
- c語言與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告----迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告-北京地鐵查詢系統(tǒng)c++版
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
評論
0/150
提交評論