题目:编写一个程序模拟图书管理系统。用户分为管理员和读者两类,分别显示不同文本格式菜单,通过菜单项对应数字进行选择。读者菜单包括借书、还书、查询等功能。管理员菜单包括图书和读者信息录入、删除、修改和查询。图书信息至少应包括:编号、书名、数量,读者信息至少应包括:编号、姓名、所借图书。可根据图书名称或编号进行图书信息查询,可查询某本书现在被哪些读者借走。
涉及了文件修改操作,可能比较繁琐,考虑的情况比较多,分为管理系统与读者系统。管理系统可分为对读者和图书信息的增加、删除、更改、查阅,读者系统可以进行对图书的借阅、归还和对图书信息的查询。
有问题欢迎交流!
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
typedef struct{
int ID;
char name[20];
int borwNum;
char borwBook[1000][20];
}Readers;//读者信息
typedef struct{
int ID;
char name[20];
int totalNum;//馆存数量
int leNum;//外借数量
}Books;//图书信息
Readers reader[1000];//读者文件
Books book[1000];//图书文件
int stuNum;
int bookNum;
FILE *fp1 = NULL;//读者文件指针
FILE *fp2 = NULL;//图书文件指针
char fileName1[]="C:\\Users\\hp\\Desktop\\student.txt";
char fileName2[]="C:\\Users\\hp\\Desktop\\book.txt";
int BorwBookIndex(char bookName[],char borwBook[][20],int borwNum)//获取读者所借书数组的下标
{
int j;
for(j=0;j<borwNum;j++)
{
if(strcmp(bookName,borwBook[j])==0)
{
return j;
}
}
return -1;
}
int IndexMatch(char inputName[],Readers reader[],int stuNum)//根据读者姓名得到其在结构体中的下标
{
int i;
for(i=0;i<stuNum;i++)
{
if(strcmp(inputName,reader[i].name)==0)
{
return i;
}
}
return -1;
}
int getBookIndex(char bookName[],Books book[],int bookNum)//根据书名得到在结构体中的下标
{
int i;
for(i=0;i<bookNum;i++)
{
if(strcmp(bookName,book[i].name)==0)
{
return i;
}
}
return -1;
}
void setBoFile(FILE *fp,char fileName[],Books book[])//重写图书文件
{
fp = fopen("C:\\Users\\hp\\Desktop\\book.txt","w+");
int j;
for(j=0;j<bookNum;j++)
{
fprintf(fp,"%d %s %d %d\n",book[j].ID,book[j].name,book[j].totalNum,book[j].leNum);
}
fclose(fp);
fp = NULL;
}
void setReFile(FILE *fp,char fileName[],Readers reader[])//重写读者文件
{
fp = fopen("C:\\Users\\hp\\Desktop\\student.txt","w+");//清空文件
int i,j;
char c[1] = "";
for(i=0;i<stuNum;i++)
{
fprintf(fp,"%d %s %d ",reader[i].ID,reader[i].name,reader[i].borwNum);
int k;
for(k=0;k<reader[i].borwNum;k++)
{
fprintf(fp,"%s ",reader[i].borwBook[k]);
}
fprintf(fp,"%s\n",c);
}
fclose(fp);
fp = NULL;
}
读者借书
void StuBorrow(FILE *fp1,FILE *fp2,int stuNum,int bookNum)//借书
{
fp1 = fopen("C:\\Users\\hp\\Desktop\\student.txt","r+");//以读/写方式打开文件,文件必须存在,打开内容不变
fp2 = fopen("C:\\Users\\hp\\Desktop\\book.txt","r+");
int i=0,j,m,num,a=0,k=0,c;
char putname[30],ch;
char name[20];
int num1=book[i].leNum+1;
printf("\n请输入您的姓名\n");
scanf("%s",&putname);
int Index = IndexMatch(putname,reader,stuNum);//学生位于结构体的下标
getchar();
for(i=0;i<bookNum;i++)
{
if((strcmp(putname,reader[i].name))==0)
{
k=1;
if(reader[i].borwNum==20)
printf("对不起,您借阅的图书已达到上限");
else
{
printf("请输入搜索借阅图书的方式\n");
printf("1.输入图书编号借阅\n");
printf("2.输入图书名称借阅\n");
ch=getchar();
switch(ch)
{
case'1':
printf("请输入你要查询的图书编号\n");
scanf("%d",&num);
getchar();
for(j=0;j<bookNum;j++)
{
if(num==book[j].ID&&book[j].totalNum>book[j].leNum)
{
a=1;
printf("您要借阅的书籍是:\n");
printf("%d %s\n",book[j].ID,book[j].name);
printf("确认借阅请输入'1',或按任意键取消操作\n");//任意?
scanf("%d",&num1);
if (num1==1)
{
printf("借书成功!");
book[j].leNum++;
reader[Index].borwNum++;
strcpy(reader[Index].borwBook[reader[Index].borwNum-1],book[j].name);
setReFile(fp1,fileName1,reader);
setBoFile(fp2,fileName2,book);
break;
}
else
{
printf("操作取消\n");
break;
}
}
if(num==book[j].ID&&book[j].totalNum==book[j].leNum)
{
printf("对不起,您要借阅的图书已被借完\n");
a=1;
}
}
if(a==0)
{
printf("没有查询到你需要借阅的图书\n");
}
break;
case'2':
printf("请输入你要查询的图书名称\n");
scanf("%s",&name);
getchar();
for(a=0,j=0;j<bookNum;j++)
{
if(strcmp(name,book[j].name)==0&&book[j].totalNum>book[j].leNum)
{
a=1;
printf("您要借阅的书籍是:\n");
printf("%d %s\n",book[j].ID,book[j].name);
printf("确认借阅请输入'1',或按任意键取消操作\n");
scanf("%d",&num1);
if (num1==1)
{
printf("借书成功!");
book[j].leNum++;
reader[Index].borwNum++;
strcpy(reader[Index].borwBook[reader[Index].borwNum-1],book[j].name);
setReFile(fp1,fileName1,reader);
setBoFile(fp2,fileName2,book);
break;
}
else
{
printf("操作取消\n");
break;
}
}
if(strcmp(name,book[j].name)==0&&book[j].totalNum==book[j].leNum)
{
printf("对不起,您要借阅的图书已被借完\n");
a=1;
break;
}
}
if(a==0)
{
printf("没有查询到你需要借阅的图书\n");
}
break;
}
}
}
}
if(k==0) printf("对不起,查无此人\n");
fclose(fp1);
fclose(fp2);
fp1 = NULL;
fp2 = NULL;
}
读者还书
void StuReturn()//还书
{
int i,j,num,num1;
char putname[20],name[20],ch;
printf("\n请输入您的姓名\n");
scanf("%s",&putname);
getchar();
int Index = IndexMatch(putname,reader,stuNum);//学生位于结构体的下标
for(i=0;i<stuNum;i++)//bookNum??
{
if((strcmp(putname,reader[i].name))==0)
{
if(reader[i].borwNum==0)
{
printf("您还未借阅图书");
}
else
{
printf("请输入搜索应还图书的方式\n");
printf("1.输入图书编号\n&