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

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

ただいまの
回答率

88.92%

Java 二次方程式を繰り返し解く

解決済

回答 2

投稿 編集

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

Elpa

score 1

プログラム初心者です。(学習歴:1か月)

前提・実現したいこと

Java (Eclipse)にて
キーボード入力で"finish"と入力されるまで繰り返し二次方程式を解くJavaプログラムを作成したいです。
別で作成してあるプログラムをメソッドしてメゾット呼び出しを活用したプログラムにしたいです。また、その際に配列を活用したいと考えています。

【具体的な実現したい流れ】

まず初めに(1)「Please Input:a,b,c」と表示させる。
(2)キーボードで数字を3つ入力する。例)1,-2,-3
※ここで「finish」と入力したら「Thanks you for using this system.」と表示させ、プログラムを終了させたいです。
※ここで数字以外を入力したら「Your Paramaters cannot understand.」と表示され、また(1)に戻るようにしたいです。
(3)そしたら入力した数字を表示させる。(例:「Line=1,-2,-3」と表示される。)
(ここで、1はa、-2はb、-3はcとし認識させたいです。)
(4)次に「x1=-1」「x2=3」と「Please Input:a,b,c」と表示させたいです。
(5)(2)~(4)を繰り返したいです。

イメージしている表示されてほしい内容

Plese Input:a,b,c
1,-2,-3 (←自分がキーボードで入力した文字 1回目)
Line=1,-2,-3
x1=-1.00
x2=3.00
Plese Input:a,b,c
hello(←自分がキーボードで入力した文字 2回目)
Your Paramaters cannot understand.
Plese Input:a,b,c
3,5,9 (←自分がキーボードで入力した文字 3回目)
There is no solution because the discriminant is negative. D="+d
Plese Input:a,b,c
finish (←自分がキーボードで入力した文字 4回目)
Thanks you for using this system.

発生している問題

キーボード入力した数字をa,b,cとして認識させたいです。。
どこにどのプログラムや式を入れ込めばいいのか見当がつきません。

今自分の中でわかっていること

・キーボードで入力した数字を順番にa,b,cと置きたいが、それの方法が分からない。
例)1,-2,-3とキーボードから入力したら、それぞれをa(=1),b(=-2),c(=3)として認識させたい。
・数字を入力した後、計算式のところに行ってくれるようにする方法が分からない。
・public static String getInput(){}に問題があることは認識しているのですが、全体的に意味不明になっており、どこから手を付ければいいかわからない状態です。

該当のソースコード

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class nijikannsuu {

    public static void main(String[] args) {
        String line = "";
        double a = 0, b = 0, c = 0;
        boolean terminate = false;
        while (true) {

            line = getInput();
            if (line.equals("finish")) {
                System.out.println("Thanks you for using this system.");
                return;
            } else {

            }
        }
    }

    public static String getInput() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        double a = 0, b = 0, c = 0, d = 0, x1 = 0, x2 = 0;
        String line = null;
        Scanner sc = new Scanner(System.in);
        System.out.println("Please Input: a,b,c");
        String q = "finish";
        try {
            line = reader.readLine();
            String[] abc = line.split(",");
            if (line.equals("finish")) {
                return "finish";
            } else
                a = Double.parseDouble(abc[0]);
            b = Double.parseDouble(abc[1]);
            c = Double.parseDouble(abc[2]);
            System.out.println("line=" + a + ", " + b + ", " + c);
        } catch (NumberFormatException | IOException e) {//
            System.out.println("Could you enter the number?");
            System.out.println("Your Paramaters cannot understand.");
        }
        if (a == 0) {
            x1 = x2 = (-c) / b;
        } else {
            if (d < 0) {
                d = b * b - 4 * a * c;
                System.out.println("There is no solution because the discriminant is negative. D=" + d);
            } else {
                x1 = (-b + Math.sqrt(d)) / (2 * a);
                x2 = (-b - Math.sqrt(d)) / (2 * a);
                System.out.println("x1=" + x1);
                System.out.println("x2=" + x2);
            }
        }
        return line;
    }
}

試したこと

