设计并编写面向对象的c++简单应用程序

零食自动售货机可以售出若干种商品,其中,商品属性包括:商品代码、商品名、商品单价、商品总量、商品库存量;售货机中的货币属性包括:货币面值、货币数量;售货机电子账户包括:账号、金额。顾客购买商品可选择两种付款形式:第一种是扫码付款,微信或支付宝扫码模拟均可;第二种是投入面值为1/5/10/20元钱币购买商品,自动售货机吐出商品,并且找给用户零钱,零钱的面值分别为1元、2元和5元。如果商品用完,或者无法找零,则给出用户一个提示:商品已售完,并且退还钱币,为了避免流失顾客,希望你的售货机能够尽可能地给用户找零。为了调查用户的喜好,希望得到各种商品的每日消费数据,并由此来调整货柜中各类货物的存贮量。
要求:编写一个零食自动售货机系统。实现以下功能:
【功能要求】
(1)库存查询:检索当前各种商品的储存量。
(2)销售查询:持有密码的管理员可统计每种商品的销售量和销售额。
(3)货币查询:持有密码的管理员可统计所有不同面值的货币数目及总金额数,并检验货币总金额是否与总销售额一致。
(4)销售界面:顾客选择商品,确认后,扫码付款获得商品或投入钱币获得商品和零钱;或者直接显示错误并退还钱币。
(5)设计友好的界面和菜单:每种功能的操作都是在菜单中进行相应选择。
要求写详细注释

。最近都是课题,需要讲解可以留言

img

#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;

class Commodity {
public:
    int code;  
    string name;  
    double price;  
    int quantity;  
    int salesVolume;  
    double salesRevenue; 
    Commodity(int c, string n, double p, int q, int v = 0, double r = 0.0) {
        code = c;
        name = n;
        price = p;
        quantity = q;
        salesVolume = v;
        salesRevenue = r;
    }
    void sellCommodity(int q) {
        quantity -= q;
        salesVolume += q;
        salesRevenue += q * price;
    }
};

class Currency {
public:
    double value;  
    int quantity;
    Currency(double v, int q) {
        value = v;
        quantity = q;
    }
};

class Account {
public:
    int id;  
    double balance;  
    Account(int i = 0, double b = 0.0) {
        id = i;
        balance = b;
    }
};

class VendingMachine {
public:
    vector<Commodity> commodities;  
    vector<Currency> currencies;  
    Account account;  
    int password; 
    VendingMachine(vector<Commodity> c, vector<Currency> u, Account a = Account(), int p = 1234) {
        commodities = c;
        currencies = u;
        account = a;
        password = p;
    }

    void displayMenu() {  
        cout << "商品清单:" << endl;
        for (int i = 0; i < commodities.size(); i++) {
            cout << commodities[i].code << " " << commodities[i].name << " " << fixed << setprecision(2) << commodities[i].price << "元/个" << endl;
        }
    }

    bool checkCommodity(int code) {  
        for (int i = 0; i < commodities.size(); i++) {
            if (commodities[i].code == code) {
                return true;
            }
        }
        return false;
    }

    bool checkStock(int code) {  
        for (int i = 0; i < commodities.size(); i++) {
            if (commodities[i].code == code) {
                return commodities[i].quantity > 0;
            }
        }
        return false;
    }

    void buyCommodity(int code, double money) {  
        for (int i = 0; i < commodities.size(); i++) {
            if (commodities[i].code == code) {
                if (money < commodities[i].price) {
                    cout << "金额不足,请重新选择!" << endl;
                    return;
                }
                if (commodities[i].quantity == 0) {
                    cout << "商品已售完,请选择其他商品!" << endl;
                    return;
                }
                double change = money - commodities[i].price;
                if (change > 0) {
                    cout << "找零:" << fixed << setprecision(2) << change << "元" << endl;
                    account.balance += commodities[i].price;
                } else {
                    account.balance += money;
                }
                commodities[i].sellCommodity(1);
                cout << "购买成功!" << endl;
                return;
            }
        }
        cout << "商品不存在,请重新选择!" << endl;
    }

