0

0

C++制作简单购物车程序实例

P粉602998670

P粉602998670

发布时间:2025-09-05 11:14:02

|

910人浏览过

|

来源于php中文网

原创

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

c++制作简单购物车程序实例

用C++构建一个简单的购物车程序,核心在于有效地管理商品数据、购物车状态,并提供直观的用户交互界面。这通常涉及结构体或类来定义商品,以及STL容器(如

std::vector
std::map
)来存储商品列表和购物车中的物品。通过一个循环菜单,用户可以浏览商品、添加商品到购物车、查看购物车内容并最终结账。

解决方案

制作一个简单的C++购物车程序,我们可以从定义商品结构开始,然后构建几个核心功能函数:展示商品、添加商品到购物车、查看购物车以及计算总价。

首先,我们需要一个结构体来表示商品:

#include 
#include 
#include 
#include  // For std::fixed and std::setprecision
#include   // For std::numeric_limits

// 商品结构体
struct Product {
    int id;
    std::string name;
    double price;
    int stock; // 简单库存管理
};

// 购物车中的商品项
struct CartItem {
    int productId;
    int quantity;
    // 实际项目中可能还会存储商品名称和价格,避免多次查找
};

// 全局商品列表 (实际项目中可能从文件或数据库加载)
std::vector 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 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::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++购物车程序如何管理商品信息?

在C++中管理商品信息,我通常会倾向于使用结构体(

struct
)或者类(
class
)来封装商品的各种属性。对于一个像购物车这样的小程序
struct
通常就足够了,它简洁明了,能很好地把商品的ID、名称、价格和库存这些基本信息捆绑在一起。比如上面代码中的
Product
结构体,它包含了商品的所有关键数据。

立即学习C++免费学习笔记(深入)”;

至于存储这些商品,

std::vector
是一个非常直接且实用的选择。它就像一个动态数组,可以很方便地添加、遍历和查找商品。当你需要查找某个特定ID的商品时,虽然
std::vector
需要线性遍历,但对于商品数量不多的情况,性能影响几乎可以忽略不计。如果商品数量非常庞大,我们可能会考虑
std::map
,这样可以通过ID直接进行O(log N)或O(1)(如果是
std::unordered_map
)的查找,效率会高很多。不过,对于初学者或者这个“简单”的购物车实例,
std::vector
在实现上会更直观一些,我个人觉得没必要一开始就搞得太复杂。

另外,购物车本身也需要管理商品信息,但它只关心用户选择了哪些商品以及每种商品的数量。所以,一个

CartItem
结构体,包含
productId
quantity
就足够了。购物车本身也可以用
std::vector
来表示。这种方式允许购物车里有多个同类商品(虽然我在示例中处理成了合并数量),也方便后续扩展。

百家CMS微商城
百家CMS微商城

百家CMS微商城从诞生开始,就坚持着简单实用的原则,基于目前最流行的WEB2.0的架构(php+mysql),拥有成熟、稳定的微电商技术解决方案。基于完整的会员等级制度,完善的微商城购物流程,订单管理、优惠券、搜索、购物车等功能。采用跨平台机制,可同时对接微信公众号平台和支付宝服务窗,兼容微博、手机QQ等平台;丰富的支付方式、支持微信支付、支付宝支付、货到付款、余额支付、网银支付等。并且拥有完整的

下载

C++如何处理用户输入与购物车逻辑交互?

处理用户输入,说实话,这是任何交互式程序里最容易出问题的地方。用户可不会乖乖地按照你的预期输入数字。在C++中,我们主要依赖

std::cin
来获取用户输入。但仅仅使用
std::cin >> variable;
是不够的,因为它很容易因为输入类型不匹配(比如用户输入了字母而不是数字)而导致输入流进入错误状态。

我的做法是,每次

std::cin
操作后,都应该检查其状态。如果
std::cin
失败了(
if (!(std::cin >> choice))
),这意味着输入不合法。这时,我们必须做三件事:

  1. std::cin.clear();
    : 清除
    std::cin
    的错误标志,让它恢复正常工作。
  2. std::cin.ignore(std::numeric_limits::max(), '\n');
    : 忽略当前输入行中剩余的所有字符,直到遇到换行符。这能确保下一次读取不会被之前的错误输入干扰。
  3. 给出错误提示并重新引导用户: 告诉用户输入有误,并让他们重新输入。

在购物车逻辑交互方面,一个清晰的菜单是必不可少的。通过一个

do-while
循环来展示主菜单,并使用
switch
语句根据用户的选择调用不同的功能函数,这是最常见也最有效的方式。比如,用户选择“1”就调用
displayProducts()
,选择“2”就调用
addToCart()
。在
addToCart()
这样的功能里,除了检查输入是否为数字,我们还需要进行业务逻辑上的验证,比如商品ID是否存在、购买数量是否大于零、库存是否充足等。这些验证确保了程序的健壮性和数据的正确性。我个人觉得,这些输入验证和业务规则的判断,虽然增加了代码量,但却是构建一个“能用”的程序不可或缺的部分。否则,用户随便输个错,程序就崩了,那体验可太糟糕了。

C++购物车程序如何计算总价并处理异常情况?

计算总价相对直接,一旦购物车中有商品,我们只需要遍历

cart
中的每一个
CartItem
,然后根据
productId
products
列表中找到对应的商品价格,再乘以
CartItem
中的
quantity
,累加起来就是总价了。在
viewCart()
checkout()
函数中,我都实现了这个逻辑。需要注意的是,为了显示更友好的价格,我会用到
iomanip
库中的
std::fixed
std::setprecision(2)
来确保金额总是显示两位小数。

至于异常情况处理,除了前面提到的用户输入错误,还有一些业务逻辑上的“异常”需要考虑:

  • 购物车为空时尝试查看或结账: 这时程序不应该崩溃,而是应该友好地提示用户“购物车是空的”。
  • 添加不存在的商品ID: 需要检查用户输入的
    productId
    是否真的存在于
    products
    列表中。
  • 购买数量为零或负数: 数量必须是正整数。
  • 购买数量超过库存: 这是最常见的,必须检查
    quantity
    是否小于或等于
    stock
    。如果不足,要给出明确提示,并阻止购买。

我在

addToCart()
函数中就处理了这些情况,比如
if (!foundProduct)
if (quantity <= 0)
if (quantity > foundProduct->stock)
。这些都是为了让程序更“傻瓜式”,即便用户操作失误,程序也能给出合理的反馈,而不是直接报错或者进入奇怪的状态。当然,这只是最基础的异常处理。一个更完善的系统还会考虑多线程并发访问库存、网络请求失败、数据库连接中断等更复杂的“异常”,但对于一个简单的命令行购物车程序,这些已经足够了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

781

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

541

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

423

2024.03.13

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

97

2023.09.25

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

240

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

192

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

483

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

545

2024.08.29

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 14.6万人学习

Go语言web开发--经典项目电子商城
Go语言web开发--经典项目电子商城

共23课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号