2015-10-19 101 views
1

我需要編寫一個程序,該程序從用戶讀取3個字母和3位數字並將它們插入到一個數組中(格式爲:ABC-123)。JAVA車牌號碼

我怎樣才能讓一個循環,要求用戶輸入5 * 3個字母和5 * 3數字,直到他正確回答(只有3個字母「請輸入3個字母」,只有3個數字後「請輸入3位數字?」

我迄今爲止代碼:

package bmm; 

    import java.util.*; 
    import java.util.regex.Pattern; 
    public class bmm { 

     public static void main(String[] args) { 
      Scanner scr = new Scanner(System.in); 
      String[] letter = new String[5]; 
      int[] number = new int[5]; 
      int db = 0; 
      do { 
       for (int i = 0; i < letter.length; i++) { 

        System.out.println("3 letters please:"); 
        letter[i] = scr.nextLine(); 
        if (Pattern.matches("[a-zA-Z]+", letter[i]) == false || letter[i].length() != 3) { 
         System.out.println("not letters or too short/long"); 
        } else { 
         db++; 
        } 
       } 
      } while (letter[db].length() != 3 && Pattern.matches("[a-zA-Z]+", letter[db]) != true); 
     } 
    } 
} 

回答

1

你最大的問題是你如何處理迴路;你有他們嵌套在錯誤的順序

你有do循環,應該。循環直到輸入字符串與req匹配uirements。 這個循環中,你有一個for循環遍歷數組(我假設用戶應該輸入5個有效的許可證號?)。由於從0到4的循環處於內部,因此在檢查do末尾的條件之前,程序會遍歷整個陣列。這不是你想要的。您想先輸入letter[0]開始,然後繼續輸入,直到用戶輸入letter[0]的有效輸入。然後你繼續輸入letter[1],循環直到輸入有效,依此類推。我想這就是你想要做的,對吧?爲了這樣做,執行檢查的循環必須位於for循環內。另外,你已經定義了兩個變量,它們應該表示數組索引,idb,你的程序似乎對它正在使用哪一個變量感到困惑。你不需要兩個。

這裏的循環應該是什麼樣子,大約:

do { 
    System.out.println("3 letters please:"); 
    letter[i] = scr.nextLine(); 
    if (Pattern.matches("[a-zA-Z]+", letter[i]) == false || letter[i].length() != 3) { 
     System.out.println("not letters or too short/long"); 
    } 
} while (letter[i].length() != 3 && Pattern.matches("[a-zA-Z]+", letter[i]) != true); 

除了&&這裏是錯誤的。您上面使用||;爲什麼他們會不同?事實上,你不應該重複兩次。您可以保存比賽結果的boolean變量:

boolean invalid; 
do { 
    System.out.println("3 letters please:"); 
    letter[i] = scr.nextLine(); 
    invalid = (Pattern.matches("[a-zA-Z]+", letter[i]) == false || letter[i].length() != 3); 
    if (invalid) { 
     System.out.println("not letters or too short/long"); 
    } 
} while (invalid); 

,現在你不用擔心,當你鍵入兩次表達犯了一個錯誤。

我不會寫代碼完全一樣(你永遠不必說了一個布爾表達式== false== true,我會使用break代替boolean可變的),但我希望這應該是足以讓你去。

+0

非常感謝您的回答!你解決了我的問題,並幫助我理解了這個dowhile循環。我是一個新手,對於這個遲鈍的問題感到抱歉。無論如何,你離開我掛了:)如果不是這樣,你會如何解決這個問題? –

+0

我不確定有什麼重大的改變。你可以說'!Pattern.matches(「[a-zA-Z] +」,letter [i])'而不是'Pattern.matches(「[a-zA-Z] +」,letter [i])= =假'。你可以擺脫布爾型,使用'while(true){...}'作爲循環,並說'if(!Pattern.matches(...)|| letter [i] .length()! = 3){System.out.println(...); } else {break; }'這將在輸入有效時立即離開循環。 – ajb

0

目前還不清楚你在問什麼或做什麼。如果您給用戶5次輸入一個車牌號的機會,除非您想保留錯誤的答案,否則無需將它們存儲在數組字母[]中。 db和我似乎在他們所做的事情上有衝突。你也沒有匹配任何數字。您可能想要分開循環以使事情更清晰。下面是一個方法,讓單車牌號碼的例子:

public static String getPlate(){ 
    Scanner scr = new Scanner(System.in); 

    int tries = 0; 
    boolean validResponse = false; 

    while (tries<5 || validResponse){ 
     String response = scr.nextLine(); 
     if (Pattern.matches("[a-zA-Z]+", response) == false || response.length() != 3) { 
      validResponse = false; 
     } else { 
      return response; 
     } 
     tries++; 
    } 
    return null; 
} 

然後,當你需要一個板,你可以把它叫做:

String plate = getPlate(); 

,並根據需要填寫您的陣列。