    void displaySales() { 
        int totalVolume = 0;
        double totalRevenue = 0.0;
        cout << "销售情况:" << endl;
        for (int i = 0; i < commodities.size(); i++) {
            totalVolume += commodities[i].salesVolume;
            totalRevenue += commodities[i].salesRevenue;
            cout << commodities[i].name << " 销售量:" << commodities[i].salesVolume << " 销售额:" << fixed << setprecision(2) << commodities[i].salesRevenue << "元" << endl;
        }
        cout << "总销售量:" << totalVolume << " 总销售额:" << fixed << setprecision(2) << totalRevenue << "元" << endl;
    }

    void displayStock() {  
        cout << "库存情况:" << endl;
        for (int i = 0; i < commodities.size(); i++) {
            cout << commodities[i].name << " 剩余数量:" << commodities[i].quantity << endl;
        }
    }

    void displayCurrency() {  
        int totalQuantity = 0;
        double totalValue = 0.0;
        cout << "货币情况:" << endl;
        for (int i = 0; i < currencies.size(); i++) {
            totalValue += currencies[i].value * currencies[i].quantity;
            totalQuantity += currencies[i].quantity;
            cout << currencies[i].value << "元:数量 " << currencies[i].quantity << endl;
        }
        cout << "-------------------------" << endl;
        cout << "总金额数:" << totalValue << "元" << endl;
        cout << "货币数量:" << totalQuantity << endl;
    }

    void displaySalesInterface(int password) { 
        if (password != this->password) {
            cout << "密码错误!" << endl;
            return;
        }
        displaySales();
        displayCurrency();
        if (checkTotalRevenue()) {
            cout << "货币总金额与总销售额一致。" << endl;
        } else {
            cout << "货币总金额与总销售额不一致,请检查货币情况!" << endl;
        }
    }

    bool checkTotalRevenue() { 
        double totalRevenue = 0.0;
        for (int i = 0; i < commodities.size(); i++) {
            totalRevenue += commodities[i].salesRevenue;
        }
        double totalValue = 0.0;
        for (int i = 0; i < currencies.size(); i++) {
            totalValue += currencies[i].value * currencies[i].quantity;
        }
        return totalRevenue == totalValue;
    }

    void displayStockInterface(int password) {
        if (password != this->password) {
            cout << "密码错误!" << endl;
            return;
        }
        displayStock();
    }
};

int main() {
    Commodity c1(1, "啤酒", 3.5, 10, 10);
    Commodity c2(2, "玩具", 5.0, 10, 10);
    Commodity c3(3, "糖果", 8.0, 10, 10);
    Commodity c4(4, "巧克力吧", 11.0, 20, 10);
    vector<Commodity> commodities = {c1, c2, c3,c4};

    Currency u1(1, 10);
    Currency u2(2, 10);
    Currency u3(5, 10);
    Currency u4(7, 10);
    vector<Currency> currencies = {u1, u2, u3,u4};
    Account account(123456, 0.0);
    VendingMachine vm(commodities, currencies, account, 1234);
    vm.displayMenu();

    int code;
    double money;
    cout << "请输入商品代码:" << endl;
    cin >> code;
    if (!vm.checkCommodity(code)) {
        cout << "商品不存在,请重新选择!" << endl;
        return 0;
    }
    if (!vm.checkStock(code)) {
        cout << "商品已售完,请选择其他商品!" << endl;
        return 0;
    }
    cout << "请输入金额:" << endl;
    cin >> money;
    vm.buyCommodity(code, money);
    vm.displaySales();
    vm.displayStock();
    int password;
    cout << "请输入管理员密码:" << endl;
    cin >> password;
    vm.displaySalesInterface(password);
    cout << "请输入管理员密码:" << endl;
    cin >> password;
    vm.displayStockInterface(password);

    return 0;
}



