对不起,如果这是一个愚蠢的问题,这是我的第一个编码类。
如果校验和为10,则根据ISBN-10约定将最后一个数字表示为X.编写一个程序,提示用户输入前9位数字并显示10位ISBN(包括前导零)。您的程序应该将输入读作整数。
示例运行应如下所示:
Enter the first nine digits of the ISBN: 013601267
The ISBN-10 number is: 0136012671
我已经成功地创建了一个可以执行此操作的程序,但对所有九个数字使用int值。不幸的是,这需要用户分别输入每个号码。
所以我现在要做的是使用string ISBN
,以便我可以针对单个部分,即。 isbn[0] * 1 + isbn[1] * 2...
我也试过static_cast<char>(ISBN[0]) * 1 + static_cast<char>....
认为它会做一些事情,我得到相同的结果。
string ISBN;
cout << "Enter the first nine digits of the ISBN as integer: ";
cin>>ISBN;
int n10 = (ISBN[0] * 1 + ISBN[1] * 2 + ISBN[2] * 3 + ISBN[3] * 4 + ISBN[4] * 5 + ISBN[5] * 6 + ISBN[6] * 7 + ISBN[7] * 8 + ISBN[8] * 9) % 11;
if (n10 == 10)
{
cout << ISBN << "X" << endl;
}
else
{
cout << ISBN << n10 << endl;
}
因此,当我输入这个数字013601267
时,我应该得到一个1 (0136012671)
,而不是我得到一个5 (0136012675)
。
我认为这是发生的,因为它给了我ASCII十进制值而不是char
值。
你应该检查四件事:
1:字符串的大小实际上是9个字符。
if (ISBN.size() != 9) {
// Error
}
否则访问不存在的元素将导致程序出错。
2:数字不是从值0
开始。在ASCII(或UTF-8)中,数字从48开始。因此48 =>'0'49 =>'1'等。但是C ++保证所有数字都是连续的,只要你知道第一个数字就可以减去那个数字。并获得正确的价值。如果在整数表达式中使用'0'
,它将转换为正确的值。因此,要从char
生成数值,您应该在乘以之前从每个数字中减去该值。
n10 = ((ISBN[0] - '0') * 1) + ((ISBN[1] - '0') * 2) + ...
3:但是你应该检查字符串是否都是数字。
for(auto x: ISBN) {
if (!std::is_digit(x)) {
// ERROR
}
}
4:要打印前导零的9个字符的字符串,您需要确保正确准备流:
std::cout << std::setw(9) << std::setfill('0') << number;
或者如果数字已经是字符串形式,你知道它是9个字符长,你可以简单地使用:
std::cout << ISBN;
所以要在你的情况下输出正确的10个字符数:
std::cout << ISBN << ((n10 == 10) ? 'X' : ('0' + n10)) << "\n";
if(ISBN.size() != 9){
// ERROR
}
for
来计算'n10'int n10 = 0;
for(int i = 0; i < ISBN.size(); ++i){
if(std::is_digit(x)){ // check digit
// characters '0','1','2'... are not same as digits 0, 1, 2...
// the value of '0' is 48, as shown here [ascii table][1]
n10 = (ISBN[i] - '0') * (i+1) + n10;
} else {
// ERROR
}
}