教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> C >> 编程实例 >> 一个图书馆管理程序 RSS订阅
一个图书馆管理程序
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   
#include<dos.h>
#include<stdio.h>
#include<conio.h>
#define m 3       /* 定义为3阶B-树 */
#define FALSE 0
#define TRUE 1

typedef struct Booknode
{
int key;        /* 图书的书号 */
char bname[20]; /* 书名 */
char writter[20]; /* 著者 */
int left;        /* 现存量 */
int total;       /* 总存量 */
}Book;           /* 定义图书的结点 */

typedef struct BTNode
{
int keynum;    /* 定义结点的个数,即结点的大小 */
struct BTNode *parent; /* 指向双亲结点 */
Book key[m+1];    /* 图书向量,0号单元未用 */
struct BTNode *ptr[m+1];  /* 子树指针向量  */
}BTNode;        /* 定义B-树的结点  */

typedef struct Borrower
{
char number[20];  /* 借阅者的图书证号 */
int  year;
int  month;
int  day;         /* 借阅日期 */
int  deadline;
Book key;       /* 所借图书内容 */
struct Borrower *next;  /* 下个借阅者 */
}Borrower;      /* 定义借阅者的结点 */

typedef BTNode *BTree;

typedef struct seenode
{
BTNode *pt;    /* 定义找到的结点 */
int i;         /* 1...m,在结点中的关键字序号 */
int tag;       /* 1:查找成功;0:查找失败 */
}Result;        /* 定义查找结果的结点 */

int Search(BTree p,int k)      /* 在结点p中寻找关键字为k,并返回k所在的位置 */
{
int i;
for(i=1;i<=p->keynum;i++)
   if(p->key.key>k)break;
i--;
return(i);
}

Result *SearchBTree(BTree T,int k)  /* 在B-树T中寻找关键字为k,并返回查找结果 */
{
int i,found;
BTree p,q;
Result *x;
p=(BTree)malloc(sizeof(BTNode));
p=T;                                /* 先令p等于树根 */
q=(BTree)malloc(sizeof(BTNode));
q=NULL;
found=FALSE;                        /*为找之前,令found的值为假 */
i=0;
while(p->keynum!=0&&found==FALSE)
  {
   i=Search(p,k);                   /* 在p中查找关键字为k的位置 */
   if(i>0&&p->key.key==k)found=TRUE;  /* 如果找到,令found的值为真 */
   else
       {
        q=p;
        p=p->ptr;                    /* 如果还没找到,就p的子树找 */
       }
  }
x=(Result*)malloc(sizeof(Result));
if(found==TRUE){x->pt=p;x->i=i;x->tag=1;} /* 找到所找的结点 */
else {x->pt=q;x->i=i;x->tag=0;}          /* 没找到 */
return(x);
}


  BTree Newroot(BTree T,Book x,BTree ap)  /* 重新创建新的根结点 */
{
BTree Root;
int i;
Root=(BTree)malloc(sizeof(BTNode));
Root->keynum=T->keynum;
Root->parent=T->parent;
Root->ptr[0]=T->ptr[0];
Root->ptr[0]->parent=Root;
for(i=1;i<=Root->keynum;i++)
   {
    Root->key=T->key;
    Root->ptr=T->ptr;
    Root->ptr->parent=Root;
   }                            /* 获取原来树的内容 */
free(T);
T=(BTree)malloc(sizeof(BTNode));  /* 重新创建新的根结点 */
T->keynum=1;
T->key[1]=x;
T->parent=NULL;
T->ptr[0]=Root;               /* 原来根结点作为新的根结点的子树 */
T->ptr[0]->parent=T;
T->ptr[1]=ap;
T->ptr[1]->parent=T;
return(T);
}

BTree Insert(BTree q,int i,Book x,BTree ap)  /* 在q中插入关键字为x的图书 */
{
int j;
q->keynum++;
for(j=q->keynum;j>i+1;j--)
  {
   q->key[j]=q->key[j-1];
   q->ptr[j]=q->ptr[j-1];
   q->ptr[j]->parent=q;
  }
q->key[i+1]=x;
q->ptr[i+1]=ap;
q->ptr[i+1]->parent=q;
return(q);
}

  BTree split(BTree q,BTree ap) /*将结点q分裂为q和ap */
{
int i,s;
s=(m+1)/2;
ap=(BTree)malloc(sizeof(BTNode));
ap->parent=NULL;
ap->keynum=m-s;
for(i=s+1;i<=m;i++)
  ap->key[i-s]=q->key;
for(i=s;i<=m;i++)
  {
  ap->ptr[i-s]=q->ptr;
  ap->ptr[i-s]->parent=ap;
  }                            /* 分裂得到ap的内容 */
for(i=s;i<=m;i++)
  {
   /*q->key=NULL;*/
   q->ptr=NULL;
  }
q->keynum=s-1;              /* 分裂得到q的内容 */
return(ap);
}

