图书管理系统C/C++

 用C语言编写的图书管理系统,分为管理员界面和用户界面

管理员界面可实现用户的增删,图书的增删管理。

用户可通过管理员设置发布的编号及用户名,登录借阅系统,进行图书的借阅归还。

可使用VC++6.0,Dev-C进行编译运行

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int readerlen=1,booklen=1;//定义读者和书籍的数量,可根据初始化函数进行相应的修改 
typedef struct BOOK{//书籍信息 
	char booknum[10];//编号 
	char bookname[10];//书名 
	int bookamount;//数量 
};
typedef struct READER{//读者信息 
	char readernum[10];//编号 
	char readername[10];//用户名 
	BOOK books;//借阅的书籍 
};
BOOK book[5];
READER reader[5];//声明全局变量 
void login();//登录界面 
void adminmenu();//管理员菜单 
void readermenu();//读者菜单 
void addreader();//添加用户 
void addbook();//添加书籍 
void changebook();//修改书籍信息 
void deletebook();//删除书籍信息 
void inquire();//查询书籍信息 
void traverse();//遍历所有书籍 
void borrow();//借阅图书 
void returnbook();//归还图书 
void init();//初始化书籍和读者信息 
void login()//登录界面 
{
	printf("欢迎进入图书管理系统!\n");
	printf("1.管理员登录\n");
	printf("2.用户登录\n");
	printf("3.退出\n");
	printf("请选择你的操作:");//起始登录界面 
	int choice;
	scanf("%d",&choice);
	if(choice==1)//分支语句选择不同的操作并匹配对应的函数或退出 
	{
		char username[10],password[10];
		printf("请输入用户名和密码\n");
		printf("用户名:\n");
		scanf("%s",username);
		printf("密码:\n");
		scanf("%s",password);
		if((strcmp(username,"123456")==0)&&(strcmp(password,"123456")==0))//初始管理员用户名和密码均为123456 
		{//strcmp函数判断两个字符串是否相同 
			printf("进入管理员菜单\n");
			adminmenu();
		}
		else{//若输入不匹配,则返回上一个界面 
			printf("密码错误,即将返回!\n");
			return; 
		}
	}
	else if(choice==2)
	{//思路基本和上一个分支一样 
		char num[10],name[10];
		printf("请输入您的编号和用户名\n");
		printf("编号:\n");
		scanf("%s",num);
		printf("用户名:\n");
		scanf("%s",name); 
		int i;
		for(i=0;i<5;i++)
		{
			if((strcmp(reader[i].readernum,num)==0)&&(strcmp(reader[i].readername,name)==0))//判断输入的用户编号和用户名是否和某一个对应 
			{
				printf("进入用户菜单\n");
				readermenu(); 
				return;
			}
		}
		printf("输入有误,即将返回!\n");
		return; 
	}
	else if(choice==3)
	{
		exit(0);//正常退出 
	}
}
void adminmenu()//管理员菜单 
{
	int a=1;
	system("cls");//清屏 
	while(a)
	{//定义非零常量a,使其在未选择返回的情况下一直处于菜单页面 
		int choice;
		printf("1.录入用户信息\n");
		printf("2.录入图书信息\n");
		printf("3.修改图书信息\n");
		printf("4.删除图书信息\n");
		printf("5.信息查询\n");
		printf("6.返回\n");
		printf("请选择你的操作:\n");
		scanf("%d",&choice);
		switch(choice)
		{
			case 1: addreader(); break;
			case 2: addbook(); break;
			case 3: changebook(); break;
			case 4: deletebook(); break;
			case 5: inquire(); break; 
			case 6: a=0; break;//将非零常量a改为0,从而达到退出while循环的目的 
		}
	}
}
void readermenu()//用户菜单 
{//思路基本和管理员菜单一致 
	int a=1;
	system("cls");
	while(a)
	{
		int choice;
		printf("1.查询图书\n");
		printf("2.借阅图书\n");
		printf("3.归还图书\n");
		printf("4.返回\n");
		printf("请选择你的操作:\n");
		scanf("%d",&choice);
		switch(choice)
		{
			case 1: traverse(); break;
			case 2: borrow(); break;
			case 3: returnbook(); break;
			case 4: a=0; break;
		}
	}
}
void addreader()//添加用户信息 
{
	char str[10];
	int a=readerlen,i;
	system("cls");
	printf("请输入你要添加的用户编号\n");
	scanf("%s",str);
	for(i=0;i<a;i++)
	{
		if(strcmp(str,reader[i].readernum)==0)
		{
			printf("该编号已被使用!\n");
			return;
		}
	}//添加用户信息的时候要注意是否重复 
	if(a<5)
	{//如果不重复,且不超过定义的最多用户数量,则可以进行添加 
		strcpy(reader[a].readernum,str);
		printf("请输入该用户的用户名\n");
		scanf("%s",reader[a].readername);
		printf("添加成功!\n");
		readerlen++;//读者数量要相应地进行更新 
	}
}
void addbook()//添加图书信息 
{//思路同添加用户函数 
	char str[10];
	int a=booklen,i;
	system("cls");
	printf("请输入你要添加的图书编号\n");
	scanf("%s",str);
	for(i=0;i<booklen;i++)
	{
		if(strcmp(str,book[i].booknum)==0)
		{
			printf("该编号已被使用!\n");
			return;
		}
	}
	if(a<100)
	{
		strcpy(book[a].booknum,str);
		printf("请输入该书籍的书名\n");
		scanf("%s",book[a].bookname);
		printf("请输入该书籍的数量\n");
		scanf("%d",&book[a].bookamount);
		printf("添加成功!\n");
		booklen++;
	}
}
void changebook()//修改图书信息 
{//通过重新输入要修改的变量进行修改 
	int i,choice,a=booklen;
	char num[10];
	system("cls");
	printf("请输入您要修改的图书编号\n");
	scanf("%s",num);
	for(i=0;i<a;i++)
	{
		if(strcmp(book[i].booknum,num)==0)
		{
			printf("编号:%s,书名:%s,数量:%d\n",book[i].booknum,book[i].bookname,book[i].bookamount);
			//打印对应编号书籍的信息,然后根据提示进行修改 
			printf("请选择您要修改的内容\n");
			printf("1.编号\n");
			printf("2.书名\n");
			printf("3.数量\n");
			scanf("%d",&choice);
			switch(choice)
			{
				case 1:{
					printf("请输入新的编号\n");
					scanf("%s",book[i].booknum);
					break;
				}
				case 2:{
					printf("请输入新的书名\n");
					scanf("%s",book[i].bookname);
					break;
				}
				case 3:{
					printf("请输入新的数量\n");
					scanf("%d",&book[i].bookamount);
					break;
				}
			}
		}
	}
}
void deletebook()//删除已有图书 
{/*删除函数的思路就是通过寻找要删除的书籍,然后将其后面的书籍前移 
同时注意原来的最后一本书的信息要进行清空*/ 
	int i,j,a=booklen;
	char str[10];
	system("cls");
	printf("请输入您想要删除的图书编号\n");
	scanf("%s",str);
	for(i=0;i<a;i++)
	{
		if(strcmp(book[i].booknum,str)==0)
		{
			for(j=i;j<a;j++)
			{
				book[j]=book[j+1];
			}
		}
	}
	memset(book[a].bookname,0,sizeof(book[a].bookname));
	memset(book[a].booknum,0,sizeof(book[a].booknum));
	book[a].bookamount=0;
	printf("删除成功!\n");
	booklen--;//图书种类进行更新 
}
void inquire()//查询图书信息 
{
	char str[10];
	int i,j,a=booklen,b=readerlen;
	system("cls");
	printf("请输入您要查询的图书编号或书名\n");
	scanf("%s",str);
	for(i=0;i<a;i++)
	{//对现有图书一一进行匹配,匹配成功后输出该书籍信息 
		if((strcmp(book[i].booknum,str)==0)||(strcmp(book[i].bookname,str)==0))
		{
			printf("该图书编号:%s,书名:%s,数量:%d\n",book[i].booknum,book[i].bookname,book[i].bookamount);
			for(j=0;j<b;j++)
			{
				if(strcmp(reader[j].books.bookname,book[i].bookname)==0)
				{//输出借阅该书籍的读者的用户名 
					printf("借阅该书籍的读者有:\n");
					printf("%s\n",reader[j].readername);
				}
			}
			return;
		}
	}
	printf("未找到该书籍,即将返回!\n");
	return;	
}
void traverse()//遍历图书信息 
{
	int i,a=booklen;
	system("cls");
	for(i=0;i<a;i++)
	{//将所有图书信息输出,方便读者借阅 
		printf("图书编号:%s,书名:%s,数量:%d\n",book[i].booknum,book[i].bookname,book[i].bookamount);
	}
}
void borrow()//借阅图书 
{
	char str[10],s[10];
	int a=booklen,i,j,b=readerlen;
	system("cls");
	printf("请输入您的用户编号或用户名\n");
	scanf("%s",s);
	for(j=0;j<b;j++)
	{
		if((strcmp(reader[j].readernum,s)==0)||(strcmp(reader[j].readername,s)==0))
		{
			break;
		}
	}
	printf("请输入你要借阅图书的编号或书名\n");
	scanf("%s",str);
	for(i=0;i<a;i++)
	{
		if((strcmp(book[i].booknum,str)==0)||(strcmp(book[i].bookname,str)==0))
		{
			if(book[i].bookamount>0)
			{
				book[i].bookamount--;//借阅成功后注意将该书的数量进行相应更新 
				reader[j].books=book[i];//将该书信息传入读者借阅书籍部分 
				printf("借阅成功!\n");
			}
			else{
				printf("该书籍库存量不足,请以后再尝试\n");//注意借阅前提是库存量大于0 
			}
			return;
		}
	}
	printf("未找到该书籍,即将返回!\n");
	return;
}
void returnbook()//归还图书
{//思路和借书的情况差不多 
	char s[10],str[10];
	int a=booklen,b=readerlen,i,j;
	system("cls");
	printf("请输入您的用户编号或用户名\n");
	scanf("%s",s);
	for(j=0;j<b;j++)
	{
		if((strcmp(reader[j].readernum,s)==0)||(strcmp(reader[j].readername,s)==0))
		{
			break;
		}
	}
	printf("请输入你要归还图书的编号或书名\n");
	scanf("%s",str);
	for(i=0;i<a;i++)
	{
		if((strcmp(book[i].booknum,str)==0)||(strcmp(book[i].bookname,str)==0))
		{
			book[i].bookamount++;//书籍库存量更新 
			reader[j].books.bookamount=0;//对读者借阅书籍部分进行清空 
			memset(&reader[j].books.bookname,0,sizeof(reader[j].books.bookname));
			memset(&reader[j].books.booknum,0,sizeof(reader[j].books.booknum));
			printf("归还成功!\n"); 
			return;
		}
	}
	printf("未找到该书籍,即将返回!\n");
	return;
}
void init()//初始化函数 
{
	int i;
	strcpy(reader[0].readernum,"666");
	strcpy(reader[0].readername,"小明");
	reader[0].books.bookamount=0;
	memset(&reader[0].books.bookname,0,sizeof(reader[0].books.bookname));
	memset(&reader[0].books.booknum,0,sizeof(reader[0].books.booknum));
	for(i=1;i<5;i++)
	{
		memset(reader[i].readernum,0,sizeof(reader[i].readernum));
		memset(reader[i].readername,0,sizeof(reader[i].readername));
		reader[0].books.bookamount=0;
		memset(&reader[i].books.bookname,0,sizeof(reader[i].books.bookname));
		memset(&reader[i].books.booknum,0,sizeof(reader[i].books.booknum));
	}
	strcpy(book[0].booknum,"111");
	strcpy(book[0].bookname,"数据结构");
	book[0].bookamount=10;
	for(i=1;i<5;i++)
	{
		memset(book[i].booknum,0,sizeof(book[i].booknum));
		memset(book[i].bookname,0,sizeof(book[i].bookname));
		book[i].bookamount=0;
	}
	return;
}
int main()
{
	init();
	while(1)
	{
		login();
	}
	return 0;
}

