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

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

ただいまの
回答率

90.61%

  • Java

    13530questions

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

スコープについて(Java)

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 138

nagomi72

score 13

電卓の1部分をつくっています。
現在、23,36,39,56行目でシンボルが見つからないというエラーが発生しています。(エラー箇所に★をつけています)
スコープの問題と感じているのですが、例えば23行目、数字と判定したのちに配列であるw_expression_fieldに追加するにはどのようにすればいいのでしょうか。
上記、if文の外で宣言することで解決しました。
56行目のエラーに取り組みたいと思います。

ご教授のほどよろしくお願いいたします。

import java.io.*;
import java.util.*;

class Test {
int w_judge_count = 0; // 奇数回、偶数回の判定に使う

public static void main(String[] args) {
ArrayList<String> w_expression_field = new ArrayList<String>();

while (true) {

int w_judge_count = 0; // 奇数回、偶数回の判定に使う
boolean w_number_judge = true; // 数字かどうかの判定に使う
boolean w_operand_judge = true; // 演算子かどうかの判定
String w_changed_input_number = " ";
String w_changed_input_operand = " ";

if (w_judge_count % 2 == 0) { // 偶数回なら数字か判定
while (w_number_judge) { // 数字が入力されない限りループ
System.out.println("数字を入力してください");
BufferedReader w_input_number = new BufferedReader(new InputStreamReader(System.in));
w_changed_input_number = w_input_number.readLine();// 入力された文字の型をStringに変換

w_number_judge = isJudgeNumber(w_changed_input_number); // falseが返ってこれば抜けれる
}

}
w_expression_field.add(w_changed_input_number);// 入力された値を代入 

if (w_judge_count % 2 != 0) { // 奇数回なら演算子か判定 //else ifでいけるか要検討
while (w_operand_judge) {
System.out.println("演算子を入力してください");
BufferedReader w_input_operand = new BufferedReader(new InputStreamReader(System.in));
w_changed_input_operand = w_input_operand.readLine();// 入力された文字の型をStringに変換

w_operand_judge = isJudgeOperand(w_changed_input_operand); // falseが返ってこれば抜けれる
}
}
if (w_changed_input_operand.equals("=")) {
break;
}
w_expression_field.add(w_changed_input_operand);// 入力された値を代入 

}
// System.out.println("ループから抜け出しました");
}

public static boolean isJudgeNumber(String p_number) {
try {
Integer.parseInt(p_number);
return false;
} catch (NumberFormatException e) {
return true;
}
}

public static boolean isJudgeOperand(String p_operand) {
if (w_judge_count < 3 && p_operand.equals("=")) { // 最初に=を入力されないように ★
return true;
} else if (p_operand.equals("+") || p_operand.equals("-") || p_operand.equals("*") || p_operand.equals("/")) { // 演算子ならfalseを返し、ループを抜ける
return false;
} else {
return true;
}
}

}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/04/30 11:50

    コードが読みづらい。何をすべきかわかるよな?

    キャンセル

  • asahina1979

    2018/04/30 11:53

    スコープについてってわかってんじゃん答えは必要ないよね

    キャンセル

  • swordone

    2018/04/30 12:08 編集

    このままEclipseとかのIDEに突っ込めば答え出そうな

    キャンセル

回答 3

checkベストアンサー

+1

    int w_judge_count = 0; //奇数回、偶数回の判定に使う
    boolean w_number_judge = true; //数字かどうかの判定に使う
    boolean w_operand_judge = true; //演算子かどうかの判定に使う

    if(w_judge_count % 2 == 0){ //偶数回なら数字か判定
        while(w_number_judge){ //数字が入力されない限りループ
            System.out.println("数字を入力してください");
            BufferedReader w_input_number = new BufferedReader(new InputStreamReader(System.in));
            String w_changed_input_number = w_input_number.readLine();//入力された文字の型をStringに変換

            w_number_judge = isJudgeNumber(w_changed_input_number );  //falseが返ってこれば抜けれる
        }

    }
    w_expression_field.add(w_changed_input_number);//入力された値を代入 ★

逆に聞きますが、w_judge_countが奇数の場合はw_changed_input_numberは計算されないことになりますが、この場合はどうするつもりですか?
他のエラーに関しても似たような問題です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/30 12:53

    質問に対する回答になっているかは分かりかねますが...
    今回の電卓では乗算、除算を優先したいと考えています。
    入力された文字を計算せずに配列に保持し、=が入力されて
    始めて計算を始める処理にしようと考えています(漠然としたイメージでは*と/を配列から探し出し、その前後を計算。その後足し算引き算を計算)。

    そのため、現時点ではw_judge_countが奇数の場合でも、特に計算をする必要はないと考えております。

    キャンセル

  • 2018/04/30 12:57

    そうではなく、w_judge_countが奇数の場合、そもそもw_changed_input_numberという変数が登場しないまま★のコードにたどり着くんですよ。その場合コンピュータはその行で何をしたらいいんでしょうね?

    キャンセル

  • 2018/04/30 13:02

    適当にかいたらうごかなかったスコープが問題らしいけど直したくないっていってるような質問者に修正されたコードはつかないと思いますよ。
    原因がどこかレベルで止める回答(この解答)もその一つ

    キャンセル

  • 2018/04/30 13:25

    w_judge_countの宣言位置を変えることで解決しました。
    ご回答いただきましてありがとうございました。

    キャンセル

  • 2018/04/30 13:27

    原因がわかってるならもうちょっと考えろよって思いが半分、
    なぜエラーが出るのかコンパイラの気持ちになってみろよっていうのが半分

    キャンセル

+1

この手の問題はインデントが適切であればすぐ気が付くはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

w_judge_countをif文の中で宣言していたのを外側に配置することで22,36,39の問題解決。
isJudgeOperandを呼ぶときに引数でw_countを渡すことで56解決

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13530questions

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