正文

图书管理(3)2006-01-03 11:28:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/tankboy/9264.html

分享到:

#include <dos.h>#include <bios.h>#include <conio.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define SPACE 0x3920#define ESC 0x011b#define ENTER 0x1c0d#define Backspace 0xe08 /*擦除键*/#define ALT_B 12288 /*组合键ALT_B */#define ALT_H 8960/*组合键ALT_H */int key;/*按键变量*/int textx,texty;/*光标坐标,x行,y列*/struct menustruct/*菜单用的结构体*/{   char name[10];/*主菜单名*/   char str[10][20];/*选项*/   int n;/*选项数*/}ml[2];typedef struct BookList/*书的结构体*/{   char num[20];/*图书编号*/   char name[20];   int price;   int yes;/*判断书是否存在或者已经借出,1存在,0借出*/   struct BookList *next;}Book;char save[4096];/*保存文本区域空间*/char c[4096];/*清屏专用空间*/int i,j;void Menu();/*初始化界面*/void Selectitem();/*定义菜单*/void DrawSelectitem();/*显示主菜单*/void BlueText(int x,int y,char *z);/*选中菜单*/void RedText(int x,int y,char *z);/*正常菜单*/void Run();void DrawMl(int n);/*显示下拉菜单*/void MoveMl(int n,int x);/*菜单选项的控制*/void Enter(int m,int n);void BookAdd();void BookConsult();void BookDel();void BookBorrow();void BookReturn();void Help();void Ver(); /*版本信息*/void ClrScr();/*自定义清屏函数*/void DrawFrame(int left,int up,int right,int down,int textcolor,int backgroundcolor);/*画边框*//***主函数****/void main(void){   Menu();/*初始化界面*/   Run();/*具体操作过程*/}void Menu(){   system("cls"); /*调用系统清屏*/   textbackground(LIGHTGREEN);   window(1,1,25,80);   clrscr();   textx=3;/*光标初始化位置*/   texty=2;   gotoxy(1,2);   printf("%c",218);/*画左上角*/   for(i=0;i<78;i++)   printf("%c",196); /*画水平直线*/   printf("%c",191);/*画右上角*/   for(i=3;i<=23;i++)   {      gotoxy(1,i);      printf("%c",179); /*画垂直线*/      gotoxy(80,i);      printf("%c",179);   }   printf("%c",192); /*画左下角*/   for(i=0;i<78;i++)      printf("%c",196);   printf("%c",217); /*画右下角*/   gotoxy(1,1);   textcolor(11); /*置浅绿色*/   for(i=0;i<80;i++)      cprintf("%c",219);/*用符号实现画主菜单的灰色背景区*/   Selectitem();  /*调用选项函数*/   DrawSelectitem(); /*画选项*/   gettext(2,3,78,23,c); /*保存当前文本区域*/}/*定义菜单*/void Selectitem(){   strcpy(ml[0].name,"Book");/*选项补空格为各菜单黑色背景相同*/   strcpy(ml[0].str[0],"Add                ");   strcpy(ml[0].str[1],"Consult            ");   strcpy(ml[0].str[2],"Del                ");   strcpy(ml[0].str[3],"Borrow             ");   strcpy(ml[0].str[4],"Return             ");   strcpy(ml[0].str[5],"Exit               ");   ml[0].n=6; /*保存菜单的项数*/   strcpy(ml[1].name,"Help");/*系统帮助*/   strcpy(ml[1].str[0],"This System        ");   strcpy(ml[1].str[1],"Ver           ");   ml[1].n=2;}/*显示主单名*/void DrawSelectitem(){   for(i=0;i<3;i++)   RedText(i,1,ml[i].name); /*显主菜单名,首字母红色*/}/*正常显示菜单*/void RedText(int x,int y,char *z){   textbackground(7); /*设置背景颜色为浅灰色*/   gotoxy(3+x*20,y);   for(j=0;z[j];j++)   {      if(j==0)     textcolor(RED);/*第一个字母显示红色*/      else     textcolor(BLUE); /*置蓝色*/      cprintf("%c",z[j]); /*输出菜单名*/   }}/*显示选中菜单*/void BlueText(int x,int y,char *z){   textbackground(1); /*置背景蓝色*/   textcolor(11); /*置文本天蓝*/   gotoxy(3+20*x,y);/*定位坐标*/   cputs(z); /*输出菜单名字符串*/}void Run(){while(1)   {      gotoxy(texty,textx);      key=bioskey(0);/*接收按键*/      switch(key)      {     case ALT_B:     case ESC: DrawMl(0);break; /*显示下拉菜单1*/     case ALT_H: DrawMl(1);/*显示下拉菜单2*/     case UP:  /*上光标键的操作控制*/        {           if(textx==3)          textx=23;           textx--;           gotoxy(texty,textx);        }break;     case DOWN:  /*下光标键控制*/        {           if(textx==23)          textx=3;           textx++;           gotoxy(texty,textx);        }break;     case LEFT: /*左光标键控制*/        {           if(texty==2)          texty=79;           texty--;           gotoxy(texty,textx);        }break;     case Backspace: /*设置擦除键*/        {           if(texty==2&&textx==3)          continue;           else           {          if(texty!=2)             texty--; /*擦除键先擦去东东,然后光标要后退一格*/          else             if(texty==2)             {            texty=78;            textx--;             }             gotoxy(texty,textx);             printf(" ");             gotoxy(texty,textx);          }           }break;/*end case 0xe08*/     case RIGHT: /*右光标键*/        {           if(texty==79)          texty=2;           texty++;           gotoxy(texty,textx);        }break;     case SPACE: /*空格键*/        {           if(texty==79)          continue;           else           {          gotoxy(texty,textx); /*空格细节操作*/          printf(" ");          texty++;          gotoxy(texty,textx);           }        }break;     case ENTER: /*回车控制操作*/        {           if(textx==23)          continue;           textx++;           texty=2;           gotoxy(texty,textx);        }break;     default : /*非控制键的结果*/        {           if(texty==79&&textx==23)/*到达最后就不再输出*/          continue;           else          if(texty==79&&textx!=23) /*到行的最后*/          {             textx++;             texty=2;          }           gotoxy(texty,textx);/*输出结果*/           printf("%c",key);           if(texty==79) /*如果texty==79就不执行*/          continue;           else /*如果没到行尾就继续执行,使光标向前移动一位*/          texty++;     }      }   }/*大循环的大括号*/}/*画边框函数*/ void DrawFrame(int l,int u,int r,int d,int tcolor,int bcolor){   textbackground(bcolor);   textcolor(bcolor); /*文本颜色*/   for(i=l;i<=r;i++) /*输出背景区域*/   {      for(j=u;j<=d;j++)      {     gotoxy(i,j);     printf("%c",219); /*输出背景字符*/      }   }   textcolor(tcolor);/*边框颜色*/   for(i=u+1;i<d;i++) /*在背景区域内输出边框线*/   {      gotoxy(l,i);      cprintf("%c",179); /*垂直线*/      gotoxy(r,i);      cprintf("%c",179);   }   for(i=l+1;i<r;i++)   {      gotoxy(i,u);      cprintf("%c",196); /*水平线*/      gotoxy(i,d);      cprintf("%c",196);   }   gotoxy(l,u);   cprintf("%c",218);/*左上角*/   gotoxy(r,u);   cprintf("%c",191);/*右上角*/   gotoxy(l,d);   cprintf("%c",192);/*左下角*/   gotoxy(r,d);   cprintf("%c",217); /*右下角*//* gettext(l+1,u+1,r-1,d-1,save1);*//*保存边框内区域*/}/*显示具体下拉选择项目*/void DrawMl(int n){   gettext(1,1,80,25,save);/*保存被掩盖的地方*/   BlueText(n,1,ml[n].name);/*反选显示主菜单*/   DrawFrame(3+20*n-1,2,3+20*n+19,3+ml[n].n,0,7);/*下拉菜单的边框*/   for(i=3;i<3+ml[n].n;i++)/*输出所选菜单各选项*/   {      if(i==3)     BlueText(n,i,ml[n].str[i-3]);/*默认选中第一项*/      else     RedText(n,i,ml[n].str[i-3]);/*其余各项首字符红色显示*/   }   gotoxy(79,1);   MoveMl(n,3);/*菜单选项的控制*/}/*菜单选项的控制,n决定水平项,x决定下拉的选项*/void MoveMl(int n,int x){   int flag=1;   while(flag)   {      gotoxy(79,1);      key=bioskey(0);/*接收按键*/      gotoxy(79,1);      switch(key)      {     case ESC:/*退出循环*/          puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/          flag=0;          break;     case LEFT:/*移到左边的选项*/          puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/          if(n==0)/*往左移动越界的话移到最后一个选项*/             DrawMl(2);          else             DrawMl(n-1);          flag=0;          break;     case RIGHT:/*移动右边的选项*/          puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/          if(n==2)/*往右移动越界的话移到第一个选项*/             DrawMl(0);          else             DrawMl(n+1);          flag=0;          break;     case UP:/*具体选项往上移动*/          RedText(n,x,ml[n].str[x-3]);/*输出红色字体*/          if(x==3)/*移到最上面再按上键,就移到最下面*/             x=3+ml[n].n-1;          else             x--;/*移动到新的要显示的内容*/          BlueText(n,x,ml[n].str[x-3]);/*输出黑色字体*/          flag=1;          break;     case DOWN:/*具体选项往下移动*/          RedText(n,x,ml[n].str[x-3]);          if(x==(3+ml[n].n-1))/*移动到最底下再按下键就移到最上面*/             x=3;          else             x++;/*移动到新的要显示的内容*/          BlueText(n,x,ml[n].str[x-3]);          flag=1;          break;     case ENTER:          puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/          Enter(n,x-3);/*菜单选项的具体功能*/          flag=0;          break;     }      gotoxy(79,1);   }} /*菜单选项的具体功能*/void Enter(int m,int n){   switch(m)   {      case 0:switch(n) /*选择了图书菜单选项*/         {        case 0:BookAdd();break;/*添加图书*/        case 1:BookConsult();break;/*图书查询*/        case 2:BookDel();break;/*删除一本图书资料*/        case 3:BookBorrow();break;/*借书*/        case 4:BookReturn();break;/*还书*/        case 5:exit(0);break;         } break;/*退出系统*/      case 1:switch(n) /*选择了帮助菜单选项*/         {        case 0:Help();break;        case 1:Ver();         }   }/*结束外switch*/}/*添加图书*/ void BookAdd(){   FILE *fp;   Book consultbook;   fp=fopen("book.txt","rb");/*读方式打开文件*/   if(fp==NULL)      fp=fopen("book.txt","wb"); /*写方式打开*/   else/*有书就添加*/   {      fclose(fp);      fp=fopen("book.txt","ab");/*追加方式打开*/   }   ClrScr();/*清屏*/   printf("Intput new book num: ");/*逐个输入新图书的资料*/   gets(consultbook.num);   gotoxy(2,4);   printf("Input new book name: ");   gets(consultbook.name);   gotoxy(2,5);   printf("Please input new book's price: ");   scanf("%d%*c",&consultbook.price);   consultbook.yes=1;/*表示书存在未借出*/   consultbook.next=NULL;   fwrite(&consultbook,sizeof(Book),1,fp);/*块写*/   fclose(fp); /*关闭文件*/   ClrScr();}/*图书查询*/void BookConsult(){   FILE *fp;   Book consultbook;   char bookname[20]; /*书名*/   int flag=0,i=0;   ClrScr();   gotoxy(2,3);   printf("Input the book name: ");   gets(bookname); /*输入要查询的图书名*/   fp=fopen("book.txt","rb");   if(fp==NULL)/*没找到文件*/   {      ClrScr();      gotoxy(2,3);      printf("Error!");      fclose(fp);      return;   }   else      while(!feof(fp))/*查询图书资料*/      {     fread(&consultbook,sizeof(Book),1,fp);     if(strcmp(consultbook.name,bookname)==0)/*如果查找到*/     {        ClrScr();        gotoxy(2,3+i*5);        printf("This book %s information as follow:",consultbook.name);        gotoxy(2,4+i*5);        printf("This book num is %s",consultbook.num);        gotoxy(2,5+i*5);        printf("This book's price is %d",consultbook.price);        gotoxy(2,7+i*5);        printf("This book's state is %d",consultbook.yes);        i++;        flag=1; /*查找数据标志*/     }      }   if(flag==0)   {      ClrScr();      gotoxy(2,3);      printf("No found this book");   }   fclose(fp);}/*删除图书资料*/ void BookDel(){   FILE *fp;   Book *head,*p,*q;   char bookname[20];   fp=fopen("book.txt","rb");/*读方式打开文件*/   if(fp==NULL)/*没找到文件*/   {      gotoxy(2,3);      printf("Error!");      fclose(fp);      return;   }   head=p=q=(Book*)malloc(sizeof(Book));/*将文件内容放入链表*/   fread(p,sizeof(Book),1,fp);  /*读第一条记录*/   while(!feof(fp))   {      q=p;      p=(Book*)malloc(sizeof(Book));      fread(p,sizeof(Book),1,fp); /*读记录*/      q->next=p;/*新记录插入到链表的尾*/   }   p->next=NULL;/*最后一个结点的后继为空*/   fclose(fp);   ClrScr();   printf("Input the book name: ");   gets(bookname); /*输入图书名*/   p=head;   while(p!=NULL)/*按名字查找要删除的图书*/   {      if(strcmp(p->name,bookname)==0)/*找到要删除的图书*/      {     if(p==head) /*如果是第一个结点*/        head=head->next;     else        q->next=p->next;/*不是第一个结点*/     break;      }      q=p;  /*指针后移*/      p=p->next;   }   fp=fopen("book.txt","wb");/*删除后从链表的头开始重新保存*/   while(head!=NULL)   {      fwrite(head,sizeof(Book),1,fp);/*块写*/      head=head->next;   }   fclose(fp);   ClrScr();}/*借书*/ void BookBorrow() {   FILE *fp;   Book consultbook;   char bookname[20];   int flag=0;   ClrScr();   gotoxy(3,5);   printf("Input the book name: ");   gets(bookname); /*输入图书名*/   ClrScr();   if((fp=fopen("book.txt","rb+"))==NULL)     {      gotoxy(2,3);      printf("Cannot open file\n!");      return;     }   while(!feof(fp))/*查询图书资料*/   {      fread(&consultbook,sizeof(Book),1,fp);      if(strcmp(&consultbook.name,bookname)==0)     {         if(consultbook.yes==0)/*图书已经借出的判断*/        {         gotoxy(2,3);         printf("This book has borrowed\n!");         break;        }          else       {        consultbook.yes=0; /*作借出标志*/        fseek(fp,-1L*sizeof(Book),1);/*从当前位置前移一条记录指针*/        fwrite(&consultbook,sizeof(Book),1,fp);/*写记录*/        gotoxy(2,3);        printf("Borrowed succ!");        flag=1;/*借出书标志*/        break;       }      }   }   if(flag!=1)    {      ClrScr();      gotoxy(2,3);      printf("Borrowed fail!\n");     }   fclose(fp); }/*还书*/ void BookReturn() {   FILE *fp;   Book consultbook;   char bookname[20];   int flag=0;   ClrScr();   if((fp=fopen("book.txt","rb+"))==NULL)     {      gotoxy(2,3);      printf("cannot open file\n!");      return;     }   else   printf("Input the book name: ");   gets(bookname); /*输入图书名*/   ClrScr();   while(!feof(fp))/*查询图书资料*/   {      fread(&consultbook,sizeof(Book),1,fp);      if(strcmp(&consultbook.name,bookname)==0)      {       if(consultbook.yes==0)/*图书已经借出的判断*/        {          consultbook.yes=1;/*作图书未借书标志,表示已还书*/          fseek(fp,-1L*sizeof(Book),1);          fwrite(&consultbook,sizeof(Book),1,fp);          gotoxy(2,3);          printf("Return book succ!");          flag=1;          break;         }       }    }    if(flag!=1)    printf("Return fail!\n");    fclose(fp); }/*清除屏幕*/ void ClrScr() {   int i,j;   puttext(2,3,78,23,c);/*还原*/   gotoxy(2,3);  }/*帮助文件*/ void Help() {   ClrScr();   DrawFrame(10,5,50,8,0,7); /*画边框*/   gotoxy(15,6);   cprintf("click menu to run each funtion");   getch();   ClrScr();  }/***版本信息***/ void Ver()  {   ClrScr();   DrawFrame(10,5,50,8,0,7);   gotoxy(15,6);   cprintf("Ver 1.0 finished by heyatao!!");   sleep(1);   getch();   ClrScr();   }

阅读(2687) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册