2017-02-25 62 views
1

我一直在試圖找出爲什麼我的輸出不是它應該是。給出的樣品是UPC代碼問題

輸入UPC(輸入一個空行退出):036000291453校驗位 應該是:2校驗位爲:3 UPC無效

輸入UPC(進入一個空白行退出):036000291452校驗位 應該是:2校驗位爲:2 UPC有效

輸入UPC(輸入一個空行退出):014633149077校驗位 應該是:4校驗位爲:7 UPC無效

輸入UPC(輸入一個空行退出):014633149074校驗位 應該是:4校驗位爲:4 UPC有效

輸入UPC(輸入一個空行退出):0853911765722錯誤! UPC 必須剛好有12位

輸入UPC(輸入一個空行退出):085391176572校驗位 應該是:2校驗位爲:2 UPC有效

輸入UPC(進入一個空白退出):再見!

獲得該輸出的算法是此從左至右,添加位數奇數位置(開始爲1的計數),並乘以3. 結果從左至右,加在第1步中計算出的總數爲偶數位置的數字 取第2步的結果並計算除以10後的餘數(模數爲10)。如果餘數不爲零,則從10中減去該餘數以得到校驗位。如果餘數是零,那麼校驗位應該是0

String str1 = validinput(in); 
    int odd1 = odd(str1); 
    int even1 = even(str1); 
    int f = (odd1+even1)%10; 
    if(f != 0){ 
     f = 10-f; 
    } 
    System.out.println(odd1); 
    System.out.println(even1); 

    System.out.println("Check digit should be: "+f); 
    System.out.println("Check digit is: "+str1.charAt(11)); 
    int y = Character.getNumericValue(str1.charAt(11)); 
    if (f == y){ 
     System.out.println("UPC is valid"); 
    } 
    else{ 
     System.out.println("UPC is not valid"); 
    } 
} 


private static String validinput(Scanner inScanner){ 

    System.out.print("Enter a UPC (enter a blank line to quit): "); 
    String str = inScanner.nextLine(); 


    while(str.length() != 12){ 
     if (str.length() == 0){ 
      System.out.println("Goodbye"); 
      break; 
     } 
     else{ 
     System.out.println("ERROR! UPC MUST have exactly 12 digits"); 

     System.out.print("Enter a UPC (enter a blank line to quit): "); 
     str = inScanner.nextLine(); 
     } 
    } 
    return str; 
} 


private static int odd(String input){ 
    int i = 1; 
    char ch; 
    int sumOdd = 0; 
    while (i < 11){ 
     ch = input.charAt(i); 
     int x = Character.getNumericValue(ch); 
     sumOdd = x +sumOdd; 
     i += 2; 
    } 
    int Mx3=sumOdd*3; 
    return Mx3; 
} 


private static int even(String input){ 
    int i = 0; 
    char ch; 
    int sumEven = 0; 
    while (i < 11){ 
     ch = input.charAt(i); 
     int x = Character.getNumericValue(ch); 
     sumEven = x +sumEven; 
     i += 2; 
    } 

    return sumEven; 
} 

回答

0

charAt()使用基於零的索引,但指示要你使用基於1的索引。因此,在奇數()從i = 0開始。並且在even()中以i = 1開始。

其次,您使用Character.getNumericValue(ch)獲取字符的Unicode碼值,但指令要求您使用數字值。因此,請改用Integer.parseInt(ch.ToString())

private static int odd(String input){ 
    int i = 0; 
    char ch; 
    int sumOdd = 0; 
    while (i < 11){ 
     ch = input.charAt(i); 
     int x = Integer.parseInt(ch.ToString()); 
     sumOdd = x +sumOdd; 
     i += 2; 
    } 
    int Mx3=sumOdd*3; 
    return Mx3; 
} 


private static int even(String input){ 
    int i = 1; 
    char ch; 
    int sumEven = 0; 
    while (i < 11){ 
     ch = input.charAt(i); 
     int x = Integer.parseInt(ch.ToString()); 
     sumEven = x +sumEven; 
     i += 2; 
    } 

    return sumEven; 
} 

代碼沒有測試

+0

由於這個問題是奇數和偶數。 – Ryan