c語言課程設計-約瑟夫問題_第1頁
c語言課程設計-約瑟夫問題_第2頁
c語言課程設計-約瑟夫問題_第3頁
c語言課程設計-約瑟夫問題_第4頁
c語言課程設計-約瑟夫問題_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、約瑟夫問題一目的通過課程設計,加深對C語言程序設計課程所學知識的理解,熟練掌握和鞏 固c語言的基本知識和語法規(guī)范,包扌舌:數(shù)據(jù)類型(整形、實型、字符型、指針、數(shù) 組、結(jié)構等);運算類型(算術運算、邏輯運算、自增自減運算、賦值運算等);程序 結(jié)構(順序結(jié)構、判斷選擇結(jié)構、循環(huán)結(jié)構);庫函數(shù)應用(時間函數(shù)、繪圖函數(shù)以及 文件的讀寫操作函數(shù)等):復雜任務功能分解方法(自頂向下逐步求精、模塊化設計、 信息隱藏等)。學會編制結(jié)構清晰、風格良好、數(shù)據(jù)結(jié)構適當?shù)腃語言程序,從而具備利用計算 機編程分析解決綜合性實際問題的初步能力。二需求分析1、約瑟夫問題的算法設計使用鏈表構成一個環(huán)形鏈。結(jié)構中有三個成員,其

2、一為指向下一個人的指針,以 構成壞形的鏈;其二為該人是否被仍卞海的標記,為0表示還在船上。其三為數(shù)字(130)從第一個人開始對尚未仍下海的人進行計數(shù),每數(shù)到9時,將結(jié)構中的標記改 為1,表示該人已被仍下海了。這樣循環(huán)計數(shù)直到15個人被扔下海時為止。數(shù)據(jù)可以 由用戶輸入。2、功能要求與簡要說明使用菜單操作,提示用戶相應的操作;有一定的輔助功能,例:注冊,密碼驗 證,在屏幕上查看保存到文件中的結(jié)果。用戶輸入的數(shù)據(jù)及結(jié)果保存到outfile.txt文件中(或自建文件)。三概要設計1、可滿足輸入與輸出的形式與限制本程序現(xiàn)只支持英文,只是字符輸入、輸出及整數(shù),本程序可以要求第一次使用 該程序的用戶在開始

3、游戲前必須進行簡單的輸入信息(姓名字符形式)及由用戶自己設 定的密碼,該信息將保存到名為imnia.dat (屬于密文)文件中,卞次該用戶進入游戲 時,將可直接輸入信息(姓名及對應密碼)可進入游戲(約瑟夫問題),游戲中用戶輸入的有效信息及對應的結(jié)果將保存到名為outfile.txt的文件中,用戶可查詢游戲結(jié)呆, 可在操作界面查看從outfile.txt文件中輸出到屏幕的結(jié)果。運行時,機器會給用戶提示,并輸出到屏幕上來提示用戶操作,若用戶輸入格式 不正確,程序會做出判斷,使用戶重新輸入,在密碼注冊與驗證部分(要求用戶輸入字 符在010之內(nèi)),用戶輸錯就會退出:在游戲部分,用戶自測時(數(shù)字限制在1

4、00個 數(shù)之內(nèi)),若超出范圍,將會提示用戶重新輸入。其他地方的輸入相似,都有此類功 能。方便用戶。2、所達到的功能及測試計劃所實現(xiàn)的功能有用戶初次進入要求注冊;進入游戲前要密碼信息(對使用有了限 制):約瑟夫問題游戲由用戶自己設定船上人總數(shù)(例:30最優(yōu)為偶數(shù),若為奇數(shù)則 扔下船的人數(shù)為(n-1) /2, 11為總?cè)藬?shù)),及所數(shù)的號碼(例:9),用戶可直接在操 作界面來檢查以前游戲的結(jié)果(用戶未刪除的情況);outfUe.txt為追加式寫入,用戶在 操作界面可刪除文件中的內(nèi)容,方便使用。1.游戲的輔助功能:用戶注冊后可通過輸入 密碼進入游戲,用戶也可不注冊進入游戲,但略有不同的是注冊的用戶游戲

