//-----------------------------------------------------------------------------------------------------------------------------------------//
//-----------------------------------------------------------------------------------------------------------------------------------------//
#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <fstream.h>
#include <string.h>
#include <conio.h>
#pragma comment(lib,"winmm.lib")
#define NULL 0
#define LEN sizeof(struct books)/*定义结构体books的长度为LEN*/
#define FILENAME "workers.db"/*定义数据库文件名为books.db*/
int a=0,i;/*全局参数变量*/
void Cover() ;
struct books/*建立结构体*/
{
    int id;/*书号*/
    char title[100];/*书名*/
    char press[100];/*出版社*/
    char date[100];/*借出日期*/
    char level[100];/*借出期限*/
    char deposit[100];/*押金*/
    char IC[100];/*会员号*/
    char call[100];/*联系电话*/
    struct books *next;/*建立单向链表*/
};
struct books *head,*p,*p1;/*建立指针结构体*/
void output(struct books *px)/*将输出信息分类,方便调用*/
{
    printf ("书号:%d\n书名:%s\n出版社:%s\n借出日期:%s\n借出期限:%s\n押金:%s\n会员号:%s\n联系电话电话:%s\n",px->id,px->title,px->press,px->date,px->level,px->deposit,px->IC,px->call);
}
void input(int n,struct books *px)/*将输入档案分类,方便调用*/
{
    switch(n)
    {
        case 1:
loop1:
        printf ("请输入书号:");
        scanf ("%d",&px->id);        
        if (px->id==0)
        { 
            printf ("书号不能为0!\n");
            goto loop1;
        }
        break;
         case 2:printf ("请输入书名:");scanf ("%s",&px->title);break;
         case 3:printf ("请输入出版社:");scanf ("%s",&px->press);break;
         case 4:printf ("请输入借出日期:");scanf ("%s",&px->date);break;
         case 5:printf ("请输入借出期限:");scanf ("%s",&px->level);break;
         case 6:printf ("请输入押金:");scanf ("%s",&px->deposit);break;
         case 7:printf ("请输入身份证号:");scanf ("%s",&px->IC);break;
         case 8:printf ("请输入联系电话:");scanf ("%s",&px->call);break;    
         default:printf ("ERROR");
    }
}
int menu()/*程序主菜单*/
{   int menu;
    printf ("          ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
    printf ("          ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
    printf ("          ◆◆                         主菜单                     ◆◆\n");
    printf ("          ◆◆       1.查看书籍档案             2.创建书籍档案    ◆◆\n");       
    printf ("          ◆◆       3.修改书籍档案             4.删除书籍档案    ◆◆\n");      
    printf ("          ◆◆       5.保存档案文件             0.退 出  程 序    ◆◆\n");    
    printf ("                           请选择要进入的模块编号:");
loop2:
    menu=getch();
    if (menu<48||menu>54)
    goto loop2;/*ASCII表中48相当于0,54相当于6。只有当用户输入规定的数字时程序才会执行,否则不显示任何信息*/
    printf ("%c\n",menu);
    return menu-48;
}
struct books *creat(void)/*利用链表创建一个书籍档案,程序核心*/
{
       int n;    
       if (a==0)
    {
        p=p1=(struct books *)malloc(LEN);/*开辟一个新内存单元*/
        for (n=1;n<=8;n++)input(n,p);
        head=p;
        head->next=NULL;
        a=a+1;
    }
       else
    {
        for (n=1;n<=8;n++)input(n,p);        
        p1->next=p;
    }
    p1=p;
    p=(struct books *)malloc(LEN);
    p->next=NULL;
    printf ("书籍档案创建成功!\n");
    return(head);
};
void del()/*删除一个档案*/
{
    int id;
    printf ("请输入需要删除的书籍的书号:");
    scanf("%d",&id);
    if (head==NULL)
    {
        printf ("没有任何可供删除的档案\n");
        goto end;
    }
    p=head;
    while (id!=p->id&&p->next!=NULL)/*根据链表查找档案*/
    {
        p1=p;
        p=p->next;
    }
    if (id==p->id)
    {
        if (p==head)head=p->next;
        else p1->next=p->next;
        printf ("该书籍档案已成功删除\n");
        a=a-1;
    }
    else printf ("找不到该档案\n");
      end:;
}
int viewfile()/*浏览所有书籍档案*/
{
    struct books *p2;
    p2=head;
    if (head==NULL)
    {
        printf ("档案为空。");
        return 0;
    }
    if (head!=NULL)
      do{   output(p2);
            printf ("\n");            
            p2=p2->next;
        }while (p2!=NULL);
}
int searchid()/*根据书号查找档案*/
{
    int id;
    struct books *p4;
    printf ("请输入需要查找的书籍的书号:");
    scanf("%d",&id);
    if (head==NULL)
    {
        printf ("没有任何可用的档案\n");
        return 1;
    }
    p4=head;
    while (id!=p4->id&&p4->next!=NULL)
    {
        p4=p4->next;
    }
    if (id==p4->id)output(p4);
    else printf ("找不到该档案\n");
    return 1;
}
void sortid(int id)/*根据书号排序...此能暂时还未完成*/
{
}
int modifyfile()/*修改一个档案*/
{
    int id,b;
    struct books *p3;
    printf ("请输入需要修改的书籍的书号:");
    scanf("%d",&id);
    if (head==NULL)
    {
        printf ("没有任何可供修改的档案\n按任意键返回主菜单...");
        getch();
        return 0;;
    }
    p3=head;
    while (id!=p3->id&&p3->next!=NULL)
    {
        p1=p3;
        p3=p3->next;
    }
    if (id==p3->id)
    {
        printf ("该书籍档案已找到:\n");
        output(p3);
        printf ("请输入修改后的信息:\n");
        for (b=1;b<=8;b++)input(b,p3);
        Sleep(20);
        printf ("档案保存中......\n修改后的档案已保存...\n按任意键返回主菜单...");
        b=getch();
        return 0;
    }
}
int view()/*主菜单--〉查看书籍档案*/
{
    int c;
    char name[100];
    int id;
start:
      system ("cls");
      system ("color 4e");
      {   printf("-------------------------------------------------------------------------------");
          printf("---------------------------------------------------------------------------------");
          printf("\n\nЖЖЖЖЖЖ 欢 迎 进 入 图 书 管 理 系 统 这 里 有 你 它 更 精 彩 ЖЖЖЖЖЖ\n\n");
          printf("                                ◆主  菜  单◆                      \n\n");
          printf("                                查看书籍资料:\n\n                             1.浏览全部书籍档案\n\n                             2.根据书号查询\n\n                             0.返回主菜单\n\n  请选择你要进入的编号:");
      }
loop3:
      c=getch();
      if (c<48||c>53)goto loop3;/*只有当用户输入规定的数字时程序才会执行,否则不显示任何信息,有效避免误操作导致溢出*/
      printf ("%c\n",c);
    switch(c-48)
    {
    case 0:return 0;break;
    case 1:
        {
            viewfile();
            printf ("\n\n按任意键返回...");
            getch();
            goto start;
        }
    case 2:
        {
            searchid();
            printf ("\n\n按任意键返回...");
            getch();
            goto start;
        }
    }
    exit (0);
}    
int savefile(void)/*保存文件*/
{
    FILE *fp;
    struct books *p5;
    int i=0;
    printf("\n\n\n\n");
    printf("********** 保存文………**********\n");
    p5=head;
    if((fp=fopen(FILENAME,"wb"))==NULL)
    {
        printf("不能打开文件\n");
        return 0;
    }
  do{
        if(fwrite(p5,LEN,1,fp)!=1)
        {
            printf("文件写入错误!\n");
            return 0;
        }
        p5=p5->next;
    }while(p5!=NULL);
    fclose(fp);
    printf("\n\n\n\n");
    printf("********** 保存文件成功!!!!**********\n");
    return 1;
}
int loadfile(void)/*默认载入档案文件*/
{
    FILE *fp;    
    int n=0;
    while((fp=fopen(FILENAME,"rb"))==NULL)return 0;/*如果打开失败则返回0*/
    do
    {    
        if (a==0)p=p1=(struct books *)malloc(LEN);/*开辟一个新内存单元*/
        if(fread(p,LEN,1,fp)!=1)break;
        if (a==0)
        {            
            head=p;
            head->next=NULL;
            a=a+1;
        }
        else
        {
            p1->next=p;
        }
        p1=p;
        p=(struct books *)malloc(LEN);
        p->next=NULL;
    }while (p!=NULL);
       printf ("\n\n\n                              书籍资料打开成功!!!\n");
       system("color 4e");
       fclose(fp);
       return 1;
}
void main()/*主程序代码*/
{   printf("》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");
    printf("《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《");
    int quit;
    head=NULL;
    a=loadfile();/*打开数据文件*/
    if (a==1)
    {   
        printf ("\n\n                              按任意键进入主菜单...");
        getch();
    }

loop:
    { system ("cls");  
      system("color 4e");
    }
{  system ("color 2e");
   Sleep(20);
    char online[]={"\n\n\n\n\n\n\n\n                  正 在 进 入 图 书 管 理 系 统 请 稍 等……\n"};
    char bar[]={"...."};
  int i,j,k=0,x=12,y=12;   
    for(i=0;i<=strlen(online)/3.4;)
  {
    system("cls");
    if(k==4)
        i++;
    cout<<endl;
    for(j=0;j<(75-strlen(online))/2;j++)/*行坐标定位*/
        cout<<" ";
    cout<<online; /*输出线条*/
    cout<<endl;
    for(j=0;j<(65-strlen(bar))/2;j++)
    cout<<" ";
    cout<<(i+4)*4<< " % Loading";
    cout.write(bar,k);
    cout<<endl;
    for(j=0;j<10;j++)
        cout<<endl;
    for(j=0;j<24;j++)
        cout<<" ";
    for(j=0;j<24;j++)
        cout<<" ";
    cout<<endl;
    for(j=0;j<10000000;j++);//延时效果
    k++;
    if(k>4)
        k=0;}
}
     system("cls");
     system("color 1c");
     printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
     printf("★★★★★★★★★★∵∵∵∵∵∵∵∵∵∵∵∵∵∵∵∵∵∵∵∵★★★★★★★★★★\n             Copyright ? 2011.12 25-4-10 Tencent.All Rights Reserved                           \n                             (此程序仅供学习使用)\n\n"); 
     printf ("                              制 作 团 队:25-4-10\n\n");
  switch(menu())
    {
        case 0:
        printf ("\n\n         您确定要退出程序吗?(Y/N)");
confirm:
        quit=getch();
        if (quit=='y'||quit=='Y')/*只有当用户输入y时程序退出*/
        {
            printf ("Y\n");
            exit (0);
        }
        if (quit=='n'||quit=='N')/*只有当用户输入n时,返回主菜单*/
        goto loop;
    case 1:
        view();
        getch();
        break;
    case 2:
        printf ("\n     正在创建书籍档案...\n");
        creat();
        printf ("\n     按任意键返回...");
        getch();
        break;
    case 3:
        modifyfile();
        break;
    case 4:
        del();
        printf ("\n     按任意键返回...");
        getch();
        break;
    case 5:
        savefile();
        printf ("\n     按任意键返回...");
        system ("pause");
        break;
    }
    goto loop;        
}




//-----------------------------------------------------------------------------------------------------------------------------------------//
//-----------------------------------------------------------------------------------------------------------------------------------------//