本程序是用C语言编写,实现图书管理,包括7个功能模块,分别是新书入库,查询,删除,借书,归还,显示等
不多说了,直接上代码,此为个人原创,代码一个一个敲出来的,如有疑问之处欢迎提问
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include<conio.h>
typedef struct bookinfo
{
char number[15];/*产品编号*/
char name[30];/*产品名称*/
float price;/*单价*/
char auther[20];/*作者*/
int mark;/*存在状态*/
char lendername[20];/*借书人姓名*/
char lendersex[8];/*借书人性别*/
char lendernum[12];/*借书人学号*/
}BOOKINFO;
void menu()
{
printf("\n\n\n\n\n\n");
printf("\t\t\t图书管理系统\n\n");
printf("\t\t\t1:创建:新进图书基本信息的输入\n\n");
printf("\t\t\t2:显示:显示全部记录\n\n");
printf("\t\t\t3:查询:根据图书名称查询图书基本信息\n\n");
printf("\t\t\t4:删除:根据图书名称对撤销的图书信息进行删除\n\n");
printf("\t\t\t5:列出所有未借出去的图书信息\n\n");
printf("\t\t\t6:借书:根据图书名称借出图书\n\n");
printf("\t\t\t7:还书:根据书名还书\n\n");
printf("\t\t\t8:退出\n");
}
void choice_1_input_new()/*输入新进的图书信息*/
{
char choice;
FILE *p;
BOOKINFO newbook;
system("cls");
while(1)
{
printf("输入图书编号:");
gets(newbook.number);
printf("输入图书名称:");
gets(newbook.name);
printf("输入图书单价:");
scanf("%f",&newbook.price);
while(getchar()!='\n');
printf("输入图书的作者:");
gets(newbook.auther);
//借书人信息暂时为空
strcpy(newbook.lendername,"NULL");
strcpy(newbook.lendersex,"NULL");
strcpy(newbook.lendernum,"NULL");
printf("是否保存该条书目?(Y/N)\n");
choice=getch();
while(choice!='Y'&&choice!='y'&&choice!='N'&&choice!='n')
choice=getch();
if(choice=='Y'||choice=='y')
{
newbook.mark=1;/*将图书状态设置成1,表示没有借出*/
p=fopen("c:\\bookinfo.data","ab");
fwrite(&newbook,sizeof(BOOKINFO),1,p);
fclose(p);
printf("\n该条书目已添加到c:\\bookinfo.data文件中!\n");
}
else
{
printf("\n本条书目未保存!\n");
}
printf("\n是否继续添加书目?(Y/N)\n");
choice=getch();
while(choice!='Y'&&choice!='y'&&choice!='N'&&choice!='n')
choice=getch();
if(choice=='Y'||choice=='y')
continue;
else
break;
}
}
void choice_2_display_all()/*显示全部图书信息*/
{
FILE *p;
int n;
BOOKINFO bookinfo[100];
int booknumber=0;
system("cls");
p=fopen("c:\\bookinfo.data","rb");
while(!feof(p))
{
fread(&bookinfo[booknumber],sizeof(BOOKINFO),1,p);
booknumber++;
}
/*booknumber--;使用feof()函数会多读一行,因此需要booknumber自减一次,使书目的数量正确*/
fclose(p);
booknumber--;
if(booknumber==0)
{
printf("没有任何图书信息!\n\n");
}
else
{
n=0;
printf(" 图书信息如下\n");
printf(" 图书信息 | 借书人信息 \n");
printf("编号 名称 单价 作者 图书状态 | 姓名 性别 学号\n");
while(n<booknumber)
{
printf("%-6s%-12s%-8.1f%-8s%-9d| %-12s%-8s%-8s\n",
bookinfo[n].number,bookinfo[n].name,bookinfo[n].price,
bookinfo[n].auther,bookinfo[n].mark,bookinfo[n].lendername,
bookinfo[n].lendersex,bookinfo[n].lendernum);
n++;
}
}
printf("\n\n按任意键回到主菜单!\n");
getch();
}
void choice_3_search_according_name()/*根据图书名称显示图书的信息*/
{
char search[20]="";/*search用来存放要查询的书名*/
int n;
FILE *p;
char choice;
BOOKINFO bookinfo[100];
int booknumber=0;
system("cls");
p=fopen("c:\\bookinfo.data","rb");
while(!feof(p))
{
fread(&bookinfo[booknumber],sizeof(BOOKINFO),1,p);
booknumber++;
}
booknumber--;/*使用feof()函数会多读一行,因此需要booknumber自减一次,使书目的数量正确*/
fclose(p);
while(1)
{
printf("输入要查询的书本名称:");
gets(search);
if(booknumber==0)
{
printf("书库中没有任何信息!\n\n");
printf("按任意键回到主菜单!\n\n");
getch();
break;
}/*if结束*/
else
{
for(n=0;n<booknumber;n++)
if(strcmp(bookinfo[n].name,search)==0)//查询就需要比较
{
printf("该书的详细信息如下:\n");
printf(" 图书信息 | 借书人信息 \n");
printf("编号 名称 单价 作者 图书状态 | 姓名 性别 学号\n");
printf("%-6s%-12s%-8.1f%-8s%-9d| %-12s%-8s%-8s\n",
bookinfo[n].number,bookinfo[n].name,bookinfo[n].price,
bookinfo[n].auther,bookinfo[n].mark,bookinfo[n].lendername,
bookinfo[n].lendersex,bookinfo[n].lendernum);
break;
}
if(n>=booknumber)
printf("没有查找该书的任何信息!\n");
printf("\n\n是否继续查询?(Y/N)\n");
choice=getch();
while(choice!='Y'&&choice!='y'&&choice!='N'&&choice!='n')
choice=getch();
if(choice=='Y'||choice=='y')
continue;
else
break;
}/*else结束*/
}/*while(1)结束*/
}
void choice_4_delete_according_name()/*根据图书名称对图书信息进行删除*/
{
char search[20]="";/*search用来存放要删除的书名*/
int n,i;
FILE *p;
char choice;
BOOKINFO bookinfo[100];
int booknumber;
system("cls");
while(1)
{
printf("输入要删除的书本名称:");
gets(search);
p=fopen("c:\\bookinfo.data","rb");
booknumber=0;
while(!feof(p))
{
fread(&bookinfo[booknumber],sizeof(BOOKINFO),1,p);
booknumber++;
}
booknumber--;/*使用feof()函数会多读一行,因此需要booknumber自减一次,使书目的数量正确*/
fclose(p);
if(booknumber==0)
{
printf("书库中没有任何信息!\n\n");
printf("按任意键回到主菜单!\n\n");
getch();
break;
}/*if结束*/
else
{
for(n=0;n<booknumber;n++)
if(strcmp(bookinfo[n].name,search)==0)//这里的代码重复度非常高
{
break;
}
if(n>=booknumber)
printf("没有查找该书的任何信息!\n");
else
{
printf("是否确认需要删除该条书目?(Y/N)");
choice=getch();
while(choice!='Y'&&choice!='y'&&choice!='N'&&choice!='n')
choice=getch();
if(choice=='Y'||choice=='y')
{
for(i=n;i<booknumber-1;i++)
bookinfo[i]=bookinfo[i+1];
booknumber--;
p=fopen("c:\\bookinfo.data","wb");
for(n=0;n<booknumber;n++)
fwrite(&bookinfo[n],sizeof(BOOKINFO),1,p);
fclose(p);
printf("删除成功!\n");
}
else
printf("\n\n该条书目没有被删除!");
}
printf("\n\n是否继续进行删除操作?(Y/N)\n");
choice=getch();
while(choice!='Y'&&choice!='y'&&choice!='N'&&choice!='n')
choice=getch();
if(choice=='Y'||choice=='y')
continue;
else
break;
}/*else结束*/
}/*while(1)结束*/
}
void choice_5_display_according_exitflag()/*根据存在状态列出图书信息*/
{
FILE *p;
int n;
int count=0;
BOOKINFO bookinfo[100];
int booknumber;
system("cls");
booknumber=0;
p=fopen("c:\\bookinfo.data","rb");
while(!feof(p))
{
fread(&bookinfo[booknumber],sizeof(BOOKINFO),1,p);
booknumber++;
}
booknumber--;
fclose(p);
if(booknumber==0)
{
printf("书库中没有任何书目存在!\n");
}
else
{
for(n=0;n<booknumber;n++)
if(bookinfo[n].mark==1)
count++;
if(count==0)
printf("书库中的书籍全部借出!\n");
else
{
printf("书库中未被借出的图书信息如下:\n\n");
printf(" 图书信息 | 借书人信息 \n");
printf("编号 名称 单价 作者 图书状态 | 姓名 性别 学号\n");
for(n=0;n<booknumber;n++)
if(bookinfo[n].mark==1)
{
printf("%-6s%-12s%-8.1f%-8s%-9d| %-12s%-8s%-8s\n",
bookinfo[n].number,bookinfo[n].name,bookinfo[n].price,
bookinfo[n].auther,bookinfo[n].mark,bookinfo[n].lendername,
bookinfo[n].lendersex,bookinfo[n].lendernum);
}
}
}
printf("\n按任意键返回主菜单!\n");
getch();
}
void choice_6borrow_according_name()//根据图书名称借出图书
{
char name[20];
FILE *p;
BOOKINFO book[100];
int booknumber=0;
int n,i;
char choice;
system("cls");
if((p=fopen("c:\\bookinfo.data","rb"))==NULL)
{
printf("can not open");
return;
}
while(!feof(p))
{
fread(&book[booknumber],sizeof(BOOKINFO),1,p);
booknumber++;
}
booknumber--;
fclose(p);
while(1)
{
printf("请输入要借图书的名称:");
gets(name);
if(booknumber==0)
{
printf("\n库中无图书!\n");
printf("\n按任意键返回主菜单:\n");
getch();
break;
}
else
{
//比较查询,寻找出该书
for(n=0;n<booknumber;n++)
{
if(strcmp(book[n].name,name)==0)
{
if(book[n].mark==1)
{
printf("该书的详细信息如下:\n");
printf(" 图书信息 | 借书人信息 \n");
printf("编号 名称 单价 作者 图书状态 | 姓名 性别 学号\n");
printf("%-6s%-12s%-8.1f%-8s%-9d| %-12s%-8s%-8s\n",
book[n].number,book[n].name,book[n].price,
book[n].auther,book[n].mark,book[n].lendername,
book[n].lendersex,book[n].lendernum);
printf("\n\n请确认是否借出该书?(y/n)");
choice=getch();
while(choice!='Y'&&choice!='y'&&choice!='N'&&choice!='n')
choice=getch();
if(choice=='Y'||choice=='y')
{
book[n].mark=0;
//录入借书人信息
printf("\n请输入借书人姓名:");
gets(book[n].lendername);
printf("请输入借书人性别:");
gets(book[n].lendersex);
printf("请输入借书人学号:");
gets(book[n].lendernum);
p=fopen("c:\\bookinfo.data","wb");
for(i=0;i<booknumber;i++)
fwrite(&book[i],sizeof(BOOKINFO),1,p);
fclose(p);
printf("\n借阅成功!图书已借出\n");
break;//找到了就应该停止
}
else
break;
}
else
{
printf("\n抱歉,该书已被借出!\n");
break;
}
}
}
if(n>=booknumber)
{
printf("\n抱歉,库中没有该书本!\n");
}
printf("\n\n是否继续借阅其他图书?(y/n)\n");
choice=getch();
while(choice!='Y'&&choice!='y'&&choice!='N'&&choice!='n')
choice=getch();
if(choice=='Y'||choice=='y')
continue;
else
break;
}/*else结束*/
}/*whlie(1)结束*/
}
//还书
void choice_7return_book_name()
{
FILE *p;
char choice;
int booknumber=0,i,n;
BOOKINFO book[100];
char name[20];
system("cls");
if((p=fopen("c:\\bookinfo.data","rb"))==NULL)
{
printf("can not open");
return;
}
while(!feof(p))
{
fread(&book[booknumber],sizeof(BOOKINFO),1,p);
booknumber++;
}
booknumber--;
fclose(p);
while(1)
{
printf("请输入要归还的书的名称:");
gets(name);
if(booknumber==0)
{
printf("\n库中无图书!\n");
printf("\n按任意键返回主菜单:\n");
getch();
break;
}
else
{
for(n=0;n<booknumber;n++)
if(strcmp(book[n].name,name)==0)
{
if(book[n].mark==0)
{
printf("该书的详细信息如下:\n");
printf(" 图书信息 | 借书人信息 \n");
printf("编号 名称 单价 作者 图书状态 | 姓名 性别 学号\n");
printf("%-6s%-12s%-8.1f%-8s%-9d| %-12s%-8s%-8s\n",
book[n].number,book[n].name,book[n].price,
book[n].auther,book[n].mark,book[n].lendername,
book[n].lendersex,book[n].lendernum);
printf("\n\n请确认是否归还该书?(y/n)");
choice=getch();
while(choice!='Y'&&choice!='y'&&choice!='N'&&choice!='n')
choice=getch();
if(choice=='Y'||choice=='y')
{
book[n].mark=1;
//借书人信息置空
strcpy(book[n].lendername,"NULL");
strcpy(book[n].lendersex,"NULL");
strcpy(book[n].lendernum,"NULL");
p=fopen("c:\\bookinfo.data","wb");
for(i=0;i<booknumber;i++)
fwrite(&book[i],sizeof(BOOKINFO),1,p);
fclose(p);
printf("\n归还成功!图书已归还入库\n");
break;//找到了就应该停止
}
else
break;
}
}
if(n>=booknumber)
{
printf("\n抱歉,库中没有该书本!\n");
}
printf("\n\n是否继续归还其他图书?(y/n)\n");
choice=getch();
while(choice!='Y'&&choice!='y'&&choice!='N'&&choice!='n')
choice=getch();
if(choice=='Y'||choice=='y')
continue;
else
break;
}
}
}
void main()
{
char choice;
clock_t tm;
FILE *p;
if((p=fopen("c:\\bookinfo.data","rb"))==NULL)//使用二进制方式读写不会出太大问题,否则读写实数会报错
{
p=fopen("c:\\bookinfo.data","wb");
fclose(p);
}
while(1)
{
system("cls");
menu();
choice=getch();
switch(choice)
{
case '1':choice_1_input_new();break;/*输入新进的图书信息*/
case '2':choice_2_display_all();break;/*显示全部图书信息*/
case '3':choice_3_search_according_name();break;/*根据图书名称显示图书的信息*/
case '4':choice_4_delete_according_name();break;/*根据图书名称对图书信息进行删除*/
case '5':choice_5_display_according_exitflag();break;/*根据存在状态列出图书信息*/
case '6':choice_6borrow_according_name();break;//根据图书名称借书
case '7':choice_7return_book_name();break;
case '8':printf("\n\n\t\t\t谢谢使用,再见!\n\t\t\t按任意键退出!\n");getch();return;
default:
printf("\n\n\t\t\t请输入菜单中的数字!(1~8)");
tm=clock();
while(clock()<tm+1800);
break;
}
}
}