BTree InsertBTree(BTree T,Book k) /* 在树中插入关键字为k的图书 */
{
int i,finished,s;
BTree q,ap;
Result *out;
Book x;
/*out=(Result*)malloc(sizeof(Result));*/
out=SearchBTree(T,k.key);         /*在树中查找书号为k->key的图书 */
if(out->tag==1){cprintf("\nThis book is exist!\n");getch();return(T);} /* 如果该书存在打印出“这本书已经存在” */
else{                                                   /* 否则进行插入 */
   x=k;
   ap=(BTree)malloc(sizeof(BTNode));
   ap->parent=NULL;
   ap->keynum=0;
   finished=FALSE;                        /* 还未插入前finished的值为假 */
   q=(BTree)malloc(sizeof(BTNode));
   q=out->pt;                        /* q为要插入的结点 */
   i=out->i;
   while(q->keynum!=0&&finished==FALSE) /* 只要没完成插入,就继续插入 */
      {
       q=Insert(q,i,x,ap);     /* q为插入后的结点 */
       if(q->keynum<m)finished=TRUE;  /* 插入完成 */
       else                          /* 分裂结点q */
          {
             s=(m+1)/2;
             x=q->key[s];
             ap=split(q,ap);
             q=q->parent;     /* 插入双亲结点 */
             if(q->keynum!=0)i=Search(q,x.key); /*在双亲结点q中查找x的插入位置 */
          }
      }
   if(finished==FALSE)T=Newroot(T,x,ap); /*T是空树,或根结点已分裂为结点q和ap */
   return(T);
  }
}

int display(int x,int y,BTree s,int length) /* 将B-树已凹入表形式显示出来 */
{
BTree p;
int i,j;
if(s->keynum!=0)
  {
   for(i=1;i<=s->keynum;i++)
     {
      gotoxy(x,y);
      cprintf("%3d",s->key.key);
      y+=1;
      for(j=1;j<=length;j++)
         putch(223);
      if(y==16){gotoxy(x,y);cprintf("ress any key to continue...");getch();y=1;clrscr();}
     }
   for(i=0;i<=s->keynum;i++)
     {
      p=s->ptr;
      y=display(x,y,p,length/2);
      }
  }
return y;
}

