| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 679 人关注过本帖
标题:复杂的ISBN问题
只看楼主 加入收藏
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
结帖率:71.88%
收藏
已结贴  问题点数:12 回复次数:4 
复杂的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 编辑 ]
搜索更多相关主题的帖子: 出版物 
2013-05-16 11:05
lwb603569640
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:283
专家分:436
注 册:2012-11-9
收藏
得分:6 
C语言  现代方法   有类似题目
程序代码:
#include <stdio.h>

//分解用户录入的ISBN信息
int main()
{
    int gs1, group_id, pub_code, item_num, check;

    printf("Enter ISBN: ");
    scanf("%d-%d-%d-%d-%d", &gs1, &group_id, &pub_code, &item_num, &check);

    printf("GS1 prefix: %d\n", gs1);
    printf("Group identifier: %d\n", group_id);
    printf("Publisher code: %.3d\n", pub_code);
    printf("Item number: %.4d\n", item_num);
    printf("Check digit: %d", check);

    return 0;

}


好吧  那个代码没了。。。。随手贴一个  参考下

自由、民主、宪政!
2013-05-16 11:36
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
谢谢,不过不是这么简单。
2013-05-17 08:45
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:6 
我觉得你在写int isRegistered这个思路挺好的,不知道你遇到什么问题,

Maybe
2013-05-17 09:41
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
我在写int isRegistered(FILE* fp, const char str[], char area[], char publisher[], char title[])这个遇到较大的阻力。我的逻辑是先从左边的五位数字去循环测试地区号,成功得出地区号(比如是前2位),然后先确定该地区下面出版社号的下限,然后从第三位到第九位循环测试,看出版社号落在什么范围,最后减掉最后一个号码得出书号。逻辑有了 但是只写个开头就写不下去了。
2013-05-17 10:27
快速回复:复杂的ISBN问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.071747 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved