视频封面

视频元信息

  • 时长: 讲座全长约 2 小时(本片段为 Lecture 0 完整内容)
  • 讲师: David Malan(大卫·马兰)

TL;DR

CS50 第 0 讲介绍了计算机科学的本质——问题解决。课程从二进制表示信息开始,讲解数字、文本、颜色、图像和声音如何在计算机中用 0 和 1 表示;随后引入算法与伪代码;最后通过 Scratch 图形化编程让初学者亲身体验函数、循环、条件等编程概念。

引言:欢迎来到 CS50,David 的个人故事 [01:18]

理解:David 用亲身经历告诉学生,CS50 对初学者友好,也允许暂时的不适应。

  • 大卫·马兰在大一时因不自信几乎没选 CS50,第一年选了政府专业。
  • 大二时被朋友拉去听 Brian Kernighan 教授的 CS50,立刻被吸引,甚至周五晚上主动写作业。
  • 计算机科学的核心不是编程语言本身,而是解决问题;这门课强调可迁移到艺术、人文、社科、自然科学的能力。
  • 课程有挑战,但回报巨大;目标不是与同学比较,而是与自己的起点比较。
  • 展示了自己 1996 年第一份 CS50 作业:一个最简单的 C 语言 “Hello, world” 程序,还因为格式问题被扣了 2 分。每个人都会犯错,但关键是学习和享受过程。
  • 课程传统:CS50 谜题日(Puzzle Day)、Hackathon、CS50 Fair;最终项目要求做“我们没教过你的事情”。

易错点:不要因为一开始的不适就放弃,CS50 的大多数学生之前从未学过编程。

什么是计算机科学?问题解决的基本范式 [08:38]

  • 计算机科学是信息的研究:如何表示它、如何处理它。
  • 本课程教授计算思维:将计算机科学的理念应用于任何领域的问题。
  • 核心模型:输入 → 处理(算法)→ 输出。
    • 输入 = 要解决的问题
    • 处理 = 算法(逐步指令)
    • 输出 = 解决方案
  • 思考:这个模型贯穿整门课,所有编程语言都只是实现这个模型的不同工具。

信息表示:二进制、比特和字节 [09:44]

一进制与手指计数

  • 用手指计数是一进制(base-1),只用总和。
  • 但如果把每个手指看作“上/下”两种状态,一个手掌可以表示 0~31(2⁵ = 32 种组合)。这就是从“数量”思维转向“模式”思维的飞跃。*

二进制系统

  • 电脑只用 0 和 1,称为二进制(base-2);每个 0 或 1 称为bit(比特,binary digit)。
  • 物理实现:晶体管相当于微小的电灯开关——关代表 0,开代表 1。
  • 三位二进制可表示 0~7(8 种模式);用 n 位可表示 0~(2ⁿ-1)。
  • 十进制(base-10)的位权是:个位=10⁰,十位=10¹,百位=10²; 二进制的位权是:1, 2, 4, 8, 16, 32...(2 的幂)。
  • 例子:010 = 0×4 + 1×2 + 0×1 = 2;111 = 4+2+1 = 7;1000(四比特)= 8。
  • 字节(byte)= 8 比特;一个字节可以表示 0~255(共 256 种可能),因此常见 255/256 等数字。

易错点:二进制计数要从 0 开始数,3 位模式是 0~7 而不是 1~8。

为什么只用开关?——电压的极端

  • 有同学问为什么不用多级电压表示 0/1/2?实际上存在三进制计算机,但二进制最简单可靠。
  • 理解:电压精确划分困难,非黑即白避免噪声导致误判;这也和数字世界的“干净”逻辑一致。

文本表示:ASCII 与 Unicode [~22:00]

  • 要表示字母 A,只能给每个字母分配一个数字,即映射表。
  • ASCII(美国信息交换标准码):用 7 或 8 位表示英文字母、数字和标点。
    • 大写 A = 65,B = 66,C = 67...
    • 小写 a = 97,b = 98...
  • 例子:二进制 01001000 01001001 00100001 对应十进制 72 73 33,即 "HI!"。
  • ASCII 的局限:最多 256 个字符,无法涵盖所有人类语言。
  • Unicode 是向后兼容的超集,用 16/24/32 位表示更多字符,包括表情符号。
  • emoji 也是字符,例如“😂”(face with tears of joy)的十进制数是 4,036,991,106,不同平台(Android/Apple/Telegram)渲染可能不同,因为各公司有自己的字体画家。
  • 更新操作系统才能看到新 emoji,否则可能显示为空白框。

易错点:不要把 ASCII 看作“唯一”的文本标准,现代系统普遍使用 Unicode;同一个 0/1 模式在不同的程序里含义不同(文本、颜色、数字)。

颜色表示:RGB [~25:00]

  • 屏幕上的每个点叫像素(pixel)。
  • 每个像素的颜色用 RGB(红绿蓝) 三个字节表示,即 24 位。
  • 例如 (72, 73, 33) 表示中等红色、中等绿色、少量蓝色 → 黄色。
  • 照片的“百万字节”来自每个像素至少 3 字节。
  • 思考:颜色、文字、数字本质都是 0/1 的模式,是软件解释了它们的意义。

视频与声音的表示 [~28:00]

  • 视频=快速连续播放的静态图像(通常每秒 24~30 帧),因此视频文件巨大。
  • 声音:每个数字可对应一个频率;还可以用多个数字表示音量、时值、乐器等。
  • 所以多媒体信息最终都可以数字化——所有输入/输出归根结底都是 0 和 1。
  • 同一个模式(如 72,73,33)到底是“HI!”还是黄色?取决于你用哪个软件打开——写代码的程序员拥有最终解释权。

