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

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

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

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

Q&A

解決済

1回答

2134閲覧

Progateの課題:Java(booleanで真偽値を求め出力)に関してエラーが消えない

Assun

総合スコア6

Java

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

0グッド

0クリップ

投稿2021/09/04 03:20

Progate(プログラミング学習サイト)の課題

プロゲートのJavaの課題で、「答え(模範回答例)」とクラス分けているかいないか以外変わらないにも関わらず、エラーが出てしまいます。
出力したいのは、booleanメソッドでbmiが18.5以上25.0未満の時「健康です」、それ以外は「健康ではありません」という文で、ここまでのbmiの値を出力するところまでは前回の課題でクリアしているので正しいと思われます。

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

Main.java:39 error:
Symbol
if (isHealthy(bmi)){
symbol: variable bmi
location: class Main
1 error

エラーメッセージ

### 該当のソースコード (39行目)  if (isHealthy(bmi)) {     System.out.println("健康です");     } else {     System.out.println("健康ではありません");      }      } ・・・ //ちなみに、以下が定義したisHealthyメソッド(booleanを使用) public static boolean isHealthy(double bmi){ return bmi>=18.5 && bmi<25.0; } //以下が全体のコード(長くて見にくかったらすみません) import java.util.Scanner; import java.lang.Math; class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("名前:"); System.out.println("名字:"); System.out.println("年齢:"); System.out.println("身長(m):"); System.out .println("体重(kg):"); String firstName= scanner.next(); String lastName= scanner.next(); int age=scanner.nextInt(); double height= scanner.nextDouble(); double weight= scanner.nextDouble(); printData(firstName, lastName, age, height, weight); } public static double bmi(Double height, double weight){ return weight/height/height; } public static void printData(String firstName, String lastName, int age, Double height, Double weight){ System.out.println("名前は"+ fullName(firstName, lastName) +"です"); System.out.println("年齢は"+ age + "歳です"); if(age>=20){ System.out.println("成年者です"); }else{ System.out.println("未成年者です"); } System.out.println("身長は"+ height +"mです"); System.out.println("体重は"+ weight + "kgです"); System.out.println("BMIは"+ Math.round(bmi(height, weight)) + "です"); if (isHealthy(bmi)) { System.out.println("健康です"); } else { System.out.println("健康ではありません"); } } public static String fullName(String firstName, String lastName){ return firstName + " " + lastName; } public static boolean isHealthy(double bmi){ return bmi>=18.5 && bmi<25.0; } } 言語名 Java ソースコード

試したこと

模範解答はmainメソッド以外のメソッドを別クラスに分けて書いているくらいで
ほぼコード自体は同じになっています。しかし、どうしても39行目にエラーが出てしまい、その理由がわかりません。ちなみに、クラスを分けないとクリアにならない等の指定はこの課題ではないので、それは理由ではないと考えられます。

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

Progateの課題 「Java道場コースI 8.論理演算子を使おう」

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

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

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

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

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

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

Daregada

2021/09/04 03:36 編集

main関数内で「bmi」は変数名、関数名どちらだと思ってますか?
Assun

2021/09/04 03:41

変数名だと捉えています!
Assun

2021/09/04 03:42

メソッドと変数両方で同じbmiを使用しているのでややこしいと思うのですが、課題上でこのように指定されているんです..
Daregada

2021/09/04 03:48 編集

おっとごめん。「(main関数ではなく)実際のエラーが起こっているprintData関数で、bmiは変数名、関数名どちらだと思ってますか?」と聞きたかった。 もし、bmiが変数名だと思っているのであれば、その変数を宣言(準備)しているのはどこですか? ついでに、bmiに値を代入しているのはどこですか?
m.ts10806

2021/09/04 03:51

mainメソッド内にメソッドが定義してるように見えますが、これは?
Assun

2021/09/04 03:54

printData関数内では、Math.round(bmi(height, weight))のbmiは関数で、isHealthy(bmi)のbmiは変数だと思っています 確かに..!bmiの変数の宣言が抜けていました!!これが39行目がエラーになる原因ですかね? だとしたら前回bmiの数値を出力する課題まではbmiを関数としてしか(printData関数)で呼び出していないから、その時はまだbmiの変数の宣言がなくてもクリア(エラー無し)したということなんでしょうか。
Assun

2021/09/04 04:01

▶︎Daregadaさん ありがとうございます! double bmi = bmi(height, weight); //bmi変数の宣言 をprintData関数内に書いたらエラーが消えました!泣
Daregada

2021/09/04 04:08

回答にまとめます。
m.ts10806

2021/09/04 04:36

質問は編集できますので。
guest

回答1

0

ベストアンサー

メソッドprintDataの処理では、メソッドisHealthyで判定を行なう都合上、メソッドbmiで計算したBMIの値を表示するだけ(で捨ててしまうの)ではなく、何らか変数に保存する必要があります。

どうやら、変数名bmiを使うことが指定されているようなので、値の表示や判定の前に、変数の宣言とメソッドbmiの返り値を代入する処理を入れます。

Java

1 double bmi = bmi(height, weight); 2 System.out.println("BMIは"+ Math.round(bmi) + "です"); 3 4 if (isHealthy(bmi)) { 5 System.out.println("健康です"); 6 } else { 7 System.out.println("健康ではありません"); 8 }

ところで、実際の問題を見ていないので変更していいのかどうか不明ですが、mainの入力処理では、

Java

1 System.out.print("名前:"); 2 String firstName = scanner.next();

のように、入力案内の表示を改行しないようにprintで行ない、直後に対応するscanner.nextの処理を書いたほうが、使う人にわかりやすいのでは。

投稿2021/09/04 04:18

Daregada

総合スコア11990

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

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

Assun

2021/09/04 04:30

回答ありがとうございました! 改行に関してなんですが、最初おっしゃる通り(課題内での指定もそうでした)printで書いていたものの、コンソールに入力する際右に横並びで表示されてしまいとても見にくかったんです汗。それでやむなくprintlnに書き直すことにいたしました。 例) 名前: 年齢: ... のように下に下に改行されている方が見やすいと個人的には思ったのですが、プロゲートはeclipseのようにPCの画面を左右に分割して入力画面とコンソールを配置しているのでどうしても上下の縦長(幅狭)に情報をそれぞれ表示しなければならないからそう感じたのかもしれません..
Daregada

2021/09/04 04:36

printlnにするかprintにするかは好みで選べばいいのですが、scanner.nextは案内表示直後に行なわないと、使う人が複数行の表示を上から一つずつ見ながら、対応する値の順番を間違えないように入力する、という苦行を強いられます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問