自动售货系统

艾恩凝

https://aeneag.xyz/

公众号:技术乱舞

目录

描述

输入描述:

输出描述:

示例

代码

描述

1 总体说明

考生需要模拟实现一个简单的自动售货系统,实现投币、购买商品、退币、查询库存商品及存钱盒信息的功能。

系统初始化时自动售货机中商品为6种商品,商品的单价参见1.1规格说明,存钱盒内放置1元、2元、5元、10元钱币,商品数量和钱币张数通过初始化命令设置,参见2.1 系统初始化。

1.1规格说明

1. 商品:每种商品包含商品名称、单价、数量三种属性,其中商品名不重复。考生不能修改商品名称和单价,初始化命令设置商品数量。这些信息在考试框架中进行定义,考生在实现功能代码时可直接使用。

商品 名称

单价

数量

A12X
A23X
A34X
A45X
A58X
A66X

2. 存钱盒信息:钱币面额、张数两种属性。初始化命令设置各种面额钱币张数。这些信息在考试框架中进行定义,考生在实现功能代码时可直接使用。

钱币面额

张数

10元

X

5元

X
2元X
1元X

3. 退币原则 

1) 根据系统存钱盒内钱币的 信息 ,按钱币总张数最少的原则进行退币。

2) 如果因零钱不足导致不能退币,则尽最大可能退币,以减少用户损失。

例如:假设存钱盒内只有4张2元,无其它面额钱币。如果需要退币7元,系统因零钱不足无法退币,则继续尝试退币6元,最终系统成功退币3张2元,用户损失1元钱币。

4. 投币操作说明:每次投币成功,投入的钱币面额累加到投币余额;同时,本次投入的钱币放入存钱盒中,存钱盒相应面额钱币增加。

5. 投币余额:指当前自动售货机中用户剩余的可购买商品的钱币总额;例如:投入2元面额的钱币,投币余额增加2元;购买一件价格2元的商品,投币余额减少2元;

6. 退币操作说明:退币操作需要遵守 退币原则 ;退币成功后,投币余额清零,同时扣除存钱盒相应的金额。

7. 购买商品操作说明:一次仅允许购买一件商品;购买商品成功后,自动售货机中对应商品数量减1,投币余额扣除本次购买商品的价格。

2 操作说明

命令字与第一个参数间使用一个空格分隔,多条命令采用分号隔开。考试系统会对输入命令格式进行处理,考生不需要关注输入命令格式的合法性,只需要实现命令处理函数。

2.1 系统初始化

命令格式

r A1 数量 -A2 数量 -A3 数量 -A4 数量 -A5 数量 -A6 数量 元张数 -2 元张数 -5 元张数 -10 元张数

参数名称

参数说明

类型

取值范围

A1数量

商品A1数量

整数

[0,30]

A2数量

商品A2数量

整数

[0,30]

A3数量

商品A3数量

整数

[0,30]

A4数量

商品A4数量

整数

[0,30]

A5数量

商品A5数量

整数

[0,30]

A6数量

商品A6数量

整数

[0,30]

1元张数

面额1元钱币张数

整数

[0,30]

2元张数

面额2元钱币张数

整数

[0,30]

5元张数

面额5元钱币张数

整数

[0,30]

10元张数

面额10元钱币张数

整数

[0,30]

商品和各种面额钱币取值范围只是作为初始化命令的限制,其它场景下不限制取值范围;考试框架已经实现取值范围的检查,考生不需要关注。

功能说明:设置自动售货机中商品数量和存钱盒各种面额的钱币张数;

约束说明:系统在任意阶段均可执行r初始化系统;考生不需要关注参数的合法性,不需要关注增加或缺少参数的场景;

输出说明:输出操作成功提示(执行完r命令后系统会自动输出操作结果,考生不需要再次调用输出函数),例:

命令输出含义
r 6-5-4-3-2-1 4-3-2-1;S001:Initialization is successful初始化成功

2.2 投币

命令格式钱币面额

功能说明

(1) 如果投入非1元、2元、5元、10元的钱币面额(钱币面额不考虑负数、字符等非正整数的情况),输出“E002:Denomination error”;

