2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  C++程序設(shè)計課程設(shè)計報告</p><p>  選題名稱: 幻方 </p><p>  系(院): 計算機工程學(xué)院</p><p>  專 業(yè): 計算機科學(xué)與技術(shù) </p><p>  班 級:

2、 </p><p>  姓 名: 學(xué) 號: </p><p>  指導(dǎo)教師: </p><p>  學(xué)年學(xué)期: 2010 ~ 2011 學(xué)年 第 1 學(xué)期</p><p>  2010年

3、 12 月 30 日</p><p><b>  設(shè)計任務(wù)書</b></p><p><b>  摘要:</b></p><p>  所謂幻方,就是一個n行n列的正方形,共有n2個格子,將1、2、3、……、n2這些數(shù)字放到這些格子里,使其每行的和、每列的和及兩條對角線的和都是一個相同的數(shù)S,S稱為幻和。當(dāng)n為

4、奇數(shù)時,稱為奇數(shù)階幻方,當(dāng)n為偶數(shù)時,稱為偶階幻方。當(dāng)n可被4整除時,稱方為雙偶幻方。當(dāng)n不可被4整除時,稱為單偶幻方。多少年來,許多數(shù)學(xué)家都在研究這個古老而有趣的問題,試圖找出一般的解法,但一般都是針對當(dāng)n是奇數(shù)和n是4的倍數(shù)的情況。當(dāng)n是奇數(shù)時的算法:首先,將1放在第一行中間一個格子里。其次,依次將后一個數(shù)放到前一個數(shù)的右上格,如:將2放到1的右上格。將3放到2的右上格等等??赡艹霈F(xiàn)下面的情況。①若右上格從上面超出,則將后一數(shù)放到與

5、右上格同列的最后一行。②若右上格從右面超出,則將后一數(shù)放到與右上格同行的最后一列。③若右上格既從右面超出又從上面超出,則將后一數(shù)放到一數(shù)前一數(shù)的下面前一數(shù)的下面。④若右上格已被數(shù)字填充,則將后一數(shù)放到前一數(shù)的下面依以上法則,你可以很快的寫出奇數(shù)階幻方!當(dāng)然,這種寫法只是其中一個答案,而不是唯一答案。</p><p>  關(guān)鍵字:奇數(shù)幻方;單偶數(shù)幻方;雙偶數(shù)幻方;循環(huán);類的對象;</p><p&

6、gt;<b>  目 錄</b></p><p><b>  1課題綜述4</b></p><p><b>  1.1課題來源4</b></p><p><b>  1.2預(yù)期目標(biāo)5</b></p><p>  1.3面對的問題5</p&g

7、t;<p>  1.4需解決的關(guān)鍵技術(shù)5</p><p><b>  2系統(tǒng)分析6</b></p><p>  2.1涉及的基礎(chǔ)知識6</p><p>  2.1.1頭文件6</p><p>  2.1.2類與對象6</p><p><b>  2.1.4數(shù)組7

8、</b></p><p>  2.1.5開關(guān)語句7</p><p>  2.2解決問題的基本思路及總體方案8</p><p>  2.3算法描述及功能模塊框圖8</p><p>  2.3.1奇數(shù)階幻方(連續(xù)擺數(shù)法)8</p><p>  2.3.2雙偶幻方(對稱幻方)9</p>&

9、lt;p>  2.3.3單偶幻方(斯特雷奇法)11</p><p>  2.3.4 LUX方法 這是劍橋大學(xué)康韋教授發(fā)明的方法12</p><p><b>  3系統(tǒng)設(shè)計13</b></p><p>  3.1實現(xiàn)方法13</p><p>  3.1.1奇數(shù)階幻方制作(連續(xù)擺數(shù)法)13</p>

10、;<p>  3.1.2雙偶幻方制作(對稱法)13</p><p>  3.1.3單偶幻方制作(斯特雷奇法)13</p><p>  3.2 流程圖14</p><p>  3.2.1主函數(shù)14</p><p>  3.2.2奇數(shù)階幻方15</p><p>  4 代碼編寫與注釋15</

11、p><p><b>  5程序調(diào)試21</b></p><p><b>  6運行與測試21</b></p><p><b>  總 結(jié)25</b></p><p><b>  致 謝26</b></p><p>&

12、lt;b>  參考文 獻27</b></p><p><b>  1課題綜述</b></p><p><b>  1.1課題來源</b></p><p>  幻方又稱為魔方,方陣或廳平方,它最早起源于我國。宋代數(shù)學(xué)家楊輝稱之為縱橫圖。</p><p>  所謂縱橫圖,它是由1到n

