请注意: 我之前创建了一个有这个问题和其他几个问题的帖子,但被告知,因为我在同一篇文章中提出了这么多问题,所以最好把它分解成个别问题。所以请不要将其标记为重复,是的说明是相同的,是的,使用相同的代码,但问题本身是不同的。感谢。
我正在制作一个程序,其中包含以下说明:
编写一个名为Octagon的类,它扩展了GeometricObject并实现了Comparable和Cloneable接口。假设八边形的所有8个边都具有相同的大小。可以使用以下公式计算面积
area = (2 + 4/square root of 2) * side * side
编写程序(驱动程序)以从文件中读取一系列值,显示区域和周边,创建克隆并比较对象及其克隆(基于区域)。此外,您的程序应该将当前对象(刚刚读入)与读入的第一个对象进行比较。当从文件中读取负数时,程序结束。
这是我到目前为止的代码,这是我的GeometricObject类:
public abstract class GeometricObject {
public abstract double getArea();
public abstract double getPerimeter();
}
我的八角形课程:
public class Octagon extends GeometricObject implements Comparable<Octagon> {
private double side = 1.0;
protected native Object clone() throws CloneNotSupportedException;
private static int numberOfObjects = 0;
public Octagon() {
}
public Octagon(double side) {
this.side = side;
numberOfObjects++;
}
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 "Octagon " + numCreated + ": Area: " + getArea() + "\nPerimeter: "
+ getPerimeter() + "\nClone Compare: " + Cloneable + "\nFirst Compare: "
+ comparisson;
}
public int compareTo(Octagon octagon) {
if(getArea() > octagon.getArea())
return 1;
else if(getArea() < octagon.getArea())
return -1;
else
return 0;
}
public interface Cloneable {
}
}
我的司机或测试员班:(这是我需要最多帮助的地方)
import java.util.*;
import java.io.*;
public class Driver {
public static void main(String[] args) {
int comparisson = compareTo(octagon);
java.io.File file = new java.io.File("prog7.dat");
Scanner fin = new Scanner(file);
while(fin.hasNext()) {
double side = fin.nextDouble();
if(side < 0.0) break;
Octagon first = new Octagon(side);
System.out.println("Octagon 1: " + first);
}
}
}
这是用于获取输入的文件。每一行是一个八边形:
5.0
7.5
3.26
0.0
-1.0
以下是我遇到的问题。
我无法弄清楚如何创建对象。输出应该看起来像这样:
对象1:面积:120.71 周长:40.0 克隆比较:平等 首先比较:等于
对象2:面积:271.60 周长:60.0 克隆比较:平等 首先比较:第一个是较小的
所以我试图找出如何以第一个存储在自己的变量中的方式创建对象(因为它将用作其余对象的比较),克隆和比较打印出自己并打印出正确的信息,然后根据文件中的下一个数字创建下一个对象,克隆它,将其与第一个对象进行比较,然后打印信息,并继续这样做直到我得到一个负数文件。我希望这是有道理的,我知道我在想什么,只是不确定如何把它写成ha。
答案 0 :(得分:1)
要保留对第一个Octagon
的引用,您可以尝试两种方法。你可以有一个标志,表明你是否已经看过第一个:
Octagon first;
boolean seenFirst = false;
while (fin.hasNext()) {
double side = fin.nextDouble();
if (side < 0.0) break;
Octagon octagon = new Octagon(side);
if (!seenFirst) {
first = octagon;
seenFirst = true;
}
// ... do stuff with octagons
}
您甚至可以使用first
来跟踪它是否已设置:
Octagon first = null;
while (fin.hasNext()) {
double side = fin.nextDouble();
if (side < 0.0) break;
Octagon octagon = new Octagon(side);
if (first == null) {
first = octagon;
}
// ... do stuff with octagons
}
或者,您可以采取不同的方法。您可以在循环开始之前读取第一个Octagon
,而不是在while循环中包含条件代码:
Octagon first;
if (fin.hasNext()) {
double side = fin.nextDouble();
if (side < 0.0) return; // return instead of break to exit from main()
first = new Octagon(side);
doStuffWithOctagons(first, first);
}
while (fin.hasNext()) {
double side = fin.nextDouble();
if (side < 0.0) break;
Octagon octagon = new Octagon(side);
doStuffWithOctagons(first, octagon);
}
我已经将doStuffWithOctagons
放入一个方法中,该方法接受第一个八边形和当前的八边形,以便不在两个位置复制用八边形执行其余操作的代码。请注意,对于第一个八边形,我将first
作为两个参数传递给它。我不确定你是否真的想要在第一个八角形中读取时将当前八边形与第一个八边形进行比较。这似乎是多余的,因为他们显然会比较平等,但我不能从你的问题中说出你是否确实愿意这样做。
曾经有一段时间我会更喜欢以前的代码,在if
循环中使用while
语句来区别对待第一种情况。现在我可能更喜欢后面的代码,因为它更清晰明确,但更长。