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

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

ただいまの
回答率

90.45%

  • Java

    16202questions

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

  • Eclipse

    1968questions

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

  • プログラミング言語

    765questions

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

  • コンストラクタ

    32questions

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

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

解決済

回答 4

投稿 編集

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

learning_ci

score 15

前提・実現したいこと

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点の原因がわかりません。

該当のソースコード

public class Review0810 {

    private String name;                                //名前、誕生日、満腹度という変数をつくる
    private int birthday;
    private int manpukudo;

    Review0810(String name, int birthday){                //コンストラクタ

        this.name = name;
        this.birthday = birthday;
        this.manpukudo = 50;


    }




    public String getName() {                            //名前と誕生日と満腹度の各変数のゲッター
        return name;
    }


    public int getBirthday() {
        return birthday;
    }


    public int getManpukudo() {
        return manpukudo;
    }


    public boolean eat(){                                //eat()メソッド

        boolean result = false;

        if(this.manpukudo < 100){                        //満腹度が0より大きく100より小さくなるようにする。
            this.manpukudo += 50;

            if(this.manpukudo > 100){

                this.manpukudo = 100;

                result = true;

            }

        }

        return result;                                    //eat()メソッドで何かがなされればtrueを、何もしなかったらfalseを返すようにする


    }


public boolean run(){                                    //run()メソッド

        boolean result = false;

        if(this.manpukudo > 0){                        //満腹度が0より大きく100より小さくなるようにする。

            this.manpukudo -= 40;

            if(this.manpukudo < 0){

                this.manpukudo = 0;

                result = true;

            }

        }

        return result;                                    //run()メソッドで何かがなされればtrueを、何もしなかったらfalseを返すようにする

    }
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/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+1

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回条件判断するのが面倒なので、こうしたいですね。

public boolean eat() {
    if(manpukudo >= 100) {
        return false;
    }
    manpukudo = Math.min(manpukudo + 50, 100);  //manpukudoに50を加えた結果が100を超えたら100に設定される
    return true;
}

public boolean run() {
    if(manpukudo <= 0) {
        return false;
    }
    manpukudo = Math.max(manpukudo - 40, 0);  //manpukudoから40減じた結果が0以下になったら0に設定される
    return true;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/15 20:15

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

    キャンセル

0

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

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

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

50 + 50 = 100

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

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

意味的に

result = true;

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/15 20:15

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

    キャンセル

  • 2016/08/15 20:32

    Good luck!

    キャンセル

  • 2016/08/15 20:35

    失礼しました。
    間違えて別の方の回答にコメントしてしまいました。

    他意はありません(^-^;

    キャンセル

0

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

ご認識の通りです。

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

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

peter.eat(); // 1回目

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


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

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

boolean result = peter.eat(); // 1回目

if(result){
    System.out.println(peter.getName() + "は食事をとりました。");
}else{
    System.out.println(peter.getName() + "は満腹の為食べれませんでした。");
}


または、単に

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


とします。

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/15 20:15

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

    キャンセル

0

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

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Java

    16202questions

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

  • Eclipse

    1968questions

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

  • プログラミング言語

    765questions

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

  • コンストラクタ

    32questions

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

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