2013-10-23 82 views
1

我不認爲我的switch語句對我的代碼做任何事情,我是java的新手,所以我不確定如何在while loop中使用switch語句。我正在努力取得每個年級/學分,因此我可以找到GPA,但是我爲成績添加了System.out.print,並且表示無論輸入什麼內容,它都值0。請幫忙!如何在while循環中正確使用switch語句

package exercises; 

import java.text.DecimalFormat; 

import javax.swing.JOptionPane; 
import javax.swing.JTextArea; 

public class GPA_Calculator { 

public static void main(String[] args) 
{ 
    String greeting = "Hello, this program will calculate your GPA. You will be asked \n"+ 
      "to enter your letter grade for each class, then you will be asked to enter \n"+ 
      "the corresponding number of credits for that class. Once all the grades and credits\n"+ 
      "have been entered, the program will display your GPA."; 
    JOptionPane.showMessageDialog(null,greeting,"Greeting - Introduction",1); 

    char gradeEntered; 
    String grade = ""; 
    String creditEntered = ""; 
    String inputGrade = ""; 
    String inputCredit = ""; 
    String enterGradePrompt = "Enter your letter grade (A, B, C, D, F)\n"+ 
      "Enter Q to display your results\n\n"; 
    String enterCreditPrompt = "Enter the credit hours for your course (0, 1, 2, 3, 4, 5, 6)\n"+ 
      "Enter Q to display your results\n\n"; 

    int points = 0, sum = 0, credits = 0, gradeCount = 0; 

    while(!inputGrade.toUpperCase().equals("Q")) 
    { 
     inputGrade = JOptionPane.showInputDialog(null,enterGradePrompt,"Enter grade",1); 
     gradeEntered = inputGrade.charAt(0); 
     grade += inputGrade.toUpperCase()+"\n"; 

     inputCredit = JOptionPane.showInputDialog(null,enterCreditPrompt,"Enter grade",1); 
     creditEntered += inputCredit+"\n"; 
     if(inputCredit.toUpperCase().equals("Q")) 
      continue; 
      credits = Integer.parseInt(inputCredit); 
      credits++; 

     switch (gradeEntered){ 
      case 'A': points = 4; 
       break; 
      case 'B': points = 3; 
       break; 
      case 'C': points = 2; 
       break; 
      case 'D': points = 1; 
       break; 
      case 'F': points = 0; 
       break; 
      } 
     sum += gradeEntered; 
     gradeCount++; 
    } 

    // Prevents "Q" from being printed in results 
    grade = grade.substring(0,grade.length()-2); 
    creditEntered = creditEntered.substring(0,creditEntered.length()-2); 

    DecimalFormat df = new DecimalFormat("#.##"); 
    double gpa = sum/gradeCount; 

    String results = "The courses you entered are:\n\n"+ 
      "Grade "+"Hours \n"+ 
      grade+" "+creditEntered+"\n"+ 
      "Resulting in a GPA of "+df.format(gpa)+"\n\n"+ 
      "This program will now terminate!"; 

    JOptionPane.showMessageDialog(null, new JTextArea(results), 
      "results from the Invitation list generator",1); 
} 

}

+0

這是一個「而」循環,而不是一個「做,而」循環。 – EJP

+0

對不起,我是新手。我根據下面的一些建議編輯我的代碼。我現在做了修改。 – user2908744

+0

好吧,你正在添加到gradeEntered中,所以它會添加每個循環,使'switch'語句無用。另外,(不知道這個)也許'\ n'可能會影響switch語句。 –

回答

1

的問題是,你的switch語句檢查grade值,但是你的輸入存儲在inputGrade。前者不會從空字符串重新分配,所以點不會增加。

編輯:爲了擴大在下面的評論:

  • 條件在任何一段時間或做/ while循環沒有被選中。你正在循環中檢查它,並且發生,這很好,因爲你可以做一個無限循環並讓它終止它。但是,它不應該在循環條件中重複。
  • 您應該儘早檢查該狀況。如果用戶輸入'q',那麼在循環內部執行任何操作都是沒有意義的(也就是說,之後您不必將部分放在後面去除的地方)。

此外,你應該總是儘量保持你的變量儘可能地在本地。在循環之外不需要任何東西,只有聚合器(在這種情況下爲totalXxx和yyyEntered)。在這種情況下,它會讓你感到困惑,因爲它掩蓋了問題的根源。當switch語句第一次出現時,它會檢查空字符串。第二次,它檢查第一個字符串。當你點擊'q'時,它會打破,並跳過你最後的輸入。如果這些輸入變量是在循環內部聲明的,那將會立即顯而易見。

