📄 main.cpp
字号:
t=q->n+1;
for(k=1;k<=s->n;k++) //两个结点合拼
{ q->key[t+k-1]=s->key[k-1];
q->rec[t+k-1]=s->rec[k-1];
u=s->ptr[k-1];
q->ptr[t+k-1]=u;
if(u!=NULL) u->par=q; //改变指向父结点的指针
}
u=s->ptr[s->n]; q->ptr[t+s->n]=u;
if(u!=NULL) u->par=q;
q->n=2*m;
free(s); //合拼完毕释放结点
for(k=j;k<=p->n-1;k++) //其后的关键字和指针逐个前移
{
p->key[k-1]=p->key[k];
p->rec[k-1]=p->rec[k];
p->ptr[k]=p->ptr[k+1];
}
p->n=p->n-1; s=q; q=p;
}
}
if((q==bth)&&(q->n==0)) //若删除的是头结点而且删除后关键字数为0
{ free(bth); bth=s; bth->par=NULL; //删除头结点,并把s的结点作头结点
if(s->n==0) {bth=NULL; free(s); } //空树
}
printf("\n\t 这本书已经被删除!");
return(bth);
}//删除B树中元素的函数,并返回B树头指针
struct BookNode *InputNode()
{
struct BookNode *p;
int i;
p=(struct BookNode *)malloc(sizeof(struct BookNode)); //为相应的关键字开辟一个BookNode类型的指针
fflush(stdin); //把scanf自动形成的输入流清除,否则流指针不会返回头处
printf("\n\t 请输入书名: "); //相应值的输入
gets(p->title);
printf("\n\t 请输入该书作者: ");
gets(p->writer);
printf("\n\t 请输入该书现库存量: ");
scanf("%d",&p->current);
printf("\n\t 请输入该书总库存量: ");
scanf("%d",&p->total);
fflush(stdin);
for(i=0;i<20;i++)
(p->reader[i]).num[0]='\0'; //用'\0'来初始化借该书的读者证号,表示一开始时没人借书
return(p); //返回该结点指针
}//输入相应于该关键字的书信息的函数,返回BookNode类型的书信息结点的指针
void OutputNode(struct TreeNode *bth)
{
struct TreeNode *q;
struct BookNode *p;
int k;
int x;
int flag;
printf("\n\t 请输入你想查找的书的关键字: ");
scanf("%d",&x);
q=search(bth,x,&k,&flag); //寻找需要查找的书的位置
if(flag==1)
{
p=q->rec[k-1];
printf("\n\t 书名: %s",p->title); //输出相关内容
printf("\n\t 作者: %s",p->writer);
printf("\n\t 现库存量: %d",p->current);
printf("\n\t 总库存量: %d",p->total);
}
else printf("\n\t这本书不存在!");
}//查找并输出书的信息的函数,无返回值
void borrow(struct TreeNode *bth)
{
struct TreeNode *q;
struct BookNode *p;
int i,k, x, flag,t;
printf("\n\t 请输入你想借的书: ");
scanf("%d",&x);
q=search(bth,x,&k,&flag); //寻找需要查找的书的位置
if(flag==1) //找到并显示该书的信息
{
p=q->rec[k-1];
printf("\n\t 你想借这本书吗 ?(y/n)");
printf("\n\t 书名: %s",p->title);
printf("\n\t 作者: %s",p->writer);
printf("\n\t 现库存量: %d",p->current);
printf("\n\t 总库存量: %d",p->total);
t=getch();
if(t=='y'||t=='Y')
{
if( (p->current)==0) printf("\n\t对不起,这本书已经被借光了...");
else
{
for(i=0;i<20;i++) if( (p->reader[i]).num[0]=='\0') break;
printf("\n\t 请输入你的借书证号: "); //输入借书证号
scanf("%s",(p->reader[i]).num);
printf("\n\t 请输入借书日期: "); //输入借书日期
printf("\n\t 年: ");
scanf("%d",&((p->reader[i]).bro.year));
printf("\t 月: ");
scanf("%d",&((p->reader[i]).bro.month));
printf("\t 日: ");
scanf("%d",&((p->reader[i]).bro.day));
printf("\n\t 输入应还书日期: "); //输入应还书日期
printf("\n\t 年: ");
scanf("%d",&((p->reader[i]).back.year));
printf("\t 月: ");
scanf("%d",&((p->reader[i]).back.month));
printf("\t 日: ");
scanf("%d",&((p->reader[i]).back.day));
p->current--; //现存书量减1
printf("\n\t 你已借了该书.");}
}
}
else printf("\n\t 这本书不存在!"); //没找到
}//借书函数,无返回值
void payback(struct TreeNode *bth)
{
struct TreeNode *q;
struct BookNode *p;
int i,k, x, flag,t,j;
int year,month,day,d;
float pay;
char temp[20];
printf("\n\t 请输入你还的书: ");
scanf("%d",&x);
q=search(bth,x,&k,&flag); //寻找需要还的书的位置
if(flag==1)
{
p=q->rec[k-1];
printf("\n\t 你想还这本书吗 ?(y/n)");
printf("\n\t 书名: %s",p->title);
printf("\n\t 作者: %s",p->writer);
printf("\n\t 现库存量: %d",p->current);
printf("\n\t 总库存量: %d",p->total);
t=getch();
if(t=='y'||t=='Y')
{
printf("\n\t 请输入你的借书证号: ");
scanf("%s",temp);
j=0;
for(i=0;i<20;i++)
{
if(! (strcmp(temp,(p->reader[i]).num))) {j=1;break;} //查看是否有借书
}
if(j==0) {printf("\n\t 你没有借书.");return;} //该借书证号的人没借书
printf("\n\t 今天是:"); //输入当天日期
printf("\n\t 年: ");
scanf("%d",&year);
printf("\t 月: ");
scanf("%d",&month);
printf("\t 日: ");
scanf("%d",&day);
d=0;
if(year<(p->reader[i]).back.year) d=1; //判断是否已过了还书日期,d=1还没过期,d=0过期
if(year<=(p->reader[i]).back.year && month<(p->reader[i]).back.month) d=1;
if(year<=(p->reader[i]).back.year && month<=(p->reader[i]).back.month && day<(p->reader[i]).back.day) d=1;
if(d==0)
{
pay=(year-(p->reader[i]).back.year)*365+(month-(p->reader[i]).back.month)*30+(day-(p->reader[i]).back.day);
printf("\n\t 你在 %d-%d-%d 借了这本书",(p->reader[i]).bro.year,(p->reader[i]).bro.month,(p->reader[i]).bro.day); //打印借书和还书日期
printf("\n\t 你应该在 %d-%d-%d 还这本书",(p->reader[i]).back.year,(p->reader[i]).back.month,(p->reader[i]).back.day);
printf("\n\t 今天是 %d-%d-%d",year,month,day);
printf("\n\n\t 所以你超出了还书日期");
printf("\n\t 你应该被罚款 %2.1f 元.",0.1*pay); //过期一天还1角钱
}
(p->reader[i]).num[0]='\0'; //已还,清除该读者借书记录
p->current++; //现存书量加1
printf("\n\t 你已经还了这本书.");
// }
}
}
else printf("\n\t 你要还一本没库存的书 ???"); //没可能还一本没库存的书
}//还书函数,无返回值
char menu(void)
{
PP
printf("1.采编入库");
PPP
printf("2.清除库存");
PP
printf("3.显示该树");
PPP
printf("4.查找");
PP
printf("5.借阅");
PPP
printf("6.归还");
PP
printf("7.退出");
PP
printf("请选择: ");
return getch();
}//显示菜单函数,返回接收的字符
void main()
{
char c,t;
// int x;
int p=1;
struct TreeNode *bth=NULL;
printf("\n\t ********************************************************************");
printf("\n\t 学院:计算机学院\t 专业班级:网络工程2班");
printf("\n\t 姓名: 黎灶群 \t 学号: 200208024214");
printf("\n\t ********************************************************************");
printf("\n\t ********************************************************************");
printf("\n\t ******************** 欢迎进入图书管理系统 *******************");
printf("\n\t ********************************************************************");
while(1)
{
c=menu(); //显示菜单
putch(c);
getch();
switch(c) //按菜单函数返回值调用各相应函数
{
case '1': bth=insert(bth);
printf("\n\t这棵B树是:\n");
all(bth,p);
break;
case '2': bth=del(bth);
printf("\n\t这棵B树是:\n");
all(bth,p);
break;
case '3':
printf("\n\t这棵B树是:\n");
all(bth,p);
break;
case '4': OutputNode(bth);
break;
case '5': borrow(bth);
break;
case '6': payback(bth);
break;
case '7':
printf("\n\t你想退出吗?(y/n)");
t=getch();
if(t=='y'||t=='Y') exit(0);
break;
default :break;
}
printf("\n\t 按任意键返回主菜单....");
getch();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -