🔒 答案已锁定

📖 答案解析 — 丝路新程(丝路文化) — 中等

算法应用主题赛 · Python · 共 14 题(5单选+5多选+4编程)· 满分 100 分

第 1 题 单选题 2 分
在敦煌莫高窟的数字化项目中,研究人员用字符串存储壁画编号,如 mural_id = "DH-MG-025"。执行 mural_id.split("-") 的结果是?
A. "DHMG025"
B. ["DH", "MG", "025"]
C. ["DH-MG-025"]
D. ("DH", "MG", "025")
✅ 正确答案:B
💡 考点解析:字符串方法(split)
第 2 题 单选题 2 分
丝路贸易中,商人用字典统计商品的库存量:stock = {"丝绸": 100, "瓷器": 50, "茶叶": 200}。以下代码的执行结果是什么?
stock["丝绸"] = 120
print(stock.get("香料", 0))
A. 120
B. 0
C. 报错(KeyError)
D. None
✅ 正确答案:B
💡 考点解析:字典的修改与get方法
第 3 题 单选题 2 分
在驼队路线规划中,定义了如下函数。调用 calc_days(500, 40) 的返回值是?
def calc_days(distance, speed):
    if distance % speed == 0:
        return distance // speed
    else:
        return distance // speed + 1
A. 12
B. 13
C. 12.5
D. 13.0
✅ 正确答案:B(500 // 40 = 12,500 % 40 = 20 不为0,所以返回13)
💡 考点解析:函数定义与调用、算术运算
第 4 题 单选题 2 分
驼队在丝路沿途各站点记录行进里程,数据存储在列表中。以下代码的输出是什么?
distances = [50, 30, 80, 20, 60]
distances.sort()
distances.reverse()
print(distances[0])
A. 20
B. 50
C. 60
D. 80
✅ 正确答案:D
💡 考点解析:列表排序sort()与反转reverse()(排序后[20,30,50,60,80],反转后[80,60,50,30,20],索引0为80)
第 5 题 单选题 2 分
在海上丝绸之路的贸易记录中,商人用文件保存交易数据。以下关于Python文件操作的说法,正确的是?
A. 使用 open("trade.txt", "w") 打开文件后,可以读取文件的原有内容
B. 使用 with open("trade.txt", "r") as f: 打开文件,可以自动关闭文件
C. f.read() 方法一次只能读取一行内容
D. 以 "a" 模式打开文件时,会清空文件的原有内容
✅ 正确答案:B
💡 考点解析:文件操作(open模式、with语句)
第 6 题 多选题 4 分
在丝路贸易结算中,需要对不同货币进行换算。关于Python字典的操作,以下说法正确的有?(多选)
A. 字典的键必须是不可变类型,如字符串、数字、元组
B. trade = {"丝绸": 100} 创建了一个包含一个键值对的字典
C. del trade["丝绸"] 可以删除字典中的指定键值对
D. 字典的键可以重复,同一个键可以对应多个值
✅ 正确答案:ABC
💡 考点解析:字典的特性与操作
第 7 题 多选题 4 分
在敦煌壁画的数字化修复中,研究人员用一个二维列表存储像素颜色值。关于以下代码,说法正确的有?(多选)
image = [[255, 128, 64], [200, 100, 50], [150, 75, 30]]
A. image[0] 的结果是 [255, 128, 64]
B. image[1][2] 的结果是 50
C. len(image) 的结果是 3
D. image 是一个3行3列的二维列表
✅ 正确答案:ABCD
💡 考点解析:二维列表的索引与长度
第 8 题 多选题 4 分
驼队商人需要在出发前检查货物的种类和数量。以下关于Python异常处理的说法,正确的有?(多选)
A. try-except 结构用于捕获和处理程序运行时可能出现的异常
B. 当 try 块中的代码发生异常时,程序会跳转到对应的 except 块执行
C. 如果 try 块中没有发生异常,except 块不会被执行
D. 使用 try-except 可以保证程序在任何情况下都不会崩溃
✅ 正确答案:ABC
💡 考点解析:异常处理(try-except)
第 9 题 多选题 4 分
在丝绸之路上,商人用函数来计算不同商品的运费。关于函数的说法,正确的有?(多选)
A. 在函数内部定义的变量是局部变量,函数外部不能直接访问
B. 使用 global 关键字可以在函数内部修改全局变量
C. 函数可以没有参数,也可以没有返回值
D. 函数名可以和变量名相同,不会引起冲突
✅ 正确答案:ABC
💡 考点解析:函数——局部/全局变量、global关键字、参数与返回值
第 10 题 多选题 4 分
海上丝绸之路的航海日志记录了每日的航行数据。关于以下代码的分析,正确的有?(多选)
data = []
for i in range(3):
    line = input().split()
    data.append(line)

假设输入了3行数据,每行包含若干以空格分隔的字符串。以下说法正确的有?(多选)
A. data 是一个嵌套列表(二维列表)
B. 如果第一行输入 "30 25 40",则 data[0] 的值是 ["30", "25", "40"]
C. split() 方法默认以空格为分隔符,返回一个列表
D. 可以通过 int(data[0][1]) 将第一行第二个元素转换为整数
✅ 正确答案:ABCD
💡 考点解析:列表嵌套、字符串split方法、类型转换
第 11 题 编程操作题 15 分

题目描述:
在丝绸之路上,不同地区使用不同的度量单位。商人需要将"石"和"斗"转换为统一的"升"。
换算规则:
- 1石 = 100升
- 1斗 = 10升
请你编写一个函数 to_sheng(shi, dou),接收石数和斗数两个整数参数,返回换算后的总升数。然后在主程序中,从用户输入中读取石数和斗数,调用函数并输出结果。

输入格式:
一行,包含两个整数,分别表示石数和斗数,以空格分隔。

输出格式:
一行,输出"合计:X升"(X为换算后的总升数)

示例输入:

3 5

示例输出:

合计:350升
✅ 参考答案:
📖 参考代码
def to_sheng(shi, dou):
    return shi * 100 + dou * 10
s, d = map(int, input().split())
result = to_sheng(s, d)
print("合计:" + str(result) + "升")
第 12 题 编程操作题 15 分

题目描述:
一支丝路驼队需要在沿途驿站补充给养。请你编写程序,使用字典记录补给品的库存情况。
程序流程:
1. 初始库存为:{"水": 50, "干粮": 30, "草料": 100}(单位:份)
2. 用户输入一个整数 m,表示有 m 次补给操作。
3. 每次操作为一行,格式为 操作类型 补给品名称 数量:
- 操作类型为 in 表示入库(增加库存),例如 in 水 10
- 操作类型为 out 表示出库(减少库存),例如 out 干粮 5
4. 所有操作完成后,按以下格式输出最终库存:
- 第一行输出 ===补给品库存===
- 之后每行输出一种补给品的名称和数量,格式为 名称:数量
- 补给品按名称的字母顺序排列(使用sorted排序)

输入格式:
第一行,一个正整数 m,表示操作次数。
接下来 m 行,每行格式为 操作类型 补给品名称 数量。

输出格式:
按上述要求输出库存清单。

示例输入:

3
in 水 20
out 干粮 10
in 茶叶 15

示例输出:

===补给品库存===
水:70
干粮:20
草料:100
茶叶:15
✅ 参考答案:
📖 参考代码
stock = {"水": 50, "干粮": 30, "草料": 100}
m = int(input())
for _ in range(m):
    op, name, num = input().split()
    num = int(num)
    if op == "in":
        if name in stock:
            stock[name] += num
        else:
            stock[name] = num
    elif op == "out":
        if name in stock:
            stock[name] -= num
print("===补给品库存===")
for name in sorted(stock.keys()):
    print(name + ":" + str(stock[name]))
第 13 题 编程操作题 20 分

题目描述:
丝路商人需要管理一份贸易账本。账本保存在一个文本文件中(假设文件名为 ledger.txt),每行记录一笔交易,格式为:商品名 数量 单价(以空格分隔)。
请你编写程序完成以下功能:
1. 读取账本文件 ledger.txt(文件可能不存在,需要处理异常)。
2. 计算每笔交易的金额(数量 * 单价),并累加得到总金额。
3. 将每一笔交易的详细信息和计算后的金额写入新文件 report.txt,格式为每行 商品名 数量 单价 -> 金额。
4. 在 report.txt 的最后一行写入 总金额:X。
5. 如果 ledger.txt 文件不存在,则输出"账本文件不存在,请检查后重试。"。

输入格式:
无键盘输入。程序读取当前目录下的 ledger.txt 文件。
ledger.txt 示例内容:
丝绸 10 500
瓷器 5 200
茶叶 20 50

输出格式:
生成 report.txt 文件,内容格式如下:
丝绸 10 500 -> 5000
瓷器 5 200 -> 1000
茶叶 20 50 -> 1000
总金额:7000
若文件不存在则在控制台输出"账本文件不存在,请检查后重试。"

示例输入:

示例输出:

✅ 参考答案:
📖 参考代码
try:
    with open("ledger.txt", "r", encoding="utf-8") as f:
        lines = f.readlines()
except FileNotFoundError:
    print("账本文件不存在,请检查后重试。")
else:
    total = 0
    with open("report.txt", "w", encoding="utf-8") as f:
        for line in lines:
            line = line.strip()
            if line == "":
                continue
            parts = line.split()
            name = parts[0]
            qty = int(parts[1])
            price = int(parts[2])
            amount = qty * price
            total += amount
            f.write(name + " " + str(qty) + " " + str(price) + " -> " + str(amount) + "\n")
        f.write("总金额:" + str(total) + "\n")
第 14 题 编程操作题 20 分

题目描述:
丝绸之路上的驼队需要选择一条合适的行进路线。从起点到终点之间有若干个驿站,每个驿站之间的路程(里)不同。请你编写程序,帮驼队商人计算路线总里程,并找到最长的一段路程。
程序要求:
1. 用户首先输入一个整数 n,表示驿站之间的路段数量。
2. 接下来输入 n 个正整数(以空格分隔在一行中),依次表示每个路段的路程(里)。
3. 程序计算并输出:
- 总里程
- 最长路段的里程及其是第几个路段(路段编号从1开始)

输入格式:
第一行:一个正整数 n,表示路段数量。
第二行:n 个正整数,以空格分隔,表示每个路段的路程。

输出格式:
第一行:总里程:X里
第二行:最长路段:第Y段,共Z里
(如果有多个最长路段,输出编号最小的那个)

示例输入:

5
30 50 25 50 40

示例输出:

总里程:195里
最长路段:第2段,共50里
✅ 参考答案:
📖 参考代码
n = int(input())
distances = list(map(int, input().split()))
total = sum(distances)
max_dist = distances[0]
max_index = 1
for i in range(1, n):
    if distances[i] > max_dist:
        max_dist = distances[i]
        max_index = i + 1
print("总里程:" + str(total) + "里")
print("最长路段:第" + str(max_index) + "段,共" + str(max_dist) + "里")