(此文档为word格式,下载后您可任意编辑修改!)
重庆交通大学信息科学与工程
学院课程设计报告
班级:通信工程二班姓名:
学号:
实验项目名称:图书管理系统
实验室(中心):信息科学与工程学院
技术实
验室
指导教师:
实验完成时间:2012 年 6 月28 日
目录
一、题目. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1
二、功能描述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
三、概要设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
四、详细设计
1、主函数(数组). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2、各功能模块设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
3、各功能模块设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
五、测试结果及存在的问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
六、课程设计心得体会 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
七、附录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
题目
分别用数组和链表编程实现图书信息的简单管理。要求用函数实现以下各功能并在主函数中进行调用。
功能描述
1、存储10本以上图书的基本数据(包括图书编号、图书名称、图书单价、
数量、出版社)。
2、按要求输出图书信息(按图书价格降序排列,按书名首字母升序排列)。
3、查找指定图书的信息。
4、修改指定图书的信息。
5、删除指定图书的信息。
6、在指定的图书前或后再插入一个图书的信息。
7、统计指定出版社的图书数量。
概要设计
详细设计
1、主函数(数组)
对于主函数的描述,我选择用流程图来详细展示。流程图如下:
[程序]
void main()
{
int select,n;
printf("请输入你要存储的图书本数:");
scanf("%d",&n);
printf("\t==============存储图书的信息
================\n\n");
inputdata(n);
printf("============================================ \n");
while(5)
{
printf(" ********************图书信息的简单管理
******************** \n\n");
printf(" * 1.按要求输出图书信息 *\n");
printf(" * 2.查找指定图书的信息 *\n");
printf(" * 3.修改指定图书的信息 *\n");
printf(" * 4.删除指定图书的信息 *\n");
printf(" * 5.插入图书的信息 *\n");
printf(" * 6.统计指定出版社的图书数量 *\n");
printf(" * 0.退出系统 *\n\n");
printf("
***********************************************************\n\ n");
printf("请选择<0-6>:\t");
scanf("%5d",&select);
printf("\n\n");
switch(select)
{
case 1:outputnews(n);break;
case 2:search(n);break;
case 3:modify(n);break;
case 4:dele(&n);break;
case 5:insert(n);break;
case 6:add(n);break;
}
if(select==0)break;
}
}
2、各功能模块设计(数组)
(1)公共函数在很多函数中都有调用
struct Book//定义书的类型
{
char booknum[12];//图书编号
char bookname[12];//图书名称
float bookprice;//图书单价
int number;//图书数量
char publish[12];//出版社 .共五个成员项组成数据域
} b[M];
(2)输入函数
在输入函数接收到主函数中输入的n后,会循环n次输入图书的基本信息即系统就存储了n本图书的基本信息。
( 3 )输出模块
价格降序排列程序流程图
(4)查找模块
在查找一本图书的信息时,调用库函数strcmp查找图书的信息,找到后再输出该图书的基本信息。
程序:
(5)修改模块
在修改图书信息时先调用库函数找到要修改的图书,然后重新输入该图书的基本信息,然后在调用自定义函数print打印出修改后的图书信息。
(6)删除模块
在设计删除模块时,要考虑到删除后打印图书信息的本数问题,为了让图书能够准确的被打印出来,我采用了用指针的方法来编写删除函数,用传地址的方法来更改图书的数量。
程序如下:
void dele(int *n)
{
char booknum[20];
printf("\t========删除指定图书的信息===========\n");
printf("请输入要删除的图书的编号:\t");
scanf("%s",booknum);
for(int i=0;i<*n;i++)
if(strcmp(booknum,b[i].booknum)==0) break;
if(strcmp(booknum,b[i].booknum)==0)
{
for(int j=i;j<*n;j++)
{b[j]=b[j+1];}
*n=*n-1;
printf("\n\t\t删除后\n"); print(*n);
}
else
printf("\t没有你要删除的图书!!!!\n\n");
}
(7)插入模块
在插入图书时,先根据图书的编号来找到插入的位置,找到插入位置后,如果是在指定图书前插入,for(int j=*n;j>i;j--)若在指定图书后 for(int j=*n;j>i+1;j--),这些都是对b[j]=b[j-1]来循环,把位置腾出后再输入插入图书的信息。
如其中一个程序:
void insert1(int *n)
{
char booknum[20];
printf("=========在指定图书前插入一个图书的信息===========\n");
printf("请输入指定图书的编号:\t");
scanf("%s",booknum);
for(int i=0;i<*n;i++)
if(strcmp(booknum,b[i].booknum)==0)break;
if(strcmp(booknum,b[i].booknum)==0)
{ for(int j=*n;j>i;j--)
{ b[j]=b[j-1]; }
printf("请输入要插入的图书的信息:\n\n");
printf("图书编号\t图书名称\t图书单价\t数量\t\t出版社\n\n");
scanf("%s%s%f%d%s",&b[i].booknum,&b[i].bookname,&b[i].bookprice,&b[i]. number,&b[i].publish);
*n=*n+1;
printf("\n\t\t插入后\n");
print(*n);}
else
printf("没有你指定的图书\n");}
(8)统计模块
3、各功能模块设计(链表)
(1)公共函数
struct Book
{char booknum[20];
char bookname[20];
float bookprice;
int number;
char bookpublish[20];
struct Book *next;
};前五个成员项组成数据域,而后一个成员项next构成指针域,它是一个指向Book 类型结构的指针变量。
(2)输入模块
对于用链表存储图书的基本信息,就是建立一个有n个结点的链表来存放图书的基本信息。
建立链表的程序流程图:
(3)输出模块
输出模块流程图和数组一样,但是在排序时有很大的不同。在交换两个链表时,要把每个结点中的数据都交换.调用排序函数后,再调用一个输出链表的函数打印出排序后的图书信息。
排序的程序流程图:
输出链表程序流程图
(4)查找模块
struct Book *search(struct Book *head)
{
struct Book *pb,*pf;
char booknum[20];
printf("请输入你要查询的书的编号:\n");
scanf("%s",&booknum);
if(head==NULL)
{
printf("空表!!\n");
return 0;
}
pb=head;
while(strcmp(pb->booknum,booknum)!=0&&pb->next!=NULL) {
pf=pb;
pb=pb->next;
}//pf指向当前结点,pb指向下一个结点//
if(strcmp(pb->booknum,booknum)==0)
{
printf("图书编号\t图书名称\t图书单价\t数量\t\t出版社\n");
printf("%5s\t",pb->booknum);
printf("\t%5s\t",pb->bookname);
printf("\t%5f\t",pb->bookprice);
printf("\t%5d\t",pb->number);
printf("\t%5s\t",pb->bookpublish);
printf("\n");
}
else
printf("没有要查询的图书。\n");
return head;
}
(5)修改模块
(6)删除模块
struct Book *dele(struct Book *head)
{
char booknum[20];
printf("======删除指定图书=======\n\n");
printf("请输入要删除的图书的编号:\n");
scanf("%s",&booknum);
struct Book *pf,*pb;
if(head==NULL)
{
printf("empty list!\n");
return 0;
}
pb=head;
while(strcmp(pb->booknum,booknum)!=0&&pb->next!=NULL)//当不是要删除的结点,而且也不是最后一个结点时,继续循环//
{
pf=pb;
pb=pb->next;
}//pf指向当前结点,pb指向下一个结点//
if(strcmp(pb->booknum,booknum)==0)
{
if(pb==head)
{
head=pb->next;
}
else
pf->next=pb->next;
free(pb);
}//如果找到被删结点,且为第一结点,则使head指向第二个结点,否则使pf所指结点的指针指向下一结点//
else
printf("没有你要删除的图书\n");
return head;
}
(7)插入模块
在指定图书后插入图书的函数的程序流程图:
(8)统计模块
因为流程图原理一样就不再画了。其程序为
struct Book *add(struct Book *head)
{ printf("=======统计指定出版社的图书数量=========\n\n");
char bookpublish[20];
int num=0;
printf("请输入出版社的名称:\t");
scanf("%s",bookpublish);
struct Book *p;
for(p=head;p!=NULL;p=p->next)
if(strcmp(p->bookpublish,bookpublish)==0)
{num=num+p->number;}
printf("\n该出版社的图书数量为:%d\n\n",num);
return head;}
测试结果及存在的问题
主函数模块