初写项目:图书管理系统

      实现了一个简易的图书管理系统,可进行管理员和读者的登陆。能完成对管理员,读者和图书数据的增删改查,按页显示数据,批量导入导出数据,借书还书功能。

用三个结构体记录管理员,读者和图书三种数据。

typedef struct Book{
	char idOfBook[10];		//图书id
	char nameOfBook[40];	        //书名
	char artistOfBook[40];          //作者
	char timeOfBook[20];	        //出版时间
	char clubOfBook[40];	        //出版社
	int moneyOfBook;		//售价
	float scoreOfBook;		//评分
	int beReadTime;       		//借阅次数
	int stateOfBook;		//图书状态
	long readBookTime;		//借阅时间
}Book;
typedef struct Gm{
	char idOfGm[10];		//管理员id
	char passwordOfGm[20];	        //管理员密码
	char nameOfGm[40];		//管理员姓名
	char workOfGm[40];		//管理员岗位
}Gm;
typedef struct Reader{
	char idOfReader[10];			//读者id
	char passwordOfReader[20];		//读者密码
	char nameOfReader[40];		        //读者姓名
	char birthOfReader[20];		        //读者生日
	char phoneOfReader[20];		        //读者电话
	int moneyOfReader;			//余额
	char haveReadBook[10][40];		//已借图书
	char haveForwardBook[5][40];		//已预约图书
}Reader;

 

初始化定义数据,其中超级管理员的账号和密码需要先保存在数据库中。

//超级管理员账号
Gm superGm={};
//定义初始的id
char idGm[10]="10000001";
char idReader[10]="20000001";
char idBook[10]="30000001";
//定义结构体的长度
int sizeofGm=sizeof(Gm);
int sizeofReader=sizeof(Reader);
int sizeofBook=sizeof(Book);
//定义管理员结构体数组
int capGm=10;
int sizeGm=0;
Gm *pGm=NULL;
//定义读者结构体数组
int capReader=10;
int sizeReader=0;
Reader *pReader=NULL;
//定义图书结构体数组
int capBook=10;
int sizeBook=0;
Book *pBook=NULL;

程序开始先读取数据,这里以读取管理员为例。

int load_gm(){
	int num=0;
	FILE *pfGm=fopen("./data/gm.txt","r");
	if(pfGm==NULL){
		perror("fopen");
		exit(-1);
	}
	fread(&idGm,10,1,pfGm);
	Gm g1={};
	fread(&g1,sizeofGm,1,pfGm);
	superGm=g1;
	while(fread(&g1,sizeofGm,1,pfGm)>0){
		int res=add_gm_file(g1);
		if(res==0){
			num++;	
		}
	}

	fclose(pfGm);
	return num;
}

然后是显示界面,并跳转至功能函数

#include "data.h"
#include "show.h"
#include "gm.h"
#include "book.h"
#include "reader.h"


/*
	函数功能:显示主界面
	没有返回数据
*/
void main_menu(void){
	system("clear");
	printf("--------图书管理系统--------\n");
	printf("1.检索图书\n");
	printf("2.管理员登录\n");
	printf("3.读者登录\n");
	printf("0.退出系统\n");
	printf("operater:");
}

