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

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

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

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

Q&A

解決済

2回答

2058閲覧

足し算した結果の出力

tettuu

総合スコア11

Java

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

0グッド

0クリップ

投稿2018/03/24 08:32

編集2018/03/25 08:03

Java

1 2コード 3```### 前提・実現したいこと 4 5TimeInput1クラスのif文で変数sumに入力した値を足す作業を行っているのですが、実行してみると、0が表示されてしまいます。足し算の結果を正しく表示させるためにはどこのコードを変更させる必要があるのでしょうか?   6回答よろしくお願いいたします。コードは3つのクラスで書いています。 7 8 9### 発生している問題・エラーメッセージ 10コンパイルは問題ないです。 11``` 12エラーメッセージ 13``` 14 15### 該当のソースコード 16```Java 17public class TimerRank{ 18 19 20 21 public static void main(String[] args){ 22 23 24 25 26 27 //System.out.println("時間を入力してください"); 28 29 TimeInput1 timeinput1 = new TimeInput1(); 30 31 timeinput1.roop(); 32 33 TimeExpress timeexpress = new TimeExpress(); 34 35 timeexpress.express(); 36 timeexpress.express1(); 37 timeexpress.express2(); 38 39 40} 41 42 43import java.util.Scanner; 44 45public class TimeInput1{ 46 47 String activity; 48 int time; 49 int sum = 0; 50 int sum1 = 0; 51 int sum2 =0; 52 53 public void setActivity(String activity){ 54 this.activity = activity; 55 } 56 public String getActivity(){ 57 return this.activity; 58 } 59 public void setTime(int time){ 60 this.time = time; 61 } 62 public int getTime(){ 63 return this.time; 64 } 65 public void setSum(int sum){ 66 this.sum = sum; 67 } 68 public int getSum(){ 69 return this.sum; 70 } 71 public void setSum1(int sum1){ 72 this.sum1 = sum1; 73 } 74 public int getSum1(){ 75 return this.sum1; 76 } 77 public void setSum2(int sum2){ 78 this.sum2 = sum2; 79 } 80 public int getSum2(){ 81 return this.sum2; 82 } 83 84 85 Scanner scanner = new Scanner(System.in); 86 public void roop(){ 87 for(int i = 0;i <= 100;i++){ 88 89 System.out.println("動作を入力してください"); 90 this.activity = scanner.next();//nextStringは間違い 91 System.out.println("時間を入力してください"); 92 this.time = scanner.nextInt(); 93 94 if(this.activity.equals("運動")){ 95 this.sum += this.time; 96 System.out.println(this.sum); 97 } 98 99 else if(this.activity.equals("料理")){ 100 this.sum1 += this.time; 101 } 102 else if(this.activity.equals("勉強")){ 103 this.sum2 += this.time; 104 } 105 else{ 106 break; 107 } //最後はelseだけ。文字列の条件はequals("")を使う。 108 109 } 110 } 111 112} 113 114 115public class TimeExpress{ 116 117 TimeInput1 timeinput1 = new TimeInput1(); 118 119 120 public void express(){ 121 System.out.println("運動は" + timeinput1.sum + "です"); 122 } 123 public void express1(){ 124 System.out.println("料理は" + timeinput1.sum1 + "です"); 125 } 126 public void express2(){ 127 System.out.println("勉強は" + timeinput1.sum2 + "です"); 128 } 129 130} 131``` 132```ここに言語名を入力 133JAVA 134``` 135 136### 試したこと 137if文の"運動"のところでsumを表示してみたところ、足し算は行われているようでした。 138問題はTimeExpressクラスで足し算の結果ではなく、初期値の0を表してることかと思いましたが、解決方法がわかりません。 139 140 141### 補足情報(FW/ツールのバージョンなど) 142 143Macのパソコンです。

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

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

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

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

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

guest

回答2

0

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

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

Java

1TimeExpress(TimeInput1 timeinput1) { 2 this.timeinput1 = timeinput1; 3}

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

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

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

投稿2018/03/24 08:40

編集2018/03/24 08:52
LouiS0616

総合スコア35660

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

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

KSwordOfHaste

2018/03/24 12:30

うーむ。これはいいですね!これ質問ページに出しておいてほしいですw
LouiS0616

2018/03/24 13:10

口頭で説明するのが案外面倒なので作ってみました。 こういうチュートリアルがあると良いんですけどねぇ。
KSwordOfHaste

2018/03/24 13:25

これまでさんざん閲覧者さんが「マークダウンを!」と言い続けていることから、運営さんに提案したら通りそうな気がします。
LouiS0616

2018/03/24 13:58

かもしれないですね。 意見をさっくり画面下のフォームから出してみます。
KSwordOfHaste

2018/03/24 14:04

自分も本Q&Aのような動画を検討してもらえないか提案いたしました。
katoy

2018/03/25 00:41

質問文を投稿するときに `` くくったものがなければ、 ”試しているソースコードがふくまれていないか、 コードブロックの表記になっていません" という警告をだして、コードブロックの記入方法の説明文へのリンクも表示する というようにすることはできると良い気がします。
tettuu

2018/03/25 07:12

ありがとうございます! 変数、メソッドの命名についてはこれから勉強していき、順次直していきます。また、コードの書き方についても、ご指摘いただきありがとうございます。次の質問からは読みやすいコードを心がけます。 出力に関してはとりあえず、Expressを廃止して、TimeInputにexpressメソッドを移動しました。Loui0616さんのご指摘の通りコンストラクタを用意したのですが、よくわからないエラーが出てしまい、そちらは自分で調べわからなかったら、また質問させていただきたく思います。 初めて、teratailを利用させていただきましたが、こんなに丁寧に答えてくれる人がいるならこれからも継続してJavaを学べそうだと思いました。ありがとうございます!!
KSwordOfHaste

2018/03/25 07:25 編集

to:質問者さん 一つの質問は質問者さんだけのものではなく多くの閲覧者の方が参考にしようとします。次の質問からといわず「本質問を編集してLouiS0616さんのコメントを参考に正しいマークダウンを付ける」ようにしてみてください。質問は、見やすくしたり不足している情報を追記きるよう「編集」できますので!
tettuu

2018/03/25 08:06

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

2018/03/25 08:45

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

2018/03/25 10:28

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

0

ベストアンサー

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 は次のような実装になるでしょう。

java

1public class TimeExpress{ 2 public static void express(TimeInput1 data) { 3 System.out.println("運動は" + data.sum + "です"); 4 }

 

  • C.

B の方法では [sum, sum1. sum2] と [運動, 料理、勉強] 関連付けが TimeInput1, TimeExpress の両方のクラスにあらわれてしまっています。
その為に "睡眠" という項目を追加しようとしたり, "運動"を "Exercise" に変更しようとすると、両方のクラスに変更がはいります。
こういった変更がしやすいように、クラス名や実装を変えてみた例を示します。

java

1import java.util.LinkedHashMap; 2import java.util.Map; 3import java.util.Scanner; 4import java.util.Set; 5 6public class TimeRecord { 7 public static void main(String[] args) { 8 Recorder recorder = new Recorder(); 9 recorder.records(); 10 11 Display display = new Display(); 12 recorder.getData().forEach((name, value) -> display.express(name, value)); 13 } 14} 15 16class Recorder { 17 @SuppressWarnings("serial") 18 Map<String, Integer> data = new LinkedHashMap<String, Integer>() { 19 { put("運動", 0); } 20 { put("料理", 0); } 21 { put("勉強", 0); } 22 }; 23 Set<String> names = data.keySet(); 24 25 public Map<String, Integer> getData() { 26 return data; // TODO: clone したものを返すように刷ること 27 } 28 29 public void records() { 30 try (Scanner scanner = new Scanner(System.in)) { 31 for (int i = 0; i <= 100; i++) { 32 System.out.println("動作を入力してください"); 33 String activity = scanner.next(); 34 if (names.contains(activity)) { 35 break; 36 } 37 38 System.out.println("時間を入力してください"); 39 int time = scanner.nextInt(); 40 41 data.put(activity, data.get(activity) + time); 42 } 43 } 44 } 45} 46 47class Display { 48 public void express(String name, Integer value) { 49 System.out.println("name " + value + "です"); 50 } 51}

投稿2018/03/24 21:59

katoy

総合スコア22324

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

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

tettuu

2018/03/25 07:56

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

2018/03/25 09:57

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

2018/03/25 10:38

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問