C程序設計上機課程設計指導書_第1頁
C程序設計上機課程設計指導書_第2頁
C程序設計上機課程設計指導書_第3頁
C程序設計上機課程設計指導書_第4頁
C程序設計上機課程設計指導書_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C程序設計上機課程設計“保衛(wèi)釣魚島”海戰(zhàn)游戲設計運用c語言來描述一種算法是非常方便的,因為c語言提供了非常豐富的運算符。此外,由于c語言的快速、高效這一特點,因此在許多研究領域,許多算法的實現(xiàn)和驗證是采用c語言來進行的。本上機課程設計將實現(xiàn)最佳攻擊目標選擇的坦克游戲設計,來源于游戲設計項目。要求根據(jù)此指導書,改寫為“保衛(wèi)釣魚島”海戰(zhàn)游戲設計。TurboC操作指南:(1)在E盤建立lab文件夾;(2)將turboc2文件夾拷貝到lab文件夾中;(3)運行l(wèi)ab的turboc2文件夾中的TC.exe程序。準備工作這章的程序編寫與前面幾章的有所不同,它是根據(jù)某一個具體研究的算法來進行編程,因此具有一定的科研價值或實用價值。程序須達到該算法的某些特殊要求,如實時性、可擴展性等,在這些方面需要注意體現(xiàn)。另外,根據(jù)算法的當前應用領域,程序須設計一種與之相關的動畫來進行演示。實現(xiàn)規(guī)劃一個算法思想一般都會以一種具體的描述形式來表達,并且都提供了算法的具體步驟或流程,而算法的驗證則有待編程來實現(xiàn)。這一方面限制了編程者的發(fā)揮(因為必須按照算法的步驟來嚴格執(zhí)行),而另一方面也相應地對編程者提出了更高的要求。因此,先要全面了解算法的思想以及它的作用。本程序主要實現(xiàn)一種多目標嫡權決策分析算法。多目標決策分析是指在有多個不同目標時,如何根據(jù)各種條件來選出一個最優(yōu)目標進行鎖定。嫡權決策分析算法就是針對這一問題提出來的,具體的算法內容將在下一節(jié)來詳細介紹。程序實現(xiàn)的預期規(guī)劃如下:.設計適當?shù)臄?shù)據(jù)結構.逐步實現(xiàn)算法的各個步驟,并進行驗證.設計一種動畫演示形式.在動畫中調用算法來演示結果。另外,在程序中還計劃加入輔助文檔,以顯示算法的各個中間步驟?,F(xiàn)在,根據(jù)以上,可以將程序分為以下幾個模塊:算法模塊:用于實現(xiàn)算法,包括算法各個步驟及相關函數(shù)。主模塊:用于顯示動畫,在動畫中調用算法并演示算法結果。輔助模塊:用于顯示算法中間過程的數(shù)據(jù)。將程序代碼分割為幾類源文件先拋開程序的具體內容設計,而來解決一個程序文件分割的問題。這也可以說是本上機課程設計要講到的第一個新的知識點。當一個程序代碼過長時,往往很難進行維護和修改。而且過長的代碼會弄得讀程序的人頭暈腦漲。于是,可以根據(jù)程序劃分的模塊來將代碼分為幾個子文件。一些有經(jīng)驗的程序員建議,盡量把一個大的程序按功能分成多個文件,一個文件盡量不要超作1000行,這樣就可以比較清楚哪個文件的代碼是健壯的,而哪個文件有可能有隱患,在進行程序調試和修改時便可以有針對性的檢查相應文件代碼。那么,如何進行文件代碼的分割?又如何使之成為一個整體?分割其實很簡單,就是把某一模塊或某一類代碼放到一個文件里,并保存為后綴名為.c或.h的文件。比如,將此程序的算法實現(xiàn)部分的代碼放到一塊,并保存為arithmetic.c,而動畫演示部分的代碼則保存為display.co在此項目中,根據(jù)前面所劃分的幾個模塊,可以將程序分割為以下幾個模塊,依次是main.c:實時運行算法并用動畫演示算法結果。DMFunc.c:算法的各個步驟及與其相關的。display.c:動畫顯示的各相關函數(shù)。help.c:幫助文檔head.h:整個程序所用到的系統(tǒng)頭文件、宏定義、全局變量以及主要函數(shù)申明。在分割完以后,將這些文件最好都放在一個文件夾內,比如。接下來進行各個文件的整合。在整個程序中,仍然只能有一個主函數(shù)main(),在該項目中這個主函數(shù)被放在文件main.c中。那么,假設要想在main.c中調用display.c這個文件中的函數(shù)和變量等,則只要在main.c的頭文件包含部分象包含系統(tǒng)頭文件一般將display.c包含進來便可,如下:/*mian.c*/#include"display.c"這種包含方式可以嵌套,比如在step.c中包含了display.c,而在main.c中又包含了step.c,則在main.c中也可以調用display.c中的函數(shù)和變量。但是要特別注意的是,在一個程序中,一個文件只能被包含一次,比如在step.c中包含了display.c后,在其他文件中如main.c中就不能再來包含display.c了,而只能通過包含step.c來間接包含display.co所以,最好不要出現(xiàn)嵌套包含的情況。這樣就需要將每個文件所實現(xiàn)的功能都分得很明確,一個文件要能實現(xiàn)一個較大較完整的功能。實際上,一個文件只要在主程序中被包含了,在其他被主函數(shù)包含的文件中也可以調用該文件中。但是這里又有一個非常要注意的問題,那就是在主函數(shù)中各文件被包含的次序。假設在主函數(shù)中,各文件是依次如下被包含的:/*main.c*/#include"head.c"#include"display.c"#include"DMFunc.c"#include"help.c"則在文件DMFunct.c和help.c中可以調用display.c,而反過來,文件display.c卻不能調用此二個文件,這是因為文件display.c在此三個文件之前被主函數(shù)包含,而C語言在執(zhí)行時會按照順序依次來執(zhí)行這幾個包含語句,所以如果在display.c中調用位于它以下的那些被包含的文件,則由于程序還沒執(zhí)行那些包含語句,因此會出現(xiàn)錯誤。在此項目中,文件之間是這樣來進行包含的:將整個程序所用到的系統(tǒng)頭文件、宏定義、全局變量以及主要函數(shù)申明保存為一個頭文件head.h,將其余各模塊文件保存為后綴名為.c的文件,將它們都包含在main.c中。而其他文件中則不包含所用到的系統(tǒng)頭文件,彼此間也不互相包含。由于在主文件main.c中最先包含了頭文件head.c,因此其他文件便可調head.c中所申明的各宏定義和變量等,因此這些變量也就相當于全局變量。在整合了以后,如果各文件不是被放在TC的工作目錄e:\lab\turboc2\include文件夾中,會發(fā)現(xiàn)程序仍然不能運行,會出現(xiàn)不能打開這些被包含的分割文件的錯誤。這是因為TC中默認的包含文件的存放目錄為e:\lab\turboc2\include,如果使用包含語句例如#include"help.c",則程序默認情況下會在e:\lab\turboc2\include目錄中來尋找這些被包含的文件。解決的方法有兩種。首先,假設這些文件都被放在d:盤的“tk”文件夾下,則可以在包含語句中添加該文件的絕對路徑。比如要包含文件head.c,則形式如下:#include"d:\tk\head.c"此時要注意路徑千萬不能寫錯,否則如果在寫錯的這個路徑下恰好也保存了該文件名,則程序便會調用這個寫錯的路徑下的該文件了,而這個文件根本不是你原本想要調用的。另一種方法則是為TC添加各種文件的存放目錄。在TC編程環(huán)境下,選擇“Options”菜單下的"Directories”選項,可以看到TC默認的各存放目錄,如圖2.1所示。圖2.1TC默認的文件存放目錄其中各菜單項所代表的文件存放目錄如下:Includedirectories:包含文件(頭文件)的存放目錄Librarydirectories:庫文件的存放目錄Outputdirectories:輸出文件(包括目標文件和可執(zhí)行文件等)的存放目錄,默認為當前目錄TurboCdirectory:TC主目錄則添加一個存放目錄(比如Includedirectories)的方法就是:選中Includedirectories項,按回車鍵,然后在彈出的對話框中添加一個目錄路徑,該目錄路徑與前一目錄路徑之間用分號分隔。如圖7.2所示。

