跳转到正文

《计算机程序设计基础》随堂测验(B 卷):试题与参考解答

更新时间: 2026-10-25 23:01 · 中文版
目录 (13)

Language / 语言:English Version | 中文版

西南财经大学 | Instructor: Luping Zhang | 考试日期: 2026年10月21日 | 试卷类型:【B 卷】(SWUFE-20261021-QUIZ1-B)

答题说明:

  1. 请在上方表格内清晰工整地填写姓名、学号并勾选所在 Session。
  2. 设计程序时,请根据业务场景合理设计变量、流程与函数(发现并设计独立的系统单元),遵循课程命名规范与数据类型标注规范。答案不唯一,按设计的科学性与合理性给分。
  3. 在答题纸上每道小题对应的答题区域作答,保持代码缩进层级清晰,符合Python规范。
  4. 可使用中文或者英语作答。

[Q1] 第一题

题目描述

请阅读以下 Python 代码:

python
def calc_settlement(amount: float) -> float:
    fee = 15.0
    if amount >= 200.0:
        fee = 0.0
    return amount + fee

order_amount = 260.0
total = calc_settlement(order_amount)
print(total)

请结合左侧代码与所学知识,回答以下问题:

  • [Q1.1] 阐述Python执行上述代码时的每个步骤及内存模型(不用解释函数声明的内存模型)。
  • [Q1.2] 阐述代码块的概念、代码块的结构以及核心特征,并举例说明常见的代码块。

[Q1.1] 参考解答

1. Python 内存模型概述

在本课程的模型中,Python 通过两个部分管理内存中的变量与数据:变量表记录程序中定义的变量名(函数运行时会创建独立的局部变量表),数据存储单元存放具体的数据值(如 260.0、15.0 和 0.0)。

变量表中的变量与数据存储单元中的值通过内存地址绑定。执行赋值语句(变量 = 表达式)时,Python 先计算等号右侧表达式的值,将所得结果存入数据存储单元,再将该值与等号左侧的变量绑定。对已有变量重新赋值时,Python 会将新值存入另一个数据存储单元,并将该变量重新绑定到新值。


2. 逐步执行过程

  1. 第 1–5 行(def calc_settlement(amount: float) -> float: ...,函数定义):

    • Python 记录函数 calc_settlement 的定义;缩进的函数体(第 2–5 行)在此阶段不执行。
  2. 第 7 行(order_amount = 260.0,初始赋值):

    • Python 先计算等号右侧的 260.0,将 260.0 存入数据存储单元,再将数值 260.0 与变量 order_amount 绑定。
  3. 第 8 行(total = calc_settlement(order_amount),函数调用与执行):

    • Python 先计算等号右侧的 calc_settlement(order_amount),读取 order_amount 绑定的值(260.0)并调用 calc_settlement:
      • 形参绑定(第 1 行):在函数的局部作用域内,Python 将传入的数值 260.0 与局部形参 amount 绑定。
      • 第 2 行(fee = 15.0,局部赋值):Python 计算 15.0,将 15.0 存入数据存储单元,并将 15.0 与局部变量 fee 绑定。
      • 第 3 行(if amount >= 200.0:,条件判断):Python 读取 amount 绑定的值(260.0),判断 260.0 >= 200.0。由于条件为 True,执行流进入第 4 行缩进的 if 代码块主体。
      • 第 4 行( fee = 0.0,重新赋值):Python 计算 0.0,将 0.0 存入新的数据存储单元,并将新值 0.0 重新绑定给局部变量 fee(替代原先与 15.0 的绑定)。
      • 第 5 行(return amount + fee,返回结果):执行流退出 if 代码块,计算 amount + fee(260.0 + 0.0 = 260.0)。函数向第 8 行调用处返回 260.0 并结束运行(其局部变量 amount 和 fee 随之销毁)。
    • 绑定返回值(第 8 行):回到主流程后,Python 将返回值 260.0 存入数据存储单元,并将 260.0 与变量 total 绑定。
  4. 第 9 行(print(total),屏幕输出):

    • Python 读取 total 绑定的值(260.0),并在终端打印 260.0。
    • 终端输出:
      text
      260.0
      

