Как остановить бесконечный цикл для кода проверки UPC

мой код имеет бесконечный цикл, и я не могу его сломать. Также при вставке пустой строки мне говорят, что произошла ошибка индекса. Пожалуйста помоги!

Первым шагом проверки действительного UPC является сложение нечетных цифр позиции и умножение на три, затем вы добавляете это число к сумме четных цифр позиции. Затем вычислите остаток при делении на 10. Если остаток не равен нулю, вычтите этот остаток из 10, чтобы получить контрольную цифру. Если остаток равен нулю, то контрольная цифра должна быть 0.

public static void main(String[] args) {
            Scanner in = new Scanner (System.in);
            System.out.println("Enter a UPC (enter a blank line to quit): ");
            String enterUPC = in.nextLine();
            int length = enterUPC.length();
            int checkDigit=0;

          char char1, char2, char3, char4, char5, char6, char7, char8, char9, char10, char11, char12;
          int num1, num2, num3, num4, num5, num6, num7, num8, num9, num10, num11, num12;


          char1 = enterUPC.charAt(0);
          num1 = Character.getNumericValue(char1); 
          char2 = enterUPC.charAt(1);
          num2 = Character.getNumericValue(char2); 
          char3 = enterUPC.charAt(2);
          num3 = Character.getNumericValue(char3); 
          char4 = enterUPC.charAt(3);
          num4 = Character.getNumericValue(char4); 
          char5 = enterUPC.charAt(4);
          num5 = Character.getNumericValue(char5); 
          char6 = enterUPC.charAt(5);
          num6 = Character.getNumericValue(char6); 
          char7 = enterUPC.charAt(6);
          num7 = Character.getNumericValue(char7); 
          char8 = enterUPC.charAt(7);
          num8 = Character.getNumericValue(char8); 
          char9 = enterUPC.charAt(8);
          num9 = Character.getNumericValue(char9); 
          char10 = enterUPC.charAt(9);
          num10 = Character.getNumericValue(char10); 
          char11 = enterUPC.charAt(10);
          num11 = Character.getNumericValue(char11); 
          char12 = enterUPC.charAt(11);
          num12 = Character.getNumericValue(char12); 



            while(length > 0) {
                //Algorithm Step One and Algorithm Step Two
                int stepOne = (num1 + num3 + num5 + num7 + num9 + num11) * 3;
                int stepTwo = stepOne + (num2 + num4 + num6 + num8 + num10);

                while (length == 12) {
                //Algorithm Step Three
                if(stepTwo%10!=0) {
                    checkDigit = 10 - (stepTwo%10);
                }
                else {
                    checkDigit = 0;}

                System.out.println("Check digit should be : " + checkDigit);
                System.out.println("Check digit is: " + num12);

                }
            }
                if(checkDigit == num12) {
                    System.out.println("UPC is valid");
                }
                else {
                    System.out.println("UPC is not valid");
                }


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

            } 
    }

person Michael    schedule 12.10.2014    source источник
comment
Во-первых, вы никогда не уменьшаете длину, а во-вторых, когда у вас есть имена переменных с одинаковыми именами, но разными числовыми суффиксами, это должно быть огромным красным флагом, что вы должны использовать массивы (или коллекции).   -  person nmore    schedule 13.10.2014


Ответы (2)


Вам нужно уменьшить длину в ваших циклах while, иначе длина всегда будет равна 12 или больше 0 и т. д. Кроме того, вы можете рассмотреть возможность использования целых чисел, а не печатать все эти объявления. Затем вы можете перебирать их, используя цикл for с переменной temp char, поэтому вам не нужно инициализировать их все таким образом. Ваш цикл for может выглядеть так:

char[] arrayChars = new char[enterUPC.length()];
int[] arrayInts = new int[enterUPC.length()];
for(int i=0;i<enterUPC.length();i++) {
   char temp=enterUPC.charAt(0);
   num[i] = Character.getNumericValue(temp);
}

Затем в цикле while прокрутите массив int и добавьте все 0 + все четные индексы, умножьте на 3 и добавьте все нечетные индексы. Кроме того, вы никогда не проверяете, пуста ли строка.

person Daniel Margosian    schedule 12.10.2014

Ваши циклы while проверяют переменную length, но вы не меняете ее внутри цикла. Таким образом, цикл никогда не заканчивается.

Если вы хотите повторно прочитать число со сканера и выполнить алгоритм UPC, то чтение, разбиение на цифры и вычисление длины должны быть внутри цикла. Если вы хотите сделать это только один раз, там вообще не должно быть цикла.

Ваше условие цикла не должно проверять длину, потому что все было перемещено внутрь. Вместо этого создайте цикл do-while или бесконечный цикл while:

while ( true ) {

    System.out.println("Enter a UPC (enter a blank line to quit): ");
    String enterUPC = in.nextLine();
    int length = enterUPC.length();

    if ( length == 0 ) {
        break;
    }

    // All the rest of the processing is done here.

}

Обратите внимание, что этот цикл должен быть сразу после вашего определения сканера. И он завершается проверкой длины после входа пользователя. Вот почему там есть оператор if.

person RealSkeptic    schedule 12.10.2014
comment
Не могли бы вы показать мне, где в коде это должно быть? Я переместил все внутрь цикла, и он все еще бесконечен. - person Michael; 13.10.2014
comment
@Michael Хорошо, я отредактировал свой ответ, добавив фрагмент, показывающий цикл и то, что было перемещено внутри. Я надеюсь, что теперь это более полезно. - person RealSkeptic; 13.10.2014
comment
Спасибо за помощь. Еще один быстрый вопрос - как теперь разорвать цикл, потому что после запуска программы она автоматически снова запросит ввод нового кода UPC. Спасибо! - person Michael; 13.10.2014
comment
@Michael Как я уже писал, цикл прерывается в операторе if. Если пользователь вводит пустую строку, условие if становится истинным, и тогда оператор break выходит из цикла. - person RealSkeptic; 13.10.2014