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

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

ただいまの
回答率

88.77%

足し算した結果の出力

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,127

tettuu

score 11

コード

 前提・実現したいこと

TimeInput1クラスのif文で変数sumに入力した値を足す作業を行っているのですが、実行してみると、0が表示されてしまいます。足し算の結果を正しく表示させるためにはどこのコードを変更させる必要があるのでしょうか?  
回答よろしくお願いいたします。コードは3つのクラスで書いています。

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

コンパイルは問題ないです。

エラーメッセージ

 該当のソースコード

public class TimerRank{



    public static void main(String[] args){





    //System.out.println("時間を入力してください");

    TimeInput1 timeinput1 = new TimeInput1();

        timeinput1.roop();

    TimeExpress timeexpress = new TimeExpress();

        timeexpress.express();
        timeexpress.express1();
        timeexpress.express2();


}    


import java.util.Scanner;

public class TimeInput1{

    String activity;
    int time;
    int sum = 0;
    int sum1 = 0;
    int sum2 =0;

    public void setActivity(String activity){
        this.activity = activity;
    }
    public String getActivity(){
        return this.activity;
    }
    public void setTime(int time){
        this.time = time;
    }
    public int getTime(){
        return this.time;
    }
    public void setSum(int sum){
        this.sum = sum;
    }
    public int getSum(){
        return this.sum;
    }
    public void setSum1(int sum1){
        this.sum1 = sum1;
    }
    public int getSum1(){
        return this.sum1;
    }
    public void setSum2(int sum2){
        this.sum2 = sum2;
    }
    public int getSum2(){
        return this.sum2;
    }


    Scanner scanner = new Scanner(System.in);
    public void roop(){
        for(int i = 0;i <= 100;i++){

            System.out.println("動作を入力してください");
                this.activity = scanner.next();//nextStringは間違い
            System.out.println("時間を入力してください");
                this.time = scanner.nextInt();

            if(this.activity.equals("運動")){
                this.sum += this.time;
                System.out.println(this.sum);
            }

            else if(this.activity.equals("料理")){
                this.sum1 += this.time;
            }
            else if(this.activity.equals("勉強")){
                this.sum2 += this.time;
            }
            else{
                break;
            } //最後はelseだけ。文字列の条件はequals("")を使う。

        }
    }

}


public class TimeExpress{

    TimeInput1 timeinput1 = new TimeInput1();


    public void express(){
        System.out.println("運動は" + timeinput1.sum + "です");
    }
    public void express1(){
        System.out.println("料理は" + timeinput1.sum1 + "です");
    }
    public void express2(){
        System.out.println("勉強は" + timeinput1.sum2 + "です");
    }

}    
JAVA

 試したこと

if文の"運動"のところでsumを表示してみたところ、足し算は行われているようでした。
問題はTimeExpressクラスで足し算の結果ではなく、初期値の0を表してることかと思いましたが、解決方法がわかりません。

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

Macのパソコンです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+9

mainメソッド内のtimeinput1と、TimeExpress内のtimeinput1が全く別物だからです。
名前が同じだからと言って、中身も同じになるわけではありません。

例えばTimeExpressに適切なコンストラクタを用意しておけば良いでしょう。

TimeExpress(TimeInput1 timeinput1) {
    this.timeinput1 = timeinput1;
}

また、変数やメソッドなどの命名があまりに適当なので、リネームしましょう。

質問のコードの書き方について

teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
コードブロックの適用GIF

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/25 17:06

    @KSwordOfHaste さん
    了解です!とりあえず、言われた通りコードを見やすくしました。他に何か編集した方がいい箇所があれば教えてください。

    キャンセル

  • 2018/03/25 17:45

    見違えるようにコードが見やすくなったと思います。細かいことを言えば「不必要な空行が散見される」ので適当に行を削除すると少しよくなるかな・・・ぐらいです。

    キャンセル

  • 2018/03/25 19:28