具体功能要求 1、图书维护 (1)设置管理员账号和密码; (2)图书信息录入:图书编号、书名、作者名、分类、图书数量; (3)图书信息更改; (4)图书信息删除; (5)图书信息查询:按图书编号查询、按书名查询、按作者名查询; (6)图书信息全部显示; (7)图书信息全部删除; (8)退出图书维护界面。 2、读者维护 (1)设置管理员账号和密码; (2)读者信息录入:读者姓名、学号; (3)读者信息更改; (4)读者信息删除; (5)读者信息查询:按读者编号查询、按读者姓名查询; (6)读者信息全部显示; (7)读者信息全部删除; (8)退出读者维护界面。 3、借书 (1)设置借书的范围(如5本); (2)图书数量随着借书的数量减少; (3)输入读者编号与图书编号后借书成功。 4、还书 (1)图书数量随着还书的数量增加; (2)输入读者编号与图书编号后还书成功。 5、添加功能 (1)添加一本图书的基本信息,包括书名、图书编号、作者名、类别、图书数量。 (2)添加读者信息: 添加图书借阅的基本信息,包括书名、学号。 6、更改功能 对图书和读者的信息进行修改。 7、查找功能 (1)图书信息查找; (2)读者信息查找。 8、显示功能 (1)显示所有图书信息; (2)显示所有借阅信息。 9、删除功能 (1)删除图书的基本信息; (2)删除读者的基本信息; (3)删除图书借阅基本信息。
一、 课程设计的基本要求 利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用C/C++语言进行程序设计,并规范地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。 具体要求如下: 1、 对现实复杂问题中的数据对象特性及组织方法进行分析和研究,设计适当的数据逻辑结构、存贮结构以及相应运算操作,把现实世界问题建模转化为计算机内部表示并进行处理。 2、 采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。学生也可根据自己对题目的理解增加新的功能模块(视情况可另外加分)。 3、 系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行,利用文件进行数据的提取与存储。 4、 程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)。 5、 编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等); 6、 写出规范的课程设计报告,具体要求见相关说明文档。 二、 课程设计的主要内容 [问题描述] 英文图书管理系统主要包括增加图书、查询图书、删除图书、图书借阅、还书、按照书号进行排序和统计当前借出和借入情况几个模块。 [基本要求]   要求数据结构用链表的形式,并能利用文件进行数据的提取与存储。 [测试数据]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈 迷学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值