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

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

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

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

4回答

2290閲覧

あるメソッドが実行されるにしたがって変数が更新されるプログラム。変数の結果が意図したプログラムと食い違ってしまします。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2016/08/15 10:14

編集2016/08/15 10:23

###前提・実現したいこと
eclipseを使ってjavaのプログラムを書いています。

eat()メソッドとrun()メソッドをつくり、それぞれ実行されるたびにint型の変数manpukudo(満腹度)が増減するプログラムを書いています。

eat()メソッドとrun()メソッドが繰り返されてもmanpukudoが0から100におさまるように、メソッド内に仕掛けもつけました。たとえば、manpukudoが100の時点でeat()メソッドを呼び出すと「(名前)は満腹のため食べられませんでした。」という文が表示されることを目指しました。

ちなみに
http://nobuo-create.net/java-beginner-24/
このページを勉強していて自分で書いたものです。

###発生している問題・エラーメッセージ
manpukudoの初期値は50にしており、これは0より大きく100より小さいので、eat()メソッドが実行され「(名前)は食事をとりました。」という文がでるはずです。しかし実行結果は

Peterは満腹の為食べれませんでした。 Peterは空腹の為走れませんでした。 Peterの満腹度は60です。

こうなりました。

①eat()メソッド1回実行後のmanpukudoは100になるはずであること。
②eat()メソッドが実行されて「Peterは食事をとりました。」という文が出るはずなのにそうなっていないこと。
③run()メソッドは実行されていないのに2行目の文章がでていること。

以上3点の原因がわかりません。

###該当のソースコード

java