/*
	函数功能:显示图书管理员的工作界面
	没有返回数据
*/
void gm_book_menu(){
	system("clear");
	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("0.返回主菜单\n");
}
/*
	函数功能:实现图书管理员的各项功能
	形参:char *id  登录的管理员的id
*/
void welcome_gm_book(char *id){
	while(1){
		gm_book_menu();
		int opt;
		printf("operater:");
		scanf("%d",&opt);
		switch(opt){
			case 1:{
				change_gm(id);
				stop();
				break;
			}
			case 2:{
				add_book();	
				stop();
				break;
			}
			case 3:{
				del_book();
				stop();
				break;
			}
			case 4:{
				change_book();
				stop();
				break;
			}
			case 5:{
				search_books();
				stop();
				break;
				}
			case 6:{
				list_book();
				stop();
				break;	
			}
			case 7:{
				add_books();
				stop();
				break;
			}
			case 8:{
				dump_books();
				stop();
				break;
			}
			case 0:return;
		}
	}
}
void gm_reader_menu(){
	system("clear");
	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("0.返回主菜单\n");
}
/*
	函数功能:显示读者管理员的工作界面
	没有返回数据
	形参:char *id 登录的管理员id
*/
void welcome_gm_reader(char *id){
	while(1){
		gm_reader_menu();
		int opt;
		printf("operater:");
		scanf("%d",&opt);
		switch(opt){
			case 1:{
				change_gm(id);
				stop();
				break;
			}
			case 2:{
				add_reader();
				stop();
				break;
			}
			case 3:{
				del_reader();
				stop();
				break;
			}
			case 4:{
				find_reader();
				stop();
				break;
			}
			case 5:{
				list_reader();
				stop();
				break;
			}
			case 6:{
				add_money();
				stop();
				break;
			}
			case 7:{
				add_readers();
				stop();
				break;
			}
			case 8:{
				dump_readers();
				stop();
				break;
			}
			case 0:return;
		}
	}
}
void super_menu(){
	system("clear");
	printf("超级管理员界面:\n");
	printf("1.修改用户名密码\n");
	printf("2.添加管理员\n");
	printf("3.删除管理员\n");
	printf("4.批量导入管理员\n");
	printf("5.批量导出管理员\n");
	printf("6.列出管理员名单\n");
	printf("0.返回主菜单\n");
	
}
/*
	函数功能:显示超级管理员的工作界面
	没有返回数据
*/
void welcome_supergm(){
	while(1){
		super_menu();
		int opt;
		printf("operater:");
		scanf("%d",&opt);
		switch(opt){
			case 1:{
				change_supergm();
				stop();
				break;	
			}
			case 2:{
				add_gm();
				stop();
				break;
			}
			case 3:{
				del_gm();
				stop();
				break;	
			}
			case 4:{
				add_gms();
				stop();
				break;
			}
			case 5:{
				dump_gms();
				stop();
				break;
			}
			case 6:{
				list_gm();
				stop();
				break;
			}
			case 0:return;
			default:break;
		}
	}
}
void reader_menu(){
	system("clear");
	printf("读者界面:\n");
	pingfen_top();
	redu_top();
	printf("1.修改密码\n");
	printf("2.搜索图书\n");
	printf("3.列出所有图书\n");
	printf("4.借书\n");
	printf("5.预约\n");
	printf("6.还书\n");
	printf("0.返回主菜单\n");	
}
/*
	函数功能:显示读者的工作界面
	没有返回数据
	形参: char *id 登录的读者id
*/
void welcome_reader(char *id){
	while(1){
		reader_menu();
		note(id);
		int opt;
		printf("operater:");
		scanf("%d",&opt);
		switch(opt){
			case 1:{
				change_reader(id);
				stop();
				break;
			}
			case 2:{
				search_books();
				stop();
				break;
			}
			case 3:{
				list_book();
				stop();
				break;
			}
			case 4:{
				takebook(id);
				stop();
				break;
			}
			case 5:{
				forwardbook(id);
				stop();
				break;
			}
			case 6:{
				backbook(id);
				stop();
				break;
			}
			case 0:return;
		}
	}
}
/*
	函数功能:管理员登录界面 读取id和密码
	没有返回数据
*/
void log_gm(){
	system("clear");
	printf("输入0返回主菜单。\n");
	printf("输入您的管理员ID(1000xxxx):");
	char id[10];
	scanf("%s",id);
	if(strcmp(id,"0")==0){
		return;	
	}
	printf("输入您的密码:");
	char password[20];
	scanf("%s",password);
	if(strcmp(password,"0")==0){
		return;	
	}
	test_gm(id,password);
}
/*
	函数功能:读者登录界面 读取id和密码
	没有返回数据
*/
void log_reader(){
	system("clear");
	printf("输入0返回主菜单。\n");
	printf("输入您的读者ID(2000xxxx):");
	char id[10];
	scanf("%s",id);
	if(strcmp(id,"0")==0){
		return;	
	}
	printf("输入您的密码:");
	char password[20];
	scanf("%s",password);
	if(strcmp(password,"0")==0){
		return;	
	}
	test_reader(id,password);
}
/*
	函数功能:检查管理员登录结果
	没有返回数据
	形参:
	char *id       输入的id
	char *password 输入的密码
*/
void test_gm(char *id,char *password){
	int right=0;
	right=check(id,password);
	if(right==3){
		welcome_supergm();	
	}
	if(right==2){
		welcome_gm_reader(id);	
	}
	if(right==1){
		welcome_gm_book(id);	
	}
	if(right==0){
		printf("输入0返回主菜单\n");
		printf("输入1重试\n");
		int opt;
		printf("operater:");
		scanf("%d",&opt);
		switch(opt){
			case 0:return;
			case 1:{
				log_gm();
				break;
			}
		}
	}
}
/*
	函数功能:检查读者的登录结果
	没有返回数据
	形参:
	char *id       输入的id 
	char *password 输入的密码
*/
void test_reader(char *id,char *password){
	int right=0;
	right=check(id,password);
	if(right==4){
		welcome_reader(id);	
	}else{
		printf("输入0返回主菜单\n");
		printf("输入1重试\n");
		int opt;
		printf("operater:");
		scanf("%d",&opt);
		switch(opt){
			case 0:return;
			case 1:{
				log_reader();
				break;
			}
		}
	}
}
void run(void){
	printf("按回车键进入系统\n");
	getchar();
	while(1){
		main_menu();
		int opt=0;
		scanf("%d",&opt);
		switch(opt){
			case 1:	{
				search_books();
				stop();
				break;
			}
			case 2:{
				log_gm();
				break;
			}
			case 3:{
				log_reader();
				break;
			}
			case 0:{
				printf("感谢您的使用\n");
				return;
			}
			default:break;
		}
	}
}

