这个实在linux系统下写的,参考了一下网上的代码,然后按照自己的想法一个一个敲进去的,存在一些不严谨的地方,但能用,不想花太多的时间去修改,,我会尽量解释清楚,因为有时候自己参考别人的代码,有一些自己没学过,也看不懂,深感难受,所以我希望自己写的能让你们看得懂一些。其中的一些变量都是自己定义的,不过懂一些c语言应该看得懂。我把最终的代码放到最后面去了,有点长,不嫌手累的可以翻下去看一下,那个清屏函数可能在windows下不一样,所以会用Linux的话在Linux下复制进去体验一下。第一次写博客,也还是菜鸟,有错误的地方请大神指教。
设计的思路:
1.首先是写一个入口界面函数显示界面(界面如上面图片),该函数只有输入1,或2选项才继续往下执行,刚开始必须选1进行注册账号才能登陆。注册的账号会存在文件中,下次可以直接登录,刚开始第一次的时候没注册的话会出现下面的错误。注册过一次之后下次不注册也能等录。因为之前注册的账号已经记录下来了,可以直接用来登录。
下面的是登录界面的子函数代码:
/登陆界面函数
void login_interface()
{
int an=0;
printf("-----------1.注册账号-----------\n");
printf("-----------2.登陆账号-----------\n");
printf("\n");
printf("请输入1或2:");
scanf("%d",&an);
switch(an)
{
case 1:zhang_hao();break;
case 2:login();break;
default:break;
}
getchar();
system("reset");//清屏函数,将屏幕中显示的能容清除,好观察从新打印出来的内容。
login_interface();
}
下面是注册账号的函数代码:
//10.注册账号
void zhang_hao()
{
FILE *fp;
huo head2=create_login();
char zhang_hao[20];
char mi_ma[20];
char zhanghao1[20];
char mima1[20];
fp=fopen("zhanghao.txt","a+");//以可读的可写的方式打开,文件内容不会被清空(w会清空文件原来的内容)
if(!fp)
{
perror("fopen");
}
for(;!feof(fp);)
{
fscanf(fp,"%s\t%s\t",zhanghao1,mima1);//将文件中的账号密码读到数组中,用于复制到链表的结构体成员中
if(head2)
{
huo newnode=(huo)malloc(sizeof(chen));
if(newnode)
{
strcpy(newnode->zhanghao,zhanghao1);
strcpy(newnode->mima,mima1);
newnode->next=head2->next;
newnode->prev=head2;
head2->next=newnode;
newnode->next->prev=newnode;
}
}
}
while(1)
{
system("reset");
printf("账号(6~10位):");
scanf("%s",zhang_hao);
printf("密码(<20位):");
scanf("%s",mi_ma);
if((strlen(zhang_hao)<=10&&strlen(zhang_hao)>=6)&&(strlen(mi_ma)<20&&strlen(mi_ma)>0))
{
break;
}
printf("账号不符合要求,请重新输入!\n");
scanf("%*[^\n]");
scanf("%*c");
getchar();
}
huo p=head2->next;
while(p!=head2)
{
if(strcmp(p->zhanghao,zhang_hao)==0)
{
printf("这个账号已经被注册!\n");
getchar();
break;
}
p=p->next;
}
if(p==head2)
{
fprintf(fp,"%s\t%s\t",zhang_hao,mi_ma);
printf("注册成功!\n");
getchar();
}
fclose(fp);
getchar();
system("reset");
login_interface();
}
下面是登录的子函数代码:
*2.输入1进行注册账号之后,按回车键返回登录界面进行登录。如果登录的账号不存在或者密码账号错误会提有相关的提示。
下面是注册账号的函数代码:
//10.注册账号
void zhang_hao()
{
FILE *fp;
huo head2=create_login();
char zhang_hao[20];
char mi_ma[20];
char zhanghao1[20];
char mima1[20];
fp=fopen("zhanghao.txt","a+");//以可读的可写的方式打开,文件内容不会被清空(w会清空文件原来的内容)
if(!fp)
{
perror("fopen");
}
for(;!feof(fp);)
{
fscanf(fp,"%s\t%s\t",zhanghao1,mima1);//将文件中的账号密码读到数组中,用于复制到链表的结构体成员中
if(head2)
{
huo newnode=(huo)malloc(sizeof(chen));
if(newnode)
{
strcpy(newnode->zhanghao,zhanghao1);
strcpy(newnode->mima,mima1);
newnode->next=head2->next;
newnode->prev=head2;
head2->next=newnode;
newnode->next->prev=newnode;
}
}
}
while(1)
{
system("reset");
printf("账号(6~10位):");
scanf("%s",zhang_hao);
printf("密码(<20位):");
scanf("%s",mi_ma);
if((strlen(zhang_hao)<=10&&strlen(zhang_hao)>=6)&&(strlen(mi_ma)<20&&strlen(mi_ma)>0))
{
break;
}
printf("账号不符合要求,请重新输入!\n");
scanf("%*[^\n]");
scanf("%*c");
getchar();
}
huo p=head2->next;
while(p!=head2)
{
if(strcmp(p->zhanghao,zhang_hao)==0)
{
printf("这个账号已经被注册!\n");
getchar();
break;
}
p=p->next;
}
if(p==head2)
{
fprintf(fp,"%s\t%s\t",zhang_hao,mi_ma);
printf("注册成功!\n");
getchar();
}
fclose(fp);
getchar();
system("reset");
login_interface();
}
3.输入正确的密码和账号之后会进入下一个界面,菜单界面,如下图
下面是登录的子函数代码:
//11.登陆账号
void login()
{
FILE *fp;
fp=fopen(“zhanghao.txt”,“r”);
huo head2=create_login();
char zhang_hao[20]={};
char mi_ma[20]={};
char zhanghao[20]={};
char mima[20]={};
if(!fp)
{
perror("fopen");
}
printf("请输入账号:");
scanf("%s",zhang_hao);
printf("请输入密码:");
scanf("%s",mi_ma);
for(;!feof(fp);)
{
fscanf(fp,"%s\t%s\t",zhanghao,mima);
if(head2)
{
huo newnode=(huo)malloc(sizeof(chen));
if(newnode)
{
strcpy(newnode->zhanghao,zhanghao);
strcpy(newnode->mima,mima);
newnode->next=head2->next;
newnode->prev=head2;
head2->next=newnode;
newnode->next->prev=newnode;
}
}
}
huo p=head2->next;
while(p!=head2)
{
if(strcmp(p->zhanghao,zhang_hao)==0&&strcmp(p->mima,mi_ma)==0)
{
printf("登陆成功\n");
break;
}
else if(strcmp(p->zhanghao,zhang_hao)==0&&strcmp(p->mima,mi_ma)!=0||
strcmp(p->zhanghao,zhang_hao)!=0&&strcmp(p->mima,mi_ma)==0)
{
system("reset");
printf("账号或密码错误,请重新输入!\n");
scanf("%*[^\n]");
scanf("%*c");
login();
}
p=p->next;
if(p==head2)
{
getchar();
printf("用户不存在!\n");
getchar();
login_interface();
}
}
fclose(fp);
getchar();
sleep(2);
menue();
}
菜单界面函数代码:
//3.菜单主界面
void menue()
{
pstudent head1=create_stu();//创建一个空链表,学过的应该懂,用来作为参数传进函数,没学过的就学一下
ming head=create_lib(); //创建一个空链表,用来作为参数传进函数
int num;
int cheng;
printf("-----------1.添加图书-----------\n");
printf("-----------2.浏览图书-----------\n");
printf("-----------3.查找图书-----------\n");
printf("-----------4.删除图书-----------\n");
printf("-----------5.修改图书-----------\n");
printf("-----------6.借阅图书-----------\n");
printf("-----------7.归还图书-----------\n");
printf("-----------输入其他选项退出系统-----------\n");
printf("\033[31m ####----->> \033[32m" "hello\n" "\033[m");//这个是打印颜色的,没有实际用处
scanf("%d",&num);
switch(num)
{
case 1:addbook();break;
case 2:read_all_book();break;
case 3:look_up_book();break;
case 4:delete_book(head);break;
case 5:chang_book(head);break;
case 6:lend_book(head);break;
case 7:return_book(head);break;
default:break;
}
这些菜单每个数字对应的都写一个函数进行调用
(1.)添加图书
添加图书可以一直添加,知道输入Esc键按回车才会退出并保存,如图
//添加图书的代码
void addbook()
{ //函数中的变量n是用来记录图书的总数
FILE *fp;
char bookname1[10]={};
char writer1[10]={};
char number1[10]={};
int n=0;
T data1;
char ch;
fp=fopen("mingshu.txt","a");//打开文件,以可读的方式打开,没有的情况下会自动创建
if(!fp)
{
//库函数errno.h中的一个函数,用来打印出错的原因,这是为了代码比较严谨
perror("fopen");
}
for(n=0;;n++)
{
printf("请输入所需要添加的书的编号,书名,作者,数量:\n");
printf("编号:");
scanf("%s",number1);
printf("书名:");
scanf("%s",bookname1);
printf("作者:");
scanf("%s",writer1);
printf("数量:");
scanf("%d",&data1);
fprintf(fp,"%s\t%s\t%s\t%d\t",number1,bookname1,writer1,data1);//将变量de值输入到文件fp中保存,fscanf是从文件输入给变量
getchar();//从键盘中获取一个字符,这个起到等待作用吧,大家可以灵活使用
printf("添加成功,按enter继续,按Esc退出\n");
ch=getchar();
if(ch==27)//就是按esc键退出并保存已经输入的书本信息(因为esc键的ASCII值为27)
{
break;
}
}
fclose(fp);//关闭文件
printf("请输入任意按键返回菜单!");
getchar();
system("reset");//system("reset");为清屏函数,将屏幕的内容清除掉
}
(2)浏览图书如图,输入2按回车就会把整个图书列出来
浏览图书函数的代码
//4.浏览所有的图书
T read_all_book()
{
//函数中的变量n是用来记录图书的种数,不用它就不显示总数,只是打印出书本信息列表
int n=0;
char bookname[10]={};
char writer[10]={};
char number[10]={};
T data; //这个是用来记