(1)博客介绍
本文中的图书管理系统代码来自CSDN的一位博主(https://blog.csdn.net/weixin_44019157/article/details/87293687)该图书管理系统使用C语言进行变成,主要实现了删除、查询、借书、还书、添加等功能。通过对原作者代码的阅读,我觉得这个系统还有可以改进的地方,因此在此发表一些我的想法。
(2)图书管理系统代码
功能模块图如下:

源代码如下:
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<conio.h>
#define M 100
struct books
{
char BookName[12];
int BookNumber;
float Price;
char Writter[12];
char ExistentialState[12];
char Name[12];
char Sex[12];
int SchoolNember;
}s[M];
int N;
int main ()
{
int sele;
sele=1;
void Input();
void Query();
int Delete();
void Borrow();
void Return();
void Finish();
while (1)
{
system("cls");
printf("\n\n");
printf("***********************************************| 1.图书入库 |***********************************************\n\n");
printf("***********************************************| 2.图书查询 |***********************************************\n\n");
printf("***********************************************| 3.删除图书 |***********************************************\n\n");
printf("***********************************************| 4.图书借阅 |***********************************************\n\n");
printf("***********************************************| 5.图书归还 |***********************************************\n\n");
printf("***********************************************| 0.退出软件 |***********************************************\n\n");
label_1:printf("\n\n请输入功能序号:");
scanf ("%d",&sele);
if(sele>=0 && sele<=5)
switch(sele)
{
case 1:Input();break;
case 2:Query();break;
case 3:Delete();break;
case 4:Borrow();break;
case 5:Return();break;
case 0:Finish();break;
}
else
{
printf("输入错误请再次输入|\n\n");
goto label_1;
}
}
}
/*********输入*********/
void Input()
{
int n,i,m;
N=0;
system("cls");
printf("可输入的书本数:");
scanf("%d",&n);
N += n; m = n;
printf("请输入相关信息:\n");
for(i=0;i<n;i++)
{
system("cls");
printf("还有%d本书待录入\n", m); m--;
printf("图书名称:");
scanf("%s",s[N-n+i].BookName);
printf("图书编号:");
scanf("%d",&s[N-n+i].BookNumber);
printf("单价:");
scanf("%f",&s[N-n+i].Price);
printf("作者:");
scanf("%s",&s[N-n+i].Writter);
strcpy(s[N-n+i].ExistentialState,"未借出");
strcpy(s[N-n+i].Name,"无");
}
printf("已成功入库%d本图书~~~,3秒后自动返回主菜单",n);
Sleep(3000);
}
/********查询**********/
void Query()
{
int i,j[100]={-1},d,k,t=0;
char m[20];
label_2:system("cls");
printf("查询:");
printf("1:图书名称 2:图书编号");
printf("\n\n请输入查询选项:");
scanf("%d",&k);
if(k==1)
{
system("cls");
printf("请输入图书名称:");
scanf("%s",m);
for(i=0;i<N;i++)
if(strcmp(m,s[i].BookName)==0)
{
j[t]=i;
t=t+1;
}
}
else if(k==2)
{
system("cls");
printf("请输入图书编号:");
scanf("%d",&d);
for(i=0;i<N;i++)
if(d==s[i].BookNumber)
{
j[t]=i;
t++;
}
}
if (j[0] == -1 && t == 0)
{
system("cls");
printf("书库暂时没有这本书哦~^_^\n\n继续查询吗?【按1继续/按其他键回主菜单】");
scanf("%d", &k);
if (k == 1)
goto label_2;
}
if(j[0]!=-1 && t!=0)
{
system("cls");
printf("\t图书名称 \t图书编号 \t单价 \t作者 \t存在状态 \t借书人姓名 \t性别 \t学号\n");
for(i=0;i<t;i++)
printf("\t%s \t%d \t%.3f\t%s \t%s \t%s \t%s \t%d ",s[j[i]].BookName,s[j[i]].BookNumber,s[j[i]].Price,s[j[i]].Writter,s[j[i]].ExistentialState,s[j[i]].Name,s[j[i]].Sex,s[j[i]].SchoolNember);
printf("\n\n继续查询吗?【按1继续/按其他键回主菜单】");
scanf("%d", &k);
if (k == 1)
goto label_2;
}
}
/********删除模块*********/
int Delete()
{
int i,d,k,t=0;
char ms[20];
int ja=-1;
label_1:system("cls");
printf("查询:");
printf("1:图书名称 2:图书编号");
printf("\n\n请输入查询选项:");
scanf("%d",&k);
if(k==1)
{
system("cls");
printf("请输入图书名称:");
scanf("%s",ms);
for(i=0;i<N;i++)
if(strcmp(ms,s[i].BookName)==0)
{
ja=i;
break;
}
}
else if(k==2)
{
system("cls");
printf("请输入图书编号:");
scanf("%d",&d);
for(i=0;i<N;i++)
if(d==s[i].BookNumber)
{
ja=i;
break;
}
}
printf("确定删除该图书吗?\n********1表示Yes,其他No*********");
int p;
scanf("%d",&p);
if (p == 1)
{
printf("删除中...");
Sleep(300);
}
if (p != 1)
return 0;
if(ja!=-1 && p==1)
{
N=N-1;
for(i=ja;i<N;i++)
{
strcpy(s[i].BookName,s[i+1].BookName);
s[i].BookNumber=s[i+1].BookNumber;
s[i].Price=s[i+1].Price;
strcpy(s[i].Writter,s[i+1].Writter);
strcpy(s[i].ExistentialState,s[i+1].ExistentialState);
strcpy(s[i].Name,s[i+1].Name);
strcpy(s[i].Sex,s[i+1].Sex);
s[i].SchoolNember=s[i+1].SchoolNember;
}
printf("删除成功\n");
printf("\n\n继续删除吗?【按1继续/按其他键回主菜单】");
scanf("%d", &k);
if (k == 1)
goto label_1;
}
else if (ja == -1)
{
printf("书库暂时没有这本书哦~^_^\n");
printf("\n\n继续删除吗?【按1继续/按其他键回主菜单】");
scanf("%d", &k);
if (k == 1)
goto label_1;
}
}
/**********借书模块***********/
void Borrow()
{
int i,j[100]={-1},d,k,t=0;
char m[20];
label_1:system("cls");
printf("查询:");
printf("1:图书名称 2:图书编号");
printf("\n\n请输入查询选项:");
scanf("%d",&k);
if(k==1)
{
system("cls");
printf("请输入图书名称:");
scanf("%s",&m);
for(i=0;i<N;i++)
if(strcmp(m,s[i].BookName)==0)
{
j[t]=i;
t=t+1;
}
}
else if(k==2)
{
system("cls");
printf("请输入图书编号:");
scanf("%d",&d);
for(i=0;i<N;i++)
if(d==s[i].BookNumber)
{
j[t]=i;
t++;
}
}
if (j[0] == -1 && t == 0)
{
printf("没有找到这本书喔~~\n");
printf("\n\n继续借书吗?【按1继续/按其他键回主菜单】");
scanf("%d", &k);
if (k == 1)
goto label_1;
}
if(j[0]!=-1&&t!=0&&s[j[i]].ExistentialState==" 未借出")
{
system("cls");
printf("\t图书名称 \t图书编号 \t单价 \t作者 \t存在状态 \t借书人姓名 \t性别 \t学号\n");
printf("\t%s \t%d \t%.3f\t%s \t%s \t%s \t%s \t%d ", s[j[i]].BookName, s[j[i]].BookNumber, s[j[i]].Price, s[j[i]].Writter, s[j[i]].ExistentialState, s[j[i]].Name, s[j[i]].Sex, s[j[i]].SchoolNember);
}
printf("\n\n****************\n****************1:确定借阅 2:退出\n****************\n");
scanf("%d",&k);
switch(k)
{
case 1:system("cls");
printf("请输入学号:\n");
scanf("%d",&s[j[i]].SchoolNember);
printf("请输入姓名:\n");
scanf("%s",&s[j[i]].Name);
printf("请输入性别:\n");
scanf("%s",&s[j[i]].Sex);
strcpy(s[j[i]].ExistentialState,"已借出");
printf("借阅成功"); printf("\n\n继续借书吗?【按1继续/按其他键回主菜单】");
scanf("%d", &k);
if (k == 1)
goto label_1;
break;
case 2:system("cls"); break;
}
}
/*************还书模块***************/
void Return()
{
int i,j[100]={-1},d,k,t=0;
char m[20];
label_1:system("cls");
printf("查询:");
printf("1:图书名称 2:图书编号");
printf("\n\n请输入查询选项:");
scanf("%d",&k);
if(k==1)
{
system("cls");
printf("请输入图书名称:");
scanf("%s",&m);
for(i=0;i<N;i++)
if(strcmp(m,s[i].BookName)==0)
{
j[t]=i;
t++;
break;
}
}
else if(k==2)
{
system("cls");
printf("请输入图书编号:");
scanf("%d",&d);
for(i=0;i<N;i++)
if(d==s[i].BookNumber)
{
j[t]=i;
t++;
break;
}
}
if (t == 0)
{
printf("没有找到这本书喔~~\n");
printf("\n\n继续还书吗?【按1继续/按其他键回主菜单】");
scanf("%d", &k);
if (k == 1)
goto label_1;
}
else
{
system("cls");
printf("\t图书名称 \t图书编号 \t单价 \t作者 \t存在状态 \t借书人姓名 \t性别 \t学号\n");
printf("\t%s \t%d \t%.3f\t%s \t%s \t%s \t%s \t%d ", s[j[i]].BookName, s[j[i]].BookNumber, s[j[i]].Price, s[j[i]].Writter, s[j[i]].ExistentialState, s[j[i]].Name, s[j[i]].Sex, s[j[i]].SchoolNember);
printf("\n\n****************\n****************1:确定归还 2:退出\n****************\n");
int p;
scanf("%d",&p);
if(p==1)
{
system("cls");
strcpy(s[j[i]].ExistentialState,"未借出");
strcpy(s[j[i]].Name,"无");
s[j[i]].SchoolNember=0;
printf("已归还\n");
printf("\n\n继续还书吗?【按1继续/按其他键回主菜单】");
scanf("%d", &k);
if (k == 1)
goto label_1;
}
}
}
/*************结束模块***************/
void Finish()
{
exit(0);
}
运行结果如下:



该管理系统设计了Input、Query、Delete、Borrow、Return、Finish等功能模块,用switch选择,然后进入不同模块,进行不同的选择,实现不同的功能。同时为每本书的图书信息建立一个结构体,包含书本名字、书本编号、书本价格、作者、价格等信息,提供查询功能,还有删除功能以及借书还书功能。总的来说,这是一个比较完整的图书管理系统,平时使用的功能基本上都已经实现了,但是这些图书的信息都是临时储存在缓冲区当中的,下一次重新打开的时候,无法得到之前所储存的图书信息,实际上没有可实用性,因此我想对此系统进行改进,将图书信息储存在文件中,这样就可以读取上次输入的图书信息。
(3)改进方案
void save()
{
FILE *fp; //文件指针
int i;
fp=fopen("in.txt","a");
for(i=0;i<n;i++)
{
fprintf(fp,"%s %d %f %s %s %s %s %s\n",BookName[i],BookNumber[i],Price[i],
Writter[i],ExistentialState[i],Name[i],Sex[i],SchoolNember);
}
fclose(fp);
printf("已完成保存!");
system("pause");
}
void refresh()
{
FILE *fp;
int i,a;在在
scanf("%d",&a);
fp=fopen("in.txt","r");
for(i=0;i<a;i++)
{
fscanf(fp,"%s %d %f %s %s %s %s %s\n",BookName[i],BookNumber[i],Price[i],
Writter[i],ExistentialState[i],Name[i],Sex[i],SchoolNember);
}
fclose(fp);
system("pause");
}
通过文件存取的操作,可以实现将图书信息储存在文件中,图书信息出现变更时,也可以及时更新文件中的信息,这样一来就极大地提高了系统的实用性。
(4)小结
通过这次对图书管理系统的总结和改进,我发现当我们做完一个项目后,再回头仔细研究时会发现一些我们疏忽的地方,从而再对系统进行改进,可以将系统做得更加完整。在以后的编程中,我们需要不断的改进,才能写出好的程序。
浙公网安备 33010602011771号