测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
B38

案例:计算邮资与买文具

引入

章前总览 两道 GESP 真题:邮资用两个独立单分支;买文具用双分支,且每侧多条输出要用花括号包成语句块。

两道案例:

  • 邮资:基础 8 + 超重向上取整×4 + 加急 5
  • 文具:够则 Yes 与剩余,否则 No 与缺少

1 案例1:计算邮资

≤1000 克基础费 8 元;超出部分每 500 克加 4 元(不足按 500 计);加急(字符 y)再加 5 元。

思路

  • m = 8
  • n > 1000:超重费 = (n-1000+499)/500 * 4(向上取整)。
  • c == 'y':再 m += 5
  • 两个单分支前后独立,甚至调换顺序结果也对。
  • 样例:1200 y → 17。

</> 参考代码

#include <iostream>
using namespace std;

int main() {
    int n;   // 重量(克)
    char c;  // y 加急 / n 不加急
    cin >> n >> c;
    int m = 8;
    if (n > 1000)
        m += (n - 1000 + 499) / 500 * 4;
    if (c == 'y')
        m += 5;
    cout << m << endl;
    return 0;
}

2 案例2:买文具

签字笔 2 元、记事本 5 元、直尺 3 元。输入 x y z q(可多行),判断钱够不够。

输出规则

  • 总价 s = x*2 + y*5 + z*3
  • s <= q:第一行 Yes,第二行剩余 q-s
  • 否则:第一行 No,第二行缺少 s-q

</> 参考代码

#include <iostream>
using namespace std;

int main() {
    int x, y, z, q;
    cin >> x >> y >> z >> q;
    int s = x * 2 + y * 5 + z * 3;
    if (s <= q) {
        cout << "Yes" << endl;
        cout << q - s << endl;
    } else {
        cout << "No" << endl;
        cout << s - q << endl;
    }
    return 0;
}
  • 每侧两条 cout,必须用 {} 组成语句块,否则编译报错。
小结

选单分支还是双分支?

条件不满足时什么都不做 → 单分支 if
条件不满足时要做另一件事 → if…else
里程碑达成:

下一节学习语句块、逗号表达式和条件运算符 ?: 。