欢迎来到CS50 今天是本学期第一周的开始
而我们想做的 是向你们展示
一个你们也许每天都会遇到 但并不真正了解
它是什么的的设备
这个设备你们现在大概都很熟悉
[播放视频]
这个是数学与机械技术的巨大成就
在哈佛大学的全新自动计算机
把编码后复杂的数学问题通过磁带放入这台机器
问题就会被正确解决 而所用的时间仅为人手计算
的千百分之一
为了加快所有类型的数学与科学研究
这台巨型大脑会为美国海军工作
直到战争结束
[视频播放结束]
这就是你们可以在
哈佛科学中心看到的东西
实际上 你们看到的只是它的一部分
展示出来的只是机器的一部分这台设备叫做
Mark I，而它本质上就是一台巨大的计算器
它的下一代是Mark II 从Mark II身上我们
真正开始可以学到一些词汇
这个视频是首次记录下的东西 你们在
本学期的课程中会逐渐了解
这样东西 就是故障(Bug)
某一天 Mark II无法正常运转
在仔细检查过后 人们发现 确实有个故障(Bug/昆虫)－－一只蛾子
那只蛾子
在机器里
从那之后 我们就将程序中的问题叫做故障/昆虫
关于这我们以后还会讲到
说到视频 如果你们还不知道的话 CS50
会被录下来
在一节课结束后 我们一般会发布一个经过
初校的版本 一两天之后 我们会上传一个更高清
也更高质量的版本
你们也许记得Vanessa 就是先前体验了Google Glass的
这一次我想起来向她收费了
所以如果课后你们也想要体验一下 今天应该是可以的
如果你们想知道Vanessa那一天看到了什么
让我把我笔记本电脑的声音调高些
[视频回放]
让我把它调好
好的
所以碰一下它
好
好的 Glass
录视频
好的
Vanessa?
[视频回放结束]
好 所以在课程结束后 你们当中的大多数人
都没法体验的原因 就是因为我把Glass放下后
又录了一个小时的视频 都是录的我自己
所以今天 我会把它关掉 不过谢谢Vanessa
这么好地配合
同时 在继续今天课程之间 我有一些通知
首先 CS50的一项传统 就是尽我们所能
让这么大的课堂变小
为了达到这个目标 基本上每周五 我们会
在哈佛广场边上的Fire and Ice 餐厅聚餐 每周会有30－40个学生 我
一些助教参加 非常轻松的午餐
我们经常会邀请业内的朋友 上过这堂课的校友
学校的校友 来聊聊天 讲一讲在学校时
及从学校毕业后的生活
所以如果你想参加第一场聚餐
会在周五下午1:15举行的话 请点击此链接
位置有限 所以先到先得
但是我们会经常举办这个活动 所以如果你没能参加这一次聚餐的话
也不用担心
现在 说到这门课提供的课程资源
真的很多 而且如果你还没有上课程网站上看过
在"讲课"条目下的话的资源的话 你能在
视频或者其他电子资源中
找到我们上周所做的所有事
除了视频 你也会发现 所有的讲课都有
全文文本可以看
所以如果我们回到视频有Vanessa的这里
然后看一下屏幕的底下 实际上 不是周五的课
让我们看下周三的课 因为这项功能
需要一些时间才能完成
不过好歹你们能够看到我 或者志愿者们说的每一个字
不仅如此
你还可以搜索它 你可以随便点击一句话
跳转到视频的相应位置 这样我们的资源就
更容易操作使用了
不过如果你不想要这么仔细地去看 你会发现
这里有一个小菜单 上面写着 1.5倍速 2倍速 或者如果
你觉得我已经说得太快了 0.75倍速
所以请记住有这些功能你们可以利用
除此之外 在每堂课中 我们也
给大家提供很多资源
幻灯片 代码示例 所以我在台上演示的 或者在课前做好的东西
我们都会提供给大家 这样你就可以在家或者在课堂上使用它们了
不过我们想到 今年我们会首次尝试
给大家提供如何使用这些示例的教学
我一直都在想CS50课堂内容价值在哪里
我在想你们现在这样坐在这里 看着我站在这儿
跟你们讲话 当我们的材料 我们的示例
变得更复杂的时候 究竟多少用
因为不可避免的 在一段时间后 有些人就会走神
然后你就会错过一些示例的关键点 而课程接下来的部分
你也就没法跟上了 这并不是时间的
最佳利用方式 不论对于你还是对于整个课堂来说
所以我们想要尝试的 特别是针对一些
比较复杂的示例 因为我有可能没法面面俱到
或是我没有足够的时间去讲解时 或是你们听的时候正好走神了
对于这些示例 我们会做一些教学 所以如果你们去看
上周五的视频页面 在"示例"一栏底下 你会发现
在周五的课程下 有一个链接指向"教学"
它们的形式会随时间而变
当下 我们在用You Tube视频播放列表
但我和我们的制作组之后会做的
是为每一个示例都制作新的教学 希望我们能更
清晰地指出 从每一个示例中 你应该能学到什么
所以你会发现 上一周 我们在课上讲的所有的Scratch示例
都按时间顺序列出了
所以请按需要自行取用这些资源
说真的 这门课的一个主题 就是
多种多样的资源
会比你一学期能学到的都要多
但这是有意为之
我们希望你们每一个人 基于自己的学习习惯
都可以自行选择
所以如果你觉得课堂上的讲课对你有帮助 非常好
如果小班课适合你 也很好
如果示例教学更适合你 也很好
真的 就看你觉得哪一种形式更适合你
最后 感谢一位这门课的校友 我们还会提供
课程的官方版笔记
所以你们不用低着头飞速记下
在课上听到的东西了 我们会为你们提供
我们认为最重要的笔记 这样你们在课上就不会分心
也就是说如果你在课堂上真正想投入 你就能真正投入
有时间看看课上在发生什么 你的同学们在台上做什么 屏幕上在放什么
而不只是把我说的话记下来
所以请记住所有这资源你们都可以利用
回答一位同学的问题 小班课 这周三会开始
我们会等到其他课都定下来后再开始
这样我们就可以减少要做的改动
不过这周末 从周日开始 会有一场仅有一次的活动
我们把它叫做超级讨论课
我们会把它录下来 这样无法参加的人也能看到
这门课的助教们会帮大家了解这门课中C语言的部分
在第一个练习 也就是我们的第一个C语言练习
布置下来的时候
我们会有非强制性的小班课程
而每周 我们超50个助教们
还会带内容相同的小班课
在周日 周一或周二 我们有90分钟 非常传统的小班课
可以让同学们实际操作
以及加深对课程材料的理解
不再赘言 让我向大家介绍这门课的核心班底
他们和我一样 位居幕后 让一切得以实现
Rob Lauren Joseph和Lucas
他们都为这门课辛苦了很久了
RJ是我们团队的另一名成员
他今天不能到场 但是他叫我带一张他的照片过来
我不知道他是不是想要我带这张 不过这就是他
请让我们的团队和大家问好 并介绍一下自己
这样你们就不仅认识自己的助教 也认识他们了
大家好
我叫Lauren Carvalho
我是Leverett宿舍的舍管
同时 我也很高兴今年能当CS50的核心助教
CS50很有挑战性 而且课堂上人数很多
所以你们如果有任何疑问 如果觉得自己掉队了
你可以联系我们当中的任何一个 只要发邮件至heads@cs50.net 或者你也可以联系我
如果你想和我的金毛狗宝宝玩的话
这是Lucas
大家好
我是Lucas Freitas
我现在大三
专业是计算机与语言学
我来自巴西 但我对东亚研究也有兴趣
所以如果你对计算机或者语言学
或者任何什么事有问题的话 请尽管问我
当然 特别是对CS50的问题
大家好
我是 Joseph
我今年大四 专业是计算机 住在Elliott宿舍
嗯 就…
你们会看到我带着一个那种特别大的相机在旁边
我是CS50的摄影师 而学生们
经常以为我是个亚洲来的游客
所以 如果你们看到我带着相机 请不要跑开
只要微笑就行了 不用害羞
我希望你们会喜欢CS50
我上这个课时就非常喜欢它 所以我已经
当了三年助教了
大家好
我是Rob
这是我第四个学期教CS50了
我五月刚刚毕业
原来住在Kirkland
我对这一学期感到很兴奋 我希望你们也一样
谢谢今年的核心助教们 当然 还有RJ
关于资源 我还有几点要提下
首先 练习0已经在发在网上了
这个练习只有一个版本 也就是说 这是给
这是给全班人的
从练习1开始 大多数的练习都会有黑客版
这种版本会增加一点挑战
但涵盖的内容是相同的
请上课程网站看一下练习0的具体要求
这星期 办公室时间也会开始 今晚 明天和周三
周四则是在校园里众多个食堂
请点击cs50.net/ohs查看办公室时间 而且要知道
这是个非正式的场合 在学期开始的时候
你的头脑需要休息一下时 你可以带着笔记本过来
带上几个朋友 和课程的助教及助理聊聊天
有什么问题 都可以问
我必须再次强调 就算是针对Scratch和练习0
也没有什么问题是蠢问题
作为学生 没有什么问题是不好意思问的
请好好利用这项资源
这学期 办公室时间会一直开放
CS50 论坛 也一样
这是课程的网上论坛链接在这里
得益于我们的教学团队
我们在上课时也会同时关注这个论坛
所以如果在课程进行中你有问题 因为我有东西没讲清楚
或者根本没讲到 请一定即时在网上
用你的笔记本 手机把问题问出来 我们会尽力在当下就
回应这些问题
对CS50还有什么问题么?
最后一点
修课时选择 过 /不过 这个问题
在你们最终确定学习卡时 你们会发现
所有学生都可以选择过/不过
而这个选择其实是为了帮助人适应像CS50这样的课的
也就是说 如果你发现自己在半夜2点 3点仍在苦苦纠结
因为你离成功只有1%了
但你却还有很多其他的事要做 我想最好利用时间的方式
是去完成其他那些事
这样你可以最有效地利用你的时间
而选择 过/不过 就可以让你安心 因为你知道
99%的情况下你都做得很好了
同样 如果你在上这门课前没有任何背景知识
或者你觉得你了解的不如你的同学多
不管怎么样 这都是一个让你切身感受
实际体验课程 勇敢尝试 就像
我许多年以前 上课时选择及格/不及格一样
就像我上周所说的 如果这门课像其他课一样
不能用及格/不及格修的话 我也许就不会上这门课了
虽然我在上了五星期后就改变了主意
换成了等第成绩 当然 你们也可以这样做
好的
所以我们上这周看了这个 而今天我们会马上
来看一些更难懂的东西
不过基本的想法还是一样
我们用什么词来形容
这样的一片拼图呢
一个语句
你可以管它叫很多东西
不过我们就叫它一个语句好了
一个语句可以告诉程序
或者在Scratch里 告诉sprite
去做某件事
在这里 是说大家好
那这个我们叫做什么呢?
没错 是个布尔表达式
布尔表达式只有真假两个取值
所以Scratch将它们画成这个形状 而且加了一个问号
表示这个问题的答案非真即假 是或者否
1或者是0
我们把这些布尔表达式放在这种建构中
这种建构叫做
条件 或者 分支
而在Scratch里的这个条件 有个位置可以
放刚才的种形状 这个位置可以让你
把布尔表达式拖过来 然后告诉程序
如果布尔表达式是真的 那么就执行这一组命令 这一组语句
否则 就执行另一组命令
而且要记住 你可以嵌套这些东西
尽管视觉上来看 这片拼图上没多大空间
但是Scratch会放大或缩小你选择的拼图
这样你可以通过嵌套得到一个三叉路口
if(如果), else if(否则), else(其他情况)
你可还以继续不断嵌套
所以最后 我们会看到这样一个建构 也就是一个循环
也就是说 它会不断重复做某件事
在这里 它正好会执行有限次
但我们也看过一个例子 那里面执行的次数来自一个变量
所以它会变
我们还看过一个永久循环块
它会让我们无限次循环
所以Scratch 2.0有的另一个建构 那些已经
已经懂得一些背景知识的人应该
对这个建构已经很熟悉了
我们把这种东西叫做什么
我们把它们叫做功能 也叫做子程序
字义上来说它们有一点点不同 不过我们就叫它们功能 好了
在Scratch中功能 是一片自己定制的拼图
你可以自己造出一片新拼图
在这里 它叫做 cough 会出现在其他
Scratch中已有的拼图中
MIT没有造出这一块拼图 造出它的人是你
所以一个功能可以让你创造出新的动作 你可以为它命名
然后去使用它
真正地在程序中 一次又一次地使用它 让你不用
等着MIT之类的在Scratch中开发新功能
你可以自己造出一片片拼图 然后
在你自己的程序中重复使用它
我们会在今天及以后重复看见一个相关的例子
所以在今天 我们会转向一些更复杂难懂的东西
但也是更有用 更有表现力
更能代表我们本学期前进的方向－－
学习不同的
表示代码及源代码的语言
实际上 源代码 不是电脑
一般会运行的东西
源代码看上去是这样的
所以这大概是我们用C语言写出的最简单的程序了
我们马上会把这个程序拆分
如果现在它看起来还像希腊文那么难懂的话 相信我
一两周之后 你就会觉得它再熟悉不过了
而这也很有代表性 代表你们将会不断适应
越来越复杂的例子们
但通常 你不能直接跑这个代码
你得将它变成电脑能读懂的东西
所以 我们需要一个叫做 编译器 的东西
编译器是一个将你们刚刚看到的源代码
输入 输出0和1
也就是目标代码的程序
那些0和1
就是最终能被你的Mac或是PC读懂的东西
如果你听过因特尔公司的Intel Inside广告运动
这是说一家叫因特尔的公司 制造了
你电脑的大脑
也就是CPU 中央处理器
而它读得懂
0与1
将源代码转换成目标代码的这项过程
我们马上会通过一些命令来完成
而你会得到一堆0与1 它们代表着特定的语句
而这是由因特尔的员工们决定的
现在 我只是看一眼这些0和1的话
我并不知道它们代表着什么
当今大多数人都做不到
但在其中 有一个排列代表着
打印输出
某处也有另一个组0与1代表着
永久循环或者重复10次或者甚至是 喵
如果那也是一个能包含声音的程序的话
长话短说 人们决定 就像我们对ASCII做的那样
--上周我们讲到的字母--人们决定
用更复杂的0与1的排列来表示更复杂的动作
例如打印输出 或者说话 或者 喵
所以今天 以及今后的课程中
我们就默认已经有人知道两者如何匹配
我们 虽然知道我们站在前人的肩膀上
但却还是认为这一切都是
在魔术师的斗篷下神秘进行的
但我们更感兴趣的 是如何在前人的基础上
创造更多有趣的东西
我们在Scratch中写出的第一个程序 就是这个
特别简单的 hello world
你可以把它看做 上周五支配Scratch行动
的主要程序
今天 我们会开始把Scratch中的拼图翻译成
用C语言写出的源代码 这样一来 上周五看上去是这样的东西
从今天起 就会是这样了
当然 也更难懂了
看着这么多引号 分号 括号 确实很容易
让人分心又糊涂
但如果你不去看那些你不懂的 而是
关注其中的精华的话 你一定像我一样 会看见
hello, world 这句话在上面是一个紫色的语句
而关键词 main 概念上来说 就等同于
"当点击绿色旗子时"
也就是说 在Scratch中 我们执行了 hello world 这个程序
用了两片拼图 而在C中 我们要用
这四行有些难懂的话来执行
但若我们更深入地研究一下 你会发现这些白色的字
每一个都有重要的含义
而大多数我们的程序也都会看上去与之类似
所以一个语句 也就是在周五看上去还是说 hello world
的东西 在周一就会看上去像这样了
printf ("hello, world").
这里还有一个怪怪的\n 有括号
还有分号
但是 今天我们学到的最重要的一点就是
将图像格式的东西翻译成文字格式
所以上周看上去像这样的一个循环
在这周看上去就会是这样
我必须要说清楚 就像Scratch一样 我们有
不同的方法可以达到相同的目的
在C中也是这样 我要给你们看的不是唯一的方法
而是把这个永久循环翻译成C语言的方法之一
这个循环 会重复10次
第一次看这些代码确实会很让人费解
但为了在之后执行它
我们要来用一个 for循环
显然 这里有些语法有点复杂 又有i＝
还有0 但是今天在我们研究过它之后
你就会发现这都只是在做一些简单的算法
在这里 目的是要让我们从0升到9或是10
最后 变量 变量是一种储存器
左边是上周我们看到的
而这周 它就会变成这样
但我们后面还会介绍给多
上周 布尔表达式看上去是这样的
这一周 它们会变成这样
而这一个其实挺让人安心的
因为它基本上和绿色的区块一样简单
不过又一次 我们看到了一些复杂的语法 有&
不过你大概可以猜到 在Scratch中 我们说A-N-D 在C中
我们会说&&
不过很快 你们就会觉得这些很自然了
条件
上周 它看上去像是左边这样
这周 它会像右边这样
但是 这里最重要的是 当你看到像右边这样的代码
特别是如果你觉得它看起来不太舒服
是因为你不适应 你不知道要怎样
将Scratch一点一点变成那样
(make sth from scratch在英文里表示 从头做起 此处为双关)
请记住 基本想法其实是一样的
只是前一周的让人觉得更自然而已
就算你还没有开始做练习0 我敢说
你会觉得那些拼图很容易理解 或者至少
经过一段时间后就很容易理解了
所以让我们开始吧
就让我们从第一个简单的程序开始
当然 这个简单是相对的
我需要切换一下屏幕 转到
CS50工具上去
CS50工具是一个在我的Mac上一个窗口中运行的软件
当然 你也可以在你PC上运行
它可以让我和课上的每一个助教 每一个助理
每一个学生都拥有相同的电脑环境
因为CS50工具实际上是另一个操作系统
也就是Linux
准确的说 是Fedora Linux
我们为这个系统配置了一个安装过程
所以一 它中间有个小小的CS50标志
二 底部有一个个性化菜单 三 为了教学
我们把用户界面尽可能地简化
所以当你第一次在你的Mac或PC上安装它时
你会和别人有一样的电脑环境 你也会拥有上这门课
所需一切 你自己还不用去想
每样东西要怎么安装
所以它看上去和Mac操作系统或是Windows有几分类似
在左下角 你有一个开始菜单
或是一个Apple菜单
然后有三个我们认为你们最常用的图标
一个是Chrome
是浏览器
第二个是Gedit 我们上周短暂地见过它
它是个图像处理器
第三个是一个终端程序 是一个老式的黑白窗口
你可以在里面用键盘输入更难懂
但也更有用的命令
所以让我先行一步 打开 Gedit 放心
周五会发下来的练习1中 我们会教你怎样重复这些步骤
你们看到 这里的用户界面很简单 由三部分组成
左边 一个空的窗口叫源代码
在这儿我会看见我写出的代码的总结
右手边 是一个大标签页 马上代码就会写在这里
现在还没有保存
在底下 我有一个内嵌的终端窗口
它是一个黑白的提示 让你把命令输入其中这样就能编译及执行我的程序了
也就是说 能让我写程序及跑程序
就让我们从简单的开始
点击文件 保存
然后我会进入jharvard
无论你们是谁 这个工具都属于
一个叫John Harvard的人 他有一个jharvard主目录 你们的文件
都会被存到这个目录下
你们每人都有他帐户的一部分 所以我们并没有
共享同一个硬盘
你只是感觉John Harvard拥有它而已
另外 我还装好了Dropbox
这个工具已经装了Dropbox所以如果学期中
有什么出了问题 如果你设置好了一个免费的Dropbox帐户的话
你所有的文件都会自动备份
这样你就很容易恢复它们了
我要打开我的Dropbox目录
这里面已经有一些东西了
不过我要先点击文件 保存
然后到jharvard目录的Dropbox目录下
给我的程序一个非常简单的名字 hello.c 然后保存
用户界面还是一样的
唯一变化的就是在这个标签顶端
我会迅速重新写出
刚才幻灯片上的程序
输入 into main(void) 然后是printf, "hello, world,"
跟着一个很难懂的\n 引号 括号 分号
然后按Ctrl S保存
请注意刚刚在左上角出现了什么
这个在今天不重要 但是对以后会很有用
你刚才看到了这一段代码的一个总结
因为我写下了 main 所以main这个词
在这里出现了
不过今天我们不用管那个
好的 这是我用C语言写出的第一个程序
上周五 我们就知道了 我在跑这个程序时
它就会展示出
或者用计算机科学家的话说 输出
你好世界 在屏幕上
所以我这样做后 你会发现我要到终端这里
在这里现在有一个闪烁的光标
这是我的 John Harvard主目录在键盘版本
这样我可以用键盘来控制我的硬盘
所以我不能像我上周那样打字输入 hello
因为它会告诉我 无法找到目标文件
有什么地方出错了
我并不知道这条信息具体什么意思 但这是因为在默认条件下
当这个黑白窗口被打开时 我就在
John Harvard的主目录里了
但我把这个程序保存到哪里了呢
保存在我的Dropbox文件夹里
我们从小到大 用电脑时都是双击
文件夹图标 打开它 就像这样
那个叫hellp.c文件就会在那儿了
那就让我们来试试吧
让我把Gegit最小化 就像你们在
Windows或Mac操作系统上会做的那样
让我去左上角的主文件夹
这里有一堆文件夹
这是我的Dopbox文件夹
这个小标识表示它已经同步好了
这里面已经有一些东西了 不过请注意 hello.c
就在这儿
所以在Mac和Windows系统里 我们通常会双击它 它就会打开
不论是什么程序 这样就好了
但现在 至少从今天开始 我们需要退后一步
给你们一些基本的工具 让你们能够
在不远的将来用它做出更强大的事
所以现在 我需要做与双击Dopbox文件夹
能达到同样效果的事
所以我要输入CD来更改目录 Dropbox 回车
现在请注意 我的提示这里出现了括号
还有波浪线 这个在我键盘左上角的
弯曲的小符号 /Dropbox
这只是一个缩写 告诉人类说 你现在在Dopbox
文件夹里了 就好像你刚刚双击了一样的
所以现在如果我再来输入 make hello 回车 我会看见一个非常难懂的命令
但不再是一条表示错误的信息了 然后
就会出现另一个闪烁提示
如果你们还想得起来的话 我们在上周五 是这样做的 ./hello
你们马上会看见我跑了这个程序后的结果 或者 在Mac
和Windows系统中 我双击一个.app或是.exe程序后的结果
它会打开一个窗口然后执行程序
输入./hello就相当于双击打开程序
但是是用我的键盘完成的
回车 hello world
这样就行了
让我们来将拆分下 以免听上去太像希腊文
所以 ./ 表示什么呢
用键盘在这样的环境下操作过的人
点代表什么呢
是当下的目录
所以 当下的目录实际上是一个文件夹的简称
./就表示我在说 在当下的目录
中去找一个
叫做hello的程序
换句话说 就是在我的Dopbox文件夹里找
所以这就是为什么在之后敲回车就会打开那个程序
如果我现在输入 LS 请注意我现在能看到我Dropbox里的所有东西了
有Started.pdf 这是Dropbox免费给你的 我的照片目录
一个公共目录 未保存文件1 这是我刚才
不小心按到的 foo.c 这是我先前保存的 然后两行东西
hello.c和hello
hello.c是我刚才在Gedit里写的程序 那这个绿色的hello是什么呢
绿色的hello是可执行文件
也就是说 我刚才执行了这条命令时
让我们回放一下
当我执行了make hello 时 就等于做了中间的这一步
它把hello.c当成输入
也就是源代码 然后生成了一个文件 把hello作为输出
这个输出中包含了一堆0和1
这也就是为什么 最后 我可以成功执行./hello这样的命令
因为在因特尔处理器中 我的操作系统 Linux 打开了这堆
0和1 把它们喂到了我电脑的脑子
也就是CPU里
CPU就知道 哦 这里有组0和1 表示
的是把这个东西输出到屏幕上
是什么东西呢
当然就是 hello world
好的 简单总结一下刚才这些命令 这样我们
就能自然运用它们了
让我跳到我们刚才在讲的地方
你们还记得 我们刚才输入了CD
我敢说 这大概是今天
或者是这周 除了make之外
我们需要输入的命令了
所以CD代表什么呢
更改目录
就等同于双击一个文件夹
顺便提一句 如果你在使用这个工具时有什么不清楚的
比如说在用Dropbox时
我想返回我的jharvard目录
如果不确定 就按CD 回车 不用做其他事 它就会把你带回
最开始的地方 这是很蛮好用的捷径
好 另一个命令
LS
我刚才输入了它
LS表示什么呢
列出
以前 当人们想出这些命令时
他们想要尽可能高效 所以他们没有输入L-I-S-T 回车
而是决定用LS
这没什么问题
听起来和list很相近
那我们就输入LS 回车 然后它就会列出我当前文件夹中所有的文件
和文件夹
mkdir 你们大概可以猜到
创建目录
所以在这里 你不用去什么文件菜单然后选择新建文件夹了
你要做的 是输入mkdir 空格 然后接上你想要创建的
文件夹的名称 然后就好了
rm 你们也可以猜到
移除或删除
如果你们想删除一个文件 你们可以在练习中找到
要怎样做
还有rmdir 删除目录
同样 我会略去一些细节 因为一
花时间在这些上面好像并不太有趣 二 我们会在
练习中提供更多的信息 特别是
普通版的练习 这些步骤 你都要自己输入
这样你才能越来越适应这类事情
但现在让我再来分解另一个事情
先前 我们输入make hello的时候 我们看到了一堆难懂的命令
又一次 我们看到了 make hello
好 让我们这样做
我差点犯了个错 不过现在我要故意犯
这个错
我哪里做错了呢
是的 我不在Dropbox目录下 因为 刚才
我输入了CD然后按了回车
它把我带到了最开始的地方 而我的文件不在这
所以我要做的是 CD Dropbox 回车 现在我就可以
输入 rm hello 回车 把普通文件hello删除
我不知道这为什么这么复杂
这只是在问你是否确定要删除hello
你可以输入y表示是 现在它就被删掉了
所以现在如果我再次输入make hello 它就会重新写出我的目标码
重新创造那些0和1
但这条特别长的命令又是怎么回事
我们马上会讲到这个 不过
我前面好像说了个善意的谎言
make不是一个编译器
make是一个程序 它会自动想出要怎样
为你运行一个编译器
所以你要把hello.c转换成hello 真正要输入的命令
事实上应该要长这样
但它实在太长了
我们不太可能真正去记怎样输入这一堆命令
所以make的意义就在于 让我们了解问题的复杂程度
然后帮我们自动处理那些非常复杂的步骤
不过我可以尝试一下
对于这里 我就可以猜一下 只要
输入clang 也就是我们这学期所用的编译器的
名字
如果你们当中谁开发过iphone或ipad的ios程序
clang就你们在xcode中写代码的程序
不过clang只是一个可以在命令中输入的程序名称而已
我们现在介绍它 是为了以后可以
介绍一些更有代表性的命令
让我来手动演示一下
rm hello 检查一下 然后
./hello 你觉得下面我会看到什么
某种错误
目录中无此文件
这个错误还挺直观的
现在让我清理一下屏幕
Ctrl S会把屏幕上干扰人的东西都清掉
然后我会手动输入 clang -o hello hello.c.
所以下面会怎样呢
就是make帮我们做到的事 但是我用更复杂的
文字做到了
clang这个程序会把一个.c文件输入 然后输出
0和1
但是-o是一个 switch 或者叫flag
这是个技术术语 意思是你输入的提示会
影响到你今后要执行的程序
所以有人想要猜下-o代表什么呢
输出
其实就是有人决定了-o代表输出一个叫hello的文件
然后把提示上最后一个词 无论它是什么 在这里 是 hello.c 输入
所以如果我敲回车的在 看起来不会有什么
但在编程的奇怪世界里 什么都没有发生
也有可能是件好事 因为这表示屏幕上
没有显示错误
hello 回车
我的程序现在已经运行了
但我可以做件很笨的事 比如 clang -o, hihihi, hello.c
回车 现在我就有了一个一模一样的 叫做hihihi的程序
它们完全相同 只是名字不同
所以我只是想说 如果你想要改变一个程序的功能
我们会不断见到一个叫做
指令列参数的东西
这是一个列
你在输入指令
所以叫指令列
而指令列参数就是一些会影响到程序功能
的文字或者词语
好 这大概是我们能写出或看见的最无聊的程序了
现在让我们做一些更有趣的
让我来创建一个新文件
我会把它保存在John Harvard的主目录里
叫做custom.c 是一个个性化程序
让我放大一下这边然后重来一次
包括 standard stdio.h
这我们过一会儿会讲到
int main(void)这待会也会讲到
printf ("hello, David").
有趣多了 对吧
所以现在 不是因为我的名字有趣 是因为它不同 才有趣
make custom 回车
Custom, hello, David.
但这也还是个善意的谎言
这个程序也可以叫david.c
因为我们并没有自定义性能
我想要的 是一个会问用户名字的程序
我要怎样才能做到呢
让我往上拉到这边
在我用Scratch语句之前 用printf之前
也就是在这个功能之前 让我先向用户要些东西
我得做下面几件事
首先 在我问用户名字后
我需要有个地方可以存储它们
为了存储这样的值 我应该用什么建构呢
一个变量
不像在Scratch里你可以直接拿一片拼图 这里
显然 我们需要用文字来表达
所以 当你在编程时 如果你想要一个词或是一个短语
我们叫它字串
字串就是一个词或是一个短语
它是由0个或多个字符组成的序列
如果你想以这个变量存在的话 你必须要说 给我一个变量
你要做的 就是说 string s 分号 s可以是
你想要的任何东西
事实上 s有点不够厉害
为了更清楚些 让我叫它name
给我一个叫name的字串
现在 这个人的名字默认是什么
当然 如果那个用户没有输入任何东西的话
名字显然是不会有任何值的
在C中 如果你不给一个变量一个值
它会有一个无效的值
它可能会一堆随机的0和1 所以如果你尝试在屏幕上显示它
你就会看到无用的东西
但我可以修正它 在name中储存
下面这个值
想要在变量中储存值 你就把变量名称放在左边
你得想办法把你想要储存的东西放在右边
为了完成这个 语法是这样的
我们还没有看过这个 不过请相信
这世界上有另一个语句 我还是叫它功能
这个功能叫做 get string
它的作用就是表面意思那样 获取字串
如果一个人从另一个人那儿得到了一组字
然后对这些字进行了一些处理
这确实看上去是很难懂的语法
一般 如果你在用等于号 比如说
在代数中 你就在说 x等于1
在这里 我们不是在说 name 等于get string
我们是在说 把等于号右边的东西存储到
name里
等于号代表的是赋值运算符
这个语法表示把右边的东西放到
左边去
所以get string是一个新的功能 它不
只会
叫用户给字符串
也就是说 会把字符串返还
那就让我们来看看会发生什么
我会缩小界面 然后在我的提示里
弄出很多错误
我会输入make custom 回车
哇
有这么多错误
好 一开始 这确实会有点让人不知所措
但实际上 时间一长 我们就发现这些很难懂的错误信息
有着某种固定的格式
我就拿这个来说 因为它是第一个
使用未申报标识字串
这表示Gedit 或者Clang 不知道
我说的字串是什么意思
这是因为在C这个编程语言中
没有字串变量
C并不知道字串的存在
但是我们 CS50团队 知道
所以在课程开始之前 我们创建了一个叫CS50.h.的文件
在这个文件里 我们后面会细说语法
在这个文件里是我口头刚才
对字串的定义
所以我在总结我程序的这一行代码
就在轮流教Gedit make和Clang字串是什么
我还不知道这要怎么做
不过几周会 我们会再回来看这个问题
不过现在 只要知道 这是教编译器
字串是什么就可以了
所以现在让我清理一下底下的终端
让我重新跑一下make custom 然后我已经解决了所有问题
这也会是一个我们会重复看见的主题
我这个程序里只写了9行代码 但我却有18行的错误
这有点令人害怕
不过要记住 这些错误往往有连锁效应 一个小错误
会扰乱编译器 使它看上去比实际上更糟
所以如果你观察仔细的话 你就知道我们要从用户中取得
字串 但我却少做了什么呢
我实际上什么都没做
所以如果我再跑一次custom的话 它不会有任何反应
是怎么回事呢
我的程序好像卡在某一行上了 你们觉不觉得
事实上 它是卡在第七行了
我们前面没遇过 但是第七行上 又出现了
这个语句 get string
它的目的就是获取字串
它现在在等待一个人来拿字串
这对我 一个人 来说 并不很好理解 因为
没有人告诉我要做什么
但就让我有一点信心 然后让我假装自己是Rob
回车
这并不是我想要的程序
所以 我们有了第一个bug
不过让我们试着弄清楚为什么会这样
首先 让我修正第一个错误
让我在这儿加一行 printf 你的名字是什么
下引号 右半括号
现在让我重跑一下程序
有问题
我没想到这会发生
对了
我没有对它进行再次编译
所以在C这样的语言中 你改变了源代码
并不意味着你改变了那个会产生新目标代码的目标代码
新的0－和1们
你必须重新编译
如果现在重新跑一下 按回车 啊 这下比较明朗了
我的名字是Rob
但仍然有错
我会说现在的一些错误
说实话 看上去真的很可笑
比如 这里我应该加个空格
或者要把鼠标移到新一行上去
新一行
在这里是一个关键词 不过我们还没有定义它
你让文字从一行变到新一行
并不是这样做的
这会给电脑造成混乱
这看上去像是两行分开的代码
它们都不完全正确
相反 你得说得更明确些 你要说 给我新一行
在C里面 我们用\n表示
所以这儿有几个这样的字符
\n会让它们看上去更美观些
让我重新编译一下我的程序
让我重跑一下我的程序
看上去好多了
这个还是很原始 也还是错误很多
所以呢 有一个－－
即使你从没有编程过 你大概也可以猜一下
这个程序为什么还是有问题
有什么是我需要做但还没做的?
我得对 name 做点什么
就像在 Scratch中一样 你可能得给变量n或者
像我们上周讲的计数变量赋一个值
如果你什么都不做的话 什么都不会发生
好 所以我们来修正这个问题
让我在这输入我的变量 然后到下边来
重新编译 重新跑一下 Rob
现在我就是个白痴 是不是
这好像并没有带来太多帮助
但我得说 刚才所做的是天性使然 对不对
如果这个变量叫name 我把它放到那里去
为什么我不直接在那里输入它呢
当然 我们现在对它和
字串得做一个区分
注意到这里的 hello name了么
这本身其实是一个字串
它是个硬编码
不是人为生成的
而是我 最初的编程者创造的 不过它仍然是个字串
所以如果你在字串里真的写下N-A-M-E 会
输出什么呢
会输出 N-A-M-E 而我们需要告诉printf 不要
输出N－A－M－E这四个字母
而是要输出名字的值
我们需要这样做
这只是一个习惯
我们要说%s 这代表字串
在我下引号结束这里 我要放一个逗号
然后在这个语句里放第二个参数
我会在这里输入name
注意到这儿我们有个新的语法
我们还是有两个括号 所以我要说
括号中间的东西代表着参数到功能输入
的转换 而这会影响到它的性能
按这个逻辑 printf现在
在考虑多少个参数?
看起来是两个
从这里的逗号可以看出
所以这是在引号中的一个参数
虽然其中有个逗号 但所有的东西都所在引号里
这意味着这是一个很长的字串
逗号 变量name
现在我们缩小它
然后重跑下
Rob
真是的 我到底做错什么了
好 所以你需要重新编译
又一次 这是刚开始时容易重复犯的错误
现在再重跑下 Rob 回车 好咧
我们现在就有一个自定义的程序了
我现在有个程序 它运用到了一些特性
我们需要提一下
首先 我在用 CS50.h 也就是CS50图书馆
在CS50图书馆中 有其他人 也就是我们的团队
写好的功能
可供你们使用 然后get string是其中的一个
在第二行中 是 stdio.h 这个为什么会在这里?
猜一猜
在常规的输入输出里会有什么?
printf
所以printf 你不会在屏幕其他地方看到它
它必须是电脑自带的
所以它到底从哪来的呢
它在一个叫做
stdio.h的文件里
我们后面还会回到这个问题上 不过现在
它有点让人分心
这代表我们的返回类型
这代表一个参数
不过今天 我们只关注这些代码行
所以 string name 我们来回忆下 能帮我做什么
它会表示这个变量的类型是字串
所以说 这个变量是给文字的 而非数字
顺便提一句 如果我想要它是数字 我会说
int.
如果我想要它是个浮点数 也就是带小数点的东西
我会说float.
不过今天 我刚说了 string
我把这个变量的名字叫做name 不过
我可以给它取任何名字
事实上 一开始 我叫它S
这里是另一个语句
这个语句里有多少个参数?
只有一个 而对于我来说 这只是一个
在屏幕上显示东西时关乎美观的细节
对一般人来说 第八行在做什么
它在从用户那里得到一个值 也就是一个字串
那它会对字串做什么呢
是把它交到等于号左边的人手中
在这里 也就是变量name手中 这样它就可以被储存了
然后printf是另一个功能
运用一个功能时 我们会说
call 一个功能
它显然有两个参数
一个 逗号 然后第二个
这个本身只是一个包含占位符字串
%s 表示在这里放另一个字串
所以在逗号后放name 代表着
在这里插入这个东西
这样我还可以做其他事
让我来弄一个有点傻的程序 不过先让我删掉这个
然后让我创建一个循环
当为真是
真 这个符号显然一直都会是真的
那么我写了写一行 做出了什么循环呢
一个无限循环 对不对
只有 当为真 时
我不可能把 真 这个词变成其他任何东西
所以它就会一直跑下去
所以如果你在你的Mac或PC上发现有个程序
好像锁住了 或者它在做的事
你没法让它停 只能重开机的话
或者把任务管理器调出来 这边有个例子
我可以说 "我是个有问题的程序" 下引号
或括号 分号
所以我们又一次发现了这个规律
虽然一些语法是新的 关键词 当 关键词 真
注意我都有加这种大括号
分号和括号
现在让我们来编译它
make custom, custom
现在 你不需要重启这个工具
简单的方法是 用两根手指 Ctrl C
我们会退出这个程序
不过你们可以看出 这个东西为什么会一直重复自己
我可以弄出更复杂一点的例子
我下面要说
For int 也就是整数 i是我们在编程时想要计数时
给一般变量的名字 等于0
while i 小于100 i++
让我们重新看一下这个语法 它表示
不断增加i的值
那么这里我想要做什么呢
printf 我可以数到i 这是个有问题的程序
我实际上是想做什么呢
%加上不是S 而是d 你们不会想到这个 %d是小数还是整数
,i
这我回到这
用make重新编译
用custom重新跑一下
当我写这样的程序时 我可以数的很快
下面我们要做件不是故意为之的事
当i大于等于0时好了
它会产生什么呢
从逻辑上来说 这么做并不聪明 因为如果我现在重跑 重数一次
我可以数到很大很大的数字
不幸的是 我大概可以数到40亿 所以
这会花我很久的时间
我们不如在这留个悬念 我保证
在周三 我们会来看看这个程序有没有跑完
其次 我们会教大家如何自己写一个功能
这样很快 在周三 当我们从Scratch 转向C时
可以开始写出越来越杂的
比这个高级很多的程序
到时候见
[掌声]
在下一堂CS50中 我们会看见Puzzle Day大获成功