购物结算系统

题目要求

1 总体说明

考生需要模拟实现一个简单的购物结算系统,实现挑选和删除商品、按照最佳优惠方案进行结算、查询购物车订单信息及购物卡余额和积分的功能。

系统初始化时购物卡中有3000元余额和150积分,可以输入命令来初始化系统。

1.1 购物活动细则

只要购物卡余额足够,可以进行多次购买,每次购买活动可以包含如下活动:

1、多次挑选商品,每次挑选形成购物车中的一条商品订单;

2、多次删除商品订单,每次只能删除一条订单;

结算的是当前购物车中所有订单,结算完成即本次购买活动结束,同时清空购物车并更新购物卡余额和积分;

1.2 商品优惠细则

购买商品时优惠方案分为单项优惠方案和总价优惠方案,在享受单项优惠的同时如满足一定条件可以再享受总价优惠。

各种商品的单项优惠方案列表:

单项优惠方案序号:

1、在一次购买活动中,同种商品只能有一种单项优惠方案;总价优惠方案:在一次购买活动结算时,所有商品单项优惠后总消费金额大于等于500时,可以再使用“积分抵现”或“折上折”优惠:

(1) 积分抵现:1个积分抵1元现金,购物卡积分大于等于120只能使用120个积分,不足120,全部使用;

(2) 折上折:在单项商品优惠后总金额基础上,再打8折;

1.3 约束

* 商品价格最小单位到元,所有涉及价格计算中不足1元,向下取整,舍掉余数部分。例如:计算出的实际价格为563.9,则取整为563;

* 本次购买活动新增的积分不能在当次购买中使用;

* 购物卡余额和积分不能透支;

2 操作说明

命令字与第一个参数间使用一个空格分隔,多个参数间使用半角“-”分隔,参数间没有空格。考试系统会对输入命令格式进行处理,考生不需要关注输入命令格式的合法性,只需要实现命令处理函数。对于涉及多个参数的命令,多个参数同时出错的情况不作为考察点。

2.1 系统初始化

命令格式:r

功能说明:将购物卡金额和积分分别初始化为3000、150;

约束说明:系统在任意阶段均可执行r初始化系统;

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

2.2 挑选商品

命令格式:o 商品序号-商品数量

功能说明:

(1) 每次挑选只能指定一种商品,且商品数量不超过100(0<每次挑选商品数量<=100),同一种商品可以多次挑选;

(2) 挑选成功则生成购物车中的一条商品订单,输出:“S002”;

(3) 如果输入的“商品序号”或“商品数量”参数不合法,输出“E002”。参数错误直接返回不再进行其他处理;

(4) 购物车中最多容纳5条商品订单,挑选时如果购物车已满,则挑选失败,输出“E003”;

(5) 在挑选商品阶段不校验购物卡余额是否足够;

约束说明:

(1) 系统在任意阶段都可以挑选商品;

(2) 购物车中的同一种商品的订单记录不合并;

输出说明:如果挑选成功,输出操作提示。例,挑选6本书籍:

2.3 删除商品订单记录

命令格式:c 商品序号-商品数量

功能说明:

(1) 在结账前可以删除购物车中的订单以取消挑选,商品数量不超过100(0<每次删除商品数量<=100),每次只能删除一条,可以执行多次删除操作;

(2) 只能删除购物车中与删除命令输入的“商品序号”、“商品数量”完全匹配的订单记录;

(3) 如果输入的“商品序号”或“商品数量”参数不在系统允许的范围内,输出“E002”。参数错误直接返回不再进行其他处理;

(4) 如果购物车为空,输出“E005”;

(5) 如果购物车中不存在待删除订单,输出“E004”;

(6) 如果购物车中存在多条相同(“商品序号”和“商品数量”都相同)的订单记录,则只删除购物车中的一条记录;

输出说明:如果删除成功,输出操作提示。例,从购物车中删除6本书籍的订单记录:

2.4 结算

命令格式:b

