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

下載本文檔

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

文檔簡介

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

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

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

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

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

6、例):struct man int num; int state; struct man *next; ; /*結(jié)構(gòu)體數(shù)據(jù),用來連接鏈表*/ struct person char name20; char mima5; /*結(jié)構(gòu)體數(shù)據(jù),用來信息注冊*/FILE *fpfile; /*指向文件的指針*/char tempname20="",tempmima5="" /*數(shù)組,用來進(jìn)入游戲保存用戶輸入數(shù)據(jù)的*/下面是局部的(舉例):int m,n,i,j,k, l=0; /*整型,用來接受用戶數(shù)據(jù)和函數(shù)中使用*/ char c=0,c1,c2; /*字符型字

7、符變量*/ char User100; /*字符型數(shù)組,用于保存輸入的下海人號碼*/4、各模塊的劃分下面是總體流程(簡化圖):約瑟夫程序各模塊刪除 文件直接進(jìn)入游戲輸入密碼進(jìn)入游戲輸入名 讀結(jié)果注冊信息outfile.txt文件自建文件用戶自測正確結(jié)果退出游戲約瑟夫游戲5、各程序模塊功能1.注冊信息密碼模塊:用于輸入用戶自己的名稱(字符型),保存到(mima.dat)中。2.輸入密碼,進(jìn)入游戲模塊:輸入密碼,程序判斷,若在文件(mima.dat屬于密文,在輸入到文件中的信息經(jīng)過了程序加密)有記錄即可進(jìn)入游戲(3.中介紹游戲模塊)。 3.約瑟夫游戲模塊:用戶先確定寫入的文件;輸入人數(shù)及號碼;若進(jìn)

8、行自測,用戶自行輸入下海人的號碼,程序會判斷對錯。若不自測就直接程序算出結(jié)果。4.在屏幕上顯示結(jié)果模塊:先確定文件;再把此文件中的結(jié)果輸出到屏幕上。5.刪除文件(默認(rèn)文件outfile.txt)中的全部內(nèi)容。6、各函數(shù)之間的調(diào)用關(guān)系主函數(shù)中是菜單的打?。╩yprint()函數(shù))和switch(),各模塊套用與調(diào)用關(guān)系如下:main()函數(shù)中調(diào) 用myprint();myyuesefu();zhuce(); mima();myread();mydelete();int myopen();mima();中調(diào)用myyuesefu();。myyuesefu();中調(diào)用int myopen(); int

9、 link(struct man *head,int n);。myread();中調(diào)用int myopen();函數(shù)。Main()函數(shù)把這些函數(shù)聯(lián)系到一起,各函數(shù)有自己的局部變量,總的有全局變量,在多個函數(shù)調(diào)用時則聯(lián)系到一起,構(gòu)成完整的程序。四 詳細(xì)設(shè)計1、流程圖開始結(jié)束菜單輸入(05)switch();判斷注冊zhuce();密碼mima()(包含游戲)游戲myyusefu();讀文件myread();刪除文件內(nèi)容mydelete();繼續(xù)(y|n)退出if( )判斷sure:(y|n)if( )判斷真(y)真(y)假 (n)214503假(n)主結(jié)構(gòu):2、主要程序的源代碼(部分)及注釋1、

