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

typedef struct
{
	int year;      //年
	int month;    //月
	int day;      //日
} Date;

typedef struct
{
	char bookname[40];        //图书名
	char isbn[20];          //ISBN号
	char bookid[20];          //书号
	Date publishdate;        //出版日期
	char publisher[20];     //出版社
	char authors[40];       //作者
	float price;         //价格
} Book;

typedef struct{
    int current;
    Book book[100];
}mlibrary;
mlibrary library;//存储图书信息
Book book[100];
int current = 0;

//int total = 0;

int insert()//录入图书函数
{
    system("cls");
    if(current>=100)
    {
        printf("录入的数据已满,不再录入\n");
        return 0;
    }
    printf("请输入图书名称:\t");
    scanf("%s",book[current].bookname);
    //gets(book[current].book_name);
    printf("请输入作者名字:\t");
    //gets("%s",book[current].authors);//
    scanf("%s",book[current].authors);
    printf("请输入出版日期(格式:年-月-日):\t");
    scanf("%4d-%2d-%2d",&book[current].publishdate.year,&book[current].publishdate.month,&book[current].publishdate.day);
    printf("请输入出版社:");
    scanf("%s",book[current].publisher);
    printf("请输入书号:\t");
    scanf("%s",book[current].bookid);
    printf("请输入ISBN号:\t");
    scanf("%s",book[current].isbn);
    printf("请输入价格¥:\t");
    scanf("%f",&book[current].price);
    printf("录入成功!\n");
    current++;
    return 0;
}

void list()//列出所有图书信息
{
    int j;
    printf("当前一共有%d本书\n",current);
    printf("       书名   作者  出版日期   出版社   书号     ISBN号   价格\n");
    for(j = 0;j<current;j++)
    {
        printf("%10s",book[j].bookname);
        printf("%7s",book[j].authors);
        printf("%6d-%d-%d",book[j].publishdate.year,book[j].publishdate.month,book[j].publishdate.day);
        printf("%8s",book[j].publisher);
        printf("%8s",book[j].bookid);
        printf("%8s",book[j].isbn);
        printf("       ¥:%f    ",book[j].price);
        printf("\n");
    }
}

int query()//查询图书函数
{
    char choice;
    char name[40];
    char authors[40];
    char publisher[20];
    char isbn[20];
    char bookid[20];

    int i;
	//显示程序基本信息
	//printf("        请选择查询关键字\n");

	while(1)
	{
		printf("\n");
		printf("                   请选择查询关键字\n");
		printf("                1:按图书名\n");
		printf("                2:按图书作者\n");
		printf("                3:按出版社\n");
		printf("                4:按ISBN号\n");
		printf("                5:按图书号\n");

		printf("\n");

		printf("        请选择:");
		fflush(stdin);
		choice = getch();
		printf("\n\n");

		switch(choice)
		{
			case '1':
				//insert();
                system("cls");
				printf("请输入您要查询的书的名字:\t");
				fflush(stdin);
				gets(name);

				for(i=0;i<current;i++)
				{
				    if( strcmp(book[i].bookname,name) == 0  )
				    {
				        //输出第i本书的信息。
				        printf("已找到该书。\n");
				        printf("       书名   作者  出版日期   出版社   书号     ISBN号   价格\n");
				        printf("%10s",book[i].bookname);
                        printf("%7s",book[i].authors);
                        printf("%6d-%d-%d",book[i].publishdate.year,book[i].publishdate.month,book[i].publishdate.day);
                        printf("%8s",book[i].publisher);
                        printf("%8s",book[i].bookid);
                        printf("%8s",book[i].isbn);
                        printf("       ¥:%f    ",book[i].price);
                        printf("\n");
                        return 1;
				    }
				}
				printf("无该书\n");
				return 0;
				break;

			case '2':
                system("cls");
                printf("请输入您要查询的作者名字:\t");
				fflush(stdin);
				gets(authors);

				for(i=0;i<current;i++)
				{
				    if( strcmp(book[i].authors,authors) == 0  )
				    {
				        //输出第i本书的信息。
				        printf("已找到该书。\n");
				        printf("       书名   作者  出版日期   出版社   书号     ISBN号   价格\n");
				        printf("%10s",book[i].bookname);
                        printf("%7s",book[i].authors);
                        printf("%6d-%d-%d",book[i].publishdate.year,book[i].publishdate.month,book[i].publishdate.day);
                        printf("%8s",book[i].publisher);
                        printf("%8s",book[i].bookid);
                        printf("%8s",book[i].isbn);
                        printf("       ¥:%f    ",book[i].price);
                        printf("\n");
                        return 1;
				    }
				}
				printf("无该书\n");
				return 0;

		 		break;
			case '3':
                system("cls");
                printf("请输入您要查询的出版社:\t\n");
				fflush(stdin);
				gets(publisher);

				for(i=0;i<current;i++)
				{
				    if( strcmp(book[i].publisher,publisher) == 0  )
				    {
				        //输出第i本书的信息。
				        printf("已找到该书。\n");
				        printf("       书名   作者  出版日期   出版社   书号     ISBN号   价格\n");
				        printf("%10s",book[i].bookname);
                        printf("%7s",book[i].authors);
                        printf("%6d-%d-%d",book[i].publishdate.year,book[i].publishdate.month,book[i].publishdate.day);
                        printf("%8s",book[i].publisher);
                        printf("%8s",book[i].bookid);
                        printf("%8s",book[i].isbn);
                        printf("       ¥:%f    ",book[i].price);
                        printf("\n");
                        return 1;
				    }
				}
				printf("无该书\n");
				return 0;
        case '4':
                system("cls");
                printf("请输入您要查询的ISBN号查询:\t\n");
				fflush(stdin);
				gets(isbn);

				for(i=0;i<current;i++)
				{
				    if( strcmp(book[i].isbn,isbn) == 0  )
				    {
				        //输出第i本书的信息。
				        printf("已找到该书。\n");
				        printf("       书名   作者  出版日期   出版社   书号     ISBN号   价格\n");
				        printf("%10s",book[i].bookname);
                        printf("%7s",book[i].authors);
                        printf("%6d-%d-%d",book[i].publishdate.year,book[i].publishdate.month,book[i].publishdate.day);
                        printf("%8s",book[i].publisher);
                        printf("%8s",book[i].bookid);
                        printf("%8s",book[i].isbn);
                        printf("       ¥:%f    ",book[i].price);
                        printf("\n");
                        return 1;
				    }
				}
				printf("无该书\n");
				return 0;

		 		break;
        case '5':
                system("cls");
                printf("请输入您要查询的图书号:\t\n");
				fflush(stdin);
				gets(bookid);

				for(i=0;i<current;i++)
				{
				    if( strcmp(book[i].bookid,bookid) == 0  )
				    {
				        //输出第i本书的信息。
				        printf("已找到该书。\n");
				        printf("       书名   作者  出版日期   出版社   书号     ISBN号   价格\n");
				        printf("%10s",book[i].bookname);
                        printf("%7s",book[i].authors);
                        printf("%6d-%d-%d",book[i].publishdate.year,book[i].publishdate.month,book[i].publishdate.day);
                        printf("%8s",book[i].publisher);
                        printf("%8s",book[i].bookid);
                        printf("%8s",book[i].isbn);
                        printf("       ¥:%f    ",book[i].price);
                        printf("\n");
                        return 1;
				    }
				}
				printf("无该书\n");
				return 0;

		 		break;


			default:
				printf("非法选择,请重新选择\n");
		}
	}


	return 0;    //程序返回

}

