外观
第5周:第二次上机课(完整版)
本次上机课讲评 py 作业 1、py 练习 1、py 作业 2、py 练习 2,共 24 题。
知识点完整讲解
展开六个知识点:输入、float、输出、round、乘方、字符串
一、input():先读一行,再拆分和转换
PPT:第1章第27页;第2章第32、35、46–47、50页。
1. 一次 input() 读取一行,得到字符串
对应题目:py 练习 1 · 01 基础输入输出练习-01。
python
s = input() # 输入 1,得到字符串 "1"
n = int(s) # 转成整数 1
print(n + 1) # 输出 2也可以写成 n = int(input())。这里先调用 input(),再把它的返回值交给 int()。
| 写法 | 得到什么 | 例子 |
|---|---|---|
input() | 一行字符串,去掉行尾换行符 | 输入 12,得到 "12" |
int(s) | 整数 | int("12") 得到 12 |
float(s) | 浮点数 | float("3.4") 得到 3.4 |
str(n) | 数字的字符串表示 | str(12) 得到 "12" |
type(x) | 查看对象的类型 | type("12") 是 str |
input() 不会自动判断数字,也不会自动去掉这一行两端的空格。input("请输入:") 会额外输出提示文字,在 OJ 上使用不带提示的 input()。
python
a = input() # 输入 3,得到 "3"
b = input() # 输入 6,得到 "6"
print(a + b) # 输出 36,字符串的 + 是拼接2. 多行输入:每行分别调用 input()
对应题目:py 作业 1 · 01 两整数求和。
text
3
6python
a = int(input())
b = int(input())
print(a + b) # 9两次 input() 按顺序读取两行。不能用一次 input().split() 去读取第二行;多写一次 input() 也会尝试读取并不存在的下一行。
计算两点之间距离同样逐行读取,顺序是 x1、y1、x2、y2,共四次。
3. 一行多个数:split() 先拆开,转换再逐项进行
对应题目:py 作业 2 · 03 求三个数的和。输入 1 2.3 4.7。
python
line = input() # "1 2.3 4.7"
parts = line.split() # ["1", "2.3", "4.7"]
a, b, c = parts # 分别得到三个字符串
x = float(a)
y = float(b)
z = float(c)
print(x + y + z) # 8.0split() 是字符串的方法,返回一个列表,列表里的每一项仍是字符串。a, b, c = parts 把三个元素分别赋给三个变量,元素个数必须匹配。
python
numbers = float(input().split())float() 能转换一个数字字符串,不能直接把整个列表转换成一个浮点数。
批量转换也可以写成:
python
x, y, z = map(float, input().split())
print(x + y + z)map(float, ...) 对每一项分别调用 float。第一个参数写函数名 float,不是 float()。PPT:第4章第18页。
4. 空白分隔和指定分隔符有什么不同
对应题目:py 作业 2 · 04 计算句子中的单词个数。
python
sentence = input()
words = sentence.split()
print(len(words))输入 teacher assistance is so handsome,拆成 5 个单词,输出 5。
| 表达式 | 结果 |
|---|---|
" a b ".split() | ["a", "b"] |
"a b".split(" ") | ["a", "", "b"] |
"12,34,56".split(",") | ["12", "34", "56"] |
"0:1:40".split(":") | ["0", "1", "40"] |
无参数的 split() 按连续空白拆分,忽略首尾空白,空格和制表符都能作为分隔。指定 "," 或 ":" 时,只按指定字符串拆分,连续分隔符之间可能得到空字符串。
逗号输入是对“求三个数的和”的课堂改写示例,原题使用空白分隔:
python
x, y, z = input().split(",") # 示例输入:1,2.3,4.7
print(float(x) + float(y) + float(z))5. 混合行、混合类型,分别处理
对应题目:py 练习 2 · 01 基础输入输出练习-04。输入第一行 1.0,第二行 2 3。
python
a = float(input())
b, c = input().split()
b = int(b)
c = int(c)
print(f"{(a + b + c) / 3:.2f}") # 2.00对应题目:py 练习 2 · 02 基础输入输出练习-05。输入 8 1.5 apple,三个字段的类型各不相同。
python
a, b, word = input().split()
a = int(a)
b = float(b)
print(a % 7, f"{b * 3:.3f}", word[-1]) # 1 4.500 e字符串 word 保持字符串类型;这一行不能统一用 map(float, ...),因为 apple 不是数字。
二、float:数字的类型与近似表示
PPT:第2章第5–8、13、46–47页。
对应题目:简单的A*B问题、求三个数的和、计算两点之间距离。
1. int、float、str 的计算不同
| 表达式 | 结果 | 原因 |
|---|---|---|
"3" + "4" | "34" | 字符串拼接 |
int("3") + int("4") | 7 | 整数相加 |
float("3") + float("4") | 7.0 | 浮点数相加 |
float("3.4") | 3.4 | 可以读取带小数点的数字 |
int("3.4") | 抛出 ValueError | 字符串不是合法的整数写法 |
int(3.9) | 3 | 浮点数转整数,去掉小数部分 |
int(-3.9) | -3 | 向零截断,不是向下取整 |
“求三个数的和”允许整数或小数输入,全部用 float() 读取。整数形式的字符串 "1" 也能转换成 1.0,结果为整数值时会显示 8.0;不能为了去掉 .0 再转成 int。
2. 浮点数不等于精确的十进制小数
python
print(0.1 + 0.2) # 0.30000000000000004
print(f"{0.1 + 0.2:.2f}") # 0.30许多十进制小数无法用有限位二进制精确表示,float 保存的是近似值。多出的小数尾巴通常来自表示误差,不是加法公式写错。
对应题目:py 作业 2 · 01 小树生长。先按公式计算,最后按题目要求处理结果。不要在每个月的中间计算中反复 round,否则可能累积舍入误差。
python
height = float(input())
h1 = height + 0.1 * 12
h2 = height * 1.1 ** 12
print(round(h1, 1))
print(round(h2, 2))三、print():分隔符、行尾与格式化
PPT:第1章第28页;第2章第36–40页。
1. sep 控制多个输出项之间放什么
print(a, b, c, sep=" ", end="\n") 默认在各项之间放一个空格,末尾换行。sep 和 end 都通过参数名指定。
对应题目:py 作业 2 · 02 秒转时分秒。
python
sec = int(input())
h = sec // 3600
m = sec % 3600 // 60
s = sec % 60
print(h, m, s, sep=":") # 输入 100,输出 0:1:40| 写法(h=0,m=1,s=40) | 输出 |
|---|---|
print(h, m, s) | 0 1 40 |
print(h, m, s, sep=":") | 0:1:40 |
print(h, m, s, sep="") | 0140 |
print(h, ":", m, ":", s) | 0 : 1 : 40 |
最后一种写法仍使用默认空格,会在冒号两侧多输出空格。sep 只放在输出项之间,不加在开头或末尾。
2. end 控制本次 print 之后是否换行
对应题目:py 练习 2 · 07 分离整数的各个数位。
python
s = input() # 输入 123
print(s[0])
print(s[1])
print(s[2])每次默认换行,因此输出三行。也可以 print(s[0], s[1], s[2], sep="\n")。
把输出拆成多次调用、但保持同一行时,可以用 end:
python
print("0", end=":")
print("1", end=":")
print("40")这三次调用合起来输出 0:1:40,最后一次才换行。end="" 表示不追加字符;end=" " 表示追加一个空格;print() 不给输出项时会输出一个换行。
3. f-string:把表达式和格式写在字符串里
对应题目:py 作业 1 · 02 简单的A*B问题。输入两行 1、3.4,输出 3.40。
python
a = float(input())
b = float(input())
result = a * b
print(f"{result:.2f}")f 紧贴引号,{} 内写变量或表达式;冒号后面是格式说明。
| 写法 | 含义 | 示例结果 |
|---|---|---|
f"{3.4}" | 默认显示 | 3.4 |
f"{3.4:.2f}" | 定点显示,小数点后 2 位 | 3.40 |
f"{3.4:.3f}" | 小数点后 3 位 | 3.400 |
f"{7:03d}" | 整数宽度至少为 3,不足补零 | 007 |
f"{3.4:8.2f}" | 总宽度至少为 8,小数点后 2 位,默认右对齐 | 前面 4 个空格,再接 3.40 |
.2f 的 2 是小数位数,8.2f 的 8 是整个字段的最小宽度。f"{x:2f}" 没有小数点,不表示保留两位小数。
花括号里也能直接计算:print(f"{a * b:.2f}")。不带开头的 f,"{a * b:.2f}" 只是一段普通文字。
4. format()、百分号格式与字符串拼接
“简单的A*B问题”中,下面四种写法都能把 3.4 显示成 3.40:
python
print(f"{result:.2f}")
print("{:.2f}".format(result))
print(format(result, ".2f"))
print("%.2f" % result)它们都生成格式化后的字符串。课堂中优先掌握 f-string,遇到参考答案中的 .format() 和 % 时能够读懂即可。
“秒转时分秒”还可以写成:
python
print(f"{h}:{m}:{s}")
print("{}:{}:{}".format(h, m, s))
print(str(h) + ":" + str(m) + ":" + str(s))拼接时各项都要是字符串;h + ":" 会因为整数和字符串不能直接相加而报错。本题输出 0:1:40,没有要求补成 00:01:40。
5. 空格也是输出的一部分
对应题目:py 作业 1 · 05 字符菱形。
python
c = input()
print(" " + c)
print(" " + c * 3)
print(c * 5)
print(" " + c * 3)
print(" " + c)print(" ", c) 会在两个输出项之间再加默认空格,比 print(" " + c) 多出一个空格;也可以用 print(" ", c, sep="")。
四、round() 与 f-string:数值舍入和显示位数
PPT:第2章第19、36–39页。
对应题目:简单的A*B问题、计算三角形的周长和面积、小树生长。
1. round 返回数值,f-string 返回字符串
| 表达式 | 结果 | 类型 |
|---|---|---|
round(3.4, 2) | 3.4 | float |
f"{3.4:.2f}" | "3.40" | str |
round(6.0, 2) | 6.0 | float |
f"{6.0:.2f}" | "6.00" | str |
round(3.456, 2) | 3.46 | float |
f"{3.456:.2f}" | "3.46" | str |
round(x, 2) 得到舍入后的数字,不负责补齐末尾零;f"{x:.2f}" 按固定两位小数生成文本,也不会修改原变量 x。
python
x = 3.4
rounded = round(x, 2)
text = f"{x:.2f}"
print(rounded + 1) # 4.4,可以继续参与数值计算
print(text + "元") # 3.40元,字符串拼接2. 用三角形题同时比较两种输出
原题提示指定周长用 f-string、面积用 round;三边 3、4、5 对应输出 12.00 和 6.0。
python
a = float(input())
b = float(input())
c = float(input())
perimeter = a + b + c
p = perimeter / 2
area = (p * (p - a) * (p - b) * (p - c)) ** 0.5
print(f"{perimeter:.2f}")
print(round(area, 2))乘法题要求固定两位小数,print(round(a * b, 2)) 在结果为 3.4 时不能输出 3.40。不要根据一次样例的外观,把这两种写法当作始终等价。
3. “四舍五入”在 Python 中的边界
python
print(round(2.5)) # 2
print(round(3.5)) # 4
print(round(2.675, 2)) # 2.67精确处在中点时,round 采用取偶数的舍入规则;十进制输入的浮点数还可能并非精确中点。格式化浮点数也受其实际存储值影响,f"{2.675:.2f}" 同样是 "2.67"。不能把所有边界理解为“十进制下一位是 5 就一定进位”。
五、乘方、平方、立方与开根号
PPT:第2章第14–15、18–19、20–21页;第5章第24–25页。
1. 乘方用 **,不是 ^
对应题目:py 练习 2 · 04 计算2的幂。
python
n = int(input())
print(2 ** n) # 输入 3,输出 8| 计算 | Python 写法 | 示例 |
|---|---|---|
| 平方 | x ** 2 或 x * x | 3 ** 2 是 9 |
| 立方 | x ** 3 | 3 ** 3 是 27 |
| n 次方 | x ** n 或 pow(x, n) | pow(2, 3) 是 8 |
| 非负数的平方根 | x ** 0.5 或 math.sqrt(x) | 9 ** 0.5 是 3.0 |
| 正数的立方根 | x ** (1 / 3) | 8 ** (1 / 3) 是 2.0 |
^ 是整数的按位异或,2 ^ 3 得到 1。计算整数幂时,2 ** n 返回整数;math.pow(2, n) 返回浮点数,本题使用前者即可。
2. 根号和括号:整个表达式一起开方
对应题目:py 作业 1 · 04 计算两点之间距离。
python
x1 = float(input())
y1 = float(input())
x2 = float(input())
y2 = float(input())
distance = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5
print(f"{distance:.2f}")输入 0、0、3、5(四行),得到 5.83。括号分别包住坐标差、两项平方的和。
也可以导入数学模块:
python
import math
distance = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)import math 后调用 math.sqrt(...);若使用 from math import sqrt,则调用 sqrt(...)。
python
value = 9
print(value ** 1 / 2) # 4.5,先算 value ** 1,再除以 2
print(value ^ 2) # 11,不是平方value ** (1 / 2) 才是平方根。-3 ** 2 是 -(3 ** 2),结果为 -9;(-3) ** 2 才是 9。
3. 乘方表示重复按比例增长
对应题目:py 作业 2 · 01 小树生长。
python
h1 = height + 0.1 * 12
h2 = height * 1.1 ** 12每月固定长高 0.1 米,12 个月增加 1.2 米;每月长高当月高度的 10%,则每个月乘 1.1,连续 12 个月就是乘 1.1 ** 12。height * (1 + 0.1 * 12) 没有表达逐月变化的增长基数。
大象喝水中的圆桶体积 3.14159 * r ** 2 * h 也用到平方;桶数还需向上取整,完整分析见完整版。
六、字符串:索引、切片、拼接和方法
PPT:第2章第23–35、41–44、50–51页。
1. 字符串保留字符,数字用于计算
对应题目:py 作业 2 · 05 反向输出一个三位数。
python
s = input() # "100"
print(s[::-1]) # 001"001" 是三个字符,int("001") 是整数 1。本题要保留反向后的三个字符,因此不要把反向结果再转成整数。
2. 索引从 0 开始,负下标从末尾开始
对应题目:py 练习 2 · 03 基础输入输出练习-07,以及练习-05中的最后一个字符。
字符串 s = "123abc" | 1 | 2 | 3 | a | b | c |
|---|---|---|---|---|---|---|
| 正下标 | 0 | 1 | 2 | 3 | 4 | 5 |
| 负下标 | -6 | -5 | -4 | -3 | -2 | -1 |
python
print(s[5]) # c,第6个字符
print(s[-1]) # c,最后一个字符
print(len(s)) # 6,字符个数s[6] 会越界。下标不是“第几个”的自然语言编号,要先减 1。
3. 切片左端包含,右端不包含
s[start:stop:step] 按步长取字符,包含起始位置,不包含结束位置。
python
s = "123abc"
print(s[3:6]) # abc,第4到第6个字符
print(s[:2]) # 12,前两个字符
print(s[2:]) # 3abc,从第3个到末尾
print(s[::2]) # 13b,隔一个取一个
print(s[::-1]) # cba321,倒序对应“基础输入输出练习-07”的完整写法:
python
a = input()
b = input()
print(a[5])
print(b[3:6])4. 拆出数字片段,再转换和计算
对应题目:py 作业 2 · 06 字符串中的整数求和。
python
a, b = input().split() # 输入 12B 34D
x = int(a[:2]) # "12" → 12
y = int(b[:2]) # "34" → 34
print(x + y) # 46操作顺序是:读整行 → 拆成两个字符串 → 各取前两个字符 → 转整数 → 相加。直接 int(a) 会尝试转换 "12B",而 a[:2] + b[:2] 得到字符串 "1234"。
5. + 拼接、* 重复,字符串不能原地改字符
对应题目:py 练习 2 · 09 字符串交换,以及字符菱形。
python
a = input() # ABCD
b = input() # 1234
new_a = b[:2] + a[2:] # 12CD
new_b = a[:2] + b[2:] # AB34
print(new_a)
print(new_b)字符串不可变,不能写 a[0] = "X"。交换时先从两个原字符串构造新结果;若先覆盖 a,再用新的 a 构造 b,就丢失了原来的前缀。
"*" * 3 得到 "***"," " * 2 得到两个空格;这就是字符菱形中重复字符与缩进的来源。
6. upper、lower、swapcase 返回新字符串
对应题目:py 练习 2 · 10 字符串大小写转换。
python
s = input() # aBa
result = s[0].upper() + s[1].lower() + s[2].upper()
print(result) # AbA也可以 print(s.swapcase()),把大小写分别反转。
| 表达式(s="aBa") | 结果 |
|---|---|
s.upper() | "ABA" |
s.lower() | "aba" |
s.swapcase() | "AbA" |
python
s = "aBa"
s.upper() # 返回新字符串,但没有保存
print(s) # 仍然是 aBa需要 s = s.upper() 或 print(s.upper())。s.upper 是方法本身,s.upper() 才是调用方法。
7. ord、chr:字符与编码,以及循环字母表
对应题目:py 作业 2 · 07 字母加密。PPT:第2章第29、43–44页。
python
letter = input()
n = int(input())
index = ord(letter) - ord("a")
new_index = (index + n) % 26
print(chr(ord("a") + new_index))ord("a") 是 97,chr(97) 是 "a";先减去 ord("a"),得到 0~25 的字母位置。加密后取 % 26,再转回字符。
输入 z 和 1,位置从 25 变为 (25 + 1) % 26 = 0,输出 a;输入 a 和 27,输出 b。只写 chr(ord(letter) + n) 没有处理字母表末尾的循环。
也可以直接索引字符串:
python
alphabet = "abcdefghijklmnopqrstuvwxyz"
letter = input()
n = int(input())
index = alphabet.index(letter)
print(alphabet[(index + n) % 26])8. 把固定宽度的字符串当作对应表
对应题目:py 练习 2 · 06 数字转星期。PPT:第2章第41–42页。
python
n = int(input())
week = "MonTueWedThuFriSatSun"
start = (n - 1) * 3
print(week[start:start + 3])每个星期缩写占 3 个字符。输入 3,起始位置为 6,取 [6:9] 得到 Wed。这将“编号从 1 开始”转换成“下标从 0 开始”,再利用等宽切片查表。
一、py 作业 1
01 · 两整数求和
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 代码格式与名称 | 第1章,第21页;第2章,第6、38、49页 | 英文标点、成对引号和括号;f 紧贴字符串引号;赋值与比较区分;不要覆盖 print 等内置名称。 |
提交中出现的错误与定位
- 把两行输入当作同一行读取,或多读第三个数,会与输入契约冲突。
- 出现提交了三数求和等其他题代码、求平均值、输出算式或提示文字的情况。
- 出现 Python 2 的 print 写法、缺括号、= 与 == 混用;还有 Python 代码选择 G++ 提交。
错误写法 1:把两行当成一行
python
a, b = map(int, input().split())
print(a + b)修改: 分别用两次 input() 读入。
错误写法 2:读了不存在的第三个数
python
a = int(input())
b = int(input())
c = int(input())
print(a + b + c)修改: 本题只读两个数,删除第三次输入与第三个加数。
错误写法 3:输出了提示和算式
python
a = int(input("请输入数字:"))
b = int(input())
print("和为", a + b)修改: input 不带提示,print 只输出结果。
错误写法 4:Python 2 的 print 写法
python
a = int(input())
b = int(input())
print a + b修改: Python3 使用 print(a + b);同时检查提交语言。
正确方法 · 参考答案(徐志衡)
将两行输入转成整数后相加。
python
a = int(input())
b = int(input())
c = a + b
print(c)同学的不同 AC 方法
逐步转换、保存和
对应知识/PPT: 第1章27–28页;第2章35、46–47页。
最便于追踪类型与中间结果。
python
a = int(input())
b = int(input())
total = a + b
print(total)直接输出表达式
对应知识/PPT: 同上。
计算相同,代码更短;读入顺序仍然是两行。
python
print(int(input()) + int(input()))eval 解析输入
对应知识/PPT: 课程外写法。
本题只需 int;eval 会解释表达式,没必要引入额外语义。
python
a=eval(input())
b=eval(input())
print(a+b)02 · 简单的A*B问题
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
| 代码格式与名称 | 第1章,第21页;第2章,第6、38、49页 | 英文标点、成对引号和括号;f 紧贴字符串引号;赋值与比较区分;不要覆盖 print 等内置名称。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
提交中出现的错误与定位
- 用 int 读取小数,或只把其中一个数转换为数值。
- 直接打印乘积或 round 的结果,末尾零不能补齐;出现把 3.4 写死、打印两遍结果、多加 A*B= 等文字。
- 格式串中 :2f 与 :.2f 混淆,f 与引号分离、中文标点、拼错 float;正数前多出符号占位空格。
错误写法 1:用整数类型读取小数
python
a = int(input())
b = float(input())
print(f"{a * b:.2f}")修改: 两个字段都用 float 读取。
错误写法 2:round 不补齐末尾零
python
a = float(input())
b = float(input())
print(round(a * b, 2))修改: 改成固定两位格式 f"{a*b:.2f}"。
错误写法 3:格式宽度误写成小数精度
python
a = float(input())
b = float(input())
print(f"{a * b:2f}")修改: 2f 是宽度写法,这里应为 .2f。
错误写法 4:把演示值写死或打印两遍
python
value = 3.4
print(value)
print(f"{value:.2f}")修改: 演示代码不能直接作为提交;读入两数相乘,输出一次。
正确方法 · 参考答案(徐志衡)
将输入转成浮点数,相乘后保留两位小数。
python
a = float(input())
b = float(input())
c = a * b
print(f'{c:.2f}')同学的不同 AC 方法
f 字符串
对应知识/PPT: 第2章38–39页。
直接明确两位小数。
python
A=float(input())
B=float(input())
print(f"{A*B:.2f}")str.format
对应知识/PPT: 第2章38–39页。
与 f 字符串的格式说明相同。
python
a = float(input())
b = float(input())
res = a * b
print("{0:.2f}".format(res))先保存格式化字符串
对应知识/PPT: 第2章5、38页。
格式化的结果是 str;不必再转回 float。
python
c = float(input())
d = float(input())
e = f"{c * d:.2f}"
print(e)列表推导式读两行
对应知识/PPT: 第3章15–16页;第6章列表(后续)。
观察到的简写,本题两次 input 更直观。
python
a, b = [float(input()) for _ in [0, 0]]
print(f"{a * b:.2f}")03 · 计算三角形的周长和面积(基础版)
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 开平方与数学库 | 第2章,第15、18页;第5章,第24–25页(后续展开) | 整个非负表达式开平方,可用 math.sqrt(value) 或 value ** 0.5;** 1 / 2 不等于平方根。 |
| 模块导入与 math 调用 | 第1章,第23–26页;第5章,第3–5页(后续展开) | import math 后用 math.sqrt;from math import sqrt 后用 sqrt,名称不能混用。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
| 代码格式与名称 | 第1章,第21页;第2章,第6、38、49页 | 英文标点、成对引号和括号;f 紧贴字符串引号;赋值与比较区分;不要覆盖 print 等内置名称。 |
| 条件、分支与边界 | 第2章,第16页;第3章,第5–8页 | = 是赋值,== 是比较;if 分支不能漏掉合法边界,也不能遗漏输出路径。 |
提交中出现的错误与定位
- 把周长当半周长,或用 // 2 截断半周长;部分代码仅对最后一项开方,或用 ** 1 / 2。
- 省略乘号,把 p(p-a) 当函数;用 []、{} 代替括号参与运算;漏 import、sqrt 拼错、函数没有返回计算值。
- 输出半周长、额外第三行、同一行两个结果;面积强行 .1f 或 .2f,与本题样例和当前 AC 写法不一致。
错误写法 1:半周长被整除截断
python
p = (a + b + c) // 2
area = (p * (p-a) * (p-b) * (p-c)) ** 0.5修改: 改用 / 2,让奇数周长的半周长保留 .5。
错误写法 2:平方根的作用范围错误
python
area = p * (p-a) * (p-b) * (p-c) ** 0.5
area = (p * (p-a) * (p-b) * (p-c)) ** 1 / 2修改: 两行分别代表两种观察到的误写;用整个乘积 ** 0.5。
错误写法 3:省略了乘号或误用括号
python
area = (p(p-a)(p-b)(p-c)) ** 0.5
area = [p * (p-a) * (p-b) * (p-c)] ** 0.5修改: 每项间写 *,算式用圆括号;列表不能直接做平方根。
错误写法 4:函数名和导入没有配套
python
area = math.sqrt(p * (p-a) * (p-b) * (p-c))修改: 使用 math.sqrt 前要 import math;也可直接 ** 0.5。
错误写法 5:面积输出规则照搬固定精度
python
print(f"{perimeter:.2f}")
print(f"{area:.2f}")修改: 按当前题面提示,第二行使用 print(round(area, 2))。
正确方法 · 参考答案(徐志衡)
周长是三边之和;面积用海伦公式计算,并按题面格式输出。
python
a = int(input())
b = int(input())
c = int(input())
x = float(a + b + c)
print(f'{x:.2f}')
p = x / 2
y = (p * (p - a) * (p - b) * (p - c)) ** 0.5
print(round(y, 2))同学的不同 AC 方法
math.sqrt 海伦公式
对应知识/PPT: 第1章26页;第5章25页。
导入模块,公式含义清楚。
python
import math
a = float(input())
b = float(input())
c = float(input())
x = a + b + c
p = x / 2
y = math.sqrt(p * (p - a) * (p - b) * (p - c))
print(f"{x:.2f}")
print(round(y, 2))幂运算开平方
对应知识/PPT: 第2章15、18页。
无须导入;括号必须覆盖整个乘积。
python
a = float(input())
b = float(input())
c = float(input())
x = a + b + c
s = x / 2
y = (s * (s-a) * (s-b) * (s-c)) ** 0.5
print(f"{x:.2f}")
print(round(y, 2))math.pow 开平方
对应知识/PPT: 第2章19–21页;第5章25页。
同一数学模型的函数写法。
python
a=int(input())
b=int(input())
c=int(input())
x=a+b+c
print(f"{x:.2f}")
import math
p=(a+b+c)/2
y=math.pow((p*(p-a)*(p-b)*(p-c)),1/2)
print(round(y,2))先判断三角形再算
对应知识/PPT: 第2章16–17页;第3章5–8页。
题目保证可构成三角形,这个判断不是必需。
python
a=float(input())
b=float(input())
c=float(input())
x=a+b+c
p=x/2
y=(p*(p-a)*(p-b)*(p-c))**0.5
if a+b>c and a+c>b and b+c>a:
print(f"{x:.2f}")
print(round(y,2))
else:
print("输入错误")复数构造求面积
对应知识/PPT: 课程外扩展。
AC 中确实存在;不列为基础课要求,优先海伦公式。
python
from cmath import sqrt
a, b, c = [int(input()) for _ in [1,2,3]]
print(f"{a + b + c:.2f}")
a, b, c = sorted([a, b, c])
print(round(abs((b * ((b*b + c*c - a*a) / (2*b) + 1j*sqrt(c*c - ((b*b+c*c-a*a)/(2*b))**2))).imag) / 2, 2))04 · 计算两点之间距离
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 开平方与数学库 | 第2章,第15、18页;第5章,第24–25页(后续展开) | 整个非负表达式开平方,可用 math.sqrt(value) 或 value ** 0.5;** 1 / 2 不等于平方根。 |
| 模块导入与 math 调用 | 第1章,第23–26页;第5章,第3–5页(后续展开) | import math 后用 math.sqrt;from math import sqrt 后用 sqrt,名称不能混用。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
提交中出现的错误与定位
- 按 x1、x2、y1、y2 读取,坐标配对错误;用 int 读取实数,或把输入当成两行坐标。
- 把两个平方相减,可能开方负数;出现 y1-y1、变量名称错配、漏导入 math。
- 直接输出 round 或默认浮点数,未补齐两位;出现前导空格。
错误写法 1:坐标读取顺序错位
python
x1 = float(input())
x2 = float(input())
y1 = float(input())
y2 = float(input())修改: 第 2、3 行应分别是 y1、x2。
错误写法 2:平方和写成差或变量写错
python
d = ((x1-x2)**2 - (y1-y2)**2) ** 0.5
d = ((x1-x2)**2 + (y1-y1)**2) ** 0.5修改: 分别是两种错误片段;平方项要相加,纵坐标差是 y1-y2。
错误写法 3:小数读取与显示不符
python
x1 = int(input())
print(round(distance, 2))修改: 输入坐标用 float,输出固定两位用格式化;两行来自不同错误类型。
正确方法 · 参考答案(徐志衡)
使用两点距离公式,注意四行输入依次为 x1、y1、x2、y2。
python
x1 = float(input())
y1 = float(input())
x2 = float(input())
y2 = float(input())
d = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5
print(f'{d:.2f}')同学的不同 AC 方法
math.sqrt 距离公式
对应知识/PPT: 第1章26页;第2章15页;第5章25页。
先保存 dx、dy 最适合讲解坐标对应。
python
import math
x1=float(input())
y1=float(input())
x2=float(input())
y2=float(input())
l= math.sqrt((x2-x1)**2+(y2-y1)**2)
print(f"{l:.2f}")幂运算或 math.pow
对应知识/PPT: 第2章15、19页。
平方可用乘法或幂,开平方对象必须是平方和。
python
x1=float(input())
y1=float(input())
x2=float(input())
y2=float(input())
dx=x1-x2
dy=y1-y2
d=(dx**2+dy**2)**0.5
print(f"{d:.2f}")python
import math
a=float(input())
b=float(input())
c=float(input())
e=float(input())
d=math.sqrt(math.pow(a-c,2)+math.pow(b-e,2))
print(f"{d:.2f}")先取绝对值再平方
对应知识/PPT: 第2章19页。
可行,但平方已消去符号,abs 是多余步骤。
python
x1=float(input())
y1=float(input())
x2=float(input())
y2=float(input())
x=abs(x1-x2)
y=abs(y1-y2)
s=x**2+y**2
m=s**0.5
print(f"{m:.2f}")math.dist / 复数模
对应知识/PPT: 课程外扩展。
两类都在 AC 中出现,不要求为本题另学高级表示。
python
import math
x1, y1, x2, y2 = [float(input()) for _ in range(4)]
euclidean_distance = math.dist((x1, y1), (x2, y2))
print(f"{euclidean_distance:.2f}")python
a, b, c, d = [float(input()) for _ in range(4)]
print(f"{abs((a + 1j * b) - (c + 1j * d)):.2f}")05 · 字符菱形
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 字符串索引、拼接与切片 | 第2章,第23、26–27页 | 索引从 0 开始,负下标从末尾算;切片右端不包含;+ 拼接、* 重复,字符串保留字符顺序与前导零。 |
| 代码格式与名称 | 第1章,第21页;第2章,第6、38、49页 | 英文标点、成对引号和括号;f 紧贴字符串引号;赋值与比较区分;不要覆盖 print 等内置名称。 |
| 字符串方法与函数调用 | 第2章,第30、32、34页 | s.upper()、s.lower()、s.split() 需要括号;方法返回新值,必须接住或直接用于表达式。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
提交中出现的错误与定位
- 把字符写死为 *;将空字符串 "" 当作一个空格,或前导空格数计算错误。
- print 多参数的默认分隔符额外添空格;画成空心图案、少行、多空行或末行字符数错误。
- 对字符串使用 ** 而非 *;循环或缩进语法错误。
错误写法 1:空串当成空格
python
c = input()
print("" + c)
print("" + c * 3)修改: 首两行分别需要两个、一个前导空格。
错误写法 2:print 自动加入额外空格
python
c = input()
print(" ", c)
print(" ", c * 3)修改: 用 + 拼好每行再 print,或明确 sep=""。
错误写法 3:把样例字符写死
python
print(" *")
print(" ***")
print("*****")
print(" ***")
print(" *")修改: 读取字符并用于五行图案;仅对样例星号正确。
错误写法 4:重复字符串用了幂
python
c = input()
print(c ** 5)修改: 字符串重复用 c * 5。
正确方法 · 参考答案(陈旭峥)
按每行 1、3、5、3、1 个字符输出菱形,并保留行首空格。
python
# Solution 2
c = input()
print(" " + c + " ")
print(" " + c + c + c + " ")
print(c + c + c + c + c)
print(" " + c + c + c + " ")
print(" " + c + " ")同学的不同 AC 方法
五行拼接
对应知识/PPT: 第2章27、40页。
输入字符参与计算;最适合当前基础课。
python
c = input()
print(' ' + c)
print(' ' + c * 3)
print(c * 5)
print(' ' + c * 3)
print(' ' + c)一次输出多行
对应知识/PPT: 第2章24、27、38页。
要区分字符串中的换行与 print 默认的末尾换行。
python
x=input()
print(f" {x}\n {x}{x}{x}\n{x}{x}{x}{x}{x}\n {x}{x}{x}\n {x}")循环生成对称行
对应知识/PPT: 第2章19页;第3章15–16页。
从规律生成,适合后续扩展大小。
python
c = input()
n = 5
mid = n // 2 + 1
for i in range(1, n + 1):
spaces = abs(mid - i)
chars = n - 2 * spaces
print(" " * spaces + c * chars)center 居中
对应知识/PPT: 第2章31页。
会补两侧空格;本课参考代码只输出必要前导空格。
python
c = input()
for i in range(3):
print((c * (2 * i + 1)).center(5))
for i in range(1, 3):
print((c * (5 - 2 * i)).center(5))模板替换或逐字符输出
对应知识/PPT: 第2章32页;第1章28页。
确有 AC;模板替换仍读取输入,区别于写死星号。
python
print(""" *
***
*****
***
*""".replace("*", input()))python
import sys
char = input().strip()
sys.stdout.write(" " + char + "\n")
sys.stdout.write(" " + char * 3 + "\n")
sys.stdout.write(char * 5 + "\n")
sys.stdout.write(" " + char * 3 + "\n")
sys.stdout.write(" " + char)二、py 练习 1
01 · 基础输入输出练习-01
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 代码格式与名称 | 第1章,第21页;第2章,第6、38、49页 | 英文标点、成对引号和括号;f 紧贴字符串引号;赋值与比较区分;不要覆盖 print 等内置名称。 |
提交中出现的错误与定位
- 本次统计没有非 Accepted 提交,不能编造本题已发生的错误。课堂自查可比较 input()+1 的类型错误与 int(input())+1。
正确方法 · 参考答案(陈旭峥)
把输入转换为整数后加一输出。
python
n = int(input())
print(n + 1)同学的不同 AC 方法
直接输出加一
对应知识/PPT: 第2章15页。
最直接。
python
a= int(input())
print(a+1)保存新值
对应知识/PPT: 第2章5、49页。
便于观察计算结果。
python
a=int(input())
b=a+1
print(b)更新原变量
对应知识/PPT: 第2章49页。
右边先求值,再重新绑定左边的变量。
python
n=int(input())
n=n+1
print(n)02 · 基础输入输出练习-06
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 空白分隔、列表与解包 | 第2章,第32、35、50页 | split() 返回字符串列表;按字段个数解包,再分别转换类型;一行多个字段与多行输入不同。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
提交中出现的错误与定位
- 把两行输入按一行两个字段读取;int(input) 缺调用括号,或未逐字段转换。
- 商直接打印或使用 round;格式说明写到花括号外,或把 f 写进普通字符串;:. 2f 中多空格。
- 用 abs(a-b) 丢失差的符号,或额外输出第六个数。
错误写法 1:格式说明放在花括号外
python
print(f"{a+b} {a-b} {a*b} {a/b}:.2f {a%b}")修改: 商写成 {a/b:.2f},格式说明位于花括号内。
错误写法 2:缺少调用括号
python
a = int(input)
b = int(input)修改: input() 才读取输入;input 本身是函数对象。
错误写法 3:取绝对值改变了差的含义
python
print(f"{a+b} {abs(a-b)} {a*b} {a/b:.2f} {a%b}")修改: 第二项直接 a-b,不能消掉负号。
错误写法 4:错误的输入行数与额外输出
python
a, b = input().split()
a = int(a)
b = int(b)
print(a+b, a-b, a*b, a/b, a%b, f"{a/b:.2f}")修改: 两行分别读取;只输出五项,商仅输出格式化版本。
正确方法 · 参考答案(陈旭峥)
分别计算和、差、积、商、余数;商按要求保留两位小数。
python
a = int(input())
b = int(input())
print("{} {} {} {:.2f} {}".format(a+b,a-b,a*b,a/b,a%b))同学的不同 AC 方法
print 多参数
对应知识/PPT: 第1章28页;第2章38页。
利用默认 sep=" ",仅将商格式化为字符串。
python
a= int(input())
b= int(input())
print(a+b,a-b,a*b,f'{a/b:.2f}',a%b)一条 f 字符串
对应知识/PPT: 第2章38–39页。
空格完全由格式串决定。
python
a=int(input())
b=int(input())
print(f"{a+b} {a-b} {a*b} {a/b:.2f} {a%b}")format 或 % 格式化
对应知识/PPT: 第2章37–39页。
两种均在 AC 中出现;看懂即可,不必每种都背。
python
a = int(input())
b = int(input())
print("{} {} {} {:.2f} {}".format(a+b,a-b,a*b,a/b,a%b))python
a=int(input())
b=int(input())
print('%d %d %d %.2f %d'%(a+b,a-b,a*b,a/b,a%b))三、py 作业 2
01 · 小树生长
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
| 模块导入与 math 调用 | 第1章,第23–26页;第5章,第3–5页(后续展开) | import math 后用 math.sqrt;from math import sqrt 后用 sqrt,名称不能混用。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
提交中出现的错误与定位
- 未把 input 转成数,额外读取月数;把复合增长中的乘法写成加法,或把指数写成 2。
- 只输出一行、两个结果都一位小数;round 直接打印不补零,print(round(h2), 1) 又输出额外的 1。
- 赋值写进 print、名称拼写错误、添加说明文字。
错误写法 1:复合增长用加法或错误指数
python
h2 = height + math.pow(1.1, 12)
h2 = height * pow(1.1, 2)修改: 两种误写分别改成 height * 1.1**12。
错误写法 2:两个结果都只留一位
python
print(f"{h1:.1f}")
print(f"{h2:.1f}")修改: 第二行要求两位,应为 :.2f。
错误写法 3:把精度当作 print 的第二个参数
python
print(round(height + 1.2, 1))
print(round(height * 1.1**12), 1)修改: 这会额外输出 1;改为 print(f"{height*1.1**12:.2f}")。
错误写法 4:额外输出变量标签
python
print("h1:", round(h1, 1))
print("h2:", f"{h2:.2f}")修改: 删除 h1:、h2:,保留两行数值。
正确方法 · 参考答案(徐志衡)
分别计算每月增加 0.1 米和每月增长 10% 时的一年后高度。
python
h = int(input())
h1 = h + 0.1 * 12
# **(幂运算)的运算符级别高于 *(乘法运算),因此不需要对幂运算使用括号
h2 = h * (1 + 0.1) ** 12
print(f'{h1:.1f}')
print(f'{h2:.2f}')同学的不同 AC 方法
直接幂公式
对应知识/PPT: 第2章15、20–21页。
与 PPT 固定增长/比例增长模型对应。
python
a = float(input())
fixed = a+ 12 * 0.1
compound = a * (1.1 ** 12)
print(f"{fixed:.1f}")
print(f"{compound:.2f}")math.pow / 内置 pow
对应知识/PPT: 第1章26页;第2章19–21页。
计算模型相同,调用方式不同。
python
import math
height = int(input())
h1 = height + 0.1 * 12
h2 = height * math.pow(1.1, 12)
print(f"{h1:.1f}")
print(f"{h2:.2f}")python
height=int(input())
h1=height+12*0.1
h2=height*pow(1.1,12)
print(f"{h1:.1f}")
print(f"{h2:.2f}")逐月循环
对应知识/PPT: 第2章49页;第3章15–16页。
便于展示“每个月”的状态变化。
python
a=float(input())
b=a
for i in range(12):
b+=0.1
c=a
for i in range(12):
c*=1.1
print(f"{b:.1f}")
print(f"{c:.2f}")round 后直接打印
对应知识/PPT: 第2章19、21页。
当前存在 AC,不能据此认为 round 总能补齐小数位。
python
import math
height = int(input())
h1 = height + 0.1 * 12
h2 = height * math.pow(1.1, 12)
h1 = round(h1, 1)
h2 = round(h2, 2)
print(h1)
print(h2)02 · 秒转时分秒
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
| 空白分隔、列表与解包 | 第2章,第32、35、50页 | split() 返回字符串列表;按字段个数解包,再分别转换类型;一行多个字段与多行输入不同。 |
提交中出现的错误与定位
- 小时用 / 得到浮点数;分钟用 total//60 而没有再对 60 取余;秒数减错变量。
- print(h, ":", m, ":", s) 带额外空格,或直接用空格输出;多读不存在的输入。
- 格式串参数书写错误或变量未定义。
错误写法 1:小时浮点数或分钟超过 59
python
h = total / 3600
m = total // 60
s = total % 60修改: 小时用 //,分钟还需 %60。
错误写法 2:冒号两侧出现空格
python
print(h, ":", m, ":", s)修改: 用 f 字符串,或 print(h,m,s,sep=":")。
正确方法 · 参考答案(徐志衡)
用整除和取余依次求小时、分钟、秒。
python
a = int(input())
h = a // 3600
m = (a % 3600) // 60
s = a % 60
print(f'{h}:{m}:{s}')同学的不同 AC 方法
先小时再剩余分钟
对应知识/PPT: 第2章15页。
按单位逐层分解。
python
sec = int(input())
h = sec // 3600
m = (sec % 3600) // 60
s = sec % 60
print("{0}:{1}:{2}".format(h, m, s))先总分钟再小时
对应知识/PPT: 第2章15页。
先去掉秒,再拆分分钟。
python
sec=int(input())
m=sec//60
s=sec%60
h=m//60
m=m%60
print('{0}:{1}:{2}'.format(h,m,s))减掉已分配时间
对应知识/PPT: 第2章15页。
余数也可用减法解释。
python
sec=int(input())
h=sec//3600
m=(sec-h*3600)//60
s=sec-h*3600-m*60
print('{0}:{1}:{2}'.format(h,m,s))divmod 配对求商余
对应知识/PPT: 第2章19、50页。
一并返回商和余数。
python
sec=int(input())
h,a=divmod(sec,3600)
m,s=divmod(a,60)
print(f"{h}:{m}:{s}")输出分隔符选择
对应知识/PPT: 第1章28页;第2章38页。
三类均通过,冒号之间不加空格。
python
t = int(input())
h = t // 3600
m = t % 3600 // 60
s = t % 60
print(f"{h}:{m}:{s}")python
sec = int(input())
h = sec // 3600
m = (sec % 3600) // 60
s = sec % 60
print("{0}:{1}:{2}".format(h, m, s))python
sec=int(input())
hour=sec//3600
min=(sec-hour*3600)//60
sec=sec-hour*3600-min*60
print(hour,min,sec,sep=":")03 · 求三个数的和
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 空白分隔、列表与解包 | 第2章,第32、35、50页 | split() 返回字符串列表;按字段个数解包,再分别转换类型;一行多个字段与多行输入不同。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
| 条件、分支与边界 | 第2章,第16页;第3章,第5–8页 | = 是赋值,== 是比较;if 分支不能漏掉合法边界,也不能遗漏输出路径。 |
| 代码格式与名称 | 第1章,第21页;第2章,第6、38、49页 | 英文标点、成对引号和括号;f 紧贴字符串引号;赋值与比较区分;不要覆盖 print 等内置名称。 |
| 批量转换的可选简写 | 第4章,第18页(后续系统讲解) | map(int/float, iterable) 第一个参数是函数,第二个是可迭代对象;本课可先逐项转换,不以 map 作为前置要求。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
提交中出现的错误与定位
- 改成读三行;int 不能读取小数;float(列表)、map 参数或 input().split() 调用次序错误。
- 全部使用 :.1f 或 round(total,1),丢失非整数结果的更多小数;整数转 int 后丢掉 .0,又有人给浮点结果再次拼 .0。
- 分支只处理整数没有 else;没有 print;通过加 1e-9、异常后输出 0 等方式掩盖原来的输入或精度问题。
错误写法 1:一行三个数误读三行
python
a = float(input())
b = float(input())
c = float(input())
print(a+b+c)修改: 先 input().split(),再分别转换三个字段。
错误写法 2:把列表转成单个浮点数
python
values = float(input().split())修改: 转换每个元素,不能直接 float(列表)。
错误写法 3:强制所有结果只保留一位
python
a, b, c = map(float, input().split())
print(f"{a+b+c:.1f}")修改: 非整数不应强行截到一位,直接输出 float 和即可。
错误写法 4:整数结果丢掉 .0 或又拼 .0
python
print(int(total))
print(str(total) + ".0")修改: 两种错误分别丢 .0、多加 .0;保留 float 类型输出。
错误写法 5:分支遗漏非整数输出
python
if total.is_integer():
print(f"{total:.1f}")修改: 若使用分支必须补 else: print(total)。
正确方法 · 参考答案(徐志衡)
把三个数转为浮点数后求和,输出保留浮点形式。
python
# Solution 1
# 使用 map 函数将输入的字符串转换为浮点数 float类型
x, y, z = map(float, input().split())
a = x + y + z
# 强烈推荐使用 is_integer() 方法判断浮点数是否为整数
if a.is_integer():
print(f'{a:.1f}')
else:
print(a)同学的不同 AC 方法
逐项 float 再相加
对应知识/PPT: 第2章35、46–47页。
最适合说明类型转换。
python
a,b,c=input().split()
x=float(a)
y=float(b)
z=float(c)
s=x+y+z
print(s)map 批量转换
对应知识/PPT: 第4章18页(后续)。
与逐项转换是同一模型的简写。
python
a,b,c=map(float,input().split())
print(a+b+c)sum 累加
对应知识/PPT: 第3章15–16页;sum/生成器为补充。
观察到列表与生成器写法;三个数可直接相加。
python
nums=list(map(float,input().split()))
m=sum(nums)
print(m)判断整数值再分支
对应知识/PPT: 第3章5–8页;is_integer 为补充。
整数值用 :.1f,其他直接输出;本题直接 print(float 和) 即可。
python
a, b, c = map(float, input().split())
total = a + b + c
if total.is_integer():
print(f"{total:.1f}")
else:
print(total)方法的适用条件
还发现了已 AC 但逻辑有瑕疵的变体:把数值与 int 类型对象比较,或把非整数统一格式化两位。这些不能作为可靠参考;例如 1.234、2、3 的和是 6.234,强制两位会丢信息。容差与 round(...,10) 也不是题面要求。
04 · 计算句子中的单词个数
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 空白分隔、列表与解包 | 第2章,第32、35、50页 | split() 返回字符串列表;按字段个数解包,再分别转换类型;一行多个字段与多行输入不同。 |
| 长度与元素个数 | 第2章,第29、32、35页;第6章,第8–10页(后续展开) | len(字符串) 是字符数,len(split 后的列表) 是字段数。 |
| 字符串方法与函数调用 | 第2章,第30、32、34页 | s.upper()、s.lower()、s.split() 需要括号;方法返回新值,必须接住或直接用于表达式。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
提交中出现的错误与定位
- 只写 split 没有 (),或在 print() 的返回值上调用 split。
- 先 int(input()) 再 split,类型不符;使用 tuple().split;变量拼错。
- 把样例句子写死,或作为 input 的提示参数,多输出文字。
错误写法 1:方法没有被调用
python
words = input().split
print(len(words))修改: split() 才返回单词列表。
错误写法 2:在 print 返回值上拆分
python
words = print(input()).split()修改: 先读取并拆分,再输出个数。
错误写法 3:硬编码句子或使用提示语
python
sentence = "teacher assistance is so handsome"
sentence = input("teacher assistance is so handsome")修改: 两种写法分别忽略真实输入或多输出提示;使用 input()。
正确方法 · 参考答案(徐志衡)
用 split() 按空白分词,再统计词数。
python
s = input().split()
print(len(s))同学的不同 AC 方法
split 后 len
对应知识/PPT: 第2章29、32、35页。
推荐,能自然处理连续空白。
python
sentence=input()
words=sentence.split()
print(len(words))拆分后循环计数
对应知识/PPT: 第3章15–16页。
与 len 结果一致,但更繁琐。
python
a=input().split()
b=0
for i in a:
b+=1
print(b)统计空格加一
对应知识/PPT: 第2章31页。
有 AC;仅在非空且单词间恰好一个空格、无首尾空格时成立。
python
sentence = input()
k = sentence.count(" ")
print(k+1)按字面空格拆分
对应知识/PPT: 第2章32页。
有 AC;连续空格会产生空字段,与无参数 split 不同。
python
a = input()
b = a.split(' ')
print(len(b))方法的适用条件
例如 one two(两个连续空格):split() 得到 2 个单词,count(" ")+1 和 split(" ") 的长度得到 3。这个用例用于比较适用条件,不声称 OJ 隐藏测试包含它。
05 · 反向输出一个三位数
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 字符串索引、拼接与切片 | 第2章,第23、26–27页 | 索引从 0 开始,负下标从末尾算;切片右端不包含;+ 拼接、* 重复,字符串保留字符顺序与前导零。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
| 字符串方法与函数调用 | 第2章,第30、32、34页 | s.upper()、s.lower()、s.split() 需要括号;方法返回新值,必须接住或直接用于表达式。 |
| reversed 与 join | 第2章第32页 join;第1章第29页内置函数总览,reversed 为补充 | reversed(s) 返回逆序迭代器,再用空串 join 连成字符串;不原地修改 s。 |
提交中出现的错误与定位
- 反转后转 int,100 的 001 变成 1;对 int 对象切片。
- 数位相加而非拼接,下标或十位提取错误;用 / 得到带 .0 的数位。
- 对字面量 "n" 反转、把 100 或 321 写死、输出原顺序;还出现贴错题目代码、题面文字作为代码。
错误写法 1:反转结果再转整数
python
s = input()
print(int(s[::-1]))修改: 保持字符串,输出 s[::-1],否则前导零被丢掉。
错误写法 2:整数对象不能切片
python
n = int(input())
print(n[::-1])修改: 直接读字符串,或先 str(n);不要对 int 切片。
错误写法 3:数位相加不等于反向输出
python
n = int(input())
a = n%10
b = n//10%10
c = n//100
print(a+b+c)修改: 用 f"{a}{b}{c}" 或 print(a,b,c,sep="")。
错误写法 4:反转的是变量名字面量
python
n = input()
print("n"[::-1])修改: 变量 n 不加引号。
正确方法 · 参考答案(徐志衡)
把三位数当作字符串反向输出,保留前导零。
python
# Solution 1
s = input()
# .reverse()是原地修改列表,然而字符串是不可变的,所以字符串没有.reverse()方法
# reversed()函数反转字符串会生成新的变量的迭代器,通过 .join()方法将字符拼接为字符串
t = "".join(reversed(s))
print(t)同学的不同 AC 方法
逆序切片
对应知识/PPT: 第2章26–27页。
保留三位字符,包括前导零。
python
x=input()
print(x[::-1])按下标拼接
对应知识/PPT: 第2章26–27页。
三位规模固定,便于理解下标。
python
num = input()
print(num[2] + num[1] + num[0])算术提取数位
对应知识/PPT: 第2章15、38页。
输出必须保留三位,不把它们相加。
python
num = int(input())
a = num // 100
b = num //10 %10
c = num % 10
print(f"{c}{b}{a}")重建整数再补零
对应知识/PPT: 第2章39页。
宽度 3、填充 0;和小数精度 .2f 不同。
python
n=int(input())
a=n//100
b=n//10%10
c=n%10
n=c*100+b*10+a*1
print(f"{n:03d}")逆序循环输出
对应知识/PPT: 第1章28页;第3章15–16页。
观察到列表/字符串两种版本;切片更简洁。
python
a=[]
a=list(input())
for i in range(len(a)):
print(a[len(a)-i-1],end="")06 · 字符串中的整数求和
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 空白分隔、列表与解包 | 第2章,第32、35、50页 | split() 返回字符串列表;按字段个数解包,再分别转换类型;一行多个字段与多行输入不同。 |
| 字符串索引、拼接与切片 | 第2章,第23、26–27页 | 索引从 0 开始,负下标从末尾算;切片右端不包含;+ 拼接、* 重复,字符串保留字符顺序与前导零。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 代码格式与名称 | 第1章,第21页;第2章,第6、38、49页 | 英文标点、成对引号和括号;f 紧贴字符串引号;赋值与比较区分;不要覆盖 print 等内置名称。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
提交中出现的错误与定位
- 按两行读取;int 作用于列表或带字母的整个串;只取第一位,或切片混入非数字。
- 直接拼接数字字符串;split 缺 () 或拼成 spilt;str 内置类型与自己的字符串变量混淆。
- Res 与 res 大小写不一致、覆盖 print、中文标点;输出中间值,或异常时输出 0/提示信息。
错误写法 1:两行输入与列表转换错误
python
left = input().split()
right = input().split()
print(int(left[:2]) + int(right[:2]))修改: 只读一行解包出两个字符串,切字符串后转 int。
错误写法 2:数字字符串仍然被拼接
python
a, b = input().split()
a = a[:2]
b = b[:2]
print(a+b)修改: 求和前分别 int(a)、int(b)。
错误写法 3:切片只取一位或混入字母
python
num1 = int(a[:1])
num2 = int(b[1:])修改: 两串都取 [:2]。这两行代表两种提交中的错误切片。
错误写法 4:覆盖内置 print
python
left, right = input().split()
num1 = int(left[:2])
print = right[:2]
num2 = int(right[:2])
print(num1 + num2)修改: 不要给 print 赋值;删除错误赋值行。
错误写法 5:方法拼写和变量大小写
python
parts = input().spilt()
Res = num1 + num2
print(res)修改: 两个独立错误:split 拼写,Res/res 保持一致。
正确方法 · 参考答案(徐志衡)
分别提取两个字符串的前两位,转换为整数后求和。
python
a, b = input().split()
# 通过切片取字符串前两位并用 int()函数转换为整数
x = int(a[:2])
y = int(b[:2])
print(x + y)同学的不同 AC 方法
前两位切片
对应知识/PPT: 第2章27、35、46–47页。
最贴题。
python
x1,x2=input().split()
n1=int(x1[:2])
n2=int(x2[:2])
print(n1+n2)去掉最后字母
对应知识/PPT: 第2章26–27页。
题目保证两数字加一字母,因此等价。
python
a = str(input())
b = a.split()
c = int(b[0][:-1])
d = int(b[1][:-1])
print(c + d)拼接或位权计算
对应知识/PPT: 第2章15、26–27页。
对照“两个字符组成的整数”与“十位×10+个位”。
python
a=input().split()
s1=a[0]
s2=a[1]
b=int(s1[0]+s1[1])
c=int(s2[0]+s2[1])
print(b+c)python
a = input().split(' ')
print((int(a[0][0]) + int(a[1][0])) * 10 + int(a[0][1]) + int(a[1][1]))列表推导式 / sum
对应知识/PPT: 第3章15–16页;第6章列表(后续)。
观察到的简写;不作为当前必会语法。
python
a, b = [int(num[:2]) for num in input().split()]
print(a + b)python
print(sum(int(x[:-1]) for x in input().split(' ')))方法的适用条件
有 AC 直接按整行固定下标取字符,它依赖恰好一个分隔空格;split 更清楚。还有多余的 try/except、float 后转 int,在合法输入下通过,但不是新的算法。
07 · 字母加密
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 字符编码与循环位移 | 第2章,第29、43–44页 | ord 得到编码,chr 转回字符;字母先减 ord("a"),位移后对 26 取余,再加回基准。 |
| 字符串索引、拼接与切片 | 第2章,第23、26–27页 | 索引从 0 开始,负下标从末尾算;切片右端不包含;+ 拼接、* 重复,字符串保留字符顺序与前导零。 |
| 代码格式与名称 | 第1章,第21页;第2章,第6、38、49页 | 英文标点、成对引号和括号;f 紧贴字符串引号;赋值与比较区分;不要覆盖 print 等内置名称。 |
| 字符串方法与函数调用 | 第2章,第30、32、34页 | s.upper()、s.lower()、s.split() 需要括号;方法返回新值,必须接住或直接用于表达式。 |
| 条件、分支与边界 | 第2章,第16页;第3章,第5–8页 | = 是赋值,== 是比较;if 分支不能漏掉合法边界,也不能遗漏输出路径。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
| 模块导入与 math 调用 | 第1章,第23–26页;第5章,第3–5页(后续展开) | import math 后用 math.sqrt;from math import sqrt 后用 sqrt,名称不能混用。 |
提交中出现的错误与定位
- 照 PPT 的示例先读密钥再读字符,但 OJ 要求相反;把两行当一行,或密钥未转 int。
- 用 %2、加减 27,或仅对密钥取余、没有对最终字母位置取余;只减一次 26 无法处理大密钥。
- 忘了减去或加回 ord("a"),chr(0..25) 输出控制字符;括号使取余范围错误。
- 用元组作字符串下标、写死密钥、贴错乘法或字符串求和代码,夹入 Markdown 围栏。
错误写法 1:照搬 PPT 的输入顺序
python
key = int(input())
letter = input()修改: OJ 本题先读字母,再读密钥,PPT 示例次序不同。
错误写法 2:仅对密钥取余不处理字母回绕
python
new_code = ord(letter) + key % 26
print(chr(new_code))修改: 先转到 0…25 的字母位置,对位置与密钥之和取余。
错误写法 3:未加回字符编码基准
python
position = (ord(letter)-ord("a")+key)%26
print(chr(position))修改: 使用 chr(position+ord("a"))。
错误写法 4:环大小误写成 2 或 27
python
position = (ord(letter)-ord("a")+key)%2
new_code = ord(letter)+key-27修改: 两个独立误写:字母环有 26 个字母;用正确的完整模表达式。
正确方法 · 参考答案(徐志衡)
利用字母的编码与取模实现环上的移动;先读字母,再读密钥。
python
letter = input().strip()
key = int(input())
shifted = (ord(letter) - ord('a') + key) % 26
print(chr(ord('a') + shifted))同学的不同 AC 方法
ord/chr 编码位移
对应知识/PPT: 第2章29、44页。
推荐,明确 0…25 的位置模型。
python
ltr=input()
n=int(input())
ltrvlu=ord(ltr)-ord('a')
newvlu=(ltrvlu+n)%26
encltr=chr(newvlu+ord('a'))
print(encltr)字母表 find + 索引
对应知识/PPT: 第2章31、43页。
和编码法同一循环模型。
python
alphabet = "abcdefghijklmnopqrstuvwxyz"
cha = input()
key = int(input())
pos_s = alphabet.find(cha)
pos_t = (pos_s + key) % len(alphabet)
new_char = alphabet[pos_t]
print( new_char)先缩小密钥再分支回绕
对应知识/PPT: 第2章15页;第3章5–8页。
可行但分支较多;必须保证归一化正确。
python
alpha1=input()
key=int(input())
if key>=27:
key%=26
n1=ord(alpha1)
if n1+key<=122:
alpha2=chr(n1+key)
else:
alpha2=chr(n1+key-26)
print(alpha2)while 反复减 26
对应知识/PPT: 第3章17页。
有 AC,大密钥需要多次循环;模运算一次完成。
python
a=input()
b=int(input())
c=ord(a)
d=b+c
while d>122:
d-=26
while d<97:
d+=26
print(chr(d))函数封装/库字母表
对应知识/PPT: 第4章函数、第5章导入;具体库为补充。
确有 AC,本题只处理一个字母,不必提前引入整段文本处理。
python
def encrypt_char(char, n):
original_pos = ord(char) - ord('a')
new_pos = (original_pos + n) % 26
return chr(new_pos + ord('a'))
def encrypt_text(text, n):
result = ""
for char in text:
if 'a' <= char <= 'z':
result += encrypt_char(char, n)
else:
result += char
return result
text = input().strip()
n = int(input().strip())
encrypted = encrypt_text(text, n)
print(encrypted)python
import string
alphabet=string.ascii_lowercase
cha=input()
key=int(input())
pos_s=alphabet.find(cha)
pos_t=(pos_s+key)%len(alphabet)
new_char=alphabet[pos_t]
print(new_char)方法的适用条件
AC 中也发现手写字母表缺字/错字,以及用 96 为基准却没有处理余数 0 的写法。后者遇到 y、密钥 1 会得到反引号而非 z;它们只反映当前判题结果,不列为正确方法。
四、py 练习 2
01 · 基础输入输出练习-04
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 空白分隔、列表与解包 | 第2章,第32、35、50页 | split() 返回字符串列表;按字段个数解包,再分别转换类型;一行多个字段与多行输入不同。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
| 批量转换的可选简写 | 第4章,第18页(后续系统讲解) | map(int/float, iterable) 第一个参数是函数,第二个是可迭代对象;本课可先逐项转换,不以 map 作为前置要求。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
| 模块导入与 math 调用 | 第1章,第23–26页;第5章,第3–5页(后续展开) | import math 后用 math.sqrt;from math import sqrt 后用 sqrt,名称不能混用。 |
提交中出现的错误与定位
- int(input().split()) 把列表直接转整数;map(int(input().split())) 缺少函数/可迭代对象;split 拼错。
- 平均值用默认显示、round 或 :.1f,未固定两位;输入行结构读取错误。
错误写法 1:整个列表不能直接 int
python
b, c = int(input().split())修改: 逐项 int,或 map(int, input().split())。
错误写法 2:map 的第一个参数写成调用结果
python
b, c = map(int(input().split()))修改: 正确写法是 map(int, input().split())。
错误写法 3:平均值精度不符
python
print(f"{(a+b+c)/3:.1f}")修改: 使用 :.2f。
正确方法 · 参考答案(尹思源)
读入浮点数与两个整数,计算三个数的平均值并保留两位小数。
python
a = float(input())
b, c = map(int, input().split())
avg = (a + b + c) / 3
print(f"{avg:.2f}")同学的不同 AC 方法
逐项转换
对应知识/PPT: 第2章35、46–47页。
对应混合输入结构。
python
a = float(input())
b, c = input().split()
print(f"{(a + int(b) + int(c)) / 3:.2f}")map 或列表推导式
对应知识/PPT: 第4章18页;第3章15–16页(后续)。
批量处理第二行;不是跨行读取。
python
a= float(input())
b,c= map(int,input().split())
y=(a+b+c)/3
print(f'{y:.2f}')python
a = float(input())
b, c = [float(x) for x in input().split(' ')]
print(f"{(a + b + c) / 3:.2f}")都用 float
对应知识/PPT: 第2章46–47页。
这些输入能转换;按题意用 int 更清晰。
python
num1 = float(input())
num2 , num3 = map(float , input().split())
average = (num1 + num2 + num3) / 3
print(f"{average:.2f}")statistics.mean
对应知识/PPT: 库函数的课程外补充。
有 AC,但三个数的平均值用加法和除法足够。
python
from statistics import mean
c = float(input())
a, b = input().split()
print(f"{mean([c, int(a), int(b)]):.2f}")输出 f / format
对应知识/PPT: 第2章38–39页。
两种均在 AC 中出现。
python
a = float(input())
b, c = map(int, input().split())
avg = (a + b + c) / 3
print("{0:.2f}".format(avg))02 · 基础输入输出练习-05
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 空白分隔、列表与解包 | 第2章,第32、35、50页 | split() 返回字符串列表;按字段个数解包,再分别转换类型;一行多个字段与多行输入不同。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 字符串索引、拼接与切片 | 第2章,第23、26–27页 | 索引从 0 开始,负下标从末尾算;切片右端不包含;+ 拼接、* 重复,字符串保留字符顺序与前导零。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
提交中出现的错误与定位
- s[:-1] 取除最后一位外的整段,或直接输出整个字符串。
- 对最后字符再 split 得到列表,输出带方括号;相邻 f 字符串相接没有分隔空格。
- 变量未定义。
错误写法 1:切片取了除最后一位外的整串
python
print(a%7, f"{b*3:.3f}", s[:-1])修改: 最后一位用 s[-1]。
错误写法 2:输出列表而非一个字符
python
print(a%7, f"{b*3:.3f}", s[-1].split())修改: 删除 split();s[-1] 已是字符字符串。
错误写法 3:相邻格式串没有空格
python
print(f"{a%7}" f"{b*3:.3f}" f"{s[-1]}")修改: 用单个格式串加空格,或 print 的三个参数。
正确方法 · 参考答案(尹思源)
按照题目指定的格式处理整数、浮点数和字符串。
python
a, b, s = input().split()
print(f"{int(a)%7} {float(b)*3:.3f} {s[-1]}")同学的不同 AC 方法
逐项变量 + 多参数输出
对应知识/PPT: 第1章28页;第2章15、26、38页。
推荐,三种类型分别处理。
python
a, b, s = input().split()
print(int(a) % 7, f"{float(b) * 3:.3f}", s[-1])列表索引 + 一条格式串
对应知识/PPT: 第2章35、38页。
与解包区别仅在取字段方式。
python
a = input().split()
print(int(a[0]) % 7, f'{float(a[1]) * 3:.3f}', a[2][-1])python
data = input().split()
num_int = int(data[0])
num_float = float(data[1])
s = data[2]
rem = num_int % 7
mul = num_float * 3
last_char = s[-1]
print(f"{rem} {mul:.3f} {last_char}")商反推余数
对应知识/PPT: 第2章15页。
与 a%7 等价,可以手算证明。
python
mix=input().split()
a=int(mix[0])
b=float(mix[1])
c=str(mix[2])
m=a-(a//7)*7
n=str(c[-1])
print(m,f"{b*3:.3f}",n)zip 配对转换函数
对应知识/PPT: 课程外组合简写。
观察到 AC,但当前不要求学习这种写法。
python
a, b, c = [f(x) for f, x in zip([int, float, str], input().split(' '))]
print(a % 7, f"{b * 3:.3f}", c[-1])方法的适用条件
有一条 AC 把余数写成 a-7。输入 8 时碰巧对,输入 15 应是 1,却会输出 8;不能列为通用正确解法。
03 · 基础输入输出练习-07
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 字符串索引、拼接与切片 | 第2章,第23、26–27页 | 索引从 0 开始,负下标从末尾算;切片右端不包含;+ 拼接、* 重复,字符串保留字符顺序与前导零。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
提交中出现的错误与定位
- 把两行当一行 split 后访问第二项,越界;a[6] 当第六位,长度恰好 6 时越界。
- b[2:5]、b[3:5]、b[4:7] 起止错位;长度判断 >6 漏掉合法的等于 6。
- 两结果同一行输出,或中文括号引发语法错误。
错误写法 1:第六位写成下标 6
python
print(a[6])修改: 下标从 0 开始,第六位是 a[5]。
错误写法 2:切片端点不符
python
print(b[3:5])
print(b[2:5])修改: 两个错误片段分别少取一位、整体偏左;应 b[3:6]。
错误写法 3:同一行输出两个答案
python
print(a[5], b[3:6])修改: 两次 print,或使用明确的换行。
错误写法 4:漏掉合法最短长度
python
if len(a) > 6:
print(a[5])修改: 题面保证至少 6,无需判断;若判断不能排除等于 6。
正确方法 · 参考答案(尹思源)
通过字符串下标和切片取得指定字符。
python
str1 = input()
str2 = input()
print(str1[5])
print(str2[3:6])同学的不同 AC 方法
保存两串再索引/切片
对应知识/PPT: 第2章26–27页。
推荐。
python
a=input()
b=input()
print(a[5])
print(b[3:6])读完一行立即输出
对应知识/PPT: 第1章27–28页;第2章26–27页。
输出顺序与题意一致;不需要保存后续还要使用的原串。
python
print(input()[5])
print(input()[3:6])一次用换行输出
对应知识/PPT: 第2章24、38页。
结果仍是两行。
python
a=input()
b=input()
aa=a[5]
bb=b[3:6]
print(f"{aa}\n{bb}")方法的适用条件
有一条 AC 写 b[3:7]。长度恰好 6 时切片自动截到末尾,错误被遮住;第二串 ABCDEFGHI 时会多取 G。课堂要同时测最短合法长度和更长串。
04 · 计算2的幂
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 条件、分支与边界 | 第2章,第16页;第3章,第5–8页 | = 是赋值,== 是比较;if 分支不能漏掉合法边界,也不能遗漏输出路径。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
提交中出现的错误与定位
- 本次唯一 WA 使用 0<n<31 的条件,拒绝了合法的 n=0。^ 与 ** 的区别可以课堂补充,但不作为本题已观察到的错误。
错误写法 1:拒绝合法的零指数
python
n = int(input())
if 0 < n < 31:
print(2**n)
else:
print("error")修改: 应允许 n=0;题面保证范围时直接 2**n。
正确方法 · 参考答案(尹思源)
使用幂运算计算 2 的 n 次方。
python
n = int(input())
print(2**n)同学的不同 AC 方法
整数幂
对应知识/PPT: 第2章15页。
推荐。
python
a=int(input())
print(2**a)循环连乘
对应知识/PPT: 第3章15–16页。
初值 1 保证 n=0 时循环零次仍正确。
python
n=int(input())
y=1
for i in range(n):
y*=2
print(y)位移
对应知识/PPT: 课程外扩展。
观察到 AC;当前用乘方表达数学含义即可。
python
print(1 << int(input()))范围分支
对应知识/PPT: 第3章5–8页。
题目保证范围;单写一行比较表达式并不会阻止后续执行。
python
n = int(input())
if 0 <= n < 31 :
print(f"{2**n}")05 · 大象喝水
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 空白分隔、列表与解包 | 第2章,第32、35、50页 | split() 返回字符串列表;按字段个数解包,再分别转换类型;一行多个字段与多行输入不同。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 向上、向下取整与单位换算 | 第2章,第15页;第5章,第25–26页(后续展开) | 至少需要的完整桶数向上取整;已完成的整段时间用整除。先统一单位,再决定取整方向。 |
| 模块导入与 math 调用 | 第1章,第23–26页;第5章,第3–5页(后续展开) | import math 后用 math.sqrt;from math import sqrt 后用 sqrt,名称不能混用。 |
| 批量转换的可选简写 | 第4章,第18页(后续系统讲解) | map(int/float, iterable) 第一个参数是函数,第二个是可迭代对象;本课可先逐项转换,不以 map 作为前置要求。 |
| 条件、分支与边界 | 第2章,第16页;第3章,第5–8页 | = 是赋值,== 是比较;if 分支不能漏掉合法边界,也不能遗漏输出路径。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
| 参考答案的向上取整写法 | 第2章第15页整除;第5章第26页取整对照 | // 朝负无穷取整,所以 -(-num//1) 得到向上取整;最后 int 将整数值显示为整数。 |
提交中出现的错误与定位
- 20 升未换成 20000 立方厘米,或误用 2000、反向换算;漏 r 的平方。
- 用余数代替桶数、直接整除得到带 .0 的输出;出现总是 floor+1 的思路,整除时会多算一桶。
- 漏 import、pi 未定义;把输入列表直接转 int。
错误写法 1:单位未统一或漏平方
python
volume = 3.14159*r*h
answer = math.ceil(20/volume)修改: 半径要平方,目标是 20000cm³;或把桶体积换成升。
错误写法 2:无条件给整除结果加一
python
answer = int(20000//volume + 1)修改: 只在不足时加一,或用 ceil;恰好够时不应多算。
错误写法 3:把余数当桶数
python
answer = volume % 20000修改: 应求目标体积除以桶体积的向上取整。
正确方法 · 参考答案(尹思源)
先计算桶的体积,再用向上取整确定需要的桶数。
python
h, r = map(float, input().split())
Pi = 3.14159
V = Pi * r**2 * h
num = 20 * 1000 / V
# num 向上取整
num = int(-(-num // 1))
print(num)同学的不同 AC 方法
ceil
对应知识/PPT: 第5章25–26页。
推荐,直接表达至少桶数。
python
import math
h, r = map(int, input().split())
pi = 3.14159
v = pi * r * r * h
total = 20000
bucket = math.ceil(total / v)
print(bucket)先截断再判断余量
对应知识/PPT: 第2章47页;第3章5–8页。
只在不足时增加一桶,区别于无条件 +1。
python
data = input().split()
h = int(data[0])
r = int(data[1])
volume = 3.14159 * r * r * h
count = int(20000 / volume)
if count * volume < 20000:
count += 1
print(count)逐桶循环
对应知识/PPT: 第3章17页。
直观但次数随桶体积变化,公式更直接。
python
h,r= map(int,input().split())
y=1
while 3.14159*r*r*h*y<20*1000:
y+=1
print(y)把体积换成升
对应知识/PPT: 第2章15页。
与全部用立方厘米等价,单位必须统一。
python
import math
h,r=map(int,input().split())
Pi=3.14159
area=Pi*r*r*h
m=area/1000
print(int(math.ceil(20/m)))负数整除取上界
对应知识/PPT: 第2章15页(组合技巧补充)。
确有 AC;需要理解 // 朝负无穷取整,基础讲评不必要求。
python
ab = input()
h = int(ab.split()[0])
r = int(ab.split()[1])
v = 3.14159*r*r*h/1000
print(int(-(-20//v)))方法的适用条件
还有 AC 使用 math.pi、先 round(volume)、无条件 floor+1;这些与指定 π 或“恰好够”的边界存在差别。课堂参考仍用 π=3.14159,不把所有已通过变体都作为严格等价实现。
06 · 数字转星期
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 列表索引与对应关系 | 第2章,第35、41–42页;第6章,第18、24页(后续展开) | 输入编号从 1 开始,列表下标从 0 开始;列表项的次序和数量必须与题意一致。 |
| 字符串索引、拼接与切片 | 第2章,第23、26–27页 | 索引从 0 开始,负下标从末尾算;切片右端不包含;+ 拼接、* 重复,字符串保留字符顺序与前导零。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 条件、分支与边界 | 第2章,第16页;第3章,第5–8页 | = 是赋值,== 是比较;if 分支不能漏掉合法边界,也不能遗漏输出路径。 |
| 字符串方法与函数调用 | 第2章,第30、32、34页 | s.upper()、s.lower()、s.split() 需要括号;方法返回新值,必须接住或直接用于表达式。 |
提交中出现的错误与定位
- 把 Wed 拼成 Wen,缺少 Thu 导致列表只有六项或后续次序错位。
- 把输入 n 直接当零基下标,没有减 1。
错误写法 1:星期缩写和项数不符
python
days = ["Mon", "Tue", "Wen", "Fri", "Sat", "Sun"]
print(days[n-1])修改: Wed 不能写 Wen,七项中还必须有 Thu。
错误写法 2:编号当成零基下标
python
days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
print(days[n])修改: 编号 1…7 对应下标 0…6,使用 n-1。
正确方法 · 参考答案(尹思源)
把 1 到 7 映射为对应的英文星期缩写。
python
weeks = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
day = int(input())
print(weeks[day - 1])同学的不同 AC 方法
列表/元组索引
对应知识/PPT: 第2章42页;第6章18、28页(后续)。
次序映射,元组同样可读索引。
python
week=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
n=int(input())
print(week[n-1])python
n=int(input())
week=("Mon","Tue","Wed","Thu","Fri","Sat","Sun")
print(week[n-1])首项留空后按编号索引
对应知识/PPT: 第2章42页的索引模型。
用一个占位项把存储下标与编号对齐。
python
week = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
n = int(input())
print(week[n])if/elif 七分支
对应知识/PPT: 第3章5–11页。
最直接但较长,检查每个缩写。
python
x=int(input())
if x==1:
print('Mon')
elif x==2:
print('Tue')
elif x==3:
print('Wed')
elif x==4:
print('Thu')
elif x==5:
print('Fri')
elif x==6:
print('Sat')
else:
print('Sun')固定宽度字符串切片
对应知识/PPT: 第2章27、41页。
每项恰好三个字符,正是 PPT 的固定宽度映射。
python
n = int(input())
s = "MonTueWedThuFriSatSun"
print(s[(n - 1) * 3:n * 3])字符串 split 后索引
对应知识/PPT: 第2章32、35、42页。
先由分隔符建立列表。
python
date="Mon,Tue,Wed,Thu,Fri,Sat,Sun"
Date=date.split(",")
number=int(input())
print(Date[number-1])07 · 分离整数的各个数位
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 字符串索引、拼接与切片 | 第2章,第23、26–27页 | 索引从 0 开始,负下标从末尾算;切片右端不包含;+ 拼接、* 重复,字符串保留字符顺序与前导零。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 代码格式与名称 | 第1章,第21页;第2章,第6、38、49页 | 英文标点、成对引号和括号;f 紧贴字符串引号;赋值与比较区分;不要覆盖 print 等内置名称。 |
| 字符串方法与函数调用 | 第2章,第30、32、34页 | s.upper()、s.lower()、s.split() 需要括号;方法返回新值,必须接住或直接用于表达式。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
提交中出现的错误与定位
- 对 int 对象下标访问;int() 没有读输入,得到 0。
- split("123") 把 123 当分隔符,无法分离数位;join 后仍在一行输出 123。
- print 语句后夹了 123 等多余字符,导致语法错误。
错误写法 1:对整数使用下标
python
n = int(input())
print(n[0])修改: 保留字符串后索引,或用整除/余数求数位。
错误写法 2:没有读取输入
python
n = int()修改: int() 得到零;需要 int(input()) 或 input()。
错误写法 3:把数字当分隔符
python
s = input()
parts = s.split("123")
print("".join(parts))修改: split 按分隔符分组,不会逐位拆数;直接逐字符输出。
正确方法 · 参考答案(尹思源)
把整数作为字符串读取,逐位输出。
python
nums = input()
for num in nums:
print(num)同学的不同 AC 方法
字符串逐位输出
对应知识/PPT: 第2章26页。
不需要转换成数。
python
x=input()
print(x[0])
print(x[1])
print(x[2])算术分离
对应知识/PPT: 第2章15页。
另一模型是百位/十位/个位的位权。
python
n = int(input())
print(n // 100)
print(n // 10 % 10)
print(n % 10)逐次求余或相减
对应知识/PPT: 第2章15页。
适合手动追踪中间余量。
python
a=int(input())
b=a//100
m=a-(b*100)
c=m//10
d=m-(c*10)
print(b)
print(c)
print(d)join 或换行串
对应知识/PPT: 第2章24、32页。
join 在每两个字符之间放换行。
python
print('\n'.join(input()))python
abc = input()
print(abc[0] + "\n"+ abc[1] + "\n" + abc[2])循环逐字符输出
对应知识/PPT: 第3章15–16页。
三行输出不能改成同行字符连接。
python
n=input()
for i in range(3):
print(n[i])08 · 苹果和虫子1
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 空白分隔、列表与解包 | 第2章,第32、35、50页 | split() 返回字符串列表;按字段个数解包,再分别转换类型;一行多个字段与多行输入不同。 |
| 类型、变量与数值转换 | 第2章,第5–8、13、35、46–47页 | 变量名区分大小写;int 用于整数,float 接受整数或小数;转换必须作用于一个字段。 |
| 算术运算与优先级 | 第2章,第14–15、18页 | 区分 +、*、/、//、%、**;括号决定先后次序,数学式中的乘号不能省略。 |
| 向上、向下取整与单位换算 | 第2章,第15页;第5章,第25–26页(后续展开) | 至少需要的完整桶数向上取整;已完成的整段时间用整除。先统一单位,再决定取整方向。 |
| 条件、分支与边界 | 第2章,第16页;第3章,第5–8页 | = 是赋值,== 是比较;if 分支不能漏掉合法边界,也不能遗漏输出路径。 |
| 批量转换的可选简写 | 第4章,第18页(后续系统讲解) | map(int/float, iterable) 第一个参数是函数,第二个是可迭代对象;本课可先逐项转换,不以 map 作为前置要求。 |
提交中出现的错误与定位
- 六条 WA 中出现向上取整消耗量,把正在吃的苹果也扣掉。
- 用 y%x 余数当成已吃数量;判断 y//x 是否为零,而不是理解整段时间和余量。
错误写法 1:把没吃完的苹果也扣掉
python
finished = math.ceil(y/x)
print(n-finished)修改: 题目包含没吃完的苹果,已吃完数量用 y//x。
错误写法 2:余数误当已吃数量
python
print(n-y%x)修改: % 是剩余时间,// 才是完整吃完的个数。
错误写法 3:判断对象错了
python
if y//x == 0:
print(n-y//x)
else:
print(n-y//x-1)修改: 不需要给非零商再减一;直接 n-y//x。
正确方法 · 参考答案(尹思源)
根据虫子吃完苹果的时间计算剩余数量。
python
n, x, y = map(int, input().split())
print(n - y // x)同学的不同 AC 方法
直接整数公式
对应知识/PPT: 第2章15页。
所有 AC 的核心模型均是扣除完整吃完的苹果。
python
n,x,y=map(int,input().split())
ans=n-y//x
print(ans)保存中间量
对应知识/PPT: 第2章5、49页。
教学上最容易解释整除的对象。
python
n, x, y = map(int, input().split())
eat = y // x
res = n - eat
print(res)输入转换的不同写法
对应知识/PPT: 第2章35、46–47页;第4章18页(后续)。
属于输入写法差异,不能虚构成不同取整算法。
python
n, x, y = input().split()
print(int(n) - int(y) // int(x))python
n,x,y=map(int,input().split())
m=y//x
print(n-m)python
a, b, c = [int(x) for x in input().split(' ')]
print(a - c // b)09 · 字符串交换
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 字符串索引、拼接与切片 | 第2章,第23、26–27页 | 索引从 0 开始,负下标从末尾算;切片右端不包含;+ 拼接、* 重复,字符串保留字符顺序与前导零。 |
| 空白分隔、列表与解包 | 第2章,第32、35、50页 | split() 返回字符串列表;按字段个数解包,再分别转换类型;一行多个字段与多行输入不同。 |
| 浮点数、round 与格式化 | 第2章,第13、19、36–39页 | round 返回数值,:.2f/ :.3f 控制显示位数;宽度与小数位不同,数值计算和输出格式分别检查。 |
提交中出现的错误与定位
- 按一行两个字段读取,访问缺少的字段。
- 七条 Presentation Error 中出现 print(new1,new2) 同行输出。
- 新串次序写反或前缀来源不符,没有真正交换两个串的前两位。
错误写法 1:两行误作同一行
python
a, b = input().split()修改: 用两次 input()。
错误写法 2:两行结果写到同一行
python
print(b[:2]+a[2:], a[:2]+b[2:])修改: 分别 print 两个新串。
错误写法 3:新串输出次序反了
python
print(a[:2]+b[2:])
print(b[:2]+a[2:])修改: 第一行应对应原第一个串,交换后 b 的前缀与 a 的后缀。
正确方法 · 参考答案(尹思源)
用字符串切片交换指定部分。
python
str1 = input()
str2 = input()
str3 = str1[:2] + str2[2:]
str4 = str2[:2] + str1[2:]
print(str4)
print(str3)同学的不同 AC 方法
两段切片拼接
对应知识/PPT: 第2章27页。
主要方法。
python
str1= input()
str2= input()
new_str1 = str2[:2] + str1[2:]
new_str2 = str1[:2] + str2[2:]
print(new_str1)
print(new_str2)先保存新串或直接输出
对应知识/PPT: 第2章5、27页;第1章28页。
都保持原串,避免覆盖后再用错数据。
python
str1=input()
str2=input()
print(str2[:2]+str1[2:])
print(str1[:2]+str2[2:])逐字符拼接
对应知识/PPT: 第2章26–27页。
等价但长,适合对照片段来源。
python
a=input()
b=input()
a1=a[0]
a2=a[1]
b1=b[0]
b2=b[1]
print(b1+b2+a[2]+a[3])
print(a1+a2+b[2]+b[3])f 字符串拼接
对应知识/PPT: 第2章38页。
格式串里不插入额外空格。
python
a, b = input(), input()
print(f"{b[:2]}{a[2:]}")
print(f"{a[:2]}{b[2:]}")10 · 字符串大小写转换
知识点与 PPT
| 知识点 | PPT 位置 | 要讲清什么 |
|---|---|---|
| 逐行输入与输出 | 第1章,第5、27–28页 | 按 IPO 分清输入、计算、输出;input() 每次读一行且返回 str,OJ 输出不加提示语。 |
| 字符串索引、拼接与切片 | 第2章,第23、26–27页 | 索引从 0 开始,负下标从末尾算;切片右端不包含;+ 拼接、* 重复,字符串保留字符顺序与前导零。 |
| 字符串方法与函数调用 | 第2章,第30、32、34页 | s.upper()、s.lower()、s.split() 需要括号;方法返回新值,必须接住或直接用于表达式。 |
| 代码格式与名称 | 第1章,第21页;第2章,第6、38、49页 | 英文标点、成对引号和括号;f 紧贴字符串引号;赋值与比较区分;不要覆盖 print 等内置名称。 |
| 重复计算的可选写法 | 第3章,第14–16页(后续系统讲解) | for 遍历、range 次数与累加/更新;循环写法要说明每次更新的含义,并与直接公式比较。 |
| 条件、分支与边界 | 第2章,第16页;第3章,第5–8页 | = 是赋值,== 是比较;if 分支不能漏掉合法边界,也不能遗漏输出路径。 |
提交中出现的错误与定位
- 两条 Runtime Error 中出现 upper/lower 未写调用括号,把方法对象与字符串相加。
错误写法 1:方法未调用
python
s = input()
print(s[0].upper + s[1].lower + s[2].upper)修改: upper/lower 后都加 (),取得新字符串后才能拼接。
正确方法 · 参考答案(尹思源)
用大小写转换方法处理字符串中的指定字符。
python
str1 = input()
print(str1[0].upper() + str1[1].lower() + str1[2:].upper())同学的不同 AC 方法
逐位 upper/lower
对应知识/PPT: 第2章26、30、32、34页。
推荐,最贴合 PPT 提示。
python
s = input()
print(s[0].upper() + s[1].lower() + s[2].upper())整串 swapcase
对应知识/PPT: 第2章30、32页。
本题保证小写/大写/小写,整串互换完全符合题意。
python
a= input()
print(a.swapcase())逐字符判断后 join
对应知识/PPT: 第2章32页;第3章5、15–16页;生成器为补充。
观察到 AC;当前可用已有字符串方法替代。
python
print(''.join((x.upper() if x.upper() != x else x.lower()) for x in input()))