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

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

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

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

Q&A

4回答

1427閲覧

この電卓のプログラムの処理内容を詳しく教えてください

kykun

総合スコア6

Java

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

0グッド

1クリップ

投稿2018/05/02 04:42

編集2018/05/09 08:03

この電卓のプログラムの処理内容を詳しく教えてください。
下記のプログラムで} else { if (is_enzan(str)) {部分から最後までの処理内容が分かりません。is_EnzanメソッドとparseEnzanメソッドの用途も分かりません。よろしくお願いします。
LuiS0616さん、回答ありがとうございます。編集させていただきました。
このプログラムは自分で作成したものでは無くググってると出てきたものです。
処理内容の理解を試みて
} else if ("演算子".equals(msg)) {
enzan = parseEnzan(str);
msg = "数値又は演算子";
の部分までは分かるのですが、次になぜ}else{が出てきて
その次にif~elseが出てきて
if (is_enzan(str)) {
enzan = parseEnzan(str);
} else {
num = Integer.parseInt(str);
}
msg = "数値又は演算子";
}
とコーディングしなければならないのか?が分かりません。

あとこのif ((str.length() != 1) || ("+-*/".indexOf(str) == -1))の処理内容が分かりません。教えて頂けませんか?

public class Dentaku { public static void main(String[] args) throws IOException{ int num = 0; String enzan = ""; String value = ""; String msg = "数値"; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true){ System.out.println("現在の値:" + num); System.out.println("演算子:" + enzan); System.out.println("入力された値:" + value); System.out.print(msg + "を入力してください >>"); String str = br.readLine(); System.out.println(""); if ("q".equals(str)) { break; // ループの終了 } try { if ("数値".equals(msg)) { num = Integer.parseInt(str); msg = "演算子"; } else if ("演算子".equals(msg)) { enzan = parseEnzan(str); msg = "数値又は演算子"; } else { if (is_enzan(str)) { enzan = parseEnzan(str); } else { num = Integer.parseInt(str); } msg = "数値又は演算子"; } } catch(Exception ex) { System.out.println("# ---- エラー: " + msg + "ではありません。\n"); } } } // str が演算子か否かをチェックする。 static boolean is_enzan(String str) { if ((str.length() != 1) || ("+-*/".indexOf(str) == -1)) { return false; } return true; } // 演算子を処理する。 // str が演算子でなければ、例外が発生する。 static String parseEnzan(String str) throws IllegalArgumentException { if (is_enzan(str) == false) { throw new IllegalArgumentException("演算子でありません。"); } return str; } }

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

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

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

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

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

LouiS0616

2018/05/02 04:44

is_enzanとparse_enzanについては、コメントが付いています。役割がわからない、というのがよくわかりません。
guest

回答4

0

} else { // このブロックに入った時点で、msgの内容は「数値又は演算子」 // なので、実際の入力内容が数値なのか演算子なのか不明 if (is_enzan(str)) { // 入力された内容が演算子の場合、「演算子の処理」を実行 enzan = parseEnzan(str); } else { // 入力された内容が演算子ではない(数値の)場合、 // 「入力文字列の数値化」を実行 num = Integer.parseInt(str); } msg = "数値又は演算子"; } } catch(Exception ex) { System.out.println("# ---- エラー: " + msg + "ではありません。\n"); } // ...で、「q」が入力されるまで延々ループするのだが、 // それ以外に特段処理はしていない。

投稿2018/05/02 05:23

tkturbo

総合スコア5572

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

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

0

このプログラムは自分で作成したものでは無くググってると出てきたものです。

これは。。。なかなか香ばしいコードですね。
もうちょっとまともな他のサンプルコードを当たった方がいいかもしれない。


このelseは、msgが数値又は演算子のときに通過する部分です。
とりあえず入力を受け付けておいて、演算子か数値かによって処理を変えているようです。

処理を追うときは、実際に使ってみるのが一番です。
今処理がどこを走っているのか意識しながら使ってみましょう。

追記を受けて

あとこのif ((str.length() != 1) || ("+-*/".indexOf(str) == -1))の処理内容が分かりません。教えて頂けませんか?

条件式を分けて考えてみればいいです。

  • str.length() != 1

文字通り。『文字列strのlengthが1ではない』という条件。

  • "+-*/".indexOf(str) == -1

strが、+-*/という文字列のどこに出現するかを調べています。
出現しない場合は-1が返されるので、『文字列strが+-*/に含まれない』という条件。

論理和は自分で調べましょう。

投稿2018/05/02 05:21

編集2018/05/02 07:49
LouiS0616

総合スコア35668

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

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

kykun

2018/05/02 05:39

デバッグを利用して確認していきます。ありがとうございました。
guest

0

普通電卓は、記号を入力した後に数字を入れる前に新たに記号を入力した場合、記号が上書きされます(後から押された記号が適用される)。それを再現しようとしているのではないでしょうか。
しかしこのコード、肝心の計算をどこでも行っていないんですよねぇ…

投稿2018/05/02 12:52

swordone

総合スコア20669

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

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

0

今回の場合は、mainメソッド内の

Java

1... 2 } else { 3 if (is_enzan(str)) { 4 enzan = parseEnzan(str); 5 } else { 6 num = Integer.parseInt(str); 7 } 8 msg = "数値又は演算子"; 9 } 10 } catch(Exception ex) { 11...

の "}catch(...){" 以前のelse内if文は不要です。

ですが、今回は msg に プログラムが”数値", "演算子"...みたいに指定します。

なので不要ですが、例えばまちがって書き換えてしましまった場合への対処だと思います。

今回は無くてもいいですが、可能性としてでしょうね。

投稿2018/05/02 05:16

BeatStar

総合スコア4962

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問