简单的C ++数组逻辑问题

时间:2013-04-19 15:37:47

标签: c++ arrays visual-c++ isbn

我正在尝试编写用户输入ISBN的程序,然后检查条目的准确性。 ISBN为0201702894。校验位(4)从其他9位数字计算如下 - (每个(其位数的数字乘))mod 11 Ex: (0*1 + 2*2 + 0*3 + 1*4 + 7*5 + 0*6 + 2*7 + 8*8 + 9*9)%11 = (0+4+0+4+35+0+14+64+81)%11 = 4 (202/11 = 18 remainder 4)校验位可以检测何时输入或复制的ISBN不正确。

每次输入值时,我总是输出“ISBN不正确”。我的逻辑出了点问题。

1.  Correct Value: 0201702894

2.  Incorrect value: 0201702984

代码:

#include <iostream>

using namespace std;

int totalNumbersCheck=0;

int main()
{
int isbnArray[10];      //array to store the ISBN numbers
int ISBN=0;             //inputted ISBN number

//user input

cout<<"Please enter the ISBN number: ";
cin>>ISBN;

//ISBN storage

isbnArray[ISBN];

//ISBN calculation

for(int i=0;i<10;i++)
{
    totalNumbersCheck=isbnArray[i]*(i+1);
}

//remove last element from array

    totalNumbersCheck-=isbnArray[10];

//check if remainder equals last element and output correct response

    if(totalNumbersCheck%11==isbnArray[10])
    {
        cout<<"\nThe ISBN is correct.";
    }
    else
        cout<<"\nThe ISBN is not correct.";

    cin.get();
    cin.get();

return 0;
  }

2 个答案:

答案 0 :(得分:2)

  isbnArray[ISBN];

是错误的,因为ISBN是一个11位数字,可以从0开始。您希望将ISBN的每个数字存储到数组isbnArray中。假设输入数字是1233445,该指数肯定超出了isbnArray[9]的范围。

同时,计算结果的循环可能如下所示:

 for(int i=0;i<10;i++)
 {
    totalNumbersCheck +=isbnArray[i]*(i+1);
 }

 if(totalNumbersCheck%11==isbnArray[9])
                   ///^^index out of bound again if you access isbnArray[9]

你知道ISBN是11位数,所以你至少应该使用长度为11而不是9的数组。

答案 1 :(得分:0)

将isbn读入std::string变量,然后遍历字符串中的字符,将每个字符转换为数字,然后应用算法。

const isbn_digits = 10;
std::string isbn;
std::cin >> isbn;
assert(isbn.size() == isbn_digits);
int sum = 0;
for (int pos = 0; pos < isbn_digits - 1; ++pos)
    sum += (pos + 1) * (isbn[pos] - '0');
if (sum % 11 != isbn[isbn_digits - 1] - '0')
    // error