2009-12-14 18 views
-1

我該如何編寫一個查詢控制循環,將繼續從用戶輸入int值,每個值添加到總和,然後詢問用戶是否有另一個值來輸入,直到用戶說有沒有更多的價值在java中的查詢控制循環

+1

這功課嗎? – 2009-12-14 15:34:07

回答

3
double sum = 0; 
while (user.hasMoreInput()) { 
    double += user.mostRecentInput(); 
} 

您實現hasMoreInputmostRecentInput你比擬。

+0

呵呵,很好。 +1 :) – Bombe 2009-12-14 15:39:36

+0

確切。將代碼映射到代碼是非常容易:) – 2009-12-14 15:52:35

-1

Java Developer's Almanac始終是諸如您的基本示例的良好來源。

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
String str = ""; 
while (str != null) { 
    System.out.print("> prompt "); 
    str = in.readLine(); 
    process(str); 
} 

編輯:顯然有些人認爲一些技術的要點的演示應該有錯誤檢查。也許我也應該評論這些代碼,並提供了一個規範。下次,我還會開發一些自定義註釋來表達事前和事後條件,或者在Eiffel中起草一個實現。

+0

+1:很好的答案,謝謝你的鏈接!但是我敦促讀者在'catch'塊中編寫一些有用的東西。這種譴責異常的可恥行爲造成了各種用戶的挫敗感。我會說這樣的代碼不應該出現在年曆中;它不會傷害他們包含額外的代碼行。 – 2009-12-14 15:37:06

+2

不,我收回它。代碼太可怕了! 'readLine()'後面跟着'process(str)'而沒有空的檢查。像這樣編碼的人沒有商業寫作年曆。 – 2009-12-14 15:39:15

+1

這是一種很奇怪的做REPL的方式 - 當你到達EOF時你將處理一個空字符串。更常用的用法就像'prompt(); for(String cmd;(cmd = in.readLine())!= null;){process(cmd);提示(); }' – gustafc 2009-12-14 15:41:08

1

這就是我寫這樣一個循環。我不應該爲你寫作業,但我仍然想展示我喜歡的這種循環風格。

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
while (true) { 
    System.out.print("> prompt "); 
    String str = in.readLine(); 
    if (str == null) break; 
    process(str); 
} 

有些人可能不喜歡

  • while (true) - 它看起來像一個無限循環因爲它是!這與用戶在輸入輸入時的耐心一樣無限。
  • 單行if - 有些人寧願把它做​​成一個完全括號的3班輪。但我沒有看到任何用處;結果它不會變得更可讀。
  • break in mid-loop。這就是break!這是你逃脫孵化,否則無限循環。

如果你習慣於閱讀Java代碼,這是習慣和清晰。優點:

  • 它顯示了發生的順序完全按照它們發生的順序;
  • 它將str的範圍限制在需要的位置;
  • 這是非常明確的終止條件;
  • 它非常簡潔。更少的行數=更少的錯誤,我總是說。
0

有幾件你需要處理。首先,您需要知道如何接收用戶的輸入。 Java開發者的年鑑例子(http://www.exampledepot.com/egs/java.io/ReadFromStdIn.html),我發現這個樣子的:

try { 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     String str = ""; 
     while (str != null) { 
      System.out.print("> prompt "); 
      str = in.readLine(); 
      process(str); 
     } 
    } catch (IOException e) { 
} 

你可能會取代「>提示符」的東西更多的描述。您還希望有一個更好的方式讓用戶退出,而不是輸入空白行,所以如果他們完成了,也許可以讓他們輸入'q'。然後,將while循環中的比較更改爲!str.toLowerCase()。equals(「q」)。然後,您需要實現處理函數以將字符串轉換爲整數。 Integer.parseInt(String)將返回正確表示整數(即「3」或「49」但不是「7e」)的String的整數值,否則將拋出NumberFormatException。因爲你不希望你的應用程序在錯誤輸入中發生異常而失敗,所以我認爲在非整型字符串的情況下(即,當你捕獲一個NumberFormatException),這個過程可能只返回0。

最後,您需要在主循環之前初始化一個總和變量,並且您可以在每次迭代過程中添加process的結果。然後當循環結束時,您可以使用System.out.println將process的結果打印到屏幕上。

我故意遺漏了大部分的代碼,因爲這聽起來像是作業,但如果你能理解所有這一切足夠把它放在一起,我認爲你已經學會了它足夠自己做。

+0

空捕獲?至少做一個printStackTrace!或者根本不抓住......更糟的是如上所述隱藏錯誤。 – 2009-12-14 18:12:35

+0

正如我上面提到的,該代碼只是從該鏈接逐字複製而來。 catch語句不會忽略它的大括號,它只是不縮進。 – danben 2009-12-14 22:03:57

+0

還沒有說關於丟失緊箍的任何東西... – 2009-12-17 19:34:45

0

這就是我通常的做法。儘可能少的代碼:)。

String s; 
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
while((s = in.readLine()) != null) 
    process(s); 
+0

不是「儘可能少」,贏了2行:'while(process(in.readLine())); ....(不是說我會那樣做) – 2009-12-14 18:16:32

+0

好吧,你需要有一個if(s!= null)裏面的進程,所以目前還不清楚你的版本是否真的很短。 – 2009-12-15 17:03:22

+0

本來是一個笑話,但我仍然不需要'String s;'行,並且很可能我會有一個檢查(空字符串)或至少一個聲明在進程中...... :-) – 2009-12-17 19:32:25