int update()//修改图书信息
{
    int n;
    char name[40];
    printf("请输入需要修改的图书名称:\t");
    gets (name);
    fflush(stdin);
    for (n=0;n<=current;n++)
    {
        if(strcmp(book[n].bookname,name) ==0);     //判断是否修改的名字相同
        {
        printf("请输入新的图书名称:\t");
        scanf("%s",book[n].bookname);
        printf("请输入新的作者名字:\t");
        scanf("%s",book[n].authors);
        printf("请输入新的出版日期(格式:年-月-日):\t");
        scanf("%4d-%2d-%2d",&book[n].publishdate.year,&book[n].publishdate.month,&book[n].publishdate.day);
        printf("请输入新的出版社:\t");
        scanf("%s",book[n].publisher);
        printf("请输入新的书号:\t");
        scanf("%s",book[n].bookid);
        printf("请输入新的ISBN号:\t");
        scanf("%s",book[n].isbn);
        printf("请输入新的价格¥:\t");
        scanf("%f",&book[n].price);
        printf ("修改成功!\n");
        return 0;
        }
    }
    printf("该图书不存在。\n");
}


void del()//删除图书
{
        int i=0;
        system("cls");
        char bookname[40];
        printf("请输入您要删除的书的名字:");
        fflush(stdin);
        gets(bookname);

        for( i=0;i<current;i++)
            {
                if( strcmp(book[i].bookname,bookname) == 0  )
                {
				        //删除第i本书的信息。


				        int j;
				        for(j=i+1;j<current;j++)
				        {
				            book[j-1] = book[j];
				        }

				        current--;
				        printf("已删除该书。\n");

                        break;
				    }
				}
				printf("无该书\n");


}


void save()//保存结构数组到文件
{
    FILE *fp;
    if((fp=fopen("CC.doc","w"))==NULL)
    {
        printf("\n不能保存图书信息\n");
        return;
    }
    fwrite(&mlibrary.current,sizeof(int),1,fp);
    fwrite(mlibrary.book,sizeof(mlibrary.book[0]),mlibrary.current,fp);
}

void load()//从文件加载图书信息到结构数组
{
    FILE*fp;
    char ch;
    if((fp=fopen("CC.doc","rt"))==NULL)
    {
        printf("\n无法读取文件");
        getch();
        exit(1);
    }
    ch=fgetc(fp);
    while(ch!=EOF)
    {
        putchar(ch);
        ch=fgetc(fp);


    }
    fclose(fp);
}




int main()
{
	char choice;

	//显示程序基本信息
	printf(" \t\t     图书信息管理系统,版本1.0,版权所有2010-2020\n");

	while(1)
	{
		printf("\n");
		printf("  \t\t 程序功能:\n");
		printf("  \t\t\t\t--------  1:录入图书信息    --------\n");
		printf("  \t\t\t\t********  2:查询图书信息    ********\n");
		printf("  \t\t\t\t********  3:修改图书信息    ********\n");
		printf("  \t\t\t\t********  4:删除图书信息    ********\n");
		printf("  \t\t\t\t********  5:列出所有图书信息********\n");
		printf("  \t\t\t\t********  6:保存图书信息    ********\n");
		printf("  \t\t\t\t********  7:加载图书信息    ********\n");
		printf("  \t\t\t\t--------   0:退出程序       --------\n");
		printf("\n");

		printf("        请选择:");
		fflush(stdin);
		choice = getch();
		printf("\n\n");

		switch(choice)
		{
			case '1':
				insert();
				break;

			case '2':
		 		query();
		 		break;

			case '3':
				update();
				break;

			case '4':
				del();
				break;

			case '5':
				list();
				break;

			case '6':
				save();
				break;

			case '7':
				load();
				break;

			case '0':
                if (book != NULL)
                {
                    free(book);
                }
				return 0;

			default:
				printf("非法选择,请重新选择\n");
		}
	}

	return 0;    //程序返回
}