回答部分参考、引用ChatGpt以便为您提供更准确的答案:

根据您的需求,您需要根据打开的页面的itemid值查询name,并将对应的name值打印出来。下面是对您提供的代码进行修改的建议:

import random
import string
import pymysql
import cherrypy
import os
import json
import urllib.parse

url = '*********/?itemid=1'
parsed_url = urllib.parse.urlparse(url)
params = urllib.parse.parse_qs(parsed_url.query)
itemid = params['itemid'][0]

try:
    conn = pymysql.connect(host="localhost", user="*", password="*", database="*")
except pymysql.Error as e:
    print("error")

cursor = conn.cursor()
cursor.execute("SELECT name FROM test WHERE id = %s", (itemid,))
datas = cursor.fetchall()

if datas:
    datass = datas[0][0]
    print(datass)
else:
    print("No data found for itemid:", itemid)

cursor.close()
conn.close()

对比原始代码,我进行了以下修改:

  1. 引入了urllib.parse库来解析URL,并获取itemid的值。
  2. 使用execute方法中的参数绑定方式,将itemid作为参数传递给SQL查询语句,以防止SQL注入攻击。
  3. 添加了判断,如果查询结果不为空,则将查询到的name值打印出来;否则打印出未找到数据的提示信息。
  4. 关闭了cursor和数据库连接。

请根据实际情况修改代码中的数据库连接参数和SQL查询语句,以适应您的数据库结构和数据表名称。

c++ 实现自动售货机器

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
using namespace std;



