资源描述
. .
C语言课程设计报告
院 系:
学 号:
班 号:
姓 名:
标 题: 图书管理系统
目录
第一局部
题目要求………………………………………………3
第二局部
需求分析………………………………………………3
第三局部
总体设计………………………………………………4
第四局部
详细设计………………………………………………4
1)主函数………………………………………4
2)各功能模块设计……………………………6
3)公共函数…………………………………16
第五局部
上机操作……………………………………………17
第六局部
总结…………………………………………………20
附录
〔源代码〕…………………………………………22
第一局部 题目要求
图书管理系统包括:图书名称、图书编号、单价、作者、存在状态、借书人XX、性别、学号等,是设计一图书管理系统,使之能够提供以下功能:
1. 新图书根本信息的输入。
2. 图书根本信息的查询。
3. 对撤销图示根本信息的删除。
4. 办理借书手续。
5.办理换书手续。
第二局部 需求分析
根据题目的要求,需要建立一个文件来保存图书信息,每本书的信息用一个构造体来保存,构造体的成员应包括图书名称、图书编号、单价、作者、存在状态、借书人XX、性别、学号,构造体中的存在状态可设为整型,用不同数字代表借还状态;在借书和还书手续中,要注意构造体的成员变量存在状态的值,使用指针会比较方便。
程序中需要对图书信息实现输入、查询、删除、借书和还书的功能,首先要使用菜单进展各项功能的选择;其次需要有文件的输入、输出功能,提供显示、查找等操作。在程序的运行过程中,注意各功能在使用完毕后返回菜单的设置,以方便运行。
第三局部 总体设计
根据上面的需求分析,可以将整个图书管理系统分为输入模块、查找模块、删除模块、借书模块和还书模块〔如图3-1所示〕。
图书管理系统
输入新书
查找图书
删除图书
借阅图书
归还图书
图3-1 系统功能模块图
第四局部 详细设计
4.1 数据构造
在这个程序里,每本书的信息用一个构造体book来保存,构造体的成员应包括图书名称、图书编号、单价、作者、存在状态、借书人XX、性别、学号,构造体中的存在状态设为整型,用不同数字代表库中高本书的数量。
struct book
{ char title[30];
int number;
char author[30];
float price;
int store;
char borrower_name[20];
char borrower_gender[5];
int borrower_number;
}s[N];
其中的N定义为该系统所管理书籍的最大值。
#define N 100 //书籍的最多本数
4.2 主函数
【说明】
主函数中,对“菜单〞进展了输出,将各个模块的函数列出来,实现对各种功能的选择。其流程图如图4.1-1所示。
显 示 一 系 列 功 能 选 项
输入n,判断n
是否是0~5?
调 用 与 n 相 应 的 模 块
N
Y
开 始
结 束
图4.1-1 主函数流程图
【程序】
void main()
{ int x;
do
{printf("**************************************菜单**************************************\n"
" *********** 1.输入图书信息 ********** \n"
" *********** 2.查找图书信息 ********** \n"
" *********** 3.删除图书信息 ********** \n"
" *********** 4.借阅图书 ********** \n"
" *********** 5.归还图书 ********** \n"
" *********** 0.退出 ********** \n");
printf("********************************************************************************\n");
printf("请在0-5中选择,以回车键完毕\n");
scanf("%d",&x);
switch(x)
{ case 1: input(&s[0]);break;//输入新图书信息模块
case 2: search(&s[0]);break;//查找模块
case 3: del(&s[0]);break;//删除模块
case 4: borrow(&s[0]);break;//借书模块
case 5: retur(&s[0]);break;//还书模块
case 0: break;//退出
}
}while(x!=0);
}
4.2 各功能模块设计
〔1〕输入模块
【分析】
在输入模块中,主要以输入输出语句为主,使用了do…while…和for…这两种循环方式,do…while…是作为一级循环,for…为二级循环。
在输入图书的根本信息过程中,使用指针进展字符串及值的传递。全局变量m是用于记录图书的储存位置,便于在后来的查询、删除等功能中的使用。调用save(struct book*p)来保存输入的数据。定义的整型变量y,用来储存是否继续的指令。该模块的流程图如以下图4.2-1所示。
输入图书的根本信息
调用save(struck book *p)保存函数,m++
判断y是否为0?
Y
N
开场
返回菜单
完毕
图4.2-1 输入模块流程图
【程序】
void input(struct book *p)
{ int y;
for(;p<(&s[0]+N);p++)
{ printf("请输入书名:");scanf("%s",p->title);
printf("请输入编号:"); scanf("%d",&p->number);
printf("请输入作者:"); scanf("%s",p->author);
printf("请输入图书价格:"); scanf("%f",&p->price);
printf("请输入图书数量:"); scanf("%d",&p->store);
m++;
printf("第%d个信息已经输入完毕,是否继续?\n按任意键继续,按0键完毕.",m);
scanf("%d",&y);//读取是否继续
if(y==0)
{ save(&s[0]);
read(&s[0]);//调用读取文件函数
break;
}
}
}
〔2〕查找模块
【分析】
此模块的提供两种查找方式,输入书名或作者,均可实现查找功能。在函数的结尾,选择是否继续查找。
开 始
选择查找方式0-2
1或2
输入书名或作者
调用read(struct book *p)
使用for循环查找并显示记录
判断是否继续
Y
N
返回菜单
结 束
0
图4.2-2 查找模块流程图
【程序】
void search(struct book *p)//查询模块
{ int n;
char name1[20];
char name2[20];
char c[3];
do
{ p=&s[0];
printf("\t请选择查找方式:\n");//打印查询方式菜单
printf(" 1.按书名查找\n 2.按作者查找\n 0.返回\n");
printf("请在0-2中选择:\n\n");
scanf("%d",&n);//读取查找方式
if(n==0) break;
switch(n)
{ case 1: printf("请输入书名:\n");scanf("%s",name1);break;
case 2: printf("请输入 \n");scanf("%s",name2); break;
}
for(;p<&s[m];p++)
{ read(&s[0]);//调用读取函数
if(strcmp(p->title,name1)==0||strcmp(p->author,name2)==0)
{ printf("\n查找图书信息成功!\n");
printf("书名 编号 作者 价格 数量\n");
printf("%-10s%-10d%-10s%-10.2f%-10d\n", p->title,p->number,p->author,p->price,p->store);//打印信息
break;
}
}
printf("是否继续查找?\n“是〞请键入“yes〞, “否〞请按任意键,返回菜单\n");
scanf("%s",c);
}while(strcmp(c,"yes")==0);//判断是否完毕
}
〔3〕删除模块
【分析】
该模块实现对撤销图书的删除。用户首先查找要删除的图书,图书列表出来后,确认是否删除。当删除成功后,询问是继续删除还返回退出并返回菜单。其流程图如以下图4.2-3所示。
开 始
选择删除方式0-2
1或2
输入要删除的书名或作者
调用read(struct book *p)
使用for循环查找并显示记录,m--
判断是否继续
Y
N
返回菜单
结 束
0
调用save〔struct book*p〕
图4.2-3 删除模块流程图
【程序】
void del(struct book *p)//删除模块
{ int i;
struct book *p1,*p2;
char name1[20];
char name2[20];
char c[3];
int n;
do
{ p=&s[0];
printf("请选择删除以方式回车键完毕:\n");//打印删除方式菜单
printf( " 1.按书名删除\n 2.按作者删除\n 0.返回\n");
printf("请在0-2中选择:\n\n");
scanf("%d",&n);//读取查找方//
if(n==0) break;
switch(n)
{case 1:printf("请输入书名:\n");
scanf("%s",name1); break;
case 2: printf("请输入 \n");
scanf("%s",name2); break;
}
read(&s[0]); //调用读取函数
for(i=0;i<m;i++,p++)
{
if(strcmp(p->title,name1)==0||strcmp(p->author,name2)==0)
{ p1=p;
for(p2=p1+1;p2<=&s[m];p1++,p2++)
{
strcpy(p1->title,p2->title);
strcpy(p1->author,p2->author);
p1->number=p2->number;
p1->store=p2->store;
p1->price=p2->price;
m--;
printf("删除成功!!\n");
}
}
else {printf("没有该书记录!!");
break;}
}
printf("是否继续删除?“是〞请键入“yes〞, “否〞请按任意键,返回菜单\n");
scanf("%s",c); //读取是否继续
save(&s[0]); //调用保存函数
}while(strcmp(c,"yes")==0); //判断是否继续删除
}
(4)借书模块
【分析】
该模块实现系统的借书功能。首先查找要借阅的图书,并且显示该项图书的记录,输入借书人的信息后store--,借书成功,询问是否继续。
该模块的流程图如以下图4.2-4所示。
开 始
选择借阅查找方式
0-20-2
1或2
输入要借阅的书名或作者
调用read(struct book *p)
使用for循环查找,m--
判断是否继续
Y
N
返回菜单
结 束
0
调用save(struct book *p)
输入借书人的根本信息
显示图书借阅信息
图4.2-4 借书模块流程图
【程序】
void borrow(struct book *p)//借书模块
{ int z;
char name3[20],name4[20];
char w[3];
do
{ p=&s[0];
printf("请先查找您要借阅的图书!");
printf("请选择查找方式:\n");//打印查询方式菜单
printf(" 1.按书名查找\n 2.按作者查找\n 0.返回\n");
printf("请在0-2中选择:\n");
scanf("%d",&z);//读取查找方式
if(z==0) break;
switch(z)
{ case 1: printf("请输入书名:\n");scanf("%s",name3);break;
case 2: printf("请输入 \n");scanf("%s",name4); break;
}
read(&s[0]);//调用读取函数
for(;p<&s[m];p++)
{ if(strcmp(p->title,name3)==0||strcmp(p->author,name4)==0)
{printf("\n查找图书信息成功!\n");
printf("书名 编号 作者 价格 数量\n");
printf("%-10s%-10d%-10s%-10.2fs%-10d\n", p->title,p->number,
p->author, p->price,p->store);//打印信息
printf("请输入您的XX:");scanf("%s",p->borrower_name);
printf("请输入您的性别:");scanf("%s",p->borrower_gender);
printf("请输入您的学号:");scanf("%d",&p->borrower_number);
p->store--;
printf("借书成功!\n");
printf("书名 编号 作者 价格 数量 借书人 性别 学号\n");
printf("%-10s%-10d%-10s%-10.2f%-10d%-10s%-10s%-10d\n",p->title,
p->number,p->author,p->price,p->store,p->borrower_name,
p->borrower_gender,p->borrower_number);
break;
}
}
printf("是否继续借书??");
printf("“是〞请键入“yes〞, “否〞请按任意键,返回菜单\n");
scanf("%s",w); //读取是否继续
save(&s[0]); //调用保存函数
}while(strcmp(w,"yes")==0); //判断是否继续借书
}
(5)还书模块
【分析】
该模块实现还书功能。首先作者查找所要还得图书,找到后将借书人的根本信息去除并保存,实现还书功能。其流程图如图4.2-5所示。
开 始
选择还书查找方式
0-20-2
1或2
输入要还的书名或作者
调用read(struct book *p)
使用for循环查找,m--
判断是否继续
Y
N
返回菜单
结 束
0
调用save(struct book *p)
去除借书人的根本信息
显示图书信息
图4.2-5 还书模块流程图
【程序】
void retur(struct book *p)//还书模块
{ int e,f;
char name5[20];
char name6[20];
char t[3];
do
{ p=&s[0];
printf("请先查找您要还的图目!");
printf("请选择查找方式:\n"); //打印查询方式菜单
printf(" 1.按书名查找\n 2.按作者查找\n 0.返回\n");
printf("请在0-2中选择:\n\n");
scanf("%d",&e); //读取查找方式
if(e==0) break;
switch(e)
{ case 1: printf("请输入书名:\n");scanf("%s",name5);break;
case 2: printf("请输入 \n");scanf("%s",name6);break;
}
read(&s[0]);//调用读取函数
for(;p<&s[m];p++)
{ if(strcmp(p->title,name5)==0||strcmp(p->author,name6)==0)
{ printf("\n查找图书信息成功!\n");
printf("确认还书请按“1”!");//确认是否还书
scanf("%d",&f);
if(f==1)
{ strcpy(p->borrower_name,"0");
strcpy(p->borrower_gender,"0");
p->borrower_number=0;
p->store++;
printf("书名 编号 作者 价格 数量 借书人 性别 学号\n");
printf("%-10s%-10d%-10s%-10.2f%-10d%-10s%-10s%-10d\n",p->title,p->number,p->author,p->price,p->store,p->borrower_name,p->borrower_gender,p->borrower_number); //打印信息
}
break;
}
else {printf("没有该书记录!!");
break;}
}
printf("是否继续还书?\n");
printf("“是〞请键入“yes〞, “否〞请按任意键,返回菜单\n");
scanf("%s",t); //读取是否继续
save(&s[0]); //调用保存函数
}while(strcmp(t,"yes")==0); //判断是否继续还书
}
4.3 公共函数
〔1〕保存图书信息函数
void save(struct book *p)
{ FILE *fp,*fp1;
int i;
if((fp=fopen("tushu.dat","wb"))==NULL)//翻开文件并判断是否出错
{ printf("创立文件失败!\n\n");//打印出错提示
getchar(); return;
}
if((fp1=fopen("book.dat","wb"))==NULL)//翻开文件并判断是否出错
{ printf("创立文件失败!\n\n");//打印出错提示
getchar(); return;
}
for(i=0;i<m;i++,p++)
if(fwrite(p,sizeof(struct book),1,fp)==0)//向文件写入数据,并判断是否出错
printf("向文件输入数据失败!\n\n");
fprintf(fp1,"%d",m);
fclose(fp);//关闭文件
fclose(fp1);//关闭文件
}
〔2〕读取文件信息函数
void read(struct book *p)//从文件读取信息模块
{ FILE *fp,*fp1;
int i;
if((fp=fopen("tushu.dat","rb"))==NULL)//翻开文件,并判断是否出错
{printf("出错,请检查文件是否存在,按任意键返回住菜单");//打印出错提示
getchar();
}
if((fp1=fopen("book.dat","rb"))==NULL)//翻开文件并判断是否出错
{ printf("创立文件失败!\n\n");//打印出错提示
getchar(); return;
}
fscanf(fp1,"%d",&m);
fclose(fp1);//关闭文件
for(i=0;i<m;i++,p++)
{ fread(p,sizeof(struct book),1,fp);//从文件中读取信息
}
fclose(fp);//关闭文件
}
第五局部 上机操作
(1) 运行主函数,进入主菜单
(2) 输入模块
(3) 查找模块
(4)删除模块
(5)借书模块
〔6〕还书模块
〔7〕退出
第六局部 总 结
通过这次为期一周的C语言上机实习,我明白C语言这门课程光仅仅是听课是远远不够的,上机训练也不容无视。通过上机训练,才能够明白自己知识的缺乏,更加深刻的理解C语言中的知识点,从而找到知识漏点,还对以前认为自己已懂了的知识点也理解更加深刻。当遇到了自己当时不知如何编写的C语言题目时,通过自己的学习和同学的交流,得以顺利的编写,使我增加了对C语言的兴趣和学好C语言的信心。
本次C语言实习的几个作用:
1.加深对课堂讲授容的理解
课堂上要讲授许多关于C语言的语法规那么,听起来比较枯燥,不易记忆。而通过屡次上机练习,对于语法知识就有了更深的认识,自然而然地掌握C语言的语法规定。学习C语言不能停留在书本,而是要利用学到的知识编写C语言程序,解决实际问题。通过对自己编写程序的调试,发现问题,解决问题,逐步提高自己对C语言的理解和程序开发能力。
2.熟悉程序开发环境、学习计算机系统的操作方法
一个C语言程序从编辑、编译、连接到运行,都要在一定的外部操作环境下才能进展。所谓"环境"就是所用的计算机系统硬件、软件条件,只有学会使用这些环境,才能进展程序开发工作。通过上机实验,熟练地掌握C语言开发环境,为以后真正编写计算机程序解决实际问题打下根底。同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。
在这次实习的过程我中遇到了一些难题,教师给予了我细心的指导,帮助我解决了很多程序上的问题,再次向教师的帮助表示衷心的感谢!
附 录〔源程序〕
【总程序】
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define N 100 //书籍的最多本数
struct book
{ char title[30];
int number;
char author[30];
float price;
int store;
char borrower_name[20];
char borrower_gender[5];
int borrower_number;
}s[N];
int m=0;
void input(struct book *p); //输入图书信息
void save(struct book *p); //保存图书信息
void read(struct book *p); //读取图书信息
void search(struct book *p); //查找图书信息
void del(struct book *p); //删除图书信息
void borrow(struct book *p); //借阅图书
void retur(struct book *p); //归还图书
void main()
{
int x;
do
{
printf("**************************************菜单**************************************\n"
" *********** 1.输入图书信息 ********** \n"
" *********** 2.查找图书信息 ********** \n"
" *********** 3.删除图书信息 ********** \n"
" *********** 4.借阅图书 ********** \n"
" *********** 5.归还图书 ********** \n"
" *********** 0.退出 ********** \n");
printf("********************************************************************************\n");
printf("请在0-5中选择,以回车键完毕\n");
scanf("%d",&x);
switch(x)
{ case 1: input(&s[0]);break;
case 2: search(&s[0]);break;
case 3: del(&s[0]);break;
case 4: borrow(&s[0]);break;
case 5: retur(&s[0]);break;
case 0: break;
}
}while(x!=0);
}
void input(struct book *p)
{ int y;
for(;p<(&s[0]+N);p++)
{ printf("请输入书名:");scanf("%s",p->title);
printf("请输入编号:"); scanf("%d",&p->number);
printf("请输入作者:"); scanf("%s",p->author);
printf("请输入图书价格:"); scanf("%f",&p->price);
printf("请输入图书数量:"); scanf("%d",&p->store);
m++;
printf("第%d个信息已经输入完毕,是否继续?\n按任意键继续,按0键完毕.",m);
scanf("%d",&y);//读取是否继续
if(y==0)
{ save(&s[0]);
read(&s[0]);//调用读取文件函数
break;
}
}
}
void search(struct book *p)//查询模块
{ int n;
char name1[20];
char name2[20];
char c[3];
do
{ p=&s[0];
printf("\t请选择查找方式:\n");//打印查询方式菜单
printf(" 1.按书名查找\n 2.按作者查找\n 0.返回\n");
printf("请在0-2中选择:\n\n");
scanf("%d",&n);//读取查找方式
if(n==0) break;
switch(n)
{ case 1: printf("请输入书名:\n");scanf("%s",name1);break;
case 2: printf("请输入 \n");scanf("%s",name2); break;
}
for(;p<&s[m];p++)
{ read(&s[0]);//调用读取函数
if(strcmp(p->title,name1)==0||strcmp(p->author,name2)==0)
{ printf("\n查找图书信息成功!\n");
printf("书名 编号 作者 价格 数量\n");
printf("%-10s%-10d%-10s%-10.2f%-10d\n", p->title,p->number,p->author,p->price,p->store);//打印信息
break;
}
}
printf("是否继续查找?\n“是〞请键入“yes〞, “否〞请按任意键,返回菜单\n");
scanf("%s",c);
}while(strcmp(c,"yes")==0);//判断是否完毕
}
void del(struct book *p)//删除模块
{ int i;
struct book *p1,*p2;
char name1[20];
char name2[20];
char c[3];
int n;
do
{ p=&s[0];
printf("请选择删除以方式回车键完毕:\n");//打印删除方式菜单
printf( " 1.按书名删除\n 2.按作者删除\n 0.返回\n");
printf("请在0-2中选择:\n\n");
scanf("%d",&n);//读取查找方//
if(n==0) break;
switch(n)
{c
展开阅读全文