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

#define TOTAL 100

typedef struct Book
{
   char no[10];     /*编号*/
   char name[20];   /*书名*/
   char pub[20];    /*出版社*/
   float price;     /*价格*/
}BOOK;

int load(BOOK books[]);
//int input(BOOK *books,int total);
int addBook(BOOK books[],int total);
void displayBook(BOOK books[],int total);
void delBook(BOOK books[],int total);
void saveBooks(BOOK books[],int total);
void searchBook(BOOK books[],int total);
void DispMenu(char *menu);

/****************************************************************************/
/* 函数功能:主程序,显示主菜单,根据用户的选择调用相应的函数完成各自的功能    */
/* 输入参数:无                                                              */
/* 函数输出:选择的菜单序号                                                  */
/****************************************************************************/
void main(void)
{
    BOOK books[TOTAL];       /* Books数组用于保存所有的图书 */
    int count=0;
    //printf("欢迎使用图书管理系统1.0!请先录入基本图书信息:\n");
    //count=input(books,count);
    //saveBooks(books,count);
    count=load(books);
    while(1)
    {
        switch(menu_select())
        {
        case 1:
            count=addBook(books,count);
            break;
        case 2:
            displayBook(books,count);
            break;
        case 3:
            searchBook(books,count);
            break;
        case 4:
            delBook(books,count);
            break;
        case 5:
            saveBooks(books,count);
            break;
        case 0:
            printf("谢谢使用!\n");
            return;
        }
   }
}

/*录入图书信息
int input(BOOK *books,int total)
{
    int n,i;
    while(1)
    {
        char ch;
        printf("请输入编号:\n");
        scanf("%s",books->no);
        getchar();
        printf("请输入书名:\n");
        scanf("%s",books->name);
        getchar();
        printf("请输入出版社:\n");
        scanf("%s",books->pub);
        getchar();
        printf("请输入价格:\n");
        scanf("%f",&books->price);
        ++total;
        printf("是否要继续录入?是:Y,否:N\n");*/


/*******************************************************/
/* 函数功能:显示主菜单,选择菜单                        */
/* 输入参数:无                                         */
/* 函数输出:选择的菜单序号                             */
/*******************************************************/
int menu_select()
{
   int cn=0;
   char mu[]="欢迎使用图书管理系统1.0!;1.添加新书信息;2.显示图书信息;3.查询;4.删除;5.保存;0.退出;";
   DispMenu(mu);
   while(1)
   {
      cn=getch()-'0';
      if (cn>=0&&cn<=7)
        return cn;
   }
}


/*菜单边框*/
void DispMenu(char *menu)
{
    int i,j;
    char *mu[100];
    int size=0,maxlen=0;

    char *start=menu;
    char *end=strchr(start,';');

    while(end!=NULL)
    {
        *end='\0';
        mu[size]=(char*)malloc(end-start+1);
        strcpy(mu[size],start);
        maxlen=(maxlen<end-start)?end-start:maxlen;
        start=end+1;
        end =strchr(start,';');
        size++;
    }
    maxlen=(maxlen+1)/2*2;

    printf("\n%s","┏");
    for(i=0;i<maxlen/2;i++) printf("%s","━");
    printf("%s\n","┓");

    for(i=0;i<size;i++)
    {
       printf("%s","┃");
       for(j=0;j<maxlen;j++)
       {
            if(j<strlen(mu[i]))
                printf("%c",*(mu[i]+j));
            else
                printf("%c",' ');
       }
       printf("%s","┃\n");
    }
    printf("%s","┗");
    for(i=0;i<maxlen/2;i++) printf("%s","━");
    printf("%s\n","┛");

    printf("请选择将要进行的操作:\n");
}

/*******************************************************/
/* 函数功能:将图书信息保存到文件中                     */
/* 输入参数:链表头指针                                 */
/* 函数输出:无                                         */
/*******************************************************/
void saveBooks(BOOK books[],int total)
{
    FILE *fp;
    int i;
    if((fp=fopen("F:\\library.txt","w"))==NULL)
    {
        printf("Faliure to open library.txt!\n");
        exit(0);
    }
    for(i=0;i<total;i++)
    {
        fprintf(fp,"%s\t%s\t%s\t%f\n",books[i].no,books[i].name,books[i].pub,books[i].price);
    }
    fclose(fp);
}

/*****************************************************************************/
/* 函数功能:从文件中读入数据,创建Books数组                                   */
/* 输入参数:head:main函数中Books数组的首地址(亦即main函数中Books数组名的值)*/
/* 函数输出:Books数组的长度                                                  */
/*****************************************************************************/
int load(BOOK books[])
{
    FILE *fp;
    int i;
    if((fp=fopen("F:\\library.txt","r"))==NULL)
    {
        printf("Faliure to open library.txt!\n");
        exit(0);
    }
    for(i=0;!feof(fp);i++)
    {
        fscanf(fp,"%s%s%s%f",books[i].no,books[i].name,books[i].pub,&books[i].price);
    }
    fclose(fp);
    return i;
}