1public class Review0810 { 2 3 private String name; //名前、誕生日、満腹度という変数をつくる 4 private int birthday; 5 private int manpukudo; 6 7 Review0810(String name, int birthday){ //コンストラクタ 8 9 this.name = name; 10 this.birthday = birthday; 11 this.manpukudo = 50; 12 13 14 } 15 16 17 18 19 public String getName() { //名前と誕生日と満腹度の各変数のゲッター 20 return name; 21 } 22 23 24 public int getBirthday() { 25 return birthday; 26 } 27 28 29 public int getManpukudo() { 30 return manpukudo; 31 } 32 33 34 public boolean eat(){ //eat()メソッド 35 36 boolean result = false; 37 38 if(this.manpukudo < 100){ //満腹度が0より大きく100より小さくなるようにする。 39 this.manpukudo += 50; 40 41 if(this.manpukudo > 100){ 42 43 this.manpukudo = 100; 44 45 result = true; 46 47 } 48 49 } 50 51 return result; //eat()メソッドで何かがなされればtrueを、何もしなかったらfalseを返すようにする 52 53 54 } 55 56 57public boolean run(){ //run()メソッド 58 59 boolean result = false; 60 61 if(this.manpukudo > 0){ //満腹度が0より大きく100より小さくなるようにする。 62 63 this.manpukudo -= 40; 64 65 if(this.manpukudo < 0){ 66 67 this.manpukudo = 0; 68 69 result = true; 70 71 } 72 73 } 74 75 return result; //run()メソッドで何かがなされればtrueを、何もしなかったらfalseを返すようにする 76 77 } 78
public class DoIt0810 { public static void main(String[] args) { Review0810 peter = new Review0810("Peter", 160810); //コンストラクタに引数をわたす peter.eat(); //eat()メソッドを呼ぶ if(peter.eat()){ //eat()メソッドの実行内容によって表示文が変わるようにする System.out.println(peter.getName() + "は食事をとりました。"); }else{ System.out.println(peter.getName() + "は満腹の為食べれませんでした。"); } if(peter.run()){ //run()メソッドの実行内容によって表示文が変わるようにする System.out.println(peter.getName() + "は走りました。"); }else{ System.out.println(peter.getName() + "は空腹の為走れませんでした。"); } System.out.println("Peterの満腹度は" + peter.getManpukudo()+ "です。");

###試したこと

コードがきちんと保存されているか確かめました。
保存はできていました。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答4

0

ベストアンサー

manpukudoは最初50で、その次、ifの前のeatでmanpukudoは100になります。
その状態でifの中で再びeatが実行されます。manpukudoは100なのでifに入れず、falseを返します。

③run()メソッドは実行されていないのに2行目の文章がでていること。

if文の中で実行されています。で、このeatおよびrun双方に穴があります。
どちらも、2つ目の条件を満たさなければ(eatの場合、満腹度を増加させた結果が100を超えなかった場合、runの場合、満腹度を減少させた結果が0未満にならなかった場合)、trueを返すことはありません。
本来であれば、満腹度を操作した時点、つまり1つ目のifに入った時点でtrueに切り替えるべき場面です。

なお、私なら2回条件判断するのが面倒なので、こうしたいですね。

java

1public boolean eat() { 2 if(manpukudo >= 100) { 3 return false; 4 } 5 manpukudo = Math.min(manpukudo + 50, 100); //manpukudoに50を加えた結果が100を超えたら100に設定される 6 return true; 7} 8 9public boolean run() { 10 if(manpukudo <= 0) { 11 return false; 12 } 13 manpukudo = Math.max(manpukudo - 40, 0); //manpukudoから40減じた結果が0以下になったら0に設定される 14 return true; 15}

投稿2016/08/15 10:37

swordone

総合スコア20649

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

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

退会済みユーザー

退会済みユーザー

2016/08/15 11:15

ありがとうございます! さらに合理的にする書き方も紹介してくださり勉強になりました。
guest

0

eat() メソッドの実行結果を確認してください。

manpukudo > 100のときに true を返していますが、peter.eat() の実行結果が期待するのは、trueのときは食事ができた状態です。

eat() メソッドの結果と、runメソッドの結果で返しているtrue/falseが逆ではないでしょうか。

他にもDoIt0810のmain()メソッドの2つ目の処理で、余分にpeter.eat()を実行してはいないでしょうか。

投稿2016/08/15 11:35

A-pZ

総合スコア12011

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

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

0

①eat()メソッド1回実行後のmanpukudoは100になるはずであること。

ご認識の通りです。

②eat()メソッドが実行されて「Peterは食事をとりました。」という文が出るはずなのにそうなっていないこと。

以下の通り、eat()メソッドを2回 実行しているためです。

java

1peter.eat(); // 1回目 2 3if(peter.eat()){ // 2回目 4 System.out.println(peter.getName() + "は食事をとりました。"); 5}else{ 6 System.out.println(peter.getName() + "は満腹の為食べれませんでした。"); 7}

if(...)の中に書いた場合であっても、メソッドは実行されます。

1回目の eat()メソッドの実行結果で if文を分岐させたい場合、以下のように書く必要があります。

java

1boolean result = peter.eat(); // 1回目 2 3if(result){ 4 System.out.println(peter.getName() + "は食事をとりました。"); 5}else{ 6 System.out.println(peter.getName() + "は満腹の為食べれませんでした。"); 7}

または、単に

java

1if(peter.eat()){ // 1回目 2 System.out.println(peter.getName() + "は食事をとりました。"); 3}else{ 4 System.out.println(peter.getName() + "は満腹の為食べれませんでした。"); 5}

とします。

③run()メソッドは実行されていないのに2行目の文章がでていること。

②と同様、if(...)の中で run()メソッドを実行しています。

投稿2016/08/15 10:40

編集2016/08/15 10:43
KiyoshiMotoki

総合スコア4791

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

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

退会済みユーザー

退会済みユーザー

2016/08/15 11:15

丁寧なご回答ありがとうございます! 解決いたしました。
guest

0

ソースコードすべては読んでいませんが、

コンストラクタで 満腹度 = 50 と設定してあり、

一回目のeatメソッド呼び出しで +50 されています。

50 + 50 = 100

なので、100となっています。

で、eatメソッドの 二つ目のif文で 満腹度が100オーバーなら 100 にする。っていう部分でtrue になっています。

意味的に

result = true;

二回目のif文の外側にあるのが普通では?

投稿2016/08/15 10:25

BeatStar

総合スコア4958

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

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

退会済みユーザー

退会済みユーザー

2016/08/15 11:15

丁寧なご回答ありがとうございます! 解決いたしました。
KiyoshiMotoki

2016/08/15 11:35

失礼しました。 間違えて別の方の回答にコメントしてしまいました。 他意はありません(^-^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問