课程章节

实验1.基础语法综合实验

基础语法综合实验

在前面的课程中,我们认识了变量和数据类型,学会了用input()函数获取键盘输入、用int()和float()完成类型转换,也把各种运算符和格式化输出的方法过了一遍。俗话说,光说不练假把式,这一次我们不再引入新知识,专门动手写程序,把已经学过的内容串起来,做出四个能真正跑起来的小工具。四个案例都只使用顺序结构,也就是代码从上到下一行一行执行,不会用到分支结构、循环结构,也不会使用列表和自定义函数,因为这些内容我们还没有正式学到。

四个案例的难度依次递增,分别是:

  1. 校园生活费用计算器
  2. 简易工资计算器
  3. 电影院购票计算器
  4. 购物小票生成器

每个案例都按照“任务描述—思路分析—分步实现—完整代码”的顺序展开,最后再通过一个综合练习检验大家的学习成果。强烈建议你不要只看不写,把每个案例的代码亲自敲一遍、运行一遍,看看程序给出的结果跟你预计的是不是一样。

说明:本实验暂时不处理“输入的内容不合法怎么办”“根据不同条件执行不同代码”这类问题。不是它们不重要,而是解决这些问题需要用到分支结构和循环结构。等学完后面的课程,我们会回过头来升级这里的程序,到时候你会发现,同样的需求可以用更优雅的代码来实现。

建议大家在 PyCharm 项目中新建一个文件夹(例如lab1),把本实验的四个程序文件都放在这个文件夹里,方便统一管理。

实验目标

  1. 能够读懂案例需求,分析出程序需要哪些输入数据、要做什么计算、要输出哪些结果。
  2. 能够使用变量保存字符串、整数、浮点数等不同类型的数据,并给变量取一个见名知意的名字。
  3. 能够使用input()获取键盘输入,并根据数据的实际含义选择int()或float()完成类型转换。
  4. 能够使用算术运算符、赋值运算符和括号,把计算公式正确地翻译成 Python 表达式。
  5. 能够使用 f-string 配合格式说明符(如:.2f),把输出结果处理得清晰整齐。
  6. 能够把一个生活中的计算问题拆解成“输入—处理—输出”三个步骤,独立写出顺序结构的小程序。

案例一:校园生活费用计算器

任务描述

要求:编写一个校园生活费用计算器,让用户输入每日餐费、每日交通费、每月通信费、每月生活用品费用和每月在校天数,程序计算并输出每月的各项费用、每月生活总费用以及每天的平均费用。

先来看看程序运行起来是什么效果:

请输入每日餐费:25
请输入每日交通费:4
请输入每月通信费:80
请输入每月生活用品费用:120
请输入每月在校天数:22

========== 校园生活费用 ==========
每月餐费:550.00 元
每月交通费:88.00 元
每月固定费用:200.00 元
每月生活总费用:838.00 元
每天平均费用:38.09 元
==================================

思路分析

拿到需求先不要急着写代码,把程序需要的数据一条一条列出来,再理清楚数据之间的计算关系。本案例需要输入的数据一共有 5 项:

数据 说明 类型
每日餐费 一天的餐饮费用 float
每日交通费 一天的交通费用 float
每月通信费 每月固定的通信费用 float
每月生活用品费用 每月固定购买用品的费用 float
每月在校天数 一个月在学校的天数 int

接下来把费用之间的关系写成计算公式:

每月餐费 = 每日餐费 × 每月在校天数
每月交通费 = 每日交通费 × 每月在校天数
每月固定费用 = 每月通信费 + 每月生活用品费用
每月生活总费用 = 每月餐费 + 每月交通费 + 每月固定费用
每天平均费用 = 每月生活总费用 ÷ 每月在校天数

这里有两个细节需要注意。其一,餐费、交通费这类金额都可能出现小数,所以要使用float()函数转换,而在校天数是整数,使用int()函数转换就可以了。其二,公式一共有 5 个,我们不要试图把它们塞进一个特别长的表达式里,把每个结果都保存到单独的变量中,计算过程会更清晰,出了问题也更容易检查。

