✨ 引言:算法,是一切程序的“灵魂”,是支配程序如何“思考”的核心逻辑。掌握算法,不仅是写出正确程序的基础,更是成为优秀程序员的关键一步。让我们深入第2章,走进算法的世界!🌐
目录
🔹 2.1 程序 = 算法 + 数据结构 🧩
📌 程序设计的两大基石:
-
算法(Algorithm):解决问题的方法与步骤
-
数据结构(Data Structure):组织和存储数据的方式
🧠 类比理解:
-
算法像是做饭的“菜谱”
-
数据结构就是“食材”与“工具”
✨ 只有好的算法+合适的数据结构,才能写出高效、可靠的程序。
🔹 2.2 什么是算法 ❓
💡 算法的定义:解决某个特定问题的有穷的操作步骤集合。每一步必须清晰、可执行、确定无歧义,最终能够在有限时间内得到结果。
🎯 例如:“找出一个数列中的最大值”就是一个典型算法问题。
📌 特别注意:算法 ≠ 程序,但程序中一定包含算法!
🔹 2.3 简单的算法举例 👣
🌰 举例1:求 1 x 2 x 3 x 4 x 5
💡提示:当然可以先求1乘以2,得到结果再乘以3,最终得到结果,但是太繁琐,如果是乘到100则需要999个步骤
S1:1 => p
S2:2 => i
S3:p * i => p
S4:i + 1 => i
S5:若 i <= 5,返回 S3 ;否则,结束
🌰 举例2:有50名学生,要求输出成绩在80分以上的学生的学号和成绩
S1: 1 => i
S2: 如果gi >= 80, 则输出 ni 和 gi; 否则不输出
S3: i + 1 => i
S4: 如果 i <= 50, 则返回到步骤S2,继续执行; 否则, 算法结束
🧠 小结:这些“步骤”就是算法
🔹 2.4 算法的五大特性 ✅
📌 判断一个操作是否是“算法”,需要满足以下 五个特性:
特性 | 描述 |
---|---|
✨ 有穷性 | 操作步骤在有限时间内完成 |
🔁 确定性 | 每一步都有确切定义,没有歧义 |
🎯 有效性 | 每一步可以实际执行 |
📥 输入性 | 有0个或多个输入 |
📤 输出性 | 有一个或多个输出,表示结果 |
💡有效性:若b = 0,则执行 a / b 是不能有效执行的
📣 如果缺少这些特性,说明它不是一个真正的“算法”!
🔹 2.5 怎样表示一个算法 📝
📌 2.5.1 用自然语言表示算法 🗣️
直接用汉语或英语等自然语言描述步骤:
🧾 例:求两个数的和
第一步:输入两个数 a 和 b
第二步:求和 c = a + b
第三步:输出 c
✅ 优点:通俗易懂
❌ 缺点:可能不够严谨、难以转化为程序、容易出现歧义
📌 2.5.2 用流程图表示算法 🔄
🖼️ 流程图(Flowchart)是一种图形化工具,用图形符号表示操作流程:
常见符号:
🌰 举例1:求 1 x 2 x 3 x 4 x 5
🌰 举例2:有50名学生,要求输出成绩在80分以上的学生的学号和成绩
📌 2.5.3 三种基本结构和改进流程图 🧱
🧠传统流程图的弊端:传统的流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制,使用者可能随意转来转去,使流程图毫无规律。
🎯为了解决这个问题,人们规定出几种基本结构作为表示一个良好算法的基本单元。C语言中,所有算法都可归纳为以下三种基本结构:
1. 🔁 顺序结构:一步一步执行(左图)
2. 🔀 选择结构:又称为选取结构或分支结构,依据条件分支(右图)
3. 🔄 循环结构:重复执行某些操作
(1)当型(while型)循环结构:先判断循环条件P1,当循环条件成立则进入循环体内
执行指令;
(2)直到型(until型)循环结构:先执行循环体内的指令,直到判断循环条件P2成立则
退出循环体。
✨ 所有复杂算法都可以通过这三种结构组合构建而成。
📌 2.5.4 用N-S流程图表示算法 🪜
📦 N-S图(Nassi-Shneiderman图)是一种结构化程序图形表示方式,完全去掉了流程线,更加规范。
-
用矩形框嵌套表示各种流程
-
结构更清晰,适合结构化程序设计
-
不需要流程线,适合初学者思考逻辑结构
1. 🔁 顺序结构:一步一步执行(左1图)
2. 🔀 选择结构:依据条件分支(左2图)
3. 🔄 循环结构:重复执行某些操作
当型(while型)循环结构(右2图), 直到型(until型)循环结构(右1图)
🌰 举例1:求 1 x 2 x 3 x 4 x 5 ,即求 5!(左图)
🌰 举例2:输出50名学生中成绩高于80分学生的学号和成绩(中图和右图)
📌 2.5.5 用伪代码表示算法 💻
❓流程图和NS图表示算法虽然直观易懂,但是画起来费事,特别是设计算法需要反复修改时;
🧠 伪代码(Pseudo-code)介于自然语言和程序语言之间,表达结构清晰,易于转化为实际代码。
🌰 举例1:求 5!
begin
1 => t
2 => i
while i <= 5
{
t * i => t
i + 1 => i
}
print t
end
✅ 适用于算法设计阶段
✅ 比自然语言更简洁,书写格式比较自由
📌 2.5.6 用计算机语言表示算法 🔠
💡 最终我们需要用C语言把算法变成“能运行的程序”。
🌰 例:求 5!
#include <stdio.h>
int main() {
int i,t;
t = 1;
i = 2;
while(i <= 5)
{
t = t * i;
i = i + 1;
}
printf("%d\n",t);
return 0;
}
📣 注意格式规范、变量定义和输入输出语句,是今后程序设计的基本习惯。
🔹 2.6 结构化程序设计方法 🧠
📌 结构化程序设计(Structured Programming) 是一种科学的程序设计思想,强调:
-
将复杂问题分解为简单模块(自顶向下,逐步细化设计)
-
每个模块只完成一个功能(模块化设计)
-
程序结构清晰、便于调试与维护(结构化编码)
✅ 核心原则:“三种基本结构 + 模块化设计”
📦 C语言正是按照这一思想设计,极适合结构化编程。
📝 本章习题建议 📚
🎯 结合教材中的练习题,建议重点完成:
-
✅ 用自然语言写一个算法
-
✅ 画出一个算法的流程图(如:求最大值、判断成绩等级)
-
✅ 分析给出的描述是否符合“算法的五个特性”
-
✅ 将伪代码转化为C语言程序
-
✅ 归纳结构化编程的思想精髓
🧠 本章小结 ✨
📌 本章作为程序设计的核心思想部分,重点介绍了:
-
✅ 算法的定义与基本概念
-
✅ 算法与程序的关系
-
✅ 表示算法的多种方法(自然语言、流程图、伪代码等)
-
✅ 算法的五大特性
-
✅ 结构化程序设计的基本思想
🎯 掌握算法,不只是为了写程序,更是为了学会思考!
🗝️ 写在最后:程序会过时,但算法不会!未来你无论学习AI、图像识别、数据分析……都离不开算法。继续加油,下一章我们将走进 变量、常量与数据类型的世界,开启真正的C语言语法学习之旅!🚀