Tip:
Highlight text to annotate it
X
>> JASON HIRSCHHORN:欢迎 三个星期,大家好。
我们有一个忙碌的,但令人兴奋的 摆在我们面前的一节。
因此,首先,因为我们已经做了一些 进展的过程,但我们仍然
有一个很大的学问剩下要做的,我 要告诉你们一些资源
这应该被证明是令人难以置信 有用你不仅接近你
习题集,而且还消化所有的 我们给你们的材料
讲座和短裤和一节。
>> 然后,我们将先花20 节会超过25分钟
GDB,您可能会或可能不会有 用在这点上,但它是一个
令人难以置信的有用工具,将 帮助你调试你的程序。
很多您在可能使用的printf 你的程序的中间图
哪些变量望其项背。
GDB甚至比printf的更好, 不搞砸了你的代码,因为你
对可执行文件运行它。
所以我们就去了10个最有帮助 命令你需要GDB,我们很
要继续练习在一起, 在问题设定了三个超越,你
可以用GDB来帮助调试 您的程序。
最后,我们将介绍一些 排序和查找算法
您在演讲看见了,我们是 将实际的代码,而不只是
伪代码,但代码的二进制搜索, 冒泡排序和选择排序。
>> 因此,首先,我想去 以上的资源。
这是一个广泛的名单,它的 较小的字体,因为我有很多东西要
适合在这里。
但这些不仅会帮助你, 再次,与习题集和
你学到了消化信息,但 肯定,来测验时间,这些都会
说非常有用。
因此,首先,演讲笔记。
如果你去cs50.net/lectures和 滚动到特定的星期和日,
你会看到,有注释为每个 讲课,这不是一个简单的
成绩单,而是一个编辑的版本 什么是覆盖在讲座与代码
片段和其他有用的花絮。
我强烈建议你对这些。
然后还有,还有源代码 可从每个讲座。
再次,这些幻灯片也将是 可在网上cs50.net/sections
今天晚上。
>> 因此,每个星期第二是短裤的 封面专题,一般为5〜15
分的长度。
而那些希望会给你一个 伟大的底漆上不同的主题。
第三 -
这是全新的这 年 - 是study.cs50.net。
如果你还没有检查出来,我 强烈建议您这样做。
你来挑一个话题。
我们对有几十个主题。
因此,例如,你选择的功能。
它给你一些幻灯片 并注意到功能。
这些都是实际的幻灯片,转录因子 鼓励在使用我们的
演示一节。
还有处理的技巧和窍门 与功能,并有
实践中的问题,帮助 您使用的功能。
我们也给你链接到的短 函数和时间,其功能
已经提出了在课堂上。
所以study.cs50.net,全新的这种 今年,一个奇妙的资源。
>> 接下来,我有男人,也就是手动 命令,你可以在运行
命令行。
所以,如果您对任何问题 命令,例如,兰特,这是我们
部分在上周遭遇 而你在已可能遇到
通过去当你的设置的问题 生成的代码,但如果你输入man
兰特,你会得到的页面 告诉你所有关于兰特。
它给你什么需要时, 它需要的参数,以及返回
类型和简要说明 那功能。
>> 因此,请检查兰特。
它可以是一个有点罗嗦和混乱, 所以有时我觉得
简单的谷歌搜索什么我想知道的是 找到答案的最佳途径。
因此,与谷歌的做法。
获得良好的谷歌。
它会成为你最好的朋友。
>> 以及谷歌,如果你不能找到它 在谷歌,cs50.net/discuss,它的
讨论论坛。
机会是,如果你有一个问题,一是 你的700 +的同龄人也有
问题可能问 它已经在讨论
论坛上,并让它回答。
所以,如果你有一个共同的问题或 您有想一个问题
也许其他人可能碰上, 退房cs50.net/discuss。
>> 最后,最后两个,如果你想要 跟一个真正的人,办公室
时间周一至周五。
还有网上办公时间 延期的学生。
最后但并非最不重要的, 我的惊叹号。
你们都有我的联系方式。
如果你需要什么,请千万不要 随时与我联系。
总觉得自由地这样做。
只有极少数的你加了我的Gchat, 让一直令人失望,
但我希望那会改变之间 这一点,下一节。
到目前为止,对资源的任何问题吗?
大。
>> 最后,另一个插头 反馈,sayat.me/cs50。
你可以给我匿名反馈 关于我是如何做。
那是真正有用的最后一周。
我有一对夫妇的评论从你们 右后部分,再加上从
谁看了其他学生 在一周内,并且它
是难以置信的帮助。
我要尝试限制我使用 单词“甜”,但我会告诉我的
热情和兴奋 在其他方面。
但也有其他附加 实质性的反馈,
双方的长处和三角洲。
所以,请我给你们反馈 关于您的问题集。
随时给我反馈 在我的教学。
我在这里给你们。
>> 大。
这就是我对 首节。
没有任何人有任何 问题这么远吗?
和我有记 控制中心。
扩展学生短信给我 说他们没有得到任何音讯,
但是这是我的力量来解决的。
所以希望,即得到 短期内得到解决。
如果你正在看在线,喜, 但你听不到我的声音。
>> 因此,首先,我们要 要经过GDB。
GDB,因为我暗示较早, 是一个调试工具
比printf的要好得多。
因此开始使用GDB,你们这些家伙,如果 你要打开你的设备
走,我通过电子邮件发送给您的文件 前面 - 这个文件也将是
可在网上在一个位 -
和运行GDB /文件的名称。
首先,当然,你必须编译 文件因为GDB只适用于
可执行文件。
>> 但是,如果你想开始 GDB,你要做的第一件事,
你运行GDB /凯撒。
所以这是我们的程序的名称 去,现在用它去。
所以我打算写使凯撒,这 会给我一个可执行文件
在这里绿色突出。
然后我要去运行GDB /塞萨尔。
>> 和你去。
你看我们有一些文字告诉我 关于广发行的版本,给我
一些保修信息,然后我们 有国内生产总值提示,这看起来有点
像我们的命令行提示符下, 但是你看它的开放
括号,GDB,密切括号。
在我们继续之前和调试这个文件 那我给你的一切,让我们来看看
一些有用的命令,所以我们有一种感觉, 什么我们要覆盖。
>> 这些命令列在这里的 顺序我一般使用它们。
所以我通过运行启动我的程序 该方案的GBD。/名称,
在这种情况下,恺撒。
然后我首先要做99.9% 的时间类型休息的意思。
,在主设置一个断点。
从本质上讲,你在做什么有 是该程序将停止在
主这样你就可以开始研究它线 按行,而不是运行的所有
一路走过。
可以在不同的点在破 你的代码,但主要是一个普遍
良好的开端。
>> 下一个命令我跑是跑。
启动该程序运行,并 如果你需要输入的命令行
的论点,你运行它的命令。
与参数运行。
这样以来,我们去那边的一个版本 C,这是该计划你们的
写了PSET 2 -
这其中,当然,有一些错误 在它那希望我们会发现 -
我们将用一些命令来运行运行 行参数,因为恺撒,
按问题你们知道 设置规范,需要一些
命令行参数。
>> 在接下来的几个命令,下一个 一个是实际调用下一个。
那一个你需要一行一行 通过你们的节目。
所以打n,则输入带你 行到下一行,执行
上一行。
步骤不仅需要你 下一行,但它
你需要在函数内部。
所以,如果你写一个函数 你的代码或者如果您想探索
以我为例,你可以打s和 而不是去的下一行
你正在经历右边的文件 现在,你将真正步入
这个函数然后看看它的代码。
>> 列表显示,在非常人性化 格式,10行左右左右
您当前所在的代码 所以实际上你可以看到文件
而不必交换背部和 来回之间不同的看法。
打印是如printf, 顾名思义。
这表明你是什么一个变量等于。
>> 信息本地人是真正有用的。
这是印刷的特殊版本。
信息当地人告诉你所有的地方的 变量,它们打印全力为您
目前可用。
所以我一般,而不必 打印出来的四个变量,我很
好奇,如果我在一个for循环中,为 举例来说,我只是写信息本地人,
它会告诉我什么我的计数器i 等于,以及我是阵列
工作平等。
>> 最后,继续。
键入中断停止你 在破发点。
你可以通过走线 旁边和步线。
继续运行程序到下一个 突破点,或直至完成,如果
有没有更多的破发点。
禁用删除断点,如果你 决定在主要的突破是
不当之处,你要 设置在别的地方。
最后Q,退出,得到了广发行。
>> 所以这个程序,/撒,我们将 仔细看看,现在,我们
要使用GDB找 臭虫此计划。
我跑这个程序与前面 检查50,我得到了一个皱眉。
一切它的存在,它编译的,它 通过大量的试验,但对于
由于某些原因,它没有通过第五 测试中,转向BARFOO,全部大写,成
E-D-U-R-R,全部大写, 使用3作为密钥。
我得到了八九不离十。
我由一个字母下车。
因此,有一些小的失误在这里。
我已经通过我的代码看起来。
我无法弄清楚。
希望你们能帮助我 找出这个bug是。
>> 所以这是我们的错误 寻找。
让我们继续前进到GDB。
再次,我已经运行GDB /凯撒, 所以现在我们在广发行。
什么是第一 我应该做的事情吗?
我刚刚进入GDB。
有人给我一个很好的 命令进入。
>> 学生:休息为主。
>> JASON HIRSCHHORN:休息为主。
太棒了。
让我们键入英寸
你们可以在这里观看或跟随 沿着你的电脑上。
打破主,你会看到一个 断点设定在 -
它给了我一些奇怪的内存地址, 而这也给我的行号。
如果我回头看这个文件, 我想知道,主
发生在第21行。
我应该怎么跑下一个?
是我的程序运行?
号
所以,我应该怎么跑下一个?
>> 学生:运行。
>> JASON HIRSCHHORN:运行。
如果我只是跑跑步,还是应该 我在添加一些其他的东西?
>> 学生:使用参数运行。
>> JASON HIRSCHHORN:与运行 命令参数。
而且因为我调试一个非常具体的 情况下,我应该输入
命令行参数。
所以我会做运行三个,这是,再次, 我从50检查了输出。
启动程序。
我们通过几行。
现在你会看到,我们是在第21行。
我怎么知道,我们是在第21行?
因为如果你向左边看 我的终端窗口中,有
它说21行。
这给了我,其实, 代码是在第21行。
所以我刚才讲错。
主要是不实际在第21行。
主要是上述21几行。
但在第21行,这是 我们正在打破。
这行代码有 尚未执行。
这一点很重要。
你看行不有 尚未执行。
这就是下一行代码 你即将执行。
>> 所以下一行,因为你们是 可能熟悉,这是
状态检查,看看我是否有 输入的命令行参数。
和A至I,什么是第二 这样做的一部分?
什么是对我?
>> 学生:它更改为一个整数。
>> JASON HIRSCHHORN:对不起?
>> 学生:它改变了 参数的整数。
>> JASON HIRSCHHORN:所以一到我的变化ARG 卷从一个字符串为整数。
然后它是什么检查?
>> 学生:如果有一个第二 命令行参数,除了
运行该程序。
>> JASON HIRSCHHORN:什么是 在此第二半
布尔表达式检查?
这部分在这里,一来我?
>> 学生:如果是负数。
>> JASON HIRSCHHORN:确保什么?
>> 学生:确保它 是,实际上正。
>> JASON HIRSCHHORN:没错。
这被检查,看它是否 负的,而如果它是负的,我
有一种感觉,下一行可能 被我骂的用户。
因此,让我们打结束时执行这条线。
我们没有看到该行的你们 也许期望看到大喊大叫的
用户再回来,因为 这一行没有执行。
我进入3。
所以,我没有,事实上,输入两个命令 行参数,和3
大于零。
所以,我们看到那行,我们执行, 但我们没踩
里面的if条件。
>> 所以,现在,未来,我看到我设置 整型键等于给我精氨酸卷。
所以这是我创建一个可变密钥。
所以,如果我打印出来的关键,现在,因为 这可以让你看到的
值里面的变量, 关键等于47。
这是奇怪的,但当然, 那是因为我没有
执行该行呢。
所以,现在如果我打了N,执行该行, 并做打印键,键将等于3,
这是我们期望它等于。
>> 如此反复,在广发行,行啦 看你有没有执行。
你必须打N或S或数字 其他命令来实际的
执行该行。
打印键。
关键的第3。
到目前为止,一切都很好。
String是纯文本。
让我们来执行该行。
我是从用户得到的字符串。
>> 让我们在我入住50看,我 进入BARFOO全部大写,所以
这就是我进入。
如果我现在打印纯文本。
你会看到它等于一个字符串。
它给了我一些其他怪异的十六进制 数,但它在
其实说我的字符串是BARFOO。
如果我想看看什么键相当于在 这点,我怎么可以检查关键?
>> 学生:打印键。
>> JASON HIRSCHHORN:Print键,没错。
而实际上,有一个快捷方式。
如果你厌倦了打字印刷的, 你可以只输入p。
所以,p键做同样的事情。
又一次,我看到它等于3。
>> 如果我想找出什么两大关键 和BARFOO相当于在同一时间
但我累了打字每 一出单独,我
可以输入信息本地人。
这给了我钥匙等于3。
纯文本等于BARFOO。
这也给了我这两个奇怪的事情 在顶部,该变量i和
这个变量n。
>> 这些都是实际存在的 在我的主程序。
我们还没有遇到过他们呢, 但作为预览,那些
存在于我的for循环。
所以现在,他们平等有些怪异 数字,因为他们没有被
初始化还没有,但它们仍然存在 在内存中,所以他们只是设置
一些垃圾值。
但是我们看到在关键平原 文字在那里。
>> 所以,我要执行这条线, 第34行,for循环。
我们要跳进 for循环击中ñ。
而且我们内部的for循环。
我们是在我们的第一次检查。
再次,这些都应该有点期待 你熟悉的,因为这是一个
写凯撒程序,但 再次,有一些类型的错误。
>> 现在如果我做信息本地人,因为我 里面的那个for循环,你会看到
我等于零,正如我们期望的那样。
这就是我们将其设置为和初始化 它在for循环。
n等于6。
这也有道理,因为我们设置 它以纯文本的strlen的。
所以我喜欢做信息本地人或打印 到变量经常以确保
一切总是什么 我希望它等于。
在这种情况下,一切都 我希望它等于。
>> 因此,让我们开始通过移动 这个for循环。
我上线是36行,如果纯 文字i大于一个朴素
文本i小于或等于z。
我知道我的问题是不是与我的第一次 信中,它与第二个字母。
如果我们回头看检查 50,B进入到E的罚款。
我要带A和把它当作 一个A,而不是将其更改为D。所以,
什么是错的 第二个字母。
所以,我要动 在第二那里。
>> 但是,如果我没有想检查什么纯 文字我等于在这个特殊的
情况下,我觉得应该是什么?
我应该明文等于我在这 通过第一轮的循环?
>> 学生:零?
>> JASON HIRSCHHORN:我纯文本?
所以它应该是资本B的我,当然, 为零,但纯文本
支架零闭合支架等于乙 因为字符串,如我们上周看到的,
是数组,所以我们得到的 第一个字符从。
所以,再一次,如果我打印出来的纯文本 我,我,其实得到的字符
B.这就是整齐的,对不对?
我实际上并没有明文一 这不是我设置的变量之一
或初始化,但你可以打印 出了事情一大堆
如果你想。
>> 但是,让我们移动。
如果纯文本我是和大于 明文I小于或等于
Z,这显然是正确的,因为我们有 资本B.我要去跑
它的一些命令。
我们看到,数学最后一周,所以我们将 想当然,它的工作原理
根据权利检查50。
>> 这些大括号,第一个 结果显示,我是退出,如果
条件,第二个显示 那我退出for循环。
所以现在当我打接下来,我们将看到 我们回来在for循环一次。
我们正在经历的 再次循环。
让我们真正步入第二 迭代的for循环和类型
信息本地人。
>> 所以我们在第二次迭代 我们的for循环。
我等于1,这是我们期望的。
N等于6,而我们预期。
关键等于3,这是我们期望的。
和纯文本,你会看到,等于 EARFOO现在,没有BARFOO了,因为
在我们先前的迭代中,B为 改为大写E。所以我们即将
遇到的问题,所以这 在这里我们要
潜入调试。
但是,没有任何人有任何问题 关于我们到目前为止已经做了什么?
太棒了。
>> 所以我们一下,如果执行此 条件下,纯文本支架我关闭
比A和支架更大的纯文本我 小于或等于Z。但在此之前
我进入了,因为这是 我知道我的错误,我想点
出一的纯文本,以便 让我们把打印出来。
它等于字符A,使 似乎到目前为止,一切都很好,不错。
>> 所以我希望我的每逻辑这条线, 这条线应该是真实的。
这是一个大写字母。
但如果我打了N,我们要明白,这个 行,其实并没有执行。
我跳进来的东西,如果。
为什么会这样?
>> 学生:因为你有你的条件 纯文本的大
比A,不等于或大于。
>> JASON HIRSCHHORN:所以我有我的纯文本 我大于A,不大于
小于或等于。
所以很明显,资本A没有 如果条件触发这一点,我们做
没有踏进去,和我们做 没有做必要的转变。
所以这是它,其实。
我想通了,我的错误。
我可以回去在我的源文件, 改变它,更新它,
运行再次检查50。
>> 但我们会看到,只是为了教学的 的缘故,如果我坚持去做。
本否则,如果不执行下去,但 什么,而不是等于就是命令
不改变。
所以它没有改变,如果我 这里打印纯文本,我们会看到去
通过for循环没有,事实上, 改变第二个字符的。
它仍然是一个大写字母A。
>> 所以,再一次,我们调试我们的错误。
我们意识到有 一些逻辑缺失。
和我们之前调试它的时间提前 实际执行这条线,
但你会注意到有我们只是 点击Next,并跳转到否则,如果,
这意味着,如果条件 是不正确的。
我们没有,事实上,获得 结果我们的预期。
这样的话,我们可能已经提示,有 我们没有这么精明,看
如果条件和检查的话,其实, 我们的条件应计算为
真正在目前情况下。
>> 这是所有用于调试这个程序。
没有任何人有任何问题吗?
我可以打什么命令退出GDB?
问:然后我就被提示, 退出呢?
是或否。
我会打,是的,我会相继退出GDB。
>> 所以这是一个快速入门到GDB。
实际上,在实际情况下, 我这样做是在办公时间。
我GDBed在这个确切的程序 办公时间与学生。
如果我们回去,我们看到的命令 之前,我们使用了破发主力,第一
的事情,我们做到了。
我们使用命令行参数运行, 第二件事情,我们做到了。
接下来,我们用了很多移动 我们通过线。
再次,短版 旁为n。
这是在括号 在灰色的幻灯片。
>> 我们没有使用的步骤,但是我们并没有 一定需要这种情况。
但是,我们可能会在稍后使用它 今天,如果我们正在调试,为
例如,二进制搜索二进制时 搜索被称为在一个单独的
的功能,但有 与它的一些错误。
我们将要步入 调用二进制搜索和
实际调试它。
列表中,我们没有使用或者是因为我们有 我们的代码感好,但如果我
没有想要得到的是什么代码,我感 在旁边,我可以只使用列表中。
>> 打印我们使用,我们使用信息的当地人。
继续我们并不需要在此使用 情况下,我们也没有需要使用
禁用的,但我们确实使用了退出。
同样,这些10的命令, 实践它们。
如果你了解这10个命令, 你应该调试任何设置
发用GDB。
>> 所以我们马上就要去上,再次向 部分的症结今天,去了
这些排序和搜索 算法。
在这样做之前,再次,有任何疑问, 意见,关注的广发行?
所以大家是要使用 GDB而不是printf的?
所以每个人都为永久的缘故, 大家都点头他们的头向右
现在,我会看到你在办公时间 和所有的转录因子会看到你和
他们会说,告诉我怎么用 GDB,你就可以
向他们展示,对不对?
样的?
也许有希望。
凉爽。
>> 所以,我们要进入 排序和搜索。
你会看到我已经排序的列表 对我们来说,但不会
是这种情况总是如此。
所以在问题设置规范 问题设定了三个,你有短裤
你可以看,它实际上 请你看看那些短裤。
此外,在演讲最后一周,我们走过去 很多这样的算法,所以我
不会花时间在课堂上会 一遍这些算法或图纸
图片,如何将这些 算法工作。
同样,这些信息您可以重新手表 讲座中,或者该信息
被捕获出色的短裤 对于这些搜索所有的,
这可在cs50.net。
>> 所以,我们要去什么 要做的就是编写这些程序。
我们有一个感觉,一个心智模式如何, 他们的工作,还等什么,我们要去
要做的就是对它们进行编码真实的。
我们打算把这一心智模式, 那张照片,如果你愿意,进
实际代码。
如果你是一个有点困惑或 朦胧的心智模式,我完全
明白了。
>> 我们不会实际去 跳转到代码通俗易懂。
因此,尽管这个提示在这张幻灯片问 你的代码的二进制搜索,并
实际上,一个迭代版本 二进制搜索,第一件事我
真的希望你做的是 写一些伪代码。
所以,你有这个心理模型 如何二进制搜索作品。
拿出一张纸,如果你有 1一应俱全,或者打开一个
文本编辑器,我想 大家都来写。
连拿4分写 伪代码二进制搜索。
>> 再次,想想心理模型。
我会回来的,如果你有任何问题 我们可以得出的图片出来。
但首先,我们开始编程之前, 我想要写
伪代码的二进制搜索,所以当我们 潜水,我们有一些方向
的地方,我们应该前往。
>> 学生:我们是否可以假设数组 我们得到的值已经排序?
>> JASON HIRSCHHORN:所以对于二进制搜索 工作 - 优秀的问题 - 你
必须采取以排序 数组值。
所以,假设它会奏效。
我们将回到这个幻灯片。
紫色的功能,你会看到 声明布尔整型binary_search的
值,int值,诠释n。
这应该看起来很熟悉,如果你已经 已经接近或得到你
手脏与习题集。
>> 但是,这是你的函数声明。
再次,应该不需要担心 这么多在这一刻。
我真的希望你做的是采取 四分钟的伪代码的二进制
搜索,然后我们就去 以上,作为一个组。
我会来到我身边。
如果您有任何疑问,请随时 自由地举起你的手。
>> 你为什么不走两分钟 完成了伪码?
我知道这可能看起来荒谬的, 我们花那么多时间
东西甚至不是真正的 C,但尤其是对于这些更
具有挑战性的算法和问题 集,我们要搞清楚,
开始在伪不担心 有关语法,只是担心
逻辑,是难以置信的帮助。
而这样一来,你不求解两个 令人难以置信的困难问题一次。
你只是专注于逻辑, 然后你进入的语法。
>> 确定。
让我们开始经历 伪代码。
我已经写在这里,二进制 搜索伪代码。
我们会写这篇文章的上 登上在一起。
或者我会写它,你会得到 我我需要的提示。
所以,有谁能够给我的第一个 伪代码的行,你
写了二进制搜索?
是的,安妮?
>> 学生:虽然的长度 列表是大于零。
>> JASON HIRSCHHORN:虽然长度 的商大于零。
又一次,我们看到一些C的前瞻性 在这里语法的东西。
但大部分是英文的。
有没有人有他们提出的任何行 在此之前他们的伪代码?
>> 学生:获得一个数组 的分类数字。
>> JASON HIRSCHHORN:你写了“得到一个 数组排序的数字。“每
函数的声明,我们将通过 排序的数字的阵列。
>> 学生:[听不清]。
>> JASON HIRSCHHORN:所以 我们将具有。
但是,是的,如果我们没有,我们 就需要我们对数组进行排序
数字,因为二进制搜索 仅适用于排序数组。
因此,尽管列表的长度为零,我 打算把一些大括号
使它看起来更有点像 C.但同时,似乎映射到
while循环,所以这里面,而 循环什么,我们需要
做二进制搜索?
>> 别人谁没有给我一个 但回答却是谁写的呢?
>> 学生:到列表的中间。
>> JASON HIRSCHHORN:汤姆。
转到列表的中间。
和后续的问题,什么 我们做一次,我们在
列表中的中间?
>> 学生:做一个检查这是否是 你要找的数量。
>> JASON HIRSCHHORN:优秀。
走在列表的中间,并检查 如果我们的价值在那里 -
太棒了。
没有任何人有任何东西 这是比这有什么不同?
这是完全正确的。
>> 我们在做二进制搜索的第一件事 被转到列表的中间,
检查,看看是否我们的价值是存在的。
所以我想,如果我们的价值 在那里,我们该怎么做?
>> 学生:我们回到零[听不清]。
>> JASON HIRSCHHORN:是啊,如果我们的 价值是存在的,我们发现它。
因此,我们可以不过告诉某种程度上,这 函数的定义,我们告诉用户
我们发现它。
如果它不存在,虽然,这是 这哪里得到棘手。
所以,如果它不存在,别人谁 正在对二进制搜索或
有一个想法,现在,我们该怎么做?
>> 学生:问题。
>> JASON HIRSCHHORN:怎么了?
>> 学生:是的数组已经排序?
>> JASON HIRSCHHORN:是的,我们假设 该数组已经排序。
>> 学生:所以,你必须检查 你看到的值大于
你想要的值,你可以移动 到另一半的中间。
>> JASON HIRSCHHORN:所以,如果中间 清单大于我们在做什么
寻找,然后我们做什么?
我们谨在哪里?
>> 学生:你想要移动到 列表中的与半
数字低于。
>> JASON HIRSCHHORN:所以我们会 调用的左侧。
因此,如果中间是更大的,我们可以搜索 列表的左边一半。
然后通过搜索什么 我的意思是搜索?
>> 学生:[听不清]。
>> JASON HIRSCHHORN:我们去中间。
事实上,我们重复这件事情。
我们回去通过我们的while循环。
我给你最后一个 -
否则,如果中间是少了什么 我们做什么,我们该怎么做吗?
>> 学生:你可以向右边。
>> JASON HIRSCHHORN:搜索的权利。
这看起来不错,但没有任何人有 任何事情,我们可能会丢失或
别的,你把 在你的伪代码?
所以,这就是我们有这么远。
而该列表的长度大 大于零,我们打算去
到列表中的中间和 检查我们的价值是存在的。
>> 如果中间大,我们要 搜索离开,否则,如果中间是
少,我们要搜索的权利。
所以,我们都不得不与一些熟悉 我们在计算机科学使用条款
和工具,我们有。
但你已经注意到我们 讲英文,但我们发现了一个
很多事情,似乎在映射到 我们已经在我们的编码工具包工具。
于是马上蝙蝠,我们不是 将实际的代码呢。
>> 我们看到了什么英文在这里,图 上的东西,我们可以用C写的?
>> 学生:虽然。
>> JASON HIRSCHHORN:虽然。
因此,这同时就在这里 地图上的是什么?
>> 学生:一个while循环。
>> JASON HIRSCHHORN:一个while循环?
或可能更一般地,一个循环。
我们想要做的事情一遍又一遍。
所以我们要编写一个循环。
而我们已经知道了,因为我们已经做了 这几次我们
有大量的例子摆在那里, 其实怎么写
该指数为一个循环。
所以这应该是相当容易的。
我们应该能够得到 启动很快。
>> 还有什么我们在这里看到了什么?
还有什么其他的结构语法,事情 我们熟悉C语言,我们做
已经有一个基于感 关闭我们所用的字眼?
是的,安娜?
[听不清]
只是在开玩笑。
安娜,勇往直前。
>> 学生:如果和其他人。
>> JASON HIRSCHHORN:如果和 否则 - 就在这里。
那么,做那些样子?
>> 学生:一个if else语句。
>> JASON HIRSCHHORN:是啊, 条件,对不对?
因此,我们可能会需要 写一些条件。
再次,虽然也许在混乱 首先,我们一般有一种感觉,现在
如何写条件和 语法条件。
如果我们不这样做,我们只是查查 语法条件下,剪切和粘贴
如此,因为我们知道我们 在这里需要一个条件。
我们看到,地图上的任何其他事情 事情,我们可能需要做C语言?
是啊,Aleha?
>> 学生:这可能是显而易见的, 通过只检查,如果一个
值等于什么。
>> JASON HIRSCHHORN:那么我们该如何检查 和 - 所以去到列表的中间
并检查我们的价值在那里?
我们怎么做,在C?
什么是语法是什么?
>> 学生:等于,等于。
>> JASON HIRSCHHORN:等于,等于。
所以,这个检查很可能会 是一种平等的,平等的。
所以我们知道我们需要在某个地方。
而实际上,只是在写它, 我们看到其他的事情。
我们将不得不做一些 比较操作符在那里 -
太棒了。
因此,它实际上看起来像,并通过 大,我们还没有写一个
C代码字呢。
但我们得到的心智模式下来 通过讲座和那些短裤。
>> 我们写的伪代码为一组。
而且,我们已经有80%,如果不 90%的是我们需要做的。
现在,我们只需要编写 它,这又是一个
非平凡的问题要解决。
但至少我们坚持的逻辑。
至少现在,当我们去到上班时间, 我可以说,我知道我需要什么
这样做,但你可以提醒 语法我吗?
或者即使上班时间都挤,你 可以为谷歌的语法,而
不是被卡住的逻辑。
>> 再次,而不是试图解决 逻辑和语法问题都
一次,它往往是要好得多 破解这两个难题扎进
2更易于管理的和做的 伪代码在C中,然后再代码
因此,让我们看看我做的 伪代码的时间提前。
>> 而该列表的长度大 大于零,看中间
的列表。
如果发现号返回true,否则 如果数值越高,搜索左。
否则,如果数量少,搜索 右,返回false。
这样,看起来几乎一模一样,如果不 几乎相同,我们写了。
事实上,汤姆,你先说什么, 断,如果在列表中,中间
发现成两个语句数 其实是我做了什么。
>> 我结合他们那里。
我应该听 你的第一次。
所以这是伪代码,我们有。
如果你想现在,对不起,请 回到我们最初的问题。
让我们的代码binary.c。
因此,实现一个迭代版本的 使用下面的二进制搜索
函数声明。
>> 而且你也不需要复制 下来,只是还没有。
实际上,我要去开 右上这里binary.c。
因此,有函数声明 在屏幕的中间。
你会看到我拿着伪代码 从我的两侧,但几乎是相同的
什么,我们写的, 把在为你。
所以,现在,让我们花五分钟 编写这个函数。
>> 再次,如果您有任何疑问, 举起你的手,让我知道,我会
来到我身边。
>> 学生:[听不清]。
>> JASON HIRSCHHORN:所以我把二进制 在定义搜索
顶,上线12。
这就是我为我的幻灯片。
然后这一切的伪代码,我只是 复制并从滑动粘贴
伪代码的幻灯片。
我仍然不听[听不清]。
>> 所以,如果你已经完成了你的 实现,我要检查它。
我发邮件给你的helpers.h文件 在前面这个类。
这将是在网上以及 下载的人看
本节的时间延迟。
而我只是用一般的分布 从pset3代码。
所以我把find.C,用我的helpers.h文件 而非helpers.h文件
这是由于在分配码。
>> 我不得不做出一个其他变动 find.C而不是调用只是简单地
搜索,调用binary_search的。
所以,如果你想测试你的代码, 知道这是如何做到这一点。
事实上,当我们将执行这个代码 现在,我只是做副本
我pset3目录,再次换出 佣工文件,然后作出
在find.C改变binary_search的调用 而不是简单的搜索。
>> JASON HIRSCHHORN:是的。
你有问题吗?
>> 学生:没关系。
>> JASON HIRSCHHORN:不用担心。
好吧,让我们开始吧。
我们将编写此为一组。
另外一个说明。
再次,这是,可以很容易地进行交换 在对习题集三。
我有我的helpers.h文件,该文件,而 比helpers.h我们给出,
声明二进制搜索,泡 排序和选择排序。
而在find.c你会发现就行, 那是什么,第68行,我们称之为二进制
搜索,而不是搜索。
所以,再一次,这是可用的代码 在网上,或者您是代码
创建现在可以很容易地交换 在对p设置3进行检查。
>> 但首先,让我们来编码二进制搜索。
我们的函数声明, 我们返回一个布尔值。
我们采取所谓的整数。
我们以一个整数数组称为 价值观,我们取n是
该数组的大小。
在第10行,就在这里,我有 犀利包括stdbool.h。
有谁知道为什么会在那里?
那么,这行代码呢?
>> 学生:它可以让你 使用一个bool返回类型。
>> JASON HIRSCHHORN:没错。
>> 学生:或者它是一个库,它允许 使用一个bool返回类型。
>> JASON HIRSCHHORN:那么尖锐包括 stdbool.h行给了我一些
定义和声明的东西 那我可以使用
这个库。
因此,在那些被说有 这种类型被称为布尔,并且它可以是
真的还是假的。
所以,这就是该行做。
如果我没有那行,我会 惹上麻烦写这
字就在这里,布尔,在那里。
完全正确。
所以我需要在这个代码。
确定。
所以这再一次是一个迭代 版本,而不是递归1。
因此,让我们开始吧。
>> 让我们开始这第一 线的伪代码。
并希望,我们会 - 或没有希望。
我们要绕过去了房间。
我们会去一行一行的,我会帮助 你弄清楚,我们需要的行
先写。
因此,尽管名单的长度 大于零。
让我们开始在前面。
我应该写什么线 在这里,在代码中?
>> 学生:虽然括号 n为大于0。
>> JASON HIRSCHHORN:虽然 n是伟大大于0。
因此n是一个列表的大小, 我们正在检查,如果 -
>> [插VOICES]
>> JASON HIRSCHHORN: - 对不起?
>> 学生:我们如何知道 n是列表的大小?
>> JASON HIRSCHHORN:对不起。
每pset的规范,搜索 和排序功能,你需要写,
n是该列表的大小。
我忘了解释这一点。
但肯定的。 n为的大小 的列表中,在这种情况下。
所以,当n大于0。
确定。
这可能证明是有点问题 不过,如果事情继续下去。
因为我们将继续了解 列表的大小在整个
功能,但说我们开始 与由5个整数的数组。
我们通过和我们已经 现在把范围缩小到
2个整数的数组。
这2个整数是什么?
大小为2,现在我们要 看,但2是什么?
这是否有意义,这问题吗?
>> 确定。
我会再问吧。
因此,我们用5这个数组开始 整数,n等于5,对不对?
我们将通过这里运行。
我们可能会改变大小, 权利,继续发展下去。
这就是我们说我们想做的事情。
我们不希望搜索 完整的东西了。
所以说,我们将其更改为2。
我们把一半的任务列表,奇怪。
所以,随便挑2。
所以,现在n等于2。
我为穷人道歉 干擦标记。
对不对?
我们正在寻找通过列表 再次用大小为2的列表。
那么,我们的数组的大小是5还是。
我们说,我们只是想 搜索2点在里面。
因此,这2点是那些?
>> 这是否有道理?
他们是左2点?
他们是正确的2点?
是他们中间的2点?
我们已经分手了问题了,我们却 居然不知道其中的一部分
我们仍然在寻找这个问题, 只是通过让这些2变量。
因此,我们需要多一点的话, 而n为大于0。
我们需要知道在哪里 n是在我们实际的数组。
>> 所以,没有任何人有一个 改变这条直线?
大多数这条线是 完全正确的。
难道还有其他的另外?
我们可以交换的东西出来n到 使这条线好一点?
嗯?
>> 学生:你能初始化变量 像长度为n的会被用来
在后面的功能?
>> JASON HIRSCHHORN:所以初始化 可变长度为n,
我们使用以后呢?
但是,我们刚刚更新的长度和我们 仍然会碰到这个问题,我们
减少我们的问题的长度, 但我们永远不知道,其实,
该长度映射到。
>> 学生:是不是要发生 以后当你说,搜索左,
搜索吧?
你会去一个不同的 您的区域 -
>> JASON HIRSCHHORN:我们打算去 一个地区,但我们怎么知道
这是去?
如果我们只有数组,这 N,我们怎么知道在哪里
到阵列中。
在后面,是吗?
>> 学生:你有一样,较低的 界和上界变量或
类似的东西?
>> JASON HIRSCHHORN:确定。
所以这是另一种思路。
而不是仅仅跟踪的 大小,我们保持了较低的轨道,
上界变量。
那么,我们如何计算从大小 下限和上限?
>> [插VOICES]
>> JASON HIRSCHHORN:减法。
并且还保持跟踪的下 绑定和上界,让我们知道,
我们正在寻找这两个?
难道我们寻找这两个在这里?
我们正在寻找中间的两个?
也许不是中间的两个,因为 这一点,其实是二进制搜索。
但是,现在我们就可以得到大小, 而且该阵列的界限。
从本质上讲,如果我们有我们的巨人 电话簿,我们撕成两半。
我们现在知道,较小的 电话簿。
但我们实际上并不翻录 电话簿的一半。
我们还需要知道在哪里 我们的问题的新范围是。
没有任何人有任何疑问, 有关?
是吗?
>> 学生:它会通过创建工作 变量i,你然后就转移
我相对于它的位置 当前位置,并且长度中,n?
>> JASON HIRSCHHORN:什么是我?
>> 学生:就像我是喜欢那种 -
就像你会初始化我是 阵列的中间位置。
然后,如果在位置i的值在 在阵列的发现中间
低于您所需要的价值,我现在 成为该阵列的长度,加上
i的值除以2。
像,看,你转向我 -
>> JASON HIRSCHHORN:对。
>> 学生: - 到 -
>> JASON HIRSCHHORN:所以我几乎 正面,将工作。
但问题是,你需要两个 件的信息在这里。
您可以用开头和结尾做, 或者你可以用大小做,然后
一些标记。
但你需要两件 此处的信息。
你不能用只有一个。
这是否有道理?
>> 所以,我们要通过,并 我们要做的[听不清]
并创建一些标记。
所以,你在你的代码写的什么了?
>> 学生:我刚才说的整型界 1等于0。
>> JASON HIRSCHHORN:让我们把 这个int,开始。
>> 学生:确定。
>> JASON HIRSCHHORN:这使得 更有意义对我来说。
和?
>> 学生:我说,我猜,廉政结束。
>> JASON HIRSCHHORN:INT结束。
>> 学生:我猜,N减1, 或者类似的东西。
像,最后一个元素。
>> JASON HIRSCHHORN:所以你写,诠释 开始等于0,分号和INT
结局等于n,减去1,分号。
所以基本上,我们在做什么 这里,0的第一个位置。
正如我们所知道的阵列,他们不走 最多n,它们上升到n减去1。
因此,我们有我们的数组的一些界限。
而这些初始范围恰好是 我们的问题的初始边界。
确定。
所以这听起来不错。
然后,如果我们再回到这一行,而 列表的长度是大于0,
什么,而不是n,应 我们摆在这里?
>> 学生:写结束减去开始。
>> JASON HIRSCHHORN:虽然结束负 开始是大于0?
确定。
我们可以,如果我们想 做一个更好一点,有什么
我们还能做什么?
如果我们想要清理 这段代码了一点?
我们怎样才能摆脱0?
这仅仅是一个风格问题。
这是正确的现在。
>> 学生:期末不 等于开始?
>> JASON HIRSCHHORN:我们可以做什么呢?
>> [插VOICES]
>> 学生:期末更大?
>> JASON HIRSCHHORN:是啊。
我们可以在刚刚结束的做 大于开始。
右。
我们增加了开始的另一边 那,我们摆脱了0。
因此,这只是看起来 点点清洁剂。
确定。
因此,尽管名单的长度为0,我们写 ,虽然结局是更大
比开始。
我们打算把我们的需要 大括号,然后第一件事
我们想要做的是看 他们在一个小列表。
你呢?
你可以给我 -
>> 学生:如果括号 价值括号 -
>> JASON HIRSCHHORN:如果括号 值的方括号。
>> 学生:结束除以2。
>> JASON HIRSCHHORN:结束?
>> 学生:我看到你的一个问题 -
>> JASON HIRSCHHORN:确定。
好吧,看在中间。
我们怎么知道中间是什么?
是啊。
因此,让我删除那些代码。
我们怎么知道中间是什么?
在任何事情,当你有初 而最终,你怎么找到
中间?
>> 学生:你平均。
>> 学生:你将它们添加 在一起,然后 -
>> JASON HIRSCHHORN:加入他们 在一起,然后?
>> 学生:你平均。
除以2。
>> JASON HIRSCHHORN:加入他们 在一起,除以2。
所以整型中间等于?
汤姆,你可以把它送给我吗?
>> 学生:期初加期末 -
>> JASON HIRSCHHORN:开始 加上结束。
>> 学生:全部,支架,除以2。
>> JASON HIRSCHHORN:所有在括号, 除以2。
所以,让我中间 任何事物,正确吗?
>> 学生:你还需要它向上舍入。
>> JASON HIRSCHHORN:你这是什么 意思是,我需要它向上舍入?
>> [插VOICES]
>> 学生:因为,如果这是一个奇怪的 号码,然后它就像 -
>> JASON HIRSCHHORN:嗯,好吧。
这样我就可以把它向上舍。
但如果它是奇数,5,我可以 服用1远离中间。
或者,如果它是偶数,相反, 这是一个更好的情况。
如果是4,我们只有4,我可以带 第一个“中间”,报价,引文或
第二个“中间”之一。
要么将工作二进制搜索, 所以我实际上并不需要圆形的。
但有一件事我 需要看看这条线。
我们可能没有意识到这一点, 但我们会回来的。
因为这条线实际上仍然 需要一件事。
>> 但到目前为止,我们已经写了 四行代码。
我们已经得到了我们的开始 和结束标记。
我们有我们的while循环,它映射 对直接向我们的伪代码。
我们正在寻找一个映射中间 直接到我们的伪代码。
我会说这正好到中间 名单,这行代码。
然后,一旦我们去的中间 在列表中,我们需要做的下一件事
被检查,如果我们的价值如何, 伪代码,我们之前写的。
>> 那么我们该如何检查,如果我们的价值 在列表的中间?
您。
你为什么不这样做呢?
>> 学生:如果我们的价值的是 在中间是等于
无论我们设定 -
我的意思是等于等于 -
>> JASON HIRSCHHORN:它 -
确定。
>> 学生:我不知道是什么 变量,我们正在寻找
因为虽然,是因为 -
>> [插VOICES]
>> 学生:[听不清]。
>> JASON HIRSCHHORN:没错。
每个函数的声明, 我们正在寻找一个值。
所以,我们正在寻找一个值 在值的数组。
所以你完全正确。
你会做,如果开放的括号值支架 中间闭合支架等号
等于价值,里面有 什么我们需要做什么?
如果我们的价值的存在,是什么 我们需要做什么?
>> [插VOICES]
>> 学生:返回零。
>> JASON HIRSCHHORN:返回true。
>> 学生:返回true。
>> JASON HIRSCHHORN:迈克尔, 这是什么线路呢?
>> 学生:[听不清]程序已经运行 它的路线,那就是结束了,
你已经什么你需要做什么?
>> JASON HIRSCHHORN:程序还是什么?
在这种情况下?
>> 学生:该功能。
>> JASON HIRSCHHORN:该功能。
因此,要返回到任何所谓的 它并给它的价值,真正的。
完全正确。
主。
什么是返回类型 主,迈克尔?
>> 学生:整型,整型?
>> JASON HIRSCHHORN:整型,没错。
一个整数。
这仅仅是一个问题,以确保 你们已经在它的上面。
这是什么通常会返回,如果 所有的东西都运作良好?
>> 学生:零。
>> JASON HIRSCHHORN:零。
完全正确。
>> 学生:如果这只是返回true, 没有信息报错
关于什么的 -
呵呵,这只是说了 值的数组里面。
>> JASON HIRSCHHORN:没错。
这个程序没有提供资料 的确切位置值。
它只是说,是的,我们发现 它,或者没有,我们没有发现它。
所以,如果发现号,返回true。
嗯,其实我们只是做了真正 迅速与一行代码。
因此,我将动议该行伪代码的。
>> 学生:不,我们需要 改变数组?
它应该是值,而不是价值,对不对?
>> JASON HIRSCHHORN:对不起。
谢谢。
>> 学生:是啊。
>> JASON HIRSCHHORN:此行 应该是价值观。
完全正确。
确定。
因此,我们已经看了看中间列表。
如果发现号返回true。
我们的伪代码继续,如果 中间是更大的,搜索就走了。
所以,我在这里,如果数 更高,搜索就走了。
康斯坦丁,你可以给 我这行代码?
>> 学生:如果中间值 -
>> JASON HIRSCHHORN:所以,如果值 -
如果开括号值支架 中间靠近支架 -
>> 学生:是不是值小?
>> JASON HIRSCHHORN:是小于。
>> 学生:比价值减。
>> JASON HIRSCHHORN:值。
嗯,其实,你要 检查数量 -
抱歉。
这是一个有点混乱。
但如果其他的数 名单的中间是更大的。
>> 学生:哦,好吧。
>> JASON HIRSCHHORN:我会改变这种状况。
否则,如果中间是较高的,我们 要搜索左,好不好?
而我们该怎么做内部 这一点,如果条件?
>> 学生:我可以做一个小改动 的情况下,如果将其更改为别的吗?
>> JASON HIRSCHHORN:否则,如果?
确定。
所以这段代码将执行 大致相同。
但是如果左右,其他使用好处 如果,否则,如果还是如果,否则,如果,否则
也就是说,只有其中的一个是要 进行检查,而不是他们三个,
可能。
这使得它一点点 电脑这是上更好
运行你的程序。
>> 所以,[?康斯坦丁?]
我们这一行里面,否则,如果值, 支架中间右方括号
大于价值。
什么是我们需要做什么?
我们需要搜索的左侧。
我们该怎么做呢?
我想给你一个开始。
>> 我们有这两样东西叫 开始和结束。
因此,需要做些什么 要开始?
如果您要搜索的左边 列表中,我们得到我们当前开始的。
我们需要什么做的呢?
>> 学生:我们设置开始 到中间加1。
>> JASON HIRSCHHORN:所以,如果我们 寻找左侧?
>> 学生:对不起,中间减去 -
这样的结局会是中间 减1和开始 -
>> JASON HIRSCHHORN:什么 碰巧的开始?
>> 学生:它保持不变。
>> JASON HIRSCHHORN:所以 含义保持不变。
如果我们在搜索的左边,我们 使用相同的开头 -
完全正确。
而故事的结局?
对不起,什么是 再次结束平等的吗?
>> 学生:中减去1。
>> JASON HIRSCHHORN:中减去1。
现在,为什么减1,不只是中间?
>> 学生:中间是出 图片已经,因为我们有
检查它的呢?
>> JASON HIRSCHHORN:这是 完全正确。
中间是出来的图片。
我们已经检查了中间。
所以,我们不希望“中间,”报价 引文结束后,继续在该
数组,我们正在寻找。
因此,这是梦幻般的。
>> 否则,如果值支架中间是更大 比值等于结束
中间减1。
杰夫,你看这个最后一行?
>> 学生:否则。
中间值小于值?
>> JASON HIRSCHHORN:我们会 你给我的东西。
所以,如果你不给我 -
>> 学生:所以后来开始 将中间加1。
>> JASON HIRSCHHORN:平等开始 中间加1,再一次,对于相同的
原因是君士坦丁 给了我们前面。
并在最后,谁没有给 我的代码行了吗?
返回false,Aleha什么 我们写在这里?
>> 学生:返回false。
>> JASON HIRSCHHORN:返回false。
而我们需要做的,因为如果我们 并不觉得,我们需要说我们
没有发现它。
和我们说我们要返回一个 布尔,所以我们肯定是要返回
一个bool地方。
>> 因此,让我们运行此代码。
实际上,我要 -
所以我们在终端。
我们将清除我们的窗口。
让我们把所有的。
我们发现有一个错误。
还有第15行错误,预期 分号的结束
声明。
所以,我怎么忘了?
>> 学生:分号。
>> JASON HIRSCHHORN:分号 直到这里。
我认为这是汤姆的代码。
因此,汤姆,[听不清]。
只是在开玩笑。
让我们做所有的再制作。
>> 学生:什么Dropbox的目录 我们应该在这?
>> JASON HIRSCHHORN:所以,你可以 只是看这一点。
但同样,如果你想提出这个 代码到您的pset3目录试试
出来,这就是我所做的。
如果你会发现在这里 - 对不起,很好的问题。
>> [? LS,?]
我在这里find.c代码 从本周的发行版的代码。
我有helpers.h。
我有一个Make文件我实际上是 编辑了一下,包括这些新
我们正在编写的文件。
所有这些代码将是可用的,不 分配的代码,但新
制作文件,新helpers.h文件将 是下载在网上提供。
同样地,所以这些都是在 额外的代码,我们有。
>> 因此,请所有,每本线,使得查找, 二,泡选择 - 品牌
他们三个都和编译成 这个可执行文件代码中找到。
所以一般情况下,我们不希望 直到check50。
我们要对我们自己运行一些测试。
但是,仅仅如此可加快我们这一点, check50 2013 pset3.find将通过
在helpers.c- - 我的坏。
>> 我没有说现在。
因此,我们实际上是要 运行实际的代码。
Usage.find /,你知道这意味着什么?
>> 学生:你需要第二个 在它的命令行。
>> JASON HIRSCHHORN:我需要 第二个命令行。
并根据规范要求,我需要 进入我们正在寻找的东西。
因此,让我们来看看42。
我们将保持它在排序的,因为我们 没有写一个排序功能,但 -
42,43,44。
>> 和控制D没找到 大海捞针。
这是不好的。
这是肯定有的。
让我们试试别的。
也许这是因为我把 它在开始。
>> 让我们做41,42,43。
我们走吧。
它发现了它。
让我们把它在结束现在,只 所以我们可以彻底的 -
40,41,42。
没有找到针头。
所以我提到这点。
不幸的是,我知道这 将要发生。
>> 但用于教学目的, 这是很好的探索它。
这是行不通的。
出于某种原因,它无法找到它。
我们知道什么是在那里,但 我们目前还没有找到它。
所以,有一件事我们可以做的是通过 GDB找到它,但确实有人,
无需通过GDB,有 在哪里,我们搞砸了有意义吗?
[?摩杜? ?]
>> 学生:我想可能是结束的时候 等于开头,它的
只是一个元素的列表。
然后,它会忽略它,而不是 实际检查它。
>> JASON HIRSCHHORN:这是 完全正确。
当结束等于开始,我们做 还有在我们的列表中的元素?
>> 学生:是的。
>> JASON HIRSCHHORN:是的,事实上,我们 有一个且仅有一个元件。
而这将极有可能发生时, 每次我们测试过的代码,我们在
干草堆或柜台 干草堆的结束。
这就是开始和 结局是要等于
之一,二分查找。
因此,在这两个情况下,没有工作, 因为结束等于开始。
>> 但是,如果结束等于开始, 这是否while循环执行?
它没有。
而且我们也可以检查 这再通过GDB。
那么,如何才能解决这个问题的代码,因为 当结束时等于
开始,我们也希望这 while循环运行。
>> 因此,我们可以做什么修复到第18行?
>> 学生:[听不清]大 小于或等于。
>> JASON HIRSCHHORN:完全正确。
虽然结局是大于 或等于开始。
所以,现在,我们一定要得到那 角落的情况在年底。
让我们来看看。
让我们运行此一次。
>> 让我们所有。
同样,你必须只 跟着在这里。
找到41这个时间。
只要保持一致。
>> 找到42。
让我们把它在开始 -
42,43,44。
我们发现了它。
所以这的确是变化 我们需要做。
>> 这是一个很大的编码,我们的 只是做了,二进制搜索。
没有任何人有之前的任何问题 我谨对为我们写了线
二进制搜索或者我们怎么想通 什么我们没有搞清楚?
在我们继续之前,我也想点 指出,总的来说,我们映射
我们的伪代码之一 1到我们的代码。
>> 我们确实有一个棘手的事情 找出与
开始和结束。
但你有没有计算过了,你 会写相当多的
相同的代码,保存为 那些最上面两行。
然后你会意识到,当 您在检查和案件有否规定
你需要别的东西。
所以,即使你曾跟随我们 伪代码行来行,你就已经
得到了所有,但两行 你需要编写代码。
>> 而我愿意打赌,你们 本来都想通了这一点
很快,你需要把 某种标志物在有图
出你在哪里。
这又是干什么的力量 伪代码的时间提前。
所以我们可以做的逻辑,然后再 大家可以放心使用的语法。
>> 如果我们一直感到困惑的逻辑 而试图写这段代码在C中,
我们会得到全乱了。
然后我们就可以问的问题 逻辑和语法和网格
它们放在一起。
我们会得到丢失 在哪可以迅速成为一个
非常棘手的问题。
现在让我们继续前进 要选择排序。
>> 我们还剩下20分钟。
所以,我有,我们将不能够感觉 通过所有选择排序的获得
和冒泡排序。
但是,让我们至少尝试 完成选择排序。
因此,实现选择排序使用 下面的函数声明。
>> 再次,这是从 问题设置规范。
int值是括号,是 整数数组。
和int.n是该数组的大小。
选择排序是怎么回事 这个数组进行排序。
>> 因此,根据我们的心智选择的模型 排序,我们拉 -
首先,我们通过列表中的第一 时间,找到最小的数字,
把它放在开头,找到第二 最小的数字,把它放在
如果我们要第二位置 排序按升序排序。
我不会强迫你写 伪代码现在。
>> 但在此之前我们做的代码作为一个阶级的 五分钟,我们将写
伪代码,所以我们有一些感 的我们要去的地方。
因此,尝试写伪代码 在你自己的。
然后再尝试打开该 伪代码转换成代码。
我们将做到这一点作为一个群体 在五分钟内。
>> 当然,让我知道,如果 您有任何问题。
>> 学生:那呢?
>> JASON HIRSCHHORN:看看有多少你 可以在两分钟搞定。
我知道你不会 能够完成。
但我们将在此为一组。
>> 你所有的编码等等[听不清],所以我 对不起暂停自己在做什么。
但是,让我们通过这作为一个群体。
再次,二分查找,大家给 我一个,如果没有更多行的代码。
谢谢你的。
我们打算做同样的事情 这里,作为一组一起码。
>> 所以,选择排序 - 让我们写 一些快速的伪代码。
每心智模式,可以有人给我 第一线的伪代码,好吗?
我想要什么做的?
>> 学生:虽然名单 出了毛病。
>> JASON HIRSCHHORN:OK,而 该列表是不合乎规程。
和你是什么意思“坏了?”
>> 学生:在[听不清]
没有被排序。
>> JASON HIRSCHHORN:虽然名单 出了毛病,我们该怎么办?
给我的第二行, 请,马库斯。
>> 学生:所以找到下一个 最小的数字。
这将缩进。
>> JASON HIRSCHHORN:所以找到 下一个最小的数。
然后别人?
一旦我们找到下一个最小的 数,我们该怎么做?
我要说找 的最小数量。
这就是我们想要做的。
>> 因此,找到最小的数字。
那么我们该怎么做?
>> 学生:[听不清]为开端。
>> JASON HIRSCHHORN:对不起?
>> 学生:在将其放置 开始列表。
>> JASON HIRSCHHORN:所以把它放在 在列表的开头。
而我们做的事情是什么 这是在开始
列表中的,对不对?
我们覆盖的东西。
那么,我们把那?
是啊,安娜?
>> 学生:其中最小 数字是?
>> JASON赫希洪:所以把开始 列表中的其中
最小的数字了。
因此,尽管名单已经出来的顺序,找到 最小的数字,将其放置在
该列表的开头,把 开始列表的其中
最小的数字了。
马库斯,你可以整理这条线 而名单已经出来了的秩序?
>> 学生:虽然数字 未分类的?
>> JASON赫希洪:OK,所以为了 知道这些数字都没有
排序的,什么是我们需要做什么?
有多少,我们需要 通过这个名单?
>> 学生:所以我想一个for循环,或 同时,在检查数量较少
比列表的长度是多少?
>> JASON赫希洪:好,这是很好的。
我想我misphrased 我的问题知之甚少。
我只是试图让在 我们将不得不去
在整个列表。
因此,尽管名单已经出来的顺序, 对我来说,是很难地图。
但基本上,这就是如何 我想这个问题。
通过整个列表中,找到 最小数,将其放置在
开始 - 其实,你说得对。
让我们把他们两个。
>> 因此,尽管名单已经出来了的订单,我们 需要经过整个列表
一次,找到最小的数字,地点 它在列表的开头,把
在列表的开头,其中 最小数目是,然后,如果
列表仍然失灵,我们已经 得去通过这个
进程再次,对不对?
这就是为什么选择排序,大O运行 选择排序的,任何人吗?
>> 学生:无平方。
>> JASON赫希洪:无平方。
因为像马库斯,我才意识到 在这里,我们将不得不
通过列表名单 的次数。
所以,经历的事 长度为n的n次号
其实是在Ñ平方。
>> 所以这是我们的伪代码。
这看起来很不错。
没有任何人有任何疑问, 关于伪?
因为实际上选择排序应该 大概要一对一,代码
伪代码。
因此,任何有关问题 伪代码的逻辑是什么?
现在请提问。
>> 选择排序 - 而名单已经出来了 的顺序,我们将通过它
并找出最小的每次 并把它放在前面。
因此,尽管名单已经出来了,可以顺序 有人给我说行代码谁
还没有给我行 然而,代码好吗?
这听起来像一个什么?
>> 学生:这是一个for循环。
>> JASON赫希洪:听起来 喜欢一个for循环。
OK,你可以给我的for循环?
对于 -
>> 学生:我等于0。
>> JASON赫希洪:我还是 -
什么是我们缺少什么?
善有善报就在这里?
>> 学生:诠释。
>> JASON赫希洪:没错。
(INT I = 0; -
>> 学生:我> JASON赫希洪:钉它,杰夫。
我们正在经历的列表中,右键?
我们以前见过的代码。
完美的。
所以,让我们把我们的大括号在这里。
我打算把一些 大括号在这里。
>> 因此,尽管它是0,我们需要去 整个列表。
所以每次我们去通过列表, 什么我们想跟踪的?
>> 学生:如果有任何掉期进行。
>> JASON赫希洪:查找 的最小数量。
因此,我们或许应该跟踪 最小的数字各一次。
所以,行,我可以做些什么来保持跟踪 最小是多少?
Aleha,我怎么能保持 轨道的东西?
>> 学生:开始一个新的变量。
>> JASON赫希洪:开始一个新的变量。
因此,让我们创建一个变量。
什么类型的?
>> 学生:诠释。
>> JASON赫希洪:诠释。
让我们把它称为最小的。
以及它等于什么时候 我们刚刚起步的?
我们并没有在列表中消失了呢。
我们在的第一部分 通过列出我们的第一次。
什么是平等的, 最小的数字?
>> 学生:我的值。
>> JASON赫希洪:值I。
这听起来完全正确的,对不对?
最小数目的开头 就是我们在哪里。
所以现在我们有我们最小的,我们需要 要经过整个列表和
比较这最小的 到一切。
那么,我们通过清单了吗?
迈克尔?
>> 学生:你需要做 另一个循环。
>> JASON赫希洪:另一个for循环。
让我们开始吧。
给我一些代码。
>> 学生:For循环 -
为最小 -
只是诠释J,你可以说?
= 0;使得 -
>> JASON赫希洪:嗯,如果我们想 要经过整个列表 -
>> 学生:百灵> JASON赫希洪:神奇。
我们将通过 for循环一次。
我们如何找到 最小的数字?
汤姆?
我们目前最小的数字, 那么如何才能找到新的最小?
>> 学生:我们可以检查最小 我们也数大于
重视支架Ĵ。
>> JASON赫希洪:所以,如果最小的是 比数值支架Ĵ更大。
因此,如果我们目前最小的 大于 -
我要在这两个线 对于第二个在那里的代码。
因为之前我们做任何交换,我们 需要经过整个列表。
所以这个伪代码实际上应该 在外面的内循环。
这样下去整个列表。
如果最小的大于 值Ĵ然后呢?
>> 学生:那最小的 等于值Ĵ。
>> JASON赫希洪:神奇。
一个简单的问题 -
我们第一次去通过这个循环, 我是怎么回事等于0,J是怎么回事
等于0,一旦我们在这里得到的。
所以,我们要进行比较 一个数字本身。
是有效的?
不,这不是真的有效。
因此,没有我们的Ĵ需要去 从0到n每次?
我们总是需要检查 整个列表?
[听不清]?
>> 学生:开始我代替。
>> JASON赫希洪:j的 先从什么?
>> 学生:我。
>> JASON赫希洪:j的与我开始。
所以,现在我们开始比较 有一个我们的。
但即便如此,是因为 尽可能高效?
>> 学生:我+ 1。
>> JASON赫希洪:I + 1似乎是 最有效的,因为我们
已经有我。
我们指出,由于 最小的线15。
我们将开始与 自动下单。
所以,我们通过for循环。
我们将通过各一次。
我们将通过数次。
现在,我们通过已经得到了 这种内在的for循环。
我们有最小的值保存。
我们需要将其放置在 开始列表。
所以,我怎么把它放置在 开始清单?
这是指该变量 到列表的开始?
我们在此为外循环, 还等什么指
开始清单?
>> 学生:我的值。
>> JASON赫希洪:完全正确。
值i是的开始 -
或不好意思,不是开始。
这是令人困惑的。
这也正是我们在年初 列表中的未排序的部分。
因此,重视我。
而这是什么平等?
>> 学生:最小。
>> JASON赫希洪:值i等于什么?
>> 学生:最小。
>> JASON赫希洪:最小。
完全正确。
所以我们将它放在开头 名单的,现在我们需要把
该列表的开始的地方 最小的数字了。
所以,我怎么写的地方 最小的数是?
什么价值观?
>> 学生:0。
>> JASON赫希洪:小 数字是0?
>> 学生:是啊。
>> JASON赫希洪:那如果最小 人数在年底
这个无序列表?
>> 学生:对不起,究竟是什么问题?
>> JASON赫希洪:哪里是 最小的数字?
我们采取了最小,并把它在 开始,这条线就在这里。
>> 学生:它应该有 被存储在某种 -
>> 学生:值Ĵ。
>> JASON赫希洪:嗯,这是 不一定值Ĵ。
它甚至没有在这一点上存在。
>> 学生:你要申报 一个变量更早,
然后将其分配到 -
当你发现的最小的数字, 该号码的索引分配给
一些变量或类似的东西。
>> JASON赫希洪:所以可以 你再说一遍吗?
>> 学生:那么,您声明整型 最小的,你也应该申报诠释
最小的index = i或 类似的东西。
>> JASON赫希洪:那么,我INT 最小的,我不应该只跟踪
的价值,但位置。
整型smallest_location =在这 情况下,我们就做我。
我们需要知道它在哪里。
我们到了代码的末尾,我们 意识到我们根本不知道在哪里。
于是再次,我们的映射 这在一一对应的。
你们在自己的意志编码这种 可能得到了同样的问题。
如何赫克我找到它?
然后你意识到,等待,我 需要跟踪的那个。
>> 所以,如果最小的是更大 比的值Ĵ。
我们设定最小等于值Ĵ。
我们需要改变什么?
康斯坦丁,还有什么 我们需要改变?
>> 学生:位置。
>> JASON赫希洪:没错。
所以给我的代码行。
>> 学生:smallest_location = j的。
>> JASON赫希洪:没错。
然后降底,如果我们想 放在列表的开头,其中
最小的数字是,如何 我们指该
最小的数是?
马库斯?
>> 学生:最小数为 位于最小位置。
>> JASON赫希洪:所以在价值观 smallest_location。
而我们放什么呢?
的初 列表中,那是什么?
>> 学生:嗯,我们真的不知道 了,因为我们改写。
所以这是一个交换位置 在这两行?
如果你周围的切换这两行。
>> JASON赫希洪:好了,我们不 了,因为我们已经复位线
前值i到最小。
所以我们失去了初始值。
所以你说的交换这两行。
所以现在把列表的开头 其中最小的数是。
所以smallest_location等于值I。
这是移动今年年初 的列表中的未排序的部分
最小的位置。
然后进入我的值我们正在 即最小数。
>> 这是否有意义,为什么我们 不得不作出这样的交换?
我们会覆盖该值 - 另一件事,你可能会有
想通了,并在国内生产总值中找到。
因此,我们已经照顾 所有的伪代码。
还有什么我们 需要在这里写?
有谁能够想到什么?
>> 学生:你怎么知道 当你做了什么?
>> JASON赫希洪:我们如何 知道什么时候我们做了什么?
大的问题。
那么,我们如何知道什么时候,我们就大功告成了。
>> 学生:创建一个变量来计数 如果有做了一个交换与否
并办理了一通。
>> JASON赫希洪:确定。
将工作在冒泡排序。
但对于选择排序,如果我们不这样做 做一个交换,那可能只是
因为最小的值是 在它正确的位置。
我们可能有一个列表1,2,4,3。
通过我们的第二次 不会让任何掉期。
我们将在2号,但我们会 仍然需要继续下去。
那么,我们需要跟踪的时候 我们就大功告成了,还是我们只是想去
直到完成?
>> 学生:我们可以去 直到它完成。
>> JASON赫希洪:我们可以只 去,直到这个完成。
在冒泡排序,你是完全正确的, 杰夫和Aleha,与您的解决方案 -
它是伟大的跟踪有多少 掉期你做,因为在泡沫
排序,如果你实际上做不作任何掉期, 大功告成,你也许可以减少你
问题倒有几分。
但对于选择排序,你真的 有要经过的结束
列出在每个时间。
>> 因此,这是一点。
我们有两分钟时间。
让我们所有。
让我开在这里找到,让 相信我,其实调出 -
我不是叫冒泡排序。
让我们改变这个来选择排序。
使所有/找到。
让我们来看看42。
这一次,我们要传递一个 未排序的列表中,因为它应该排序
首先,每找到代码 - 要排序 第一次使用我们的排序函数,然后
寻找的东西。
手指交叉大家。
>> 哦,我的天啊。
哇,我的心脏跳动。
所以这是正确的。
事实上,如果我们跑这更 大量的代码,尽我所能
说,是完全正确的。
还有一些建议 我会为你。
例如,15和16似乎 有点多余。
好像你不一定 需要保存这两个。
如果您有最小的位置,你 可以很容易地找到最小值
只是打字的i值。
>> 所以,如果我是被分级代码, 我其实会,我会
大概起飞点,如果你 包括这两种,因为你
不需要这两个。
如果你有位置,可以 很容易获得的价值。
这似乎有点不可思议 来存储它们。
也许不拿一个点,而是 当然评论说,这也许是
不是一个风格上的选择 你需要做。
当然,该代码仍然 运转很好。
>> 所以很遗憾,我们没 得到冒泡排序。
我很抱歉这一点。
我们确实完成选择排序。
没有任何人有任何问题,最终 关于选择排序?
>> 好了,我们才探出头来,我要你 打开你的Chrome浏览器。
对不起,这仅仅是一个赤裸裸的插头 一种类型的互联网浏览器。
你可以打开任何类型的浏览器, 但它很可能是Chrome浏览器。
和去这个网站之后 -
sayat.me/cs50。
如果你不键入您的电脑 现在,你是清楚的
不这样做,汤姆。
>> 并且请做任何权利 现在还是在接下来的一个小时 -
给我一些反馈。
这只是部分中的两个。
我们有更多的共同拥有的,所以我 有很多的提升空间。
我希望也做了一些事情做好。
所以,你可以让我觉得全是坏事,但如果 你也想给我一个笑脸
脸,我将不胜感激这一点。
填补英寸
>> 并与留一分钟, 这是三周。
我就站在外面了一下 如果您有任何疑问。
我会看到你们 讲课的明天。