2016-10-04 64 views
0

所以我有這樣的代碼是應該產生長的隨機單詞的用戶具備這些條件決定:我如何重複的if語句,直到它在Java的假

[1] Every other letter is a random vowel (letter + vowel + letter + vowel...etc) 
[2] Two vowels cannot meet together (ie: bout, caravaa) 

我得到了第一部分條件,第二個條件需要一些編輯。 我用一個if語句來檢查letter1letter2恰好是元音,如果是真則產生不同的字母。問題是那些新生成的字母有機會成爲元音。我如何不斷重複if語句直到它是錯誤的? (Letter1 and Letter2 are not vowels)

import java.util.Random; 

public class NickName_1 
{ 
    public static void main(String[] args) 
{ 
    java.util.Scanner scanner = new java.util.Scanner(System.in); 

    int letterNum = 6; 
    Random rn = new Random(); 
    char letter1 = (char) (rn.nextInt(26) + 'a'); 
    char letter2 = (char) (rn.nextInt(26) + 'a'); 
    char[] vowels = { 'a', 'e', 'i', 'o', 'u' }; 
    char vowel; 


    while (true) 
    { 
     //Ask user for word's length and store it 
     System.out.println(); 
     System.out.print("Please enter the length of the word in letters: "); 
     letterNum = scanner.nextInt(); 

     vowel = vowels[(int)(Math.random() * 5)]; 

     for (int i = 0; i < (letterNum/3); i++) 
     { 
      letter1 = (char) (rn.nextInt(26) + 'a'); 
      letter2 = (char) (rn.nextInt(26) + 'a'); 
      vowel = vowels[(int)(Math.random() * 5)]; 

      // if letter1 or letter2 equal a vowel then regenerate letters 
      if (letter1 == 'a' || letter1 == 'u' || letter1 == 'i' || letter1 == 'e' || letter1 == 'o' || 
       letter2 == 'a' || letter2 == 'u' || letter2 == 'i' || letter2 == 'e' || letter2 == 'o') 

      { 
       letter1 = (char) (rn.nextInt(26) + 'a'); 
       letter2 = (char) (rn.nextInt(26) + 'a'); 
      } 
       System.out.print(letter1 + "" + vowel + "" + letter2); 
     } 
    } 
} 
} 
+0

明白的,如果塊不是一個循環,並在它自己的不重複。所以要回答你的問題 - 你沒有。您使用while循環和條件來重複代碼塊。 –

+0

我如何使用while循環並在我的情況下給它條件? @HovercraftFullOfEels –

+3

不要問 - 嘗試和測試。 –

回答

0

您提到過兩條標準。但是代碼甚至不能用while代替if

我已修改您的代碼,以便它可以滿足您的條件。我想指出以下主要內容:

  1. 您正在嘗試一次打印3個字母。這意味着輸入應該是3的倍數,否則程序會失敗。我建議你一次打印一封信。

  2. 您的需要是letter + vowel + letter + vowel...,但是您正在打印letter + vowel + letter + letter + vowel + letter...。相反,我建議保持一個boolean變量,並在每一個回合中改變它,檢查它是否是元音或輔音的轉向,然後在他們自己的代碼塊中做相應的工作。

  3. 這是一個糟糕的做法,最終有一個例外的程序。這就是爲什麼我添加了一個try-catch並在其中包含輸入。

  4. 爲了使您的代碼更方便,Carcigenicatethis comment提出了一個好辦法 - 「做一個功能或設置,檢查會員」。我建議你爲元音製作另一個輔音陣列,然後選擇一個元音。

Here是ideone中的修改代碼。下面是你的代碼版本:

import java.util.Random; 
/* Name of the class has to be "Main" only if the class is public. */ 
class NickName_1 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     // your code goes here 
     java.util.Scanner scanner = new java.util.Scanner(System.in); 

     int letterNum = 6; 
     Random rn = new Random(); 
     char letter = (char) (rn.nextInt(26) + 'a'); 
     boolean shouldCons = true; 
     char[] vowels = { 'a', 'e', 'i', 'o', 'u' }; 

     while (true) 
     { 
      //Ask user for word's length and store it 
      System.out.println(); 
      System.out.print("Please enter the length of the word in letters: "); 
      try{ 
       letterNum = scanner.nextInt(); 
      }catch(Exception e){ 
       break; 
      } 

      for (int i = 0; i < letterNum; i++, shouldCons^=true) 
      { 
       if(shouldCons) { 
        letter = (char) (rn.nextInt(26) + 'a'); 
        while (letter == 'a' || letter == 'u' || letter == 'i' || letter == 'e' || letter == 'o') 
        { 
         letter = (char) (rn.nextInt(26) + 'a'); 
        } 
       } 
       else letter = vowels[(int)(Math.random() * 5)]; 

       System.out.print(letter); 
      } 
     } 
    } 
} 

+1

非常感謝有見地的答案= D。我從中學到了很多東西。 我只有一個問題你使用shouldCons做什麼?什麼時候它不=真??另外,我已經學習了2周的Java,並且我還沒有深入到功能。 –

+1

哦,所以for循環中的shouldCons會在「true」和「false」之間交替出現,從而在每次都是真的時給出一個字母,如果是false,則給出一個元音。 –

+0

@JawnyThompson就是這樣,你自己學會了!快樂學習! :) – manetsus

0

只需用while語句替換if語句即可。

while (letter1 == 'a' || letter1 == 'u' || letter1 == 'i' || letter1 == 'e' || letter1 == 'o' || 
     letter2 == 'a' || letter2 == 'u' || letter2 == 'i' || letter2 == 'e' || letter2 == 'o') 
{ 
    letter1 = (char) (rn.nextInt(26) + 'a'); 
    letter2 = (char) (rn.nextInt(26) + 'a'); 
} 

更新:在你的代碼

來看,這將是更好的檢查每一個單獨的字母,否則letter1可以得到輔音但由於信2是不是繼續改變他們兩個。

while (letter1 == 'a' || letter1 == 'u' || letter1 == 'i' || letter1 == 'e' || letter1 == 'o') 
{ 
    letter1 = (char) (rn.nextInt(26) + 'a'); 
} 
while (letter2 == 'a' || letter2 == 'u' || letter2 == 'i' || letter2 == 'e' || letter2 == 'o') 
{ 
    letter2 = (char) (rn.nextInt(26) + 'a'); 
} 
+0

我試過了,它似乎工作。謝謝你和所有回答我的人。那麼現在這個wile循環會一直重複,直到括號內的條件爲假? 另外,我不明白爲什麼人們會提出問題,這對提問者很有幫助。 PS。我會盡我所能接受答案。 –

+0

這是正確的,它不會退出,直到所有的條件都是假的(因此兩個字母都不是元音)。 – annedroiid

+0

謝謝你,我添加了編輯,因爲它會像你提到的那樣方便。 –