#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define Header printf("图书编号 图书名称 图书单价 作者 状态 借书人学号 借书人姓名 借书人性别\n")
#define Print printf("%-8d%-8s%-8f%-8s%-8s%-8d%-8s%-8s%\n",book[p].BookNum,book[p].BookName,book[p].Money,book[p].Author,book[p].State,book[p].StudentNum,book[p].Name,book[p].Sex)
struct Book
{
int BookNum;//图书编号
char BookName[50];//图书名称
float Money;//图书单价
char Author;//作者
char State[10];//存在状态
int StudentNum;//借书人学号
char Name;//借书人姓名
char Sex;//借书人性别
}book[100];
int saveflag=0;
void Menu()
{
printf("------------图 书 管 理 系 统-----------\n");
printf(" 主菜单 \n");
printf(" 1 新进图书基本信息的输入 \n");
printf(" 2 图书基本信息的查询 \n");
printf(" 3 对撤消图书信息的删除 \n");
printf(" 4 为借书人办理注册 \n");
printf(" 5 办理借书手续 \n");
printf(" 6 办理还书手续 \n");
printf("----------------------------------------\n");
}
int OpenFile(int cnt)
{
FILE *fp;
int i=0;
fp=fopen("D:\\demo\\book.dat","ab+");//以追加方式打开D:\\demo\\Salary.dat二进制文件
if(fp==NULL)
{
printf("Can not open file!");
exit(0);
}
while(!feof(fp))//循环读取文件中的记录,直到文件结束
{
if(fread(&book[i],sizeof(struct Book),1,fp)==1)//判断fread()函数读取数据是否成功,返回值为1,则读取了一条记录
{
cnt++;
i++;
}
fclose(fp);//关闭文件
return cnt;//返回文件中记录数
}
}
int Add(int cnt)//添加图书记录
{
int choice;
int i,bookNumTemp,j,recordcnt;
recordcnt=cnt;
printf("开始添加图书信息....\n");
for(i=cnt;i<100;i++)
{
printf("图书编号:");
scanf("%d",&bookNumTemp);
for(j=0;j<i;j++)
{
if(book[j].BookNum==bookNumTemp)//如果编号重复,提示重新输入
{
printf("图书编号重复,请重新输入:");
scanf("%d",&bookNumTemp);
j=-1;//重新输入编号后,让j=-1,经过j++后,使其为j=0,重新从数组的第一个元素开始比较编号是否重复
}
}
book[i].BookNum=bookNumTemp;
getchar();
printf("图书名称:");
gets(book[i].BookName);
printf("图书单价:");
scanf("%f",&book[i].Money);
printf("图书作者:");
scanf("%s",&book[i].Author);
printf("借阅状态:");
scanf("%s",&book[i].State);
printf("是否继续输入?1 继续 0 退出:");
scanf("%d",&choice);
recordcnt++;//输入完一条记录后让记录数增1
if(choice!=1)
break;
}
saveflag=1;//输入记录,记录发生变化,saveflag=1,表示变动后的数据未保存
printf("记录输入完成,按任意键返回主菜单....");
getchar();
getchar();
return recordcnt;//返回记录数
}
int Locate(int num,int cnt)//按图书编号查询图书信息
{
int p=-1,i;
for(i=0;i<cnt;i++)
{
if(book[i].BookNum==num)
{
p=i;//记录查询到的记录的下标
break;
}
}
return p;//返回查询到的记录下标,如果返回为-1,表示记录不存在
}
void Query(int cnt)//图书信息查询
{
int choice=0,tempnum,p,count=0,i;
char tempname[20];
printf("开始查询图书信息....\n");
printf("请选择查询方式(1 按编号 2 按书名):");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("请输入要查询图书的编号:");
scanf("%d",&tempnum);
p=Locate(tempnum,cnt);//调用按编号查询图书信息函数
if(-1==p)
{
printf("\n 查询的图书信息不存在,按任意键返回主菜单....");
}
else
{
printf("查询的图书信息如下:\n\n");
Header;
printf("%-8d%-8s%-8f%-8s%-8s%-8d%-8s%-8s%\n",book[p].BookNum,book[p].BookName,book[p].Money,book[p].Author,book[p].State,book[p].StudentNum,book[p].Name,book[p].Sex);
printf("\n 图书信息查询完成,按任意键返回主菜单....");
}
getchar();
break;
case 2:
getchar();
printf("请输入要查询图书姓名:");
gets(tempname);
for(i=0;i<cnt;i++)//按姓名查询可能有多条记录满足,所以不能用Locate()函数
{
if(strcmp(tempname,book[i].BookName)==0)//判断元素姓名是否与要查询的姓名相同
{
if(count==0)
{
Header;//如果时第1条要查询的记录,则输出行标题,否则不输出
}
p=i;
Print;//输出查询到的记录
count++;//查询到的记录数
}
}
if(0==count)
printf("\n查询的图书信息不存在,按任意键返回主菜单....");
else
printf("\n图书信息查询完成,按任意键返回主菜单....");
break;
default:
printf("选择错误,按任意键返回主菜单....");
}
getchar();
}
int Del(int cnt)
{
int tempnum,p,i;
printf("开始删除图书信息....\n\n");
printf("请输入要删除图书的编号:");
scanf("%d",&tempnum);
p=Locate(tempnum,cnt);//调用按编号查询图书信息函数
if(-1==p)
{
printf("\n要删除的图书信息不存在,按任意键返回主菜单....");
}
else
{
printf("要删除的图书信息如下:\n\n");
Header;
Print;
for(i=p;i<cnt-1;i++)//从要删除的位置开始,用后一条记录把前一条记录覆盖
{
book[i]=book[i+1];
}
cnt--;//记录数在原来记录数的基础上减1
saveflag=1;//记录发生变化,存盘标志改为未存盘
printf("\n图书信息修改成功,按任意键返回菜单....");
}
getchar();
getchar();
return cnt;//返回记录数
}
int Register(int cnt)//添加借书人记录
{
int choice;
int i,bookNumTemp,j,recordcnt;
recordcnt=cnt;
printf("开始添加借书人信息....\n");
for(i=cnt;i<100;i++)
{
printf("借书人学号:");
scanf("%d",&bookNumTemp);
for(j=0;j<i;j++)
{
if(book[j].BookNum==bookNumTemp)//如果编号重复,提示重新输入
{
printf("借书人学号重复,请重新输入:");
scanf("%d",&bookNumTemp);
j=-1;//重新输入编号后,让j=-1,经过j++后,使其为j=0,重新从数组的第一个元素开始比较编号是否重复
}
}
book[i].BookNum=bookNumTemp;
getchar();
printf("借书人学号:");
scanf("%d",&book[i].StudentNum);
printf("借书人姓名:");
scanf("%s",&book[i].Name);
printf("借书人性别:");
scanf("%s",&book[i].Sex);
printf("是否继续输入?1 继续 0 退出:");
scanf("%d",&choice);
recordcnt++;//输入完一条记录后让记录数增1
if(choice!=1)
break;
}
saveflag=1;//输入记录,记录发生变化,saveflag=1,表示变动后的数据未保存
printf("记录输入完成,按任意键返回主菜单....");
getchar();
getchar();
return recordcnt;//返回记录数
}
void ExitSystem(cnt){
}//退出系统
int a[100]={0};
void Borrow(int cnt)//借阅
{
int tempnum,p,teaNumTemp,j;
printf("开始借阅图书....\n\n");
int a1;
char a2,a3;
printf("请输入您的学号:");
scanf("%d",&a1);
printf("请输入您的姓名:");
scanf("%s",&a2);
printf("请输入您的性别:");
scanf("%s",&a3);
printf("请输入要借阅的图书编号:");
scanf("%d",&tempnum);
p=Locate(tempnum,cnt);//调用按编号查询图书信息函数
if(-1==p)//返回值-1,表示要查询的图书信息不存在
{
printf("\n要借阅的图书不存在,按任意键返回菜单....");
}
else
{
printf("要借阅的图书信息如下:\n\n");
Header;
Print;//显示查询到的图书信息
printf("借阅后图书信息:\n");
printf("图书状态:");
strcpy(book[10].State,"已借出");
printf("借书人学号:");
book[p].StudentNum=a1;
printf("借书人姓名:");
book[p].Name=a2;
printf("借书人性别:");
book[p].Sex=a3;
Header;
Print;
a[p]=book[p].BookNum;
book[p].BookNum=0;
saveflag=1;//记录发生变化,存盘标志改为未存盘
printf("\n图书借阅成功,按任意键返回主菜单....");
}
getchar();
getchar();
}
void Back(int cnt)//归还
{
int tempnum,p,teaNumTemp,j,a1=0;
char x2;
x2 = 'X';
int i,c,d;
printf("开始归还图书....\n\n");
printf("请输入要归还的图书编号:");
scanf("%d",&c);
for(i=0;i<101;i++)
{
if(a[i]==c)
{
book[i].BookNum=a[i];
}else{
printf("该书不属于图书馆");
}
}
printf("图书状态:");
strcpy(book[10].State,"已归还");
printf("借书人学号:");
book[p].StudentNum=x2;
printf("借书人姓名:");
book[p].Name=x2;
printf("借书人性别:");
book[p].Sex=x2;
Header;
Print;
saveflag=1;//记录发生变化,存盘标志改为未存盘
printf("\n图书归还成功,按任意键返回主菜单....");
getchar();
getchar();
}
void main()
{
int choice=0,count=0;
count=OpenFile(count);//打开文件,获取文件中记录数
while(1)
{
system("cls");//调用系统清屏功能清除屏幕信息,使光标回到左上角开始位置
Menu();//调用菜单函数
printf("请输入你的选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
count=Add(count);//调用添加记录函数
break;
case 2:
Query(count);//调用查询记录函数
break;
case 3:
count=Del(count);//调用删除记录函数
break;
case 4:
Register(count);
break;
case 5:
Borrow(count);
break;
case 6:
Back(count);
break;
default:
printf("选择错误,按任意键返回主菜单....");
getchar();
getchar();
}
}
}
写入不了文件,输出也有问题。
怎么搞