
本项目将通过构建一个酒店管理系统来综合运用之前学到的Rust知识,特别是数组和函数的使用。这是一个实用的案例,可以帮助你理解如何在实际项目中组织和应用基础知识。

首先,我们需要定义系统的核心数据结构:
// 房间状态枚举
#[derive(Debug, Clone, Copy, PartialEq)]
enum RoomStatus {
Available, // 空闲
Occupied, // 已入住
Maintenance, // 维护中
}
// 客人信息结构体
#[derive(Debug, Clone)]
struct Guest {
name: String,
phone: String,
check_in_date: String,
}
// 房间结构体
#[derive(Debug, Clone)]
struct Room {
number: u32,
status: RoomStatus,
guest: Option<Guest>, // 可能为空(没有客人)
price_per_night: f64,
}
// 酒店管理系统结构体
struct Hotel {
rooms: [Room; 10], // 10个房间的数组
}impl Hotel {
// 创建新的酒店
fn new() -> Self {
let mut rooms = [Room {
number: 0,
status: RoomStatus::Available,
guest: None,
price_per_night: 0.0,
}; 10];
// 初始化10个房间
for i in 0..10 {
rooms[i] = Room {
number: (i + 1) as u32,
status: RoomStatus::Available,
guest: None,
price_per_night: 100.0 + (i as f64 * 20.0), // 价格递增
};
}
Hotel { rooms }
}
}impl Hotel {
// 显示所有房间状态
fn display_all_rooms(&self) {
println!("\n=== 酒店房间状态 ===");
println!("{:<8} {:<12} {:<15} {:<15} {:<10}",
"房间号", "状态", "客人姓名", "电话", "价格/晚");
println!("{}", "-".repeat(65));
for room in self.rooms.iter() {
let status_str = match room.status {
RoomStatus::Available => "空闲",
RoomStatus::Occupied => "已入住",
RoomStatus::Maintenance => "维护中",
};
let guest_name = match &room.guest {
Some(g) => g.name.clone(),
None => "-".to_string(),
};
let guest_phone = match &room.guest {
Some(g) => g.phone.clone(),
None => "-".to_string(),
};
println!("{:<8} {:<12} {:<15} {:<15} {:<10.2}",
room.number,
status_str,
guest_name,
guest_phone,
room.price_per_night);
}
println!();
}
}impl Hotel {
// 根据房间号查找房间(返回索引)
fn find_room_by_number(&self, number: u32) -> Option<usize> {
for (index, room) in self.rooms.iter().enumerate() {
if room.number == number {
return Some(index);
}
}
None
}
// 根据客人姓名查找房间
fn find_room_by_guest_name(&self, name: &str) -> Option<usize> {
for (index, room) in self.rooms.iter().enumerate() {
if let Some(ref guest) = room.guest {
if guest.name == name {
return Some(index);
}
}
}
None
}
}impl Hotel {
// 客人入住
fn check_in(&mut self, room_number: u32, guest_name: String, phone: String) -> bool {
// 查找房间
if let Some(index) = self.find_room_by_number(room_number) {
let room = &mut self.rooms[index];
// 检查房间状态
if room.status == RoomStatus::Available {
room.status = RoomStatus::Occupied;
room.guest = Some(Guest {
name: guest_name,
phone: phone,
check_in_date: "2024-01-01".to_string(), // 简化,实际应该获取当前日期
});
println!("✓ 房间 {} 入住成功!", room_number);
return true;
} else {
println!("✗ 房间 {} 不可用", room_number);
return false;
}
}
println!("✗ 房间 {} 不存在", room_number);
false
}
}impl Hotel {
// 客人退房
fn check_out(&mut self, room_number: u32) -> bool {
if let Some(index) = self.find_room_by_number(room_number) {
let room = &mut self.rooms[index];
if room.status == RoomStatus::Occupied {
if let Some(ref guest) = room.guest {
println!("✓ 客人 {} 退房成功", guest.name);
}
room.status = RoomStatus::Available;
room.guest = None;
return true;
} else {
println!("✗ 房间 {} 没有客人入住", room_number);
return false;
}
}
println!("✗ 房间 {} 不存在", room_number);
false
}
}impl Hotel {
// 查询房间信息
fn query_room(&self, room_number: u32) {
if let Some(index) = self.find_room_by_number(room_number) {
let room = &self.rooms[index];
println!("\n=== 房间 {} 详细信息 ===", room_number);
println!("房间号: {}", room.number);
println!("价格/晚: {:.2} 元", room.price_per_night);
println!("状态: {:?}", room.status);
if let Some(ref guest) = room.guest {
println!("客人姓名: {}", guest.name);
println!("电话: {}", guest.phone);
println!("入住日期: {}", guest.check_in_date);
} else {
println!("当前无客人");
}
} else {
println!("✗ 房间 {} 不存在", room_number);
}
}
// 查询客人信息
fn query_guest(&self, guest_name: &str) {
if let Some(index) = self.find_room_by_guest_name(guest_name) {
let room = &self.rooms[index];
println!("\n=== 客人 {} 的信息 ===", guest_name);
if let Some(ref guest) = room.guest {
println!("姓名: {}", guest.name);
println!("电话: {}", guest.phone);
println!("入住房间: {}", room.number);
println!("入住日期: {}", guest.check_in_date);
println!("房间价格: {:.2} 元/晚", room.price_per_night);
}
} else {
println!("✗ 未找到客人 {}", guest_name);
}
}
}impl Hotel {
// 统计信息
fn statistics(&self) {
let mut available_count = 0;
let mut occupied_count = 0;
let mut maintenance_count = 0;
let mut total_revenue = 0.0;
for room in self.rooms.iter() {
match room.status {
RoomStatus::Available => available_count += 1,
RoomStatus::Occupied => {
occupied_count += 1;
total_revenue += room.price_per_night;
},
RoomStatus::Maintenance => maintenance_count += 1,
}
}
let total_rooms = self.rooms.len();
let occupancy_rate = (occupied_count as f64 / total_rooms as f64) * 100.0;
println!("\n=== 酒店统计信息 ===");
println!("总房间数: {}", total_rooms);
println!("空闲房间: {}", available_count);
println!("已入住房间: {}", occupied_count);
println!("维护中房间: {}", maintenance_count);
println!("入住率: {:.2}%", occupancy_rate);
println!("当日预计收入: {:.2} 元", total_revenue);
println!();
}
}use std::io::{self, Write};
use std::io::{self, Write};
impl Hotel {
// 显示主菜单
fn show_menu() {
println!("\n╔══════════════════════════════════╗");
println!("║ 酒店管理系统 ║");
println!("╠══════════════════════════════════╣");
println!("║ 1. 显示所有房间 ║");
println!("║ 2. 客人入住 ║");
println!("║ 3. 客人退房 ║");
println!("║ 4. 查询房间信息 ║");
println!("║ 5. 查询客人信息 ║");
println!("║ 6. 统计信息 ║");
println!("║ 0. 退出系统 ║");
println!("╚══════════════════════════════════╝");
print!("请选择功能 (0-6): ");
io::stdout().flush().unwrap();
}
// 获取用户输入(整数)
fn get_input_number() -> Option<u32> {
let mut input = String::new();
io::stdin().read_line(&mut input).ok()?;
input.trim().parse().ok()
}
// 获取用户输入(字符串)
fn get_input_string() -> String {
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
input.trim().to_string()
}
// 运行系统
fn run(&mut self) {
loop {
Self::show_menu();
match Self::get_input_number() {
Some(1) => {
self.display_all_rooms();
},
Some(2) => {
println!("\n=== 客人入住 ===");
print!("请输入房间号: ");
io::stdout().flush().unwrap();
if let Some(room_num) = Self::get_input_number() {
print!("请输入客人姓名: ");
io::stdout().flush().unwrap();
let name = Self::get_input_string();
print!("请输入联系电话: ");
io::stdout().flush().unwrap();
let phone = Self::get_input_string();
self.check_in(room_num, name, phone);
} else {
println!("✗ 无效的房间号");
}
},
Some(3) => {
println!("\n=== 客人退房 ===");
print!("请输入房间号: ");
io::stdout().flush().unwrap();
if let Some(room_num) = Self::get_input_number() {
self.check_out(room_num);
} else {
println!("✗ 无效的房间号");
}
},
Some(4) => {
println!("\n=== 查询房间信息 ===");
print!("请输入房间号: ");
io::stdout().flush().unwrap();
if let Some(room_num) = Self::get_input_number() {
self.query_room(room_num);
} else {
println!("✗ 无效的房间号");
}
},
Some(5) => {
println!("\n=== 查询客人信息 ===");
print!("请输入客人姓名: ");
io::stdout().flush().unwrap();
let name = Self::get_input_string();
if !name.is_empty() {
self.query_guest(&name);
} else {
println!("✗ 请输入有效的姓名");
}
},
Some(6) => {
self.statistics();
},
Some(0) => {
println!("感谢使用酒店管理系统,再见!");
break;
},
_ => {
println!("✗ 无效的选择,请重新输入");
}
}
}
}
}将所有代码整合到一个完整的程序中:
use std::io::{self, Write};
// 房间状态枚举
#[derive(Debug, Clone, Copy, PartialEq)]
enum RoomStatus {
Available, // 空闲
Occupied, // 已入住
Maintenance, // 维护中
}
// 客人信息结构体
#[derive(Debug, Clone)]
struct Guest {
name: String,
phone: String,
check_in_date: String,
}
// 房间结构体
#[derive(Debug, Clone)]
struct Room {
number: u32,
status: RoomStatus,
guest: Option<Guest>,
price_per_night: f64,
}
// 酒店管理系统结构体
struct Hotel {
rooms: [Room; 10],
}
impl Hotel {
// 创建新的酒店
fn new() -> Self {
// 使用 from_fn 初始化数组,避免需要 Copy trait
let rooms = std::array::from_fn(|i| Room {
number: (i + 1) as u32,
status: RoomStatus::Available,
guest: None,
price_per_night: 100.0 + (i as f64 * 20.0),
});
Hotel { rooms }
}
// 显示所有房间状态
fn display_all_rooms(&self) {
println!("\n=== 酒店房间状态 ===");
println!("{:<8} {:<12} {:<15} {:<15} {:<10}",
"房间号", "状态", "客人姓名", "电话", "价格/晚");
println!("{}", "-".repeat(65));
for room in self.rooms.iter() {
let status_str = match room.status {
RoomStatus::Available => "空闲",
RoomStatus::Occupied => "已入住",
RoomStatus::Maintenance => "维护中",
};
let guest_name = match &room.guest {
Some(g) => g.name.clone(),
None => "-".to_string(),
};
let guest_phone = match &room.guest {
Some(g) => g.phone.clone(),
None => "-".to_string(),
};
println!("{:<8} {:<12} {:<15} {:<15} {:<10.2}",
room.number,
status_str,
guest_name,
guest_phone,
room.price_per_night);
}
println!();
}
// 根据房间号查找房间
fn find_room_by_number(&self, number: u32) -> Option<usize> {
for (index, room) in self.rooms.iter().enumerate() {
if room.number == number {
return Some(index);
}
}
None
}
// 根据客人姓名查找房间
fn find_room_by_guest_name(&self, name: &str) -> Option<usize> {
for (index, room) in self.rooms.iter().enumerate() {
if let Some(ref guest) = room.guest {
if guest.name == name {
return Some(index);
}
}
}
None
}
// 客人入住
fn check_in(&mut self, room_number: u32, guest_name: String, phone: String) -> bool {
if let Some(index) = self.find_room_by_number(room_number) {
let room = &mut self.rooms[index];
if room.status == RoomStatus::Available {
room.status = RoomStatus::Occupied;
room.guest = Some(Guest {
name: guest_name,
phone: phone,
check_in_date: "2024-01-01".to_string(),
});
println!("✓ 房间 {} 入住成功!", room_number);
return true;
} else {
println!("✗ 房间 {} 不可用", room_number);
return false;
}
}
println!("✗ 房间 {} 不存在", room_number);
false
}
// 客人退房
fn check_out(&mut self, room_number: u32) -> bool {
if let Some(index) = self.find_room_by_number(room_number) {
let room = &mut self.rooms[index];
if room.status == RoomStatus::Occupied {
if let Some(ref guest) = room.guest {
println!("✓ 客人 {} 退房成功", guest.name);
}
room.status = RoomStatus::Available;
room.guest = None;
return true;
} else {
println!("✗ 房间 {} 没有客人入住", room_number);
return false;
}
}
println!("✗ 房间 {} 不存在", room_number);
false
}
// 查询房间信息
fn query_room(&self, room_number: u32) {
if let Some(index) = self.find_room_by_number(room_number) {
let room = &self.rooms[index];
println!("\n=== 房间 {} 详细信息 ===", room_number);
println!("房间号: {}", room.number);
println!("价格/晚: {:.2} 元", room.price_per_night);
println!("状态: {:?}", room.status);
if let Some(ref guest) = room.guest {
println!("客人姓名: {}", guest.name);
println!("电话: {}", guest.phone);
println!("入住日期: {}", guest.check_in_date);
} else {
println!("当前无客人");
}
} else {
println!("✗ 房间 {} 不存在", room_number);
}
}
// 查询客人信息
fn query_guest(&self, guest_name: &str) {
if let Some(index) = self.find_room_by_guest_name(guest_name) {
let room = &self.rooms[index];
println!("\n=== 客人 {} 的信息 ===", guest_name);
if let Some(ref guest) = room.guest {
println!("姓名: {}", guest.name);
println!("电话: {}", guest.phone);
println!("入住房间: {}", room.number);
println!("入住日期: {}", guest.check_in_date);
println!("房间价格: {:.2} 元/晚", room.price_per_night);
}
} else {
println!("✗ 未找到客人 {}", guest_name);
}
}
// 统计信息
fn statistics(&self) {
let mut available_count = 0;
let mut occupied_count = 0;
let mut maintenance_count = 0;
let mut total_revenue = 0.0;
for room in self.rooms.iter() {
match room.status {
RoomStatus::Available => available_count += 1,
RoomStatus::Occupied => {
occupied_count += 1;
total_revenue += room.price_per_night;
},
RoomStatus::Maintenance => maintenance_count += 1,
}
}
let total_rooms = self.rooms.len();
let occupancy_rate = (occupied_count as f64 / total_rooms as f64) * 100.0;
println!("\n=== 酒店统计信息 ===");
println!("总房间数: {}", total_rooms);
println!("空闲房间: {}", available_count);
println!("已入住房间: {}", occupied_count);
println!("维护中房间: {}", maintenance_count);
println!("入住率: {:.2}%", occupancy_rate);
println!("当日预计收入: {:.2} 元", total_revenue);
println!();
}
// 显示主菜单
fn show_menu() {
println!("\n╔══════════════════════════════════╗");
println!("║ 酒店管理系统 ║");
println!("╠══════════════════════════════════╣");
println!("║ 1. 显示所有房间 ║");
println!("║ 2. 客人入住 ║");
println!("║ 3. 客人退房 ║");
println!("║ 4. 查询房间信息 ║");
println!("║ 5. 查询客人信息 ║");
println!("║ 6. 统计信息 ║");
println!("║ 0. 退出系统 ║");
println!("╚══════════════════════════════════╝");
print!("请选择功能 (0-6): ");
io::stdout().flush().unwrap();
}
// 获取用户输入(整数)
fn get_input_number() -> Option<u32> {
let mut input = String::new();
io::stdin().read_line(&mut input).ok()?;
input.trim().parse().ok()
}
// 获取用户输入(字符串)
fn get_input_string() -> String {
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
input.trim().to_string()
}
// 运行系统
fn run(&mut self) {
println!("欢迎使用酒店管理系统!");
loop {
Self::show_menu();
match Self::get_input_number() {
Some(1) => {
self.display_all_rooms();
},
Some(2) => {
println!("\n=== 客人入住 ===");
print!("请输入房间号: ");
io::stdout().flush().unwrap();
if let Some(room_num) = Self::get_input_number() {
print!("请输入客人姓名: ");
io::stdout().flush().unwrap();
let name = Self::get_input_string();
print!("请输入联系电话: ");
io::stdout().flush().unwrap();
let phone = Self::get_input_string();
self.check_in(room_num, name, phone);
} else {
println!("✗ 无效的房间号");
}
},
Some(3) => {
println!("\n=== 客人退房 ===");
print!("请输入房间号: ");
io::stdout().flush().unwrap();
if let Some(room_num) = Self::get_input_number() {
self.check_out(room_num);
} else {
println!("✗ 无效的房间号");
}
},
Some(4) => {
println!("\n=== 查询房间信息 ===");
print!("请输入房间号: ");
io::stdout().flush().unwrap();
if let Some(room_num) = Self::get_input_number() {
self.query_room(room_num);
} else {
println!("✗ 无效的房间号");
}
},
Some(5) => {
println!("\n=== 查询客人信息 ===");
print!("请输入客人姓名: ");
io::stdout().flush().unwrap();
let name = Self::get_input_string();
if !name.is_empty() {
self.query_guest(&name);
} else {
println!("✗ 请输入有效的姓名");
}
},
Some(6) => {
self.statistics();
},
Some(0) => {
println!("\n感谢使用酒店管理系统,再见!");
break;
},
_ => {
println!("✗ 无效的选择,请重新输入");
}
}
}
}
}
fn main() {
let mut hotel = Hotel::new();
hotel.run();
}本项目大量使用了数组来存储房间信息:
struct Hotel {
rooms: [Room; 10], // 固定大小的房间数组
}数组的优势:
每个功能都封装成独立函数:
// 查询函数
fn find_room_by_number(&self, number: u32) -> Option<usize>
fn find_room_by_guest_name(&self, name: &str) -> Option<usize>
// 操作函数
fn check_in(&mut self, room_number: u32, guest_name: String, phone: String) -> bool
fn check_out(&mut self, room_number: u32) -> bool
// 查询函数
fn query_room(&self, room_number: u32)
fn query_guest(&self, guest_name: &str)
// 统计函数
fn statistics(&self)函数设计的优势:
# 创建新项目
cargo new hotel_management
cd hotel_management
# 将代码复制到 src/main.rs
# 运行
cargo run欢迎使用酒店管理系统!
╔══════════════════════════════════╗
║ 酒店管理系统 ║
╠══════════════════════════════════╣
║ 1. 显示所有房间 ║
║ 2. 客人入住 ║
║ 3. 客人退房 ║
║ 4. 查询房间信息 ║
║ 5. 查询客人信息 ║
║ 6. 统计信息 ║
║ 0. 退出系统 ║
╚══════════════════════════════════╝
请选择功能 (0-6): 1
=== 酒店房间状态 ===
房间号 状态 客人姓名 电话 价格/晚
-----------------------------------------------------------------
1 空闲 - - 100.00
2 空闲 - - 120.00
...
请选择功能 (0-6): 2
=== 客人入住 ===
请输入房间号: 1
请输入客人姓名: 张三
请输入联系电话: 13800138000
✓ 房间 1 入住成功![Room; 10] - 10个房间[value; length] 语法iter() 方法rooms[i]impl 块实现方法&self 和可变引用 &mut selfOption<T> 处理可能失败的操作match 处理不同情况String 和 &str实现房间维护状态的设置和恢复功能。
实现房间预订功能,允许客人提前预订房间。
实现根据入住日期和退房日期计算费用。
使用文件保存和加载酒店数据。
实现不同类型的房间(单人间、双人间、套房等)。
实现按价格范围、按房间类型等条件查询。
Vec 替代固定大小数组Result 类型)通过这个酒店管理系统项目,我们综合运用了:
这个项目展示了如何将基础知识组合起来构建一个完整的应用程序。虽然功能相对简单,但涵盖了Rust编程的核心概念,为学习更复杂的特性打下了坚实的基础。
相关文章: