數據結構課程設計報告---約瑟夫環(huán)_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  課 程 設 計 報 告</p><p>  課程設計名稱:數據結構課程設計</p><p>  課程設計題目:約瑟夫環(huán)</p><p><b>  院(系):電信學院</b></p><p>  專 業(yè):計算機應用科學</p><p><b>  目 錄

2、</b></p><p>  1 課程設計介紹1</p><p>  1.1 課程設計內容1</p><p>  1.2 課程設計要求1</p><p>  2 課程設計原理2</p><p>  2.1 課設題目粗略分析2</p><p>  2.2 原理圖介紹3&

3、lt;/p><p>  2.2.1 功能模塊圖3</p><p>  2.2.2 流程圖分析4</p><p>  3 數據結構分析7</p><p>  3.1 存儲結構................................................................................7&l

4、t;/p><p>  3.2 算法描述7</p><p>  4 調試與分析9</p><p>  4.1 調試過程9</p><p>  4.2 程序執(zhí)行過程10</p><p><b>  參考文獻15</b></p><p>  附 錄(關鍵部分程序清單)

5、16</p><p><b>  1 課程設計介紹</b></p><p>  1.1 課程設計內容</p><p>  設計程序,系統主要功能如下:</p><p>  編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開

6、始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止。試設計一個程序求出出列順序。</p><p>  1.2 課程設計要求</p><p>  1.參考相應的資料,獨立完成課程設計任務書。</p><p>  2.交規(guī)范課程設計報告和軟件代碼。</p>&l

7、t;p><b>  2 課程設計原理</b></p><p>  2.1 課設題目粗略分析</p><p>  根據課設題目要求,擬將整體程序分為四大模塊。此四個模塊相互獨立,沒有嵌套調用的情況,以下是四個模塊的大體分析:</p><p>  main()函數是主要的控制函數,main()函數主要負責存儲用戶輸入的基本數據以及調用其他子

8、函數模塊,在main()函數中還存在一個比較小的函數模塊exit(0),該函數模塊負責終止程序運行,另外還有兩個子函數模塊,分別是random()函數模塊與solid()函數模塊,這兩個函數模塊分別各自負責自己所要處理的數據以及輸出功能;</p><p>  在程序運行之后,在程序主界面出現之后,當用戶自己輸入了自己想要實現的功能模塊所在的數字選項后,立即進入主函數模塊之中,當用戶輸入了所有的必要數據之后,按照用

9、戶選定的數字選項所要實現的功能調用相應的子函數;</p><p>  如果用戶選擇的是系統隨機產生密碼的選項,則main()函數就調用random()子函數模塊,在random()函數模塊中,將會隨機產生各個參與者的密碼,并且同時建立鏈表來存儲、處理這些數據,在完成了所有的操作之后,random()函數就將輸出結果,反之,如果用戶選擇的是用戶自己輸入密碼的選項,則main()函數就調用solid()函數模塊,在s

10、olid()函數模塊中,將會提醒用戶自己一個個的輸入每個參與者的密碼,與此同時建立鏈表來存儲、處理這些數據,在完成了所有的操作之后,solid()函數就將輸出結果。</p><p><b>  2.2 原理圖介紹</b></p><p>  2.2.1 功能模塊圖</p><p>  圖2.1 功能模塊圖</p><p>

11、;  2.2.2 流程圖分析</p><p>  1.如圖2.2,random()函數的執(zhí)行過程如下;</p><p><b>  N</b></p><p><b>  Y</b></p><p>  圖2.2 random()函數流程圖</p><p>  2.如圖2.3

12、,solid()函數的執(zhí)行過程如下;</p><p><b>  N</b></p><p><b>  Y</b></p><p>  圖2.3 solid()函數流程圖</p><p>  3.如圖2.4,main()函數的執(zhí)行過程如下。</p><p><b>

13、;  N</b></p><p><b>  Y</b></p><p>  圖2.4 main()函數流程圖</p><p>  3 數據結構分析 </p><p>  3.1 存儲結構 num codenext</p><p>  圖3.1 數據存儲結構&l

