📄 课程设计2.c
字号:
#include "stdio.h"
#include "malloc.h"
#include "conio.h"
#include "string.h"
#include "stdlib.h"
#define LEN sizeof(struct booklist)
#define LEN2 sizeof(struct memberlist)
#define LEN3 sizeof(struct readers)
typedef struct readers //借书信息结构体
{
char name[30]; //借书的会员姓名
struct readers *next2;
}reader;
//书本信息结构体
typedef struct booklist
{
char num[20]; //书号
char name[30]; //书名
char concern[50]; //出版社
char date[20]; //出版日期
char author[20]; //作者
int page; //页数
int price; //价格
int imformation; //图书剩余数量
reader *a; //借阅人
struct booklist *next;
}Book;
//会员信息结构体
typedef struct memberlist
{
int num[8]; //会员号
char name[30]; //会员名字
char sex[10]; //会员性别
char tel[15]; //会员联系电话
char code[20]; //会员密码
int n; //会员已借的书数量
struct memberlist *next;
}Member;
void creatlist(); //创建新的书本信息
void print(Book *head); //打印书本信息
void print2(Member *head); //打印会员信息
void save(Book *head); //储存书本信息
void AddBook(); //添加书本信息
void DelBook(); //删除书本信息
Book *read(); //读取书本信息
Member *read2(); //读取会员信息
void manager(); //管理员操作
void Bookconsult(); //图书查询
int Borrow(); //借书
int Return(); //还书
void operate(); //会员操作
void operate2(); //非会员操作
void Delmember(); //删除会员
void Addmember(); //增加会员
void save2(Member *head); //储存会员信息
void savenum(int *a); //储存会员号
void resetcode(); //修改会员密码
int *loadnum(); //读取会员号
int *getnum(); //分配会员号
Book *sort(Book *head); //书本信息按书号排序
void imformation(); //系统信息
void Memberconsult(); //查询会员信息
//储存会员号
void savenum(int *a)
{
int *b;
int i;
FILE *fp;
b=(int *)calloc(8,sizeof(int));
b=a;
fp=fopen("会员号.txt","wb");
for(i=0;i<8;i++)
{fwrite(&b[i],sizeof(int),1,fp);}
fclose(fp);
}
//读取会员号
int *loadnum()
{
FILE *fp;
int *a;
int i;
a=(int *)calloc(8,sizeof(int));
fp=fopen("会员号.txt","rb");
for(i=0;i<8;i++)
{
fread(&a[i],sizeof(int),1,fp);
}
fclose(fp);
return (a);
}
//分配会员号
int *getnum()
{
int i=7;
int *num;
num=(int *)calloc(8,sizeof(int));
num=loadnum();
++num[i];
while((num[i]==10)&&i>0)
{
num[i]=0;
++num[--i];
}
savenum(num);
return (num);
}
//创建新的书本信息
void creatlist()
{
Book *head=NULL,*p1=NULL,*p2=NULL;
int i,n;
printf("要创建的书本数目=");
scanf("%d",&n);
p2=head=(Book *)malloc(LEN); //创建带有头结点的链表
p2->a=(reader *)malloc(LEN3);
p2->a->next2=NULL;
p2->next=NULL;
printf("请输入书的信息:\n");
for(i=1;i<=n;i++)
{
p1=(Book *)malloc(LEN);
printf("书号: "); scanf("%s",p1->num);
printf("书名: "); scanf("%s",p1->name);
printf("出版社: "); scanf("%s",p1->concern);
printf("出版日期: "); scanf("%s",p1->date);
printf("作者: "); scanf("%s",p1->author);
printf("书本页数: "); scanf("%d",&p1->page);
printf("书本价格(元): "); scanf("%d",&p1->price);
p1->a=(reader *)malloc(LEN3);
p1->a->next2=NULL;
p1->imformation=10;
p1->next=NULL;
p2->next=p1;
p2=p1;
if(i<n) printf("下一本:\n");
}
head=sort(head);
save(head);
print(head);
}
//创建会员信息
void creatmember()
{
Member *head=NULL,*p1=NULL,*p2=NULL;
int m,n,p,i=0,j=0,k=1;
char a[30],b[30];
int *nu;
nu=(int *)calloc(8,sizeof(int));
printf("要创建的会员数量=");
scanf("%d",&n);
head=(Member *)malloc(LEN2);
p2=head;
p2->next=NULL;
printf("请输入会员信息:\n");
for(m=1;m<=n;m++)
{
p1=(Member *)malloc(LEN2);
printf("会员姓名: "); scanf("%s",&p1->name);
printf("会员性别: "); scanf("%s",&p1->sex);
printf("联系电话: "); scanf("%s",&p1->tel);
p1->n=0;
while(k==1)
{
printf("会员密码: ");
while((a[i]=getch())!=13) //不带显示输入密码
{
if(a[i]==8)
{
if(i>0)
{
printf("\b \b");
i--;
}
}
else
{
i++;
printf("*");
}
}
a[i]='\0';
printf("\n");
printf("确认密码: ");
while((b[j]=getch())!=13)
{
if(b[j]==8)
{
if(j>0)
{
printf("\b \b");
j--;
}
}
else
{
j++;
printf("*");
}
}
b[j]='\0';
if(strcmp(a,b)==0)
{
strcpy(p1->code,a);
k=0;
break;
}
else
{
printf("密码输入有误!\n");
i=0;j=0;
continue;
}
}
printf("\n创建成功!你的会员号是:");
nu=getnum();
for(p=0;p<8;p++)
{
p1->num[p]=nu[p];
printf("%d",nu[p]);
}
p2->next=p1;
p2=p1;
}
p1->next=NULL;
printf("\n");
save2(head);
}
//打印书本信息
void print(Book *head)
{
Book *p=NULL;
reader *p0=NULL;
p=head->next;
printf("*******************************************************************************\n");
while(p!=NULL)
{
printf("书号: %s\n书名: %s\n出版社: %s\n出版日期: %s\n作者: %s\n书本页数(页) : %d\n书本价格(元) : %d\n剩余数量 : %d\n",p->num,p->name,p->concern,p->date,p->author,p->page,p->price,p->imformation);
printf("借阅图书的人:");
if(p->a->next2==NULL) printf("------------暂无借阅人!");
else
{
for(p0=p->a->next2;p0!=NULL;p0=p0->next2)
{
printf("%s ",p0->name);
}
}
p=p->next; /* p后移一个结点 */
printf("\n");
printf("\n");
}
}
//书本信息按书号排序
Book *sort(Book *head)
{
Book *p1=NULL,*p2=NULL,*p3=NULL,*min=NULL,*min2=NULL,*head2=head->next;
p1=head2;
while(p1->next!=NULL)
{
min=p2=p1; /*把首结点作为最小值*/
while(p2->next!=NULL)
{
if(strcmp(min->num,p2->next->num)>0) /*首结点与下一结点比较*/
{
min2=p2;
min=p2->next;
}
p2=p2->next;
}
if(min!=p1)
{
min2->next=min->next; /*删除最小结点*/
min->next=p1; /*插入最小结点*/
if(p1==head2) head2=min;
else p3->next=min; /*p3为min前的结点指针*/
p3=min;
}
else
{
p3=p1;
p1=p1->next;
}
}
head->next=head2;
return(head);
}
//储存书本信息
void save(Book *head)
{
FILE *fp,*fp2;
Book *p=NULL;
reader *q=NULL;
fp=fopen("书本信息.txt","wb"); //printf("不能打开文件!\n");
fp2=fopen("借阅信息.txt","wb"); //printf("不能打开文件!\n");
p=head;
while(p!=NULL)
{
fwrite(p,LEN,1,fp); /*逐个结点写文件*/
for(q=p->a;q!=NULL;q=q->next2)
{fwrite(q,LEN3,1,fp2);}
p=p->next;
}
fclose(fp);
fclose(fp2);
}
//添加书本信息
void AddBook()
{
FILE *fp,*fp2;
Book *addbook=NULL;
reader *p0=NULL;
fp=fopen("书本信息.txt","ab"); //追加方式打开文件
fp2=fopen("借阅信息.txt","ab");
addbook=(Book *)malloc(LEN);
printf("输入书本信息:\n");
printf("书号: "); scanf("%s",addbook->num);
printf("书名: "); scanf("%s",addbook->name);
printf("出版社: "); scanf("%s",addbook->concern);
printf("出版日期: "); scanf("%s",addbook->date);
printf("作者: "); scanf("%s",addbook->author);
printf("书本页数: "); scanf("%d",&addbook->page);
printf("书本价格(元): "); scanf("%d",&addbook->price);
p0=(reader *)malloc(LEN3);
p0->next2=NULL;
addbook->a=p0;
addbook->imformation=10;
addbook->next=NULL;
fwrite(addbook,LEN,1,fp); /*块写*/
fwrite(p0,LEN3,1,fp2);
fclose(fp);
fclose(fp2);
}
//读取书本信息
Book *read()
{
FILE *fp,*fp2;
Book *p=NULL,*p1=NULL,*head=NULL;
reader *p0=NULL,*p2=NULL;
if((fp=fopen("书本信息.txt","rb"))==NULL) printf("不能打开文件或文件不存在!\n");
if((fp2=fopen("借阅信息.txt","rb"))==NULL) printf("不能打开文件或文件不存在!\n");
head=(Book *)malloc(LEN);
fread(head,LEN,1,fp);
p1=head;
p0=(reader *)malloc(LEN3);
fread(p0,LEN3,1,fp2);
p0->next2=NULL;
head->a=p0;
head->next=NULL;
p=(Book *)malloc(LEN);
while(fread(p,LEN,1,fp)) /*逐个结点读取*/
{
p1->next=p;
p1=p1->next;
p0=(reader *)malloc(LEN3);
p1->a=p0;
while(fread(p0,LEN3,1,fp2))
{
if(p0->next2==NULL)
{
p2=p0;
p0=(reader *)malloc(LEN3);
break;
}
p2=p0;
p0=(reader *)malloc(LEN3);
p2->next2=p0;
}
free(p0);
p2->next2=NULL;
p=(Book *)malloc(LEN);
}
p1->next=NULL;
free(p);
fclose(fp);
fclose(fp2);
head=sort(head);
if(head!=NULL) return(head);
else
{
printf("文件为空!\n");
return 0;
}
}
//删除书本信息
void DelBook()
{
Book *head=NULL,*p=NULL,*q=NULL;
char bookname[30];
head=read();
printf("输入要删除的书名: ");
scanf("%s",bookname);
p=head;
while(p!=NULL)/*按名字查找要删除的图书*/
{
if(strcmp(p->name,bookname)==0)
{
if(p==head)
{
head=head->next;
break;
}
else
{
q->next=p->next;
break;
}
}
q=p;
p=p->next;
}
save(head);
}
//管理员操作
void manager()
{
int n,i=0,k=1;
char a[13];
char b[13];
Book *head=NULL;
Member *head2=NULL;
strcpy(a,"managercode");
printf("请输入你的管理员密码:");
while((b[i]=getch())!=13) //不带显示的密码输入
{
if(b[i]==8)
{
if(i>0)
{
printf("\b \b");
i--;
}
}
else
{
i++;
printf("*");
}
}
b[i]='\0';
printf("\n");
if((strcmp(a,b))==0)
{
printf("管理员验证已通过\n");
while(k==1)
{
printf("********************************************************************************\n");
printf(" 请选择你需要的操作\n");
printf(" ◎ 1.建立新的书本信息\n");
printf(" ◎ 2.插入书本信息\n");
printf(" ◎ 3.删除书本信息\n");
printf(" ◎ 4.读取所有书本信息\n");
printf(" ◎ 5.读取指定书本信息\n");
printf(" ◎ 6.创建会员信息\n");
printf(" ◎ 7.插入会员信息\n");
printf(" ◎ 8.删除会员信息\n");
printf(" ◎ 9.读取所有会员信息\n");
printf(" ◎10.读取指定会员信息\n");
printf(" ◎11.返回到上级目录\n");
printf(" ◎12.保存并退出\n");
printf("请输入:");
scanf("%d",&n);
switch(n)
{
case 1: creatlist();break;
case 2: AddBook();break;
case 3: DelBook();break;
case 4: head=read();system("CLS");print(head);break;
case 5: system("CLS");Bookconsult();break;
case 6: creatmember();break;
case 7: Addmember();break;
case 8: Delmember();break;
case 9: head2=read2();system("CLS");print2(head2);break;
case 10: system("CLS");Memberconsult();break;
case 11: k=0;break;
default: k=0;break;
}
}
}
else printf("你不是管理员,没权这个操作。\n");
}
//图书查询
void Bookconsult()
{
int n,m=1,sign=0;
Book *p=NULL,*p1=NULL,*p0=NULL,*head=NULL;
reader *p2=NULL;
char a[30],b[20],c[20];
head=read();
while(m==1)
{
printf(" 请选择你查询书本的方式: 1.按书名 2.按书的编号 3.按书的作者 4.退出查询\n");
printf("输入=");
scanf("%d",&n);
switch(n)
{
case 1: printf("请输入书名:");
scanf("%s",a);
p0=head;
while(p0!=NULL)
{
if(strcmp(a,p0->name)==0)
{
printf("*******************************************************************************\n");
printf("书号: %s\n书名: %s\n出版社: %s\n出版日期: %s\n作者: %s\n书本页数(页) : %d\n书本价格(元) : %d\n剩余数量 : %d\n",p0->num,p0->name,p0->concern,p0->date,p0->author,p0->page,p0->price,p0->imformation);
printf("借阅图书的人:");
if(p0->a->next2==NULL) printf("------------暂无借阅人!\n");
else
{
for(p2=p0->a;(p2=p2->next2)!=NULL;)
{printf("%s ",p2->name);}
}
printf("\n");
sign=1;
p0=p0->next;
}
else p0=p0->next;
}
if(sign==0) printf("没有这本书的信息.\n");
break;
case 2: printf("请输入书的编号:");
scanf("%s",b);
p0=head;
while(p0!=NULL)
{
if(strcmp(b,p0->num)==0)
{
printf("*******************************************************************************\n");
printf("书号: %s\n书名: %s\n出版社: %s\n出版日期: %s\n作者: %s\n书本页数(页) : %d\n书本价格(元) : %d\n剩余数量 : %d\n",p0->num,p0->name,p0->concern,p0->date,p0->author,p0->page,p0->price,p0->imformation);
printf("借阅图书的人:");
if(p0->a->next2==NULL) printf("------------暂无借阅人!\n");
else
{
for(p2=p0->a;(p2=p2->next2)!=NULL;)
{printf("%s ",p2->name);}
}
printf("\n");
break;
}
else p0=p0->next;
}
if(p0==NULL) printf("没有这本书的信息.\n");
break;
case 3: printf("请输入书的作者:");
scanf("%s",c);
p0=head;
while(p0!=NULL)
{
if(strcmp(c,p0->author)==0)
{
printf("*******************************************************************************\n");
printf("书号: %s\n书名: %s\n出版社: %s\n出版日期: %s\n作者: %s\n书本页数(页) : %d\n书本价格(元) : %d\n剩余数量 : %d\n",p0->num,p0->name,p0->concern,p0->date,p0->author,p0->page,p0->price,p0->imformation);
printf("借阅图书的人:");
if(p0->a->next2==NULL) printf("------------暂无借阅人!\n");
else
{
for(p2=p0->a;(p2=p2->next2)!=NULL;)
{printf("%s ",p2->name);}
}
printf("\n");
sign=1;
p0=p0->next;
}
else p0=p0->next;
}
if(sign==0) printf("没有这本书的信息.\n");
break;
default: m=0;break;
}
}
}
//查询会员信息
void Memberconsult()
{
int i,j,n,m=1,sign=0,sign2=0;
Member *p0=NULL,*head=NULL;
char a[30];
int b[8];
char c;
head=read2();
while(m==1)
{
printf(" 请选择你查询会员的方式: 1.按会员名 2.按会员编号 3.退出查询\n");
printf("输入=");
scanf("%d",&n);
switch(n)
{
case 1: printf("请输入会员名:");
scanf("%s",a);
p0=head;
while(p0!=NULL)
{
if(strcmp(a,p0->name)==0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -