图书馆管理系统(C语言程序设计)
悬赏分:100 - 解决时间:2010-6-25 14:38 1、功能描述,新进图书基本信息的输入。 2. 图书基本信息的查询。 3. 对撤消图书信息的删除。 4. 为借书人办理注册。
5.办理借书手续(非注册会员不能借书)。 6.办理还书手续
信息描述:有关该系统基本信息的描述,如:图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等
大一新生的课程设计,那个只能用C语言来做,拜托各位了,两天之后要上交,网上找的调试都不成功。
记住一定要用C语言啊,千万不要用C++,调试成功后有悬赏分的 问题补充:我的邮箱是g080166@sina.com
各位大侠,答完后记得留自己的名字啊,这样我也好给分 对了,是要在vc的系统编译
提问者: g080166 - 五级最佳答案#include #define LEFT 0x4b00 /*左*/ #define RIGHT 0x4d00 /*右*/ #define DOWN 0x5000 /*下*/ #define UP 0x4800 /*上*/ #define SPACE 0x3920 /*空格*/ #define ESC 0x011b /* ESC键*/ #define ENTER 0x1c0d /*回车键*/ #define Backspace 0xe08 /*擦除键*/ #define ALT_B 12288 /*组合键ALT_B */ #define ALT_M 12800/*组合键ALT_M */ #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[3];/*使用了3个,可根据需要增删*/ typedef struct BookList/*书的结构体*/ { char num[20];/*图书编号*/ char name[20];/*书名*/ int price;/*书的价格*/ char person[20];/*借阅人*/ int yes;/*判断书是否存在或者已经借出,1存在,0借出*/ struct BookList *next; }Book; typedef struct MemberList/*会员的结构体*/ { char name[20];/*会员的姓名*/ char sex[2];/*会员的性别*/ int age;/*会员的年龄*/ struct MemberList *next; }Member; char save[4096];/*保存文本区域空间*/ /*char sav1[4096];*/ char c[4096];/*清屏专用空间*/ int i,j;/*常用变量*/ void Menu();/*初始化界面*/ void Selectitem();/*定义菜单*/ void DrawSelectitem();/*显示主菜单*/ void BlackText(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 MemberAdd(); /*增加会员*/ void MemberConsult();/*查询会员*/ void MemberDel(); /*删除会员*/ void MemberBook(); /*查询会员借书信息*/ void Help(); /*帮助*/ void Ver(); /*版本信息*/ void ClrScr();/*自定义清屏函数*/ void DrawFrame(int left,int up,int right,int backgroundcolor);/*画边框*/ /***主函数****/ void main(void) { Menu();/*初始化界面*/ Run(); /*具体操作过程*/ } /*初始化界面*/ void Menu() { system(\"cls\"); /*调用系统的清屏命令*/ textbackground(BLUE);/*将背景设置为蓝色*/ window(1,1,25,80); clrscr(); textx=3;/*光标初始化位置*/ texty=2; gotoxy(1,2); printf(\"%c\画左上角*/ for(i=0;i<78;i++) printf(\"%c\画水平直线*/ printf(\"%c\画右上角*/ for(i=3;i<=23;i++) { gotoxy(1,i); printf(\"%c\画垂直线*/ gotoxy(80,i); printf(\"%c\ } printf(\"%c\画左下角*/ for(i=0;i<78;i++) printf(\"%c\ down,int textcolor,int printf(\"%c\画右下角*/ gotoxy(1,1); textcolor(7); /*设置灰色*/ for(i=0;i<80;i++) cprintf(\"%c\用符号实现画主菜单的灰色背景区*/ 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],\"Find \");/*查询图书*/ strcpy(ml[0].str[2],\"Delete \");/*删除图书资料*/ 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,\"Member\"); strcpy(ml[1].str[0],\"Register \");/*添加新会员*/ strcpy(ml[1].str[1],\"Find \");/*查询会员资料*/ strcpy(ml[1].str[2],\"Delete \");/*删除会员资料*/ strcpy(ml[1].str[3],\"Member&book \"); ml[1].n=4; strcpy(ml[2].name,\"Help\");/*系统帮助*/ strcpy(ml[2].str[0],\"This System \"); strcpy(ml[2].str[1],\"Ver \"); ml[2].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(BLACK); /*设置黑色*/ cprintf(\"%c\输出菜单名*/ } } /*显示选中菜单*/ void BlackText(int x,int y,char *z) { textbackground(0); /*设置背景颜色为黑色*/ textcolor(15); /*设置文本颜色为白色*/ 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_M: DrawMl(1);break;/*显示下拉菜单2*/ case ALT_H: DrawMl(2);/*显示下拉菜单3*/ 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\ 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\输出背景字符*/ } } textcolor(tcolor);/*边框颜色*/ for(i=u+1;i cprintf(\"%c\垂直线*/ gotoxy(r,i); cprintf(\"%c\ } for(i=l+1;i cprintf(\"%c\水平线*/ gotoxy(i,d); cprintf(\"%c\ } gotoxy(l,u); cprintf(\"%c\左上角*/ gotoxy(r,u); cprintf(\"%c\右上角*/ gotoxy(l,d); cprintf(\"%c\左下角*/ gotoxy(r,d); cprintf(\"%c\右下角*/ /* gettext(l+1,u+1,r-1,d-1,save1);*//*保存边框内区域*/ } /*显示具体下拉选择项目*/ void DrawMl(int n) { gettext(1,1,80,25,save);/*保存被掩盖的地方*/ BlackText(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) BlackText(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--;/*移动到新的要显示的内容*/ BlackText(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++;/*移动到新的要显示的内容*/ BlackText(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: MemberAdd();break;/*添加会员*/ case 1: MemberConsult();break;/*会员查询*/ case 2:MemberDel();break;/*删除一个会员资料*/ case 3:MemberBook();/*查询某个会员所借图书情况*/ }break; case 2:switch(n) /*选择了帮助菜单选项*/ { case 0:Help();break; case 1:Ver(); } }/*结束外switch*/ }void BookAdd() { FILE *fp; Book consultbook; fp=fopen(\"book.txt\读方式打开文件*/ if(fp==NULL) fp=fopen(\"book.txt\写方式打开文件*/ else/*如果有书就添加*/ { fclose(fp); fp=fopen(\"book.txt\追加方式打开文件*/ } ClrScr();/*清屏*/ printf(\"Please intput a new book num: \");/*逐个输入新图书的资料*/ gets(consultbook.num); gotoxy(2,4); printf(\"Please input the new book name: \"); gets(consultbook.name); gotoxy(2,5); printf(\"Please input the new book's price: \"); scanf(\"%d%*c\ strcpy(consultbook.person,\"\"); 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(\"Please input the book name: \"); gets(bookname); /*输入要查询的图书名*/ fp=fopen(\"book.txt\ 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:\ gotoxy(2,4+i*5); printf(\"This book num is %s.\ gotoxy(2,5+i*5); printf(\"This book's price is %d.\ gotoxy(2,6+i*5); printf(\"This book is browwed by %s.\ gotoxy(2,7+i*5); printf(\"This book's state is %d.\ i++; flag=1; /*查找数据标志*/ } } if(flag==0) { ClrScr(); gotoxy(2,3); printf(\"Sorry, %s doesn't exist in the library!\ } fclose(fp); } /*删除图书资料*/ void BookDel() { FILE *fp; Book *head,*p,*q; char bookname[20]; fp=fopen(\"book.txt\读方式打开文件*/ 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\删除后从链表的头开始重新保存*/ while(head!=NULL) { fwrite(head,sizeof(Book),1,fp);/*块写*/ head=head->next; } fclose(fp); ClrScr(); } /*借书*/ void BookBorrow() { FILE *fp; Book consultbook; Member consultmember; char bookname[20],membername[20]; int flag=0,mflag=0; ClrScr(); gotoxy(2,3); printf(\"Please input the mermber name: \"); gets(membername); /*输入会员名*/ if((fp=fopen(\"member.txt\没找到文件*/ { gotoxy(2,3); printf(\"Cannot open file!\\n\"); return; } else while(!feof(fp))/*查询会员资料*/ { fread(&consultmember,sizeof(Member),1,fp); if(strcmp(consultmember.name,membername)==0) { mflag=1; /*是会员标志*/ break; } } fclose(fp); if(mflag==0) { gotoxy(2,4); printf(\"You are not a member now,pleas register first!\");/*不是会员不能借书*/ return; } gotoxy(3,5); printf(\"Please input the book name: \"); gets(bookname); /*输入图书名*/ ClrScr(); if((fp=fopen(\"book.txt\没找到文件*/ { 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; /*作借出标志*/ strcpy(consultbook.person,membername);/*登记借书会员*/ fseek(fp,-1L*sizeof(Book),1);/*从当前位置前移一条记录指针*/ fwrite(&consultbook,sizeof(Book),1,fp);/*写记录*/ gotoxy(2,3); printf(\"Borrowed success!\\n\"); 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\没找到文件*/ { gotoxy(2,3); printf(\"Can't open file!\\n\"); return; } printf(\"Please 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;/*作图书未借书标志,表示已还书*/ strcpy(consultbook.person,\"\"); fseek(fp,-1L*sizeof(Book),1); fwrite(&consultbook,sizeof(Book),1,fp); gotoxy(2,3); printf(\"Return book success!\\n\"); flag=1; break; } } } if(flag!=1) printf(\"Return fail!\\n\"); fclose(fp); } /*清除屏幕*/ void ClrScr() { int i,j; puttext(2,3,78,23,c);/*刚开始已经用gettext把蓝色的一块地方保存下来,现在再还原*/ gotoxy(2,3); } /*会员注册*/ void MemberAdd() { FILE *fp; Member consultmember; fp=fopen(\"member.txt\ if(fp==NULL)/*如果没会员就新建*/ fp=fopen(\"member.txt\ else/*如果有会员就添加*/ { fclose(fp); fp=fopen(\"member.txt\追加方式打开*/ } ClrScr(); gotoxy(2,3); printf(\"Please intput new member's name: \");/*逐个输入会员的资料*/ gets(consultmember.name); gotoxy(2,4); printf(\"Please input new member's sex: \"); gets(consultmember.sex); gotoxy(2,5); printf(\"Please input new member's age: \"); scanf(\"%d%*c\ fwrite(&consultmember,sizeof(Member),1,fp);/*写入记录*/ fclose(fp); ClrScr(); } /*查询会员*/ void MemberConsult() { FILE *fp; Member consultmember; char membername[20]; int flag=0; ClrScr(); gotoxy(2,3); printf(\"Please input the member's name: \");/*输入要查询的会员名*/ gets(membername); fp=fopen(\"member.txt\ if(fp==NULL)/*没找到文件*/ { ClrScr(); gotoxy(2,3); printf(\"Error!\\n\"); fclose(fp); return; } while(!feof(fp))/*查询会员资料*/ { fread(&consultmember,sizeof(Member),1,fp); if(strcmp(consultmember.name,membername)==0)/*比较*/ { ClrScr(); gotoxy(2,3); printf(\"The member %s 's information as follow:\ gotoxy(2,4); printf(\"This member'sex is %s.\ gotoxy(2,5); printf(\"This member 's age is %d.\ flag=1; break; } } if(flag==0) { ClrScr(); gotoxy(2,3); printf(\"The member %s doesn't exist in the library!\ } fclose(fp); } /*删除会员资料*/ void MemberDel() { FILE *fp; Member *head,*p,*q; char membername[20]; fp=fopen(\"member.txt\ if(fp==NULL)/*没找到文件*/ { gotoxy(2,3); printf(\"Error!\"); fclose(fp); return; } head=p=q=(Member*)malloc(sizeof(Member));/*将文件内容放入链表*/ fread(p,sizeof(Member),1,fp); while(!feof(fp)) { q=p; p=(Member*)malloc(sizeof(Member)); fread(p,sizeof(Member),1,fp);/*读记录*/ q->next=p;/*链入到链表的尾部*/ } p->next=NULL; fclose(fp); ClrScr(); printf(\"Please input the member's name: \");/*输入会员名*/ gets(membername); p=head; while(p!=NULL)/*按名字查找要删除的书*/ { if(strcmp(p->name,membername)==0)/*查找会员*/ { if(p==head) head=head->next;/*如果是第一条记录*/ else q->next=p->next;/*不是第一条记录*/ break; } q=p; /*没找到,则指针后移继续找*/ p=p->next; } fp=fopen(\"member.txt\删除后重新保存*/ while(head!=NULL) { fwrite(head,sizeof(Member),1,fp);/*块写*/ head=head->next; } fclose(fp); ClrScr(); } 因篇幅问题不能全部显示,请点此查看更多更全内容