#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Book_type
{
int num; //图书编号
char name[20]; //图书名称
char publisher[20]; //图书出版社
char author[20]; //图书作者
char position[10]; //图书存放位置
char status; //图书借存状态
}bks[10];
int i,j,t; /*i,j用于循环结构;t用于记录输入的图书编号*/
char ch; /*ch用于消除回车符*/
void save();
void read();
int load();
void Insert();
void Modify();
void Delete();
void Display();
void Search();
void Sort();
int main()
{
int i=1; /*主函数里的i要设成局部变量,否则会使菜单的循环被搞乱*/
do
{
printf("\n\n\n");
printf("\t\t--------------------------------\n");
printf("\t\t+ 图书信息管理系统 |\n");
printf("\t\t--------------------------------\n");
printf("\t\t+ 1.录入图书信息 |\n");
printf("\t\t+ 2.浏览图书信息 |\n");
printf("\t\t+ 3.查询图书信息 |\n");
printf("\t\t+ 4.删除图书信息 |\n");
printf("\t\t+ 5.修改图书信息 |\n");
printf("\t\t+ 6.按照书名排序 |\n");
printf("\t\t+ 0.退出系统 |\n");
printf("\t\t+*·*·*·*·*·*·*·*·*·*|\n");
printf("\t\t--------------------------------\n");
printf("\n");
printf("请选择0-6:");
scanf("%d",&i);
switch(i)
{
case 1:Insert();
break;
case 2:Display();
break;
case 3:Search();
break;
case 4:Delete();
break;
case 5:Modify();
break;
case 6:Sort();
break;
case 0:printf("\n----------------------感谢您的使用!----------------------\n");
break;
default:printf("\n--------------------选择错误!请重新选择!-------------------\n");
break;
}
}while(i);
return 0;
}
/*将数组数据写入文件*/
void save(int n)
{
FILE*fp;
fp=fopen("Book Information","wb"); /*将文件打开方式设为wb型,可以实现在写之前清空文件中全部信息*/
for(i=0;i<n;i++)
fwrite(&bks[i],sizeof(struct Book_type),1,fp);
fclose(fp); /*关闭文件,以免数据丢失*/
}
/*将文件中的数据输出到数组中*/
void read()
{
FILE *fp;
if((fp=fopen("Book Information","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
else
{
printf("\n 编号\t 书名\t\t出版社\t作者\t\t存放位置 是否借出 \n");
for(i=0;fread(&bks[i],sizeof(struct Book_type),1,fp)!=0;i++)
printf("\n %d\t%-19s%-5s%-18s%-10s%c\n",bks[i].num,bks[i].name,bks[i].publisher,bks[i].author,
bks[i].position,bks[i].status);
}
fclose(fp);
}
/*获取文件中数组元素的个数*/
int load()
{
FILE *fp;
int i=0;
if((fp=fopen("Book information","rb"))==NULL)
{
printf ("cannot open file\n");
exit(0);
}
else
do
{
fread(&bks[i],sizeof(struct Book_type),1,fp);
i++;
}while(feof(fp)==0);
fclose(fp);
return(i-1);
}
/*从文件或直接录入图书信息*/
void Insert()
{
printf("\n**********************请输入图书信息************************\n\n");
printf("\n重新录入信息请按1,从文件中录入信息请按2\n");
scanf("%d",&t);
int m=load();
j=1;
if(t==1)
{
if(m<10)
do /*填补数据删除后的数组元素*/
{
printf("\n编号:");
scanf("%d",&bks[m].num);
for(j=m;j>0;j--) /*输入新的编号与之前编号比较,避免编号重复*/
if(bks[m].num==bks[j-1].num)
{ printf("\n------------编号输入重复,请重新输入------------\n");
printf("\n编号:");
ch=getchar(); /*消除回车符*/
scanf("%d",&bks[m].num);
}
printf("书名:");
scanf("%s",bks[m].name);
printf("出版社:");
scanf("%s",bks[m].publisher);
printf("作者:");
scanf("%s",bks[m].author);
printf("存放位置:");
scanf("%s",bks[m].position);
ch=getchar();
printf("是否借出(Y/N):");
scanf("%c",&bks[m].status);
while(bks[m].status!='Y'&&bks[m].status!='N') /*确保借存信息的输入正确*/
{
printf("\n------------输入错误,请重新输入借存信息!------------\n");
printf("是否借出(Y/N):");
ch=getchar();
scanf("%c",&bks[m].status);
}
m++;
if(m>=10)
{
printf("\n----------------------数据库已满----------------------\n");
j=0;
}
else
{
printf("\n是否继续输入:继续请按1,不继续请按0\n");
scanf("%d",&j);
}
}while(j==1); /*该循环可以实现根据需要输入图书的数量*/
else
printf("\n----------------------数据库已满----------------------\n");
save(m); /*将重新录入的数据存入文件中*/
}
else if(t==2)
read(); /*将文件中的数据输出*/
else
printf("\n----------------------输入无效----------------------\n");
}
/*输入编号,修改图书信息*/
void Modify()
{
int m=load();
int num;
char name[20],publisher[20],author[20],position[10],status; /*用于暂时存放修改后的新数据*/
printf("\n**********************请输入要修改的图书编号************************\n");
scanf("%d",&t);
for(i=0;i<m;i++)
if(bks[i].num==t) break;
if(i>=m)
printf("\n----------------------找不到此书信息!----------------------\n");
else
{
printf("\n**********************请输入新的的图书信息************************\n");
printf("编号:");
scanf("%d",&num);
for(j=0;j<m;j++) /*输入新的编号与之前编号比较,避免编号重复*/
if(bks[j].num==num&&j!=i)
{
printf("\n------------编号输入重复,请重新输入------------\n");
printf("\n编号:");
ch=getchar(); /*消除回车符*/
scanf("%d",&num);
}
bks[i].num=num;
printf("书名:");
scanf("%s",name);
strcpy(bks[i].name,name);
printf("出版社:");
scanf("%s",publisher);
strcpy(bks[i].publisher,publisher);
printf("作者:");
scanf("%s",author);
strcpy(bks[i].author,author);
printf("存放地址:");
scanf("%s",position);
ch=getchar();
strcpy(bks[i].position,position);
printf("是否借出(Y/N):");
scanf("%c",&status);
while(status!='Y'&&status!='N')
{
printf("\n------------输入错误,请重新输入借出信息!------------\n");
ch=getchar();
printf("是否借出(Y/N):");
scanf("%c",&status);
}
/*如果输入错误,重新输入,将之前数据重覆盖*/
bks[i].status=status;
save(m);
}
printf("\n----------------------是否继续修改信息-----------------------\n");
printf("\n--------------------继续请按1,不继续请按0--------------------\n");
scanf("%d",&j);
switch(j)
{
case 1:Modify();break;
case 0:break;
default :break;
}
}
/*输入编号,删除图书信息*/
void Delete()
{
printf("\n**********************输入要删除的图书编号************************\n");
scanf("%d",&t);
int m=load();
for(i=0;i<m;i++)
if(bks[i].num==t) break;
if(i>=m)
printf("\n--------------------找不到此书信息!---------------------\n");
else
{
for(j=i;j<m-1;j++)
{
strcpy(bks[j].name,bks[j+1].name);
bks[j].num=bks[j+1].num;
bks[j].status=bks[j+1].status;
strcpy(bks[j].publisher,bks[j+1].publisher);
strcpy(bks[j].author,bks[j+1].author);
strcpy(bks[j].position,bks[j+1].position);
}
printf("\n------------------------已删除!---------------------------\n");
m=m-1;
}
save(m); /*将删除后的数据存储到文件中*/
printf("\n----------------------是否继续删除信息----------------------\n");
printf("\n--------------------继续请按1,不继续请按0-------------------\n");
scanf("%d",&t);
switch(t)
{
case 1:Delete();break;
case 0:break;
default:break;
}
}
/*显示图书信息*/
void Display()
{
int m=load();
printf("\n 编号\t 书名\t\t出版社\t作者\t\t存放位置 是否借出 \n");
for(i=0;i<m;i++)
printf("\n %d\t%-19s%-5s%-18s%-10s%c\n",bks[i].num,bks[i].name,bks[i].publisher,bks[i].author,
bks[i].position,bks[i].status);
}
/*输入书名,查询图书信息*/
void Search()
{
int m=load();
int n=0;
char nam[20]; /*暂存查询的书名*/
printf("\n**********************请输入要查询的图书的书名************************\n");
scanf("%s",nam);
for(i=0;i<m;i++)
if(strcmp(bks[i].name,nam)==0) break;
if(i>=m)
printf("\n------------------------无此书信息!-------------------------\n");
else
{
for(i=0;i<m;i++)
if(strcmp(bks[i].name,nam)==0&&bks[i].status=='N')
n++;
if(n==0)
printf("\n-----------------抱歉,此书目前已无剩余!-----------------\n");
else
printf("\n---------------目前此书还有%d本剩余,存放位置为----------------\n\n",n);
for(i=0;i<m;i++)
if(strcmp(bks[i].name,nam)==0&&bks[i].status=='N')
printf("%s\t",bks[i].position);
}
printf("\n----------------------是否继续删除信息-----------------------\n");
printf("\n--------------------继续请按1,不继续请按0--------------------\n");
scanf("%d",&t);
switch(t)
{
case 1:Search();break;
case 0:break;
default :break;
}
}
/*根据书名排序并输出*/
void Sort()
{
struct Book_type t;
int k;
int m=load();
for(i=0;i<m;i++) /*选择法排序*/
{
k=i;
for(j=i+1;j<m;j++)
if(strcmp(bks[k].name,bks[j].name)>0)
k=j;
t=bks[k];
bks[k]=bks[i];
bks[i]=t;
}
printf("\n-------------------按书名排好的顺序显示如下--------------------\n");
Display();
}
12-10
2万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交