約瑟夫環(huán) 實驗報告_第1頁
約瑟夫環(huán) 實驗報告_第2頁
約瑟夫環(huán) 實驗報告_第3頁
約瑟夫環(huán) 實驗報告_第4頁
約瑟夫環(huán) 實驗報告_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

程序設(shè)計課程設(shè)計報告

項目名稱:約瑟夫環(huán)學(xué)生姓名:學(xué)號:班級:計科1111班指導(dǎo)老師:日期:2013年1月3號

1、項目描述約瑟夫問題主要是n個人圍坐成一個圈,然后分別給每個參與者編一個號,再定義一個循環(huán)數(shù),由玩家自定義起始報數(shù)者,當游戲開始時,報數(shù)為循環(huán)數(shù)的人被踢出,其他人繼續(xù)。此設(shè)計就是通過一位數(shù)組、一維結(jié)構(gòu)體數(shù)組與循環(huán)鏈表來實現(xiàn)這些功能的。2、項目的需求分析在軟件工程中,需求分析指的是在建立一個新的或改變一個現(xiàn)存的系統(tǒng)或產(chǎn)品時,確定新系統(tǒng)的目的、范圍、定義和功能時所要做的所有工作。需求分析是軟件工程中的一個關(guān)鍵過程。在這個過程中,系統(tǒng)分析員和軟件工程師確定顧客的需要。只有在確定了這些需要后他們才能夠分析和尋求新系統(tǒng)的解決方法。需求按層次分為用戶需求和系統(tǒng)需求:用戶需求是用自然語言加圖的形式給出的、關(guān)于系統(tǒng)需要提供哪些服務(wù)以及系統(tǒng)操作受到哪些約束的聲明;系統(tǒng)需求詳細地給出系統(tǒng)將要提供的服務(wù)以及系統(tǒng)所受到的約束,系統(tǒng)需求文檔有時也稱為功能描述,應(yīng)該是精確的,它可能成為系統(tǒng)買方和軟件開發(fā)者之間合同的重要內(nèi)容。軟件系統(tǒng)需求常常分為功能需求和非功能需求:功能需求包括對系統(tǒng)應(yīng)該提供的服務(wù)、如何對特殊輸入做出反應(yīng),以及系統(tǒng)在特定條件下的行為的描述,在某些情況下,功能需求可能還需聲明系統(tǒng)不應(yīng)該做什么;非功能需求是對系統(tǒng)提供的服務(wù)或功能的約束,包括時間約束、開發(fā)過程的約束和所受到的標準的約束,非功能需求經(jīng)常適用于整個系統(tǒng)而不是個別的系統(tǒng)功能或服務(wù),例如性能,可靠性,安全性和可用性等。非功能需求通常會比個別的功能需求更加關(guān)鍵,它會影響整個系統(tǒng)的體系結(jié)構(gòu),而不是個別的組件。例如,為了保證系統(tǒng)的性能需求,就必須合理組織系統(tǒng)使得組件之間的通信量達到最小。圖SEQ圖\*ARABIC1需求獲取和分析的產(chǎn)品2.1、界面需求 MicrosoftVisualC++6.0軟件里面實現(xiàn)代碼操作,MicrosoftOfficeWord20032.2、輸入輸出要求 才用C++中的輸入輸出函數(shù),即cin與cout,而在C中用printf即可。2.3、功能需求 (1)采用一維數(shù)組解決約瑟夫問題; (2)采用一維結(jié)構(gòu)體數(shù)組解決約瑟夫問題;2.4、程序的結(jié)構(gòu)要求 要包含以下函數(shù): 主函數(shù):main(); 一維數(shù)組:a[i] 一維結(jié)構(gòu)體數(shù)組:structNode{ boolflag;//1為未出列0為已列出}; 約瑟夫問題的實現(xiàn):voidJosephus(Node*p,intn,intm)//n為總?cè)藬?shù),m為報數(shù)上限輸出函數(shù): 3、項目設(shè)計軟件設(shè)計在軟件工程過程中處于技術(shù)核心,并且它的應(yīng)用與所使用的軟件過程模型無關(guān)。一旦對軟件需求進行分析和建模,軟件設(shè)計就開始了。軟件設(shè)計是建模活動的最后一個軟件工程活動,接著便要進入構(gòu)造階段(代碼生成和測試)。在軟件系統(tǒng)設(shè)計的過程中,開發(fā)者定義項目的設(shè)計目標,將系統(tǒng)分解為更小的子系統(tǒng),這些子系統(tǒng)可以由各個團隊分別實現(xiàn),開發(fā)者還要選擇構(gòu)建系統(tǒng)的策略,比如硬件/軟件策略、持久性數(shù)據(jù)管理策略、全局控制流、訪問控制策略、邊界條件處理等。系統(tǒng)設(shè)計后得到的是一個包括子系統(tǒng)分解和每個策略都清晰描述的模型。系統(tǒng)設(shè)計是與算法無關(guān)的,它由一些活動組成,每一個活動都專注于分解系統(tǒng)整個問題中的某一部分:標識設(shè)計目標。開發(fā)者標識并區(qū)分應(yīng)進行優(yōu)化的各種系統(tǒng)特征的優(yōu)先順序。設(shè)計初始子系統(tǒng)分解。根據(jù)用例和分析模型將系統(tǒng)分解成一些小部分,在此活動中,開發(fā)者將采用標準的體系結(jié)構(gòu)風(fēng)格(分層體系結(jié)構(gòu),容器體系結(jié)構(gòu),客戶機-服務(wù)器體系結(jié)構(gòu),管道和過濾器體系結(jié)構(gòu))作為起始點。求精子系統(tǒng)分解以應(yīng)對設(shè)計目標。初始的分解大都不滿足所有的設(shè)計目標,必須不斷分解和求精,直到所有的設(shè)計目標都滿足了。主函數(shù)main()主函數(shù)main()一維數(shù)組Yiweishuzu()以為結(jié)構(gòu)體數(shù)組Yiweijiegoutishuzu()選擇界面一維數(shù)組Yiweishuzu()以為結(jié)構(gòu)體數(shù)組Yiweijiegoutishuzu()選擇界面約瑟夫環(huán)問題的實現(xiàn)約瑟夫環(huán)問題的實現(xiàn)約瑟夫環(huán)問題的實現(xiàn)約瑟夫環(huán)問題的實現(xiàn)輸出函數(shù)輸出函數(shù)輸出函數(shù)輸出函數(shù)3.2、程序結(jié)構(gòu)設(shè)計 (1)一位數(shù)組:定義兩個變量(游戲總?cè)藬?shù)n,游戲循環(huán)數(shù)m),利用兩個for()循環(huán),第一個控制總次數(shù),第二個控制報數(shù),當報到數(shù)值m時,輸出對應(yīng)的游戲者的編號; (2)一維結(jié)構(gòu)體數(shù)組:定義一個一維結(jié)構(gòu)體數(shù)組,組內(nèi)為游戲者的編號n,其余與(1)同,在使用num編號時,由結(jié)構(gòu)體名調(diào)用。3.3、數(shù)據(jù)結(jié)構(gòu)及類型設(shè)計 一維結(jié)構(gòu)體數(shù)組,一位數(shù)組3.4、功能模塊設(shè)計 (1)一位數(shù)組函數(shù):輸入游戲總?cè)藬?shù)及游戲循環(huán)數(shù),利用for()和while()循環(huán)實現(xiàn)游戲者的踢出; (2)一維結(jié)構(gòu)體數(shù)組:輸入游戲總?cè)藬?shù)及游戲循環(huán)數(shù)利用兩個for()循環(huán)實現(xiàn)游戲者的踢出;4、測試用例設(shè)計軟件工程中的測試用例是一組條件或\o"變量"變量(輸入數(shù)據(jù)和期望結(jié)果的集合),測試者根據(jù)它來確定\o"應(yīng)用軟件"應(yīng)用軟件或\o"軟件系統(tǒng)"軟件系統(tǒng)是否正確工作。測試用例是通過實驗達到引起構(gòu)件失效和發(fā)現(xiàn)構(gòu)件故障的目的。確定軟件程序或系統(tǒng)是否通過測試的方法叫做\o"測試準則"測試準則。一個測試用例有5個屬性:名稱、可執(zhí)行的路徑全稱、輸入數(shù)據(jù)、測試預(yù)言(期望的測試結(jié)果與輸出結(jié)果的比較)和日志(測試產(chǎn)生的輸出)。4.1、輸入/輸出測試用例4.2、函數(shù)功能測試用例 一位數(shù)組:項目/軟件約瑟夫游戲版本MicrosoftVisualC++6.0作者功能模塊名利用一維數(shù)組實現(xiàn)游戲要求用例編號Em0001修改歷史編制時間2013.01.03功能特性將參與游戲者逐個踢出去測試目的檢驗代碼是否可以實現(xiàn)以上功能預(yù)置條件測試數(shù)據(jù)總?cè)藬?shù)可自定義(如8),循環(huán)數(shù):可自定義(比如5)操作描述建立一個動態(tài)數(shù)組,將總?cè)藬?shù)存儲進去,然后利用for()循環(huán)將每次游戲報數(shù)為5輸出期望結(jié)果輸出的順序為5、2、8、7、1、4、6實際結(jié)果測試人員開發(fā)人員測試日期2013.01.03一維結(jié)構(gòu)體數(shù)組:項目/軟件約瑟夫游戲版本MicrosoftVisualC++6.0作者功能模塊名用一維結(jié)構(gòu)體數(shù)組實現(xiàn)約瑟夫游戲要求用例編號Em0001編制人修改歷史編制時間2013.01.03功能特性利用一維結(jié)構(gòu)體數(shù)組實現(xiàn)約瑟夫問題的輸入輸出測試目的查看程序是否正確預(yù)置條件建立一個一維結(jié)構(gòu)體測試數(shù)據(jù)總?cè)藬?shù):可以自己輸入,游戲循環(huán)數(shù):自己輸入操作描述期望結(jié)果輸出順序為5、2、8、7、1、4、6、3實際結(jié)果測試人員開發(fā)人員測試日期2013.01.03關(guān)鍵代碼設(shè)計創(chuàng)建動態(tài)數(shù)組并計算過程: Node*a=newNode[n]; intk=n,count=0,max=m; for(inti=0;i<n;i++) { a[i].flag=1; //先把沒有報數(shù)的人標記為1 } for(i=0;;i=(i+1)%n) { if(a[i].flag==1) { count++; //如果這個人是有標記的話,計數(shù)++,表示的是被標記的總?cè)藬?shù),即所有的玩家人數(shù) } if(count==max) //當報數(shù)達到我們所需的最大報數(shù)max時,輸出 { cout<<i+1<<""; count=0; //同時計數(shù)清零 k--; //這時候需要處理的人數(shù)就會少一個 a[i].flag=0; //把它標記為已經(jīng)報數(shù) } if(k==0) //需要處理的人數(shù)為1時就跳出循環(huán) { cout<<endl; cout<<"Thewinneris:"<<i+1<<endl; break; } }}以及一維數(shù)組中的計算及其動態(tài)數(shù)組的建立:int*a=newint[n]; for(inti=0;i<n;i++) { a[i]=i+1;//給每個小孩編號 } printf("Thestartnumberis:"); for(i=0;i<n;i++) { printf("%d\n",a[i]); intk=1; //表示處理第K個離開的小孩 inti=-1; //數(shù)組下標(因為第一個下標是0) printf("Theleaveorderis:"); while(1) { for(intj=0;j<m;) { i=(i+1)%n;//數(shù)組的下標 if(a[i]!=0)//判斷人是不是還在圈中 { j++;//因為數(shù)到interval的時候,會歸為0,如果在是0的地方J也加1的話,,則會導(dǎo)致數(shù)數(shù)不正確 } } if(k==n)//看是否為最后一個小孩 { break; } printf("%d,",a[i]); a[i]=0; //已經(jīng)出圈的歸為0 k++; //處理第k+1個小孩 } break; } printf("\n"); for(i=0;i<n;i++) { if(a[i]!=0) { printf("Thewinneris:%d\n",a[i]);//輸出最終留下的 } } 5.1、總控程序關(guān)鍵代碼一維數(shù)組:程序的結(jié)構(gòu):主函數(shù)中處理#include<iostream>usingnamespacestd;inti;voidmain(){ intnum=0; intinterval;D: printf("Pleaseinputthetotalnumber:"); scanf("%d",&num); if(num<=0) { printf("Error!pleaseinputagain!"); getchar(); gotoD; } H: printf("Pleseainputthestopnumber:"); scanf("%d",&interval); if(interval<=0) { printf("Error!pleaseinputagain!"); getchar(); gotoH; } int*a=newint[num]; for(i=0;i<num;i++) { a[i]=i+1;//給每個小孩編號 } printf("Thestartnumberis:"); for(i=0;i<num;i++) { printf("%d\n",a[i]); intk=1; //表示處理第K個離開的小孩 inti=-1; //數(shù)組下標(因為第一個下標是0) printf("Theleaveorderis:"); while(1) { for(intj=0;j<interval;) { i=(i+1)%num;//數(shù)組的下標 if(a[i]!=0)//判斷人是不是還在圈中 { j++;//因為數(shù)到interval的時候,會歸為0,如果在是0的地方J也加1的話,,則會導(dǎo)致數(shù)數(shù)不正確 } } if(k==num)//看是否為最后一個小孩 { break; } printf("%d,",a[i]); a[i]=0; //已經(jīng)出圈的歸為0 k++; //處理第k+1個小孩 } break; } printf("\n"); for(i=0;i<num;i++) { if(a[i]!=0) { printf("Thewinneris:%d\n",a[i]);//輸出最終留下的 } }}}一維結(jié)構(gòu)體:程序的結(jié)構(gòu):#include<iostream>usingnamespacestd;structNode{ boolflag; //標記每個數(shù)數(shù)的人,1為未出列0為已出列};voidmain(){ intn;//總?cè)藬?shù) intm;//數(shù)到就要出列的D: printf("Pleaseinputthetotalnumber:"); scanf("%d",&n); if(n<=0) { printf("Error!pleaseinputagain!"); getchar(); gotoD; } H: printf("Pleseainputthestopnumber:"); scanf("%d",&m); if(m<=0) { printf("Error!pleaseinputagain!"); getchar(); gotoH; } Node*a=newNode[n]; intk=n,count=0,max=m; for(inti=0;i<n;i++) { a[i].flag=1; //先把沒有報數(shù)的人標記為1 } for(i=0;;i=(i+1)%n) { if(a[i].flag==1) { count++; //如果這個人是有標記的話,計數(shù)++,表示的是被標記的總?cè)藬?shù),即所有的玩家人數(shù) } if(count==max) //當報數(shù)達到我們所需的最大報數(shù)max時,輸出 { cout<<i+1<<""; count=0; //同時計數(shù)清零 k--; //這時候需要處理的人數(shù)就會少一個 a[i].flag=0; //把它標記為已經(jīng)報數(shù) } if(k==0) //需要處理的人數(shù)為1時就跳出循環(huán) { cout<<endl; cout<<"Thewinneris:"<<i+1<<endl; break; } }}}6、程序調(diào)試與測試測試活動技術(shù)主要包括:構(gòu)件檢查、可用性測試、單元測試、集成測試和系統(tǒng)測試。構(gòu)件檢查是通過對源代碼的手工檢查發(fā)現(xiàn)單個構(gòu)件中的故障。可用性測試用于找出現(xiàn)實系統(tǒng)做了什么和用戶所期望系統(tǒng)應(yīng)該做什么之間的差異。單元測試通過使用測試樁程序和測試驅(qū)動程序來隔離單個構(gòu)件的方法以發(fā)現(xiàn)故障,也可以通過對一個構(gòu)件執(zhí)行測試用例來完成這個功能。集成測試通過集成多個構(gòu)件來查找故障。系統(tǒng)測試狐妖關(guān)注整個系統(tǒng)、系統(tǒng)的功能和非功能需求以及目標環(huán)境等。6.1、用例1測試結(jié)果6.2、用例2測試結(jié)果7、總結(jié) 約瑟夫問題理解起來很容易,但在寫代碼時,總是會不知道從哪里開始下手,每次開始著手寫的時候都只是寫個開頭,總是在寫后來核心的計算部分時候?qū)懼鴮懼蜁X得哪里不對勁,然后又重新開始寫,浪費了很多時間。后來程序?qū)懗鰜硪院笳{(diào)試好久,總是會在輸出的部分會出差錯,后來用了程序中不常用的goto語句才實現(xiàn)的。而且由于對核心部分的理解不是很透徹,所以在檢驗結(jié)果的時候,一個不小心輸出時,被提出者就會要么往前一位,要么退后一位,得不到正確結(jié)果。有了寫數(shù)組時候的經(jīng)驗寫以為結(jié)構(gòu)體數(shù)組的時候稍微輕松點,但是由于忘記了之前學(xué)習(xí)過的結(jié)構(gòu)體,所以在寫程序的時候結(jié)構(gòu)體中究竟存什么也很讓人費解,因為約瑟夫問題所需的變量完全可以不用結(jié)構(gòu)體。所以在這個問題上花費了大量的時間,后來經(jīng)過和同學(xué)的討論才確定下來的,用一個標記來作為結(jié)構(gòu)體中所存的變量,這樣在計算的時候不僅更加方便而且也解決了問題。通過這次的項目,我不僅復(fù)習(xí)了以前學(xué)習(xí)的知識,同時也了解到了很多寫程序的方法。對于不同變量的處理方法,以及用不同的解題思路去解決同一個問題。自己在以后的學(xué)習(xí)中也可以運用到這次項目當中所學(xué)到的技巧和知識。8、附件:項目程序代碼一維數(shù)組:程序的結(jié)構(gòu):主函數(shù)中處理#include<iostream>usingnamespacestd;inti;voidmain(){ intnum=0; intinterval;D: printf("Pleaseinputthetotalnumber:"); scanf("%d",&num); if(num<=0) { printf("Error!pleaseinputagain!"); getchar(); gotoD; } H: printf("Pleseainputthestopnumber:"); scanf("%d",&interval); if(interval<=0) { printf("Error!pleaseinputagain!"); getchar(); gotoH; } int*a=newint[num]; for(i=0;i<num;i++) { a[i]=i+1;//給每個小孩編號 } printf("Thestartnumberis:"); for(i=0;i<num;i++) { printf("%d\n",a[i]); intk=1; //表示處理第K個離開的小孩 inti=-1; //數(shù)組下標(因為第一個下標是0) printf("Theleaveorderis:"); while(1) { for(intj=0;j<interval;) { i=(i+1)%num;//數(shù)組的下標 if(a[i]!=0)//判斷人是不是還在圈中 { j++;//因為數(shù)到interval的時候,會歸為0,如果在是0的地方J也加1的話,,則會導(dǎo)致數(shù)數(shù)不正確 } } if(k==num)//看是否為最后一個小孩 { break; } printf("%d,",a[i]); a[i]=0; //已經(jīng)出圈的歸為0 k++; //處理第k+1個小孩 } break; } printf("\n"); for(i=0;i<num;i++) { if(a[i]!=0) { printf("Thewinneris:%d\n",a[i]);//輸出最終留下的 } }}}一維結(jié)構(gòu)體:程序的結(jié)構(gòu)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論