[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 + 6128; 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]