1总体说明
考生需要模拟实现一个简单的购物结算系统,实现挑选和删除商品、按照最佳优惠方案进行结算、查询购物车订单信息及购物卡余额和积分的功能。
系统初始化时购物卡中有3000元余额和150积分,可以输入命令来初始化系统。
1.1购物活动细则
只要购物卡余额足够,可以进行多次购买,每次购买活动可以包含如下活动:
1、多次挑选商品,每次挑选形成购物车中的一条商品订单;
2、多次删除商品订单,每次只能删除一条订单;
结算的是当前购物车中所有订单,结算完成即本次购买活动结束,同时清空购物车并更新购物卡余额和积分;
1.2商品优惠细则
购买商品时优惠方案分为单项优惠方案和总价优惠方案,在享受单项优惠的同时如满足一定条件可以再享受总价优惠。
各种商品的单项优惠方案列表:
商品序号
|
商品种类
|
单价(元)
|
单项优惠方案
|
积分积累方式
|
0
|
食品
|
10
|
无优惠
|
结算时消费金额每10元积1分,不足10元不积分
|
9折
|
每满100直减18
|
1
|
服装
|
120
|
无优惠
|
每满200直减40
|
2
|
书籍
|
30
|
无优惠
|
5折
|
单项优惠方案序号:
单项优惠方案序号
|
单项优惠方案
|
0
|
无优惠
|
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”;
输出说明:如果结算成功,输出结果中包含本次购买所需的消费金额和消费积分以及新增的积分。例:
命令
|
输出
|
说明
|
b
|
800
0
80
|
消费金额
消费积分
新增积分
|
2.5查询
命令格式:l查询类别
功能说明:
(1)查询购物卡信息(余额、积分)和购物车中的订单信息;
(2)查询类别:0表示购物卡信息查询,1表示购物车订单查询;如果“查询类别参数错误,输出“E002”。“查询类别”参数错误时,不进行下面的处理。
输出说明:
(1)“查询类别”为0时,输出购物卡余额和积分,例:
命令
|
输出
|
说明
|
l0
|
3000
150
|
余额
积分
|
(2)“查询类别”为1时,输出购物车中的订单数以及每种商品的总数,例:
命令
|
输出
|
说明
|
l1
|
4
2
1
10
|
订单数
食品
服装
书籍
|
2.6结束
命令格式:e系统结束功能说明:一次购物完成,系统结束。
|
知识点: |
字符串 |
题目来源: |
内部整理 |
练习阶段: |
挑战 |
运行时间限制: |
无限制 |
内存限制: |
无限制 |
输入: |
依照说明中的命令码格式输入命令
|
输出: |
输出执行结果
|
样例输入: |
r
o 1-100
e
|
样例输出: |
S001
S002
|
答案提示: |
3附录:
3.1命令汇总
命令
|
命令格式
|
示例
|
说明
|
r
|
r
|
r
|
Reset,初始化购物卡金额和积分
|
o
|
o商品序号-商品数量
|
o0-2
|
Order,挑选一种商品
|
c
|
c商品序号-商品数量
|
c2-1
|
Cancel,删除购物车中的单条商品订单记录
|
b
|
b
|
b
|
Buy,按照系统生成的最佳优惠方案扣除购物卡金额并更新购物卡积分
|
l
|
l查询类别
|
l0
|
List,购物卡信息查询或购物车订单查询
|
e
|
e
|
e
|
系统结束
|
3.2返回码汇总
返回码描述
|
含义
|
说明
|
E001
|
非法命令
|
考试系统使用,考生不用关注
|
E002
|
参数错误
|
“商品序号”参数不合法;
“商品数量”参数不合法;
“查询类别”参数不合法;
|
E003
|
购物车已满
|
购物车中订单数量已经达到5条,不能再挑选商品
|
E004
|
待删除的订单不存在
|
在购物车中没有找到要删除的商品订单
|
E005
|
购物车中没有商品订单
|
删除商品订单或结算时,购物车中没有订单
|
E006
|
购物卡余额或积分不足
|
购物卡余额或积分不足
|
S001
|
初始化成功
|
初始化操作成功,考试系统使用,考生不用关注
|
S002
|
订单已经加入到购物车
|
挑选商品操作成功
|
S003
|
订单已从购物车中删除
|
从购物车中删除商品订单成功
|
3.3基本用例
编号
|
测试步骤
|
预期输出
|
1
|
r
o1-100
o2-50
o0-1
o1-100
o2-50
e
|
S001
S002
S002
S002
S002
S002
|
2
|
r
o0-101
e
|
S001
E002
|
3
|
r
o1-100
o2-50
o0-1
o1-100
o2-50
o2-50
e
|
S001
S002
S002
S002
S002
S002
E003
|
4
|
r
o0-1
o2-10
o1-5
l1
c2-10
c1-5
c0-1
l1
e
|
S001
S002
S002
S002
3
1
5
10
S003
S003
S003
0
0
0
0
|
5
|
r
o2-50
o0-1
c1-200
e
|
S001
S002
S002
E002
|
6
|
r
c0-50
e
|
S001
E005
|
7
|
r
o0-1
c0-2
c0-1
l1
e
|
S001
S002
E004
S003
0
0
0
0
|
8
|
r
o2-1
o1-1
o2-10
o2-10
c2-10
l1
e
|
S001
S002
S002
S002
S002
S003
3
0
1
11
|
9
|
r
o1-7
b
l0
e
|
S001
S002
544
0
54
2456
204
|
10
|
r
o1-5
o0-10
b
l0
e
|
S001
S002
S002
442
120
44
2558
74
|
11
|
r
o1-2
o0-10
o2-3
b
e
|
S001
S002
S002
S002
327
0
32
|
12
|
r
o1-5
o0-2
b
e
|
S001
S002
S002
380
120
38
|
13
|
r
o0-1
c0-1
o2-30
b
e
|
S001
S002
S003
S002
450
0
45
|
14
|
r
o1-3
c1-3
b
l0
b
e
|
S001
S002
S003
E005
3000
150
E005
|
15
|
r
o2-100
o2-100
o2-12
o2-50
b
c2-12
b
l0
e
|
S001
S002
S002
S002
S002
E006
S003
3000
0
300
0
450
|
16
|
r
o0-9
o1-1
b
o0-15
o1-2
b
o0-19
o1-4
b
o0-20
o1-5
b
e
|
S001
S002
S002
201
0
20
S002
S002
332
0
33
S002
S002
451
120
45
S002
S002
515
0
51
|
|
这题目太长 了、
发现这种题目以其长度来吓人,其实一点难度都没有,静下心来慢慢做,没有任何压力,这也能算挑战,感觉还是之前oj上几道题目有意思一点。关键这里的题目都是基于输入输出的,太弱了。
问题 , 积分是打折前还是打折后的价格计算的。待解。删除订单还要写商品数量,那最后是将这个订单都取消,然后仅用数量来判断?判断什么,多个订单对应一种商品要怎么班?好吧,这里匹配要考虑数量也相等。
以最后结算价格作为积分增加的标准。
这里使用整形就会有很有趣的事,对于打折的省钱,如打9折,省的钱不是 costs * 0.1 ,而是 costs - costs * 0.9,因为花费的前为costs * 0.9。。。。还有一个地方对于使用a *= b ? c;时,先做的是b与c的操作,然后用结果在与a本身进行计算。。。
写出代码
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
/*
购物结算系统
*/
int money ;
int points ;
typedef struct order{
int type;
int num;
};
vector<order> orders;
const int price[] = {10,120,30};
string myToString(int num){
char ch[20];
_itoa_s(num,ch,10);
return (string)ch;
}
string OnCommand(string command){
string output = "";
if(command[0] == 'r'){
money = 3000;
points = 150;
orders.clear();
output = "S001";
}else if(command[0] == 'o'){
if(command[2]>='0' &&command[2] <= '2'){
if(orders.size() > 4)
return "E003";
order o;
o.num = atoi(command.substr(4).c_str());
if(o.num > 100 || o.num <= 0)
return "E002";
o.type = atoi(command.substr(2,1).c_str());
orders.push_back(o);
output = "S002";
}else
return "E002";
}else if(command[0] == 'c'){
if(orders.size() == 0 )
return "E005";
order o;
o.num = atoi(command.substr(4).c_str());
o.type = atoi(command.substr(2,1).c_str());
vector<order>::iterator it = orders.begin();
bool deleted = false;
while (it != orders.end())
{
if(it->num == o.num && it->type == o.type){
it = orders.erase(it);
deleted = true;
break;
}
it ++;
}
if(deleted)
output = "S003";
else
return "E004";
}else if(command[0] == 'b'){
if(orders.size()==0)
return "E005";
int cost[] ={0,0,0};
int costs = 0;
for(int i = 0;i < orders.size(); i++){
cost[ orders[i].type ] += price [ orders[i].type ] * orders[i].num;
}
if( cost[0] /100 * 18 >(cost[0] - cost[0]* 9 /10))
cost[0] -= cost[0] /100 * 18 ;
else
cost[0] = cost[0] * 9 /10;
cost[1] -= cost[1] / 200 * 40;
cost[2] /= 2;
costs = cost[0] + cost[1] + cost[2];
int costpoints = 0;
int addpoints = 0;
if(costs >= 500 ){
costpoints = points <120 ?points : 120;
if((costs -costs*4/5) < costpoints){
costs -= costpoints;
}else{
costs = costs * 4/5;
costpoints = 0;
}
}
addpoints = costs / 10;
if(costs > money )
return "E006";
money -= costs;
points += addpoints -costpoints;
output = myToString(costs) +'\n' + myToString(costpoints) +'\n'+myToString(addpoints);
orders.clear();
}else if(command[0] == 'l'){
if(command[2] == '0'){
output = myToString(money) + '\n' + myToString(points);
}else if(command[2] == '1'){
int num[] ={0,0,0};
for(int i = 0 ; i < orders.size() ; i++){
num[ orders[i].type ] += orders[i].num;
}
output = myToString (orders.size()) + '\n' + myToString(num[0]) + '\n'
+ myToString(num[1]) + '\n' + myToString(num[2]);
}else
return "E002";
}
return output;
}
void main(){
string command ,output;
while(true){
getline(cin,command);
output = OnCommand(command);
cout<<output<<endl;
if(command == "e" )
break;
}
// cout<<"fuck";
}
坑。。。
未看清一条:如果输入的“商品序号”或“商品数量”参数不在系统允许的范围内,输出“E002”。参数错误直接返回不再进行其他处理;
好吧,我明白为什么给个无优惠的方案了,这故意在坑人啊,必须要把每种方法都进行计算,而不是自己总结的。这里我要强行总结了,只要无优惠的损失金钱数少于500 * 0.2 即可。这样牺牲一小点钱,换取更大利益。
这个地方是很复杂,当对于 货物0 有三种折扣,1 两种,2两种,这就有12种折扣方式。这里应该用计算后的结果来判断是否价格最低,而不能使用总结法。要改就要改太多,懒得改了,耍下赖。
这道题目,一开始没有仔细考虑这里有个策略的问题,而且,这种策略问题一般用总结法或者比较法,比较即是计算出结果,通过比较各策略得到的结果进行比较来确定最佳策略。但是这里我选择了一条错误的方法。
这个策略是当无折扣其价格高于500,而有折扣其价格低于500,这时应该选择何种策略是其得到最佳的效果。
由于代码是错误的,我就不发了。
分享到:
相关推荐
实现控制台输入结算收银 收银员管理 销售物品管理
我行我素购物管理系统很好用,包含了很多功能,可以下载试试看!
任务九:完成淘宝shopping”购物管理系统购物结算模块和客户管理模块 (1)系统开始时加载系统数据:会员信息、商品信息和管理员信息 (2)在系统运行中,数据在不同界面间进行传递,但始终保持对同一个数组进行操作...
本系统总共分为七大模块:商家管理模块、用户扫码登录模块、商品搜索模块、今日特价模块、商家特惠模块、扫码结算模块、快速通道模块。商家管理模块实现商家的登录功能,对基础数据维护的功能,以及商品管理的功能;...
扩展购物结算功能,实现自动计算会员折扣:已知会员号,根据会员号查找目前的积分,然后计算该会员所享受的会员折扣。
任务九:完成淘宝shopping”购物管理系统购物结算模块和客户管理模块
本项目是一套基于SSM的网上商城购物系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、软件工具、项目说明等,该项目可以直接作为毕设使用。 项目都...
它拥有完善的订单管理、销售统计、结算系统。 详细功能: 一、系统前台功能 1、菜单导航模块 划分合理的导航模块使浏览者快速地查找自己需要的产品信息,提高商品购买率。 2、商城动态及公告模块 此模块是旨在让...
一个用C语言写的超市结算系统,包括对管理员及用户身份的验证及对不同采买的最终结算
完成淘宝shopping”购物管理系统购物结算模块和客户管理模块 1.需要完成的任务 开发“淘宝Shopping购物管理系统”: (1)实现系统数据传递 (2)实现自动计算会员折扣 (3)完善购物结算程序 (4)实现从购物结算...
商品购物结算
C#简单的商场结算系统
java实现的超市购物系统 实现商品金额的结算 统计!
它具有完善的商品管理、订单管理、销售统计、新闻管理、结算系统、税率系统、模板系统、搜索引擎支持,可生成Html静态页面、数据备份恢复.....NetGou商城购物系统还支持多语言,系统内自带英文、简体中文、繁体中文...
基于ARM的购物自助结算系统设计.pdf
在Internet飞速发展的今天,互联网成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个...同时买到自己喜欢的东西后就可以去结算,通过下订单你可以填写自己的相关信息,而完成购物的流程。
使用PHP技术开发的网上购物系统,数据库使用mysql,可实现浏览、购物、结算等功能。带使用说明和数据库sql脚本。
BJXSHOP购物系统是一个国内领先,功能完善、展示信息丰富的电子商店销售平台,现有通用版系统(单用户和多用户)、鲜花销售系统、图书销售系统、数字卡销售系统、成人用品销售系统,服饰销售系统等。 BJXSHOP购物...
它拥有完善的订单管理、销售统计、结算系统。 无忧购物系统ASP专业版详细功能: 一、系统前台功能 1、菜单导航模块 划分合理的导航模块使浏览者快速地查找自己需要的产品信息,提高商品购买率。 2、商城动态及公告...
jsp+Struts+Hibernate实现的标准MVC模式,