1. 这套题到底在练什么:从顺序结构到选择分支的思维跃迁
很多人看到“第三章”三个字,第一反应就是“不就是几道入门题嘛”。我带过不少刚接触编程的朋友,发现一个特别普遍的现象:前两章学变量、输入输出、简单运算的时候,感觉顺风顺水,一到第三章就开始卡壳。卡的不是语法,而是思维方式的切换。
第三章的核心,说白了就一件事——让程序学会“判断”。前两章你写的代码是一条道走到黑,从上到下依次执行,输入什么就算什么。但从这一章开始,程序要根据不同的条件走不同的路。这就好比你以前只会直着走,现在要学会在岔路口看路标选方向。
这套题一共22道,从3-1到3-22,难度是阶梯式上升的。我把它大致分成四个阶段:
- 3-1到3-5:热身阶段,主要是基本的if-else结构,题目场景简单,比如判断奇偶、比较大小、成绩等级划分。
- 3-6到3-12:开始引入多分支和嵌套判断,题目条件变多,需要你理清逻辑层次,比如判断三角形类型、计算分段函数。
- 3-13到3-18:综合性增强,往往需要结合循环或者较复杂的数学逻辑,比如判断素数、求闰年、简单的数值计算。
- 3-19到3-22:压轴题,通常涉及多个条件的组合判断,或者需要一定的算法思维,比如模拟简单的业务逻辑。
为什么我要先把这个框架讲清楚?因为很多初学者拿到题就开始写,写完发现过不了,然后反复改,改到最后自己都不知道在写什么。先看清楚题目属于哪个阶段,心里有数,再动手,效率完全不一样。
还有一个很重要的点:这套题虽然是在线判题系统,但它考察的不仅仅是“能不能跑出正确结果”。它其实在训练你三件事——边界条件的敏感度、逻辑表达的严谨性、代码结构的清晰度。这三样东西,在后面学循环、函数、数据结构的时候,会反复用到。第三章没打好基础,后面会越来越吃力。
我见过太多人第三章草草过去,到了第四章循环嵌套直接崩溃。所以,别小看这22道题,它们是你编程思维的第一道分水岭。
2. 动手之前先把这些坑填了:环境与基础语法速查
在正式开始逐题拆解之前,有几个基础问题必须先说清楚。这些东西看起来简单,但每年都有大量的人在这里翻车。
2.1 输入输出的常见陷阱
在线判题系统对输入输出的格式要求极其严格。你多一个空格、少一个换行,系统都可能判你格式错误。我总结了几条铁律:
- 输入用input(),但要注意类型转换。input()拿到的永远是字符串,要比较大小或者做运算,必须转成int或float。比如
n = int(input())。 - 一行输入多个值时,用split()拆分。比如
a, b = input().split(),这时候a和b都是字符串,需要进一步转换。 - 输出格式要严格对照题目要求。题目说保留两位小数,你就得用
print(f"{result:.2f}")或者print("%.2f" % result)。题目说输出“Yes”你就不能写“YES”或者“yes”。
提示:很多判题系统对大小写敏感,题目里写的是什么大小写,你就原样输出,别自作主张。
2.2 条件表达式的写法要点
Python的条件表达式非常灵活,但灵活也意味着容易写出“能跑但逻辑不对”的代码。几个关键点:
- 比较运算符:
==是判断相等,=是赋值,千万别搞混。这个错误新手几乎人人犯过。 - 逻辑运算符:
and、or、not,注意优先级。not最高,and次之,or最低。不确定的时候加括号,别省那几个字符。 - 链式比较:Python支持
a < b < c这种写法,等价于a < b and b < c,写起来更简洁,但要注意别写成a < b > c这种容易混淆的形式。
2.3 缩进就是生命线
Python用缩进来表示代码块,这是它和其他语言最大的区别之一。if语句下面的代码块必须缩进,通常是4个空格。缩进错了,要么报错,要么逻辑完全跑偏。
我建议你从一开始就养成好习惯:统一用4个空格,不要用Tab。有些编辑器Tab和空格混用,表面看起来对齐了,实际上Python解释器会报IndentationError。这种错误特别隐蔽,找半天找不到原因。
2.4 调试的基本方法
题目过不了的时候,别盯着代码发呆。最有效的办法是手动模拟:拿一张纸,把变量的值一步一步写下来,看看程序实际走的是哪条分支,和你想的是不是一样。
另一个办法是加临时输出。在关键位置插入print()语句,把中间变量的值打出来。确认逻辑没问题之后再把调试语句删掉。这个方法虽然笨,但极其有效。
3. 逐题拆解:从3-1到3-22的完整思路与代码
下面进入正题。我会按照题号顺序,把每道题的核心思路、关键代码和容易踩的坑讲清楚。代码我用Python写,尽量保持简洁易懂。
3.1 基础判断篇(3-1到3-5)
3-1 判断奇偶数
题目要求输入一个整数,判断是奇数还是偶数。
核心思路:用取模运算符%。n % 2 == 0就是偶数,否则是奇数。
n = int(input()) if n % 2 == 0: print("even") else: print("odd")这道题太简单了,但有一个坑:负数取模。在Python里,-3 % 2的结果是1,不是-1。所以-3 % 2 == 0是False,会被正确判断为奇数。这一点和某些语言不一样,Python的处理方式反而更符合数学直觉。
3-2 比较两个数的大小
输入两个数,输出较大的那个。
a, b = map(int, input().split()) if a > b: print(a) else: print(b)这里用了map(int, ...)把split出来的字符串直接转成整数,比逐个转换更简洁。注意题目如果要求输出格式是“A > B”之类的,要严格按照要求来。
3-3 成绩等级转换
输入一个百分制成绩,按照给定规则转换成等级。比如90分以上是A,80到89是B,以此类推。
这道题的关键是边界值。90分到底算A还是B?题目说“90分及以上为A”,那90就是A。这种边界一定要看清楚,差一分结果就不同。
score = int(input()) if score >= 90: grade = 'A' elif score >= 80: grade = 'B' elif score >= 70: grade = 'C' elif score >= 60: grade = 'D' else: grade = 'E' print(grade)注意这里用的是elif而不是多个if。用elif的好处是,一旦某个条件满足,后面的条件就不会再判断了。如果用多个独立的if,虽然结果可能也对,但效率低,而且逻辑上不够清晰。
3-4 判断闰年
闰年的判断规则:能被4整除但不能被100整除,或者能被400整除。
year = int(input()) if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0: print("yes") else: print("no")这道题的坑在于逻辑运算符的优先级。and的优先级高于or,所以上面的写法是正确的。如果你不确定,加括号最保险。
3-5 求三个数中的最大值
输入三个数,输出最大值。
a, b, c = map(int, input().split()) if a >= b and a >= c: print(a) elif b >= a and b >= c: print(b) else: print(c)也可以用Python内置的max()函数,一行搞定:print(max(a, b, c))。但第三章的练习目的是训练条件判断,建议还是用if-else写一遍,理解逻辑之后再偷懒。
3.2 多分支与嵌套判断篇(3-6到3-12)
3-6 判断三角形类型
输入三条边的长度,判断能否构成三角形,以及是等边、等腰还是普通三角形。
这道题需要先判断能否构成三角形,再判断类型。顺序不能反。
a, b, c = map(int, input().split()) if a + b > c and a + c > b and b + c > a: if a == b == c: print("等边三角形") elif a == b or b == c or a == c: print("等腰三角形") else: print("普通三角形") else: print("不能构成三角形")注意a == b == c这种链式比较,等价于a == b and b == c。另外,判断等腰的时候,等边的情况已经被前面的分支拦截了,所以不用再排除等边。
3-7 分段函数求值
题目给出一个分段函数,比如x小于0时y等于某个表达式,x等于0时y等于另一个值,x大于0时又是另一个表达式。
这种题就是照着题目翻译成代码,没什么技巧,但要注意每段的边界。
x = float(input()) if x < 0: y = x * x + 1 elif x == 0: y = 0 else: y = x * x - 1 print(f"{y:.2f}")浮点数比较相等要小心。x == 0在x是整数输入时没问题,但如果x是浮点数,可能会有精度问题。不过这类题目通常输入都是整数或者有限小数,一般不会出问题。
3-8 判断一个数是否在某个区间内
比如判断输入的整数是否在[10, 20]范围内。
n = int(input()) if 10 <= n <= 20: print("in") else: print("out")Python的链式比较在这里非常好用,写起来直观。注意区间的开闭,题目说“10到20之间”到底是包含还是不包含,要看清楚。
3-9 简单的计算器模拟
输入两个数和一个运算符,输出运算结果。
a, op, b = input().split() a = float(a) b = float(b) if op == '+': result = a + b elif op == '-': result = a - b elif op == '*': result = a * b elif op == '/': if b == 0: result = "error" else: result = a / b print(result)这道题的坑是除数为零的情况。题目如果要求处理,就必须加判断。另外,输出格式要注意,如果是浮点数,可能需要保留小数位。
3-10 判断字符类型
输入一个字符,判断是数字、大写字母、小写字母还是其他字符。
ch = input() if ch.isdigit(): print("digit") elif ch.isupper(): print("upper") elif ch.islower(): print("lower") else: print("other")Python的字符串方法isdigit()、isupper()、islower()非常好用,直接调用就行。但要注意,这些方法对多字符字符串也有效,比如"123".isdigit()返回True。如果题目只输入单个字符,那没问题。
3-11 判断能否被3和5同时整除
n = int(input()) if n % 3 == 0 and n % 5 == 0: print("yes") else: print("no")也可以写成n % 15 == 0,因为3和5互质,能被15整除等价于能同时被3和5整除。这种等价转换在数学上没问题,但建议初学者还是用显式的and,逻辑更清楚。
3-12 根据月份判断季节
输入月份,输出对应的季节。通常3-5月是春季,6-8月是夏季,以此类推。
month = int(input()) if 3 <= month <= 5: print("spring") elif 6 <= month <= 8: print("summer") elif 9 <= month <= 11: print("autumn") else: print("winter")注意12月、1月、2月都归到冬季,所以最后的else直接兜底。这种写法比逐个列出所有月份要简洁得多。
3.3 综合应用篇(3-13到3-18)
3-13 判断素数
输入一个正整数,判断是否为素数。
素数是只能被1和自身整除的大于1的整数。判断方法:从2到sqrt(n)逐个试除。
n = int(input()) if n <= 1: print("no") else: is_prime = True for i in range(2, int(n ** 0.5) + 1): if n % i == 0: is_prime = False break if is_prime: print("yes") else: print("no")这道题虽然第三章还没正式学循环,但很多学校的进度会提前涉及。如果还没学for循环,可以用while循环代替,或者用简单的条件判断处理小范围输入。核心思路是试除到平方根,不用试到n-1,这样效率高很多。
3-14 求最大公约数
用辗转相除法求两个数的最大公约数。
a, b = map(int, input().split()) while b: a, b = b, a % b print(a)辗转相除法的原理是:两个数的最大公约数等于其中较小的数和两数相除余数的最大公约数。这个算法非常经典,值得记住。
3-15 简单的数值统计
输入一组数,统计其中正数、负数和零的个数。
nums = list(map(int, input().split())) positive = negative = zero = 0 for n in nums: if n > 0: positive += 1 elif n < 0: negative += 1 else: zero += 1 print(positive, negative, zero)这道题的关键是初始化计数器,以及正确使用if-elif-else结构。
3-16 判断回文数
输入一个整数,判断它是不是回文数(正着读和倒着读一样)。
n = input() if n == n[::-1]: print("yes") else: print("no")Python的切片[::-1]可以直接反转字符串,非常方便。如果要求用数学方法,可以用取余和除法逐位提取数字再比较。
3-17 计算分段计费问题
比如出租车计费:起步价多少,超过多少公里后每公里多少钱。这种题就是分段函数的实际应用。
distance = float(input()) if distance <= 3: fee = 10 elif distance <= 10: fee = 10 + (distance - 3) * 2 else: fee = 10 + 7 * 2 + (distance - 10) * 3 print(f"{fee:.2f}")注意每段的计算基数,别重复计算或者漏算。
3-18 判断日期是当年的第几天
输入年月日,计算这是当年的第几天。
year, month, day = map(int, input().split()) days_in_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0: days_in_month[2] = 29 total = sum(days_in_month[:month]) + day print(total)这道题综合了闰年判断和列表操作,是第三章比较典型的综合题。
3.4 进阶挑战篇(3-19到3-22)
3-19 模拟简单的登录验证
输入用户名和密码,按照给定规则判断是否允许登录。
username = input() password = input() if username == "admin" and password == "123456": print("success") elif username != "admin": print("user not found") else: print("wrong password")这种题考察的是多条件组合判断,以及不同错误情况的区分。
3-20 判断成绩是否合格并给出等级
综合了成绩转换和合格判断。
score = int(input()) if score < 0 or score > 100: print("invalid") elif score >= 60: if score >= 90: print("excellent") elif score >= 80: print("good") else: print("pass") else: print("fail")嵌套判断的层次要理清楚,先判断合法性,再判断是否合格,最后细分等级。
3-21 简单的猜数字游戏模拟
给定一个目标数字和猜测数字,输出提示(大了、小了、对了)。
target = int(input()) guess = int(input()) if guess > target: print("too high") elif guess < target: print("too low") else: print("correct")3-22 综合业务逻辑判断
这道题通常是前面知识点的综合,可能涉及多个条件的组合。比如根据用户类型、消费金额、是否有优惠券等决定最终折扣。
user_type = input() amount = float(input()) has_coupon = input() if user_type == "vip": discount = 0.8 else: discount = 0.95 if has_coupon == "yes": discount -= 0.05 final = amount * discount print(f"{final:.2f}")这种题的关键是把条件拆解清楚,一步一步来,别想着一口气写完。
4. 踩坑实录:那些年我在第三章翻过的车
4.1 边界条件:差一分就是错
这是最高频的错误来源。题目说“大于等于60”,你写成“大于60”,59分和60分的结果就反了。我的建议是:每写完一个条件,回头读一遍题目原文,确认边界是开还是闭。
4.2 逻辑运算符优先级:and和or的坑
a or b and c到底先算哪个?答案是先算and。很多人凭直觉以为从左到右,结果逻辑完全错了。不确定就加括号,这是最省时间的做法。
4.3 输入格式:split用错导致解包失败
a, b = input().split()要求输入恰好两个值。如果输入只有一个值,会报ValueError。如果输入有三个值,也会报错。所以要看清楚题目要求的输入格式。
4.4 浮点数比较:别用==
浮点数在计算机里是近似存储的,0.1 + 0.2 == 0.3在Python里是False。如果题目涉及浮点数比较,最好用差值小于某个极小值来判断,或者直接用整数运算避免浮点数。
4.5 输出格式:多一个空格都不行
判题系统对输出格式极其严格。我建议你直接把题目要求的输出格式复制下来,对照着写。比如题目要求输出Result: 5,你就不能输出Result:5或者result: 5。
5. 从会做到做对:提升代码质量的几个习惯
5.1 先写伪代码再写代码
拿到题目别急着敲键盘。先在纸上或者注释里把逻辑写清楚:第一步做什么,第二步做什么,什么条件下走哪条路。伪代码写好了,翻译成Python就是几分钟的事。
5.2 变量命名要有意义
a、b、c这种命名只适合临时用。稍微复杂一点的题目,用score、year、month这种有意义的名字,代码可读性会好很多,调试的时候也不容易搞混。
5.3 及时测试边界值
写完代码别只测一个普通值。试试最小值、最大值、边界值、特殊值(比如0、负数)。很多错误就是在这些情况下暴露出来的。
5.4 学会看报错信息
Python的报错信息其实很详细,告诉你哪一行出了什么错。IndentationError是缩进问题,ValueError是类型转换问题,NameError是变量没定义。看多了就能快速定位问题。
5.5 保存你的代码
每道题做完之后,把代码保存下来。不是为了交作业,而是为了以后复习。第三章的很多思路在后面会反复用到,有一份自己的代码库,比看任何教程都管用。
6. 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 报IndentationError | 缩进不一致,Tab和空格混用 | 统一用4个空格缩进 |
| 报ValueError | 输入值数量不对或类型转换失败 | 检查split后的变量个数,确认输入格式 |
| 结果和预期差一点 | 边界条件写错 | 重新读题,确认开闭区间 |
| 逻辑完全不对 | 运算符优先级问题 | 加括号明确优先级 |
| 浮点数输出格式错误 | 没有按题目要求保留小数位 | 用f-string或format指定精度 |
| 大小写不匹配 | 输出字符串大小写和题目不一致 | 原样复制题目要求的输出 |
| 除零错误 | 没有判断除数为零的情况 | 加if判断,处理特殊情况 |
| 死循环 | while条件永远为真 | 检查循环变量是否更新 |
7. 第三章之后的路怎么走
第三章的选择结构是编程思维的基础。你在这22道题里学到的条件判断、逻辑组合、边界处理,在后面学循环的时候会直接用到。比如循环里的终止条件,本质上就是一个条件判断;循环嵌套里的逻辑,和嵌套if的思路是一样的。
我的建议是:第三章的题不要只做一遍。第一遍可能磕磕绊绊,第二遍再回来做,你会发现很多之前觉得难的题其实很简单。这种“回头再做”的过程,就是思维固化的过程。
另外,做完这22道题之后,可以尝试自己给自己出题。比如把3-6的三角形判断改成判断四边形,把3-18的日期计算改成计算两个日期之间相差多少天。自己出题、自己解题,比被动做题效果好得多。
最后说一个我个人的习惯:每学完一个章节,我会用这个章节的知识点写一个小程序,哪怕只有几十行。比如学完选择结构,我写了一个简单的命令行计算器,支持加减乘除和括号优先级判断。这个习惯坚持下来,知识点想忘都忘不掉。