проблема с данными во время цикла в Java - PullRequest
1 голос
/ 02 марта 2011

работает этот код, я не могу добавить номер правильно. он только добавляет данные из последнего цикла

public class P4_3
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        System.out.println("Please enter your 8 digit Credit Card Number ");
        String cardNumber = in.next();

        if (cardNumber.length() == 8)
        {
            int totalFirst = 0;
            int currentIndex = cardNumber.length() - 1;
            int secondIndex = cardNumber.length() -2;
            int secondDouble = 0;
            String collectDigit;
            int digitSecond = 0;
            int digitFirst = 0;
            int totalDigit = 0;

            while (currentIndex >= 0)
            {       
                int smallValue = Character.digit(cardNumber.charAt(currentIndex), 10);
                totalFirst = totalFirst + smallValue;
                currentIndex = currentIndex - 2;
                int secondValue = Character.digit(cardNumber.charAt(secondIndex), 10);
                secondDouble = secondValue * 2;
                secondIndex = secondIndex - 2;
                System.out.println("second double " + secondDouble);
                collectDigit = Integer.toString(secondDouble);

                if (collectDigit.length() == 2)
                {
                    digitFirst = Character.digit(collectDigit.charAt(0), 10);
                    digitSecond = Character.digit(collectDigit.charAt(1), 10);
                    totalDigit = digitFirst + digitSecond;
                    System.out.println("First digit " + digitFirst);
                    System.out.println("Second digit " + digitSecond);
                }
                else 
                {
                    digitFirst = Character.digit(collectDigit.charAt(0), 10);
                    totalDigit = digitFirst;
                }        
            }

            int checkNumber = totalDigit + totalFirst;
            System.out.println("Card check number = " + checkNumber);

            if (checkNumber % 5 == 0)
            {
                System.out.println("The final digit of Check number is 0" + checkNumber);
            }
            else
            {
                System.out.println("The credit card number is not valid " + checkNumber);
            }
        }
        else
        {
            System.out.println("Credit Card number not correct length");
        }
    }
}

Ответы [ 2 ]

1 голос
/ 03 марта 2011

ОК, ваш обновленный код немного сложен для отслеживания (даже при правильном форматировании), но если я понимаю, что он пытается сделать здесь, это может быть более простой способ сделать это (и я использую здесь исключения RuntimeExceptions):

public class P4_3_simple {
  public static int checkNumber(String cardNumber) {
    int size = cardNumber.length();
    int sum_firsts = 0;
    int sum_seconds = 0;

    if(size == 8) {
      for(int index = 7; index >= 0; index -= 2) {
        int first = Character.digit(cardNumber.charAt(index), 10);
        int second = Character.digit(cardNumber.charAt(index - 1), 10) * 2;
        sum_firsts += first;
        sum_seconds += addDigits(second);
      }
    } else {
      throw new RuntimeException("Credit Card number not correct length");
    }

    return sum_firsts + sum_seconds;
  }

  public static int addDigits(int value) {
    int reduced = value;
    if(reduced > 9) {
      reduced = 0;
      char[] digits = Integer.toString(value, 10).toCharArray();
      for(char digit : digits) {
        reduced += Character.digit(digit, 10);
      }
    }

    return reduced;
  }

  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Please enter your 8 digit Credit Card Number ");
    int checkNumber = checkNumber(in.next());
    System.out.println("Card check number = " + checkNumber);
    if (checkNumber % 5 == 0) {
      System.out.println("The final digit of Check number is 0" + checkNumber);
    } else {
      System.out.println("The credit card number is not valid " + checkNumber);
    }
  }
}

Тест 13345678 возвращает действительную кредитную карту (с контрольной суммой 35). Что касается того, где ваш код пошёл не так, похоже, что ваши присваивания totalDigit сбрасывают его значение в последний выполненный цикл. Я, конечно, предполагаю, что вы имеете в виду это, когда говорите, что добавлена ​​только последняя сумма. Если я ошибаюсь, вы можете изменить мой код и получить то же поведение, что и ваш код (только с меньшим количеством глобальных переменных)

0 голосов
/ 02 марта 2011

Я не знаю, с какого значения currentIndex начинается, но если оно равно 0 или 1, то первая итерация в цикле установит его на отрицательную территорию, и ваше условие while требует, чтобы оно было больше или равно 0.

Короче говоря, если currentIndex начинается с 0 или 1, до выхода из цикла у вас будет только одна итерация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...