3. 内存模型示意图

text
+-------------------------------------------------------------------+
|                           内存模型示意图                          |
|                (变量与数值通过内存地址建立绑定)                 |
+-------------------------------+-----------------------------------+
|            变量表             |            数据存储单元           |
+-------------------------------+-----------------------------------+
| [主作用域]                    |                                   |
|   order_amount ---------------------->  [ 260.0 ]  (第 7 行)    |
|                               |                                   |
|   total        ---------------------->  [ 260.0 ]  (第 8 行)    |
+-------------------------------+-----------------------------------+
| [局部作用域: calc_settlement] |                                   |
|   amount       ---------------------->  [ 260.0 ]  (第 1 行)    |
|                               |                                   |
|   fee          -------x-------------->  [  15.0 ]  (第 2 行)    |
|                   |           |                                   |
|                   +------------------>  [   0.0 ]  (第 4 行)    |
|               (重新绑定)    |                                   |
+-------------------------------+-----------------------------------+

[Q1.2] 参考解答

1. 代码块的概念

在 Python 中,代码块是由首部行和缩进主体构成的独立逻辑结构,它将一组语句组织并统辖为一个执行整体。

2. 代码块的结构

代码块具有固定的两段式结构(首部 + 主体):

text
关键字首部语句:                    # 第一部分:首部(以英文冒号 ':' 结尾)
    主体语句_1                     # 第二部分:主体(向右缩进 4 个空格)
    主体语句_2                     # 第二部分:主体(对齐在 4 个空格处)
    ...

后续语句                           # 代码块外部(恢复缩进层级)
  1. 首部行:首部以关键字(如 if、elif、else、def、for 或 while)开头,声明控制条件或定义规则,并以英文冒号(:)结尾。
  2. 主体:主体紧跟首部之后,由一行或多行缩进语句组成(每个缩进层级为 4 个空格)。后续行恢复到首部所在的缩进层级时,代码块即告结束。

3. 核心特征

  1. 结构固定且不可分割:代码块具有固定的语法形态(首部 + 缩进主体),构成一个完整的结构整体:两部分必须成对出现,任何一部分都不能单独存在。
  2. 作为整体统一执行:代码块构成单一的执行单元,其中的语句要么按顺序一并执行,要么作为整体一并跳过。
  3. 以缩进界定边界:Python 依靠缩进组织语句。主体中同一逻辑层级的语句必须保持相同的缩进量;恢复到首部的缩进层级即退出当前代码块。
  4. 支持层级嵌套:由于代码块本身是自包含的单元,可以在外层代码块的主体内部通过加深缩进嵌入完整的内层代码块(首部 + 主体)。

4. 常见代码块示例

  1. 条件分支代码块(if / elif / else):
    python
    if amount >= 200.0:                  # 首部
        fee = 0.0                        # 主体
    
  2. 函数定义代码块(def):
    python
    def calculate_subtotal(unit_price: float, quantity: int) -> float:  # 首部
        return unit_price * quantity                                    # 主体
    
  3. 循环代码块(for / while):
    python
    for vehicle_id in [5, 2, 7]:         # 首部
        print(vehicle_id)                # 主体
    

[Q2] 第二题

题目描述

某集团财务中心系统一个功能模块负责日常拜访、异地培训和项目驻场三类差旅的费用结算。三类差旅采用相同的住宿费核定规则:住宿费的报销上限为出差天数乘以 400 元/天;实际住宿发票金额超过上限时,按上限报销,否则按实际发票金额报销。

每笔差旅单的应报销总额为核准后的住宿费报销金额与交通补贴之和。三类差旅的交通补贴标准见表1,现有三笔待结算差旅单的信息见表2。

表1:交通补贴标准

差旅类型 补贴(元/次)
日常拜访 200
异地培训 300
项目驻场 500

表2:待结算差旅单

差旅类型 出差天数 住宿发票金额(元)
日常拜访 2 700
异地培训 3 1200
项目驻场 4 1800
  • [Q2.1] 针对上述业务场景,合理划分差旅结算系统的功能,并编写相应的 Python 代码。调用所设计的函数,分别计算并输出表2中三笔差旅单各自的应报销总额。
  • [Q2.2] 按照讲义中的“系统”模型,绘制上述程序的系统结构图。

