質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

9496閲覧

二次元配列で(3,3)の大きさで乱数を発生させたいです

57svu

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/05/08 07:34

ここのサイトの練習問題5-12なのですが

http://csharp.sevendays-study.com/problem4.html

内容 ↓

prob5-12.(難易度:★)

3×3の二次元配列を作成し、それぞれに0から9の乱数を発生させ、実行例にならいその内容を表示させなさい。

ヒント:forの二重ループを使う

実行結果の例
1 2 3
5 1 9
0 3 4

二次元配列が(3,3)の枡のようなイメージはつかめたのですが
そのます毎に乱数を発生させようとするとまずこのままだとエラーが起きます

まずそこでなんでエラーが起こるのかが理解できていないです。

自分の書いたコード

c#

1コード 2 3using System; 4using System.Collections.Generic; 5using System.Linq; 6using System.Text; 7using System.Threading.Tasks; 8 9namespace prob5_12 10{ 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 Random rnd = new Random(); 16 17 int [ , ] data = new int [ 3, 3 ]; 18 int a, b; 19 20 21 for (a = 0; a < data.Length; a++) 22 { 23 24 for (b = 0; b < data.Length; b++) 25 { 26 data[a, b] = rnd.Next(0, 10); 27 } 28 } 29 30 for (a = 0; a < data.Length; a++) 31 { 32 for (b = 0; b < data.Length; b++) 33 { 34 Console.Write( "data[ { 0 } ] [ { 1 } ] = { 2 } ", a , b , data[ a, b ] ); 35 36 } 37 Console.WriteLine(); 38 } 39 } 40 } 41 } 42 43

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/05/08 07:40

エラーは何と書いてありましたか?
57svu

2017/05/08 08:59

すみません。もうエラー画面が見れないのですが確か、inboxerrorと最初のforループの中身の方が赤くでていました。32bitを~というような内容でした。
guest

回答3

0

ベストアンサー

このプログラムの問題は、以下の2つです:

ひとつめは、次元ごとの要素数をとる方法が間違っています:

cs

1for (a = 0; a < data.Length; a++)

cs

1for (b = 0; b < data.Length; b++)

において、次元ごとの要素数を取得するためにLengthプロパティを使用していますが、これがよくありません。この場合、Lengthプロパティでは要素数3が返ってくることを期待しているのだと思いますが、実際には9 (全要素数) が返ってきます。
正しくは、GetLength(N)メソッドを使用します。Nには次元の添字を指定します。具体的には、1次元目の要素数を取得するためにdata.GetLength(0)を使用し、2次元目の要素数を取得するためにdata.GetLength(1)を使用します。

もうひとつは、出力フォーマットが間違っています。{ 0 }のように引数番号を指定していますが、前後のスペースが不要です。

投稿2017/05/08 07:53

編集2017/05/08 07:58
faithandbrave

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

57svu

2017/05/08 09:04

詳しいご説明をありがとうございます。 GetLength全体の仕組みがとてもわかりやすかったです。 最後の出力もシンプルにdata[a,b]に修正したところ改善できました! ありがとうございました!
guest

0

data.Lengthはすべての次元内の要素の総数です。特定の次元の長さを求めるにはdata.GetLength(n)を利用しましょう。

投稿2017/05/08 07:46

ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

57svu

2017/05/08 09:01

素早いご指摘ありがとうございました! 多次元になるとどの次元かを指定するために必要なんですね。 勉強になりました。
guest

0

data.Length の値を表示するかデバッガで覗いてみてください。3 ではなく9 になっていると思います。配列のメソッドである GetLength() を調べてください。

投稿2017/05/08 07:46

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

57svu

2017/05/08 09:02

ご指摘ありがとうございます。 のぞいてみると9になってました。 あの後調べた結果解決できました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問