2012-03-09 71 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