我是。。。（听不清）
我是一名大四学生，住在Leverett舍。
我专修计算机科学，同时我是计算机科学50的一名助教
我大一的时候连手提电脑和智能手机都没有。
我那时也没有任何编程的经验。
计算机科学50是我在哈佛上过的令我印象最深刻的课，
因为它很难，但是难的同时让我觉得非常有意思。
同时我交了很多非常好的，长久的朋友，我还学到了很多
非常实用的技能。
我想说我很高兴我当时没有让我自己（编程）背景的缺乏成为
我不上计算机科学50的借口。
我是。。。(听不清)
我现在大四，住在Leverett舍。2014届。
我之前上了计算机科学50。
好的，这就是对计算机科学50的基本介绍。
我们这个选课星期的课就到这里。
记得上次我们是从台灯那里开始的，
这些灯变得很受欢迎，所以我们去又带了一些来。
我想这个能成为我们今年的一个传统
你上台来的话奖励一盏台灯，知道我们送完为止。
但是请记得我们上次是用这些灯来介绍数据表示法的基本知识。
我们当时需要一个在计算机内部表示信息的方法。
那么去达到这个目的的最简单的办法就是用一种元素，电流。
那么你对于电可以做的最简单的事情就是把它打开和关上。
让电子流动或者不流动。
那么用这两种基本的状态，关与开，或者false与true，或者0和
1, 我们开始发现我们在这种情况下可以用灯泡
来表示比0和1更多的数字。
比如我们上次就数到了7。
但是我们所要做的只是不断往那个问题里面加更多的灯泡
这样的话，我们可以表示任何我们
可能想要表示的数字。
好的，我们在周三快速转换到了那个关于字节的支援活动。
大体上说，8个比特就可以成为一个字节，所以我们上次请了8个人自愿上台来。
他们在周三的时候一起代表了8个比特。
当他们手都举起来的时候，他们整体代表了数字1。
当他们手都放下来的时候，他们整体代表了数字0。
那么我们为什么让他们到台上来呢？
我们用这些比特干了什么事？
我们建立了一个字母表。
我们可以在之前学到的东西之上更近一步并且真正的
开始传达更加有趣的信息，
至少是对人类来说更加熟悉的信息。
这将使我们这门课当中不断出现的主题，同时对于
计算机科学总体来说也是，在这个领域当中分层的概念说到最后，
如果你真的是从一个电脑开始最基本的程序的话，就是，
用0和1表示的。
在那下面再基本的层次就是电流了。
但是我们很快就开始觉得底层的那些细节是非常自然的了
开始基于之前人工作的基础之上建立层次，最终
在本学期结束的时候，或者真正大体上作为计算机科学家
和程序员，可以做一些比较大的工程，
通过相互之间工作成果的铺垫，同时也站在别人的肩上。
现在我们快速得从周三的仅仅表示信息的情况转换到
想用信息做些东西的时候了。
那么我们是怎么定义算法的呢？
一系列的指示
所以算法是一系列的指示，一系列步骤，你，一个人，或者
更典型的情况下一台电脑，需要一条条按照顺序执行的
为了达到某些目的。
我们上次有几个目的，其中之一是数数
这教室里面的人数。
类似的另外一个例子就是从黄页里面找到麦克史密斯这个人。
所以你们可能记得我把一本黄页撕两半
直到找到麦克史密斯。
那个演示的目的是想说明
我们是把这个问题不断二分，然后很快地
从1000页纸到只剩下一页纸了。
对于你们之中那些错过了周三的这个片段的人，我想我们可以给你们重播一下
你们之前错过的片段。
让我们来看看。
（视频重播）
好啦。
1500页纸，整齐的撕痕，牛X的撕法。
视频重播结束
那么这些就是周三的内容。
我们从周三内容转换到现在想代表算法
通过一些标准化的方法，不只是口述这个过程，而是
试着在书面或者在电脑屏幕上面标示它们，使得我们
可以在那之上改进，并且最终
去分析它们的正确性或者是运算速度如何。
所以我们介绍了假代码这个概念，
用外行的说法，是什么？
呵呵，是单词。
让我们在这个上面更深一步来看看。
肯定是英文单词，但是是为了干什么？
用这些单词来创建或者表示算法。
所以这世界上没有叫做假代码的这门语言。
而只是有你，用英语，或者你说的任何语言，
用一种粗略的标注来很简洁的表达一种意思。
但是我们会发现，对于一种英语的假代码而言，
并且对于那些由英语衍生出的程序语言来说，
我们会发现有一些固定的表示假代码的
或者程序代码的方法。
所以当你今天开始看到即使是最简单的例子，请意识到
有些规律会在下个星期再次出现。
所以伪代码是一种代表了
程序语言的语言。
我们看到的第一个写下来的例子是这个。
它只是一个三步的程序，目的是数
周三那个视频当中的一个寝室中的人数。
但是这个最简单的程序有很多有意思的方面。
而这将成为不断重复的主题。
那么为了辅助对于这个不熟悉的人，我们插入一个变量。
这个屋子里面的人对变量应该都有所了解
通过代数的学习。
但是在程序当中，变量可以
被叫做任何东西。
我们之前用n来数数
但是我们也可以用”数数“这个单词，或者任何
你喜欢的词语，只要是描述性的
但是它本质上只是一个存储信息的单元
它是一个记忆单元，一些比特，并且每个电脑不同，
那个变量由多少个比特组成。
但是我们可以给它设置内容。
目前为止，我们仅仅设置数字。
但我们也可以设真正的单词。
我们可以放段落。
我们可以放图片
其实可以放任何我们通过0和1表示的东西，
我们可以通过这种更高的变量的形式表达。
所以这个还是比较清楚的。
这个是第一行。
但是我们很快从第一行变成真正用那个变量
做些事情。
在第三行，我们更新N，我们增加N的值。我们可以
用很多种方法写这个程序。
但是最明显的可能是说把N设置成等于
N的值加1
这里我们看到了怎样实现增量。
同时，我们看到这里有个循环。
而这个也可能同样是非常直观的。
一个循环是一个程序中不断重复的东西，
一种圈的结构。
而这里的这个关键语句，对于每个来说，其实是在
很多程序语言中非常常见的，包括我们可能在这个课当中看到的那些。
只要你们见到for这个词，它一般代表了
一个循环，一个回环往复的过程要发生了。
这里值得注意另外一个句法细节。
第三行缩进了一些
通过敲击空格键几下，这是有意为之的。
因为人们的习惯是如果你一遍遍做一件事情的时候
在一个循环当中时，从第二行开始，你把一切属于哪个循环的内容给缩进，
只是为了表示清楚是第三行，而不是例如
第四或第五行，如果这里有第四或第五行的话
属于那个循环。
所以这个简单的缩进传递那个简单的道理。
那么我们现在把这个简单的算法用在几个例子上面。
还有这个，现实世界中的简单例子。
但是这个将代表你会如何
去测试你自己的不断变复杂的程序。
你尝试一些情景，一些代表性的输入，然后看你有没有
取得理想的输出。
所以这个例子有两个人坐在寝室里。
在左边是那个同样的伪代码
然后这是一个这个应用的最后几步的截图
把算法用在这些输入上面，当时屋子里面有两个人
当我们一步步执行第一行，第二行和第三行，然后再重复第二行
和第三行，然后结束--
在算法最后，我们确实是数了屋子里面的
两个人。
然后我们又试了另外一个例子。
然后我们说如果屋子里面一个人也没有呢？
这时候这个代码还正确吗？
它确实还是正确的。
因为正好第二行的条件没有通过，所以，第三行
不会被执行。
这句代码内容根本不会被执行因为他们在这种情况下不适用，如果
屋子里面一个人都没有的话。
但是这没关系
第一句代码将N的初始值设为0，所以即使是这段代码中的
一句最终起了作用，它最后还是给出了正确的答案，正如
最底部的那个橙色的0显示的一样
但是我们后来觉得这个算法有点缺点，
它运行起来挺慢的。
我们肯定可以两个两个数，2，4，6，8，10，
当我们在数屋子里面人数的时候
所以我们改了改这个算法，这个伪代码，然后让第二句当中
每两个人，进一步到第三句当中执行，每次
执行过程中增加两个
那个在数这屋子里面两个人的时候是可行的。
但是，当你仔细想想这个的时候，不需要多久你就
发现这个会出现错误，它在怎样的
简单情况下就发生错误了？
如果在这个屋子里面有三个人，或者大体上来说，屋子里有
奇数个人，包括一个人的时候
我们会数不到这个人，因为没有形成两两一对
所以我们很快地针对这个问题引入了额外的
程序结构到这个伪代码之中
这就是我们称之为的一个条件语句，或者一个树状结构
这个想要表示的意思，形象上来说是一个分叉的意思，一条路上面的分叉口
着这里你可以选择做这个或者，可能做另外一件事
确实，我们针对这个目标加入了第四行，使得代码判断
如果在最后有一个人剩下来的话，它把这个人算作一个特例算进去
那么你就差不多把他们作为一个特殊情况考虑进去，那么现在我们就可以
数偶数个人，也可以数奇数个人了
那么我们有很多种方法来表示这个
老实说，我可以在我选择的时候更加精益求精
在选择伪代码的语言表述的时候
但是至少这个概念的精髓已经被表达出来了
如果你把这段代码给一个不是从事计算机科学的，
或者没有上过计算机科学课的朋友看，他们有可能可以看懂，如果知道屋子里面有三个人的话
应该怎样遵照这些知识来数人数
那么这些基本上就是我们想通过伪代码想取得的完整目标
通过某种方法来标准化我们表达想法的方式
从而通过这些做更加复杂的事情
那么这些就把我引入了今天的对于真正代码的学习
我们今天就要开始编程，尽管实在一个便捷的环境当中
然后我们快速进入稍微复杂一些的语句，但是是一种
你会发现是基本上相同的句法，
和我们之前看到的其他语言一样
它将会只是看上去有点不同
所以我不会只是把这个叫做代码，我会更加准确一些
从今往后，在你写程序的时候，我会说你在写一个源代码
它有点像伪代码
但是我们会发现它在你对于词语的选择之上不像以前那样比较随便了
当你选择你想用的词语的时候
当你在使用某一种语言编程的时候，你必须使用一些命令，语句
和句法，使之符合别人决定的代表那种
特定语言的方法
所以伪代码的语言是由你决定的
但是一个真正的程序语言比如C，我们最后会发现，
是由别人来确定规则的
那么我们怎么来写源代码呢？
好的，我现在就来开始
我来先在这儿打开个窗口
我们会在下周更仔细介绍这个
这个是一个叫做计算机科学50应用的程序
我在用我的Mac运行一个程序，当然你可以做同样的事情
在一台运行windows的电脑上，这个程序会帮助我模拟在
我电脑的一个窗口上运行一个操作系统的感觉
我现在全屏了所以你看不到Mac的操作系统
这是一个叫做Linux的操作系统
它很流行
运行很快
有很大自由度，这使之很吸引人，
尤其是在广告界
我们会在这个学期后面阶段更多介绍这个，我们那时候会用Linux
来进行网页编程和运载真的网页和项目
那么现在，请记住这是一个设计成看上去有些
像Window和Mac操作系统的桌面
只是它又一些不同的名称和图标
但这就是我们说的计算机科学50应用，一个虚拟机器
从下个星期开始，你们将开始在一个窗口当中运行程序
用你自己的Mac或者PC
今天的课上，我将打开最简单的一个程序
它叫做gedit
然后这只是一个文本编辑器
它有点像微软Word， 但是更加简单
它其实有点像txt文本编辑器或者记事本
它只是一个很简单的可以用来在屏幕上面录入文字的程序
只是如果我用某些特殊的后缀储存文件
比如.c，而不是.doc或者是.xls之类
你熟悉的后缀，我实际上可以创建程序，即使是用这个简单的
文本编辑器
那么就让我来演示一下吧
让我先把这个文件先储存为hello.c
再说一句，这个用户界面将会很快地对你变得熟悉
但是现在，我只是在输入一个文件名
我将会把它储存在我的约翰哈佛主页目录里面
现在我有这个标签标示我真的是在编辑
一个叫做hello.c的文件
到目前为止还没有什么特别有趣的事情发生
现在开始这个将变得很密码化了
我来放大一些，这样你们看得更清楚一些
现在我会开始在上面打stdio.h, int main, void, open curly
括弧，1，2，3，4空格缩进，print f, 为了输出某些特定格式的东西
双引号，“hello, world”反斜杠，n，
引号，括弧，冒号，回车空格空格空格
空格，大括弧
我完成了编程
好的，这是一个很简单的程序，每个人
刚刚开始编程的时候都会做的
尽管这个有点复杂，但是它干的事只是
在屏幕上显示，什么？
你好世界
但是仅仅写一个程序是不足够的
所以这个是代码
这是在一个叫做c的语言当中的源代码
它现在被储存在一个叫做hello.c的文件当中
现在看看屏幕底部
再次说明今后的几周我们会更详细介绍这个
但是这是一个我们称之为的视窗终端
这是一个一闪一闪的黑白光标
这是一个传统的电脑界面，大体用于
一些没有鼠标或者其他图像元素的电脑之上
它只需要用你的键盘
然后我可以在这个闪烁的光标上面输入命令
然后为了今天的目标，我仅会输入以下
显示你好
然后这个程序就运行了，就像在如今现实世界当中
我们在上面双击一样
但是在今天这个界面上面，我们将会在这个窗口里面打上它的名字
make hello真的会帮我建立一个叫做hello的程序
它会查找一个文件，在默认状态之下，
叫做hello.c
它会假设我天生需要一个C程序
这个电脑的默认程式就是这样
然后我敲回车键
我看到一些密码表示的输出，但是这些将会变得
在短时间内过于熟悉
这个正好在那个时候运行一个或者更多个编译器，叫做Clang
但是现在，我只有一个另外的闪标
然后我现在打./，我会在
下周说明我为什么要干这些
你好
所以到现在干的事情只是为了编写一个最简单的程序
在我敲回车的时候，干这个事情
这样我就写了我第一个程序
我故意在这个程序上面找乐子是因为
几个原因
第一，你们可能很快就对这个课没有兴趣了
如果这就结束了的话
但是除此之外，这上面有很多干扰项
当你第一次学编程的时候，对于你们当中那些比较不习惯的人
甚至当年的我，当我第一次看到类似的东西的时候
你可能会觉得，好的，这是最后显示了你好世界
但是这里面费了很多劲
这屏幕上有太多语句
以至于它妨碍了一些其实很简单的信息的表达
所以我们今天要做的事就是把C放在一边
我们下周一再回头来说它
我们会用一个文字编程语言叫做Scratch
这是一个我在周三没有讲的程序语言
它会让我们可以做同样的事情但是不用那么复杂
不用理今天那些大括号，括弧，冒号还有那些愚蠢的
干扰人的元素，第一天看一些基本的比较
有趣的想法
所以为了那个目的，我会回到我的桌面
然后向你介绍那个程序的另一种写法
这将会看起来像这样
这就是我将怎样运行那个相同的程序，两个拼图块
当合在一起并被点击的时候，会向世界说
你好世界
让我们开始吧
我将打开一个网站叫做scratch.mit.edu
然后这将会把我带到这个网站
在此之前我已经登录过这个网站，第一个问题
当中我将会带你进行以下几个步骤
我来点击我的scratch文件夹
然后这个会显示一些我
之前创建的项目
其实这个程序语言不仅仅可以
让我们通过拖拉和放置这些拼图块来编程
你甚至都不需要特殊的软件
这些全部融合在一个浏览器当中，所以你理论上可以
在你自己的电脑上编程，可能你们中的有些人已经开始了
甚至不需要CS50应用程序，那个下周才到
我道这边的角上点击创建
等下我会看到一个空白的屏幕
我可以在这个屏幕上开始在一个图形编程空间当中开始编程
这次，干这个事会实际上简单得多
等一会，等网络完成传输的时候，我们在屏幕上看到这个
快速得给你介绍一下，但是我敢说，当你深入这
第一组问题的时候，你会发现这很
建议并且直观
让我们先在脑中大概想象一下
在这个下面的应用框显示的是保存更改，你会看见scratch
这是一个小精灵，
这是一个人物
它住在我们称之为一个舞台的地方，这个大的白色矩形
在上面它可以向上下左右移动，然后
做各种其他类型的动作
同时，在这个用户界面的中间，
我们有一堆拼图块
你会发现这上面显示类似移动10步，转动15度
指向一个特定的方向
但是这上面有分各种类型的方块
所以说如果我进入外观，你会看到有其它种类的拼图块
很显然会让这个人物说你好，去想，出现
或者隐藏
如果去我声音设置里面，那里有让你播放类似喵的声音的方法
停止所有声音，打鼓
所以长话短说，这里有一大堆可以帮助你
指导这个猫，或者任何数量的其他人物去做什么
但是为了使这些发生你需要开始编程
然后这边这个大白框或者右手边的黑框
是我实际上会拉放这些拼图块的地方
那相当于是我的等同于空白窗口的地方
那么我就去点击中间的控制键
或者，让我在事件选项下面开始
在事件选项下，你会注意到一些刻意
不同的形状设置使得它们无法合在一起
在拼图块的顶端
那是因为它们区分一个程序的开始
或者说一段文本的开始
如果我点击绿色旗子然后拖拽
我想让猫先说些什么东西
那么我先到外观控制面板
然后我拖拽说你好这个方块然后把它放置
让它自动拼接
然后我发现我可以在文字上面点击
然后我可以编辑然后让它更加具体，比如说，你好世界
现在我们就有了那个我说等同于那个
复杂得多的在C语言环境下的程序
如果我现在到左手边，请注意那里有个大大的停止标志
和一面大的绿色旗子
请让我放大以显示清楚一些
当我点击绿色旗子的时候，你应该能够猜到这第一
个程序会做些什么
那么这样我们在编程，但我们不会被一些东西干扰
在一些细致的句法和细节当中
让我们再试试一个更有趣的事情
让我进入我的Scratch文件夹
让我在这里打开一个单独的文件夹
放大这个窗口，打开文件，然后我来做今天
的源目录
和往常一样，你会发现，从今天起，今天的所有例子
都可以在课程网站上找到
我会在这里选一点不同的东西
这个我需要一个志愿者
谁今天想要盏台灯？
好，不如找个更---你在最后吗？
下来吧
好的，你想不想参加我们的活动？还是就想要台灯？
瓦妮莎：听不清
大卫马兰：好的
棒极了，你叫什么名字？
瓦妮莎？
我叫大卫
高兴认识你
上来吧，瓦妮莎会控制我的
键盘一段时间
为了节省时间，我意识到
无限网络有点慢，Scratch，我们这个编程环境
可以被下载下来在你自己的电脑上面使用
所以我在上课之前为了以防万一下载了
所有我们有可能用到的文件，这样它们就可以比
在我电脑上面运行得更快一些了
那就是为什么现在我看到了一个Mac专属的界面
我来打开这个
窗口全屏
你会发现我们可以很快地，像这个学生一样
你们的学长，从你好世界到一个更加有意思的
应用
这里是说明
哦，还有件事
我觉得这样可能有意思，因为我们平时
摄像都是朝着这个方向的
我觉得如果我们可以通过瓦妮莎的
眼睛看世界
所以这里我们有些谷歌眼镜
（惊讶的喘气）
我们今天只会送台灯
（笑声）
让我把这个设置起来
好的，先点这个
Ok, Glass，录一段视频
好的，瓦妮莎？
好的，现在题外话说一下，如果你
稍微向右上方看一下的话，你会看到真的镜片
你会看到一个矩形的窗口
你应该能看到你的同学们在被拍摄？
是的
瓦妮莎：是的
大卫马兰：好的
那好啦
我们迟些会放出这些影像
现在先把你的注意力转向屏幕
这门课的之前学生所做的是在屏幕上放一些指示
通过只是用一个画图程序
所以你马上就可以按方向键开始
然后一些拼图块就会开始在屏幕上出现
然后你只要敲方向键，就像在真的DDR当中一样，根据指示
让它们跟那些箭头方向一样
瓦妮莎：好的
大卫马兰：你之前玩过这个吧
瓦妮莎：是的
好的瓦妮莎，开始吧
（音乐 - 侃爷，“更强”）
（鼓掌）
大卫马兰：那我们现在从那个更进一步
显然，那才是最后的成果
你好世界不是最后的成果
但是你不一定要弄这么互动的东西
你也可以做动画
例如，你们之前的一个学生做了这个程序
比起创建一个游戏来说这个更是说了个故事
我们来打开同样的资料目录中的一个程序
从今天的目录中
让我来开始看看一个饼干的爱情故事
我不想把这个搞得太学术，但是当你看的时候，想想
我们今天讲的简单的编程概念中的哪些
到目前为止
变量，循环，条件之类，这个同学可能在
这些形象的表达当中用到了
请看
请看一个饼干的爱情故事
（音乐 - 绿日，“假日”）
(咔)
（音乐 - 乌龟乐队，“开心在一起”）
大卫马兰：好的，我们看到了一个饼干的爱情故事
但即使在那里 -
（鼓掌）
大卫马兰：好的，即使在这里，请想想，在这些心从
屏幕底部到顶部的时候，实际上是有一点点
随机性的
而事实上，我们可以看到，即使在 最简单的环境中，如
Scratch，就像在C语言中一样，你可以生成随机数，或者制造随机的
幻象，从而使这个游戏的趣味性更提升一步
比起你每一步都用代码设计好来说
在你们看到的这些动作中，有一些反应性
当男姜饼人碰到女姜饼人，她
看上去向远处移动了一点
因此，事实上，你可以在大多是编程语言当中实现
事件的概念，就是如果一只手碰到另外一只手，那可能触发使得
你的一些源代码得到实际执行
你可以在听到刚刚屏幕上的这样的东西
那么让我们来快速回顾一下一些我们能用到的基本元素
来实现这些目标
那么这里就是我们今后会用的语句
在Scratch当中的语句是紫色的，像这样
但是那是有任意性的
一个语句只是一块拼图，或者更笼统地说，一个指令，即
告诉电脑执行任务，一个声明。
这里有个简单的范例
说你好世界
另一种可能是等待一秒
所以在Scratch当中提供的这块拼图，会让你
的人物停止几秒钟
这也是一个语句
接下来我们有另外一个更有意思的，播放喵的声音，还有
这个小箭头表示在Scratch当中这是一个下拉菜单
所以你可以导入声音
你可以在Scratch当中录入声音并做其他一些有意思的事情
而那个，同样地，说到最后，也只是一个语句
但是现在让我们介绍一个更有趣的东西，我们称之为
布尔表达式
大写的B，根据一个叫布尔的命名的
而一个布尔表达式只是一个问题或者大体上说，
一条真或假的信息
1或0，是或否
所以它只是一个是非命题
所以这样的一个布尔表达式在Scratch当中看来是一块蓝色的
拼图
它在问一个问题，老鼠下来这个指令，可以是
当然，真或假
那么用Scratch中的这块拼图，你就能检测
一个老鼠是否被人拿下来了
一个和你的程序互动的人
这个有点抽象，但是那边的两个白盒子只是用来
放数字的
所以你可以比较这个数字是否比另外一个小
如果是的话，Scratch会执行这样或者那样的指令
这个更加图像化
如果这个小精灵，这个猫，比方说，实际上碰到了
鼠标指针
因此，如果小箭头在猫上面徘徊，那么这
块拼图将评估为真
这将是真实的，在这种情况下，如果你使用这个布尔表达式，像我们会
过一会儿看到的那样，在一个分叉，你可以要不做这个，要不做那个
就像我们有一个条件语句检查有没有最后一个人
在房间里？
如果是这样，添加一个
否则，别管它了
那么一个布尔表达式可以同时加上“与”语句或者“或”语句
所以你可以把布尔表达式结合在一起然后说这个和这个必须为真
使得整件事为真
这里是一个更现实世界的例子
如果你用了计算机科学50做课程选择，这些复选框
如果你选了课程边上的框当中的是选项
只向我现实Q值是4.5或者更高的
如果你取消它，选不，那就不用管它了
或者类似的，在右边选不和我所选的课程冲突
这可能是真或者假
这只是一个布尔表达式
所以当你使用网站复选框的时候，你只是
在切换相当于一个布尔表达的开和关。
那么你是用什么样的形式使用这些呢？
嗯，在Scratch当中我们会看到在莫一时刻的时候会有条件
跟这个类似
那是明智的因为跟伪代码很像，我们缩进了
这些类似U形的拼图块，意味着任何在那U形中的
内容被执行与否取决于它在哪里
因此，如果用布尔表达式，则里面无论是什么都会被执行
同时，这里有一个如果/或块
所以如果你想让一个分叉处产生选择，Scratch给我们这种方法
通过这样的逻辑，尽管拼图显然是太小了
如果要把其他东西放在里面的话，Scratch里面的拼图，他们
是可以变大的
当你拖拽过来东西并放在它上面时，它就会变化来符合
你想执行的操作
所以我们可以拿两样这种东西制造一个三项选择分叉
使得你可以做这个，那个，或者另外一个操作，通过嵌套他们
通过那种方式
当然，如果你做得太多，它就会开始变得不好看了
但是那时候你实际上有可能还不是编程编得很好
所以那将会成为一个不断重复的主题，风格方面的
问题在于你将你代码的格式弄得有多好
或者你有多好得设计你的代码
我们以后会谈更多这方面的问题
现在我们有循环
Scratch里面有一个很好的无限循环，它的字面意思就是做
只要在循环中的事一遍一遍再一遍
你也可以更具体得说，做以下的事情10遍
你也可以使用变量
你可以在那个下拉菜单里面写任何名字，然后说给我一个
叫做n的变量使它等于某个特定值
然后你就有功能了
我们等下再讲这个
让我再回到Scratch的界面
并让我继续
让我们打开一个，我看看，一个例子
一个更有趣点的例子
其实，让我自己来做一个
我不需要打开这个
让我去新建文件
我进入事件
我要去绿旗，点击，我进入声音
我要拖放一块拼图，播放声音喵。
它合在一起了
而现在，如果我点击绿旗
（喵的声音）
大卫马兰：挺可爱的
好啦，现在我们来做一点更有逻辑性的东西，只是为了演示
我们现在可以做这些
我要把这个从这东西上面解锁
我进入控制
我要拖一个条件
如果符合这个条件，那就怎样
所以那就是这个看起来是怎样的
所以我需要一个布尔表达式
让我进入操作
我马上准备做一些带点数学性的东西，只是为了好玩
我马上进入然后命令如果一个东西比另一个东西少，
那我们就执行一个命令
所以，现在，你看一个随机块
所以请注意，如果我悬停在这东西上面，那将卡在那里
所以现在请注意，我已经开始做一件逻辑上来说更加
有趣的事情了
如果一个1到10之间的随机数比，比方说6小的话
如果我选择6，那实际上就是说，做以下的事情有50%的
概率
这就像抛硬币
现在，我可以有条件地做一些事情
而我要做的就是播放声音
所以，现在，当我点击屏幕上的旗子时就好像抛硬币
（喵叫声）
大卫马兰：可能是抛到正面了（或者反面）
让我们再做一次
（喵叫声）
大卫米兰：又是正面
（喵叫声）
大卫米兰：又是正面
呼，好的
终于抛到反面了
因此，如果我们做这个无线长的时间，我们有50%的几率获得50%的猫叫声
和50％的不出声
那个只是一个基本的让我们做到这一点的元素
但是我需要不停地点那个按钮是有点繁琐的
因此，让我们把那些都拖走
如果你把它们拖到中间，它们自己就会删除掉了
让我再进入控制
选择永远
而这个时候，我要办一件有点烦人的事
（笑声）
大卫马兰：让我再次进入控制
等待一秒钟，为了让它不要太烦人
（猫叫声）
大卫马兰：那有点不自然
好的
（猫叫声）
大卫马兰：请注意，Scratch的好处是，对于你们中间那些
有编程经验的人，你不需要开始和停止操作
你不需要进行编译
你只需要改变它，程序会动态地适应它
因此这开始变得有点意思了
但是让我们更进一步。
让我们取消这个程序。
（猫叫声）
大卫马兰：那就是我们称之为一个Scratch当中程序错误的东西
他不应该还发出那声音。
所以我们会告诉他停下来。
好，那么现在我要进入
我会让麻省理工知道。
我们选择永远。
而现在，我想要一遍一遍地做一件事情。
我要进入​​控制。
我看看，我拖拽我的如果条件语句过来。
那么现在注意这个逻辑。
当点击绿旗，无限执行某操作，但是仅仅在
另外一个条件达到的情况下才做这件事
我会选，我看看，传感。
然后我会选触碰然后把它放在这。
这是一个布尔表达式。
而现在请注意这个下拉菜单里面有
一些预定义的值。
所以我可以说，你碰到屏幕的边缘了吗？
或者，你碰到了鼠标指针，屏幕上的这个箭头了吗？
我准备做这个。
如果是这样的话，放猫叫声
那么现在我差不多有了一个游戏的开始阶段
一个比较可爱的游戏。
（猫叫声）
大卫马兰：好吧，一个可爱的，有程序错误的游戏。
让我们稍等一下。
好的现在再次播放，点击绿色旗子。
（猫叫声）
大卫马兰：那么现在就像是拍一只猫一样。
（猫叫声）
大卫马兰：好的，在这个里面我确实更进了一步。
最近好像很容易做错事。
让我再进入这里。
让我们把这个命名为拍猫。
现在让我们打开不要拍猫。
现在如果我们播放这个的话，你能猜到，如果你
看这这个屏幕的话
（猫叫声）
大卫米兰：好的，如果现在我拍到猫
（狮吼声）
大卫马兰：所以在这种情况下不要去拍猫了。
那么现在我们有一个一个分叉到两个方向的例子。
现在我打开又一个。
这一个也是在我们今天的源代码文件里面的。
让我回到我的源目录，然后选择
这个看看有什么不同。
哇，好的，现在这个开始有点更复杂了。
在我们看到这个可以干什么之前，让我们试着通过程序来猜测，
右手边的程序。
现在我们可以看到Scratch允许我们有多重文字，好几个
程序和一个人物相关，同时明显地，
它们在运行的时候会步调一致。
因为这两个程序都是由点击绿色旗子这个动作触发的，这是
在考虑一个更加高级的课题，你们中间的有些人可能会比较熟悉，
称之为线程，或者多线程。
你会发现，总而言之，今天的计算机可以做多
件事情，在同一时间。
或者可以很快地一件件做事情以至于你根本觉察不到
那其实是在一次做一件事。
但现在，让我们假设这两个程序会被执行
在同一时间。
请注意，它们两个都有永远这个条件。
因此它们都会在我点红色的停止标志之前一直运行。
那么这些指令能达到什么目的呢？
我很明显地在左手边显示了一个变量称为静音。
所以我没有管它叫N那么无聊的名字，我管它叫静音
这样可以在名字中有意思。
我将它设置等于零。
让我们把这个想象成假，或者把那个想象成假。
现在，无限重复执行以下。
如果按下键盘的空格键，如果这是和静音等于零的话，
将静音改变成等于1。
否则，静音设置为零。
所以从逻辑上讲，即使这是一堆拼图块
只是说，当我打空格键，我应该对变量执行怎样的命令
那个叫做静音的变量？
将它从1变到0，或者从0变到1。
就这么简单。
因此它就像是把一个灯的开关打开或者关闭并且记住这个动作，利用
一个变量，我已经做到了。
同时，在右手边，用门外汉的说法，这个的用途
右边脚本的用途是什么？
学生：播放海狮的声音。
大卫马兰：播放海狮的声音，如果它没有被静音的话，
根据那个变量的性质来说。
因此我们可以说我们是在共用一个状态，或者说，在共享信息，在这两个
脚本之间，引文，你们请注意我们在无限循环地做以下的事情。
如果静音是0，那么它就不是静音的，如果静音为假，那么就播放
海狮的声音。
然后给自己提个醒，稍等两秒钟，然后
再次检查。
因此如果我们现在到左边看，到这个东西的位置，然后点击
绿色旗子，
（海狮叫声）
大卫马兰：这个在什么时候会开始变得讨人嫌了呢？
因为这将只是永远持续下去。
所以有时候，所谓的无限循环，是故意的。
但是，在这种情况下，只要我敲击空格键，它就会停止。
现在这个程序还没有退出。
它仍然运行在这些循环中运行。
但是，如果我再次敲击空格键
（海狮叫声）
大卫马兰：它会继续开始发出声音。
因此，我们又有了一种重复做一件事情的方式，但是这次
是有条件限制的。
好的，当我在一遍遍做事的时候，让我
再举一个这样的例子。
这个我叫做数绵羊。
请注意这个东西能起什么作用。
它实际上更像是我们接触过的伪代码
在周三时候，我们介绍了这个东西作为一个数数的工具，再次把它想象成N
为0的时候，它永远执行以下动作。
它显示以下计数器的值，然后等待一秒，然后
改变这个计数器的值一个单位。
在这个情景夏，这个意味着它使得N的值增加了。
所以他往上面加1。
因此，这实际上
并不是我们所想象的数绵羊的活动。
这是羊在数数，从零开始一直数。
所以从逻辑上来说我们可以在这儿做类似的事情。
但是现在让我试着把这里面的一些事情弄得清楚一些。
让我现在打开一个简单的例子，在这里面我们的猫会
开始咳嗽。
好的，现在这里我们有咳嗽0 -
计算机科学家一般从0开始计数。
因此，猫只是要咳嗽三次。
而这儿是我如何执行这个的。
当点击绿旗子的时候，咳嗽，等待，咳嗽，等待，咳嗽，等待。
而为了做到这个我只是拖拽和释放了一些拼图片而已。
当你开始在Scratch上面做些东西的时候，你会发现其实
你实际上可以复制拼图片从而使得你可以更快地做事情而不用拖拽
和放置到让你觉得烦躁的地步。
但是我们现在是在很好的方向上。
因为我怎样能让他咳嗽第四声？
嗯，我可以往下面选。
我可以复制然后在这里黏贴。
我如何让他咳第五次？
那么，再次复制和粘贴。
或再次拖拽放置。
很快这个程序就会变得非常冗长，
很长，但是很无趣。
但是有一种方法可以解决这个问题。
有什么明显的办法可以把这个程序清理一下？
好的，其实我们可以跳出这个程序，然后点击空格
键，然后让他咳嗽。
但是如果我只是想重复做一样事情的话，请记得我们确实有
一些控制结构。
让我把这个移开，进入控制。
让我来弄一个，比如，三次重复。
现在让我拿一些这里面的拼图块。
让我把这个放在这里。
让我把这些都挪开。
现在我就有了一个设计得更好的程序。
为什么呢？
如果我想改变猫咳嗽的次数，我所需要做的只是
改变一个变量，或者一个值，把三改成四
或者五或六。
或者我身子可以做一些有有条件的，用空格键
如果我想的话。
那么这是一个总的规则。
一旦你开始复制和粘贴代码，无论是在Scratch当中，还是在
C当中，你很有可能有事情做得不对。
或者至少，一旦你超过了一些合理的复制次数之后
和粘贴，你有可能有什么事情干错了。
但你知道吗？
我当真不喜欢这个。
这还不是最简洁的设计。
我希望可以有一块拼图叫做咳嗽，这样的话我就
不用自己通过老办法来实现这个了
一定要，比如说，等等--
假如它们只是一块咳嗽拼图呢？
嗯，我可以实现那个。
让我进入更多模块，点击创建模块，现在我得到这里这个
窗口。
我来把这个东西命名为咳嗽。
我点击确定。
现在请注意，我有一个心得起始拼图块，上面有弯曲的。
现在我要用这个做的事情就是，我会偷走这些块。
我把它们放在这里。
现在，用这三块，我已经实现了我称之为
方法，或一个过程，或者你们中有些人可能会称之为一个手法。
用词上的细微差别。
但是现在，让我们先称之为一个方法。
这只是一个新的拼图块。
现在它是这样被实现的。
但是请注意Scratch给了我们一个对于那一整块的
具象表示。
现在，我把这个拖到这边，比如，重复三次，那么
这时将要发生的事情，当我运行这个脚本的时候，是只有一次
只有一个程序在运行。
当点击绿旗的时候只有一个。
但是那个紫色的叫做咳嗽的方块有效地告诉Scratch，每一
次你看到这块拼图的时候，真正执行这些步骤
我之前手动执行的这些。
那么这样就整洁得多了。
但是现在，假设我决定我不要这个猫只是咳嗽。
我希望它也能打喷嚏。
那么，我们怎么能实现打喷嚏呢？
好吧，我差不多可以重复同样的事情。
我可创建另外一个模块。
我可以把这个叫做喷嚏，单击“确定”。
接下来，在这边我可以实际上有，让我来复制这个--
而这就是你应该感觉到你有可能不是在用
最好的办法做有些事情。
我可以花一秒钟说啊嚏，
等待一秒钟。
现在我有了一个新的块叫做喷嚏。
实际上，它就在那里。
但是这个同样，会开始显得，可能不是这一周，但是
下周时你会感觉到有点多余。
显然，这儿的有些步骤有些多余。
因此我提议我们转而将这个定义细化如下。
让我回到我的文件菜单。
我不保存这个版本了。
我进入我之前做好的文件之一。
我打开咳嗽2
哎呀，那是咳嗽2。
让我打开咳嗽3，是个源目录。
咳嗽3及通告。哦，我刚刚讲的故事顺序错误了。
让我重新回到这个故事中来。
我想讲的故事以咳嗽4结尾
找到了。
那么如果我另而将一个更大块的拼图定义为
说一个词n次。
很显然在Scratch当中打喷嚏的声音是阿嚏
我们把它当做一个词来表达，只是因为那是
程序的约束。
咳嗽的声音是（咳嗽），但是咳嗽的英文单词，cough的拼法是C-O-U-G-H。这么看来这两个
不同的词其实是在做同样的事情。
所以我其实可以建立一个像这个一样的新块。
我之前没有使用过这个菜单选项。
但是当你点击创建方块时，你可以选择一些选项。
你可以让这个块实际上需要一定的输入，或者叫做
参数，这样你可以修改你方块的
动作。
那么我刚刚做的事情是把这个方块叫做说
让后我说，它需要一个字符串输入。
现在注意，在默认情况下它说串1。
一个字符串就是一个词，或者一个短语，为了达到一个目的。
但是我现在就仅仅准备放一些占位符在这儿，就像在一个
网站上，当你看到用户名，或者密码，然后它就消失了
当你开始打字的时候。
这就是这些占位符。
现在我要加上一个数字输入。
我会把这个叫做n--但是这是相当随意的。
只是加上一个标签，只是为了使这个方块更加有自我
说明性--
次数，这是我刚刚做的
而最终的结果是，我得到像这样的一个块。
现在请注意，我用一个重复的方块。
但是我并没有完整地编程出三个，我只是在里面拖拽和放置n使得我
可以让这个功能参数化。
我可以让这个功能做一件事情不同的次数，基于
那个值。
请注意，如果这是我做的事情，如果我拖一个词，我可以说不是一个
编好固定的词，而是任意一个传输进来的词，持续一秒钟。
同时，我怎样重新实现咳嗽呢？
我重新定义咳嗽为说咳咳n次。
简单来说，我很快地做这些步骤，但是最简单的想法是当你一旦
开始在你的程序中间看到，等等，我之前
已经做过类似的事情了，我能否找出一些共同的
功能？
我能否把我在做的事情分解成一些基本的概念？
那就是我们在做的事情。
而且我已经把这些东西在视觉上重叠堆砌在一起了
因为它证明了那种从二进制开始的想法，进入ASCII，
编写图形程序，把日益复杂的思路放在之前的思路
之上。
这也是同样的道理。
我从操作Scratch开始，设置咳嗽，然后我发现咳嗽
其实只是说什么东西。
那么请允许我另外施行说什么的概念。
与此之外，我是否可以实现打喷嚏或咳嗽？
我们还可以做更多的类似变化。
从这个基本原则开始，我们可以开始做
日益复杂的程序。
让我开这一个。
我们其实可以有多个精灵同时在屏幕上交互。
我进入我的源目录打开一个叫做线程的，请回忆一下
所谓线程只是两个脚本一起运行的能力
在同一时间。
现在请注意，我们同时有一只鸟和一只猫，它们都有
各自的脚本。
因此请注意，当我点击猫的时候，我得到这些脚本。
当我点击鸟的时候，我得到这些脚本。
所以这些家伙都有它们各自的程序。
当我现在点击绿色旗子的时候，请注意这个程序执行的
是让这个猫很慢很慢地追这个鸟。
但是因为编程的原因猫有一定的优势
使得无论鸟在哪里，猫都向它移动过去。
我们可以以更快的速度玩这个游戏。
如果我在操作猫，请注意我用的是，移动一步
我们让它一次移动五步，所以一次移动五个点。
让我单击播放。
（狮吼声）
大卫马兰：好的，现在我们可以真的给猫一个优势。
一次走10步。
（狮吼声）
大卫马兰：好的，所以很快地，我们来给一些优势
给这个猫。
但我会对这其中的一些细节说不。
路径每次开始有些不同的原因是
我加了一些随机性。
我实际上是把这猫往不同的方向指引
根据我每次想让它开始的不同的方向，那么这个游戏，或者这个动画的每一次，是有
一点点不同的。
现在，让我介绍一个另外的结构。
在这个情形下，我们有功能。
同时也会有一块拼图被称为一个数组，或一个列表
它允许你在一个变量里面储存多个值。
我们看到线程，而现在有事件。
那么现在有一个用到这两个人物的事件。
如果我打开一个叫做事件的文件，从今天的例子里面
我们会看到一个看起来有点像这样的程序。
现在注意这个家伙
注意到我先点击蓝色布偶
他只执行以下操作。
他没有那种跟绿旗关联的拼图。
他有一个当我接受到事件--
然后随便说些单词。
我只是在这个地方打了事件-
他会说波罗两秒钟。
你们当中那些熟悉这个游戏的可能知道
这个下面发展的方向了。
如果我现在点击橙色的布偶，他的程序会做这件事。
任何情况下他会说马克，如果空格键被按下的话。
在屏幕上两秒钟的时间。
但他会使用这个更华丽的叫做广播的模块。
他会播出所谓的事件。
同时，在这个蓝色的人物，请记住，会听所谓的事件。
那么这样的话我们会有两个人物交互。
当我们在这学期后面阶段接触到网络编程的时候，也会同样地
有好处，如果你让你的网站对一些做出反应，比如
敲击键盘。
让我敲一下空格键。
橙色的家伙说马科。
蓝家伙说波罗。
如果我这样做，再次橙色的家伙说马可，蓝色的家伙说，波罗。
所以，让我们再进一步。
这次，我们花个几分钟的时间。
我们有没有
台灯，下来吧。
你就在边上的。
好的，你们都可以上来。
我们有为大家准备台灯。
来吧。
尽管我不知道我们能不能把这噱头
坚持一个学期。
好吧，下来吧。
同时，我们有这个例子来展示，
只是为了加快节奏，我们有一个从另外一个
之前学生那里来的，用了同样的基本元素的作品。
你叫什么名字？
约翰：约翰。
大卫马兰：约翰你好。
高兴认识你。
你呢？
塞兹：塞兹。
大卫马兰：塞兹，幸会。
约翰，入股你想先来的话。这是一个老
游戏名叫跳青蛙。
你可以用键盘控制这个。
目标是到街和水的那一边去。
（青蛙人音乐和声音播放）
大卫马兰：对不起，今天台灯没你的份啦。
好的，塞兹你来吧。
好的，我们再来一次。
塞兹：我用方向键吗？
大卫马兰：是的，只用方向键。
上，下，左，右。
（跳青蛙音乐响起）
大卫马兰：我们今天把这些称为翻译奖。
好的，做得非常好。
好的，这是给你们的，约翰和塞兹。
恭喜你们，好的。
再一次，当这个游戏进行的时候，想想具体是怎么回事？
第一，这儿很明显有很多动作。
但是我们已经看到了通过猫和鸟的例子，你可以制造动作的感觉，通过
只是一次又一次地移动一些像素的距离。
如果你有一个无限执行的方块，
你可以让这些车一直这么执行下去。
我们可以有一定随机性。
那么这个游戏不一定每次都一模一样。
那些圆木，车子，可以在稍微不同的时间启动，使得
这个游戏的效果更加有趣。
同时，我们看到了接受空格键控制的能力。
但显然，在Scratch当中，你也可以用上，下，左，右发挥指令。
键盘上的任何键都可以。
而且你还可以做一些其他的事情。
让我回到网络版。
让我进入我们的例子库。
在我的工作室之下，有这些视频，本质上是一个文件夹
在scratch.mit.edu这个网站上。
我们有所有这些项目的网页版。
让我看看我能不能让我的电脑合作。
只是我们在麻省理工的一个朋友写的程序。叫做移动的蝴蝶。
一旦这个打开，这会需要用到更多
我电脑的硬件。
Scratch是用Flash播放的。
Flash可以开启你的网络摄像头，如果你有的话。
那么如果我把这个全屏，点击绿色旗子，请注意
这个Flash的安全通知问
你是否允许我是用网络摄像头？
通常你应该说拒绝。
但是这种情况下我们允许。
让后我让Chrome也允许这个。
现在，很快你能看见，是的，我。
如果我的手往上移动的话。
我不能同时也动我的头。
还有一个倒影在屏幕上。
好的，这下好一点。
你可以把它在屏幕上面移动因为这儿有拼图的程序，哦，
我知道是什么原因了，因为你们还呢过看到我身后的投影屏幕。
这下子成了一个套一个了。
好的，我把这个角度调一下。
这下好了。
那么有一块拼图说当你看到有动作在
物体下面的时候，你可以让它上下左右地移动。
因此我们有了一点虚拟现实的感觉在这里，全部都在
我的浏览器里面就能做到，只是使用我的网络摄像头而已。
还有什么事情呢。
第一个联系，你们会在等会网站公布的内容上看到
今晚在cs50.net，是相当开放式的。
实施一个你自己感兴趣的Scratch的课题，一个游戏，
一个互动，一些艺术性的东西，然后挑战你自己去用任何数量的
这些拼图。
它可以式像这样互动式的。
或者可以是这样设计成讲一个故事的。
最后，我们今天差不多说到这儿啦，最后一个例子。
让我们进入本地版Scratch。
让我打开这个，然后最会运行一个你们
之前的学生写的程序。
好的，这个音量提高一点。
（音乐播放）
旁白：下一节计算机科学50，大卫请了一名自愿者上台。
大卫马兰：这个演示，我们需要一名志愿者。
你想下来吗？
你叫什么名字？
接下来。