    @katoyさん @LouiS0616さん
    質問者の中にはテンプレートでマークダウンされた中の「ソースコード」という部分を書き換えるのではなく、マークダウンを閉じたその下にコードを書くということをする人が少なからずいまして…

    キャンセル

checkベストアンサー

+3

timeinput1.roop() 処理された計算結果が、TimeExpress には全然 渡っていないです。
つまり timeexpress は 初期値 0 で print 処理が行われることになります。

対処法:

  • A. TimeExpress は廃止して その機能は TimeInput1 に移動させる。
    Timeinput1 というクラス名は不適切になるので、なんか別の名前にすることも必要です。
    (現状でも、 Timeinput1 は、データ入力処理、集計処理の2つの機能を持っている...)
    expressSum(), expressSum2(), expressSum3()、expressAll() をつくるといいと思います。

  • B. 集計結果処理を TimeExpress クラスであつかうようにするなら、なんらかの方法で集計結果をわたすようにします。
    LouiS0616 さんの回答では、 TimeExpress を new するときに timeinput1 を渡しています。

別の案としては、 TimeExpress のメソッドに timeinput1 を渡すことが考えられます。
その場合、TimeExpress は次のような実装になるでしょう。

public class TimeExpress{
  public static void express(TimeInput1 data) {
    System.out.println("運動は" + data.sum + "です");
  }
  • C. 
    B の方法では [sum, sum1. sum2] と [運動, 料理、勉強] 関連付けが TimeInput1, TimeExpress の両方のクラスにあらわれてしまっています。
    その為に "睡眠" という項目を追加しようとしたり, "運動"を "Exercise" に変更しようとすると、両方のクラスに変更がはいります。
    こういった変更がしやすいように、クラス名や実装を変えてみた例を示します。
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class TimeRecord {
    public static void main(String[] args) {
        Recorder recorder = new Recorder();
        recorder.records();

        Display display = new Display();
        recorder.getData().forEach((name, value) -> display.express(name, value));
    }
}

class Recorder {
    @SuppressWarnings("serial")
    Map<String, Integer> data = new LinkedHashMap<String, Integer>() {
        { put("運動", 0); }
        { put("料理", 0); }
        { put("勉強", 0); }
    };
    Set<String> names = data.keySet();

    public Map<String, Integer> getData() {
        return data; // TODO: clone したものを返すように刷ること
    }

    public void records() {
        try (Scanner scanner = new Scanner(System.in)) {
            for (int i = 0; i <= 100; i++) {
                System.out.println("動作を入力してください");
                String activity = scanner.next();
                if (names.contains(activity)) {
                    break;
                }

                System.out.println("時間を入力してください");
                int time = scanner.nextInt();

                data.put(activity, data.get(activity) + time);
            }
        }
    }
}

class Display {
    public void express(String name, Integer value) {
        System.out.println("name " + value + "です");
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/25 16:56

    回答ありがとうございます!とりあえず、katoyさんに言われた通り、TimeExpressを廃止ということで解決しました。
    しかし、いずれは違うメソッドのフィールドを自由に呼び出せるようにしたいので、コンストラクタやkatoyさんが示してくれたCの方法を扱えるように勉強します。細かいところまで教えていただきありがとうございます。
    初めてteratailで質問したのですが、こんなに丁寧に教えてくれる人がいるとわかったので、これからも継続してJavaの勉強を続けられそうです。ありがとうございました。

    キャンセル

  • 2018/03/25 18:57

    @kaytoy
    度々の質問ですみません。
    プランBについての質問なのですが、dataは新しく定義したフィールドということでしょうか?
    data.sumとあるのでdataはクラスかと思ったのですが、いかがでしょうか?
    回答よろしくお願いいたします。

    キャンセル

  • 2018/03/25 19:38

    B 案での
    public static void express(TimeInput1 data)
    の data は TimeInput1 のインスタンスです。
    回答に書いた data.sum は data.,getSum() の間違いでした。
    main()からは
    TimeExpress.express(timeexpress);
    のように呼び出すことになります。

    キャンセル

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

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

関連した質問

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