图书管理系统
本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和单链表的各种基本操作。本程序中涉及结构体、文件等方面的知识。通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握利用文件存储结构实现对图书管理的原理,为进一步开发出高质量的管理信息系统打下坚实的基础。
1自定义问题
图1.0
创建一个图书管理系统。假设图书管理系统中仅仅包含图书的书名和编号和作者等信息。程序的运行效果如图1.0所示,选择任意菜单后,实现相应功能
2系统设计
2.1总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述
2.2 详细设计
2.2.1数据结构设计
- 图书信息结构体
- struct describe
- {
- char book_name [10]; //书名
- int num ;//编号
- char author [10]; }book[N]//作者
2.2.2主控main()函数执行流程
图2.2 主控函数执行流程图
2.2.3 初始化图书模块:choice1()//初 始 化 图 书函数。 对图书进行输入和保存,
choice1()//初 始 化 图 书函数
{
int i,j,temp;//
printf("--------------初 始 化 图 书 信 息---------------n");
printf("初始化图书的本书: ");
scanf("%d",&temp);
printf("--------书名 编号 作者 n");
for(i=0;i<temp;i++)
{
printf("第%d本书:",i+1);
scanf("%s%d%s",book[i].book_name,&book[i].num,book[i].author);
for(j=0;j<i;j++)
{
again:
if((strcmp(book[i].book_name,book[j].book_name))==0||book[i].num==book[j].num)
{
printf("初始化失败!------你输入的数据违背了主键的唯一性!n");
printf(" 书名 编号 作者 n");
printf("第%d本书:",i+1);
scanf("%s%d%s",book[i].book_name,&book[i].num,book[i].author);//重新输入书本信息
goto again;
}
}
}
FILE* fp;
if((fp=fopen("book.txt","wb"))==NULL)
{
printf("cannot open filen");
return;
}
for(i=0;i<temp;i++)
{
if(fwrite(&book[i],sizeof(struct describe ),1,fp)!=1)
printf("file write errorn");
}
fclose (fp);
}
该函数对图书进行初始化录入保存,首先调用程序,首先输入要录入的图书的本书,如图
先输入要初始化的本数为1;接下来输入书的名字;编号;作者如图
输入完后,函数将结果保存到book.txt文件中.
2.2.4 /增 加 图 书模块,对图书馆购进新书时要对新书进行录入保存在图书管理系统。
choice2()//增 加 图 书函数
{
int i,m=0,y=1;
FILE *fp ;
printf("----------------增 加 图 书 信 息----------------n");
if((fp=fopen("book.txt","rb"))==NULL)
{
printf("cannot open filen");
exit(0) ;
}
while((fread(&book[m],sizeof(struct describe ),1,fp))!=0)
m++ ;
fclose(fp);
while(y)
{
again:
printf("书名 编号 作者n");
scanf("%s%d%s",book[m].book_name,&book[m].num,book[m].author);
for(i=0;i<m;i++)
{
if((strcmp(book[i].book_name,book[m].book_name))==0||book[i].num==book[m].num)
{printf("添加图书失败!----你输入的数据违背了主键的唯一性!n");
goto again;}
}
printf("是否继续(1继续or 0结束):");
getchar();
scanf("%d",&y);
m++;
}
if((fp=fopen("book.txt","wb"))==NULL)
{
printf("cannot open filen");
exit(0) ;
}
for(i=0;i<m;i++)
{
if(fwrite(&book[i],sizeof(struct describe ),1,fp)!=1)//保存函数
printf("file write errorn");
}
fclose (fp);
}
该模块主要对图书馆新购买回来的书籍进行录入保存,输入数字2进入choice2()函数,依次输入书本的名字,编号,作者。函数要求输入1和0,以判断是否继续输入图书信息;如图
如果继续输入就输入1或者结束就输入0。
2.2.5修改图书模块:该模块对输入有错误的图书的信息进行修改。在主菜单中输入数字3,进入choice2()函数,
choice3()//修 改 图 书函数
{
printf("----------------修 改 图 书 信 息----------------n");
FILE *fp ;
int temp ;
again:
printf("输入你要修改的图书的编号:");
scanf("%d",&temp);
struct describe update ;//再定义一个struct describe的结构体
int i=0,k=0,j;
if((fp=fopen("book.txt","rb+"))==NULL)
{
printf("cannot open filen");
exit(0);
}
int n=10000;
while((fread(&book[k],sizeof(struct describe),1,fp))!=0)
{
if(book[k].num==temp)
n=k;
k++;
}
fclose(fp);
if(n==10000)
{
printf("你要-修改的-图书-不存在!n");
getchar();
goto again ;
}
printf("书名 编号 作者n");
scanf("%s%d%s",update.book_name,&update.num,update.author);
for(j=0;j<k;j++)
{
if(j==n) continue ;
else
if((strcmp(book[j].book_name,update.book_name))==0||book[j].num==update.num)
{
printf("修改图书信息失败!您输入的数据违背了主键的唯一性!n");
goto again ;
}
}
if((fp=fopen("book.txt","rb+"))==NULL)
{
printf("cannot open filen");
exit(0);
}
while((fread(&book[i],sizeof(struct describe),1,fp))!=0)
{
if(book[i].num==temp)
{
fseek(fp,-sizeof(struct describe),1);//把文件fp向前后推sizeof(struct describe)字节
fwrite(&update,sizeof(struct describe ),1,fp);
fclose(fp);
}
i++;