规划交互流程是解决 C++ 交互题的关键步骤,以下从不同类型的交互场景详细介绍规划交互流程的方法:
与用户进行简单交互
以一个简单的猜数字游戏为例,目标是让用户猜出一个 1 - 100 之间的随机数,程序需要根据用户的猜测给出提示。
步骤分析
- 初始化:生成一个 1 - 100 之间的随机数作为答案。
- 开始交互:提示用户输入一个猜测的数字。
- 处理输入:根据用户输入的数字与答案进行比较,给出相应提示(猜大了、猜小了或猜对了)。
- 循环交互:如果用户没有猜对,继续提示用户输入,直到猜对为止。
- 结束交互:当用户猜对时,输出恭喜信息并结束程序。
代码示例
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
// 初始化:生成随机数
srand(static_cast<unsigned int>(time(nullptr)));
int answer = rand() % 100 + 1;
int guess;
while (true) {
// 开始交互:提示用户输入
std::cout << "请猜一个1 - 100之间的数字: ";
std::cin >> guess;
// 处理输入
if (guess > answer) {
std::cout << "猜大了,请再试一次。" << std::endl;
} else if (guess < answer) {
std::cout << "猜小了,请再试一次。" << std::endl;
} else {
// 结束交互
std::cout << "恭喜你,猜对了!" << std::endl;
break;
}
}
return 0;
}
与评测系统交互(竞赛场景)
在竞赛中,交互题通常会有特定的交互协议,以下以一个简单的询问式交互题为例,题目要求在一个 1 - n 的整数序列中找出目标数字。评测系统会根据你的询问返回信息。
步骤分析
- 读取初始信息:从评测系统读取序列的范围 n。
- 开始询问:向评测系统发送询问,询问某个数字是否是目标数字。
- 处理反馈:根据评测系统的反馈(是或否),缩小搜索范围。
- 循环询问:重复步骤 2 和 3,直到找到目标数字。
- 输出结果:向评测系统输出最终的目标数字。
代码示例
#include <iostream>
int main() {
int n;
// 读取初始信息
std::cin >> n;
int left = 1, right = n;
while (left < right) {
int mid = (left + right) / 2;
// 开始询问
std::cout << "Is the number less than or equal to " << mid << "? (1 for yes, 0 for no)" << std::endl;
int response;
std::cin >> response;
// 处理反馈
if (response) {
right = mid;
} else {
left = mid + 1;
}
}
// 输出结果
std::cout << "The number is " << left << std::endl;
return 0;
}
多轮复杂交互
以一个点菜系统为例,用户可以多次点菜、修改订单、结算。
步骤分析
- 显示菜单:程序启动后,显示菜品列表及价格。
- 接受点菜:提示用户输入菜品编号和数量,将点菜信息记录下来。
- 提供操作选项:询问用户是否继续点菜、修改订单或结算。
- 处理操作:根据用户选择的操作,执行相应的处理(继续点菜、修改订单信息、计算总价并输出结算信息)。
- 循环交互:重复步骤 2 - 4,直到用户选择结算。
- 结束交互:输出结算信息,结束程序。
代码示例
#include <iostream>
#include <vector>
struct Dish {
int id;
std::string name;
double price;
};
struct OrderItem {
int dishId;
int quantity;
};
void displayMenu(const std::vector<Dish>& menu) {
std::cout << "菜单:" << std::endl;
for (const auto& dish : menu) {
std::cout << "编号: " << dish.id << ", 名称: " << dish.name << ", 价格: " << dish.price << " 元" << std::endl;
}
}
void placeOrder(std::vector<OrderItem>& order) {
int dishId, quantity;
std::cout << "请输入菜品编号和数量(用空格分隔): ";
std::cin >> dishId >> quantity;
order.push_back({dishId, quantity});
}
void modifyOrder(std::vector<OrderItem>& order) {
int dishId, newQuantity;
std::cout << "请输入要修改的菜品编号和新的数量(用空格分隔): ";
std::cin >> dishId >> newQuantity;
for (auto& item : order) {
if (item.dishId == dishId) {
item.quantity = newQuantity;
break;
}
}
}
double calculateTotal(const std::vector<Dish>& menu, const std::vector<OrderItem>& order) {
double total = 0;
for (const auto& item : order) {
for (const auto& dish : menu) {
if (dish.id == item.dishId) {
total += dish.price * item.quantity;
break;
}
}
}
return total;
}
int main() {
std::vector<Dish> menu = {
{1, "鱼香肉丝", 25.0},
{2, "宫保鸡丁", 22.0},
{3, "麻婆豆腐", 18.0}
};
std::vector<OrderItem> order;
while (true) {
displayMenu(menu);
placeOrder(order);
int choice;
std::cout << "请选择操作:1. 继续点菜 2. 修改订单 3. 结算: ";
std::cin >> choice;
if (choice == 1) {
continue;
} else if (choice == 2) {
modifyOrder(order);
} else if (choice == 3) {
double total = calculateTotal(menu, order);
std::cout << "总价: " << total << " 元" << std::endl;
break;
}
}
return 0;
}
通过以上不同场景的示例,你可以看到规划交互流程的关键在于明确每个阶段的任务、输入输出内容以及状态的转换,这样才能有条不紊地解决交互题。