c语言借书函数,想要限制读者的借书数量

问题:想要在限制读者借书的数量。开始是想要在读者文本检测到读者存入的信息已经超过两本就不存入读者的信息,借书就失败。但是不会实现。以下只是代码的一部分,但是应该足够了。


```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();//调用借阅系统

}


```

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7681449
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:本文通过c语言实现九宫格。九宫格的难点在于如何创建矩阵,数字如何排列,在边界处如何处理。因此,本文主要有两个部分:二维动态数组实现任意奇数阶的矩阵;矩阵中数字的排列。
  • 除此之外, 这篇博客: C语言——遗忘知识点回忆记录中的 64. 定义字符指针后,如果没有对它赋值,指针的值是不确定的,不能明确它指向的内存单元。因此,如果引用未赋值的指针,可能会出现难以预料的结果。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    eg:

    char *s;
    scanf("%s", &s);        //错误!

    为了避免引用未赋值的指针所造成的危害,在定义指针时,可先将它的初值置为NULL。

    eg:char *s = NULL;

     

  • 您还可以看一下 黄强老师的30分钟彻底学会C语言指针视频教程课程中的 各种指针的强转转换及企业开发使用技巧小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    思路:

    1. 需要在读者信息结构体中添加一个记录已借书数量的变量
    2. 每次借书时,判断该变量是否小于等于2,若是,则可以继续借书;若否,则不可再借书
    3. 每次还书时,需要将已借书数量减1

    代码示例:

    //定义读者信息结构体
    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++化哈)
希望我的建议对你有帮助哦!谢谢你!