问题:想要在限制读者借书的数量。开始是想要在读者文本检测到读者存入的信息已经超过两本就不存入读者的信息,借书就失败。但是不会实现。以下只是代码的一部分,但是应该足够了。
```c
void lendbook()//借书函数
{
FILE *fp,*fp3;
struct book *head=NULL;
struct book *p,*p1,*p2;
int i,loop,k,n=0,flag=0,s=0;
int jnum=0;
int many=0;
float tprice=0;
char tname[20]={'\0'},tauthor[20]={'\0'},tchuban[20]={'\0'},tpos[20]={'\0'},tshuhao[20]={'\0'},
ttname[20]={'\0'},mingzi[20]={'\0'},riqi[20]={'\0'},zname[20]={'\0'};
char hit=0;
system("cls");
if((fp=fopen("library.txt","r"))==NULL)
{
system("cls");
printf("\n 图书馆无库存!按任意键退出!");
getch();
exit(0);
}
else
{
printf("\n请输入借阅书名:\n请输入:");
scanf("%s",zname);
k=sumbook();//统计图书馆文件个数
for (i=0;i<k;i++)//先将图书信息建立链表,更改库存
{
fscanf(fp,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tpos,&many,&tprice);
n++;
if(n==1)
{
p1=p2=(struct book*)malloc(LEN);
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct book*)malloc(LEN);
}
strcpy(p1->num,tshuhao);//复制书号
strcpy(p1->nam,tname);//复制书名
strcpy(p1->aut,tauthor);//复制作者
strcpy(p1->pub,tchuban);//复制出版社
strcpy(p1->pos,tpos);//复制位置
p1->many=many;//复制现存量
p1->price=tprice;//复制单价
}
if(n==0)
head=NULL;
else
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
}
p=head;
for (;p!=NULL;)
{
if(!(strcmp(p->nam,zname)))//判断要借书的是否存在,标记等于1,存在库存减一
{
flag=1;
loop=p->many;
(p->many)--;
}
p=p->next;
}
if(flag&&(loop>0))//存在被借的图书且现存量大于0,把库存量变化后的链表存入文件
{
fp=fopen("library.txt","w");
fclose(fp);
fp=fopen("library.txt","a");
p=head;
for(;p!=NULL;)
{
fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->pos ,p->many,p->price);
p=p->next;
}
free(p);
fclose(fp);
if ((fp3=fopen("reader.txt","r"))==NULL)//建读者文件夹存入借书信息
{
fp3=fopen("reader.txt","w");//打开只读文件
fclose(fp3);
}
fp3=fopen("reader.txt","a");
printf("\n请按以下格式输入读者信息:\n 证号 姓名 借书日期 借书书名\n请输入:");//录入读者信息
scanf("%d %s %s %s",&jnum,mingzi,riqi,zname);
fprintf(fp3,"\n%-8d%-23s%-18s%-10s\n",jnum,mingzi,riqi,zname);
fclose(fp3);
printf("借书成功!请两个月内归还!!!按任意键返回\n");
getch();//返回
lendmain();//调用借阅系统
}
else
{
if(flag!=0)
printf("此书已被借完!按任意键返回!");//否则输出此书已被借完
else
printf("查找无此书!按任意键返回");
}
getch();//返回
lendmain();//调用借阅系统
}
```
不知道你这个问题是否已经解决, 如果还没有解决的话:eg:
char *s;
scanf("%s", &s); //错误!
为了避免引用未赋值的指针所造成的危害,在定义指针时,可先将它的初值置为NULL。
eg:char *s = NULL;
思路:
代码示例:
//定义读者信息结构体
struct Reader{
int id; //读者ID
char name[20]; //读者姓名
int borrowed; //已借书数量
};
#define MAX_READERS 100 //最多存储100个读者信息
struct Reader readers[MAX_READERS]; //定义一个读者信息结构体数组
int num_readers = 0; //已存储的读者数量
//借书函数
void borrowBook(int reader_id){
//查找读者
int i;
for(i = 0; i < num_readers; i++){
if(readers[i].id == reader_id){
//找到读者
if(readers[i].borrowed < 2){ //已借书数量小于2,可以继续借书
readers[i].borrowed += 1; //已借书数量加1
printf("借书成功!\n");
}
else{ //已借书数量大于等于2,不可再借书
printf("您已经借了两本书,不能再借了!\n");
}
return;
}
}
//未找到读者
printf("没有找到ID为%d的读者!\n", reader_id);
}
//还书函数
void returnBook(int reader_id){
//查找读者
int i;
for(i = 0; i < num_readers; i++){
if(readers[i].id == reader_id){
//找到读者
if(readers[i].borrowed > 0){ //已借书数量大于0,可以还书
readers[i].borrowed -= 1; //已借书数量减1
printf("还书成功!\n");
}
else{ //已借书数量为0,无法还书
printf("您没有借书,无法还书!\n");
}
return;
}
}
//未找到读者
printf("没有找到ID为%d的读者!\n", reader_id);
}
需要注意的是,上述代码只是一个简单的示例,没有考虑并发和数据持久化等问题。在实际开发中,还需要考虑多读者借阅同一本书、读者恶意借书等情况。同时,为了保持数据持久化,可以使用数据库等方式存储读者信息。
不知道你解决了这个问题吗,如果还没有的话可以看看我的建议:
我的建议是:
可以建一个数组,读者1借一本书那么nums[0]就++(1),如果借了两本就为2,在循环中加一个判断,判断一个人借过几本书,访问数组nums,如果超过2本就直接借书失败。(不好意思有点C++化哈)
希望我的建议对你有帮助哦!谢谢你!