2016-09-24 230 views
0

好日子的傢伙,我是新來的。我正在爲我的前衛部隊做一個任務,所以請耐心等待。JAVA:if語句裏面的for循環和退出for循環

所以我要做的是寫一個代碼,可以輸入從1到120之間的整數的人的年齡。然後用戶必須計算平均年齡,並且應該以實數計算。但用戶必須輸入年齡值,直到用戶輸入0,即停止程序然後輸出平均值。如果用戶輸入的年齡無效,那麼程序應該繼續重新提示用戶,直到他們輸入有效年齡。

所以我盡了我的一份力。我創建了一個代碼,我想出了這一點:

public static void main(String[] args) 
{ 

    int ageValue = 0; 
    double getAge; 
    getAge = inputAge(); 
    System.out.println("Average age is: " + getAge); 
} 

public static double inputAge() 
{ 
    int ageValue = 0; 
    double avgAge = 0; 
    Scanner sc = new Scanner(System.in); 
    for (int i = 1; i <= 120; i++) 
    { 
     System.out.println("Enter age"); 
     ageValue += sc.nextInt(); 

     avgAge = ageValue/(double) i; 
     if (ageValue == 0) 
     { 
      System.out.println("Average age is: " + avgAge); 
      System.exit(0); 
     } 
     while (ageValue < 0 || ageValue > 120) 
     { 
      System.out.println("Invalid input. Try again!"); 
      ageValue = sc.nextInt(); 
     } 

    } 

    return avgAge; 
} 

現在我放下我的代碼,我得到了我的平均公式莫名其妙地工作。現在,問題是,當我按0時,它不會提示「if」語句。但是,當第一個「輸入你的年齡」提示出現,我按0,「if」聲明工作。但是對於每次迭代,程序都不會讓我執行語句。

另一方面,我也在努力弄清楚如何在不使用break或System.exit()的情況下退出循環,因爲這會給我零標記。我想要的是當我按0時,它應該退出循環並輸出平均值,就像任務所說的那樣。

我不知道你們是否可以得到它..代碼是否正確?我在正確的軌道上嗎?我錯過了什麼?

乾杯

回答

1

你可以考慮一個do while循環的方法。這將允許您的代碼自然運行一次,並在用戶輸入0後退出:

int ageValue = 0, numOfAges = 0, sumOfAges = 0; 
do { 
    System.out.println("Enter age"); 
    ageValue = sc.nextInt(); 
    if (ageValue < 0 || ageValue > 120) 
     System.out.println("Bad value... try again"); 
    else if (ageValue != 0) { 
     sumOfAges += ageValue; 
     numOfAges++; 
    } 
} while (ageValue != 0); 
return ((double)sumOfAges/numOfAges); 
+0

以及修復各種錯誤,這也是該部門只有一次。應該注意的是,如果用戶輸入nextInt無法解析的內容,這會引發異常。 – Rodney

+0

哦,真的沒有意識到while while循環。謝謝,這解決了我的問題 – Seth

0

在另一方面,我也在努力找出如何退出循環,而不使用斷點或System.exit()的,因爲這會給我零分。

你可以有另一種情況在你像這樣

boolean finished = false; 
for (int i = 1; i <= 120 && finished == false; i++) 

循環和更換

System.exit(0) 

finished = true; 

但是,我爲什麼用「破發會質疑「會給你零分。這正是這種場景中斷的意圖。

+0

感謝您的回覆。而且,它應該只用於switch case語句。不知道爲什麼,但我的導師說如此 – Seth

+0

「應該只用於switch case」..那是他/她的意見。 Oracle教程給出了什麼時候適合擺脫for循環的好例子https://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html – Rodney

0

你可以試試這種方法。

我已經糾正了一點退出條件和平均完成的方式。

您在代碼中顯示的「for」循環將樣本數量限制爲120,但問題不會這麼說,所以我冒昧地將您的問題推廣到任意數量的樣本中。

第一件事是你應該查找「if-else」條件結構,因爲這是你的代碼中缺少的主要觀點。

https://en.wikipedia.org/wiki/Conditional_(computer_programming)

你能想到的問題是表現爲方式:

  1. 在意甲計算平均
  2. 意甲是鍵盤輸入
  3. 時零輸入,退出循環並返回當前平均值
  4. 當輸入任何超出範圍[0,120]的值時,給出消息並繼續循環而不更改任何值意甲
  5. 當結合的[1119]內的任何值被輸入物品的價值添加到意甲,並重新計算平均

    import java.util.ArrayList; 
    import java.util.List; 
    import java.util.Scanner; 
    
    public class Test 
    { 
        public static void main(String[] args) 
        { 
         System.out.println("Final Average age is: "+inputAge()); 
        } 
    
        private static double inputAge() 
        { 
         int ageValue=0; 
         double avgAge=0; 
         boolean shouldExit=false; 
         Scanner sc=new Scanner(System.in); 
         List<Integer> samples=new ArrayList<Integer>(); 
         // loop until flag is true 
         while(!shouldExit) 
         { 
    
          System.out.println("Enter age"); 
          ageValue=sc.nextInt(); 
          if(ageValue==0) 
          { 
           shouldExit=true; 
          } 
          else if(ageValue<0||ageValue>120) 
          { 
           System.out.println("Invalid input. Try again!"); 
          } 
          else 
          { 
           // add current input in the samples and calculate average over all the samples 
           samples.add(ageValue); 
           avgAge=getAvg(samples); 
           System.out.println("Current Average age is: "+avgAge); 
          } 
         } 
         sc.close(); 
         return avgAge; 
        } 
    
        private static double getAvg(List<Integer> samples) 
        { 
         double avgAge=0; 
         for(Integer tmp:samples) 
         { 
          avgAge+=tmp; 
         } 
         return avgAge/(double) samples.size(); 
        } 
    } 
    
+0

將研究一下! – Seth