重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんにちは。
課題をやっているのですが、問題が解けません。
問題内容です。
以下のクラス図で示したRectangleクラスを作成し、実行結果と同じに
なるようにメソッドを作成する。
クラス図
Rectangle
-width:ing
-height:int
-----------
Rectangle()
Rectangle(w:int,h:int)
getArea():int
-------------
問題文
getArea()メソッドでは面積の計算をする(高さ×幅)
コンストラクタRectangle()ではwidthとheightに初期値0を設定。
main()メソッドでは標準入力より幅、高さを整数として受け取り
コンストラクタの引数とする。
実行結果
>10
>20
インスタンスr1の面積は200
>123
>45
インスタンスr2の面積は5535
--------------------------
途中経過
import java.io.*;

class Rectangle{
public static int sum=0;

private int width;
private int height;

public Rectangle(){
width=0;
height=0;
sum++;
}
public void Rectangle(int w, int h){
width=w;
height=h;
}
public void getArea(){
int num;
num=width*height;
System.out.println("r" + sum + "インスタンスの面積は" + num);
}
}

class Ex54{
public static void main(String args[]){
BufferedReader input = new BufferedReader
(new InputStreamReader(System.in));
String wid = input.readLine();
String hei = input.readLine();

Rectangle rectangle1 = new Rectangle();
rectangle1.Rectangle(wid, hei);
}
}
「現在の問題点」
UML図の通り記述できているか自信がありません。
rectangle1.Rectangle(wid, hei);というところでエラーが出てしまいます。
r1、r2を表示するときにsumを使っているのですがこのような記述でいいか自身がありません。
どなたかよろしくお願いします。

A 回答 (8件)

>UML図の通り記述できているか自信がありません。



(1)
public static int sum=0;
というコードを書かれていますが、クラス図には
+sum:int
という記述ははありません。
後の質問ともつながりますが、課題を出す方としては、Rectangleクラスにこのような属性は不要だと考えられているのだと思います。私もそう思います。

(2)
Rectangle(w:int,h:int)
が違っています。
No.1の方の回答にもあるとおり、
Rectangle(w:int,h:int):void
ではなく、
Rectangle(w:int,h:int)
であることの意味を考えてみてください。


(3)
getArea():int
が違っています。
ちなみに、後の質問ともつながりますが、Javaの世界では一般的にgetXXX()という命名をするメソッドはどのような役割を持たせるものなのかが、一般的に決まっています。"setter/getter"等の言葉でググってみてください。getterならばvoidはありえません。

>rectangle1.Rectangle(wid, hei);というところでエラーが出てしまいます。

「エラーが出てしまう」という現象だけ捉えるのではなく、エラーメッセージを読んで内容を理解しましょう。なぜエラーになるのかはエラーメッセージに書いています。呼び出す方と呼び出されるほうの型はあっていますか?

Rectangle.java:33: Rectangle(int,int) (Rectangle 内) を (java.lang.String,java.lang.String) に適用できません
rectangle1.Rectangle(wid, hei);
^

>r1、r2を表示するときにsumを使っているのですがこのような記述でいいか自身がありません。