[Q2.1] 参考解答一(两阶段流水线:2 个函数)

1. 功能划分

差旅费用结算可划分为两个函数(系统),第一个函数的输出作为第二个函数的输入:

  1. cal_approved_accommodation(days: int, invoiced_amount: float) -> float:接收出差天数 days 与住宿发票金额 invoiced_amount,计算住宿费报销上限(days * 400.0),并返回实际发票金额与报销上限中的较小值(approved_accommodation)。
  2. cal_total_reimbursement(approved_accommodation: float, trip_type: str) -> float:接收 approved_accommodation(cal_approved_accommodation 的输出)与差旅类型 trip_type,选取对应的交通补贴,并返回应报销总额(approved_accommodation + allowance)。

2. Python 代码

python
# 函数 1:根据出差天数与发票金额计算核准后的住宿费报销金额
def cal_approved_accommodation(days: int, invoiced_amount: float) -> float:
    limit = days * 400.0
    if invoiced_amount > limit:
        approved_accommodation = limit
    else:
        approved_accommodation = invoiced_amount
    return approved_accommodation


# 函数 2:根据核准住宿费与差旅类型计算应报销总额
def cal_total_reimbursement(approved_accommodation: float, trip_type: str) -> float:
    if trip_type == "日常拜访":
        allowance = 200.0
    elif trip_type == "异地培训":
        allowance = 300.0
    elif trip_type == "项目驻场":
        allowance = 500.0
    else:
        print("差旅类型不正确!")
        return -1.0  # 异常标识值
    total_reimbursement = approved_accommodation + allowance
    return total_reimbursement


# 分别计算并输出表 2 中三笔差旅单的应报销总额
acc_visit = cal_approved_accommodation(2, 700.0)
total_visit = cal_total_reimbursement(acc_visit, "日常拜访")
print(f"日常拜访应报销总额: {total_visit:.2f} 元")

acc_training = cal_approved_accommodation(3, 1200.0)
total_training = cal_total_reimbursement(acc_training, "异地培训")
print(f"异地培训应报销总额: {total_training:.2f} 元")

acc_project = cal_approved_accommodation(4, 1800.0)
total_project = cal_total_reimbursement(acc_project, "项目驻场")
print(f"项目驻场应报销总额: {total_project:.2f} 元")

[Q2.2] 参考解答一

每个函数都是一个输入-处理-输出(IPO)系统,系统 1 的输出(approved_accommodation)直接作为输入传递给系统 2:

系统结构图:差旅费用结算(IPO 模型)


[Q2.1] 参考解答二(1 个工具函数 + 3 个业务函数)

1. 功能划分

该计算也可划分为 1 个工具函数与 3 个业务函数:

  1. 工具函数(cal_approved_accommodation):接收 days 和 invoiced_amount,计算住宿费报销上限(days * 400.0),并返回实际发票金额与报销上限中的较小值(approved_accommodation)。
  2. 业务函数(cal_visit_reimbursement、cal_training_reimbursement 和 cal_project_reimbursement):各函数分别接收 days 和 invoiced_amount,调用 cal_approved_accommodation(days, invoiced_amount) 获取核准后的住宿费报销金额,再加上对应差旅类型的交通补贴(分别为 200.0、300.0 和 500.0)。

2. Python 代码

python
# 工具函数:根据出差天数与发票金额计算核准后的住宿费报销金额
def cal_approved_accommodation(days: int, invoiced_amount: float) -> float:
    limit = days * 400.0
    if invoiced_amount > limit:
        approved_accommodation = limit
    else:
        approved_accommodation = invoiced_amount
    return approved_accommodation


# 业务函数 1:计算日常拜访应报销总额
def cal_visit_reimbursement(days: int, invoiced_amount: float) -> float:
    approved_accommodation = cal_approved_accommodation(days, invoiced_amount)
    return approved_accommodation + 200.0