5、中,游戲結(jié) 果保存到文件中時會加上用戶的注冊名,方便了用戶的結(jié)果查看,但為了滿足使用的方 便也可直接進入游戲。還有在操作界面查看結(jié)呆和刪除結(jié)果的作用。2.約瑟夫游戲中的 功能:用戶可在操作界面自己創(chuàng)建文件;進入游戲用戶可按自己的意愿,確定人數(shù)和號 碼;用戶還可自測(輸入下海人的號碼),程序判斷并打分或者直接運行出結(jié)果;根據(jù) 用戶自己的要求來結(jié)束或繼續(xù)。3.退出游戲:用戶可在菜單處直接來退出游戲,或者在 子操作結(jié)束后,不回到菜單,直接退出。最后關于程序的測試,可以多次測試,并且根 據(jù)實際情況和用戶使用的方便角度來測試,在運行正常并能一定程度的容錯,在進一步 優(yōu)化。3、所用數(shù)據(jù)類型的定義及含義此程

6、序運用了整形、實型、字符型、指針、數(shù)組、結(jié)構體。下面是全局(舉例): struct maniiit num;mt state;struct man *next;;/*結(jié)構體數(shù)據(jù),用來連接鏈表*/stmct personchai naine20; char niuna5;FILE *fpfile;嚴結(jié)構體數(shù)據(jù),用來信息注冊*/嚴指向文件的指針勺chai-tempname20tempimma5=n; /*數(shù)組,用來進入游戲保存用戶輸入數(shù)據(jù)的*/ 下面是局部的(舉例):mt1=0;/*整型,用來接受用戶數(shù)據(jù)和函數(shù)中使用*/char c=0,cl,c2;/*字符型字符變量*/charUser100;/

7、*字符型數(shù)組,用于保存輸入的下海人號碼*/4、各模塊的劃分下面是總體流程(簡化圖):5、各程序模塊功能1. 注冊信息密碼模塊:用于輸入用戶自己的名稱(字符型),保存到(mima.dat)中。2. 輸入密碼,進入游戲模塊:輸入密碼,程序判斷,若在文件(mima.dat屬于密文,在輸入 到文件中的信息經(jīng)過了程序加密)有記錄即可進入游戲(3.中介紹游戲模塊)。3.約瑟夫游 戲模塊:用戶先確定寫入的文件;輸入人數(shù)及號碼;若進行自測,用戶自行輸入卜海人的號 碼,程序會判斷對錯。若不自測就直接程序算出結(jié)果。4.在屏幕上顯示結(jié)果模塊:先確定文 件;再把此文件中的結(jié)果輸出到屏幕上。5.刪除文件(默認文件out

8、file.txt)中的全部內(nèi)容。6、各函數(shù)之間的調(diào)用關系主函數(shù)中是菜單的打印(mypnntO函數(shù))和switch各模塊套用與調(diào)用關系如 F: main()函數(shù)中調(diào) 用 mypnnt();myyuesefu();zhuceQ; nunia();myread();mydelete();int myopen();numaQ;*1調(diào)用 myyuesefuQ;o mvyuesefuQ;中調(diào)用 mt myopenQ; mt lmk(stmct nian *head,int n);。myread()沖調(diào)用intmyopenQ;函數(shù)。Main()函數(shù)把這些函數(shù)聯(lián)系到 一起,各函數(shù)有自己的局部變量,總的有全局變

9、量,在多個函數(shù)調(diào)用時則聯(lián)系到一起, 構成完整的程序。!1!詳細設計1、流程圖2.主要程序的源代碼(部分)及注釋1、約瑟夫問題代碼:(是本程序的主要代碼,部分代碼)void mvyuesefu()iiit mm1=0;FILE *fpl;char c=0,cl,c2 , User100;struct nian *h,*p.*s;/*用于定義結(jié)構體類型的指針*/doclisciQ;/*清除屏幕*/h=creat();/*用于返回一個結(jié)構體型的指針賦給11*/pnntfOpen outfile.txt (1)OR zi jiaii wen jlaii:(2):nchoose:n); c=getche

