[Powered by Google Translate] [Прохождение - Проблема Set 2] [Zamyla Chan - Гарвардский университет] [Это CS50. CS50.TV] Хорошо. Привет всем, и добро пожаловать Пошаговое руководство 2. Во-первых, я хочу поздравить вас с отделкой PSET 1. Я знаю, что это могло бы быть немного жестким для некоторых из вас, могла бы быть ваша первая компьютерная программа, что вы написали, но помните, что в конце этого, когда вы оглядываетесь назад в конце семестра, Вы будете выглядеть на PSET 1, и вы скажете: "Эй, я мог бы сделать, что через 5 минут". Так знать и верить, что в конце этого вы обязательно найдете PSET 1 довольно проста. Но сейчас это огромное достижение, и поздравления для получения сделал. Теперь, также быстро записку, прежде чем мы перейдем к мясу руководства. Я просто хочу сделать небольшое замечание, что я иногда не хватает времени в пошаговых руководств, чтобы пройти через каждый способ сделать поставленной задачи и довольно просто, может быть сосредоточены на 1 или 2 вида реализации, способов, которыми вы могли бы сделать это. Но это не означает, что вы запретили делать это другим способом. Есть часто, как и компьютерные науки, многочисленные способы ведения дел, и так определенно не стесняйтесь использовать различные типы решений, чем я, возможно, представила. [PSET 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. Секция вопросы - 1. Цезарь - 2. Vigenere] Хорошо. Таким образом, проблема установить 2: Crypto это весело один. Опять же, с каждым PSET вы начнете с разделом вопросы которая будет проводиться в секции с вашим назначенным обучения человек. Мы не собираемся пройти через это за прохождение игры, но они определенно помогут вам завершить PSET. Таким образом, первая часть проблемы набора Цезаря. И так в Caesar кто-то пройдет мимо вас ключ с целым, и вы будете шифровать строку текста, который они дают вам и вернуть их обратно зашифрованные вещи. Если кто смотрел Рождественская история, есть пример того, что есть. Тогда вторая часть проблемы набора Vigenere, , который является более продвинутой технике шифрования. И таким образом мы собираемся, чтобы зашифровать кусок текста, исключением, а не только с одним целым, мы на самом деле собираемся кодировать с ключевым словом, которое пользователь будет предоставлять нам. Итак, первый инструмент в панели инструментов сегодня фактически будет обновление оборудования. На доске обсуждений мы увидим что-то вроде: «Почему это не работает?" "Почему не Прислать 50 рабочих?" и часто решение на самом деле просто обновить ваше устройство. И так, если вы просто запустить в окне терминала в ваш прибор Суда ням-у - это флаг говоря, да, все обновления - обновления, , то ваш прибор будет обновляться, если это будет необходимо. И это не повредит, если вы уже находитесь на самой последней версии прибора. Тогда это будет просто сказать нет новых обновлений, и вы можете продолжать работать вместе. Но это хорошо, чтобы выполнять даже каждый раз, когда вы открываете прибор потому что мы еще очень многое - Иногда, если мы придем на ошибку - фиксация ее в прибор. Поэтому убедитесь, что у вас самая последняя версия прибора и запустить обновление там. Хорошо. Таким образом, поскольку мы имеем дело с письмами и изменения, шифрование вещи, мы собираемся действительно хотим стать лучшими друзьями с нашими ASCII графике. Есть многочисленные из них в Интернете, если вы найдете. Может быть, даже создать свой собственный. В принципе, с каждой буквой, и каждый номер и каждую характер существует ряд связанных с ними, и так приятно видеть их ASCII значения наряду с фактическими письмо. Это, безусловно, поможет вам в задаче множество. Одна вещь, которая действительно помогла мне в этой проблеме набор был на самом деле распечатать его, и, как я переживала, я бы рисовать на нем, пишут: «Если это должно идти туда, то ...» Вид рисовать на нем и пометить его, становятся лучшими друзьями с вашим ASCII таблицы. Тогда у нас есть несколько других инструментов, имеющихся в нашем распоряжении. На этот раз вместо того, чтобы фактически предлагая пользователю для всех своих входных Мы собираемся сделать комбинацию. Мы собираемся, чтобы подтолкнуть их для некоторых ввода, но мы также собираемся просто использовать аргументы командной строки. Поэтому, когда они работают свои программы, как правило, скажете вы. / Привет, например, если ваша программа была hello.c. Но на этот раз вместо того, чтобы просто говорю, что они могут поставить слова, аргументы впоследствии. И поэтому мы собираемся использовать то, что они проходят в к нам, как их вклад, а также, так что выходит за рамки просто запросом целое, но также с помощью аргументов командной строки. А потом мы пойдем в массивы и строки, которые мы будем использовать много, как хорошо. Вот только один пример из 1 мини-ASCII графике. Как я уже сказал, каждая буква соответствует числу, и таким образом ознакомиться с этим. Это пригодится. А потом, когда мы начинаем делать некоторые ASCIIMath дело с числами - сложение, вычитание них - то определенно хорошо, чтобы обратиться к этой таблице. Итак, вот пример шифр Цезаря - то, что вы, возможно, играл с. Это всего лишь колеса. По существу, есть внешний алфавит, а затем есть внутренний алфавит. Так что прямо вот пример шифра Цезаря, но с ключом 0. По сути, совмещен с A, B совмещена с B, вплоть до Z. Но то, что мы хотим ключ 3, например. Тогда мы бы повернуть внутреннее колесо, так что теперь совпадет с D, и т.д. И это, по существу, что мы собираемся делать. Мы не имеем колесо, но то, что мы собираемся сделать, это наша программа вид сдвинуть алфавит вместе с нами определенного количества номеров. Итак, как я уже говорил, мы будем иметь дело с аргументами командной строки а также получить целое число. Таким образом, что пользователь будет работать ваша программа Цезаря, говоря. / Цезарь , а затем ввести номер после этого. И это число представляет собой ключ, сдвиг, сколько раз вы будете вращения внутреннего колеса вашего шифр Цезаря. И вот вы видите здесь пример. Если мы вошли в буквы от А до L в нашей шифр Цезаря, то это будет вход D через O потому что каждая буква перешла в 3 раза, так же, как на примере колеса, которое я показал вам. Итак, если вы ввели, например, это CS50! Затем он также переместить все письма. И это главное в обоих Цезаря и Виженера является то, что мы собираемся пропустить любой не-букв. Таким образом, любые пробелы, символы и т.д., цифры, мы собираемся, чтобы держать их то же самое. Мы только собираемся перенести буквы в этом случае. Итак, как вы видите на колесе, у нас есть только буквы доступны для нас, таким образом, мы только хотим, чтобы сдвинуть буквы и шифровать письма. Поэтому первое, что нужно сделать, вы увидели, что использование для Цезаря в задачу установить 2 является запуск Цезаря, а затем введите номер, когда вы запустите ее в терминале. Итак, что мы должны сделать, чтобы хоть как-то получить этот ключ и доступ к нему. И поэтому мы хотим, чтобы хоть как-то видеть, что это будет второй аргумент командной строки. Первый будет. / Цезарь, а следующий будет номер ключа. Поэтому, прежде чем мы имели Int основных (недействительными), чтобы начать наши программы C. Мы собираемся отогните слой немного а на самом деле видим, что вместо передачи в пустоту нашей основной функцией Мы действительно имеем дело с 2 параметрами. У нас есть целое число имени агдс, а затем массив строк, называемый argv. Так агдс целое, и представляет собой количество аргументов в свою программу. А потом ARGV на самом деле список аргументов. Все аргументы строки, и так ARGV представляет собой массив, список строк. Давайте поговорим о массивах немного. Массивы являются принципиально новая структура данных. У нас есть целых чисел, мы в два раза, у нас есть строки, и теперь у нас есть массивы. Массивы структур данных, которые могут содержать несколько значений одного и того же типа, Так по существу, список любого типа вы хотите. По существу, если вы хотели списка целых чисел все в 1 переменную, Затем вы должны создать новую переменную, которая была типа массив Int. Так массивы нулевого индексируются, это означает, что первый элемент массива имеет индекс 0. Если массив имеет длину 4, как в этом примере, то ваш последний элемент будет с индексом 3, , что на 4 - 1. Таким образом, чтобы создать массив, вы могли бы сделать что-то вроде этого. Скажи, что ты хотел двойного массива. Это относится к любому типу тип данных, однако. Так что вы хотите двойного массива. Скажем, вы хотите назвать это почтовый ящик. Так же, как вы бы инициализировать любые другие двойные, Вы сказали бы двойную, а затем имя, но на этот раз мы ставим квадратные скобки, и то число будет длина массива. Отметим, что в массивах мы никогда не можем изменить длину, так что вы всегда должны определить и выбрать, сколько ящиков, сколько значений вашего массива собирается провести. Таким образом, чтобы установить различные значения в вашем массиве, вы собираетесь использовать этот синтаксис, как вы видите на слайде. У вас есть почтовый ящик индекс 0 будет установлен в 1,2, Индекс сообщения 1 комплект до 2,4, и т.д. Так что теперь мы рассмотрели массивов немного, давайте вернемся к ARGC и ARGV. Мы знаем, что сейчас ARGV массив строк. Таким образом, когда пользователь переходит в - говорят, что они работают программы - они говорят. / Hello David Malan, что программа будет делать для вас уже фактически придумал, что ARGC и ARGV есть. Так что вам не нужно беспокоиться об этом. ARGC в этом случае будет 3, поскольку он видит 3 отдельных слов, разделенных пробелами. И так, то массив в данном случае, первый индекс будет. / Привет, Следующий Давида, следующего Малан. Кто-нибудь видеть сразу, что отношения между ARGV,  массиве, и ARGC есть? Да. Мы войдем в том, что в качестве примера в args.c. Давайте посмотрим, если мы можем воспользоваться отношений между 2. Здесь вы можете обнаружить, что в устройство приложение по умолчанию открыть. с файлами иногда Emacs. Но мы хотим иметь дело с Gedit, так что вы можете сделать, вы можете щелкнуть правой кнопкой на файле C, выберите Свойства, Открыть с помощью, а затем выберите Gedit, установить по умолчанию, и теперь ваша программа должна открыть в Gedit вместо Emacs. Perfect. Так вот у меня есть программа, что я хочу, чтобы распечатать каждый аргумент командной строки. Поэтому, что бы пользователь вводит, я хочу существу вернуть его обратно к ним на новой строке. Так что структуры, которые мы можем использовать для перебора что-то - то, что вы, вероятно, использовали в своей PSET 1? Если вы хотите, чтобы пройти через определенное количество вещей? >> [Студент] Для цикла. Для цикла. Именно так. Итак, давайте начнем с цикла. У нас есть для Int = 0. Давайте начнем со стандартной инициализации переменной. Я собираюсь оставить условием для набора, а затем сказать, что я + +, собираюсь делать вещи. Хорошо. Таким образом, вспоминая ARGV, если ARGV это список аргументов, передаваемых в программу и ARGC число аргументов в программу, то это означает, что агдс, по существу, длина ARGV, право, потому что там будет столько аргументов, значение ARGC. Поэтому если мы хотим, чтобы перебора каждого элемента в ARGV, мы собираемся хотите каждый раз обращаться к переменной в ARGV в данный индекс. Это может быть представлена ​​с этим, верно? Эта переменная здесь представляет собой определенную строку в данном случае потому что это массив строк - строка в частности, что данный индекс. То, что мы хотим сделать, в этом случае мы хотим, чтобы распечатать его, так скажем Printf. А теперь ARGV является строкой, поэтому мы хотим положить, что заполнитель там. Мы хотим, чтобы новая строка просто чтобы сделать его хорошо выглядеть. Таким образом, здесь мы имеем цикл. У нас нет условий пока нет. Так что я начинается с 0, а затем каждый раз, когда он собирается печатать данную строку в данный индекс в массиве. Поэтому, когда мы хотим, чтобы остановить печать из элементов в массиве? Когда мы закончили, верно? Когда мы дошли до конца массива. Таким образом, мы не хотим превышать прошлого длина массива, и мы уже знаем, нам не нужно на самом деле активно выяснить, что длина ARGV является потому что оно нам дано, и что это такое? ARGC. Именно так. Таким образом, мы хотим сделать этот процесс ARGC число раз. Я не в праве каталога. Хорошо. Теперь давайте сделаем аргументы. Нет ошибок, и это здорово. Так что давайте просто запустить аргументы. Что это собирается вернуться к нам? Это просто будет печатать его обратно. "Вы вводятся аргументы в программу, я собираюсь дать его обратно к вам". Так скажем, мы хотим сказать, аргументы, то Foo Bar. Так то оно выводит ее обратно к нам. Все в порядке? Так что есть пример того, как можно использовать ARGC и ARGV зная, что агдс представляет длину ARGV. Убедитесь, что вы никогда не с массивами доступ к одному за пределы длины массива потому что C, безусловно, кричать на тебя. Вы получите то, что называется сбоем сегментации, который никогда не весело, в основном говорят, что вы пытаетесь получить доступ что-то что не существует, не принадлежат вам. Поэтому убедитесь, особенно с нулевой индексации, мы не хотим - Как, например, если у нас есть массив длины 4, , что индекс массива 4 не существует, потому что мы начинаются с 0, при нулевой индекс. Она станет второй натурой, как и для петель, когда мы начинаем с 0. Так что имейте это в виду. Вы же не хотите, чтобы когда-либо получить доступ к индексу массива, что это за пределами вашей досягаемости. Таким образом, мы можем видеть сейчас, как мы можем вид доступа аргументы командной строки, которые передаются дюйма Но, как вы видели строку, ARGV на самом деле массив строк. Так что это на самом деле не является целым числом клиентов, но в Caesar мы хотим иметь дело с целыми числами. К счастью, есть функции созданы для нас, которые действительно могут преобразовать строку в целое число. Кроме того, здесь мы имеем дело не с пользовательского ввода, где мы побуждая их для входа здесь ключ, поэтому мы не можем на самом деле reprompt и сказать, "О, дайте мне другое целое число, скажем, если это не действует". Но мы по-прежнему необходимо проверить правильность использования. В Цезаря они только позволили пройти в 1 номер, и поэтому они должны выполняться. / цезарь, а затем они должны дать вам номер. Так агдс должно быть определенное количество. Какое число это будет, если они должны передать вам. / Цезарь, а затем ключ? Что такое агдс? >> [Студент] 2. Два >>. Именно так. Итак, вы хотите, чтобы убедиться, что агдс равна 2. В противном случае вы в принципе отказаться от запуска программы. В основном это функция, которая говорит Int основной, Таким образом, мы всегда хорошо 0 возвращению практики в конце успешной программы. Таким образом, если, скажем, они дают вам 3 аргументов командной строки, а не 2 или дать вам 1, например, то, что вы будете делать это вы будете хотеть, чтобы проверить, что , а затем возвращают 1 говорю, нет, я не могу продолжить эту программу. [Студент] Там не может быть места в вашем тексте. >> Простите? [Студент] Там не может быть места в тексте вы пытаетесь зашифровать. Ах! С точки зрения текста, который мы пытаемся шифрования, что на самом деле происходит позже когда мы даем этому тексту. Так что сейчас мы просто принимая в качестве аргументов команды фактического количества, фактический сдвиг для шифрования Цезаря. [Студент] Почему нужно 2, в отличие от всего лишь 1 агдс? Там определенно 1 число. Право. Причина, почему мы должны 2 для агдс вместо 1 Потому что, когда вы запускаете программу и говорить. / цезарь или. / привет, что на самом деле считается как аргумент командной строки. Итак, что уже занимает 1 и так, то мы вводе 1 дополнительный. Итак, вы на самом деле вводе строки в аргумент командной строки. То, что вы хотите сделать, для Цезаря мы хотим иметь дело с целым, так что вы можете использовать эту функцию atoi. А в принципе, вы передаете его в строку, а затем он вернет вас обратно целым если это возможно, чтобы сделать эту строку в целое число. Теперь помните, когда мы имеем дело с Printf или GetString, и тому подобное, мы включаем библиотек, которые являются специфическими для нас. Таким образом, в начале мы начинаем с хэш-тегом стандартного ввода / вывода. Ч, что-то вроде этого. Ну, atoi не в одной из этих библиотек, Итак, что мы должны сделать, мы должны включать в себя право библиотеку для этого. Так Напомним обратно Прохождение 1, где я обсуждал руководстве функция. Вы вводите человека в терминале, а затем следует имя функции. И так, что появится целый список его использования, но также она будет воспитывать которого библиотека, которая принадлежит. Так что я оставлю это вам использовать функцию ручной с atoi и выяснить, какие библиотеки нужно включить, чтобы иметь возможность использовать atoi функции. Итак, мы получили ключ, и теперь дело доходит до получения простого текста, и так, что на самом деле будет пользовательского ввода, где вы подскажете. Мы имели дело с GetInt и GetFloat, и поэтому в том же духе мы будем иметь дело с GetString. Но в данном случае мы не должны делать каких-либо делать во время или во время петли для проверки. GetString, безусловно, дает нам строки, и мы собираемся, чтобы зашифровать любой пользователь дает нам. Таким образом, можно предположить, что все эти введенной пользователем строки являются правильными. Великий. Итак, как только вы получили ключ, и как только вы получили текст, Теперь то, что осталось, это у вас есть, чтобы зашифровать текст. Просто, чтобы быстро охватить более жаргон, текст является то, что пользователь дает вам, и зашифрованного текста является то, что вы вернетесь к ним. Так строк, чтобы быть в состоянии пройти на самом деле буква за буквой потому что мы должны перейти каждую букву, Мы понимаем, что строки, если мы как-то отогните слоя, мы видим, что они просто действительно список символов. Один идет за другим. И поэтому мы можем рассматривать строки как массивы, потому что они являются массивами символов. Так что у вас есть строка с именем текста, и в рамках этой переменной текст хранится Это CS50. Затем текст с индексом 0 будет большой буквы, индекс 1 будет ч, и т.д. А потом с массивами, в ARGC например, в args.c, мы увидели, что у нас было перебрать массив и поэтому нам пришлось повторять от = 0 до I меньше, чем длина. Так что нам нужно каким-то образом выяснить, что длина наших строка если мы собираемся перебрать его. К счастью, опять же, есть функция существует для нас, хотя позже в CS50 Вы определенно сможете реализовать и сделать свои собственные функции что можно вычислить длину строки. Но сейчас мы собираемся использовать длину строки, так StrLen. Вы проходите в строку, а затем он вернет вас Int, которая представляет длину вашей строки. Давайте посмотрим на пример того, как мы могли бы для перебора каждого символа в строке и что-то сделать с этим. То, что мы хотим сделать, это перебор каждого символа строки, и то, что мы хотим сделать, это мы выводим обратно каждый символ 1 на 1 кроме нас что-то добавить рядом с ним. Итак, давайте начнем с цикла. Int = 0. Мы собираемся оставить пространство для состояния. Мы хотим, чтобы повторять, пока не достигнем конца строки, верно? Итак, какие функции дает нам длину строки? [Неразборчиво ответ студента] Вот длину аргументов командной строки. Но для струнного мы хотим использовать функцию, которая дает нам длину строки. Так вот длина строки. И так, то вы должны передать в строку к нему. Он должен знать, что строка для этого нужно вычислить длину. Таким образом, то в этом случае мы имеем дело с строкой с. Великий. Таким образом, то, что мы хотим сделать, давайте Printf. Теперь мы хотим иметь дело с символами. Мы хотим, чтобы распечатать каждый индивидуальный характер. Если вы хотите, чтобы распечатать поплавок, можно использовать как заполнитель% ф. С Int вы должны использовать% г. И аналогично, с характером, вы используете% с сказать, что я собираюсь быть печать с символьной , которая хранится в переменной. Так что у нас это, и давайте добавим период и место для этого. Какой характер мы используем? Мы будем использовать все, что характер мы на струны. Итак, мы собираемся использовать что-то со строкой, но мы хотим, чтобы получать доступ к определенным характером там. Таким образом, если строка просто массив, то как мы получаем доступ к элементам массива? У нас есть эти квадратные скобки, а затем положить индекс там. Поэтому у нас есть квадратные скобки. Наш индекс в этом случае мы можем просто использовать я. Именно так. Итак, мы говорим, что мы собираемся печати, за которым следует точка и пространство, и что характер будет й буквой в нашу строку с. Я просто хочу, чтобы спасти. Хорошо. Теперь я собираюсь работать длины строки. Поэтому мы вынуждены были строки называется OMG, и теперь она подчеркнула, даже больше. Точно так же, скажем, мы на самом деле хотим получить строку от пользователя. Как мы можем это сделать? До этого, как мы получим целое число? Мы сказали GetInt, верно? Но это не является целым числом, так что давайте GetString. Давайте сделаем длины строки. Здесь мы не ввести специальную строку. Таким образом, я не знаю. Я собираюсь поставить свою подпись здесь и так, то что я могу сделать одна из тех вещей где я назначить слова для каждой буквы или что-то вроде этого. Cool. Так вот длина строки. Таким образом, мы вернулись к Цезарю. У нас есть несколько инструментов, как мы перебора строки, как мы получаем доступ к каждому элементу. Так что теперь мы можем вернуться к программе. Как я упоминал ранее, в ASCII таблице, ваш лучший друг, Вы собираетесь видеть, что числа, которые связаны с каждой буквой. Так вот сказать, что наш текст является Я головокружение! Тогда каждый из этих символов будет иметь номер и ASCII значение, связанное с ним, даже апостроф, даже пространство, даже восклицательный знак, так что вы хотите иметь это в виду. Так что сказать, что наш ключ, который пользователь входит в их аргументов командной строки равна 6. Это означает, что в первом письме, которое я, которая представлена ​​на 73, Вы хотите вернуть им все, что письмо представляет ASCII значение 73 + 6. В данном случае это было бы 79. Теперь мы хотим, чтобы перейти к следующему символу. Так что в следующий в индексе 1 из текста было бы апостроф. Но помните, мы только хотим, чтобы зашифровать буквы. Таким образом, мы хотим убедиться, что апостроф на самом деле остается той же, что мы не изменится от 39 до 45 это все. Мы хотим сохранить его как апостроф. Таким образом, мы хотим помнить только зашифровать буквы потому что мы хотим, чтобы все остальные символы остаются неизменными в нашей программе. Другое дело, что мы хотим сохранить капитализацию. Поэтому, когда у вас есть заглавной буквы, она должна оставаться, как в верхнем регистре. Нижний регистр должен остаться в нижнем регистре. Таким образом, некоторые полезные функции, чтобы быть в состоянии иметь дело только с шифрованием буквы и держать сохранении капитализации вещи это функции ISALPHA, ISUPPER, IsLower. И поэтому эти функции, которые возвращают вас логическое значение. В принципе, истинным или ложным. Это прописные? Является ли это алфавитно-цифровой? Это письмо, по существу. Так вот 3 примера того, как можно использовать эту функцию. В принципе, вы можете проверить, является ли значение, возвращенное вам, что функция является истинным или ложным на основе этого входа. Либо не зашифровывать что-то или зашифровать его или убедиться, что это прописные и т.д. [Студент] Можете ли вы объяснить только тем, еще немного и как вы их используете? >> Да, конечно. Таким образом, если мы оглянемся назад, то здесь мы имеем капитала I, не так ли? Итак, мы знаем, что я идет к О, потому что я + 6 является O. Но мы хотим, чтобы убедиться, что вывод будет столицей O. Так в основном, что это своего рода собираемся менять наши входа. Так ли это прописные или не будет вид изменится таким образом, что мы имеем дело с ним. Итак, если мы используем ISUPPER функции на данном индексе, так ISUPPER ("Я"), который возвращает нас так, чтобы мы знали, что это верхняя. Так вот основываясь на этом, потом мы поедем в формулу что вы будете использовать, чтобы переложить вещи в Цезаря, так, то в принципе, там будет несколько иной формуле, если это прописные в отличие от нижнего регистра. Смысл? Да. Не беспокойтесь. Я говорил немного о добавлении 6 к письму, которое не совсем смысла исключением случаев, когда мы как-то понимаем, что эти символы являются своего рода взаимозаменяемы с целыми числами. Что мы делаем это, мы вид использования неявных литья. Мы пойдем в литье немного позже, где вы берете значение, и вы превратите его в другой тип чем это первоначально было. Но с этим PSET мы сможем вида взаимозаменяемы использовать символы и соответствующие им целые значения. Так что, если вы просто накрыть характер только с одинарными кавычками, Затем вы сможете работать с ним с целыми числами, справиться с ним как целое. Таким образом, столица C относится к 67. Строчные F относится к 102. Опять же, если вы хотите знать эти значения, посмотрите на свой ASCII таблицы. Так что давайте войдем в некоторые примеры того, как вы могли бы вычесть и добавить, как вы можете действительно работать с этими символами, использовать их как взаимозаменяемые. Я говорю, что ASCIIMath будет вычислить добавлением символа в целое , а затем отображает результирующий характер, а также результирующее значение ASCII. И вот я говорю - МЫ справиться с этой частью позже - но в основном, я говорю, что пользователь должен запустить сказать ASCIIMath вместе с ключом, и я говорю, что этот ключ будет число , с которой мы собираемся добавить этот персонаж. Так вот заметил, что, так как я требующий ключа, так как я требуя, чтобы они дали мне 1 вещь, Я только хочу, чтобы их принять. / Asciimath и ключ. Так что я буду требовать, чтобы агдс равна 2. Если это не так, то я собираюсь вернуть 1, и программа завершится. Поэтому я говорю, что ключ не будет первого аргумента командной строки, это будет второй, и, как вы видите здесь, Я собираюсь превратить его в целое число. Тогда я собираюсь установить символ, который будет р. Обратите внимание, что тип переменной ХР на самом деле целое. Таким образом, что я могу использовать Г как целое является упаковывая его с этим одинарные кавычки. Итак, вернемся к нашим Printf заявление, в котором у нас есть заполнитель для характера , а затем прототипом для целого, символ представляется КПЧ, и целое является ключевым. И таким образом мы собираемся в результате добавить 2 вместе. Таким образом, мы собираемся добавить все, что г + ключ, а потом мы собираемся напечатать результат этого. Так давайте сделаем asciimath. Это до даты, так что давайте просто запустить asciimath. Да, но видите, это не делать ничего, потому что мы на самом деле не дать ему ключ. Поэтому, когда он только что вернулся 1, наша основная функция, она только что вернулась назад к нам. Итак перейдем в ключ. Кто-то дал мне номер. >> [Студент] 4. 4. Хорошо. Таким образом, г увеличился на 4 собирается дать нам V, что соответствует ASCII значение 118. И тогда она как бы имеет смысл, что - На самом деле, могу ли я спросить вас, что вы думаете ASCII значения г, если г + 4 составляет 118? Тогда да, г 114. Так что, если вы посмотрите на таблицу ASCII, то, конечно же, вы увидите, что г представлена ​​114. Так что теперь мы знаем, что мы можем добавить целых чисел, символов, это кажется довольно простым. Мы просто собираемся для перебора строк, как мы видели в примере ранее. Мы проверим, если это письмо. Если это так, тогда мы будем перекладывать ее на любой ключ. Довольно просто, кроме случаев, когда вы получите это нравится, Вы видите, что г, представлен на 122, то даст вам другого характера. Мы на самом деле хотим оставаться в рамках нашего алфавита, правильно? Таким образом, мы должны выяснить, каким-то образом вид обтекания. Когда вы достигнете Zed, и вы хотите увеличить на определенное число, Вы не хотите идти в пределы ASCII разделе алфавита; Вы хотите, чтобы обернуть весь путь обратно к А. Но имейте в виду, вы все еще сохраняя тот случай. Таким образом, зная, что письма не могут стать символами как символы не будут также меняется. В последние PSET вы определенно не нужно, но вариант должен был реализовать свои жадные PSET с помощью модуля функции. Но теперь мы на самом деле собираемся нужно использовать модуль, так что давайте просто идти по этому немного. По сути, когда у вас есть х по модулю у, который дает вам оставшуюся часть х делится на у. Вот несколько примеров. У нас есть 27% 15. В основном, когда нужно вычесть 15 из 27 столько раз, сколько возможно, не получив отрицательный , то вы получите 12 осталось. Так что вроде как в математике контексте, но как мы можем использовать это? Это будет полезно для наших зап `ах. Для этого, давайте просто скажем, я спросил вас всех разделить на 3 группы. Иногда вы делаете это в группах и что-то вроде этого. Скажем, я сказал: "Хорошо, я хочу, чтобы вы быть разделены на 3". Как вы могли бы это сделать? [Неразборчиво ответ студента] Да, именно так. Отсчитайте. Хорошо. Давайте на самом деле сделать это. Вы хотите, чтобы начать? [Студентам отсчитывая] 1, 2, 3, 4. Но помните ... >> [Студент] Ой, простите. Это действительно хороший вопрос. Вы сказали, что 4, но мы на самом деле хотим, чтобы вы говорите 1, потому что мы хотим только 3 группы. Итак, каким - Нет, это действительно хороший пример, потому что то, как вы могли бы сказать 1? Каковы отношения между 4 и 1? Ну, 4 мод 3, 1. Так что, если вы будете продолжать, то будет 2. Поэтому у нас есть 1, 2, 3, 1, 2. Опять же, вы на самом деле 5-го человека. Как вы знаете, говорить 2, а не 5? Вы говорите, что 5 Mod 3, 2. Я хочу видеть, как много групп из 3 осталось более, то в каком порядке я! И таким образом, если бы мы продолжали по всей комнате, то мы увидели бы, что мы всегда на самом деле применения мода функция себе в виде отсчитывать. Это более вида наглядный пример того, как можно использовать по модулю потому что я уверен, что большинство из нас, вероятно, прошли через этот процесс где мы должны были отсчитывать. Любые вопросы по модулю? Это будет очень важно разобраться в понятиях этого, поэтому я хочу, чтобы убедиться, что вы, ребята, понимаете. [Студент] Если есть без остатка, это дает вам реальное число? Если одна из первых 3 из них сделали это, будет ли это дали им то, что они были на самом деле, или же он дал им [неразборчиво] >> Это хороший вопрос. При отсутствии остатка по модулю - так что у вас есть 6 Mod 3 - что на самом деле дает вам 0. Мы поговорим об этом чуть позже. Ах да, например, 3-го лица - 3 мода 3 на самом деле 0, но она сказала 3. Так что вроде как внутренней добычи, например, как хорошо, если мода равен 0, то я буду 3-го лица. Но мы войдем в роде того, как мы могли бы иметь дело с тем, что 0 не позже. Так что теперь мы как-то должны способ отображения Zed справа письме. Итак, теперь мы прошли через эти примеры, мы как бы видим, как Цезарь может работать. Вы видите, 2 алфавита, а затем вы видите их перемещение. Так давайте попробуем выразить это в терминах формулы. Эта формула действительно дается вам в спецификации, Но давайте вид взгляда через то, что каждая переменная средства. Наш конечный результат будет зашифрованного текста. Таким образом, это говорит о том, что го характера зашифрованный текст будет соответствовать го характера текста. Это имеет смысл, потому что мы хотим, чтобы всегда быть подкладка эти вещи. Так что это будет го характера зашифрованного текста плюс к, который является нашим ключом - , которая имеет смысл - а то у нас эта мода 26. Помните, когда мы были Zed мы не хотим, чтобы попасть в характер, поэтому мы хотели, чтобы это мода и вид обернуть вокруг алфавита. После Zed вы пойдете к A, B, C, D, пока вы не добрались до нужного количества. Итак, мы знаем, что Zed, если + 6, даст нам е, потому что после Zed приходит A, B, C, D, E, F. Итак, давайте помнить, что мы знаем наверняка, что Zed + 6 собирается дать нам ф. В ASCII значения, г составляет 122 и Р 102. Поэтому мы должны найти способ сделать наш Цезарь формула даст нам 102 после принятия в 122. Так что, если мы просто применить эту формулу, ('Z' + 6) 26%, что на самом деле дает вам 24 потому что 122 + 6 128; 128% 26 дает вам 24 остатка. Но это на самом деле не означает, ф. Это определенно не 102. Это также не 6-й буквой в алфавите. Таким образом, очевидно, что мы должны иметь некоторый способ настройки этого немного. В терминах регулярных алфавита, мы знаем, что г 26 буквы и F является 6-м. Но мы в информатике, так что мы собираемся индекса 0. И тогда вместо г-число 26, мы будем говорить, что это номер 25 потому что это 0. Итак, теперь давайте применим эту формулу. Мы имеем г представлены 25 + 6, которая дает вам 31. И 31 мод 26 дает вам 5 в качестве остатка. Это прекрасно, потому что мы знаем, что F является 5-й буквой в алфавите. Но это еще не е, верно? Он по-прежнему не 102. Таким образом, то для этого PSET, вызов будет пытаться выяснить отношения между конвертацию между этими значениями ASCII и алфавитный указатель. По существу, то, что вы хотите делать, вы хотите, чтобы начать с ASCII значения, а то вы хотите, чтобы хоть как-то перевести это в алфавитном указателе Затем рассчитать, какие письма он должен быть - в основном, то, что его Алфавитный указатель шифра характер - то, что перевести обратно в ASCII значения. Так что если вы выхватить вашу ASCII таблицы, а затем попытаться найти взаимосвязь между, скажем, 102 и 5 или 122 и 25. Мы получили наш ключ от аргументов командной строки, мы получили текст, Мы зашифровано его. Теперь все, что нам осталось сделать, это распечатать его. Мы могли бы сделать это несколькими различными способами. Что мы можем сделать, это на самом деле печатать как мы идем вместе. Как мы перебора символов в строке, мы могли бы просто просто распечатать прямо тогда, когда мы ее расчета. Кроме того, можно также хранить его в массив, а массив символов и в конце итерации, что весь массив и распечатать его. Таким образом, у вас есть несколько вариантов для этого. И помните, что с% будет заполнитель для печати характера. Так что у нас есть Цезарь, и теперь мы переходим к Vigenere, который очень похож на Цезаря, но чуть сложнее. Так по существу с Vigenere это вы будете проходящей в ключевое слово. Таким образом, вместо номера, вы будете иметь строки, и так, что собирается выступать в качестве ключевого слова. Затем, как обычно, вы собираетесь получить подсказку для строки от пользователя , а затем зашифровать его, а затем дать им обратно зашифрованного текста. Итак, как я уже сказал, это очень похож на Цезаря, только вместо перехода на определенное число, количество фактически собирается менять каждый раз от персонажа к персонажу. Чтобы представить, что фактическое число переложить, он представлен на клавиатуре буквы. Так что, если вы входите в смещении, например, то, что будет соответствовать смещению 0. Так что это еще раз вернуться к алфавитному указателю. Что может быть полезно, если вы видите, что мы действительно имеем дело с ASCII значения а также письма, а также алфавитный указатель, возможно, найти или создать свой собственный ASCII таблица, которая показывает алфавитный указатель от 0 до 25, через г, а ASCII значения, так что вы можете видеть вид отношений и наметить и попытаться найти некоторые закономерности. Точно так же, если бы вы были смещения в определенной инстанции F - и это либо строчными или прописными F - то, что соответствовало бы 5. Разве мы хорошо до сих пор? Формула для Vigenere немного отличается. В принципе, вы увидите, что это так же, как Цезарь, исключением, а не только к имеем к индексом J. Обратите внимание, что мы не используем, потому что я по существу, длина ключевого слова не обязательно длины нашего зашифрованного текста. Это будет немного яснее, когда мы видим, например, что у меня есть немного позже. В принципе, если вы запустите программу с ключевым словом Ohai, то это означает, что каждый раз, Ohai будет вашей смены. Поэтому в зависимости от того, что позиции вы находитесь в ваше ключевое слово, Вы собираетесь перенести ваш определенный характер зашифрованного текста на эту сумму. Опять же, как Цезарь, мы хотим убедиться, что мы сохраним капитализации вещи и мы только зашифровать буквы, а не символы или пробелы. Так оглянуться назад, чтобы Цезарь на функции, которые вы можете использовать, так, что вы решили, как переложить вещи, и применить это к вашей программе. Так что давайте карта этом. У нас есть текст, который мы получили от пользователей из GetString Сказав это ... является CS50! Тогда у нас есть ключевое слово Ohai. Первые 4 символа, довольно просты. Мы знаем, что T собирается быть сдвинуты на о, Тогда Н будет сдвинут на час, я намерен быть сдвинуты. Здесь вы видите, что представляет собой 0, так, то конечное значение на самом деле просто же буквы, что и раньше. Затем с сдвигается на меня. Но тогда у вас есть эти периоды здесь. Мы не хотим, чтобы зашифровать, что, таким образом, то мы не изменить, ничего и просто распечатать период неизменным. [Студент] Я не понимаю, как вы знаете, что это сдвинута на - Где ты - >> Ой, простите. В верхней Здесь вы видите, что аргумент командной строки Ohai здесь, что это будет ключевым словам. А так в основном, вы велосипедного более символов в ключевых слов. [Студент] Таким образом, вывод будет сдвигая же - Так O соответствует определенный номер в алфавите. [Студент] Верно. Но с чего ты взял CS50 часть из? Ох. Это в GetString, где вы, как: «Дайте мне строки для кодирования". [Студент] Они собираются дать вам, что аргумент перейти на и тогда вы будете просить вашей первой строки. >> Да. Поэтому, когда они запустите программу, они будут включать ключевые слова В их аргументы командной строки, когда они запустите его. Затем, когда вы проверили, что они на самом деле дал вам 1 и не более, не менее, Затем вы идете, чтобы подтолкнуть их к строке, скажем, "Дайте мне строки". Так вот где в этом случае они дали вам это ... является CS50! Итак, вы собираетесь использовать, что и использовании Ohai и перебирать. Обратите внимание, что здесь мы пропустили шифрования периоды, но с точки зрения нашей позиции по Ohai, следующий мы использовали о. В данном случае это немного сложнее увидеть, потому что это 4, так давайте продолжим немного. Просто придерживайтесь со мной здесь. Тогда я и S, которые затем переводятся на о и ч соответственно. Тогда у нас есть пространство, и так, то мы знаем, что мы не собираемся, чтобы зашифровать пространства. Но заметьте, что вместо того, чтобы в этом месте прямо здесь, Мы шифрование по - Я не знаю, если вы видите, что - прямо здесь. Так что это не похоже на тебя фактически предопределена, скажем, идет здесь о, ч здесь идет, идет здесь, я здесь идет, O, H, A, I, O, H, A, I. Вы не делаете этого. Вы только изменить свою позицию в ключевых слов когда вы знаете, что вы на самом деле будете шифрования фактической письме. Есть ли такой смысл? Хорошо. Так что некоторые напоминания. Вы хотите, чтобы убедиться, что вы только перейти к следующему письму в ваше ключевое слово если персонаж в открытый текст письма. Так что сказать, что мы находимся на о. Отметим, что следующий символ, индекс Я из текста, является числом, например. Тогда мы не выдвигают J, индекс для нашего ключевого слова, пока мы не достигнем еще одно письмо. Опять же, вы также хотите, чтобы убедиться, что вы запахом до начала ключевого слова когда вы находитесь в конце его. Если вы видите, здесь мы находимся я, следующий должен быть о. Итак, вы хотите найти какой-то способ, чтобы быть способным запахом в начале ваших ключевых слов каждый раз, когда вы дойдете до конца. И так снова, какой оператор полезен в этом случае для обертывания вокруг? Как и в отсчитывая пример. [Студент] знак процента. >> Да, знак процента, что является по модулю. Таким образом, по модулю пригодится, если хотите, чтобы обернуть по индексу в Ohai. И так же быстро подсказка: попробуйте думать о обертывания по ключевому слову немного похож на отсчет, где, если есть 3 группы, 4 человека, их количество, что они сказали, было 4 мод 3, которая была 1. Так что попробуйте и думать по-другому. Как вы видели в формуле, где у вас есть CI а потом пи, но затем кДж, Вы хотите, чтобы убедиться, что вы следить за тем. Вам не нужно называть это я, вам не нужно называть это J, но вы хотите, чтобы убедиться, что вы отслеживать позиции, что вы в в текст а также из того, что вы на ваше ключевое слово в потому что те, которые не обязательно будет то же самое. Не только ключевое слово - оно может быть совершенно разной длины, чем ваш текст. Кроме того, ваш текст, есть цифры и символы, так что это не будет идеально соответствовать вместе. Да. [Студент] Есть функция изменить дело? Можете ли вы изменить в столицу? >> Да, там определенно есть. Вы можете проверить - Я считаю, что это ToUpper, все 1 слово. Но когда вы пытаетесь зашифровать вещи и сохранить текст, лучше в основном иметь отдельные случаи. Если это прописные буквы, то вы хотите перейти по этой потому что в формуле, когда вы оглядываетесь назад, как мы должны вида ходу взаимозаменяемы между ASCII способ представления чисел и фактического алфавитный указатель, мы хотим убедиться, что там будет какой-то шаблон, который вы собираетесь использовать. Еще одно замечание по шаблону, на самом деле. Вы будете определенно иметь дело с цифрами. Старайтесь не использовать магию чисел, которое является примером стиля. Так что вы хотите, чтобы каждый раз, когда что-то сдвиг нравится - Итак, намек, другой спойлер, когда вы собираетесь что-то ч. на определенную величину, стараюсь не представлять, что, фактическое число а попробовать и посмотреть, если вы можете использовать ASCII значение, которое вроде бы больше смысла. Еще одно замечание: Потому что мы имеем дело с формулами, даже если ваш TF будет вид знаем, что картина вы могли бы использовать, Лучше всего в вашем комментарии вида объяснить логику, как, "Я использую эту модель, потому что ..." и отчасти объяснить картину кратко в своем комментарии. [Это было прохождение 2] Если нет никаких других вопросов, то я останусь здесь немного. Удачи вам в ваших PSET 2: Crypto и спасибо за внимание. [Студент] Спасибо. >> Спасибо. [Media Offline Intro]