鲜衣怒码ing 2023-01-29 23:07 采纳率: 97.1%
浏览 35
已结题

网上找的图书管理系统,添写的删除功能无法实现

代码可以运行,但是delet函数有bug,输入要删除的书名,用book[j]=book[j+1]后,还是能查询到书籍,我觉得是因为在main函数里面定义了指针book而不是数组book,如果是数组的话就不会出现这种问题。那么如何实现删除功能呢?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void input(struct Book *book);        //录入书籍
void inquire(struct Book *book, int book_num);        //查询书籍名称
void print(struct Book *book);                //打印书籍
void menu(int *flag);                //目录
struct Time 
{
        int year;
        int month;
        int day;
};

struct Book
{
        char name[200];
        struct Time time;
        char chubanshe[200];
};

void input(struct Book *Book)        //录入书籍
{
        printf("请输入书名:");
        scanf("%s",Book->name);
        printf("请输入年月日:");
        //scanf("%d%d%d", &book[i].time.year, &book[i].time.month, &book[i].time.day);
        scanf("%d%d%d",&((*Book).time.year),&(Book->time.month),&(Book->time.day));
        printf("请输入出版社:");
        scanf("%s",Book->chubanshe);
        printf("\n======书籍录入成功======\n\n");                        
}

void inquire(struct Book *book, int book_num)        //查询书籍名称
{
        char name[200];
        int i,flag = 0;
        printf("\n请输入书籍名称:\n\n");
        scanf("%s",name);
        for(i = 0;i < book_num; i++)
        {

                if(strcmp(book[i].name, name) == 0)
                {
                        printf("这是第%d本书\n",i + 1);
                        print(&book[i]);
                        flag = 1;
                        break;
                }
                
        }
        if(flag == 0)        
        {
                printf("\n===请重新输入书籍名称===\n\n");
                inquire(book,book_num);
        }

}

delet(struct Book *book,int book_num)
{    char name[50]; 
    int flag=0;
    printf("请输入书名:");
    scanf("%s",name);
    printf("\n");
    for(int i=0;i<book_num;i++)
    {
        if(strcmp(book[i].name, name) == 0)
        {
            flag=1;
            printf("删除成功!!!\n"); 
            book_num--;
            for(int j=i;j<book_num-1;j++)        
                book[j]=book[j+1];//j+1!!!  j最大等于book_num-2此时+1即为book_num-1 
        }
     }
     if(flag==0)
     printf("=====查无此书!!!=====\n"); 
}

void print(struct Book *book)        //输出查询到的书籍
{
        printf("\n======书籍查询成功======\n\n");
        printf("书  名:%s\n",book -> name);
        printf("日  期:%d-%d-%d\n", book -> time.year, book -> time.month, book -> time.day);
        printf("出版社:%s\n\n",book -> chubanshe);
}

void menu(int *flag)        //目录
{
        int mode;
        printf("请选择模式:\n");
        printf("1.输入1录入书籍;\n");
        printf("2.输入2查询书籍;\n");
        printf("3.输入3删除书籍;\n");                 //未做
        printf("4.输入4退出系统;\n");
        scanf("%d",flag);       
}

int main(void)
{
        struct Book *book = NULL;//指针实现 
        int book_num = 0;
        int flag;
        while(1)
        {
                menu(&flag);
                switch(flag)
                {
                        case 1: 
                                {
                                        book_num++;
                                        printf("这是第%d本书\n",book_num);
                                        book = (struct Book *)realloc(book,(book_num + 1) * sizeof(struct Book *));//!!! 
                                        input(&book[book_num - 1]); break;
                                }
                        case 2: inquire(book,book_num); break;
                        case 3: delet(book,book_num); break;
                        case 4: free(book);exit(1);
                        default:printf("\n请重新输入\n\n");break;
                }
        }
        return 0;
}

img

img

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-01-30 09:46
    关注

    修改如下,供参考:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void input(struct Book* book); //录入书籍
    void inquire(struct Book* book, int book_num);//查询书籍名称
    void print(struct Book* book);//打印书籍
    void menu(int* flag);//目录
    int delet(struct Book* book, int book_num);  //修改
    struct Time
    {
        int year;
        int month;
        int day;
    };
    struct Book
    {
        char  name[200];
        struct Time time;
        char chubanshe[200];
    };
    void input(struct Book* Book)  //录入书籍
    {
        printf("请输入书名:");
        scanf("%s", Book->name);
        printf("请输入年月日:");
        //scanf("%d%d%d", &book[i].time.year, &book[i].time.month, &book[i].time.day);
        scanf("%d%d%d", &((*Book).time.year), &(Book->time.month), &(Book->time.day));
        printf("请输入出版社:");
        scanf("%s", Book->chubanshe);
        printf("\n======书籍录入成功======\n\n");
    }
    void inquire(struct Book* book, int book_num) //查询书籍名称
    {
        char name[200];
        int i, flag = 0;
        printf("\n请输入书籍名称:\n\n");
        scanf("%s", name);
        for (i = 0; i < book_num; i++)
        {
            if (strcmp(book[i].name, name) == 0)
            {
                printf("这是第%d本书\n", i + 1);
                print(&book[i]);
                flag = 1;
                break;
            }
        }
        if (flag == 0)
        {
            printf("=====查无此书!!!=====\n");   //修改
            //printf("\n===请重新输入书籍名称===\n\n");
            //inquire(book, book_num);
        }
    }
    
    int delet(struct Book* book, int book_num)  //修改
    {
        char name[50];
        int flag = 0;
        printf("请输入书名:");
        scanf("%s", name);
        printf("\n");
        for (int i = 0; i < book_num; i++)
        {
            if (strcmp(book[i].name, name) == 0)
            {
                for (int j = i; j < book_num - 1; j++)
                    book[j] = book[j + 1];//j+1!!!  j最大等于book_num-2此时+1即为book_num-1 
                book_num--;                 //修改
                flag = 1;                   //修改
                printf("删除成功!!!\n"); //修改
                break;                      //修改
            }
        }
        if (flag == 0)
            printf("=====查无此书!!!=====\n");
        return book_num;          //修改
    }
    
    void print(struct Book* book)        //输出查询到的书籍
    {
        printf("\n======书籍查询成功======\n\n");
        printf("书  名:%s\n", book->name);
        printf("日  期:%d-%d-%d\n", book->time.year, book->time.month, book->time.day);
        printf("出版社:%s\n\n", book->chubanshe);
    }
    
    void menu(int* flag)        //目录
    {
        int mode;
        printf("请选择模式:\n");
        printf("1.输入1录入书籍;\n");
        printf("2.输入2查询书籍;\n");
        printf("3.输入3删除书籍;\n");
        printf("4.输入4退出系统;\n");
        scanf("%d", flag);
    }
    
    int main(void)
    {
        struct Book* book = NULL;//指针实现 
        int book_num = 0;
        int flag;
        while (1)
        {
            menu(&flag);
            switch (flag)
            {
            case 1:
            {
                book_num++;
                printf("这是第%d本书\n", book_num);
                book = (struct Book*)realloc(book, (book_num + 1) * sizeof(struct Book));//sizeof(struct Book*) //修改
                input(&book[book_num - 1]); break;
            }
            case 2: inquire(book, book_num); break;
            case 3: book_num = delet(book, book_num); break;   //修改
            case 4: free(book); exit(1);
            default:printf("\n请重新输入\n\n"); break;
            }
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月7日
  • 已采纳回答 1月30日
  • 创建了问题 1月29日

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line