纯c语言的线下图书管理系统(主要用到双向链表和文件的读写)

本文档介绍了一个使用C语言在Linux环境下编写的图书管理系统,利用双向链表和文件读写功能。系统包括注册、登录、添加图书、浏览图书、查找图书、删除图书、修改图书、借阅和归还图书等功能。代码简洁易懂,适合初学者学习和理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个实在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; //这个是用来记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值