分步实现

第 1 步:输入费用数据

food_per_day = float(input('请输入每日餐费:'))
transport_per_day = float(input('请输入每日交通费:'))
phone_per_month = float(input('请输入每月通信费:'))
supplies_per_month = float(input('请输入每月生活用品费用:'))
school_days = int(input('请输入每月在校天数:'))

说明:input()函数从键盘拿到的内容永远是字符串,例如用户输入25,程序拿到手的是'25',它没法直接参与乘法运算,所以要先使用float()或int()转换成数值,这一点在上一课中已经提醒过大家了。

第 2 步:计算每月餐费和每月交通费

food_per_month = food_per_day * school_days
transport_per_month = transport_per_day * school_days

每日费用乘以在校天数,就得到了每月对应的费用,这里使用的是乘法运算符*。

第 3 步:计算固定费用和每月生活总费用

fixed_cost = phone_per_month + supplies_per_month
total_cost = food_per_month + transport_per_month + fixed_cost

先把通信费和生活用品费用加在一起,得到每月固定费用;再把餐费、交通费和固定费用三项相加,就是每月生活总费用。使用fixed_cost这样的中间变量,可以把一个复杂的公式拆成几个简单的步骤,这是写程序时非常常用的手段。

第 4 步:计算每天平均费用

average_per_day = total_cost / school_days

每月生活总费用除以在校天数,就是每天的平均费用。注意这里用的是除法运算符/,得到的结果一定是一个浮点数,哪怕刚好除尽也是如此。

完整代码

新建文件campus_cost_calculator.py(还记得吗?文件名用小写字母和下划线,做到见名知意),输入下面的完整代码并运行:

"""
校园生活费用计算器
练习:输入、类型转换、变量和算术运算
"""
food_per_day = float(input('请输入每日餐费:'))
transport_per_day = float(input('请输入每日交通费:'))
phone_per_month = float(input('请输入每月通信费:'))
supplies_per_month = float(input('请输入每月生活用品费用:'))
school_days = int(input('请输入每月在校天数:'))

food_per_month = food_per_day * school_days
transport_per_month = transport_per_day * school_days
fixed_cost = phone_per_month + supplies_per_month
total_cost = food_per_month + transport_per_month + fixed_cost
average_per_day = total_cost / school_days

print()  # 输出一个空行,让输入和结果隔开
print('========== 校园生活费用 ==========')
print(f'每月餐费:{food_per_month:.2f} 元')
print(f'每月交通费:{transport_per_month:.2f} 元')
print(f'每月固定费用:{fixed_cost:.2f} 元')
print(f'每月生活总费用:{total_cost:.2f} 元')
print(f'每天平均费用:{average_per_day:.2f} 元')
print('==================================')

运行程序,按照提示输入几组不同的数据,看看输出结果跟前面展示的运行效果是否一致。

课后练习

  1. 程序里没有“每月娱乐费用”这一项,试着增加一个输入项fun_per_month,并把它计入每月生活总费用。
  2. 增加“每月在家天数”的输入,分别计算在校期间的生活费用和整个自然月的估算费用。
  3. 把“每天平均费用”的格式说明符从:.2f改成:.1f,运行程序,观察输出有什么变化。
  4. 思考题:如果你每天的餐费并不固定,当前这个程序还能算准确吗?为什么?

案例二:简易工资计算器

任务描述

要求:编写一个简易工资计算器,让用户输入基本工资、奖金、交通补贴、餐补、社保扣除和其他扣除,程序计算并输出补贴合计、应发工资、扣除总额和实发工资。

运行结果:

请输入基本工资:4000
请输入奖金:800
请输入交通补贴:300
请输入餐补:200
请输入社保扣除:500
请输入其他扣除:120

========== 工资计算结果 ==========
基本工资:4000.00 元
奖金:800.00 元
补贴合计:500.00 元
应发工资:5300.00 元
扣除总额:620.00 元
实发工资:4680.00 元
==================================

思路分析

这个案例的输入数据比较多,一共 6 项,直接列公式容易乱。我们可以先把数据按照“收入”和“扣除”分成两类:

分类 数据 类型
主要收入 基本工资、奖金 float
补贴收入 交通补贴、餐补 float
工资扣除 社保扣除、其他扣除 float

然后再写出计算公式:

补贴合计 = 交通补贴 + 餐补
应发工资 = 基本工资 + 奖金 + 补贴合计
扣除总额 = 社保扣除 + 其他扣除
实发工资 = 应发工资 - 扣除总额

先算补贴合计和扣除总额,再算应发工资和实发工资,每一步只做一件事。工资金额都可能出现小数,所以 6 项输入统一使用float()转换,输出时统一保留两位小数。

分步实现

第 1 步:输入收入和扣除数据

base_salary = float(input('请输入基本工资:'))
bonus = float(input('请输入奖金:'))
transport_allowance = float(input('请输入交通补贴:'))
meal_allowance = float(input('请输入餐补:'))
social_security = float(input('请输入社保扣除:'))
other_deduction = float(input('请输入其他扣除:'))

说明:变量名看起来有点长,但是每一个都能清楚地表达自己的含义,例如base_salary一眼就知道是基本工资。比起a、b、c这样的名字,长一点但见名知意的变量名更值得提倡,这一点在做综合练习时会再次体会到。

第 2 步:计算补贴合计和应发工资

allowance = transport_allowance + meal_allowance
gross_salary = base_salary + bonus + allowance

先算两项补贴的和,再加上基本工资和奖金,就得到了扣除之前的应发工资。gross_salary和net_salary(实发工资)必须区分清楚,一个是“扣之前”,一个是“扣之后”,变量的名字要能准确表达它的含义。

第 3 步:计算扣除总额和实发工资

deduction = social_security + other_deduction
net_salary = gross_salary - deduction

两项扣除相加得到扣除总额,再用应发工资减去扣除总额,就是真正到手的实发工资,这里用的是减法运算符-。

完整代码

新建文件salary_calculator.py,输入下面的完整代码并运行:

"""
简易工资计算器
练习:多个变量、加法、减法和小数格式化
"""
base_salary = float(input('请输入基本工资:'))
bonus = float(input('请输入奖金:'))
transport_allowance = float(input('请输入交通补贴:'))
meal_allowance = float(input('请输入餐补:'))
social_security = float(input('请输入社保扣除:'))
other_deduction = float(input('请输入其他扣除:'))

allowance = transport_allowance + meal_allowance
gross_salary = base_salary + bonus + allowance
deduction = social_security + other_deduction
net_salary = gross_salary - deduction

print()  # 输出一个空行,让输入和结果隔开
print('========== 工资计算结果 ==========')
print(f'基本工资:{base_salary:.2f} 元')
print(f'奖金:{bonus:.2f} 元')
print(f'补贴合计:{allowance:.2f} 元')
print(f'应发工资:{gross_salary:.2f} 元')
print(f'扣除总额:{deduction:.2f} 元')
print(f'实发工资:{net_salary:.2f} 元')
print('==================================')

课后练习

  1. 增加“住房补贴”house_allowance,把它计入补贴合计,看看应发工资和实发工资会怎么变化。
  2. 增加“每月工作小时数”的输入,用实发工资除以工作小时数,计算“每小时工资”并输出。
  3. 试着不用中间变量allowance,把应发工资写成一行表达式,运行后对比两种写法的结果是否一致,再说说你更喜欢哪一种,为什么。
  4. 思考题:实际的工资条上还有“个人所得税”这一项,为什么它不能用一个固定的数或者简单的加减法算出来?

案例三:电影院购票计算器

任务描述

要求:编写一个电影院购票计算器。用户输入成人票的数量、儿童票的数量和成人票的单价,程序按照“儿童票半价”的规则计算总票数和票款合计;如果用户持有会员卡,再按照会员折扣计算最终应付金额,没有会员卡时折扣输入1。

运行结果:

请输入成人票数量:2
请输入儿童票数量:1
请输入成人票单价:45
请输入会员卡折扣(例如 0.95,没有请输入 1):0.95

