测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
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 折扣。