2013-04-19 5 views
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 введен или скопирован неправильно.Simple C++ Array Logic Issue

Каждый раз, когда я ввожу значения, у меня всегда есть вывод «ISBN is not correct». Что-то не так с моей логикой.

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; 
    } 

ответ

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 
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.

+0

Теперь я отредактировал массив, чтобы использовать 10 элементов, потому что я начинаю с 0, и я исправил цикл for. Еще раз проверьте, пожалуйста. – Klinetel

+0

@KlineTel вам нужен массив длиной 11, чтобы вы могли хранить 11 цифр номера ISBN. 10 недостаточно – taocp

+0

Вы имели в виду totalNumbersCheck + = isbnArray [i] * (i + 1); вместо totalNumbersCheck = isbnArray [i] * (i + 1); ? –