复杂的ISBN问题
以前的合法出版的书籍ISBN由十位数字组成,下面是一组注册的ISBN号:0 00 319487 6
90 70002 04 3
9972 00 000 1
一个注册的ISBN由三部分及一个检查号(check digit)组成,从左至右分别是:
(1)地区号area identifier(地区号的数字个数为1到5位)
(2)出版社号publisher identifier(1到7位)
(3)出版物号title identifier(1到6位)
(4) 检查号,为0-9和x,x是10.
如何检测ISBN是否注册了呢?以0 00 319487 6为例,从左到右进行下面的计算:
0*10+0*9+0*8+3*7+1*6+9*5+4*4+8*3+7*2+6*1=132,如果132能够被11除尽,那么该号码可能是一个注册的ISBN。因为ISBN机构还有一个表,名为ISBNPrefix表,里面列出了所有地区号下面的出版社号的下限及上限数字,上限和下限的数字个数一样,并因不同地区而不同。下面是该表的部分内容,全部内容在附件里。
0 00-19
0 200-699
0 7000-8499
0 85000-89999
0 900000-949999
0 9500000-9999999
注:0代表讲英语的地区,后面是出版社号码的上下限。
程序要求:
写两个模块的函数,分别是ISBNPrefix module,ISBN module。
第一个模块包括五个函数,分别是:
FILE* open(const char filename[]);//打开ISBNPrefix表
int isRegistered(FILE* fp, int area);//确定ISBNPrefix表里地区号,根据返回值判断成功与否
int minNoDigits(FILE* fp, int area);//找到该地区号里出版社号的下限数字,根据返回值判断成功与否
int isRegistered(FILE* fp, int area, const char publisher[]);确定地区号,而且出版社号也在该地区号规定的出版社号码范围之内,根据返回值判断成功与否
int close(FILE* fp);//关闭文件
这五个函数我已近完成了,头文件和执行文件都在附件里,名称为分别为ISBNPrefix.h和ISBNPrefix.cpp。
第二个模块有两个函数,分别是:
int isValid(const char str[]);//确定经计算后是否能被11除尽, 返回值是0或1
int isRegistered(FILE* fp, const char str[], char area[], char publisher[], char title[]);//该函数接受一个注册ISBN号码,并分别取出地区号,出版社号和书名号。check digit在最后一位,不用取出。可以调用第一个模块里的函数, 返回值是0或1
头文件和执行文件分别为ISBN.h和ISBN.cpp。我都附在附件里。
我在写int isRegistered(FILE* fp, const char str[], char area[], char publisher[], char title[])这个遇到较大的阻力。我的逻辑是先从左边的五位数字去循环测试地区号,成功得出地区号(比如是前2位),然后先确定该地区下面出版社号的下限,然后从第三位到第九位循环测试,看出版社号落在什么范围,最后减掉最后一个号码得出书号。老师提供了一个主函数的代码,名为a1main.cpp,在附件里。经g++ a1main.cpp ISBNPrefix.cpp ISBN.cpp命令编译后得出的运行结果如下:
ISBN Processor
==============
ISBN (0 to quit) : 9070002043
Area : 90
Publisher : 70002
Title : 04
ISBN (0 to quit) : 0003194875
Invalid check digit. Try again.
ISBN (0 to quit) : 000319487
Incorrect number of digits. Try again.
ISBN (0 to quit) : 0003194876
Area : 0
Publisher : 00
Title : 319487
ISBN (0 to quit) : 9972000001
Area : 9972
Publisher : 00
Title : 000
ISBN (0 to quit) : 9995500000
This ISBN does not have a registered prefix
ISBN (0 to quit) : 0
Signing off ...
如果您看到这里,谢谢您的耐心。老师要求用纯C的语言写这些函数。我就剩下int isRegistered(FILE* fp, const char str[], char area[], char publisher[], char title[])这个函数写不出。另附上名为a1test.cpp的测试程序,请大家指点,感激不尽,谢谢。本人邮箱winglesswu@。
ISBN.rar
(10.6 KB)
[ 本帖最后由 winglesswu 于 2013-5-17 08:44 编辑 ]