我应该创建一个程序来读取每行上有3个整数的外部文件,并找到带有这三个数字的三角形区域。我们还没有学过数组,所以我想创建没有数组的程序,方法和类都很好。我需要帮助每三个数字逐行读取文件。
数据是:
7 8 9
9 9 12
6 5 21
24 7 25
13 12 5
50 40 30
10 10 10
82 34 48
4 5 6
这是我到目前为止所拥有的:
import java.io.*;
import java.util.*;
import java.lang.*;
public class Prog610a
{
public static void main(String[] args) throws IOException
{
BufferedReader reader = new BufferedReader(new FileReader("myData.in"));
String currentLine;
int a, b, c;
double s, area;
System.out.println("A" + "\t B" + "\t C" + "\t Area");
try
{
while((currentLine = reader.readLine()) != null)
{
Scanner scanner = new Scanner(currentLine);
s = ((scanner.nextInt() + scanner.nextInt() + scanner.nextInt()) / 2);
area = Math.sqrt(s * (s - scanner.nextInt()) * (s - scanner.nextInt()) * (s - scanner.nextInt()) );
if(s < 0)
{
System.out.println(scanner.nextInt() + " \t" + scanner.nextInt() +
" \t" + scanner.nextInt() + "\t This is not a triangle");
}
else
{
System.out.println(scanner.nextInt() + " \t" + scanner.nextInt() +
" \t" + scanner.nextInt() + " \t" + area);
}
}
}
finally
{
reader.close();
}
}
}
答案 0 :(得分:1)
使用Scanner
开始了一个好的开始。我建议只使用它可能是不够的,因为你最终可能会出现一些格式错误的行。要处理它们,您可能希望将处理分为两部分:获取一行,然后从该行获取各个值。
这允许您捕获没有足够值或具有太多值的行。如果你不这样做,那么你可能会与线条不对齐,从一行读取一些值,从下一行读取一些值。
BufferedReader
将允许您读取可以扫描的行。由于您不想使用数组,因此必须单独提取数字:
BufferedReader reader = new BufferedReader(new FileReader("myData.in"));
String currentLine;
try {
while ((currentLine = reader.readLine()) != null) {
Scanner scanner = new Scanner(currentLine);
try {
calculateTriangleArea(
scanner.nextInt(), scanner.nextInt(), scanner.nextInt()
);
}
catch (NoSuchElementException e) {
// invalid line
}
}
}
finally {
reader.close();
}
它也可以帮助您理解Java字符串插值。您的代码中包含horizontalTab
。您只需使用\t
即可在字符串中表达。例如:
"\tThis is indented by one tab"
"This is not"
您可以找到字符串转义字符here的完整列表。
我的代码中的异常处理(或缺少)可能会让您感到惊讶。在您的代码中,您可以捕获可能被抛出的Exception
。但是,您丢弃它然后继续执行已知已损坏的扫描仪上的其余代码。在这种情况下,最好立即失败而不是隐瞒错误并尝试继续。
我的代码中发生的一点异常处理是finally
块。这确保了读者无论在阅读时发生什么都会被关闭。它包装了打开阅读器后执行的代码,因此知道阅读器不为空,应该在使用后关闭。