第 9 章: プロジェクト ケース - 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
配列を走査し、書籍情報を 1 つずつ表示します。
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
と の2 つの補助関数を定義しますloadBooks
。書籍情報をという名前の MAT ファイルsaveBooks
に保存する関数。この関数は、MAT ファイルから書籍情報をロードするために使用されます。ファイルが存在しない場合は、空のブック構造配列が返されます。books.mat
loadBooks
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