以下の問で以下のようなソースを作りました。
問.2次元上の円と長方形を表すデータファイルが与えられたとき、以下の処理を行うプログラムを作成せよ。ただし、長方形は必ず座標軸に並行変を持つとする。
1.全図形の合計面積を表示せよ
2.一番免責の大きい図形データを表示せよ
3.周の長さ順に図形データを表示せよ
4.重なり合ってるすべての円のペアを列挙せよ
class Shape{
int id;
int type;
public double getArea() { return 0.0; }
public double getPerimeter() { return 0.0; }
}
class Circle extends Shape{
double cx,cy;
double r;
Circle(int id, int type, double cx, double cy, double r){
this.id = id;
this.type = type;
this.cx = cx;
this.cy = cy;
this.r = r;
}
public double getArea(){
return 3.14159265 * r * r;
}
public double getPerimeter(){
return 3.14159265 * 2 * r;
}
}
class Rectangle extends Shape{
double lx,ly,rx,ry;
Rectangle(int id,int type,double lx,double ly,double rx,double ry){
this.id = id;
this.type = type;
this.lx = lx;
this.ly = ly;
this.rx = rx;
this.ry = ry;
}
public double getArea(){
return (rx - lx) * (ly - ry);
}
public double getPerimeter(){
return 2 * (ly - ry) + 2* (lx - rx);
}
}
class ShapeTest{
public static void main(String[] args) {
Shape shapes[] = new Shape[5];
shapes[0] = new Circle(1, 1, 50.0, 50.0, 50.0);
shapes[1] = new Rectangle(2, 2, -100.0, 100.0, 0.0, 0.0);
shapes[2] = new Circle(3, 1, 0.0, 0.0, 10.0);
shapes[3] = new Circle(4, 1, 50.0, 0.0, 30.0);
shapes[4] = new Rectangle(5, 2, -75.0, 75.0, -25.0, 25.0);
double sum = 0.0;
for(int i=0;i<shapes.length;i++){
sum += shapes[i].getArea();
}
System.out.println("合計面積は " +sum);
Shape maxShape = shapes[0];
for(int i=1;i<shapes.length;i++){
if(shapes[i].getArea() > maxShape.getArea()){
maxShape = shapes[i];
}
}
System.out.println("一番面積の大きい図形は ID=" + maxShape.id);
for(int i=0;i<shapes.length-1;i++){
for(int j=i+1;j<shapes.length;j++){
if(shapes[j].getArea() > shapes[i].getArea()){
Shape tmp = shapes[i];
shapes[i] = shapes[j];
shapes[j] = tmp;
}
}
}
System.out.println("周の長さの大きい順は ");
for(int i=0;i<shapes.length;i++){
System.out.print(" " +shapes[i].id);
}
System.out.println();
}
}
合計面積は 23495.574275
一番面積の大きい図形は ID=2
周の長さの大きい順は
2 1 4 5 3
問3まではできたのですが、問4がわかりません。どうしたらいいのですか?解説とソースをお願いします。汚いソースで買得も難しいと思いますがよろしくお願いします。
No.2ベストアンサー
- 回答日時:
質問者による過去の質問のいくつかは拝見しています。
寄せられた回答に対して補足もお礼も一言も返さず,ただ質問を締め切る,という態度には良い印象を持っていません。
しかし,基礎もなんにも分からぬまま課題を丸投げしているのではなく,数十行にわたるJavaのコードが書ける人物のようですので,解答例を示してみる気になりました。
class Shape {
int id;
int type;
}
class Circle extends Shape{
double cx,cy;
double r;
Circle(int id, int type, double cx, double cy, double r){
this.id = id;
this.type = type;
this.cx = cx;
this.cy = cy;
this.r = r;
}
boolean isOverlap(Circle that) {
if (this.r + that.r > Math.sqrt(Math.pow(this.cx - that.cx, 2) + Math.pow(this.cy - that.cy, 2))) {
return true;
} else {
return false;
}
}
}
class Rectangle extends Shape{
double lx,ly,rx,ry;
Rectangle(int id,int type,double lx,double ly,double rx,double ry){
this.id = id;
this.type = type;
this.lx = lx;
this.ly = ly;
this.rx = rx;
this.ry = ry;
}
}
class Q7831321 {
public static void main(String[] args) {
Shape shapes[] = new Shape[5];
shapes[0] = new Circle(1, 1, 50.0, 50.0, 50.0);
shapes[1] = new Rectangle(2, 2, -100.0, 100.0, 0.0, 0.0);
shapes[2] = new Circle(3, 1, 0.0, 0.0, 10.0);
shapes[3] = new Circle(4, 1, 50.0, 0.0, 30.0);
shapes[4] = new Rectangle(5, 2, -75.0, 75.0, -25.0, 25.0);
for (int i = 0; i < shapes.length - 1; i++) {
if (shapes[i] instanceof Circle) {
for (int j = i + 1; j < shapes.length; j++) {
if (shapes[j] instanceof Circle) {
if (((Circle)shapes[i]).isOverlap((Circle)shapes[j])) {
System.out.printf("円ID=%dと円ID=%dは重なる\n", shapes[i].id , shapes[j].id);
}
}
}
}
}
}
}
No.3
- 回答日時:
4は半径30の円だから、円周は 2 * PI * 30 ≒ 188
5は1辺が50の長方形(正方形)だから、周の長さは 2 * 50 + 2*50 = 200
よって、 5 > 4 です。
> 周の長さの大きい順は
> 2 1 4 5 3
では 4 > 5となってますから、事実と異ります
って話を
http://oshiete.goo.ne.jp/qa/7826345.html
でしたはずですが、なおってません。
ついでに気付きましたが
> public double getPerimeter(){
> return 2 * (ly - ry) + 2* (lx - rx);
> }
では長さが負になることがあります。
問4 は、まず数学(算数?)の図形の問題を解いて「2つの円が重なる」とは、どんな状態か考えます。
2つの円の中心の距離が、
なんかより大きければ、共通部分はない
なんかに等しければ接する
なんか未満なら重なっている
でしたよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実数からの小数部の取得
-
Javaで何パーセント%かを表示...
-
double型で収まりきれない小数...
-
double型変数値の整数部分のみ...
-
べき乗
-
printfでのエラーがわからない...
-
0dの意味を教えてください
-
少数50桁以上を表示するには
-
Java JPanelを使ったコードにつ...
-
doubleで入力するには?
-
計算する度にBigDecimalオブジ...
-
double型の足し算について
-
java のfor文について質問です。
-
Java言語プログラミングについ...
-
doubleとintの違い
-
javaの図形なのですが
-
powで1 番目の引数が負の無限大...
-
自然対数の底Eを含むStringの数...
-
C言語のポインターに関する警告
-
VBAで配列の計算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
べき乗
-
実数からの小数部の取得
-
Javaで何パーセント%かを表示...
-
0dの意味を教えてください
-
最大値と最小値の求め方
-
double型変数値の整数部分のみ...
-
Javaによる利率計算の実装方法
-
doubleで入力するには?
-
doubleとintの違い
-
JAVAのプログラムで、2乗計算...
-
double型の足し算について
-
掛け算演算を使わない掛け算
-
実数 2.0 に対して int(2.0) ==...
-
Javaコンパイルエラー
-
java のfor文について質問です。
-
C# ToStringでの数字桁揃えの仕方
-
java プログラム 範囲を指定し...
-
Javaのeval関数処理
-
printfでのエラーがわからない...
-
数値積分について
おすすめ情報