10、Q;if(c=T)/*自動打開默認的outfile.txt文件,在D盤下,可改*/fp 1 =fopen(HD:outfile.txtH/,air);嚴用于打開文件“a”為追加(直接在上次結(jié)果后寫入)7為寫入每次打開上次結(jié)果將清空,路徑雙 (注意)*/elsefpl=myopen();嚴用于用戶自己建立文件,默認保存到D盤下*7/*函數(shù)打開文件返回指向文件的指針*/fpriiitf(fp 1sR 亡 suit is:tempname);priiitf(n,diPlease Input the number of people:sc3nf(”cT;&n);17*003 Please Input

11、the numbe rof people :ii%dn,ii) ;/*寫入文件函數(shù)格式(控制寫入)*/if(luik(h.n)!=l)/*link(h,n)構造鏈表 */piiiitf(HKong jian not enough !iiH);/*空間不足的話返回值不為 1*/s=h;p=(struct man*)nialloc(sizeof(sti-uct man);p-next=s;/*額外再分配出一個,即n+1個,但這一個不使用*/printHmput a number.when dao zlie ge shu shi xia haisc3nf(”d;&m);/input a number

12、,when dao zlie ge shu slii xia hai :n%d,m);printf(MUser sure check useiself (User zi ji su m shu ju pan duaii ):nplease choose (Y /N ): S);c2=getchQ;if(c2y|c2=rY,)printf(H 11GAME BEGIN !User mput the answer byself Game:iiH);fpriiitf(fp 1 /*iiUser input the answer byself Game:iiM);pnntf(MPlease mput

13、tlie nuinber (zi ce shu ju de ge shu ):1T); scanfC%d”,&k);wliile(k= 100|k=0)pnntffWRONG! OVER the (0-100),mput agam:iiH);scanfC%d”,&k);fpiiiitf(fpl Please input the number (zi ce shu ju de ge shu ):%dprintfTlease mput xia hai ien numbei:iiH);fpiiiitf(fpl Please input xia hai ren number/1);foi(i=0;ik

14、;i+)scanfC%d”,&Usei:i);fpiiiitf(fp 1 J%df;Usi);1=0;for(j=0j(ii/2)J+)/* 解釋在下面 */*解釋在下面*/piiiitf(,ttRight answer:nxia iniaii shi xia hai de ren (ing gai an pai huai ren): 1T); fprmtf(fpl/iixia niian shi xia hai de ren (mg gai ail pai huai ren ): 1T);foi(j=0J(ii/2)J+)嚴雙層for循環(huán),外層用來循環(huán)(n/2)次,即仍下(ii/2)個人,*

15、/fbr(i=0;inext; if(p-state=l)i-;/*當是p-state=l時為已經(jīng)扔下的人*/*這時就執(zhí)行1-;則跳過該人*/*當數(shù)到m例:9為一次循壞,且一次指向下一個結(jié)點*/*每數(shù)到m例:9時,輸出所對數(shù)據(jù),則為卞海的人,*/fbr(i=O;inext;if(p state=l)i-;fbi(i=O;inum) /*用戶輸入值與答案的比較*/1+;嚴用于記憶相同的個數(shù),即答對個數(shù)p-state=l;piintfpnYoiiT light is:t%2.1fl,(l/(double)k)*100);fprmtftfpl/XiiYour is:t%2. lfnH J,(l/(d

16、ouble)k)* 100);answer number ist%d tyour scorelight answer number ist%d tyour scorefprmtf(fp 1 /dVtpnum);/*p-state=l;llt句為已丟下海的人標記為L下次if(pstate=l)時,i- */p-state=l;getchQ;/*則就是不再包含已經(jīng)丟下海的人可fputs(-irfpl); prmtf(niiwaiit to contmue Game:(y/n):n); cl=getch();fclose(fpl);wlule(cl=y|cl=,Y,); 卜面是上述函數(shù)的引用函數(shù):

17、stmct man *creat()嚴用于關閉文件,只有關閉文件后才會對數(shù)據(jù)保存*/*判斷是不是繼續(xù)游戲(循環(huán))*/嚴用于返回頭指針(結(jié)構體指針)*/stiuct man *head;head=(struct nian*)nialloc(sizeof(struct man); /*分配空間*/嚴初始化勺嚴返回此結(jié)構體指針值可head-next=NULL; head-num=l; head-state=O; return (head);mt luik(stiuct man *head.iiit n)嚴用于連接鏈表的函數(shù)結(jié)點(n個)的函數(shù),返回值為整型,head為全局變量引struct nian

18、*p,*s;iiit i;p=head;fbr(i=l;inext=s;p=s;/*依次首尾相連*/p-num=i+l;/* 賦值,依次加 1*/p-state=O;/*分別記為0 ,變?yōu)?時即下海*/p-next=liead;return 1;/*若成功返回1則分配空間成功*/2、密碼文件的密文操作(以及讀取時解碼程序)foi(i=0;istiieii(temp.niuna);i+)/*用于在儲存信息時加密,使信息變?yōu)槊芪?/J=0;ifj =strlen(temp. name)J=0;temp, niima i=temp.iniina 1 + j+;for(i=0 ;is

19、ulen(temp. mima) ;i+)/*提取用戶的信息后進行解碼*/J=0;ifj=strlen()尸o;temp. numai=temp. numa 1 - j+;這是防止打開文件就能查看到用戶的密碼信息,進行了加密,使文件內(nèi)容成為密 文,這個加密安全性并不高,但現(xiàn)在能力有限還不能做的更好,但有一定的加密作用。五調(diào)試分析1、程序問題解決及優(yōu)化設計該問題的方法是對一系列值進行賦值,再把扔下的人做記號,用到 了結(jié)構體,另一做記號,此題開始想用數(shù)組,但數(shù)組分配特定的空間,浪費內(nèi)存空間, 從而使用鏈表,根據(jù)用戶需要來分配空間,這樣既節(jié)省了空間,而且也增大了程

20、序的可 行性。對于用戶輸入的值一開始沒有進行容錯設置,由于程序的限制,輸入的數(shù)值或字 符在長度上有限制,沒有進行容錯,就時程序運行錯誤,或是結(jié)果出錯(正常運行), 誤導用戶。在編寫的過程中還是出現(xiàn)編寫的低級錯誤,這是由于對知識的不牢固,和操作的 不熟練導致的錯誤,在來連接編譯時發(fā)現(xiàn)。對于鏈表的使用不熟練,這次只是把鏈表代替了數(shù)組,但算法沒有改變,用鏈表 還可以通過刪除結(jié)點的操作,再將刪除的結(jié)點連接到一起,組成兩個鏈表,就是分別是 下海的和在船上的人教徒。則可以添加更多的功能使游戲更有趣,但現(xiàn)在對鏈表結(jié)點的 刪除與連接不熟練,暫時還未使用。我會把鏈表進一步熟悉,從而熟練使用。經(jīng)過解決錯誤和對程序

21、的一定程度的優(yōu)化,在提示下正確操作,程序可正確運 行。六測試結(jié)果1測試結(jié)果結(jié)果運行正確:(截屏如下)例子:1、總?cè)?0,數(shù)到9,自測4個數(shù)據(jù)9 19 26 5保存到outfile.txto運行正確。Open outf ile. txt (DOR zi j ian wen j ian: (2):choose: 1圖 |Please Input the number of people:30inpu t a number, wlien (lao zhe ge shu shi xia hai :9User sure check uscrself ( User zi ji su ru shu ju p

22、an duan ): please choose (Y /N ):GAME BEGIN ?User input the answer byself Game: Please input the number (zi co shu ju de go shu ): 4Please input xia hoi ren number:9 19 26 5your score is:100 0Vour right answer number is2、總?cè)?0,數(shù)到9,直接計算出正確結(jié)果,保存到自建文件zp.txt中。運 行結(jié)果正確。Open outfile.txt (1)OR zi jian wen ji

23、an:(2):choose:2Please in put the file of nane (e.x: outfilel.txt):zp.txtPlease Input the number of people:30input a number,when dao zhe ge shu shi xia hai :9bUser sure check user self ( User zi ji su ru shu ju pan duan ): please choose (V /N ):文件(可編輯(P梧式(O)童看(V)箱助(H)Result is:LPlease Input the numbe

24、r of people:30.input a number, when dao zhe ge shu shi 9User input the answer byself Game: Please input the number (zi ce shu juPlease input xia hai ren number:9Your right answer number is 4haa14 6 )2 huseS91edyour score is5100. 0七用戶使用說明1、運行環(huán)境及用戶操作說明1、源代碼可在TC等編譯器下連接編譯運行,約瑟夫.exe運行環(huán)境要求低。 下面是菜單頁面:Right answer:xianian shi xia hai de ren 1ing gai an pai huai ren ):18276162671930122&822523wantto continue Game:(y/n):3、保存到文件中的內(nèi)容,也無誤。OUTF

溫馨提示

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

評論

0/150

提交評論