IKtcMl>|nkJ-]□!X||_FileEditRunCompileBOptWons-DebugBveak/watch1Line1Col1InsertnaitIndentTaConpilerDirectoriesLiokerEnvii*onnemtIncludedirectoriesIncludedirectories:C:\TURBOC2\IHCLUDEIncludeDirectoriesC:\TURBOC2\INCLUDE;l>:\JUECE&Pickfilename?Cui^rentp]|Pickfilename?Cui^rentpMessageCAPSNUM|Fl-HeIpF5-ZooinF6-SwitchF7-TraceFB-StepF9-MakeF10-MCAPSNUM圖7.2添加一個包含文件存放目錄若有需要,還可以再添加另一個存放目錄,只要在后面再加上一個目錄名并用分號隔開。由于本程序中只要添加包含文件的存放目錄,因此只要修改這一個選項。然后按回車鍵確定?;氐?Options"菜單下來,選擇"SaveOptions"選項,按回車鍵出現(xiàn)如下一個對話框,如圖7.3。圖7.3保存選項設置此時按回車鍵將出現(xiàn)一個確認對話框,如圖7.4所示。圖7.4確認保存提示框然后根據(jù)提示按“y"鍵,則覆蓋了原來名為TCCONFIG.TC的配置文件,而將新的選項設置進行了保存。這樣,在以后每次進入TC編程環(huán)境時,TC默認的存放包含文件的目錄便有兩個。現(xiàn)在再來編譯執(zhí)行main.c文件,便可運行了。7.2加嫡權的決策分析算法算法介紹首先來了解一下算法的用途和內容。前面已經(jīng)介紹了什么是多目標決策。多目標決策可以廣泛用于各個領域,比如機器人在多目標跟蹤過程中選擇一個最重要的目標進行跟蹤,或軍事上選擇最優(yōu)目標進行攻擊,等。在多目標決策中,往往需要給各個目標賦一個權值來描述這些不同。這些權值既能反映主觀的一面,又能反映客觀的一面,從而能夠區(qū)分各目標被鎖定的先后程度。通常用w表示第i(1-i工2個指標的權重,且滿足:n0MwM1和£Wi=1(2.1)i1本算法主要采用嫡這一定義來確定權重。這里先來介紹一下關于此算法的一些相關定義和計算公式:定義1嫡的權重是指按照嫡的思想,對多目標決策中各個評價指標賦權重,用來表示各指標在決策中相對重要程度的量。定義2在有m個評價指標、n個被評價目標的問題中,有指標判斷矩陣為R=(rj)m>n,那么第i個評價指標的嫡定義為

nHi=-公fijInfiji=1,2;m(2.2)jin式中,fijurj八rj0<rij<1,k^1/lnn(2.3)jik表示決策的不確定程度。因此,得到第i個評價指標的嫡權重計算公式:Wi(2.4)1-HWi(2.4)mm。,,Hi1下面給出算法的步驟。嫡權決策算法是根據(jù)判斷矩陣采用的模型,主要包括以下六個步驟。TOC\o"1-5"\h\z(1)構造指標判斷矩陣R。確定被評價的目標有n個,每個目標的評價方案有m個,那么每個方案的各指標值構成多指標評價矩陣R。R=(rj)mM(i=1,2,…,m;j=1,2,…,n)(2.5)如果各指標值采用不同物理量綱,需要將指標值標準化,以獲得可比的尺度。本程序中假設各指標均已標準化。(2)構造加嫡權的標準化指標矩陣A。按上述公式計算嫡Hi和嫡權值w。a11La1n’“11LWj1m'A=MOM二MOM(2.6)kam1Lamn/四%1LWmrmn)其中L和M分別代表矩陣的行和列中省略的數(shù)據(jù)。(3)找出理想點為TOC\o"1-5"\h\z*,***、TX=(x1,X2,L,Xm)(2.7)式中,xi=max^aij}。(4)計算被評方案到理想點的距離為:,*仁,*~7.dj―(aj-Xi)j=1,2,n,(2.8)(5)計算被評方案與理想點的貼近度:mm__2Tj=1一「(aux*)/"(為*)]ttj=1,2,n,;0£Tj三1(2.9)(6)根據(jù)算出的貼近度Tj對各個評價方案排序(低值為先),當Tj值相等時,則以dj*值加以區(qū)分(低值為先)。7.2.2嫡權決策分析算法的實現(xiàn)先來實現(xiàn)程序的核心一一嫡權決策分析算法。在實現(xiàn)這個算法過程中每實現(xiàn)一步便進行檢驗,看是否符合預期數(shù)據(jù)。這樣便方便對算法的實現(xiàn)過程進行檢驗,使之能先著手建立起一個正確無誤的算法,而不需要考慮其他如界面和動畫等方面的事情。.數(shù)據(jù)結構的設計標準指標判斷的構成依賴于實際情況中的各種條件,在沒有確定一種具體的實際應用環(huán)境之前,可以先假設程序已經(jīng)獲得了各個目標的標準化了的指標數(shù)據(jù)構成的標準指標矩陣,而具體如何獲得指標矩陣將在以后的動畫演示中來實現(xiàn)。因此實際上算法的實現(xiàn)只需從第三步開始。為了方便程序設計,需要設計以下的一些數(shù)據(jù)結構:TOC\o"1-5"\h\z/*在文件head.c中定義*//*宏定義*/#definemMax10/*---最大矩陣行值---*/#definenMax10/*---最大矩B$列值---*//*全局變量*/intm,n;/*---指標判斷矩陣的行列值*/intbest,second;/*最優(yōu)和次優(yōu)方案的數(shù)組下標索引*/floatf[mMax][nMax],H[nMax],Omiga[nMax];/*---f[mMax][nMax]存放公式(2.3)的4因子,H[nMax]存放每個指標的嫡,Omiga[nMax]存放每個指標的嫡權----*/floatr[mMax][nMax];/*指標判斷矩陣*/floatA[mMax][nMax];/*加嫡權的標準化指標矩陣*/floatX[nMax];/*理想點*//*目標屬性*/structTarget{intID;/*---目標標識符,用以識別該目標的唯一編號----*/intx,y;/*---目標坐標----*/floatd;/*---方案距離----*/intdIndex;/*---方案距離在各方案的距離中排序后的索引號----*/floatT;/*—方案貼近度—*/intTIndex;/*---方案貼近度在各方案的距離中排序后的索引號----*/intpIndex;/*---方案按貼近度和距離排序后的序號----*/};TOC\o"1-5"\h\zstructTargetTank[nMax];/*---定義存放目標結構的數(shù)組---*/.算法函數(shù)的申明與實現(xiàn)現(xiàn)在可利用以上數(shù)據(jù)結構來實現(xiàn)與算法相關的各個函數(shù)了。下面是各相關函數(shù)的申明:/*在文件head.c中申明*/floatSigama(floata[],intL);/*求和*/floatfindMax(floata[],intL);/*尋找最大值*/floatfindMin(floata[],intL);/*尋找最小值*/voidTaxis(structTargetTank[],intpNum);/*排序----*//*算法步驟函數(shù)*/voidFormMatrix();/*構造初始指標判斷矩陣*/voidFormEntropyMatrix();/*構造加嫡權的標準化指標矩陣A*/voidFindPerfectPoint();/*找出理想點X[m]*/voidCalDistance();/*計算被評方案到理想點的距離Tank[j].d*/voidCalCloseDegree();/*計算被評方案與理想點的貼近度Tank[j].T*/voidFindBestT();/*根據(jù)貼近度和距離排序,找出最優(yōu)目標*/voidArithmetic();/*依次調用算法六個步驟*/voidShowBest();/*顯示最優(yōu)目標*/然后在文件DMFunc.c中來實現(xiàn)各函數(shù),如下:/*求和*/floatSigama(floata[],intL){*//*------求得數(shù)組a□中從下標0到L-1的元素之和。函數(shù)返回該和值----*/inti;floattemp=0;for(i=0;i<L;i++)temp+=a[i];returntemp;}/*求最大值*/floatfindMax(floata[],intL){/*求得數(shù)組a□中從下標0到L-1各元素的最大值。函數(shù)返回該最大值*/inti;floattemp;for(i=0;i<L-1;i++)/*冒泡排序一輪將各元素的最大值交換到a[L-1]中*/if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}returna[L-1];/*----返回最大值----*/}/*求最小值*/floatfindMin(floata[],intL)inti;floattemp;for(i=0;i<L-1;i++)/*--冒泡排序一輪將各元素的最大值交換到a[L-1]中---*/if(a[i]<a[i+1])(temp=a[i];a[i]=a[i+1];a[i+1]=temp;}returna[L-1];}/*對各個方案的貼近度和距離進行排序*/voidTaxis(structTargetTank[],intpNum)(/*----在定義的結構structTarget中定義了指示當前方案的貼近度和距離在各個方案中按大小排序所得到的序號TIndex和dIndex。此函數(shù)將各方案的TIndex和dIndex分別進行排序,得到其相應的排序號----*/inti,j;for(i=0;i<pNum;i++)/*從第一個開始,將第i個和第i+1個進行比較,若i的距離(或貼近度)大,*/for(j=i+1;j<pNum;j++)/*則i的距離序號(或貼近度序號)加1,否則,i+1的距離序號(或貼近度序號)加1---*/(if(Target[i].d>Target[j].d)Target[i].dIndex++;elseTarget[j].dIndex++;if(Target[i].T>Target[j].T)Target[i].TIndex++;elseTarget[j].TIndex++;}}TOC\o"1-5"\h\z/*——第一步:構造初始指標判斷矩陣*/voidFormMatrix()(/*暫不實現(xiàn),而在實現(xiàn)了動畫之后再來構造*/}/*第二步:構造加嫡權的標準化指標矩陣A*/voidFormEntropyMatrix()

inti,j;floattemp=0,k;k=1/log(n);for(i=0;i<m;i++)(for(j=0;j<n;j++)(if(Sigama(&r[i][0],n)==0)f[i][j]=0;f[i][j]=r[i][j]/Sigama(&r[i][0],n);temp+=f[i][j]*log(f[i][j]);}H[i]=0-k*temp;temp=0;}for(i=0;i<m;i++)Omiga[i]=(1-H[i])/(m-Sigama(&H[0],m));for(i=0;i<m;i++)for(j=0;j<n;j++)A[i][j]=Omiga[i]*r[i][j];}/*第三步:找出理想點X[m]*/voidFindPerfectPoint()(floata[mMax][nMax];inti,j;for(i=0;i<m;i++)for(j=0;j<n;j++)a[i][j]=A[i][j];for(i=0;i<m;i++)X[i]=findMax(&a[i][0],n);*/}*//*-----第四步:計算被評方案到理想點的距離Tank[j].dvoidCalDistance()(inti,j;floatsigama=0;for(j=0;j<n;j++)(for(i=0;i<m;i++)sigama+=(A[i][j]-X[i])*(A[i][j]-X[i]);Tank[j].d=sqrt(sigama);sigama=0;}}/*-----第五步:計算被評方案與理想點的貼近度Tank[j].T*/voidCalCloseDegree(){inti,j;floatsigama1=0,sigama2=0;for(j=0;j<n;j++){for(i=0;i<m;i++){sigama1+=A[i][j]*X[i];sigama2+=X[i]*X[i];}Tank[j].T=1-sigama1/sigama2;sigama1=0;sigama2=0;}}*//*第六步:根據(jù)貼近度和距離排序,找出最優(yōu)目標——*/voidFindBestT(){inti,j,best_flag,second_flag;structTargettemp;best=0;for(i=0;i<n;i++){Tank[i].dIndex=Tank[i].TIndex=1;Tank[i].pIndex=1;}Taxis(&Tank[0],n);/*將貼近度和距離排序*/for(i=0;i<n;i++)/*---按貼近度將各方案進行排序*/{for(j=i+1;j<n;j++){if(Tank[i].TIndex>Tank[j].TIndex){Tank[i].pIndex++;elseif(Tank[i].TIndex==Tank[j].TIndex)/*若貼近度相同則比較距離*/if(Tank[i].dIndex>Tank[j].dIndex)(Tank[i].pIndex++;)elseTank[j].pIndex++;elseif(Tank[i].TIndex<Tank[j].TIndex)Tank[j].pIndex++;))for(i=0;i<n;i++)(if(Tank[i].pIndex==1)(best=i;/*找出最優(yōu)方案,獲得其方案序號*/best_flag=1;break;)))/*調用算法各步驟找到最優(yōu)目標*/voidArithmetic。(if(n==1)/*如果只剩最后一個目標,則直接規(guī)定最優(yōu)目標為第一個*/(best=0;return;)FormMatrix();FormEntropyMatrix();FindPerfectPoint();CalDistance();CalCloseDegree();FindBestT();)/*顯示最優(yōu)方案和次優(yōu)方案*/voidShowBest()(inti,j,x=14-2*n,y=5;clrscr();gotoxy(12,2);printf("Findthe1st-selectedandthe2nd-selectedProject");for(i=0;i<65;i++){gotoxy(x+i,y);putch(0xC4);gotoxy(x+i,y+2);putch(0xC4);gotoxy(x+i,y+10);putch(0xC4);}gotoxy(x,y+1);printf("Project");gotoxy(x,y+3);printf("Distance");gotoxy(x,y+5);printf("Taxisbyd");gotoxy(x,y+7);printf("Close_Extent");gotoxy(x,y+9);printf("TaxisbyT");for(j=0;j<n;j++){gotoxy(x+15+8*j,y+1);printf("Proj%d”,j+1);gotoxy(x+15+8*j,y+3);printf("%.2f",Tank[j].d);gotoxy(x+15+8*j,y+5);printf("%d",Tank[j].dIndex);gotoxy(x+15+8*j,y+7);printf("%.4f",Tank[j].T);gotoxy(x+15+8*j,y+9);printf("%d",Tank[j].TIndex);}for(i=1;i<10;i++){gotoxy(x+14,y+i);putch(0xB3);}gotoxy(x,y+11);putch(0x10);printf("Thefirst-selectedProjectisProject%d.",best+1);gotoxy(x+1,y+12);printf("TargetID:%d",Tank[best].ID);gotoxy(x,y+13);putch(0x10);printf("Thesecond-selectedProjectisProject%d.",second+1);gotoxy(x+1,y+14f);printf("TargetID:%d",Tank[second].ID);}.編寫簡單的測試程序實

溫馨提示

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

評論

0/150

提交評論