C++购物车程序通过结构体Product和CartItem管理商品及购物车数据,使用std::vector存储商品列表和购物车内容,结合菜单循环实现用户交互;程序定义displayProducts、addToCart、viewCart和checkout等函数完成核心功能,通过输入验证和clearInputBuffer处理用户输入错误,在添加商品时检查ID有效性、数量正负及库存充足性,购物车显示与结账时遍历商品计算总价并格式化输出金额,所有操作均在主循环中通过switch分支调用对应函数实现,确保逻辑清晰且具备基础异常处理能力。

用C++构建一个简单的购物车程序,核心在于有效地管理商品数据、购物车状态,并提供直观的用户交互界面。这通常涉及结构体或类来定义商品,以及STL容器(如
std::vector
std::map
制作一个简单的C++购物车程序,我们可以从定义商品结构开始,然后构建几个核心功能函数:展示商品、添加商品到购物车、查看购物车以及计算总价。
首先,我们需要一个结构体来表示商品:
#include <iostream>
#include <vector>
#include <string>
#include <iomanip> // For std::fixed and std::setprecision
#include <limits> // For std::numeric_limits
// 商品结构体
struct Product {
int id;
std::string name;
double price;
int stock; // 简单库存管理
};
// 购物车中的商品项
struct CartItem {
int productId;
int quantity;
// 实际项目中可能还会存储商品名称和价格,避免多次查找
};
// 全局商品列表 (实际项目中可能从文件或数据库加载)
std::vector<Product> products = {
{1, "笔记本电脑", 5999.00, 10},
{2, "无线鼠标", 129.50, 50},
{3, "机械键盘", 349.00, 20},
{4, "显示器", 1299.00, 15},
{5, "USB集线器", 88.00, 100}
};
// 购物车 (存储商品ID和数量)
std::vector<CartItem> cart;
// 函数声明
void displayProducts();
void addToCart();
void viewCart();
void checkout();
void clearInputBuffer(); // 辅助函数,处理cin失败后的输入流
int main() {
int choice;
do {
std::cout << "\n--- 简易购物车程序 ---\n";
std::cout << "1. 浏览商品\n";
std::cout << "2. 添加商品到购物车\n";
std::cout << "3. 查看购物车\n";
std::cout << "4. 结账\n";
std::cout << "5. 退出\n";
std::cout << "请输入您的选择: ";
if (!(std::cin >> choice)) {
std::cout << "无效输入,请输入数字。\n";
clearInputBuffer();
continue;
}
switch (choice) {
case 1: displayProducts(); break;
case 2: addToCart(); break;
case 3: viewCart(); break;
case 4: checkout(); break;
case 5: std::cout << "感谢使用,再见!\n"; break;
default: std::cout << "无效选择,请重新输入。\n"; break;
}
} while (choice != 5);
return 0;
}
// 清理输入缓冲区
void clearInputBuffer() {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
// 1. 显示所有商品
void displayProducts() {
std::cout << "\n--- 商品列表 ---\n";
std::cout << "ID\t名称\t\t价格\t库存\n";
std::cout << "-------------------------------------------\n";
for (const auto& p : products) {
std::cout << p.id << "\t" << std::left << std::setw(15) << p.name
<< "\t" << std::fixed << std::setprecision(2) << p.price
<< "\t" << p.stock << "\n";
}
std::cout << "-------------------------------------------\n";
}
// 2. 添加商品到购物车
void addToCart() {
int productId, quantity;
std::cout << "\n--- 添加商品到购物车 ---\n";
std::cout << "请输入商品ID: ";
if (!(std::cin >> productId)) {
std::cout << "无效输入,请输入数字ID。\n";
clearInputBuffer();
return;
}
// 查找商品
Product* foundProduct = nullptr;
for (auto& p : products) {
if (p.id == productId) {
foundProduct = &p;
break;
}
}
if (!foundProduct) {
std::cout << "商品ID不存在。\n";
return;
}
std::cout << "请输入购买数量: ";
if (!(std::cin >> quantity)) {
std::cout << "无效输入,请输入数字数量。\n";
clearInputBuffer();
return;
}
if (quantity <= 0) {
std::cout << "购买数量必须大于0。\n";
return;
}
if (quantity > foundProduct->stock) {
std::cout << "库存不足!当前库存为: " << foundProduct->stock << "\n";
return;
}
// 检查购物车中是否已有该商品
bool itemExistsInCart = false;
for (auto& item : cart) {
if (item.productId == productId) {
item.quantity += quantity;
itemExistsInCart = true;
break;
}
}
if (!itemExistsInCart) {
cart.push_back({productId, quantity});
}
foundProduct->stock -= quantity; // 更新库存
std::cout << foundProduct->name << " 已成功添加到购物车,数量: " << quantity << "\n";
}
// 3. 查看购物车
void viewCart() {
std::cout << "\n--- 您的购物车 ---\n";
if (cart.empty()) {
std::cout << "购物车是空的。\n";
return;
}
double total = 0.0;
std::cout << "ID\t名称\t\t数量\t单价\t小计\n";
std::cout << "---------------------------------------------------\n";
for (const auto& item : cart) {
// 再次查找商品信息,这里效率不高,实际中可以优化
const Product* p = nullptr;
for (const auto& prod : products) {
if (prod.id == item.productId) {
p = ∏
break;
}
}
if (p) {
double subtotal = p->price * item.quantity;
total += subtotal;
std::cout << p->id << "\t" << std::left << std::setw(15) << p->name
<< "\t" << item.quantity << "\t"
<< std::fixed << std::setprecision(2) << p->price << "\t"
<< std::fixed << std::setprecision(2) << subtotal << "\n";
}
}
std::cout << "---------------------------------------------------\n";
std::cout << "总计: \t\t\t\t\t" << std::fixed << std::setprecision(2) << total << "\n";
}
// 4. 结账
void checkout() {
std::cout << "\n--- 结账 ---\n";
if (cart.empty()) {
std::cout << "购物车是空的,无法结账。\n";
return;
}
viewCart(); // 先显示购物车内容
double total = 0.0;
for (const auto& item : cart) {
for (const auto& p : products) {
if (p.id == item.productId) {
total += p.price * item.quantity;
break;
}
}
}
std::cout << "\n您的订单总金额为: " << std::fixed << std::setprecision(2) << total << " 元。\n";
std::cout << "感谢您的购买!订单已处理。\n";
cart.clear(); // 清空购物车
}在C++中管理商品信息,我通常会倾向于使用结构体(
struct
class
struct
Product
立即学习“C++免费学习笔记(深入)”;
至于存储这些商品,
std::vector<Product>
std::vector
std::map<int, Product>
std::unordered_map
std::vector
另外,购物车本身也需要管理商品信息,但它只关心用户选择了哪些商品以及每种商品的数量。所以,一个
CartItem
productId
quantity
std::vector<CartItem>
处理用户输入,说实话,这是任何交互式程序里最容易出问题的地方。用户可不会乖乖地按照你的预期输入数字。在C++中,我们主要依赖
std::cin
std::cin >> variable;
我的做法是,每次
std::cin
std::cin
if (!(std::cin >> choice))
std::cin.clear();
std::cin
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
在购物车逻辑交互方面,一个清晰的菜单是必不可少的。通过一个
do-while
switch
displayProducts()
addToCart()
addToCart()
计算总价相对直接,一旦购物车中有商品,我们只需要遍历
cart
CartItem
productId
products
CartItem
quantity
viewCart()
checkout()
iomanip
std::fixed
std::setprecision(2)
至于异常情况处理,除了前面提到的用户输入错误,还有一些业务逻辑上的“异常”需要考虑:
productId
products
quantity
stock
我在
addToCart()
if (!foundProduct)
if (quantity <= 0)
if (quantity > foundProduct->stock)
以上就是C++制作简单购物车程序实例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号