2.1 计算机解决问题的过程
知识点
1.单元导入:计算机"会算"但"不会想"
核心事实:计算机只能执行机器指令,它不会自己思考"该怎么做"。因此要让计算机解决问题,必须先由人把方法想清楚,写成算法,再翻译成程序。
问题 → 人:分析 + 设计算法 → 程序(代码)→ 计算机:执行 → 结果
本单元的知识地图:
| 小节 | 解决什么问题 |
|---|---|
| 2.1 计算机解决问题的过程 | 怎么写一句一句往下走的程序(顺序结构) |
| 2.2 做出判断的分支 | 怎么让程序会判断(选择结构) |
| 2.3 周而复始的循环 | 怎么让程序会重复(循环结构) |
| 2.4 可以复用的代码 | 怎么把代码打包复用(函数与库) |
一句话:本单元学的是"程序的三种基本结构 + 函数",这是所有编程语言的共同骨架。
2.算法是什么
定义:算法是解决某一特定问题的方法与步骤,是解决问题过程的精确描述。
五个特征(必背,与 4.1 呼应):
| 特征 | 含义 | 反例 |
|---|---|---|
| 有穷性 | 步骤有限,且能在有限时间内结束 | "一直加 1 直到……"若无终止条件,不是算法 |
| 确定性 | 每一步含义明确、无歧义 | "把数据稍微调整一下"——不明确 |
| 可行性 | 每一步都能实际执行 | "求出最大的质数"——不可行 |
| 输入 | 有 0 个或多个输入 | 求圆周率可以无输入 |
| 输出 | 至少有 1 个输出 | 没有结果就不是算法 |
记忆:"有穷、确定、可行、有入、有出"——八字口诀。
3.算法的三种描述方式
| 方式 | 优点 | 缺点 | 适用 |
|---|---|---|---|
| 自然语言 | 通俗易懂、贴近人的表达 | 易产生歧义、冗长、不严谨 | 口头交流、初步构思 |
| 流程图 | 直观、结构清晰,一眼看出分支与循环 | 复杂算法图会很大,绘制费时 | 教学、交流、说明思路 |
| 伪代码 | 介于自然语言与代码之间,严谨又易读 | 需一定约定,不能直接运行 | 算法设计与交流 |
选择的思路:先用自然语言想清楚 → 用流程图理结构 → 用伪代码定细节 → 最后写成代码。
4.流程图的基本符号(必考)
| 符号形状 | 名称 | 作用 |
|---|---|---|
| 圆角矩形(椭圆) | 起止框 | 表示算法的开始/结束 |
| 矩形 | 处理框 | 赋值、计算等处理操作 |
| 平行四边形 | 输入/输出框 | 输入数据、输出结果 |
| 菱形 | 判断框 | 条件判断,有"是/否"两个出口 |
| 箭头 | 流程线 | 表示执行的方向 |
| 圆点/连接符 | 连接点 | 连接被断开或跨页的流程线 |
记忆:"圆起圆止、矩处理、平行入出、菱判断、箭头走"。
三种基本结构的图形特征:
- 顺序结构:框自上而下,一条线串到底;
- 选择结构:出现菱形,流程线分叉后汇合;
- 循环结构:流程线回到前面的某一步(形成回路)。
画图易错点:
- 判断框的出口必须标"是/否"(或 Y/N);
- 只能有一个开始、一个结束(结构化算法);
- 流程线不能交叉、不能无出口;
- 循环必须有出口(否则违反有穷性)。
5.Python 程序的两种运行方式
| 方式 | 操作 | 特点 | 用途 |
|---|---|---|---|
| 交互式 | 在 IDLE 的 >>> 提示符后逐行输入 | 输入一句执行一句,立即看结果 | 试验语法、算一个值 |
| 文件式 | 新建 .py 文件,写完整体运行(F5) | 可保存、可修改、可重复运行 | 编写正式程序 |
程序的基本组成(四段式):
# 2-1 计算圆的面积(注释:说明程序作用)
r = float(input("请输入半径:")) # ① 输入
s = 3.14159 * r * r # ② 处理(计算)
print("圆的面积是:", s) # ③ 输出
注释:以 # 开头,到行末都是注释,不参与执行,用于说明代码意图。好程序必须有注释。
6.变量与赋值
变量:程序中用来存放数据的"容器",有名字(标识符)和值。
赋值语句:变量名 = 表达式
三条必须理解的点:
=是赋值号,不是数学里的"等于"——x = x + 1表示"把 x 原来的值加 1 后再存回 x",在数学上不成立,在程序里完全正确;- 赋值是从右往左执行的:先算右边,再存左边;
- 变量可以被反复赋值,后赋的值覆盖先前的值(变量只保留"最后一次"的值)。
变量命名规则(Python):
| 规则 | 说明 | 合法 | 非法 |
|---|---|---|---|
| 只能由字母、数字、下划线组成 | 不能有空格、-、$ 等 | score1、my_age | my-age、总分 1 |
| 不能以数字开头 | 数字只能出现在后面 | a1 | 1a |
| 不能使用关键字 | if、for、while、def、print(函数名)等 | score | for = 1 |
| 区分大小写 | A 与 a 是两个不同变量 | — | — |
命名建议:见名知义(score 而不是 a)、多个单词用下划线(total_score)、不用拼音缩写。
7.数据类型(四种基本类型)
| 类型 | 名称 | 写法示例 | 说明 | 常见运算 |
|---|---|---|---|---|
| int | 整型 | 100、-7、0 | 没有小数部分 | + - * // % ** |
| float | 浮点型(实型) | 3.14、-0.5、1.0 | 带小数,也可用科学计数法 1e3 | 同上(结果为 float) |
| str | 字符串 | "你好"、'abc'、"123" | 用单引号或双引号括起;"123" 是字符串不是数字 | +(拼接)、*(重复) |
| bool | 布尔型 | True、False | 只有两个值,判断的结果 | and or not |
查看类型:print(type(x))
print(type(100)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type("100")) # <class 'str'>
字符串的重要细节:
print("3" + "5") # 输出 35(拼接,不是相加)
print("3" * 3) # 输出 333(重复)
print(3 + 5) # 输出 8
这是初学第一大坑:"3" 加 "5" 得到 "35",不是 8。
8.类型转换
| 函数 | 作用 | 示例 | 注意 |
|---|---|---|---|
| int(x) | 转为整数 | int("25") → 25;int(3.9) → 3 | 小数转整数是"截断",不是四舍五入 |
| float(x) | 转为浮点数 | float("3.14") → 3.14;float(5) → 5.0 | — |
| str(x) | 转为字符串 | str(25) → "25" | 常用于拼接输出 |
易错:
int("3.14")会报错(ValueError),必须先float再int:int(float("3.14"));int("abc")也会报错——字符串里必须真的是数字才能转。
9.输入 input 与输出 print
(1)input:得到的一定是字符串
name = input("请输入姓名:") # 得到 str
age = input("请输入年龄:") # 得到 str!即使用户输入 18
age = int(input("请输入年龄:")) # 转成整数
铁律:input() 的返回值永远是 str。要参与算术运算,必须显式转换(int() 或 float())。
(2)print:多种输出形式
| 写法 | 示例 | 输出 |
|---|---|---|
| 直接输出 | print("你好") | 你好 |
| 逗号分隔多项 | print("面积是", s) | 面积是 78.5(逗号处自动加一个空格) |
sep 改分隔符 | print(2026, 11, 7, sep="-") | 2026-11-7 |
end 改结束符 | print("a", end="") | 不换行(默认 end="\n") |
% 格式化 | print("面积是 %.2f" % s) | 面积是 78.50 |
format | print("面积是 {:.2f}".format(s)) | 面积是 78.50 |
| f-string(推荐) | print(f"面积是 {s:.2f}") | 面积是 78.50 |
%.2f 的含义:f 表示浮点数,.2 表示保留两位小数(会四舍五入,与 int() 的截断不同)。
10.算术运算符与优先级
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
+ | 加 | 7 + 2 | 9 |
- | 减 | 7 - 2 | 5 |
* | 乘 | 7 * 2 | 14 |
/ | 真除法 | 7 / 2 | 3.5(结果一定是 float) |
// | 整除(向下取整) | 7 // 2 | 3 |
% | 取余(求模) | 7 % 2 | 1 |
** | 幂 | 2 ** 3 | 8 |
优先级(从高到低):** → * / // % → + -;同级从左到右;有括号先算括号。
三个高频用法:
- 判断奇偶:
n % 2 == 0为偶数,n % 2 == 1为奇数; - 取某位数字:
123 // 100得百位 1;123 % 10得个位 3;123 // 10 % 10得十位 2; - 拆分时间:
3650秒 →3650 // 3600小时,3650 % 3600 // 60分钟,3650 % 60秒。
注意 // 与负数:-7 // 2 的结果是 -4(向下取整,不是 -3),-7 % 2 是 1。中学阶段一般只考正数,知道有这回事即可。
11.顺序结构
定义:程序按语句书写的先后顺序,自上而下逐条执行,没有跳转、没有分支、没有重复。
这是三种结构中最基本的一种,也是选择与循环结构的"组成单元"。
典型模式:输入 → 处理 → 输出
# 2-2 已知长和宽,求长方形面积与周长
a = float(input("长:"))
b = float(input("宽:"))
area = a * b
perimeter = 2 * (a + b)
print(f"面积 {area:.2f},周长 {perimeter:.2f}")
多个变量同时赋值(Python 特色,可了解):
x, y = 3, 5
x, y = y, x # 交换两个变量的值,无需中间变量
12.常见错误与排查(上机必看)
| 错误类型 | 典型提示 | 原因 | 解决 |
|---|---|---|---|
| SyntaxError(语法错误) | invalid syntax、expected ':' | 缺括号、缺引号、中文标点、缩进不齐、if 后漏冒号 | 检查成对符号与是否用了中文符号 |
| NameError(名称错误) | name 'x' is not defined | 变量未定义或拼写不一致(大小写) | 先赋值再使用,核对拼写 |
| ValueError(值错误) | invalid literal for int() | 把非数字字符串转成数字(用户输入了字母) | 检查输入内容或用 float 兜底 |
| ZeroDivisionError | division by zero | 除数为 0 | 除法前先判断除数是否为 0 |
| TypeError(类型错误) | can only concatenate str | 字符串与数字直接相加 | 用 str() 转换或格式化输出 |
| IndentationError | unexpected indent | 缩进不一致(Tab 与空格混用) | 统一用 4 个空格 |
排查四步法:
- 看最后一行提示——错误类型与原因往往在最后一行;
- 看行号——定位到具体行(注意实际错误可能在其上一行,如漏冒号);
- 看箭头
^——Python 会标出认为出错的位置; - 缩小范围——用
print()输出中间值,或注释掉可疑代码逐段试。
中文标点陷阱:( )、,、" "、: 全角符号是语法错误的高发原因,尤其在中文输入法状态下敲代码。
13.速查表
| 序号 | 考点 | 结论 |
|---|---|---|
| 1 | 算法定义 | 解决问题的方法与步骤 |
| 2 | 算法五特征 | 有穷、确定、可行、有输入、有输出 |
| 3 | 算法描述三方式 | 自然语言、流程图、伪代码 |
| 4 | 流程图判断框 | 菱形,两个出口(是/否) |
| 5 | 流程图起止框 | 圆角矩形(椭圆) |
| 6 | 输入输出框 | 平行四边形 |
| 7 | 赋值号 | = 是赋值,不是"等于";x = x + 1 合法 |
| 8 | 变量命名 | 字母/数字/下划线,不能数字开头,区分大小写,不用关键字 |
| 9 | 四种基本类型 | int、float、str、bool |
| 10 | "3" + "5" | "35"(拼接) |
| 11 | input() 返回类型 | 永远是 str,要运算必须转换 |
| 12 | int(3.9) | 3(截断,不是四舍五入) |
| 13 | int("3.14") | 报错,需先 float |
| 14 | / 与 // | 7/2=3.5;7//2=3 |
| 15 | % 的用途 | 判断奇偶、取末位数字 |
| 16 | ** | 幂运算,2**3=8 |
| 17 | 运算符优先级 | ** → * / // % → + -,括号最高 |
| 18 | 保留两位小数输出 | f"{x:.2f}"(四舍五入) |
| 19 | print 默认分隔符 | 逗号处加空格;sep 可改 |
| 20 | print 默认结尾 | 换行(end="\n") |
| 21 | 缩进 | 统一 4 个空格,不能 Tab 与空格混用 |
| 22 | 最常见语法错误原因 | 中文全角标点 |
14.课堂提示(讲课参考)
- 第一节课不急着讲语法,先立"算法"的概念:让学生用自然语言描述"如何判断一个数是不是偶数",再画流程图,最后才写代码——三遍同一件事,学生才理解三层的关系。
input()返回字符串必须反复强调:让学生写a = input(); b = input(); print(a+b),输入 3 和 5,输出35,冲击感很强。int(3.9)=3与%.2f四舍五入对比演示:一个截断、一个四舍五入,考试爱考。- 中文标点问题现场制造一次:用中文输入法敲
print("你好")看报错,比讲十遍有用。 - 代码规范从一开始抓:注释、见名知义的变量名、4 空格缩进,后面 2.4 与第 4 单元才不会崩。