[Powered by Google Translate] [Walkthrough - Проблем Постави 2] [Zamyla Чан - Универзитетот Харвард] [Ова е CS50. CS50.TV] Во ред. Здраво на сите, и добредојде на можи 2. Прво, сакам да ви честитам за завршување pset 1. Знам дека би можел да биде малку тешко за некои од вас, можеше да биде вашиот прв компјутерска програма што го напиша, но само се сеќавам дека на крајот од ова, кога ќе се погледне назад на крајот на семестарот, ќе гледам pset 1 и ќе каже, "Еј, јас може да го направиле тоа во 5 минути." Па знам и верувам дека на крајот на оваа дефинитивно ќе се најде pset 1 прилично едноставна. Но сега за сега тоа е огромна остварување, и честитки за добивање направено. Сега, исто така, брз белешка пред да се влезе во месото од можи. Јас само сакам да се направи брзо ум дека јас понекогаш не ќе има доволно време во текот на walkthroughs да поминат низ секој начин на вршење на проблемот сет и наместо само можеби се фокусира на 1 или 2 вид на имплементации, начини на кои можете да го направите тоа. Но тоа не е да се каже дека се забранети од тоа го правам друг начин. Постојат често, како и со компјутерски науки, бројни начини на вршење на работите, и така дефинитивно се чувствуваат слободни да го користите различен тип на решение отколку што може да се претстави. [Pset 2: Крипто - Zamyla Чан - zamyla@cs50.net] [Pset2 - 0. Дел на прашања - 1. Цезар - 2. Vigenere] Во ред. Значи проблемот во собата 2: Крипто е забавно. Повторно, со секој pset ќе почне со делот на прашања тоа ќе биде спроведена во вашиот секции со вашите доделен настава колеги. Ние нема да поминат низ овие во текот на Walkthrough, но тие дефинитивно ќе ви помогне да заврши pset. Така, првиот дел од проблемот во собата е Цезар. И така во Цезар некој ќе ти донесе клуч со цел број, и ќе го криптирате низа на текстот што тие ви обезбеди и ги врати шифрирана работа. Ако некој гледаше Приказна Божиќ, има еден пример за тоа таму. Вториот дел од проблемот во собата е Vigenere, што е повеќе напредни енкрипција техника. И така ние ќе написвам со Воице парче на текст, освен наместо само со еден број, ние всушност ќе го кодираат со клучни зборови дека корисникот ќе ни овозможи. Океј, па првата алатка во алатникот денес е, всушност, ќе биде ажурирање на апаратот. На табла за дискусија ќе ги гледам работите како: "Зошто не оваа работа?" "Зошто не поднесе 50 работа?" и често решението е всушност само да се ажурира вашиот уред. И така, ако само ја стартувате во терминален прозорец во вашиот апарат sudo yum-y - тоа е знамето велејќи Да, ажурирање сè - ажурирање, тогаш вашата апаратот ќе се ажурира ако тоа биде потребно. И тоа не болеше, ако веќе се на најновата верзија на апаратот. Тогаш тоа само ќе каже не нови ажурирања располагање и може да продолжат да работат заедно. Но, ова е добро да се изврши дури и секој пат кога ќе го отворите уредот бидејќи ние сме се уште многу - понекогаш ако доаѓаме во бубачка - одредување на апаратот. Така бидете сигурни дека ќе имате најновата верзија на апаратот и да ја стартувате која се ажурира таму. Во ред. Па, бидејќи ние сме се занимаваат со букви и се менува, enciphering работи, ние ќе навистина сакате да станете најдобар пријател со нашите ASCII табелата. Постојат бројни оние онлајн, ако најде. Можеби дури и да направите свој. Во суштина, со секоја буква и секој број и секој карактер има голем број поврзани со нив, и така тоа е добро да се види нивните ASCII вредности заедно со вистинските писмо. Тоа дефинитивно ќе ви помогнат во проблемот во собата. Едно нешто што навистина ми помогна во овој проблем сет беше да всушност го испечатите, и како што се случува преку, јас всушност би се подготви за тоа, пишува: "Ако ова треба да оди до таму, тогаш ..." Вид на исцртување на него и го одбележи го, стануваат најдобри пријатели со вашиот ASCII табелата. Потоа имаме неколку други алатки на располагање. Овој пат наместо всушност се прашува корисникот за сите нивни влез ние ќе се направи комбинација. Ние ќе ги извести за некои влез, но ние сме, исто така, ќе да се само користење на командната линија аргументи. Значи, кога тие трчаат нивната програма, обично ќе речеш. / Hello, на пример, ако вашата програма е hello.c. Но овој пат наместо само велејќи дека, тие можат да стави зборови, аргументи потоа. И така ние ќе го користите она што тие поминуваат кај нас како нивниот придонес, како и, така се движат подалеку од само поради за цел број, но исто така со користење командната линија аргументи. А потоа ќе одиме во низи и жици, кој ќе биде со користење на многу како добро. Еве само еден пример од 1 мини ASCII табелата. Како што реков, секоја буква одговара на број, и така се запознаете со тоа. Тоа ќе ни се најде. А подоцна кога ќе почнете да правите некои ASCIIMath занимаваат со броеви - додавање, одземање нив - тогаш дефинитивно добро да се однесуваат на оваа шема. Па еве еден пример на шифра Цезар - нешто што може да се игра со. Тоа е само тркалото. Во суштина, постои надворешен азбука, а потоа постои внатрешен писмо. Значи тука е пример на шифра Цезар, но со клучот на 0. Во суштина, е усогласен со А, Б е усогласен со Б, па сè до З Но тогаш велат дека сакавме клучот на 3, на пример. Тогаш ќе ротираат на внатрешниот тркала, така што сега се усогласува со D, итн И така тоа е во суштина она што ние ќе треба да се направи. Ние немаме тркало, но она што ние ќе треба да направите е да ја направиме нашата програма вид на промена на азбуката заедно со нас одредена сума на броеви. Значи како што реков претходно, ние ќе треба да се занимаваат со командната линија аргументи како и добивање на број. Па начинот на кој корисникот ќе се кандидира на вашиот Цезар програма е велејќи. / Цезар а потоа влегуваат во бројот после тоа. А тој број претставува клуч, смена, колку пати сте ќе треба да се ротираат на внатрешниот воланот на Цезар број. И така да видите тука пример. Ако влеговме во букви од A до L во нашата Цезар шифра, тогаш тоа би влез D преку О, бидејќи тоа е секоја буква се префрли повеќе од 3 пати, само како пример на тркалото дека ви покажа. Па тогаш ако влезе, на пример, Ова е CS50! тогаш исто така ќе се движат сите букви. И тоа е важна работа во двете Цезар и Vigenere е дека ние ќе прескокнете над сите не-букви. Па празни места, знаци, итн, броеви, ние ќе ги задржиме истиот. Ние сме само ќе се префрлат на буквите во овој случај. Значи како што гледате во тркалото, ние само треба буквите достапни за нас, па ние само сакаат да ја префрлат на букви и криптирате букви. Така првото нешто да се направи, виде дека користењето на Цезар во проблем во собата 2 е да се кандидира на Цезар, а потоа внесете број, кога ќе го стартувате во терминал. Значи она што треба да направите е да некако се добие дека клучот и пристап до неа. И така ние сакаме некако да се види тоа се случува да биде вториот командата. Првиот е и ќе биде. / Цезар, а следниот ќе биде клучот број. Значи пред имавме int главната (празно) да се започне нашата C програми. Ние ќе лупам назад слој малку а всушност да се види дека наместо да се донесува во празнина на нашата главна функција ние сме всушност кои се занимаваат со 2 параметри. Имаме int име argc, а потоа низа од стрингови се нарекува argv. Значи argc е цел број, и претставува број на аргументи донесен во вашата програма. А потоа argv е всушност листата на аргументи предадена. Сите аргументи се стрингови, и така argv претставува низа, листа, на стрингови. Ајде да зборуваме за низи малку. Низи се во суштина нови податоци структура. Имаме ints, имаме двојки, имаме жици, а сега имаме низи. Низите се структури на податоци кои можат да имаат повеќе вредности од ист тип, Значи во суштина, листа од било каков тип сакате. Во суштина, ако сакаше листа на цели броеви сите во 1 променлива, тогаш ќе се создаде нова променлива дека беше од типот int низа. Така низите се нулто индексирани, односно првиот елемент на низата е во индекс 0. Ако низата е на 4 должина, како во овој пример, тогаш вашата последниот елемент ќе биде во индекс 3, кој е 4-1. Па да се создаде низа, што би направиле вакво нешто. Кажи си сакал двојна низа. Ова важи и за било кој тип на податочен тип, иако. Значи речеме дека сакате двојно низа. Велат дека сакате да го наречеме поштенско сандаче. Исто како што ќе се иницијализира сите други двојно, би рекол двокреветни и тогаш името, но овој пат ќе стави загради, а потоа бројот што ќе биде должината на низата. Забележете дека во низи никако не смееме да ја промените должината, така што секогаш треба да се дефинираат и да изберете колку кутии, колку вредности вашиот низа ќе се одржи. Така да го поставите различни вредности во вашиот низа, ви се случува да го користите овој следнава синтакса, како што гледате на слајд. Имате сандаче индекс 0 ќе биде поставена на 1,2, сандаче индекс 1 сет на 2,4, итн Па сега дека ги видиш низи малку, да се вратиме на argc и argv. Ние знаеме дека argv сега е низа од стрингови. Значи, кога корисник поминува во - велат тие се извршува програма - велат тие. / Здраво Дејвид Malan, што на програмата ќе направи за вас веќе е всушност излезе со она што се argc и argv. Значи, вие не треба да се грижите за тоа. Argc во овој случај ќе биде 3 бидејќи гледа 3 различни зборови одделени со празен простор. И така, тогаш низата во овој пример, првиот индекс ќе биде. / Здраво, следниот Давид, следниот Malan. Дали некој се види веднаш она што односот помеѓу argv,  низа, и argc е? Да. Ќе навлегувам во тоа во еден пример во args.c. Ајде да видиме дали можеме да ги искористат предностите на односот помеѓу 2. Овде можете да најдете дека во апаратот стандардната апликација да се отвори. в датотеки понекогаш е Emacs. Но, ние сакаме да се справи со gedit, така што можете да направите е да десен клик на вашиот C датотека, одете на Properties, Отвори со и потоа изберете gedit, Set as default, и сега вашата програма треба да се отвори во gedit наместо Emacs. Совршена. Па еве јас имам програма со која сакам да се печати секоја командата. Значи без оглед на корисник влезови, сакам да суштина се врати назад кон нив во нов ред. Значи она што е структура која може да се користат да iterate во текот нешто - нешто што најверојатно се користат во вашата pset 1? Ако сакате да поминат низ одреден број на нештата? >> [Студент] За јамка. За јамка. Точно. Значи, да почнеме со за телефонска линија. Имаме за int i = 0. Ајде само да почне со стандарден иницијализација променлива. Одам да го напушти услов за собата, а потоа велат i + +, ќе се прават работите таму. Во ред. Толку размислување назад кон argv, ако argv е листа на аргументи предадена во програмата и argc е бројот на аргументите во програмата, тогаш тоа значи дека argc е суштина на должината на argv, десно, бидејќи таму се случува да биде многу аргументи како вредност на argc. Значи, ако сакаме да iterate над секој елемент во argv, ние ќе сакате да го секој пат пристапите на променлива во argv на дадената индекс. Кои можат да бидат претставени со ова, нели? Оваа променлива тука претставува особено стринг во овој случај затоа што тоа е стринг низа - особено стринг во тој даден индекс. Она што сакаме да го направиме, во овој случај сакаме да го испечатите, па да речеме printf. И сега argv е стринг, па сакаме да се стави дека случаеви таму. Сакаме нова линија само за да го направите да изгледа добро. Значи тука имаме за телефонска линија. Ние немаме состојбата уште. Па јас започнува од 0, а потоа секој пат кога тоа се случува да се печати дадениот стринг во тој одреден индекс во низа. Значи, кога сакаме да се запре печатење елементи во низата? Кога ќе завршите, нели? Кога сме стигнале до крајот на низата. Значи ние не сакаме да се надмине минатото на должината на низата, и ние веќе знаеме ние не треба да всушност активно да дознаете што должината на argv е затоа што тоа е дадено на нас, и што е тоа? Argc. Точно. Затоа сакаме да се направи овој процес argc број на пати. Јас не сум во право директориум. Во ред. Сега ајде да аргументи. Нема грешки, што е одлично. Па да се кандидира аргументи. Што е ова се случува да се вратат во нас? Тоа е само случува да се печати назад. "Ти внесуваат аргументи во програмата, јас одам да го даде назад кон вас." Па да речеме ние сакаме да се каже аргументи тогаш foo бар. Па тогаш тоа отпечатоци од назад кон нас. Во ред? Па таму е пример за тоа како можете да го користите argc и argv знаејќи дека argc претставува должината на argv. Бидете сигурни дека ќе не некогаш со низи пристап еден надвор од должината на низата бидејќи C дефинитивно ќе викне во вас. Ќе добиете нешто што се нарекува сегментација грешка, која никогаш не е забавно, во основа велејќи дека се обидувате да пристапите нешто дека не постои, не му припаѓа на тебе. Така бидете сигурни, а особено со нулто индексирање, ние не сакаме да - Како на пример, ако имаме низа со должина од 4, дека низа индекс 4 не постои затоа што со почеток во 0, на нула индекс. Таа ќе стане втора природа исто како за петелки кога ќе почнеме на 0. Па само задржи дека во умот. Вие не сакате да некогаш пристап до индексот на низа која е надвор од дофат. Така можеме да видиме сега како можеме вид на пристап на командната линија аргументи кои се пренесуваат внатре Но, како што видовме низа, argv е всушност низа од стрингови. Значи тоа не е всушност целобројна уште, но во Цезар сакаме да се справи со цели броеви. За среќа, постои функција креиравте за нас кои, всушност, може да конвертирате стринг за да цел број. Исто така, тука ние не се занимаваат со корисник влез каде што ние ги прашува за влез тука за клуч, па ние всушност не можат да reprompt и да каже, "Ах, дај ми уште една цел број, да речеме, ако тоа не е валидна." Но, ние се уште треба да се провери за правилната употреба. Во Цезар тие се само дозволено да помине во 1 број, и така тие треба да се кандидира. / Цезар, а потоа тие треба да ви даде број. Значи argc мора да биде одреден број. Што бројот што ќе биде ако тие имаат да ви помине. / Цезар, а потоа клуч? Што е argc? >> [Студент] 2. >> Два. Точно. Значи сакате да бидете сигурни дека argc е 2. Инаку вие во основа одбиваат да ја стартувате програмата. Во главниот тоа е функција која вели int главната, па тогаш ние секогаш добра пракса Врати 0 на крајот на успешна програма. Значи, ако, да речеме, тие ви даде 3 командната линија аргументи, наместо од 2 или да ви даде 1, на пример, тогаш она што ќе го направите е ќе сакате да се провери за што а потоа се врати 1 велејќи, не, не можам да се продолжи со оваа програма. [Студент] Не може да биде простор во вашиот текст. >> Опроштение? [Студент] Не може да биде простор во текстот што се обидуваш да го криптирате. Ах! Во однос на текстот што ние се обидуваме да го криптирате, кои, всушност, доаѓа подоцна кога ние им даде тој текст. Па сега ние сме само прифаќање како команда аргументи вистинскиот број, вистинската промена за енкрипција Цезар. [Студент] Зошто ви е потребна 2 за разлика од само 1 argc? Таму е дефинитивно 1 број. Право. Причината зошто ние треба 2 за argc, наместо на 1 е затоа што кога ќе ја стартувате програмата и да каже. / Цезар или. / здраво, кои, всушност, се брои како командата. Па тогаш што веќе трае до 1 и е така, тогаш ние сме внесување 1 екстра. Па ти си внесување всушност стринг со командата. Што сакате да направите, за Цезар сакаме да се справи со број, за да можете да ја користите оваа функција atoi. И во основа, ќе помине тоа во низа, а потоа тоа ќе ви се вратат назад целобројна ако тоа е можно да се направи тоа стринг во цел број. Сега се сеќавам кога ние сме се занимаваат со printf или GetString, работи како што, ние го вклучите библиотеките кои се специфични за нас. Значи на почетокот ние започнуваме со хаш таг стандард I / O,. Часот, нешто слично. Па, atoi не е во една од оние библиотеки, Значи она што треба да направите е ние треба да го вклучува правото библиотека за тоа. Значи се потсетиме назад кон можи 1, каде што разговараа за рачна функција. Можете да напишете човек во вашиот терминал, а потоа по што следи името на функцијата. И така што ќе доведе до цела листа на неговото користење, но и тоа ќе донесе до која библиотека која припаѓа. Затоа јас ќе оставам на вас да го користите прирачникот функција со atoi и дознаам која библиотека треба да се вклучат за да може да се користи atoi функција. Значи имаме клучот и сега станува збор за добивање на обичен текст, и така што, всушност, се случува да биде корисник влез, каде што прашува. Ние се занимаваа со GetInt и GetFloat, и така во иста насока ние ќе треба да се занимаваат со GetString. Но, во овој случај, ние не треба да направите било направите додека или додека петелки да се провери. GetString дефинитивно ќе ни даде стринг, и ние ќе го криптирате што корисникот ни дава. Па може да се претпостави дека сите овие корисникот влезните низи се точни. Велики. Па потоа еднаш имаш клучот и еднаш имаш текст, сега што е лево е мора да написвам со Воице на чист текст. Само брзо покриваат над Жаргон, на чист текст е она што корисникот ти дава, и ciphertext е она што го вратат во нив. Значи жици, за да може да се оди преку, всушност, буква по буква бидејќи ние треба да се сврти секој писмо, ние разбираме дека стрингови, ако ние вид на кора назад слој, гледаме дека тие се само навистина листа на карактери. Еден збор по друг. И така ние може да го третира низи како низи, бидејќи тие се низи од карактери. Па да речеме дека имате низа наречен текст, и во рамките на таа променлива текст се чуваат Ова е CS50. Потоа текст во индекс 0 ќе биде главен град на T, индекс 1 ќе биде часот, итн А потоа со низи, во argc пример во args.c, видовме дека моравме да iterate преку низа и па моравме да iterate од i = 0 до i е помала од должината. Па ние треба некој начин на пронајдат она што должината на нашите стринг е ако си оди за да iterate над неа. За среќа, повторно, постои функција таму за нас, иако подоцна во CS50 вие дефинитивно ќе бидат во можност да се имплементираат и направете ја вашата сопствена функција која може да се пресмета должината на стрингот. Но сега за сега ние ќе треба да користите стринг должина, па strlen. Ќе помине во низа, а потоа тоа ќе ви се врати int кој претставува должината на стрингот. Ајде да погледнеме еден пример за тоа како ние би можеле да бидат во можност да iterate над секој лик во серијата и направи нешто со тоа. Она што сакаме да направите е да iterate во текот секој карактер на стрингот, и она што сакаме да направите е да се печати назад секој лик 1 од 1 освен ние додадете нешто веднаш до неа. Значи, да почнеме со за телефонска линија. Int i = 0. Ние ќе се остави простор за состојбата. Ние сакаме да iterate додека не стигне до крајот на стрингот, нели? Па тогаш што функција ни дава должината на стрингот? [Нечујни студент одговор] Тоа е должината на командната линија аргументи. Но, за низа сакаме да се користи функцијата што ни дава должината на стрингот. Значи тоа е стринг должина. И така, тогаш мора да помине во низа на него. Таа треба да знае што стринг треба да се пресмета должината на. Па тогаш во овој случај ние сме се занимаваат со низа s. Велики. Па тогаш она што сакате да го направите, нека printf. Сега, ние сакаме да се справи со ликовите. Ние сакаме да се печати секој индивидуален карактер. Кога сакате да се печати една плови, ќе се користи случаеви како% f. Со int ќе се користи% d. И така слично, со карактер користите% c за да се каже јас ќе одам да се печати карактер тоа е се чуваат во променлива. Значи ние треба ова, и ајде да додадете период и простор за тоа. Кој карактер сме користите? Ние ќе биде со користење на било карактер сме во на стрингот. Па тогаш ние ќе треба да се користи нешто со стринг, но ние сакаме да се пристапува на одредени карактер таму. Значи, ако стрингот е само низа, тогаш како ние да пристапите елементи на низите? Имаме оние загради, а потоа го ставаме на индексот во таму. Значи имаме квадратни загради. Нашиот индекс во овој случај ние само може да го користам. Точно. Значи тука сме велејќи дека ние ќе треба да се печати карактер проследено со точка и простор, и дека карактерот ќе биде о писмо во нашата низа s. Јас сум само ќе се спаси тоа. Во ред. Сега ќе одам да се кандидира стринг должина. Значи имавме низа наречен ОМГ, а сега тоа е нагласена дури и повеќе. Слично на тоа, да речеме ние, всушност, сакате да добиете низа од корисникот. Како да го направите ова? Пред тоа, како не се добива int? Рековме GetInt, нели? Но, тоа не е цел број, па ајде GetString. Да се ​​направи стринг должина. Еве ние не влезе во одредена линија. Па јас не знам. Одам да се стави моето име тука и така тогаш можам да направам една од оние работи каде што доделите збор за секоја буква или нешто слично. Кул. Значи тоа е стринг должина. Значи ние сме назад кон Цезар. Имаме неколку алатки за тоа како ние iterate во текот на еден стринг, како ние пристап секоја индивидуа елемент. Па сега можеме да се вратиме на програмата. Како што веќе напоменав претходно, во ASCII табелата, вашиот најдобар пријател, сте ќе видите броеви кои се поврзани со секоја буква. Значи тука велат нашите чист текст е јас сум вртоглавица! Тогаш секој од овие ликови ќе имаат голем број и ASCII вредност поврзани со него, дури и апостроф, дури и просторот, дури и извичник, па ќе сакате да го задржи дека во умот. Така велат нашите клучни дека корисникот вклучени во нивната командна линија аргумент е 6. Тоа значи дека за прв писмото, кое е јас, која е претставена од 73, дека сакате да го вратат во нив она што писмото е претставена со ASCII вредност од 73 + 6. Во овој случај тоа ќе биде 79. Сега ние сакаме да одиме на следниот знак. Значи следниот во индекс 1 од чист текст ќе биде апостроф. Но запомнете ние само сакаме да написвам со Воице на букви. Значи, ние сакаме да се осигураме дека апостроф всушност останува иста, дека ние не се менуваат од 39 до она што 45 е. Ние сакаме да го чуваме како апостроф. Значи, ние сакаме да се сетам на само написвам со Воице буквите бидејќи сакаме сите други симболи за да останат непроменети во нашата програма. Друга работа е што ние сакаме е да се зачува капитализација. Значи, кога имате големи писмо, тоа треба да остане како големи. Lowercases треба да остане како мали букви. Па некои корисни функции да бидат во можност да се справи со само enciphering букви и да ја задржите зачувување на капитализација на работите е isalpha, isupper, islower функции. И така тие се функции кои ќе се вратите Булова вредност. Во суштина, точно или неточно. Дали е ова големи? Дали е ова алфанумерички? Дали е ова писмо, во суштина. Значи тука се 3 примери за тоа како ќе ја користат таа функција. Во суштина, ти би можел да тестира дали вредноста се врати за вас од таа функција е точно или неточно врз основа на таа влез. Или не написвам со Воице нешто или шифра неа, или да бидете сигурни дека тоа е големи, и др [Студент] Може ли само објасни оние малку повеќе и како вие ги користите? >> Да, сигурно. Значи, ако се погледне назад, тука имаме капитал I, нели? Па знаеме дека оди О, бидејќи јас + 6 е O. Но, ние сакаме да бидете сигурни дека тоа О ќе биде главен О Значи, во основа, тоа е вид на ќе се смени нашиот влез. Значи без разлика дали е големи букви или нема вид на промени начинот на кој ние се справи со неа. Па тогаш ако ние ги користиме на isupper функција на тој конкретен индекс, па isupper ("јас"), кој се враќа за нас вистина, па знаеме дека тоа е горниот. Па тогаш врз основа на кои подоцна ќе одиме во формула што ќе биде со користење на смена работите во Цезар, па потоа во основа, таму ќе биде малку поинаков формула, ако тоа е големи за разлика од мали букви. Смисла? Да. Не се грижи. Зборував малку за додавање 6 на писмото, кое сосема не се направи смисла освен кога вид на разберат дека овие карактери се вид на заменлив со цели броеви. Што правиме е ние вид на употреба имплицитна кастинг. Ќе одиме во кастинг малку подоцна кога ќе се земе вредноста и да го претвори во различен тип отколку што првично беше. Но, со тоа pset ќе бидат во можност да се вид на заемно користат букви и нивните соодветни целобројни вредности. Значи, ако сте едноставно градат лик со само еден цитати, тогаш ќе бидат во можност да работи со него со цели броеви, кои се занимаваат со тоа како цел број. Значи главниот град Ц се однесува на 67. Мали ѓ однесува на 102. Повторно, ако сакате да знаете овие вредности, погледнете во вашата ASCII табелата. Па ајде да одиме во некои примери за тоа како може да биде во можност да одземе и додаде, како може да всушност навистина работат со овие ликови, ги користат наизменично. Велам дека ASCIIMath се случува да се пресмета додавање на карактер на цел број а потоа ги прикажува произлегуваат карактер, како и резултантните ASCII вредност. И така еве јас велам - we'll се занимаваат со овој дел подоцна - но во основа, јас велам дека корисникот треба да каже работи ASCIIMath заедно со клуч, и јас велам дека тој клуч ќе биде бројот со кој ние ќе го додадете ова карактер. Значи тука се забележи дека, бидејќи јас сум барајќи клуч, бидејќи јас сум барајќи дека тие ми даде 1 работа, Јас само сакам да се прифати. / Asciimath и клуч. Па ќе одам да бара argc е еднаков на 2. Ако не е, тогаш јас ќе одам да се врати 1 и програмата ќе излезе. Значи сакам да кажам дека клучот не се случува да биде првиот командната линија аргумент, тоа ќе биде вториот, и како што гледате овде, Одам да се претвори дека во цел број. Потоа јас ќе одам да се постави карактер да биде r. Забележете дека типот на променлива Chr е всушност стои цел број. Начинот на кој јас сум во можност да го користите r како цел број е со обвивка со овие единечен наводник. Па назад кон нашите printf изјава каде што имаме случаеви за лик а потоа случаеви за цел број, карактер е претставен со Chr и број е клучот. И така, тогаш ние ќе треба да се резултат додадете 2 заедно. Па ние ќе додадете r + она што клучот е, а потоа ние ќе печати резултатот од тоа. Значи, да се направи asciimath. Тоа е до датумот, па да се кандидира asciimath. О, но види, тоа не го стори ништо, бидејќи ние всушност не го даде клучот. Така, кога само што се врати 1, нашата главна функција, таа само што се врати назад кон нас. Па тогаш нека помине во клучот. Некој ми даде број. >> [Студент] 4. 4. Во ред. Значи r се зголеми за 4 ќе ни даде V, што соодветствува со ASCII вредност од 118. Па тогаш тој вид на прави смисла дека - Всушност, можам да ве прашам, што мислите на ASCII вредност на r е ако r + 4 е 118? Тогаш да, r е 114. Значи, ако се погледне на ASCII табелата, тогаш, секако, ќе видите дека r е претставена со 114. Па сега дека знаеме дека можеме да додадете броеви да карактери, ова изгледа прилично едноставна. Ние сме само ќе iterate преку жиците како што видовме во примерот пред. Ние ќе провери дали тоа е писмо. Ако е така, тогаш ние ќе го префрлат од она што клучот е. Прилично едноставна, освен кога ќе стигнете до допаѓа ова, ќе видите дека z, застапуван од 122, тогаш ќе ви даде друг карактер. Ние всушност сакаат да останат во нашата азбука, нели? Значи ние треба да дознаам некој начин на вид на завиткување околу. Кога ќе стигнат до Zed и сакате да се зголеми за одреден број, не сакаат да одат во и надвор од ASCII азбука дел; сакате да ја заврши назад сè до А Но, имајте на ум дека се уште зачувување на случајот. Па знаејќи дека писмата не може да стане симболи исто како симболи не се случува да се менува, како и. Во последните pset вие дефинитивно не треба да се, но опција беше да се спроведе вашите алчен pset со користење на модулот функција. Но сега ние сме всушност ќе треба да користите модул, па да одиме во текот на овој малку. Во суштина, кога имате x modulo y, кој ви дава остатокот од х поделен со y. Еве некои примери тука. Имаме 27% 15. Во суштина, кога ќе одземе 15 од 27 онолку пати колку што е можно без да се негативни тогаш ќе добиете 12 останати. Значи тоа е вид на како во математика контекст, но како може да ние всушност го користите овој? Тоа ќе биде корисно за нашата wrapover. За ова, да речеме прашав сите да поделат во 3 групи. Понекогаш ќе го направите ова во групи и нешто слично. Велат дека реков: "Океј, сакам сите да бидат поделени во 3." Како можете да го направите тоа? [Нечујни студент одговор] Да, точно. Грофот исклучени. Во ред. Да, всушност го направите тоа. Дали сакате да започнете? [Студенти одбројува] 1, 2, 3, 4. Но, се сеќавам ... >> [Студент] О, извинете. Тоа е навистина добра точка. Ти рече 4, но ние всушност сакаме да кажеме 1 бидејќи ние само сакаме 3 групи. Па тогаш, како - Не, тоа е навистина добар пример бидејќи тогаш како може да се каже 1? Што е односот помеѓу 4 и 1? Па, 4 МО 3 е 1. Значи, ако продолжи, ќе биде 2. Значи имаме 1, 2, 3, 1, 2. Повторно, вие сте всушност 5th лице. Како да знаете да се каже 2 наместо на 5? Велите 5 МО 3 е на 2. Сакам да видам колку групи на 3 се оставени над, а потоа кој редослед јас сум И така тогаш ако продолжи по целата соба, тогаш ќе видите дека ние сме секогаш, всушност, примена на современи функција да се да се вид на брои надвор. Тоа е повеќе вид на материјални пример за тоа како можете да го користите модул бидејќи сигурен сум дека повеќето од нас веројатно помина низ тој процес каде што имавме да се избројат исклучени. Било какви прашања на модул? Тоа ќе биде многу важно да се разбере концептите на ова, па сакам да бидете сигурни дека вие момци се разбере. [Студент] Ако не постои остатокот, дали тоа ви даде вистинската бројка? Ако еден од првите 3 од нив го сториле тоа, тоа ќе им даде она што тие всушност биле, или тоа ќе ги даде [недоловим] >> Тоа е добро прашање. Кога не постои остатокот за модул - така велат дека имаат 6 МО 3 - што всушност ви дава назад 0. Ќе зборуваме за тоа малку подоцна. Oh yeah, на пример, 3 лице - 3 МО 3 е всушност 0 но таа рече 3. Значи тоа е вид на како внатрешен фатат, на пример, како добро, ако МО е 0 тогаш јас ќе одам да биде 3 лице. Но, ние ќе дојдеме во вид на како да сакаат да се занимаваат со она што 0 е подоцна. Па сега можеме некако имаат начин на мапирање на Zed на правото писмо. Така, сега сме поминале низ овие примери, Ние вид на се види како Цезар би можеле да работат. Гледаш 2 азбуки, а потоа можете да ги видите менува. Значи, да се обиде и да ги изразат дека во однос на формула. Оваа формула е, всушност, што ви е дадена во спецификации, но ајде вид на изглед преку она што секоја променлива значи. Нашите крајниот резултат ќе биде ciphertext. Значи ова вели дека ith карактер на ciphertext се случува да одговараат на ith карактер на чист текст. Тоа има смисла, бидејќи сакаме да секогаш се обидел овие работите. Па тоа нема да биде о карактер на ciphertext плус k, кој е нашиот клучен - кој што има смисла - и потоа имаме оваа МО 26. Сеќавам назад кога имавме Zed ние не сакам да навлегувам во ликот, па сакавме да го МО и вид на навиват азбуката. По Zed ќе оди на а, б, в, г, сè додека не стигнав до вистинскиот број. Па знаеме дека Zed, ако + 6, ќе ни даде ѓ бидејќи по Zed доаѓа a, b, c, d, e, f. Значи, да се потсетиме знаеме за сигурно дека Zed + 6 се случува да ни даде ѓ. Во ASCII вредности, z е 122 и ф е 102. Значи ние треба да се најде некој начин на правење на нашиот Цезар формула ни даде 102 по земањето на 122. Значи, ако ние само ја применуваат оваа формула, ('z' + 6)% 26, што всушност ви дава 24 затоа што 122 + 6 е 128; 128% 26 ви дава 24 остатокот. Но, тоа навистина не значи ѓ. Тоа дефинитивно не е 102. Тоа не е исто така на 6 буква во азбуката. Па очигледно, ние треба да се имаат на некој начин на tweaking ова малку. Во однос на редовните азбука, знаеме дека z е 26 буква и ѓ е 6. Но, ние сме во компјутерската наука, па ние ќе индекс на 0. Па тогаш наместо z биде број 26, ние ќе велат дека тоа е број 25 бидејќи е 0. Па сега ајде да ја применуваат оваа формула. Имаме z претставена со 25 + 6, која ти дава 31. И 31 современи 26 ти дава 5, како за потсетување. Тоа е совршен, бидејќи знаеме дека f е 5 буква во азбуката. Но, тоа се уште не е ѓ, нели? Таа се уште не е 102. Па тогаш за оваа pset, предизвик ќе се обидува да дознае односи помеѓу конвертирање помеѓу овие ASCII вредности и азбучен индекс. Во суштина, она што ќе сакате да го направите, вие сакате да се започне со ASCII вредности, но тогаш ќе сакате да некако се преведе дека во индекс азбучен потоа пресметај што писмото што треба да биде - во основа, она што нејзините азбучен индекс е на шифра карактер - тогаш се преведе дека назад во ASCII вредности. Значи, ако сте камшик од вашиот ASCII табелата, а потоа се обиде да најде односите помеѓу, да речеме, 102 и 5 или 122 и 25. Ние го добиле нашите клуч од командната линија аргументи, ние сме добиле чист текст, ние сме го enciphered. Сега сите сме го оставиле да направите е да го испечатите. Ние би можеле да го направите ова неколку различни начини. Што можеме да направиме е, всушност, се печати како што одиме понатаму. Како што iterate во текот на карактери во стринг, би можеле едноставно само печати право тогаш кога ќе го пресмета. Алтернативно, можете, исто така, може да се чува во низа и има низа од карактери и на крајот iterate во текот на овој цела низа и печати ја надвор. Па имате неколку опции за тоа. И се сеќавам дека% c ќе биде случаеви за печатење карактер. Па ние имаме Цезар, и сега се движи кон Vigenere, која е многу слична на Цезар, но само малку посложени. Значи во суштина со Vigenere ви се случува да се поминува во клучен збор. Така, наместо на голем број, ви се случува да имаат низа, и така тоа ќе дејствува како вашиот клучен збор. Тогаш, како и обично, си оди за да се добие прашува за низа од корисникот а потоа написвам со Воице и потоа да ги даде назад ciphertext. Значи како што реков, тоа е многу слична на Цезар, освен наместо на префрлање од одреден број, бројот е, всушност, ќе се промени во секое време од карактер до карактер. Да претставуваат дека вистинската бројка да се менуваат, тоа е претставена од страна на тастатурата букви. Па ако влезе во промена на, на пример, тогаш кој ќе соодветствува на промена на 0. Така, тоа е повторно назад до азбучен индекс. Што би можело да биде корисно ако гледате дека ние сме всушност кои се занимаваат со ASCII вредности како и писма, како и индексот азбучен, можеби најдете или да направите свој ASCII табелата која покажува азбучен индекс од 0 до 25, а преку z, и ASCII вредности, така што ќе вид на може да се види на врската и скица надвор и се обиде да најде некои модели. Слично на тоа, ако се менува на одреден степен од страна ѓ - и ова е или мали или големи букви ѓ - тогаш кој ќе соодветствува на 5. Дали сме добро досега? Формулата за Vigenere е малку поинаква. Во суштина, ќе видите дека тоа е само како Цезар, освен наместо само к имаме к индекс ѕ. Забележете дека ние не сме i користење, бидејќи во суштина, должината на клучни зборови не е нужно должината на нашите ciphertext. Ова ќе биде малку појасна кога ќе видите еден пример дека имам малку подоцна. Во суштина, ако се кандидира на вашиот програма со клучни зборови на ohai, тогаш тоа значи дека во секое време, ohai ќе биде вашиот смена. Па во зависност од она што позиција се наоѓате во вашиот клучни зборови, ви се случува да ја префрлат својата одредени ciphertext лик од таа сума. Пак, како Цезар, ние сакаме да се осигураме дека можеме зачува капитализација на работите и ние само написвам со Воице букви не карактери или празни места. Значи се погледне назад Цезар на функции кои може да се користат, начинот на кој сте се одлучи за тоа како да се префрлат работи, а се применува дека вашата програма тука. Па ајде карта ова. Имаме чист текст дека ние сме добиле од корисникот од GetString велејќи дека ова ... е CS50! Тогаш имаме клучен збор на ohai. Првите 4 карактери се прилично едноставни. Ние знаеме дека Т ќе се префрли од о, тогаш часот ќе се префрли од H, I ќе се префрли од. Тука ќе видите дека претставува 0, па потоа на крајот вредност е всушност само истото писмо како порано. Тогаш тој е префрлена од i. Но, тогаш имате овие периоди тука. Ние не сакаме да написвам со Воице тоа, па тогаш ние не го промени со ништо и само печати од периодот непроменети. [Студент] јас не ги разбирам како знаеш дека ова е префрлена од - Каде сте - >> О, извинете. На врвот тука ќе видите дека командата ohai тука, што ќе биде клучниот збор. И така во основа, ти си возење велосипед во текот на ликовите во клучен збор. [Студент] Значи o ќе биде менувањето на иста - Значи o одговара на одреден број од азбуката. [Студент] Десен. Но, каде ќе го добиете CS50 дел од? О. Тоа е во GetString каде сте како "Дај ми стринг за да се кодираат." [Студент] Тие ќе ви даде тој аргумент да се префрлат од и тогаш ќе побара за вашиот прв стринг. >> Да. Значи, кога тие ја стартувате програмата, тие се случува да го вклучите клучни зборови во командната линија аргументи кога ќе го стартувате. Потоа откако ќе провери дека тие всушност ви даде 1, а не повеќе, а не помалку,, тогаш ви се случува да ги прашува за низа, да речеме, "Дај ми стринг." Значи тоа е каде што во овој случај тие ви даде оваа ... е CS50! Па тогаш ви се случува да го користат и го користат ohai и iterate завршена. Забележете дека тука ние прескокнат во текот енкрипција на периоди, но во однос на нашата позиција за ohai, следниот еден ние се користи о. Во овој случај тоа е малку потешко да се види, бидејќи тоа е 4, па ајде продолжи малку. Само стап со мене овде. Тогаш имаме јас и с, кои потоа преведени од страна на о и ж соодветно. Потоа имаме простор, и така тогаш знаеме дека ние нема да написвам со Воице на простори. Но напомена дека наместо да одат на во ова место тука, ние сме енкрипција со - не знам дали може да се види дека - еве тука. Па тоа не е како вие всушност однапред, да речеме, o оди овде, ж оди овде, на оди овде, јас оди овде, о, ж, а, I, O, H, а, з. Не го сторат тоа. Вие само ја префрлат својата позиција во клучен збор кога знаеш дека ти си, всушност ќе биде енкрипција вистински писмо. Дали тој вид на смисла? Во ред. Па само некои потсетници. Вие сакате да бидете сигурни дека сте само преминете на следната буква во вашите клучни зборови ако ликот во чист текст е писмо. Така рекле дека сме о. Ќе забележиме дека следниот знак, индексот i на чист текст, е број, на пример. Тогаш ние не унапредат ѕ, индексот за нашите клучни зборови, додека не стигнат до друго писмо. Повторно, вие сакате да бидете сигурни дека ќе wraparound на почетокот на клучниот збор кога сте на крајот од неа. Ако видите тука сме во i, следниот мора да биде о. Значи сакате да се најде некој начин да се биде во можност да wraparound на почетокот на клучниот збор секој пат кога ќе стигнат до крајот. И па уште еднаш, каков вид на оператор е корисно во тој случај за завиткување околу? Како и во одбројува пример. [Студент] На знакот за процент. >> Да, знакот за процент, кој е модул. Значи модул ќе ни се најде тука кога сакате да заврши во текот на индексот во вашиот ohai. И само брзо Совет: Обидете се да се мисли на обвивката во текот на клучни зборови малку како одбројува, каде што ако има 3 групи, 4 лице, нивниот број што рекоа беше 4 МО 3, кој беше 1. Па пробајте и мислам на тој начин. Како што видовте во формулата, каде и да имаат CI, а потоа пи, но потоа kj, вие сакате да бидете сигурни дека ќе ги пратите на овие. Вие не треба да го нарекуваат јас, вие не треба да се нарекуваат ѕ, но сакате да бидете сигурни дека ќе ги пратите на ставот дека сте во во вашиот чист текст како и ставот дека сте во во вашите клучни зборови затоа што тие не се нужно ќе бидат исти. Не само што на клучни зборови - тоа би можело да биде сосема различна должина од вашиот чист текст. Исто така, вашиот чист текст, постојат броеви и карактери, па тоа нема да совршено се вклопува заедно. Да. [Студент] Дали има функција да ја смени случај? Можете да се промени на капиталот А? >> Да, таму е дефинитивно. Можете да проверите - Верувам дека тоа е toupper, сите 1 збор. Но, кога ќе се обидуваш да Cipher работи и зачувување на текст, тоа е најдобро основа да имаат одделни случаи. Ако тоа е големи, тогаш ќе сакате да се префрлат од овој бидејќи во вашата формула, кога ќе се погледне назад колку ние треба да се вид на движење мешаат меѓу ASCII начин на претставување на броеви и вистински азбучен индекс, сакате да бидете сигурни таму ќе биде некој вид на шема која ви се случува да го користите. Уште една забелешка на моделот, всушност. Сте ќе треба да дефинитивно се занимаваат со броеви. Обидете се да не се користи магија броеви, што е пример за стил. Така велат дека сакате да го секое време смена нешто од се допаѓа - Океј, па навестување, уште спојлер е кога ќе треба да се менува нешто од одреден износ, не се обидуваат да се претставуваат дека со вистинскиот број туку пробајте и видете дали можете да го користите ASCII вредност, каков вид на ќе го направи повеќе смисла. Уште една забелешка: Затоа што ние сме се занимаваат со формули, иако вашиот ТФ вид на ќе знаете што шема може да се користи, најдобрите во вашите коментари вид на објаснат логиката, како, "Јас сум со користење на овој образец, бидејќи ..." и вид на објаснува моделот посочно во вашите коментари. [Ова е Walkthrough 2] Доколку не постојат никакви други прашања, тогаш јас само ќе останам тука за малку. Среќно со вашата pset 2: Крипто и благодарност за доаѓањето. [Студент] Ви благодариме. >> Благодарам. [Медиуми мрежа интро]