功能说明:

(1) 系统根据“商品优惠细则”自动调整商品的单项和总价优惠方案,使得用户消费金额最少。当两种总价优惠方案花费金额相同时,优选“折上折”。

(2) 如果购物车为空,输出“E005”;

(3) 如果购物卡余额或积分不足以购买购物车商品时,输出“E006”;

输出说明:如果结算成功,输出结果中包含本次购买所需的消费金额和消费积分以及新增的积分。例:

2.5 查询

命令格式:l 查询类别

功能说明:

(1) 查询购物卡信息(余额、积分)和购物车中的订单信息;

(2) 查询类别:0表示购物卡信息查询,1表示购物车订单查询;如果“查询类别参数错误,输出“E002”。“查询类别”参数错误时,不进行下面的处理。

输出说明:

(1) “查询类别”为0时,输出购物卡余额和积分,例:

(2) “查询类别”为1时,输出购物车中的订单数以及每种商品的总数,例:

2.6结束

命令格式:e 系统结束 功能说明:一次购物完成,系统结束。

输入:

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

输出:

输出执行结果

样例输入:

r

o 1-100

e

样例输出:

S001

S002

3 附录:

3.1 命令汇总

3.2 返回码汇总

3.3 基本用例

解题思路

1、初始化与退出操作位于测试用例的开头和结尾。这个结算系统只针对一个消费者的一次活跃的的购物过程,当该消费者选择退出时,结算系统也退出,即程序退出。

2、使用数组来记录购物单。系统规定购物车最多可以存储5个购物单,因此使用数组来记录,没有选择插入删除操作比较方便的链表。购物车数组初始化时被清零,如果有购物单加入购物车,则直接选择数组中为0的单元记录新的购物单信息。删除购物单时,则找到目标单元清零即可。

3、结算的时候计算各商品的单价优惠方案总和最多有12种结果,在这12中结果中筛选出小于500元的范围内的最小花费和大于等于500的范围内的最小花费。然后在进行总价优惠方案的判断。

代码实现

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

