我正在学校做一个过去的纸质问题,以调整一些伪代码,检查输入的ISBN号是否有效,进入C#。我输入了代码,但它抛出了IndexOutOfRangeException错误。我不确定该错误是如何发生的,因为这是我第一次使用int数组。
我检查了索引不是负数,我认为列表中的最大索引小于列表大小(我尝试更改"计数< 13"在for循环中&#34 ;计数< = 12",但无效)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ISBNExercise
{
class Program
{
static void Main(string[] args)
{
int[] ISBN;
int Count;
ISBN = new int[13];
for(Count = 0; Count < 13; Count++)
{
Console.WriteLine("Please enter next digit of ISBN");
ISBN[Count] = Convert.ToInt32(Console.ReadLine());
}
int CalculatedDigit = 0;
int count = 1;
while (count < 13)
{
CalculatedDigit = CalculatedDigit + ISBN[Count]; //This is where the error is being thrown.
Count += 1;
CalculatedDigit = CalculatedDigit + ISBN[Count] * 3;
Count += 1;
}
while (CalculatedDigit >= 10)
{
CalculatedDigit -= 10;
}
CalculatedDigit = 10 - CalculatedDigit;
if (CalculatedDigit == 10)
{
CalculatedDigit = 0;
}
if (CalculatedDigit == ISBN[13])
{
Console.WriteLine("Valid ISBN");
}
else
{
Console.WriteLine("Invalid ISBN");
}
}
}
}
答案 0 :(得分:1)
问题是您使用的是Count
,而不是发生错误的count
。
我建议以不同的方式命名变量,并坚持使用变量的所有较低驼峰案例名称的C#约定。这会导致编译器错误,这会立即影响您的问题,因为您将尝试重新定义上面已经定义的count
。
答案 1 :(得分:1)
您的问题就在这一行
if (CalculatedDigit == ISBN[13])
您定义ISBN
长度为13,这意味着最高索引为12,因为索引基于零。
但即使在此之前,您的while
循环正在检查count
,但您在循环中使用Count
,此时此值已经为13。
最后一点,while
循环将第2到第13个字符(索引1到12)相加,并将校验位与最后一位数字进行比较。我猜你实际上想要将前12位数相加,所以你需要设置count = 0
并检查count < 12
。
int CalculatedDigit = 0;
int count = 0;
while (count < 12)
{
CalculatedDigit = CalculatedDigit + ISBN[count]; //This is where the error is being thrown.
count += 1;
CalculatedDigit = CalculatedDigit + ISBN[count] * 3;
count += 1;
}
或者您可以执行以下操作
int CalculatedDigit = ISBN.Take(12)
.Select((v,i) => i%2 == 0 ? v : v*3)
.Sum();
CalculatedDigit = 10 - (CalculatedDigit % 10);
CalculatedDigit = CalculatedDigit == 10 ? 0 : CalculatedDigit;
你不断减去10的循环实际上只是一个模数(%
)。