2011-02-24 214 views
4

我一直在爲我的java類做一個項目。對於該項目,我必須讓用戶輸入輸入並計算他們的體重指數和體表面積,程序應該保持運行直到用戶輸入「q」。當「q」被放入時,我無法讓程序停止運行,只是崩潰。另外我對Java和編程一般都很新,所以我會很感激任何幫助。我的代碼如下。 感謝:)按'q'結束for循環

public static void main(String[] args) { 

     //Scanner 
     Scanner stdIn = new Scanner(System.in); 

     //Variables 
     final double METERS_TO_CM = 100; // The constant to convert meters to centimeters 
     final double BSA_CONSTANT = 3600; // The constant to divide by for bsa 
     double bmi;      // Body Mass Index 
     String weight;      // Weight in kilograms 
     String height;      // Height in meters 
     String classification;    // Classifies the user into BMI categories 
     double bsa;      // Body surface area 



     do { 
      System.out.print("Welcome to the BMI and BSA Calculator to begin enter weight in kilograms."); 
      weight = stdIn.next(); 
      System.out.print("Enter height in meters: "); 
      height = stdIn.next(); 
      double height2 = Double.parseDouble(height); 
      double weight2 = Double.parseDouble(weight); 
      bmi = weight2/(height2*height2); 
     if (bmi < 18.5) 
     { 
      classification = "Underweight"; 
     } 
     else if (bmi < 25) 
     { 
      classification = "Normal"; 
     } 
     else if (bmi < 30) 
     { 
      classification = "Overweight"; 
     } 
     else 
     { 
      classification = "Obese"; 
     } 

     System.out.println("Your classification is: " + classification); 
     bsa = Math.sqrt(((height2*METERS_TO_CM)*weight2)/BSA_CONSTANT); 
     System.out.printf("BMI: %.1f\n", bmi); 
     System.out.printf("BSA: %.2f\n", bsa); 


     System.out.println("Hit 'q' to quit"); 
     } while (stdIn.nextLine().compareToIgnoreCase("q")==0); 






    } 
} 
+0

這些天,誰家將有一個關於計算BMI的問題,它不會做作業。 :-) – corsiKa 2011-02-24 23:17:21

+0

是啊,現在我只是擔心功課:) – Brad 2011-02-24 23:19:23

+0

哦,這不是什麼反對你,或問題。這是每個人在一個班級或另一個班級中做的「經典」作業作業之一。我只知道其中一天,一些對編程一無所知的保險人將會試圖爲他的保險報告製作BMI計算器,並且人們會認爲它是功課。呵呵呵。 – corsiKa 2011-02-24 23:26:14

回答

1

我猜想,你的「Q」輸入寫在weight,因此,你嘗試將它解析爲Double,它拋出一個未處理的異常並停止執行。

你應該處理這個異常,並在觸發時讓系統斷開while循環。

+0

我編譯他的代碼 - 他沒有得到一個例外。雖然好想。 – corsiKa 2011-02-24 23:22:21

+0

@ glowcoder其實我不知道我的理解 - 程序應該停止運行,但相反,它崩潰沒有例外?有什麼不同 ? – Dunaril 2011-02-24 23:24:24

+0

那麼,它不會「崩潰」。編譯他的代碼,這是有道理的。它不會在循環結尾查詢用戶輸入。 – corsiKa 2011-02-24 23:25:09

1

您正在爲您的while循環條件抓取整條線。

試試抓住next()而不是nextLine()

另外,你看的時候它等於0 ...意思是相等的。我會改爲!=。當下一個令牌不是Q時,您希望繼續循環。

+0

是的!工作感謝你我一直坐在這裏看着最後2個小時試圖弄清楚這一點。我很感激 – Brad 2011-02-24 23:27:42

+1

我知道它的工作原理,因爲我將它編譯到我的機器上的代碼中。 :-)現在,這些都是你所問問題的答案......但是...... Dunaril,雖然他沒有回答這個問題,但提出了一個非常重要的觀點。當你把體重放在「abc」時會發生什麼?它死了......你實際上可以從中恢復!我不知道你是否瞭解異常處理,但如果你沒有,你應該看看它。 – corsiKa 2011-02-24 23:29:52

+0

是的,我知道我會嘗試做這件事後,我得到了這個工作。 – Brad 2011-02-24 23:33:11

0

讓我們進行結構更改,使其更容易執行。

我們將改變它,以便您的do-while循環始終運行,直到您明確地告訴它停止。

您當前的一方面是:

while(stdIn.nextLine().compareToIgnoreCase("q")==0);

其中工程確定,但我們有一個更簡單的方法來做到這一點。你有沒有聽說過break聲明?我建議你使用break。這個語句會將你從while循環中「分離」出來;基本上它告訴程序在被調用時停止循環。這會比你稍微困惑的時候更容易遵循。

do { 

    //Your Do code goes here, as before 
    ... 
    // 

    //Your newly added break statement will go here. 
    //This breaks out of the while loop when your inputed 'choice' value is 
    //equal to the string of "q" (for quit) 
    if (Choice.equals("q"))){ 
    break; 
    //When break is called nothing else in the loop will run 
    } 

    //Same thing but with the string of "quit" 
    if (Choice.equals("quit"){ 
    break; 
    } 



}while (true); 
//Your new while statement is simply while(true) which will run until break is called 

希望這對您有所幫助。

0

實際上不使用循環。由於回答太多問題會讓某些人無法將呼叫堆棧放大,因此只需將整個操作作爲一項功能即可。在函數結束時,調用本身如果結果不是Q.

0

其簡單的使用這個

while (true) 
{ 
    Console.WriteLine("Start processing"); 
    //processing code here 
    Console.WriteLine("finish processing"); 

    Console.WriteLine("start again? y/n?"); 
    if (Console.ReadLine().Equals("n")) 
     break; 
}