2012-03-09 47 views
1

编辑:我最近发生的编译程序,我知道无法编译导致我相信我同时有一个问题与我的编译器。毫无疑问,由于我在Mac上运行WINE而不是原生应用程序。谢谢你的回复。我会正确地测试出所有的回应,并且在我用编译器解决了所说的错误时进行了所有更改,或者我已经将计算机移到了一个有效的计算机上。其他如果和做虽然不按预期工作

我对编程相对比较陌生,所以请耐心等待。我的两条If语句出错,另外一条出现/我无法解决的错误。

整个程序按预期工作,但下面有两个块。问题是,当我输入字符'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'))); 

制作一个单独的方法,由克里斯·布朗的建议。

为了读者的利益,这些解决方案非常有效,尽管我没有时间看看Greg Hewgill建议的BufferedReader,我很可能会实现它,因为它似乎是更好的选择说明。

+0

您对'Scanner'的使用很容易出现错误和意想不到的结果,特别是对于交互式程序。你必须使用'扫描仪'?你有没有考虑替代品?例如,['BufferedReader'](http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html)有一个'readLine()'方法。 – 2012-03-09 10:48:12

+0

我没有意识到有任何替代品是诚实的。有人告诉我,这个方法对于教程讲师的阅读很有帮助,所以我没有考虑太多选择。正如我所说,我对编程相当陌生。我将研究BufferedReader以查看它是否提供解决方案。 – 2012-03-09 10:58:43

回答

4

首先,在你的代码中的错误:

System.out.println ("Loop " + (++i) + " out of 5"); 

你不应该增加i,因为它已经在增加你的for更新语句 - 你得到了错误的迭代计数结果。

接下来,你不应使用equals比较char值 - 使用==代替。当您使用equals时,由于auto-boxing会发生很多不必要的事情,最终导致大致characterObject.equals(anotherCharacterObject),对象类型为java.lang.Character。只需使用例如代替ans == 'y'

末,为乡亲们所指出的那样,你应该重写你的DO-而为:

do { 
    ans = input.next().charAt(0); 
    if (ans != 'y' && ans != 'n') { 
     System.out.println ("Input must be either 'y' or 'n'"); 
    } 
} while (ans != 'y' && ans != 'n'); 

,甚至有健康检查一个单独的方法(感谢克里斯·布朗)。

+0

啊,这是有帮助的。我最初使用字符串而不是字符,但我被迫改变它,因为我得到一个字符串读取我的'输入'字符错误。我不知道==与Char一起工作,因为我发现它并没有使用字符串:P 我将按照建议重写我的do-while,看它是否会产生结果。 – 2012-03-09 11:05:07

1

你的条件必须是

if (!ans.equals('y') && !ans.equals('n')) 

,而不是

if (!ans.equals('y') || !ans.equals('n')) 
2

的条件应该是:

while (!(ans.equals('y') || ans.equals('n'))); 

,因为你第一次写的条件:

while (!ans.equals('y') || !ans.equals('n')); 

总是等于true(每个字符不是y或不是n)。

并说谢谢De Morgan,也见my answer here

+0

我刚才试过这个解决方案,但它没有改变任何东西,它对于'y'以外的东西仍然有一个无限循环。也许别的东西也不正确? – 2012-03-09 10:53:31

+0

经过进一步的检查,我的编译器没有编译我目前的工作,而是以某种方式编译我以前的版本,切换到另一台计算机,这种方法确实按预期工作。谢谢你的回答。 – 2012-03-09 11:57:36

1
} while (!ans.equals('y') || !ans.equals('n')); 

说虽然ans不等于'y'或者ans不等于'n'。这将始终是真实的(它总是会不等于其中之一)

1

你的条件逻辑是相反的,你说:

if (!ans.equals('y') || !ans.equals('n')) 

语义上,这是一个非常困难的线来分析,因为你在说“如果答案不是答案或答案不是n”,这是一个语句中的很多逻辑运算符。这可能是为什么你的错误悄悄进入。

真的,快速修复是将“或”换成“和”,但这并不能真正帮助你理解问题。你应该重构它使用不同的方法,如:

if(isLegalAnswer(ans)) 

其中isLegalAnswer被定义为:(!isLegalAnswer(ANS))

private static boolean isLegalAnswer(char ans) { 
    return (ans=='y' || ans=='n'); 
} 

这可以让你否定整个表达式使用单一否定。通常,我禁止自己在单个语句或表达式中使用多个否定,这有助于保持代码易于阅读,同时对执行速度做出很少或没有差别。

+1

感谢您的回复。真正理解我为什么错了很有帮助。 – 2012-03-09 11:06:47