========== 购票结算 ==========
成人票:2 张,单价 45.00 元
儿童票:1 张,单价 22.50 元
总票数:3 张
票款合计:112.50 元
会员折扣后:106.88 元
===============================

思路分析

先梳理数据和它们之间的关系:

数据 说明 类型
成人票数量 用户输入 int
儿童票数量 用户输入 int
成人票单价 用户输入 float
会员卡折扣 用户输入,没有折扣填1 float

儿童票的价格是成人票的一半,可以先算出儿童票单价,再分别计算两种票的小计:

儿童票单价 = 成人票单价 ÷ 2
成人票小计 = 成人票数量 × 成人票单价
儿童票小计 = 儿童票数量 × 儿童票单价
总票数 = 成人票数量 + 儿童票数量
票款合计 = 成人票小计 + 儿童票小计
会员折扣后金额 = 票款合计 × 会员卡折扣

票数一定是整数,所以用int()转换;票价和折扣都可能是小数,所以用float()转换。两种数据不能混用同一种转换函数,这是本案例最值得体会的地方。

说明:按理说“有没有会员卡”应该走两条不同的计算流程,但我们暂时还不会分支结构。这里用了一个小技巧:让没有会员卡的用户输入1,任何数乘以1都等于它本身,这样同一个公式就能同时处理“有折扣”和“没折扣”两种情况。类似的小技巧在实际开发中很常见,大家先体会一下。

分步实现

第 1 步:输入票数和成人票单价

adult_count = int(input('请输入成人票数量:'))
child_count = int(input('请输入儿童票数量:'))
adult_price = float(input('请输入成人票单价:'))

第 2 步:计算儿童票单价和两种票的小计

child_price = adult_price / 2
adult_total = adult_count * adult_price
child_total = child_count * child_price
ticket_count = adult_count + child_count

儿童票单价是根据成人票单价算出来的,不需要用户再输入一次。能算出来的数据就不要让用户重复输入,这既能减少用户的负担,也能避免两个数据对不上的尴尬。

第 3 步:计算票款合计并应用会员折扣

total_price = adult_total + child_total
member_rate = float(input('请输入会员卡折扣(例如 0.95,没有请输入 1):'))
final_price = total_price * member_rate

完整代码

新建文件movie_ticket.py,输入下面的完整代码并运行:

"""
电影院购票计算器
练习:int 与 float 的配合使用、算术运算符和格式化输出
"""
adult_count = int(input('请输入成人票数量:'))
child_count = int(input('请输入儿童票数量:'))
adult_price = float(input('请输入成人票单价:'))
member_rate = float(input('请输入会员卡折扣(例如 0.95,没有请输入 1):'))

child_price = adult_price / 2
adult_total = adult_count * adult_price
child_total = child_count * child_price
ticket_count = adult_count + child_count
total_price = adult_total + child_total
final_price = total_price * member_rate

print()  # 输出一个空行,让输入和结果隔开
print('========== 购票结算 ==========')
print(f'成人票:{adult_count} 张,单价 {adult_price:.2f} 元')
print(f'儿童票:{child_count} 张,单价 {child_price:.2f} 元')
print(f'总票数:{ticket_count} 张')
print(f'票款合计:{total_price:.2f} 元')
print(f'会员折扣后:{final_price:.2f} 元')
print('===============================')

课后练习

  1. 增加“老人票”,票价是成人票的七折,试着增加相应的输入和计算。
  2. 如果是 3D 影厅,每张票要加收 10 元。暂时不用区分影厅类型,直接增加一个“加收费用”的输入,把它加到票款合计中。
  3. 分别用折扣1和0.8运行程序,观察“会员折扣后”的金额有什么变化,并解释原因。
  4. 思考题:如果影院规定“一次购票满 5 张打八五折”,当前程序为什么不方便实现?这个问题要等学了分支结构才能优雅地解决。

案例四:购物小票生成器

任务描述

要求:编写一个购物小票生成器。用户输入两种商品的名称、单价和数量,以及折扣率和实付金额,程序计算每种商品的小计、商品总价、优惠金额、应付金额和找零金额,并输出一张购物小票。