最後,當我在這裏時,你的gpa計算中有一個錯誤。每分得分應將積分的權重看作是積極的,而不是消極的。例如: sum(grade * credits)/sum(credits)

如果您願意,我可以發佈固定代碼,但由於我懷疑這是一項學術活動,如果您自己找到解決方案,會更有益處。

+0

我將「等級」更改爲「inputGrade」,無論輸入什麼內容,仍然會返回0。我不確定我是否使用了正確的方法。 – user2908744

+0

好的,進一步的代碼審查... * do/while是當你在循環之前有一個有效的狀態,並且可能在之後無效。之前沒有用戶輸入,所以這裏不是這種情況 *開關應該在用戶輸入之後,而不是在之前。這使得它始終從前一個輸入計算,從空字符串開始。 * while條件是毫無意義的,因爲你在循環中檢查並打破'Q' – erich2k8

+0

我必須至少使用一段時間或者while循環和switch語句。所以我拿出了'Q'的休息時間,並且只是使用了一個while循環。我編輯了上面的代碼,但它就像循環中沒有看到switch語句。 – user2908744

1

您的switch語句使用的是似乎永遠不會寫入的grade。它始終是""。 你得到inputGrade,但你不寫信給grade本身。

因爲它始終是「」(\ n「)將輸入(inputGrade.toUpperCase()+"\n";)所以沒有你的情況下是有效的,你總是從你的交換機

+0

要添加到此,您應該作出默認情況下,以防萬一輸入。 – Mercifies

+0

儘管代碼中還存在其他問題。 上面的人說,你應該有默認情況下,因爲如果人不提供有效的輸入,那麼你永遠不會清除「積分」。即如果我輸入'A'(並且開關按你想要的方式工作),然後鍵入'M',則點數= 4將被添加兩次。一次爲'A',一次爲'M'。 此外,你假設信用將數字或'Q',這不是一個好主意。除了問題之外,如果有6個限制的話,你會嘗試把不是Q的字母解析成數字,把它放在那裏。 你的gpa計算對我來說也是錯誤的。 – binderbound

+0

你推薦使用char而不是字符串嗎? – user2908744

-1

要添加新行什麼也得不到。」 也就是說,「A」不等於「A \ N」

我認爲你不應該使用「gradeEntered」,而使用:

switch (inputGrade.toUpperCase()) 

尤其是運行循環多次後,您的「gradeEntered」字符串將開始看起來像這樣:「A \ nB \ nF \ nQ \ n」,這與您的所有情況相距甚遠。

另外,打開字符串並不是很好的做法 - 它是java中的一個新的開發,並且不會被運行java版本的舊版本的計算機支持 - 儘管如此,如果編譯器沒有抱怨,沒事。不過,最好還是養成打開字符或整數的習慣,因爲大多數其他編程語言不會讓你打開字符串。

+0

P.S.你在while循環中使用了inputGrade,這是一個很好的舉動,就好像你使用了gradeEntered,你會有無限循環 – binderbound

+0

我在switch語句中使用了char,但是當它計算出gpa時,它會說'A' = 97像ascii表,我不知道如何解決這個問題。我也用「inputGrade.toUpperCase()+」\ n「;」在我的代碼中獲取輸入以顯示在我的結果中。我更新了我的代碼以顯示我的更改。 – user2908744

+0

打開字符串非常好。生成的編譯代碼向後兼容java的舊版本。 FWIW,許多語言都支持字符串上的[模式匹配](http://en.wikipedia.org/wiki/Pattern_matching),這就是字符串切換的意圖。 – erich2k8

0

要附加每個年級到您的gradeEntered

gradeEntered += inputGrade.toUpperCase()+"\n"; // at a point this is something like A\nB\nC\nD\nE.... so it will not match anyway 
switch (gradeEntered) { 
    case "A": points = 4; 
     break; 
    case "B": points = 3; 
     break; 
    case "C": points = 2; 
     break; 
    case "D": points = 1; 
     break; 
    case "F": points = 0; 
     break; 
    } 

所以大多數時候它不會匹配您的任何情況。

要麼你得有品位的獨立焦炭,並在交換機或第一次使用開關使用它,然後將其附加到您的變量

+0

我只是使用了gradeEntered + = inputGrade。toUpperCase()+ 「\ n」 個;在結果中打印用戶的輸入以顯示成績/學分。我想我沒有意識到這是影響轉換聲明。 – user2908744