2014-10-12 3 views
0

내 코드에 무한 루프가있어 문제를 해결할 수 없습니다. 또한 빈 줄을 삽입 할 때 색인 오류가 있다고합니다. 도와주세요!UPC 체크 코드 무한 루프를 중지하는 방법

유효한 UPC를 확인하는 첫 번째 단계는 홀수 위치 숫자를 더하고 3을 곱한 다음 그 숫자를 짝수 위치 숫자의 합에 더하는 것입니다. 그런 다음 나머지를 10으로 나눌 때 계산합니다. 나머지가 0이 아닌 경우이 나머지를 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!"); 
       } 

      } 
    } 
+1

우선 길이를 줄이지 않고 두 번째로 동일한 이름의 변수 이름을 사용하지만 번호 접미사가 다른 경우 배열 (또는 컬렉션)을 사용해야하는 거대한 붉은 깃발이어야합니다. – nmore

답변

0

당신의 while 루프 변수 length을 확인하고 있습니다,하지만 당신은 루프 내에서이를 변경하지 않습니다해야합니다. 따라서 루프는 끝나지 않습니다.

스캐너에서 숫자를 반복해서 읽고 UPC 알고리즘을 수행하려는 경우 읽기, 숫자 나누기 및 길이 계산이 모두 루프 안에 있어야합니다. 이 작업을 한 번만하고 싶다면 루프가 없어야합니다.

모든 것이 내부로 이동했기 때문에 루프 상태에서 길이를 검사해서는 안됩니다. 이 루프 스캐너의 당신의 정의 후 바로해야한다는

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. 

} 

참고 : 대신, DO-while 루프 또는 무한 While 루프 하나를 만들 수 있습니다. 그리고 그것이 끝나는 방법은 사용자가 들어간 후 길이를 검사하는 것입니다. 이 때문에 거기에 if 성명이 있습니다.

+0

코드에서 이것이 어디에 있어야할까요? 나는 모든 것을 루프의 내부로 옮겼다. 그리고 그것은 여전히 ​​무한하다. – Michael

+0

@Michael 좋아, 루프를 보여주는 짧은 발췌 문장과 내부로 이동 한 내용으로 내 대답을 편집했습니다. 나는 그것이 지금 더 도움이되기를 바랍니다. – RealSkeptic

+0

도움 주셔서 감사합니다. 한 번 더 질문하십시오 - 일단 프로그램이 실행되면 자동으로 새로운 UPC 코드가 입력되도록 요청할 것이므로 루프를 어떻게 끊으십니까? 고맙습니다! – Michael

0

while 루프에서 길이를 줄여야합니다. 그렇지 않으면 length는 항상 12와 같거나 0보다 커야합니다. 또한 모든 선언을 입력하는 대신 int를 사용하는 것이 좋습니다. 그런 다음 temp char 변수를 사용하여 for 루프를 사용하여 루프를 반복 할 수 있으므로 그런 모든 것을 초기화 할 필요가 없습니다. int 배열을 통해 while 루프에서 다음

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); 
} 

, 루프를 모든 0 + 모든 짝수 인덱스를 추가하고 3을 곱 모든 홀수 인덱스를 추가 : 대한 루프는 다음과 같이 할 수있다. 또한 회선이 비어 있는지 확인하지 않습니다.

관련 문제