一、實驗目的
實驗目的:練習多維陣列的用法
二、實驗原理
魔方陣,古代又稱“縱橫圖”,是指組成元素為自然數1、2…n的平方的n×n的方陣,其中每個元素值都不相等,且每行、每列以及主、副對角線上各n個元素之和都相等,
魔方陣的排列方法
如3×3的魔方陣:
8 1 6
3 5 7
4 9 2
魔方陣的排列規律如下:
(1)將1放在第一行中間一列;
(2)從2開始直到n×n止各數依次按下列規則存放;每一個數存放的行比前一個數的行數減1,列數加1(例如上面的三階魔方陣,5在4的上一行后一列);
(3)如果上一個數的行數為1,則下一個數的行數為n(指最下一行);例如1在第一行,則2應放在最下一行,列數同樣加1;
(4)當上一個數的列數為n時,下一個數的列數應為1,行數減去1,例如2在第3行最后一列,則3應放在第二行第一列;
(5)如果按上面規則確定的位置上已有數,或上一個數是第一行第n列時,則把下一個數放在上一個數的下面,例如按上面的規定,4應該放在第1行第2列,但該位置已經被占據,所以4就放在3的下面;
要求:從鍵盤上輸入一奇數n(0<n<16),輸出n階魔方陣,
三、主要資料結構和演算法
1、資料結構的設計(寫出構造的資料型別,即自己定義的結構體)
本實驗沒有用到自己定義資料型別
2、演算法分析(演算法用流程圖或自然語言描述)
判斷輸入的值是否屬于0~16,先令所有元素都為0,判斷j的位置,將1放在第一行中間一列,再從2開始處理,存放的行比前一個數的行數減1,列數加1,前一個數是第一行第n列時,把下一個數放在上一個數的下面,當行數減到第一行,回傳到最后一行,當列數加到最后一行,回傳到第一行,判斷元素是否為零(是否位置被占),若被占,則該數放在上一個數的下面,若沒有被占,繼續正常運行,最后輸出,
四、實驗結果及分析
1、源程式(見附錄)
2、測驗結果截圖 (寫出測驗程式的資料,至少寫三組資料,并把每組測驗結果截圖)
(1)第一組測驗資料及結果截圖
N=3

(2)第一組測驗資料及結果截圖
N=9

(3)第一組測驗資料及結果截圖
N=15

五、心得體會(自己在編程程序中對語法,寫代碼風格,實驗本身的理解,以及以后寫程式注意的問題)
1.用全體元素先賦值為0的方法,在后期判斷是否還為0,來進一步判斷未知是否被占;
2.考慮各種極端情況①位置被占;②行數減到第一行;③列數加到最后一行;④前一個數為第一行第n列;
3.先將1放好;
4.逐步細分,將各種特殊情況有條不紊的寫行程式,理清思路;
#include<stdio.h> int main() {int a[16][16],i,j,k,p,m,n; p=1; while(p==1) { scanf("%d",&n); if((n!=0)&&(n<=15)&&(n%2!=0))p=0;//判斷輸入的n是否為0~16; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=0;//先令所有的元素都為0; j=n/2+1; a[1][j]=1;//將1放在第一行中間一列; for(k=2;k<=n*n;k++)//從第二行開始處理 {i=i-1;//存放的行比其前一個數的行數減1; j=j+1;//列數加1; if((i<1)&&(j>n))// 前一個數是第一行第n列時,把下一個數放在上一個數的下面; {i=i+2; j=j-1; } else {if(i<1)i=n;//當行數減到第一行,回傳最后一行; if(j>n)j=1;//當列數加到最后一行,回傳第一行; } if(a[i][j]==0)a[i][j]=k;//如果該元素為0,繼續運行 else {i=i+2; j=j-1; a[i][j]=k;//否則該位置已被占,該數放在上一個數的下面; } } for(i=1;i<=n;i++) {for(j=1;j<=n;j++) printf("%5d",a[i][j]); printf("\n"); } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285695.html
標籤:其他
上一篇:經典實驗--輸出鞍點
下一篇:Web網頁設計