运行结果:

请输入第 1 种商品名称:Python教材
请输入第 1 种商品单价:45
请输入第 1 种商品数量:2
请输入第 2 种商品名称:笔记本
请输入第 2 种商品单价:8.5
请输入第 2 种商品数量:3
请输入折扣率(例如 0.9):0.9
请输入实付款:120

========== 购物小票 ==========
商品1:Python教材  45.00 元 × 2 = 90.00 元
商品2:笔记本  8.50 元 × 3 = 25.50 元
商品总价:115.50 元
优惠金额:11.55 元
应付金额:103.95 元
实付款:120.00 元
找零金额:16.05 元
==============================

思路分析

本案例比前面三个都要复杂一些,输入的数据更多,计算步骤也更多,但再复杂的程序也还是那个套路,仍然可以拆成“输入—处理—输出”三个阶段。

输入数据

  • 两种商品的名称:字符串,不需要转换,直接用input()即可。
  • 两种商品的单价:浮点数,用float()转换。
  • 两种商品的数量:整数,用int()转换。
  • 折扣率:浮点数,用float()转换。
  • 实付款:浮点数,用float()转换。

处理数据

商品小计 = 商品单价 × 商品数量
商品总价 = 商品1小计 + 商品2小计
应付金额 = 商品总价 × 折扣率
优惠金额 = 商品总价 - 应付金额
找零金额 = 实付款 - 应付金额

折扣率用小数表示,例如九折写成0.9,八五折写成0.85,这样折扣率可以直接参与乘法运算。

输出数据

输出时既要用到用户输入的原始数据,也要用到计算的结果。金额统一保留两位小数,商品数量保持整数形式,这样小票看起来才整齐。

分步实现

第 1 步:输入第一种商品的信息

product_1_name = input('请输入第 1 种商品名称:')
product_1_price = float(input('请输入第 1 种商品单价:'))
product_1_quantity = int(input('请输入第 1 种商品数量:'))

说明:这一步一次性用到了三种数据类型:名称是字符串,直接保存;单价是浮点数,数量是整数,分别用float()和int()转换。大家可以对照代码,把三种类型指认一遍。

第 2 步:输入第二种商品的信息

product_2_name = input('请输入第 2 种商品名称:')
product_2_price = float(input('请输入第 2 种商品单价:'))
product_2_quantity = int(input('请输入第 2 种商品数量:'))

第二种商品和第一种商品的结构完全一样,只是变量名换成了product_2开头。变量名长一点没有关系,能把两种商品区分清楚才是最重要的。

第 3 步:计算小计、总价、应付金额和找零

product_1_total = product_1_price * product_1_quantity
product_2_total = product_2_price * product_2_quantity
total_price = product_1_total + product_2_total
pay_rate = float(input('请输入折扣率(例如 0.9):'))
payable = total_price * pay_rate
discount = total_price - payable
paid = float(input('请输入实付款:'))
change = paid - payable

这段代码反复使用了前面已经算出来的变量,例如total_price既参与了payable的计算,又参与了discount的计算,这正是变量“保存一次、反复使用”的价值。

第 4 步:格式化输出小票

print(f'商品1:{product_1_name}  {product_1_price:.2f} 元 × {product_1_quantity} = {product_1_total:.2f} 元')
print(f'商品总价:{total_price:.2f} 元')
print(f'优惠金额:{discount:.2f} 元')
print(f'应付金额:{payable:.2f} 元')
print(f'实付款:{paid:.2f} 元')
print(f'找零金额:{change:.2f} 元')

说明:一行 f-string 里可以嵌入多个{}占位符,占位符中还可以直接写格式说明符,例如{product_1_price:.2f}表示把这个变量保留两位小数后再嵌入。输出金额时统一使用:.2f,整张小票的数字才对得整齐。

完整代码

新建文件shopping_receipt.py,输入下面的完整代码并运行:

"""
购物小票生成器
练习:输入、类型转换、变量、算术运算和格式化输出
"""
product_1_name = input('请输入第 1 种商品名称:')
product_1_price = float(input('请输入第 1 种商品单价:'))
product_1_quantity = int(input('请输入第 1 种商品数量:'))

