【发布时间】:2014-08-05 00:22:24
【问题描述】:
请注意:我之前创建了一个帖子,其中包含这个问题以及其他几个问题,但有人告诉我,由于我在同一个帖子中问了这么多问题,最好将其分解为单独的问题。所以请不要将此标记为重复,是的说明是相同的,是的,使用的是相同的代码,但问题本身是不同的。谢谢。
我正在使用以下说明开发一个程序:
编写一个名为 Octagon 的类,该类扩展 GeometricObject 并实现 Comparable 和 Cloneable 接口。假设八边形的所有 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);
}
}
还有我的 Driver 或 tester 类:(这是我最需要帮助的地方):
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();
}
}
这是用于获取输入的文件。每行是一个八边形:
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() 的地方,但我无法使用 cloneComparison 编译它返回声明。
我用 toString() 方法的 return 语句尝试过的一些事情包括:
"\nClone Compare: " + cloneComparison + ...
"\nClone Compare: " + oct.cloneComparison + ...
"\nClone Compare: " + Driver.cloneComparison + ...
And
"\nClone Compare: " + Octagon.cloneComparison + ...
非常感谢任何输入。
【问题讨论】:
-
支线话题,但如果他们告诉你的只是“假设八边形的所有 8 个边的大小相等”,那么并不意味着所有 8 个角也都相等,这意味着公式是错误的。但我认为我们可以假设这就是他们的意思。
-
如果所有边的长度相等(正八边形),所有角度都应等于 135 度。
-
我也是这么想的,但我觉得听从指示比和他争论更容易哈。
-
@Hari 可以构造一个边都相等但角度不相等的八边形。这适用于任何 4 边或更多边的多边形。 (听说过“菱形”吗?)
-
@BethTanner 你的
toString()方法返回太多。您想要的一些输出将由您的 main 方法输出,因此它不属于toString()。代码的哪一部分负责什么?如果你的主程序打印比较信息,让它打印比较信息(连同Clone compare:之类的标签),不要放在toString()中。