c语言图书信息管理系统课程设计报告

c语言图书信息管理系统课程设计报告本文简介:高级语言程序设计课程设计报告目录1课程设计目的与要求12问题描述23总体设计33.1功能分析33.2系统使用的主要函数33.3系统使用的主要数据结构44详细设计54.1程序总体结构图54.2程序流程图75功能测试105.1系统主界面105.2系统输入信息的界面115.3系统信息查询的界面125.4系
c语言图书信息管理系统课程设计报告本文内容:
高级语言程序设计课程设计报告
目
录
1
课程设计目的与要求1
2
问题描述2
3总体设计3
3.1
功能分析3
3.2
系统使用的主要函数3
3.3
系统使用的主要数据结构4
4
详细设计5
4.1
程序总体结构图5
4.2
程序流程图7
5
功能测试10
5.1
系统主界面10
5.2
系统输入信息的界面11
5.3
系统信息查询的界面12
5.4
系统信息按作者名查询的界面13
5.5
系统信息按作者名排序14
6
程序设计调试情况分析15
7
课程设计小结16
参考文献17
附录
系统源程序18
8
图书信息管理系统
1
课程设计目的与要求
图书信息存放在文件中,提供文件的输入、输出等操作;要实现浏览功能;查询和排序功能要求实现查找操作(至少两种依据);还应该提供图书信息删除和修改的功能;另外还应该提供键盘式选择菜单以实现功能选择。
图书管理系统,其中包括:
图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。
功能包括:
1)
系统以菜单方式工作;
2)
图书信息录入功能(图书信息用文件保存);
3)
图书信息浏览功能;
4)
查询和排序功能;
5)图书信息的删除与修改功能
2
问题描述
1.设计一个图书管理系统,其中包括:
图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。
功能包括:
1)
系统以菜单方式工作;
2)
图书信息录入功能(图书信息用文件保存);
3)
图书信息浏览功能;
4)
查询和排序功能;
5)图书信息的删除与修改功能
2.需求分析:
图书信息存放在文件中,提供文件的输入、输出等操作;要实现浏览功能;查询和排序功能要求实现查找操作(至少两种依据);还应该提供图书信息删除和修改的功能;另外还应该提供键盘式选择菜单以实现功能选择。
显示模块
通过设计一个模块,来实现图书信息的显示,以便于浏览图书的信息。
查询模块
通过设计一个模块,这个模块可以按图书的书名、作者来查询图书所有的信息,以便查询者阅读。
删除模块
通过设计一个模块,当输入一个图书的登入号或者书名的时候,可以通过这个模块,将输入登入号或者书名的书籍的所有信息从数据库中删除出去。以后,这本图书的信息不再出现在数据库中。
修改模块
通过设计一个模块,当某本图书的信息发生变化的时候,可以通过修改模块来进行修改。修改模块时一具有多级子菜单的模块。
排序模块
通过设计一个模块,来实现数据库的信息按某项成员名的升序或者降序排列,这个模块提供了按书名,作者名,分类号三种方式来实现排序。
3总体设计
3.1
功能分析
(系统提供主界面,各种功能操作以独立的函数为基础,运用对链表操作的技术来实现通讯录的管理,同时对操作结果在计算机中做永久保存。)
整个系统可以分为信息录入、信息浏览、信息查询、信息排序、信息删除和信息修改的功能。系统提供主界面,各种功能操作以独立的函数为基础,运用对链表操作的技术来实现图书信息的管理,同时对操作结果在计算机中做永久保存。
3.2
系统使用的主要函数
void
menu();
int
bookluru(struct
book*p,int
n);
(录入图书信息)
void
bookliulan(struct
book*p,int
n);
(图书信息浏览)
void
bookchaxun(struct
book*p,int
n);(图书信息查询)
void
bookxiugai(struct
book*p,int
n);
(图书信息修改)
int
bookzengjia(struct
book*p,int
n);
(图书信息增加)
int
bookshanchu(struct
book*p,int
n);
(图书信息删除)
void
bookpaixu(struct
book*p,int
n);
(图书信息排序)
void
DLsearch(struct
book*p,int
n);
(按登入号查询)
void
AUsearch(struct
book*p,int
n);
(按作者名查询)
int
bookzairu(struct
book*p,int
n);
(图书信息文件储存
)
void
goout();
(退出程序)
int
bookbaocun(struct
book*p,int
n);
(图书信息保存)
void
main()
3.3
系统使用的主要数据结构
struct
book
//定义一个book类结构体。
{
char
no[L];
char
name[L];
char
author[L];
char
fenlei[L];
char
puttime[L];
char
putfrom[L];
char
price[L];
};
4
详细设计
4.1
程序总体结构图
N
Y
图4.1
程序总体结构图
0
1
2
3
4
5
6
7
图4.2
程序层次图
4.2
程序流程图
图4.3信息登入功能流程图
图4.4
查询功能流程图
图4.5
修改功能流程图
5
功能测试
5.1
系统主界面
图5.1
系统主界面
5.2
系统输入信息的界面
图
5.2
输入信息界面
5.3
系统信息查询的界面
图5.3信息查询界面
5.4
系统信息按作者名查询的界面
图5.4
按作者名查询
5.5
系统信息按作者名排序
图5.5
信息排序界面
6
程序设计调试情况分析
1)问题:在信息查询完成后,无法跳出该界面,无法回到主界面。
图6.1
查询后无法回到主界面
解决方法:在信息查询那个版块的程序中,把原先用scanf输入字符改成gets(no),排除由于回车键出现的问题。
2)问题:“登录号书名作者。。。”之间无空格号
解决方法:改为printf(“\n
%9s%9s%9s%9s%9s%9s%9s\n“,“登录号“,“书名“,“作者名“,“分类号“,“出版单位“,“出版时间“,“价格“);
拉宽长度。
7
课程设计小结
通过一周的课程设计,第一次我们试着用所学的C语言知识去编制生活中常用的程序。我们是小组选择编辑图书信息管理系统程序。由于分工合作,我负责的是查询和排除模块。起初对知识掌握的不够全面,在整个设计过程中遇到很多问题。比如,编译出现错误,对于格式的掌握还不够透彻;在分界面运行完后,回不到系统的主界面,出现了死循环;在删除信息的板块中,删除了要保留的;运行时,屏幕显示的字之间无空格。后来,通过小组互相帮组讨论,查阅书籍,改善了程序。首先把原程序中的运用scanf()输入字符,改为getchar(),排除了接受回车键所出现的问题,能够顺利的返回主界面。其次,printf()中字符串控制的长度拉宽。最后还是能如期的完成此次实训。
当然,由于初次接触图书管理系统的设计,程序还是存在缺陷。比如操作起来不够简便、连贯,同时也没考虑到实际问题。如图书的价格要取大于等于零的数等。
总之,此次的课程设计还是对我们的专业很有帮助。既巩固了我们的C语言知识,让我们对一部分函数的功能有了更加深刻的理解,把所学运用到实际,也使我们在系统设计领域有了新的拓展,开发我们的思维。
参考文献
[1]
吉顺如.
《C程序设计教程与实验》.
北京
:清华大学出版社.
2011.
48-103
附录
系统源程序
#include
//头文件
#include
#include
#define
L
30
//宏定义
#define
Q
200
struct
book
//定义一个book类结构体。
{
char
no[L];
char
name[L];
char
author[L];
char
fenlei[L];
char
puttime[L];
char
putfrom[L];
char
price[L];
};
//函数声明
//函数声明
void
menu();
int
bookluru(struct
book*p,int
n);
void
bookliulan(struct
book*p,int
n);
void
bookchaxun(struct
book*p,int
n);
void
bookxiugai(struct
book*p,int
n);
int
bookzhengjia(struct
book*p,int
n);
int
bookshanchu(struct
book*p,int
n);
void
bookpaixu(struct
book*p,int
n);
void
DLsearch(struct
book*p,int
n);
void
AUsearch(struct
book*p,int
n);
int
bookzairu(struct
book*p,int
n);
void
goout();
int
bookbaocun(struct
book*p,int
n);
void
main()
//主函数
{
char
slect,yn;
struct
book
record[Q];
//定义book类结构体变量存放图书信息共200条
int
total=0,flag;
total=bookzairu(record,Q);
//从文件读取图书信息,不超过200条
do
{
menu();
//显示菜单
printf(“请服务项编号:“);
slect=getchar();
getchar();
switch(slect)
{
case
0
:
goout();break;
case
1
:
total=bookluru(record,total);break;
//函数调用
case
2
:
bookliulan(record,total);break;
case
3
:
bookchaxun(record,total);break;
case
4
:
bookxiugai(record,total);break;
case
5
:
total=bookzhengjia(record,total);break;
case
6
:
total=bookshanchu(record,total);break;
case
7
:
bookpaixu(record,total);break;
case
8
:
flag=bookbaocun(record,total);
if(“flag==1“)
printf(“图书信息保存成功!\n“);
else
printf(“图书信息保存失败!\n“);
break;
default:continue;
}
if(slect==
0
)
break;
printf(“\n还要继续选择吗?(Y/N)“);
//提示是否结束
do
{
yn=getchar();
getchar();
if
(yn==
Y
||yn==
y
)
break;
else
if
(yn==
N
||yn==
n
)
break;
else
printf(“非法选项!\n还要继续选择吗?(Y/N)“);
}
while(1);
}
while(yn!=
N
}
//图书管理系统主菜单.
void
menu()
{
system(“cls“);
printf(“\n\n“);
printf(“请选择服务项目编号(0--8)\n“);
printf(“******************************************************************\n“);
printf(“********************欢迎使用图书信息管理系统******************\n“);
printf(“**************************************************************\n“);
printf(“
\n“);
printf(“
\n“);
printf(“
\n“);
printf(“
1
.
图书信息录入.
\n“);
printf(“
2
.
图书信息浏览.
\n“);
printf(“
3
.
图书信息查寻.
\n“);
printf(“
4
.
图书信息修改.
\n“);
printf(“
5
.
图书信息增加.
\n“);
printf(“
6
.
图书信息删除.
\n“);
printf(“
7
.
图书信息排序.
\n“);
printf(“
8
.
图书信息保存.
\n“);
printf(“
0
.
退出图书管理系统.
\n“);
printf(“
\n“);
printf(“
\n“);
printf(“
\n“);
printf(“******************************************************************\n“;
printf(“\n“);
}
int
bookluru(struct
bookp,int
n)//录入图书信息.
{
int
i=0;
int
m;
printf(“\n添加前的图书信息记录共有%d个:\n“,n);
//显示原有的图书信息
printf(“\n
%9s%9s%9s%9s%9s%9s%9s\n“,“登录号“,“书名“,“作者名“,“分类号“,“出版单位“,“出版时间“,“价格“);
i=0;
while((ino,““)!=0))
//输入的登录号不为空时,输出图书信息
{
printf(“%9s%9s%9s%9s%9s%9s%9s\n“,p->no,p->name,p->author,p->fenlei,p->puttime,p->putfrom,p->price);//信息输出
i++;
p++;
}
printf(“\n请输入要录入的图书数目X(0no);
//输入登录号,再输入其他信息
}
while(strcmp(p->no,““)==0);
printf(“书名为:“);
gets(p->name);
printf(“作者名为:“);
gets(p->author);
printf(“分类号为:“);
gets(p->fenlei);
printf(“出版时间为:“);
gets(p->puttime);
printf(“出版单位为:“);
gets(p->putfrom);
printf(“价格为:“);
gets(p->price);
p++;
i++;
}
return
m+n;
}
void
bookliulan(struct
book*p,int
n)//图书信息浏览.
{
int
i=0;
printf(“\n
%9s%9s%9s%9s%9s%9s%9s\n“,“登录号“,“书名“,“作者名“,“分类号“,“出版单位“,“出版时间“,“价格“);
while(ino,p->name,p->author,p->fenlei,p->puttime,p->putfrom,p->price);
p++;
i++;
}
}
void
bookchaxun(struct
book*p,int
n)//图书信息查寻.
{
char
c;
bookliulan(p,n);
do
{
printf(“\n请问按登录号查询(D),还是按作者名查询(A)?“);
//选择查询方式
c=getchar();
getchar();
if(c==
D
||c==
d
)
{
DLsearch(p,n);
break;
}
else
if(c==
A
||c==
a
)
{
AUsearch(p,n);
break;
}
else
{
printf(“\n输入的为非法字符!\n“);
continue;
}
}
while(c!=
D
||c!=
d
||c!=
A
||c!=
a
);
}
void
DLsearch(struct
book*p,int
n)//按登录号查询.
{
int
i,x=0;
char
DL[L];
printf(“\n请输入要查询图书的登录号:“);
gets(DL);
for(i=0;ino)!=0)
continue;
//输入的登录号不匹配,结束本次循环
else
{
printf(“\n请输入正确的图书登录号:“);
gets(p->no);
printf(“\n请输入正确的图书书名:“);
gets(p->name);
printf(“\n请输入正确的图书作者名:“);
gets(p->author);
printf(“\n请输入正确的图书分类号:“);
gets(p->fenlei);
printf(“\n请输入正确的图书出版时间:“);
gets(p->puttime);
printf(“\n请输入正确的图书出版单位:“);
gets(p->putfrom);
printf(“\n请输入正确的图书价格:“);
gets(p->price);
printf(“\n修改图书图书信息完成!!“);
k=1;
}
}
if(k==0)
printf(“\n对不起,图书系统中没有包含此书的信息!\n“);
}
int
bookzhengjia(struct
bookp,int
n)//图书信息增加.
{
int
i=0;
char
c;
struct
book
t,*q;
printf(“\n添加前图书信息的记录为:\n“);
bookliulan(p,n);//显示添加前图书信息的记录
do
{
printf(“请输入新图书信息的登录号:“);
gets(t.no);
printf(“\n请输入新图书信息的书名为:“);
gets(t.name);
printf(“\n请输入新图书信息的作者名为:“);
gets(t.author);
printf(“\n请输入新图书信息的分类号为:“);
gets(t.fenlei);
printf(“\n请输入新图书信息的出版时间为:“);
gets(t.puttime);
printf(“\n请输入新图书信息的出版单位为:“);
gets(t.putfrom);
printf(“\n请输入新图书信息的价格为:“);
gets(t.price);
for(i=0;ino)==0||strcmp(t.author,(p+i)->author)==0||strcmp(t.fenlei,(p+i)->fenlei)==0)
{
printf(“登录号、作者名和分类号重复,要重新输入吗(Y/N)?“);
c=getchar();
putchar(
\n
);
break;
}
if(i==n)
{(p+i)=t;
printf(“\n添加后图书的信息记录为:\n“);
//显示添加后图书的信息记录
printf(“\n
%9s%9s%9s%9s%9s%9s%9s\n“,“登录号“,“书名“,“作者名“,“分类号“,“出版单位“,“出版时间“,“价格“);
for(i=0;ino,(p+i)->name,(p+i)->author,(p+i)->fenlei,(p+i)->putfrom,(p+i)->puttime,p[i].price);
printf(“\n请输入要删除图书的登陆号:“);
gets(no);
for(x=0;xno,(p+i)->name,(p+i)->author,(p+i)->fenlei,(p+i)->putfrom,(p+i)->puttime,p[i].price);
printf(“\n按登录号排序(D),还是按作者名排序(A)?“);
//选择排序的方式
c1=getchar();
getchar();
if(c1==
d
||c1==
D
)
//选择登录号由小到大排序
{
for(i=0;i0)
//使用选择法进行排序
k=j;
if(k!=i)
//如果最小熟不熟默认的p[i],再交换,
{
temp=p[k];
p[k]=p[i];
p[i]=temp;
}
}
printf(“\n排序后图书的信息记录为:\n“);
//输出排序后图书的信息
printf(“\n
%9s%9s%9s%9s%9s%9s%9s\n“,“登录号“,“书名“,“作者名“,“分类号“,“出版单位“,“出版时间“,“价格“);
for(i=0;ino,(p+i)->name,(p+i)->author,(p+i)->fenlei,(p+i)->putfrom,(p+i)->puttime,p[i].price);
}
else
if(c1==
a
||c1==
A
)
//选择作者名由小到大排序
{
for(i=0;i0)
k=j;
if(k!=i)
//使用选择法进行排序
{
temp=p[k];
p[k]=p[i];
p[i]=temp;
}
}
printf(“\n排序后图书的信息记录为:\n“);
printf(“\n
%9s%9s%9s%9s%9s%9s%9s\n“,“登录号“,“书名“,“作者名“,“分类号“,“出版单位“,“出版时间“,“价格“);
//输出排序后图书的信息
for(i=0;ino,(p+i)->name,(p+i)->author,(p+i)->fenlei,(p+i)->putfrom,(p+i)->puttime,p[i].price);
}
else
printf(“\n您输入的为非法字符!\n“);
}
//图书信息文件存储.
int
bookzairu(struct
book*p,int
n)
{
FILEfp;
//定义FILE类型文件指针变量
int
i,all=0;
char
bookfile[200]=“book.txt“;
fp=fopen(“book.txt“,“r+“);
//以只读方式打开
if(fp==NULL)
{
printf(“\n***打开%s失败!!***“,bookfile);
return
0;
}
fscanf(fp,“%d\n“,//从文件指针指向的文本文件中按指定格式逐个输入信息到指定变量
if(all>200)
//读取记录总数
{
printf(“文件记录太多,不能读取!“);
return
0;
}
for(i=0;i
//图书信息按指定格式输入
{fscanf(fp,“%s
%s
%s
%s
%s
%s
%s\n“,p[i].no,p[i].name,p[i].author,p[i].fenlei,p[i].putfrom,p[i].puttime,p[i].price);
}
fclose(fp);
//关闭文件
return
all;
}
//图书信息文件保存.
int
bookbaocun(struct
book*p,int
n)
{
FILEfp;
//定义FILE类型文件指针变量
int
i,all=0;
char
bookfile[30]=“book.txt“;
fp=fopen(bookfile,“w“);
//以只写方式打开
if(fp==NULL)
//
{
printf(“\n***打开%s失败!!***“,bookfile);
return
0;
}
fprintf(fp,“%d\n“,n);
//将数据指定格式字符串输出到文件指针所指向的文本文件。
for(i=0;i //图书信息按指定格式输出 { fprintf(fp,“%s %s %s %s %s %s %s\n“,p[i].no,p[i].name,p[i].author,p[i].fenlei,p[i].putfrom,p[i].puttime,p[i].price); } fclose(fp); //关闭文件 return 1; } //图书管理系统退出 void goout() { printf(“\n请按Enter键退出图书信息管理系统!\n“);
