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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

937閲覧

多次元配列に数値を代入する

takuzou

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/11/08 06:27

前提・実現したいこと

多次元配列に数値を入れる
①.②はできたんですが③が全く分かりません。
調べて多次元は入れるに代入くらいしかでてこなくお手上げ状態です
ご教授お願い致します。


3×3の多次元配列を作成し、1~9の数値を格納するプログラム

数値の入れ方を選択してください(1,2,3):1

1つ目の数値を入力してください(1~9):1

入力結果です
1 0 0
0 0 0
0 0 0

2つ目の数値を入力してください(1~9):2

入力結果です
1 2 0
0 0 0
0 0 0

//全部入力が完了したらありがとうございましたと出力で終わり。

①上列から順番に数値を格納していくプログラム 123
456
789

②左列から順番に数値を格納していくプログラム 147
258
369

②右下に数値を格納していくプログラム 492
357  
816

 ルール説明
1.一番最初は下段の真ん中に1を格納してスタート
2.右下に移動したときに下にはみ出た場合は上に戻る
3.右下に移動したときに右にはみ出た場合は左に戻る

発生している問題・エラーメッセージ

import java.util.Scanner; public class taji { public static void main(String[] args){ Scanner stdIn = new Scanner(System.in); int [][]data=new int[3][3]; int nyuryoku; int x=0; int y=0; int x1=0; int y1=0; System.out.print("数値の入れ方を選択してください"); int irekata=stdIn.nextInt(); if(irekata==1){ for(int i=1;i<9;++i){ System.out.print(i+"つ目の整数を入力してください"); nyuryoku=stdIn.nextInt(); data[x][y]=nyuryoku; ++y; if(y==3){ ++x; y=0; } System.out.println("出力結果です"); //表示部分 スタート for(x1=0;x1<3;++x1){ for(y1=0;y1<3;++y1){ System.out.print(data[x1][y1]); if(y1==2){ System.out.print("\n"); } } } //表示部分 エンド } } if(irekata==2){ for(int i=1;i<9;++i){ System.out.print(i+"つ目の整数を入力してください"); nyuryoku=stdIn.nextInt(); data[x][y]=nyuryoku; ++x; if(x==3){ x=0; ++y; } System.out.println("出力結果です"); //表示部分 スタート for(x1=0;x1<3;++x1){ for(y1=0;y1<3;++y1){ System.out.print(data[x1][y1]); if(y1==2){ System.out.print("\n"); } } } //表示部分 エンド } } } }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2021/11/08 06:51 編集

「ルール説明」というのは irekata==3 の場合の「ルール」でしょうか? 1 は分かりますが、 2, 3 の意味が分かりません。3x3 の中に順番に数値を入れていくのに、何が「はみ出」るのでしょうか。 「右下に移動したときに下(もしくは右)にはみ出た」とは、具体的に(数値の入れ方で 3 を選んで「xつ目の数値を入力してください(1~9):」と表示される度に)どのような入力を行うとどうなるということでしょうか。 もし、入れ方=3 のコードを作ってみたが想定した動作をしなかったのでしたら、そのコードもご提示ください。このままでは単に「3の場合の処理を作ってください」という丸投げに近いご質問となってしまいます。
takuzou

2021/11/08 06:53

3を選択した場合のルール説明です わかりました出来るだけ頑張ってみます 1の次が2なので2をいれようとしたら1の右下になり配列の場所がないのではみ出した一番上の配列の場所に2をいれるって言う感じです。なのでこれを続けると 492 357   816 になります わかりにくくすみません
jimbe

2021/11/08 07:03 編集

なるほど、右下というのは「直前に数値を入れた場所」の右下、でしょうか。 とすると・・・ 3→4 や 6→7 はなぜこうなりますか。
takuzou

2021/11/08 07:01

直前の右下ですね
Luice

2021/11/08 07:06

このルールだと4は3の右下、つまり1を上書きすることになると思うのですが どういうルールで3の上に4が来るんでしょうか?
takuzou

2021/11/08 08:34

既にある数値にあたると上書きではなくその直前に入れた値の列の一番上になるというルールを書くのを忘れてましたすみません なので4は直前にいれた3の上にはいります
guest

回答2

0

ベストアンサー

やってる事は至ってシンプルで

  • 3x3の2次元配列を保持するクラスを用意する
  • 開始地点のアドレスをコンストラクタで設定
  • 次のアドレスを指定
    次のアドレスに値が無ければそのまま
    次のアドレスに値がある場合はアドレス上に移動
  • 値を設定
  • アドレスに設定した値を表示

だけです。

Java

1 public static void main(String[] args) { 2 var obj = new InputType3(); 3 obj.execute(); 4 } 5 6 public void execute() { 7 var obj = new Box(); 8 for (int i = 1; i <= 9; i++) { 9 obj.set(i); 10 obj.next(); 11 } 12 obj.show(); 13 } 14

Java

1import java.util.StringJoiner; 2 3public class Box { 4 5 /** 6 * アドレス. 7 */ 8 private final int[][] address = new int[3][3]; 9 10 /** 11 * x座標. 12 */ 13 private int x; 14 15 /** 16 * y座標 17 */ 18 private int y; 19 20 /** 21 * カウンター. 22 */ 23 private int callCounter = 0; 24 25 /** 26 * コンストラクタ. 27 */ 28 public Box() { 29 this.x = 2; 30 this.y = 1; 31 } 32 33 /** 34 * 次のアドレスを設定する. 35 */ 36 public void next() { 37 this.callCounter++; 38 if (this.assertCounter(this.callCounter)) { 39 return; 40 } 41 42 if (this.hasNext()) { 43 up(); 44 return; 45 } 46 down(); 47 shift(); 48 } 49 50 /** 51 * 次のアドレスに値が設定されているか判定する. 52 * 53 * @return true:値あり, false:値なし 54 */ 55 protected boolean hasNext() { 56 int x = (this.x + 1 > 2) ? 0 : this.x + 1; 57 int y = (this.y + 1 > 2) ? 0 : this.y + 1; 58 return this.address[x][y] > 0; 59 } 60 61 /** 62 * アドレスを下にずらす. 63 */ 64 protected void down() { 65 this.x++; 66 if (this.x > 2) { 67 this.x = 0; 68 } 69 } 70 71 /** 72 * アドレスを上にずらす. 73 */ 74 protected void up() { 75 this.x--; 76 if (this.x < 0) { 77 this.x = 2; 78 } 79 } 80 81 /** 82 * アドレスを右にずらす. 83 */ 84 protected void shift() { 85 this.y++; 86 if (this.y > 2) { 87 this.y = 0; 88 } 89 } 90 91 /** 92 * 入力上限チェック 93 * 94 * @param counter カウンター 95 * @return true:上限到達, false:上限未達 96 */ 97 protected boolean assertCounter(final int counter) { 98 return counter >= 9; 99 } 100 101 /** 102 * アドレスに値を設定する. 103 * 104 * @param number105 */ 106 public void set(int number) { 107 if (assertCounter(this.callCounter)) { 108 return; 109 } 110 this.address[x][y] = number; 111 } 112 113 /** 114 * 設定した値を表示する. 115 */ 116 public void show() { 117 for (int i = 0; i <= 2; i++) { 118 StringJoiner joiner = new StringJoiner(" "); 119 for (int j = 0; j <= 2; j++) { 120 joiner.add(String.format("%d", this.address[i][j])); 121 } 122 System.out.println(joiner.toString()); 123 } 124 } 125} 126 127

投稿2021/11/08 08:44

Luice

総合スコア771

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

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

takuzou

2021/11/08 11:58

ありがとうございます。
guest

0

処理内容から考えますと、2次元配列 data に入れる順は(入力の値がどうあれ) 3 つとも固定なようです。

ですので、data に入れる順を別途配列に持っておいて、その配列に沿って入れていけば良いのではないでしょうか。
(そうすれば irekata 毎の if も必要ありません。)

※x,y は 3x3 の横方向縦方向のつもりで書いてありますのでご注意ください。

java

1int[][] indexs = new int[][] { // x+y*3 の値 2 { 0,1,2, 3,4,5, 6,7,8 }, //入れ方1 3 { 0,3,6, 1,4,7, 2,5,8 }, //入れ方2 4 { 7,2,3, 0,4,8, 5,6,1 } //入れ方3 5};

java

1int x = indexs[irekata-1][i-1] % 3; 2int y = indexs[irekata-1][i-1] / 3; 3data[x][y] = nyuryoku;

投稿2021/11/08 07:17

編集2021/11/08 07:56
jimbe

総合スコア12756

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

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

takuzou

2021/11/08 08:36

補足で忘れていました for while ifを使わないといけないという課題です申し訳ありませ????
jimbe

2021/11/08 09:13 編集

for( または while) は入力や表示の繰り返しで必要ですし、 if は"入れ方"が 1 ~ 3 の範囲内かチェックするのに使うでしょう。 要は「入れ方毎に完全に別々に処理を分けて書く必要は無い」「常に同じ動きをするなら計算する必要は無い」ということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問