Java使用for循环计算ISBN

时间:2017-12-23 05:27:13

标签: java

我还是Java新手,这个问题如下:ISBN-10(国际标准书号) 由10位数字组成:d1d2d3d4d5d6d7d8d9d10。最后一位数字d10是校验和, 使用以下公式从其他九位数计算: (d1 * 1 + d2 * 2 + d3 * 3 + d4 * 4 + d5 * 5 + d6 * 6 + d7 * 7 + d8 * 8 + d9 * 9)%11 如果校验和为10,则根据ISBN-10将最后一位数字表示为X. 惯例。编写一个程序,提示用户输入前9位数字 显示10位ISBN(包括前导零)。你的程序应该阅读 输入为整数。

请参阅下面的代码: 它工作但结果不正确!

public static Scanner input;

    public static void main(String[] args)
    {
        input = new Scanner(System.in);
        System.out.print("Enter first 9 digit numbers: ");
        int[] arr = new int[9];
        int checkSum = 0;

        for (int i = 0 ; i < arr.length; i++)
        {
            arr[i] = input.nextInt();
            checkSum = (arr[i] * i) % 11;   
        }
        System.out.print("The ISBN-10 Number is " );
        for(int j = 0 ; j < arr.length; j++)
        {
            System.out.print(arr[j]);
        }

        if(checkSum == 10)
        {
            System.out.println("x");
        } 
        else
        {
            System.out.println(checkSum);
        }

我只想使用循环,让我的方法有效。 ,我知道如何使用没有循环的方法。

6 个答案:

答案 0 :(得分:1)

好。对于JAVA 数组索引从0开始,Max索引的长度为1。 如果指数不在此范围内。将抛出arrayoutofbounds异常

答案 1 :(得分:1)

问题不在于您正在int i = 1而不是int i = 0。问题是您已将i < arr.length;更改为i <= arr.length;。由于arr.length为9,因此您的代码正在尝试引用arr[9],但arr仅包含arr[0]arr[8]的元素。

答案 2 :(得分:0)

int[] arr = new int[9];

这意味着该阵列有9个插槽。这些插槽的编号从0开始。因此,

  • arr [0]是第一个插槽
  • arr [1]是第二个插槽

最后一个插槽是arr [8]。但是在下面的代码中你要迭代直到我等于9,这是不存在的。

for (int i = 1 ; i <= arr.length; i++)
    {
        arr[i] = input.nextInt();
        checkSum = (arr[i] * (i+1)) % 11;   
    }

这会导致ArrayIndexOutOfBoundsException。将for (int i = 1 ; i <= arr.length; i++)更改为for (int i = 0 ; i < arr.length; i++)

答案 3 :(得分:0)

首先,回顾一下我们如何使用数组...

int[] I = new int[3];

上面创建了一个包含3个点的数组。在实例化数组之后,每个元素都基于0索引。您只有I [0],I [1]和I [2]可用(注意这是三个数字)并且尝试访问I [3]将抛出您在上面的程序中遇到的错误:ArrayIndexOutOfBoundsException。

话虽如此,你的循环正试图访问arr [9]。你在数组中的最高索引是arr [8],因为尽管数组中有9个元素,但它是0索引的。

假设您必须从1开始i完成家庭作业或其他任务,请将您的代码更改为:

public static Scanner input;

    public static void main(String[] args)
    {
        input = new Scanner(System.in);
        System.out.print("Enter first 9 digit numbers: ");
        int[] arr = new int[9];
        int checkSum = 0;

        for (int i = 1 ; i <= arr.length; i++)
        {
            arr[i-1] = input.nextInt();
            checkSum = (arr[i-1] * i) % 11;   
        }
        System.out.print("The ISBN-10 Number is " );
        for(int j = 1 ; j <= arr.length; j++)
        {
            System.out.print(arr[j-1]);
        }

        if(checkSum == 10)
        {
            System.out.println("x");
        } 
        else
        {
            System.out.println(checkSum);
        }

答案 4 :(得分:0)

B的错误表示已使用非法索引访问了数组。索引为负数或大于或等于数组的大小。 在你的例子中,最后一个插槽是arr [8]。但是在你的例子B的代码中,你正在迭代直到我等于9,这是不存在的。这就是问题所在。

答案 5 :(得分:-1)