对于前面已经学习的各种数据类型,包含基本数据类型和构造数据类型的应用,在实际应用项目中锻炼逻辑能力,学会对逻辑语句的规范应用。
#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");
}
}
}