P1001 校园卡
L11–L12
中
自编题面向对象继承异常
学校有三种卡:普通卡、学生卡、信用卡。学生卡消费打八折,信用卡可以透支。
输入
第一行一个整数 q,表示操作数。接下来 q 行,每行一个操作:
| 操作 | 含义 |
|---|---|
OPEN CARD owner amount |
开一张普通卡,初始余额 amount |
OPEN STUDENT owner amount |
开一张学生卡 |
OPEN CREDIT owner amount limit |
开一张信用卡,最多透支 limit |
PAY owner amount |
用 owner 的卡消费 amount |
TOPUP owner amount |
给 owner 的卡充值 |
INFO owner |
输出这张卡 |
EQUAL a b |
判断两张卡是否相等 |
COUNT |
输出一共成功开了多少张卡 |
TOTAL |
输出所有卡余额之和 |
owner 是卡主名字,只含小写字母,同一时刻不重名。
规则
- 普通卡:余额不能小于 0,
PAY时amount > balance就失败。 - 学生卡:实际扣费
amount * 4 // 5(向下取整);按扣费后的金额判断够不够。 - 信用卡:余额最低可以到
-limit;balance - amount < -limit就失败。 - 任何失败的操作输出
ERROR,并且不改变任何状态(余额、卡数都不变)。 - 重复
OPEN同一个owner算失败。 PAY/TOPUP成功时输出操作后的余额(整数)。INFO输出:- 普通卡 / 学生卡:
KIND owner balance - 信用卡:
CREDIT owner balance limit EQUAL相等输出YES,否则NO。相等的定义:类型相同、余额相同;信用卡还要求limit相同(不比较owner)。COUNT输出成功开卡总数;TOTAL输出所有余额之和。
实现要求
必须用面向对象写,至少包含:
- 基类
Card:属性owner、balance,方法pay、top_up、__str__、__eq__,类变量kind = "CARD"、count = 0 StudentCard(Card):kind = "STUDENT",重写payCreditCard(Card):kind = "CREDIT",多一个limit,构造时super().__init__(...),重写pay、__str__、__eq__pay余额不足时raise ValueError,主程序捕获后输出ERRORCreditCard.__eq__里要复用super().__eq__(other)
约束
1 ≤ q ≤ 1000- 金额都是正整数,余额绝对值不超过
10^9 OPEN CREDIT一定带limit- 输入保证格式合法,只有业务错误需要输出
ERROR
样例见题目下方。
样例
样例 1
输入
12 OPEN CARD alice 100 OPEN STUDENT bob 50 OPEN CREDIT carol 0 30 PAY alice 30 PAY bob 30 PAY carol 20 INFO carol EQUAL alice bob TOPUP carol 5 COUNT TOTAL INFO dave
输出
OK OK OK 70 26 -20 CREDIT carol -20 30 NO -15 3 81 ERROR
样例 2
输入
9 OPEN CARD a 10 OPEN CREDIT b 0 5 PAY a 11 PAY b 5 PAY b 1 INFO a EQUAL a a COUNT TOTAL
输出
OK OK ERROR -5 ERROR CARD a 10 YES 2 5
Hyacine Studio