这里以图书功能函数为例

#include "book.h"

/*
	函数功能:查找图书
	返回查找图书在数组中的下标 没找到则不返回数据
*/
int find_book(){
	printf("输入图书ID:");
	char id[40];
	scanf("%s",id);
	int index=search_book(id);
	if(index==-1){
		printf("查无此书。\n");	
		return;
	}
	show_book(pBook[index]);
	return index;
}
/*
	函数功能:显示修改图书信息的页面
	没有返回数据
*/
void change_book(){
	int index=find_book();
	while(1){
		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("0.返回上一级菜单\n");
		int opt;
		printf("operater:");
		scanf("%d",&opt);
		if(opt==0){
			return;	
		}else{
			change_book_data(index,opt);	
		}
		show_book(pBook[index]);
	}
}	
/*
	函数功能:显示一个图书结构体内的成员信息
	没有返回数据
	形参: Book b 图书结构体变量
*/
void show_book(Book b){
	printf("图书ID:%s ",b.idOfBook);
	printf("书名:%s ",b.nameOfBook);
	printf("作者:%s ",b.artistOfBook);
	printf("\n");
	printf("出版时间:%s ",b.timeOfBook);
	printf("出版社:%s ",b.clubOfBook);
	printf("售价:%d ",b.moneyOfBook);
	printf("\n");
	printf("评分:%g ",b.scoreOfBook);
	printf("借阅次数:%d ",b.beReadTime);
	printf("状态:");
	switch(b.stateOfBook){
		case 1:{
			printf("可借阅");
			break;
		}
		case 0:{
			printf("已被借阅可预约");	
			break;
		}
		case -1:{
			printf("已被预约");
			break;
		}
		case -2:{
			printf("已被借阅且预约");
			break;	
		}
	}
	printf("\n");
}
/*
	函数功能:添加图书信息到结构体数组中
	返回int数据 -1表示添加失败 0表示添加成功
	形参:Book b 图书结构体变量
*/
int add_book_file(Book b){
	if(pBook==NULL){
		pBook=calloc(capBook,sizeofBook);
		if(pBook==NULL){
			return -1;	
		}
	}
	if(sizeBook>=capBook){
		pBook=realloc(pBook,2*capBook*sizeofBook);
		capBook=2*capBook;
		if(pBook==NULL){
			return -2;	
		}
	}
	pBook[sizeBook]=b;
	++sizeBook;
	return 0;
}
/*
	函数功能:添加图书,读取图书信息
	没有返回数据
*/
void add_book(){
	Book b={};
	strcpy(b.idOfBook,idBook);
	add_id(idBook);
	printf("输入书名:");
	scanf("%s",b.nameOfBook);
	printf("输入作者:");
	scanf("%s",b.artistOfBook);
	printf("输入出版时间:");
	scanf("%s",b.timeOfBook);
	printf("输入出版社:");
	scanf("%s",b.clubOfBook);
	printf("输入售价:");
	scanf("%d",&b.moneyOfBook);
	b.scoreOfBook=0;
	b.beReadTime=0;
	b.stateOfBook=1;
	b.readBookTime=0;
	show_book(b);
	int res=add_book_file(b);
	if(res==0){
		printf("添加成功\n");	
	}else{
		perror("add_book_file");
		exit(-1);
	}
}
void search_books(){
	printf("请输入查找关键字:");
	char key[40];
	scanf("%s",key);
	int i,j,f;
	int len=strlen(key);
	for(i=0;i<sizeBook;i++){
		f=0;
		char *pb=pBook[i].nameOfBook;
		j=0;
		while(*(pb+j)!='\0'){
			if(strncmp(pb+j,key,len)==0){
				show_book(pBook[i]);
				f=1;
				break;
			}
			++j;
		}
		if(f==1){
			continue;	
		}
		char *pa=pBook[i].artistOfBook;
		j=0;
		while(*(pa+j)!='\0'){
			if(strncmp(pa+j,key,len)==0){
				show_book(pBook[i]);
				break;
			}
			++j;
		}

	}
}
/*
	函数功能:搜索图书
	返回int数据 第一个符合要求的id -1表示没有找到
	形参: char *id 读取的搜索内容
*/
int search_book(char *id){
	int i;
	int n=-1;
	for(i=0;i<sizeBook;i++){
		if(strcmp(pBook[i].idOfBook,id)==0 || strcmp(pBook[i].nameOfBook,id)==0){
			return i;	
		}
		if(strcmp(pBook[i].artistOfBook,id)==0){
			printf("该作者著有:");
			n=i;
			break;
		}
	}
	if(n!=-1){
		for(i=n;i<sizeBook;i++){
			if(strcmp(pBook[i].artistOfBook,id)==0){
				printf("%s ",pBook[i].nameOfBook);
			}
		}
		printf("\n");
		return n;
	}
	return -1;
}
/*
	函数功能:删除图书
	没有返回数据
*/
void del_book(){
	if(sizeBook==0){
		printf("无数据\n");
		return;
	}	
	printf("输入要删除的图书id:");
	char id[40];
	scanf("%s",id);
	int index=search_book(id);
	if(index==-1){
		printf("没有找到该图书\n");
		return ;
	}
	show_book(pBook[index]);
	int ret=sure();
	if(ret==1){
		pBook[index]=pBook[sizeBook-1];
		--sizeBook;
		printf("删除成功\n");
	}else{
		printf("操作已取消\n");	
	}
}
/*
	函数功能:更改图书信息
	没有返回数据
	形参:
	index 该图书在数组中的下标
	n     要更改的项目选项
*/
void change_book_data(int index,int n){
	switch(n){
		case 1:{
			char newname[40];
			printf("输入新书名:");
			scanf("%s",newname);
			strcpy(pBook[index].nameOfBook,newname);
			break;
		}
		case 2:{
			char newartist[40];
			printf("输入新作者:");
			scanf("%s",newartist);
			strcpy(pBook[index].artistOfBook,newartist);
			break;
		}
		case 3:{
			char newtime[40];
			printf("输入新出版时间:");
			scanf("%s",newtime);
			strcpy(pBook[index].timeOfBook,newtime);
			break;
		}
		case 4:{
			char newclub[40];
			printf("输入新出版社:");
			scanf("%s",newclub);
			strcpy(pBook[index].clubOfBook,newclub);
			break;
		}
		case 5:{
			int newmoney;
			printf("输入新售价:");
			scanf("%d",&newmoney);
			pBook[index].moneyOfBook=newmoney;
			break;
		}
		case 6:{
			float newscore;	
			printf("输入新评分:");
			scanf("%f",&newscore);
			pBook[index].scoreOfBook=newscore;
			break;
		}
		case 7:{
			int newreadtime;
			printf("输入借阅次数:");
			scanf("%d",&newreadtime);
			pBook[index].beReadTime=newreadtime;
			break;
		}
		case 8:{
			int newstate;
			printf("输入新状态:");
			scanf("%d",&newstate);
			pBook[index].stateOfBook=newstate;
			break;
		}
	}
}
/*
	函数功能:列出评分最高的十本图书
	没有返回数据
*/
void pingfen_top(){
	sort(pBook,sizeBook,sizeofBook,scoredown);
	int i;
	printf("评分榜TOP10:\n");
	for(i=0;i<sizeBook && i<10;i++){
		printf("%d.%s ",i+1,pBook[i].nameOfBook);	
	}
	printf("\n");
}
/*
	函数功能:列出阅读次数最多的十本图书
	没有返回数据
*/
void redu_top(){
	sort(pBook,sizeBook,sizeofBook,redudown);
	int i;
	printf("热度榜TOP10:\n");
	for(i=0;i<sizeBook && i<10;i++){
		printf("%d.%s ",i+1,pBook[i].nameOfBook);	
	}
	printf("\n");
}
/*
	函数功能:列出所有图书的信息,按页显示,每页十本
	没有返回数据
*/
void list_book(){
	sort(pBook,sizeBook,sizeofBook,idup);
	int i;
	int page=1;
	int sum=sizeBook/5+1;
	while(1){
		system("clear");
		for(i=5*page-5;i<sizeBook && i<5*page;i++){
			show_book(pBook[i]);
			printf("------------------------\n");
		}
		printf("第%d页,共%d页\n",page,sum);
		printf("(1)向前翻页(2)向后翻页(0)返回上一级菜单\n");
		int opt;
		printf("opterater:");
		scanf("%d",&opt);
		switch(opt){
			case 1:{
				--page;
				if(page==0){
					page=1;	
				}
				break;
			}
			case 2:{
				++page;
				if(page>sum){
					page=sum;	
				}
				break;
			}
			case 0:return;
		}
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值