(2) 如果存钱盒中1元和2元面额钱币总额小于本次投入的钱币面额,输出“E003:Change is not enough, pay fail”,但投入1元和2元面额钱币不受此限制。

(3) 如果自动售货机中商品全部销售完毕,投币失败。输出“E005:All the goods sold out”;

(4) 如果投币成功,输出“S002:Pay success,balance=X”;

约束说明

(1) 系统在任意阶段都可以投币;

(2) 一次投币只能投一张钱币;

(3) 同等条件下,错误码的优先级:E002 > E003 > E005;

输出说明:如果投币成功,输出“S002:Pay success,balance=X”。

例:

命令

输出

p 10;

S002:Pay success,balance=10

2.3 购买商品

命令格式商品名称

功能说明

(1) 如果购买的商品不在商品列表中,输出“E006:Goods does not exist”;

(2) 如果所购买的商品的数量为0,输出“E007:The goods sold out”;

(3) 如果投币余额小于待购买商品价格,输出“E008:Lack of balance”;

(4) 如果购买成功,输出“S003:Buy success,balance=X”;

约束说明

(1) 一次购买操作仅能购买一件商品,可以多次购买;

(2) 同等条件下,错误码的优先级:E006 > E007 > E008;

输出说明:

如果购买成功,输出“S003:Buy success,balance=X”。

例:

命令

输出

b A1;

S003:Buy success,balance=8

2.4 退币

命令格式c

功能说明

(1) 如果投币余额等于0的情况下,输出“E009:Work failure”;

(2) 如果投币余额大于0的情况下,按照 退币原则 进行“找零”,输出退币信息;

约束说明

(1) 系统在任意阶段都可以退币;

(2) 退币方式必须按照 退币原则 进行退币;

输出说明:如果退币成功,按照 退币原则 输出退币信息。

例,退5元钱币:

命令

输出

c;

1 yuan coin number=0

2 yuan coin number=0

5 yuan coin number=1

10 yuan coin number=0

2.5 查询

命令格式q 查询类别

功能说明

(1) 查询自动售货机中商品信息,包含商品名称、单价、数量。 根据商品数量从大到小进行排序;商品数量相同时,按照商品名称的先后顺序进行排序 

例如:A1的商品名称先于A2的商品名称,A2的商品名称先于A3的商品名称。

(2) 查询存钱盒信息,包含各种面额钱币的张数;

(3) 查询类别如下表所示:

查询类别

查询内容

0

查询商品信息

1查询存钱盒信息

如果“查询类别”参数错误,输出“E010:Parameter error”。“查询类别”参数错误时,不进行下面的处理;

输出说明

“查询类别”为0时,输出自动售货机中所有商品信息(商品名称单价数量)例:

命令

输出

q 0;

A1 2 6

A2 3 5

A3 4 4

A4 5 3

A5 8 2

A6 6 0

“查询类别”为1时,输出存钱盒信息(各种面额钱币的张数),格式固定。例:

命令

输出

q 1;

1 yuan coin number=4

2 yuan coin number=3

5 yuan coin number=2

10 yuan coin number=1

输入描述:

依照说明中的命令码格式输入命令。

输出描述:

输出执行结果

示例

输入:

r 22-18-21-21-7-20 3-23-10-6;c;q0;p 1;b A6;c;b A5;b A1;c;q1;p 5;

输出:

S001:Initialization is successful
E009:Work failure
E010:Parameter error
S002:Pay success,balance=1
E008:Lack of balance
1 yuan coin number=1
2 yuan coin number=0
5 yuan coin number=0
10 yuan coin number=0
E008:Lack of balance
E008:Lack of balance
E009:Work failure
E010:Parameter error
S002:Pay success,balance=5

代码