10、約瑟夫問題代碼:(是本程序的主要代碼,部分代碼)void myyuesefu() int m,n,i,j,k, l=0; FILE *fp1; char c=0,c1,c2 ,User100; struct man *h,*p,*s; /*用于定義結(jié)構(gòu)體類型的指針*/ do clrscr(); /*清除屏幕*/ h=creat(); /*用于返回一個結(jié)構(gòu)體型的指針賦給h*/printf("Open outfile.txt (1)OR zi jian wen jian:(2):nchoose:");c=getche(); if(c='1') /*自動打開默認(rèn)的

11、outfile.txt文件,在D盤下,可改*/fp1=fopen("D:outfile.txt","a"); /*用于打開文件“a”為追加(直接在上次結(jié)果后寫入)“w”為寫入每次打開上次結(jié)果將清空,路徑雙(注意)*/ else fp1=myopen(); /*用于用戶自己建立文件,默認(rèn)保存到D 盤下*/ /*函數(shù)打開文件返回指向文件的指針*/ fprintf(fp1,"%s'Result is:",tempname); printf("nPlease Input the number of people: n&quo

12、t;); scanf("%d",&n); fprintf(fp1,"n003 Please Input the numbe rof people :n%dn",n) ; /*寫入文件函數(shù)格式(控制寫入)*/ if(link(h,n)!=1) /*link(h,n)構(gòu)造鏈表*/ printf("Kong jian not enough !n"); /*空間不足的話返回值不為1*/ s=h; p=(struct man*)malloc(sizeof(struct man); p->next=s; /*額外再分配出一個,即n+

13、1個,但這一個不使用*/ printf("input a number,when dao zhe ge shu shi xia hai :n"); scanf("%d",&m); fprintf(fp1,"input a number,when dao zhe ge shu shi xia hai :n%d",m) ;printf("User sure check userself ( User zi ji su ru shu ju pan duan ):nplease choose (Y /N ): n"

14、); c2=getch(); if(c2='y'|c2='Y') printf(" nGAME BEGIN !User input the answer byself Game:n"); fprintf(fp1,"nUser input the answer byself Game:n"); printf("Please input the number (zi ce shu ju de ge shu ):n"); scanf("%d",&k); while(k>=10

15、0|k<=0) printf("WRONG! OVER the (0100),input again:n"); scanf("%d",&k); fprintf(fp1,"Please input the number (zi ce shu ju de ge shu ):%dn",k); printf("Please input xia hai ren number:n"); fprintf(fp1,"Please input xia hai ren number:"); for(i

16、=0;i<k;i+) scanf("%d",&Useri); fprintf(fp1,"%dt",Useri); l=0; for(j=0;j<(n/2);j+) /*解釋在下面*/ /*解釋在下面*/ for(i=0;i<m;i+) /*解釋在下面*/ p=p->next; if(p->state=1) i-; for(i=0;i<k;i+) /*解釋在下面*/ if(Useri=p->num) /*用戶輸入值與答案的比較*/ l+; /*用于記憶相同的個數(shù),即答對個數(shù)*/ p->state=1;

17、 printf("nYour right answer number ist%d tyour score is:t%2.1f",l,(l/(double)k)*100); fprintf(fp1,"nYour right answer number ist%d tyour score is:t%2.1fn",l,(l/(double)k)*100); else printf("ttRight answer:nxia mian shi xia hai de ren ( ing gai an pai huai ren ): n"); fp

18、rintf(fp1,"nxia mian shi xia hai de ren ( ing gai an pai huai ren ): n") ; for(j=0;j<(n/2);j+) /*雙層for循環(huán),外層用來循環(huán)(n/2)次,即仍下(n/2)個人,*/ for(i=0;i<m;i+) /*內(nèi)層循環(huán)是數(shù)到指定的號碼例:9時來退出循環(huán),從而輸出的數(shù)據(jù)*/ /*是被扔下人的號碼*/ p=p->next; if(p->state=1) /*當(dāng)是p->state=1時為已經(jīng)扔下的人*/ i-; /*這時就執(zhí)行 i-;則跳過該人 */ /*當(dāng)數(shù)到

19、m 例:9 為一次循環(huán),且一次指向下一個結(jié)點(diǎn)*/ printf("%dt",p->num); /*每數(shù)到m例:9時,輸出所對數(shù)據(jù),則為下海的人,*/ fprintf(fp1,"%dt",p->num) ; /*p->state=1;此句為已丟下海的人標(biāo)記為1,下次if(p->state=1) 時,i- */ p->state=1; /*則就是不再包含已經(jīng)丟下海的人*/ getch(); fputs("n",fp1); printf("nwant to continue Game:(y/n):&q

20、uot;); c1=getch(); fclose(fp1); /*用于關(guān)閉文件,只有關(guān)閉文件后才會對數(shù)據(jù)保存*/ while(c1='y'|c1='Y'); /*判斷是不是繼續(xù)游戲(循環(huán)) */ 下面是上述函數(shù)的引用函數(shù):struct man *creat() /*用于返回頭指針(結(jié)構(gòu)體指針)*/ struct man *head; head=(struct man*)malloc(sizeof(struct man); /*分配空間*/ head->next=NULL; head->num=1; head->state=0; /*初始化*/

21、 return (head); /*返回此結(jié)構(gòu)體指針值*/ int link(struct man *head,int n) /*用于連接鏈表的函數(shù)結(jié)點(diǎn)(n個)的函數(shù),返回值為整型,head為全局變量*/ struct man *p,*s; int i; p=head; for(i=1;i<n;i+) s=(struct man*)malloc(sizeof(struct man); /*分配內(nèi)存空間*/ p->next=s; p=s; /*依次首尾相連 */ p->num=i+1; /* 賦值,依次加1*/ p->state=0; /*分別記為0 ,變?yōu)?時即下海*/

22、 p->next=head; return 1; /*若成功返回1則分配空間成功*/ 2、密碼文件的密文操作(以及讀取時解碼程序) for(i=0;i<strlen(temp.mima);i+) /*用于在儲存信息時加密,使信息變?yōu)槊芪?/ j=0; if(j=strlen() j=0; temp.mimai=temp.mimai+j+; for(i=0;i<strlen(temp.mima);i+) /*提取用戶的信息后進(jìn)行解碼*/ j=0; if(j=strlen() j=0; temp.mimai=j+;這是防止打開文件就能查看到用戶的密碼信息,進(jìn)行了加密,使文件內(nèi)容成為密文,這個加密安全性并不高,但現(xiàn)在能力有限還不能做的更好,但有一定的加密作用。五 調(diào)試分析1、程序問題解決及優(yōu)化設(shè)計該問題的方法是對一系列值進(jìn)行賦值(1n),再把扔下的人做記號,用到了結(jié)構(gòu)體,另一做記號,此題開始想用數(shù)組,但數(shù)組分配特定的空間,浪費(fèi)內(nèi)存空間,從而使用鏈表,根據(jù)用戶需要來分配空間,這樣既節(jié)省了空間,而且也增大了程序的可行性。對于用戶輸入的值一開始

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論