2次元配列の簡単な質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
メガネシチュー
記事: 4
登録日時: 11年前

2次元配列の簡単な質問

#1

投稿記事 by メガネシチュー » 11年前

2次元配列を使用して
四角形の縦と横の長さを自分で決定して、0で表示したいです。
イメージとして下のような感じです。

00000
00000
00000
00000
00000

そして、この中でランダムに1つを選んで数字を「0」から「1」に書き換えるプログラムの作成方法を教えて欲しいです。

簡単な質問で申し訳ないのですが、よろしくお願いします。

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

Re: 2次元配列の簡単な質問

#2

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

これだとフォーラムルール上の丸投げになるので、どこまでプログラムを出来たか書いてもらえますか?
http://dixq.net/board/board.html
それと簡単な問題と書いておられますが、初心者にとっては簡単ではないと思います。

【補足】
ソースコードを出来た分だけ掲載して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

メガネシチュー
記事: 4
登録日時: 11年前

Re: 2次元配列の簡単な質問

#3

投稿記事 by メガネシチュー » 11年前

よく使い方がわからないまま使ってしまい申し訳ありません。
今のところこのような状態になっています。

コード:


#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;
}


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

Re: 2次元配列の簡単な質問

#4

投稿記事 by box » 11年前

インデント(字下げ)について、もっと研究してください。
さて、「縦と横を『自分で』決める」という要求仕様に対し、今のコードでは
ck さんが書きました:

コード:

#define X 10
#define Y 10
こういう制限があります。15とか20とか、『自分で』決めたいのではないのでしょうか。
もしそうであるならば、malloc()あたりを使った動的な領域確保について
研究する必要がありそうです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 2次元配列の簡単な質問

#5

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

方法としてはboxさんの書いたmallocで動的確保する方法(ポインタの知識が必要)と、とりあえず上限を決めて大きな配列を準備しておいて必要なサイズだけ使うと言う方法があります。後者のほうが初心者には簡単かと思いますが、この機会にポインタの理解を深めるのも良いかと思います。
後者としては、使う縦横サイズの入力がまず必要ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 2次元配列の簡単な質問

#6

投稿記事 by usao » 11年前

>とりあえず上限を決めて大きな配列を準備しておいて必要なサイズだけ使うと言う方法があります。

提示コードはそれをやろうとしているように見えなくもないですね.
(配列を10x10で用意していて, sizeには10以下の値を入力する,という形)


何箇所かに出てくる
field[0]
field[0][j]
の箇所は やりたいことに対して 間違っていると思いますよ.
(この書き方だと例えば,[3][3]とかにはならないですよね)

全部0で埋めた表示を行っていると
自分が意図した配列要素の値が本当に出力されているのかどうかがわかりにくいんじゃないかな?と思います.
全ての要素の値が異なる2次元配列を作って表示するみたいなことをやってみると良いかもしれません.

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 2次元配列の簡単な質問

#7

投稿記事 by usao » 11年前

例えば 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つの要素が手つかずになってしまってます.)

メガネシチュー
記事: 4
登録日時: 11年前

Re: 2次元配列の簡単な質問

#8

投稿記事 by メガネシチュー » 11年前

返事が遅れても申し訳ありません。
とてもわかりやすいです。malloc関数などよくわからなくてすぐに作成はできなさそうですが、やってみます。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 2次元配列の簡単な質問

#9

投稿記事 by usao » 11年前

個人的には,mallocとかの話はとりあえず後回しにして,
最初の目標としては
現状の「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; が全ての要素を網羅するように書く.
}

メガネシチュー
記事: 4
登録日時: 11年前

Re: 2次元配列の簡単な質問

#10

投稿記事 by メガネシチュー » 11年前

usaoさん、ありがとうございます。

コード:

#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座標を決定する乱数の値が超えないように作れば完成します。
完成したらまた書き込みます。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 2次元配列の簡単な質問

#11

投稿記事 by usao » 11年前

>あとは正方形のサイズも乱数で決定し
最初はscanf()で指定していたようですが,乱数で決めることにしたのでしょうか.
(まぁ 課題とかでないならば ここらへんのことは別にどちらでもいいのだと思いますが.)

一か所だけを'1'に変えることに関して,座標を決める乱数の範囲としては
>int x = rand()%5+1;
この式で大丈夫なのでしょうか.
(この式の結果の最小値と最大値はいくつになるでしょう?
 「配列D[6][6]のどこか一カ所をランダムで選ぶ」という話であれば
 xの値(yの値も)は { 0,1,2,3,4,5 } のいずれかになるようにするのが自然じゃないかなと思います)

閉鎖

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