#include <bits/stdc++.h>
using namespace std;
typedef struct Price{
    int A1;
    int A2;
    int A3;
    int A4;
    int A5;
    int A6;
    Price():A1(2),A2(3),A3(4),A4(5),A5(8),A6(6){}
}T_Price,*P_Price;
typedef struct Product{
    int A1;
    int A2;
    int A3;
    int A4;
    int A5;
    int A6;
    int sum;
    Product():A1(0),A2(0),A3(0),A4(0),A5(0),A6(0),sum(0){}
}T_Product,*P_Product;
typedef struct RMB{
    int one;
    int two;
    int five;
    int ten;
    RMB():one(0),two(0),five(0),ten(0){}
}T_RMB,*P_RMB;
/*******************初始化字符串,保存商品 和 金币 *********************/
vector<string> dispose_all_string(string &str);// 最初处理字符串
vector<int> dispose_str(string &str);// 处理商品和金币字符串
void inital_product_and_rmb(string &str,P_Product product,P_RMB rmb);
vector<string> intital_store(string &str,P_Product product,P_RMB rmb);
/*******************初始化字符串,保存商品 和 金币 *********************/
void pay(int& balance,int rmb,P_RMB p_rmb,P_Product p_prod);//投币函数
void buy(int& balance,string& str,P_Price p_price,P_Product p_prod);
void back(int& balance,P_RMB p_rmb);
void find(string& str,P_Price p_price,P_Product p_prod,P_RMB rmb);
int main(void){
    string str;
    getline(cin, str);
    T_Product product;
    T_RMB rmb;
    T_Price price;
    int balance = 0;
    // 初始化商品和剩余金币,operat 1开始保存操作字符
    vector<string> operat = intital_store(str,&product,&rmb);

    for(int i = 1 ; i < operat.size() ;++i){
        switch(operat[i][0]){
            case 'p':
                operat[i].erase(0, 2);
               // int p = atoi(operat[i].c_str());
                pay(balance, atoi(operat[i].c_str()), &rmb, &product);
                break;
            case 'b':  
                operat[i].erase(0, 2);
                buy(balance, operat[i], &price, &product);// A1
                break;
            case 'c':
                back(balance, &rmb);
                break;
            case 'q':
                find(operat[i],&price, &product,&rmb);
                break;
        }
    }
//     string st = "A2";
//     int bl = 0;
//     int r = 5;
//     pay(bl, r, &rmb, &product);
//     buy(bl, st, &price, &product);
//     back(bl,&rmb);
//     find(1, &price, &product,&rmb);
    
}
void find(string& str,P_Price p_price,P_Product p_prod,P_RMB rmb){
    //cout << str <<"++++++"<<endl;
    if(str[1] == ' ' && str.length() == 3){
        if(str[2] == '0'){
            for(int i = 0 ; i < 6 ; ++i)
                cout << "A" << i+1 << " "  << *((int*)p_price + i)<< " " << *((int*)p_prod + i) << endl;
        }else if(str[2] == '1'){
            cout << "1 yuan coin number=" << rmb->one << endl
                     << "2 yuan coin number=" << rmb->two << endl
                     << "5 yuan coin number=" << rmb->five << endl
                     << "10 yuan coin number=" << rmb->ten << endl;
        }
    }else
        cout << "E010:Parameter error" << endl;
}
void back(int& balance,P_RMB p_rmb){
    if(balance == 0)
        cout<< "E009:Work failure"<<endl;
    else{
        int ten = balance / 10;
        if(ten < *((int*)p_rmb + 3)){
            *((int*)p_rmb + 3) -= ten;
            balance %= 10; 
        }else{
            balance -= *((int*)p_rmb + 3) * 10;
            *((int*)p_rmb + 3) = 0;
        }
        int five = balance / 5;
        if(five < *((int*)p_rmb + 2)){
            *((int*)p_rmb + 2) -= five;
            balance %= 5; 
        }else{
            balance -= *((int*)p_rmb + 2) * 5;
            *((int*)p_rmb + 2) = 0;
        }
        int two = balance / 2;
        if(two < *((int*)p_rmb + 1)){
            *((int*)p_rmb + 1) -= two;
            balance %= 2; 
        }else{
            balance -= *((int*)p_rmb + 1) * 2;
            *((int*)p_rmb + 1) = 0;
        }
        int one = balance ;
        if(one < *((int*)p_rmb )){
            *((int*)p_rmb) -= one;
            balance = 0; 
        }else{
            balance -= *((int*)p_rmb);
            *((int*)p_rmb) = 0;
        }
        cout << "1 yuan coin number=" << one << endl;
        cout << "2 yuan coin number=" << two << endl;
        cout << "5 yuan coin number=" << five << endl;
        cout << "10 yuan coin number=" << ten << endl;
    }
}
void buy(int& balance,string& str,P_Price p_price,P_Product p_prod){
    //指针操作获取结构体中的数值,两种写法
    int *p = (int *)p_prod;
    //if(str != "A1" || str != "A2" || str != "A3" || str != "A4" || str != "A5" || str != "A6" ){
    if(str[0] != 'A' && str[1] < '7' && str[1] > '0'){
        cout << "E006:Goods does not exist"<< endl;
    }else if( *(p+(str[1]-'1')) == 0){
        cout << "E007:The goods sold out"<<endl;
    }else if(balance < *((int *)p_price+(str[1]-'1'))){
        cout << "E008:Lack of balance"<<endl;
    }else{
        balance -= *((int *)p_price+(str[1]-'1'));
        -- *(p+(str[1]-'1'));
        --p_prod->sum;
        cout << "S003:Buy success,balance="<<balance<<endl;
    }
}
void pay(int& balance,int rmb,P_RMB p_rmb,P_Product p_prod){
    
    if(rmb == 1 || rmb == 2 || rmb == 5 || rmb == 10){

        if(rmb > 2 && (p_rmb->one + p_rmb->two *2) < rmb){
            cout << "E003:Change is not enough, pay fail"<<endl;
            return;
        }
        if(p_prod->sum == 0){
            cout << "E0E005:All the goods sold out"<<endl;
            return;
        }
        balance += rmb;
        if(rmb == 1)++ *(int*)p_rmb;
        if(rmb == 2)++ *((int*)p_rmb + 1);
        if(rmb == 5)++ *((int*)p_rmb + 2);
        if(rmb == 10)++ *((int*)p_rmb + 3);
        cout << "S002:Pay success,balance="<<balance<<endl;
    }else{
        cout << "E002:Denomination error"<<endl;
    }
}
vector<string> intital_store(string &str,P_Product product,P_RMB rmb){
    //product = Product()
    vector<string> init_ = dispose_all_string(str);
    inital_product_and_rmb(init_[0],product,rmb);
    cout << "S001:Initialization is successful"<<endl;
    return init_;
}
vector<string> dispose_all_string(string &str){
    vector<string> tmp;
    string st;
    for(auto &c : str){
        if(c != ';')st += c;
        else{
            tmp.push_back(st);
           
            st = "";
        }
    }
    return tmp;
}
void inital_product_and_rmb(string &str,P_Product product,P_RMB rmb){
     string tmp;
    vector<string> res;
    for(auto &c : str){
        if(c != ' ')tmp += c;
        else{
            res.push_back(tmp);
            tmp = "";
        }
    }
    res.push_back(tmp);
    vector<int> pro = dispose_str(res[1]);
    vector<int> rm  = dispose_str(res[2]);
    product->A1 = pro[0];
    product->A2 = pro[1];
    product->A3 = pro[2];
    product->A4 = pro[3];
    product->A5 = pro[4];
    product->A6 = pro[5];
    product->sum = pro[0]+pro[1]+pro[2]+pro[3]+pro[4]+pro[5];
    rmb->one = rm[0];
    rmb->two = rm[1];
    rmb->five = rm[2];
    rmb->ten = rm[3];   
}
vector<int> dispose_str(string &str){
    int cnt = 0;
    for(auto &c:str){
        if(c == '-') ++cnt;
    }
    ++cnt;
    vector<int> res_int(cnt,0);
    string res_str;
    cnt = 0;
    for(auto &c:str){
        if(c != '-') res_str += c;
        else {
            res_int[cnt] = atoi(res_str.c_str());
            ++cnt;
            res_str = "";
        }
    }
    res_int[cnt] = atoi(res_str.c_str());
    return res_int;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾恩凝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值