int main()
{

    //售货机只卖三种商品
    // 薯片,可乐,面包  单价为 5元,3元,4元  初始数量都为10int shupians=10;
    int cokes=10;
    int breads=10;
    int Moneys=0; //记录营业额
    cout<<"自动售货机系统启动"<<endl;
    while(true)
    {
        int n=0;
        cout<<"1.购买商品"<<endl;
        cout<<"2.补货"<<endl;
        cout<<"3.查询营业额度"<<endl;
        cin>>n;
        if(n==1)
        {
            while(true)
            {
                cout<<"请输入要购买的商品"<<endl;
                cout<<"1.薯片"<<endl;
                cout<<"2.可乐"<<endl;
                cout<<"3.面包"<<endl;
                cout<<"4.退出"<<endl;
                int a=0;
                int Count=0;
                cin>>a;
                if(a==1)
                {
                    cout<<"请输入需要购买的数量"<<endl;
                    cin>>Count;
                    if(Count>shupians)
                    {
                        cout<<"数量超出库存,请重新选择"<<endl;
                    }
                    else
                    {
                        cout<<"总价为:"<<Count*5<<endl;
                        cout<<"请投币取货"<<endl;
                        cout<<"请输入投币金额"<<endl;
                        int money=0;
                        cin>>money;
                        if(money<Count*5)
                        {
                            while(true)
                            {

                                cout<<"金额不足"<<endl;
                                cout<<"1.继续投币"<<endl;
                                cout<<"2.取消购买"<<endl;
                                int g=0;
                                cin>>g;
                                if(g==1)
                                {
                                    cout<<"输入投币金额"<<endl;
                                    int money2=0;
                                    cin>>money2;
                                    money+=money2;
                                    if(money>=Count*5)
                                    {
                                        Moneys+=Count*5;
                                        cout<<"购买成功"<<endl;
                                        cout<<"找零:"<<money-Count*5<<"元"<<endl;
                                        break;
                                    }
                                }else if(g==2)
                                {
                                    cout<<"找零:"<<money<<"元"<<endl;
                                    break;
                                }
                            }

                        }
                    }

                }else if(a==2)
                {
                    cout<<"请输入需要购买的数量"<<endl;
                    cin>>Count;
                    if(Count>cokes)
                    {
                        cout<<"数量超出库存,请重新选择"<<endl;
                    }
                    else
                    {
                        cout<<"总价为:"<<Count*3<<endl;
                        cout<<"请投币取货"<<endl;
                        cout<<"请输入投币金额"<<endl;
                        int money=0;
                        cin>>money;
                        if(money<Count*5)
                        {
                            while(true)
                            {

                                cout<<"金额不足"<<endl;
                                cout<<"1.继续投币"<<endl;
                                cout<<"2.取消购买"<<endl;
                                int g=0;
                                cin>>g;
                                if(g==1)
                                {
                                    cout<<"输入投币金额"<<endl;
                                    int money2=0;
                                    cin>>money2;
                                    money+=money2;
                                    if(money>=Count*3)
                                    {
                                        Moneys+=Count*3;
                                        cout<<"购买成功"<<endl;
                                        cout<<"找零:"<<money-Count*5<<"元"<<endl;
                                        break;
                                    }
                                }else if(g==2)
                                {
                                    cout<<"找零:"<<money<<"元"<<endl;
                                    break;
                                }
                            }

                        }
                    }

                }else if(a==3)
                {
                    cout<<"请输入需要购买的数量"<<endl;
                    cin>>Count;
                    if(Count>breads)
                    {
                        cout<<"数量超出库存,请重新选择"<<endl;
                    }
                    else
                    {
                        cout<<"总价为:"<<Count*5<<endl;
                        cout<<"请投币取货"<<endl;
                        cout<<"请输入投币金额"<<endl;
                        int money=0;
                        cin>>money;
                        if(money<Count*4)
                        {
                            while(true)
                            {

                                cout<<"金额不足"<<endl;
                                cout<<"1.继续投币"<<endl;
                                cout<<"2.取消购买"<<endl;
                                int g=0;
                                cin>>g;
                                if(g==1)
                                {
                                    cout<<"输入投币金额"<<endl;
                                    int money2=0;
                                    cin>>money2;
                                    money+=money2;
                                    if(money>=Count*4)
                                    {
                                        Moneys+=Count*4;
                                        cout<<"购买成功"<<endl;
                                        cout<<"找零:"<<money-Count*5<<"元"<<endl;
                                        break;
                                    }
                                }else if(g==2)
                                {
                                    cout<<"找零:"<<money<<"元"<<endl;
                                    break;
                                }
                            }

                        }
                    }
                }
                else if(a==4)
                {
                    break;
                }
                else
                {
                    cout<<"操作有误,重新操作"<<endl;
                }
            }

        }
        else if(n==2)
        {
            while(true)
            {
                cout<<"请输入要购买的商品"<<endl;
                cout<<"1.薯片"<<endl;
                cout<<"2.可乐"<<endl;
                cout<<"3.面包"<<endl;
                cout<<"4.退出"<<endl;

                int a=0;
                cin>>a;
                if(a==1)
                {
                    cout<<"请输入上货数量"<<endl;
                    int Count=0;
                    cin>>Count;
                    shupians+=Count;
                    cout<<"薯片数量:"<<shupians<<endl;
                }else if(a==2)
                {
                    cout<<"请输入上货数量"<<endl;
                    int Count=0;
                    cin>>Count;
                    cokes+=Count;
                    cout<<"可乐数量:"<<cokes<<endl;

                }
                else if(a==3)
                {
                    cout<<"请输入上货数量"<<endl;
                    int Count=0;
                    cin>>Count;
                    breads+=Count;
                    cout<<"面包数量:"<<breads<<endl;

                }
                else if(a==4)
                {
                    break;
                }
                else
                {
                    cout<<"操作有误,请重新操作"<<endl;
                }
            }
        }
        else if(n==3)
        {
            cout<<"营业额为:"<<Moneys<<endl;
        }
        else
        {
            cout<<"操作有误,请重新选择"<<endl;
        }
    }

    return 0;
}