14、t;/p><p><b>  3.2 算法描述</b></p><p>  1. 用戶輸入數據;</p><p>  while(scanf("%d",&p)!=EOF)</p><p><b>  {</b></p><p><b>  

15、if(p==1)</b></p><p><b>  random();</b></p><p>  else if(p==2)</p><p><b>  solid();</b></p><p><b>  else</b></p><p&g

16、t;<b>  exit(0);</b></p><p>  printf("*************************歡迎進入約瑟夫環(huán)問題求解系統*************************\n \n");</p><p>  printf("1.按照系統隨機給出的密碼進行 2.按照自己輸入的密碼進行 3.退出該系

17、統\n\n");</p><p>  printf("********************請輸入您要實現的功能模塊所在的數字選項!********************\n\n");</p><p><b>  }</b></p><p>  random()函數隨機產生各個參與者的密碼,用戶在此函數中輸入第

18、一個要報的數,此函數之后會排好各個參與者的出列順序;</p><p>  or(i=1;i<=n;i++) </p><p>  { key=rand()%100;</p><p>  printf("第%d個人的密碼:%d\n",i,key); </p><p><b>  s=p; </b>

19、;</p><p>  p=(list *)malloc(sizeof(list)); //創(chuàng)建新的結點.</p><p>  s->next=p; </p><p>  p->num=i; </p><p>  p->code=key; </p><p><b>  } </b>

20、;</p><p>  p->next=head->next; </p><p><b>  p=head; </b></p><p>  head=head->next; </p><p>  free(p); //釋放頭結點.</p><p><b>  p=hea

21、d;</b></p><p><b>  do{ </b></p><p>  printf("\n第%d號成員的密碼為:%d",p->num,p->code); //輸出鏈表.</p><p>  p=p->next; </p><p>  }while(p!=head

22、); </p><p>  printf("\n\n輸入第一個報的數:\n"); </p><p>  scanf("%d",&key);</p><p>  3. solid()函數提示用戶輸入各個參與者的密碼及第一個要報的數,并且排好各個參與者的出列順序。</p><p>  for(i=1

23、;i<=n;i++) </p><p>  { scanf("%d",&key);</p><p>  printf("第%d個人的密碼:%d\n",i,key);</p><p><b>  s=p; </b></p><p>  p=(list *)malloc(

24、sizeof(list)); //創(chuàng)建新的結點.</p><p>  s->next=p; </p><p>  p->num=i; </p><p>  p->code=key; </p><p>  printf("請輸入密碼:");</p><p><b>  }

25、</b></p><p>  p->next=head->next; </p><p><b>  p=head; </b></p><p>  head=head->next; </p><p>  free(p); //釋放頭結點.</p><p><b&g

26、t;  p=head;</b></p><p><b>  do{ </b></p><p>  printf("\n第%d號成員的密碼為:%d",p->num,p->code); //輸出鏈表.</p><p>  p=p->next; </p><p>  }whil

27、e(p!=head); </p><p>  printf("\n\n輸入第一個報的數:\n"); </p><p>  scanf("%d",&key);</p><p><b>  }</b></p><p><b>  4 調試與分析</b>&

28、lt;/p><p><b>  4.1 調試過程</b></p><p>  在調試程序是主要遇到一下幾類問題:</p><p>  1.調試過程中,曾出現過缺少分號、括號之類的錯誤,還出現過運算順序顛倒,致使運算出現了錯誤,在經過仔細的檢查并且向人請教,終于得出了正確結果.這次的課程設計的代碼比較冗長,所以等有了解題思路后,把代碼都寫上后難免會有

29、很多錯誤。當第一次把整個程序寫好后運行,出現了很多錯誤。不過經過一點點的改正,錯誤也慢慢地變少。這也說明做事要認真,尤其做計算機這方面工作的時候,因為計算機不容許一點點的錯誤,有了一點小錯誤和有一個大錯誤在計算機看來都是一樣的,都不會得到結果。有些小錯誤,比如說少了個分號,變量忘了定義,數據溢出等都是些小錯誤,但也不能松懈。因為要注意的地方很多,經過多次嘗試,問題也就自然而然的解決了,而且以后遇到這方面的問題都會覺得比較得心應手。<

30、;/p><p>  2.在隨機設置每個結點的key時也曾是個問題,因為我做的隨機函數一直都用不好,要不是每次隨到的都是一樣的,要么就是每次隨到的數都很大,后來通過學長的耐心講解才得以解決。在調試的過程中,類的優(yōu)勢很明顯,能很簡單的把問題解決,而不需要使用的其他的一些比較復雜的方法。</p><p>  4.2 程序執(zhí)行過程</p><p>  *************

31、************歡迎進入約瑟夫環(huán)問題求解系統*************************系統使用說明:</p><p>  1. 進入程序主界面后,會出現三個選項,按1則是隨系統隨機產生的密碼進行該問題求解,按2則是隨用戶自己輸入的密碼進行該問題求解,按3則是退出系統;</p><p>  2. 選定了進行方式后,輸入該問題所涉及的總人數,如果用戶按了1,則隨機產生密碼,用戶

32、則只再需要輸入第一個人要報的數即可,如果用戶按了2,則是用戶自己手動輸入密碼,輸入完了所有人的密碼后,之后再輸入第一個人要報的數;</p><p>  3. 隨著程序的運行,結果就會隨之出來,隨后進入下一次該問題求解進程,直到用戶自己選擇退出該程序,該程序才會結束。</p><p><b>  參考文獻</b></p><p>  [1] 嚴蔚

33、敏,吳偉民.數據結構[M].北京:清華大學出版社,2007.</p><p>  [2] 張長海,陳娟.C程序設計[M].北京:高等教育出版社,2004. </p><p>  [3] 譚浩強.C程序設計[M].北京:清華大學出版社,2005.</p><p>  [4] 《數據結構》(用面向對象方法與C++描述),殷人昆等,清華大學出版社。</p>

34、<p>  [5] 《算法與數據結構習題精解和實驗指導》,寧正元等,清華大學出版社。</p><p>  [6] 張乃孝,裘宗燕.數據結構C++與面向對象的途徑.北京:高等教育出版社,1998</p><p>  [7] 周云靜.數據結構習題解析與上機指導.北京:冶金工業(yè)出版社,2004</p><p>  [8] 陳慧南.數據結構—C++語言描述.北京:

35、人民郵電出版社,2005</p><p>  [9] 嚴蔚敏,吳偉民.數據結構.北京:清華大學出版社,1997</p><p>  附 錄(關鍵部分程序清單)</p><p><b>  程序代碼</b></p><p>  #include<stdio.h></p><p>  

36、#include<stdlib.h></p><p>  struct list </p><p><b>  { </b></p><p>  int num,code; </p><p>  struct list *next; </p><p><b>  }; <

37、;/b></p><p>  int main() </p><p><b>  { </b></p><p>  void random();</p><p>  void solid();</p><p><b>  int p;</b></p>&l

38、t;p>  printf("*************************歡迎進入約瑟夫環(huán)問題求解系統*************************\n \n");</p><p>  printf("1.按照系統隨機給出的密碼進行 2.按照自己輸入的密碼進行 3.退出該系統\n\n");</p><p>  printf(&q

39、uot;********************請輸入您要實現的功能模塊所在的數字選項!********************\n\n");</p><p>  while(scanf("%d",&p)!=EOF)</p><p><b>  {</b></p><p><b>  if(p==

40、1)</b></p><p><b>  random();</b></p><p>  else if(p==2)</p><p><b>  solid();</b></p><p><b>  else</b></p><p><

41、b>  exit(0);</b></p><p>  printf("*************************歡迎進入約瑟夫環(huán)問題求解系統*************************\n \n");</p><p>  printf("1.按照系統隨機給出的密碼進行 2.按照自己輸入的密碼進行 3.退出該系統\n\n&

42、quot;);</p><p>  printf("********************請輸入您要實現的功能模塊所在的數字選項!********************\n\n");</p><p><b>  }</b></p><p><b>  return 0;</b></p>

43、<p><b>  }</b></p><p>  void random()</p><p><b>  {</b></p><p>  int i,j,m=1;</p><p>  int key; // 密碼.</p><p>  int n; //人數 .

44、</p><p>  list *p,*s,*head;</p><p>  head=(list *)malloc(sizeof(list)); //為頭結點分配空間.</p><p><b>  p=head; </b></p><p>  printf("輸入人的總個數:\n"); </p

45、><p>  scanf("%d",&n); </p><p>  for(i=1;i<=n;i++) </p><p>  { key=rand()%100;</p><p>  printf("第%d個人的密碼:%d\n",i,key); </p><p><

46、;b>  s=p; </b></p><p>  p=(list *)malloc(sizeof(list)); //創(chuàng)建新的結點.</p><p>  s->next=p; </p><p>  p->num=i; </p><p>  p->code=key; </p><p>

47、<b>  } </b></p><p>  p->next=head->next; </p><p><b>  p=head; </b></p><p>  head=head->next; </p><p>  free(p); //釋放頭結點.</p><

48、;p><b>  p=head;</b></p><p><b>  do{ </b></p><p>  printf("\n第%d號成員的密碼為:%d",p->num,p->code); //輸出鏈表.</p><p>  p=p->next; </p><

49、;p>  }while(p!=head); </p><p>  printf("\n\n輸入第一個報的數:\n"); </p><p>  scanf("%d",&key);</p><p>  printf("\n出列順序為:\n"); </p><p><

50、b>  do </b></p><p>  { j=1; p=head;</p><p>  while(j<key) { </p><p><b>  s=p; </b></p><p>  p=p->next; </p><p><b>  j++;

51、 </b></p><p><b>  } //報數過程.</b></p><p>  i=p->num; </p><p>  key=p->code; </p><p>  printf("%d:第%d號成員出列\(zhòng)n",m,i); </p><p>

52、;<b>  m++; </b></p><p>  s->next=p->next; </p><p>  head=p->next; //重新定義head,下次循環(huán)的開始結點.</p><p>  free(p);// 釋放已出列的結點. </p><p>  n--; //人數減一.</p&

53、gt;<p>  }while(n>0);</p><p><b>  }</b></p><p>  void solid()</p><p><b>  {</b></p><p>  int i,j,m=1;</p><p>  int key; /

54、/ 密碼.</p><p>  int n; //人數 .</p><p>  list *p,*s,*head;</p><p>  head=(list *)malloc(sizeof(list)); //為頭結點分配空間.</p><p><b>  p=head; </b></p><p>

55、;  printf("輸入人的總個數:\n"); </p><p>  scanf("%d",&n); </p><p>  printf("請輸入密碼:");</p><p>  for(i=1;i<=n;i++) </p><p>  { scanf("%

56、d",&key);</p><p>  printf("第%d個人的密碼:%d\n",i,key);</p><p><b>  s=p; </b></p><p>  p=(list *)malloc(sizeof(list)); //創(chuàng)建新的結點.</p><p>  s->

57、;next=p; </p><p>  p->num=i; </p><p>  p->code=key; </p><p>  printf("請輸入密碼:");</p><p><b>  } </b></p><p>  p->next=head->

58、;next; </p><p><b>  p=head; </b></p><p>  head=head->next; </p><p>  free(p); //釋放頭結點.</p><p><b>  p=head;</b></p><p><b> 

59、 do{ </b></p><p>  printf("\n第%d號成員的密碼為:%d",p->num,p->code); //輸出鏈表.</p><p>  p=p->next; </p><p>  }while(p!=head); </p><p>  printf("\n\n

60、輸入第一個報的數:\n"); </p><p>  scanf("%d",&key);</p><p>  printf("\n出列順序為:\n"); </p><p><b>  do </b></p><p>  { j=1; p=head;</p

61、><p>  while(j<key) { </p><p><b>  s=p; </b></p><p>  p=p->next; </p><p><b>  j++; </b></p><p><b>  } //報數過程.</b><

62、;/p><p>  i=p->num; </p><p>  key=p->code; </p><p>  printf("%d:第%d號成員出列\(zhòng)n",m,i); </p><p><b>  m++;</b></p><p>  s->next=p->

63、;next; </p><p>  head=p->next; //重新定義head,下次循環(huán)的開始結點.</p><p>  free(p);// 釋放已出列的結點. </p><p>  n--; //人數減一.</p><p>  }while(n>0);</p><p><b>  }&l

溫馨提示

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

評論

0/150

提交評論