【问题标题】:How to stop infinite loop for UPC check code如何停止 UPC 检查代码的无限循环
【发布时间】:2014-10-12 21:23:15
【问题描述】:

我的代码有一个无限循环,我似乎无法打破它。另外,插入空行时,我被告知存在索引错误。请帮忙!

检查有效 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!");
                }

            } 
    }

【问题讨论】:

  • 首先你永远不会减少长度,其次,当你有同名但不同数字后缀的变量名时,这应该是一个巨大的危险信号,你应该使用数组(或集合)。

标签: java eclipse loops barcode infinite


【解决方案1】:

您需要在 while 循环中减少长度,否则长度将始终等于 12 或大于 0,等等。此外,您可能需要考虑使用整数而不是输入所有这些声明。然后,您可以使用带有 temp char 变量的 for 循环遍历它们,这样您就不必像那样初始化它们。您的 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 并添加所有奇数索引。 此外,您永远不会检查该行是否为空白。

【讨论】:

    【解决方案2】:

    您的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 声明的原因。

    【讨论】:

    • 你能告诉我这应该在代码中的什么位置吗?我将所有内容都移到了循环中,它仍然是无限的。
    • @Michael 好的,我已经用 sn-p 编辑了我的答案,显示了循环,以及里面移动了什么。我希望它现在更有帮助。
    • 感谢您的帮助。另一个快速的问题——你现在如何打破循环,因为一旦程序运行,它会自动再次要求输入新的 UPC 代码。谢谢!
    • @Michael 正如我所写,循环在if 语句中中断。如果用户输入一个空行,if 条件变为真,然后break 语句将跳出循环。
    猜你喜欢
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多