No.1の方の回答の通り、
System.out.println("インスタンスr1の面積は" …(以下略)
System.out.println("インスタンスr2の面積は" …(こっちも略)
でよいと思います。

というか、そちらの方が望ましい。
No.2の方が書かれているように、getArea()は「面積を求める」だけにすべきです。
sumの意味合いもよく分かりません(何の「合計」でしょうか?)。

この回答への補足

ご回答ありがとうございます。
どうしても解決できない部分があります。
それはRectangle rectangle1 = new Rectangle(wid, wei)の部分です
解説していただけないでしょうか?
よろしくお願いします。
メッセージ:シンボルを解決できません。
コンストラクタ Rectangle
import java.io.*;

class Rectangle{

private int width;
private int height;

public Rectangle(){
width=0;
height=0;
}
public Rectangle(int w, int h){
width=w;
height=h;
}
public int getArea(){
return width*height;
}
}

class Ex54{
public static void main(String args[]){
BufferedReader input = new BufferedReader
(new InputStreamReader(System.in));
String wid = input.readLine();
String hei = input.readLine();
Rectangle rectangle1 = new Rectangle(wid, hei);
System.out.println("インスタンスr1の面積は" + rectangle1.getArea());
}
}

補足日時:2007/09/05 19:05
    • good
    • 0

まず、クラスRectangleはクラス図が提示されていますが、Ex56は提示されていません。

出題者としてはRectangleクラスの方の設計を重視していると思ってください。
いかにRectangleクラスを「それらしく」つくるかがポイントです。「それらしい」とは「再利用性が高い」ということです。

例えば、Rectangle(矩形)というものに「高さ」「幅」「面積」のような属性があることは普遍的です。どのような矩形にも高さと幅があるでしょうし、面積が高さ×幅で求まることも変わりません。矩形に関する他の課題でもそのままプログラムを再利用することができるでしょう。
しかし、「矩形1と矩形2の2つがある」ことや「矩形1と2の面積を1,2の順に標準出力に表示する」ことは普遍的でしょうか?これは課題56だけの話です。課題57では、もしかしたら
・矩形1,2,3の面積を表示した後もう一度矩形1の面積と高さを表示しろ、といわれるかも知れません。
・標準出力ではなく、SWINGで作ったGUIの画面に表示してくれ、というかもしれませんし、Webの画面に出してくれと言われるかもしれません。

そうした場合に今のRectangleクラスは手直しゼロ、あるいは最小限の手直しで再利用できますか?

従って、Ex56は

Rectangle r1 = new Rectangle(wid1, hei1);
System.out.println("インスタンスr1の面積は" + r1.getArea());
Rectangle r2 = new Rectangle(wid2, hei2);
System.out.println("インスタンスr2の面積は" + r2.getArea());

で十分なのです。こんなコード、誰も再利用しないのですから。
    • good
    • 0
この回答へのお礼

私の質問に気づいていただきありがとうございました。
やっと問題が解決してホッとしております。
kztkさんの仰る再利用性が高いプログラムを
作っていきたいと思います。
ありがとうございました^^

お礼日時:2007/09/06 14:09

残念ながら、改良ではなく、改悪されています。


(オブジェクト指向的ではなくなったという意味で)

以下の2つは出題者の指示でしょうか?それとも質問者さんが発想されたものでしょうか。(1)はまだともかく、(2)が出題者の指示だとすると???

>(1)インスタンスに個別の番号をつける。
>Rectangleクラスにクラス変数countを追加
>コンストラクタRectangle()でcountをインクリメント
>(2)
>getArea()メソッドをクラスメソッドに書き換える
>クラスメソッドとして書いたgetAreaで、引数でインスタンスを渡してもらい
>オブジェクト名.フィールド名として使う。
    • good
    • 0

>Rectangle.getArea(num1, num2)ということでしょうか。


まったく違う。
関数に Rectangle のインスタンス rect を渡せば、rect は自分の幅と高さを「知っている」ので面積を計算できるでしょう。

しかし、rect が自分の幅と高さを知っているので、rect 自身が面積を計算することができると考えた方が自然でしょう。
    • good
    • 0

>引数でインスタンスを渡すとはどういうことでしょうか


Rectangle rect(10, 100);
Rectangle.getArea(rect);
という風に使う。てことじゃろ。
でも、クラスメソッドにする理由がわからない。

この回答への補足

ご回答ありがとうございます。
Rectangle.getArea(num1, num2)ということでしょうか。
その場合getArea()からどのように値(幅×高さ)を表示したら
いいのでしょうか。
getAreaに直接System.out.println("インスタンスr1の"・・・・・)
と言った感じで表示したらまずいですよねぇ?

補足日時:2007/09/06 01:16
    • good
    • 0

String wid = input.readLine();


String hei = input.readLine();
Rectangle rectangle1 = new Rectangle(wid, hei);

widとheiはどちらもStringですからString型の引数を2つ持つコンストラクタを探しに行くのですが、そんなものはないので
シンボルを解決できません。
と言われるわけです。
widとheiをint型に変換してからコンストラクタに渡せば、javac君はちゃんとあなたの作ったコンストラクタを見つけてくれます。Integer.parseInt()等を使えばよいでしょう。

この回答への補足

私の補足にお気づき頂きありがとうございます。
Integer.parseInt()をつかったら見事コンパイルを通ることができました。
今度はそのプログラムの改良版ということで
(1)インスタンスに個別の番号をつける。
Rectangleクラスにクラス変数countを追加
コンストラクタRectangle()でcountをインクリメント
実行例
>10
>20
インスタンスr1の面積は200
インスタンスr1は1番目のインスタンスです。
>123
>45
インスタンスr2の面積は5535
インスタンスr2は2番目のインスタンスです。
(2)
getArea()メソッドをクラスメソッドに書き換える
クラスメソッドとして書いたgetAreaで、引数でインスタンスを渡してもらい
オブジェクト名.フィールド名として使う。
-----------------------------------------------------------
改良版の(1)はできたのですが(2)がどうもよく分かりません。
疑問点
引数でインスタンスを渡すとはどういうことでしょうか
インスタンスメソッド内でthisを使えばいいのでしょうか

途中経過
import java.io.*;

class Rectangle{
public static int count = 0;

private int width;
private int height;

public Rectangle(){
width=0;
height=0;
count++;
}
public Rectangle(int w, int h){
width=w;
height=h;
count++;
}
public static void getArea(){

}
public static void count(){
System.out.println("インスタンスはr" + count + "番目のインスタンスです。");

}
}

class Ex56{
public static void main(String args[])throws IOException{
BufferedReader br = new BufferedReader
(new InputStreamReader(System.in));
int num=0;
while(num < 2){
System.out.print(">");
String wid = br.readLine();
System.out.print(">");
String hei = br.readLine();
int num1 = Integer.parseInt(wid);
int num2 = Integer.parseInt(hei);
Rectangle rectangle1 = new Rectangle(num1, num2);
Rctangle.getArea(??);
Rectangle.count();
num++;
}
}
}
どなたかよろしくおねがいします。

補足日時:2007/09/05 23:58
    • good
    • 0

>r1、r2を表示するときにsumを使っているのですが


>このような記述でいいか自身がありません。
俺もそこまでする必要を感じませんが、するなら public Rectangle(int w, int h) のコンストラクタの中でもカウントアップするべきじゃない?

そしてオブジェクトが破棄されたら sum--; したいけど、Java ってオブジェクトが破棄された時の動作って何処に書くんだっけ?

あと getArea() の中で出力しちゃダメでしょ。
これは「面積を求める」だけで出力は別にするべき。
    • good
    • 0

>UML図の通り記述できているか自信がありません。



Rectangle(w:int,h:int)は、戻り値(getArea():intの「:int」の部分)がないですね。
さらに、クラス名と同名なので「void Rectangle(int w, int h)」と書いて良いでしょうか?


>rectangle1.Rectangle(wid, hei);というところでエラーが出てしまいます。

エラーが何だったかにもよりますが、そもそもUMLの部分が分かれば、ここはどうなるでしょう?
ということは、…new Rectangle();という所はどうなるでしょうか?このままでOKですか?


>r1、r2を表示するときにsumを使っているのですがこのような記述でいいか自身がありません。

う~ん。ここは解釈がやや難しいですが、個人的には「そこまでやらなくてもいいのでは」という感じです。
System.out.println("インスタンスr1の面積は" …(以下略)
System.out.println("インスタンスr2の面積は" …(こっちも略)
と、そのままコードに入れてしまっても、合格レベルなのかなあと…
もちろん、質問者さんの書き方でも、問題ないと思います。
※自分が課題を作った立場なら、「よくぞそこまで考えた!」くらいのものです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
UML図を理解していないがためかなり手間取りました。
さらにjavaの専門用語も理解不足なため小さなミスが多く
なかなか苦労しました(汗
ありがとうございました^^

お礼日時:2007/09/06 14:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!