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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

5回答

2187閲覧

java クラス型変数のfor文による加算

nanimowakaranai

総合スコア20

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/04/15 05:07

編集2019/04/15 06:12

インスタンスをfor文で足していく

javaの クラス型同士の繰り返し処理による演算について
インスタンスのフィールド中の配列を足していって合計を表示するプログラムを書いているのですが
同じ型同士のインスタンスを繰り返し処理でsum=sum+w.add(w);とかくとこの部分にエラーが出てしまいます。普通の変数ならこのようなやり方でも対丈夫なのですがクラス型の場合はどのようにすればよいのでしょうか。以下、ソースコードになります

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

エラーメッセージ

該当のソースコード

java

1public class Test{ 2 class MyWeight{ 3 private int ton; 4 private int kgram; 5 private int gram; 6 7 8 public void setWeight(int t,int kg,int gr) { 9 ton = t + ((kg + (gr/1000)) /1000) ; 10 kgram = (kg + gr/1000) % 1000; 11 gram = gr % 1000; 12 13 } 14 public int getT() { 15 return ton; 16 } 17 public int getKG() { 18 return kgram; 19 } 20 public int getG(){ 21 return gram; 22 } 23 public MyWeight add(MyWeight x) { 24 int t = 0,kg = 0,gr = 0; 25 t = t+ x.getT(); 26 kg = kg + x.getKG(); 27 gr = gr+ x.getG(); 28 MyWeight y = new MyWeight(); 29 y.setWeight( t, kg, gr); 30 return y; 31 32 } 33 34 public void main(String args[]) { 35 int tonn[] = { 20, 30, 10, 20, 20 }; 36 int kgr[] = { 250, 780, 190, 360, 450 }; 37 int gramu[] = { 310, 400, 960, 210, 730 }; 38 39 MyWeight w=new MyWeight(); 40 MyWeight sum; 41 42 for(int i=0;i<4;i++) { 43 w.setWeight(tonn[i],kgr[i],gramu[i]); 44 sum = sum + w.add(w); 45 } 46 System.out.println("合計は"+sum.getT()+"トン"+sum.getKG()+"キログラム"+sum.getG()+"です"); 47 } 48 } 49}

よろしくお願いいたします。
追記

java

1 2 public class MyWeight{ 3 private int ton; 4 private int kgram; 5 private int gram; 6 7 8 public void setWeight(int t,int kg,int gr) { 9 ton = t + ((kg + (gr/1000)) /1000) ; 10 kgram = (kg + gr/1000) % 1000; 11 gram = gr % 1000; 12 13 } 14 public int getT() { 15 return ton; 16 } 17 public int getKG() { 18 return kgram; 19 } 20 public int getG(){ 21 return gram; 22 } 23 public MyWeight add(MyWeight x) { 24 int t = 0,kg = 0,gr = 0; 25 t = t+ x.getT(); 26 kg = kg + x.getKG(); 27 gr = gr+ x.getG(); 28 MyWeight y = new MyWeight(); 29 y.setWeight( t, kg, gr); 30 return y; 31 32 } 33 34 35 public static void main(String args[]) { 36 int tonn[] = { 20, 30, 10, 20, 20 }; 37 int kgr[] = { 250, 780, 190, 360, 450 }; 38 int gramu[] = { 310, 400, 960, 210, 730 }; 39 40 MyWeight w=new MyWeight(); 41 MyWeight sum = new MyWeight(); 42 43 for(int i=0;i<5;i++) { 44 w.setWeight(tonn[i],kgr[i],gramu[i]); 45 sum.setWeight(tonn[i],kgr[i],gramu[i]); 46 sum = sum.add(w); 47 48 } 49 System.out.println("sum"+sum.getT()+"t"+sum.getKG()+"kg"+sum.getG()+"g"); 50 } 51 }

*すみません、下の方のクラスが見つからなかった問題は解決しました。

回答を参考に以上のように修正してみたのですが、[4]番目の配列しか表示されませんでした.すべてのすべての配列を合計したのを表示したいのですがよくわかりません。

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

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

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

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

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

guest

回答5

0

ベストアンサー

  • など演算子の挙動を上書きすることを演算子オーバーロードと呼びますが、Javaではできないです。

どうしてもやりたいなら sum = sum.add(w); で加算できるようにコードを組んでください。

回答を参考に以上のように修正してみたのですが、[4]番目の配列しか表示されませんでした.すべてのすべての配列を合計したのを表示したいのですがよくわかりません。

