2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論