C言語関係掲示板

過去ログ

No643 二次元配列から一次元への変換(魔方陣)

[戻る] [ホームページ]
No.6907

二次元配列から一次元への変換(魔方陣)
投稿者---レアウィンド(2003/05/29 14:35:10)


はじめまして、レアウィンドと言います。
さっそくですが、本題に入ります。
関数名をMagicSquare2(int data[],int nSize)として、二次元配列を一次元配列にするには、どのようにすれば良いでしょうか?
詳しい説明をお願いします。

二次元配列ですが、下にソースを示しておきます。

#include <stdio.h>

void MagicSquare2(int nSize){

int data[nSize][nSize],i,j,n;

//行列の初期化。
    for(i=0;i<nSize;i++){
        for(j=0;j<nSize;j++){
	    data[i][j]=0;
	}
    } 

//規則に従って魔方陣をつくる。
    i = nSize - 1;
    j = i / 2;

    for (n = 1; n <= nSize * nSize; n++) {
        data[i][j] = n;
        if  (data[(i + 1) % nSize][(j + 1) % nSize] == 0) {
            i = (i + 1) % nSize;
            j = (j + 1) % nSize;
        } else 
            i--;
    }

//1辺のマス目の数を入力し、行列を表示する。
    for(i=0;i<nSize;i++){
	for(j=0;j<nSize;j++){
	    printf("%3d ",data[i][j]);
	}
        printf("\n");
    }      
	printf("\n");
        putchar('\n');

}

int main(void){
         int n;
               while (printf("1辺あたりのマスの数は? "), scanf("%d", &n) == 1) {
                   if(n % 2) {
                          MagicSquare2(n);
                   }
               } 
          return 0;
}



No.6910

Re:二次元配列から一次元への変換(魔方陣)
投稿者---物見遊山(2003/05/29 16:36:11)


UPされたソースをできるだけ崩さないように書けばこんな感じか?
#include <stdio.h>
#include <math.h>

void MagicSquare2(int data[], unsigned short nSize)
{
    int (*pdata)[(int)sqrt(nSize)] = (int (*)[(int)sqrt(nSize)])data, i, j, n;

    nSize = (unsigned short)sqrt(nSize);

    for (i = 0; i < nSize; i++)
        for (j = 0; j < nSize; j++)
            pdata[i][j] = 0;

    i = nSize - 1;
    j = i / 2;

    for (n = 1; n <= nSize * nSize; n++) {
        pdata[i][j] = n;
        if (pdata[(i + 1) % nSize][(j + 1) % nSize] == 0) {
            i = (i + 1) % nSize;
            j = (j + 1) % nSize;
        } else i--;
    }

    for (i = 0; i < nSize; i++) {
        for (j = 0; j < nSize; j++)
            printf("%3d ", pdata[i][j]);
        printf("\n");
    }
}

main(void)
{
    int n;

    while (printf("配列の要素数は? "), scanf("%d", &n) == 1) {
        int data[n];
        if ((int)sqrt(n) % 2) MagicSquare2(data, n);
    }

    return 0;
}


No.6919

Re:二次元配列から一次元への変換(魔方陣)
投稿者---かずま(2003/05/29 20:46:21)


> int data[nSize][nSize],i,j,n;

配列の宣言で、要素数が定数式でないのは、gcc の拡張機能ですね。
あるいは、C99? コンパイラは何ですか。


> 関数名をMagicSquare2(int data[],int nSize)として、二次元配列を
一次元配列にするには、どのようにすれば良いでしょうか

質問の意味が良くわからないのですが、こんなことがしたいのですか。
#include <stdio.h>

void MagicSquare2(int data[], int nSize)
{
    int i = nSize - 1;
    int j = i / 2;
    int n;
    int size = nSize * nSize;

    for (n = 0; n < size; n++) data[n] = 0;

    for (n = 1; n <= size; n++) {
        data[i * nSize + j] = n;
        if  (data[(i + 1) % nSize * nSize + (j + 1) % nSize] == 0) {
            i = (i + 1) % nSize;
            j = (j + 1) % nSize;
        } else 
            i--;
    }

    for (n = 0; n < size; ) {
        printf(" %3d", data[n]);
        if (++n % nSize == 0) printf("\n");
    }      
}

int main(void)
{
    int data[99 * 99], n;

    while (printf("1辺あたりのマスの数は? "), scanf("%d", &n) == 1 && n <= 99)
        if(n % 2) MagicSquare2(data, n);
    return 0;
}


No.6944

Re:二次元配列から一次元への変換(魔方陣)
投稿者---レアウィンド(2003/05/30 17:29:14)


物見遊山さん、かずまさん、二人とも返答ありがとうございます。非常に助かりました。
また、文章表現が悪く、説明不足で申し訳ありませんでした。

今となっては遅いですが、自分はgccを使用しています。
お手数をかけて、すいませんでした。