13、²,這n²個自然數(shù)按照一琿的規(guī)律排列成n行、n列的一個方陣。它具有一種廳妙的性質(zhì),在各種幾何形狀的表上排列適當(dāng)?shù)臄?shù)字,如果對這些數(shù)字進行簡單的邏輯運算時,不論采取哪一條路線,最后得到的和都是完全相同的。</p><p>  關(guān)于幻方的起源,我國有“河圖”和“洛書”之說。相傳在遠(yuǎn)古時期,伏羲氏取得天下,把國家治理得井井有條,感動了上天,于是黃河中躍出一匹龍馬,背上馱著一張圖,作為禮物獻給他,這就

14、是“河圖”,伏羲氏憑借著“河圖”而演繹出了八卦,后來大禹治水時,咯水中浮出一只大烏龜,它的背上有圖有字,人們稱之為“洛書”?!奥鍟彼嫷膱D中共有黑、白圓圈45個。把這些連在一起的小圓和數(shù)目表示出來,得到九個。這九個數(shù)就可以組成一個縱橫圖,人們把由九個數(shù)3行3列的幻方稱為3階幻方,除此之外,還有4階、5階... 后來,人們經(jīng)過研究,得出計算任意階數(shù)幻方的各行、各列、各條對角線上所有數(shù)的和的公式為:N=1/2n(n^2+1)其中n為幻方的

15、階數(shù),所求的數(shù)為N幻方最早記載于我國公元前500年的春秋時期《大戴禮》中,這說明我國人民早在2500年前就已經(jīng)知道了幻方的排列規(guī)律。</p><p>  我國不僅擁用幻方的發(fā)明權(quán),而且是對幻方進行深入研究的國家。公元13世紀(jì)的數(shù)學(xué)家楊輝已經(jīng)編制出3-10階幻方,記載在他1275年寫的《續(xù)古摘廳算法》一書中。在歐洲,直到574年,德國著名畫家丟功繪制出了完整的4階幻方。</p><p>  

16、如今幻方已應(yīng)用于科學(xué)技術(shù)之中。如在“建路”、“爵當(dāng)曲線”、“七座橋”中的運用。幻方引出了拉普拉斯的導(dǎo)引系數(shù)和哥斯定理、格里定理、斯篤克 定理,還引出了普生、布魯汀兩氏的電子方程式?;梅竭€引出了桑南的自動控制論,從而促 成了電子計算機的誕生,電腦有三個來源,即二進制(八卦)、算盤和幻方。</p><p>  可見,幻方知識在我國很早就有,它的應(yīng)用前景也相當(dāng)廣闊,通過電腦知識將幻</p><p&g

17、t;  方付諸實踐,也是時代的需要。通過對這一課題的學(xué)習(xí)與研究,對我們拓寬知識面與實踐能力的培養(yǎng)具有重要意義。</p><p><b>  1.2預(yù)期目標(biāo)</b></p><p><b>  圖1-1所示</b></p><p><b>  1.3面對的問題</b></p><p&

18、gt;  幻方是一個古老而又有趣的數(shù)學(xué)問題,要想解決它,首先要了解它的數(shù)學(xué)原理,然后用C++語言把它表示出來。我遇到的兩個主要問題,也就隨即產(chǎn)生了。一是幻方復(fù)雜的數(shù)學(xué)原理;二是對C++語言的不熟悉。我接觸C++語言只有短暫的一學(xué)期,對它的了解還是很膚淺的,而且我也是第一次接觸課程設(shè)計這種作業(yè),這就要求我要花費大量的時間和精力去完成它?;梅街谱鞣椒ㄓ性S多種,選取哪種制作方法才能使它簡單而又準(zhǔn)確地表示出來?幻方制作不單單是針對某一階幻方而言

19、;更要求我們尋求一種方法將抽象的理論轉(zhuǎn)化為可操控的現(xiàn)實。</p><p>  1.4需解決的關(guān)鍵技術(shù)</p><p>  對奇數(shù)階幻方制作的連續(xù)擺數(shù)法在C++語言中,要做到對所有情形描述的不重不漏,需要很高思維嚴(yán)密性。而在適用于雙偶幻方解法的對稱法的程序代碼編寫時,如何識別課程設(shè)計書上所描述的白格子及黃格子,可以通過對數(shù)組元素初值來解決。為了解決避免一些不必要的代碼重復(fù)編寫的問題,我們可以

20、使用函數(shù),通過對函數(shù)的調(diào)用可以很好的解決這一問題。但在一些問題上,函數(shù)調(diào)用可能會受阻,如本課題中用斯特雷奇法制作單偶數(shù)幻方時,在數(shù)據(jù)傳遞方面不得不放棄二維數(shù)組作為參數(shù)的方法,而采用一維數(shù)組來代替,這樣更增加了對各數(shù)組元素下標(biāo)的深刻認(rèn)識的重要性,需要保持清醒的頭腦。在整個程序代碼中,類和對象的思想從始至終,所以我們必須對類和對象的思想有著清晰地認(rèn)識。</p><p><b>  2系統(tǒng)分析</b&g

