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

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

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

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

Q&A

解決済

3回答

9947閲覧

ブロック内の変数を外で使用したい

KeitaK

総合スコア5

Java

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

0グッド

0クリップ

投稿2020/09/02 09:08

2桁の整数同士の足し算問題を5回繰り返し、最後にまとめて答えと正誤評価を表示させたいです。
for文内の変数ansをブロック外で使用できれば解決すると思うのですが、その方法がわかりません。
開発環境
macOS, Sublime Text

java

1import java.io.*; 2 3class Practice3 4{ 5 public static void main(String[] args) throws IOException 6 { 7 int[][] kazu = new int[2][5]; 8 9 kazu[0][0] = (int)(Math.random() * 99); 10 kazu[0][1] = (int)(Math.random() * 99); 11 kazu[0][2] = (int)(Math.random() * 99); 12 kazu[0][3] = (int)(Math.random() * 99); 13 kazu[0][4] = (int)(Math.random() * 99); 14 kazu[1][0] = (int)(Math.random() * 99); 15 kazu[1][1] = (int)(Math.random() * 99); 16 kazu[1][2] = (int)(Math.random() * 99); 17 kazu[1][3] = (int)(Math.random() * 99); 18 kazu[1][4] = (int)(Math.random() * 99); 19 20 for(int i=0; i<5; i++){ 21 22 System.out.print(kazu[0][i] + "+" + kazu[1][i] + "="); 23 24 BufferedReader br = 25 new BufferedReader(new InputStreamReader(System.in)); 26 27 String num = br.readLine(); 28 int ans = Integer.parseInt(num); 29 } 30 31 System.out.println("答え"); 32 33 for(int j=0; j<5; j++){ 34 35 if(ans == kazu[0][j] + kazu[1][j]){ 36 System.out.println(kazu[0][j] + "+" + kazu[1][j] + "=" + (kazu[0][j] + kazu[1][j]) + " 正解"); 37 } 38 else{ 39 System.out.println(kazu[0][j] + "+" + kazu[1][j] + "=" + (kazu[0][j] + kazu[1][j]) + " 不正解"); 40 } 41 } 42 } 43}

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

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

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

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

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

guest

回答3

0

  • ansは配列にして、for文の外側で宣言する
  • kazuの値は出題するfor文の中で生成する
  • 入力した答えは配列の要素ansiに格納する
  • 答え合わせのfor文の問題文は共通なのでif文の前で表示する

Java

1import java.io.*; 2 3class randomcheck { 4 public static void main(String[] args) throws IOException { 5 int[][] kazu = new int[2][5]; 6 int[] ans = new int[5]; 7 8 for (int i = 0; i < 5; i++) { 9 kazu[0][i] = (int) (Math.random() * 100); 10 kazu[1][i] = (int) (Math.random() * 100); 11 System.out.print(kazu[0][i] + "+" + kazu[1][i] + "="); 12 13 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 14 15 String num = br.readLine(); 16 ans[i] = Integer.parseInt(num); 17 } 18 19 System.out.println("答え"); 20 21 for (int i = 0; i < 5; i++) { 22 System.out.print(kazu[0][i] + "+" + kazu[1][i] + "=" + (kazu[0][i] + kazu[1][i])); 23 if (ans[i] == kazu[0][i] + kazu[1][i]) { 24 System.out.println(" 正解"); 25 } else { 26 System.out.println(" 不正解"); 27 } 28 } 29 } 30}

投稿2020/09/02 09:45

Daregada

総合スコア11990

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

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

KeitaK

2020/09/02 09:48

とてもわかりやすい解答ありがとうございます。 ベストアンサーにしたいです。
guest

0

こんな方法もありかな、と。

Java

1import java.io.*; 2import java.util.Random; 3 4class Main { 5 public static void main(String[] args) throws IOException { 6 var rand = new Random(); 7 8 final var numOfQuestions = 5; 9 var messages = new String[numOfQuestions]; 10 11 try( 12 var inputStreamReader = new InputStreamReader(System.in); 13 var bufferedReader = new BufferedReader(inputStreamReader); 14 ) { 15 for(int i = 0; i < numOfQuestions; ++i) { 16 int x = rand.nextInt(100); 17 int y = rand.nextInt(100); 18 messages[i] = String.format("%d+%d=%d", x, y, x+y); 19 20 System.out.printf("%d+%d=?", x, y); 21 int ans = Integer.parseInt(bufferedReader.readLine()); 22 23 if(ans == x + y) { 24 messages[i] += " 正解"; 25 } 26 else { 27 messages[i] += " 不正解"; 28 } 29 } 30 } 31 32 System.out.println("答え"); 33 for(var message: messages) { 34 System.out.println(message); 35 } 36 } 37}

乱数の生成や正誤の判定、果てはメッセージまでもループの中で作ってしまう方法です。
それ以外にもさまざま改造しています。参考までに。

投稿2020/09/02 09:44

編集2020/09/02 10:32
LouiS0616

総合スコア35668

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

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

KeitaK

2020/09/02 09:49

初心者の自分には全くわかりません・・笑 これから勉強します!
LouiS0616

2020/09/02 10:31

正誤判定を先に行っちゃうと楽だよというのが回答の主眼なので、それ以外の改良は全部おまけです。 Javaに慣れてきたころにもう一度見てみると得られるものもあるかと思います。
guest

0

ベストアンサー

ブロックの内部で宣言した変数は、ブロックの中でしか使えません。
ブロックの外で使う変数は、ブロックの外で宣言してください。
もしくは、ブロックの外で宣言した変数へと値を移してください。

なお、現在の状態だと、ansは一つのデータしか入りませんので、記録されているのは、
最後に入力した値だけになります。
5つのデータを入力したい場合には、ansも配列にして複数の値を扱えるようにする必要があります。

ansも配列にする必要があること、理解できました。

for文を使わずに地道に5つの計算をさせてみます。

forを使うことは問題ありません。むしろ配列とforは相性が良いですし。
(とりあえず、forを作る前の下準備の練習として一度展開してみるってのはありですが)

forを使う場合、ansはどのように扱えばよいのでしょうか。

forを使うかどうかにはあまり関係がありません。

変数にはスコープという寿命があるため、ブロックの中で宣言した変数は、ブロックの中でしか使えません。
これは、使った変数が想定外の場所に悪影響を与えるのを防止するために、変数の影響範囲を抑えるための機能です。

逆に言えば、変数は使いたい位置で使えるスコープが確保できるように宣言を行います。

たとえば、以下のように書けば、変数xのスコープはブロックの中だけですので、その外で使おうとすればエラーになります。

{ int x = 3; } print(x); //エラー

なので、以下のように、ブロックの外で変数xを宣言することで、変数xのスコープはブロックの外になるので、
ブロックの外でも使うことができるようになります。

int x; { x = 3; } print(x);

もう一つ余談ですが、
Math.random()は、0以上1未満(0は含む、1は含まない)の乱数を返すメソッドですので、
(int)(Math.random() * 99)とした場合、0以上99未満(99は含まない)の整数になりますので、
結果は、098になります。

投稿2020/09/02 09:12

編集2020/09/02 09:50
amiya

総合スコア1218

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

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

KeitaK

2020/09/02 09:23

ansも配列にする必要があること、理解できました。 for文を使わずに地道に5つの計算をさせてみます。
KeitaK

2020/09/02 09:33

forを使う場合、ansはどのように扱えばよいのでしょうか。 いろいろと質問してしまい、申し訳ございません。
KeitaK

2020/09/02 09:37

forを使わずに書いたら成功しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問