当前位置:文档之家› 重庆交通大学毕业课程设计报告

重庆交通大学毕业课程设计报告

重庆交通大学毕业课程设计报告
重庆交通大学毕业课程设计报告

(此文档为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;}

测试结果及存在的问题

主函数模块

相关主题
文本预览
相关文档 最新文档