21、t;</p><p>  2.1涉及的基礎(chǔ)知識</p><p><b>  2.1.1頭文件</b></p><p>  一般的輸入輸出需要包含<iostream.h>,當(dāng)用到setw()時需要包含<iomanip.h>。</p><p><b>  2.1.2類與對象</b>

22、;</p><p>  類定義的一般格式為:</p><p>  Class 類名 {</p><p>  << <<private:>></p><p><b>  成員表 1;>></b></p><p><b>  <<p

23、ublic:</b></p><p><b>  成員表 2 ;>></b></p><p>  <<protected:</p><p><b>  成員表3; >></b></p><p>  其中,“class類名”稱為類頭;“{}”中的部分稱為

24、類體,類體中定義了類成員表。成員包括數(shù)據(jù)成員和函數(shù)成員。 </p><p>  通常情況下,在類中只對成員函數(shù)做一個聲明,而函數(shù)定義通常在類定義的外部進行,其格式如下:</p><p>  返回值類型 類名::函數(shù)名(參數(shù)表){}</p><p>  其中,運算符“::”稱為域解析運算符,它指出該函數(shù)是屬于某個類的成員函數(shù)。</p><p>

25、  2.1.3 for( )循環(huán)語句</p><p>  for( )循環(huán)語句的一般格式為:</p><p>  for(<表達式1>;<表達式2>;<表達式3>)S;</p><p>  其中,三個表達式都可以是C++中的任一符合語法規(guī)則的表達式;語句S可以是任一C++的語句。同樣地將語句S稱為for( )的內(nèi)嵌語句,并把稱為循

26、環(huán)體。</p><p>  for( )語句的執(zhí)行過程如下;首先計算“表達式1”(循環(huán)初值),且僅計算一次。每一次循環(huán)之前計算“表達式2”(循環(huán)條件),如果其結(jié)果為真,則執(zhí)行“語句”S,并計算“表達式3”(循環(huán)增量)。否則,循環(huán)終止。</p><p><b>  2.1.4數(shù)組</b></p><p>  數(shù)組是相同類型的若干個元素所組成的有序

27、集合。數(shù)組有一維數(shù)組與多維數(shù)組之分,在程序中一維數(shù)組、二維數(shù)組都有使用。數(shù)組(array)是一種順序容器,,在 C++中多維數(shù)組在內(nèi)存中的排列為按行方式。</p><p>  多維數(shù)組的數(shù)組名代表數(shù)組中第一維(最高維)第一個元素(0號元素)在內(nèi)存中的首地址。當(dāng)數(shù)組作為函數(shù)的參數(shù)進行傳遞時,多維數(shù)組同樣是將其第一維的第一個元素的首地址傳遞給函數(shù)。多維函數(shù)作為參數(shù),最高維可以不寫,但最低維必須明</p>

28、<p>  確標(biāo)出,這就限定了二維數(shù)組的構(gòu)造</p><p>  一維數(shù)組的定義格式為:</p><p>  類型說明符 數(shù)組名[常量表達式1] ;</p><p>  二維數(shù)組的定義格式為:</p><p>  類型說明符 數(shù)組名[常量表達式1] [常量表達式2];</p><p>  “類型說明

29、符“指定數(shù)組元素的類型,“數(shù)組名”的命名規(guī)則與變量一樣,方括號中的“常量表達式1”代表了二維數(shù)組的行數(shù),“常量表達式2”代表了二維數(shù)組的列數(shù)。行列下標(biāo)都是從零開始,其最大下標(biāo)均比常量表達式的值小1。</p><p><b>  2.1.5開關(guān)語句</b></p><p>  開關(guān)語句switch語句,它也稱為多選擇語句。它可以根據(jù)給定的條件,從多個分支語句序列中選擇執(zhí)

30、行一個分支的語句序列。switch語句的一般格式為:</p><p>  switch(表達式)</p><p><b>  { </b></p><p>  case常量表達式1:語句;</p><p>  case常量表達式2:語句;</p><p><b>  …… </

31、b></p><p><b>  ……</b></p><p><b>  ……</b></p><p>  case常量表達式n:語句;</p><p>  default:語句;</p><p><b>  }</b></p>&

32、lt;p>  switch語句的執(zhí)行過程如下:首先計算“表達式”的值,然后,其結(jié)果值依次與每一個常量表達式的值進行匹配。如果匹配成功,則執(zhí)行該常量表達式后的語句系列。 當(dāng)遇到break時,則立即結(jié)束switch語句的執(zhí)行,否則,順序執(zhí)行到花括號的最后一</p><p><b>  條語句。</b></p><p>  default情形是可選的

33、,如果沒有常量表達式的值與“表達式”的值匹配,則執(zhí)行default的語句系列需要注意的是,“表達式”的值的類型必須是字符型或整型。</p><p>  在switch語句中用到了控制執(zhí)行順序的語句:break語句。</p><p>  break語句的一般格式:</p><p><b>  break;</b></p><p

34、>  該語句只能用于switch語句或循環(huán)語句中,其功能是:第一;在switch語句中,結(jié)束開關(guān)語句的執(zhí)行,并把控制轉(zhuǎn)移到該開關(guān)語句之后的第一條語句,且開始執(zhí)行該語句。第二;在循環(huán)語句中的作用是,跳出循環(huán),并執(zhí)行循環(huán)語句后的第一個語句。</p><p>  2.2解決問題的基本思路及總體方案</p><p>  通過構(gòu)造函數(shù),即奇數(shù)階幻方制作函數(shù)、單偶幻方制作函數(shù)、雙偶幻方制作函數(shù)及

35、主函數(shù)。必要時可添加另外的函數(shù)。根據(jù)輸入信息的不同,在主函數(shù)中調(diào)用不同的函數(shù),輸出預(yù)期的結(jié)果。</p><p>  其中奇數(shù)階幻方采用連續(xù)擺數(shù)法制作,雙偶幻方采用對稱法制作,單偶幻方采用斯特雷奇法制作,通過打印函數(shù),將其最后結(jié)果顯示出來。</p><p>  2.3算法描述及功能模塊框圖</p><p>  2.3.1奇數(shù)階幻方(連續(xù)擺數(shù)法)</p>

36、<p>  例:一個5×5 格子,由最上面一行中間一格開始,依次填1,2,3等等。下一個格子填在左上位置。但是要注意兩點:</p><p>  出了幻方的范圍,右邊接到左邊,下邊接到上邊。</p><p>  某一格右上已經(jīng)有了數(shù)字,改填在這個格子的下面一格,然后延續(xù)前面的方法。</p><p><b>  圖2-1所示</b&g

37、t;</p><p>  也不一定按照斜上方寫字,可以走馬步,或其他方法。下面用的是馬步,得到的是泛對角幻方。</p><p>  2.3.2雙偶幻方(對稱幻方)</p><p>  例:以8階幻方為例。</p><p>  第一步:在左上4×4格子中,取一半的格子,要求每行每列都取到2個。 </p><p>

38、;  如圖2-2中陰影格子所示:</p><p>  圖2-2給格子涂上色</p><p>  第二步:按照左右對稱、上下對稱、中心對稱的方法把這8個格子擴充為32個格子。</p><p>  如圖2-3中的陰影格子所示:</p><p>  范區(qū) 圖2-3對稱翻轉(zhuǎn)</p><p>  第三步:從左上角開始,從左到右從

39、上到下,從1開始填數(shù)。不過只填沒有選中的格子(即沒有陰影的格子)。如圖2-4所示:</p><p>  圖2-4為未上色數(shù)賦值</p><p>  第四步:從右下角開始從右到左從下到上再選中的格子里填進剛才沒有填的數(shù)字。如圖2-5所示:</p><p>  圖2-5為上色數(shù)賦值</p><p>  2.3.3單偶幻方(斯特雷奇法)</p

40、><p>  例:設(shè)階數(shù)n=2(2m+1)=6,m=1。</p><p>  第一步:把方陣分為4個小方陣,位置依次為A左上,B右下,C右上,D左下。 </p><p>  用連續(xù)擺數(shù)法,把1-a^2放在A中成第一個幻方;把a^2+1~2a^2放在B中成第二個幻方。把2a^2+1~3a^2放在C中成第三個幻方。把3a^2+1~4a^2放在D中成第四個幻方。 </p

41、><p><b>  圖2-6所示</b></p><p>  第二步:在A的各行左起取m個方格,但中間一行從第二格開始。與D中相應(yīng)位置對換。</p><p><b>  圖2-7為上色賦值</b></p><p>  第三步:在C的各行右起取m-1個方格,與B中相應(yīng)位置對換。此例m-1=0,無需交換。

42、</p><p><b>  圖2-8所示</b></p><p>  2.3.4 LUX方法 這是劍橋大學(xué)康韋教授發(fā)明的方法</p><p>  例:設(shè)階數(shù)n=2(2m+1)=10,m=2。</p><p>  第一步:任取一個2m+1 階幻方,例如5階幻方。如下。</p><p><b

43、>  圖2-9所示</b></p><p>  第二步:在上面的m+1行 (此處為3行)的每個格子里填入一個字母L;接下去一行填字母U,余下m-1 行填字母X。最后把中間的一個L 與它下面的一個U 交換一下。</p><p><b>  圖2-10所示</b></p><p>  第三步:作一個10×10方格,設(shè)想為

44、每2×2為一個單位,每個單位相應(yīng)于上面一個格子。對應(yīng)于5階幻方中數(shù)字1的單位填1,2,3,4。對應(yīng)于5階幻方中數(shù)字2的填5,6,7,8。等等。但是標(biāo)有字母L 的按照“右上-左下-右下-左上”次序;標(biāo)有字母U 的按照“左上-左下-右下-右上”次序;標(biāo)有字母X 的按照“左上-右下-左下-右上”次序。</p><p><b>  圖2-11所示</b></p><p&

45、gt;  當(dāng)然,這個方法也產(chǎn)生很多幻方,并不唯一。</p><p><b>  3系統(tǒng)設(shè)計</b></p><p><b>  3.1實現(xiàn)方法</b></p><p>  3.1.1奇數(shù)階幻方制作(連續(xù)擺數(shù)法)</p><p>  建立一個二維數(shù)組,以要填的數(shù)字為主線,通過控制數(shù)組元素下標(biāo)的變化進行

46、相應(yīng)操作并控制數(shù)組元素的賦值。</p><p>  3.1.2雙偶幻方制作(對稱法)</p><p>  建立一個二維數(shù)組,將數(shù)組元素賦值為“-1”實現(xiàn)圖中陰影格子的初值賦值,通過用偶數(shù)常數(shù)給格子賦值。運用循環(huán)結(jié)構(gòu)控制數(shù)組元素下標(biāo)以達目的。</p><p>  3.1.3單偶幻方制作(斯特雷奇法)</p><p>  大致同1)、2)操作相同

