控制台 UI / 管理员界面
本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 66 课,共 70 课。
挑战
简单让我们通过构建一个控制台界面来完成你的图书馆系统,把所有组件整合起来!你将创建一个管理界面,用于处理命令来管理图书馆,包括添加图书、注册用户、处理借阅操作以及搜索目录。
你将继续使用现有的项目结构:
Book.cs:保留你的 Book 类,其中包含Id、Title、Author、IsAvailable,以及Borrow()和Return()方法。User.cs:保留你的 User 类,其中包含借阅跟踪、MaxBooks常量、CanBorrow(),以及用于管理已借图书的方法。Library.cs:保留你的 Library 类,其中包含你已经编写的所有借阅逻辑和 LINQ 搜索方法。添加一个新的方法GetAllBooks(),用于返回图书馆中的所有图书;再添加GetAllUsers(),用于返回所有已注册用户。Program.cs:你的控制台界面将在这里实现!你将构建一个命令处理器,用于读取命令并执行相应的图书馆操作。你可以把它看作图书馆系统的管理仪表板。
你的控制台界面应能处理以下命令:
ADD_BOOK|id|title|author:添加一本新图书,并输出Added: {Title}ADD_USER|name|memberId:注册一位新用户,并输出Registered: {Name}BORROW|bookId|memberId:处理借阅请求(使用现有的 BorrowBook 逻辑)RETURN|bookId|memberId:处理归还请求(使用现有的 ReturnBook 逻辑)SEARCH|type|value:搜索目录,其中 type 可以是title、author、available或borrowedSTATUS:输出摘要,显示图书总数、可借图书数、用户总数和已借出图书总数
对于 STATUS 命令,请按以下格式输出摘要:
--- Library Status ---
Total Books: {count}
Available: {count}
Total Users: {count}
Books Borrowed: {count}对于搜索结果,将每本图书按 {Title} by {Author} 的格式单独输出一行;如果没有结果,则输出 No books found。
你将收到以下输入:
- 图书馆名称
- 要处理的命令数量
- 每条命令各占一行,格式如上所述
例如,输入如下:
Downtown Library
8
ADD_BOOK|B001|Clean Code|Robert Martin
ADD_BOOK|B002|The Pragmatic Programmer|David Thomas
ADD_USER|Alice|101
ADD_USER|Bob|102
BORROW|B001|101
SEARCH|available
BORROW|B002|102
STATUS输出应为:
Added: Clean Code
Added: The Pragmatic Programmer
Registered: Alice
Registered: Bob
Alice borrowed Clean Code
The Pragmatic Programmer by David Thomas
Bob borrowed The Pragmatic Programmer
--- Library Status ---
Total Books: 2
Available: 0
Total Users: 2
Books Borrowed: 2你的控制台界面充当连接用户输入与结构清晰的图书馆组件的纽带。每条命令都会交由 Library 类中相应的方法处理,这展示了清晰的架构如何让构建用户界面变得简单直接!
亲手试试
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// 读取库名称
string libraryName = Console.ReadLine();
// 用库名称创建一个 Library 实例
Library library = new Library(libraryName);
// 读取命令数量
int numCommands = Convert.ToInt32(Console.ReadLine());
// 处理每条命令
for (int i = 0; i < numCommands; i++)
{
string commandLine = Console.ReadLine();
string[] parts = commandLine.Split('|');
string command = parts[0];
// TODO: 处理 ADD_BOOK 命令
// 格式:ADD_BOOK|id|title|author
// 打印:Added: {title}
// TODO: 处理 ADD_USER 命令
// 格式:ADD_USER|name|memberId
// 打印:Registered: {name}
// TODO: 处理 BORROW 命令
// 格式:BORROW|bookId|memberId
// 打印 library.BorrowBook() 的结果
// TODO: 处理 RETURN 命令
// 格式:RETURN|bookId|memberId
// 打印 library.ReturnBook() 的结果
// TODO: 处理 SEARCH 命令
// 格式:SEARCH|type|value(type 可以是 title、author、available 或 borrowed)
// 将每本书打印为 "{Title} by {Author}" 或 "No books found"
// TODO: 处理 STATUS 命令
// 打印:
// --- Library Status ---
// Total Books: {count}
// Available: {count}
// Total Users: {count}
// Books Borrowed: {count}
}
}
}
}
面向对象编程中的所有课
自己练习: C# 在线编译器