1、1课 程 报 告课 程 名 称: 程序设计实践 专 业 班 级 : 计算机科学与技术 1203 班 学 生 姓 名 : 董鹏军 学 号 : 201216010305 任 课 教 师 : 张苗 学 期 : 2012-2013 学年第二学期 2课程报告任务书题 目 图书信息管理系统主要内容开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等) 。使之能提供以下基本功能:(1)图书信息录入功能(图书信息用文件保存 )输入(2)图书信息浏览功能输出(3)查询功能(至少一种查询方式 )、排序功能(至少一种
2、排序方式): 按书名查询 按作者名查询 按照价钱排序 按出版时间排序等等(4)图书信息的删除与修改扩展功能:可以按照自己的程度进行扩展。比如(1)简单的权限处理 (2)报表打印功能(3)甚至根据自己情况,可以加上学生信息,并扩充为图书借阅系统。 (4)模糊查询 (5)综合查询 ( 6)统计功能 比如统计处某一类别的图书信息 或 筛选出小于指定数量库存的图书信息等等,总之,可以根据自己需求进行分析功能。任务要求一、提交材料应包括:(1)系统源代码 (2)课程报告二、整个设计过程具体要求(1)需求分析 要求学生对案例系统进行分析,设计出需要完成的功能,完善各个模块的调用关系;(2)设计过程 要求学
3、生进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等)(3)实现过程 要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试;(4)总结阶段 按照要求完成系统设计和实现报告,并进行总结、答辩。报告撰写情况(30 分) 系统完成情况(30 分) 答辩情况(40 分)内容20 分规范程度5 分程序测试5 分基本功能20 分扩展功能10 分自述情况10 分答辩情况30 分 总分成绩评定成绩评定教师: 31 需求分析根 据 题 目 要 求 , 应 当 把 图 书 信 息 用 结 构 体 形 式 输 入 , 再 定 义 一 个 全 局 变 量 和 文 件 指针 进
4、 行 整 个 程 序 的 运 行 , 然 后 把 图 书 信 息 送 到 文 件 中 , 所 以 应 该 提 供 一 个 结 构 体 和 文件 的 输 入 输 出 等 操 作 ; 在 程 序 中 需 实 现 图 书 信 息 录 入 , 浏 览 , 查 询 , 删 除 和 修 改 等 功能 的 操 作 , 所 以 需 要 建 立 相 应 的 模 块 来 实 现 ; 另 外 还 需 提 供 键 盘 式 选 择 菜 单 实 现 功能 , 在 运 行 时 达 到 所 要 目 的 。2 概要设计我的图书信息管理系统包括以下几个模块1-从文件中打开图书信息模块 2-新建书库模块3-插入图书模块4-删除图书
5、信息模块5-按编号排序模块6-输出图书信息模块7-保存图书信息到文件模块;8-查询图书信息模块对于图书信息的保存,我采用的是结构,新建的图书用链表将其连接起来,采用文件保存,程序主要包括库函数,用结构定义图书信息,定义函数,main 函数,以上定义函数的实现。3 详细设计(1)头函数名#include#include#include(2)对书籍信息的定义struct Book_List4char book_number20; /*图书编号*/char book_name40; /*该书书名*/char book_writter30; /*此书的作者*/char book_publiction4
6、0; /*该书的出版社*/char book_sort30; /*图书类别*/char book_born20; /*出版时间*/double price; /*这本书的单价*/struct Book_List *next; /*图书单的单向指针*/;(3)对子函数的定义struct Book_List *Creat_Book_List(struct Book_List *head1); /新建图书链表void book_save(struct Book_List *); /保存图书信息到文件struct Book_List *Open_book(); /从文件中读取书目信息struct Bo
7、ok_List *book_Sort(struct Book_List *head1); /对图书链表按编号排序void Printf_out(struct Book_List *); /输出链表中的信息struct Book_List *Insert_Book_list(struct Book_List *); /插入图书信息struct Book_List *Delete_Book_List(struct Book_List * ); /删除图书struct Book_List *T_book_number(struct Book_List *);/按书号删除struct Book_Lis
8、t *T_book_name(struct Book_List *);/按书名删除void book_hunt(struct Book_List *head1);/搜索图书void book_number(struct Book_List *head1);/通过图书编号检索图书信息void book_name(struct Book_List *head1);/通过图书书名检索图书信息void book_writer(struct Book_List *head1);/通过作者检索图书信息void Printf(struct Book_List *); /输出单个书目的信息int Count1
9、=0;(4)各个函数的实现1.新建链表函数的实现struct Book_List *Creat_Book_List(struct Book_List *head1)/新建图书链表5struct Book_List *tail , *p;char book_number20; /*图书编号*/char book_name40; /*该书书名*/char writter30; /*此书的作者*/char book_publiction40; /*该书的出版社*/char book_sort30; /*图书类别*/char book_born20; /*出版时间*/double price; int
10、 size = sizeof(struct Book_List);int choice = 1;if(head1 != NULL)p = head1;while(p-next != NULL)p = p - next;tail = p;while(choice != 0) system(“cls“);printf(“ 【建 立 书 籍 信 息】nn“);printf(“请输入图书编号:“);scanf(“%s“, book_number );printf(“请输入图书出版社:“);scanf(“%s“, book_publiction);printf(“请输入图书名:“);scanf(“%s“
11、, book_name);6printf(“请输入作者:“);scanf(“%s“,writter);printf(“请输入图书类别:“);scanf(“%s“, book_sort);printf(“请输入出版时间:“);scanf(“%s“,book_born);printf(“请输入图书价格:“);scanf(“%lf“, p = (struct Book_List *)malloc(size);strcpy(p - book_number , book_number);strcpy(p - book_name , book_name);strcpy(p - book_writter ,
12、 writter);strcpy(p - book_publiction , book_publiction); strcpy(p - book_sort , book_sort);strcpy(p - book_born , book_born);p - price = price; p - next = NULL;if(head1 = NULL)head1 = p;elsetail - next = p;tail = p;printf(“是否继续建立图书信息(1/0 ?)n“);scanf(“%d“, return head1;72.插入图书信息函数的实现struct Book_List
13、*Insert_Book_list(struct Book_List *head ) /插入图书信息struct Book_List *ptr1 , *ptr2 , *p;char book_number20; /*图书编号*/char book_name40; /*该书书名*/char writter30; /*此书的作者*/char book_publiction40; /*该书的出版社*/char book_sort30; /*图书类别*/char book_born20; /*出版时间*/double price; int choice = 1;int size = sizeof(st
14、ruct Book_List);while(choice = 1)system(“cls“);printf(“ 【插 入 如 书 籍 信 息】nn“);printf(“请输入图书编号:“);scanf(“%s“, book_number );printf(“请输入图书出版社:“);scanf(“%s“, book_publiction);printf(“请输入图书名:“);scanf(“%s“, book_name);printf(“请输入作者:“);scanf(“%s“,writter);printf(“请输入图书类别:“);scanf(“%s“, book_sort);printf(“请输
15、入出版时间:“);scanf(“%s“,book_born);8printf(“请输入图书价格:“);scanf(“%lf“, p = (struct Book_List *)malloc(size);strcpy(p - book_number , book_number);strcpy(p - book_name , book_name);strcpy(p - book_writter , writter);strcpy(p - book_publiction , book_publiction);strcpy(p - book_sort , book_sort);strcpy(p - b
16、ook_born , book_born);p - price = price;p - next = NULL;/书库信息为空时if(head = NULL)head = p; /书库信息不为空elseptr1 = head;ptr2 = head - next; while(ptr2 != NULL)ptr1 = ptr1 - next;ptr2 = ptr2 - next;ptr1 - next = p;printf(“-此图书信息插入成功!-n“);9printf(“是否继续建立图书信息(1/0 ?)n“);scanf(“%d“, return head;3.删除图书信息函数的实现str
17、uct Book_List *Delete_Book_List(struct Book_List *head ) /删除图书int choice , i = 1;/链表为空if(head = NULL)printf(“书库信息为空,请先建立书库信息。n“);printf(“想要新建书库请输入 2,退出请输入 0:“);scanf(“%d“, if(choice = 2)head = Creat_Book_List(head);return head;elsereturn NULL;while(i = 1)system(“cls“);printf(“ 删 除 图 书 信 息 n“);printf
18、(“ 通过图书编号-请输入 1 通过书名-请输入 2 10退出删除-请输入 0 n“);printf(“请输入操作对应的输入数: “);scanf(“%d“, switch(choice)case 1:head = T_book_number(head);getchar();break;case 2:head = T_book_name(head);getchar();break;case 0:printf(“退出删除操作成功n“);i = 0;getchar();break;default:printf(“输入错误,退出系统。n“);i = 0;getchar();return head;1
19、1struct Book_List *T_book_number(struct Book_List *head) /通过图书编号删除图书信息struct Book_List *ptr1 , *ptr2 , *p;char book_number20;int flag = 1;printf(“请输入需要删除图书编号:“);scanf(“%s“, book_number);for(p = head;p != NULL;p= p - next)if(strcmp(p - book_number , book_number) = 0)flag = 0; break;if(flag = 1)printf
20、(“没 有 找 到 编 号 为 %s 的 图 书 信 息!n“, book_number);else/要删除结点在表头if(strcmp(head - book_number , book_number) = 0)doptr1 = head;head = head - next;free(ptr1);while( strcmp(head - book_number , book_number) = 0);printf(“删 除 图 书 信 息 成 功 !n“);12/要删除节点为非表头结点elseptr1 = head;ptr2 = head - next;while(ptr2 != NULL
21、)if(strcmp(ptr2 - book_number , book_number) = 0)ptr1 - next = ptr2 - next;free(ptr2);elseptr1 = ptr2;ptr2 = ptr1 - next;printf(“删 除 图 书 信 息 成 功 !n“);getchar();return head;struct Book_List *T_book_name(struct Book_List *head) /通过图书书名删除图书信息13struct Book_List *ptr1 , *ptr2 , *p;char book_name20;int fl
22、ag = 1;printf(“请输入需要删除图书书名:“);scanf(“%s“, book_name);for(p = head;p != NULL;p= p - next)if(strcmp(p - book_name , book_name) = 0)flag = 0; break;if(flag = 1)printf(“没 有 找 到 书 名 为 %s 的 图 书 信 息!n“, book_name);else/要删除结点在表头if(strcmp(head - book_name , book_name) = 0)doptr1 = head;head = head - next;fre
23、e(ptr1);while( strcmp(head - book_name , book_name) = 0);printf(“删 除 图 书 信 息 成 功 !n“);/要删除节点为非表头结点else14ptr1 = head;ptr2 = head - next;while(ptr2 != NULL)if(strcmp(ptr2 - book_name , book_name) = 0)ptr1 - next = ptr2 - next;free(ptr2);elseptr1 = ptr2;ptr2 = ptr1 - next;printf(“删 除 图 书 信 息 成 功 !n“);g
24、etchar();return head;4.排序函数的实现struct Book_List *book_Sort(struct Book_List *head1) /排序函数struct Book_List *head; /定义链表的头指针struct Book_List *min;struct Book_List *p_min; /min 前的节点struct Book_List *tail; /定义链表的尾指针struct Book_List *p , *ptr;head = NULL;15while(head1 != NULL)p = head1;while(p - next != N
25、ULL)p = p - next;ptr = p;for(p = head1,min = head1;p - next != NULL;p = p - next)if(strcmp(p - next) - book_number , min - book_number) next;if(head = NULL)head = min;tail = min;elsetail - next = min;tail = min;if(min = head1)head1 = head1 - next;else if(min = ptr)p_min - next = NULL;else16p_min - n
26、ext = min - next;if(head != NULL)tail - next = NULL;printf(“排序成功!n“);getchar();return head;5.将图书写入文件和读出文件函数的实现void book_save(struct Book_List *head) /保存图书信息到文件FILE *fp;struct Book_List *p;if(fp = fopen(“书库信息.txt“ , “w“) = NULL)printf(“书 库 信 息 文 件 打 开 出 错 ! n“);exit(0);for(p = head;p != NULL;p = p -
27、next)fprintf(fp , “%s %s %s %s %s %s %.2fn“ , p - book_number ,p - book_name ,p - book_writter ,p - book_publiction ,p - book_sort ,p - book_born, p - price );if(fclose(fp)printf(“不 能 关 闭 书 库 信 息 文 件!n“);17exit(0);elseprintf(“-图 书 信 息 保 存 成 功 -n“);getchar();struct Book_List *Open_book() /从文件中打开图书信息F
28、ILE *fp;int size = sizeof(struct Book_List);struct Book_List *head , *p , *tail ;head = tail = NULL;if(fp = fopen(“书库信息.txt“ , “r“) = NULL)printf(“书 库 信 息 文 件 打 开 出 错 ! n“);exit(0);printf(“tttt-书 库 信 息 文 件 打 开 成 功-!n“);while(!feof(fp)p = (struct Book_List *)malloc(size);fscanf(fp , “%s%s%s%s%s%s%lf“
29、 , if(feof(fp) break;18p - next = NULL;if(head = NULL)head = p;elsetail - next = p;tail = p;if(fclose(fp)printf(“不 能 关 闭 书 库 信 息 文 件!n“);exit(0);getchar();return head;6.搜索图书信息函数的实现void book_hunt(struct Book_List *head1)/搜索图书信息int choice , i = 1;/链表为空if(head1 = NULL)printf(“书库信息为空,请先输入n“);return;whil
30、e(i = 1)system(“cls“);printf(“ 【搜 索 图 书】 n“);printf(“ 1-通过图书编号 n“);19printf(“ 2-通过书名 n“);printf(“ 3-通过作者 n“);printf(“ 0-退出 n“);printf(“请输入操作对应的输入数: “);scanf(“%d“, switch(choice)case 1:book_number(head1);getchar(); break;case 2:book_name(head1);getchar(); break;case 3:book_writer(head1);getchar(); br
31、eak;case 0:printf(“退出操作成功n“);i = 0;getchar(); break;default:printf(“输入错误,退出系统。n“);i = 0;getchar();return;20void book_number(struct Book_List *head1) /通过图书编号检索图书信息struct Book_List *p ;char book_number20;int flag = 0;printf(“请 输 入 要 查 询 的 图 书 编 号:“);scanf(“%s“, book_number);for(p = head1;p != NULL;p=
32、p - next)if(strcmp(p - book_number , book_number) = 0)flag = 1; break;if(flag = 0)printf(“没 有 找 到 编 号 为 %s 的 图 书 信 息!n“, book_number);elsePrintf(p); /输出搜索到的图书信息getchar();void book_name(struct Book_List *head1) /通过图书书名检索图书信息21struct Book_List *p;char book_name40;int flag = 0;printf(“请 输 入 要 查 询 的 图 书
33、 书 名:“);scanf(“%s“, book_name);for(p = head1;p != NULL;p= p - next)if(strcmp(p - book_name , book_name) = 0)flag = 1; break;if(flag = 0)printf(“没 有 找 到 编 号 为 %s 的 图 书 信 息!n“, book_name);elsePrintf(p); /输出搜索到的图书信息getchar();void book_writer(struct Book_List *head1) /通过作者检索图书信息struct Book_List *p;22cha
34、r book_writter30;int flag = 0;printf(“请 输 入 要 查 询 的 图 书 作 者:“);scanf(“%s“, book_writter);for(p = head1;p != NULL;p= p - next)if(strcmp(p - book_writter , book_writter) = 0)flag = 1; break;if(flag = 0)printf(“没 有 找 到 作 者 为 %s 的 图 书 信 息!n“, book_writter);elsePrintf(p); /输出搜索到的图书信息getchar();void Printf
35、(struct Book_List *p) /输出单个书目的信息system(“cls“);printf(“ 单 本 图 书 信 息 nn“);printf(“编号 书名 作者 出版社 类别 出版时间 单价n“);printf(“%s %s %s %s %s %s %.2fn“,p - book_number ,p - book_name ,p 23- book_writter,p - book_publiction ,p - book_sort,p - book_born, p - price ); getchar();各个算法实现的源程序,对每个题目要有相应的源程序(可以是一组源程序,每个
36、功能模块采用不同的函数实现)注意,不能把整个源程序都放进去,可以考虑按照函数为划分。源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。4 调试分析在调试的过程中,出现了各种问题,有标点开中文输入,有忘了写标点,少了个括号,少了定义,没把定义写到前面,有逻辑错误等诸多问题,都是自己一个一个函数去改,一个一个问题解决,期间也掌握了不少东西.5 测试结果 24256 课程心得总结这次课程设计让我掌握了许多的有用知识。首先通过不断地学习和锻炼更加熟练地掌握应用软件 Microsoft Visual C+ 6.0 了。设计正确及合适的程序对于我们初学者来说是很大的难题,出现一丁点儿错误就得非很大的努力去修改,正式者一步步一点点的努力让我对26C 语言游乐更深的认识。同时我掌握了解决问题的方法,这无论是对以后的学习、生活都有无比重要的价值。在设计中,每个同学都会遇到一些困难,或多或少,这些困难常常让我心情烦躁,比如不能清晰的建立设计模块,不会修改出现的错误等等,然后我向同学寻求帮助,向他们学习,最终通过自己努力建立了模块。不可避免地程序中肯定依然存在者某些问题,我希望在以后的学习和应用中不断提高自己的能力,攻克遇到的困难。