47、,其中在制作A、B、C、D幻方時通過調(diào)用函數(shù)實現(xiàn),。</p><p><b>  3.2 流程圖</b></p><p><b>  3.2.1主函數(shù)</b></p><p><b>  圖3-1函數(shù)流程圖</b></p><p>  3.2.2奇數(shù)階幻方</p>

48、<p>  鑒于單偶幻方制作和雙偶幻方制作在算法描述及功能模塊框圖中已介紹詳細(xì),就不給出詳細(xì)流程圖了。</p><p><b>  4 代碼編寫與注釋</b></p><p>  #include<iostream.h></p><p>  #include<iomanip.h></p><

49、;p>  #include<string></p><p>  #define Max 10</p><p>  int a[Max][Max];</p><p>  class HF </p><p><b>  {</b></p><p><b>  priv

50、ate:</b></p><p>  int n; //幻方的階乘數(shù) </p><p>  int x,y; //數(shù)組的下標(biāo)</p><p>  int row,col;//數(shù)級的下標(biāo)</p><p>  int i,j; //循環(huán)變量 </p><p>  int d

51、i,dx,dy; //單偶數(shù)幻方 </p><p>  int oushu; //偶數(shù)常數(shù) </p><p><b>  int temp;</b></p><p><b>  public:</b></p><p>  void accept();//接受數(shù)據(jù) &