不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/1063636
  • 除此之外, 这篇博客: Educational Codeforces Round 102 (Rated for Div. 2)中的 思路:首先考虑在没有删除的情况下,一系列操作过程中,能变成多少不同的值。x初始为0,随着+±-的变化,会来回反复横跳,那么两个关键点就是最大值和最小值,这说明从最大值到最小值之间的数字,都是在操作过程中出现。所以只需要考虑一个区间内的操作产生的最大最小值。但是题目要删掉,中间一段,剩下两段,也就是要把两段合并起来。画个图其实更好理解。红色的是所有的操作,绿色的是要删除的操作,第二个曲线就是合并之后的x值变化曲线。由图可知。后面那部分合并过来之后,起点就是前面那部分的终点!这就是关键点。然后前面那部分的区间的最大最小值和当前值都很好维护。难的是后面那部分怎么维护。后面那部分,从后往前维护,每到一个点,都认为这个点是零点,然后计算最大值最小值。因为是反着来,可以发现操作曲线是一个与 原操作 关于x轴对称的曲线,所以最大值就是最小值,最小值就是最大值。然后最小值就是 当前点到最小值的距离,最大值就是 当前点到最大值的距离。之所以算距离,是因为,永远认为当前点是0点。所以 距离 才是真正的最大最小值。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在这里插入图片描述


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

我是真的耗费了我的空余时间做的,希望作者采纳

#include<bits/stdc++.h>
using namespace std;
int baishikele,shupian,wangzainiunai;
double n;
string s;
int main() {
    baishikele=shupian=wangzainiunai=100;
    while(cout<<"请问你要买些什么呢?"<<endl) {
        cout<<endl<<"我们有薯片,百事可乐和旺仔牛奶,请问你想要选择哪个?ctrl+z退出"<<endl;
        cout<<"百事可乐3.5元,旺仔牛奶2.5元,薯片4元。"<<endl;
        cin>>s;
        if(s=="薯片"&&shupian!=0) {
            cout<<"一共需要"<<4<<"块钱"<<endl;
            cin>>n;
            if(n==4) {
                shupian--;
                cout<<"还有"<<shupian<<"包薯片"<<endl;
                cout<<"还有"<<baishikele<<"瓶百事可乐"<<endl;
                cout<<"还有"<<wangzainiunai<<"瓶旺仔牛奶"<<endl;
            } else {
                cout<<"请重新输入!";
            }
        }
        if(s=="百事可乐"&&baishikele!=0) {
            cout<<"一共需要"<<3.5<<"块钱"<<endl;
            cin>>n;
            if(n==3.5) {
                baishikele--;
                cout<<"还有"<<shupian<<"包薯片"<<endl;
                cout<<"还有"<<baishikele<<"瓶百事可乐"<<endl;
                cout<<"还有"<<wangzainiunai<<"瓶旺仔牛奶"<<endl;
            } else {
                cout<<"请重新输入!";
            }
        }
        if(s=="旺仔牛奶"&&wangzainiunai!=0) {
            cout<<"一共需要"<<2.5<<"块钱"<<endl;
            cin>>n;
            if(n==2.5) {
                wangzainiunai--;
                cout<<"还有"<<shupian<<"包薯片"<<endl;
                cout<<"还有"<<baishikele<<"瓶百事可乐"<<endl;
                cout<<"还有"<<wangzainiunai<<"瓶旺仔牛奶"<<endl;
            } else {
                cout<<"请重新输入!";
            }
        }
    }
}

这个就是考察你结构体、函数、输入输出、循环等基本知识的掌握情况。给你找到一些关于零食自动售货机程序的源代码,可以参考下:
c++自动糖果贩卖机:https://www.cnblogs.com/wawcac-blog/p/12045706.html

img


C++实现的自动收货机系统:https://blog.csdn.net/weixin_43676892/article/details/125319118

分别定义商品、货币、电子账户等实体类,然后数据库可以用mysql,最后进行一个增删改查就基本可以了

下面是一个简单的C++程序,实现零食自动售货机系统的功能。它包含了面向对象编程的基本思想和技巧,注释也比较详细,方便理解和修改。其中,商品、货币和电子账户等数据结构都是用类来实现的,具有高度的封装性和可扩展性。

#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;

