[Powered by Google Translate] [Валктхроугх] [Проблем Сет 3]
[Замила Чен] [Универзитет Харвард]
[Ово је ЦС50.] [ЦС50.ТВ]
У реду, поздрављамо све до Валктхроугх 3.
Псет 3 је заиста забавно један.
То је нова на ЦС50 зове Сцрамбле,
тако да ако сте икада играли Сцрамбле или сличан Боард Гаме Боггле
суштини то је игра у којој имате мрежу слова,
и у време додељено морате да пронађете што више
2-писмо или више речи које постоје на плочи,
па постоје одређена правила, као што можете да користите само једно слово
у мрежу, један блок у мрежи једном, и не можете да се вратите на њу.
Можете само да конструише слова повезујући заједно суседних слова,
тако да ће бити врло забавно псет, па хајде да погледамо наше алаткама.
>> Опет, апарат је још увек ажурира, тако да се уверите
сваки пут када уђете у апарат на десно отворите прозор терминала
и терминалима уради команду судо иум-и упдате.
Ово је важно и ако желите да будете у стању да
покрените решења особље, које смо дефинитивно препоручујемо.
Понекад је добро када сте завршили свој код
да га тестирамо против особља решење, уверите се да је све
уђете у кадрова решење, што долази тамо,
Иста ствар се дешава са вашим кодом.
У реду, па се уверите да ажурирате свој уређај.
Сада, такође, пошто имамо посла са мрежом у овом случају
ми смо заправо ће бити делвинг 2-димензионалним низовима.
Смо Бавили смо се са 1-димензионалним низовима,
али сада ћемо их проширити тако да имају
више редова, као и више колона.
Тада ћемо дефинитивно користити функције у овој псет,
суштини позива функцију, пошаљете неке параметре из
и онда да се вратим на повратну вредност.
И у сцрамбле нећемо вас да се заиста направи целу ствар од нуле,
него, ми заправо ти дају нешто што се зове дистрибуција код,
па код функције које смо већ написани такву излаже
скелет од псет, као и реализује неке оштрије ствари
да дефинитивно ћете моћи да прочитате и разумете
али не треба да сасвим успети још.
>> Да бисте брзо понављања током 1-димензионалним низовима.
Низови су структуре података које имају више вредности истог типа,
и као подсетник, ови низови нула-индексирани,
тако да је већина од вас су вероватно упознати са низом као што је ово.
Ако бисмо желели инт низ дужине 3,
онда бисмо могли да покрене имајући инт вредности
а онда квадратних заграда означава дужину од тога,
и онда бисмо доделили вредности специфичних елемената у том низу.
Овде имамо инт низ од првог индекса у индексу 0, 2,
Индекс 1 је 4, индекс 2 је 6.
Реци ми смо желели већу лепезу и да имају више вредности.
Онда бисмо могли имати 2Д низ.
Дакле, ово је веома сличан нашем 1-димензионални низ.
То је индексирано 0, тако да значи да је прва колона
је индексиран на 0.
Следећи је на 1, а онда следећи је на 2,
и онда имамо сличан редове, па ви видите да када смо
објављујемо нашу низ такође, баш као и пре-ми указао на величину низа.
Ми сличан такође указују на величину у којој је први носач
показује колико редова имате, а друга указује
колико колона.
>> Добро, у овом псет ћете желети да буду у стању да
прелазили преко 2Д низа, моћи да приступите сваки елемент
У овом низу 2Д, тако суштински желите да достигне
све могуће комбинације редова и колона вредности.
Желимо да се постигне ред 0 у колони 1, 2, и 3..
Желимо да се постигне ред 1 у колони 0, 1 и 2.
Морамо да имамо неку врсту структуре која нам омогућава да
прелазили преко свих редова и свих комбинација
колона унутар тога.
Овде имам 2Д инт низ.
Она има 3 реда и 3 колоне,
па ово је брз начин да се
наћи читав низ 2Д.
Кажем први ред ће имати 2, 4, и 6,
некако сличан претходном примеру у овом слајду.
Онда ћу имати 2. ред бити 3, 6, 9,
а онда је 3. ред је 4, 8, 12.
Ми имамо нашу 2Д низ,
а ми знамо да то изгледа овако.
Имамо 2, 4, 6,
3, 6, 9,
4, 8, 12.
Сада, ако додамо у индексима,
ово би било ред 0.
То би било ред 1.
То би било ред 2.
Слично имамо колону 0,
колона 1 и 2 колона.
Да.
[Мушко] Који су три колоне, а који је ред?
Колоне су ови моји,
па колоне су ови они.
Ово је колона 0, а ово је колона 1.
Ово је колона 2.
[Мушко] Колико у декларацији инт до стола [3] [3]
Када сте проглашења 2Д низ затим први број у угластим заградама
Биће колико редова имате,
а онда је друга ће бити колико колона.
>> Супер, тако да желимо неку врсту структуре,
нека врста петље која ће нам дати сваку могућу комбинацију.
Реци ми почети рекавши-ок, да бисте приступили било у овом реду,
хајде да погледамо овај ред за сада.
То су редови овде.
Ми знамо да је наш индекс ред ће бити 0,
али да приступите овај елемент је на 0. реда и 0. колони,
па онда би му приступили индексом [0] [0].
Онда овај један, на сличан начин, и даље је на првом реду,
али је на другој колони, па смо приступили да је [0] [1].
Тада последњи ће бити [0] [2].
Кад год смо у одређеном низу ћемо желети да
прелазили преко свих могућих колона вредности.
Почећемо са фор петљи
који почиње од 0, и иде на дужину колико редова имамо.
Ово је бициклистички кроз сваки ред.
Онда оно што ми желимо да урадимо је да у оквиру тога,
кад год смо у одређеном реду желимо да циклусу кроз све расположиве колона,
па онда ћемо имати још једну петљу.
Назовимо то ј.
И, Ј и К су веома честе редова индексирања петље променљиве,
тако да можете да користите ово ако желите.
Такође, покушајте да избегнете тада ако се ове варијабле најчешће користи у петљи
избегавајте да користите их као као променљиве имена за друге ствари у вашем коду
Управо зато што је уобичајена конвенција за коришћење И, Ј, К унутар петље или индекса.
Ок, онда овде имамо за петљу која пролази кроз све редове.
Онда сваки пут да је на другој заредом
ћемо прелазили преко свих различитих колона.
На овај начин ми заправо можемо доћи до сваког могућег комбинацији
од 0, 1 и 2 са 0, 1 и 2.
То има смисла?
На овај начин смо у могућности да приступите преко сваку вредност.
Сада, могли смо одлучили да урадите колоне најпре као добро.
То стварно није битно колико сте прелазили преко
све колоне и све редове.
>> Сада хајде да урадимо нешто са тим вредностима.
Рецимо отисак.
Сада идемо штампају своје бројеве
и онда променљива на том месту је, да ће то бити вредност н табели.
Сада специфичан ред индекс бих се, јер смо то прелазили преко наших редова,
и онда ј да вршите итерацију кроз наше колоне.
Сада ћемо да направимо 2Д.
Сада када смо покренули 2Д се исписује све вредности
у редоследу који смо горе навели,
па видиш да иде преко свих редова први,
тако да је у реду 0, а онда је штампа све вредности у том реду
и онда се наставља.
То је пример начин на који би прелазили преко
и спроводи акције на вредности у 2Д низа.
Одлично, сад, шта ћемо видети у дистрибутивном кода су многе функције,
па неке од ових функција ће бити Булова функција
где вратити Булов израз за тебе.
>> Неки ће бити целих бројева, на пример, и тако у суштини да се
Преглед функционише мало основи функције имају
Повратна вредност, име, са којим користите да позовете програм,
и онда они могу имати било који број параметара.
У суштини када позовете функцију у наредне функције,
суштини као ви сада кажете хоћу да изврши ову функцију,
морате проћи у одређеним вредностима, тако да у овом случају наша функција трла
ће морати да узме 2 целе бројеве, ау оквиру те функције онда
то би могли да им приступите, погледајте на њих као кии.
Сличан пример је ниже функције
које сте можда користили у крипто програма,
и тако у суштини те функције су већ написан за тебе,
али у зависности од њиховог повратка типа можете да их користите у оквиру функције.
Рецимо да имате боолеан функцију зове ФОО.
Затим можете да користите зато што знате да ће представљати Боолеан.
У суштини када га позовете, он ће се вратити назад Боолеан,
тако да се може третирати као да ће то представљати Боолеан.
У вашем стању можете једноставно рећи
ако фоо, а онда пролазе у својим потребне параметре,
5 и 9, на пример, 2 цели бројеви,
онда знате да ће се то вратити истинито или лажно,
па онда можете искористити као стањем.
Слично би се могло рећи да је такође фоо (5, 9) == труе
или == лажне или нешто слично,
али то је мало непотребно јер саме функције
Већ вредности или да тачно или нетачно.
Ми ћемо имати то на уму када видимо неке примере у дистрибутивном коду.
>> Добро, вратимо се јагме након имамо 2Д низове
и разумевање функције под нашим појаса.
У суштини сцрамбле ћеш имати мрежу слова,
и онда ћеш да помогне спровођење програма
при чему корисник може унос различитих писама која су видите на мрежи,
па то такође значи да и ви цете морати да скрене одбор игру.
Тада корисник ће бити уношења одређене речи,
али морате да проверите да ли се те речи важе у речнику,
или Б, без обзира да ли су они заиста постоје у одбору, може се наћи у одбору.
Затим у дистрибутивном коду ћемо ићи преко тога у секунди.
Видећете шта је већ направљен за вас,
а затим у оквиру датог структури расподеле кода додали функције.
Постоје одређене функције које су остали празни.
Постоје одређене функције које сте управо да додате.
Одређена функција коју ћемо да радимо са је реми,
тако да морате да спроведе функцију драв,
заправо цртеж све слова на табли.
Ти ћеш морати да спроведе проналажење функцију којој морате да проверите
да ли је стринг који је корисник уноси се важећи реч,
па онда као што сам раније поменуо, који укључује да ли је то у речнику или не
као и да ли је то валидан игра потез.
Онда ћеш да спроведе Сцрамбле
где је у игри, ако је корисник, на пример, има проблема са проналажењем било коју реч
па ако укуцате "Сцрамбле" у линији
онда игра одбор заправо ротира за 90 °,
имајући иста слова али само окреће за 90 ° у смеру казаљке.
И на крају ћемо да се баве случај и осетљивости,
суштини, када све речи у речнику укључен у дистрибуцију кода
Сви чувају као велико, али желимо да омогућавају кориснику, на пример,
ако уђу у мешавини мала и велика
или само мала слова онда ако је реч важи
онда они треба да буду у могућности да добију поене за то, као добро.
>> Ок, дистрибуцију кода, то би могло бити мало тешко да се кроз на први поглед.
Можда нећете желети да прочитате све то и само да разјаснимо да
писања свој програм, али немојте га прочитате једном,
прочитајте га два пута, прочитао три пута, чита га изнова и изнова
тако да имате добар осећај и да се осећају пријатно заиста
са шифром, иако нисте написали ове функције се,
да врста знају шта раде и можете да очекујете
начин на који би могли да комуницирају са функцијама које ћете испунити.
Без даљег одлагања, идемо у ствари уђу у ову дистрибуцију кода,
а ја ћу ти помоћи ви смисла за то.
Већ сам скинуо дистрибуцију кода.
То можете да урадите ово.
Има инструкције у спец где морате да направите сопствену директоријум за псет 3,
и онда ако извршава команду која се налази у спец
онда ћете моћи да преузмете речи фајл,
који садржи у основи речника датотеку, ако само погледамо то брзо.
То, у суштини садржи читаву листу речи које ће бити наш речник.
>> Ок, кренимо на врху.
Такође, овде ћете приметити да добро стил ове дистрибуције кода
је у нашу корист, јер можемо да видимо коментаре
да објасни како је код се користи.
Ми имамо ово, укључујући и наше библиотеке.
Приметимо да је овде # смо укључују <тиме.х>,
и тако да библиотека нам дозвољава да пратите времена, јер
у верати морате да унесете у суштини онолико речи као могуће
у датом временском оквиру.
Овде имамо неке променљиве.
Трајање утакмице смо поставили да буде 30 секунди.
Ми кажемо да је димензија мреже, то је квадрат грид-
ће бити 4 к 4.
Ми кажемо да постоје речи, број речи у речнику,
било где само да има највише 29 слова.
Онда овде је фајл који се зове дневник.
У суштини ћемо се аутоматизацијом неких резултата из кода,
па покушајте да не мења ништа са дневнику, јер ћемо се бавити са тим.
Не морате да разумем да је ипак,
али само покушајте да се не мења ништа са дневнику.
Приметимо да овде ова променљива мрежа, која је 2Д низ знакова,
је проглашен ван нашег главног функције,
па то је оно што ми зовемо Глобална променљива.
Зато имамо посла са игром овде,
ако се сећате скроз назад на гребање
када смо имали нешто као резултат, на пример,
када смо се бавили игром, која је морала да буде доступан
много различитих сценарија, тако да на сличан начин, имамо ову променљиву
који треба да буду доступни много функција у нашем програму,
па овде је мрежа 2-димензионални низ који ће чувати
слова у журби игри.
Касније ћемо видети касније коришћење овог,
али онда имамо и 2Д низ боолеанс називају марака,
па у суштини, када идемо у проверу да ли је реч
важи или не морамо да знамо да ли смо посетили одређену блок,
посетио извесну писмо, па онда знаци у основи ће се
садрже било тачно или нетачно на датом индексу,
тако да ће да нас обавестите да ли смо били тамо раније,
да ли смо посетили то писмо током нашег одређеном контролом,
и тако марака, као што ћете видети касније,
ће у суштини тачно одсликавају мрежу.
>> Овде смо одлучили да желимо наш сопствени тип података.
Нисмо били задовољни само стринг.
Ми смо заправо желели нешто што се зове реч,
па овде имамо ту типедеф струцт,
и онда у њему има Боолеан зове пронађен,
па да ли је ова реч је пронађен или не.
Онда има низ знакова,
суштини стварна реч коју је.
Сада, реч је стварна нови тип података које смо направили,
тако да можемо да имамо низ речи, на пример,
или можемо направити нову реч и има више инстанци њих.
Али имамо само један речник, па зато имамо само
струцт позвати речник насупрот типедеф струцт.
Струцт има цео са величином речника
као и низ речи, и опет,
ми користимо ове глобалне променљиве речи, што је изнад дефинисане,
да је број речи које је заправо у нашем речнику.
Овде имамо читаву листу прототипова, функција прототипова,
суштини говорећи, у реду, сада можете очекивати да имамо
Све ове функције касније у програму.
Ја ћу имати функцију воид зове јасан,
Булова функција зове пописивање који узима у
стринг и затим 2 целих бројева, и тако даље, тако да видите ово овде.
Такође, лепа особина у гедит је да дуж стране овде
ако се уверите да сте изабрали ово овде функције картицу,
изворни код картица, онда је то заправо ће вам показати све функције
да ли имате у свом програму.
То ће вам показати неколико ствари које можете да користите.
На пример, овде има да сте дефинисали нови тип података под називом реч
и онда су неке глобалне променљиве које имате.
Али ово функционише картица је веома корисно, јер можете да кликнете и назад
и скочили на одређене тачке у свом програму.
>> Добро, ми смо у главној функцији сада.
Када корисник уђе у команду,
суштини они могу рећи / јагме.,
или могу ући у великом броју након тога у суштини указују
које одбор желе да играју.
Обично кад унесете само једним аргументом командне линије
онда само ће да вам случајно плочу, али каже за отклањање грешака сврхе
желите да се уверите да сте управо проверите исту плочу изнова и изнова
шта онда можете да урадите је да само да кажем ./сцрамбле1, на пример,
и увек ће вам дати исту плочу.
Ево то је обезбеђивање одговарајуће коришћење,
па ако корисник унесе у више од 2 аргумената командне линије,
онда ће их упутити како да правилно користите програм
и онда изашли.
Ево ако аргц је 2, што значи да ако је корисник уноси број
специфичне речи које желе да онда користите
суштини када је програм касније чини случајно плочу
онда смо у суштини су јој дају семе, нешто као да приморава
да користе одређену вредност.
Онда овде учитати наше речи датотеку.
У суштини, ако се не може отворити речник, ако нешто крене наопако,
онда ће се вратити 1.
Ми покрене мрежу. Ми ћемо размотрити ту функцију касније.
Ми смо поставили резултат на 0.
Рачунамо када игра ће се завршити,
тако да је то 30 секунди, као што смо поставили.
Онда, опет, је лог фајл, који не треба да се мењају.
>> Ево месо програма где имамо док (истина) петље,
па приметити да ако имате само неко вријеме (истина) петља по себи
онда ће само наставити да извршава све што је у њеној телу,
али као што ћете видети касније, ми заправо имамо паузу
тако да смо заиста дозволити да-ми имамо неки начин то је заправо избијања
функције, а не извршава заувек.
Прво што се дешава је на екрану ће се јасно
тако да можете да нацртате нову плочу, а онда ће имати функцију која се зове реми.
Опет, то ће га пријавити, па у суштини сваки пут да иде кроз ову петљу
ће пријавити резултат за вас.
Проверите да ли треба да игра да буде крај,
да ли си ван времена или не, а затим извештај колико времена вам је преостало
ако игра је још увек у игри.
Онда овде имамо одзив за реч,
и онда имамо ГетСтринг функцију,
тако да је то, где корисник заправо улази реч за вас.
Тада у суштини, ако су стварно сте унели реч, ако није нула,
онда програм ће га пријавити.
Затим желите да проверите да ли је потребно да се верати мрежу,
Дакле, у основи ако уђу у командном јагма, реч Сцрамбле,
онда ће да се ротира за 90 °.
Онда иначе ако није реч јагма
онда шта желите да урадите је да ћете желети да потражите речи.
Је (финд (реч) је истина Идемо на тој функцији касније..
А онда ћете желети да погледате горе, тако да у основи је на мрежу,
и да ли је у речнику?
А ако је то случај, онда ће повећати свој резултат од броја слова
да је реч.
То је наш главни задатак тамо.
>> Ово овде је у суштини као шифру за бекство,
тако да не морате да бринете о томе баш тако много,
али у суштини кад год позовете јасно да ће јасно терминала
и померају курсор леђа и врсту брисање год да је писано раније.
Немојмо ићи да пузи сасвим још.
Уместо тога, ми ћемо идите доле и видети овде функцију драв,
који је твој ТОДО посао.
У суштини морате да штампате мрежу у свом садашњем стању,
тако да смо већ збринут заправо иницијализацију мреже,
и тако да не морате да бринете о којима писма стави у мрежу
или нешто слично, али у функцији извлачења ћеш желети да
одштампају све што је у мрежу.
Онда овде имамо боолеан функцију зове пронађу,
које смо горе видели у основну функцију.
Ако је реч је пронађен и такође је погледао горе у речнику,
ако обе су враћена тачно, онда би се повећати резултат.
Овде је наћи функцију, где је потребно у речи као ниске,
и то мора да буде 2 или више знакова,
а онда шта то ради је она тражи мрежу за ту реч.
Овде видимо пример итератинг над сваким елементом у мрежу
где су прелазили преко реда, а затим у оквиру тог прелазили преко колоне.
Овде се сећате марака 2Д низ који у основи складишти било тачно или нетачно
да ли смо били у том писму већ.
У суштини, то ресетује све марака, јер ми само бавимо марака
сваки пут кад смо проверу одређену реч.
Онда овде једном смо ресетовали све трагове
заправо тражи реч, па да траже реч
то је где смо користили пописивања функцију, па хајде да се вратимо до пузе
и да га погледам.
Шта пописивања не узима је у низу зове писма
као основи к и и, који је почетно
где корисник је рекао реч.
У суштини, он проверава да ли је к <0 или> димензију
у основи то значи да је тај индекс у ствари не постоји у нашој игри,
па онда то даје лажна.
Ако сте већ посетили специфичан писмо
онда ће се вратити фалсе, као и због тога што је правило у Сцрамбле
је да када имате
писмо овде, на пример,
можете придружити писмо иде горе или као дијагонално ово,
Дакле, у основи ваш следећи писмо може бити у било ком од ових суседних блокова,
али оно што не можете да урадите, на пример, идите на ово писмо
и врати на, тако да само једном користити свако слово.
Онда има смисла да се овде знаци да ако смо били тамо раније,
ако марака постављено тачно, онда то није валидан реч.
>> Онда оно што ради је то проверава.
Он каже да идем да проверим да ли је у овом конкретном месту
писмо које желимо тамо.
Ако није, враћа фалсе.
Будући да је већ проверио ту блокаду, онда ће поставити знак
у том одређеном тренутку, као истина.
Сада проверава да ли смо у основи наставља
То значи да ћемо тражити следећем писму
у речи да корисник покушава да поднесе.
Овде се сећате назад правила.
Ви покушавате да провери све суседне вредности,
оне изнад, испод, лево и десно, као и дијагонале,
па слично када смо мислили итератинг преко 2Д низове
где смо желели да прелазили преко сваке могуће и проверите
свака могућа пермутација између редова индекса и колона индекси
Овде желимо да проверите сваку могућу комбинацију,
ако је са леве стране писма, непосредно изнад, или са десне стране.
Овде видимо да је ова петља проверава са леве
када сам је -1.
Када је на 0 проверава у истој колони која је писмо у,
па ако сам је 1, што је његова коначна вредност, онда проверава са десне стране,
и онда то није довољно, зар не?
Ми треба да проверите све вертикалних вредности,
па онда овде имамо петљу да буде проверава да ли је испод иде
на истом нивоу или изнад, па онда комбинација која
ће приступити сваки суседно блок А.
Међутим, она такође проверава блок овде у,
па онда желите да се уверите да не проверите да је један.
А сада, да се провери да ли заиста претходни речи важе или не
онда ми желимо да урадимо исти процес за остатак речи
Забрана оног који смо већ урадили, па онда овде је претеча функција.
То се зове, а ми ћемо се у то касније мало,
али је спроводи исти поступак за све наредне жице.
Разговарали смо о нађемо функцију.
Ми разумемо шта ради.
То је у основи је провера да ли то реч коју је корисник дао
заиста постоји на плочи и да ли је то цењена потез.
Овде имамо Инитиализе функцију.
Приметимо да је празнина, тако да неће бити повратка нам ништа,
али то је само ће да се нешто ради за нас.
>> Овде офф Википедији постоји фреквенција
за свако писмо о писму на основу тога колико често
га користити на енглеском језику.
Видиш да е је, на пример, један од најпопуларнијих писама користе.
Желимо да попуните мрежу.
Шта ова функција ради је попунити мрежу са словима
врста у односу на њихову фреквенцију у овом низу.
Дакле, ово је овде користи овај језик
рекавши величина фреквенција,
То је врста само у специфичним случајевима.
Ми смо заправо може користити величину фреквенција, тако да када заправо желе да
наћи дужину низа вероватно неће користити величину
већ само помоћу низа дужину.
Можете питати своје поздрав да разговарам са вама мало више о томе,
али само знам да је ово синтакса овде је више од посебног случаја.
Сада, за сваки елемент у мрежу
желимо да направимо писмо, а то ће бити псеудослучајних,
тако случајан, али не сасвим.
У суштини оно што ово ради је да смо поставили нови двојника
са случајним вредност између 0 и 1.
На основу тога ћемо мапирати да,
тако рећи да је д подешен на 0,6, на пример.
Онда, ако је д 60% у
онда ћемо да погледамо све од писама и наћи
у односу на то колико често су навикли
Шта је 60% за
Ово није само 60% од алфабета, већ
заузима оволико простора, а онда је б заузима оволико,
а затим е, на пример, ће потрајати оволико.
На основу релативне дужине или фреквенције
од ових писама ћемо карта која насумичну вредност
између 0 и 1 на одређено слово.
То је оно што овај код ради овде,
и онда овде је к као смене, где заједно
у писму желимо да будемо, па смо поставили знак у мрежи
да буде + к.
>> Приметимо да је још размишљате да похлепни
ми смо морали да користимо округли функцију да се баве покретним зарезом непрецизности овде,
па слично смо морали да узму у обзир да понекад
пловци нису баш оно што ми намеравамо да буду,
па смо желели да направимо улов за то.
Онда идемо у фајлу И / О суштини читање и писање у фајлове,
које ћете добити у касније, али не сасвим још,
па у суштини то отвара речника фајл, стоји оно што је у њему,
а затим га поставља у низу.
Приметите да смо га поставили у струцт да смо декларисане, речник, струцт
па речник има низ зове речи повезане са њом,
па шта ради каже речник, речи у овом индексу
су таква и таква вредност.
Онда смо скоро завршили са дистрибутивном кодом.
Ми коначно имати проналажење функцију, где имате коментаре
упућујући вас на шта да код треба да ради.
Лоокуп ће потражити неку реч у речнику
и докле год те речи већ није пронађен
онда заставе је као пронађено тако да корисник може да га користи поново
али такође враћа истиниту размишљање назад на главну функцију поново,
враћа труе, тако каже да је реч може се бодовати.
>> И онда на крају имате Сцрамбле функцију,
што је још један неважећи функција, јер је нешто
али не враћа ништа, па шта јагме функција ће радити
се ротира решетку 90 ° у смеру казаљке.
Знам да можда био мало груб, али је важно да урадите.
Гледај ме пролази кроз дистрибутивну кода,
али добро, покушајте да прође кроз њу себе.
Оно што сам желео да урадим је мапирати га разумети
шта овај програм са свим овим функцијама заправо ради?
Ако бих да прођем кроз дистрибутивну код опет,
сад да ја некако имам осећај шта се дешава онда бих рекао
почнемо са нашим главним функције,
и онда мислим да је прва ствар коју она ради је она позива оптерећење,
па главна позиви оптерећење, али оптерећење је празнина функција,
па онда шта да урадим да указују на то да је управо стављање једног стрелицу
указујући да се учита, јер главни зове.
Следећа ствар је покрене.
Главни позиви покрене,
а затим, ако се осврнемо на нашу главну функцију
Мислим да ту следећу ствар да ради,
Овде постоје тона различитих ствари које главни зове,
али сада сам само ја фокусирајући се на већини великих оне
релевантне кода, тако да нисам укључујући да сам ја или слично.
Онда следећа ствар да ли је то то брише,
и онда је нерешено,
па знам да је реми је нешто што ћемо да радимо.
То је реми функција.
Касније смо видели да је следећи је бит-
па онда имамо јагму.
А онда смо пронашли, тако да вам је још једна функција.
Видимо да је је-ако се врати сећате да је Булова функција,
тако да је заправо ће да се врати назад у нешто нама.
Онда овде показују да је имамо наћи,
и онда смо и проналажење.
Али онда се сетим да је било је ово пописивање функција
да не изгледа као да су позвани у главном,
, што значи да су неке друге функције зове пузање,
а ако тражите назад кроз дистрибутивну кода
видиш да пронађете овде је онај који користи пузање,
па онда наћи онда и повезује да пузи,
што је Боолеан вредност, која се враћа нешто,
па сам додао још једну ствар, а онда пошто је пописивање рекурзивни
такође петљи назад на себи.
>> Онда, ако си овде сам извући слику о томе шта је наш програм изгледа,
па разумевање односа између појединих функција,
и враћам се да видети редослед игре
и логика како игра програм ће наставити.
Прочитао смо дистрибуцију кода.
Прва функција коју ћемо желети да спроведу,
или једна од функција које желите да оствари цртају,
па овде заправо имају мало слободе са овим.
Ако погледамо особља решење-
Идем да отворим прозор терминала, у ствари,
псет3/сцрамбле.
Сцратцх то. Мислим да треба да ажурирате свој уређај.
Ако играте са особљем раствором Сцрамбле-
упутства су у спец за то-
онда можете да видите како они штампају игру одбора,
али у суштини оно што они раде је да су ставили размаке између сваког знака,
али имате мало слободу уз то, тако да ако желите да одштампате линије, на пример,
између њих онда можете то да урадите.
Хоћеш да мислим назад како смо прелазили преко свих елемената 2Д низу,
а ви ћете желети да одштампате оне, проверите да ли имате петљу
и имају своје функције штампања такве да сте штампање у правом редоследу.
Ако желите да ваш итерациону петљу до када прелазили преко њега
а ви користите индекси уверите се да сте штампање у правом редоследу.
>> Суочавање са 2Д низовима у почетку може бити мало збуњујуће,
па ево на овом слајду сам направио табелу која вам показује
за сваку дату месту у 2Д низу шта индекси су,
тако да ако желите да погледате назад ово за брзу проверу
или за референце, или нешто слично онда можете користити ово.
Колоне су у плавој боји, а редови су у црвеном.
Тхе проналажење функција је двострук.
Проналажење и то је Булова функција-ће нам рећи
тачно или нетачно да ли корисник подноси реч
може се прихватити као валидан вредност,
и тако реч јагма важи само
ако је пронађен у речнику и ако се то заиста налази у одбору,
па сетите да проналажење морате да остваре ово сами,
па желите да проверите обе ствари,
да ли је реч заправо у речнику и да ли је то већ пронађен.
Подсетимо назад на глобалном променљивом речнику,
што је струцт да смо направили да у основи има инт зове величину
повезан са њим, као и низ речи,
где је реч је нови тип података.
Тако да приступите, на пример, величина речника или речи арраи
шта онда можете да урадите је да само пишем 'дицтионари.сизе'
сличан начин на који сте управо би користили било који други променљиву.
Дакле, ако дицтионари.сизе представља величину речника,
Слично томе, дицтионари.вордс представља низ.
Дакле, ако сте желели да приступите одређену реч у оквиру речника,
онда би морао да додате индекс
зато што би морао да каже 'дицтионари.вордс у индексу и'
а затим урадите нешто на основу тога.
Дакле, знајући да је речник има одређену величину у вези са њом,
као и низ речи, да провери да ли нешто није у речнику,
онда би морао да интерате преко речник
да провери да ли је реч пронађена.
>> Сада, ако помислим на предавање, када смо разговарали о различитим начинима да трагају за стварима,
онда се сетим да је линеарно претраживање вероватно није увек најбољи начин да иде.
Али дефинитивно је један од начина да се тражи нешто.
Понекад ћете можда открити да спроведе свој Финд функцију са
линеарно претраживање на први и онда се остатак ваш програм иде.
А онда касније можете вратити и променити начин на који сте потражили преко за реч.
Тако да се бави - у основи знајући да - знају како да приступите
речи низ речника, која се бави посматрање
да ли је реч заправо у речнику или не.
Али онда ми такође треба да се позабави да ли је та реч на табли.
И да ли је то већ пронађен.
Тако смо већ налаз функцију, запамтите.
То показује су, али шта је реч?
Ово није филозофско питање, већ, погледајте типа дефиниција.
Имамо Боолеан називом "нашао", као и низ знакова
који представља ту реч.
Дакле, када се вратите проналажење, ви ћете желети да проверите да ли је реч је пронађен или не.
Сада, знајући да је Булова нашао - нашао је име од боолеан
који је повезан са сваком речју - како онда могу да приступите ту променљиву,
размишљам уназад на то како приступити променљиве у речнику?
Дакле, овде смо имали речник, а онда смо рекли дот сизе, зар не?
Слично томе, када имамо реч и, у том случају, бити опрезан јер
Реч је само било који други тип података, баш као инт или ниска.
Дакле, не можете само рећи 'реч', осим ако је то име тога.
Ти ћеш имати променљиву са именом, а онда када имате то,
кажу да се зове трла, на пример, онда можете рећи 'фоо.фоунд'
и да ће вам вратити боолеан вредност да ли је реч је пронађен или не.
>> Онда следећи део псет је да спроведе јагму,
чиме год корисник улази верати - а то је већ бавио
овде у дистрибутивном коду - ви само треба да спроведе
Функција јагма да вас је већ наложио да ротирате одбор 90 ° у смеру казаљке.
По спецификацијама, упутства кажу да је одбор ротира 90 ° смеру казаљке на сату
тако да је вредност на мрежи [0] [0], затим прелази на мрежу [0] [димензија -1.]
У овом случају, за јагма, наша димензија 4, па би онда 0-0 мапирање 0:3.
Хајде да скрене ово да видим шта је то могло да изгледа.
Нећу да урадим 4 к 4 решетку већ 3 к 3 један.
Хајде да кажемо да је ово инча 2Д низ.
Само ћу само да имају - све у реду.
Зато кажемо да верати ово; желимо да га ротирате 90 ° казаљке на сату.
Знамо да је, као полазну тачку, вредност на 0-0, што је у овом случају је број 0,
ће мапирати у ред 0, онда димензију колоне -1.
И тако, у овом случају, димензија 3.
Дакле 0 би прешао на ред 0, колона 2.
Дакле, имамо број 0 тамо.
У суштини оно што ми радимо је водимо ово,
физички окретањем па онда 2 ће ићи на овом углу,
је 8 би онда идите на овом углу, на 6 овоме.
А онда је остало да изгледа -
Дакле, то је оно што решетка изгледа као када сте успешно га закључан.
Када сте спровођењу Сцрамбле функцију, шта ћете желети да урадите
је види, па како могу да заменим ове вредности?
Да ли постоји нека врста шаблона или нека врста формуле за одређивање
где посебно индекс иде?
На пример, ја могу гледати да видим 3-4-5 овде је ред.
Где другде да видим 3-4-5?
Па ја видим овде.
Слично томе, видим 6-7-8 као низу, али онда је овде колона.
То је образац који ја видим сада, али вероватно постоји неколико других.
На основу тога, мислим на неку врсту обрасца, нека врста начин.
Када смо идентификовали једну, онда ћеш желети да вратите вредности у мрежу.
Дакле, мрежа ће постати 0-0 6, 0-1 мрежа ће постати 3.
Али запамтите да иоу'лл - на пример, ако поново далеко ово право,
кажу да грид 0-2 постане 0 сада, онда изгубити оно 2 био тамо.
Па мислим се, то није довољно да само распоредити одмах.
Вероватно ћете желети да направи привремену копију нешто
пре него што га заправо ставили у на правом месту.
>> Последња ствар је да спроведе неосјетљивост предмета.
Ако погледате уназад, тражи да се на лицу места у спец, где корисник улаза ниске.
Ако се сећате уназад, мислећи назад - ох, избрисани са мапе.
Ако помислим на мапи вашег програма, то је у оквиру главне функције,
па погледајте где сте се баве корисник уноси ниску,
а затим у року тамо, мислим да од алата који сте научили од вашег
крипто псет, псет 2, а затим размишљати о начинима да ћете можда бити у стању да
дозвољавају корисничког уноса, као мешовити случају.
Тако су могли имати мешавину упперцасес и ловерцасес, али да и даље треба да буде валидна.
У речнику, се сетим када смо отворили тај фајл, свака реч је сачувани као све великим словима.
Али ми не желимо да корисник има на улаз великих слова све време.
Може ли ико замислити начин на који бисмо могли бити у стању да омогућавају кориснику,
иако су уноси Сва мала, на пример? Да?
[Студентски] Могли би да горњи?
Да, баш тако. Могли би да горњи.
Дакле, можете да конвертујете све слова у велика, а затим
на тај начин да будете сигурни да ће се то буде копија
ма ког се налази у речнику, ако је то у речнику.
Сјајно. Имамо мало времена.
>> Дакле, неке ствари које можете наићи у овом псет је потреба да се зна
какви су ваши променљиве су у одређеном тренутку.
Јер у спец имамо јасну функцију да у основи
брише све што сте нацртали на табли, брише све, а затим прерађује поврх тога,
можда, док ви пишете псет, заиста не желим да се то догоди.
Зато ћете желети да видите, у реду, када уђем у овој журби, на пример,
једном сам ући у журби, шта то ради и шта је било пре, само за референцу.
Па шта онда ћете можда желети да урадите је да се вратимо на ваш главни функцији
и коментарише се јасно, на пример.
Па онда када покренете програм следећи пут,
ваш програм неће јасно и да ће уместо тога само наставите са штампањем на врху тога.
Постоје неки други начини да дебуг као добро.
Шта можете да урадите је да можете укључити изјаве принт Ф, мислим.
Једна ствар коју сам видео у псетс да сам оцењивао је да су људи укључени принт ф изјаве
да штампају променљивих на неком одређеном тренутку да пратите.
Али само се постарајте да на крају, када завршите писање све штампања ф изјаве
за вас да пратите ствари, да их коментаришу напоље после,
или да их обришете када завршите.
То је још један начин на који можете да урадите нешто, ви само могли да пишете у изјави за штампу ф
негде да је релевантно и види, на основу онога што терминала штампа,
шта та променљива је.
>> Други начин да се то уради, да ћемо ићи у детаље током предавања,
је ГДБ, што је отклањање грешака алата.
У суштини, када га покренете, он ће отићи у свој програм и можете да га унапреди
један корак у исто време уместо вредновања све.
Онда можете да га разбију на мале кораке, а онда на основу путу -
и онда успут штампани ствари и видети шта су вредности.
И то вам помаже да схватим где грешка у коду може бити.
Шта смо могли урадити сада је написати брз функцију, а потом
видимо како би могли да користе ГДБ да видим шта се дешава.
Дакле, хајде да имају маин, а онда шта имамо као параметри за главни?
Имамо инт арг ц, и гудачки арг против
Идем да сачувате ово у објашњења како ГДБ.з. У реду.
Ја ћу имати повратак 0.
Па како о хајде да имамо једноставан за петљу, хајде да имају 12.
Идемо такође имају инт зове бројач, и
можемо почети да на 0. Ок.
Дакле, у свакој тачки у за петље, хајде да кажемо да желимо да повећамо бројач
или помножите га год сам је.
Ово је прилично кратак функција.
Хајде да ГДБ. Ох! А онда - кланг је паметан.
Говори ми да нисам укључују цс50.х.
У реду. Дакле, сада желимо да -
Заправо, жао ми је момци. Ја ћу да преименујете датотеку само зато што је мало збуњујуће.
>> У реду. Дакле, сада оно што ми желимо да урадимо јесте, желимо да покренемо ГДБ.
Рекао сам 'ГДБ отклањање грешака ", тако да ће у суштини бити постављен на фокусирање на овом дебаговање,
отклањање грешака датотеке.
Идем да ставим тачку прекида.
У суштини, програм ће трајати до удара у одређеном Бреакпоинт.
Ја ћу да кажем паузу у основну функцију.
Дакле, сада ћу да покрене дебуггинг, па унутра ГДБ могу покренути код.
То је покренут програм, и иако главни је била једна од првих ствари које смо написали,
Такође имамо Укључи фајлове, ту се ствари дешава већ.
Она има тачку прекида на главни.
Рецимо 'поред', тако да можемо да наставимо даље.
Она каже: "инт бројач = 0".
Ја ћу рећи 'штампа контра ".
Ово је чудно. Дакле, у суштини очекујемо бројачи буде 0,
али ГДБ је један корак назад, тако да кад год ви кажете следеће,
каже Инт контра = 0. То је следећа ствар која ће то извршити.
Затим кликнете - можете рећи следећи поново, или једноставно можете рећи 'н',
и сад ако штампате контра, контра је 0, као што смо очекивали.
У суштини, то ствара своју сопствену врсту променљивих за њега, али шта год да је било -
свиђа овде, то је оно што представља контра.
Зато ћу да кликнете следећи, и ја желим да знам шта сам је.
Ти ћеш да штампам, и је 0, као што смо очекивали.
Нект опет, то је значи да се иде кроз петљу за поново,
па ако сам ја штампају, на пример, видим да смо на - да сам је 1 тренутно.
Дакле, то је начин да, ако сте поставили тачку прекида на одређеном функцијом
и онда наставите даље следећи, а затим проверава шта и је,
ако имате Претпостављам да можда негде нешто не дешава онако како би требало,
а ви сумњате да је можда то је на првом индекс или индекс последњег или тако нешто,
можете да користите ГДБ, имајте на И штампа, да би могли да провере шта те вредности.
Дакле, у ГДБ, јер штампање и поред таквих заједничких аргументи,
заједничке команде, баш као што сам скраћено поред н,
Ја могу само да кажем п контра, то је још увек 0.
Онда сам кликните поред. Желим да одштампате контра поново.
Па, то је и даље 0.
>> А ти си некако питају - па, ја желим да будем контра факторијел функција.
Зашто - само у техникама дебаговање - зашто би то могло бити?
Зашто бројач не повећава његову вредност?
Зашто је боравио на 0?
Па, овде имам - вратио овде кажем бројач = к и контра.
Дакле, ако се вратим на почетак мог функције,
Видим да када сам ја штампа, и је 0, а шта 0 к нешто?
То је 0, зар не? Дакле, то је вероватно разлог зашто контра
никада неће бити било који други број.
Па ста онда ја можда желети да урадите је да се вратим у моју фуцтион,
кажу, у реду, добро заправо, желим да га покренем на 1.
Да ли ће то решити ствари?
Не баш, јер је контра још 0 овде.
Дакле, хајде да поставимо то 1.
Ми желимо да поново нашу алатку за отклањање грешака, па хајде да отказ.
И шта онда можемо да урадимо је да можемо ГДБ дебуггинг опет,
стави паузу у главни, а затим поново покрените отклањање грешака, следећи, следећи, следећи.
Хајдемо нект неколико пута, а онда ћемо штампати контра, види да -
нисмо правилно да поново датотеку.
Иако смо променили изворни код, онда смо стварно
није ажурирамо нашу извршну.
Верујем да можете направити - да.
Унутар саме ГДБ, ви у ствари можете направити датотеку.
Дакле, не морате да прекинете ГДБ поново.
Можете да се вратимо на изворни фајл, саве, назад у ГДБ, можете га направити поново.
Сјајно. Дакле, хајде да дебуггинг.
Ми желимо да кренемо од почетка, јер имамо нову извршну.
Можемо ићи кроз неколико пута, а затим одштампате ја, штампати бројач, настави.
У реду. Тако сада видимо да је заправо супротно повећава своју вредност као и ми желимо да.
>> То је само мали мало залогај величине пример како можете да користите ГДБ
да унесете шифру, штампати одређене вредности, кликните поред наставите на следећи ред,
и скратити га и одштампате га.
Очигледно, код у журби је мало сложенији од тога, али шта можете да урадите
је постављен на тачку прекида - можете поставити тачку прекида на дохват проналажење функција, тако нешто.
Дакле, кад год се стигне до тачке када треба да изгледа нешто горе,
онда ГДБ трајаће све до тог тренутка, а онда можете почети вредности штампања напоље.
Као ис марака у овом тренутку лажном или је то истина?
То је вероватно нешто што можда желите да користите.
ГДБ, не нагласи превише о томе,
јер ћемо ићи у детаље у предавању,
али само сам хтео да ви знате како ћете можда моћи да га користе
ако почињете са псет и желе да разумеју
бољи начин него стављање принт ф изјаве и загадјује све их преко вашег кода.
Имајући ГДБ да стварно га одштампате за вас и да сте у могућности да поставите оне тачке прекида
тако да ваш програм може покренути до одређене тачке
и онда вам омогућавају да заиста корак у њу и да схватим ту проблем.
>> Тачно. Дакле, ако се осврнемо уназад на јагма смо прочитали дистрибуцију кода.
Разговарали смо о томе на начин да прелазили преко 2Д низове, и сигурно ћу
желећи да буде прелазили преко 2Д низ када дођете до скрећем игру мрежу.
Разговарали смо о проналажење функција, о томе како желимо да се уверите у неколико ствари.
Желимо да се уверите да нисмо били на речи раније.
Такође желимо да се уверите да је то заправо у речнику.
Онда смо причали о јагма, о томе како желимо да ротирате одбор.
А знајући да ћете можда желети да направите копију нешто
бити у стању да га помери.
Најзад, разговарали смо о случају и осетљивости, о томе како желите да се уверите
да, упркос год комбинација случају да корисник улаза,
ако је важећа реч у речнику,
онда ће се правилно пронађен.
Дакле све то заједно је јагма псет, а то је проход 3.
Хвала свима што сте дошли, и срећно са јагма.
ЦС50.ТВ