注意: 以前、この質問と他のいくつかの質問を含む投稿を作成しましたが、同じ投稿で非常に多くの質問をしているため、個々の質問に分割したほうがよいと言われました。したがって、これを重複としてマークしないでください。はい、指示は同じで、同じコードが使用されていますが、質問自体は異なります。ありがとう。
私は次の指示でプログラムに取り組んでいます:
GeometryObject を拡張し、Comparable および Cloneable インターフェースを実装する Octagon という名前のクラスを記述します。八角形の 8 つの辺はすべて同じサイズであると仮定します。面積は、次の式を使用して計算できます。
面積 = (2 + 4/2 の平方根) * 側面 * 側面
ファイルから一連の値を読み取り、面積と周囲を表示し、クローンを作成し、オブジェクトとそのクローンを (面積に基づいて) 比較するプログラム (ドライバー) を作成します。さらに、プログラムは、現在のオブジェクト (読み込まれたばかり) を最初に読み込まれたオブジェクトと比較する必要があります。ファイルから負の数が読み込まれると、プログラムは終了します。
ここに私がこれまでに持っているコードがあります.これは私のGeometricObjectクラスです:
public abstract class GeometricObject {
public abstract double getArea();
public abstract double getPerimeter();
}
私のオクタゴンクラス:
public class Octagon extends GeometricObject implements Comparable<Octagon>, Cloneable {
private double side;
public Octagon() {
}
public Octagon(double side) {
this.side = side;
}
public double getSide() {
return side;
}
public void setSide(double side) {
this.side = side;
}
public double getArea() {
return (2 + (4 / (Math.sqrt(2))) * side * side);
}
public double getPerimeter() {
return side * 8;
}
public String toString() {
return "Area: " + getArea() + "\nPerimeter: "
+ getPerimeter() + "\nClone Compare: " + "\nFirst Compare: ";
}
public int compareTo(Octagon octagon) {
if(getArea() > octagon.getArea())
return 1;
else if(getArea() < octagon.getArea())
return -1;
else
return 0;
}
@Override
public Octagon clone() {
return new Octagon(this.side);
}
}
そして、私のドライバーまたはテスタークラス: (これは私が最も助けが必要な場所です):
import java.util.*;
public class Driver {
public static void main(String[] args) throws Exception {
java.io.File file = new java.io.File("prog7.dat");
Scanner fin = new Scanner(file);
Octagon first = null;
int i = 1;
Octagon older;
while(fin.hasNext())
{
double side = fin.nextDouble();
if(side < 0.0)
break;
Octagon oct = new Octagon(side);
System.out.print("Octagon " + i + ": \"" + oct.toString() + "\"");
if (first == null) {
first = oct;
System.out.print("Equal");
}
else {
int comparison = oct.compareTo(first);
if (comparison < 0)
System.out.print("less than first");
else if (comparison > 0)
System.out.print("greater than first");
else
System.out.print("equal");
}
String cloneComparison = "Clone Compare: ";
older = oct;
Octagon clone = oct.clone();
if ( older.getArea() == clone.getArea() ){
cloneComparison = cloneComparison + "Equal";
} else {
cloneComparison = cloneComparison + "Not Equal";
}
//System.out.println(cloneComparison);
i++;
first = new Octagon(side);
System.out.println();
}
fin.close();
}
}
そして、これが入力を取得するために使用されているファイルです。各線は 1 つの八角形です。
5.0
7.5
3.26
0.0
-1.0
プログラムは元のオブジェクトとそのクローンを正しく比較していますが、希望する方法で印刷するのに問題があります。
上記のコードが書かれているので、ここに私の出力があります:
Octagon 1: "Area: 72.71067811865474
Perimeter: 40.0
Clone Compare:
First Compare: "EqualClone Comparision: Equal
Octagon 2: "Area: 161.09902576697317
Perimeter: 60.0
Clone Compare:
First Compare: "greater than firstClone Comparision: Equal
Octagon 3: "Area: 32.0593921109526
Perimeter: 26.08
Clone Compare:
First Compare: "less than firstClone Comparision: Equal
Octagon 4: "Area: 2.0
Perimeter: 0.0
Clone Compare:
First Compare: "less than firstClone Comparision: Equal
しかし、次のようにする必要があります。
Octagon 1: Area: 2.0
Perimeter: 0.0
Clone Compare: Equal
First Compare: less than first
これはおそらく Octagon クラスの toString() メソッドに問題があるように感じます。そこから getArea() と getPerimeter() を出力しているためですが、return ステートメントで cloneComparison を使用してコンパイルすることはできません。
toString() メソッドの return ステートメントで試したことには、次のようなものがあります。
"\nClone Compare: " + cloneComparison + ...
"\nClone Compare: " + oct.cloneComparison + ...
"\nClone Compare: " + Driver.cloneComparison + ...
And
"\nClone Compare: " + Octagon.cloneComparison + ...
どんな入力でも大歓迎です。