重庆交通大学毕业课程设计报告.docx
《重庆交通大学毕业课程设计报告.docx》由会员分享,可在线阅读,更多相关《重庆交通大学毕业课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
重庆交通大学毕业课程设计报告
重庆交通大学信息科学与工程
学院课程设计报告
班级:
通信工程二班
姓名:
学号:
实验项目名称:
图书管理系统
实验室(中心):
信息科学与工程学院
技术实验室
指导教师:
实验完成时间:
2012年6月28日
目录
一、题目.............................................1
二、功能描述........................................1
三、概要设计........................................1
四、详细设计
1、主函数(数组)................................3
2、各功能模块设计................................11
3、各功能模块设计................................
五、测试结果及存在的问题.............................
六、课程设计心得体会.................................
七、附录.............................................
题目
分别用数组和链表编程实现图书信息的简单管理。
要求用函数实现以下各功能并在主函数中进行调用。
功能描述
1、存储10本以上图书的基本数据(包括图书编号、图书名称、图书单价、数量、出版社)。
2、按要求输出图书信息(按图书价格降序排列,按书名首字母升序排列)。
3、查找指定图书的信息。
4、修改指定图书的信息。
5、删除指定图书的信息。
6、在指定的图书前或后再插入一个图书的信息。
7、统计指定出版社的图书数量。
概要设计
详细设计
1、主函数(数组)
对于主函数的描述,我选择用流程图来详细展示。
流程图如下:
[程序]
voidmain()
{
intselect,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)
{
case1:
outputnews(n);break;
case2:
search(n);break;
case3:
modify(n);break;
case4:
dele(&n);break;
case5:
insert(n);break;
case6:
add(n);break;
}
if(select==0)break;
}
}
2、各功能模块设计(数组)
(1)公共函数在很多函数中都有调用
structBook//定义书的类型
{
charbooknum[12];//图书编号
charbookname[12];//图书名称
floatbookprice;//图书单价
intnumber;//图书数量
charpublish[12];//出版社.共五个成员项组成数据域
}b[M];
(2)输入函数
在输入函数接收到主函数中输入的n后,会循环n次输入图书的基本信息即系统就存储了n本图书的基本信息。
(3)输出模块
价格降序排列程序流程图
(4)查找模块
在查找一本图书的信息时,调用库函数strcmp查找图书的信息,找到后再输出该图书的基本信息。
程序:
(5)修改模块
在修改图书信息时先调用库函数找到要修改的图书,然后重新输入该图书的基本信息,然后在调用自定义函数print打印出修改后的图书信息。
(6)删除模块
在设计删除模块时,要考虑到删除后打印图书信息的本数问题,为了让图书能够准确的被打印出来,我采用了用指针的方法来编写删除函数,用传地址的方法来更改图书的数量。
程序如下:
voiddele(int*n)
{
charbooknum[20];
printf("\t========删除指定图书的信息===========\n");
printf("请输入要删除的图书的编号:
\t");
scanf("%s",booknum);
for(inti=0;i<*n;i++)
if(strcmp(booknum,b[i].booknum)==0)break;
if(strcmp(booknum,b[i].booknum)==0)
{
for(intj=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(intj=*n;j>i;j--)若在指定图书后for(intj=*n;j>i+1;j--),这些都是对b[j]=b[j-1]来循环,把位置腾出后再输入插入图书的信息。
如其中一个程序:
voidinsert1(int*n)
{
charbooknum[20];
printf("=========在指定图书前插入一个图书的信息===========\n");
printf("请输入指定图书的编号:
\t");
scanf("%s",booknum);
for(inti=0;i<*n;i++)
if(strcmp(booknum,b[i].booknum)==0)break;
if(strcmp(booknum,b[i].booknum)==0)
{for(intj=*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)公共函数
structBook
{charbooknum[20];
charbookname[20];
floatbookprice;
intnumber;
charbookpublish[20];
structBook*next;
};前五个成员项组成数据域,而后一个成员项next构成指针域,它是一个指向Book类型结构的指针变量。
(2)输入模块
对于用链表存储图书的基本信息,就是建立一个有n个结点的链表来存放图书的基本信息。
建立链表的程序流程图:
(3)输出模块
输出模块流程图和数组一样,但是在排序时有很大的不同。
在交换两个链表时,要把每个结点中的数据都交换.调用排序函数后,再调用一个输出链表的函数打印出排序后的图书信息。
排序的程序流程图:
输出链表程序流程图
(4)查找模块
structBook*search(structBook*head)
{
structBook*pb,*pf;
charbooknum[20];
printf("请输入你要查询的书的编号:
\n");
scanf("%s",&booknum);
if(head==NULL)
{
printf("空表!
!
\n");
return0;
}
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");
returnhead;
}
(5)修改模块
(6)删除模块
structBook*dele(structBook*head)
{
charbooknum[20];
printf("======删除指定图书=======\n\n");
printf("请输入要删除的图书的编号:
\n");
scanf("%s",&booknum);
structBook*pf,*pb;
if(head==NULL)
{
printf("emptylist!
\n");
return0;
}
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");
returnhead;
}
(7)插入模块
在指定图书后插入图书的函数的程序流程图:
(8)统计模块
因为流程图原理一样就不再画了。
其程序为
structBook*add(structBook*head)
{printf("=======统计指定出版社的图书数量=========\n\n");
charbookpublish[20];
intnum=0;
printf("请输入出版社的名称:
\t");
scanf("%s",bookpublish);
structBook*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);
returnhead;}
测试结果及存在的问题
主函数模块