zoukankan      html  css  js  c++  java
  • 图书管理系统

    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    #include <string.h>

    #define M 10
    #define N 15

    typedef struct book_info
    {
    char ISBN[N];//书号
    char name[M];//书名
    char writer[M];//作者
    char time[M];//出版日期
    char publisher[N];//出版社
    char price[M];//价格
    }Book;

    typedef struct link
    {
    Book info;
    struct link * next;

    }Node,*Link;

    void Add_book(Link *Head,Link *New);//添加图书信息函数原型声明
    void Delete_book(Link *Head); //删除图书信息函数原型声明
    void Find_book(Link *Head); //查找图书信息函数原型声明
    void Update_book(Link *Head); //修改图书信息函数原型声明
    void Print_book(Link *Head); //输出图书信息函数原型声明

    /*添加数据子操作*/
    void print_info(Link *New,int i);

    /*删除子操作*/
    void delete_ISBN(Link *Head);
    void delete_name(Link *Head);
    void delete_writer(Link *Head);
    void delete_publisher(Link *Head);

    /*查找子操作*/
    void search_ISBN(Link *Head);
    void search_name(Link *Head);
    void search_writer(Link *Head);
    void search_publisher(Link *Head);
    void search_price(Link *Head);
    void search_time(Link *Head);

    /*修改子操作*/
    void update_ISBN(Link *p);
    Link update_name(Link p);
    Link update_writer(Link p);
    Link update_publisher(Link p);
    Link update_price(Link p);
    Link update_time(Link p);

    void choose_op(Link *Head);

    /*输出一本图书的信息*/
    void print(Link *Head);

    /*图书管理系统菜单*/
    void Menus(Link *Head,Link *New);

    int main(int argc, char **argv)
    {
    FILE * fp;
    int bytes_read,bytes_write;

    Link Head = NULL,p; //节点声明
    Link New = NULL;
    int c = 1;
    p = Head;

    Head = (Link)malloc(sizeof(Node));//建立头节点
    Head->next = NULL; //空链表


    while(c)
    {
    Menus(&Head,&New);

    printf("你想继续操作吗?
    1.继续
    2.退出 ");
    scanf("%d",&c);

    }
    return 0;
    }

    /****************************************************
    函数功能:选择菜单
    ****************************************************/
    void Menus(Link *Head,Link *New)
    {
    int ch;
    printf("/***************欢迎进入图书管理系统****************/ ");
    printf("1.添加图书信息
    2.删除图书信息
    3.查找图书信息
    4.修改图书信息
    5.输出图书管理系统所有图书信息
    6.退出系统
    /***************************************************/ ");
    scanf("%d",&ch);
    switch(ch)
    {
    case 1:
    Add_book(Head,New);
    Print_book(Head);
    break;
    case 2:
    Delete_book(Head);
    Print_book(Head);
    break;
    case 3:
    Find_book(Head);
    break;
    case 4:
    Update_book(Head);
    break;
    case 5:
    Print_book(Head);
    break;
    case 6:
    exit(0);
    default:
    printf("输入错误,请重新输入! ");

    }
    }
    /****************************************************
    函数功能:修改指定图书的ISBN
    ****************************************************/
    void update_ISBN(Link *p)
    {
    printf("请输入新的ISBN: ");
    scanf("%s",(*p)->info.ISBN);

    }
    /****************************************************
    函数功能:修改指定图书的书名
    ****************************************************/
    Link update_name(Link p)
    {
    printf("请输入新的书名: ");
    scanf("%s",p->info.name);
    return p;
    }
    /****************************************************
    函数功能:修改指定图书的作者
    ****************************************************/
    Link update_writer(Link p)
    {
    printf("请输入新的作者名字: ");
    scanf("%s",p->info.writer);
    return p;
    }

    /****************************************************
    函数功能:修改指定图书的出版社名字
    ****************************************************/
    Link update_publisher(Link p)
    {
    printf("请输入新的出版社名字: ");
    scanf("%s",p->info.publisher);
    return p;
    }

    /****************************************************
    函数功能:修改指定图书的价格
    ****************************************************/
    Link update_price(Link p)
    {
    printf("请输入新的价格: ");
    scanf("%d",p->info.price);
    return p;
    }

    /****************************************************
    函数功能:修改指定图书的出版日期
    ****************************************************/
    Link update_time(Link p)
    {
    printf("请输入新的出版日期: ");
    scanf("%s",p->info.time);
    return p;
    }


    /*****************************************************
    函数功能:修改指定图书的信息
    *****************************************************/
    void Update_book(Link *Head)
    {
    char str[N];
    int flag = 0;
    Link p;
    /*输出录入图书的信息*/
    Link q;


    printf("请输入你要修改图书的ISBN: ");//根据ISBN找到指定图书
    scanf("%s",str);

    p = *Head;

    if(p->next == NULL)//链表为空
    {
    printf("没有图书,不能进行修改操作. ");
    }

    while(p->next != NULL)
    {
    if(strcmp(p->next->info.ISBN,str) == 0)//如果p->next->info.ISBN与指定的ISBN号相同,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------你想要修改图书的所有信息为----------------/ ");

    /*调用函数显示指定图书的所有信息*/
    q = p->next;
    print(&q);

    /*调用函数选择修改操作*/
    choose_op(&q);

    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("不能进行修改操作,没有ISBN为%s的书 ",str);
    }

    }

    /******************************************************
    函数功能:根据需要选择要进行修改的操作
    ******************************************************/
    void choose_op(Link *p)
    {
    int ch;
    Link q;
    q = *p;
    int c = 1;

    while(c)
    {
    c = 0;
    printf("请选择你想进行的修改操作: ");
    printf("1.修改ISBN
    2.修改书名
    3.修改作者
    4.修改出版社名
    5.修改书的价格
    6.修改出版日期 ");
    scanf("%d",&ch);

    switch(ch)
    {
    case 1:
    update_ISBN(&q);
    print(&q);
    break;
    case 2:
    update_name(q);
    break;
    case 3:
    update_writer(q);
    break;
    case 4:
    update_publisher(q);
    break;
    case 5:
    update_price(q);
    break;
    case 6:
    update_time(q);
    break;
    default:
    printf("输入错误 ");
    }
    C: printf("还要继续修改吗?
    1.继续
    0.退出 ");
    scanf("%d",&c);
    if(c > 1)
    {
    printf("输入错误,请重新输入! ");
    goto C;
    }

    }
    printf("修改后: ");
    print(p);
    }

    /*****************************************************
    函数功能:查找指定图书的信息
    ****************************************************/
    void Find_book(Link *Head)
    {
    int ch;

    printf("请选择你想进行的查找操作: ");
    printf("1.按ISBN查找
    2.按书名查找
    3.查找指定作者的所有书
    4.查找指定出版社出版的所有书
    5.查找书的价格范围在指定区间的书
    6.查找出版时间在指定区间内的书 ");
    scanf("%d",&ch);

    switch(ch)
    {
    case 1:
    search_ISBN(Head);
    break;
    case 2:
    search_name(Head);
    break;
    case 3:
    search_writer(Head);
    break;
    case 4:
    search_publisher(Head);
    break;
    case 5:
    search_price(Head);
    break;
    case 6:
    search_time(Head);
    break;
    default:
    printf("输入错误 ");
    }

    }
    /*****************************************************
    函数功能:根据ISBN查找图书信息
    *****************************************************/
    void search_ISBN(Link *Head)
    {
    Link p;
    char str[N];
    int flag = 0;

    printf("请输入你想查找图书的ISBN: ");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if(strcmp(p->info.ISBN,str) == 0)//如果p->next->info.ISBN与指定的ISBN号相同,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------你查找的图书信息为----------------/ ");
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有ISBN为%s的书 ",str);
    }

    }
    /*****************************************************
    函数功能:根据书名查找信息
    *****************************************************/
    void search_name(Link *Head)
    {
    Link p;
    char str[N];
    int flag = 0;

    printf("请输入你想查找图书的书名: ");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if(strcmp(p->info.name,str) == 0)//如果p->next->info.name与指定的书名相同,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------你查找的图书信息为----------------/ ");
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有书名为%s的书 ",str);
    }
    }
    /*****************************************************
    函数功能:查找指定图书作者写的图书信息
    *****************************************************/
    void search_writer(Link *Head)
    {
    Link p;
    char str[N];
    int flag = 0;

    printf("请输入你想查找图书的作者: ");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if(strcmp(p->info.writer,str) == 0)//如果p->next->info.writer与指定的作者相同,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------你查找的图书信息为----------------/ ");
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有作者%s的书 ",str);
    }
    }
    /*****************************************************
    函数功能:查找指定出版社出版的图书信息
    *****************************************************/
    void search_publisher(Link *Head)
    {
    Link p;
    char str[N];
    int flag = 0;

    printf("请输入你想查找图书的出版社名字: ");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if(strcmp(p->info.publisher,str) == 0)//如果p->next->info.publisher与指定的出版社名字相同,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------你查找的图书信息为----------------/ ");
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有出版社%s的书 ",str);
    }
    }
    /*****************************************************
    函数功能:查找图书价格在指定区间上的书
    *****************************************************/
    void search_price(Link *Head)
    {
    Link p;
    char a[M],b[M];
    int flag = 0;

    printf("请输入你想查找图书价格的下限: ");
    scanf("%s",a);
    printf("请输入你想查找图书的上限: ");
    scanf("%s",b);

    p = (*Head);//->next;

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if((p->info.price>a) && (p->info.price<b))//如果p->next->info.price在指定的区间[a,b]内,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------价格位于[%d,%d]内图书信息为----------------/ ",a,b);
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有图书价格位于[%d,%d]内的书 ",a,b);
    }
    }
    /*****************************************************
    函数功能:查找出版日期在区间[a,b]中的图书
    *****************************************************/
    void search_time(Link *Head)
    {
    Link p;
    char a[M],b[M];
    int flag = 0;

    printf("请输入你想查找图书出版日期的区间[a,b]:(以逗号隔开) ");
    scanf("%s,%s",a,b);

    p = (*Head);

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if((p->info.time >= a) && (p->info.time <= b))//如果p->next->info.time在指定的区间[a,b]内,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------出版日期位于[%s,%s]内图书信息为----------------/ ",a,b);
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有出版日期位于[%s,%s]内的书 ",a,b);
    }
    }
    /*****************************************************
    函数功能:删除图书
    *****************************************************/
    void Delete_book(Link *Head)
    {
    Link p;
    int ch;

    printf("请选择你想进行的删除操作: ");
    printf("1.删除与指定ISBN相同的书
    2.删除与指定书名相同的书
    3.删除指定作者的书
    4.删除指定出版社的书 ");
    scanf("%d",&ch);

    switch(ch)
    {
    case 1:
    delete_ISBN(Head);
    break;
    case 2:
    delete_name(Head);
    break;
    case 3:
    delete_writer(Head);
    break;
    case 4:
    delete_publisher(Head);
    break;
    default:
    printf("输入错误! ");
    }
    }
    /*****************************************************
    函数功能:删除与指定ISBN相同的书
    *****************************************************/
    void delete_ISBN(Link *Head)
    {
    Link p,q;
    char str[N];
    int flag = 0;
    printf("请输入你想删除图书的ISBN: ");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//链表为空
    {
    printf("没有图书,不能进行删除操作. ");
    }

    while(p->next != NULL)
    {
    if(strcmp(p->next->info.ISBN,str) == 0)//如果p->next->info.ISBN与指定的ISBN号相同,则删除此图书节点
    {
    flag = 1;
    q = p->next;
    p->next = q->next;
    free(q);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有ISBN为%s的书 ",str);
    }


    }
    /*****************************************************
    函数功能:删除与指定书名相同的书
    *****************************************************/
    void delete_name(Link *Head)
    {
    Link p,q;
    char str[N];
    int flag = 0;
    printf("请输入你想删除图书的名字: ");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//链表为空
    {
    printf("没有图书,不能进行删除操作. ");
    }

    while(p->next != NULL)
    {
    if(strcmp(p->next->info.name,str) == 0)//如果p->next->info.ISBN与指定的书名相同,则删除此图书节点
    {
    q = p->next;
    p->next = q->next;
    free(q);
    flag = 1;
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有这本书 ");
    }

    }
    /*****************************************************
    函数功能:删除指定作者的书
    *****************************************************/
    void delete_writer(Link *Head)
    {
    Link p,q;
    char str[N];
    int flag = 0;
    printf("请输入你想删除图书的作者名: ");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//链表为空
    {
    printf("没有图书,不能进行删除操作. ");
    }

    while(p->next != NULL)
    {
    if(strcmp(p->next->info.writer,str) == 0)//如果p->next->info.ISBN与指定的作者名相同,则删除此图书节点
    {
    q = p->next;
    p->next = q->next;
    free(q);
    flag = 1;
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有作者%s的书 ",str);
    }

    }
    /*****************************************************
    函数功能:删除指定出版社的书
    *****************************************************/
    void delete_publisher(Link *Head)
    {
    Link p,q;
    char str[N];
    int flag = 0;
    printf("请输入你想删除图书的出版社名字: ");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//链表为空
    {
    printf("没有图书,不能进行删除操作. ");
    }

    while(p->next != NULL)
    {
    if(strcmp(p->next->info.publisher,str) == 0)//如果p->next->info.ISBN与指定的出版社名字相同,则删除此图书节点
    {
    q = p->next;
    p->next = q->next;
    free(q);
    flag = 1;
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有%s出版社的书 ",str);
    }
    }

    /*****************************************************
    函数功能:录入新的书籍信息
    ****************************************************/
    void Add_book(Link *Head,Link *New)
    {
    int i;
    int num;
    Link p;
    FILE * fp;

    if((fp = fopen("F:\book_info.txt","a+")) == NULL)
    {
    perror("书库文件打开失败,不能录入信息! ");
    exit(1);
    }

    p = (*Head)->next;

    printf("你想录入几本书? ");
    scanf("%d",&num);

    for(i = 0; i < num; i++)
    {
    *New = (Link)malloc(sizeof(Node));
    /*输入图书的信息*/
    print_info(New,i);

    /*头插法插入节点*/
    (*New)->next = (*Head)->next;
    (*Head)->next = *New;
    }
    }

    /*******************************************************
    函数功能:输入图书的信息
    *******************************************************/
    void print_info(Link *New,int i,FILE *fp)
    {
    printf("请输入第%d本书的信息: ",i+1);

    printf("ISBN:");
    scanf("%s",&(*New)->info.ISBN);
    fwrite((*New)->info.ISBN,N,1,fp);

    printf("书名:");
    scanf("%s",&(*New)->info.name);
    fwrite((*New)->info.name,M,1,fp);

    printf("作者:");
    scanf("%s",&(*New)->info.writer);
    fwrite((*New)->info.writer,M,1,fp);

    printf("出版社:");
    scanf("%s",&(*New)->info.publisher);
    fwrite((*New)->info.ISBN,N,1,fp);

    printf("出版时间:");
    scanf("%s",&(*New)->info.time);
    fwrite((*New)->info.ISBN,N,1,fp);

    printf("价格:");
    scanf("%5f",&(*New)->info.price);
    fwrite((*New)->info.ISBN,N,1,fp);
    }

    /********************************************************
    函数功能:输出图书信息
    *******************************************************/
    void Print_book(Link *Head)
    {
    int i = 0;
    Link p;
    p = *Head;

    printf("/*******************************************
    管理系统所有的图书为: ");
    if(p->next == NULL)
    {
    printf("没有图书! ");
    }
    while(p->next != NULL)
    {
    i++;
    print(&p->next);//调用函数输出指针p所指向的图书的信息
    p = p->next;
    }
    }

    /**************************************************
    函数功能:输出一本图书的信息
    *************************************************/
    void print(Link *L)
    {
    Link p;
    p = *L;

    printf("ISBN:%s ",p->info.ISBN);
    printf("书名:%s ",p->info.name);
    printf("作者:%s ",p->info.writer);
    printf("出版社:%s ",p->info.publisher);
    printf("出版时间:%s ",p->info.time);
    printf("价格:%f ",p->info.price);

    }

  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/wlp1115/p/6576568.html
Copyright © 2011-2022 走看看