{ }codelper
条件语句嵌套条件P0191

会员折扣和配送费

社区面包店要确定每笔网上订单的付款金额。
第一行给出订单数 n,接下来 n 行每行给出顾客类型和订单金额,用一个空格隔开。
顾客类型为会员时是 M,非会员时是 G。
会员的订单金额在 20,000 韩元及以上时减 2,000 韩元,少于 20,000 韩元时按订单金额原样支付。
非会员不论金额多少,都要加上 3,000 韩元配送费。
按输入顺序,每行输出一笔订单的付款金额。
最后一行输出付款金额的总和。

输入
1 ≤ n ≤ 1,000,1,000 ≤ 订单金额 ≤ 1,000,000(整数),顾客类型为 M 或 G
输出
n 行付款金额,最后一行为总和(都只写整数,不加逗号或“韩元”)
样例 1 · stdin
4
M 25000
M 18000
G 18000
M 20000
stdout
23000
18000
21000
18000
80000
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

条件里面还有条件时,else 属于哪个 if 是这道题的陷阱。
在 C、C++、Java、C#、JS、TS 中,省略花括号时 else 会跟最近的内层 if 配对(dangling else)。
所以写成 if (会员) if (金额 >= 20000) 减价; else 配送费; 而只把缩进对齐到外层,结果是不满 20,000 韩元的会员被收配送费,非会员反而不收。
Craykon 也可以不写花括号,否则 同样跟最近的 如果配对。
给每个外层 if 都加上花括号就不会出错。
Python 的缩进就是语法,把 else: 放在与外层 if 相同的列就属于外层。
另一个常见错误是把两个条件合并成 会员 && 金额 >= 20000。
这样 else 不只覆盖非会员,还覆盖不满 20,000 韩元的会员。
正好 20,000 韩元是边界,要用 >= 才能打折。
总和最多 1,003,000,000 韩元,在 32 位整数范围内。

Pythonmain.py · 13 行
n = int(input())total = 0for _ in range(n):    kind, amount = input().split()    pay = int(amount)    if kind == "M":        if pay >= 20000:            pay -= 2000    else:        pay += 3000  # 비회원은 금액과 상관없이 배달비    print(pay)    total += payprint(total)
JavaScriptmain.js · 19 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const out = [];let total = 0;for (let i = 1; i <= n; i++) {  const [kind, amount] = lines[i].trim().split(" ");  let pay = Number(amount);  if (kind === "M") {    if (pay >= 20000) {      pay -= 2000;    }  } else {    pay += 3000; // 비회원은 금액과 상관없이 배달비  }  out.push(pay);  total += pay;}out.push(total);console.log(out.join("\n"));
TypeScriptmain.ts · 20 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const out: number[] = [];let total = 0;for (let i = 1; i <= n; i++) {  const [kind, amount] = lines[i].trim().split(" ");  let pay = Number(amount);  if (kind === "M") {    if (pay >= 20000) {      pay -= 2000;    }  } else {    pay += 3000; // 비회원은 금액과 상관없이 배달비  }  out.push(pay);  total += pay;}out.push(total);console.log(out.join("\n"));
JavaMain.java · 26 行
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(in.readLine().trim());        StringBuilder out = new StringBuilder();        long total = 0;        for (int i = 0; i < n; i++) {            String[] p = in.readLine().trim().split(" ");            int pay = Integer.parseInt(p[1]);            if (p[0].equals("M")) {                if (pay >= 20000) {                    pay -= 2000;                }            } else {                pay += 3000; // 비회원은 금액과 상관없이 배달비            }            out.append(pay).append('\n');            total += pay;        }        out.append(total).append('\n');        System.out.print(out);    }}
C#Main.cs · 32 行
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        var sb = new StringBuilder();        long total = 0;        for (int i = 0; i < n; i++)        {            string[] p = Console.ReadLine().Trim().Split(' ');            int pay = int.Parse(p[1]);            if (p[0] == "M")            {                if (pay >= 20000)                {                    pay -= 2000;                }            }            else            {                pay += 3000; // 비회원은 금액과 상관없이 배달비            }            sb.Append(pay).Append('\n');            total += pay;        }        sb.Append(total).Append('\n');        Console.Write(sb);    }}
C++main.cpp · 23 行
#include <iostream>#include <string> int main() {    int n;    std::cin >> n;    long long total = 0;    for (int i = 0; i < n; i++) {        std::string kind;        int pay;        std::cin >> kind >> pay;        if (kind == "M") {            if (pay >= 20000) {                pay -= 2000;            }        } else {            pay += 3000; // 비회원은 금액과 상관없이 배달비        }        std::cout << pay << '\n';        total += pay;    }    std::cout << total << '\n';}
Cmain.c · 23 行
#include <stdio.h> int main(void) {    int n;    scanf("%d", &n);    long long total = 0;    for (int i = 0; i < n; i++) {        char kind[2];        int pay;        scanf("%1s %d", kind, &pay);        if (kind[0] == 'M') {            if (pay >= 20000) {                pay -= 2000;            }        } else {            pay += 3000; /* 비회원은 금액과 상관없이 배달비 */        }        printf("%d\n", pay);        total += pay;    }    printf("%lld\n", total);    return 0;}
Craykonmain.cray · 21 行
n = 控制台.读行().转数字();total = 0;循环 (i = 0; i < n; i++){    p = 控制台.读行().去空白().分割();    pay = p[1].转数字();    如果 (p[0] == "M")    {        如果 (pay >= 20000)        {            pay -= 2000;        }    }    否则    {        pay += 3000; // 비회원은 금액과 상관없이 배달비    }    控制台.输出(pay);    total += pay;}控制台.输出(total);