# 业务函数 2:计算异地培训应报销总额
def cal_training_reimbursement(days: int, invoiced_amount: float) -> float:
    approved_accommodation = cal_approved_accommodation(days, invoiced_amount)
    return approved_accommodation + 300.0


# 业务函数 3:计算项目驻场应报销总额
def cal_project_reimbursement(days: int, invoiced_amount: float) -> float:
    approved_accommodation = cal_approved_accommodation(days, invoiced_amount)
    return approved_accommodation + 500.0


# 分别计算并输出表 2 中三笔差旅单的应报销总额
total_visit = cal_visit_reimbursement(2, 700.0)
print(f"日常拜访应报销总额: {total_visit:.2f} 元")

total_training = cal_training_reimbursement(3, 1200.0)
print(f"异地培训应报销总额: {total_training:.2f} 元")

total_project = cal_project_reimbursement(4, 1800.0)
print(f"项目驻场应报销总额: {total_project:.2f} 元")

[Q2.2] 参考解答二

工具系统(cal_approved_accommodation)接收 days 和 invoiced_amount 并输出 approved_accommodation,该结果分别传入三个业务系统(cal_visit_reimbursement、cal_training_reimbursement 和 cal_project_reimbursement)以计算 total_reimbursement:

系统结构图(解答二):1 个工具函数 + 3 个业务函数


[Q3] 第三题

题目描述

某智慧物流园区有多辆无人配送车,每辆车都有一个整数编号。编号为偶数的车辆执行“生鲜冷链专送”任务,每辆车补贴 50 元;编号为奇数的车辆执行“普通百货配送”任务,每辆车补贴 30 元。

每天早班,园区根据当天有调度任务的车辆编号列表,按列表中的顺序依次打印各辆车的车辆编号、调度任务类型和当日运维补贴金额。单辆车的处理功能还需支持独立调用,以便处理临时加派的车辆。

当天的车辆编号列表为 [5, 2, 7]。完成全部车辆的信息打印后,打印当天需发放的补贴总金额,最后打印一次提醒“早班调度完毕”。

  • [Q3.1] 针对上述业务场景,先给出结构化步骤描述,再编写相应的 Python 代码。

[Q3.1] 参考解答

1. 结构化步骤描述

text
# 定义工具函数,处理单个车辆编号并返回其当日运维补贴金额:
#     如果车辆编号为偶数:
#         将调度任务类型设为 "生鲜冷链专送",当日运维补贴金额设为 50 元
#     否则:
#         将调度任务类型设为 "普通百货配送",当日运维补贴金额设为 30 元
#     打印车辆编号、调度任务类型和当日运维补贴金额
#     返回当日运维补贴金额
#
# 设置当天的车辆编号列表为 [5, 2, 7],
# 并将需发放的补贴总金额初始化为 0 元
#
# 按顺序遍历车辆编号列表中的每个车辆编号:
#     调用工具函数,打印该车辆的调度信息并获取其当日运维补贴金额
#     将返回的运维补贴金额累加到补贴总金额中
#
# 打印当天需发放的补贴总金额
# 全部车辆处理完毕后,打印一次 "早班调度完毕"

2. Python 代码

python
# 工具函数:处理单辆车,打印其调度信息并返回运维补贴金额
def process_vehicle(vehicle_id: int) -> int:
    if vehicle_id % 2 == 0:
        task_type = "生鲜冷链专送"
        subsidy = 50
    else:
        task_type = "普通百货配送"
        subsidy = 30
    print(f"车辆编号: {vehicle_id}, 调度任务类型: {task_type}, 当日运维补贴金额: {subsidy} 元")
    return subsidy


# 初始化车辆编号列表与补贴总金额累加变量
vehicle_ids = [5, 2, 7]
total_subsidy = 0

# 按顺序遍历列表中的每个车辆编号
for vehicle_id in vehicle_ids:
    # 调用工具函数打印车辆信息并获取补贴金额
    subsidy = process_vehicle(vehicle_id)

    # 累加需发放的补贴总金额
    total_subsidy = total_subsidy + subsidy

# 循环结束后打印补贴总金额与完成提醒
print(f"当天需发放的补贴总金额: {total_subsidy} 元")
print("早班调度完毕")