简单易懂的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;
}

若有需要,可在我的报告里面查看带有文件操作和命令行参数的代码,注意里面还存在一点缺陷:还书的时候只能优先归还对应读者所借阅的最后一本书。

2021/6/28日新增
运行结果如下(代码真的没有问题) :
在这里插入图片描述
直接选择对应选项就可以进行操作了

  • 56
    点赞
  • 314
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
#include #include #include typedef struct { char number[10];//书号 char name[20];//书名 char author[20];//作者 char publish[50];//出版社 char time[20];//出版时间 float price; }mbook; typedef struct { int count;//书的本数 mbook book[100];//最大可有100本书 }mlibrary; mlibrary library; void save()//保存图书信息。 { FILE *fp; if((fp=fopen("library.doc","w"))==NULL) { printf("\n不能保存图书信息\n"); return; } fwrite(&library.count,sizeof(int),1,fp); fwrite(library.book,sizeof(library.book[0]),library.count,fp); } void putin() /*定义录入函数*/ { int y=1; system("cls"); while(y) { printf("\t请输入您的书籍的书号:"); scanf("%s",library.book[library.count].number); printf("\t请输入书名:"); scanf("%s",library.book[library.count].name); printf("\t请输入作者名:"); scanf("%s",library.book[library.count].author); printf("\t请输入出版社:"); scanf("%s",library.book[library.count].publish); printf("\t请输入出版时间:"); scanf("%s",library.book[library.count].time); printf("\t请输入该书的价格:"); fflush(stdin); scanf("%f",&library.book[library.count].price); library.count++; printf("\n是否继续录入(1.继续;0,退出录入):"); fflush(stdin); scanf("%d",&y); if (y!=1) { y=0; break; } } save(); } void lookup() { system("cls"); printf("图书号\t图书名\t作者名\t出版社\t出版日期\t图书价格\n"); int i ; for ( i=0;i<library.count;i++) { printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n",library.book[i].number,library.book[i].name,library.book[i].author,library.book[i].publish,library.book[i].time,library.book[i].price); } fflush(stdin); getchar(); } void search_by_name() /*定义按书名查询*/ { char s2[20]; int flag=1; printf("\n请输入要查询的书名: "); fflush(stdin); scanf("%s",s2); printf("图书号\t图书名\t作者名\t出版社\t出版日期\t图书价格\n"); int i ; for( i=0;i<library.count;i++ ) if(strcmp(s2,library.book[i].name)==0) { flag=0; printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n",library.book[i].number,library.book[i].name,library.book[i].author,library.book[i].publish,library.book[i].time,library.book[i].price); } if (flag) { printf("cannot found!"); } fflush(stdin); getchar(); } void search_by_author() /*定义按作者名查询*/ { char s3[20]; int flag=1; printf("请输入要查询的书的作者: "); fflush(stdin); scanf("%s",s3); printf("图书号\t图书名\t作者名\t出版社\t出版日期\t图书价格\n"); int i ; for( i=0;i<library.count;i++ ) if(strcmp(s3,library.book[i].author)==0) { flag=0; printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n",library.book[i].number,library.book[i].name,library.book[i].author,library.book[i].publish,library.book[i].time,library.book[i].price); } if (flag) { printf("cannot found!"); } fflush(stdin); getchar(); } void search() /*定义查询函数*/ { int a; system("cls"); /*进行清屏*/ printf("\t\t******************************\n"); printf("开始查询\n"); printf("\t\t\t1---------------search_by_name\n"); printf("\t\t\t2---------------search_by_writer\n"); printf("\t\t\t0---------------exit\n"); printf("\t\t******************************\n") ; printf("\t\t请选择你想要的查询方式:"); fflush(stdin); scanf("%d",&a); switch(a) { case 1: search_by_name(); break; case 2: search_by_author(); break; case 0: return; } } void del() /*定义删除函数*/ { char number[10]; system("cls"); /*清屏*/ printf("\n Please type in the number of the book you want to delete:"); fflush(stdin); scanf("%s",number); int i; for (i=0;i<library.count;i++) { if(strcmp(number,library.book[i].number)==0)break; } if (i!=library.count) { for(;i<library.count-1;i++) { strcpy(library.book[i].name,library.book[i+1].name); strcpy(library.book[i].number,library.book[i+1].number); strcpy(library.book[i].publish,library.book[i+1].publish); strcpy(library.book[i].author,library.book[i+1].author); strcpy(library.book[i].time,library.book[i+1].time); library.book[i].price=library.book[i+1].price; } library.count--; } else printf("\n cannot found!\n"); save(); fflush(stdin); getchar(); } void update()//修改图书信息 { char number[10]; system("cls"); /*清屏*/ printf("\n Please type in the number of the book you want to delete:"); fflush(stdin); scanf("%s",number); int i; for (i=0;i<library.count;i++) { if(strcmp(number,library.book[i].number)==0) { printf("图书号\t图书名\t作者名\t出版社\t出版日期\t图书价格\n"); printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n",library.book[i].number,library.book[i].name,library.book[i].author,library.book[i].publish,library.book[i].time,library.book[i].price); break; } } if (i!=library.count) { mbook book; printf("\n\t\t请输入修改后此图书的信息\n"); printf("\t请输入图书号:"); scanf("%s",book.number); printf("\t请输入图书名:"); scanf("%s",book.name); printf("\t请输入作者名:"); scanf("%s",book.author); printf("\t请输入出版社:"); scanf("%s",book.publish); printf("\t请输入出版时间:"); scanf("%s",book.time); printf("\t请输入该书的价格:"); fflush(stdin); scanf("%f",&book.price); strcpy(library.book[i].name,book.name); strcpy(library.book[i].number,book.number); strcpy(library.book[i].publish,book.publish); strcpy(library.book[i].author,book.author); strcpy(library.book[i].time,book.time); library.book[i].price=book.price; save(); } else printf("\n cannot found!\n"); fflush(stdin); getchar(); } void main() { FILE *fp; if((fp=fopen("library.doc","r"))==NULL) { printf("\n不能打开图书信息库\n"); fp=fopen("library.doc","w+"); printf("\n初始化图书信息库,初始化之后要重启程序\n"); library.count=0; fwrite(&library.count,sizeof(int),1,fp); fclose(fp); return; } fread(&library.count,sizeof(int),1,fp); fread(library.book,sizeof(library.book[0]),library.count,fp); fclose(fp); int a; do { system("cls"); printf("\n\n\n\n\n\t\t\t\t图书信息管理系统\t\t\t\t\n"); printf("\t\t*********************************************\n"); printf("\t\t\t1 ------------------图书信息录入\n"); printf("\t\t\t2 ------------------图书信息浏览\n"); printf("\t\t\t3 ------------------图书信息查询\n"); printf("\t\t\t4 ------------------图书信息删除\n"); printf("\t\t\t5 ------------------图书信息修改\n"); printf("\t\t\t0 -----------------退出图书信息系统\n"); printf("\t\t*********************************************\n"); printf("\t\tPlease Enter Choose: "); fflush(stdin); scanf("%d",&a); switch(a) { case 1: putin(); break; case 2: lookup(); break; case 3: search(); break; case 4: del(); break; case 5: update(); break; case 0: printf("\n\n退出\n\n"); break; default: printf("\n序号不对\n"); } }while(a!=0); save(); }
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值