product_2_name = input('请输入第 2 种商品名称:')
product_2_price = float(input('请输入第 2 种商品单价:'))
product_2_quantity = int(input('请输入第 2 种商品数量:'))

pay_rate = float(input('请输入折扣率(例如 0.9):'))
paid = float(input('请输入实付款:'))

product_1_total = product_1_price * product_1_quantity
product_2_total = product_2_price * product_2_quantity
total_price = product_1_total + product_2_total
payable = total_price * pay_rate
discount = total_price - payable
change = paid - payable

print()  # 输出一个空行,让输入和结果隔开
print('========== 购物小票 ==========')
print(f'商品1:{product_1_name}  {product_1_price:.2f} 元 × {product_1_quantity} = {product_1_total:.2f} 元')
print(f'商品2:{product_2_name}  {product_2_price:.2f} 元 × {product_2_quantity} = {product_2_total:.2f} 元')
print(f'商品总价:{total_price:.2f} 元')
print(f'优惠金额:{discount:.2f} 元')
print(f'应付金额:{payable:.2f} 元')
print(f'实付款:{paid:.2f} 元')
print(f'找零金额:{change:.2f} 元')
print('==============================')

课后练习

  1. 增加第三种商品,完成相应的输入、小计计算和小票输出。加完以后你会明显感觉到代码里出现了大量相似的语句,请先记住这种“别扭”的感觉,等学了列表和循环结构,这个问题会被轻松解决。
  2. 增加“会员积分”:每消费 1 元积累 1 分,积分按应付金额计算并用int()只保留整数部分。
  3. 增加“包装费”输入,把它加到应付金额中,注意找零金额也要跟着变化。
  4. 把小票的标题和分隔线改成你自己设计的样式。也可以试一试'=' * 30这样的写法,看看会发生什么。
  5. 思考题:如果商品的数量不固定,当前程序为什么不方便?这个问题可以在学完列表和循环结构之后回头解决。

综合练习

完成上面四个案例后,请大家独立完成下面的练习,检验一下自己的学习成果。

编写一个“短途旅行预算计算器”。程序需要输入:交通费用(整个团队的总花费)、住宿天数、每晚住宿费用、每人每日餐费、景点门票费用(团队总花费)、其他费用和旅行人数,输出如下所示的预算结果:

请输入交通费用:800
请输入住宿天数:3
请输入每晚住宿费用:280
请输入每人每日餐费:100
请输入景点门票费用:450
请输入其他费用:200
请输入旅行人数:4

住宿总费用:840.00 元
餐饮总费用:1200.00 元
旅行总费用:3490.00 元
每人平均费用:872.50 元

如果一时没有思路,可以参考下面的顺序先把公式列出来:

住宿总费用 = 住宿天数 × 每晚住宿费用
餐饮总费用 = 住宿天数 × 每人每日餐费 × 旅行人数
旅行总费用 = 交通费用 + 住宿总费用 + 餐饮总费用 + 景点门票费用 + 其他费用
每人平均费用 = 旅行总费用 ÷ 旅行人数

参考程序框架如下(强烈建议大家先自己写,写完之后再对照):

transport_cost = float(input('请输入交通费用:'))
night_count = int(input('请输入住宿天数:'))
hotel_per_night = float(input('请输入每晚住宿费用:'))
food_per_day = float(input('请输入每人每日餐费:'))
ticket_cost = float(input('请输入景点门票费用:'))
other_cost = float(input('请输入其他费用:'))
traveler_count = int(input('请输入旅行人数:'))

hotel_cost = night_count * hotel_per_night
food_cost = night_count * food_per_day * traveler_count
total_cost = transport_cost + hotel_cost + food_cost + ticket_cost + other_cost
average_cost = total_cost / traveler_count

print(f'住宿总费用:{hotel_cost:.2f} 元')
print(f'餐饮总费用:{food_cost:.2f} 元')
print(f'旅行总费用:{total_cost:.2f} 元')
print(f'每人平均费用:{average_cost:.2f} 元')