BTree Unite(BTree T,BTree p,BTree y)    /* 结点合并 */
{
BTree t,l,ap,last;
int u,v,w,j,a,finish,s,i;
Book x;
t=p->parent;
u=1+p->keynum;
if(t->keynum==0){T=y;T->parent->keynum=0;} /* 如果父亲结点为空,则将合并后的结点改为根结点 */
else
  {
  if(p->keynum!=0)v=Search(t,p->key[p->keynum].key);
  else v=Search(t,y->key[y->keynum].key);
  if(v!=0)
      {
      l=t->ptr[v-1];
      w=l->keynum;
      l->key[l->keynum+1]=t->key[v];
      l->keynum+=1;
      for(j=l->keynum+1;j<=l->keynum+p->keynum;j++)
             l->key[j]=p->key[j-l->keynum];
      l->keynum=l->keynum+p->keynum;
      for(j=w+1;j<=w+u;j++)
          {
           l->ptr[j]=y;
           y->parent=l;
           l->ptr[j]->parent=l;
          }
      for(j=v;j<t->keynum;j++)
          {
           t->key[j]=t->key[j+1];
           t->ptr[j]=t->ptr[j+1];
           t->ptr[j]->parent=t;
          }
      t->keynum-=1;
      if(l->keynum>=m)
             {
               finish=FALSE;
               ap=(BTree)malloc(sizeof(BTNode));
               ap->parent=NULL;
               ap->keynum=0;
               while(l->keynum!=0&&finish==FALSE)
                    {
                     s=(m+1)/2;
                     x=l->key[s];
                     ap=split(l,ap);
                     last=l;
                     l=l->parent;
                     if(l->keynum!=0){i=Search(l,x.key);l=Insert(l,i,x,ap);}
                     if(l->keynum<m&&l->keynum!=0){finish=TRUE;l=last;}
                    }
                if(finish==FALSE){T=Newroot(last,x,ap);l=T;}
             }

       if(t->keynum==0)T=Unite(T,t,l);
      }
  else
      {
      l=t->ptr[1];
      for(j=l->keynum+1+p->keynum;j>1+p->keynum;j--)
           {
            l->key[j]=l->key[j-1-p->keynum];
            l->ptr[j]=l->ptr[j-1-p->keynum];
            l->ptr[j]->parent=l;
           }
      l->ptr[1+p->keynum]=l->ptr[0];
      l->ptr[1+p->keynum]->parent=l;
      for(j=1;j<=p->keynum;j++)
          l->key[j]=p->key[j];
      l->key[1+p->keynum]=t->key[1];
      for(j=0;j<1+p->keynum;j++)
            {
             l->ptr[j]=y;
             y->parent=l;
             l->ptr[j]->parent=l;
            }
       l->keynum=l->keynum+1+p->keynum;
       for(j=1;j<t->keynum;j++)
         {
          t->key[j]=t->key[j+1];
          t->ptr[j]=t->ptr[j+1];
          t->ptr[j]->parent=t;
         }
       t->keynum-=1;
       if(l->keynum>=m)
             {
               finish=FALSE;
               ap=(BTree)malloc(sizeof(BTNode));
               ap->parent=NULL;
               ap->keynum=0;
               while(l->keynum!=0&&finish==FALSE)
                    {
                     s=(m+1)/2;
                     x=l->key[s];
                     ap=split(l,ap);
                     last=l;
                     l=l->parent;
                     if(l->keynum!=0){i=Search(l,x.key);l=Insert(l,i,x,ap);}
                     if(l->keynum<m&&l->keynum!=0){finish=TRUE;l=last;}
                    }
                if(finish==FALSE){T=Newroot(last,x,ap);l=T;}
             }
       if(t->keynum==0)T=Unite(T,t,l);
       else
          {
             t->ptr[0]=l;
            t->ptr[0]->parent=t;
          }
      }
  }
  return(T);
}

