0

ユーザーが 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;
  }
4

2 に答える 2

2
  isbnArray[ISBN];

ISBN は 0 から始まる 11 桁の数字であるため、間違っています。代わりに、ISBN の各桁を array に格納したいと考えてい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 桁であることはわかっているので、少なくとも長さ 9 ではなく 11 の配列を使用する必要があります。

于 2013-04-19T15:41:52.890 に答える