你也可以仿照前面的案例,给输出加上标题和分隔线,把结果做得更漂亮。

说明:本练习中的人数、天数和费用项目都是固定的,输入的内容也都默认合法。等学完列表、分支结构和循环结构,这个程序还可以继续升级,例如支持人数不固定、检查输入是否合法、根据总费用给出不同的优惠等,大家可以期待一下。

知识点总结

一、分析问题的方法

  • 生活中的计算问题通常可以拆成“输入—处理—输出”三个阶段:先列出程序需要的所有数据,再理清数据之间的计算关系(公式),最后组织输出。
  • 不要试图把所有计算塞进一个特别长的表达式,把中间结果保存到单独的变量中,每一步只做一件事,程序更容易读懂,出了问题也更容易定位。
  • 能根据已有数据算出来的值,就不要让用户重复输入,例如儿童票单价由成人票单价除以 2 得到。

二、变量与数据类型

  • 字符串(str)用于保存姓名、商品名称等文本;整数(int)用于数量、天数等不带小数点的数据;浮点数(float)用于价格、金额等可能出现小数的数据。
  • 选择类型的原则是贴合数据的实际含义:票数、天数用int,金额、单价用float。
  • 变量的值可以被反复读取和参与运算,例如商品总价既用于计算应付金额,又用于计算优惠金额。

三、输入与类型转换

  • input()返回的永远是字符串,参与数值运算前必须用int()或float()转换。
  • 整数输入用int()转换,小数输入用float()转换;要根据数据的含义选择函数,而不是随便选一个。
  • input()的提示信息很重要,写清楚要输入什么、按什么格式输入(例如“折扣例如 0.95,没有请输入 1”),可以大幅减少误解。

四、算术运算符

  • 本实验主要用到了加(+)、减(-)、乘(*)、除(/)四种运算;除法的结果一定是浮点数。
  • 表达式中可以使用括号明确运算顺序,需要时也可以使用**(幂)、//(整除)、%(取余)等在第四课学过的运算符。

五、赋值与中间变量

  • 使用=把数据保存到变量中,先算等号右边,再保存到等号左边的变量里。
  • fixed_cost、allowance、total_price这样的中间变量,可以把复杂公式拆成清晰的多个步骤,是本实验最重要的编程手段之一。

六、字符串与格式化输出

  • 字符串用单引号或双引号包裹;f-string 使用f'文本{变量}'的形式把变量嵌入输出内容。
  • 格式说明符:.2f表示保留两位小数,.1f表示保留一位小数;金额类输出通常统一使用:.2f。
  • print()不写任何参数可以输出一个空行,用来把输入部分和结果部分隔开。

七、命名惯例

  • 变量名和文件名都建议使用小写英文字母加下划线,例如product_1_total、campus_cost_calculator.py。
  • 变量名要做到见名知意,宁可长一点也不要用a、b、c;不要与int、input、print等内置函数重名。

八、复习时的易错点

  • 忘记把input()的结果转换成数值:字符串乘以整数得到的是重复的字符串,而不是数学运算的结果。
  • 用int()转换带小数点的输入(例如3.5),程序会直接报错,可能包含小数的数据应该使用float()。
  • 在代码中使用了中文标点(例如全角的:、'、(),会导致语法错误,写代码时记得切换到英文输入法。
  • 变量名前后拼写不一致,例如前面写product_1_price,后面写成了product_price,程序会报“变量未定义”的错误。
  • 除数为0(例如在校天数输入0)会导致程序报错,等学了分支结构就可以提前判断并给出友好的提示。

九、本阶段的限制与学习重点

  • 本实验的所有程序都是顺序结构,商品数量和输入项目是固定的,因此代码中出现了不少相似的语句,这是刻意为之的“伏笔”。
  • 商品数量不固定、输入校验、根据条件改变计算结果等问题,需要列表、分支结构和循环结构来解决,学完后续课程后欢迎回来升级这些程序。
  • 学习重点:能够把一个生活中的计算问题拆成若干计算步骤,独立完成“输入数据—保存变量—完成运算—格式化输出”的顺序结构程序。