BTree DeleteBTree(BTree T,int k)   /* 注销无价值的图书,其书号为k */
{
Result *out;
BTree q,small,p,y;
int i,j,o;
Book x;
if(T->keynum==0){cprintf("\nNo imformation on the tree!\n");getch();return(T);}   /* 树中没有任何内容 */
else
   {
    out=SearchBTree(T,k);          /* 在树中查找书号为k的位置 */
    if(out->tag==0)                /* 找不到要找的书 */
        {
         cprintf("\nThis book is not existant!\n");
         getch();
         return(T);
        }
    else
      {
       q=(BTree)malloc(sizeof(BTNode));
       q=out->pt;                 /* q为要找的图书所在的结点 */
       i=out->i;
       if(q->ptr->keynum!=0)   /* q为非终端结点时,删除比所删书号大的最小关键字 */
          {
           small=q->ptr;
           while(small->ptr[0]->keynum!=0)
             small=small->ptr[0];
           x=small->key[1];
           T=DeleteBTree(T,small->key[1].key);
           out=SearchBTree(T,k);
           q=out->pt;
           i=out->i;
           q->key=x;
           return(T);
          }
       else
          {
           if(q->keynum>=(m+1)/2)  /* 被删关键字所在结点的关键字数目不小于 (m+1)/2的情形 */
             {
              for(j=i;j<q->keynum;j++)
                 {
                  q->key[j]=q->key[j+1];
                  q->ptr[j]=q->ptr[j+1];
                 }                /* 删除关键字及相邻指针 */
              q->ptr[q->keynum]=NULL;
             /* q->key[q->keynum]=NULL;*/
              q->keynum--;        /* 将所在结点数目减一 */
              return(T);
             }
           else
             {
              p=q->parent;
              o=Search(p,q->key.key);
              if(p->keynum==0&&q->ptr[o]->keynum==0)   /* 只有树结点的情形 */
                 {
                  for(j=i;j<q->keynum;j++)
                        {
                      q->key[j]=q->key[j+1];
                      q->ptr[j]=q->ptr[j+1];
                      q->ptr[j]->parent=q;
                     }
                  q->ptr[q->keynum]->keynum=0;       /* 删除关键字及相邻指针 */
                  q->keynum--;                  /* 将所在结点数目减一 */
                  return(T);
                 }
              else{
                  if(o<p->keynum&&p->ptr[o+1]->keynum>(m-1)/2)   /* 有右兄弟并且右兄弟关键字数目大于(m-1)/2 */
                   {
                    q->key=p->key[o+1];
                    p->key[o+1]=p->ptr[o+1]->key[1];
                    p->ptr[o+1]->ptr[0]=p->ptr[o+1]->ptr[1];      /* 将双亲结点的紧靠的关键字下移至被删结点 */
                    for(j=1;j<p->ptr[o+1]->keynum;j++)
                      {
                        p->ptr[o+1]->key[j]=p->ptr[o+1]->key[j+1];
                        p->ptr[o+1]->ptr[j]=p->ptr[o+1]->ptr[j+1];
                       }
                    p->ptr[o+1]->ptr[p->ptr[o+1]->keynum]=NULL;
                    /*p->ptr[o+1]->key[p->ptr[o+1]->keynum]=NULL;*/  /* 将右兄弟中最小关键字上移至双亲结点 */
                    p->ptr[o+1]->keynum--;
                    return(T);
                    }
             else if(o!=0&&p->ptr[o-1]->keynum>(m-1)/2)     /* 有左兄弟并且左兄弟关键字数目大于(m-1)/2 */
                   {
                    q->key=p->key[o];
                    p->key[o]=p->ptr[o-1]->key[p->ptr[o-1]->keynum]; /* 将双亲结点的紧靠的关键字下移至被删结点 */
                    p->ptr[o-1]->ptr[p->ptr[o-1]->keynum]=NULL;
                    /*p->ptr[o-1]->key[p->ptr[o-1]->keynum]=0;  */      /* 将左兄弟中最小关键字上移至双亲结点 */
                    p->ptr[o-1]->keynum--;
                    return(T);
                   }
             else if((o<p->keynum&&o>0&&p->ptr[o-1]->keynum==(m-1)/2&&p->ptr[o+1]->keynum==(m-1)/2)||(o==0&&p->ptr[o+1]->keynum==(m-1)/2))        /* 相邻兄弟结点中的关键字数目均等于(m-1)/2 */
                 {
                  for(j=i;j<q->keynum;j++)
                      {
                       q->key[j]=q->key[j+1];
                       q->ptr[j]=q->ptr[j+1];
                       q->ptr[j]->parent=q;
                      }                 /* 所在结点关键字移位 */
                  q->key[q->keynum]=p->key[o+1];    /* 双亲结点关键字下移 */
                  for(j=q->keynum+1;j<=m-1;j++)
                      {
                       q->key[j]=p->ptr[o+1]->key[j-q->keynum];
                       q->ptr[j]=p->ptr[o+1]->ptr[j-q->keynum];
                       q->ptr[j]->parent=q;
                      }
                  q->keynum=m-1;
                  q->parent=p;           /* 合并兄弟结点 */
                  for(j=o+1;j<=p->keynum;j++)
                    {
                     p->key[j]=p->key[j+1];
                     p->ptr[j]=p->ptr[j+1];
                     p->ptr[j]->parent=p;
                    }                    /* 其余兄弟结点移位 */
                   p->ptr[p->keynum]->keynum=0;
                   p->ptr[p->keynum]->parent=p;
                   y=(BTree)malloc(sizeof(BTNode));
                   y=q;
                   p->keynum--;
                   if(p->keynum<(m-1)/2)T=Unite(T,p,y); /* 若使双亲结点关键字数目小于(m-1)/2 ,进行相应处理*/
                   return(T);
                 }
           else if(o==p->keynum&&p->ptr[o-1]->keynum==(m-1)/2)   /* 没有右兄弟并且左兄弟结点关键字数目为(m-1)/2 */
                    {
                    p->ptr[o-1]->key[p->ptr[o-1]->keynum+1]=p->key[o];  /* 双亲结点关键字下移 */
                    for(j=(m+3)/2;j<=m-1;j++)
                      {
                       p->ptr[o-1]->key[j]=q->key[j-(m-1)/2];
                       p->ptr[o-1]->ptr[j]=q->ptr[j-(m-1)/2];
                       p->ptr[o-1]->parent=p;
                      }
                    p->ptr[o-1]->keynum=m-1;     /* 合并兄弟结点 */
                    p->ptr[o]=NULL;
                    y=(BTree)malloc(sizeof(BTNode));
                    y=p->ptr[o-1];
                    p->keynum--;
                    if(p->keynum<(m-1)/2)T=Unite(T,p,y); /* 若使双亲结点关键字数目小于(m-1)/2 ,进行相应处理*/
                    return(T);
                    }
                  }
             }
          }
      }
   }
}

  save_name(Borrower *head)      /* 保存借阅者的信息 */
{
  FILE *fp;
  Borrower *info;
  info=head;
  if((fp=fopen("Borrow.txt","wb+"))==NULL){cprintf("Cannot the file!\n");getch();}
  else
   while(info!=NULL)
     {
      fwrite(info,sizeof(Borrower),1,fp);
      info=info->next;
     }
fclose(fp);
}
Borrower *load_name()       /* 将借阅者信息load出来 */
{
  FILE *fp;
  Borrower *last,*info,*head;
  head=(Borrower*)malloc(sizeof(Borrower));
  if((fp=fopen("Borrow.txt","rb"))==NULL){head=NULL;cprintf("Cannot the file!\n");getch();}
  else{
      last=(Borrower*)malloc(sizeof(Borrower));
      fread(head,sizeof(Borrower),1,fp);
      last=head;
      while(!feof(fp))
       { info=(Borrower*)malloc(sizeof(Borrower));
         if(!info){
             cprintf("Out of Memory");getch();
          }
        if(1!=fread(info,sizeof(Borrower),1,fp)) break;
       last->next=info;
       last=info;
      }
     }
  fclose(fp);
  return(head);
}

  FILE *saveview(FILE *fp,BTree T)         /* 保存个结点信息 */
{
BTree p;
int i;
if(T->keynum!=0)
    {
     if(fwrite(T,sizeof(BTNode),1,fp)!=1){cprintf("file write error\n");getch();}
     for(i=0;i<=T->keynum;i++)
       {
        p=T->ptr;
        fp=saveview(fp,p);
       }
    }
return(fp);
}

