2017-02-25 6 views
1

なぜ私の出力がそうではないかを調べようとしています。与えられたサンプルは、UPCを(終了する空白行を入力してください)UPCコードの問題

入力されている:036000291453チェックデジット は次のようになります。2チェックデジットである:3 UPCは(空白を入力してUPCを入力し、有効な

ではありません終了する行):036000291452チェックデジット は次のようになります。2チェックデジットがある:014633149077チェックデジット は次のようになります:2 UPCは、UPCを(終了する空白行を入力してください)を入力し、有効な

ある4チェックデジットです:7 UPCが無効です

UPCを入力してください(終了する空白行を入力してください):014633149074チェック桁 は以下のようになります:4チェック桁数:4 UPCが有効です

UPCを入力してください(終了する空白行を入力してください):0853911765722 ERROR! 085391176572チェックデジット は次のようになります:2チェックデジットは次のとおりです。2 UPCは空白を入力します(UPCを入力し、有効な

あるUPC は正確に12桁

は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()がnullベースのインデックスを使用しますが、命令は、あなたが1ベースのインデックスを使用したいと考えていなければなりません。したがって、odd()はi = 0で始まり、even()はi = 1で始まります。

第2に、Character.getNumericValue(ch)を使用して文字のユニコードコードポイント値を取得します。桁の値。代わりに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