// 商品类
class Product {
public:
    Product(int code, string name, double price, int total)
        : code_(code), name_(name), price_(price), total_(total), stock_(total) {}
    int get_code() const { return code_; }
    string get_name() const { return name_; }
    double get_price() const { return price_; }
    int get_total() const { return total_; }
    int get_stock() const { return stock_; }
    bool sell(int quantity) {
        if (quantity <= 0 || quantity > stock_) return false;
        stock_ -= quantity;
        return true;
    }
private:
    int code_;  // 商品代码
    string name_;  // 商品名称
    double price_;  // 商品单价
    int total_;  // 商品总量
    int stock_;  // 商品库存量
};

// 货币类
class Money {
public:
    Money(int value, int count) : value_(value), count_(count) {}
    int get_value() const { return value_; }
    int get_count() const { return count_; }
    double get_amount() const { return value_ * count_; }
    void add(int count) { count_ += count; }
private:
    int value_;  // 货币面值
    int count_;  // 货币数量
};

// 电子账户类
class Account {
public:
    Account(int id, double balance) : id_(id), balance_(balance) {}
    int get_id() const { return id_; }
    double get_balance() const { return balance_; }
    bool pay(double amount) {
        if (amount <= 0 || amount > balance_) return false;
        balance_ -= amount;
        return true;
    }
    void deposit(double amount) {
        if (amount > 0) balance_ += amount;
    }
private:
    int id_;  // 账户号码
    double balance_;  // 账户余额
};

