[Обзор: Викторина 1] [Али Нама, Oreoluwa Barbarinsa, Лукас Фрейтас, Роб Боуден] [Гарвардский университет] [Это CS50.] [CS50.TV] [Лукас Фрейтас] Приветствую всех. Это отзыв для викторины 1. Так же, как за точность информации, это - я имею в виду, что мы собираемся, чтобы попытаться покрыть как много материала, как это возможно, но это не означает, что мы собираемся охватить все вещи, которые могут быть в викторине 1. Так что будьте уверены, вы также взглянуть на лекции, разделами, все, что можно. Викторина 1 будет в среду, в следующую среду. Так что не забудьте изучить. Это будет, в значительной степени, как и первый викторины относительно его формат, но это, вероятно, будет гораздо сложнее. По крайней мере, в прошлом году, когда я взял 50, я думал, что это было гораздо сложнее. Так много учиться. Я собираюсь покрыть структуры данных и кодирование Хаффмана. Это то, что многие люди думают, является сложной, но я собираюсь попытаться сделать это как можно проще. Прежде всего, то, что мы хотим, вы, ребята, чтобы знать викторины 1 является понять концептуальные описания каждой из структур данных, которые я собираюсь представить. Это означает, что у вас нет на самом деле реализации хэш-таблицу в вашей викторины 1. Мы не хотим вам реализовать целый хэш-таблицу, может быть, мы постараемся чтобы вы реализовать некоторые функции, наиболее распространенные операции, но мы не собираемся, чтобы вы реализовать все. Поэтому важно, что вы понимаете понятие позади каждой структуры данных а также, что вы можете кодировать в C, только самые распространенные операции, которые они имеют для каждой структуры данных. А также сможете просмотреть указатели и структуры, потому что они появляются много в этих структур данных. Во-первых, связанные списки. Связанные списки на самом деле очень похож на массивах, но разница между связанный список и массив, прежде всего, в том, что связанный список имеет очень гибкий размер, в то время как в массивах вы должны либо выбрать очень большой размер для массива, так что вы знаете, что вы собираетесь быть в состоянии хранить все ваши данные в этом массиве, или вы должны использовать таНос иметь гибкую длину массива. В связанных списков, что это очень легко, чтобы просто получить больше элементов, положить больше элементов в связанном списке или удалять элементы. А на самом деле, если вы не хотите связанный список должен быть отсортирован, Вы можете искать и удалять элементы в постоянное время, так O (1) времени, так что это очень удобно. Вы просто должны быть осторожны, чтобы всегда помнить, чтобы Malloc и бесплатно узлы, только потому, что если вы этого не сделаете, вы будете иметь утечек памяти. Так связанные списки - определение узла точно так же как то, что мы имеем право там. Я положил Int N, но вы можете хранить любые данные, которые вы хотите. Так что если вы хотите сохранить строку, это прекрасно. Если вы хотите сохранить структуру, это прекрасно, двойной, что вы хотите. Я просто положить Int N для примеров здесь. И у вас есть указатель на следующий узел. Так, в основном, связанный список имеет некоторые данные, а затем он указывает на следующий узел. Если это последний элемент в связанном списке, это будет указывать на NULL. Таким образом, это является примером связанного списка. Хорошо, теперь давайте посмотрим, что мы должны делать, если я хочу, чтобы вставить элемент в связанном списке. Во-первых, функция вставки будет типа пустоту потому что я не хочу ничего возвращать. И я собираюсь принять Int в качестве аргумента, потому что я хочу знать, что я хочу, чтобы вставить. Так что первое, что я должен делать? Ну, я должен Malloc на newnode, так что это первая линия. Я просто создание нового узла поставить в связанном списке. Так что я могу сделать? Ну, мы знаем, что в наших реализаций связанных списков в классе, мы всегда ставим головку как глобальная переменная. Итак, что мы можем сделать, это изменить головой. Я могу сделать это новый узел будет новый глава, и это будет указывать на предыдущей главы. Как мы можем это сделать? Первое, что я должен сделать, это изменить 'N' в новом узле в стоимости, который был принят в функцию. Тогда newnode дальше будет глава. Голова будет newnode. Так что это довольно просто. Для удаления узла, мы можем сделать это как - Один из способов мы могли сделать это, чтобы сказать, хорошо, если бы я хотел, чтобы удалить, например, 3, что я мог сделать, это просто указать предыдущий узел к следующему узлу 3. Так что я бы просто сделать что-то вроде этого. Но в чем проблема с, что делать? У меня есть утечка памяти, так что у меня нет доступа к числу 3 больше. Проблема в том, что я не собираюсь быть в состоянии освободить этот узел. Я собираюсь иметь утечка памяти и (неразборчиво) собирается меня ненавидишь. Таким образом, вместо того, чтобы делать это, я, вероятно, следует иметь временный указатель. Так что я положил темп. Она собирается указывать на узле, что я хочу, чтобы удалить. А потом я могу двигаться предыдущие узлы точки к следующему узлу узла, что я хочу, чтобы удалить. И, наконец, я могу освободить указатель. Есть ли у меня, чтобы освободить указатель, который я создал тут? Я не должен, только потому, что - разница в том, что этот узел был создан с помощью таНос, так что это в куче, а этот был просто объявлен в качестве переключателя NULL в стеке. Так у меня нет, чтобы освободить ее. Хорошо. Так что теперь давайте поговорим о стеков. Штабеля довольно просты. Мы сделали стеки и очереди в классе только с помощью массивов, но вы должны быть знакомы - просто надо знать что вы также можете сделать стеки в очередях с помощью связанных списков, а также. Так что если у вас есть массив, что было бы стек? Стек, во-первых, должны иметь размер. Вы должны сохранить то, что это размер стека, что у вас есть сейчас. А также вы бы массив, в данном случае чисел, но если вы хотите, это может быть массивом строк, массив структуры, все, что вы хотите сохранить. О стека: Разница между стеком и связанного списка является то, что в стеке у вас есть только доступ к последним элементом, сданном в стеке. Она называется последний вошел, первый вышел. Так же, как у вас есть стопка подносов, если вы положили поднос на вершине стека, Вы должны удалить этот лоток первым, чтобы иметь доступ к другим лотков. Это то же самое со стеками. Так что, если я хочу, чтобы, например, добавить элемент в стеке, что я должен делать? Она называется толчок, и это довольно просто. Первое, что вы должны сделать, это проверить, если размер стека не больше или равна емкости стека. Потому что, если у вас уже есть на полную мощность, вы не можете что-либо еще добавить. И потом, если нет, то вы просто должны добавить элемент в стек. И, наконец, увеличивают размер. Так что это довольно просто. Так что я просто добавить номер 2. И если я хочу, чтобы совать, а это значит, что я хочу, чтобы удалить последний элемент, который добавляют и возвращает значение элемента, Первое, что я должен проверить, что стек не пуст. Потому что, если он пуст, я ничего не могу вернуться. В этом случае, я возвращаюсь -1. В противном случае, я собираюсь уменьшить размер спецификации, и вернуться цифры (s.size). Почему я уменьшить размер, а затем вернуться s.size? Это потому, что, в данном случае, спецификация имеет размер 4, и я хочу вернуться четвертый элемент, не так ли? Но то, что индекс четвертого элемента? Три. Так как я размер - будет 3, я могу просто вернуться s.numbers (s.size) потому что это 3. Так что это просто индекс. Сейчас очереди. Очереди в значительной степени то же самое. Разница лишь в том, что вместо того, последний вошел, первый вышел, у вас есть первый вошел, первый вышел. Вероятно, если вы ждете, чтобы пойти на концерт, Вы не были бы счастливы, если бы у вас был стек вместо очереди. Будучи последним человеком, который пришел бы первым человеком, чтобы войти в концерт. Вы, наверное, не был бы счастлив. В очереди, первым человеком, чтобы получить в также первым человеком, чтобы выйти. Таким образом, в определении очереди, помимо того, что размер массива, Вы также должны иметь голову, которая индекс к голове стека. Таким образом, первый элемент прямо сейчас. Ставить это то же самое, как толчок для стеков. Если вы были очень наивны, вы бы просто сказать, ну, я могу просто сделать то же самое, что и я сделал для толчка. Я могу просто проверить, если это не выходит за пределы возможностей. Если это так, я вернуться ложным, иначе я могу просто экспортировать новое значение и затем увеличить размер. Но почему это так? Давайте посмотрим этот пример. Я пытаюсь поставить в очередь кучу вещей, а затем я собираюсь из очереди и постановки в очередь. Там очень много команд, но это очень просто. Я собираюсь поставить в очередь 5, так что добавьте 5, а затем 7, 1, 4, 6, а затем я хочу из очереди что-то, Это означает, что я собираюсь удалить первый элемент. Так что я собираюсь снять номер 3, не так ли? Первый элемент. Хорошо. Теперь, если я пытаюсь поставить в очередь что-то еще, что произойдет? По моей реализации, Я собирался поставить следующий номер в индексе q.size. В этом случае, размер 8, поэтому индекс 8 будет прямо здесь, в последней позиции. Если я пытаюсь поставить в очередь 1 прямо здесь, я был бы перезаписи последнюю позицию к № 1, которое является совершенно неправильным. То, что я хочу сделать, это обернуть вокруг и перейти к первой позиции. Может быть, вы бы просто сказать, ну, я просто должны проверить если я могу на самом деле положить что-то там. Если нет, я просто говорю, о, новый полную мощность на самом деле мощность - 1, и вы не можете поместить элемент есть. Но в чем же проблема? Проблема в том, что, если я просто из очереди все прямо здесь а затем я пытаюсь добавить что-то еще, было бы просто сказать, ну, вы были на полную мощность, что является 0. Так что ваша очередь ушла. Вы должны обернуть вокруг, и способ обтекание что вы, ребята узнали в дальновидных и других psets использовал мод. Вы можете попробовать его дома, чтобы понять, почему вы могли бы сделать q.size + q.head мод емкость, но если вы посмотрите прямо здесь, мы видим, что она работает. Таким образом, в последнем примере, q.size было 8 и голова была 1, потому что это было это положение здесь массива. Так будет 8 + 1, 9. Мод емкость 9 будет 0. Было бы пойти в индексе 0. Мы будем в правильном положении. А потом попробуйте очередь дома. Некоторые важные вещи: попытаться понять разницу между стеком и очереди. Дома, попытаться получить очень хорошо знакомы с реализации в очередь, Dequeue, толчок и поп-музыки. А также понять, когда вы будете использовать каждый из них. Так что давайте отдохнуть в течение 10 секунд с кучей покемонов. А теперь давайте вернемся к структурам данных. Хеш-таблицы. Много людей были напуганы хэш-таблицы. в проблему набор 6, Spell Checker. Хеш-таблицы и пытается, много людей пугаются из них. Они думают, что они так трудно понять. Да? [Роб Боуден] Архив задач 5. Архив задач 5, да. Благодаря Роб. Да. Шесть был Хафф-н-Puff, да. Архив задач 5 был Spell Checker, и вы должны были использовать либо хэш-таблицу или попытку. Многие люди думают, что они были супер трудно понять, но они на самом деле довольно просто. Что такое хэш-таблицу, в принципе? Хеш-таблица представляет собой массив связанных списков. Единственная разница между массивом и хэш-таблице является то, что в хэш-таблице у вас есть то, что называется хэш-функция. Что такое хэш-функция? Я не знаю, если вы, ребята можете прочитать здесь. Это является примером хэш-таблице. Таким образом, вы можете видеть, что у вас есть массив с 31 элементами. И то, что мы делаем в хэш-таблице является иметь хэш-функцию что собирается перевести ключ, каждый десятичного индексу. Если, например, если я хочу, чтобы выбрать для Б. Харрисон, Я бы поставил Б. Харрисон в моих хэш-функций, и хэш-функция вернется 24. Так что я знаю, что я хочу сохранить Б. Харрисон в 24. Так вот разница между просто имея массив и с хэш-таблицу. В хэш-таблице вы будете иметь функцию, которая собирается, чтобы сказать вам где хранить данные, которые вы хотите сохранить. Для хэш-функции, вы хотите посмотреть на хэш-функции что является детерминированным и хорошо распределены. Как вы можете видеть здесь, вы видите, что много данных, которые я хотел магазине было на самом деле 19 вместо использования 31 и 30 и 29, которые были все бесплатно. Таким образом, хэш-функция, что я использовал не очень хорошо распределены. Когда мы говорим, хорошо распределены, это означает, что мы хотим иметь, примерно, по крайней мере, 1 или 2 для каждого из - как, разница в 1 или 2 для каждого из индексов в массивах. Вы хотите, чтобы, грубо говоря, то же количество элементов в каждом связанном списке в массиве. И это легко проверить, если она действует в хэш-таблице, посмотреть как хэш-таблицы. Тогда деревья. Это дерево. Деревья в информатике с ног на голову почему-то. Так прямо здесь у вас есть корень дерева, а затем листья. Вы должны просто знать номенклатуру для родителей и ребенка. Каждый узел имеет своих детей, которые являются узлы, которые находятся ниже родителя. Так, например, 2 собирается быть родителем для 3 и для другого ребенка тут же, в то время как 3 будет родительским для 1 и другие дети, которые там. И 1 будет 3 дитя, и так далее. У нас есть нечто гораздо более интересное, называемый бинарное дерево, , в котором все значения в правой части узла будут справа, прямо здесь - на правом, будут больше, чем элемент в корне. Поэтому если я номер 5 прямо здесь, все элементы на права будут больше 5, и слева все элементы будут меньше 5. Почему это полезно? Ну, если я хочу, чтобы проверить, если число 7 здесь, например, Я просто перейдите к 5 первым, и я собираюсь видеть, является 7 больше или меньше 5? Это больше, так что я знаю, что это будет иметь, чтобы быть на справа от дерева. Так что у меня гораздо меньше вещей, чтобы смотреть на. В реализации бинарного дерева поиска, узла, я просто хочу, чтобы иметь данные, так Int N, вы могли бы также есть строка или все, что вы хотели. Вы просто должны быть осторожными на определении того, что больше, чем меньше. Так что если вы были строки, например, можно определить что все те вещи, касающиеся права будут иметь большую длину, левая будете иметь более низкие длины, так что это действительно зависит от вас. Как я могу реализовать найти для BST? Первое, что мы должны сделать, это проверить, если корень NULL. Если это NULL, это означает, что вещь не существует потому что вы даже не дерево, верно? Так что я вернуться ложным. В противном случае, я собираюсь проверить, если число больше чем значение в корне. Я собираюсь попытаться найти элемент справа из дерева. Вы видите, что я использую рекурсию здесь. И потом, если это менее, я собираюсь посмотреть на слева. И, наконец, в противном случае, если это не меньше или не больше, это означает, что это само значение. Так что я просто вернуться верно. Здесь можно увидеть, что я использовал, если, если, если. И помните, в викторине 0, у нас была проблема, что, если бы, если, если, и вы должны были найти неэффективность, и неэффективность в том, что вы использовали, если. Вы должны были использовать, если, еще, если, еще, если, и еще. Так, я должен использовать еще, если и еще, если и еще здесь? Кто-нибудь - да? [Студент говоря, неразборчиво] Отлично. Так она говорит, что это не имеет значения, только потому, что неэффективность, что у нас было раньше было то, что, потому что, может быть, если некоторое условие было выполнено, так что вы выполнили действия, но тогда вы собирались проверить все другие условия. Но в этом случае, он вернулся сразу же, так что это не имеет значения. Так что вам не придется использовать еще, если. И, наконец, давайте поговорим о попыток, который является любимцем. Попытка это дерево массивов. Это очень быстро для поиска значения, но он использует много памяти. И это, как правило, для фильтрации слова, поэтому, когда вы хотите реализовать, например, я не знаю,, как телефонная книга в телефоне и вы хотите, чтобы иметь возможность типа В и просто имена людей, которые имеют B. Это очень легко осуществить, что использование попробовать, например. Как вы определяете узел в попытке? Вы просто должны иметь логическое значение, которое собирается быть is_word. Это представляет, что использование всех символов до этого узла, Вы были в состоянии сформировать слово, и тогда вы будете иметь массив указателей на узлы. Видите ли вы, что у нас есть массив родительских узлов, так что узел * массив? Да? Итак, давайте посмотрим, как это будет работать. Для проверки правописания, у нас есть массив из 27 элементов, потому что у нас все письма и премии апостроф. Перед здесь я просто буду использовать 2 потому что я хочу, чтобы иметь возможность писать на доске. Хорошо. Так что это пример попытки. Если бы я просто определить первый узел, я буду есть массив 2-х элементов что 2 указатели на NULL, так что я просто положить 'A' и 'B'. И я буду иметь логическое значение, которое говорит is_word. Это собирается быть ложным для первого, только потому, что, прежде чем, что у вас нет никаких символов. Так пустое слово не является словом. Так что это ложь. Если я хочу добавить 'А' до этого словаря, что бы я должен сделать? Я бы просто должны Malloc новый узел для "а", , а затем добавить свое слово к истине. Так что просто представляет, что, 'а' собирается, чтобы быть правдой. Смысл? Тогда, если я хочу добавить 'ба', я должен буду таНос 1 для 'B', а затем я собираюсь настроить логическое ложь, потому «б» само по себе не является словом. Тогда я собираюсь Malloc еще один для "а", так что "ба", а затем я собираюсь создать это слово к истине. Потому что «ба» это слово. И потом, если я хочу, чтобы увидеть, если «б» в этом словаре, Я могу просто пойти в первый, 'B'. Я спускаюсь, и я смотрю на это слово, и он говорит, является ложным. Так что это не слова. Если я хочу, чтобы проверить "ба", Я иду в первый, 'B', а затем перейти к "а", и я вижу, правда, так это слово. Смысл? Много людей запутаться попыток. Нет? Наконец, кодирования Хаффмана. Кодирование Хаффмана очень полезно для экономии памяти и сжимать текстовые файлы, только потому, что много раз вы используете 'A' и 'е', например, в ваших документах, но я не знаю, если вы, ребята, использовать 'Q' или 'Z', как много. Имея всего в 1 байт для каждого персонажа, каждый - в 256 символов, которые мы имеем в таблице ASCII не очень оптимальным, только потому, что есть некоторые символы, которые вы используете многое другое, так что вы, вероятно, следует использовать меньше памяти для тех. Как я могу использовать кодирование Хаффмана? Мы должны сделать дерево Хаффмана.  Дерево Хаффмана имеет узлы что есть символ, который собирается быть похожим, 'а', 'б', 'C', письма, что письмо у вас есть, частота, частота, которая появляется слово в тексте, что вы создавали дерево Хаффмана для, а затем узел, который будет указывать на слева от дерева Хаффмана и другой узел, который будет указывать на справа. Так же, как дерево. Как вы строите дерево Хаффмана? Вы собираетесь выбрать 2 узла, которые имеют самые низкие частоты. Если у вас есть галстук вы собираетесь выбрать 2 узла которые имеют самые низкие значения ASCII, а также. Тогда вы собираетесь создать новое дерево из тех 2 узлов что будет иметь комбинированный частоту в родительском узле. А потом вы собираетесь удалить 2 детей из леса и заменить их родителей. И вы собираетесь повторить, что, пока вы только не имеют 1 дерево в лесу. Итак, давайте посмотрим, как вы могли бы сделать дерево Хаффмана для ZAMYLA. Здесь можно увидеть, что все буквы имеют частоту 1 для 'A', кроме; что имеет частоту 2. Так что я создал узлы для всех писем, которые я приводят в порядок стоимости и частоте ASCII. Так что, если я хочу создать первое дерево, он будет с 'L' и 'M'. Так что это здесь. Частота пары будет два потому что это 1 + 1, то следующий 2 с самыми низкими частотами являются 'Y' и 'Z'. А то у меня все из них - имеют частоту 2. Так какие из них являются те, которые имеют наименьшее значение ASCII для следующего? «А» и «L». Так что я создать новый узел, И, наконец, это 4 и 2, поэтому 2 будет слева. И это дерево Хаффмана. Тогда, если я хочу написать текст, как в двоичном, чтобы преобразовать в текст, используя дерево Хаффмана очень легко. Например, если я говорю, что двигаясь влево является 0 и движется вправо является 1, Что это будет представлять? Так как 1, 1, так правильно, правильно, и затем 0, так что осталось бы L, а затем 1, 0, 0. Так 1, 0, так что просто 1, 0, 'А'. И тогда 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 и все 0 до 1 в. Как я говорю, что, частое использование этого и мы увидим его в немного, это, как мы хотим, чтобы придумать какой-то числа где все биты равны 1, для одного из них, за исключением. Так что это, как правило, легче выразить количество где только что один бит установлен, а затем взять ~ его, таким образом, каждый друга установлен бит для этой исключением одного. Так вот то, что мы собираемся использовать более в немного. Побитовый или. Вот 2 двоичные числа, и эти 2 цифры довольно представительным, так как они представляют все возможные Сочетание бит вам может понадобиться для работы на. При этом, когда я or'd каждый бит, мы только собираемся сравнивать прямо вниз. Таким образом, на левой стороне мы имеем один и 1. Когда я побитовое | тех, что я собираюсь получить? Один. Тогда побитовое | 0 и 1 собирается дать мне? Один. Битовые 1 и 0 будет то же самое, один. Битовые 0 | 0 собирается дать мне 0. Таким образом, единственный случай, когда я получаю 0 находится в 0 | 0 так. И вы можете думать о том, что так же, как ваши логические ПРС. Так что если вы думаете, что из 1 как истинный и 0 как ложный, то же самое применимо и здесь. Так правда или верно, то верно, истинно или ложно это правда. Ложь или правда, то правда; ложь или ложь это единственное, что на самом деле ложное. Вот пример, который вы должны знать, как довольно хороший пример, когда битовые операторы используются. Вот если бы мы или капитала "А" с OX20, и мы будем смотреть на них через секунду, мы получаем нечто. И если мы или строчная '' с OX20, мы получаем нечто. Так что давайте подтянуть таблицу ASCII. Хорошо. Здесь мы видим, что «А» является - здесь мы имеем «А» является десятичной 65. Но я пойду с шестнадцатеричном, который Ox41. Уверен, что мы видели его в классе. Я думаю, что мы видели его в классе что это довольно легко конвертировать из шестнадцатеричной в двоичную. Так вот, если я хочу поставить 4 в двоичный, вот только будет 0100. Это 1 в указанное место, 2 в указанное место, 4 в указанное место, так что это 4. Тогда я могу разделить 1 в двоичный, который собирается быть 0001. И таким образом, это будет представление «А» в двоичном виде. Принимая нижний регистр 'а', то теперь собирается быть Ox61, где, разделив эти вверх в его двоичный, поэтому 6 - Давайте на самом деле это сделать - нет ли ластик? Ластик. Ox61. Так разделив 6 в двоичный будет 0 + 4 + 2 + 0. И расщепление 1 будет 0001. Глядя на разницу между этими 2, мы видим, что единственная разница между строчной и прописной 'А' это один бит. Так возвращаясь к здесь - все в порядке. Возвращаясь к здесь, если мы посмотрим на то, что немного OX20 является, так расщепление OX20 в его двоичный, является 0010, 0000. OX20, единственный бит, который устанавливается это немного, что мы имеем дело с, с переключением между капиталом и нижний регистр 'A'. Если я или «А», который является этот, «А», если я или "А" с OX20, что я собираюсь получить? [Студент, неразборчиво] строчная 'а', потому что он собирается перевернуть этот бит в 1. И если я или "а" с OX20, что я собираюсь получить? Нижнему регистру, потому что как раз Öring «а» с OX20, Я просто хочу, чтобы быть Öring этот один бит на 1, это уже 1, так что это не имеет значения. Итак, мы получаем 'A' и 'A'. Побитовый и. Опять же, мы можем считать, что это наш логического и коллегой. С левой стороны у нас есть правда и правда. Это собирается быть правдой, и для всех случаев, ложь и правда или правда и ложь, или ложь и ложь, ни одна из этих вещей не верны. Итак, что мы в конечном итоге получить 1000. Так что теперь, вот, вот где я использовал верный побитовое нет, где у нас были OX20. Так что это OX20. Теперь то, что я хочу сделать, побитовое ~ из OX20. Это собирается перевернуть все биты. Так что у меня 1101, 1111. И так «А» операция AND с ~ OX20 собирается дать мне то, что? Единственная часть мы действительно должны думать о том, на этот раз, так, если все эти биты устанавливаются в 1, затем мы собираемся, чтобы получить именно то, что «А» был, за исключением, может быть, то, что этот бит. Потому что, если это был 1, теперь он собирается быть установлен на 0, потому что это, операция AND с этим будет 0. Так что же такое "А" и ~ OX20 собираюсь дать мне? [Студенты ответить, неразборчиво] А что такое "а" и - это "А". А что такое "а" и ~ OX20 собираюсь дать мне? 'А.' Поскольку это в настоящее время 1. Андинг с этим +0 собирается сделать это 0, и теперь мы собираемся, чтобы получить 'A'. Оба ',' и не в последнюю очередь этого типа, у нас есть XOR. Это очень похоже или, кроме это означает исключительно или. Это как то, что вы обычно думаете, как и в реальном мире. Таким образом, вы выполните одно 'х' или 'у', но не оба. Здесь 1 ^ 1 будет 0. Потому что правда, это - он не работает, а с логическим истинным и ложным как побитовое & и или сделать, но факт ^ верно неверно. Потому что мы только хотим, чтобы вернуться верно, если только один из них верно. Так 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. "А" ^ OX20 эти 2 бита мы сравниваем. Так 1 ^ 0 собирается дать мне что? Один. "А" ^ OX20 собирается дать мне? Нижнему регистру. 'А' ^ OX20 собирается дать мне? Капитал А. Потому что все, что это делает, это операции XOR с OX20 эффективно листать все этот бит. Если это 0, то теперь собирается стать 1. Так как это 1, 1 ^ 1 равен 0. Таким образом, наш «а» стала «А», и наш «А» стал «а». Так XOR является действительно удобным способом просто листать дело. Вы просто хотите перебрать строку букв и чередовать дело каждого отдельного персонажа, вы просто XOR все с OX20. Теперь мы оставили сдвиг. Сдвиг влево просто будет, в основном, нажать все номера в, или влево, а затем вставьте 0 за ними. Так вот у нас 00001101. Мы собираемся, чтобы подтолкнуть 3 0 в проход по правой, и мы получаем 01101000. В небинарных точки, мы видим, что, что на самом деле дело 13 левой смещенную 3, что дает нам 104. Так левый сдвиг, мы видим здесь, х << у в основном х * 2 ^ у. 13 * 2 ^ 3, 2 ^ 3 8, так что 13 * 104 8. Если вы просто думаете о двоичном вообще, как каждой цифры, если исходить из права, это в 1 в указанное место, то в 2 указанное место, то в 4 в указанное место. Так, нажав на 0-х годов по правому флангу, мы просто толкает вещи, которые были в 4 в месте с 8 по месту, и вещи, которые были в 8 в месте, чтобы в 16 своего места. Каждая смена просто умножает на 2. Да? [Студент] Что произойдет, если вы перешли на 5? [Боуден] Если вы сдвигается на 5, вы просто потеряете цифры. Безусловно, это одно и то же. Мол, целые числа только 32 бит, так что если вы добавить 2 действительно большие целые числа, он просто не вписывается в целое число. Так что это то же самое здесь. Если вы перешли по 5, мы бы просто потерять, что один. И это вроде того, что я имею в виду "примерно" , где, если вы переносите слишком далеко, вы теряете биты. Сдвиг вправо будет наоборот, куда мы идем засунуть 0-х от конца, и для наших целей, заполните 0 с левого. Так делать это, мы в основном вспять то, что мы уже сделали. И мы видим, что три 0 о праве только отвалилась, и мы подтолкнули 1101 все до упора вправо. Это делает 104 3, который является, по сути, х / 2 ^ у. Так что теперь, здесь, это подобная идея. Почему это только примерно х / 2 ^ у, а не на самом деле х / 2 ^ у? Потому что, если я сместился на 4, я бы потерял 1. В принципе, что вы думаете о, просто думаю, целочисленного деления в целом. Так что, как 5/2 составляет 2. Это не 2.5. Это та же идея здесь. Когда мы делим на 2, мы можем потерять нечетные биты на этом пути. Так что теперь - вот это для побитового. Вот и все, что вам нужно знать. Запомнить прецеденты, которые мы видели в классе, как битовая маска полезна для операторов побитовых или вы используете их для битовых масок. Заглавные буквы и строчные буквы, преобразования является довольно Простейший пример. Ладно, так атак на переполнение буфера. Кто-нибудь помнит, что случилось с этой функцией? Обратите внимание, мы объявили массив 12 байт, 12 символов, а затем мы копируем в нашу буфера 12 символов вся штрих строка. Так в чем же проблема? Магическое число 12 должно в значительной степени немедленно выскочить как - почему 12? Что делать, если бар, случается более 12 символов? Что делать, если бар миллионы героев? Здесь речь идет тетсру. Если бар достаточно долго, это будет просто полностью - 'C', 'C' не волнует, что это было только 12 символов; 'С' не заботится, что она не может поместиться, что количество байтов. Это будет просто полностью переписать Чаре, 12 байт мы выделенные для него, и все мимо него в памяти, что на самом деле не принадлежат этому буфера с тем, что строка бар. Так что это была картина мы видели в классе где у нас есть наш стек рос. Вы должны быть использованы для этих картин или ознакомиться с ними снова. Мы наш стек рос, адреса памяти начинаются с 0 на вершине и расти до нравится 4000000000 на дне. У нас есть массив 'с' где-то в памяти, то у нас есть указатель на бар прямо под ним, а то у нас этот сохраненный указатель кадра в нашем обратного адреса и стек нашей материнской рутины в. Помните, что ваш обратный адрес? Это когда основной вызывает функциональный Фу, вызывает функциональный бар, неизбежно, бар отдачу. Поэтому, когда бар возвращается, они должны знать, что он собирается вернуться к Foo, который вызвал ее. Таким образом, обратный адрес является адресом функции, что он должен вернуться в когда функция возвращает. Причина, по которой важно для атак переполнения буфера происходит потому, что, удобно, хакеры хотел изменить эту обратный адрес. Вместо того, чтобы возвращаться к Foo, я собираюсь вернуться туда, где хакер хочет, чтобы я вернуться. И, удобно, где хакер часто хочет вернуться к является началом буфера, который мы первоначально имели. Так заметить, опять же, Little Indian. Прибор является примером Маленькая индийской системе, так целое или указатель хранится с байтах в обратном порядке. Так вот, мы видим - это? Да. Мы видим Ox80, OxC0, Ox35, OxO8. Помните шестнадцатеричные цифры? Мы не обратить вспять шестнадцатеричные цифры в Little Indian, потому что 2 шестнадцатеричные цифры составляют один байт, и мы поменяем байт. Вот почему мы не храним, как, 80530CO8. Мы храним, вместо этого, каждую пару 2 цифры, начиная справа. Этот адрес указывает на адрес начала нашего буфера, что мы на самом деле хотели скопировать в в первую очередь. Причина, по которой полезно потому, что, что, если злоумышленник случилось с, вместо того, строку, которая была просто Безобидный строка, как их имя или что-то, что, если вместо, что строка были лишь некоторые произвольного кода что сделал все, что они хотели, чтобы это сделать? Таким образом, они могли - я не могу думать ни о каком прохладном кода. Это может быть что угодно, все же. Любой катастрофическими код. Если бы они хотели, они могли бы просто сделать что-то на сегментах неисправностей, но это было бы бессмысленно. Как правило, они делают это, чтобы взломать вашу систему. Хорошо. CS50 библиотека. Это, в основном, GetInt, GetString, все эти функции мы предоставили для вас. Поэтому у нас есть символ * строку, и это абстракция, что мы сдул в какой-то момент во время семестра. Помните, что строка просто массив символов. Так вот мы видим сокращенную версию GetString. Вы должны оглянуться на него, чтобы вспомнить, как это на самом деле реализуется. Основные детали, обратите внимание мы получаем в один символ за один раз от стандартных в, которая как бы нам набрав их с клавиатуры. Так один символ за один раз, и если мы получим слишком много символов, поэтому, если п + 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 будет получать хранится в целое, X будет получить хранятся на характер, Sscanf вернется 2, и мы хотели бы повторить, потому что мы только хотим целое. Быстро продувки HTML, HTTP, CSS. Язык разметки гипертекста является структура и семантика в Интернете. Вот пример из лекции, где у нас есть HTML-теги. У нас есть головы теги, теги тела, у нас есть примеры пустых тегов, где мы на самом деле не имеют начала и закрывающий тег, мы просто должны ссылку и изображение. Там нет закрытия тег картинки; есть только один тег, который выполняет все тег должен делать. Связь является примером; мы увидим, как Вы даете ссылку на CSS, сценарий является примером того, как Вы даете ссылку на внешний JavaScript. Это довольно просто, и помните, HTML не является языком программирования. Вот, помните, как бы вы определить форму или по крайней мере то, что это будет делать? Такая форма имеет действие, и способ. Методы, которые вы только когда-либо видите, GET и POST. Так GET является версия, где вещь получает положить в URL. POST, где не ставится в URL. Вместо этого любые данные из формы вставляется более скрытые в запросе HTTP. Так вот, действие определяет, когда запрос HTTP идет. Где он собирается это google.com / Поиск. Метод. Запомнить различия между GET и POST, и, просто сказать в качестве примера, если вы хотите закладки чем-то. Вы никогда не будете иметь возможность установить закладку на POST URL поскольку данные не включены в URL. HTTP, сейчас, является протокол передачи гипертекста. Протокол передачи гипертекста, можно было бы ожидать, что для передачи Язык разметки гипертекста, и это делает. Но это также передает любые изображения, которые вы найдете в Интернете, любые загрузки вы делаете начать как запросу HTTP. Так HTTP просто язык World Wide Web. И здесь нужно признать этот вид запроса HTTP. Здесь HTTP/1.1 на стороне просто говорит, что это версия протокола я использую. Это в значительной степени всегда будет HTTP/1.1, как вы увидите его. Тогда мы видим, что это было GET, альтернатива быть POST, что вы можете увидеть. И URL, что я пытался посетить был www.google.com/search?q = бла, бла, бла. Так что помните, что это, знак вопроса д = бла бла бла, является своего рода материал, который представляется в форме. Ответ может вернуться ко мне бы выглядеть примерно так. Опять же, начиная с протокола, который собирается быть, что, затем код состояния. Вот это 200 ОК. И, наконец, веб-страницы, что я на самом деле попросил последует. Возможный код состояния вы можете увидеть, и вы должны знать некоторые из них. 200 ОК вы, наверное, видели раньше. 403 Forbidden, 404 Not Found, Error 500 Internal Server , как правило, если вы идете на сайт и что-то не работает или их аварий PHP код, в то время как в приборе имеем большой оранжевый прямоугольник что приходит и говорит, вроде бы, что-то не так, этот код не работает или эта функция плохо. Обычно веб-сайты не хочу, чтобы вы, зная, какие функции на самом деле плохо, так вместо этого они просто дам вам 500 Внутренние ошибки сервера. TCP / IP является 1 слой под HTTP. Помните, что существует Интернет за пределами Всемирной паутины. Подобно этому, если вы играете в онлайн игры, которая не проходит через HTTP, это будет через другой - она ​​по-прежнему с использованием Интернета, но он не использует HTTP. HTTP является лишь одним из примеров протокола построен на TCP / IP. IP буквально означает Internet Protocol. Каждый компьютер имеет IP-адрес, они эти 4-значные вещи как 192.168.2.1, или что, то, как правило, локальный характер. Но это картина из IP-адреса. Таким образом, DNS, Domain Name Service, это то, что переводит такие вещи, как google.com к фактическому IP адресу. Так что если вы введете, что IP-адрес в URL, что бы привести вас к Google, но вы, как правило не вспоминать эти вещи. Вы, как правило, вместо помнить google.com. Последнее, что мы имеем, порты, где это TCP частью IP. TCP делает больше. Подумайте о том,, как, вы запустили веб-браузера. Может быть, у вас есть некоторые работающие приложения электронной почты, может быть, у вас есть другие программы, использующей Интернет работает. Все они нуждаются в доступе к сети Интернет, но ваш компьютер имеет только 1 WiFi карты или любой другой. Так порты так, что мы в состоянии разделить как эти приложения могут использовать Интернет. Каждое приложение получает 1 определенный порт, что он может слушать на, и по умолчанию, HTTP использует порт 80. Некоторые почтовые службы используют 25. Те, низким номером, как правило, защищены. Вы, как правило, в состоянии получить более высоким номером те для себя. CSS, каскадные таблицы стилей. Мы стиле веб-страниц с помощью CSS, а не с HTML. Есть 3 места, которые вы можете поместить свой CSS. Это может быть встроенным, между тегами стиле, или в совершенно отдельном файле и затем связаны дюйма А вот как раз пример CSS. Вы должны признать эту модель, где первый пример мы соответствующие теги тела, и здесь мы центрирования тег тела. Второй пример, мы не уступают вещь с ID сноске, и мы применяем некоторые стили к этому. Обратите внимание, что ID Сноска выравнивает влево, в то время как тело текстовые выравнивает центр. Footer находится внутри тела. Это будет, вместо этого, выравнивания текста осталось, хотя тело говорит выравнивания текста центр. В этом вся каскадных частью. Вы можете иметь - можно указать стили для тела, и тогда все в организме можно указать более конкретные стили, и все это работает, как вы ожидаете. Более конкретные CSS спецификаторы имеют приоритет. Я думаю, что это он. [Али Нама] Привет всем. Если бы я мог привлечь ваше внимание. Я Али, и я собираюсь пройти через PHP и SQL очень быстро. Таким образом, мы можем начать. PHP является сокращением PHP: Hypertext Preprocessor. И, как вы все должны знать, что это на стороне сервера скриптовый язык, и мы используем его для задней части веб-сайтов, и как она делает много вычислений, со стороны за кадром. Синтаксис. Это не похоже на C, удивление, удивление. Это всегда должно начинаться с, если вы видите, - я не могу двигаться вперед. Вы можете видеть, вам нужны новые виды брекетов, а затем вы также нуждаются в PHP?. Это всегда, как вы должны сформулировать свой PHP текст, ваш код PHP. Поэтому он не может быть просто, как С, где вы вроде положить его в первую очередь. Вы должны всегда окружают его. А теперь, майор синтаксис, что все переменные должны начать с символа $. Вы должны сделать это, когда вы определяете их, вы должны сделать это когда вы имеете в виду к ним позже. Вы всегда должны, что $. Это ваш новый лучший друг, довольно много. Вы не - в отличие от C, вам не нужно ставить какую типа переменной это. Таким образом, хотя вы действительно нуждаетесь в $, вам не нужно ставить, как, внутр х или строка у, и так далее, и так далее. Так небольшая разница. В результате этого, это означает, что РНР является слабо типа. PHP является слабо язык Тип, и он слабо типизированные переменные. Другими словами, это означает, что вы можете переключаться между различными видами типов переменных. Вы можете сохранить свой номер 1 в виде целого числа, Вы можете сохранить его в виде строки, и вы можете сохранить его как поплавок, и это все будет, что число 1. Даже если вы хранить его в различных формах, она по-прежнему - типы переменных все еще держат в конце концов. Так что, если вы посмотрите сюда, если вы помните из PSet 7, многие из вас, вероятно, были проблемы с этим. Два знака равенства, 3 знака равенства, 4 знака равенства. Хорошо, нет 4 знака равенства, но есть 2 и 3. Вы можете использовать два знака равенства для проверки значений. Он может проверить по типам. Так что если вы можете видеть на первом примере, У меня есть num_int == num_string. Так что ваш внутр и ваша строка оба, технически, 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, и это имя индекса. Мы собираемся поставить "Али" в качестве имени, на индекс, калории съедены, мы можем положить целочисленное этот раз вместо строки, , а затем в индексных любит, мы можем положить весь массив внутри него. Так что это своего рода - это аналогичная концепция того, как мы должны были индексы с номерами, но теперь мы можем изменить индексы вокруг иметь их как строки, а не. Вы также можете сделать это, кроме всего делать это индивидуально, Вы можете сделать все это в одном куске. Таким образом, вы можете видеть, что TF этого массива, и то положим их в одну гигантскую квадратного набор кронштейнов. Так что может ускорить процесс. Это скорее стилистический выбор, чем нет. У нас также есть петли. В C мы имеем петли, которые работают, как это. У нас был наш массив, и мы пошли с индексом 0 в конце списка, и мы печатаем все это, не так ли? Кроме проблема, для ассоциативных массивов, мы не обязательно знать эти числовые индексы потому что теперь у нас есть строчные индексы. Теперь мы используем FOREACH петли, которые, опять же, вы, надеемся, используемые в PSet 7. Foreach петли будет просто знаю, каждый часть списка. И это не обязательно должен точно знать числовой индекс, что у вас есть. Так у вас есть синтаксис Еогеасп, так что это Еогеасп, вы положили массив. Так что мой массив называется PSET, а затем, слово как, а затем вы положите этот локальный временную переменную, что вы собираетесь использовать только для конкретной вещи, что происходит провести конкретный - один экземпляр или одна часть массива. Pset пит проведет 1, а затем, может быть, будет содержать номер 6, , а затем он будет содержать номер 2. Но это гарантированно пройти каждый одно значение, это в массиве. Полезные функции, которые вы должны знать в PHP являются требуют, так что делает уверены, что вы в том числе определенные файлы, эхо, выход, пустой. Я настоятельно рекомендую вам посмотреть на PSet 7 и посмотреть на этих функций. Возможно, вам придется знать тех, так что я точно знаю, будет то, что, собственно, те, все делают. А теперь мы собираемся пройти через рамки очень быстро. В рамках, PHP является своего рода фанки вещи, в отличие от C, и так мы только собираемся пройти через это быстро. Так скажем, мы начинаем в этом стрелки, что у нас есть. И мы собираемся начать с $ я. Таким образом, переменная 'я' будет 0, и мы только собираемся продолжать печатать его в этой большой белой коробке там. Мы собираемся начать с i0, а затем мы собираемся повторить его. Таким образом, есть 0. А потом мы собираемся увеличивать его на цикл, , а затем он будет значение 1. Один меньше 3, поэтому он собирается пройти через это цикл, и тогда мы увидим его снова напечатаны. Мы собираемся увеличить его снова до 2, и 2 меньше 3, поэтому он пройдет цикл, и он будет печатать 2. Тогда вы заметите, что 3 не меньше 3, поэтому мы вырваться из цикла. Так что теперь мы вышли, а затем мы собираемся идти в прекращение функции. Хорошо. Таким образом, вы должны отметить, что это переменная, которую мы создали, "Я" переменной, не локальной областью видимости. Это означает, что оно не является локальным в петлю, и что переменная, которую мы до сих пор могут получить доступ и изменить впоследствии, и она по-прежнему будет эффективным. Так что, если вы идете в функцию сейчас, вы увидите, что мы также используем "Я" переменную, и мы собираемся, чтобы увеличить 'я' + +. Можно было бы подумать, во-первых, на основе C, что это копия «Я» переменной. Это совершенно разные вещи, что является правильным. Поэтому, когда мы печатаем его, мы собираемся напечатать 'я' + +, который будет печатать, что 4, а затем мы собираемся - извините. Тогда мы собираемся в конечном из этой функции, и мы собираемся быть там, где, что стрелка находится сейчас. Это означает, что то, тем не менее, даже если функция изменили значение "Я", это не изменило за пределами функции, потому что функция имеет отдельный объем. Это означает, что, когда мы эхо 'я', она не изменилась в области действия функции, и так, то мы собираемся напечатать 3 раз. Различные вещи о рамки в PHP, чем в С. Сейчас в PHP и HTML. PHP используется, чтобы сделать веб-страницы динамичными. Это отчасти делает вещи разные. У нас есть его отличие от HTML. С HTML, мы всегда только имеют тот же статический вещь, как то, как Роб показал, в то время как PHP, вы можете изменить вещи на основе, кем является пользователь. Так что, если у меня есть это, я, "Вы вошли как -" а затем имя, и я могу изменить имя. Так что сейчас зовут Иосиф, и у него есть "обо мне", но тогда я могу также изменить имя, чтобы иметь Томми. И это было бы другое дело. Так тогда мы можем также изменять различные вещи о нем, и он покажет различное содержание на основе имени. Итак, PHP может отчасти изменить то, что происходит в вашем сайте. То же самое здесь. Тем не менее, обратите внимание, что у них есть различный контент, даже если вы технически все еще доступ к этой же веб-страницу на поверхности. Создание HTML. Есть 2 различных способов, которыми вы можете сделать это. Таким образом, мы пройдем это прямо сейчас. Первый способ, у вас есть - да, жаль. Таким образом, вы просто должны вашей обычной для петли в 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 является более безопасным, но вы все еще можете увидеть это в твоих печенье в информации, вы посылаете. Так что не думаю, что об одном или другом. Другое дело, следует отметить, что у вас также есть раздел переменных. Вы, ребята использовали это в PSet 7, чтобы получить идентификатор пользователя информацию. Случилось так, что вы можете использовать этот ассоциативный массив, $ _SESSION, а затем вы сможете получить доступ к различным вещи и хранить различные вещи по страницам. Последняя дело, что у нас есть SQL, Structured Query Language, и это язык программирования для управления базами данных. Что, собственно, представляют собой базы данных? Они коллекции таблиц, и каждая таблица может иметь подобные виды объектов. Так у нас был стол пользователей в вашей финансовой PSet. И почему они полезны? Потому что это способ постоянного хранения информации. Это способ отслеживания вещи и управление вещи и на самом деле видим его на разных страницах и отслеживание. В то время как, если вы просто хранить его в то одного непосредственной момент а затем использовать его позже, вы не сможете получить доступ к все, что вы сохранили. У нас есть 4 основные вещи, которые мы используем для команд SQL. У нас есть выбирать, вставлять, удалять и обновления. Те, которые действительно важны для вас, ребята знают, для вашего викторины. Мы быстро перейти выберите прямо сейчас. В принципе, вы выбора строк из базы данных. Так что если у вас есть, прямо здесь - у нас есть эти 2 разные вещи, и мы хотим, чтобы выбрать из таблицы классов где удивительным - где в удивительном колонке значение равно 1. Таким образом, вы можете видеть здесь, у нас есть эти 2 вещи имени класса, CS50 и Stat110, и у нас есть коды классов и лозунг. Поэтому мы хотим, чтобы выбрать все, что информация. Тогда вы можете увидеть прямо здесь, что это отчасти выбирая из этой удивительной колонке, где все вещи 1, а затем она имеет идентификатор класса, имя класса и лозунг, что он может выбрать из. Как именно вы будете делать это в коде? Вы должны использовать PHP. Так что вроде как PHP и SQL связаны друг с другом. Теперь у нас есть наш код, и мы собираемся использовать нашу функцию запроса как мы делали в PSet 7, и мы собираемся запустить SQL запрос. Тогда мы будем иметь - мы всегда должны проверить, если тройка равна Роу если ложно. Итак, еще раз, вы хотите проверить тип и значение, а затем, если он не работает, то вы хотите, чтобы извиниться, как обычно, как мы делали в PSet 7. В противном случае, вы хотите перебрать все с теми удобно Еогеасп петли, что мы просто перешли. Теперь, когда мы пробегаем по и мы сделали это в прошлом, давайте предположим, что наш запрос прошел, теперь у нас есть цикл по каждому элементу. И первая строка имеет, так что вот строка, прямо здесь, это в коробку. Это собирается распечатать всю информацию, которую он получил. Так это будет распечатать на дне "Хочешь узнать HTML?" Тогда это будет перейти к следующему ряду, потому что она завершена первая цикл, и так, то это будет распечатать вторую строку ней, который будет STAT110, Найти все моменты. И еще одно находится на SQL уязвимостей. Я знаю, Дэвид коснулся этого немного в лекции. Вы можете прочитать это позже. Это действительно забавно. SQL-инъекция является своего рода сложная вещь. Давайте предположим, что вы просто придерживаться этих переменных прямо в вашем запросе, как вы можете видеть в этом первой линии. Так что, похоже прекрасно, не так ли? Вы просто положить в имени пользователя и пароль в ваш запрос, и вы хотите грузить его и получить то, что находится в таблице данных. Это кажется довольно простым. Так что давайте говорить кто-то кладет в, для пароля, это или текст прямо здесь - должны на самом деле быть в красной коробке. Так скажем, что они вкладывают в этот пароль - это то, что они входят. Так они помещают или "1" = 1. Вид глупой пароль, чтобы иметь. Теперь давайте просто заменить его, и вы заметите, что в этом SQL запросе, теперь, он оценивает всегда верно, потому что вы заметите, что Вы можете SQL запросов выберите всю эту информацию или вы можете просто есть 1 = 1. Так что всегда будет оценить к истине. Это не будет по-настоящему работать, потому что это означает, что хакер может взломать вашу систему. Решение этой проблемы является то, что вы должны использовать систему PDO, Это означает, что вы должны использовать вопросительные знаки, что и вы, ребята, используемые в PSet 7, где вы собираетесь использовать вопросительный знак на месте, где вы хотите, чтобы положить что-то, и тогда вы будете иметь запятую, а затем вы будете иметь после этого, после строки, различные переменные, которые вы хотите заменить в ваш знак вопроса. Таким образом, вы будете отметить, что теперь у меня есть эти красные вопросительные знаки. Тогда я положил переменные после моих строк так что я знаю, чтобы заменить их в таком порядке после этого. Это позволит убедиться, что если кто-то делает это, как это, и у них есть или 1 = 1 ситуацию, что будет убедиться, в задней части, убедитесь, что он не будет на самом деле сломать SQL запрос. Хорошо, таким образом, что в значительной степени он, вихрь PHP и SQL. Удачи всем вам, и теперь, чтобы штат Орегон [Oreoluwatomiwa Babarinsa] Хорошо все. Время перейти некоторое наличие и некоторые другие вещи очень быстро, поэтому мы не держать вас сегодня вечером. JavaScript. Да. JavaScript является своеобразной прохладном вещи, якобы. То, что вы действительно должны знать о JavaScript, это вроде как на стороне клиента конец того, что ваш веб-приложение будет делать. Там-то вещи, которые вы просто не хотите, чтобы заботиться о все время на стороне сервера. Все маленькие взаимодействия, подчеркнув одно, что делает что-то исчезает. Вы действительно не хотите, чтобы поговорить с вашим сервером все время для этого. И некоторые, что даже не представляется возможным сделать на стороне сервера. Вот почему мы должны что-то вроде JavaScript. Прохладный вещи о JavaScript: Он динамически типизированных. Что это означает, что ваша программа не нужно знать что именно переменные, когда вы пишете его. Это будет просто своего рода понять это, как это работает. Другие вещи, которые здорово об этом: Это вьющиеся язык скобки, это означает, что синтаксис похож на С и РНР. Вы не должны делать много переделок, когда вы учитесь JavaScript. Здесь у нас есть немного JavaScript. Интересная вещь прямо здесь в том, что, если вы посмотрите на нее, у нас есть немного JavaScript тут же в голове теги. Что такое делает, в основном просто включить файл JavaScript. Это один из способов вы можете включить JavaScript в вашу программу. Тогда второй немного на самом деле некоторые встроенные JavaScript, очень похоже на встроенного стиля с CSS, и вы просто писать код очень быстро там. JavaScript имеет массивы. Просто еще один способ сохранить данные вокруг, очень полезно. Очень приятно и легко синтаксис. Вы можете использовать квадратные скобки для доступа все и держать все вместе. Ничто не слишком сложным. Самое замечательное JavaScript и скриптовых языков в целом является то, что вам не придется беспокоиться о размерах массива. Вы можете просто использовать array.length и отслеживать его, а также массив может расти или уменьшаться, как вам это нужно. Таким образом, вы даже не нужно беспокоиться о каких-либо, о нет, мне нужно выделить больше вещей, или что-нибудь в этом роде. Отличная вещь в том, что JavaScript имеет то, что называется объекты. Это объектно-ориентированный язык, так что он, по сути, способ для вас для группировки данных вместе, чем-то напоминает на структуру, но вы можете получить доступ к нему, как структуры или в синтаксисе ассоциативного массива. Это довольно просто, а что вы можете сделать с этим группа данных вместе если у вас есть куча данных, что связано. Потому что это все вещи, которые нужно описать автомобиль, Вам не нужно иметь его в кучу разных местах. Вы можете просто придерживаться его в 1 объекта в JavaScript. Как вы, наверное, знаете, итерации является одним из тех трудоемких задач. Вы просто сделать это в течение снова. Вам нужно поговорить с каждого объекта в автомобиле, или вам нужно пройти через каждый элемент в списке или что-то вроде этого. Так JavaScript имеет, подобно PHP, синтаксис Еогеасп. В этом случае, это для в цикле. Вы хотите использовать этот только на объектах. Есть некоторые проблемы, которые возникают, если вы используете это на массивах. Это вообще одна из тех вещей, однако, что очень полезно, потому что вы устранить много накладных расходов потому что вы не должны подтянуть все в вашей объекта самостоятельно. Вы не должны помнить все ключевые имена. Вы только вид получить их обратно в этом синтаксисе. В этом, с в течение, вы просто хотите, чтобы помнить что вы получаете обратно все ключи, в очень похожим образом, чтобы хеш-таблицы. Если вы помните этого, когда вы положили бы в строке вы могли бы получить что-то из что будет иметь значение, связанное с ним. Что вы можете сделать с этим вы можете сказать, все в порядке, Я посадили в машину, и я назвал его Ferrari. Таким образом, вы можете поместить в строке Ferrari позже, и вы можете получить это. И вы можете сделать это в цикле, с Ибо в петле. Так что просто больше об объектах. Главное из этого вы должны помнить, является то, что вы можете использовать объектную структуру подобный синтаксис, когда вы хотите с этим, кроме того, если то, что ты собираешься использовать в виде строки не является допустимым именем переменной. Так что, если вы посмотрите на что, у нас есть ключ с пробелами. Ну, если бы вы были поставить object.key, пространство, с, пространство, пространства, что просто не имело бы смысла синтаксически. Таким образом, вы только можете сделать это с такого рода синтаксиса кронштейна. Кроме того, JavaScript очень Сфера-мудро PHP. У вас есть 2 пути решения сферу. Вы не можете иметь вар перед переменной, и это просто означает, что это глобальная. Вы можете видеть это из любой точки мира. Даже если вы были поставить об этом в если заявление, нигде в коде после этой точки, вы могли видеть эту переменную. Другое дело, тем не менее, с Вар, она ограничена любой функции вы дюйма Если вы не в функции, ну, это глобальная. Но если вы находитесь в функции это видно только в этой функции. Я не есть пример, но, да. Это одна из тех вещей, где Вы можете управлять тем, что переменные, которые вы хотите быть глобальным, какие переменные вы хотите быть локальным, но вы должны быть осторожны, об этом, потому что вы не имеете тип тонкого контроля зерна, что вы делаете в C, где если что-то объявляется в цикле, это собирается остаться в том, что цикл. То, что мы на самом деле волнует, используя наличие для манипулирует веб-страниц, не так ли? Я имею в виду, вот почему мы делаем это. Чтобы сделать это, мы используем то, что называется DOM. Объектной модели документа. В общем, что она делает это занимает все ваше HTML и модели его в кучу объектов, которые вложены друг в друга. Вы начинаете с чем-то вроде этого. У вас есть, справа для меня, куча кода, что там вроде - Можно подумать, что было бы очень трудно манипулировать, потому что вы бы разбора через кучу текста и того, чтобы собрать кроме вещи. А что, если он не был правильно отформатирован? Плохие вещи случится. Так JavaScript заботится об этом для вас, и вы получите хороший структуру данных, так, как на мой левый, где вы просто иметь документ, и внутри, что у вас есть то, что называется HTML, и внутри, что у вас есть голова и тело, и внутри этой головы у вас есть название, и так далее, и так далее, и так далее. Это упрощает манипуляции веб-страницы, так что это просто, о, я просто хочу поговорить с этим объектом. Вроде очень похоже вы говорить с другим объектом вы сделали сами. Как я уже сказал, все DOM в объекте документа. Либо это просто одно место, а затем вы можете пойти в нем, чтобы найти вещи, и вы можете сделать это - это старый стиль делают это, там, где вы делаете document.getElementById, а затем имя, и, как вы, вероятно, может сказать, это становится очень громоздким через некоторое время. Таким образом, вы, вероятно, не хотят этого делать. Вот почему у нас есть Следующее, что мы собираемся говорить о после этого. Главное здесь то, что, все в порядке, у вас есть все эти элементы, не так ли? Поэтому, возможно, я могу изменить цвет что-то при загрузке страницы. Ну и что? Что делать, если пользователь нажимает что-то? Я хочу, чтобы сделать что-то интересное, когда он нажимает что-то. Вот почему у нас есть события. Вы можете, в принципе, найти любой элемент в вашем DOM, а потом говорят, эй. Когда это загружает или кто-то нажимает на нее, или когда они мыши над ним, что-то сделать с ним. И что у вас есть, у вас есть функции, которые обрабатывают это для вас. Эти функции обработчики событий. Что they're - это всего лишь причудливый способ сказать, эта функция выполняется только при возникновении этого события. Так он обрабатывает событие, возникающее. Это, как вы бы выложить обработчик событий. У меня есть кнопки, а при нажатии ее, она взрывается. Так что не нажать кнопку. Это один из способов приближения к нему, не так ли? У вас есть кнопка тег, и по щелчку у вас есть строка, которая говорит, о, кстати, я делаю это взрывающийся вещь для меня. В противном случае, это просто, как обычный кнопку вы только что сделали. Вы также можете сделать это по-другому, , захватывая элемент DOM, но мы оставим, что после того как мы говорим о JQuery. JQuery: Это библиотека, которая является кросс-браузерный. Вы можете использовать его в значительной степени чего-либо. И это как раз дает много инструментов для работы с. Поскольку JavaScript, в то время как мощный, не все инструменты, необходимые из коробки, чтобы действительно решать веб-приложение, вы можете сделать. Так что упрощает много вещей, дает вам много функций из коробки, которые вы обычно приходится писать самостоятельно, снова и снова и снова. И так же, делает вещи очень просто. У вас также есть селекторы, которые позволяют вывезти все те элементы, от вашего DOM гораздо более просто, вместо того, чтобы использовать эти очень длинные вызовы функций. Еще на этих селекторов. У вас есть, там вы, скажем, Я хочу получить элемент с ID "рок". Ну, в JQuery, это просто $, а затем строка, которая имеет фунт, а затем "рок". Это очень просто и намного быстрее, чем традиционным JavaScript пути решения этой проблемы. А у вас есть подобные вещи для классов и типов элементов. JQuery - один из интересных функций, что вы можете рода сжимать вниз запросах на вашем DOM очень, очень быстро. Теперь мы вернулись к обработке событий, и это, как вы бы справиться одно событие в JQuery. Так что мы собираемся здесь мы говорим, все в порядке. У меня есть тег сценария, не так ли? Поэтому у меня есть этот инлайн JavaScript. То, что мы собираемся сделать, это мы собираемся сказать, все в порядке. Когда документ будет готов, а это значит, это был загружен документ, мы собираемся идти к этой функции, и мы собираемся сказать, все в порядке, эта функция на самом деле делать что-то еще. Это в основном говорят, все в порядке, дай мне элемент с ID "MyID." А потом дать это обработчик функции, которая выполняет, когда вы щелкните по нему. В основном то, что это делает, он говорит, все в порядке. Страница загружается, поэтому я собираюсь в, найти этот элемент, дать ему этот обработчик событий, и это в основном настраивает страницы для вас. И это, как вы хотите думать об обработке событий. Вы просто хотите, чтобы думать, все в порядке, когда что-то происходит, то, что я хочу чтобы это произошло? Вы же не хотите, чтобы думать о, хорошо, мне нужно, чтобы убедиться, эта вещь переговоры на эту вещь, эта вещь бла-бла-бла, потому что вы просто хотите поговорить вещь с точки зрения событий. Когда это происходит, это происходит. Когда это происходит, что происходит. И если события вызывают другие вещи, это здорово. Но вы не хотите, чтобы попытаться сделать сложный код где вы вызвав несколько вещей одновременно, потому что вы только собираетесь дать себе головную боль. Хорошо. Теперь мы можем получить нашу страницу для обработки событий, но, скажем, мой пользователь нажимает кнопку. Что делать, если я хочу отправить эту просьбу обратно на сервер, но я не хочу, чтобы перезагрузить страницу, так как необходимости перезагрузки новую страницу каждый раз, когда становится отчасти утомительно, и зачем он мне нужен снести заголовок снова, а в нижнем снова, и все элементы страницы снова просто чтобы обновить приветствие или время? Так вот почему у нас есть что-то вроде Ajax. Что мы можем сделать здесь с Ajax является, можно сказать, все в порядке, Я хочу отправить некоторые данные на сервер, и я хочу, чтобы получить ответ обратно, чтобы я мог обновлять свою страницу, или может быть просто делать некоторые алгоритмические вычисления, что не обязательно показывать все, чтобы пользователю. Что нужно для этого? Ну, вам нужен URL вам нужно поговорить. Ваш сервер не может просто волшебно слушать из ниоткуда. Вы должны иметь определенное место вы посылаете эти данные. И вы также должны некоторые данные для отправки, или, может быть, это без данных запросов. Вы просто хотите, чтобы проверить связь обратно на сервер и сказать, эй, я жив, или что-то вроде этого. А потом вы хотите функцию, которая в основном обрабатывает успехом. Допустим, вы вернуться некоторую информацию с вашего сервера, и вы хотите изменить должность пользователя на своей странице. Так вы получите информацию обратно, и будет вы нажимаете, что на экране. Что происходит, является, когда страница готова, Вы создаете на функции клик для этой кнопки под названием зазывала. Что это, то делает это, когда, что кнопка нажата, Вы говорите с greetings.php, вы делаете запрос POST, а вы говорите, эй, дай мне что-нибудь из вашей странице. Мы действительно не нужно, чтобы описать это, но greetings.php, давайте просто скажем,, отдает "Hello World". Итак, мы получаем обратно этот "привет мир", и в случае успешного завершения этого предполагая все идет не так, то мы просто пойти в этот целевой месте что мы определили, и мы просто придерживаться ответ там. И это очень простой способ создания запроса Ajax. Очень быстро, Роб рода упомянул об этом уже, все может пойти не так, плохие вещи могут случиться, так что вы хотите, чтобы ознакомиться с этими кодами HTTP реагирования. Что это просто, как, 200, все прошло хорошо. Что-то еще, плохие вещи произошло. Это вообще, что вы хотите запомнить. Но приятно знать, все это. И, наконец, как только мы прошли через все это, мы должны говорить очень быстро о дизайне, и тогда мы сможем позволить вам всем уйти. Дизайн. То, что вы хотите запомнить. Задайте себе эти вопросы: Кто будет использовать это? Что они будут использовать его для? Что мои пользователи заботятся о? Что они не заботятся о? Вы просто не хотите сделать приложение, и пусть он просто расти и стать этот гигант, всепоглощающей, что вы не можете даже закончить. Вы хотите иметь дискретные цели и планы и вещи, которые вы хотите обратиться. Сделать это легко. Все это говорит, в основном, сделать его легким для пользователя, чтобы использовать его, не сделать его гигантский сгусток текста как этот слайд, собственно. Вы просто хотите, чтобы он что-то где это очень легко для кого-то идти в и делать то, что они хотят сделать. Вы же не хотите, чтобы они имели ориентироваться 5 страниц чтобы добраться до вашего премьер-функции вашего сайта. Если Google было 5 страниц, прежде чем вы могли даже искать что-то, никто не будет использовать его. И, наконец, бумага прототип, фокус-группа. Есть хороший дизайн и практики тестирования. Просто потому, что вы думаете, он работает для вас, не означает, кто-то еще думает, что это работает. Но да, вот оно что. [CS50.TV]