ページ 1 / 1
配列について。
Posted: 2012年10月17日(水) 15:15
by 音狐
毎度ここのサイトにお世話になっています。
ちょっとした思いつきで気になったことがあるのですが
言葉では伝えにくいので下の図で説明します。
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: 配列について。
Posted: 2012年10月17日(水) 15:30
by かずま
行と列が反対では?
コード:
#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;
}
Re: 配列について。
Posted: 2012年10月17日(水) 17:00
by box
コード:
#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;
}
Re: 配列について。
Posted: 2012年10月17日(水) 17:28
by non
私の好みでは
hairetu[y][x]
だな。
Re: 配列について。
Posted: 2012年10月17日(水) 18:38
by nil
コード:
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 );
}
はだめですかね
Re: 配列について。
Posted: 2012年10月17日(水) 18:41
by softya(ソフト屋)
私の好みは見た目が素直な
hairetu[x][y]
ですな。
あと処理するとしたら、素直という事で0でクリアしたあと縦2列めだけと横2行めだけでループして1づつ足す方法ですか。
Re: 配列について。
Posted: 2012年10月17日(水) 19:01
by かずま
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: 配列について。
Posted: 2012年10月17日(水) 19:06
by かずま
涼雅 さんが書きました:コード:
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] = { と書けば、問題ありません。