算法:电话簿中的分治思想 [~31:00]

  • 算法(algorithm)=逐步解决问题的精确指令。
  • 示例:在电话簿中找 John Harvard。
    1. 逐页查找 → 正确但慢(n 步)。
    2. 每两页跳一次 → 快一倍,但有跳过风险(需回退 1 页)。
    3. 从中间开始,判断在左半还是右半,每次把问题减半 → 约 log₂(n) 步。
  • 对于 1000 页,第三种只需约 10 步。
  • 理解:对数增长曲线非常平缓,所以当问题规模翻倍时,分治算法的耗时几乎不变;这是高效算法力量的直观体现。
  • 时间复杂度:线性 O(n)、半线性 O(n/2)、对数 O(log n)。

伪代码与四种编程基本结构 [~36:00]

  • 伪代码是用自然语言写出的精确、有限步骤,不是正式语言。
  • 经典电话簿伪代码:
    1. 拿起电话簿
    2. 翻到中间
    3. 看这一页
    4. 如果人在这一页 → 打电话
    5. 否则如果人更早 → 翻到左半部分的中间 → 回到第 3 步
    6. 否则如果人更晚 → 翻到右半部分的中间 → 回到第 3 步
    7. 否则 → 放弃(人不在这本号码簿里)
  • 四类基本结构:
    • 函数(functions):动作/动词
    • 条件(conditionals):if / else if / else
    • 布尔表达式(Boolean expressions):只有 yes/no 或 true/false 的问题
    • 循环(loops):如 go back to step 3
  • 缩进在编程中具有语义——它决定哪些代码在条件分支内。

易错点:忘记考虑“第四种情况”(如人不存在)会导致程序出现未定义行为——这就是 bug 的常见来源。

人工智能与聊天机器人简介 [~40:00]

  • 聊天机器人如果用伪代码实现,需要无数条 else if,不现实。
  • 真正的 AI 基于大量数据训练、统计和概率,而不是人工枚举所有回答。
  • 底层是神经网络,受生物神经元启发;输入大量数据,输出概率最高的回答。
  • CS50 提供自己的 AI 工具(cs50.ai),不鼓励使用 ChatGPT,因为 AI 应像助教一样引导你,而不是直接给答案。
  • 有趣的“橡皮鸭调试法”:向橡皮鸭解释你的代码,常常自己就发现问题了。

Scratch 编程入门:第一个程序 [~50:00]

  • Scratch 是 MIT 开发的图形化编程语言,通过拖拽“积木”编写程序,避免纠结于括号、分号等语法。
  • 界面:左边是积木面板(颜色分类),中间是代码区,右上是舞台(默认角色是小猫),右下是角色列表。
  • 舞台坐标:中心为 (0,0),x 范围 -240~240,y 范围 -180~180(单位:像素)。
  • 最简单的程序:点击绿旗开始 → say Hello, world —— 这就完成了第一个程序。
  • 函数(紫色“外观”积木) 可以有输入;输出可能是视觉副作用(说话气泡)。

使用返回值与变量

  • ask 和 wait 积木让用户输入,输入被存储在返回值 answer 中。
  • 思考:返回值就像一个临时变量,供后续积木使用。
  • 用 join 积木可以把 "hello, " 和 answer 拼接起来,再传给 say。
  • 嵌套积木等同于数学中的括号:内层结果成为外层输入。

自定义函数(积木)

  • 可以“制作积木”定义自己的函数,例如定义 meow,内部包含“播放声音”和“等待”。
  • 抽象:一旦定义好,上层程序只需使用 meow,不必关心内部实现。
  • 自定义函数也可以接受参数,例如 meow(n) 表示喵 n 次,用循环 repeat 实现。

条件、循环与事件:让小猫互动 [~60:00]

  • forever 循环 + if 条件 + 布尔表达式(如 touching mouse pointer?)可以实现“摸猫会叫”。
  • 事件:when green flag clicked 和 when motion exceeds 50 等积木等待事件发生。
  • 使用视频侦测扩展,可以实现身体接近时小猫叫(注意调整阈值,50 可能太灵敏)。

实际演示:从简单到复杂的游戏 [~65:00]

  • Oscar Time(David 大学时写的游戏):拖拽垃圾到 Oscar 的垃圾桶里,根据歌曲节奏计分。
  • 关键实现:
    • 垃圾不断下落:forever 中 change y by -1(每次移动 1 像素)
    • 垃圾碰到垃圾桶:用 if touching Oscar? 检查,然后传送回顶部随机 x,并给分数加 1
    • 动画:通过切换角色造型实现 Oscar 闪现
    • 随机位置:使用 pick random -240 to 240
  • 理解:复杂游戏由许多“婴儿步”叠加而成,先实现一个功能,再逐步增加。

最终示例:Ivy's Hardest Game

  • 角色用方向键上下左右移动,碰到黑线墙停止。
  • 实现移动:检查按键,改变 x/y 坐标(每次 ±1)。
  • 实现墙壁:用两个黑色竖线角色作为“左墙”和“右墙”,自定义积木 feel for walls 检测碰撞并反向。
  • 更高级版本添加了 Yale 精灵来回弹跳、MIT 精灵追踪玩家(point towards + move steps)。
  • 调整“移动步数”可以改变难度;步数太多会导致角色抖动(bug)。

易错点:编程需要耐心,复制粘贴代码容易出错;抽象和自定义函数可以避免重复,使代码更容易维护。

结尾

  • 课程最后展示了学生的作品,然后邀请志愿者试玩,最后“蛋糕时间”(CS50 传统)。

关键标签

CS50 计算机科学导论 编程基础 二进制 ASCII Unicode RGB 算法 分治 伪代码 Scratch 图形化编程 函数 循环 条件 人工智能 教育


生成时间:2026-09-10 16:26:12 生成平台:VideoNote www.xygy.top