罗布·鲍登:你好,我是罗布·鲍登, 让我们来谈谈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。