52、lt;/p><p>  void jshf(); //奇數(shù)幻方 </p><p>  void souhf(); //單偶數(shù)幻方 </p><p>  void dsouhf(); //雙偶數(shù)幻 </p><p>  void operate(); // 運算組合</p><p>  v

53、oid display(); //打印 </p><p><b>  };</b></p><p>  void HF::accept() </p><p><b>  {</b></p><p>  cout<<"請輸入幻方的階乘數(shù) n : ";<

54、/p><p><b>  cin >>n;</b></p><p><b>  }</b></p><p>  void HF::jshf() </p><p>  {row=0;col=n/2;</p><p>  i=1;a[row][co

55、l]=i;</p><p>  for(i=2;i<=n*n;i++)</p><p>  {if(i%n==1) row=(row+1)%n;</p><p>  else {row=(row-1+n)%n;</p><p>  col=(col+1)%n;</p><p><b>  }</b

56、></p><p>  a[row][col]=i;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void HF::souhf() //奇數(shù)幻方 (2n+1)(連續(xù)擺數(shù)法)</p><p><b>  

57、{ </b></p><p>  x=n/2,y=0; //X Y表示 數(shù)軸(設(shè)左上角為(0,0))</p><p>  for (i=1;i<=n*n;i++)</p><p><b>  {</b></p><p>  magic[y][x] =i; //給x*

58、y個格子賦值</p><p>  if (i%n==0) //右上角有數(shù),放在下面</p><p><b>  y++;</b></p><p>  else if (y==0) //超出上邊界</p><p>  x++,y=n-1;</p><p>  else if

59、 (x==n-1) //超出右邊界</p><p><b>  x=0,y--;</b></p><p>  else ///正常情況</p><p><b>  x++,y--;</b></p><p><b>  }</b></p&g

60、t;<p><b>  }</b></p><p>  void HF::souhf() //雙偶數(shù)幻方(對稱法)</p><p><b>  {</b></p><p>  for (x=0;x<n/2;x++) //兩個for 就提取四分之一的數(shù) (左上角)</p>

61、;<p>  for (y=0;y<n/2;y++)</p><p>  if((x+y)%2==0) //等價于書上涂黃格 做標(biāo)記</p><p><b>  {</b></p><p>  magic[x][y]= -1;</p><p>  magic[x][n-y-1]= -1;</p

62、><p>  magic[n-x-1][y]= -1;</p><p>  magic[n-x-1][n-y-1]= -1;</p><p><b>  }</b></p><p>  for(x=0;x<n;x++)</p><p>  for(y=0;y<n;y++)</p>

63、;<p><b>  {</b></p><p>  oucs=x*n+y; //oucs為偶數(shù)常數(shù)</p><p>  if(magic[x][y]== -1) //給做標(biāo)記的數(shù)賦值</p><p>  magic[x][y]=n*n-oucs; </p><p

64、><b>  else</b></p><p>  magic[x][y]=oucs+1; //給未做標(biāo)記的數(shù)賦值</p><p><b>  }</b></p><p><b>  }</b></p><p>  void HF::dsouhf()

65、 //單偶數(shù)階(2(2m+1))幻方(斯特雷奇法)</p><p><b>  {</b></p><p>  for (di=0;di<4;di++) //幻方的分塊</p><p><b>  {</b></p><p>  switch (di)</p>

66、<p><b>  {</b></p><p>  case 0: //左上的一塊 A</p><p>  dx=0,dy=0;</p><p><b>  break;</b></p><p>  case 1: //右下的一塊 B

67、</p><p>  dx=n/2,dy=n/2;</p><p><b>  break;</b></p><p>  case 2: //右上的一塊 C</p><p>  dx=n/2,dy=0;</p><p><b>  break;</b>

68、;</p><p>  case 3: //左下的一塊 D</p><p>  dx=0;dy=n/2;</p><p><b>  break;</b></p><p><b>  default:</b></p><p><b>  br

69、eak;</b></p><p><b>  }</b></p><p>  x=(n/2)/2,y=0; // 1/4 的 第一行中間的數(shù)</p><p>  int nhsq; // 1/2 n的平方</p><p>  nhsq=(n/2)*(n/2);</p&

70、gt;<p>  for (i=1;i<=nhsq;i++)//給雙偶數(shù)幻方賦值</p><p><b>  {</b></p><p>  magic[y+dy][x+dx]=i+nhsq*di;</p><p>  if(i % (n / 2) == 0) //右上角有數(shù)</p><p><

71、;b>  y++;</b></p><p>  else if(y==0) //當(dāng)超出上面的邊界時</p><p>  x++,y=n/2-1;</p><p>  else if(x == n / 2 - 1) //當(dāng)超出右面的邊界時</p><p><b>  x=0,y--;</b>

72、</p><p>  else //正常情況下</p><p><b>  x++,y--;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  i

73、nt nm;</b></p><p>  nm=(n / 2 - 1) / 2 ;</p><p>  for (j=1;j<nm+1;j++) //交換A和D的第二行起m個數(shù)字 J指的是數(shù)組的列</p><p><b>  {</b></p><p>  temp=magic[(n/2)

74、/2][j];</p><p>  magic[(n/2)/2][j]=magic[(n/2+1)/2+n/2-1][j];//把A中的 中間一行,第二個數(shù)開始M個數(shù)(左上1/4)給D</p><p>  magic[(n/2+1)/2+n/2-1][j]=temp; //把D中間一行,第二個數(shù)開始M個數(shù)(左下1/4)給A</p><p><b

75、>  }</b></p><p>  for (i=0;i<n/2;i++) //交換A和D其它行的數(shù)字</p><p><b>  {</b></p><p>  if(i==(n/2)/2) ////I指的是數(shù)組的行</p><p>  continue;

