1、程序设计基础(C)课程设计报告图书信息管理系统学 生 姓 名: 朱斌 学 号: 201211354 班 级: 电力工程与管理 1201 班指 导 老 师: 邓伟华 日 期: 2013.07.05 兰州交通大学新能源与动力工程学院C 语言程序设计第 1 页 共 29 页 C 语言课程设计报告一、设计目标 1二、总体设计 2三、详细设计 2五、分析及结论 9六、参考文献 11七、附录 11源程序清单 11C 语言程序设计第 2 页 共 29 页 一、设计目标图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。设计的图书信息管理系统,应当具备能提供以下功能:1、系统以菜单方式工作
2、2、图书信息录入功能输入3、图书信息浏览功能输出4、图书信息查询功能算法(查询方式:1 按书名查询.2.按作者名查询)5、图书信息的删除与修改二、总体设计1.程序设计组成框图图书信息管理系统系统登录模块菜单选择模块图书信息录入模块图书信息浏览模块图书信息查询模块图书信息修改模块设计:朱斌设计:周勇设计:闫鹏设计:张旭东设计:杨国峥设计:王文模2.程序流程图C 语言程序设计第 3 页 共 29 页 三、详细设计1、系统登录模块(f1()) 本函数由 朱 斌 设计1)函数的功能: 验证管理员信息,进入菜单功能界面 2)函数的入口: 从 main()的 switch()结构中进入,即 choice
3、的值为 1 时进入函数,然后提示用户通过键盘对输入管理员账户及密码。3)函数调用关系:被主函数调用。由 switch()开关结构中进入,并在文中无返回值的空值void 函数。4)函数的出口: 当验证失败,提示重新输入。当验证成功,通过“ENTER”键,跳出switch()开关函数,进入菜单功能模块,继续执行选择结构。程序流程图:C 语言程序设计第 4 页 共 29 页 图书登录系统界面2.菜单功 能 选择模块(f2()) 本函数由 周 勇 设计1)函数功能:主要作用是提示用户操作,体现模块化思想,主要是显示出菜单让用户选择要进行的任务。2)函数入口:从主函数 void 中的 adm_serve
4、list()进入函数,这是直接被主函数 void()调用的。3)函数调用关系:被主函数调用。并在文中无返回值的空值 void 函数。4)函数的出口:执行完所有的 printf()函数后自动退出该函数。图书管理系统添加图书 删除图书 信息浏览 信息查询 修改图书 创建图书 退出管理系统C 语言程序设计第 5 页 共 29 页 开始输入 n,判断是否 06?输入 n,调用各个模块的函数结束YN主函数的流程图菜单界面3.修改与删除模块(f3()) 本函数由 王文模 设计图书删除1)函数功能:利用 while 循环和 if 语句和 scanf getchar search change del 函数,
5、完成对图书信息(分类名 出版单位 出版时间 价格)的修改和删除2)函数入口:从主函数 main()中的 system(“cls“); /*清屏命令*/menu(); /*菜单函数提示用户怎样选择 */进入函数,这是直接被主函数 main()调用的。3)调用关系:void change(int x)是改变图书信息,它里面又调用了 book_search();4)函数出口:执行完所有的 printf()函数后自动退出该函数。程序框架图C 语言程序设计第 6 页 共 29 页 图书修改该模块实现按照用户需求,将需要修改的图书名输入,进行 for 循环查找是否有此书,若无,则显示未找到,退出,若有,则
6、显示输入新的图书信息,开始输入修改的信息,进行 for 循环开始录入,替换原文件信息结束显示“修改成功”图书修改界面图书删除界面4.图书信息浏览(f4()) 本函数由 张旭东 设计1)函数的功能: 显示图书的信息(编号价格作者出版单位出版时间类别)2)函数的入口: 从主函数 main()中的 system(“cls“); /*清屏命令*/menu(); /*菜单函数提示用户怎样选择04信息浏览/进入函数,这是直接被主函数 main()调用的。3)函数调用关系:被主函数调用。并在文中无返回值的空值 void 函数。C 语言程序设计第 7 页 共 29 页 4)函数的出口:执行完所有的 print
7、f()函数后自动退出该函数。框架图图书浏览流程图图书浏览5. 图书查询 本函数由杨国峥设计1)函数的功能: 按着书名查询与作者名查询,输出排序结果。 C 语言程序设计第 8 页 共 29 页 2)函数的入口: 程序从 main()的 while()开关结构中进入,即 choice 的值为 4 时进入该函数,开始进入该函数,进入函数后,首先打开文件,然后利用“printf() ”选择按书名查询与作者名查询,若 flag=1 或flag=2 则有此书。若 flag=0 则无此书,并退出查询。3)函数调用关系:被主函数调用。由 while()开关结构中进入,并在文中无返回值的空值 void 函数。4
8、)函数的出口: 当输出查询结果用 printf()标准输出到屏幕上,然后结束该函数,而执行主函数 main()中“break;”跳出 while()开关函数,继续执行 if 选择结构。图书信息查询按书名查询(1) EXIT(0) 按作者名查询(2)04 信息查询输入 a,判断 a 是否为 02?a=0,退出回到主菜单 a=1,则调用 search-by-name 按书名查询输入书名,若有此书则输出此书信息,若没有,则输出 file open error!没有,则输出 file open error!a=2,则调用 search-by-writer 按作者名查询输入作者名,若有此书则输出此书信息
9、若没有,则输出 file open error按图书名查询C 语言程序设计第 9 页 共 29 页 按作者名查询 6.输入模块 本函数由 闫 鹏 设计1) 函数的功能:利用 for 循环语句和 scanf、gets、getchar 函数完成对结构数组的输入,存放图书信息(图书编号、图书名、作者名、出版社、类别、出版时间、价格) 。2) 函数的入口:从主函数 main()中的 system(“cls“); /*清屏命令*/menu(); /*菜单函数提示用户怎样选择 */进入函数,这是直接被主函数 main()调用的。3) 函数调用关系:被主函数调用。并在文中无返回值的空值 void 函数。4)
10、 函数的出口:执行完所有的 printf()函数后自动退出该函数。程序框架图:录入数据请输入图书编号请输入图书名请输入作者名请输入出版社请输入类别请输入出版时间请输入价格C 语言程序设计第 10 页 共 29 页 图书信息输入四、调试与测试调试方法:打开 Microsoft Visual C+ 6.0,先将各个功能函数的的内容清空,只保留主函数 main(),然后编译检验 main()函数中是否有错,如果没有错误,再连接、运行。确认main()函数一切无误后,然后加入功能函数 menu()函数与 f1()函数,由于 menu()函数比较简单,所以与 f1()函数一起进行调试, f1()函数中主
11、要注意读取文件,与写入文件,这都是二进制的形式。若 menu()函数与 f1()函数编译、连接、运行没问题,继续加入 f2()函数,就这样的方法依次检查调试 f3()函数、f4() 函数。当所有的功能函数都加上且正确无误时,就可以进入下一个环节程序的测试。测试方法: 运行程序,然后进入销售管理系统的界面,在这里需要做的就是把自己当成一个公司的程序使用者,来对该程序进行使用,看该程序有哪些方面用着不够爽,把这些问题依次整理出来,再对源程序进行修改,在这个过程中也需要对程序进行调试,不过不必将各个功能函数的的内容清空再进行如上述的调试方法,而是,改一部份运行一次,看是否有无。如 f1()函数有误,
12、则先修改 f1()函数,一块一块的进行修改,就是遵循 C 语言的模块化设计原理,若所有的都改过来了,且运行无误,那就大功告成了。在调试中遇到的问题:在调试过程中,我们遇到诸多小问题,但都在我们共同讨论后解决了。1、问题:标点符号在输入的时候,使用的是中文输入法,这种错误一般都难以发现,让修改的时候找不到目标。解决方法:用“替换” 。如果程序中的 error 很多,不管 error 是什么,先将标点替换成英文的标点。2、问题:调试时,有的时候编译后没什么问题,就是在点击连接 link 时出现了错误。而且,这种错误让我们不知道怎么修改。但是我们的程序的确正确。解决方法:将源程序保存(save) ,
13、然后关掉 Microsoft Visual C+ 6.0,重新启动 Microsoft C 语言程序设计第 11 页 共 29 页 Visual C+ 6.0,五、分析及结论A、在设计中我们实现了设计目标的所有内容即:1、系统以菜单方式工作2、图书信息录入功能输入3、图书信息浏览功能输出4、图书信息查询功能算法(查询方式:1按书名查询.2.按作者名查询)5、图书信息的删除与修改B、其中遇到了以下问题:不能清晰的建立设计模块,不会修改出现的错误等等。解决方案:向同学寻求帮助,向他们学习,最终通过自己努力建立了模块。不可避免地程序中肯定依然存在者某些问题在应用中不断提高自己的能力,攻克遇到的困难。
14、C、该程序的不足:函数较复杂,界面不美观。D、实践心得经过一个多星期的编译原理课程设计,在我们一组的共同的努力下,顺利完成该课程设计。通过该课程设计,掌握了编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程及其相关的技术,对课本上的知识也有了更深的理解。老师常说,课本上的知识是机械的,表面的,要学会去运用,要举一反三。现在终于深刻的了解了这句话。经过这次的课程设计,发现书本上很深奥的知识变的更为简单,同样,对 C 程序原理也了有更深的理解。知道和理解了该理论在计算机中是怎样执行的, 对该理论在实践中的应用有深刻的理解 。通过该课程设计,把死板的课本知
15、识变得生动有趣,激发了学习的积极性。能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。除了课堂外,课程设计是最能学到东西的,最考验人的。在做课程设计的这段时间,时刻都感到自己学的知识有多么的贫瘠。经过这次课程设计,让我们对 C+这门语言有了更深的认识,操作能力有了提高要想是写出的代码能运行,需要耐心细心,毅力以及充沛的体力。只有经过多次编辑,多次编译,再多次运行,才能编写出更好的程序,有时候需要多次的更正才能达到所要的运行结果。在编写本程序时,在网上寻找的参考程序起到了很大的启发与参考作
16、用。C 语言程序设计第 12 页 共 29 页 六、参考文献1、 C 语言程序设计.谭浩强版 2、 C 语言上机指导3、 Microsoft Visual C+ 6.0 指南4、附:在编写本程序时,在网上寻找的参考程序起到了很大的启发与参考作用。七、附录源程序清单源程序清单#include#include#includestruct book/声明 BOOK 类的所有变量int num;char bname50;char wname20;char press50;char sort50;int time;float price;struct book *next;struct book *cr
17、eatbook();/创建链表struct book *addbook(struct book *head);/添加图书int yanzheng(struct book *head,int m);/验证新添加的图书编码是否已存在void deletebook(struct book *head);/删除图书void fprint(struct book *head);/将链表写入文件struct book *load();/从文件中读取信息并建成链表void print_book(struct book *head);/将链表信息输出void chaxun(struct book *head)
18、;/查询图书信息void wname_chaxun(struct book *head);/按作者名查询图书C 语言程序设计第 13 页 共 29 页 void bname_chaxun(struct book *head);/按图书名查询图书void xiugai(struct book *head);/修改图书信息int main() 本代码由 小 组 设计 int choice,n,x,y=1,c,c1=317;/choice 选择进入哪项功能:对图书的增删改查char a,d,b10,b110=“317“;struct book *head=NULL;/声明一个新的 book 类whi
19、le(y)/实现 登录 退出系统 这两个选项 在输入口令错误时产生的循环system(“cls“);/清屏printf(“|=|n“);printf(“| 欢迎进入 |n“);printf(“| 兰州交通大学图书管理系统 |n“);printf(“|=|n“);printf(“| 请输入选项(0-1) |n“);printf(“|=|n“);printf(“| 1-用户登录 |n“);printf(“| 0-退出系统 |n“);printf(“|=|nn“);printf(“ 请输入您的选择:“);scanf(“%d“,/读取选项 0/1printf(“n“);getchar();/从 std
20、io 流中读字符switch(n)/进入选择case 0:y=0;break;case 1:printf(“ 请输入您的用户名:“);gets(b);/获取输入的字符 将字符赋值为 bprintf(“n“);printf(“ 请输入您的密码:“);scanf(“%d“,printf(“n“);if(strcmp(b,b1)!=0|c!=c1)/strcmp 比较功能 b1 c1 之前赋值为 317 317 只要刚输入的 b 与 c 存在不等于 317C 语言程序设计第 14 页 共 29 页 printf(“ 验证失败,请重新输入!n“);scanf(“%c“,getchar();system
21、(“cls“); elseprintf(“ 验证通过!请按 Enter 键进入!n“);scanf(“%c“,getchar();x=1;while(x)system(“cls“); 本代码由 朱 斌 设计 printf(“ - n“);printf(“ 兰州交通大学图书信息管理系统 n“);printf(“ - n“);printf(“*n“);printf(“| 请输入选项(0-6) |n“);printf(“*n“);printf(“| 1-添加图书 2-删除图书 |nn“);printf(“| 3-信息浏览 4-信息查询 |nn“);printf(“| 5-修改图书 6-创建图书 |n
22、n“);printf(“| 0-退出系统 |n“);printf(“*n“);printf(“请输入所选择的序号:“);scanf(“%d“,getchar();system(“cls“);switch(choice)/选择进入哪项功能:对图书的增删改查case 0:x=0;break; case 1:head=load();/链头尾节点一致相同 即文件为空if(head=NULL)printf(“文件为空,请先录入数据!n“);getchar();C 语言程序设计第 15 页 共 29 页 break;elsehead=addbook(head);/链表的表头与新加入的内容相同 即添加成功p
23、rintf(“添加成功!n“);printf(“是否将新信息保存到文件?(y/n)n“);scanf(“%c“,getchar();switch(a)case n:break;case y:fprint(head);printf(“保存成功!n“);getchar();break;break;case 2:head=load();/链头尾节点一致 即文件为空if(head=NULL)printf(“文件为空,请先录入数据!n“);getchar();break;elsedeletebook(head);/执行删除getchar();break;break;case 3:head=load();
24、if(head=NULL)/链头尾节点一致 即文件为空printf(“文件为空,请先录入数据!n“);getchar();C 语言程序设计第 16 页 共 29 页 break;elseprint_book(head);/执行浏览getchar();break;case 4:head=load();if(head=NULL)/链头尾节点一致 即文件为空printf(“文件为空,请先录入数据!n“);getchar();break;elsechaxun(head);/执行查询getchar();break;case 5:head=load();if(head=NULL)/链头尾节点一致 即文件为
25、空printf(“文件为空,请先录入数据!n“);getchar();break;elsexiugai(head);/执行修改getchar();break;break;case 6:printf(“注意: 输入图书编码为 0 时结束 !n“);head=creatbook();/找到相同信息 询问是否替换printf(“是否将输入的信息保存到文件以覆盖文件中已存在的信息?(y/n)n“);C 语言程序设计第 17 页 共 29 页 getchar();scanf(“%c“,getchar();switch(a)case n:break;case y:fprint(head);/将链表写入文件
26、printf(“保存成功!n“);getchar();break;break;default:printf(“您的输入有误,请重新输入!n“);getchar();break;break;default:printf(“ 您的输入有误! 请重新输入!n“);getchar();break; 本代码由 周 勇和王文模 设计 /录入数据并形成链表struct book *creatbook()struct book *head,*tail,*p;/声明数据链表int num,time,n;char bname50,wname20,press50,sort50;float price;int siz
27、e=sizeof(struct book);C 语言程序设计第 18 页 共 29 页 head=tail=NULL;printf(“请输入图书编号:“);scanf(“%d“,printf(“请输入图书名:“);scanf(“%s“,bname);getchar();printf(“请输入作者名:“);scanf(“%s“,wname);getchar();printf(“请输入出版社:“);scanf(“%s“,press);getchar();printf(“请输入类别:“);scanf(“%s“,sort);getchar(); printf(“请输入出版时间:“);scanf(“%d
28、“,getchar(); 从键盘中输入一个值printf(“请输入价格:“);scanf(“%f“,getchar();while(1) p=(struct book *)malloc(size);p-num=num;strcpy(p-bname,bname);/赋值 把后者复制给前者strcpy(p-wname,wname);/赋值 把后者复制给前者strcpy(p-press,press);/赋值 把后者复制给前者strcpy(p-sort,sort);/赋值 把后者复制给前者p-time=time;p-price=price;p-next=NULL;if(head=NULL)head=p
29、;elsetail-next=p;/赋值 将地址付给下一个 形成链tail=p;doC 语言程序设计第 19 页 共 29 页 printf(“请输入图书编号:“);scanf(“%d“,n=yanzheng(head,num);/验证添加的图书编号是否已存在if(n=0)break;elseprintf(“您输入的编号已存在,请重新输入!n“);while(1);if(num=0)break;else printf(“请输入图书名:“);scanf(“%s“,bname);getchar();printf(“请输入作者名:“);scanf(“%s“,wname);getchar();prin
30、tf(“请输入出版社:“);scanf(“%s“,press);getchar();printf(“请输入类别:“);scanf(“%s“,sort);getchar();printf(“请输入出版时间:“);scanf(“%d“,getchar();printf(“请输入价格:“);scanf(“%f“,getchar();return head;int yanzheng(struct book *head,int m)struct book *p;C 语言程序设计第 20 页 共 29 页 p=head;while(p!=NULL)if(p-num=m)break;p=p-next;if(
31、p=NULL)return 0;elsereturn 1;/将新链表写入文件中void fprint(struct book *head)FILE *fp;char ch=1;struct book *p1;if(fp=fopen(“f1.txt“,“w“)=NULL)/字符 IO 流printf(“File open error!n“);exit(0);fputc(ch,fp);/将字符 ch 写到文件指针 fp 所指向的文件的当前写指针的位置for(p1=head;p1;p1=p1-next)/依次写入fprintf(fp,“%d %s %s %s %s %d %fn“,p1-num,p1
32、-bname,p1-wname,p1-press,p1-sort,p1-time,p1-price);fclose(fp);/关闭 释放内存 本代码由 闫 鹏 设计 /从文件中读取图书信息struct book *load()FILE *fp;char ch;struct book *head,*tail,*p1;head=tail=NULL;/链表初始化if(fp=fopen(“f1.txt“,“r“)=NULL)C 语言程序设计第 21 页 共 29 页 printf(“File open error!n“);exit(0);ch=fgetc(fp);/意为从文件指针 fp 指向的文件中读
33、取一个字符 读取一个字节后 光标位置后移一个字节if(ch=1)while(!feof(fp)/检测 fp 流上的文件结束符p1=(struct book *)malloc(sizeof(struct book);fscanf(fp,“%d%s%s%s%s%d%fn“,if(head=NULL)head=p1;elsetail-next=p1;tail=p1;tail-next=NULL;fclose(fp);return head;elsereturn NULL;/将整个链表的信息输出void print_book(struct book *head)struct book *ptr;if(
34、head=NULL)printf(“n 没有信息!n“);return;printf(“ 图书信息列表如下n“);printf(“=n“);printf(“ 编号 图书名 作者名 出版社 类别 出版时间 价格n“);for(ptr=head;ptr;ptr=ptr-next)/依次输出printf(“ %d %s %s %s %s %d %.2fn“,ptr-num,ptr-bname,ptr-C 语言程序设计第 22 页 共 29 页 wname,ptr-press,ptr-sort,ptr-time,ptr-price);printf(“=n“); 本代码由 张旭东 设计 /删除图书信息v
35、oid deletebook(struct book *head)int a;char b,ch=1;struct book *p1,*p2;FILE *fp;printf(“请输入要删除的图书编号:“);scanf(“%d“,p1=head;if(p1-num=agetchar();scanf(“%c“,getchar();switch(b)case n:break;case y:if(fp=fopen(“f1.txt“,“w“)=NULL)/重新写入printf(“File open error!n“);exit(0);fclose(fp);printf(“文件已清空!n“);elsewh
36、ile(p1-num!=ap1=p1-next;if(p1-next=NULL)C 语言程序设计第 23 页 共 29 页 if(p1-num=a)p2-next=NULL;printf(“是否确定从文件中彻底删除该图书?(y/n)n“);getchar();scanf(“%c“,switch(b)case n:break;case y:fprint(head);printf(“删除成功!n“);getchar();break;elseprintf(“没有找到要删除的数据!n“);getchar();else if(p1=head)head=p1-next;printf(“是否确定从文件中彻底
37、删除该图书?(y/n)n“);getchar();scanf(“%c“,switch(b)case n:break;case y:fprint(head);printf(“删除成功!n“);getchar();break;elseC 语言程序设计第 24 页 共 29 页 p2-next=p1-next;printf(“是否确定从文件中彻底删除该图书?(y/n)n“);getchar();scanf(“%c“,switch(b)case n:break;case y:fprint(head);printf(“删除成功!n“);getchar();break; 本代码由 王文模 设计 /图书查询
38、void chaxun(struct book *head)int a;printf(“ -n“);printf(“ 兰州交通大学图书信息管理系统n“);printf(“ -nn“);printf(“=n“);printf(“| 请输入选项(0-2) |n“);printf(“=n“);printf(“| 1-按图书名查询 |n“);printf(“| 2-按作者名查询 |n“);printf(“| 0-退出查询 |n“);printf(“=n“);printf(“请输入所选择的编号:“);scanf(“%d“,getchar();switch(a)case 0:break;C 语言程序设计第
39、 25 页 共 29 页 case 1:bname_chaxun(head);/进入按照书名查询break;case 2:wname_chaxun(head);/进入按照作者查询break;default:printf(“您的输入有误!n“);break;/按图书名查询图书信息void bname_chaxun(struct book *head)char a50;int flag=0;struct book *p; printf(“请选择您要查询的图书名:“);gets(a);p=head;while(p!=NULL)if(strcmp(p-bname,a)=0)/比较 如果输入的 a 与已
40、有信息存在有相符的 进入循环flag=1;break;p=p-next;if(flag=0)/如果输入的 a 与已有信息没有相符的 flag 的值不改变printf(“没有找到该图书名的图书!n“);elseprintf(“ 你所查询的图书信息如下n“);printf(“=n“);printf(“ * 编号 图书名 作者名 出版社 类别 出版时间 价格 *n“);C 语言程序设计第 26 页 共 29 页 while(p!=NULL)if(strcmp(p-bname,a)=0)printf(“* %d %s %s %s %s %d %.2f*n“,p-num,p-bname,p-wname,
41、p-press,p-sort,p-time,p-price);p=p-next;printf(“=n“); 本代码由 杨国峥 设计 /修改图书信息void xiugai(struct book *head)int a,b;char c;struct book *p;printf(“请输入要修改的图书编号:“);scanf(“%d“,p=head;while(p!=NULL)if(p-num=a)break;p=p-next;if(p=NULL)printf(“没有找到该编号的图书!n“);getchar();elseprintf(“=n“);printf(“*1-编号 2-图书名 3-作者名
42、*n“);printf(“*4-出版社 5-类别 6-出版时间 *n“);printf(“* 7-价格 8-修改全部 0-放弃修改 *n“);printf(“=n“);printf(“请选择你要修改的信息编号:“);scanf(“%d“,C 语言程序设计第 27 页 共 29 页 getchar();switch(b)case 1:printf(“请输入新编号:“);scanf(“%d“,printf(“修改成功!n“);getchar();break;case 2:printf(“请输入新图书名:“);gets(p-bname);printf(“修改成功!n“);break;case 3:p
43、rintf(“请输入新作者名:“);gets(p-wname);printf(“修改成功!n“);break;case 4:printf(“请输入新出版社:“);gets(p-press);printf(“修改成功!n“);break;case 5:printf(“请输入新类别:“);gets(p-sort);printf(“修改成功!n“);break;case 6:printf(“请输入新出版时间:“);scanf(“%d“,printf(“修改成功!n“);getchar();break;case 7:printf(“请输入新价格:“);scanf(“%f“,C 语言程序设计第 28 页 共 29 页 printf(“修改成功!n“);getchar();break;case 8:printf(“请输入新图书编号:“);scanf(“%d“,printf(“请输入新图书名:“);scanf(“%s“,p-bname);getchar();printf(“请输入新作者名:“);scanf(“%s“,p-wname);getchar();printf(“请