配列について。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
音狐

配列について。

#1

投稿記事 by 音狐 » 11年前

毎度ここのサイトにお世話になっています。

ちょっとした思いつきで気になったことがあるのですが
言葉では伝えにくいので下の図で説明します。

hairetu[5][5]

0,1,0,0,0
0,1,0,0,0
1,1,1,1,1
0,1,0,0,0
0,1,0,0,0

という形を

コード:

			for(x=0;x<5;x++){
				for(y=0;y<5;y++){

					if ((x == 1) || (y == 2)){
						hairetu[x][y] = 1;
					}
					else {
						hairetu[x][y] = 0;

					}
				}
			}
で作れるのを知ったんですが

この方法を使って

0,1,0,0,0
0,1,0,0,0
1,2,1,1,1
0,1,0,0,0
0,1,0,0,0

という風に交差したところを
違う数字に変えることは出来ますでしょうか。

初心者の単なる思い付きですが
皆さんがどんなコードの組み方をするのかも気になるので
暇つぶしにと思って回答していただけるとありがたいです。

あまり質問っぽくないですが
よろしくおねがいします。

かずま

Re: 配列について。

#2

投稿記事 by かずま » 11年前

行と列が反対では?

コード:

#include <stdio.h>

int main(void)
{
    int x, y, hairetu[5][5];
    for (x = 0; x < 5; x++)
        for (y = 0; y < 5; y++)
            hairetu[x][y] = (x == 2) + (y == 1);
    for (x = 0; x < 5; x++) {
        for (y = 0; y < 5; y++)
            printf("%2d", hairetu[x][y]);
        putchar('\n');
    }
    return 0;
}

box
記事: 2002
登録日時: 13年前

Re: 配列について。

#3

投稿記事 by box » 11年前

コード:

#include <stdio.h>

int main(void)
{
    int hairetu[5][5], x, y;

    for (x = 0; x < 5; x++) {
        for (y = 0; y < 5; y++) {
            printf("%2d", hairetu[x][y] = (x == 2) + (y == 1));
        }
        putchar('\n');
    }
    /*
     * hairetu[5][5]を使うコードを書く。
     */
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

non
記事: 1097
登録日時: 13年前

Re: 配列について。

#4

投稿記事 by non » 11年前

私の好みでは
hairetu[y][x]
だな。
non

nil
記事: 428
登録日時: 12年前

Re: 配列について。

#5

投稿記事 by nil » 11年前

コード:

int main( void ){
    int hairetsu[5][5];
    int buffer[5][5] = {
        {0,1,0,0,0},
        {0,1,0,0,0},
        {1,2,1,1,1},
        {0,1,0,0,0},
        {0,1,0,0,0}
    };
    memcpy( hairetsu, buffer, sizeof(int)*5*5 );
}
はだめですかね

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 配列について。

#6

投稿記事 by softya(ソフト屋) » 11年前

私の好みは見た目が素直な
hairetu[x][y]
ですな。

あと処理するとしたら、素直という事で0でクリアしたあと縦2列めだけと横2行めだけでループして1づつ足す方法ですか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かずま

Re: 配列について。

#7

投稿記事 by かずま » 11年前

softya(ソフト屋) さんが書きました: あと処理するとしたら、素直という事で0でクリアしたあと縦2列めだけと横2行めだけでループして1づつ足す方法ですか。
そのとおり!

コード:

    for (x = 0; x < 5; x++)
        for (y = 0; y < 5; y++)
            hairetu[x][y] = (x == 2) + (y == 1);
実は、これはよくないコードなのです
今はサイズが 5 x 5 ですが、これが 10 x 10 だったら、81個の 0 を
入れるために、2つの比較と1つの足し算を毎回実行するのは
馬鹿げています。

カーニハンの「プログラム書法」は、Fortran で単位行列を初期化する
技巧的なやり方を批判するところから始まりますが、それと同じことです。
Fortran のわかる人はそんなに多くないと思うので C で書くと、

コード:

    for (i = 0; j < n; i++)
        for (j = 0; j < n; j++)
            a[i][j] = (i / j) * (j / i);
i と j が異なるとき、小さい整数を大きい整数で割った値がゼロになることを
利用しているものです。

かずま

Re: 配列について。

#8

投稿記事 by かずま » 11年前

涼雅 さんが書きました:

コード:

int main( void ){
    int hairetsu[5][5];
    int buffer[5][5] = {
        {0,1,0,0,0},
        {0,1,0,0,0},
        {1,2,1,1,1},
        {0,1,0,0,0},
        {0,1,0,0,0}
    };
    memcpy( hairetsu, buffer, sizeof(int)*5*5 );
}
はだめですかね
だめです。
buffer が自動変数なので、この初期化のために memcpy が実行され、
次に、hairetsu の初期化で memcpy が実行されます。

static int buffer[5][5] = { と書けば、問題ありません。

閉鎖

“C言語何でも質問掲示板” へ戻る