第九章:项目案例——基于MATLAB的图书管理系统
1. 引言
图书管理系统是一种用于管理图书馆中图书信息的软件系统。本文将使用MATLAB开发一个简单的图书管理系统,并详细介绍代码实现过程。我们将利用MATLAB提供的数据结构和文件操作函数来设计和实现系统功能。
2. 思路分析
图书管理系统需要实现以下功能:
- 添加图书:输入图书信息并将其保存到文件中。
- 查询图书:根据关键词搜索图书信息。
- 展示全部图书:显示所有图书的信息。
- 删除图书:根据图书ID删除指定图书。
- 修改图书:根据图书ID修改指定图书的信息。
为了实现这些功能,我们将利用MATLAB提供的数据结构“结构体”来存储图书信息,使用文件操作函数来读写文件,并结合循环、条件语句等MATLAB语法实现系统功能。
3. 代码实现
3.1. 添加图书
% 创建图书结构体数组
books = struct('bookID', {}, 'title', {}, 'author', {});
% 提示用户输入图书信息
bookID = input('请输入图书ID:');
title = input('请输入图书标题:', 's');
author = input('请输入图书作者:', 's');
% 将图书信息添加到结构体数组
book = struct('bookID', bookID, 'title', title, 'author', author);
books(end+1) = book;
% 保存图书信息到文件
saveBooks(books);
以上代码中,我们首先创建了一个空的图书结构体数组books
,用于存储图书信息。然后,通过提示用户输入图书信息,并将其赋值给对应的变量。之后,我们创建了一个包含输入信息的结构体book
,并使用end+1
将其添加到books
数组的最后位置。最后,我们调用 saveBooks
函数将图书信息保存到文件。
3.2. 查询图书
% 加载图书信息
books = loadBooks();
% 提示用户输入查询关键词
keyword = input('请输入查询关键词:', 's');
% 根据关键词搜索图书信息
foundBooks = [];
for i = 1:length(books)
if contains(books(i).title, keyword) || contains(books(i).author, keyword)
foundBooks = [foundBooks, books(i)];
end
end
% 显示搜索结果
if isempty(foundBooks)
disp('未找到相关图书。');
else
for i = 1:length(foundBooks)
disp(['图书ID:', num2str(foundBooks(i).bookID)]);
disp(['标题:', foundBooks(i).title]);
disp(['作者:', foundBooks(i).author]);
disp('-------------------------');
end
end
以上代码中,我们首先使用 loadBooks
函数加载之前保存的图书信息。然后,提示用户输入查询关键词,并将其赋值给变量 keyword
。之后,我们通过循环遍历 books
数组,并使用 contains
函数判断图书标题或作者中是否包含关键词。匹配成功的图书将被添加到一个新数组 foundBooks
中。最后,根据搜索结果,分别显示搜索到的图书信息或者提示未找到相关图书。
3.3. 展示全部图书
% 加载图书信息
books = loadBooks();
% 显示所有图书信息
for i = 1:length(books)
disp(['图书ID:', num2str(books(i).bookID)]);
disp(['标题:', books(i).title]);
disp(['作者:', books(i).author]);
disp('-------------------------');
end
以上代码中,我们使用 loadBooks
函数加载图书信息。然后,使用循环遍历 books
数组,并逐个显示图书信息。
3.4. 删除图书
% 加载图书信息
books = loadBooks();
% 提示用户输入要删除的图书ID
bookID = input('请输入要删除的图书ID:');
% 查找图书索引
index = -1;
for i = 1:length(books)
if books(i).bookID == bookID
index = i;
break;
end
end
% 删除图书并保存到文件
if index ~= -1
books(index) = [];
saveBooks(books);
disp('删除成功!');
else
disp('未找到该图书ID。');
end
以上代码中,我们首先使用 loadBooks
函数加载图书信息。然后,提示用户输入要删除的图书ID,并将其赋值给变量 bookID
。之后,我们通过循环遍历 books
数组,寻找与用户输入的图书ID相匹配的图书索引并记录下来。如果找到了对应的索引,我们则将该索引处的图书从数组中删除,并调用 saveBooks
函数保存图书信息到文件。最后,根据删除成功与否,显示相应的提示信息。
3.5. 修改图书
% 加载图书信息
books = loadBooks();
% 提示用户输入要修改的图书ID
bookID = input('请输入要修改的图书ID:');
% 查找图书索引
index = -1;
for i = 1:length(books)
if books(i).bookID == bookID
index = i;
break;
end
end
% 修改图书信息
if index ~= -1
% 提示用户输入新的图书信息
title = input('请输入新的图书标题:', 's');
author = input('请输入新的图书作者:', 's');
% 更新图书信息并保存到文件
books(index).title = title;
books(index).author = author;
saveBooks(books);
disp('修改成功!');
else
disp('未找到该图书ID。');
end
以上代码中,我们首先使用 loadBooks
函数加载图书信息。然后,提示用户输入要修改的图书ID,并将其赋值给变量 bookID
。之后,通过循环遍历 books
数组,寻找与用户输入的图书ID相匹配的图书索引并记录下来。如果找到了对应的索引,我们提示用户输入新的图书信息,并将其赋值给变量 title
和 author
。接着,我们更新图书结构体数组中对应图书的标题和作者,并调用 saveBooks
函数保存图书信息到文件。最后,根据修改成功与否,显示相应的提示信息。
3.6. 文件操作函数实现
function saveBooks(books)
save('books.mat', 'books');
end
function books = loadBooks()
if exist('books.mat', 'file')
load('books.mat', 'books');
else
books = struct('bookID', {}, 'title', {}, 'author', {});
end
end
为了实现保存和加载图书信息的功能,我们定义了两个辅助函数:saveBooks
和 loadBooks
。saveBooks
函数用于将图书信息保存到名为 books.mat
的MAT文件中。loadBooks
函数用于从MAT文件中加载图书信息。若文件不存在,则返回一个空的图书结构体数组。
4. 测试结果
经过上述代码实现后,我们可以进行以下一些简单测试:
- 添加图书:添加几本图书并检查保存到文件的图书信息是否正确。
- 查询图书:根据关键词进行搜索,并验证搜索结果是否准确。
- 展示全部图书:检查显示的全部图书信息是否完整。
- 删除图书:删除某本图书并确认是否从图书列表中消失。
- 修改图书:修改某本图书的标题和作者,并验证修改是否成功。
5. 完整代码
以下是整合了图书管理系统功能的完整MATLAB代码:
books = struct('bookID', {}, 'title', {}, 'author', {}); % 创建一个空的结构体数组books,用于存储图书信息
while true
disp('请选择操作:'); % 显示操作菜单
disp('1. 添加图书');
disp('2. 查询图书');
disp('3. 展示全部图书');
disp('4. 删除图书');
disp('5. 修改图书');
disp('0. 退出');
choice = input('请输入选项:'); % 等待用户输入选择的操作
switch choice
case 1
% 添加图书
bookID = input('请输入图书ID:'); % 获取图书ID
title = input('请输入图书标题:', 's'); % 获取图书标题,并指定输入类型为字符串
author = input('请输入图书作者:', 's'); % 获取图书作者,并指定输入类型为字符串
book = struct('bookID', bookID, 'title', title, 'author', author); % 创建一个新的结构体book,包含图书的ID、标题和作者
books(end+1) = book; % 将新的图书信息添加到books数组的末尾
saveBooks(books); % 调用saveBooks函数保存修改后的图书信息到文件
disp('添加成功!'); % 显示添加成功的消息
case 2
% 查询图书
keyword = input('请输入查询关键词:', 's'); % 获取查询关键词
foundBooks = []; % 创建一个空数组,用于存储匹配到的图书信息
for i = 1:length(books) % 遍历books数组中的每个图书信息
if contains(books(i).title, keyword) || contains(books(i).author, keyword) % 判断图书的标题或作者中是否包含关键词
foundBooks = [foundBooks, books(i)]; % 如果是,则将该图书信息添加到foundBooks数组中
end
end
if isempty(foundBooks) % 判断是否找到匹配的图书信息
disp('未找到相关图书。'); % 如果没有找到,则显示未找到相关图书的消息
else
for i = 1:length(foundBooks) % 遍历foundBooks数组中的每个匹配到的图书信息
disp(['图书ID:', num2str(foundBooks(i).bookID)]); % 显示图书ID
disp(['标题:', foundBooks(i).title]); % 显示图书标题
disp(['作者:', foundBooks(i).author]); % 显示图书作者
disp('-------------------------'); % 显示分隔线
end
end
case 3
% 展示全部图书
if isempty(books) % 判断是否存在图书信息
disp('暂无图书信息。'); % 如果没有图书信息,则显示暂无图书信息的消息
else
for i = 1:length(books) % 遍历books数组中的每个图书信息
disp(['图书ID:', num2str(books(i).bookID)]); % 显示图书ID
disp(['标题:', books(i).title]); % 显示图书标题
disp(['作者:', books(i).author]); % 显示图书作者
disp('-------------------------'); % 显示分隔线
end
end
case 4
% 删除图书
bookID = input('请输入要删除的图书ID:'); % 获取要删除的图书ID
index = -1; % 初始化索引为-1,表示未找到图书ID对应的图书信息
for i = 1:length(books) % 遍历books数组中的每个图书信息
if books(i).bookID == bookID % 判断图书ID是否与要删除的图书ID匹配
index = i; % 如果匹配,则记录当前索引值
break; % 终止循环
end
end
if index ~= -1 % 判断是否找到匹配的图书信息
books(index) = []; % 从books数组中删除匹配到的图书信息
saveBooks(books); % 调用saveBooks函数保存修改后的图书信息到文件
disp('删除成功!'); % 显示删除成功的消息
else
disp('未找到该图书ID。'); % 如果没有找到匹配的图书信息,则显示未找到该图书ID的消息
end
case 5
% 修改图书
bookID = input('请输入要修改的图书ID:'); % 获取要修改的图书ID
index = -1; % 初始化索引为-1,表示未找到图书ID对应的图书信息
for i = 1:length(books) % 遍历books数组中的每个图书信息
if books(i).bookID == bookID % 判断图书ID是否与要修改的图书ID匹配
index = i; % 如果匹配,则记录当前索引值
break; % 终止循环
end
end
if index ~= -1 % 判断是否找到匹配的图书信息
title = input('请输入新的图书标题:', 's'); % 获取新的图书标题
author = input('请输入新的图书作者:', 's'); % 获取新的图书作者
books(index).title = title; % 更新图书信息的标题字段
books(index).author = author; % 更新图书信息的作者字段
saveBooks(books); % 调用saveBooks函数保存修改后的图书信息到文件
disp('修改成功!'); % 显示修改成功的消息
else
disp('未找到该图书ID。'); % 如果没有找到匹配的图书信息,则显示未找到该图书ID的消息
end
case 0
% 退出
disp('感谢使用图书管理系统,再见!'); % 显示退出系统的消息
break; % 跳出while循环,终止程序的执行
otherwise
disp('无效的选项,请重新输入。'); % 如果选择无效,则显示无效选项的消息
end
end
function saveBooks(books)
save('books.mat', 'books'); % 将图书信息保存到文件books.mat中
end
function books = loadBooks()
if exist('books.mat', 'file') % 判断是否存在图书信息的保存文件
load('books.mat', 'books'); % 加载图书信息文件
else
books = struct('bookID', {}, 'title', {}, 'author', {}); % 创建一个空的结构体数组
end
end