MyWeight#addの実装が間違っています。
どのような計算をしているのか、じっくり点検してみてください。

**ヒント: ** 0 + a = a

#####その他気になること

  • setWeightメソッドは無い方が良い。コンストラクタを有効活用してください。
  • gramとkgramとtonを同じインスタンスに入れるのは意味が分からないです。

グラム量で一元管理して、必要なときだけ単位を換算すれば良い。

  • オブジェクトwを使いまわさない。一時オブジェクトで良いならforブロック内で生成する。
  • 文字列化したいなら、Object#toStringメソッドをオーバーライドする必要がある。

あるいは sum.getAsTon() などとして数量を獲得する。

追記

解決したようなので、解いてみた。

Java

1class Weight { 2 private final int gram; 3 4 Weight(int ton, int kiloGram, int gram) { 5 this(1_000_000 * ton + 1_000 * kiloGram + gram); 6 } 7 Weight(int gram) { 8 this.gram = gram; 9 } 10 11 Weight add(Weight other) { 12 return new Weight(this.gram + other.gram); 13 } 14 15 @Override 16 public String toString() { 17 int gram = this.gram; 18 19 int ton = gram / 1_000_000; 20 gram %= 1_000_000; 21 22 int kiloGram = gram / 1_000; 23 gram %= 1_000; 24 25 return String.format("%dt %dkg %dg", ton, kiloGram, gram); 26 } 27} 28 29class Main { 30 public static void main(String args[]) { 31 int[] tons = { 20, 30, 10, 20, 20}; 32 int[] kiloGrams = {250, 780, 190, 360, 450}; 33 int[] grams = {310, 400, 960, 210, 730}; 34 35 int len = tons.length; 36 assert( 37 len == kiloGrams.length 38 && len == grams.length 39 ); 40 41 var total = new Weight(0); 42 for(int i = 0; i < len; ++i) { 43 total = total.add( 44 new Weight(tons[i], kiloGrams[i], grams[i]) 45 ); 46 } 47 48 System.out.println(total); 49 } 50}

実行結果 Wandbox

102t 32kg 610g

投稿2019/04/15 05:23

編集2019/04/15 07:29
LouiS0616

総合スコア35660

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

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

nanimowakaranai

2019/04/15 05:39

返答ありがとうございます。このMyWeightクラスの中身の殆どは大学の講義資料の引用なのでそこまで考えが及びませんでした。確認してみます。
nanimowakaranai

2019/04/15 06:34

ありがとうございます!おかげさまでできました!
guest

0

javaにはC++のようなoperatorが存在しない為、オリジナルクラスで演算式を追加する事は出来ません。
あとjavaでも静的関数の作り方忘れたので調べておいて下さい。

静的関数で**MyWeight add(MyWeight x,MyWeight y)**のような関数を作って中の変数を足し算するしかありません。

投稿2019/04/15 05:22

編集2019/04/15 05:24
stdio

総合スコア3307

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

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

0

java

1System.out.println("合計は"+sum+"トンです");

と書かれていることからトンを求めているのですよね。
したらsumMyWeight型ではなくintで宣言してください。

すると次はここが破綻します。

java

1sum = sum + w.add(w);

なぜか?MyWeightクラスのaddメソッドの戻り値はMyWeightだからです。

ここで考えてみてください。
トンの合計を求めているのですから、wから欲しいのはMyWeightではなく、**wが持つ重さ(ton)**だと思いませんか?
ちなみにtonint型です。

ではwからtonを取得する処理を作る必要があります。
ですが心配しないでください。あなたはもう既にその処理を作っています
それはgetTメソッドです。

getTメソッドとsumを合計した値を返してあげればキロの合計が求まるはずです。

Java

1sum = sum + w.getT();

追記

内容を履き違えていました。

インスタンス同士を+で足すなどの実装はJavaでは出来ないと思います。
手としてAddメソッドのようにMyWeightが持つtonkgramgramに対して内部で足してあげることに尽きるかと。

forの中でsum = sum.Add(w);を読んでsumのgetterメソッドを出力してください。

余談:
Addメソッドの中で新しいインスタンス(y)を作っていますが、作らないでも実装できます。
作らない方が余計なメモリを食わずに済みますので、そこは課題として考えてみてください。

投稿2019/04/15 05:18

編集2019/04/15 05:42
BluOxy

総合スコア2663

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

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

nanimowakaranai

2019/04/15 05:30