#define SIZE 5 //购物车数组长度
typedef struct {
    int seq;//商品分类号
    int number;//商品数目
}GOODS;
typedef struct {
    int money;//余额
    int points;//积分
    int numOfGoods;//购物车内清单数目
    GOODS shoppingCart[SIZE];//购物车数组
}CUSTOMER;
//初始化购物结算系统
void initShoppingSystem(CUSTOMER &customer) {
    customer.money = 3000;
    customer.points = 150;
    customer.numOfGoods = 0;
    memset(customer.shoppingCart, 0, sizeof(GOODS) * SIZE);
    cout << "S001" << endl;
    return;
}
//提取指令参数(只针对格式正确的指令)
void getGoodsRequirement(string &cmd, GOODS &goods) {
    int i = 1, num = 0, len = cmd.size();
    while (cmd[i] == ‘ ‘) {
        i++;
    }
    goods.seq = (cmd[i] - ‘0‘);
    for (i += 2; i < len; i++) {
        num = num * 10 + (cmd[i] - ‘0‘);
    }
    goods.number = num;
    return;
}
//挑选商品
void selectGoods(CUSTOMER &customer, string &cmd) {
    GOODS goods;
    int i;
    getGoodsRequirement(cmd, goods);
    if (goods.number > 100 || goods.number < 1 || goods.seq < 0 || goods.seq > 2) {
        cout << "E002" << endl;
        return;
    }
    if (customer.numOfGoods == 5) {
        cout << "E003" << endl;
        return;
    }
    for (i = 0; i < SIZE; i++) {
        if (customer.shoppingCart[i].number == 0 &&
            customer.shoppingCart[i].seq == 0) {
            memcpy(&(customer.shoppingCart[i]), &goods, sizeof(GOODS));
            customer.numOfGoods++;
            break;
        }
    }
    cout << "S002" << endl;
    return;
}
//删除商品
void deleteGoods(CUSTOMER &customer, string &cmd) {
    GOODS goods;
    int i;
    getGoodsRequirement(cmd, goods);
    if (goods.number > 100 || goods.number < 1 || goods.seq < 0 || goods.seq > 2) {
        cout << "E002" << endl;
        return;
    }
    if (customer.numOfGoods == 0) {
        cout << "E005" << endl;
        return;
    }
    for (i = 0; i < SIZE; i++) {
        if (customer.shoppingCart[i].number == goods.number &&
            customer.shoppingCart[i].seq == goods.seq) {
            memset(&(customer.shoppingCart[i]), 0, sizeof(GOODS));
            customer.numOfGoods--;
            break;
        }
    }
    if (i == SIZE) {
        cout << "E004" << endl;
    }
    else {
        cout << "S003" << endl;
    }
    return;
}
//结算
void buyGoods(CUSTOMER &customer) {
    int food = 0, clothes = 0, book = 0, price1, price2, custom = 0, p = 0;
    int sum[2] = { 0 }, foodSum[3] = { 0 }, clothesSum[2] = { 0 }, bookSum[2] = { 0 };
    int i, j, k, l = 0, tmp;
    if (customer.numOfGoods == 0) {
        cout << "E005" << endl;
        return;
    }
    /*
    统计各类商品所需的总金钱数目
    */
    for (i = 0; i < SIZE; i++) {
        if (customer.shoppingCart[i].number == 0) {
            continue;
        }
        switch (customer.shoppingCart[i].seq)
        {
        case 0:
            food += 10 * customer.shoppingCart[i].number;
            break;
        case 1:
            clothes += 120 * customer.shoppingCart[i].number;
            break;
        case 2:
            book += 30 * customer.shoppingCart[i].number;
            break;
        default:
            break;
        }
    }
    /*
    食品应用单价优惠方案后的所需金钱数目
    */
    if (food > 0) {
        foodSum[0] = food;
        foodSum[1] = (food / 10) * 9;
        foodSum[2] = food - (food / 100) * 18;
    }
    /*
    衣服应用单价优惠方案后的所需金钱数目
    */
    if (clothes > 0) {
        clothesSum[0] = clothes;
        clothesSum[1] = clothes - (clothes / 200) * 40;
    }
    /*
    书籍应用单价优惠方案后的所需金钱数目
    */
    if (book > 0) {
        bookSum[0] = book;
        bookSum[1] = book / 2;
    }
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 2; j++) {
            for (k = 0; k < 2; k++) {
                tmp = foodSum[i] + clothesSum[j] + bookSum[k];
                if (tmp > 0) {
                    /*
                    筛选出位于大于等于500元范围内的最小金钱数目
                    */
                    if (tmp >= 500) {
                        if (sum[1] == 0) {
                            sum[1] = tmp;
                        }
                        else {
                            sum[1] = sum[1] > tmp ? tmp : sum[1];
                        }
                    }
                    /*
                    筛选出位于小于500元范围内的最小金钱数目
                    */
                    else {
                        if (sum[0] == 0) {
                            sum[0] = tmp;
                        }
                        else {
                            sum[0] = sum[0] > tmp ? tmp : sum[0];
                        }
                    }
                }
            }
        }
    }
    /*
    适用于总价优惠方案的金钱数目处理
    */
    if (sum[1] > 0) {
        price1 = (int)((double)sum[1] * 0.8);
        p = customer.points >= 120 ? 120 : customer.points;
        price2 = sum[1] - p;
        if (price1 <= price2) {
            sum[1] = price1;
            p = 0;
        }
        else {
            sum[1] = price2;
        }
    }
    /*
    两个范围内的金钱数目均存在
    */
    if (sum[0] > 0 && sum[1] > 0) {
        if (sum[0] < sum[1]) {
            custom = sum[0];
            p = 0;
        }
        else {
            custom = sum[1];
            if (p != 0) {
                customer.points -= p;
            }
        }
    }
    /*
    只存在大于等于500元的金钱数目,考虑是否使用积分
    */
    else if (sum[0] == 0 && sum[1] > 0) {
        custom = sum[1];
        if (p != 0) {
            customer.points -= p;
        }
    }
    /*
    只存在小于500元的金钱数目
    */
    else if (sum[0] > 0 && sum[1] == 0) {
        custom = sum[0];
        p = 0;
    }
    if(custom > customer.money) {
        cout << "E006" << endl;
        return;
    }
    customer.money -= custom;
    customer.points += (custom / 10);
    memset(customer.shoppingCart, 0, sizeof(GOODS)*SIZE);
    customer.numOfGoods = 0;
    cout << custom << endl;
    cout << p << endl;
    cout << custom / 10 << endl;
    return;
}
//查询操作
void lookup(CUSTOMER &customer, string &cmd) {
    int i = 1, sum = 0, food = 0, clothes = 0, book = 0;
    int len = cmd.size();
    while (cmd[i] == ‘ ‘) {
        i++;
    }
    for (; i < len; i++) {
        sum = sum * 10 + (cmd[i] - ‘0‘);
    }
    if (sum != 0 && sum != 1) {
        cout << "E002" << endl;
        return;
    }
    //查询余额与积分
    if (sum == 0) {
        cout << customer.money << endl;
        cout << customer.points << endl;
    }
    //查询购物车信息
    else if (sum == 1)
    {
        for (i = 0; i < SIZE; i++) {
            if (customer.shoppingCart[i].number == 0) {
                continue;
            }
            switch (customer.shoppingCart[i].seq)
            {
            case 0:
                food += customer.shoppingCart[i].number;
                break;
            case 1:
                clothes += customer.shoppingCart[i].number;
                break;
            case 2:
                book += customer.shoppingCart[i].number;
                break;
            default:
                break;
            }
        }
        cout << customer.numOfGoods << endl;
        cout << food << endl;
        cout << clothes << endl;
        cout << book << endl;
    }
    return;
}

