第九章:项目案例——基于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