// 自动售货机类
class VendingMachine {
public:
    VendingMachine() {
        products_ = {
            { 1, Product(1, "可乐", 3.0, 10) },
            { 2, Product(2, "薯片", 5.0, 8) },
            { 3, Product(3, "巧克力", 6.0, 6) }
        };
        for (int i = 0; i < sizeof(money_values_) / sizeof(int); ++i)
            moneys_.push_back(Money(money_values_[i], 0));
        accounts_ = {
            { 1, 100.0 },
            { 2, 200.0 },
            { 3, 300.0 }
        };
    }
    void run() {
        int choice;
        do {
            show_menu();
            cout << "请选择要执行的操作(输入数字1-5):";
            cin >> choice;
            switch (choice) {
            case 1: check_stock(); break;
            case 2: check_sales(); break;
            case 3: check_money(); break;
            case 4: sell_product(); break;
            case 5: break;
            default: show_error("无效的选择");
            }
            cout << endl;
        } while (choice != 5);
    }
private:
    void show_menu() {
        cout << "********* 自动售货机 *********" << endl;
        cout << "1. 库存查询" << endl;
        cout << "2. 销售查询" << endl;
        cout << "3. 货币查询" << endl;
        cout << "4. 销售界面" << endl;
        cout << "5. 退出" << endl;
        cout << "*****************************" << endl;
    }
    void show_error(const string& message) {
        cerr << "错误提示:" << message << endl;
    }
    void check_stock() {
        cout << "当前库存信息如下:" << endl;
        for (auto it : products_) {
            const Product& product = it.second;
            cout << "商品代码:" << product.get_code() << endl;
            cout << "商品名称:" << product.get_name() << endl;
            cout << "商品单价:" << product.get_price() << endl;
            cout << "商品总量:" << product.get_total() << endl;
            cout << "商品库存量:" << product.get_stock() << endl;
        }
    }
    void check_sales() {
        cout << "请输入管理员密码:";
        string password;
        cin >> password;
        if (password != "123456") {
            show_error("密码错误");
            return;
        }
        map<int, int> sales_by_code;
        map<int, double> revenue_by_code;
        for (auto it : products_) {
            const Product& product = it.second;
            sales_by_code[product.get_code()] = 0;
            revenue_by_code[product.get_code()] = 0.0;
        }
        for (auto it : sales_) {
            const Sale& sale = it;
            const Product& product = products_.at(sale.code);
            sales_by_code[sale.code] += sale.quantity;
            revenue_by_code[sale.code] += sale.quantity * product.get_price();
        }
        cout << "各种商品的销售量和销售额为:" << endl;
        for (auto it : products_) {
            const Product& product = it.second;
            int code = product.get_code();
            cout << "商品代码:" << code << endl;
            cout << "商品名称:" << product.get_name() << endl;
            cout << "销售量:" << sales_by_code[code] << endl;
            cout << "销售额:" << revenue_by_code[code] << endl;
        }
    }
    void check_money() {
        cout << "请输入管理员密码:";
        string password;
        cin >> password;
        if (password != "123456") {
            show_error("密码错误");
            return;
        }
        double total_amount = 0.0;
        map<int, int> count_by_value;
        for (auto it : moneys_) {
            const Money& money = it;
            count_by_value[money.get_value()] = money.get_count();
            total_amount += money.get_amount();
        }
        cout << "货币总金额为:" << total_amount << endl;
        cout << "各种货币的数量如下:" << endl;
        for (int value : money_values_) {
            cout << value << "元: " << count_by_value[value] << "个" << endl;
        }
    }
    void sell_product() {
        int code, quantity;
        double amount;
        cout << "请输入商品代码和数量(用空格分隔):";
        cin >> code >> quantity;
        if (products_.count(code) == 0) {
            show_error("不存在该种商品");
            return;
        }
        const Product& product = products_.at(code);
        if (!product.sell(quantity)) {
            show_error("商品库存不足");
            return;
        }
        cout << "请选择付款方式:1. 扫码付款 2. 投币付款:";
        bool scan_pay;
        cin >> scan_pay;
        if (scan_pay) {
            cout << "请扫码支付:" << product.get_price() * quantity << "元" << endl;
            // 其他操作省略,模拟为直接支付
            amount = product.get_price() * quantity;
        } else {
            int total_value = 0;
            for (auto it : moneys_) {
                total_value += it.get_value() * it.get_count();
            }
            cout << "请输入要投入的钱币面值(1/5/10/20,输入0结束):" << endl;
            while (true) {
                int value;
                cin >> value;
                if (value <= 0 || value > 20 || (value != 1 && value != 5 && value != 10 && value != 20)) {
                    break;
                }
                total_value += value;
                bool found = false;
                for (auto& it : moneys_) {
                    if (it.get_value() == value) {
                        it.add(1);
                        found = true;
                        break;
                    }
                }
                if (!found) {
                    show_error("输入的钱币面值不合法");
                    return;
                }
            }
            if (total_value < product.get_price() * quantity) {
                show_error("付款金额不足");
                return;
            }
            amount = total_value - product.get_price() * quantity;
        }
        if (amount > 0) {
            for (auto it = moneys_.rbegin(); it != moneys_.rend(); ++it) {
                Money& money = *it;
                int count = min(money.get_count(), (int)(amount / money.get_value()));
                amount -= count * money.get_value();
                money.add(-count);
                if (amount <= 0) break;
            }
        }
        if (amount < 0) {
            for (auto it = moneys_.begin(); it != moneys_.end(); ++it) {
                Money& money = *it;
                int count = min(product.get_price() * quantity - amount, money.get_count());
                amount += count * money.get_value();
                money.add(-count);
                if (amount >= 0) break;
            }
        }
        if (amount != 0) {
            show_error("找零失败");
            return;
        }
        cout << "购买成功,找零:" << (-amount) << "元" << endl;
        Sale sale = { code, quantity };
        sales_.push_back(sale);
        accounts_.at(1).deposit(product.get_price() * quantity);
    }
private:
    struct Sale {
        int code;
        int quantity;
    };
    vector<Sale> sales_;  // 销售记录
    map<int, Product> products_;  // 商品库存
    vector<Money> moneys_;  // 货币库存
    const int money_values_[4] = { 1, 5, 10, 20 };  // 面值
    map<int, Account> accounts_;  // 电子账户
};

int main() {
    VendingMachine vending;
    vending.run();
    return 0;
}