int main() {
    string cmd;
    CUSTOMER customer;
    int exitFlag = 0;
    while (exitFlag == 0) {
        getline(cin, cmd);
        switch (cmd[0])
        {
        case ‘r‘:
            initShoppingSystem(customer);
            break;
        case ‘o‘:
            selectGoods(customer, cmd);
            break;
        case ‘c‘:
            deleteGoods(customer, cmd);
            break;
        case ‘b‘:
            buyGoods(customer);
            break;
        case ‘l‘:
            lookup(customer, cmd);
            break;
        case ‘e‘:
            exitFlag = 1;
            break;
        default:
            break;
        }
    }
    return 0;
}

加油!!!!

时间: 2024-07-31 07:31:22

购物结算系统的相关文章

RFID射频卡超市购物结算系统

这段时间在做RFID射频卡超市购物结算系统,这个系统的设想来自于大学研究课题,但是我们在淘宝网上购买设备的时候淘宝店主都认为RF射频技术不好应用在超市购物结算系统,原因有几点:第一个是超市有许多商品是水.饮料.肉类,射频会被削弱导致漏扫,第二个是超市每天卖出商品量很大,而RF卡的成本并不低,例如nxp sli卡的价格在1.6元以上 ,而FM1108的价格也在0.3元以上,如果商品采用这种卡,成本太高. 但既然是研究课题,也就是要通过项目实施去解决这些问题,对于各种问题提出解决方案.以下简单记录截

RFID射频卡超市购物结算系统问题记录--写入卡片时,后台php无法操作数据库

后台管理人员要给每件商品贴上RF卡作为唯一标识,所以要先给对应的RFID卡中写入响应的信息,我这里为了便于模拟演示只写入商品编号,价格,名称这几个字段,然后要把已经写入的商品上传后台,由后台写入数据库中的商品表(Goods)中,其中VB访问后台的代码如下: '把写入卡片的内容上传服务器,由服务器保存在数据库中,后期需要修改url等内容 Dim sssa As New WinHttpRequest Dim urlString As String = "http://mzwapitest.appli