76、 //如果到了中間的數(shù),跳出循環(huán)</p><p>  for(j=0;j<nm;j++)</p><p><b>  {</b></p><p>  temp = magic[i][j];</p><p>  magic[i][j]=magic[n/2+i][j];</p><p> 

77、 magic[n/2+i][j]=temp;</p><p><b>  }</b></p><p><b>  }</b></p><p>  for (i=0;i<n/2;i++) //交換C和B最后m-1行的數(shù)字</p><p>  for (j=n-1;j>n-nm;j

78、--)</p><p><b>  {</b></p><p>  temp=magic[i][j];</p><p>  magic[i][j]=magic[n/2+i][j];</p><p>  magic[n/2+i][j]=temp;</p><p><b>  }</b

79、></p><p><b>  }</b></p><p>  void HF::operate()</p><p><b>  {</b></p><p>  system("cls");</p><p>  cout <<setw(4

80、5)<<" 幻方的制作 "<<endl;</p><p>  cout <<setw(45)<<"==================================="<<endl;</p><p>  cout <<setw(45)&

81、lt;<" "<<endl;</p><p>  cout <<setw(49)<<" 1. 奇數(shù)階幻方 "<<endl;</p><p>  cout <<setw(49)&l

82、t;<" 2. 偶數(shù)階幻方 "<<endl;</p><p>  cout <<setw(47)<<" 請選擇(1或2,0:退出) "<<endl;</p><p>  cout <<setw(45)<<&

83、quot;==================================="<<endl;</p><p>  int choice;</p><p>  cout<<"請輸入選擇:";</p><p>  cin>>choice;</p><p>  if(choice

84、==1)</p><p><b>  {</b></p><p>  accept(); //調(diào)用接受的數(shù)據(jù)</p><p>  if (n%2==0 ||n<=0)</p><p>  cout <<"錯誤,請輸入正奇數(shù): "<<endl;</p>

85、<p><b>  else</b></p><p><b>  {</b></p><p>  jshf(); //調(diào)用奇數(shù)階乘幻方的計算</p><p>  display(); //調(diào)用顯示結(jié)果</p><p><b>  }</b></p>

86、<p><b>  }</b></p><p>  else if (choice == 2)</p><p><b>  {</b></p><p>  accept(); //調(diào)用接受的數(shù)據(jù)</p><p><b>  if(n==2)</b></p&g

87、t;<p>  cout <<"2 不存在幻方"<<endl;</p><p><b>  else</b></p><p><b>  {</b></p><p>  if(n%2==1 || n<=0)</p><p>  cout

88、 <<"錯誤,請輸入正偶數(shù):"<<endl;</p><p>  else if (n%4==0)</p><p><b>  {</b></p><p>  souhf(); //調(diào)用雙偶階乘幻方的計算</p><p>  display(); //調(diào)用顯示結(jié)果

89、</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  dsouhf(); //調(diào)用單雙偶階乘幻方的計算</p><p>  display();

90、//調(diào)用顯示結(jié)果</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else if (choice==0)</p><p>  cout <<"

91、;本次執(zhí)行終止 ! !"<<endl;</p><p><b>  else</b></p><p>  cout <<"本次執(zhí)行終止 : 原因 錯誤的輸入 "<<endl;</p><p><b>  }</b></p><p>

92、  void HF::display() //顯示結(jié)果</p><p><b>  {</b></p><p>  cout<<endl;</p><p>  for(i=0;i<n;i++)</p><p><b>  {</b></p><p>  f

93、or(j=0;j<n;j++)</p><p>  cout<<setw(4)<<magic[i][j];</p><p>  cout<<endl<<endl;</p><p><b>  } </b></p><p><b>  }</b>&

94、lt;/p><p>  void main()</p><p><b>  { </b></p><p><b>  HF hf;</b></p><p>  char replay;</p><p>  replay='y';</p><p&

95、gt;  while (replay='y') //循環(huán)操作</p><p><b>  {</b></p><p>  hf.operate();</p><p>  cout<<endl<<endl<<"還想再來一次嗎?是(y),否(按任意鍵) ";</p&

96、gt;<p>  cin>>replay;</p><p>  cout<<endl<<endl;</p><p>  if(replay !='y')</p><p><b>  return ;</b></p><p><b>  }<

97、/b></p><p><b>  }</b></p><p><b>  5程序調(diào)試</b></p><p>  在程序調(diào)試時往往一下子出現(xiàn)很多錯誤,查找困難。此次課程設(shè)計中,我采用邊編寫邊調(diào)試的方法,縮小錯誤范圍。調(diào)試過程中,在單偶幻方函數(shù)中在a與d進行對應(yīng)要求交換時,對每一行操作時,m置0的位置有誤,導(dǎo)致一些錯

98、誤。其它就是數(shù)組元素下標(biāo)范圍的控制難以掌握,但只要靜下心來,還是可以沖破難關(guān)的!</p><p><b>  6運行與測試</b></p><p>  如以下各圖所示為輸入相應(yīng)數(shù)字后的運行結(jié)果:</p><p>  進入界面,如圖6-1所示。</p><p><b>  圖6-1調(diào)試結(jié)果一</b>&

99、lt;/p><p>  奇數(shù)階幻方效果(選取5階幻方為例)如圖6-2所示。</p><p><b>  圖6-2調(diào)試結(jié)果二</b></p><p>  單偶幻方效果(選取10階幻方為例)如圖6-3所示。</p><p><b>  圖6-3調(diào)試結(jié)果三</b></p><p>  

100、雙偶幻方效果(選取8階幻方為例),與課程設(shè)計報告書上有所不同,但所達目的相同,只是其中一種效果。如圖6-4所示。</p><p><b>  圖6-4調(diào)試結(jié)果四</b></p><p>  退出(如圖6-5所示)。</p><p><b>  圖6-5調(diào)試結(jié)果五</b></p><p><b&

101、gt;  總 結(jié)</b></p><p>  在短短一個星期的課程設(shè)計中,時間太快了,課程設(shè)計做得也有點匆忙,相信還有許多可以完善的地方!不過,對我來說,這次課程設(shè)計對自身知識的增加及編程能力的提高都有很大的幫助!</p><p>  在這次課程設(shè)計我選的課題是幻方。沒做課程設(shè)計之前,我對幻方的了解幾乎是零!看完課程設(shè)計書上的概念原理,雖然對幻方。有了些基本的認(rèn)識,但要是

102、讓我自己編寫程序代碼來完成此次課程設(shè)計,那幾乎是不可能的事。所以我查閱很多書及網(wǎng)上資料,最后在別人基礎(chǔ)上對代碼進行修改使之符合本課題要求。這一設(shè)計報告,我并不是很滿意,鑒于時間的短暫,有許多地方缺少個人特色,有待完美。</p><p>  對于代碼的編寫,我并沒有將課程設(shè)計書上提及的方法一一編成,而是選取了其中的一些。其中,奇數(shù)階幻方制作用連續(xù)擺數(shù)法比較簡單,我花了很少時間就搞定。但另外兩個幻方的代碼就沒那么順利

103、。中間有一段時間還在考慮課程設(shè)計究竟寫些什么內(nèi)容,浪費了不少時間,可見預(yù)先準(zhǔn)備充分還是很必要的。那些沒有編成的方法,我覺得還是可操作的,但較之自己選的方法而言,有點繁瑣,也許以后閑暇時可以編著試試,或許會有新的發(fā)現(xiàn)。有點遺憾的是,我對于那些方法后面的數(shù)學(xué)原理沒有太多的思考,只是表面上按照書上的方法和步驟去實現(xiàn)代碼的編寫。</p><p>  對于代碼的閱讀,我覺得只要一一對照課程設(shè)計書還是較容易的。我所用的都是一

104、些比較簡單的結(jié)構(gòu),思想以比較簡單,很多相似的代碼重復(fù)編寫的次數(shù)較多。但是這樣有一個好處,就是錯誤出現(xiàn)較少。</p><p>  通過實踐,建立課程設(shè)計的整體思想,鍛煉了編寫程序與調(diào)試程序的能力,對文檔的編寫也有了規(guī)范意識。同時對獨立學(xué)習(xí)、吸取他人經(jīng)驗、探索前沿知識的習(xí)慣也有了一定的培養(yǎng)!綜上所述,此次課程設(shè)計還是一次非常有意義的經(jīng)歷!</p><p><b>  致 謝&l

105、t;/b></p><p>  在這一次的課程設(shè)計中,首先要感謝的是xx的培養(yǎng),感謝計算機工程學(xué)院提供的實踐機會,其次是實驗室工作人員提供的舒適的實驗環(huán)境。最重要的是要感謝指導(dǎo)老師們的辛勤指導(dǎo),他們?yōu)槲覀兏冻隽俗约涸S多寶貴的休息時間,在我們的整個程設(shè)計過程中他們一直在輔導(dǎo)著我們,解決我們所提出的各種古怪的問題,沒有他們的辛勤指導(dǎo),我們不可能順利完成這次課程設(shè)計。還有我們的C++老師在這一學(xué)期對我們的諄諄教導(dǎo)

