B48
案例:VIP 折扣与每月天数
引入
章前总览 两道题练 if … else if … else:按顾客等级选折扣;按年月输出该月天数(含闰年 2 月)。
两道案例:
- VIP:四级折扣 0.98 / 0.88 / 0.78 / 0.68
- 天数:闰年 2 月 29,平年 28,小月 30,其余 31
1 案例1:VIP 顾客等级(1)
等级 1~4 分别打 98 / 88 / 78 / 68 折。输入 r、m,输出实付金额,保留 1 位小数。
参考代码
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int r, m;
double d, m1;
cin >> r >> m;
if (r == 1) d = 0.98;
else if (r == 2) d = 0.88;
else if (r == 3) d = 0.78;
else d = 0.68; // 4 级
m1 = m * d;
cout << fixed << setprecision(1) << m1 << endl;
return 0;
}
- 样例:1 688 → 674.2;3 6666 → 5199.5。
- 最后一级用 else,不必再写
r==4。
2 案例2:每月天数
输入年、月,输出该月天数。
思路
- 先算闰年标志
leap(与第8章相同)。 - 闰年且 2 月 → 29;平年且 2 月 → 28。
- 4、6、9、11 → 30;其余 → 31。
参考代码
#include <iostream>
using namespace std;
int main() {
int y, m;
cin >> y >> m;
int leap = (y % 4 == 0 and y % 100 != 0) or y % 400 == 0;
if (leap and m == 2) cout << 29 << endl;
else if (!leap and m == 2) cout << 28 << endl;
else if (m == 4 or m == 6 or m == 9 or m == 11) cout << 30 << endl;
else cout << 31 << endl;
return 0;
}
- 样例:2022 1 → 31;2020 2 → 29。
小结
多分支做题顺序:
先列清有几种互斥情形
再按优先级写 if / else if / else
✓
里程碑达成:
下一节学习 switch,并用它重写 VIP 折扣。