2011-11-29 32 views
0

我目前正在寫一個程序,它要求一個三位數,並檢查其對隨機3位數字,由計算機生成的用戶。用戶輸入的號碼必須有三個唯一的數字,因爲該電腦號碼也有三個唯一的數字。 到目前爲止,我已經設法將用戶的三位數字轉換爲數組,每個數組的位置都有一位數字,但是我無法正確驗證它。它能夠識別兩個相同的數字,因此它需要向用戶詢問具有3個不同數字的新數字(即,循環回到開始),直到用戶遵守時爲止。 System.out.println僅供我檢查是否選取了兩位數字。這是我的代碼到目前爲止。這是一種方法,而不是整個程序。檢查獨特的數字數組和循環回

public static int[] getUserNumberDebugMode(String compNum){ 
    final int RANDOM_NUMBER_SIZE = 3; 
    int[]userNumber = new int [RANDOM_NUMBER_SIZE]; 

    String userGuessAsString; 

    userGuessAsString = JOptionPane.showInputDialog(compNum + "\n Please enter a number."); 
    int number = Integer.parseInt(userGuessAsString); 

    // put three digit number individually into array 
    for(int loop = (userNumber.length - 1); loop>=0; loop--){ 
     userNumber[loop]= number%10; 
     number = number/10; 
    } // end userNumber array populating 

    for (int outerloop = 0; outerloop < userNumber.length; outerloop++){ 
     for (int innerloop = outerloop - 1; innerloop > -1; innerloop --){ 
      while (userNumber[outerloop] == userNumber [innerloop]){ 
      System.out.println("user compare: " + outerloop + " with: " + innerloop); 
      } // end while loop 
     }// end inner loop 
    } // end outer loop 

    return userNumber; 
} // end getUserNumberDebugMode 
+1

這很難閱讀,也很難理解你要求什麼。什麼不工作?你看到了什麼與你期望的是什麼?你已經嘗試了什麼? – ziesemer

+0

目前它發現兩個數字相同時無限循環。例如,如果用戶輸入323,它應該向用戶詢問具有唯一數字的數字,如326,然後將數字放入數組並再次檢查。 – ketisfolk

+0

我已經解決了這個問題,但以後不能發佈我的解決方案。感謝你的幫助。 – ketisfolk

回答

2

已經解決了由時鐘了一個唯一的號碼檢查,如果任何號碼匹配,然後把整個事情在做的問題/ while循環,而唯一的號碼檢查> 0不是最優雅的修復我當然,但它的作品,它會做的。

do{ 
     uniqueCheck = 0; 
     userGuessAsString = JOptionPane.showInputDialog(compNum + "\n Please enter a number."); 
    int number = Integer.parseInt(userGuessAsString); 

    // put three digit number individually into array 
    for(int loop = (userNumber.length - 1); loop>=0; loop--){ 
     userNumber[loop]= number%10; 
     number = number/10; 
    } // end userNumber array populating 

    for (int loop = 0; loop < userNumber.length; loop++){ 
     for(int innerLoop = 0; innerLoop < userNumber.length; innerLoop++) { 
      if(loop != innerLoop) { 
       if (userNumber[loop] == userNumber[innerLoop]){ 
        JOptionPane.showMessageDialog(null, "Please enter three unique digits!", "ERROR", JOptionPane.ERROR_MESSAGE); 
        uniqueCheck ++; 
       } // end inner IF loop 
      } // end outer IF loop 
     } // end inner for loop 
    } // end outer for loop 

    } while (uniqueCheck > 0); 
0

好吧,你可能不希望最內層的「while」循環,因爲只要你得到一個匹配的值,它就會永遠運行。

然而,關於你的outerloop和innerloop值,你檢查userNumber是第一次,outerloop0innerloop-1。可能不是你想要的。爲了讓您的循環邏輯正確,只需逐行確定每行代碼,確定每個步驟中每個變量的含義(或者在調試器中執行此操作)。這應該可以幫助你糾正你的邏輯。

0

作爲家庭作業幫助,我會建議你看着這個錯誤的方式。請記住,當O(n)解決方案可用時,方法中的錯誤會導致三重嵌套循環和O(n^2)或更糟。

這聽起來像你不是在找一個3位數的號碼,你要找的3位 - 這些都是非常不同的事情 - 如果順序並不重要,讓你這個事實的工作。如果你只是尋找X位數字,並在第一個數字之後驗證它沒有被看到的次數超過N次(這裏N = 0),那麼你選擇了錯誤的東西來構成一個數組。

你應該能夠做到這一點沒有嵌套循環。如果你非常小心,我相信你應該可以只用一個循環來完成它(假設數組初始化爲一個健全的或者你可以檢查單元是否被初始化)。如果你只是更聰明一些,你可能會爲下一個問題正確解決這個問題,包括10個唯一的數字,或者數字不超過3次,或者擴展爲包含字母。

換句話說,你是否正在對此進行冒泡排序?要確定在位置Y處的值是否已經在前面看過,是否正在通過位置0到Y-1進行迭代?那麼你是否在Y + 1的位置重複了0到Y?

+0

它需要在一個數組中,以便它可以在計算機號碼上匹配位置和數字在三位數內但不在正確位置的數字進行檢查,例如。 326與367相比,會給一個「靶心」,3,和一個「重災區」,在6我已經得到了工作,只是沒有用戶驗證。首先,用戶必須一次輸入一個號碼,但規範指出用戶需要能夠一次輸入3位數字。 – ketisfolk

+0

好吧,我並沒有考慮Mastermind的實施。關於這類問題的最佳解決方案已經有相當多的關注,但對於這樣的問題,我仍然會說你正在查看錯誤的數組 - 不要使用存儲數字的位置數組,而是使用數組數字存儲位置。 (如果你不熟悉的策劃,只是搜索「智多星遊戲」) – fencepost

1

我沒有經過該程序,因爲它看起來有點複雜,你想要達到的目標。要確保用戶輸入一個帶有3個唯一數字的數字,請嘗試使用此算法:

  1. 拆分用戶輸入的字符串中的字符。
  2. 將每個字符轉換爲一個整數並將其放入Set中。
  3. 將它添加到Set中時,請確保set.add()返回true。
  4. 如果不是,那麼這些數字不是唯一的,您可以拋出錯誤並從用戶處重新獲取數據。
  5. 否則繼續與計算機生成的數字進行比較。

簡單得多,而不是循環。

+0

+1提套 - 絕對正確的數據結構來檢查的獨特性。 –