public static String getInput(){ にある
System.out.println("Plese Input : a,b,c");まではできたのですが、
そこから先がいかず、いじっているうちにまったくわからなくなりました。

初心者で各要素の仕組みをしっかりと把握していない状態です。
どこのコードがおかしいといったことをご指示してくれるだけでも構いません。
一部分だけでも構いませんので、ご教授してくださると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • y_waiwai

    2020/07/07 22:36

    このままではコードが見づらいです。質問を編集し、<code>ボタンを押し、出てきた’’’の枠の中にコードを貼り付けてください

    キャンセル

  • Elpa

    2020/07/07 22:53

    大変失礼いたしました。こちらでよろしいでしょうか?

    キャンセル

  • swordone

    2020/07/07 23:25

    エラーメッセージはそれで全部ですか?

    キャンセル

  • Elpa

    2020/07/07 23:34

    エラーメッセージ 抜けていた部分がありました
    solveEq(a,b,c);は必要あるのかも自分ではわからないです。

    キャンセル

回答 2

checkベストアンサー

+1

ublic static String getInput(){}に問題があることは認識しているのですが、全体的に意味不明になっており、どこから手を付ければいいかわからない状態です。

まずは、インデントをそろえるのが良いと思います。
文法的に波カッコが正しく一致しているか確認してみては?

try以降のforあたりから、おかしいですよね?

--
追記

eclipseに「}を入れて終了させてください」と言われたので、その通りにしました。

足りないからつけたすものでなく、自分の考えた通りの位置にカッコをつけてください。
なので、構造をわかりやすくするためにインデントが重要になります。

インデントはこちらでよろしいでしょうか?

インデントをそろえてるというのは波カッコの位置をそろえて、波カッコの中をタブ1個分(4とか8個の空白)ずらして、波カッコで囲われた範囲をすぐに判断できるようにします。

なので

    }        
    }


とか

}}

みたいなコードが出てきたらおかしいと思ってよいです。

eclipseを使っているなら、[ソース]-[フォーマット] (Ctrl+Shift+F)するとこんな感じになります。

public static String getInput() {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    double a = 0, b = 0, c = 0, d = 0, x1 = 0, x2 = 0;
    String line = null;
    Scanner sc = new Scanner(System.in);
    System.out.println("Please Input: a,b,c");
    try {
        for (int i = 0; i < 3; i++) {
            line = reader.readLine();//ここでキーボード入力を行えるようにする?
            System.out.println("line=" + a + ", " + b + ", " + c);//上で入力した数字をa,b,cとして認識させたい。
        }
    } catch (NumberFormatException | IOException e) {
        System.out.println("Could you enter the number?");
        System.out.println("Please try again!");
    }
    if (a == 0) {
        x1 = x2 = (-c) / b;
    } else {
        if (d < 0) {
            d = b * b - 4 * a * c;
            System.out.println("There is no solution because the discriminant is negative. D=" + d);
        } else {
            x1 = (-b + Math.sqrt(d)) / (2 * a);
            x2 = (-b - Math.sqrt(d)) / (2 * a);
            System.out.println("x1=" + x1);
            System.out.println("x2=" + x2);
        }
    }
    return line;
}

forループでNuberFormatExceptionが発生したときに再入力をさせたいのだろうと
インデントをずらしている?のかもしれませんが、実際にはループの外側に抜けちゃうのが、わかると思います。

想いでなく、文法に沿ってインデントを確認すると、構造がおかしいことに気づくはずです。
※繰り返しですが、eclipseにはフォーマット機能あるので、それ使う方が楽です。

try {
        for (int i = 0; i < 3; i++) {
            line = reader.readLine();//ここでキーボード入力を行えるようにする?
            System.out.println("line=" + a + ", " + b + ", " + c);//上で入力した数字をa,b,cとして認識させたい。
        }
    } catch (NumberFormatException | IOException e) {
// ここに来た場合、for文の外側なので try again と表示するだけで、次の処理へいく
        System.out.println("Could you enter the number?");
        System.out.println("Please try again!");
    }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/11 06:05

    momon-ga様 ご返信が遅くなってしまい申し訳ございません。if文を用いればよかったのですね。ありがとうございます。
    13行目の line=getInput();で受け取りたい値は
    1、自然数
    2、finish です。

    キャンセル

  • 2020/07/11 06:37

    finishはStringなので"finish"になると思いますが、自然数は、Stringとして
    どんな感じで受け取るのですか?
    "1,-2,-3"みたいな感じですか?

    キャンセル

  • 2020/07/11 11:58

    (早速のお返事感謝しております)おっしゃる通り、1,-2,3の数を受け取りたいと考えております。

    キャンセル

0

    メソッド solveEq(double, double, double) は型 nijikannsuu で未定義です

書いてあることそのままのエラーです。
この関数が定義されてません。

あと、コードのインデントが全くなされていません。
これではエラーチェックもしづらいですし、なによりコードが読みづらいです
適切にインデントするように書き直しましょう

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/07 23:49

    ひとまず関数を消去いたしました。そしたらエラーコードで
    Exception in thread "main" java.lang.Error: Unresolved compilation problem:

    at nijikannsuu.main(nijikannsuu.java:7)
    と出ました。
    public static void main(String[] args) の方を修正する必要があるということで間違いないでしょうか?

    キャンセル

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

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

関連した質問

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