//*****************************************************************************
// 函数功能:添加一本新书
// 输入参数:head:main函数中Books数组的首地址(亦即main函数中Books数组名的值)
//          total:Books数组中已存书的数量
// 函数输出:无
// 函数设计:1、先判断Books数组中是否还有空余空间,否,输出提示信息并退出,否则,total指向的变量值+1,
//             然后继续执行以下步骤
//          2、用malloc函数创建一个Book变量用于保存需要添加的新书信息,并将该变量的地址(即malloc的返回值,
//             用malloc创建的变量没有变量名,只有该变量的首地址)保存到Books数组中,
//          3、从键盘上输入添加的新书信息并保存到新创建的Book变量中
//*****************************************************************************
int addBook(BOOK books[],int total)
{
    if(total>TOTAL)
    {
        printf("数目已超过上限,无法继续添加图书!\n");
        return;
    }
    printf("添加一本新书:\n");
    printf("请输入编号:\n");
    scanf("%s",books[total].no);
    getchar();
    printf("请输入书名:\n");
    scanf("%s",books[total].name);
    getchar();
    printf("请输入出版社:\n");
    scanf("%s",books[total].pub);
    getchar();
    printf("请输入价格:\n");
    scanf("%f",&books[total].price);
    total++;
    system("cls");
    printf("添加图书信息成功!\n");
    return total;
}

//*****************************************************************************
// 函数功能:在屏幕上显示所有图书的信息
// 输入参数:head:main函数中Books数组的首地址(亦即main函数中Books数组名的值)
//          total:Books数组中已存书的数量
// 函数输出:无
//************************************************************************/
void displayBook(BOOK books[],int total)
{
    int i;
    printf("所有图书信息:\n");
    printf("编号\t书名\t出版社\t价格\n");
    for(i=0;i<total;i++)
    {
        printf("%s\t%s\t%s\t%f\n",books[i].no,books[i].name,books[i].pub,books[i].price);
    }
}


//*****************************************************************************
// 函数功能:给定图书名称,查找并显示该书的相关信息
// 输入参数:head:main函数中Books数组的首地址(亦即main函数中Books数组名的值)
//          total:Books数组中已存书的数量
// 函数输出:无
//************************************************************************/
void searchBook(BOOK books[], int total)
{
    int i;
    char name[20];
    printf("按照书名查询相关信息:\n");
    scanf("%s",name);
    for(i=0;i<total;i++)
    {
        if(strcmp(name,books[i].name)==0)
        {
            printf("编号\t书名\t出版社\t价格\n");
            printf("%s\t%s\t%s\t%f\n",books[i].no,books[i].name,books[i].pub,books[i].price);
            return;
        }
    }
}

