0

注意: 以前、この質問と他のいくつかの質問を含む投稿を作成しましたが、同じ投稿で非常に多くの質問をしているため、個々の質問に分割したほうがよいと言われました。したがって、これを重複としてマークしないでください。はい、指示は同じで、同じコードが使用されていますが、質問自体は異なります。ありがとう。

私は次の指示でプログラムに取り組んでいます:

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 + ...

どんな入力でも大歓迎です。

4

1 に答える 1