[评论:测验1] [阿里的Nahm,Oreoluwa Barbarinsa,卢卡斯塔斯,罗布鲍登] [哈佛大学] [这是CS50。] [CS50.TV] [卢卡斯塔斯]欢迎大家。这是审查测验1。 正如一个声明,这是 - 我的意思是,我们要尽量覆盖 尽可能多的材料成为可能,但是,这并不意味着 我们将覆盖所有的东西,可以在测验1。 所以,要确保你也来看看演讲,路段,一切,你可以。 测验1将是周三,下周三。 所以一定要学习。这将是,相当多,像第一次测验 关于它的格式,但它可能将是更难。 至少,在去年的时候我花了50,我还以为是更难。 所以,学习了很多。 >>我要说的是,数据结构和哈夫曼编码。 这一点是很多人都认为是复杂的, 但我要去尝试,使之尽可能简单。 首先,我们要你们知道问答1什么是 了解每个数据结构,我要呈现的概念性描述。 这意味着,你不必实际 在你的测验1实现一个哈希表。 我们不想让你实现一个整体的哈希表,也许我们会尽力 让你实现一些功能, 最常见的操作,但我们不会让你实现一切。 所以,你了解每个数据结构背后的概念很重要 并且还可以为您能够在C代码, 只是他们对每一个数据结构中最常见的操作。 并且还能够审查指针和结构, 因为他们出现了很多在这些数据结构。 >>首先,链表。链表实际上是非常相似的阵列, 但是链表和数组之间的差别, 首先,这是一个链表有一个非常灵活的尺寸, 而在数组,你必须要么选择一个非常大的规模为阵, 所以你知道你要能够存储所有的数据在阵列中, 或者你必须使用malloc有数组的长度灵活。 在链表它很容易就得到更多的元素, 把更多的元素在链表或删除元素。 而实际上,如果你不想链表进行排序, 您可以搜索并删除在常数时间的元素, 所以为O(1)的时间,所以这是非常方便的。 你一定要小心,要永远记住malloc和free的节点, 只是因为如果你不这样做,你就会有内存泄漏。 所以链表 - 一个节点的定义就像我们所拥有的权利在那里。 我把整数n,但是你可以存储你想要的任何数据。 所以,如果你想存储一个字符串,它的罚款。 如果你想存储一个结构,它的罚款,双,任何你想要的。 我只是把INT N为这里的例子。 和你有一个指向下一个节点。 因此,基本上是一个链表有一些数据,然后将它指向下一个节点。 如果它在链表中的最后一个元素,它会指向NULL。 所以这是一个链表的示例。 >>好了,现在让我们来看看我们应该做的,如果我要插入一个链表的元素。 首先,一个函数插入将是void类型 因为我不想返回任何东西。 我要去参加一个int作为参数, 因为我想知道我要插入。 那么什么是我应该做的第一件事?嗯,我应该用malloc上newnode, 所以这是第一行。 我只是创建一个新的节点放在一个链表。 所以,我能做些什么?好吧,我们知道,在我们的链表的实现 在课堂上,我们总是把头部作为一个全局变量。 所以,我们能做的就是改变头。 我可以使这个新的节点是新的头, 并且它要指向以前头。 我们怎样才能做到这一点?首先我必须做的 改变是在新的节点值'N', 这是传递给函数。 然后newnode下一步将是头部。 头将被newnode。所以这是非常简单的。 若要删除一个节点,我们可以像 - 我们能做到这一点的方法之一是说, 好吧,如果我想删除,例如,3, 有什么我可以做的就是指向前一个节点 到3的下一个节点。 所以,我只想做这样的事情。 但是,什么是这样做的问题? 我有内存泄漏,所以我不能够访问数字3了。 与该问题是,我不打算要能够释放该节点。 我要去有内存泄漏和(不知所云)是要恨我。 而不是这样做的话,我也许应该有一个临时指针。 所以我把温度。它要指向我要删除的节点。 然后我就可以将以前的节点指向下一个节点 我要删除的节点。 终于,我可以自由的指针。 我一定要自由,我创建了在那里的指针? 我没有要,只因为 - 不同的是,该节点被用malloc创建 所以它是在堆中,而这本是刚刚宣布为在堆栈中一个NULL开关。 所以,我没有释放它。 >>好吧。所以,现在让我们来谈谈栈。 栈是相当简单的。 我们只是使用数组一样栈和队列的类, 但你应该很熟悉 - 只是知道 您还可以使用链表以及队列做堆栈。 所以,如果你有一个数组,这将是一个栈? 堆栈,首先,必须有一个尺寸。 你要存储什么是你现在所拥有的栈的大小。 而你也将有一个数组,在数量上的这种情况下, 但如果你愿意,也可以是一个数组 字符串,结构的数组,要存储任何东西。 有关堆栈:堆栈和一个链表的区别 是在栈中,只能访问到被放置在堆栈中的最后一个元素。 这就是所谓的后进先出。 就像你有一摞托盘, 如果你把一个托盘上的堆栈的顶部, 你必须先删除该盘有机会到其它纸盘。 这是同样的事情栈。 所以,如果我想,例如,一个元素添加到堆栈中,我该怎么办? 这就是所谓的推,它是非常简单的。 你所要做的第一件事是检查是否堆栈的大小 不是大于或等于所述堆栈的容量。 因为如果你已经是在满负荷生产,可以不加任何东西。 然后如果没有,你只需要在元素添加到堆栈中。 最后,增加的大小。所以这是非常简单的。 所以,我想补充的数量2。 如果我想弹出,这意味着我想删除 已添加,并返回该元素的值的最后一个元素, 的第一件事,我要检查的是,堆栈不为空。 因为如果它是空的,我不能返回任何东西。 在这种情况下,我返回-1。 否则,我将减小规格的大小, 并返回数字(s.size)。 为何我递减的大小,然后返回s.size? 这是因为,在这种情况下,该规范具有大小为4, 我想返回的第四个元素,对不对? 但是,什么是第四个元素的索引?三。 由于我的大小 - 将是3,我可以只返回s.numbers(s.size) 因为它是3。所以它只是索引。 >>现在排队。队列是几乎同样的事情。 唯一的区别是,而不是具有最后在于,第一列, 你必须先入先出。 或许,如果你等着去看演唱会, 你会不会很高兴,如果你有一个堆栈,而不是一个队列。 作为最后一个人来将进入演唱会的第一人。 你可能不会得到幸福。 在队列中的第一人获得在也是第一人出去。 因此,在一个队列的定义中,除了在阵列中具有的大小, 你也得有头,这是该指数到堆栈的头。 因此,第一个元素现在。 排队是一回事推栈。 如果你是非常幼稚的,你只说, 好了,我可以做同样的事情,因为我做了推送。 我可以检查它是否不超出能力。 如果是,我返回false,否则我可以导出新的价值 然后递增的大小。 但为什么这是错的? 让我们来看看这个例子。 我试图排队了一堆东西, 然后我会和出队入队。 有很多的命令,但它是非常简单的。 我要去排队5,所以加5,然后7, 1,4,6,然后我想离队的东西, 这意味着我将要删除第一个元素。 所以我要删除的号码3,对不对? 第一个元素。好吧。 现在,如果我尝试排队别的东西,有什么事情发生? 据我的实现, 我打算把下一个数字索引q.size。 在这种情况下,大小为8, 所以该指数8将在这里的最后一个位置。 如果我尝试入队1在这里,我将覆盖的最后一个位置 为数字1,这是完全错误的。 我想要做的就是环绕并进入到第一个位置。 也许你只是说,好吧,我只需要检查 如果我能真正把东西存在。 如果没有,我只是说,哦,新的满负荷生产 其实容量 - 1,你不能把一个元素存在。 但是,是什么问题?问题是,如果我只是出列的一切就在这里 然后我尝试添加别的东西,它只是说, 好了,你是在满负荷,这是0。 所以,你的队列消失了。 你有环绕和环绕着的一种方式 那你们的远见卓识和其他pset中了解到,使用MOD。 你可以在家里尝试理解为什么你会做q.size + q.head MOD能力,但如果你在这里检查, 我们可以看到,它的工作原理。 因此,在最后一个例子,q.size为8 和头部为1,因为它是这个位置在这里的数组。 所以这将是8 + 1,9。国防部容量9将是0。 它会去到索引0。我们会在合适的位置。 然后尝试队列在家里。 一些重要的事情:试着去了解栈和队列之间的差异。 在家里,试图让很熟悉执行入队,出队,push和pop。 同时也明白什么时候你会使用它们。 >>因此,让我们放松10秒,一帮小宠物。 现在让我们再回到数据结构。 哈希表。许多人被吓坏了哈希表。 在问题设置6,拼写检查器。 哈希表和尝试,很多人会害怕他们。 他们认为,他们很难理解。是吗? [罗布鲍登]习题集5。 >>习题集5,是的。感谢罗布。 是啊。六是哈夫N'噗,是啊。 习题集5被拼写检查,而你不得不使用一个哈希表或一试。 很多人以为自己是超级很难理解,但他们其实很简单。 什么是哈希表,基本上?哈希表是链表的数组。 数组和哈希表的唯一区别 是,在哈希表中你有一些所谓的哈希函数。 散列函数是什么? 我不知道,如果你们可以在这里阅读。 这是一个哈希表的一个例子。 所以,你可以看到,你有31个元素的数组。 而我们在做一个哈希表是什么有一个散列函数 这是要翻译的关键,每个INT到一个索引。 如果,例如,如果我要选择适合B.哈里森, 我会把B.哈里森在我的哈希函数, 和散列函数将返回24。 所以我知道我想要存储B.哈里森在24。 所以,这只是有一个数组,并有一个哈希表之间的差异。 在哈希表你就会有一个是要告诉你一个函数 在哪里存储您要存储的数据。 对于散列函数,你要寻找一个哈希函数 这是确定的,均匀分布。 正如你可以在这里看到,你看到了很多,我想存储数据的竟是19 而不是使用31和30和29,这都是免费的。 所以我使用了哈希函数不是很均匀分布。 当我们说分布均匀,这意味着我们想拥有, 粗略地说,至少有1或2个为每个 - 像,1或2中的每个阵列的指数的差异。 你想有,大致在每个链表元件的阵列中的相同的编号。 并可以很容易地检查它是否有效的哈希表中,查看哈希表。 >>然后树。这是一棵树。 在计算机科学中的树木是倒挂的一些原因。 所以,在这里你有树的叶子的根部,然后。 你应该知道的术语为家长和孩子。 每个节点都有它的孩子,这是属于母公司下面的节点。 因此,举例来说,2将是父为3和另一子在那里, 而3将是父为1,其余的孩子,都在那里。 和1将是3的孩子,等等。 我们有一些更有趣,叫做二叉搜索树, 其中一个节点的右侧所有的值 将要在右边,就在这里 - 在右边, 要大于在根元素。 所以,如果我有5号在这里,所有的右边元素 将要大于5,并且在左侧 所有的元素都将是小于5。 为什么这是有用的? 好吧,如果我要检查,如果数字7是在这里,例如, 我只是去5第一,我要去看看,是不是5 7或大或小? 这是更大的,所以我知道这将必须在树的右侧。 所以,我有少得多的东西来看待。 在实现二叉搜索树,节点,我只是要必须有数据, 所以诠释n;你也可以有一个字符串 或者你想要的任何东西。 你一定要小心,在界定什么是更大的,什么是少。 所以,如果你有字符串,例如,你可以定义 所有这些东西放在右边将会有更大的长度, 左边将会有更低的长度,所以它真的取决于你。 >>我如何能实现找到BST? 我们必须做的第一件事就是检查根是空的。 如果是NULL,则这意味着该事情是不存在的 因为你甚至没有一棵树,对不对? 于是我返回false。 否则,我要检查,如果数量大 比在根目录中的值。 我要去尝试找到正确的元素 的树状结构。 你看,我在这里使用递归。 然后,如果它的不足,我要去看看左边。 终于,否则,如果它不小于或不大于, 这意味着它本身的价值。 于是我就返回true。 你可以在这里看到我使用,如果,如​​果,如​​果。 请记住,在测验0,我们有一个问题,如果有如果,如果, 而你应该找到效率低下, 而效率低下是你使用,如果。 你应该使用,如果,否则,如果,否则,如果和其他人。 所以,我应该用别的if和else if和else这里? 有没有人 - 耶? [学生来讲,无声] 那很完美。所以,她说,不要紧, 只是因为我们之前所拥有的低效率 是因为,也许,如果某些条件被满足, 所以你执行的操作,但随后你要检查所有的其他条件。 但在这种情况下,它返回的时候了,所以没关系。 所以,你不必如果要使用其他。 >>最后,让我们来谈谈尝试, 这是每个人的最爱。 一个try是阵列的树。 它非常快速查找值,但它使用了大量的内存。 这通常过滤的话,那么当你 想要实现,例如,我不知道,像电话簿中的电话 并且希望能B型 而只是谁的人有二名 它非常容易使用try来实现,例如。 在一个try你如何定义一个节点? 你只需要拥有一个bool,是要被is_word。 它表示使用的所有字符的节点之前, 你能形成一个字, 然后你就会有一个指针数组节点。 你可以看到,我们有父节点的数组,所以节点*数组?是吗? 因此,让我们来看看如何将工作。对于拼写检查, 我们有27个元素的数组, 因为我们拥有所有的字母加上单引号。 在这里我只是要使用2,因为我希望能够在黑板上写字。 好吧。所以这是一个尝试的一个例子。 如果我只是定义的第一个节点,我将有2个元素的数组 这2个指针为NULL,所以我只是把'A'和'B'。 我要去有一个bool,说is_word。 这将是虚假的第一个, 只是因为,在这之前你没有任何字符。 因此,一个空字是不是一个词。因此,它是假的。 如果我想'一'加入到这个字典中,那么我有什么关系? 我只是将malloc为'一'一个新的节点, 然后将其单词添加为true。 因此,它只是表示有'一'将是真实的。有意义吗? 那么如果我想添加'BA',我得的malloc 1'B', 然后我要去布尔设置为false, 因为'B'本身不是一个字。 然后我会用malloc另一个为'A',所以'BA', 然后我要建立它的一个字为true。 因为'BA'这个词。 然后如果我想看看'b'是本词典, 我可以去到的第一个,'B'。我要下去,我看是字,和它说假的。 所以它不是一个字。如果我要检查'BA', 我去的第一个,'B',然后去'一',我看真正的,所以它是一个字。有意义吗? 很多人通过尝试感到困惑。没有? >>最后,Huffman编码。霍夫曼编码是非常有用的 为了节省内存和压缩文本文件, 只是因为很多你用'a'和'E',例如时间, 在文档中,但我不知道,如果你们使用'Q'或'Z'为多。 刚走1个字节为每一个字符, 每一个 - 在256个字符,我们在ASCII表不是很理想, 只是因为有您使用更一些字符, 所以你应该使用更少的内存为那些。 我如何使用霍夫曼编码? 我们要做一个哈夫曼树。  哈夫曼树有节点 有,是要像,'A','B','C',信的象征, 不管信你,一个频率,这个词出现在文本的频率, 您正在创建哈夫曼树, 然后,是要指向哈夫曼树的左节点 并且,是要指向正确的另一个节点。所以就像一棵树。 你如何建立一个哈夫曼树? 你会挑2个节点具有最低频率。 如果你有一个领带你要挑2个节点 具有最低的ASCII值也是如此。 然后,你要创建一个新的树掉那些2节点 这是要在父节点的合并次数。 然后你会从林中删除了2名儿童 并与家长进行更换。 而你要再说一遍,直到你只有1棵树在森林里。 因此,让我们看看你会怎么做一个哈夫曼树ZAMYLA。 你可以在这里看到,所有的字母有频率1,除了“A”,即具有频率2。 所以我创建了所有我整理的ASCII值和频率的字母节点。 所以,如果我要创建的第一棵树,它会以'L'和'M'。 所以它在这里。该对的频率将是2 因为它是1 +1,然后在接下来的2具有最低的频率是“Y”和“Z”。 然后,我有所有的人是 - 有2的频率。 那么哪些是那些有下一个最低的ASCII值? 'A'和'L'。所以我创建了新的节点, 最后,它是4和2,因此2将是在左边。 这就是哈夫曼树。 然后,如果我想写一些文字, 像二进制转换为文本,使用霍夫曼树是很容易的。 举例来说,如果我说移动到左边是一个0和移动到右边是一个1, 什么是去代表什么? 因此,像1,1,所以右,右, 然后0,所以左将L,然后1,0,0。 所以,1,0,所以只是1,0,'A'。 然后0,1,因此“Z”。 然后1,0,0 - 没有。 0,0将是'Y',那么懒惰。 所以,这一切对我来说,罗布的去接管。 [罗布鲍登]所以,​​每周7的东西。 我们已经得到了很多去了真快。 位运算符,缓冲区溢出, CS50库,然后HTML,HTTP,CSS。 所有在像15到20分钟。 位运算符。有他们的6,你需要知道的。 按位与,按位或,异或,左移,右移,而不是。 右移,而不是你在演讲几乎没有看到的。 我们就去了它很快在这里,但它是很好的了解,这些都是存在的6。 请记住,按位运算符是当你做3 + 4等。 你所面对的并非是3和4的二进制文件。 与位运算符实际上是在处理数字3和4的各个位。 >>所以我们会说的第一个是按位没有, 而它所做的就是翻转所有位。 所以在这里,如果你正在写在C,你不会写 作为〜11011或什么的,你会写什么样子〜4, 然后将翻转的4的二进制表示。 所以在这里,〜的一些二进制数1101101是要精确地翻转全1到0和1的全0。 正如我说有,经常利用这一点, 我们会看到它的有点,就像是我们要拿出一些数字 其中所有的位都为1,除了其中之一。 因此,它通常更容易表达数 其中只是单位被设置, 然后利用它的〜,所以每隔位被置位,除了那一个。 所以,这就是我们要使用更多的位。 >>按位或。这里有2二进制数,而这些2号 有相当代表性,因为它们代表每一个可能的 位的组合,你可能需要进行操作。 在这里,当我逻辑或运算的每一位,我们只是将直降比较。 这样的左侧,我们有一个1和1。 当我按位|那些,我该怎么走?之一。 然后按位| 0和1是要给我吗?之一。 按位1和0的将是同样的东西,1。 按位0 | 0是要给我0。 所以,在这里我得到0的唯一情况是在0 | 0例。 和你能想到的,就像你的逻辑OR。 所以,如果你认为1为真和0为假,同样的道理也适用于这里。 所以,真正的或真实不虚;真或假为真。 或真或假为真,假的还是假的是唯一的事情,实际上是假的。 下面是你应该知道的例子 作为一个相当不错的,当位运算符的使用的例子。 在这里,如果我们或大写A与OX20, 我们将看看这些在第二,我们得到的东西。 如果我们还是小写'A'与OX20,我们得到的东西。 因此,让我们拉起ASCII表。 好吧。在这里,我们看到,'A'是 - 在这里,我们有'A'是十进制的65。 但我会去用十六进制,这是Ox41。 敢肯定,我们看到它在课堂上。我认为,我们看到它在课堂上 这是很容易转换为十六进制二进制。 所以在这里,如果我想要把4成二进制, 这只是将是0100。 这是1个位,2个位,4个位,所以这是4。 然后,我可以一拆二,这将是0001。 所以这将是二进制“A”的表示。 以小写字母'A',它现在将是Ox61, 在那里,这些分裂成它的二进制,所以6 - 让我们真正做到这一点 - 有没有橡皮擦?橡皮擦。 Ox61。因此分裂6成二进制将是0 + 4 + 2 + 0。 和分割1将是0001。 看着这两个之间的区别, 我们看到,一个小写和大写“A”之间的唯一区别是这样的单个位。 于是又回到这里 - 好吧。 回来到这里,如果我们再看一下位OX20是, 因此分裂OX20转换为二进制, 是0010,0000。 OX20,所设置的唯一的一点是此位是我们所关注的, 资本和小写'A'之间的切换。 如果我或'A',这是这个,'A', 如果我或'A'与OX20, 我该怎么走? [学生,无声] >>小写字母'A',因为它会翻转该位为1。 如果我或'a'与OX20,我该怎么走? 小写a,因为刚奥林格'A'与OX20, 我只是将要奥林格此单位为1,它已经是一个1,所以也无所谓。 因此,我们得到'A'和'a'。 >>按位与。同样,我们可以认为这是我们的逻辑和对应。 在左侧,我们有真正的和真实的。 这将是真实的,并为所有的情况下, 假及真或真,假,假,假, 没有这些东西都是真实的。 因此,我们最终得到的是1000。 所以,现在,这里,这里就是我用的值得信赖的按位没有, 在那里我们有OX20。 因此,这是OX20。 现在我想做的事情,按位OX20的〜。 这是要翻转的所有位。 所以,我有1101 1111 所以“A”相与〜OX20是要给我什么? 我们真正需要思考的唯一的一点是这个, 因为,如果所有这些位都设置为1, 然后我们将得到完全'A'是什么, 除了,可能,这是什么位。 因为,如果它是1,现在它的将被设置为0, 因为不管这是,相与与这个将是0。 那么,什么是“A”&〜OX20要给我? [学生回答,无声] >>什么是'a'和 - 这是“A”。 什么是'a'&〜OX20要给我? '答:'因为这是目前一个1。 安定与这个0是要使它成为一个0, 现在我们要得到一个“A”。 >>两者都是'A',以及最后但并非最不重要的这种类型的, 我们有异。它非常像,或 除了它是指专用于或。 这就像你通常所认为的,或在现实世界中。 所以,你要么做“X”或“Y”,但不能同时使用。 在这里,1 ^ 1将是0。 因为如此,这是 - 它并不与逻辑真和假的工作,以及 如按位与和或做什么, 但真正的^真为假。 因为我们只想要返回true,如果只有其中一个是真实的。 所以1 ^ 1是0。怎么样0 ^ 1? 为1。 1 ^ 0是1,0 ^ 0是0。 所以,在任何情况下,0位运算的东西0将是0。 1位运算的东西0或0按位1, 如果它的|或^,这将是一个1,如果它是和它会是0。 而唯一的情况下,其中1位运算1不1是异或。 那是0110。 所以现在在这里,使用XOR - 所以我们回到20。 'A'^ OX20是这2位我们比较。 因此,一个1 ^ 0是要给我一个什么?一个。 'A'^ OX20是要给我吗?小写a。 '一'^ OX20是要给我吗? A.资本 因为不管这是干什么的,这个异或与OX20 有效地翻转不管该位。 如果这是一个0,它现在会成为一个1。 由于这是一个1,1 ^ 1是0。 因此,我们的'一'已经变成了'A',而我们的'A'已经变成了'一'。 因此,异或仅仅是翻转的情况下,一个真正方便的方式。 你只是想遍历字母串 和交替的每一个字符的情况下, 你只是XOR一切与OX20。 >>现在我们已经左移。左移只是要,基本上, 推动所有数字成,或左侧,并插入0的甩在身后。 所以在这里我们有00001101。 我们打​​算从右边推3 0在, 我们得到01101000。 在非二进制计算, 我们看到,这是真正处理13左移3,这给了我们104。 所以左移位,我们在这里看到,X << y是基本X * 2 ^年。 13 * 2 ^ 3,2 ^ 3为8位,所以13 * 8是104。 如果你只是想二进制一般来说,每个数字如何, 如果我们从右边开始,它是1的位置,那么2的地方,那么4的地方。 因此,通过从右边0的推动, 我们只是推的东西,分别在4的地方到8的位置, 和事情是在8的位置到16的位置。 每班只需乘以2。是吗? [学生]:如果你通过5移,会发生什么? [鲍登]如果通过5转移你只是失去位数。 不可避免的是,这是同样的事情。像,整数仅为32位, 所以,如果你添加2真正的大整数,它只是不适合在一个整数。 所以它在这里同样的事情。如果通过5移, 我们只是失去的那一个。 这就是那种我所说的“大致” 在那里,如果你移动得太远,你输了位。 >>右移将是相反的, 我们要去的地方,以推0的关底, 并为我们的宗旨,填0的从左边。 所以这样做,我们基本上扭转了我们已经做了。 而且我们看到,三个0的右侧刚刚脱落, 我们已经推1101一路的权利。 这是做104 3,这是有效的,X / 2 ^年。 所以,现在,在这里,这是一个类似的想法。 为何说是大致的x / 2 ^ y和不实际的x / 2 ^ Y' 因为如果我已经转移了4,我已经失去了一个1。 基本上,你怎么想的,只是觉得整数除法的一般。 所以,像第5/2为2。这不是2.5。 它在这里同样的想法。当我们除以2, 我们可以失去奇数位前进的道路。 所以,现在 - 这是它的按位。这就是所有你需要知道的。 还记得我们在课堂上看到了用例, 就像一个位掩码是位运算符很有用, 或者你使用它们的位掩码。 大写字母和小写字母,转换是一个非常典型的例子。 >>好吧,缓冲区溢出攻击。 还有人记得什么是错用这个功能呢? 请注意,我们宣布的12字节的数组,12个字符, 然后我们复制到我们的12个字符的整个字符串酒吧缓冲区。 那么,有什么问题吗? 神奇的数字12应该几乎立刻蹦出来的 - 为什么是12? 如果有什么酒吧恰好是超过12个字符? 如果有什么酒吧是几百万字? 这里的问题是memcpy的调用。如果酒吧是足够长的时间, 它只会彻底 - 'C','C'并不关心,这是只有12个字符; 'C'不关心它不适合很多字节。 它只是将完全覆盖字符,我们已经为它分配了12个字节, 一切都过去,它在内存中实际上并不属于该缓冲区 与任何字符串酒吧。 所以这是我们在课堂上看到的图片 我们有我们的堆栈成长。 您应使用这些图片或熟悉一遍。 我们已经把我们的叠成长过程中,内存地址为0开始顶部 和发展下来,如4十亿在底部。 我们有我们的数组'C'在内存的某个地方, 那么,我们有我们的指针吧正下方写着, 然后我们在我们的返回地址,这样保存的帧指针和我们的父母日常的堆栈。 记住的返回地址是什么? 这是当主调用函数foo,调用一个函数吧, 不可避免的,酒吧的回报。 所以,当酒吧的回报,他们需要知道,它会返回到foo的调用它。 因此返回地址是它的函数的地址,返回在函数返回时。 究其原因,是对缓冲区溢出攻击重要的是因为,方便, 黑客喜欢改变返回地址。 而不是要回富的,我要回去的地方黑客要我回去。 而且,方便,那里的黑客经常想回去 是,我们原本有缓冲区的开始。 所以请注意,再次,小印度。 该设备是一个小印第安人系统的一个例子, 这样的一个整数或者指针被存储并反转字节。 所以在这里,我们看到 - 是什么?是啊。 我们看到Ox80,OxC0,Ox35,OxO8。 还记得十六进制数字? 我们不扭转小印度的十六进制数字, 因为2个十六进制数字组成一个字节,而我们扭转字节。 这就是为什么我们不存储一样,80530CO8。 我们存储,相反,每对2个数字,从右边开始。 该地址是指起始地址 我们的缓冲,我们其实是想复制到摆在首位。 究其原因,是非常有用的,因为,如果有什么攻击 事,而不是有一个字符串,它只是为了, 像一个无害的字符串,他们的名字什么的, 如果,相反,该字符串只是一些任意代码 那做任何他们想要它做什么? 这样他们就可以 - 我想不出任何很酷的代码。 它可以是任何东西,但。任何灾难性的代码。 如果他们想,他们可能只是做一些在段错误,但是这将是毫无意义的。 他们通常做破解你的系统。 >>好吧。 CS50库。 这是,基本上,调用getInt,的getString,我们为您提供所有这些功能。 因此,我们有字符*字符串,这就是我们吹散了抽象 在学期中的一些点。 请记住,一个字符串是一个字符只是一个数组。 所以在这里我们看到的getString的删节版。 你应该回头看一看它记得它是如何实际执行。 关键的细节,注意我们得到一个字符的时间 从在,这就像我们在键盘上的标准。 因此,在每次一个字符,如果我们得到了太多的字符, 所以如果n + 1大于容量 那么我们需要增加我们的缓冲区的容量。 所以在这里我们要加倍我们的缓冲区的大小。 而且一直持续,我们插入字符到我们的缓冲区 直到我们得到一个新行或文件或任何的结束, 在这种情况下,我们用字符串,然后真正做的getString 收缩的记忆,就像如果我们分配过多的内存,它会回去缩了一下。 所以我们不显示,但其主要思想是 它具有一次读取一个字符。 它不能只是读了整个事情一次, 因为他们的缓冲区只有具备一定规模。 所以,如果它试图插入到缓冲区中的字符串是太大了,那么它会溢出。 所以在这里我们防止只读取一个字符 在时间和不断增长的时候,我们需要。 所以调用getInt和其他CS50库函数趋向于使用的getString 在它们的实现。 所以我强调重要的东西在这里。 它调用GetString来得到一个字符串。 如果失败的getString返回的内存, 记住的getString mallocs的东西,所以每当你需要调用getString 你不应该(不知所云)释放,你有这个字符串。 所以在这里,如果失败将malloc的东西,我们返回INT_MAX只是一个标志,该标志, 哎,我们实际上并不能够得到一个整数。 你应该忽略不管我回报给你,或 你不应该把这个作为一个有效输入。 最后,假设没有成功,我们使用sscanf的与该特殊标志, 这意味着,第一匹配的整数, 则该整数后匹配任何字符。 所以请注意,我们希望它等于1。 所以sscanf的回报有多少,如果匹配成功呢? 它会返回1,如果匹配成功的一个整数, 它会返回0,如果它不匹配的整数,并且它会返回2 如果它匹配的整数,后面跟一些字符。 所以,我们看到重试,如果我们配合什么,但1。 因此,如果我们输入1,2,3,C或1,2,3,X, 然后1,2,3会被存储在整数, 十大将获取存储在字符, sscanf的将返回2,我们会重试,因为我们只想要一个整数。 >>快速通过HTML,HTTP,CSS扑面而来。 超文本标记语言是纤维网的结构和语义。 下面是演讲,我们有HTML标签的例子。 我们有head标签,body标签, 我们有我们的地方居然没有一个开始和结束标记的空标签的例子, 我们只是链接和图像。 没有关闭图像标签;有只是完成一切的标签需要做一个标记。 这个链接是一个例子,我们将看到如何链接到的CSS, 该脚本是如何链接到外部JavaScript的一个例子。 这是很简单的,记住,HTML不是一种编程语言。 在这里,记住你将如何定义表单,或者至少这是什么会做什么? 这种形式有一个动作和方法。 你只会看到过的方法是GET和POST。 所以得到的是那里的东西被放在URL中的版本。 POST是它没有把在URL中。 相反,从表单中的所有数据被插入更多隐藏在HTTP请求。 所以在这里,行动定义了HTTP请求去。 在那里它将会是google.com /搜索。 方法。记住GET和POST之间的差异, 和,只说作为一个例子,如果你想收藏的东西。 你将永远无法书签一个POST的URL 因为数据是不包含在URL中。 HTTP,现在,是超文本传输​​协议。 超文本传输​​协议,你会期望它来传输 超文本标记语言,以及它的作用。 但它也传递你找到在网络上的任何图像, 你做任何下载开始作为一个HTTP请求。 因此,HTTP是刚刚万维网的语言。 在这里,你需要认识到这种HTTP请求的。 这里HTTP/1.1就在身边只是说那是版本 该协议的我使用。 它几乎总是将是HTTP/1.1,你会看到它。 然后,我们看到这是GET,替代是POST,你可能会看到。 而我试图访问的URL是www.google.com/search?q =胡说,胡说,胡说。 因此请记住这一点,问号Q =等等等等, 是的东西,是通过提交表单的排序。 它可能会返回到我的反应会是这个样子。 再次,从协议,这将是如此, 接着的状态代码。在这里,它是200行。 最后,该网页实际上我要求将紧随其后。 可能的状态代码,你可能会看到,你应该知道其中几个。 200 OK你可能已经见过。 403禁止,404未找​​到,500内部服务器错误 通常如果你去一个网站,有什么地方不对头或他们的PHP代码崩溃, 而在家电,我们有一个大的橙色框 ,来了,说,喜欢,什么是错的,这个代码不能正常工作 或此功能的糟糕。 通常网站不想让你知道什么是函数实际上是不好的, 所以不是他们只会给你500内部服务器错误。 TCP / IP是在HTTP的1层。 请记住,有互联网万维网之外。 就像如果你玩网络游戏,不通过HTTP, 它会通过不同的 - 它仍然使用互联网, 但它不使用HTTP。 HTTP协议是建立在TCP / IP协议只是一个例子。 IP的字面意思是互联网协议。 每台计算机都有一个IP地址,它们是那些4位数字的东西 像192.168.2.1,或者什么,这往往是一个地方之一。 但是,这是一个IP地址的模式。 因此,DNS,域名服务, 这就是翻译的东西如google.com到实际的IP地址。 所以,如果你键入IP地址转换成一个URL, 这将带您到谷歌,但你往往不记得那些事情。 你会记得google.com来代替。 我们的最后一件事就是口,如果这是知识产权的技术合作计划的一部分。 TCP会更多。想想看,像,你有你的网页浏览器中运行。 也许你有一些运行电子邮件应用程序; 也许你有一个使用互联网上运行的其他程序。 他们都需要接入互联网, 但你的电脑只有1 WiFi卡或什么的。 所以端口是我们能够分裂方式 这些应用程序都能够使用互联网。 每个应用程序获得1特定的端口,它可以监听, 并且默认情况下,HTTP使用端口80。 有些电子邮件服务使用25。 低编号的人往往会被保留。 你通常能够获得更高的编号,那些为自己。 CSS,层叠样式表。 我们的风格网页使用CSS,不使用HTML。 有3个地方,你可以把你的CSS。 它可以是内联的,风格标签之间,或者在一个完全独立的文件,然后挂英寸 这里是CSS只是一个例子。 你应该认识到这种模式, 其中第一个例子是我们相匹配的body标签, 在这里,我们正在围绕body标签。 第二个例子中,我们是匹配的东西 ID为页脚,我们正在应用一些样式了。 请注意,ID页脚文本对齐到左边, 而正文文本对齐中心。 页脚是身体内部。 它将代替,文本左对齐,即使身体说的text-align中心。 这是它的整个级联的一部分。 你可以有 - 你可以为身体指定样式, 然后东西在身上,可以指定更具体的款式, 和事像您期望的工作。 更具体的CSS规范优先。 我觉得就是这样。 [阿里的Nahm]大家好。如果我能得到你的注意。 我是阿里,我要去通过PHP和SQL的真快。 因此,我们可以开始了。 PHP是短为PHP:Hypertext Preprocessor的。 而且大家都应该知道,这是一个服务器端脚本语言, 我们将其用于网站的后端, 以及它是如何做了很多的计算,背后的幕后部分。 语法。它不象C,惊喜,惊喜。 它总是开始与,如果你能看到的, - 我不能继续向前迈进。 你可以看到你所需要的新型大括号,然后你还需要的?PHP。 这总是你是如何帧你的PHP文本,你的PHP代码。 因此,它不能只是像C,有种你把它放在第一。 你需要始终围绕着它。 而现在,各大语法是所有的变量需要开始以$字符。 你需要做的是,当你定义它们,你需要做的 如果你指的是对他们以后。 你总是需要一个$。这是你最好的朋友,漂亮多了。 你不 - 与C不同,你不需要把它是什么样的变量类型。 因此,当你确实需要美元,你不需要把一样, 诠释x或y字符串,等等,等等。 所以,一个细微的差别。 作为这样的结果,则意味着PHP是一种弱类型。 PHP是一种弱类型语言,它已经弱类型变量。 换言之,这意味着,可以在不同种类的变量类型之间的切换。 你可以存储你的电话号码1为int, 您可以将其存储为一个字符串,你可以将其存储为float, 和它都将是数字1。 即使你将它存储在不同的形式, 它仍然是 - 变量类型仍持有到底。 所以,如果你看这里,如果你从pset中7记, 你们中许多人可能有这个问题。 两个等号,3等号,4等号。 好吧,有没有4等号,但也有2和3。 您可以使用2等号检查的值。 它可以检查跨类型。 所以,如果你可以在第一个例子中看到的, 我有num_int == num_string。 所以,你的int和你的字符串都是,在技术上,1, 但他们是不同的类型。但对于双等号,它仍然通过。 然而,对于三重等号,它检查值以及不同类型。 这意味着,它不会到那第二种情况下在这里, 您使用的是3等号代替。 所以这就是你应该所有现在已经证明的主要区别。 >>字符串连接是另一种强大的东西你可以在PHP中使用。 它基本上只是这个方便点符号, 这就是你如何绑定字符串连接在一起。 所以,如果你有猫,你有狗,和你想放的2串在一起, 您可以使用期,这是一种工作方式。 你也可以将它们彼此相邻, 你可以看到在底部的例子在这里, 在那里我有回声串1,空间字符串2。 PHP将知道把它们放回这样。 数组。现在,在PHP中,有2个不同类型的数组。 你可以有规则排列,并且你也可以有关联数组, 而且我们要通过他们去现在。 常规数组只是在C, 所以您有编号的指标。 现在我们只是要创建一个,并把 - 所以这是我们如何创建一个空的数组,然后我们要 投入的索引号0。 我们打​​算把数字6,值6。 您可以在底部看到它在这里。 Where's - 索引号为1,我们打算把价值数4, 所以你可以看到有一个6,有一个4, 然后当我们要打印的东西, 当我们试图和打印存储在索引号为0的值, 然后我们会看到值6被打印出来。酷? 所以这是常规数组为您服务。 另一种方法,你也可以添加东西经常阵列现在 是你可以将它们附加在最后。 这意味着,你不必指定具体的指标。 你可以看到号码,然后在方括号中有没有指定的索引。 它会知道 - PHP会知道只需将其添加到列表中,下一个空闲点的结束。 所以,你可以看到1正好遇上了0点, 2去正好遇上的第一个点。 3云 - 添加有作为。 所以,那种是有道理的。你只是不断地增加它, 然后当我们回响着数1的指数, 它会打印出值2。 >>然后我们有数组是关联数组。 关联数组而不是有数字索引, 他们做的是什么,他们有指数是由字符串。 你可以看到,而不是 - 我摆脱了所有这些数量指标, 现在它的密钥1,密钥2,密钥3,而且他们在双引号,以表明他们都是字符串。 所以我们可以有这样的一个例子。 这样做的例子是,我们有TF,这就是索引名称。 我们打​​算把“阿里”作为名称,该指数在,吃的热量, 我们可以把而不是字符串一个int这个时候, 然后在指数喜欢,我们可以把整个数组里面它。 因此,这是一种 - 这是一个类似的概念,我们怎么了 用数字索引,但现在我们可以改变周围的指标 有他们作为字符串来代替。 您也可以做到这一点,除了刚刚做单独, 你可以做到这一切在一个块。所以,你可以看到,数组的TF, 然后我们将它们都在一个巨大的方括号集。 这样就可以加快速度。 它更多的是一种风格上的选择不是。 我们也有循环。 在C语言中,我们有这样的工作循环。 我们有我们的数组,我们从索引0到该列表的末尾, 我们打​​印出来,对吗? 除了这个问题,对于关联数组, 我们并不一定知道那些数字索引 因为现在我们有字符串索引。 现在我们使用foreach循环,其中,再次,你希望在PSET 7中使用。 foreach循环将只知道列表的每一个部分。 并且它没有确切地知道您有数字索引。 所以,你必须在foreach的语法,所以它的foreach,你把数组。 所以,我的数组被称为pset中,然后作为,字如, 然后你把你要使用这个局部临时变量 只是对于具体的事情,那将持有的具体 - 一个实例或数组中的一个部分。 PSET民将举行1,然后说不定还会举办数6, 然后将持有的数量2。 但它保证要经过的每一个值,该值的数组中。 有用的功能,你应该知道在PHP中是需要, 这样就使得确保您包括某些文件,回声,退出,空的。 我强烈建议你看看PSET 7,看看这些功能。 你可能需要知道这些, 所以我肯定会知道,究竟是什么,这些都在做的事情。 >>现在我们要真正快速办理范围。 在范围上,PHP是一种时髦的东西,不像C, 所以我们只是要快速通过它去。 因此,让我们说,我们开始在那个方向,我们有在那里。 而且我们要以$开头我。这样的变量i将是0, 而我们只是要保持在大的白色盒印刷它在那里。 我们将开始与I0,然后我们要呼应它。 因此,有0。 然后我们将通过for循环来增加它, 然后它会是1的值。 一个是小于3,所以它要穿过那个for循环, 然后我们将看到它再次打印。 我们将再次增加它到2, 和2小于3,所以它会通过for循环,它会打印2。 然后,你会注意到,3不小于3,所以我们会打出来的for循环。 所以,现在我们已经退出了,然后我们将进入机能缺失。 好吧。所以,你必须要注意,这个变量,我们已经创建, “我”的变量,是不是局部范围。 这意味着,它不是本地的循环, 和变量,我们仍然可以访问并更改之后,它仍然是有效的。 所以,如果你现在进入的功能,你会看到,我们还可以使用'我'的变量, 而且我们要增加'I'+ +。 你可能会认为,首先,基于C,那这就是'我'的变量的副本。 这是一个完全不同的事情,这是正确的。 因此,当我们打印时,我们将打印的“i”+ +,这是会打印出4, 然后我们要 - 对不起。 然后,我们要结束了该功能的, 并且我们将会在那里的箭头是现在。 这意味着,然后,然而,即使该功能改变的“i”的值, 它并没有改变的功能外, 因为该函数有一个单独的范围。 这意味着,当我们回显'我',它并没有在函数的范围变化, 所以当时我们要再次打印3。 有关范围在PHP中不同的东西比C >>现在在PHP和HTML。 PHP是用来制作网页的动态。 那种它使事情有所不同。 我们把它与HTML不同。 在HTML中,我们始终只是有相同的静态的东西,像罗布如何表现, 而PHP中,你可以根据用户是谁改变的事情。 所以,如果我有这个,我,“你登录为 - ”,然后名字, 我可以更改名称。所以,现在的名字是约瑟夫, 它具有“关于我”,但后来我也可以改名字有汤米。 而这将是一个不同的事情。 这样的话,我们也可以改变对他的不同的事情, 并且基于该名称将显示不同的内容。 这么说PHP可以种改变什么在你的网站怎么回事。 同样在这里。还是请注意,它们具有不同的内容, 即使你是在技术上还是访问表面上的同一个网页。 生成HTML。有两种不同的方式,你可以做到这一点。 所以我们现在要通过正确的。第一种方法是,你必须 - 是啊,对不起。 所以你只要你经常for循环在PHP中, 然后回响在PHP和你回音了HTML。 用什么罗布显示HTML脚本的你 然后使用PHP打印刚刚打印出来的网页。 另一种方法就是做它,如果你分离出的PHP和HTML。 所以你可以有一个启动循环线的PHP, 那么你可以让HTML的线在一个独立的东西, 然后就结束循环,再次用一个PHP。 所以这是一种分离出来。 在左侧,你可以说你把所有的 - 这只是1块的PHP。 在右边你可以看到,你有一个行PHP的, 你有一行HTML,和你有一个行PHP的一次。 所以分离出来成为他们在做什么。 而且你会注意到,无论哪种方式,对于其中任何一个, 他们还是打印出来的图像,图像,图像, 使得HTML仍然被印刷的方式相同。 然后你仍然会看到3张图片显示在您的网站上。 所以这是2个不同的做同样的事情的方法。 >>现在我们有形式和要求。正如罗布表明您, 有HTML的形式,我们将只通过这个微风。 你有一个动作,你有一个方法,而你的行动 那种告诉你你要去哪里送呢,而且方法是否 这将是一个GET或POST一个。 和一个GET请求,罗布说,这意味着你要放在一个表格 你会看到它作为一个URL,而POST请求,你不会在URL中看到。 所以,一个细微的差别。 然而,有一点是类似的事情 是POST和GET同样不安全。 所以,你可能会认为只是因为你没有看到它在URL中, 这意味着在POST更安全, 但你仍然可以看到它在你的cookies在你发送的信息。 所以,不要认为对一个或另一个。 另一个要注意的是,你也有部分变量。 你们用这个在pset中7得到你的用户ID信息。 当时的情况是,你可以用这个关联数组, 在$ _SESSION,然后就可以访问不同的东西 并存储整个页面不同的事情。 >>最后一件事是,我们有SQL,结构化查询语言, 这是一种编程语言来管理数据库。 究竟是什么,是数据库?他们是表的集合, 每个表只能有相似的类型的对象。 因此,我们在你的财务pset中有一个用户表。 他们为什么有用?因为它是永久存储信息的一种方式。 这是事物的跟踪和管理事物的一种方式 实际上看到它在不同的页面和跟踪。 而如果你只是存放在那一个瞬间眼前 再后来使用它,你将无法访问您保存任何东西。 我们有我们使用的SQL命令4件大事。 我们有选择,插入,删除和更新。 这些都是非常重要的,你们要知道你的测验。 >>我们将快速选择现在。 基本上,你从数据库中选择行。 所以,如果你有,就在这里 - 我们有这2个不同的东西,我们希望从类表选择 其中真棒 - 凡在真棒列中的值是1。 所以,你可以在这里看到,我们有这2个东西的类名, CS50和Stat110,并且我们有一流的ID和口号。 所以,我们要选择所有的信息。 然后,你可以看到在这里种,它的挑选出真棒列, 那里所有的东西都是1,然后将其拥有的类ID,类名和口号,它可以挑选出。 你是做这个的代码究竟怎么了?你必须使用PHP。 所以这是怎么样的PHP和SQL是相互关联的。 现在,我们有我们的代码,我们将使用我们的查询功能 因为我们没有在PSET 7,和我们要执行的SQL查询。 然后,我们就要有 - 我们总要检查,如果行的三重平等的,如果为false。 所以,再一次,你要检查的类型和价值, 然后,如果它不工作,那么你要道歉,像往常一样,就像我们在PSET 7一样。 否则,你经历的一切与方便要循环 foreach循环,我们只是走过去。 现在,我们正在遍历和我们过去做了, 让我们假设我们的查询过去了,现在我们有我们的foreach循环。 和第一行有,所以这里的行,就在这里,它的盒装。 这将打印出所有它得到的信息。 所以它会打印出在底部“想学HTML吗?” 然后它会去到下一行,因为它完成了第一个for循环, 等等然后它会打印出它的第二行, 这将是STAT110,查找所有的时刻。 >>最后一件事是对的SQL漏洞。 我知道大卫在这感动的演讲一点点。 您可以稍后阅读。这真的很有趣。 SQL注入是一种棘手的事情。 比方说,你只是这些变量坚持正确进入您的查询, 你可以在第一行看到。 因此,它似乎罚款,对不对?你只是把在用户名 和密码到您的SQL查询,并且要出货其关闭,并获得无论是在你的数据表。 这似乎很简单。因此,可以说有人把中, 输入密码,这或文字在这里 - 实际上应该是在红色框。 所以我们说,他们把该密码进入 - 这就是他们进入。 所以他们把或“1”= 1。 样一个愚蠢的密码有。 现在,让我们只需更换它,你会注意到,在S​​QL查询现在, 它的计算结果总是正确的,因为你会注意到, 你可以在SQL查询中选择所有这些信息 或者你可以有1 = 1。 所以这总是会评估为true。 这不会对真正的工作,因为这意味着黑客可以侵入你的系统。 该解决方案是,你必须使用PDO的系统, 这意味着你必须使用问号, 这是你在​​pset中7人使用, 你要去的地方使用一个问号的地方,你想放的东西, 然后你将有一个逗号,然后你就会有后, 你的字符串后,您希望不同的变量替换成你的问号。 所以,你会注意到在这里,现在我有这些红色的问号。 然后,我把我的琴弦后,变量,所以我知道他们更换的顺序之后。 这将确保如果有人确实是这样的, 并且他们有或1 = 1的情况下,这将确保, 在后端,确保它不会真正打破SQL查询。 好了,所以这是相当多了,PHP和SQL的旋风。 好运来各位的,现在到俄勒冈州 [Oreoluwatomiwa Babarinsa]好了大家。走的时候了一些JavaScript 和其他一些东西非常快,所以我们不耽误你了今晚。 JavaScript的。是。 JavaScript是一种一件很酷的事情,据称。 你真的需要知道关于JavaScript的事情,它有点像 为你的web应用程序将是做客户端。 有一些事情你只是不想把所有的时间护理在服务器端。 所有的小互动,突出的一件事,使东西消失。 你真的不希望有跟你的服务器的所有时间的。 而一些甚至不是可以做到在服务器端。 这就是为什么我们需要类似的JavaScript。 关于JavaScript很酷的事情:它是动态类型。 这句话的意思是,你的程序并不需要知道 究竟是什么,该变量是当你写出来。 排序它会只是弄清楚,因为它的运行。 这是很酷的吧其他的东西:这是一个大括号的语言, 这意味着语法类似于C和PHP。 你不必做太多的返工,当你学习JavaScript。 在这里,我们有一个JavaScript的一点点。 有趣的事情在这里是,如果你看一下吧, 我们有一点JavaScript有权利在head标签。 什么是它基本上只包含一个JavaScript文件。 这是一种方式你可以包含JavaScript到你的程序。 那么第二个点点实际上是一些内嵌的JavaScript, 非常类似于使用CSS内联样式, 而你只是写一些代码很快出现。 JavaScript有数组。 只是另一种方式来保持数据周围,非常有用。 非常好,容易语法。 您可以使用方括号来访问一切,把一切都在一起。 没有什么太复杂。 关于JavaScript和脚本语言一般很酷的事情 是,你不必担心数组的大小。 你可以只使用array.length,并保持它的轨道, 也是数组可以增大或缩小,因为你需要它。 所以你甚至不需要担心任何形式的, 哦,不,我需要分配更多的东西,或者类似的东西。 >>这里很酷的事情是,JavaScript有一些所谓的对象。 这是一种面向对象的语言,因此它已经是,本质上, 一个方法可以让你组数据放在一起,有点类似于一个结构, 但你可以访问它像一个结构或一个关联数组的语法。 这是很简单,你可以用这个做的是组数据一起 如果你有一堆数据的的关联。 因为它是所有你需要描述一辆车的事情, 你不需要把它在一堆不同的地方。 您只需把它贴到JavaScript中对象1。 正如你可能知道,迭代是那些繁琐的任务之一。 你只需做一遍过。你需要跟每一个对象在车上, 或者你需要通过每一个项目列表或类似的东西。 所以,JavaScript有,类似于PHP的,一个foreach语法。 在这种情况下,它是一个用于在回路。 你想只在对象使用这个。 还有,如果你使用这个阵列上所发生的一些问题。 它一般是其中的一件事情,虽然,这是非常有用的, 因为你消除大量的开销 因为你没有自己拉起来一切都在你的对象。 你不必记住所有的键名。 你只是有点让他们回到这个语法。 在此,对,你只是要记住 你得到回所有的钥匙,在一个非常类似的方式来哈希表。 如果从记住,当你想放在一个字符串,你可以得到的东西 这将具有与其相关联的值。 你可以用这个做的是,你可以说,没事, 我把一辆车,我把它叫做一个法拉利。 所以,你可以把字符串法拉利再续前缘,你可以得到这一点。 你也可以这样做,在一个循环中,在循环的。 所以只是更多的对象。从此,你需要记住的关键一点 是,你可以使用该对象结构的语法,只要你想用这些, 除非你有什么打算作为一个字符串使用的是不是一个有效的变量名。 所以,如果你看一下,有,我们有空格键。 好吧,如果你把object.key,空间,与空间,空间, 只是没有意义语法。 所以,你唯一能做的,随着这种支架的语法。 >>此外,JavaScript是非常适用范围,明智的PHP。 你有2种方式解决范围。 你不能有变种在变量的前面, 那只是意味着这是全球性的。 你可以从任何地方看到它。即使你是把这个在if语句中, 其他地方在你的代码这一点后,你可以看到这个变量。 另一件事,虽然是用var,它是有限的,以什么功能你英寸 如果你不是在一个函数,那么,它是全球性的。 但如果你是在一个函数中,这只是该函数内可见。 我没有一个例子,但是,是的。这是其中的一件事情,其中 你可以管理你想成为全球哪些变量, 你想成为本地的,但你必须要小心这个变量, 因为你不具备细粒度控制你在C语言中的类型, 在那里,如果事情是在一个声明for循环,它会留在那个for循环。 我们真正关心使用JavaScript的事情是操纵网页,对不对? 我的意思是,这就是为什么我们正在这样做。 >>为了做到这一点,我们使用一种叫做DOM。 文档对象模型。 基本上,它的作用是它需要所有的HTML 它的模型伸到了一堆相互嵌套那些对象。 你的东西是这样开始了。 你有,就适合我,一堆代码,在那里,有几分 - 你可能会认为这会是很难操纵, 因为你会透过一堆文字解析 并有拼凑分开的东西。而如果它没有正确格式化? 不好的事情会发生。 因此,JavaScript的需要照顾的为你,你会得到一个很好的数据结构, 像一个在我左边,在那里你只是有一个文件, 并且里面,你有一些所谓的HTML, 并且里面你有一个头和身体, 而且脑袋里面你有一个标题,等等,等等,等等。 这简化了操作的Web页面,以便它只是, 哦,我只是想谈谈这个对象。 排序的一个非常类似的方式,你会跟你做自己的另一对象。 就像我说的,所有的DOM是文档对象。 或者它只是一个地方,那么你可以去在它里面找到的东西, 你可以做到这一点 - 这是旧的风格做,在那里的, 你在那里做的document.getElementById,然后将名称, 正如你可能会说,这得到了一段时间后,很笨重。 所以,你可能不希望这样做。这就是为什么我们有 我们将在此之后谈论未来的事情。 这里的关键是,没事,你拥有所有这些元素,对不对? 所以也许我可以改变的页面加载时的东西的颜色。 还等什么?如果我的用户点击的东西? 我想要它做的一些有趣的事情,当他们点击什么。 这就是为什么我们有活动。 可以,基本上,找到DOM中的任何元素, 然后说,嘿。当此负载或有人点击它, 或者当他们鼠标移到它,用它做什么。 和你有什么,你有函数处理这个给你。 这些函数是事件处理程序。 什么不着痕迹 - 它的说法只是一种奇特的方式, 当这种事件发生,此功能仅执行。 因此处理时发生的事件。 这是你将如何布置一个事件处理程序。 我有一些按钮,当你点击它,它爆炸。 所以,不要单击该按钮。 这是接近它的方法之一,对不对? 你有一个按钮标签,并在点击你有一个字符串,上面写着: 哦,顺便说一下,我这样做是爆炸事情对我来说。 否则,它就像你刚才做了一个常规按钮。 您也可以做到这一点的另一种方式, 通过抓取DOM元素,但我们会拯救我们谈论的jQuery之后。 jQuery的:它是一个库,它是跨浏览器。 你可以在几乎任何使用它。 它只是给你很多的工具一起工作。 因为JavaScript虽然强大,没有您需要的所有工具 开箱真正解决一个web应用程序中你可能想要做的。 因此,它简化了很多东西,给你很多的功能 出,你通常会需要重新写自己,一遍又一遍又一遍的方块。 而只是使事情非常简单。 你也有选择,这让你把所有这些元素 从你的DOM更简单的,而不必使用这些很长的函数调用。 更多关于这些选择。你有,在那里你有,让我们说 我想获得一个元素ID为“岩石”。 那么,在jQuery的,它只是$,然后在出现一斤的字符串,然后“石头”。 这很简单,不是解决这个问题的传统的JavaScript方法快了很多。 和你有类和元素类型类似的事情。 jQuery是 - 凉爽的特点之一是某种可以压缩 您的查询您的DOM非常,非常快。 现在,我们又回到了事件处理,这是你将如何处理jQuery的一个事件。 所以我们要在这里是什么我们说,没事的。我有一个脚本标记,对不对? 所以,我有这个内嵌的JavaScript。 我们现在要做的是我们要去说,没事。 当文档准备,这意味着该文件的加载, 我们要去的那个函数,并且我们会说,没事, 这个功能实际上是做别的事情。 它基本上是说,没事的,让我的ID的元素“身份识别码”。 然后给这个,当你点击它执行的功能的处理程序。 基本上,这是什么做的是,它说,所有的权利。 在页面加载,所以我要在,找到这个元素, 给它这个事件处理程序,它基本上设置页面为您服务。 这是你想怎么去想事件处理。 你只需要考虑一下,没事的时候发生的东西,我想要什么发生? 你不想去想,好吧,我需要确保这件事情要谈这件事情, 这个东西等等等等,因为你只是想谈的事情在活动方面。 当此情况发生时,发生这种情况。当此情况发生时,发生这种情况。 如果事情引发其他的事情,这是伟大的。 但是,你不想尝试做复杂的代码 您要去哪里触发多个事物的同时, 因为你只是给自己一个头痛的问题。 >>所有权利。现在,我们可以得到我们的页面来处理事件, 但让我们说我的用户点击一个按钮。 如果我想这一请求发送回服务器, 但我不想重新载入页面,因为不必重新加载一个新的页面 每一次得到种繁琐,为什么我需要 拉下头又一次,又一次页脚, 而页面的所有再次要素 刚刷新的问候语或时间? 所以这就是为什么我们有类似的Ajax。 我们可以使用Ajax在这里做的是,我们可以说,没事, 我要一些数据发送到服务器时, 我想获得回应,所以我可以更新我的网页, 或者只是做一些算法计算,这并不一定显示任何内容给用户。 你有什么需要做的?那么,你需要你需要跟一个URL。 您的服务器无法奇迹般地从无处收听。 你需要有你要发送这个数据到一个特定的地方。 而且你还需要一些数据要发送,或者也许这是一个无数据的查询。 你只是想要Ping回服务器,说,哎,我还活​​着,或者类似的东西。 然后你想要一个函数,基本上处理与成功。 比方说,你从你的服务器取回一些信息, 并且要更改用户的标题上他们的网页。 所以,你会得到信息反馈, 而你将推动该到屏幕上。 什么情况是,当页面准备就绪, 你为这个按钮叫迎宾创建的点击功能。 这是什么然后做的是,当按下该按钮, 你跟greetings.php,你犯了一个POST请求, 和你说,哎,让我从你的网页的东西。 我们并不真的需要来形容,但greetings.php, 我们只能说,给后面的“hello world”。 因此,我们得到这回的“hello world”,并在这一成功, 假设一切正常,那么我们只要到这个目标的地方 我们指定的,我们只是坚持的响应在那里。 这是建立一个Ajax查询的一个非常简单的方法。 >>很快,罗布那种提到这个已经, 事情都可能出错,坏事情都可能发生, 所以你要熟悉这些HTTP响应代码。 这是什么意思,只是,像200,一切正常。 别的东西,不好的事情发生了。 它通常你想记住的东西。 但它是很好的知道所有的这些。 最后,一​​旦我们通过了这一切消失了, 我们需要谈谈很快对设计, 然后我们就可以让大家都离开了。 设计。你要记住的东西。 问问自己这些问题:谁将会使用这个? 他们会怎么使用它呢?什么我的用户关心的? 什么他们不关心? 你只是不想让一个应用程序,让它刚长出 并成为这个巨大的,所有费力的事情,你甚至不能完成。 你想拥有你想要解决离散的目标和计划与事。 使其毫不费力。所有这一切说,基本上 很容易让用户使用它,不让它文本的巨型一滴这样的幻灯片是,其实。 你只是希望它是什么它是非常容易有人进去 ,做他们想做的事情。 你不希望他们有浏览5页 去你的网站的主要功能。 如果谷歌有5个页面之前,你甚至可以搜索一些东西, 没有人会使用它。 最后,纸上原型,焦点小组。 有良好的设计和测试实践。 只是因为你觉得你的作品, 不意味着别人想它的工作原理。 但是,是的,就是这样。 [CS50.TV]