超市RFID结算系统项目进度与总结

超市RFID结算系统项目进度与总结 超市RFID结算系统本周末(明天演示),目前进度如下: 一.后台PHP端已经完成了大部分的工作,包括以下: 1.数据库的建立(目前只包括用户表.商品信息表.购物车表.订单表) 2.API接口的搭建与调试 3.业务逻辑的编写 二.IOS与Android端: 1.注册登录界面 2.购物车二维码扫描界面与功能 3.商品订单的接收与支付 三.VB.NET端: 1.超市后台管理端的购物车信息.商品信息写入RFID卡和后台数据库的软件 2.单天线扫描购物车及购物车上商品的

什么是关联挖掘?如何利用顾客的购物习惯提高销售额?

关联规则挖掘就是从大量的数据中挖掘出有价值描述数据项之间相互联系的有关知识.随着收集和存储在数据库中的数据规模越来越大人们对从这些数据中挖掘相应的关联知识越来越有兴趣.例如从大量的商业交易记录中发现有价值的关联知识就可帮助进行商品目录的设计.交叉营销或帮助进行其它有关的商业决策. 挖掘关联知识的一个典型应用实例就是市场购物分析.根据被放到一个购物袋的购物内容记录数据而发现的不同被购买商品之间所存在的关联知识无疑将会帮助商家分析顾客的购买习惯.如图所示. 发现常在一起被购买的商品关联知识将帮助商家

完成打印购物小票并计算积分

import java.util.Scanner; /** * @author 蓝色以太 * 完成打印购物小票并计算积分 */ public class ShoppingReceipt { public static void main(String[] args) { Scanner sc=new Scanner(System.in); final int NUM1=245,NUM2=570,NUM3=320; System.out.println("请输入购买T恤数量:"); in

购物意图分析

最近在读<淘宝技术这十年>一书,发觉里面常有一些很有意思的分享与概念,例如下面的这个,购物意图分析: 通常我们在逛淘宝时会使用到搜索功能,但你可能不知道你输入不同的搜索词,便体现了你的不同购物意图,搜索引擎便会根据你的意图来呈现不同的内容,让推荐更加精准,直达你内心的需求,主要有如下几种意图: 1.浏览型:没有明确想买的东西,边看边买,这样的用户例如会输入"2017年十大香水排行","今年最流行的毛衣","zippo有多少种类".使用

25.购物金额结算

import java.util.Scanner; public class ShoppingList { /** * 购物金额结算 */ public static void main(String[] args) { double[] cashes = new double[5]; double sum = 0.0; //总金额 System.out.println("请输入会员本月的消费记录"); Scanner input = new Scanner(System.in); /

亚马逊如何一步步改变消费者的购物习惯?

上市20周年,亚马逊现在的市值几乎是沃尔玛的2倍. 很难想象一家起初卖书的公司,能颠覆整个零售业,大大地改变了消费者购物及娱乐的方式.那么,最初差点被Jeff Bezos命名为"Cadabra"的网上书店,如何发展成为现在的亚马逊? 亚马逊市值目前是沃尔玛的两倍多 作为上市公司,亚马逊花了18年赶上沃尔玛,而且仅花了2年多的时间让自身的市值,达到实体零售商巨头沃尔玛的2倍多. 亚马逊股票总价值达4650亿美元,相比之下,沃尔玛市值达2290亿美元.而亚马逊的首席执行官Bezos目前身价

AppCan移动开发:仿口袋购物APP源码

近日,AppCan社区又有新的干货内容分享,社区昵称为appcan_y的开发者分享了一个仿口袋购物的App源码. 效果图: 一.UI部分 1.修改index.html标题内容为:"口袋购物" 2.在index.html页面内添加底部tab选项卡代码: <!--content结束--> <div id="footer"style="height:3em"class="footer_color"> <