罗布·鲍登：你好，我是罗布·鲍登， 让我们来谈谈quiz0。
>> 所以，第一个问题。
这就是问题所在 你需要的代码数量
127在二进制灯泡。
如果你愿意，你可以 做常规转换
从bi--或者，从十进制到二进制的。
但是这可能会 采取了大量的时间。
我的意思是，你可以弄清楚的是， OK，1是在那里，2是在那里，
4在那里，8是在那里。
更简单的方法，127是128减1。
即最左边的灯泡是128位。
所以127是真的只是所有 其他灯泡，
因为这是最左边 灯泡减1。
这是它的问题。
>> 问题之一。
因此，与3位即可 表示8个不同的值。
那么，为什么是7最大的非负 十进制整数，你可以代表什么呢？
那么，如果我们只能 代表8个不同的值，
那么我们将是 表示为0到7。
0占用的值之一。
>> 问题二。
用n位，多少个不同的 值你能代表什么呢？
所以，用n位，你有2个 可能的值的每个比特。
因此，我们有2个可能的值 第一个比特，2个可能的值
对于第二，2- 可能的三分之一。
所以这是2倍2倍2，和 最终的答案是2到n。
>> 问题三。
什么是二进制为0x50？
所以请记住，十六进制有一个非常 简单的转换为二进制。
所以在这里，我们只需要看看 在5和0独立。
那么，什么是5二进制？
0101，这是1位和4位。
什么是0的二进制？
不靠谱。
0000。
因此，只要把它们放在一起，并 这是二进制的完整号码。
01010000。
如果你想你能 起飞的最左边为零。
这是无关紧要的。
>> 所以后来另外， 什么是为0x50十进制？
如果你想，你could--如果你 更舒适的二进制文件，
你可以采取二进制的答案 并且将其转换成十进制。
或者，我们可以只记得 这十六进制。
使0是在第0位，并 该图5是在16到第一位置。
所以在这里，我们有5次16到 首先，加0次16至零，
80。
如果你看了 所有权的问题，
这是CS 80，这是一种 提示要回答这个问题。
>> 问题五。
我们有这样的划痕脚本，它是 重复4次花生酱果冻。
所以，我们现在怎么办的代码，在C？
好了，我们有这里 - 部分以粗体 就是你必须实现的唯一部分。
因此，我们有一个4循环的循环4 次，printf的，荷兰国际集团花生酱果冻，
新线的问题询问。
>> 问题六，另一个划痕的问题。
我们看到，我们正处在一个永远循环。
我们说的变量i 再递增i增加1。
现在，我们想要做的是在C有 多种方法，我们可以这样做。
在这里，我们碰巧的代码 永远循环的，而（真）。
因此，我们声明变量i，只是 像我们有变量i的划痕。
声明变量i，并永远 而（真），我们说的变量i。
所以printf的％我 - 或者你可以用过％D。
我们说的变量， 然后增加它，我++。
>> 问题七。
现在，我们想要做的事情非常相似 马里奥C点的设置问题之一。
我们希望打印这些井号标签， 我们要打印一个五
由三个矩形这些散列。
那么我们如何做到这一点？
好了，我们给你一个整体 一串代码，你只需
必须填写打印网格功能。
>> 那么，是什么PrintGrid样子？
以及你过去的 宽度和高度。
因此，我们有一个外4 循环，这就是循环
在所有的这行的 我们要打印出来的网格。
然后我们有跨嵌套4环， 这是印在每一列。
因此，对于每一行，我们打印了 每列中，一个单一的哈希值。
然后在该行的末尾，我们打印 单新走行到下一行。
这就是它整个电网。
>> 问题八。
像PrintGrid一个函数被认为是 有一个副作用，而不是返回
值。
解释的区别。
因此，这依赖于你记住 一个副作用是什么。
好了，回归value-- 我们知道PrintGrid不
有返回值，因为 在这里它说无效。
因此，返回void什么 并没有真正返回任何东西。
那么什么是副作用？
那么，一个副作用是 什么样的是坚持
该函数结束后 这不是刚刚回国，
而且它不只是从投入。
>> 因此，举例来说，我们可能 改变一个全局变量。
这将是一个副作用。
在这个特殊的情况下， 非常重要的副作用
被打印到屏幕上。
所以这是一种副作用 这PrintGrid了。
我们打​​印这些东西到屏幕上。
你能想到的 这作为副作用，
因为这件事情， 坚持这个函数结束后。
这范围之外的东西 这个功能的最终
被改变，则 屏幕的内容。
>> 问题9。
考虑下面的程序， 哪个行号
已经被添加为 就事论事。
因此，这个程序我们只是 打电话的GetString，将其存储
在此变量s，然后 打印该变量s。
行。
因此，解释为什么行一个存在。
＃包括CS50点小时。
为什么我们需要＃包括CS50点H +
嗯，我们正在调用 GetString的功能，
和GetString的定义 在CS50库。
所以，如果我们没有 ＃包括CS50点H，
我们将得到的隐式声明 中的GetString函数错误
从编译器。
因此，我们需要包括library-- 我们需要包含头文件，
否则，编译器不会 认识到GetString的存在。
>> 解释为什么两个线路是否存在。
因此，标准的IO点小时。
它是完全一样的 如前面的问题，
除了没有处理 GetString的，我们谈论的printf。
因此，如果我们不说，我们需要 包括标准的IO点H，
那么我们就不能 使用printf函数，
因为编译器 不知道这件事。
>> Why--有何意义 无效的四线？
所以在这里我们有INT主要（无效）。
这只是说，我们 没有得到任何命令行
参数为主。
请记住，我们可以说INT 主要整型的argc字符串argv的括号内。
所以在这里我们只说空说，我们 被忽略的命令行参数。
>> 说明，相对于存储器，恰 什么样的GetString的直列六缸回报。
GetString的是返回的块 存储器，字符数组。
这真是一个返回 指针的第一个字符。
请记住，一个字符串是一个char明星。
所以s是一个指向第一个 字符的任何字符串
该用户输入的键盘。
而且内存恰好是malloced， 使内存堆中。
>> 问题13。
考虑下面的程序。
所以，这一切的计划是做 是的printf-荷兰国际集团1除以10。
所以，在编译时和 执行该程序
产出0.0，即使 1除以10是0.1。
那么，为什么它是0.0？
那么，这是因为 的整数除法。
所以图1是一个整数，10是一个整数。
因此，1除以10，一切 被视为整数，
而在C中，当我们做整数除法， 我们截取小数点。
因此，1除以10 0，然后我们试图
打印，作为浮点数，所以 零印作为浮点数0.0。
这就是为什么我们得到0.0。
>> 考虑下面的程序。
现在，我们正在打印0.1。
因此，没有整数除法， 我们只是打印0.1，
但我们在打印 28位小数。
我们得到这个0.1000，一大堆 零，5 5 5，等等等等。
因此，这里的问题是，为什么它 打印，而不是正好是0.1，？
>> 因此，这里的原因是现在 浮点不精确。
请记住，一个浮动的只有32位。
因此，我们只能代表数量有限 浮点值与32
位。
那么有最终无限 许多浮点值，
并有无限多的浮动 在0和1之间点值
我们很明显的能 代表比甚至更多的价值。
因此，我们必须做出牺牲 能够代表最值。
>> 因此，像0.1的值，显然 我们不能代表完全一样。
而不是代表0.1，所以我们做的 最好的，我们可以代表这个0.100000 5
5。
那是相当接近，但 对于很多应用程序
你不必担心 浮点不精确，
因为我们只是不能代表 所有浮动点完全吻合。
>> 问题15。
考虑下面的代码。
我们只是打印1加1。
所以这里没有窍门。
1加1的计算结果为2，且 那么我们打印了。
这只是打印2。
>> 问题16。
现在，我们要打印的字符 1加1的字符。
那么，为什么这个不 打印同样的事情？
以及人物1加字符 1，字符1的ASCII值为49。
所以这真的是说49加49，和 最终这将打印98。
因此，这不打印2。
>> 问题17。
完成实施 在这样一种方式之下奇
该函数返回true，如果 n为奇数和假当n为偶数。
这是一个伟大的目的 对于mod运算符。
因此，我们把我们的参数n， 如果n MOD 2等于1，以及
这意味着n除 由2有剩余。
如果n除以2有一个余数，即 也就是说n为奇数，所以我们返回true。
否则我们返回false。
你也可以做N模等于2 零，则返回false，否则返回true。
>> 考虑递归函数如下。
因此，如果n小于或 等于1，则返回1，
否则返回n次F N减1。
所以，这是什么功能？
好吧，这只是 阶乘函数。
这是很好的代表 随着n的阶乘。
>> 所以，问题19，现在，我们要 借此递归函数。
我们想让它反复。
那么，如何才能做到这一点？
以及为员工 溶液中，并且再次有
你可以做多种方式 这一点，我们先从这个INT产品
等于1。
和本 for循环中，我们将
最终要乘以产品 结束与全因子。
所以，对于int i等于2，我是 小于或等于n，我+ +。
>> 你也许会奇怪，为什么我等于2。
好了，记住，下面我们就来 确保我们的基本情形是正确的。
因此，如果n小于或等于 1，我们只是返回1。
所以在这里，我们开始在i等于2。
那么，如果我是1，那么the--或 如果n为1，则对环
会不会执行的。
因此，我们将只 返回的产品，这是1。
类似地，如果n是 任何小于1--
如果它是0，负1，whatever-- 我们还是要回到1，
这正是 递归版本做。
>> 现在，如果n是大于 大于1，那么我们就要
这样做至少有一个 迭代这个循环。
所以我们可以说，n是5，那么我们就 要做到产品的时间等于2。
所以，现在的产品是2。
现在，我们要做的 产品的时候等于3。
现在是6。
产品多次等于4，现在是24。
产品倍等于5，现在是120元。
这样的话，最终，我们返回 120，这是正确的5阶乘。
>> 问题20。
这是一个你必须填写 在该表中的任何给定的算法，
任何事情，我们已经看到，这 符合这些算法的运行
这些时代渐近运行时间。
那么，什么是一个算法， 欧米茄是1，但为n的大O？
所以有可能是无限 很多答案在这里。
我们已经看到了可能是最一 经常只是线性搜索。
>> 因此，在最佳情况 情况下，我们的项目
寻找的是在 开始列表的
所以在1步欧米茄， 我们检查的第一件事，
我们只是立即返回 我们发现该项目。
在最坏的情况下， 该项目是在末端，
或产品不在列表中的。
因此，我们必须寻找 整个列表，所有的n
元素，这就是为什么它是0：N的。
>> 所以，现在它的东西，既是 欧米茄的n log n的和正数为n的大O。
以及最相关的事情 我们在这里看到的是归并排序。
所以，归并排序，请记住， 最终THETA
的n log n，其中THETA定义的 如果两个欧米茄和大O是相同的。
以上所说的n日志N。
>> 有什么东西是欧米茄 的n和n阿方？
好吧，再有 多种可能的答案。
在这里，我们碰巧说冒泡排序。
插入排序也将在这里工作。
请记住，冒泡排序 具有优化的地方，
如果你能得到 整个列表
而不需要做 任何掉期，然后，嗯，
我们可以立即返回 列表进行排序开始。
所以，在最好的情况下， 它只是欧米茄的n。
如果它不只是一个很好的 排序的列表，首先，
那么，我们有n个阿方互换。
最后，我们选择排序 对于n的平方，两个欧米茄和大O.
>> 问题21。
什么是整数溢出？
好了，类似于早期， 我们只有有限个位
来表示的整数， 所以也许32位。
比方说，我们有一个有符号整数。
那么，最终的最高 正数，我们可以代表
为2至31减去1。
那么，如果我们试图发生 然后增加该整数？
好了，我们将在2要到31 减1，一直到负2路
到31。
所以这个整数溢出 当你不断递增，
最终你不能 得到任何提高，它只是
包装所有的方式回到 周围为负值。
>> 那么缓冲区溢出？
所以缓冲overflow-- 记得一个缓冲区。
它的内存只是一大块。
类似数组是一个缓冲区。
因此，缓冲区溢出是当 您尝试访问的内存
超出该阵列的端部。
所以，如果你有一个 5号和您的阵列
尝试访问阵列支架 5或6架或支架7，
或超越什么 端，或甚至任何
below--阵列支架负面1-- 所有这些都是缓冲区溢出。
你触碰内存在恶劣的方式。
>> 问题23。
所以在这一块你需要 实现strlen的。
我们告诉你，你可以 假设的意志不能为空，
所以你不必 做任何检查空。
并有多种方式 你可以这样做了。
在这里，我们只取简单。
我们先从一个计数器，N。 n为 计算有多少个字符有。
因此，我们从0开始，然后我们 遍历整个链表。
>> 为s托架0等于 空值终止符？
请记住，我们正在寻找 空终止符
以确定多长时间我们的字符串是。
这是要终止 任何相关的字符串。
所以是S支架等于0 以空终止？
如果不是，那么我们要 看看在s支架1，S 2架。
我们继续下去，直到我们 找到空终止。
一旦我们发现了它，那么n包含 字符串的总长度，
我们可以只返回。
>> 问题24。
因此，这是一个，你 必须做出权衡。
所以，有一件事是在一个很好的 的方式，但以何种方式是坏？
所以在这里，归并排序趋于 比冒泡排序快。
尽管如此that--很好，有 多个答案在这里。
但最主要的是，冒泡排序 是欧米茄的n的有序表。
>> 还记得我们刚才前面看到的那个表。
所以，泡各种各样的欧米加 N，在最好的情况下
是它能够只走了过来 列表中一次，确定
嘿，这个东西已经是 分类和回归。
归并排序，不管是什么 你这样做，是正数为n的欧米茄。
因此，对于排序的列表，泡沫 排序将是更快的。
>> 现在来谈谈链表？
这样一个链表可以增大和缩小 根据需要以适合尽可能多的元素。
话虽如此that-- 通常的直接比较
将是一个链接 列出与阵列。
因此，即使阵列可 轻松地扩展和收缩
以适应尽可能多的元素 根据需要，一个链表
相比于一个array--一个 数组随机访问。
我们可以索引到任何 所述阵列的特定元素。
>> 因此，对于一个链表，我们不能 只要到了第五元素，
我们必须从一开始遍历 直到我们得到的第五元素。
而这会阻止我们 做类似二进制搜索。
说起二进制搜索，二进制搜索 往往比线性搜索更快。
尽管如此that-- 因此，一种可能的事
是你不能做的二进制 搜索链表，
你只能做的阵列。
但或许更重要的是 你不能做二进制搜索
在未排序的数组。
前期可能需要进行排序 数组，然后才可以
你做二进制搜索。
所以，如果你的东西是不是 排序，首先，
然后线性搜索可能会更快。
>> 问题27。
因此，考虑下面的程序， 这将在下一幻灯片。
这是一个在那里我们 会想明确说明
的值不同的变数。
因此，让我们看一下。
>> 因此，行一个。
我们有整数x等于1。
这就是发生的事情，唯一的事。
因此，在一行中，我们看到我们的 表中，Y，A，b和tmp中都
昏了过去。
那么，什么是X？
嗯，我们只是将它设置为1。
然后两线，好吧， 我们看到的是y被设置为2，
而且该表是已 填补了我们​​。
所以x是1，y是2。
>> 现在，三线，我们现在是 里面的交换功能。
没有我们通过什么来交换？
我们通过符号X的 一，和符号Y表示B。
问题出在哪里更早 表示x的地址
是0x10的，和y的地址为0×14。
所以a和b都等于 为0x10和0x14的分别。
>> 现在，在3线，什么是x和y？
好了，一切都没有改变 关于x和y在这一点上。
即使他们是 主堆栈帧里面，
他们仍然有同样的 价值观，他们以前那样。
我们没有修改任何内存。
因此x为1，y为2。
行。
所以现在我们说INT TMP等于一个明星。
因此，在四号线，一切 是除TMP一样。
我们没有改变任何值 任何东西，除了TMP。
我们正在设置TMP等于一个明星。
什么是明星？
好了，点X，所以一个明星 将会等于x，它是1。
所以，一切都被复制 下来，而tmp中被设置为1。
>> 现在的下一行。
明星等于星级的住宿。
因此，通过线five--好了，一切都 除非是无论明星是一样的。
什么是明星？
好了，我们刚才说的明星为x。
所以，我们正在改变x等于明星B。
什么是明星B？年。 B点为y。
所以，明星B为y。
因此，我们设定X等于Y， 和其他一切是一样的。
因此，我们的下一行中看到，x是现在 2，剩下的只是抄了下来。
>> 现在，在下一行，星B等于tmp目录。
好了，我们刚才说的星b为Y， 所以我们则设置y等于tmp目录。
其他的都是一样的， 所以一切都被复制下来。
我们则设置y等于tmp中，这是 一个，其他都是一样的。
>> 现在，终于，七号线。
我们又回到在主函数。
我们交换完成后。
我们已经失去的a，b，和 TMP，但最终我们
不更改任何值 在这一点上任何东西，
我们只要复制x和y下来。
而且我们看到，x和y是 现在2和1，而不是1和2。
交换成功执行。
>> 问题28。
假设你遇到 该错误消息
办公时间如下 明年的CA或TF。
提醒如何修复这些错误。
所以未定义的引用给GetString。
为什么你可能会看到这个？
好吧，如果学生使用 GetString的在他们的代码，
他们正确地散列包括CS50 点h至包括CS50库。
>> 那么，他们是怎么 要解决这个错误？
他们需要做一个破折号lcs50在 当他们编译的命令行。
因此，如果他们不通过 铛破折号lcs50，他们是
不会有实际 实现GetString的代码。
>> 问题29。
隐式声明 库函数strlen的。
嗯，这现在，他们都没有 做正确的散列包括。
在这种特定情况下，在头文件 他们需要包含的字符串点H，
而包括串点H，现在 现在student--编译器
有权访问 strlen的声明，
它知道你的代码 正确使用strlen的。
>> 问题30。
更为％的转化率 比数据参数。
那么这是什么？
清楚地记得，这些百分比 signs--他们是如何相关的printf。
因此，在我们的printf可能percent-- 我们可以打印的东西
像我百分之反斜杠ñ。
或者我们可以像打印百分之一， 空间，百分之一，空间，百分比我。
因此，对于每一个这些 百分号，我们需要
传递变量在printf的末尾。
>> 所以，如果我们说的printf括号％的 我反斜杠N分别闭合的括号，
好了，我们说我们是 将要打印的整数，
但我们不通过的printf 一个整数，以实际打印。
所以在这里更多的百分 转换不是数据的参数？
这是说，我们有 一大堆的百分数，
我们没有足够的变量 实际上填写的百分比。
>> 然后肯定，对于问题31， 在一个块肯定瘦了40个字节。
所以这是一个Valgrind的错误。
这是说， 在某个地方你的代码，
你有一个分配是40 字节大的，所以你malloced 40个字节，
你永远不会释放它。
最有可能你只需要 找一些内存泄漏，
找到你需要 释放内存此块。
>> 和问题32， 无效的写入大小4。
再次，这是一个Valgrind的错误。
此不必做 现在有内存泄漏。
这是最likely--我的意思是，这是 某种无效的内存权利。
而最有可能的，这是一些 排序缓冲区溢出。
在那里你有一个数组，也许 一个整型数组，让我们
说这是大小5，你 尝试触摸阵列支架5。
所以，如果你试图写入该 值，这不是一块内存
你实际上可以访问，并 所以你会得到这个错误，
说大小4无效写。
Valgrind的是要认识到你 试图不恰当地触碰到内存。
>> 就是这样的quiz0。
我罗布鲍登，这是CS50。