[Powered by Google Translate] [Часть 4] [менее комфортно] [Nate Хардисон] [Harvard University] [Это CS50.] [CS50.TV] Ладно, добро пожаловать в раздел. В разделе этой недели мы собираемся сделать несколько вещей. Мы идем к первому поставленной задачи резюме 2, которая является набором Цезаря и Виженера проблемы. И тогда мы будем погружаться в обзор Викторина 0 и потратить немного времени, резюмируя, что мы говорили о В каждом из лекций до сих пор, и мы также делаем несколько проблем от викторинах предыдущего года. Таким образом, вы, ребята, есть хороший способ подготовиться к этому. Для начала, я загрузил несколько хороших решений за предыдущий набор проблем, задач 2, в этом пространстве. Если вы, ребята, все попали на эту ссылку, и если вы щелкните свое имя и нажмите на моем первом пересмотре Вы увидите caesar.c, а это именно то, что я смотрю. Давайте поговорим об этом очень быстро. Это всего лишь пример решения. Это не обязательно идеальное решение. Есть много разных способов, чтобы написать это, но есть несколько вещей, которые я хотел бы подчеркнуть что я видел, как я сортировке, распространенные ошибки, которые я думаю, это решение делает очень хорошую работу в обращении. Первый по какой-то заголовок комментария в верхней части. В строках с 1 по 7 вы видите детали, что именно эта программа делает. Хорошая стандартная практика, когда вы пишете код C независимо от того, ваша программа содержится в одном файле или ли он разбит на несколько файлов, чтобы иметь какой-то ориентировочная комментарий на самом верху. Это тоже для людей, которые выходят и написать код в реальном мире. Это где положат информацию об авторском праве. Ниже приведены # включает в себя. По строке 16 есть эта # определить, что мы вернемся в только немного. И вот однажды функция начинается, как только основные старты, потому что эта программа была все содержащиеся в одной функцией Самое первое, что происходит, и это очень идиоматические и типичные программы C , которая принимает в аргументы командной строки-это то, что он сразу проверяет по количеству аргументов, агдс. Вот здесь мы видим, что эта программа ожидает 2 аргументы точно. Помните есть то, что первый аргумент, что это особенный это всегда имя программы, которая запускаемых, имя исполняемого файла. И так, что она делает это не позволяет пользователю запустить программу с большим или меньшим количеством аргументов. Поэтому мы хотим, чтобы проверить это сразу потому, что мы не можем фактически получить доступ к этой ARGV массива прямо здесь надежно пока мы не проверяли, насколько она велика. Одна из наиболее распространенных ошибок я видел, был бы люди сразу идут в и захват ARGV [1]. Они захватить ключевые аргументы из массива и не к я проверить на нем, а затем они сделают тест на агдс, а также следующий тест, ли не первым аргументом было действительно целое, в то же время, и это не работает, потому что в случае, если нет аргументов, Вы будете захватить аргумент, что там нет или попытку захватить один, что нет. Другая большая вещь, которую вы должны были заметить, что Вы всегда хотите, чтобы распечатать какой-то полезный сообщение об ошибке пользователю ориентироваться них. Я уверен, что вы все запуска программ, где вдруг он выходит из строя, и вы получите этот смешной маленький диалог, который всплывает и говорит: что-то ужасно загадочным и, возможно, дает вам код ошибки или что-то в этом роде что не имеет смысла. Это где вы действительно хотите, чтобы обеспечить что-то полезное и ориентированные на пользователя, так что, когда они запустить его они идут "О," лицо ладонью. "Я точно знаю, что делать. Я знаю, как это исправить". Если вы не печатать сообщение, то в итоге вы на самом деле оставляя пользователю пойти изучать исходный код чтобы выяснить, что пошло не так. Есть также несколько раз, что вы будете использовать различные коды ошибок. Здесь мы просто использовали один говорят, что произошла ошибка, произошла ошибка, произошла ошибка. Больше программ, часто программ, которые вызываются другими программами, вернется какой-то специальный код ошибки в различных сценариях программно сообщить, что вы бы иначе просто использовать хороший английский сообщение для. Cool. Как мы работаем вниз, вы видите, мы вытащить ключ из. Мы проверяем, чтобы увидеть, если ключ подходит. Мы получили сообщение от пользователя. Поэтому мы делаем это в этом цикле сделать в то время и это то, что мы покроем В немного, но оказывается, что если ввести контроль D когда вы получаете GetString строки на терминал что это на самом деле делает это он посылает специальный символ в программе. Это называется ELF или символ конца файла. И в этом случае, наша строка сообщения будет нулевым, так что это было не то, что мы проверяли в задачу поставил перед собой. Но, как мы продолжим, теперь, когда мы начали говорить об указателях и динамическое выделение памяти в куче, проверка на нуль всякий раз, когда у вас есть функция, которая может вернуть нулевое значение, как то, что вы хотите получить в привычку делать. Это здесь, прежде всего для иллюстрации. Но когда вы видите GetString в будущем, так от проблемы Set 4, Вы будете хотеть иметь это в виду. Опять же, это не является проблемой для задач 3 либо, так как мы не покрывается еще. И, наконец, мы добираемся до этой части, где мы перейдем к основной цикл шифрования, и есть несколько вещей, что здесь происходит. Во-первых, мы перебора всей строки сообщения. Здесь мы сохранили StrLen вызов в состояние, которые многие из вас указали не большой путь. Оказывается, в этом случае он также не велика, Отчасти потому, что мы, изменив содержимое самого сообщения внутри цикла, так что если у нас есть сообщение, что это 10 символов, Впервые мы начинаем цикл, что для StrLen вернется и что? 10. Но если мы затем изменить сообщение, сказать, что мы изменить свое 5-й символ, и кидаем в \ 0 символ в 5-й позиции, на последующей итерации StrLen (сообщение) не вернется, что он сделал самый первый раз, когда мы повторный, но вместо этого вернуть 5, потому что мы бросили в том, что нулевой терминатор, и длиной струны определяется положением, что \ 0. В этом случае, это отличный способ пойти, потому что мы изменив ее на место. Но вы заметили, что это на самом деле удивительно проста для шифрования если вы можете получить математику правильно. Все, что требуется, чтобы проверить, действительно ли письмо, что вы смотрите на это верхний или нижний регистр. Поэтому мы только должны проверить, что и у нас нет для проверки это альфа дело в том, что Если символ в верхнем регистре или, если это строчная то это определенно буквы, потому что у нас нет прописных и строчных знаков. Другая вещь, которую мы делаем, и это немного сложно- это мы изменили стандартный шифр Цезаря формуле , которые мы дали в спецификации поставленной задачи. В чем разница здесь в том, что мы вычитали В верхнем регистре капитала случай, и тогда мы добавочного капитала Резервное в конце. Я знаю, некоторые из вас сделали это в коде. Кто-нибудь из вас сделать это в ваших представлениях? Вы сделали это. Можете ли вы объяснить, что это делает, Sahb? Путем вычитания его, потому что вы сделали мод сразу после него, вы должны принять его, так что таким образом вы получите [кашель] позиция. А потом, добавив его позже вы перешла тот, который вы хотели. Да, именно так. Что Sahb сказал, что когда мы хотим добавить наше сообщение, и наши ключевые вместе , а затем мод, который, мод, который по NUM_LETTERS, если мы не будем масштабировать наши сообщения в соответствующие 0 до 25 Диапазон во-первых, Затем мы могли бы в конечном итоге получить действительно странный номер потому, что ценности, которые мы смотрим на то, когда мы смотрим на сообщение [я], Когда мы смотрим на го характера наших текстовых сообщений, это значение где-то в этом от 65 до 122 Диапазон на основе ASCII значения для верхнего регистра от А до Z строчные. И поэтому, когда мы мода это на 26 или NUM_LETTERS, так как это был наш # определить в правом верхнем здесь, что собирается дать нам значение, которое в 0 до 25 диапазон, и нам нужен способ, чтобы затем масштабировать, которые поддерживают и получить его в соответствующие ASCII диапазона. Самый простой способ сделать это, чтобы просто масштабировать все вниз в 0 до 25 Диапазон Начнем с того, , а затем переложить все обратно в конце. Еще одна распространенная ошибка, что я видел, люди бегут в том, что если вы на самом деле не сделать это прямо сейчас масштабирования и вы добавляете сообщение и ключевые вместе и добавить их, скажем, в символ переменной, проблема с этим это сообщение, так как [я] является относительно большое число, чтобы начать с- помните, что это по меньшей мере 65, если это символ верхнего регистра- если у вас есть большой ключ, скажем, что-то вроде 100, и вы добавляете эти 2 вместе в подписанных символ вы собираетесь получить переполнение. Вы собираетесь получить значение, которое превышает 127, , которая является крупнейшим значение, символ может хранить переменная. Опять же, почему вы хотите сделать такую ​​вещь с самого начала. Некоторые люди получили вокруг этого дела делать, если еще и тестирования чтобы увидеть, если она будет переполнение прежде чем сделать это, но таким образом получает от всего этого. И тогда в этом решении мы выводим всю строку в самом конце. Другие люди распечатать символ за один раз. Оба являются удивительными. На данный момент, вы, ребята, есть какие-либо вопросы, никаких комментариев по этому поводу? Что вам нравится, что вам не нравится? У меня был вопрос. Может быть, я пропустил его во время вашего объяснения, но как эта программа пропустить пространства для подключения ключа к длине текста? Это всего лишь шифр Цезаря. >> Эх, жаль, да. Да, мы видим, что. В шифр Цезаря мы обошли, потому что Мы только перевернул символов. Мы только повернуть их, если они были верхнем или нижнем регистре. Вы, ребята, чувствовал себя довольно хорошо по этому поводу? Вы можете скопировать этот дом, бери, сравнить его с тем, что вы, ребята написали. Определенно не стесняйтесь, присылайте вопросы на эту тему тоже. И опять же, понимаю, что цель здесь с вашей проблемой устанавливает Не чтобы вы, ребята, чтобы написать идеальный код для множества проблем. Это опыт. Да. Вернуться к делать во время цикла, если он равен нулю, так нулевого просто ничего не значит, они просто нажмите ввод? Null это специальное значение указателя, и мы используем нуль, когда мы хотим сказать, у нас есть указатель переменной, которая указывает на нет. И обычно это означает, что эта переменная, эта переменная сообщение пусто, и здесь, потому что мы используем CS50 особый тип строки, что CS50 тип строки? Видели ли вы, что это такое, когда Дэвид откинул капюшон в лекции? Это фанки-это указатель, верно? Хорошо, да. >> Это символ *. И так на самом деле мы могли бы заменить эту прямо здесь с символов сообщений *, и так GetString функция, если она не успешно получить строку от пользователя, он не может разобрать строку, и в одном случае, в котором он не может разобрать строку , если пользователь вводит символ конца файла, контрольная D, который не то, что вы обычно делаете, но если это произойдет, то функция вернет это значение, как способ сказать "Эй, я не получить строку". Что произойдет, если мы не ставим сообщение = NULL, которых является то, что мы не делали еще? Почему бы это было здесь проблема? Потому что я знаю, что мы немного поговорили в лекции об утечках памяти. Да, давайте сделаем это, и давайте посмотрим, что произойдет. Вопрос Василия Блаженного было то, что произойдет, если мы на самом деле не это сообщение = NULL тест? Давайте прокрутки вверх к вершине. Вы, ребята, можете прокомментировать это. На самом деле, я спасу его в пересмотре. Это будет 3-я редакция. Что вы должны сделать, чтобы запустить эту программу, вам придется нажать эту значок с изображением шестеренки здесь, и вы будете иметь, чтобы добавить аргументы к нему. Вы должны дать ему главный аргумент, так как мы хотим передать в аргументе командной строки. Здесь я собираюсь дать ему номер 3. Мне нравится 3. Теперь масштабирование обратно, запустив программу. Это работает, компиляция, строительство. Здесь мы идем. Он ожидает запроса. Если я ввожу что-то вроде привет-где прошло? О, моя программа занимает слишком много времени для запуска. Я был jawing слишком долго. Вот он идет. Сейчас я набираю в привет. Мы видим, что он шифрует надлежащим образом. Теперь, что произойдет, если мы делаем быструю GetString вернуть NULL? Помните, я говорил, что мы сделали это, нажав управления D в то же время. Я прокрутку вверх здесь. Мы будем запускать его снова. Строительство. Там он идет. Теперь, когда я ударил управления D Я получил эту строку, которая говорит opt/sandbox50/bin/run.sh, ошибки сегментации. Разве вы, ребята, видели, что раньше? [Студент] Почему нет->> Простите? [Студент] Почему нет дампа памяти в этом случае? Дамп это-вопрос почему нет дампа здесь? Вопрос в том, что там может быть, но дамп представляет собой файл , который получает хранится на жестком диске. В этом случае мы отключили дампы на бегу сервер, так что мы не были люди сегментам разломов и создание тонн дампы памяти. Но вы можете получить. Основные свалки такая штука, что часто можно отключить, и иногда вы делаете. Сегментация вина, чтобы ответить на ваш вопрос, Василий, говорит, что мы попытались получить доступ к указателю , которые не были установлены, чтобы указать на что-либо. Помните, Бинки в видео, когда Бинки пытается перейти к указателю, который не указывая на что-нибудь? В этом случае я думаю, технически указатель указывает на что-то. Это указывает на нулевой, который является технически 0, но, что называется в сегменте, который не доступен по вашей программе, так что вы получите ошибку сегментации потому что вы не доступа к памяти, который в действующий сегмент как сегмент куче или стеке сегмент или сегмент данных. Cool. Любые вопросы о Цезаря? Давайте двигаться дальше. Давайте посмотрим на пересмотр 2 очень быстро. Вот Виженера. Здесь, в Виженера Мы пройдем через это довольно быстро, потому что, опять же, Виженера и Цезаря очень похожи. Заголовок комментария раньше, # Определить это прежде избежать использования этих магических чисел. Приятно то, что мы хотим, чтобы перейти к различных алфавита или что-то вроде этого. Вместо того, чтобы идти вручную изменять все 26 в коде мы могли бы изменить это 27 или бросить его вниз если бы мы использовали различные алфавиты, разные языки. Опять же, у нас есть эта проверка количество аргументов, и действительно можно почти принять это в качестве шаблона. Практически каждый программе вы должны написать- если он принимает аргументы командной строки-некоторая последовательность линий , который читается как это в самом начале. Это одно из первых испытаний здравомыслие вы хотите сделать. Вот то, что мы делали, было мы убедились, что Ключевое слово действительно было, и это была вторая проверка, что мы и сделали. Обратите внимание еще раз, что мы отделились от этого ARGC и 2. Обратите внимание, что в этом случае одна вещь, которую мы должны были сделать, было, вместо использования, чтобы я, мы хотели проверить всю строку, и для того, чтобы делать, что вы на самом деле нужно идти по одному символу за строкой. Там нет хороший способ называть что-то на ней потому что даже, например, чтобы я вернет 0 если он не может разобрать целое, так что даже не работает. Опять же, хорошее сообщение о том, пользователю именно то, что произошло. Тогда здесь, опять же, мы также обрабатываем случай, когда Пользователь вводит в элемент управления D случайный характер. И тогда Шарлотта был вопрос ранее о том, как нам удастся пропустить пространства В нашем строка здесь. Это было отчасти похоже на то, что мы сделали с Myspace программы что мы сделали в разделе, и то, как это работает то, что мы отслеживали количество писем, которые мы видели. Когда мы шли через строку сообщения, как мы шли по одному символу, Мы отслеживали индекс как часть нашего цикла, и тогда мы также отслеживали количество букв, так что без специальных символов, без цифр, без пробелов что мы видели в отдельной переменной. А потом это решение изменяет ключ чтобы получить фактический ключ целое, и он делает это на лету, Право, прежде чем он потом идет для шифрования фактический характер сообщения. Есть некоторые решения, которые были совершенно отличными также что бы изменить вверх при проверке действия ключа. В дополнение к убедившись, что характер и ключевое слово был буквы Оказалось также, что в целое В 0 до 25 диапазон затем пропустить того, чтобы сделать это позже в этом цикле. Опять же, вы видите здесь, это действительно точно такой же код которые мы использовали в Цезарь в этой точке. Ты делаешь одно и то же, так что реальный трюк является выяснение того, как включить ключевое слово в целое. Одна вещь, которую мы сделали здесь, что несколько плотных это мы повторили эту фразу, я думаю, вы могли бы назвать его, 3 отдельных раза на 58 линий, 59 и 61. Может кто-нибудь объяснить, что именно эта фраза делает? Это доступе характер, как вы сказали. Да, это [неразборчиво] символов в ключевых слов, и поэтому это число букв видел, потому что вы только двигаясь вдоль Ключевое слово раз вы видели письмо, так что это будет эффективно пропустить пространств и тому подобное. Да, именно так. А потом, как только вы видели ключевое слово пустым вы просто мода, чтобы вы вернуться вокруг. Именно так. Это идеальное объяснение. Что Кевин сказал, что мы хотим, чтобы индекс в ключевое слово. Мы хотим, чтобы num_letters_seen характер, если хотите, Но если num_letters_seen превышает длину ключевого слова, Так мы вернемся в соответствующем диапазоне мы используем мод оператора эффективно обернуть вокруг. Например, как в краткосрочной, наше ключевое слово бекон, и это 5 букв. Но мы видели 6 букв в нашей текстом в этой точке и зашифрованные 6. Мы в конечном итоге доступ к num_letters_seen, , что на 6, мод длина ключевого слова, 5, и таким образом мы получим 1, и так, что мы будем делать это мы будем доступ к первому в характере нашего ключевого слова в этой точке. Ладно, любые вопросы по Виженера прежде чем двигаться дальше? Вы, ребята, чувствовал себя довольно хорошо по этому поводу? Круто, большое. Я хочу, чтобы убедиться, что вы, ребята получают шанс увидеть код что мы думаем, выглядит хорошо, и есть шанс узнать от него. Это будет последней мы будем использовать пробелы в настоящее время, и мы собираемся переходить сейчас, и я собираюсь пойти в cs50.net/lectures так что мы можем сделать немного обзора викторины. Лучший способ Я думаю, что начать делать тест обзор должен прийти к этой лекции странице, cs50.net/lectures, и под каждым из заголовков неделю, так что если я смотрю здесь на Неделе 0, Я вижу, что у нас есть список вопросов, которые мы обсуждали в неделю 0. Если любая из этих тем кажется незнакомой для вас вы определенно хотите, чтобы вернуться и прочесать лекции и, возможно, даже бегло лекции, смотреть их снова, если вы хотите чтобы чувствовать себя за то, что происходит с каждым из этих тем. Скажу дополнительно в этом году один из прохладных ресурсы у нас есть Именно эти шорты, которые мы создали, и если вы посмотрите на Неделе 0, у нас нет всех темам, но у нас есть довольно много из них, некоторые из них сложнее, поэтому наблюдать эти шорты снова это хороший способ, чтобы вы до скорости. В частности, я собираюсь поставить в разъем для 3 на дне, так как я сделал те. Но если вы боретесь с двоичной, биты, шестигранные, в таком же роде, двоичных является прекрасным местом для начала. ASCII еще один, это хорошо, чтобы просмотреть тоже. Вы даже можете следить за мной в 1,5 раза скорость, если я буду слишком медленным для вас. Так как это отзыв, не стесняйтесь делать это. Просто, чтобы начать очень быстро, мы собираемся пройти через пару таких викторины проблемы просто быстро оттока через них. Например, давайте посмотрим на проблемы 16, что у меня прямо здесь на доске. У нас это следующий расчет в двоичной, и мы хотим показать любую работу. Ладно, я собираюсь дать этому выстрел. Вы, ребята, должны следовать вместе с бумагой, и мы будем делать это очень быстро. Мы хотим, чтобы выполнить следующие расчеты в двоичной системе. У меня 00110010. И я собираюсь добавить к нему 00110010. Для гениев математики следуя вдоль дома, Это фактически умножением на 2. Давайте начнем. Мы собираемся следовать той же алгоритм того, что мы делаем когда мы добавляем десятичных чисел. Действительно Единственная разница в том, что мы петля назад вокруг когда у нас будет 1 + 1, а не только мы получим до 10. Если мы начнем с правой стороны, очень быстро, что первая цифра? [Студент] 0. >> [Nate H.] 0. Великий, вторая цифра? [Студент] 1. [Nate H.] Это 1? 1 + 1 есть? [Студент] 10. [Nate H.] Точно, так в чем же цифру, что я пишу прямо под 2 единицы складываются? [Студент] 1, 0 или 0, а затем провести 1. [Nate H.] 0 и нести 1, точно. Далее один вверх, Василий, вы вверх. Какой третий? >> [Василий] 1. [Nate H.] 1, совершенным. Кевин? [Кевин] 0. >> [Nate H.] 0, Шарлотта? [Charlotte] 0. >> [Nate H.] Да, и что мне делать? [Студент] 1. [Nate H.] И что мне делать? И тогда я несу 1. Perfect, Sahb? >> [Sahb] Теперь у вас есть 1. [Nate H.] И я делаю что-то здесь? [Sahb] Тогда для следующего у вас есть 1, потому что вы переносится на 1. [Nate H.] Великий, так что здесь мы можем закончить это. Cool. [Студент] Ли 0 + 0 = 0? 0 + 0 = 0. 1 + 1, как вы сказали, 10, или 1, 0, а. 10 является неправильным, потому что мне 10 означает число 10, и это причуда, как мы, представляя его, когда мы пишем это. Представим число 2, 1, 0, а число 10 немного отличается. Что отчасти хорошо о бинарных то, что есть на самом деле не так много случаях нужно учиться. Там в 0 + 0 = 0, 0 + 1 = 1, 1 + 1 = 0, а затем выполнить 1, а затем вы можете увидеть здесь, на третьем столбце справа у нас было это 1, 1, 1. А 1 + 1 + 1 1, и вы несете другую 1. Когда вы делаете двоичной Кроме того, довольно проста. Я сделаю еще пару этих здравомыслие проверить себя прежде чем вы идете, потому что это вероятно, то, что мы видим на викторину. Теперь давайте сделаем это в следующий также. Давайте сделаем проблемы 17. Мы собираемся преобразовать следующим двоичного числа в десятичное. У меня 10100111001. Помните, в двоичном видео, которое я сделал Я шел через пару примеров, и я показал, как все работает, когда вы делаете это в десятичной системе. Когда вы работаете в десятичное представление Я думаю, что мы На данный момент в нашей жизни так бегло говорит на это, что это довольно легко замазать механику того, как она действительно работает. Но чтобы сделать быстрое резюме, если у меня есть номер 137 В действительности это означает и опять же, это в десятичное представление- число 137 в десятичной означает, что у меня есть 1 х 100 + 3 х 10 + 7 х 1. Это все пребывания на экране. И потом, если вы посмотрите на эти цифры прямо здесь, 100, 10 и 1, вы видите, что они на самом деле все полномочия 10. У меня есть 10 ², 10 ¹, и от 10 до нуля. У нас подобного рода вещи в двоичной, исключением того, что наша база, как мы его называем, составляет 2 вместо 10. Эти 10s, что я написал здесь на дне, это 10 ², 10 ¹, 10 до нуля, 10, наша база, и показатель, 0, 1, или 2, вытекает из положения цифры в номере, что мы пишем. 1, если мы посмотрим на это, это 1, во 2-й позиции. 3 в 1-й позиции, а 7 находится в 0-й позиции. Вот как мы получим различные показатели ниже для нашей базы. После всего этого МЫ-на самом деле, вы знаете, что? Мы сделаем все, где же мой отменить кнопку идти? Там он идет. Я люблю эту вещь отменить. После этого я думаю, для меня по крайней мере Самый простой способ начать преобразования двоичного числа или шестнадцатеричное число, где база находится в 16 , а не 10 или 2, чтобы идти вперед и пишем баз и индексов для всех чисел в моей двоичного числа в верхней части. Если мы начнем слева направо снова, которая является своеобразной парадоксально, Я изменю Back To Black здесь, у нас есть 2 до 0-я позиция, а то у нас 2 ¹, 2 ², а затем от 2 до 3, от 2 до 4, 2 к 5, 6, 7, 8, 9 и 10. Эти цифры я выписал все показатели. Я только написал баз здесь в первые 3 только для пространства. На данный момент я собираюсь идти вперед и на самом деле я собираюсь стереть вещи, которые мы сделали в десятичной, если это нормально. Вы все понял. Те из вас, смотреть онлайн Я уверена, что сможет перемотать меня, если хотите. Переключение обратно на перо. Итак, что мы можем сделать, если вы, ребята, не полностью до скорости на свои силы 2, это абсолютно здорово. Это бывает. Я понимаю. Я когда-то на собеседование, где мне сказали, что я должен знать все степени числа 2 вверх через 2 до 30. Это была не работа у меня есть. В любом случае, вы, ребята, можете идти вперед и делать математику здесь, но с бинарными это действительно не имеет смысла, и также не имеет смысла с десятичной или шестнадцатеричной либо, делать математику, где у вас есть нули. Вы можете видеть, у меня 0 здесь, сюда 0, 0 здесь, 0 здесь, 0 здесь, 0 здесь. Почему это могло бы никакого смысла делать фактические математике Для расчета соответствующей мощности 2 на эту должность? Именно так, как сказала Шарлотта, это будет 0. Мог бы также сэкономить время, если вычисления степени числа 2 не является вашей сильной стороной. В этом случае нам нужно только вычислить его для 2 к 0, что-? [Студент] 1. [Nate H.] 1, 2 до 3, который является-? [Студент] 8. >> [Nate H.] 8. От 2 до 4? [Студент] 2. Мне очень жаль, 1. [Nate H.] 2 до 4, 16, точно. От 2 до 5, Кевин? >> 32. [Nate H.] 32, от 2 до 8? [Студент] 32 х 8, 256. [Nate H.] Perfect. И от 2 до 10? [Студент] 1024. [Nate H.] Да, 1024. После того как мы получили эти цифры мы можем подвести их все. И это, где это действительно важно сделать несколько вещей. Один из них идут медленно и проверить вашу работу. Вы можете сказать, что есть 1 в конце этого числа, так что я обязательно должны получить нечетное число, как мой результат, потому что все остальные собираются быть четными номерами учитывая, что это двоичное число. Другая вещь, которую нужно сделать, это если вы добраться до этой точки на испытательном и вы написали ее так далеко и вы работаете вне времени посмотрите на количество очков, что эта проблема стоит. Эта проблема, как вы можете видеть, если я сальто назад с моим ноутбуком действительно быстро- эта проблема стоит 2 очка, так что это не из того Вы должны идти через, если вы действительно мало времени. Но мы будем вернуться к iPad, и мы будем пройти через это очень быстро. Мне нравится делать небольшие числа сначала потому что я считаю, что проще. Мне нравится 32 и 8, потому что они идут вместе довольно легко, и мы получаем 50. 16 и 1 получает 17. Там мы получим 57, и тогда мы сможем сделать все остальное из этого, так что мы можем сделать, 57, 156. Пойдем. Человек, хорошо, давайте посмотрим. У нас было 57, 256 и 1024. На данный момент, я бы просто пройти. Я понятия не имею. Я четко нужно читать на этом. 7, 6, 4, Вы получаете 17. 1, 5, 5, 2, 13. Тогда мы получим 3, а затем мы получаем 1. 1337. Пасхальное яйцо, никто? Никто признать этот номер? Крис признается числа. Что это значит, Крис? [Chris] Leet. Leet, так что если вы посмотрите на это, похоже, Лит. Хакер вещи. Следите за такого рода вещи по среднесрочному или тест, а. Если вы видите такие вещи, и вы задаетесь вопросом "А" , что может на самом деле что-то значат. Я не знаю. Дэвид любит положить его дюйма Это хороший способ проверить его вменяемость. Как хорошо, я вижу, что происходит. Вот неделя 1 0/Week вещи. Если вернуться к нашим ноутбуком сейчас, уменьшить масштаб, и пару других вещей. Там в ASCII, которые мы делали много с проблемой набора. Это понятие капитала A. Что это на самом деле? Зная это десятичное число. 65 является то, что он отображается в таблице ASCII, и вот поэтому, как компьютер пишет он, и это, как мы уже сходит с фактической записи характер капитала и характер нижнего регистра В некоторых из этих решений и проблема набора, что вы делали. Несколько других вещей. У нас есть заявления, логические выражения, условия, циклы, переменные и потоков. Те, все, кажется, имеет смысл по большей части? Некоторые из этой терминологии немного напуганным в разы. Мне нравится думать, заявления, как по большей части то, что заканчивается точкой с запятой. Такие заявления, как х = 7, которая устанавливает переменную Предположительно называется х = 7. Предположительно х также тип, который может сохранить номер 7, так что Int или, возможно, теркой или короткая или символ, что-то вроде этого. Логическое выражение использует эти двойные равно и взрыва равна или не равна, меньше, больше, чем, меньше или равны, все в таком же роде. Условия то есть, если другое отчетности. Я помню, что вы не можете иметь другое без соответствующих если. Кроме того, вы не можете иметь еще, если без соответствующих если. Петли, напомним 3 вида петель мы были в вас молотком за последние пару секций и проблемы множества. Использование же время, когда вы получаете пользовательского ввода, использование в то время как петли, пока определенное условие истинно, , а затем с помощью этих циклов, если вам нужно знать, какие итерации цикла вы сейчас находитесь, как я думаю об этом. Или если вы делаете для каждого символа в строке я хочу что-то сделать, Для каждого элемента в массиве я хочу что-то сделать, чтобы этого элемента. Темы и события. Эти которые мы не так явно в C, но помните, это с нуля. Это понятие, имеющих различные сценарии. Это тоже это понятие трансляции события. Некоторые люди не использовали вещание в своих проектах на начальном этапе, который полностью прохладно, но эти 2 разные способы обработки этого больше проблем, параллелизм, который является, как вы получаете программ для выполнения или, казалось бы выполнить в то же время? Различные задачи, выполняемые в то время как другие задачи также работает. Это, как ваша операционная система, кажется, работает. Вот почему, хотя, например, У меня есть мой браузер работает, я также можете включить Spotify и играть песни. Это больше, концептуальные вещи, чтобы понять. Я хотел бы взглянуть на темы, коротко Если вы хотите узнать больше об этом. Давайте посмотрим, я считаю, что можно было бы Проблема об этом в одном из них. Опять же, я думаю, что темы и события, не то, что мы рассмотрим в C только потому, что это значительно труднее, чем в Scratch. Вы не должны беспокоиться о ней, но, безусловно, понимают концепции, понять, что происходит. Прежде чем двигаться дальше, любые вопросы на неделю 0 материалов? Каждый чувствовал себя довольно хорошо? Понимание переменных и что такое переменная? Двигаемся дальше. Неделя 1. Несколько вещей здесь, которые не были особенно покрытые В викторине отзыв обязательно, а также более концептуальные вещи, чтобы думать. Во-первых, это понятие о том, что исходный код, компиляторы и объектный код есть. Кто-нибудь? Василия. Является объектно-код я имею в виду исходного кода является то, что вы положили в лязг, и объектный код является то, что звоном ставит так, что ваш компьютер может прочитать программу. Именно так. Исходный код код C, что вы на самом деле напечатать. Код объекта является то, что вы выходите из лязг. Это 0 и 1, что в двоичном формате. Тогда что же происходит, когда у вас есть несколько объектных файлов, сказать, что вы собираете проект или программа, которая использует несколько файлов исходного кода, которые по соглашению предоставляется. с расширением файла. Вот почему у нас есть caesar.c, vigenère.c. Если вы пишете Java программы вы даете им расширение. Java. Python программы имеют расширение. Ру часто. Если у вас есть несколько. С файлами, вы их компиляции. Clang выплевывает все это двоичный мусор. Потом, потому что вы только хотите 1 программа у вас есть компоновщик ссылке все эти объектные файлы вместе в 1 исполняемый файл. Это также то, что происходит, когда вы используете CS50 библиотеке, например. Библиотека CS50 является и то. Ч. файл заголовка что вы читаете, что # includecs50.h. И тогда это также специальный файл библиотеки двоичных , которое было составлено это 0 и 1, и что-л флаг, поэтому, если мы вернемся к нашим пространствам и мы смотрим очень быстро на то, что здесь происходит, когда мы смотрим на нашу команду лязг, то, что мы получили, это наш исходный код файла прямо здесь. Это куча флагов компилятора. И тогда в самом конце, эти-л флаги ссылку в фактические двоичные файлы на эти 2 библиотеки, CS50 библиотеки, а затем математическую библиотеку. Понимание каждого типа файлов цели " В процессе компиляции является то, что вы хотите, чтобы иметь возможность дать хотя бы подробный обзор. Исходный код приходит дюйма Код объекта выходит. Файлы Код объекта связать вместе, и вы получите красивый, исполняемый файл. Cool. Это также, где вы можете получить ошибки в нескольких точках В процессе компиляции. Это когда, например, если вы возьмете эту связь флаг, CS50 флаг, и вы опустите его в пространстве или когда вы работаете ваш код, это где вы получите ошибку в стадии компоновки, и компоновщик будет сказать: "Эй, вы называется функцией GetString , который в CS50 библиотеки ». "Вы сказали мне, что в CS50 библиотека, и я не могу найти код для него." Вот где вы должны связать его, и это отдельная от ошибки компилятора, потому что компилятор смотрит на синтаксис и такого рода вещи. Это хорошо, чтобы знать, что происходит, когда. Другие вещи, чтобы знать. Я бы сказал, вы определенно хотите, чтобы взглянуть на коротком на приведение сделано Иордании чтобы понять, что целыми находится под капотом, какие символы находятся под капотом. Когда мы говорим о ASCII, и мы на самом деле смотрим на таблицу ASCII, что это делает дает нам под капотом взгляд на то, как компьютер на самом деле представляет капитала и цифры 7 и запятая и знак вопроса. Компьютер также имеет специальные способы представления число 7, как число. Это имеет особое способ представления числа 7 как число с плавающей точкой, и тех, кто очень разные. Приведение то, как вы говорите компьютер "Эй, я хочу вам конвертировать от одного представления к другому представлению ". Почему бы нам не посмотреть на это. Я хотел бы также взглянуть на коротких по библиотекам и короткий на компиляторы. Эти разговоры о процессе компиляции, что библиотека, и перейти на некоторые из этих вопросов, которые вы могли бы спросил. Вопросы по неделя 1 материал? Есть ли темы здесь, что в уныние вы хотите, чтобы покрыть? Я стараюсь, чтобы продуть большинство из них ранее тем, чтобы мы могли добраться до указателей и сделать немного рекурсии. Мысли? Все, что для покрытия? Время для некоторых шоколад может быть? Вы, ребята, работаете через него. Я буду держать потягивая свой кофе. 2-я неделя. Хорошее слово, хороший вызов. В 2-я неделя, мы говорили немного больше о функциях. В первые несколько комплектов проблемы мы действительно не писать никаких функций на всех кроме котором функция? [Студент] Main. >> Главное, точно. И так мы видели разные костюмы, что основной носит. Там в одной, в которой он не принимает аргументов, и мы просто скажем, пустоту в круглых скобках, и тогда есть другой, где мы хотим принимать аргументы командной строки, и, как мы видели, что там у вас есть Int ARGC и ARGV массив строк или теперь, когда мы на самом деле подвергается строки, чтобы быть символ *, что мы собираемся, чтобы начать писать его как символ * ARGV, а затем скобки. В задаче Set 3, вы, ребята, видели кучу функций, и вы реализовали кучу функций, рисовать, смотреть вверх, схватка. Прототипы были написаны там для вас. То, что я хотел рассказать о здесь с функциями очень быстро является то, что существует 3 частей к ним всякий раз, когда вы пишете функцию. Вы должны указать тип возвращаемого значения функции. Вы должны указать имя функции, а затем вы должны указать Список аргументов или списка параметров. Например, если бы я написать функцию, чтобы подвести итоги кучу целых чисел , а затем вернуться ко мне сумму, что было бы моего возвращения типа если бы я хотел, чтобы подвести целых чисел, а затем вернуть сумму? Тогда имя функции. Если я пойду вперед и написать в зеленый, эта часть возвращаемого типа. Эта часть названия. А потом в скобках Здесь я даю аргументы, Часто сокращенно аргументы, которые иногда называются параметрами для параметров. И если у вас есть, вы просто указываете один. Если у вас несколько вы разделите каждый с запятой. И для каждого аргумента, вы даете ему 2 вещи, которые, Кевин? [Кевин] Вы должны дать типа, а затем имя. И то имя, и имя это имя, которое вы собираетесь использовать ссылаться на этот аргумент в пределах суммы функций, в пределах функции, которые вы в настоящее время написания. Вы не должны, например, если я собираюсь подводить итоги, скажем, массив целых чисел-Мы делаем Int массива, и я дам себе некоторые фигурные скобки там- Затем, когда я передать массив в сумме функций Я передаю его в первую позицию списка аргументов. Но массив, который я прохожу в не должна иметь название обр. Обр будет, как я ссылаться на этот аргумент в теле функции. Другое дело, что мы должны принять во внимание, и это немного отличается от функции, но я думаю, это важный момент, является то, что в C, когда я пишу эту функцию, как Откуда я знаю, сколько элементов в этом массиве? Это своего рода вопрос с подвохом. Мы говорили об этом немного в разделе прошлой неделе. Как мне узнать количество элементов внутри массива в C? Есть ли способ? Оказывается, что нет никакого способа узнать. Вы должны передать его в отдельности. Существует трюк, который вы можете сделать если вы находитесь в той же функцией, в которой массив был объявлен, и вы работаете со стеком массива. Но это работает, только если вы находитесь в той же функции. После того как вы передать массив в другую функцию или если вы объявили массив а вы ставите этот массив в куче, вы использовали таНос  и в таком же роде, то все ставки выключены. Тогда вам на самом деле нужно обойти специальный аргумент или другой параметр говорю вам, как большой массив. В этом случае, я хотел бы использовать запятую-Простите, это будет от экрана здесь- и я бы перейти в другой аргумент  и называть его Int длина по длине. Одна вещь, которая может прийти на тест просит вас написать или осуществлять определенную функцию называют что-то. Если мы не дадим вам прототип, так что это все дело здесь, весь этот бардак называется объявление функции или прототип функции, это одна из первых вещей, которые вы хотите, чтобы прибить, если она не дано Вам сразу на викторину. Другой трюк я узнал, что сказать, что мы действительно дают вам прототип функции, и мы говорим: "Эй, ты должен писать". Внутри фигурных скобках, что у вас на тест Если вы заметите, что есть возвращаемого типа, и вы заметите, что тип возвращаемого это нечто иное, чем пустота, которая означает, что функция не возвращает ничего, то, что вы определенно хотите сделать, это написать своего рода возвращение заявления в самом конце функции. Возвращение, и в этом случае, мы будем ставить пустую, потому что мы хотим, чтобы заполнить пустые. Но это получает вас думать в правильном направлении, о том, как я буду подходить к этой проблеме? И это напоминает вам, что вы будете иметь, чтобы вернуть значение вызывающей функции. Да. >> [Студент] ли стиль применяется, когда мы пишем код на викторину? Такие, как отступ и в таком же роде? >> [Студент] Да. Нет, не так много. Я думаю, что много-это то, что мы будем уточнить на викторину в день, но, как правило беспокоясь о # включает в себя и в таком же роде, это вид снаружи. [Студент] Вам нужно комментировать свои рукописные код? Вам нужно комментировать свои рукописные код? Комментируя это всегда хорошо, если вы беспокоитесь о частичной кредитной или вы хотите сообщить о своем намерении грейдер. Но я, опять же, будет уточнить на викторину себя и в тот день, викторины, Но я не верю, что вы будете обязаны писать комментарии, нет. Как правило, нет, но это определенно та вещь, где Вы можете сообщить ваши намерения, как "Эй, это куда я иду с ним". И иногда это может помочь с частичным кредита. Cool. Василия. [Василий] В чем разница между объявлении, скажем, внутр язык в аргументах или параметрах по сравнению с объявлением переменной внутри функции? Wow, кофе пошел в дыхательное горло. [Василий] Как которое вещей, которые мы хотим поместить в аргументах. Да, это большой вопрос. Как вы выбираете то, что вещи, которые вы хотите поместить в рассуждениях против того, что вещи, которые вы должны делать внутри функции? В этом случае мы включили оба этих качестве аргументов потому что они то, что тот, кто собирается использовать функцию суммы Необходимо указать эти вещи. Сумма функция, о которой мы говорили, не имеет возможности узнать, насколько большой массив она получает от своего абонента или тот, кто использует сумму функцию. Он не имеет возможности узнать, как большой, что массив. Поэтому мы пройти в этом длина прямо здесь в качестве аргумента потому, что это то, что мы в основном говорят вызывающей функции, кто собирается использовать функцию суммы, "Эй, вы не только должны дать нам массив целых чисел, вы также должны сказать нам, как большой массив, который Вы дали нам ". [Василий] Те, оба будут аргументы командной строки? Нет, это фактические аргументы, которые вы передаете в функцию. Позвольте мне сделать новую страницу здесь. [Василий] Как имя будет проходить- [Nate H.] Если у меня есть Int основных (недействительными), и я собираюсь поставить в моем возвращении 0 вниз здесь на дне, и сказать, что я хочу, чтобы вызвать функцию суммы. Я хочу сказать, Int х = SUM (); Чтобы использовать функцию суммы я должен пройти как в массиве, что я хочу, чтобы подвести итог и длина массива, так что это, где предполагая, что я был массив целых чисел, сказать, что я Int numbaz [] = 1, 2, 3, вид использования, который изрубил синтаксис там же, то, что я хотел бы сделать это в сумме я хотел бы перейти в как numbaz и № 3 рассказать сумму функцию "Хорошо, вот массив, который я хочу, чтобы вы подвести". "Вот его размера." Имеет ли это смысл? Я ответил на ваш вопрос? Во многом это происходит параллельная, что мы делаем с основными когда у нас есть аргументы командной строки. Такая программа, как шифр Цезаря, например, что необходимо аргументы командной строки не смог бы ничего сделать. Не знаю, как для шифрования, если Вы не сказать ему, что ключ к использованию или если вы не сказали ему, что строка, которую вы хотели зашифровать. Подсказка для ввода, это где у нас есть 2 различных механизмов для принятия входе в от пользователя, для принятия информации от пользователя. Для задач 1 мы видели, это GetInt, GetString, GetFloat пути наведения для ввода, и это называется использованием стандартного входного потока. Это немного отличается. Это то, что вы можете сделать за один раз, в отличие от когда вы запускаете программу, при запуске программа работает. Аргументы командной строки всех указанных при запуске программы, запущенной. Мы смешивания двух из них. Когда мы используем аргументы функции, это так же, как аргументы командной строки к основному. Это при вызове функции вы должны сказать ему, что именно ему нужно для того, чтобы выполнять свои задачи. Еще одна хорошая вещь, чтобы смотреть на, и я дам вам посмотреть на это в свободное время, и она была покрыта в викторине, было это понятие за рамки и локальных переменных в сравнении с глобальными переменными. У обратить внимание на это. Теперь, когда мы становимся на эту другие вещи, 3 недели мы начали говорить о поиска и сортировки. Поиск и сортировка, по крайней мере, CS50, очень введением в некоторые из наиболее теоретическая часть компьютерной науки. Проблема поиска, задачи сортировки большой, канонической проблемы. Как вы находите определенного числа в массиве миллиардов чисел? Как найти конкретное имя в телефонной книге , которая хранится на вашем ноутбуке? И поэтому мы введем это понятие асимптотического времени работы действительно количественно, как долго, как трудно эти проблемы являются, Как долго они принимают решения. В, я считаю, 2011 викторине есть проблема, что я думаю достоинств покрытие очень быстро, что это, проблема 12. О нет, это Omega. Здесь мы говорим о максимально возможной время выполнения для конкретного алгоритма, а затем минимально возможный время выполнения. Это Omega и O в действительности являются лишь ярлыки. Они обозначений клавиш для говоря как быстро в лучшем случае будет наш алгоритм выполнения, и как медленно в худшем случае будет наш алгоритм бежать? Давайте сделаем несколько из них, и они были также покрыты в краткосрочной об асимптотических обозначений, которые я очень рекомендую. Джексон сделал очень хорошую работу. С бинарный поиск, мы говорим о бинарного поиска как алгоритм, и мы обычно говорим об этом с точки зрения его большой O. Что такое Big O? Что такое минимально возможный время выполнения двоичного поиска? [Студент] N ²? Закрыть, я думаю, похоже на то. Это намного быстрее, чем это. [Студент] Двоичные? >> Да, бинарный поиск. [Студент] Это журнал с. Вход п, так что же войти п имеете в виду? Это половины этого каждой итерации. Точно, так и в минимально возможный случай, говорят, что если у вас есть отсортированный массив миллион целых чисел и номер, который вы ищете это либо первый элемент массива или самый последний элемент массива. Помните, что алгоритм двоичного поиска работы, глядя на средний элемент, видя если это матч, который вы ищете. Если это так, то большой, вы его нашли. В лучшем случае, как быстро делает выполнения двоичного поиска? [Студенты] 1. 1, это постоянное время, большая O 1. Да. [Студент] У меня есть вопрос. Когда вы говорите войти п, вы имеете в виду по отношению к основанию 2, правильно? Да, так вот другая вещь. Мы говорим, § п, и я думаю, когда я учился в средней школе Я всегда считал, что журнал был основанием 10. Да, да так, войти основанию 2 обычно это то, что мы используем. Опять же, возвращаясь к бинарный поиск, если вы ищете либо элемента в самом конце или элемент в самом начале, потому что вы начинаете в середине, и тогда вы сбрасываете зависимости от того, половина не отвечают критериям, что вы ищете, и вы переходите к следующему половины и следующую половину и следующая половина. Если я ищу наибольший элемент в миллион целых чисел Я собираюсь вдвое сократить его на самый журнала 1 миллиона раз прежде чем я, наконец, протестировать и увидеть, что элемент я ищу находится в большой или в высшей индекс массива, и что будет журнал п, войти в 1 млн. раз. Bubble рода. Парни, вы помните алгоритм пузырьковой сортировки? Кевин, вы можете дать мне быстрое повторение того, что произошло в алгоритм сортировки пузырь? [Кевин] В основном это проходит через все, что в списке. Он смотрит на первых двух. Если первый больше, чем второй его свопы них. Затем он сравнивает второй и третьей, то же самое, свопы, Третий и четвертый, на всем пути вниз. Большие номера будут следовать до конца. И после однако многие петли вы сделали. Точно, так что Кевин сказал, что мы будем наблюдать большие числа Пузырь до конца массива. Например, вы возражаете идти с нами через эту Например, если это наш массив? [Кевин] Вы будете принимать 2 и 3. 3 больше, чем 2, так что вы поменять их местами. [Nate H.] Право, таким образом, мы переставляем их, и таким образом мы получаем 2, 3, 6, 4 и 9. [Кевин] Тогда вы сравните 3 и 6. 3 меньше, чем 6, так что вы оставите их, и 6 и 4, нужно поменять их местами потому что 4 меньше, чем 6. [Nate H.] Право, так что я получаю 2, 3, 4, 6, 9. [Кевин] и 9 больше, чем 6, так что вы оставите его. И вы вернулись бы через это снова. [Nate H.] Могу ли я сделать в этот момент? >> [Кевин] Нет И почему я не делал в этот момент? Потому что он похож на моего массив отсортирован. Я смотрю на это. [Кевин] пройти через это снова и убедитесь, что нет больше свопы прежде чем вы сможете полностью остановить. Именно, поэтому нужно продолжать идти до конца и убедитесь, что нет свопов что вы можете сделать в этой точке. Это было действительно просто повезло, как вы сказали, что мы закончили только того, чтобы сделать 1 проход, и мы сортируются. Но для этого, в общем случае, мы на самом деле должны делать это снова и снова. И в самом деле, это был пример лучшем случае, как мы видели в проблеме. Мы видели, что наилучшее дело N. Мы пошли через массив 1 раз. Что это худший возможный случай для этого алгоритма? [Кевин] N ². И что это похоже? Что бы массив похоже, что бы взять п ² время? [Кевин] [неразборчиво] отсортирован. Именно, поэтому, если у меня была масса 9, 7, 6, 5, 2, Сначала 9 будет пузырь на всем пути вверх. После 1 итерации мы бы 7, 6, 5, 2, 9. Тогда 7 будет пузыриться, 6, 5, 2, 7, 9, и так далее, и так далее. Мы должны пройти через весь массив п раз, и вы можете получить немного более точным, чем это потому что как только мы переехали в 9 все, вплоть до последней в его возможном положении Мы знаем, что мы никогда не должны сравниваться с этим элементом снова. Как только мы начинаем пузырится 7 до Мы знаем, что мы можем остановить только 7 является правом до 9 поскольку мы уже по сравнению с 9 до нее. Если вы делаете это в умный способ это не по-настоящему, я думаю, что много времени. Вы не собираетесь, чтобы сравнить все возможные [неразборчиво] комбинациях каждый раз, когда вы проходите через каждую итерацию. Но все же, когда мы говорим об этом верхняя граница мы говорим, что Вы смотрите на п ² сравнения весь путь до конца. Давайте вернемся, и так как мы начинаем получать немного меньше по времени Я бы сказал, вы должны обязательно пройти остальной части этой таблицы, заполнить все это. Подумайте о примерах. Подумайте о конкретных примерах. Это действительно удобно и полезно сделать. Нарисуйте его. Это своего рода таблицу, как вы идете через в области компьютерных наук Вы должны действительно начать знаем, что эти наизусть. Эти виды вопросов, которые вы получите в интервью. Это разные вещи, которые хорошо бы знать, и думать о тех крайних случаях, действительно, выясняя, как подумать о зная, что для пузырьковой сортировки в самый неподходящий массива сортировать тем, что это тот, который в обратном порядке. Указатели. Давайте немного поговорим об указателях. В последние несколько минут здесь мы имеем Я знаю, это то, что наряду с файлового ввода / вывода, что является относительно новым. Когда мы говорим о указателей по этой причине мы хотим говорить об указателях Потому что, один, когда мы работаем в C мы действительно на довольно низком уровне по сравнению с большинством современных языков программирования. Мы на самом деле способен манипулировать переменными в памяти, выяснить, где они на самом деле находятся в пределах нашей памяти. После того как вы пошли на взятие операционная система классов, которые вы увидите, что это, опять же, своего рода абстракцией. Это не на самом деле. У нас есть виртуальная память, что скрывает эти детали от нас. Но сейчас можно предположить, что если у вас есть программа, Например, когда вы начать показ шифр Цезаря программу Я переключиться обратно на мой IPad действительно быстро- , что в самом начале вашей программы, если у вас, скажем, 4 гигабайтами оперативной памяти на вашем ноутбуке, Вы получите отложите этот кусок, и мы называем это RAM. И он начинается в место, где мы собираемся называть 0, и заканчивается в месте, которое мы будем называть 4 гигабайт. Я действительно не могу писать. Человек, который взломал. Когда ваша программа выполняет Операционная система вырезает оперативной памяти, и он определяет различные сегменты для различных частей вашей программы живем Здесь, внизу этой области, это своего рода ничейной земле. Когда вы идете немного дальше здесь у вас есть на самом деле место, где Код для жизни программы. Это фактически двоичный код, исполняемый файл, что на самом деле загружается в память когда вы запустите программу, и она живет в сегменте кода. И, как ваша программа выполняется процессором смотрит на этот сегмент кода чтобы выяснить, что является следующая инструкция? Какая следующая строка кода мне нужно выполнить? Там также сегмент данных, и это, где эти константы строк получить хранится, что вы используете. А потом дальше вверх там это место называется кучей. Мы доступа к памяти там с помощью таНос, , а затем на самом верху вашей программы есть стек, а вот где мы играли на протяжении большей части начала. Это не в масштабе или ничего. Много это очень зависит от машины, зависит от операционной системы, но это относительно, как все получают разбит вверх. Когда вы запустите программу, и вы объявите переменную х Я собираюсь сделать еще одну коробку вниз, и это будет оперативной памяти. И я собираюсь посмотреть. Мы будем рисовать зубчатые линии, чтобы указать, это всего лишь небольшая часть оперативной памяти и не все о нем, как мы рисуем на самом верху. Если я заявляю, целая переменная называется х, то, что я на самом деле получить отображение , которые хранятся в таблице символов моей программы , который соединяет имя х в эту область памяти, которую я нарисовала прямо здесь, между вертикальными полосами. Если у меня есть строка кода, в моей программе, которая говорит х = 7 Процессор знает "О, хорошо, я знаю, что х жизнь в этом месте в памяти." "Я собираюсь пойти дальше и написать 7 существует". Как он знает, что расположение это в памяти? Хорошо, что все это делается во время компиляции. Компилятор заботится о распределении где каждая из переменных собираетесь пойти и создание специальных отображение или, скорее, соединение точек между символом и куда он идет, имя переменной и где он будет жить в памяти. Но оказывается, что мы действительно можем получить к нему доступ в наших программах. Это становится важным, когда мы начинаем говорить о некоторых структур данных, которая является концепция, что мы собираемся ввести позже. Но сейчас, как вы можете знать, что я могу создать указатель на это место, х. Например, я могу создать переменную-указатель. Когда мы создаем указатель переменной мы используем обозначение звезды. В этом случае, это говорит, что я собираюсь создать указатель на Int. Это типа как и любой другой. Мы даем ему переменной, как у, , а затем положить его равным адрес, по адресу. В этом случае, мы можем установить у указывают на х принимая адресу х, которые мы делаем с этим амперсанд, , а затем положить у указывают на это. То, что это по существу делает это, если мы посмотрим на нашу RAM это создает отдельную переменную. Это будет называть его у, и когда эта строка кода выполняется это на самом деле собирается создать небольшой указатель, который мы обычно используют, как стрела, и он устанавливает у указывают на х. Да. [Студент] Если х это уже указатель, вы бы просто сделать Int * у = х, вместо того, амперсанд? Да. Если х это уже указатель, то вы можете установить 2 указателей равны друг другу, В этом случае у не будет указывать на х, но это будет указывать на любой х указывает. К сожалению, мы вне времени. Что я могу сказать на данный момент, мы можем поговорить об этом в автономном режиме, Но я бы сказал, начать работать через эту проблему, № 14. Вы можете увидеть там уже немного заполнен для вас здесь. Вы можете видеть, что, когда мы заявляем, 2 указателей, Int * х * и у, и заметим, что указывает * Рядом с переменной было то, что было сделано в прошлом году. Оказывается, что это похоже на то, что мы делаем в этом году. Это не имеет значения, где вы пишете *, когда вы объявлении указателя. Но мы написали * рядом с типом потому что это делает его очень ясно, что вы объявлении переменной-указателя. Вы можете видеть, что объявление 2 указателя дает нам 2 коробки. Вот когда мы устанавливаем х равно таНос что это говорит в отмене памяти в куче. Этот маленький ящик прямо здесь, этот круг, находится в кучу. X указывает на это. Заметим, что у еще не указывая ни к чему. Чтобы получить память для хранения числа 42 в х мы будем использовать то, что обозначение? [Студент] * х = 42. Точно, * х = 42. Это означает, следуйте за стрелкой и бросить 42 в там. Здесь, где мы устанавливаем у и х мы у указывая на х. Опять же, это просто нравится то, что Кевин сказал, где мы устанавливаем у равно х. Y не указывает на х. Скорее, это указывает на то, что X указывает на, а также. И, наконец, в последнем окне есть 2 возможных вещей, которые мы могли бы сделать. Один из них мы могли бы сказать * х = 13. Другое дело, мы могли бы сказать, Алекс, вы знаете, что мы могли бы сделать здесь? Можно сказать, * х = 13 или- [Студент] Можно сказать, что Int. [Nate H.] Если это были причислены к Int переменная, которую мы могли бы сделать это. Мы могли бы также сказать, у * = 13, потому что они оба указывают на то же место, , чтобы мы могли использовать либо переменную туда добраться. Да. >> [Студент] Что бы это выглядело, если мы просто скажем Int х 13? Это было бы объявить новую переменную х, которая не будет работать. Мы должны были бы столкновения, потому что мы объявили х, чтобы быть указателем здесь. [Студент] Если мы просто должны были это заявление само по себе то, что это будет выглядеть с точки зрения круга? Если бы мы имели х = 13, то мы должны были бы коробку, и вместо того, чтобы стрелка выходя из окна мы сделать это, как только 13. [Студент] в поле. Хорошо. Спасибо за внимание и удачи на Quiz 0. [CS50.TV]