(十二).图书管理系统(数组版)

对于前面已经学习的各种数据类型,包含基本数据类型和构造数据类型的应用,在实际应用项目中锻炼逻辑能力,学会对逻辑语句的规范应用。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define PI 100
typedef struct book	//书的属性 
{
	char name[30];		//书名成员 
	char writer[30];	//作者成员 
	char number[30];	//编号成员 
	int redu;			//热度成员 
	int num;			//库存成员 
	float jiage;		//价格成员 
}STU;

void pass(void);//系统密码操作 
void show(void);//主界面显示 
void showkey(void);//主界面控制台 
void book_js(void);//检索功能 
void book_js_quan(void); //检索功能 -全部检索 
void book_js_sm(void);//检索功能 -书名检索 
void book_js_zhuozhe(void);//检索功能 -作者检索 
void book_huan(void);//还书功能 
void book_redu(void);//热度功能 
void book_add(void);//添加书籍功能 
void book_pass(char *x);//密码修改功能 
void input(char *x);//密码暗文输入辅助函数 

STU books[PI];//书本总量定义
char password[10] = "123456";//系统初始密码 

/********************
*项目名:图书管理系统(数组版) 
*作者:李俊役 
*完成时间:2023年5月4日
*主要功能:检索借阅书籍,添加书籍,热度排名,系统密码保护,修改密码. 
*********************/
int main()
{
	pass();
	while(1)
	{
		show();
		showkey();
	}
	return 0;
}
void pass(void)//系统密码操作 
{
	char pass_ree[10] = {0};
	L3:
	printf("请输入密码:");
	input(pass_ree);
	if(strcmp(pass_ree,password) == 0)
	{
		return;
	}
	else
	{
		printf("\n密码输入错误,请重新输入密码!\n");
		goto L3; 
	}
}
void show(void)//主界面显示 
{
	system("cls");
	printf("-------------------------------------------------\n");
	printf("|          欢迎来到图书管理系统                 |\n");
	printf("-------------------------------------------------\n");
	printf("|        【1】检索      【2】还书               |\n");
	printf("|        【3】热度排行榜【4】添加新书           |\n");
	printf("|        【5】密码修改  【0】退出程序           |\n");
	printf("-------------------------------------------------\n");
	printf("请选择:");
	
}
void showkey(void)//主界面控制台 
{
	char key1;
	L:
	key1 = getch();
	switch(key1)
	{
		case '1':system("cls");book_js();break;//检索 
		case '2':system("cls");book_huan();break;//还书 
		case '3':system("cls");book_redu();break;//热度排行榜 
		case '4':system("cls");book_add();break;//添加新书 
		case '5':system("cls");book_pass(password);break;//密码修改 
		case '0':system("cls");exit(1);break;
		default:printf("输入命令格式有误,重新输入\n");goto L;break;
	}
}
void book_js(void)//检索功能  
{
	char ch;
	L2:
	printf("-------------------------------------------------\n");
	printf("|                搜索方式如下                    |\n");
	printf("-------------------------------------------------\n");
	printf("|               【1】全部检索                    |\n");
	printf("|               【2】按书名检索                  |\n");
	printf("|               【3】按作者检索                  |\n");
	printf("|               【0】返回值主界面                |\n");
	printf("-------------------------------------------------\n");
	printf("请选择:");
	ch = getch();
	system("cls");
	if(ch == '1')
	{
		book_js_quan();
		return;	
	}	
	else if(ch == '2')
	{
		book_js_sm();
		return;
	}
	else if(ch == '3')
	{
		book_js_zhuozhe();
		return;
	}
	else if(ch == '0')
		return;
	else
	{
		printf("无效指令,请重新输入:\n");
		goto L2;		
	} 
}
void book_js_quan(void)//打印已存全部的书,没有借阅功能 
{
	int i=0;
	printf("搜索到的图书如下:\n");
	while(*(books[i].name) != '\0') 
	{
		printf("书名:%s\n作者:%s\n编号:%s\n热度:%d\n库存:%d\n价格:%f\n",books[i].name,books[i].writer,books[i].number,books[i].redu,books[i].num,books[i].jiage);
		i++;
		printf("---------------------------------------\n"); 
	}
	printf("按【任意键】退回主界面\n");
	getch(); 
}
void book_js_sm(void)//书名检索,一次只能检索出一本书 
{
	int i=0;
	char arr[30] = {0};
	printf("请输入要查找的书名:\n");
	gets(arr);
	while(books[i].name[0] != '\0') 
	{
		if(strcmp(arr,books[i].name) == 0)
		{
			printf("找到了此书,情况如下:\n");
			printf("书名:%s\n作者:%s\n编号:%s\n热度:%d\n库存:%d\n价格:%f\n",books[i].name,books[i].writer,books[i].number,books[i].redu,books[i].num,books[i].jiage);
			if(books[i].num>0)
			{
				printf("该书库存还有%d,是否要借阅?按【y】键借阅,按【任意键】键返回主界面\n",books[i].num);
				if(getch() == 'y')
				{	
					books[i].num-=1;
					printf("---------------------------------------------------------------\n"); 
					printf("借阅成功,该书库存还有%d本,按【任意键】键返回主界面\n",books[i].num);
					getch(); 
				}
				else
					return;
			}
			else
			{
				printf("---------------------------------------------------------------\n"); 
				printf("该书库存不足,请借阅其他书籍!按【任意键】键返回主界面\n");
				getch(); 
			}
		}
		i++;
	}
	printf("没有找到此书,按【任意键】键返回主界面\n");
	getch(); 
}
void book_js_zhuozhe(void)//作者名检索,一次可以检索出多本,有几层跳转判断 
{
	int i=0,j=0,num1;
	int a[PI];
	char arr[30] = {0};
	printf("请输入要查找的作者名:\n");
	gets(arr);
	while(books[i].name[0] != '\0') 
	{
		if(strcmp(arr,books[i].writer) == 0)
		{
			if(j == 0)
				printf("找到了与该作者相关的书,情况如下:\n");
			printf("第%d本书\n,书名:%s\n作者:%s\n编号:%s\n热度:%d\n库存:%d\n价格:%f\n----------------\n",j+1,books[i].name,books[i].writer,books[i].number,books[i].redu,books[i].num,books[i].jiage);
			a[j] = i;
			j++;
		}
		i++;
	}
	if(j == 0)
	{
		printf("没有找到与该作者相关的书,按【任意键】键返回主界面\n");
		getch();
		return;
	}
	else
	{
		printf("是否要借阅该作者的书籍?按【y】键借阅,按【任意键】键返回主界面\n");
		if(getch() == 'y')
		{
			L1:
			printf("选择借阅第几本书:\n");
			scanf("%d",&num1);
			if(num1 < 1 || num1 > PI)
			{
				printf("输入错误,请重新输入:\n");
				goto L1; 
			}
			int len = a[num1-1];
			if(books[len].num>1)
			{
				printf("该书书名为:%s,库存还有%d,按【y】键借阅,按【任意键】键返回主界面\n",books[len].name,books[len].num);
				if(getch() == 'y')
				{
					books[len].num-=1;
					printf("---------------------------------------------------------------\n"); 
					printf("借阅成功,该书库存还有%d本,按【任意键】键返回主界面\n",books[len].num);
					getch();
					return; 
				}
				else
					return;
			}
			else
			{
				printf("---------------------------------------------------------------\n"); 
				printf("该书库存不足,请借阅其他书籍!按【任意键】键返回主界面\n");
				getch(); 	
			}
		}
		else
			return;
	}
}
void book_huan(void)//还书功能,必须存在次数才能归还,归还后库存加1 
{
	int i=0;
	char arr[30] = {0};
	printf("请输入要归还的书名:\n");
	gets(arr);
	while(books[i].name[0] != '\0') 
	{
		if(strcmp(arr,books[i].name) == 0)
		{
			printf("找到了此书,情况如下:\n");
			printf("书名:%s\n作者:%s\n编号:%s\n热度:%d\n库存:%d\n价格:%f\n",books[i].name,books[i].writer,books[i].number,books[i].redu,books[i].num,books[i].jiage);
			printf("是否要归还?按【y】键归还,按【任意键】键返回主界面\n",books[i].num);
			if(getch() == 'y')
			{	
				books[i].num+=1;
				printf("---------------------------------------------------------------\n"); 
				printf("归还成功,该书库存还有%d本,按【任意键】键返回主界面\n",books[i].num);
				getch(); 
			}
			else
				return;
		}
		i++;
	}
	printf("没有找到此书,按【任意键】键返回主界面\n");
	getch(); 
}
void book_redu(void)//热度排行榜,冒泡排序对结构体变量全部赋值交换 
{
	STU temp;
	int i = 0,m,n;
	while(books[i].name[0] != '\0') 
	{
		i++;
	}
	if(i == 0)
	{
		printf("还没有书籍,快去添加吧!按【任意键】退回主界面\n");
		getch(); 
		return;
	}
	else
	{
		printf("热度排行如下:\n");
		for(m = 1;m < i; m++)
		{
			for(n = 0;n < i-m;n++)
			{
				if(books[n].redu < books[n+1].redu)
				{
					temp = books[n+1];
					books[n+1] = books[n];
					books[n] = temp;
				}
			}
		}
		for(m = 0;m < i;m++)
		{
			printf("第%d本书\n,书名:%s\n作者:%s\n编号:%s\n热度:%d\n库存:%d\n价格:%f\n----------------\n",m+1,books[m].name,books[m].writer,books[m].number,books[m].redu,books[m].num,books[m].jiage);
		}
		printf("按【任意键】退回主界面\n");
		getch();
	}
} 
void book_add(void)//添加书籍功能,保存且多次输入结构体成员 
{
	static int i = 0;
	while(i<PI)
	{
		printf("请添加第%d本书\n",i+1);
		
		//用户手动输入变量成员信息
		printf("请输入书名:");
		scanf("%s",books[i].name);
		printf("请输入作者:");
		scanf("%s",books[i].writer);
		printf("请输入编号:");
		scanf("%s",books[i].number);
		printf("请输入热度:");
		scanf("%d",&books[i].redu);
		printf("请输入库存:");
		scanf("%d",&books[i].num);
		printf("请输入价格:");
		scanf("%f",&books[i].jiage);

		i++;

		//询问是否继续
		printf("是否继续输入,继续请按【y】 退出【任意键】\n");
		if(getch() != 'y')
		{
			break;
		}
		if(i > PI)
		{
			printf("书籍已满,请删除书籍在添加!按【任意键】退出\n");
			getch();
			break;
		}		
	}
}
void book_pass(char *x)//密码修改功能 通过地址传递修改全局变量 
{
	char a[10],b[10];
	L4:
	printf("请输入新密码(最多9位):");
	input(a);
	printf("\n"); 
	printf("请再次输入新密码(最多9位):");
	input(b);
	printf("\n"); 
	if(strcmp(a,b) == 0)
	{
		strcpy(x,b);
		printf("密码修改成功,请重新登入\n"); 
		pass();
	}
	else
	{
		printf("两次输入的密码不一致,按【Y】重新输入,按【任意键】退回主界面\n");
		if(getch() == 'y')
		{
			goto L4;
		}
		else
			return; 
	}
			
}
void input(char *x)//密码暗文输入 
{
	char ch;
	int i = 0;
	L:
	i = 0;
	while(1)
	{
		if(i>9)
		{
			printf("密码长度不能超过9位\n");
			memset(x,'\0',10);
			goto L;	
		}
		ch = getch();
		if(ch != '\r' && ch != '\b')
		{
			x[i] = ch;
			i++;
			printf("*");
		}
		if(ch == '\r')
		{
			x[i] = '\0';
			break;
		}
		if(ch == '\b')
		{
			if(i==0) continue;
			i--;
			x[i] = '\0';
			printf("\b");
			printf(" ");
			printf("\b");
		}
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值