コード
前提・実現したいこと
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+9
mainメソッド内のtimeinput1
と、TimeExpress内のtimeinput1
が全く別物だからです。
名前が同じだからと言って、中身も同じになるわけではありません。
例えばTimeExpressに適切なコンストラクタを用意しておけば良いでしょう。
TimeExpress(TimeInput1 timeinput1) {
this.timeinput1 = timeinput1;
}
また、変数やメソッドなどの命名があまりに適当なので、リネームしましょう。
質問のコードの書き方について
teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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 + "です");
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/03/24 21:30
2018/03/24 22:10
こういうチュートリアルがあると良いんですけどねぇ。
2018/03/24 22:25
2018/03/24 22:58
意見をさっくり画面下のフォームから出してみます。
2018/03/24 23:04
2018/03/25 09:41
`` くくったものがなければ、
”試しているソースコードがふくまれていないか、 コードブロックの表記になっていません"
という警告をだして、コードブロックの記入方法の説明文へのリンクも表示する
というようにすることはできると良い気がします。
2018/03/25 13:36
良さげです。一定の効果がありそうですね。
---
一年以上前に同様の議論があったようですね。
https://teratail.com/questions/41441
2018/03/25 16:12
変数、メソッドの命名についてはこれから勉強していき、順次直していきます。また、コードの書き方についても、ご指摘いただきありがとうございます。次の質問からは読みやすいコードを心がけます。
出力に関してはとりあえず、Expressを廃止して、TimeInputにexpressメソッドを移動しました。Loui0616さんのご指摘の通りコンストラクタを用意したのですが、よくわからないエラーが出てしまい、そちらは自分で調べわからなかったら、また質問させていただきたく思います。
初めて、teratailを利用させていただきましたが、こんなに丁寧に答えてくれる人がいるならこれからも継続してJavaを学べそうだと思いました。ありがとうございます!!
2018/03/25 16:24 編集
一つの質問は質問者さんだけのものではなく多くの閲覧者の方が参考にしようとします。次の質問からといわず「本質問を編集してLouiS0616さんのコメントを参考に正しいマークダウンを付ける」ようにしてみてください。質問は、見やすくしたり不足している情報を追記きるよう「編集」できますので!
2018/03/25 17:06
了解です!とりあえず、言われた通りコードを見やすくしました。他に何か編集した方がいい箇所があれば教えてください。
2018/03/25 17:45
2018/03/25 19:28
質問者の中にはテンプレートでマークダウンされた中の「ソースコード」という部分を書き換えるのではなく、マークダウンを閉じたその下にコードを書くということをする人が少なからずいまして…