【发布时间】:2012-03-09 10:45:00
【问题描述】:
编辑:我最近编译一个我知道无法编译的程序让我相信我的编译器同时有问题。毫无疑问是因为我在 Mac 上的 WINE 中运行它而不是原生应用程序。谢谢你的回复。当我用编译器修复上述错误或将计算机移到一台可以正常工作的计算机时,我将正确测试所有响应并进行所有更改。
我对编程和这个网站都比较陌生,所以请多多包涵。我的两个 If 语句和一个 do/while 出现错误,我无法解决。
整个程序按预期工作,但下面有两个块。问题是,当我输入字符 'y' 时,一切都按预期工作,并且 ("Results=" + Arrays.toString(row)) 会按预期打印。它还继续通过原始的 For 循环并再次启动程序。
但是,当我输入任何其他字符(即不是 'y' 或 'n')时,代码不会打印“输入必须是 'y' 或 'n'”,而只是等待另一个输入。即使输入了“n”,它也不会按照我的意愿退出循环,它只是继续循环而不是继续循环,如果我认为它会继续。它无限期地执行此操作,不接受除 'y' 之外的任何其他输入以继续通过循环,因此我永远无法收到打印“负数”。
有人对为什么会发生这种情况有任何想法吗? 虽然在技术上不是家庭作业,但我将其标记为我想知道(如果可能的话)发生了什么,而不是仅仅如何解决它。
do {
ans = input.next().charAt(0);
if (!ans.equals('y') || !ans.equals('n')) {
System.out.println ("Input must be either 'y' or 'n'");
}
} while (!ans.equals('y') || !ans.equals('n'));
和
if (ans.equals('y')) {
for (Object[] row : prevResults) {
System.out.println("Results = " + Arrays.toString(row));
}
} //
else if (ans.equals('n')) {
System.out.println("Negative");
//System.exit(0);
}
完整代码如下
import java.util.*;
public class Averages {
public static void main (String [] args) {
//declare variables
int course, exam, average = 0;
char ans;
String pass;
//creating objects
Scanner input = new Scanner(System.in);
List<Object[]> prevResults = new ArrayList<Object[]>();
//full loop
for (int i = 0; i < 5; i++ ) {
System.out.println ("Loop " + (++i) + " out of 5");
//Course loop
do {
System.out.println ("Please enter a course mark out of 100");
course = input.nextInt();
if (course > 100) {
System.out.println ("Number entered is over 100");
}
} while (course > 100);
//Exam loop
do {
System.out.println ("Please enter an exam mark out of 100");
exam = input.nextInt();
if (exam > 100) {
System.out.println ("Number entered is over 100");
}
} while (exam > 100);
average = (course + exam)/2;
// Final Grade
System.out.println ("The average mark is " + average);
if ( average >= 50 && course > 40 && exam > 40) {
System.out.println ("The final grade is pass");
pass = "Pass";
}
else {
System.out.println ("The final grade is fail");
pass = "Fail";
}
//add to array
prevResults.add(new Object[] { "Course mark: " + course, "Exam mark: " + exam,"Average: " + average, "Grade: " + pass});
System.out.println ("Would you like to see previous results? y/n");
//'Previous results' question loop
do {
ans = input.next().charAt(0);
if (!ans.equals('y') || !ans.equals('n')) {
System.out.println ("Input must be either 'y' or 'n'");
}
} while (!ans.equals('y') || !ans.equals('n'));
// Close or Array if statement
if (ans.equals('y')) {
for (Object[] row : prevResults) {
System.out.println("Results = " + Arrays.toString(row));
}
} //
else if (ans.equals('n')) {
System.out.println("Negative");
//System.exit(0);
}
}// end for
}//end main
}//end class
编辑 2: 我已经切换了计算机,并且所有建议的答案都确实有效。他们是
while (ans != 'y' && ans != 'n');
与
while (!(ans.equals('y') || ans.equals('n')));
与
按照 Chris Browne 的建议制作单独的方法。
为了其他阅读本文的人的利益,这些解决方案非常有效,尽管我没有时间查看 Greg Hewgill 建议的 BufferedReader 我很可能会实施它,因为从他所说的来看,这似乎是一个更好的选择.
【问题讨论】:
-
您对
Scanner的使用容易出现错误和意外结果,尤其是在交互式程序中。你必须使用Scanner吗?你考虑过替代品吗?例如,BufferedReader有一个readLine()方法。 -
老实说,我不知道有任何替代方案。有人告诉我,这种方法适用于辅导讲师的阅读,所以我没有考虑太多替代方案。正如我所说,我对编程相当陌生。我会调查 BufferedReader 看看它是否提供了解决方案。
标签: java if-statement nested while-loop