2次元配列を使用して
四角形の縦と横の長さを自分で決定して、0で表示したいです。
イメージとして下のような感じです。
00000
00000
00000
00000
00000
そして、この中でランダムに1つを選んで数字を「0」から「1」に書き換えるプログラムの作成方法を教えて欲しいです。
簡単な質問で申し訳ないのですが、よろしくお願いします。
2次元配列の簡単な質問
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 2次元配列の簡単な質問
これだとフォーラムルール上の丸投げになるので、どこまでプログラムを出来たか書いてもらえますか?
http://dixq.net/board/board.html
それと簡単な問題と書いておられますが、初心者にとっては簡単ではないと思います。
【補足】
ソースコードを出来た分だけ掲載して下さい。
http://dixq.net/board/board.html
それと簡単な問題と書いておられますが、初心者にとっては簡単ではないと思います。
【補足】
ソースコードを出来た分だけ掲載して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2次元配列の簡単な質問
よく使い方がわからないまま使ってしまい申し訳ありません。
今のところこのような状態になっています。
今のところこのような状態になっています。
#include <stdio.h>
#define X 10
#define Y 10
int main(void)
{
int field[X][Y],size,i,j;
scanf("%d",&size);
for(i=0; i<size; i++)
{
for(j=0; j<size; j++)
{
field[i][0] = 0;
field[0][j] = 0;
}
}
for(i=0; i<size; i++)
{
for(j=0; j<size; j++)
{
printf("%d",field[i][0]);
printf("%d",field[0][j]);
}
}
field[i][0] = 0;
field[0][j] = 0;
}
}
for(i=0; i<size; i++)
{
for(j=0; j<size; j++)
{
printf("%d",field[i][0]);
printf("%d",field[0][j]);
}
}
return 0;
}
Re: 2次元配列の簡単な質問
インデント(字下げ)について、もっと研究してください。
さて、「縦と横を『自分で』決める」という要求仕様に対し、今のコードでは
もしそうであるならば、malloc()あたりを使った動的な領域確保について
研究する必要がありそうです。
さて、「縦と横を『自分で』決める」という要求仕様に対し、今のコードでは
こういう制限があります。15とか20とか、『自分で』決めたいのではないのでしょうか。
もしそうであるならば、malloc()あたりを使った動的な領域確保について
研究する必要がありそうです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 2次元配列の簡単な質問
方法としてはboxさんの書いたmallocで動的確保する方法(ポインタの知識が必要)と、とりあえず上限を決めて大きな配列を準備しておいて必要なサイズだけ使うと言う方法があります。後者のほうが初心者には簡単かと思いますが、この機会にポインタの理解を深めるのも良いかと思います。
後者としては、使う縦横サイズの入力がまず必要ですね。
後者としては、使う縦横サイズの入力がまず必要ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2次元配列の簡単な質問
>とりあえず上限を決めて大きな配列を準備しておいて必要なサイズだけ使うと言う方法があります。
提示コードはそれをやろうとしているように見えなくもないですね.
(配列を10x10で用意していて, sizeには10以下の値を入力する,という形)
何箇所かに出てくる
field[0]
field[0][j]
の箇所は やりたいことに対して 間違っていると思いますよ.
(この書き方だと例えば,[3][3]とかにはならないですよね)
全部0で埋めた表示を行っていると
自分が意図した配列要素の値が本当に出力されているのかどうかがわかりにくいんじゃないかな?と思います.
全ての要素の値が異なる2次元配列を作って表示するみたいなことをやってみると良いかもしれません.
提示コードはそれをやろうとしているように見えなくもないですね.
(配列を10x10で用意していて, sizeには10以下の値を入力する,という形)
何箇所かに出てくる
field[0]
field[0][j]
の箇所は やりたいことに対して 間違っていると思いますよ.
(この書き方だと例えば,[3][3]とかにはならないですよね)
全部0で埋めた表示を行っていると
自分が意図した配列要素の値が本当に出力されているのかどうかがわかりにくいんじゃないかな?と思います.
全ての要素の値が異なる2次元配列を作って表示するみたいなことをやってみると良いかもしれません.
Re: 2次元配列の簡単な質問
例えば sizeの値が3である時を考えてみましょう.
プログラムでいじくるべき配列要素は 3*3=9 個であり,それらの配列添え字は
[0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]
[2][0] [2][1] [2][2]
でしょう.
forを2重に使っている箇所では,iとj の組み合わせによってこれら全ての添え字を網羅するように
書きたいのだと思いますが,現状はそうなっていません.
例えば,13行目~20行目のループを全て書き下せば,
i=0の回
[0][0]=0; [0][0]=0; //左側がfield[0] = 0; 右側がfield[0][j] = 0;
[0][0]=0; [0][1]=0;
[0][0]=0; [0][2]=0;
i=1の回
[1][0]=0; [0][0]=0;
[1][0]=0; [0][1]=0;
[1][0]=0; [0][2]=0;
i=2の回
[2][0]=0; [0][0]=0;
[2][0]=0; [0][1]=0;
[2][0]=0; [0][2]=0;
ということになっています.
(5つの要素しか網羅しておらず,残り4つの要素が手つかずになってしまってます.)
プログラムでいじくるべき配列要素は 3*3=9 個であり,それらの配列添え字は
[0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]
[2][0] [2][1] [2][2]
でしょう.
forを2重に使っている箇所では,iとj の組み合わせによってこれら全ての添え字を網羅するように
書きたいのだと思いますが,現状はそうなっていません.
例えば,13行目~20行目のループを全て書き下せば,
i=0の回
[0][0]=0; [0][0]=0; //左側がfield[0] = 0; 右側がfield[0][j] = 0;
[0][0]=0; [0][1]=0;
[0][0]=0; [0][2]=0;
i=1の回
[1][0]=0; [0][0]=0;
[1][0]=0; [0][1]=0;
[1][0]=0; [0][2]=0;
i=2の回
[2][0]=0; [0][0]=0;
[2][0]=0; [0][1]=0;
[2][0]=0; [0][2]=0;
ということになっています.
(5つの要素しか網羅しておらず,残り4つの要素が手つかずになってしまってます.)
Re: 2次元配列の簡単な質問
返事が遅れても申し訳ありません。
とてもわかりやすいです。malloc関数などよくわからなくてすぐに作成はできなさそうですが、やってみます。
とてもわかりやすいです。malloc関数などよくわからなくてすぐに作成はできなさそうですが、やってみます。
Re: 2次元配列の簡単な質問
個人的には,mallocとかの話はとりあえず後回しにして,
最初の目標としては
現状の「sizeは10以下限定で」という条件の上での完成を 目指した方がよいと思います.
最初の目標としては
現状の「sizeは10以下限定で」という条件の上での完成を 目指した方がよいと思います.
//ヒント
{
int i;
//この配列の10個の要素の値を全て 3 にするには…
int Array[10];
//こうすればいけそうである.
//forでうまくiを使って,Array[i]=3; が全ての要素を網羅するように書く.
for( i=0; i<10; i++ ) //※i=0,1,2,...,9 について,
{ Array[i] = 3; }
}
{
int row;
int column;
//では,この配列の4個の要素の値を全て 3 にするにはどうすればいいだろうか?
int Array2D[2][2];
//↑の例と考え方は一緒.
//うまくforでrowとcolumnを使って,Array2D[row][column]=3; が全ての要素を網羅するように書く.
}
Re: 2次元配列の簡単な質問
usaoさん、ありがとうございます。
ここまで出来ました!
あとは正方形のサイズも乱数で決定し、正方形のサイズ以上のX座標、Y座標を決定する乱数の値が超えないように作れば完成します。
完成したらまた書き込みます。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int row;
int column;
int i,j;
srand((unsigned)time(NULL));
int D[6][6];
int x = rand()%5+1;
int y = rand()%5+1;
printf("乱数を表示\n");
printf("x=%d\n",x);
printf("y=%d\n\n",y);
for(i=1; i<6; i++)
{
for(j=1; j<6; j++)
{
D[i][j] = 0;
}
}
D[x][y] = 1;
/*
for(i=1; i<6; i++)
{
for(j=1; j<6; j++)
{
printf("D[%d][%d]=%d ",i,j,D[i][j]);
}
printf("\n");
}
*/
for(i=1; i<6; i++)
{
for(j=1; j<6; j++)
{
printf("%d",D[i][j]);
}
printf("\n");
}
return 0;
}
あとは正方形のサイズも乱数で決定し、正方形のサイズ以上のX座標、Y座標を決定する乱数の値が超えないように作れば完成します。
完成したらまた書き込みます。
Re: 2次元配列の簡単な質問
>あとは正方形のサイズも乱数で決定し
最初はscanf()で指定していたようですが,乱数で決めることにしたのでしょうか.
(まぁ 課題とかでないならば ここらへんのことは別にどちらでもいいのだと思いますが.)
一か所だけを'1'に変えることに関して,座標を決める乱数の範囲としては
>int x = rand()%5+1;
この式で大丈夫なのでしょうか.
(この式の結果の最小値と最大値はいくつになるでしょう?
「配列D[6][6]のどこか一カ所をランダムで選ぶ」という話であれば
xの値(yの値も)は { 0,1,2,3,4,5 } のいずれかになるようにするのが自然じゃないかなと思います)
最初はscanf()で指定していたようですが,乱数で決めることにしたのでしょうか.
(まぁ 課題とかでないならば ここらへんのことは別にどちらでもいいのだと思いますが.)
一か所だけを'1'に変えることに関して,座標を決める乱数の範囲としては
>int x = rand()%5+1;
この式で大丈夫なのでしょうか.
(この式の結果の最小値と最大値はいくつになるでしょう?
「配列D[6][6]のどこか一カ所をランダムで選ぶ」という話であれば
xの値(yの値も)は { 0,1,2,3,4,5 } のいずれかになるようにするのが自然じゃないかなと思います)