[Powered by Google Translate] [Walkthrough - Проблем Set 2]
[Zamyla Chan - Харвардския университет]
[Това е CS50. CS50.TV]
Добре. Здравейте на всички, и добре дошли Walkthrough 2.
Първо, искам да ви поздравя за довършителни pset 1.
Знам, че можеше да бъде малко трудно за някои от вас,
би могло да бъде първата си компютърна програма, която сте написали,
но просто не забравяйте, че в края на тази, когато погледнем назад в края на семестъра,
ще разгледаме pset 1 и ще кажа: "Хей, аз може да направи това в рамките на 5 минути."
Така че знаят и доверие, че в края на тази определено ще намерите pset 1 съвсем проста.
Но за сега това е огромно постижение, и поздравления за да се направи.
Сега, бърза бележка, преди да сме се в месото на репетиция.
Аз просто искам да се направи бърз бележка, че понякога няма да има достатъчно време
по време на сваляне да мине през всеки един начин за правене на проблема набор
и по-скоро просто може би се съсредоточи върху 1 или 2 вид на приложения,
начини, по които можете да направите това.
Но това не е да се каже, че е забранено да го правят по друг начин.
Често има многобройни начини за правене на нещата, тъй като с компютърни науки,
и така определено не се колебайте да използвате друг тип решение, отколкото може да представи.
[Pset 2: Crypto - Zamyla Чан - zamyla@cs50.net]
[Pset2 - 0. Секция с въпроси - 1. Цезар - 2. Vigenere]
Добре. Така че проблемът комплект 2: Crypto е забавно.
Отново с всеки pset вие ще започнете с раздел от въпроси
, която ще се проведе във вашите раздели с назначили преподаване колега.
Ние няма да мине през тези над помагалото,
но те определено ще помогне да завършите pset.
Така първата част на проблема, е Цезар.
И така, в Цезар някой ще ви подмине ключ с цяло число,
и ще криптиране на низ от текст, че те ви предоставят
и да ги върне криптирана нещо.
Ако някой наблюдаваше Коледна Приказка, е пример за това, че има.
След втората част на проблема, е Vigenere
който е по-напреднал криптиране техника.
И така, отиваме за шифроване на част от текст,
с изключение вместо само с едно число, което всъщност ще го кодират
с ключова дума, която потребителят ще ни предоставите.
Добре, така че първият инструмент в кутията с инструменти днес всъщност ще се актуализира на уреда.
На дъската за обсъждания ще видите неща, като: "Защо не тази работа?"
"Защо не представи 50 работа?"
и често решението е просто да се актуализира вашия уред.
И ако е така просто в терминален прозорец във вашия уред Sudo Yum-Y -
това е флаг, да актуализира всичко - актуализация,
вашия уред ще се актуализира, ако е необходимо.
И то не боли, ако вече сте в най-новата версия на уреда.
След това просто ще кажа няма нови актуализации и можете да продължат да работят заедно.
Но това е добре да се изпълнява всеки път, когато отворите уреда
защото ние все още сме много -
понякога, ако влезем в грешка - определяне на уреда.
Така че се уверете, че имате най-новата версия на уреда
и да стартирате тази актуализация има.
Добре. Така че, тъй като ние сме се занимават с букви и промяна, enciphering неща,
отиваме наистина искате да станете най-добри приятели с ASCII класацията ни.
Има множество онлайн, ако намерите. Може дори да направите своя собствена.
По принцип, с всяко писмо и всеки брой и всеки герой
има редица свързани с тях,
и затова е добре да се види техните ASCII стойности заедно с реалното писмо.
Това определено ще ви помогне в проблема набор.
Едно нещо, което наистина ми помогна в този проблем, е действително да го отпечатате,
и като минавах през, аз всъщност ще се възползва от него,
пише: "Ако това трябва да отиде до там, тогава ..."
Нещо се възползва от него и да го маркирате, стават най-добри приятели с ASCII таблицата.
Тогава ние имаме няколко други инструменти на наше разположение.
Този път вместо само да накара потребителя за техния принос
ние ще направим комбинация.
Отиваме да ги пита за принос,
но ние сме също така да се използва само аргументите на командния ред.
Така че, когато се изпълняват тяхната програма, обикновено ви кажа. / Здравей, например,
ако програмата ви е hello.c.
Но този път, вместо просто казвам, че те могат да превърнат думите, аргументи след това.
И така, ние ще използваме каквото и да премине при нас, тъй като тяхното въвеждане, както и,
да се движат отвъд просто пита за цяло число, но също така и с аргументите на командния ред.
И тогава ние ще отидем в масиви и низове, които ще се използват много, както и.
Ето само един пример за едно мини ASCII диаграма.
Както казах, всяка буква съответства на броя
и така да се запознаете с това. Той ще дойде по-удобно.
И по-късно, когато започнете да правите някои ASCIIMath справяне с номера -
добавяне, изваждане - тогава определено е добра да се позове на тази таблица.
Така че ето един пример на шифър на Цезар - нещо, което може да се играе с.
Това е само едно колело. Същество, има външна азбука и тогава там е вътрешна азбука.
Така че тук е един пример на шифър на Цезар, но с ключа на 0.
По същество, е в съответствие с A, B е съобразена с Б, по целия път до Z.
Но после казват, че ние искахме ключ на 3, например.
Тогава ние ще се върти вътрешното колело, така че сега се подравнява с D и др.
И така, това е по същество това, което ние ще направим.
Ние нямаме колело, но това, което ние ще направим, е да направим нашата програма
вид на смени азбуката заедно с нас определена сума от числа.
Така че, както казах и преди, ние ще се занимава с аргументи от командния ред
, както и получаване на цяло число.
Така че начина, по който потребителят ще стартирате Цезар програма е с думите / цезар
и след въвеждане на номер, след това.
И този брой представлява ключ, преминаването,
колко пъти, започваш да се върти на вътрешното колело на вашия шифър на Цезар.
И така, вие виждате тук пример.
Ако ние влязохме буквите от А до L в нашия шифър на Цезар
а след това ще входния D през О, защото това е всяко писмо изместен над 3 пъти,
само като пример на колело, което ви показах.
Тогава, например, ако сте въвели Това е CS50!
тогава би също така да преместите всички писма.
И това е важното в Цезар, така и Vigenere
е, че отиваме да прескочат всички букви.
Така интервали, символи и т.н., цифри, отиваме да ги едни и същи.
Ние само ще смени буквите в този случай.
Така че, както виждате, в колелото, ние имаме само буквите, които са достъпни за нас,
така че ние само искате да преместите буквите и кодиране на буквите.
Така че първото нещо, което трябва да се направи, вие видяхте, че за използване на Цезар в проблем, 2
е да стартирате Цезар и след това въведете число, когато ти тичам в терминала.
Така че това, което ние трябва да направим, е по някакъв начин да се получи, че ключ и достъп до него.
И така, ние искаме по някакъв начин да я видите ще бъде на втория аргумент на командния ред.
Първият от тях ще бъде / цезар, а следващият ще бъде ключов номер.
Така че, преди имахме INT главната (нищожна) да започнат нашите в програми.
Отиваме да кори обратно слой малко
и действително, че вместо да преминава в невалидни нашата основна функция
ние всъщност се занимават с два параметъра.
Имаме вътр име argc и след това масив от низове, наречен argv.
Така argc е цяло число,
и представлява броя на аргументите, подадени в програмата си.
И тогава argv всъщност е списък на изминалите аргументи.
Всички аргументи са струни, и т.н. argv представлява масив, списък, на струните.
Нека поговорим за масиви малко.
Масивите са по същество нова структура на данните.
Имаме цели числа, ние сме се удвоява, имаме струни, а сега имаме масиви.
Масивите са структури от данни, които може да побере няколко стойности от същия вид,
Така че по същество, списък, независимо от вида, който искате.
По същество, ако искаш списък от цели числа в 1 променлива,
тогава ще създаде нова променлива, която е от тип Int масив.
Така масиви са равни на нула индексираната, което означава, че първият елемент на масива е с индекс 0.
Ако масивът е с дължина 4, тъй като в този пример, след което последният елемент ще бъде в три индекса,
което е 4 - 1.
Така че, за да се създаде масив, можете да направите нещо подобно.
Да речем, че иска двойно масив.
Това важи и за всеки тип тип данни, все пак.
Да предположим, че искате двойно масив. Да речем, че искате да го наричаме пощенска кутия.
Точно като теб ще се инициализира всеки друг двойно
бихте казали два пъти и след това името, но този път ние поставяме квадратните скоби,
и след това броят им ще бъде дължината на масива.
Имайте предвид, че в масиви ние не винаги могат да се променят дължината,
така че винаги трябва да определят и изберете колко кутии,
колко стойности масив се ще да се държат.
Така че, за да зададете различни стойности във вашата масив, ти започваш да използвате тази следния синтаксис,
както виждате на слайда.
Вие имате 0 пощенска кутия индекс ще бъде 1,2,
пощенска кутия индекс 1 комплект 2.4 и др.
Така че сега сме прегледали масиви малко, нека се върнем към argc и argv.
Ние знаем, че argv е масив от низове.
Така че, когато потребителят минава - казват, че работите с програмата -
, казват те. / здравей Дейвид Малан,
това, което програмата ще направи за вас вече е всъщност идват с argc и argv са.
Така че не е нужно да се притеснявате за това.
Argc в този случай ще бъде 3, защото той вижда три отделни думи, разделени с интервали.
И така, след това на масива в този случай, на първия индекс. / Здравей,
следващия Дейвид, следващата Малан.
Ли някой вижда веднага каква е връзката между argv
масив, и argc?
Да. Ще отида в този пример в args.c.
Нека видим дали можем да се възползваме от отношенията между две.
Тук можете да откриете, че в уреда подразбиране
за да отворите в файлове понякога е Emacs.
Но ние искаме да се справят с Gedit, така че това, което можете да направите е да щракнете с десния бутон на вашия C файл,
отидете на имоти, Отвори с и след това изберете Gedit, по подразбиране,
и сега вашата програма трябва да се отвори в Gedit вместо Emacs.
Perfect.
Така че тук имам програма, която искате да разпечатате всеки аргумент на командния ред.
Така че каквото и входове на потребителя, по същество искам да го върне обратно към тях на нов ред.
Така че това, което е структура, която можем да използваме за обхождане на нещо -
нещо, което най-вероятно се използва в pset 1?
Ако искате да мине през определен брой неща? >> [Ученик] контур.
За контур. Точно така. Така че нека започнем с за цикъла.
Int I = 0. Нека просто да започнете със стандартна инициализация на променлива.
Отивам да напусне условие за набор и след това да кажа, че + +, ще направим нещата там.
Добре.
Така че мисля да argv, ако argv е списък на аргументите, подадени в програмата
и argc е броят на аргументите в програмата,
това означава, че argc по същество е дължината на argv, нали,
защото там ще бъде толкова много аргументи като стойността на argc.
Така че, ако искаме да обхождане на всеки елемент в argv,
отиваме да искате всеки път, достъп до променлива в argv в посочения индекс.
Това може да бъде представен с това, нали?
Тази променлива представлява определен низ в този случай
защото това е низ масив - определен низ в този индекс.
Това, което искам да направя в този случай ние искаме да го разпечатате, така че нека кажем ФОРМАТ.
И сега argv е низ, така че ние искаме да се сложи това контейнер там.
Ние искаме нов ред, просто за да изглежда добре.
Така че тук имаме за контур. Ние нямаме състояние все още.
Така че аз се започва от 0, а след това всеки път, когато се случва да отпечатате даден низ
в този конкретен индекс в масива.
Така че, когато искаме да спре да печата елементите в масива?
Когато сме готови, нали? Когато сме достигнали края на масива.
Така че ние не искаме да надвишава миналото дължината на масива,
и ние вече знаем, че не трябва да активно да разберете каква е дължината на argv
защото е за нас, а какво е това? Argc. Точно така.
Така че ние искаме да се направи този номер процес argc пъти.
Аз не съм в правилната директория.
Добре.
Сега нека направим опцията. Няма грешки, което е страхотно.
Така че нека просто стартирате опцията.
Какво е това ще се върне при нас? Просто ще го отпечатате.
"Ти въведена опцията в програмата, аз отивам да го върна за вас."
Така че нека да кажем, че искам да кажа опцията брън.
Тогава го отпечатва обратно към нас. Добре ли си?
Така че е пример за това как можете да използвате argc и argv
знаейки, че argc представлява дължината на argv.
Уверете се, че не сте някога с масиви достъп с едно извън дължината на масива
защото C определено ще крещят на вас.
Вие ще получите нещо, наречено сегментация вина,
която никога не е забавно, основно казвам, че се опитвате да отворите нещо
, което не съществува, не принадлежи на вас.
Така че се уверете, и особено с нулева индексиране, ние не искаме да
Като например, ако имаме масив с дължина 4,
този масив индекс 4 не съществува, защото ние започва от 0, при нулев индекс.
Това ще стане втора природа точно като за електрически вериги, когато започват от 0.
Така че просто Имайте го в предвид.
Вие не искате да някога достъп до индекс на масив, който е извън вашия обсег.
Така че можем да видим как можем вид достъп
аргументите на командния ред, които се предават.
Но както видяхте низ, argv всъщност е низ масив.
Така че това всъщност не е цяло число, все още, но в Цезар искаме да се справят с цели числа.
За щастие, има функция, създадена за нас, че всъщност може да конвертирате низ до цяло число.
Също така тук ние не се занимаваме с въвеждане от потребителя, когато сме ги накара
за вход тук за ключа, така че ние не може действително да reprompt и да кажа,
- О, дай ми друго число, да речем, ако това не е валиден. "
Но ние все още трябва да се провери за правилното използване.
В Цезар те са позволени само да мине 1 брой,
и така те трябва да тичам. / Цезар и след това те трябва да ви дам един номер.
Така argc трябва да бъде определен брой.
Какъв номер би било, ако те трябва да ви мине. / Цезар и след това ключ?
Какво е argc? >> Студент [2]. >> Втора. Точно така.
Значи вие искате да се уверите, argc е 2.
В противен случай вие основно отказват да стартирате програмата.
В главната вътр основната функция, която казва,
така, тогава ние винаги в добро 0 практика на връщане в края на една успешна програма.
Така че, ако, да речем, те ни дават три опции на командния ред, вместо на 2
или ще Ви даде 1, например, тогава това, което ще направим, е, вие ще искате да проверите за това
и след това се върнете една поговорка, не, аз не може да продължи с тази програма.
[Ученик] Не може да има пространство в текста. >> Извинете ме?
[Ученик] не може да има място в текста, който се опитвате да криптирате.
Ах!
По отношение на текста, който ние се опитваме да криптирате, че всъщност идва по-късно
когато даваме този текст.
Така че точно сега сме просто приемат като командни аргументи на действителния брой,
действителната промяна за криптиране на Цезар.
[Ученик] Защо имате нужда от две, за разлика от само едно argc? Определено има 1 брой.
Точно така. Причината, поради която трябва да има 2 argc вместо от 1
е така, защото, когато стартирате програмата и да каже / Цезар или / здравей,
че всъщност се брои като аргумент на командния ред.
Така че това вече заема 1 и така, тогава ние сме въвеждане на 1 допълнително.
Значи въвеждане на низ в аргумент на командния ред.
Какво искате да направя, за Цезар искаме да се справим с цяло число,
така че можете да използвате тази функция atoi.
И в общи линии, преминават в низ и след това тя ще ви върне цяло число
ако това е възможно да се направи, че низ в цяло число.
Сега си спомнете, когато си имаме работа с ФОРМАТ или GetString, такива неща,
включват библиотеки, които са специфични за нас.
Така че в началото ще започнем с хеш стандарт тагове I / O, з, нещо такова.
Е, atoi не е в един от тези библиотеки,
така че това, което ние трябва да направим е, че ние трябва да включват правото библиотека за това.
Така припомнят Walkthrough 1, когато обсъждахме на функцията за ръчен.
Въведете човек в своя терминал и след това последван от името на функцията.
И така, това ще доведе до цял списък от използването му,
но и това ще доведе до които библиотеката, която принадлежи към.
Така че аз ще оставя това за вас да използвате функцията за ръчен с atoi
и да разбера библиотека, в която трябва да се включи, за да може да използвате функцията atoi.
Така че ние имаме ключа и сега става дума за получаване на обикновен текст,
и така, че действително ще бъдат въведени от потребителя, когато ви пита.
Ние разгледани с GetInt и GetFloat, и така в същия дух
отива да се занимава с GetString.
Но в този случай ние не трябва да се направи някаква Do време или докато примки да се провери.
GetString определено ще ни даде низ
и отиваме за криптиране, независимо от потребител ни дава.
Така че може да се предположи, че всички тези потребителски въведените струни са правилни.
Велики.
Значи след като имам ключа и след като веднъж сте текста,
сега това, което е останало, е, че трябва да шифроване на прав текст.
Само за да се покриват бързо с течение на жаргон, в прав текст е това, което потребителят ви дава,
и ciphertext е това, което се върнете към тях.
Така струни, за да може да мине през всъщност писмо с писмо
защото ние трябва да се пренасочат всяко писмо,
Ние разбираме, че струните, ако ние вид кори обратно слой,
ние виждаме, че те са просто наистина списък на героите.
Един от тях идва след друг.
И така можем да се отнасяме низове като масиви, защото те са масиви от символи.
Да предположим, че имате низ име текст,
и в рамките на тази променлива текст се съхранява Това е CS50.
Тогава текст с индекс 0 би било столица T, индекс 1 ч и др.
И след това с масиви в argc например в args.c
видяхме, че имахме за обхождане на масив
и така ние трябваше да превъртите от I = 0, докато не е по-малка от дължината.
Така че ние трябва по някакъв начин да разберете каква е дължината на нашия низ
ако отиваме, за да превъртите над него.
За щастие отново има функция за нас, въпреки че по-късно в CS50
вие със сигурност ще бъде в състояние да прилага и да направи своя собствена функция
че може да се изчисли дължината на низ.
Но за сега отиваме да използвате низ дължина, така че strlen.
Минавате в низ, а след това ще ви върне едно цяло число, което представлява дължината на вашия низ.
Нека разгледаме един пример за това как ще бъдем в състояние за обхождане на всеки знак в низ
и да направи нещо с това.
Това, което искаме да направим, е обхождане на всеки знак на низа,
и това, което искаме да направим е да се печата всеки знак 1 от 1
освен добавим нещо до него.
Така че нека започнем с за цикъла. Int I = 0.
Отиваме да остави пространство за състоянието.
Ние искаме да превъртате, докато стигнем до края на низа, нали?
Тогава каква функция ни дава дължината на низа?
[Чува студент отговор]
Това е дължината на аргументите на командния ред.
Но за низ искаме да използваме функция, която ни дава дължината на низа.
Така че това е низ дължина.
И така, тогава ще трябва да премине в низ към него.
Необходимо е да се знае кой низ трябва да се изчисли дължината на.
Значи в този случай си имаме работа с низ е.
Велики.
Значи това, което искаме да направим, нека ФОРМАТ.
Сега, ние искаме да се справят с герои. Ние искаме да изкарваме всеки индивидуален характер.
Когато искате да печатате с плаваща запетая, ще използвате контейнера като% е.
С вътр можете да използвате г%.
И така, по същия начин, с характер използвате% C, за да кажа, че отивам да печатате характер
, която се съхранява вътре в променлива.
Така че ние имаме това, и нека добавим период от време и пространство, за да го.
Кой герой използвате?
Отиваме да се използва какъвто и характер, ние сме на низа.
Тогава започваш да се използва нещо с низ,
но ние искаме да се достъп до определен характер.
Така че, ако низ е само масив, тогава как да достъп до елементите на масивите?
Ние имаме тези квадратни скоби, а след това ще се постави индекс там.
Така че ние имаме квадратни скоби. Нашия индекс в този случай можем само да мога да използвам. Точно така.
Така че тук ние казваме, че започваш да се отпечатване на знак, последван от точка и място,
и този характер ще бъде ItH писмо в нашия низ S.
Аз съм просто ще да спаси. Добре.
Сега отивам да тече дължина на низ.
Така че ние трябваше низ OMG, и сега се подчертае още повече.
По същия начин, нека кажем, че всъщност искате да получите низ от потребителя.
Как бихме могли да направим това?
Преди това, как стигнахме Int?
Казахме GetInt, нали? Но това не е INT, така че нека GetString.
Да направим дължина низ. Тук ние не влиза в определен ред.
Така че аз не знам.
Отивам да си сложа името тук и така след това мога да направя едно от тези неща
къде съм присвоите дума за всяка буква или нещо подобно. Cool.
Така че това е низ дължина.
Така че ние отново се връщаме на Цезар.
Ние имаме няколко инструменти за това как можем обхождане на низ,
как можем достъп до всеки отделен елемент.
Така че сега можем да се върнем към програмата.
Както споменах и преди, в ASCII таблица, най-добрия си приятел,
ти започваш да видите номера, които са свързани с всяка буква.
Така че тук се каже, ни прав текст е, че съм замаян!
След това всеки от тези символи ще има номер и ASCII стойност, свързана с него,
дори апостроф, дори пространството, дори удивителен знак,
така че вие ​​ще искате да запазите това в предвид.
Да предположим, че нашата основна че потребителят, включени в техния аргумент на командния ред, е 6.
Това означава, че за първото писмо, което е, което е представено от 73,
искате да се върнете към тях, каквото и писмо е представена от ASCII стойност от 73 + 6.
В този случай това би било 79.
Сега искаме да отидем към следващия знак.
Така че следващия в индекса 1 на текст ще бъде апостроф.
Но не забравяйте, ние само искаме да шифроване буквите.
Затова искаме да сме сигурни, че апостроф всъщност остава същата,
, че ние не се променят от 39 какъвто и да е 45.
Искаме да го пазят като апостроф.
Така че ние искаме да се помни само шифроване на буквите
защото искаме всички други символи, за да останат непроменени в нашата програма.
Друго нещо, което искаме е да се запази капитализация.
Така че, когато имате главна буква, тя трябва да остане като главни букви.
Малки букви трябва да остане като малки.
Така някои полезни функции, за да бъде в състояние да се справят с само enciphering писма
и запазване на капитализация на нещата
е isalpha, isupper, islower функции.
И така, това са функции, които връщат булева стойност.
По принцип, вярно или невярно. С главни букви? Буквено-цифров?
Дали това писмо, по същество.
Така че тук са три примера за това как можете да използвате тази функция.
По принцип, може да се провери дали стойността, върната от тази функция е вярно или невярно
въз основа на този вход.
Или да не пиша с шифър нещо или шифър или да се уверите, че това е с главни букви и др.
[Ученик] Можеш ли да обясни тези малко повече и как да ги използвате? >> Да, със сигурност.
Така че, ако погледнем назад, тук имаме Аз капитал, нали?
Така че ние знаем, че отива на О, защото аз + 6 е О.
Но ние искаме да се уверите, че това O ще бъде главно О.
Така че, общо взето, това е вид няма да се промени нашия принос.
Така че, дали тя е главна или не вид промени начина, по който се справяме с него.
Така че след това, ако ние използваме isupper функция на този конкретен индекс,
така isupper ("Аз"), който се връща за нас вярно, така че ние знаем, че това е горната.
Значи на базата на това, по-късно ние ще отидем във формула
, че ще се използва, за да премести нещата в Цезар,
така че след това в общи линии, там ще бъде малко по-различна формула, ако това е главна
за разлика от малки. Направи ли смисъл?
Да. Не се тревожете.
Говорил съм малко за добавяне на 6 писмо, което не съвсем смисъл
с изключение на случаите, когато ние вид на разбирането, че тези символи
са вид на взаимозаменяеми с числа.
Какво правим ние вид използване имплицитно леене.
Ние ще отидем в леене малко по-късно от това къде стойност и да го превърнеш в друг вид
отколкото първоначално е била.
Но с тази pset ние ще бъдем в състояние да вид взаимозаменяемо използвате знаци
и съответните им целочислени стойности.
Така че, ако просто Покривам характер само с единични кавички,
тогава вие ще бъдете в състояние да работят с него с цели числа, занимаващи се с нея като цяло число.
Така столицата C се отнася до 67. Малки букви е се отнася до 102.
Отново, ако искате да знаете тези стойности, погледнете в ASCII таблицата.
Така че нека да отидем в някои примери за това как може да бъде в състояние да се изважда и се добавят,
начина, по който всъщност наистина могат да работят с тези символи, да ги използват като взаимозаменяеми.
Казвам, че се случва да се изчисли допълнение на герой до цяло число ASCIIMath
и след това показва полученият характер, както и произтичащото от ASCII стойност.
И така, ето аз казвам, - we'll се занимават с тази част по-късно -
но основно, аз казвам, че потребителят трябва да кажа, работи ASCIIMath заедно с ключ,
и аз казвам, че този ключ ще бъде номер
, с които отиваме да добавите този герой.
Така че тук забележите, че тъй като аз съм искат ключ,
тъй като аз съм взискателни, че те ще ми даваш 1 нещо,
Искам само да приеме. / Asciimath и ключ.
Така че аз отивам да поиска argc е равно на две.
Ако не е, тогава аз ще се върне 1 и програмата ще излезете.
Така че аз казвам, че ключът не ще бъде първият аргумент на командния ред,
, че това ще бъде втората, и както виждате тук,
Отивам да го превърне в цяло число.
Тогава аз отивам да се определи характера да бъде R.
Обърнете внимание, че типът на променливата CHR всъщност е цяло число.
Начинът, по който аз съм в състояние да използват R като цяло число е като го обшивка с тези единични кавички.
Така че обратно към ФОРМАТ нашите Изявление където имаме контейнер за символ
и след това контейнер за цяло число,
герой е представен от Chr и число е ключът.
И така, след това отиваме в резултат добавете 2 заедно.
Така че ние ще добавим R + каквото и да е клавиш,
и след това отиваме да отпечатате резултат на това.
Така че нека направим asciimath. Това е към днешна дата, така че нека просто стартирате asciimath.
О, но виж, не направи нищо, защото ние не всъщност го даде ключ.
Така че, когато тя просто връща 1, основната ни функция, тя просто връща обратно към нас.
Така че след това да премине в ключ. Някой да ми даде номер. >> [Ученик] 4.
4. Добре.
Така че R е увеличил с 4 ще ни даде V, което съответства на ASCII стойността на 118.
Така то тогава има смисъл, че -
Всъщност, мога да ви попитам, какво мислиш ASCII стойността на R е, ако R + 4 е 118?
Тогава да, R е 114.
Така че, ако търсите на ASCII таблица тогава, разбира се, вие ще видите, че R е представена от 114.
Така че сега ние знаем, че можем да добавим числа до знака, това изглежда доста проста.
Ние просто ще за обхождане на низ, както видяхме в пример преди.
Ние ще проверим дали това е писмо.
Ако е така, тогава ние ще го смени от каквото и да е ключ.
Доста проста, с изключение на случаите, когато можете да се харесва това,
ще видите, че Z, представлявано от 122, а след това ще ви даде различен характер.
Ние всъщност искаме да останем в рамките на нашата азбука, нали?
Така че ние трябва да разбера някакъв начин от този вид обвивка около.
Когато стигнете до Zed и искате да се увеличи с определен брой,
не искате да отидете в извън ASCII раздел азбука;
искате да приключи назад чак до А.
Но имайте предвид, че все още запазване на случая.
Така че, знаейки, че буквите не може да стане символи
само като символи няма да се променя, както и.
В последния pset вие определено не трябва да
но опция е да се приложи алчни pset с помощта на модул функция.
Но сега ние всъщност ще трябва да използвате модул,
така че нека просто отиди това малко.
По същество, когато имате х модул Y, която ви дава остатъка от х разделени от години.
Ето няколко примера тук. Ние имаме 27% 15.
По принцип, когато се изважда 15 от 27 толкова пъти, колкото е възможно, без да се отрицателен
тогава можете да получите 12 ляво.
Така че това е нещо като в контекста на математиката, но как всъщност можем да използвате тази?
Това ще бъде полезно за нашия wrapover.
За това, нека просто кажем, че ви помолих да се разделят на три групи.
Понякога можете да направите това в групи и нещо подобно.
Кажа, че каза: "Добре, аз искам всичко да бъде разделена на три."
Как може да направите това?
[Чува студент отговор] Да, точно така. Пресметни. Добре.
Нека всъщност направи това. Искате ли да започнем?
[Студенти броене 1, 2, 3, 4.
Но не забравяйте, ... >> [Ученик] О, съжалявам.
Това е наистина добра точка.
Ти каза, че на 4, но ние всъщност искаме да кажем 1, защото искат само три групи.
И така, как - Не, това е наистина добър пример, защото тогава как може да ви кажа 1?
Каква е връзката между 4 и 1?
Е, 4 мод 3 е 1.
Така че, ако продължи, ще бъде 2.
Така че ние имаме 1, 2, 3, 1, 2.
Отново сте всъщност 5-ти човек. Как ли да кажа две вместо на 5?
Вие казвате, 5 мод 3 е 2.
Искам да видя колко са останали групи от по 3, а след това в какъв ред аз
И така, след това, ако ние продължихме по цялата стая,
тогава ние ще видим, че ние сме винаги действително прилагане на Министерството на отбраната функция за себе си
вид броиш.
Това е по-мила на реален пример за това как бихте могли да използвате модул
защото аз съм сигурен, че повечето от нас вероятно са преминали през този процес
където сме имали за да броиш.
Всички въпроси по модул?
Това ще бъде доста важно да се разбере концепции за това,
така че искам да се уверете, че вие ​​разбират.
[Ученик] Ако няма остатъка, е да ви даде действителния брой?
Ако един от първите 3 от тях са го направили, ще го да ги даде това, което са в действителност,
или би им дал чува] >> Това е добър въпрос.
Когато няма остатъка за модул - така казват, че имат 6 мод 3 -
, които всъщност ви дава върне 0.
Ще говорим за това малко по-късно.
О, да, например, 3-ти човек - 3 мод 3 всъщност е 0, но тя каза 3.
Така че това е нещо като вътрешна улов, например,
като добре, ако Министерството на отбраната е 0, тогава аз ще бъде на 3-ти човек.
Но ние ще влязат в вид как бихме могли да искат да се занимават с това, което 0 е по-късно.
Така че сега ние трябва по някакъв начин начин за картографиране на Zed надясно писмо.
Така че сега сме преминали през тези примери,
ни се види как може да работи Цезар.
Ще видите две азбуки и след това можете да ги видите преместване.
Така че нека да се опитаме и да изразят, че по отношение на формулата.
Тази формула е в спец.
но нека вид изглежда чрез това, което всяка променлива означава.
Нашата Крайният резултат ще бъде ciphertext.
Така че това казва, че ItH характер на ciphertext
ще отговарят на ItH характер на прав текст.
Това има смисъл, защото искаме винаги да се редят на тези неща.
Така че това ще бъде ItH характер на ciphertext плюс К, който е наш ключов
че има смисъл - и тогава ние трябва този мод 26.
Забравяйте, когато имахме Zed
ние не искате да получите в характера, така че ние искахме да го моден
и вид на разгънатата азбуката.
След Zed няма да отида в, б, в, г, докато имаш правилния брой.
Така че ние знаем, че Zed, ако + 6, ще ни даде е, защото след Zed идва а, б, в, г, д, е.
Така че нека да не забравяме, ние знаем със сигурност, че Zed + 6 ще ни даде е.
В ASCII стойности, Z е 122 и е 102.
Така че ние трябва да намерим някакъв начин да ни Цезар формула ни дават 102
, след като в 122.
Така че, ако ние просто прилага тази формула, ("Z" + 6) 26%, че всъщност ви дава 24
тъй като сто двайсет и две + 6 128; 128% 26 ви дава 24 остатъка.
Но това не означава наистина е. Това определено не е 102.
Това също не е на 6-та буква в азбуката.
Така че, очевидно, трябва да има някакъв начин на това малко променя.
В отношение на редовното азбука, ние знаем, че щ е и е 26-ти писмо е 6-та.
Но ние сме по компютърни науки, така че ние ще индекс на 0.
Тогава вместо Z е номер 26, ние отиваме да се каже, че е номер 25
защото е 0.
Така че сега да приложим тази формула.
Имаме Z представлявана от 25 + 6, която ви дава 31.
31 мод 26 ви дава 5 като остатък.
Това е перфектно, защото знаем, че е е 5-та буква в азбуката.
Но това все още не е е, нали? Все още не е 102.
Тогава за тази pset, предизвикателство ще се опитва да открие връзката
между конвертиране между тези ASCII стойности и азбучен показалец.
Същество, което вие ще искате да направите, вие искате да започнете с ASCII стойности,
но след това искате по някакъв начин да превежда, че в азбучен указател
след това се изчисли какво писмо трябва да бъде - в общи линии, какво азбучен индекс е
шифър характер - след това превежда, че обратно на ASCII стойности.
Така че, ако извадите ASCII таблицата, а след това се опита да намерите връзки между, да речем, 102 и 5
или 122 и 25.
Съм намерила ключа от аргументите на командния ред, сме придобили прав текст,
сме го кодирана.
Сега всичко, което остава да направите, е да го отпечатате.
Можем да го направим няколко различни начини.
Какво можем да направим, е действително печата като отидем заедно.
Както обхождане на героите в низ
бихме могли просто да отпечатате точно тогава, когато ние го изчисли.
Алтернатива, можете да го съхранявате в масив и имат за масив от знаци
и в края обхождане на целия този масив и го разпечатате.
Така че имате няколко опции за това.
И не забравяйте, че% ще бъде в контейнера за печат характер.
Така че ние имаме Цезар, а сега да преминем към Vigenere,
който е много подобен на Цезар, но просто малко по-сложна.
Така че по същество с Vigenere се ти започваш да се минава по ключова дума.
Така че, вместо на брой, ти започваш да има низ,
и така, че да действат като ключова дума.
След това, както обикновено, сте ще получите бърз низ от потребителя
и след това го шифроване и след това да им даде гръб ciphertext.
Така че, както казах, това е много подобен на Цезар, само че вместо изместване от определен брой,
номерът е всъщност няма да се промени всеки път от символ характер.
Да декларирате, че реалният брой да се смени, е представена от буквите на клавиатурата.
Така че, ако сте въвели в промяна, например, това би съответствало на изместване на 0.
Така че това е отново обратно към азбучния указател.
Какво може да бъде полезно, ако вие виждате, че ние всъщност се занимават с ASCII стойности
, както и писма, както и азбучен указател,
може да намери или да направите своя собствена ASCII таблица, която показва азбучен индекс от 0 до 25,
от А до Я, и ASCII стойности, така че можете да видите вид отношения
и скица и се опитайте да намерите някои модели.
Също така, ако сте били преместване в определен случай е -
и това е или малки или главни букви F - това би съответствало на 5.
Ние досега?
Формулата за Vigenere е малко по-различно.
По принцип, ще видите, че тя е точно като Цезар,
с изключение вместо просто к имаме к к форум.
Забележете, че ние не използвам, защото по същество, дължината на ключовата дума
не е задължително дължината на нашата ciphertext.
Това ще бъде по-ясно малко, когато виждаме пример, че имам малко по-късно.
По принцип, ако изпълнявате вашата програма с ключова дума на Ohai
това означава, че всеки път, Ohai ще бъде смяната си.
Така че в зависимост от каква позиция сте във вашата ключова дума,
ти започваш да смени своя определен характер ciphertext с тази сума.
И отново, точно като Цезар, ние искаме да сме сигурни, че запази капитализация на нещата
и ние само шифроване писма, а не, знаци или интервали.
Така че, да погледнем назад към Цезар за функциите, които може да са използвани,
начина, по който сте решили как да се смени неща, и се прилагат, че вашата програма тук.
Така че нека Карта това.
Имаме прав текст, че сме придобили от потребителя, от GetString
казват, че това ... е CS50!
Тогава ние имаме ключова дума на Ohai.
Първите четири знака са доста прости.
Ние знаем, че T ще бъде изместен от о,
след час ще бъде изместен от час, аз ще бъде изместен от.
Тук можете да видите, че представлява 0,
след края стойност всъщност е само една и съща буква, както и преди.
Тогава и се измества от аз.
Но тогава ще трябва тези периоди.
Ние не искаме да шифроване, че тогава ние не го промените от нищо
и ще отпечата само периода непроменени.
[Ученик] Аз не разбирам как да знаем, че това е изместен от теб - >> О, съжалявам.
На върха тук ще видите, че в командния ред Ohai аргумент тук,
, който ще бъде ключовата дума.
И така в общи линии, вие сте на велосипед през героите в ключовата дума.
[Ученик] така о ще се измества същото -
Така о съответства на определен номер в азбуката.
[Ученик] Точно така. Но къде взехте CS50 част?
О. Това е в GetString, където вие сте като "Дай ми низ да се кодират.
[Ученик] Те ще ви дам този аргумент, за да се премине от
и тогава ще питам за първата си низ. >> Да.
Така че, когато стартирате програмата, те ще включват ключова дума
в своите аргументи на командния ред, когато те го стартирате.
След като сте проверили, че те всъщност ви е дал 1 и не повече, не по-малко
тогава започваш да ги пита за низ, да речем, "Дай ми низ."
Така че това е мястото, където в този случай те ви даде Това ... е CS50!
Тогава започваш да използва това и да използвате Ohai и обхождане.
Забележете, че тук прескачат криптиране на периодите,
но по отношение на нашата позиция за Ohai следващия о.
В този случай това е малко трудно да се види, защото това е 4,
така че нека продължим малко. Просто се придържаме с мен тук.
Тогава ние имаме аз и, които след това се превежда от о и з.
Тогава имаме пространство, и така, тогава ние знаем, че няма да пиша с шифър пространство.
Но забележете, че вместо да ходят на точно тук, на това място,
ние сме криптиране - Аз не знам дали може да се види, че точно тук.
Така че това не е така всъщност предопределя, да речем, о отива тук, з отива тук,
А отива тук, аз тук, о, H, I, O, ч,, аз. Вие не правите това.
Трябва само да смени позицията си в ключовата дума
когато знаеш, че сте в действителност ще бъде криптиране действително писмо.
Ли този вид има ли смисъл?
Добре.
Така че просто някои напомняния.
Вие искате да сте сигурни, че сте само преминете към следващата буква търсената дума
ако герой в прав текст си е писмо.
Да предположим, че сме на о.
Забелязваме, че следващия знак, индексът съм на прав текст, е число, например.
Тогава не излагат J, индекса за нашата ключова дума, докато не достигнем друго писмо.
Отново, вие искате да сте сигурни, че обгръщаща до началото на ключовата дума
когато сте в края на това.
Ако виждате тук сме аз, следващия човек трябва да бъде о.
Така че ако искате да се намери някакъв начин да бъде в състояние да обгръщащ в началото на вашата ключова дума
всеки път, когато стигнат до края.
И така отново, какъв вид на оператора е полезно в този случай за опаковане на около?
Както и при преброяването на разстояние например.
[Ученик] знак за процент. >> Да, знака за процент, който е по модул.
Така модул ще дойде по-удобно, когато искате да приключи индекса във вашия Ohai.
И само един бърз съвет: Опитайте се да мисля за опаковане дума малко като преброяване на разстояние,
където, ако има три групи, 4-ти човек,
броят им, че те казаха е 4 мод 3, което е 1.
Така че опитайте и мисля за него по този начин.
Както видяхте във формулата, където имате Ci и след това пи, но след това KJ,
искате да се уверите, че можете да следите на тези.
Вие не трябва да го наричам, не е нужно да го наричат ​​J,
но вие искате да се уверите, че можете да следите позицията си, че сте във вашата прав текст
както и позицията, че сте най-търсената дума
защото тези, които не са непременно ще бъде същото.
Не само, че ключовата дума - може да бъде напълно различна дължина, отколкото прав текст си.
Също така, прав текст, цифри и символи,
така че няма да пасва най-добре заедно. Да.
[Ученик] Има функция, за да промените?
Можете ли да промените към капитала? >> Да, има определено.
Можете да проверите - Мисля, че е toupper, всички 1 дума.
Но когато се опитвате да шифър неща и запазване на текст,
най-добре е основно да има отделни случаи.
Ако това е главна, а след това искате да преместите от това
защото във вашата формула, когато погледнете назад начина, по който трябва да се вид движение
взаимозаменяемо между ASCII начин за представяне на числата
и действителната азбучен указател, ние искаме да се уверете, че
там ще бъде някакъв вид на модела, който ще използваме.
Друга бележка по образец, всъщност.
Ще категорично да се занимава с числа.
Опитайте се да не използвате магически числа, което е пример за стил.
Да предположим, че искате да всяко нещо с изместване на времето от искал -
Добре, така намек, друг спойлер е, когато ти започваш да се измества нещо
с определена сума, не се опитват да представят, че от действителния брой
, а по-скоро да пробвам и да видим, ако можете да използвате ASCII стойност, която вид ще направи повече смисъл.
Друга забележка: Защото си имаме работа с формули,
макар TF вид ще знам какъв модел може да се използва,
най-доброто във вашия вид коментари обясни логиката, като
"Аз съм с този модел, защото ..." и вид обясняват модел накратко вашите коментари.
[Това е репетиция 2] Ако няма други въпроси, тогава аз просто ще остана тук за малко.
Успех с вашия pset 2: Crypto и благодаря, че дойдохте.
[Ученик] Благодаря ви. >> Благодаря.
[Media Offline интро]