106、、導(dǎo)師對我們的關(guān)心與幫助,我都要表示深深地感謝。</p><p>  還要謝謝同組的同學(xué),是你們的幫助,讓我讓我對課程設(shè)計產(chǎn)生了濃厚的興趣。還有班里的其他同學(xué),謝謝他們那樣支持我、幫助我,讓我感受到了友情的溫暖。在我們一起解決程序中的問題的過程中,我感受到了極大地快樂。讓我意識到了團隊力量的強大,在我們的互相討論過程中,使我對自己在C++程序出錯的地方有了更加深刻的了解。當(dāng)我在閱讀他們程序時,我學(xué)到了很多知識同時

107、也意識到自己的許多不足之處。</p><p>  當(dāng)然,還有那些資料的原作者,他們也給予了我很大的幫助,對此我要感謝他們,你們是我幕后的幫助者。</p><p>  最后,我要對那些給予我?guī)椭乃腥苏f一聲謝謝!</p><p><b>  參考文獻</b></p><p>  1 吳乃陵,況迎輝.C++程序設(shè)計(第2版

108、).北京:高等教育出版社,2006</p><p>  2 于永彥,趙建洋,于長輝,戴峻峰.C++程序設(shè)計課程設(shè)計指導(dǎo)書.淮安:淮陰工學(xué)院出版社,2009</p><p>  3 沈康生,歷史數(shù)學(xué)名題賞析.上海:上海教育出版社,2002</p><p>  4 王挺,周會平,賈麗麗,徐錫山.C++程序設(shè)計.北京:清華大學(xué)出版社,2005</p><

溫馨提示

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

評論

0/150

提交評論