//*****************************************************************************
// 函数功能:给定图书名称,删除该本图书的信息
// 输入参数:head:main函数中Books数组的首地址(亦即main函数中Books数组名的值)
//           total:Books数组中已存书的数量
// 函数输出:无
// 函数设计:1、从键盘上输入需要删除的图书名称
//           2、依次查找Books数组中每个元素所指向的Book变量,检查其中保存的图书名称是否需要删除的图书
//              名称相同,是,执行以下步骤
//           3、用malloc函数创建一个Book变量用于保存需要添加的新书信息,并将该变量的地址(即malloc的返回值,
//              用malloc创建的变量没有变量名,只有该变量的首地址)保存到Books数组中
//           3、从键盘上输入添加的新书信息并保存到新创建的Book变量中
//*****************************************************************************
void delBook(BOOK books[],int total)
{
    char bookname[20];
    int n,m,choose;
    printf("请输入想要删除的图书名称:\n");
    scanf("%s",bookname);
    for(n=0;n<total;n++)
    {
        if(strcmp(bookname,books[n].name)==0)
        {
            printf("编号\t书名\t出版社\t价格\n");
            printf("%s\t%s\t%s\t%f\n",books[n].no,books[n].name,books[n].pub,books[n].price);
            printf("请再次确认是否要删除以上信息:\n");
            printf("1:确认删除\n");
            printf("2:放弃删除\n");
            scanf("%d",&choose);
            switch(choose)
            {
            case 1:
                for(m=n;m<total-1;m++)
                {
                    books[m]=books[m+1];
                }
                total--;
                break;#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define TOTAL 100

typedef struct Book
{
   char no[10];     /*编号*/
   char name[20];   /*书名*/
   char pub[20];    /*出版社*/
   float price;     /*价格*/
}BOOK;

int load(BOOK books[]);
//int input(BOOK *books,int total);
int addBook(BOOK books[],int total);
void displayBook(BOOK books[],int total);
void delBook(BOOK books[],int total);
void saveBooks(BOOK books[],int total);
void searchBook(BOOK books[],int total);
void DispMenu(char *menu);

/****************************************************************************/
/* 函数功能:主程序,显示主菜单,根据用户的选择调用相应的函数完成各自的功能    */
/* 输入参数:无                                                              */
/* 函数输出:选择的菜单序号                                                  */
/****************************************************************************/
void main(void)
{
    BOOK books[TOTAL];       /* Books数组用于保存所有的图书 */
    int count=0;
    //printf("欢迎使用图书管理系统1.0!请先录入基本图书信息:\n");
    //count=input(books,count);
    //saveBooks(books,count);
    count=load(books);
    while(1)
    {
        switch(menu_select())
        {
        case 1:
            count=addBook(books,count);
            break;
        case 2:
            displayBook(books,count);
            break;
        case 3:
            searchBook(books,count);
            break;
        case 4:
            delBook(books,count);
            break;
        case 5:
            saveBooks(books,count);
            break;
        case 0:
            printf("谢谢使用!\n");
            return;
        }
   }
}

/*录入图书信息
int input(BOOK *books,int total)
{
    int n,i;
    while(1)
    {
        char ch;
        printf("请输入编号:\n");
        scanf("%s",books->no);
        getchar();
        printf("请输入书名:\n");
        scanf("%s",books->name);
        getchar();
        printf("请输入出版社:\n");
        scanf("%s",books->pub);
        getchar();
        printf("请输入价格:\n");
        scanf("%f",&books->price);
        ++total;
        printf("是否要继续录入?是:Y,否:N\n");*/


/*******************************************************/
/* 函数功能:显示主菜单,选择菜单                        */
/* 输入参数:无                                         */
/* 函数输出:选择的菜单序号                             */
/*******************************************************/
int menu_select()
{
   int cn=0;
   char mu[]="欢迎使用图书管理系统1.0!;1.添加新书信息;2.显示图书信息;3.查询;4.删除;5.保存;0.退出;";
   DispMenu(mu);
   while(1)
   {
      cn=getch()-'0';
      if (cn>=0&&cn<=7)
        return cn;
   }
}


/*菜单边框*/
void DispMenu(char *menu)
{
    int i,j;
    char *mu[100];
    int size=0,maxlen=0;

    char *start=menu;
    char *end=strchr(start,';');

    while(end!=NULL)
    {
        *end='\0';
        mu[size]=(char*)malloc(end-start+1);
        strcpy(mu[size],start);
        maxlen=(maxlen<end-start)?end-start:maxlen;
        start=end+1;
        end =strchr(start,';');
        size++;
    }
    maxlen=(maxlen+1)/2*2;

    printf("\n%s","┏");
    for(i=0;i<maxlen/2;i++) printf("%s","━");
    printf("%s\n","┓");

    for(i=0;i<size;i++)
    {
       printf("%s","┃");
       for(j=0;j<maxlen;j++)
       {
            if(j<strlen(mu[i]))
                printf("%c",*(mu[i]+j));
            else
                printf("%c",' ');
       }
       printf("%s","┃\n");
    }
    printf("%s","┗");
    for(i=0;i<maxlen/2;i++) printf("%s","━");
    printf("%s\n","┛");

    printf("请选择将要进行的操作:\n");
}

/*******************************************************/
/* 函数功能:将图书信息保存到文件中                     */
/* 输入参数:链表头指针                                 */
/* 函数输出:无                                         */
/*******************************************************/
void saveBooks(BOOK books[],int total)
{
    FILE *fp;
    int i;
    if((fp=fopen("F:\\library.txt","w"))==NULL)
    {
        printf("Faliure to open library.txt!\n");
        exit(0);
    }
    for(i=0;i<total;i++)
    {
        fprintf(fp,"%s\t%s\t%s\t%f\n",books[i].no,books[i].name,books[i].pub,books[i].price);
    }
    fclose(fp);
}

/*****************************************************************************/
/* 函数功能:从文件中读入数据,创建Books数组                                   */
/* 输入参数:head:main函数中Books数组的首地址(亦即main函数中Books数组名的值)*/
/* 函数输出:Books数组的长度                                                  */
/*****************************************************************************/
int load(BOOK books[])
{
    FILE *fp;
    int i;
    if((fp=fopen("F:\\library.txt","r"))==NULL)
    {
        printf("Faliure to open library.txt!\n");
        exit(0);
    }
    for(i=0;!feof(fp);i++)
    {
        fscanf(fp,"%s%s%s%f",books[i].no,books[i].name,books[i].pub,&books[i].price);
    }
    fclose(fp);
    return i;
}

//*****************************************************************************
// 函数功能:添加一本新书
// 输入参数:head:main函数中Books数组的首地址(亦即main函数中Books数组名的值)
//          total:Books数组中已存书的数量
// 函数输出:无
// 函数设计:1、先判断Books数组中是否还有空余空间,否,输出提示信息并退出,否则,total指向的变量值+1,
//             然后继续执行以下步骤
//          2、用malloc函数创建一个Book变量用于保存需要添加的新书信息,并将该变量的地址(即malloc的返回值,
//             用malloc创建的变量没有变量名,只有该变量的首地址)保存到Books数组中,
//          3、从键盘上输入添加的新书信息并保存到新创建的Book变量中
//*****************************************************************************
int addBook(BOOK books[],int total)
{
    if(total>TOTAL)
    {
        printf("数目已超过上限,无法继续添加图书!\n");
        return;
    }
    printf("添加一本新书:\n");
    printf("请输入编号:\n");
    scanf("%s",books[total].no);
    getchar();
    printf("请输入书名:\n");
    scanf("%s",books[total].name);
    getchar();
    printf("请输入出版社:\n");
    scanf("%s",books[total].pub);
    getchar();
    printf("请输入价格:\n");
    scanf("%f",&books[total].price);
    total++;
    system("cls");
    printf("添加图书信息成功!\n");
    return total;
}

//*****************************************************************************
// 函数功能:在屏幕上显示所有图书的信息
// 输入参数:head:main函数中Books数组的首地址(亦即main函数中Books数组名的值)
//          total:Books数组中已存书的数量
// 函数输出:无
//************************************************************************/
void displayBook(BOOK books[],int total)
{
    int i;
    printf("所有图书信息:\n");
    printf("编号\t书名\t出版社\t价格\n");
    for(i=0;i<total;i++)
    {
        printf("%s\t%s\t%s\t%f\n",books[i].no,books[i].name,books[i].pub,books[i].price);
    }
}


//*****************************************************************************
// 函数功能:给定图书名称,查找并显示该书的相关信息
// 输入参数:head:main函数中Books数组的首地址(亦即main函数中Books数组名的值)
//          total:Books数组中已存书的数量
// 函数输出:无
//************************************************************************/
void searchBook(BOOK books[], int total)
{
    int i;
    char name[20];
    printf("按照书名查询相关信息:\n");
    scanf("%s",name);
    for(i=0;i<total;i++)
    {
        if(strcmp(name,books[i].name)==0)
        {
            printf("编号\t书名\t出版社\t价格\n");
            printf("%s\t%s\t%s\t%f\n",books[i].no,books[i].name,books[i].pub,books[i].price);
            return;
        }
    }
}

//*****************************************************************************
// 函数功能:给定图书名称,删除该本图书的信息
// 输入参数:head:main函数中Books数组的首地址(亦即main函数中Books数组名的值)
//           total:Books数组中已存书的数量
// 函数输出:无
// 函数设计:1、从键盘上输入需要删除的图书名称
//           2、依次查找Books数组中每个元素所指向的Book变量,检查其中保存的图书名称是否需要删除的图书
//              名称相同,是,执行以下步骤
//           3、用malloc函数创建一个Book变量用于保存需要添加的新书信息,并将该变量的地址(即malloc的返回值,
//              用malloc创建的变量没有变量名,只有该变量的首地址)保存到Books数组中
//           3、从键盘上输入添加的新书信息并保存到新创建的Book变量中
//*****************************************************************************
void delBook(BOOK books[],int total)
{
    char bookname[20];
    int n,m,choose;
    printf("请输入想要删除的图书名称:\n");
    scanf("%s",bookname);
    for(n=0;n<total;n++)
    {
        if(strcmp(bookname,books[n].name)==0)
        {
            printf("编号\t书名\t出版社\t价格\n");
            printf("%s\t%s\t%s\t%f\n",books[n].no,books[n].name,books[n].pub,books[n].price);
            printf("请再次确认是否要删除以上信息:\n");
            printf("1:确认删除\n");
            printf("2:放弃删除\n");
            scanf("%d",&choose);
            switch(choose)
            {
            case 1:
                for(m=n;m<total-1;m++)
                {
                    books[m]=books[m+1];
                }
                total--;
                break;
            case 2:
                system("cls");
                break;
            default:
                printf("输入有误,请重新输入!\n");
                break;
            }
        }
    }
    return total;
}

            case 2:
                system("cls");
                break;
            default:
                printf("输入有误,请重新输入!\n");
                break;
            }
        }
    }
    return total;
}