すいません。最期の文章編集したのでよろしければ見てください System.out.println("合計は"+sum.getT()+"トン"+sum.getKG()+"キログラム"+sum.getG()+"です"); 配列の中身を合計してすべてを出力したいのです。表記ミスをしてしまってすいません }
BluOxy

2019/04/15 05:32 編集

エラーを解決したいのが主旨かと内容を履き違えていました。すみません。あとで追記します。
guest

0

質問を参考に以下のようにしたらできました!みなさんありがとうございました!

java

1 public class MyWeight { 2 private int ton; 3 private int kgram; 4 private int gram; 5 6 7 public void setWeight(int t,int kg,int gr) { 8 ton = t + ((kg + (gr/1000)) /1000) ; 9 kgram = (kg + gr/1000) % 1000; 10 gram = gr % 1000; 11 12 } 13 public int getT() { 14 return ton; 15 } 16 public int getKG() { 17 return kgram; 18 } 19 public int getG(){ 20 return gram; 21 } 22 public MyWeight add(MyWeight x) { 23 int t = 0,kg = 0,gr = 0; 24 t = ton+ x.getT(); 25 kg = kgram + x.getKG(); 26 gr = gram+ x.getG(); 27 MyWeight y = new MyWeight(); 28 y.setWeight( t, kg, gr); 29 return y; 30 31 } 32 33 34 public static void main(String args[]) { 35 int tonn[] = { 20, 30, 10, 20, 20 }; 36 int kgr[] = { 250, 780, 190, 360, 450 }; 37 int gramu[] = { 310, 400, 960, 210, 730 }; 38 39 MyWeight w=new MyWeight(); 40 MyWeight sum = new MyWeight(); 41 42 for(int i=0;i<5;i++) { 43 w.setWeight(tonn[i],kgr[i],gramu[i]); 44 sum = sum.add(w); 45 46 } 47 System.out.println("sum"+sum.getT()+"t"+sum.getKG()+"kg"+sum.getG()+"g"); 48 } 49 }

投稿2019/04/15 06:35

nanimowakaranai

総合スコア20

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

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

0

以下のように修正してみたのですが、コンパイルして実行しようとすると 
エラー: メイン・クラスMyWeightが見つからなかったかロードできませんでした
と出てきます。どうすれば実行できるようになるのかわかりません。ファイル名はMyWeight.javaだから大丈夫だと思ってたんですが・・・

java

1 2 3 public class MyWeight{ 4 private int ton; 5 private int kgram; 6 private int gram; 7 8 9 public void setWeight(int t,int kg,int gr) { 10 ton = t + ((kg + (gr/1000)) /1000) ; 11 kgram = (kg + gr/1000) % 1000; 12 gram = gr % 1000; 13 14 } 15 public int getT() { 16 return ton; 17 } 18 public int getKG() { 19 return kgram; 20 } 21 public int getG(){ 22 return gram; 23 } 24 public MyWeight add(MyWeight x) { 25 int t = 0,kg = 0,gr = 0; 26 t = t+ x.getT(); 27 kg = kg + x.getKG(); 28 gr = gr+ x.getG(); 29 MyWeight y = new MyWeight(); 30 y.setWeight( t, kg, gr); 31 return y; 32 33 } 34 35 public void main(String args[]) { 36 int tonn[] = { 20, 30, 10, 20, 20 }; 37 int kgr[] = { 250, 780, 190, 360, 450 }; 38 int gramu[] = { 310, 400, 960, 210, 730 }; 39 40 MyWeight w=new MyWeight(); 41 MyWeight sum = new MyWeight(); 42 43 for(int i=0;i<4;i++) { 44 w.setWeight(tonn[i],kgr[i],gramu[i]); 45 sum.setWeight(tonn[i],kgr[i],gramu[i]); 46 sum = sum.add(w); 47 } 48 System.out.println("sum"+sum.getT()+"ton"); 49 } 50 } 51

投稿2019/04/15 05:52

nanimowakaranai

総合スコア20

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

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

LouiS0616

2019/04/15 05:54

public 『static』 void main です。 それはさておき、情報を追記したい場合は質問本文を編集して追記してください。ここは回答欄です。
nanimowakaranai

2019/04/15 05:57

返答ありがとうございます。staticを入力してもエラーメッセージは変わりませんでした。 テラテイルの利用は初めてなのでよくわからないまま使ってしまいました。頭に入れときます
stdio

2019/04/15 06:03

public class MyWeightの最後の"}"が抜けてますね... あとこの謎の4文字の空白は何ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問