1、 基本功能: 1) 相对应操作实现录入(可以直接从键盘录入) 2) 登录界面实现
1.1)管理员登录界面输入用户名和密码
判断用户名和密码是否正确
正确则:成功登录跳转到管理员界面
错误则:显示用户名或密码错误
是否重新输入 1. 是 2. 否
1.2)读者登录界面输入用户名和密码
判断用户名和密码是否正确
正确则:成功登录跳转到读者操作界面
错误则:显示用户名或密码错误
是否重新输入 1. 是 2. 否
1.3)注册账号界面输入注册的用户名和密码
检查用户名是否已存在,若已存在,则显示 用户名已存在请重新输入
若不存在,则 增加用户信息到用户存储链表中,并显示用户注册成功,请返回登录
下面介绍相关代码
此项目一共是五个文件,分别是
login.c login.h user.c user.h main.c
//此处为main.c文件
#include <stdio.h>
#include <stdbool.h>
#include "login.h"
#include "user.h"
struct H_User *H_user = NULL;
struct H_Book *H_book = NULL;
// 地址设问全局指针
int main()
{
// 初始化
// 用户存储链表
H_user = Create_LinkedList_User();
// 图书存储链表
H_book = Create_LinkedList_Book();
// 图书系统开始操作
bool running = true;
while (running)
{
// 1、输出登陆界面的信息
printf("************登录************\n");
printf("\t1、管理员登陆\n");
printf("\t2、读者登陆\n");
printf("\t3、注册账号\n");
printf("\t4、退出账号\n");
printf("****************************\n");
// 2、获取选项,根据选项执行不同的操作
int x;
scanf("%d", &x);
switch (x)
{
case 1:
admin_login();
// admin_UI(); // 进入管理员的登录成功界面
break;
case 2:
reader_login();
// reader_UI(); // 进入读者的登录成功界面
break;
case 3:
reader_register();
break;
case 4:
running = false;
break;
}
}
return 0;
}
//此处为 login.c 文件
#include "login.h"
#include "user.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
extern struct H_User *H_user;
extern struct H_Book *H_book;
void admin_login()
{
while (1)
{
// 显示管理员登录界面
printf("****************************\n");
printf("请输入用户名:");
char admin_user_name[32] = {0};
scanf("%s", admin_user_name);
printf("请输入密码:");
char admin_user_pwd[32] = {0};
scanf("%s", admin_user_pwd);
if (strcmp(admin_user_name, "admin") == 0 && strcmp(admin_user_pwd, "123456") == 0)
{
printf("登录成功\n");
admin_UI();
break;
}
else
{
printf("用户名或密码输入错误,是否重新输入\n");
printf("1、是 2、否\n");
int x;
scanf("%d", &x);
if (x == 2)
{
break;
}
}
}
}
void reader_login()
{
struct User_Node *current_user = NULL;
int flag = 0; // 0表示未成功登陆
while (1)
{
// 显示读者登录界面
printf("************读者登录界面************\n");
printf("请输入用户名:");
char reader_user_name[32] = {0};
scanf("%s", reader_user_name);
printf("请输入密码:");
char reader_user_pwd[32] = {0};
scanf("%s", reader_user_pwd);
// 读者信息包含:读者编号 账户名 密码 借书 等等
// 1、XXX 12345
// 2、YYY 12345
// 读者用户信息进行依次比较
struct User_Node *p = H_user->first;
while (p)
{
if (strcmp(reader_user_name, p->name) == 0 && strcmp(reader_user_pwd, p->pwd) == 0)
{
printf("读者登录成功\n");
current_user = p; // 将当前用户设置为成功登录的用户
flag = 1;
break;
}
else if (strcmp(reader_user_name, p->name) == 0 && strcmp(reader_user_pwd, p->pwd) != 0)
{
printf("密码错误,请重新输入\n");
break;
}
else
{
p = p->next;
}
}
if (p && flag) // 成功登录结束
{
reader_UI(current_user); // 将成功登录的用户传递给用户界面函数
break;
}
else if (p && flag == 0)
{
continue;
}
else
{
printf("该用户不存在,请返回注册\n");
break;
}
}
}
void reader_register()
{
printf("请输入用户名:\n");
char username[20];
scanf("%s", username);
printf("请输入密码:\n");
char password[20];
scanf("%s", password);
// 检查是否用户名已存在
struct User_Node *p = H_user->first;
while (p)
{
if (strcmp(username, p->name) == 0)
{
printf("用户名重复,注册失败,请重新注册\n");
return; // 用户名重复,直接返回,不进行注册操作
}
p = p->next;
}
// 创建新的用户节点
struct User_Node *new_user = (struct User_Node *)malloc(sizeof(struct User_Node));
if (new_user == NULL)
{
printf("内存分配失败\n");
return;
}
strcpy(new_user->name, username);
strcpy(new_user->pwd, password);
new_user->next = NULL;
// 将新用户节点添加到链表中
if (H_user->first == NULL)
{
H_user->first = new_user;
}
else
{
H_user->last->next = new_user;
}
H_user->last = new_user;
H_user->num++;
printf("用户注册成功\n");
}
// 管理员界面
void admin_UI()
{
while (1)
{
printf("************管理员界面************\n");
printf("\t1、录入新书信息\n");
printf("\t2、修改新书信息\n");
printf("\t3、删除图书信息\n");
printf("\t4、浏览全部图书\n");
printf("\t5、按书名或作者名查找\n");
printf("\t6、退出\n");
printf("****************************\n");
int x;
scanf("%d", &x);
switch (x)
{
case 1:
add_new_book();
break;
case 2:
modify_book_info();
break;
case 3:
delete_book();
break;
case 4:
display_all_books();
break;
case 5:
display_all_books();
break;
case 6:
exit_admin_menu();
return ;
}
}
}
// 1、录入新书信息
void add_new_book()
{
if (H_book == NULL)
{
printf("图书链表尚未创建,请先创建图书链表\n");
return;
}
struct Book *new_book = (struct Book *)malloc(sizeof(struct Book));
if (new_book == NULL)
{
printf("内存分配失败\n");
return;
}
printf("请输入书名:\n");
scanf("%s", new_book->book_name);
printf("请输入作者名:\n");
scanf("%s", new_book->author);
printf("请输入出版日期:\n");
scanf("%s", new_book->date);
printf("请输入数量:\n");
scanf("%d", &(new_book->count));
new_book->next = NULL;
if (H_book->first == NULL)
{
H_book->first = new_book;
}
else
{
H_book->last->next = new_book;
}
H_book->last = new_book;
H_book->num++;
printf("新书信息录入成功\n");
}
// 2、修改新书信息
void modify_book_info()
{
// 实现书名或作者名的查找
printf("请输入要修改信息的书名或作者名:\n");
char search_key[32];
scanf("%s", search_key);
struct Book *current = H_book->first;
struct Book *prev = NULL;
bool found = false;
while (current != NULL)
{
if (strcmp(current->book_name, search_key) == 0 || strcmp(current->author, search_key) == 0)
{
found = true;
printf("书名:%s 作者:%s 出版日期:%s 数量:%d\n",
current->book_name, current->author, current->date, current->count);
printf("请选择要修改的信息:\n");
printf("\t1、修改书名\n");
printf("\t2、修改作者\n");
printf("\t3、修改出版日期\n");
printf("\t4、修改数量\n");
printf("\t5、取消修改\n");
int choice;
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("请输入新的书名:\n");
scanf("%s", current->book_name);
break;
case 2:
printf("请输入新的作者名:\n");
scanf("%s", current->author);
break;
case 3:
printf("请输入新的出版日期:\n");
scanf("%s", current->date);
break;
case 4:
printf("请输入新的数量:\n");
scanf("%d", &(current->count));
break;
case 5:
printf("取消修改\n");
return;
default:
printf("无效的选项\n");
}
break;
}
prev = current;
current = current->next;
}
if (!found)
{
printf("未找到匹配的书籍信息\n");
}
}
// 3、删除图书信息
void delete_book()
{
// 实现书名或作者名的查找
printf("请输入要删除信息的书名或作者名:\n");
char search_key[32];
scanf("%s", search_key);
struct Book *current = H_book->first;
struct Book *prev = NULL;
bool found = false;
while (current != NULL)
{
if (strcmp(current->book_name, search_key) == 0 || strcmp(current->author, search_key) == 0)
{
found = true;
printf("找到匹配的书籍信息:\n");
printf("书名:%s 作者:%s 出版日期:%s 数量:%d\n",
current->book_name, current->author, current->date, current->count);
printf("确认要删除(1、是 2、否)\n");
int choice;
scanf("%d", &choice);
if (choice == 1)
{
// 删除图书信息
if (prev == NULL)
{
// 要删除的是第一个节点
H_book->first = current->next;
}
else
{
prev->next = current->next;
}
// 如果删除的是最后一个节点,更新last指针
if (current == H_book->last)
{
H_book->last = prev;
}
free(current); // 释放内存
H_book->num--; // 减少书籍种类数
printf("图书信息删除成功\n");
}
else
{
printf("取消删除\n");
}
break;
}
prev = current;
current = current->next;
}
if (!found)
{
printf("未找到匹配的书籍信息\n");
}
}
// 4、浏览全部图书
void display_all_books()
{
struct Book *current = H_book->first;
while (current != NULL)
{
printf("书名:%s 作者:%s 出版日期:%s 数量:%d\n",
current->book_name, current->author, current->date, current->count);
current = current->next;
}
}
// 5、按书名或者作者名查找
void search_books()
{
printf("请输入要查找的书名或作者名:\n");
char keyword[32];
scanf("%s", keyword);
struct Book *current_book = H_book->first;
bool found = false;
while (current_book != NULL)
{
if (strcmp(current_book->book_name, keyword) == 0 || strcmp(current_book->author, keyword) == 0)
{
printf("书名:%s\n", current_book->book_name);
printf("作者:%s\n", current_book->author);
printf("出版日期:%s\n", current_book->date);
printf("数量:%d\n", current_book->count);
printf("----------------\n");
found = true;
}
current_book = current_book->next;
}
if (!found)
{
printf("未找到匹配的书籍。\n");
}
}
// 6、退出
void exit_admin_menu()
{
printf("管理员界面已退出\n");
return;
//回到登录界面
}
// 读者界面
void reader_UI(struct User_Node *current_user)
{
while (1)
{
printf("************读者界面************\n");
printf("\t1、修改登录密码\n");
printf("\t2、按照书名查询\n");
printf("\t3、按照作者名查询\n");
printf("\t4、按照书名查找数量\n");
printf("\t5、退出\n");
printf("****************************\n");
printf("请输入您的选择:");
int choice;
scanf("%d", &choice);
switch (choice)
{
case 1:
// 执行修改登录密码的功能,并传递当前用户信息
modify_password(current_user);
break;
case 2:
// 执行按书名查询的功能
search_by_book_name();
break;
case 3:
// 执行按作者名查询的功能
search_by_author_name();
break;
case 4:
// 执行按书名查找数量的功能
search_book_count();
break;
case 5:
printf("退出读者界面\n");
return; // 退出读者界面
default:
printf("无效的选项,请重新输入\n");
break;
}
}
}
// 修改登录密码的函数
void modify_password(struct User_Node *user)
{
char new_password[32];
printf("请输入新的密码:");
scanf("%s", new_password);
// 更新用户密码
strcpy(user->pwd, new_password);
printf("密码修改成功\n");
}
// 按书名查询书籍的函数
void search_by_book_name()
{
char book_name[64];
printf("请输入要查询的书名:");
scanf("%s", book_name);
struct Book *current = H_book->first;
bool found = false;
while (current != NULL)
{
if (strcmp(current->book_name, book_name) == 0)
{
// 找到匹配的书籍
printf("书名:%s\n", current->book_name);
printf("作者:%s\n", current->author);
printf("出版日期:%s\n", current->date);
printf("数量:%d\n", current->count);
printf("----------------\n");
found = true;
}
current = current->next;
}
if (!found)
{
printf("未找到匹配的书籍。\n");
}
}
// 按作者名查询书籍的函数
void search_by_author_name()
{
char author_name[64];
printf("请输入要查询的作者名:");
scanf("%s", author_name);
struct Book *current = H_book->first;
bool found = false;
while (current != NULL)
{
if (strcmp(current->author, author_name) == 0)
{
// 找到匹配的书籍
printf("书名:%s\n", current->book_name);
printf("作者:%s\n", current->author);
printf("出版日期:%s\n", current->date);
printf("数量:%d\n", current->count);
printf("----------------\n");
found = true;
}
current = current->next;
}
if (!found)
{
printf("未找到匹配的书籍。\n");
}
}
// 按照书名查找数量的函数
void search_book_count()
{
char book_name[64];
printf("请输入要查询的书名:");
scanf("%s", book_name);
struct Book *current = H_book->first;
bool found = false;
while (current != NULL)
{
if (strcmp(current->book_name, book_name) == 0)
{
// 找到匹配的书籍
printf("书名:%s\n", current->book_name);
printf("数量:%d\n", current->count);
printf("----------------\n");
found = true;
break; // 找到了目标书籍,退出循环
}
current = current->next;
}
if (!found)
{
printf("未找到匹配的书籍。\n");
}
}
//此处为 login.h 文件
#ifndef __LOGIN_H__
#define __LOGIN_H__
#include "user.h"
extern void admin_login();
extern void reader_login();
extern void reader_register();
extern void admin_UI();
extern void reader_UI();
extern void add_new_book();
extern void modify_book_info();
extern void delete_book();
extern void display_all_books();
extern void search_books();
extern void exit_admin_menu();
extern void modify_password(struct User_Node *user);
extern void search_by_book_name();
extern void search_by_author_name();
extern void search_book_count();
#endif
//此处是 user.c 文件
#include "user.h"
#include "login.h"
#include <stdio.h>
#include <stdlib.h>
struct H_User *Create_LinkedList_User()
{
struct H_User *h = malloc(sizeof(*h));
h->num = 0;
h->first = h->last = NULL;
return h;
}
struct H_Book *Create_LinkedList_Book()
{
struct H_Book *h = malloc(sizeof(*h));
h->num = 0;
h->first = h->last = NULL;
return h;
}
//此处是 user.h 文件
#ifndef __USER_H__
#define __USER_H__
#include <stdio.h>
#include <stdbool.h>
struct User_Node // 读者用户类型
{
char name[32];
char pwd[32];
struct User_Node *next;
};
struct H_User
{
struct User_Node *first; // 指向第一个用户
struct User_Node *last; // 指向最后一个用户
int num;
};
struct Book
{
// int num; // 书籍编号
char book_name[32];
char author[32];
char date[32];
int count; // 数量
struct Book *next;
};
struct H_Book
{
struct Book *first; // 指向第一种书籍
struct Book *last; // 指向最后一种书籍
int num; // 书籍的种类数
};
extern struct H_User *Create_LinkedList_User();
extern struct H_Book *Create_LinkedList_Book();
//extern bool Insert_Node(const char *user_name, const char *user_pwd);
#endif
展示效果如下:(注意:用户需要注册再登录操作!!!)