void save(BTree T)          /* 保存树的信息 */
{
FILE *fp;
if((fp=fopen("B_tree.txt","wb"))==NULL){cprintf("Cannot the file!\n");getch();}
else
    fp=saveview(fp,T);
fclose(fp);
}

  BTree load()          /* 获取树的信息 */
{
FILE *fp;
BTree s,last;
int i;
if((fp=fopen("B_tree.txt","rb"))==NULL){cprintf("Cannot the file!\n");getch();}
else
   {
    s=(BTree)malloc(sizeof(BTNode));
    s->keynum=0;
    while(!feof(fp))
      {
       last=(BTree)malloc(sizeof(BTNode));
       if(!last)
           {cprintf("Out of memery!");getch();}
       if(1!=fread(last,sizeof(BTNode),1,fp))break;
       for(i=1;i<=last->keynum;i++)
         {
          s=InsertBTree(s,last->key);
         }
      }
   }
fclose(fp);
return s;
}



main()
{
  BTree T;
  int f,tag=0,i,f2,year[12]={31,28,31,30,31,30,31,31,30,31,30};
  Book k;
  char sel,no[20];
  Result *find;
  Borrower *stu,*p,*p2;
  struct date d;
  int j,l;
  char *menu[]={
             "MAIN MENU",
             "I:Insert",
             "S:Search",
             "Delete",
             "B:Borrow",
             "R:Return",
             "isplay",
             "k:reflush",
             "Load",
             "Q:exit"
            };
  T=(BTree)malloc(sizeof(BTNode));
  T->keynum=0;
  stu=(Borrower*)malloc(sizeof(Borrower));
  stu=NULL;
  textmode(BW80);
  window(1,1,80,25);
  clrscr();
  textbackground(BLACK);
  textcolor(WHITE);
  putch(218);
  for(l=1;l<15;l++)putch(196);putch(191);
  for(l=1;l<25;l++)
  for(j=1;j<=80;j++)
    putch(179);
  gotoxy(1,25);
  putch(192);
  for(l=1;l<15;l++)putch(196);putch(217);
  window(2,2,15,24);
  clrscr();
  textcolor(BLUE);
  gotoxy(2,2);
  cprintf("%s",menu[0]);
  textcolor(YELLOW);
  for(l=1;l<=9;l++)
   {
    gotoxy(2,l+3);
    cprintf("%s",menu[l]);
   }
  textcolor(WHITE);
  window(17,1,80,25);
  clrscr();
  putch(218);
  for(l=18;l<79;l++)putch(196);putch(191);
  for(l=2;l<25;l++)
    {
     gotoxy(1,l);putch(179);
     gotoxy(63,l);putch(179);
    }
  gotoxy(1,25);
  putch(192);
  for(l=18;l<79;l++)putch(196);putch(217);
  gotoxy(1,7);
  putch(195);
  for(l=18;l<79;l++)putch(196);putch(180);
  window(18,8,78,24);
  clrscr();
  while(1)
   {
    clrscr();
    sel=getch();
    switch(sel)
      {
       case 'i':
                  clrscr();
                gotoxy(1,1);cprintf("Input your insert book's key:");
                scanf("%d",&k.key);       /* 输入书号 */
                find=SearchBTree(T,k.key); /* 查找 */
                if(find->tag==1)            /* 已经存在,只将总库存量增加 */
                    {
                    gotoxy(1,2);cprintf("The book is exist!");
                    gotoxy(1,3);cprintf("The amount of this book added:");
                    scanf("%d",&f);
                    find->pt->key[find->i].total+=f;
                    find->pt->key[find->i].left+=f;
                    }
                else
                    {
                    gotoxy(1,2);cprintf("the book's name:");
                    scanf("%s",k.bname);      /* 输入书名 */
                    gotoxy(1,3);cprintf("the book's writer:");
                    scanf("%s",k.writter);    /* 输入著者 */
                    gotoxy(1,4);cprintf("the book's total:");
                    cscanf("%d",&k.total);     /* 输入总存量 */
                    k.left=k.total;
                    T=InsertBTree(T,k);
                    }
                save(T);if(stu!=NULL)save_name(stu);
                getch();
                clrscr();
                display(1,1,T,55);
                getch();
                break;
       case 's':
                clrscr();
                gotoxy(1,1);cprintf("Input your searching key:");
                cscanf("%d",&f);                  /* 输入查找图书的书号 */
                find=(Result*)malloc(sizeof(Result));
                find=SearchBTree(T,f);
                if(find->tag==1)
                    {
                    gotoxy(1,2);cprintf("the book's key   :%d",find->pt->key[find->i].key);
                    gotoxy(1,3);cprintf("the book's name  :");cputs(find->pt->key[find->i].bname);
                    gotoxy(1,4);cprintf("the book's writer:%s",find->pt->key[find->i].writter);
                    gotoxy(1,5);cprintf("the book's left  :%d",find->pt->key[find->i].left);
                    gotoxy(1,6);cprintf("the book's total :%d",find->pt->key[find->i].total);
                    }
                else {gotoxy(1,2);cprintf("The key could not been found!");}
                getch();
                getch();
                clrscr();
                if(T->keynum!=0){gotoxy(1,1);cprintf("The tree is"); display(1,2,T,55);}
                getch();
                break;
       case 'd':
                clrscr();
                cprintf("Input your deleted key:");
                cscanf("%d",&f);        /* 输入删除图书的书号 */
                T=DeleteBTree(T,f);
                if(T->keynum==0)cprintf("No Datas on the tree");
                else
                 {
                    gotoxy(1,2);cprintf("The tree is");
                    display(1,3,T,55);
                  }
                p=stu;
                if(p->key.key==f){stu=p->next;}
                while(p!=NULL)
                      {
                       p2=p;
                       p=p->next;
                       if(p->key.key==f){p2->next=p->next;free(p);}
                      }
                  save(T);save_name(stu);
                getch();
                getch();
                break;
       case 'b':
                clrscr();
                cprintf("Which book:");
                scanf("%d",&f);       /* 输入要借阅的图书 */
                find=SearchBTree(T,f);
                if(find->tag==0){gotoxy(1,2);cprintf("This book is not exist!");getch();getch();}
                else if(find->pt->key[find->i].left>0)
                        {
                         find->pt->key[find->i].left--;
                         p=(Borrower*)malloc(sizeof(Borrower));
                         gotoxy(1,2);
                         cprintf("Your Number:");
                         scanf("%s",p->number);  /* 输入图书证号 */
                         getdate(&d);
                         p->year=d.da_year;
                         p->month=d.da_mon;
                         p->day=d.da_day;
                         p->deadline=90;
                         p->key=find->pt->key[find->i];
                         p->next=NULL;
                         if(stu==NULL)stu=p;
                         else {p->next=stu->next;stu->next=p;}
                         gotoxy(1,3);cprintf("Borrow succeed!");
                         save(T);save_name(stu);getch();
                       }
                    else
                       {
                        gotoxy(1,2);
                        cprintf("The book has no left!\n");
                        getch();
                       }
                break;
       case 'r':
                clrscr();
                cprintf("The book's key:");
                scanf("%d",&f);         /* 输入归还图书的书号 */
                gotoxy(1,2);cprintf("Your number:");
                scanf("%s",no);         /* 输入图书证号 */
                p=stu;
                tag=0;
                if(strcmp(p->number,no)==0&&p->key.key==f){stu=p->next;find=SearchBTree(T,f);find->pt->key[find->i].left++;tag=1;save(T);save_name(stu);}
                else
                   {
                    while(p!=NULL)
                      {
                       p2=p;
                       p=p->next;
                       if(strcmp(p->number,no)==0&&p->key.key==f){find=SearchBTree(T,f);find->pt->key[find->i].left++;tag=1;break;}
                      }
                    if(tag==1){p2->next=p->next;free(p);save(T);save_name(stu);}
                   }          /* 注销借阅者 */
                if(tag==0){gotoxy(1,3);cprintf("The man is not exist!");getch();}
                break;
       case 'p':
                window(18,2,78,6);
                clrscr();
                cprintf("lease input your chose:");
                gotoxy(1,3);cprintf("1.Display the btree");
                gotoxy(1,4);cprintf("2.Display the borrower");
                sel=getch();
                clrscr();
                window(18,8,78,24);
                switch(sel){
                    case '1':if(T->keynum==0){gotoxy(1,1);cprintf("No Datas on the tree!");}
                           else display(1,1,T,55);
                           getch();
                           break;
                    case '2':clrscr();       /* 显示借阅者的情况 */
                           p=stu;
                           l=2;
                           if(p==NULL){cprintf("No borrower!");}
                           else{
                               gotoxy(1,1);cprintf("Number   key  bookname    writer      year mon day deadline");
                           while(p!=NULL)
                               {
                                getdate(&d);
                                f=0;
                                f2=0;
                                for(i=1;i<p->month;i++)
                                  f+=year[i-1];
                                for(i=1;i<d.da_mon;i++)
                                   f2+=year[i-1];
                                if(p->year%400==0||(p->year%4==0&&p->year%100!=0))
                                          {if(p->month>2){f+=1;f2+=1;}}
                                                f+=p->day;
                                                f2+=d.da_day;
                                           if(d.da_year!=p->year)
                                                   {
                                                    if(p->year%400==0||(p->year%4==0&&p->year%100!=0))f=366-f;
                                                    for(i=p->year+1;i<d.da_year;i++)
                                                        if(i%400==0||(i%4==0&&i%100!=0))f+=366;
                                                                  else f+=365;
                                                                      f+=f2;
                                                    }
                                else f=f2-f;
                                p->deadline=90-f;
                                gotoxy(1,l++);cprintf("%-9s%-5d%-12s%-12s%-5d%-4d%-4d%d",p->number,p->key.key,p->key.bname,p->key.writter,p->year,p->month,p->day,p->deadline);
                                p=p->next;
                                if(l==16&&p!=NULL){gotoxy(1,l);cprintf("Press any key to continue...");getch();clrscr(); gotoxy(1,1);cprintf("Number   key  bookname    writer      year mon day deadline");l=2;}
                              }
                             }
                            getch();
                            break;
                           }
                break;
       case 'k': save(T);save_name(stu);break;
       case 'l': T=load();stu=load_name();display(1,1,T,55);getch();break;
       case 'q': exit(1);break;
      }
   }
}

来源:十度教育
作者:
关键字:图书馆管理程序
发表日期:2006-6-28 20:54:52

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:n!的求解   下一篇:用C读写原始分区


2008-11-23 20:43:24
本文的相类似文章
在学习中进步 在进步中成长 教程中国相随您的成长之路
华腾联合科技股份有限公司版权所有
广告联系:Rosibo@163.com