图书管理系统 C 不使用数据库

如下运行不了

include <conio.h>

include <stdio.h>

include <stdlib.h>

include <string.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_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[4]; /使用了3个,可根据需要增删/

typedef struct BookList /书的结合体/
{
char name[20]; /书名/
char writername[20]; /作者名/
int num; /图书编号/
float price; /图书单价/
int yes; /判断书是否存在已经借出,1存在,0借出/
char person; /借书人/
}Book; /图书信息/

typedef struct MemberList /会员结构体/
{
char name[20]; /会员的姓名/
char sex[2]; /会员的性别/
int age; /会员的年龄/
int xh; /会员学号/
struct MemberList *next;
}Member;

/定义菜单/
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 Syetem");
strcpy(ml[2].str[1],"Ver");
ml[2].n=2;
}

/初始化界面/
void Menu()
{
int i,
clrcr();
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(7); /设置灰色/
for(i=0;i<80;i++)
cprintf("%c",219); /用符号实现主菜单的灰色背景区/
Selectitem(); /调用选项函数/
DrawSelectitem(); /画选项/

}

/显示主单名/
void DrawSelectitem()
{
int i;
for(i=0;i<3;i++)
RedText(i,1,ml[i].name); /显示主菜单名,且首字母为红色/
}

/按键操作过程/
void Run()
{
int text,textx,texty; /光标坐标,x行,y列/
while(1)
{
gotoxy(texty,textx);
key=bioskey(0); /接收按键/
switch(key)
{
case ALT_B:
case ESC:DrawMI(0);break; /显示下拉菜单1/
case ALT_M:DrawMI(1);break;/显示下拉菜单2/
case ALT_H:DrawMI(2); /显示下拉菜单3/
case UP: /上光标键的操作控制/
{
if(textx3)
textx=23;
textx--;
gotoxy(texty,textx);
}break;
case DOWN: /下光标键的操作控制/
{
if(textx
23)
text=3;
textx++;
gotoxy(texty,textx);
}break;
case LEFT: /作光标的操作控制/
{
if(texty2)
texty=79;
texty--;
gotoxy(texty,textx);
}break;
case Backspace: /擦除键的设置/
{
if(texty
2&&textx3)
continue;
else
{
if(texty!
2)
texty--;/擦除键的细节问题,先擦去东西,然后光标还要往后退一格/
else
if(texty2)
{
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(texty79)
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(texty79&&textx23)/到达最后就不再输出/
continue;
else
if(texty79&&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)
{ int i;
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 DrawMI(int n)
{
gettext(1,1,80,25,save);/保存被掩盖的地方/
BlackText(n,1,ml[n].name);/反选显示主菜单/
DrawFrame(3+20n-1,2,3+20n+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);
MoveMI(n,3);/菜单选项的控制/
}

/菜单选项的控制,n决定水平项,x决定下拉的选项/
void MoveMI(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(n0)/往左移动越界的话移到最后一个选项/
DrawMI(2);
else
DrawMI(n-1);
flag=0;
break;
case RIGHT:/移动右边的选项/
puttext(1,1,80,25,save);/恢复打开菜单前的样子/
if(n
2)/往右移动越界的话移到第一个选项/
DrawMI(0);
else
DrawMI(n+1);
flag=0;
break;
case UP:/具体选项往上移动/
RedText(n,x,ml[n].str[x-3]);/输出红色字体/
if(x3)/移到最上面再按上键,就移到最下面/
x=3+ml[n].n-1;
else
x--;/移动到新的要显示的内容/
Black Text(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++;/移动到新的要显示的内容/
Black Text(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()
{
FILEfp;
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("请输入新书的编号\n:");/*逐个输入新图书的资料*/
gets(consultbook.num);
gotoxy(2,4);
printf("请输入新书名字:\n");
gets(consultbook.name);
gotoxy(2,5);
printf("请输入新书的价格:\n");
scanf("%d%*c",&consultbook.price);
strcpy(consultbook.person,"");
consultbook.yes=1;/*表示书存在未借出*/
consultbook.next=NULL;
fwrite(&consultbook,sizeof(Book),1,fp);/*块写*/
fclose(fp);/*关闭文件*/
ClrScr();

}

/图书查询/
void BookConsult()
{
FILEfp;
Book consultbook;
char bookname[20];/
书名/
int flag=0,i=0;
ClrScr();
gotoxy(2,3);
printf("请输入图书名:\n");
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("此书%s 的信息如下:",consultbook.name);
gotoxy(2,4+i5);
printf("这本书的编号是%s。",consultbook.num);
gotoxy(2,5+i
5);
printf("这书的价格是%d。",consultbook.price);
gotoxy(2,6+i5);
printf("这本书被%s借走了。",consultbook.person);
gotoxy(2,7+i
5);
printf("这本书的状态是%d。",consultbook.yes);
i++;
flag=1;/查找数据标志/

    }
}
if(flag==0)
{
ClrScr();
gotoxy(2,3);
printf("对不起,%s本图书馆不存在!",bookname);
}
fclose(fp);

}

/删除图书资料/
void BookDel()
{
FILEfp;
Book
head,p,q;
char bookname[20];
fp=fopen("book.txt","rb");/读方式打开文件/
if(fpNULL)/没找到文件/
{
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("输入书名:\n");
gets(bookname);/输入图书名/
p=head;
while(p!=NULL)/按名字查找要删除的图书/
{
if(strcmp(p->name,bookname)
0)/找到要删除的图书/
{
if(p==head)/如果是i第一个结点/
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 consultmember;
char bookname[20],membername[20];
int flag=0,mflag=0;
ClrScr();
gotoxy(2,3);
printf("输入会员名:");
gets(membername);/*输入会员名*/
if((fp=fopen("member,txt","rb"))==NULL)/*没找到文件*/
{
gotoxy(2,3);
printf("不能打开!\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("您还不是会员,请先注册!");
return;
}
gotoxy(3,5);
printf("请输入书名:\n");
gets(bookname);/*输入图书名*/
ClrScr();
if((fp=fopen("book.txt","rb+"))==NULL)/*没找到文件*/
{
gotoxy(2,3);
printf("不能打开!\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("这本书已经借走了!\n");
break;
}
else
{
consultbook.yes=0;/*作借出标志*/
strcpy(consultbook.person,membername);/*登记借书会员*/
fseek(fp,-1L*sizeof(Book),1);/*写记录*/
gotoxy(2,3);
printf("Borrowed success!\n");
flag=1;/*借出书标志*/
break;
}
}
}
if(flag!=1)
{
ClrScr();
gotoxy(2,3);
printf("借书失败!\n");/*借书失败*/
}
fclose(fp);
}

/还书/
void BookReturn()
{
FILEfp;
Book consultbook;
char bookname[20];
int flag=0;
ClrScr();
if((fp=fopen("book.txt","rb+"))==NULL)/
没找到文件/
{
gotoxy(2,3);
printf("不能打开!\n");
return;
}
printf("请输入书名:\n");
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);
gotoxy(2,3);
printf("还书成功");
flag=1;
break;
}
}
}
if(flag!=1)
printf("还书失败!\n");
fclose(fp);
}

/清除屏幕/
void CleScr()
{
int i,j;
puttext(2,3,78,23,c);/刚开始已经用gettext把蓝色的一块保存下来,现在再还原/
gotoxy(2,3);
}

/会员注册/
void MemberAdd()
{
FILEfp;
Member consultmember;
fp=fopen("member.txt","rb");
if(fp==NULL)/
如果没会员就新建/
fp=fopen("member.txt","wb");
else/
如果有会员就添加/
{
fclose(fp);
fp=fopen("member.txt","ab");/
追加方式打开/
}
ClrScr();
gotoxy(2,3);
printf("请输入新会员姓名:")/
逐步输入会员的资料/
gets(consultmember.name);
gotoxy(2,4);
printf("请输入新会员的性别:");
gets(consultmember.sex);
gotoxy(2,5);
printf("请输入新会员的年龄:\n");
scanf("%d%
c",&consultmember,age);
gotoxy(2,6);
printf("请输入新会员的学号:\n");
scanf{"%d",&consultmember,xh);
fwrite(&consultmember,sizeof(Member),1,fp);/写入记录/
fclose(fp);
ClrScr();
}

/查询会员/
void MemberConsult()
{
FILEfp;
Member consultmember;
char membername[20];
int flag=0;
ClrScr();
gotoxy(2,3);
printf("请输入会员名:\n");
gets(membername);
fp=fopen("member.txt","rb");
if(fp==NULL)/
没找到文件/
{
ClrScr();
gotoxy(2,3);
printf("错误!\n");
fclose(fp);
return;
}
while(!feof(fp))/
查询会员资料/
{
fread(&consultmember,sizeof(Member),1,fp);
if(strcmp(consultmember.name,membername)==0)/
比较/
{
ClrScr();
gotoxy(2,3);
printf("错误!\n");
fclose(fp);
return;
}
while(!feof(fp))/
查询会员资料/
{
fread(&consultmember,sizeof(Member),1,fp);
if(strcmp(consultmember.name,membername)==0)/
比较/
{
ClrScr();
gotoxy(2,3);
printf("会员%s的信息是:",consultmember.name);
gotoxy(2,4);
printf("这个会议的性别是%s。",consultmember.sex);
gotoxy(2,5);
printf("这个会员的年龄是%d",consultmember.age);
gotoxy(2,6);
printf("这个会员的学号是&d",consultmember.xh);
flag=1;
break;
}
}
if(flag==0)
{
ClrScr();
gotoxy(2,3);
printf("会员%s不存在于该图书馆!",membername);
}
fclose(fp);
}
/
删除会员资料/
void MemberDel()
{
FILE
fp;
Member head,p,q;
char membername[20];
fp=fopen("member.txt","rb");
if(fp==NULL)/
没找到文件/
{
gotoxy(2,3);
printf("Error!");
fclose(fp);
return;
}
head=p=q=(Member
)malloc(sizeof(Member));/将文件内容放入链表/
fread(p,sizeod(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("请输入会员的名字:");/
输入会员名/
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","wb");/
删除后重新保存/
while(head!=NULL)
{
fwrite(head,sizeof(Member),1,fp);/
块写*/
head=head->next;
}
fclose(fp);
ClrScr();
}
}

/主函数/
int main()
{

Menu();  /*初始化界面*/
Run();
/*具体操作过程*/

}

我这个有错误,哪儿呢?

回答

闲鱼上找找,有现成的

以上是图书管理系统 C 不使用数据库的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>