教材第1章《程序设计和C语言》| 时长:2h | 日期:10/17
📖 背诵清单(先背这个,再往下看)
下面 4 块是第 1 章要背的全部内容,忠于教材,完整列出。先背熟,再进入后面的理解讲解。
1. 程序的定义
程序,是为完成某一项任务而编写的、计算机能执行的有序指令集合(指令序列)。
2. 计算机语言(三级)
- 机器语言:由 0 和 1 组成的二进制代码指令,是计算机唯一能直接识别和执行的语言。
- 汇编语言:用助记符(如 ADD、SUB)代替二进制指令的语言,需翻译成机器语言后才能执行。
- 高级语言:接近自然语言(英文)的编程语言,易学易用,需编译成机器语言后执行。
3. C 语言的主要特点(8 条)
- 语言简洁、紧凑,使用方便、灵活。
- 运算符丰富。
- 数据类型丰富。
- 具有结构化的控制语句,用函数作为程序的模块单位,便于实现模块化。
- 语法限制不太严格,程序设计自由度大。
- 允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可直接对硬件进行操作。
- 生成的目标代码质量高,程序执行效率高。
- 用 C 语言编写的程序可移植性好。
4. C 程序的结构(4 条)
- 一个 C 程序由一个或多个函数组成,其中必须有且只有一个 main 函数(主函数)。
- 程序总是从 main 函数开始执行,无论 main 函数写在程序的什么位置。
- 每条语句以分号
;结尾。 #include <stdio.h>是预处理指令,用来包含头文件(把标准输入输出函数"拿进来")。
课前一句话
这节课只解决一件事:搞明白"程序"到底是什么,然后亲手写出你人生第一个 C 程序。学完你就能理解下面这 6 行代码为什么长这样。
一、先补地基:计算机是台"只会照做的机器"
在讲 C 语言之前,先建立一个最底层的认识:
计算机很笨,但很快。它不会思考,只会一字不差地照着你写的"步骤清单"去做。
打个比方:计算机就像一个新来的厨师学徒——他厨艺为零,但你给他一张写得清清楚楚的菜谱,他就能一步步做出菜来。你写程序,就是给这个学徒写菜谱。
- 菜谱里写什么,他就做什么;写错一个字,他就做错一道菜。
- 他不会"猜"你的意思,只会照做。
这个认识很重要,后面你遇到一切"程序报错",根源都是:你写的"菜谱"里有计算机看不懂或做不了的一步。
二、什么是程序(📖 要背)
一句话:程序,就是指挥计算机完成某个任务的一串指令(步骤)。
拆开讲:
- "程" = 过程、流程;"序" = 顺序、次序。合起来就是"有顺序的过程"。
- 程序 = 一系列按顺序排列的、计算机能执行的指令。
举例子:早上起床的程序可以写成:
1. 睁眼
2. 下床
3. 刷牙
4. 洗脸
5. 吃早饭这就是一个"程序"——它是给人看的步骤。C 语言程序,就是把这套步骤写成计算机能看懂的话。
程序设计 = 设计这份"步骤清单"的过程。核心不是打字,而是想清楚步骤。
三、什么是计算机语言(📖 要背)
一句话:计算机听不懂人话,人和计算机之间需要一种"中间语言",这就是计算机语言。
为什么需要它:
- 计算机底层只认 0 和 1(机器语言),但人没法直接写 0 和 1。
- 所以有了高级语言:用接近人类习惯的英文单词来写,再由一个"翻译官"翻给计算机听。
计算机语言分三类(考试爱考,记这张表):
| 类别 | 是什么 | 特点 | 例子 |
|---|---|---|---|
| 机器语言 | 直接是 0 和 1 | 计算机直接懂,人看不懂 | 10110000… |
| 汇编语言 | 用助记符代替 0/1 | 接近机器,仍很底层 | ADD A, B |
| 高级语言 | 接近人的英文语句 | 人好懂,需翻译 | C、Python、Java |
C 语言属于高级语言。
顺便拆个词:以后你会反复看到 "编译" 这个词。它 = 把高级语言写的程序,翻译成计算机能执行的机器语言的过程。翻译官叫编译器。
四、C 语言的特点(📖 要背)
C 语言是 1972 年诞生的,到今天快 50 年了还是程序员的核心语言。它的特点(背这几个就够):
- 简洁紧凑、灵活方便:总共只有 32 个关键字(后面会逐个认识)。
- 运算符丰富:能直接做很多运算。
- 数据类型丰富。
- 能直接操作内存和硬件(这是 C 强大的根源,也是"指针"那一章的伏笔)。
- 效率高、可移植性好:写的程序换个机器基本也能跑。
一句话记住:C 语言 = 长得像高级语言,能力接近机器语言,所以既好写、又强大。
五、你的第一个 C 程序(⌨️ 要写代码)
先直接看完整代码,别怕,我会一行一行拆:
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}运行它,屏幕上会输出一行字:
Hello, World!现在逐行拆解,这是这节课的重点:
第 1 行:#include <stdio.h>
拆分名字(你最爱的方法):
std= standard(标准)io= input / output(输入 / 输出).h= header(头文件)
合起来:stdio.h = 标准输入输出头文件。
它是干嘛的:C 语言自己不带"打印到屏幕"的功能,这些功能被装在仓库里。stdio.h 就是那个仓库的"清单",里面登记了 printf 等函数。第 1 行 #include 的意思是"把这个清单拿进来",这样后面用 printf 时,计算机才认识它。
生活比喻:
#include <stdio.h>就像你进厨房前先喊一声"把调料柜拉过来!",不然炒菜时拿不到盐。
第 2 行:int main()
拆分名字:
main= 主要的(主函数)int= integer(整数)
它是干嘛的:main 是程序的入口——程序一运行,就从 main 这里开始执行,就像一本书从第 1 页开始读。每个 C 程序有且只有一个 main 函数。前面的 int 表示这个函数最后要返回一个整数(配合第 6 行理解)。
第 3、5 行:{ 和 }
这对花括号是"函数的身体"。{ 和 } 之间的内容,就是 main 这个函数要干的事。
比喻:
{和}像一个抽屉,抽屉里装的是"步骤清单"。
第 4 行:printf("Hello, World!\n");
这是全程序唯一真正干活的一行。
拆分名字:
print= 打印f= formatted(格式化)
合起来 printf = 按格式打印。
拆开看这行的三部分:
printf(...)—— 调用"打印"这个功能。"Hello, World!\n"—— 引号里的,是要打印的文字。\n—— 一个特殊记号,叫换行符,作用=让光标跳到下一行。\是"转义"的意思,n= newline(新行)。
末尾的 ;(分号):它叫语句结束符,表示"这句话说完了"。C 语言里每条语句末尾都要写 ;,忘了写就报错——这是新手第一大坑。
记住口诀:引号里 = 文字,原样打印;引号外 = 代码,真的执行。
第 6 行:return 0;
return= 返回。0表示"正常结束"。
这行是告诉操作系统:"我跑完了,一切正常。" 呼应第 2 行的 int(函数要返回一个整数,这里就返回了 0)。
六、C 程序的结构(📖 要背)
从上面这个程序,能总结出一个 C 程序的标准结构(考试常考):
预处理指令(#include …) ← 拿工具/清单
函数定义(int main …) ← 程序入口
{ ← 函数体开始
语句; ← 干活的步骤
语句;
return 0;
} ← 函数体结束四个要点:
- 一个 C 程序由若干个函数组成,其中必须有且只有一个
main函数。 - 程序从
main函数开始执行。 #include <stdio.h>等预处理指令写在最前面。- 每条语句以
;结尾。
七、让程序会"打印数字"(⌨️ 要写代码,体现一个知识点)
刚才只打印了文字,现在看个新知识点:%d 占位符。
#include <stdio.h>
int main()
{
printf("我今年 %d 岁\n", 20);
return 0;
}输出:
我今年 20 岁这行代码体现的知识点:printf 的引号里,%d 是一个占位符(占着位置不打印),它会在打印时被逗号后面的那个数(20)替换掉。
%d的d= decimal(十进制整数),所以%d= "这里放一个整数"。- 逗号后面的
20就是那个整数。
比喻:
%d像试卷上的填空题空格,20就是填进空格的答案。几个%d,就要在逗号后面跟几个数。
八、书上题目(📝 重点,考试可能抽题)
第 1 章的题目偏概念 + 简单写程序,我挑重点的讲:
题 1(概念):什么是程序?什么是程序设计? 答:程序是计算机执行某个任务的一串有序指令;程序设计就是设计、编写这份指令的过程(想清楚步骤)。
题 2(概念):为什么需要计算机语言?高级语言有什么特点? 答:因为计算机只懂 0/1 机器语言,人需要中间语言沟通。高级语言的特点:接近人类自然语言、易学易用、需要编译后才能运行、可移植性好。
题 3(写程序):编写程序,输出 Hello world!
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}解析:这就是第六节那个程序的翻版,只是把 Hello, World! 换成 Hello world!,末尾有没有逗号、大小写,都要一字不差,否则输出就不对。
题 4(写程序):编写程序,分两行输出你自己的姓名和学号。 思路:用两个 printf,每个末尾带 \n 换行。
#include <stdio.h>
int main()
{
printf("姓名:张三\n");
printf("学号:20260001\n");
return 0;
}解析:第 4 行打印完 姓名:张三 后,\n 把光标换到下一行,所以第 5 行的 学号 出现在新的一行。如果去掉 \n,两句话会挤在同一行——这正是 \n 的作用。
九、运行 C 程序的步骤与方法(教材 1.5,p11–12)📖
写了 .c 文件不等于能运行。教材把上机过程分成 4 步:
- 上机输入和编辑源程序:键盘输入 → 改正录入错误 → 存成
.c源程序文件(如f.c)。 - 对源程序进行编译:先由预处理器处理
#include等预处理指令(把stdio.h的内容读进来,取代#include <stdio.h>行),再由编译器检查语法。有错就发出"出错信息",改完再编译,直到没有语法错误;然后生成二进制目标程序.obj(如f.obj)。 - 进行连接处理:一个程序可能包含多个源程序文件,编译是以源程序文件为对象的,一次编译只能得到一个目标模块。必须把所有目标模块连接装配起来,再与函数库连接成一个整体,生成可执行程序
.exe(如f.exe)。连接由"连接编辑程序"完成。 - 运行可执行程序,得到运行结果。
教材图 1.2 的流程可以压缩成一句话:
编辑 → 编译 → 有错?──是──→ 改源程序,重新编译
│否
↓
连接 → 执行 → 结果正确?──否──→ 检查逻辑,改源程序
│是
↓
结束考点两类错误要分清:
- 语法错误:编译阶段就能发现(漏分号、括号不配对、变量没定义),编译器会报错,程序根本生成不了
.exe。 - 逻辑错误:编译能过、也能运行,但结果不对(公式写错、赋值写反)。这类错误要靠调试(debug)和测试(test)发现。
教材的例子很典型:把 b = a; 错写成 a = b;,语法没问题、能通过编译,但结果与预期不符——这是逻辑错误。再如求 c = b / a,当 a=4, b=2 时结果 0.5 正确;但 a=0 时就无法求出——说明程序对某些数据正确、对另一些数据不正确,还有漏洞,需要设计多组测试数据去测。
调试 = 通过上机发现和排除程序中故障的过程。
测试 = 设计多组测试数据,检查程序对不同数据的运行情况,尽量发现漏洞并修改,使之适用于各种情况。
十、程序设计的任务(教材 1.6,p13–14)📖
教材给"程序设计"下的定义是:从确定任务到得到结果、写出文档的全过程。不是"敲代码"这一个动作。
一般经历以下 6 个工作阶段:
- 问题分析:研究所给条件,分析最后应达到的目标,找出解决问题的规律,选择解题的方法。过程中可以忽略次要因素,使问题抽象化(例如用数学式子表示问题的内在特性)——这就是建立模型。
- 设计算法:设计出解题的方法和具体步骤。一般用流程图表示解题步骤。
- 编写程序:根据得到的算法,用一种高级语言编写出源程序。
- 对源程序进行编辑、编译和连接,得到可执行程序。
- 运行程序,分析结果:能运行不等于正确,要对结果进行分析。发现结果不对就要调试;调试出正确结果后还要测试(多组数据),确认程序对各种情况都适用。
- 编写程序文档:正式提供给用户使用的程序,必须提供程序说明书(用户文档),内容包括程序名称、功能、运行环境、安装和启动、需要输入的数据、使用注意事项等。
教材的一个结论:软件 = 计算机程序 + 程序文档。商品软件光盘里既有程序,也有使用说明(help / readme)。
考点程序设计 ≠ 写代码:写代码只是第 3 步;前面的"分析问题、设计算法"和后面的"调试、测试、写文档"同样算程序设计。
十一、书上题目补充(第 5–7 题,p14)📝
第 1 章的 7 道习题里,前面第 1–4 题已在上面讲过,这里补上第 5–7 题:
第 5 题(编程):编写一个 C 程序,运行时输出以下图形(五行五列的星号图案)。
#include <stdio.h>
int main()
{
printf("*****\n"); // 第 1 行:5 个星号,然后换行
printf("*****\n"); // 第 2 行
printf("*****\n"); // 第 3 行
printf("*****\n"); // 第 4 行
printf("*****\n"); // 第 5 行
return 0;
}解析:这就是 5 条 printf,每条打印 5 个星号加一个 \n。题目要练的是"一条语句负责一行"的对应关系。
第 6 题(编程):运行时输入 a、b、c 三个值,输出其中最大者。
#include <stdio.h>
int main()
{
int a, b, c, max;
scanf("%d %d %d", &a, &b, &c); // 从键盘读入三个整数
max = a; // 先假设 a 最大
if (b > max) max = b; // b 更大就换 b
if (c > max) max = c; // c 更大就换 c
printf("max=%d\n", max); // 输出最大者
return 0;
}解析:if 语句第 4 章才正式讲,这里先"照猫画虎":先假定第一个最大,再依次和后面的数比,谁大就把谁记成 max。这是"求最大值"的通用套路,第 5、6 章还会反复用。
第 7 题(操作):用 Visual Studio 对 C 程序进行编辑、编译、连接和运行。
你机器上是 Visual Studio 2022,操作与教材的 2010 版基本一致:
- 新建"空项目",命名(如
test1); - 在"源文件"上右键 → 添加 → 新建项 → 选"C++ 文件(.cpp)",文件名写成
test1.c(扩展名必须是.c,否则按 C++ 编译); - 输入源程序;
- 按
Ctrl+F5编译并运行;有错看"错误列表",改到 0 错误; - 看运行结果,分析是否符合预期。
这三题补齐后,第 1 章书末 7 道习题就全部覆盖了。
🛠 课后练习(只给题不给答案,做完发我判,或上机自验)
🔮 猜输出(先自己猜,再上机验证猜得对不对)
题 1
#include <stdio.h>
int main()
{
printf("Hello");
printf("World\n");
return 0;
}题 2
#include <stdio.h>
int main()
{
printf("%d + %d = %d\n", 1, 2, 3);
return 0;
}🛠 变式题(独立写,写完上机跑)
题 3(照猫画虎):写一个程序,输出 Good Morning!
题 4(翻译):写程序输出一行 我今年20岁,身高175厘米(要求用两个 %d)
题 5(补全):下面代码想分两行输出"第一行""第二行",但它现在会挤在一行。补上缺失的那个东西,让它正确换行:
#include <stdio.h>
int main()
{
printf("第一行");
printf("第二行");
return 0;
}🐛 改错题(找出错在哪,并改对)
题 6
#include <stdio.h>
int main()
{
printf("Hello, World!\n")
return 0;
}题 7
#include <stdio.h>
int main()
{
printf("我今年 %d 岁\n");
return 0;
}📈 加练题(你随时喊,我随时追加到这里)
(暂无。想加练就说"再出几道 XX 题",我出的题会标上日期追加在这块。)
💬 问答区(你问过的问题 + 我的解答)
(暂无。你问的问题和我的解答会按 Q/A 整理进这里。)
该带走的 4 句话
- 程序 = 指挥计算机干活的一串有序指令,写程序就是写"步骤清单"。
- C 程序必须有且只有一个
main函数,程序从main开始执行。 - 引号里 = 文字(原样打印),引号外 = 代码(真的执行);每条语句结尾别忘了
;。 printf里的%d是占位符,会被逗号后面的数字替换;\n是换行。
学完这一课,告诉我"下一课",我们进入第 2 章《算法——程序的灵魂》。如果刚才哪一行还卡着,直接说卡在哪一句 / 哪个词。
📚 教材覆盖清单(第1章,程序设计和C语言)
这张表把本课和教材逐节对上:从网页可以回查书页,从书页也能找到网页位置。标「未展开」的,就是教材里有、本课没讲的部分,已明确列出。
| 教材节号 | 标题 | 书页 | 网站对应 | 状态 |
|---|---|---|---|---|
| 1.1 | 什么是计算机程序 | p.1 | 二、什么是程序(📖 要背) | 精讲 |
| 1.2 | 什么是计算机语言 | p.1–2 | 三、什么是计算机语言(📖 要背) | 精讲 |
| 1.3 | C语言的发展及其特点 | p.3–4 | 四、C 语言的特点(📖 要背) | 精讲 |
| 1.4 | 最简单的C语言程序 | p.5–10 | 五、你的第一个 C 程序(⌨️ 要写代码) | 精讲 |
| 1.4.1 | 最简单的C语言程序举例 | p.5–8 | 七、让程序会"打印数字"(⌨️ 要写代码,体现一个知识点) | 精讲 |
| 1.4.2 | C语言程序的结构 | p.9–10 | 4. C 程序的结构(4 条) | 精讲 |
| 1.5 | 运行C程序的步骤与方法 | p.11–12 | 九、运行 C 程序的步骤与方法(教材 1.5,p11–12)📖 | 精讲 |
| 1.6 | 程序设计的任务 | p.13 | 十、程序设计的任务(教材 1.6,p13–14)📖 | 精讲 |
| 习题 | 第1章书末习题 | p.14 | 本课「书上习题精讲」 | 逐题精讲(第1–7题) |
| 插图 | 本课范围内教材插图 | p.1–13 | 用文字/ASCII 重画 | 未逐张复刻 |
| 附录 | 附录 A–E | p.357–370 | 全书对照页 | 未单独成课 |
- 教材插图(流程图、内存示意图等)本课用文字/ASCII 重画,未逐张复刻,页码见上表。
- 附录 A–E(p.357–370)是速查表,未单独成课;全站对照页列出。
- 标「本课补充」的小节(先补地基、比喻、随课练习等)不是教材原文,是为理解而加的。