[Powered by Google Translate] [Частка 4] [менш камфортна] [Nate Хардисон] [Harvard University] [Гэта CS50.] [CS50.TV] Добра, дабро запрашаем у падзел. У раздзеле гэтага тыдня мы збіраемся зрабіць некалькі рэчаў. Мы ідзем да першага пастаўленай задачы рэзюмэ 2, якая з'яўляецца наборам Цэзара і Виженера праблемы. І тады мы будзем апускацца ў агляд Віктарына 0 і выдаткаваць трохі часу, рэзюмуючы, што мы казалі пра У кожным з лекцый да гэтага часу, і мы таксама робім некалькі праблем ад віктарынах папярэдняга года. Такім чынам, вы, хлопцы, ёсць добры спосаб падрыхтавацца да гэтага. Для пачатку, я загрузіў некалькі добрых рашэнняў за папярэдні набор праблем, задач 2, у гэтай прасторы. Калі вы, хлопцы, усе трапілі на гэтую спасылку, і калі вы пстрыкніце сваё імя і націсніце на маім першым пераглядзе Вы ўбачыце caesar.c, а гэта менавіта тое, што я гляджу. Давайце пагаворым пра гэта вельмі хутка. Гэта ўсяго толькі прыклад рашэння. Гэта не абавязкова ідэальнае рашэнне. Ёсць шмат розных спосабаў, каб напісаць гэта, але ёсць некалькі рэчаў, якія я хацеў бы падкрэсліць што я бачыў, як я сартаванні, распаўсюджаныя памылкі, якія я думаю, гэтае рашэнне робіць вельмі добрую працу ў звароце. Першы па нейкай загаловак каментара ў верхняй частцы. У радках з 1 па 7 вы бачыце дэталі, што менавіта гэтая праграма робіць. Добрая стандартная практыка, калі вы пішаце код C незалежна ад таго, ваша праграма змяшчаецца ў адным файле або Ці ён пабіты на некалькі файлаў, каб мець нейкі арыенціровачны каментар на самым версе. Гэта таксама для людзей, якія выходзяць і напісаць код у рэальным свеце. Гэта дзе пакладуць інфармацыю аб аўтарскім праве. Ніжэй прыведзены # ўключае ў сябе. Па радку 16 ёсць гэтая # вызначыць, што мы вернемся ў толькі трохі. І вось аднойчы функцыя пачынаецца, як толькі асноўныя старты, таму што гэтая праграма была ўсё змяшчаюцца ў адной функцыяй Самае першае, што адбываецца, і гэта вельмі ідыёматычны і тыповыя праграмы C , Якая прымае ў аргументы каманднага радка-гэта тое, што ён адразу правярае па колькасці аргументаў, агдс. Вось тут мы бачым, што гэтая праграма чакае 2 аргументы дакладна. Памятаеце ёсць тое, што першы аргумент, што гэта асаблівы гэта заўсёды імя праграмы, якая запускаюцца, імя выкананага файла. І так, што яна робіць гэта не дазваляе карыстачу запусціць праграму з вялікім ці меншай колькасцю аргументаў. Таму мы хочам, каб праверыць гэта адразу таму, што мы не можам фактычна атрымаць доступ да гэтай ARGV масіва прама тут надзейна пакуль мы не правяралі, наколькі яна вялікая. Адна з найбольш распаўсюджаных памылак я бачыў, быў бы людзі адразу ідуць у і захоп ARGV [1]. Яны захапіць ключавыя аргументы з масіва і не да я праверыць на ім, а затым яны зробяць тэст на агдс, а таксама наступны тэст, Ці не першым аргументам было сапраўды цэлае, у той жа час, і гэта не працуе, таму што ў выпадку, калі няма аргументаў, Вы будзеце захапіць аргумент, што там няма або спробу захапіць адзін, што не. Іншая вялікая рэч, якую вы павінны былі заўважыць, што Вы заўсёды хочаце, каб раздрукаваць нейкі карысны паведамленне пра памылку карыстачу арыентавацца іх. Я ўпэўнены, што вы ўсё запуску праграм, дзе раптам ён выходзіць з ладу, і вы атрымаеце гэты смешны маленькі дыялог, які ўсплывае і кажа: нешта жудасна загадкавым і, магчыма, дае вам код памылкі ці нешта ў гэтым родзе што не мае сэнсу. Гэта дзе вы сапраўды хочаце, каб забяспечыць нешта карыснае і арыентаваныя на карыстача, так што, калі яны запусціць яго яны ідуць "О," асоба далонню. "Я дакладна ведаю, што рабіць. Я ведаю, як гэта выправіць". Калі вы не друкаваць паведамленне, то ў выніку вы на самой справе пакідаючы карыстачу пайсці вывучаць зыходны код каб высветліць, што пайшло не так. Ёсць таксама некалькі разоў, што вы будзеце выкарыстоўваць розныя коды памылак. Тут мы проста выкарысталі адзін кажуць, што адбылася памылка, адбылася памылка, адбылася памылка. Больш праграм, часта праграм, якія выклікаюцца іншымі праграмамі, вернецца нейкі адмысловы код памылкі ў розных сцэнарах праграмна паведаміць, што вы б інакш проста выкарыстоўваць добры англійская паведамленне для. Cool. Як мы працуем ўніз, вы бачыце, мы выцягнуць ключ з. Мы правяраем, каб убачыць, калі ключ падыходзіць. Мы атрымалі паведамленне ад карыстальніка. Таму мы робім гэта ў гэтым цыкле зрабіць у той час і гэта тое, што мы кроем У няшмат, але аказваецца, што калі ўвесці кантроль D калі вы атрымліваеце GetString радкі на тэрмінал што гэта на самай справе робіць гэта ён пасылае спецыяльны сімвал ў праграме. Гэта называецца ELF або сімвал канца файла. І ў гэтым выпадку, наша радок паведамлення будзе нулявым, так што гэта было не тое, што мы правяралі ў задачу паставіў перад сабой. Але, як мы будзем працягваць, цяпер, калі мы пачалі казаць пра паказальніках і дынамічнае выдзяленне памяці ў кучы, праверка на нуль кожны раз, калі ў вас ёсць функцыя, якая можа вярнуць нулявое значэнне, як тое, што вы хочаце атрымаць у звычку рабіць. Гэта тут, перш за ўсё для ілюстрацыі. Але калі вы бачыце GetString ў будучыні, так ад праблемы Set 4, Вы будзеце хацець мець гэта на ўвазе. Зноў жа, гэта не з'яўляецца праблемай для задач 3 альбо, так як мы не пакрываецца яшчэ. І, нарэшце, мы дабіраемся да гэтай частцы, дзе мы пяройдзем да асноўнай цыкл шыфравання, і ёсць некалькі рэчаў, што тут адбываецца. Па-першае, мы перабору ўсёй радкі паведамленні. Тут мы захавалі StrLen выклік у стан, якія многія з вас паказалі не вялікі шлях. Аказваецца, у гэтым выпадку ён таксама не вялікая, Збольшага таму, што мы, змяніўшы змесціва самога паведамленні ўнутры цыклу, так што калі ў нас ёсць паведамленне, што гэта 10 сімвалаў, Упершыню мы пачынаем цыкл, што для StrLen вернецца і што? 10. Але калі мы затым змяніць паведамленне, сказаць, што мы змяніць сваё 5-й знак, і кідаецца ў \ 0 знак у 5-й пазіцыі, на наступнай ітэрацыі StrLen (паведамленне) не вернецца, што ён зрабіў самы першы раз, калі мы паўторны, але замест гэтага вярнуць 5, таму што мы кінулі ў тым, што нулявы тэрмінатар, і даўжынёй струны вызначаецца становішчам, што \ 0. У гэтым выпадку, гэта выдатны спосаб пайсці, таму што мы змяніўшы яе на месца. Але вы заўважылі, што гэта на самай справе дзіўна простая для шыфравання калі вы можаце атрымаць матэматыку правільна. Усё, што патрабуецца, каб праверыць, ці сапраўды ліст, што вы глядзіце на гэта верхні або ніжні рэгістр. Таму мы толькі павінны праверыць, што і ў нас няма для праверкі гэта альфа справа ў тым, што Калі знак у верхнім рэгістры або, калі гэта маленькая то гэта вызначана літары, таму што ў нас няма вялікіх і малых знакаў. Іншая рэч, якую мы робім, і гэта крыху складана- гэта мы змянілі стандартны шыфр Цэзара формуле , Якія мы далі ў спецыфікацыі пастаўленай задачы. У чым розніца тут у тым, што мы вычыталі У верхнім рэгістры капіталу выпадак, і тады мы дадатковага капіталу Рэзервовае у канцы. Я ведаю, некаторыя з вас зрабілі гэта ў кодзе. Хто-небудзь з вас зрабіць гэта ў вашых паданнях? Вы зрабілі гэта. Ці можаце вы растлумачыць, што гэта робіць, Sahb? Шляхам адымання яго, таму што вы зрабілі мод адразу пасля яго, вы павінны прыняць яго, так што такім чынам вы атрымаеце [кашаль] пазіцыя. А потым, дадаўшы яго пазней вы перайшла той, які вы хацелі. Так, менавіта так. Што Sahb сказаў, што калі мы хочам дадаць наша паведамленне, і нашы ключавыя разам , А затым мод, які, мод, які па NUM_LETTERS, калі мы не будзем маштабаваць нашы паведамленні ў адпаведныя 0 да 25 Дыяпазон па-першае, Затым мы маглі б у канчатковым выніку атрымаць сапраўды дзіўны нумар таму, што каштоўнасці, якія мы глядзім на тое, калі мы глядзім на паведамленне [я], Калі мы глядзім на га характару нашых тэкставых паведамленняў, гэта значэнне дзесьці ў гэтым ад 65 да 122 Дыяпазон на аснове ASCII значэння для верхняга рэгістра ад А да Z малыя. І таму, калі мы мода гэта на 26 ці NUM_LETTERS, так як гэта быў наш # вызначыць у правым верхнім тут, што збіраецца даць нам значэнне, якое ў 0 да 25 дыяпазон, і нам патрэбен спосаб, каб затым маштабаваць, якія падтрымліваюць і атрымаць яго ў адпаведныя ASCII дыяпазону. Самы просты спосаб зрабіць гэта, каб проста маштабаваць ўсё ўніз у 0 да 25 Дыяпазон Пачнем з таго, , А затым перакласці ўсе назад у канцы. Яшчэ адна распаўсюджаная памылка, што я бачыў, людзі бягуць у тым, што калі вы на самой справе не зрабіць гэта прама зараз маштабавання і вы дадаеце паведамленне і ключавыя разам і дадаць іх, скажам, ў сімвал зменнай, праблема з гэтым гэта паведамленне, так як [я] з'яўляецца адносна вялікая колькасць, каб пачаць з- памятаеце, што гэта па меншай меры 65, калі гэта сімвал верхняга рэгістра- калі ў вас ёсць вялікі ключ, скажам, нешта накшталт 100, і вы дадаеце гэтыя 2 разам у падпісаных сімвал вы збіраецеся атрымаць перапаўненне. Вы збіраецеся атрымаць значэнне, якое перавышае 127, , Якая з'яўляецца найбуйнейшым значэнне, сімвал можа захоўваць зменная. Зноў жа, чаму вы хочаце зрабіць такую ​​рэч з самага пачатку. Некаторыя людзі атрымалі вакол гэтай справы рабіць, калі яшчэ і тэставання каб убачыць, калі яна будзе перапаўненне перш чым зрабіць гэта, але такім чынам атрымлівае ад усяго гэтага. І тады ў гэтым рашэнні мы выводзім ўсю радок у самым канцы. Іншыя людзі раздрукаваць сімвал за адзін раз. Абодва з'яўляюцца дзіўнымі. На дадзены момант, вы, хлопцы, ёсць якія-небудзь пытанні, ніякіх каментароў з гэтай нагоды? Што вам падабаецца, што вам не падабаецца? У мяне было пытанне. Можа быць, я прапусціў яго падчас вашага тлумачэнні, але як гэтая праграма прапусціць прасторы для падлучэння ключа да даўжыні тэксту? Гэта ўсяго толькі шыфр Цэзара. >> Эх, шкада, так. Так, мы бачым, што. У шыфр Цэзара мы абышлі, таму што Мы толькі перавярнуў знакаў. Мы толькі павярнуць іх, калі яны былі верхнім ці ніжнім рэгістры. Вы, хлопцы, адчуваў сябе даволі добра з гэтай нагоды? Вы можаце скапіяваць гэты дом, бяры, параўнаць яго з тым, што вы, хлопцы напісалі. Вызначана не саромейцеся, дасылайце пытанні на гэтую тэму таксама. І зноў жа, разумею, што мэта тут з вашай праблемай ўсталёўвае Не каб вы, хлопцы, каб напісаць ідэальны код для мноства праблем. Гэта вопыт. Так. Вярнуцца да рабіць падчас цыклу, калі ён роўны нулю, так нулявога проста нічога не значыць, яны проста націсніце ўвод? Null гэта спецыяльнае значэнне паказальніка, і мы выкарыстоўваем нуль, калі мы хочам сказаць, у нас ёсць паказальнік зменнай, якая паказвае на няма. І звычайна гэта азначае, што гэтая пераменная, гэтая пераменная паведамленне пуста, і тут, таму што мы выкарыстоўваем CS50 асаблівы тып радкі, што CS50 тып радкі? Ці бачылі вы, што гэта такое, калі Дэвід адкінуў капюшон ў лекцыі? Гэта фанкі-гэта паказальнік, дакладна? Добра, так. >> Гэта сімвал *. І так на самай справе мы маглі б замяніць гэтую прама тут з сімвалаў паведамленняў *, і так GetString функцыя, калі яна не паспяхова атрымаць радок ад карыстальніка, ён не можа разабраць радок, і ў адным выпадку, у якім ён не можа разабраць радок , Калі карыстальнік ўводзіць сімвал канца файла, кантрольная D, які не тое, што вы звычайна робіце, але калі гэта адбудзецца, то функцыя верне гэта значэнне, як спосаб сказаць "Гэй, я не атрымаць радок". Што адбудзецца, калі мы не ставім паведамленне = NULL, якіх з'яўляецца тое, што мы не рабілі яшчэ? Чаму б гэта было тут праблема? Таму што я ведаю, што мы крыху пагаварылі ў лекцыі аб уцечках памяці. Так, давайце зробім гэта, і давайце паглядзім, што адбудзецца. Пытанне Васіля Блажэннага было тое, што адбудзецца, калі мы на самай справе не гэта паведамленне = NULL тэст? Давайце пракруткі уверх да вяршыні. Вы, хлопцы, можаце пракаментаваць гэта. На самай справе, я выратую яго ў пераглядзе. Гэта будзе 3-я рэдакцыя. Што вы павінны зрабіць, каб запусціць гэтую праграму, вам прыйдзецца націснуць гэтую значок з выявай шасцярэнькі тут, і вы будзеце мець, каб дадаць аргументы да яго. Вы павінны даць яму галоўны аргумент, так як мы хочам перадаць у аргуменце каманднага радка. Тут я збіраюся даць яму нумар 3. Мне падабаецца 3. Цяпер маштабаванне назад, запусціўшы праграму. Гэта працуе, кампіляцыя, будаўніцтва. Тут мы ідзем. Ён чакае запыту. Калі я ўводжу нешта накшталт прывітанне-дзе прайшло? О, мая праграма займае занадта шмат часу для запуску. Я быў jawing занадта доўга. Вось ён ідзе. Зараз я набіраю ў прывітанне. Мы бачым, што ён шыфруе належным чынам. Цяпер, што адбудзецца, калі мы робім хуткую GetString вярнуць NULL? Памятаеце, я казаў, што мы зрабілі гэта, націснуўшы кіравання D ў той жа час. Я прагортку ўверх тут. Мы будзем запускаць яго зноў. Будаўніцтва. Там ён ідзе. Цяпер, калі я ударыў кіравання D Я атрымаў гэты радок, якая кажа opt/sandbox50/bin/run.sh, памылкі сегментацыі. Хіба вы, хлопцы, бачылі, што раней? [Студэнт] Чаму не->> Прабачце? [Студэнт] Чаму няма дампа памяці ў гэтым выпадку? Дамп гэта-пытанне чаму няма дампа тут? Пытанне ў тым, што там можа быць, але дамп ўяўляе сабой файл , Які атрымлівае захоўваецца на цвёрдым дыску. У гэтым выпадку мы адключылі дампы на бягу сервер, так што мы не былі людзі сегментах разломаў і стварэнне тон дампы памяці. Але вы можаце атрымаць. Асноўныя звалкі такая штука, што часта можна адключыць, і часам вы робіце. Сегментацыя віна, каб адказаць на ваша пытанне, Васіль, кажа, што мы паспрабавалі атрымаць доступ да паказальніка , Якія не былі ўсталяваныя, каб паказаць на што-небудзь. Памятаеце, Бинки ў відэа, калі Бинки спрабуе перайсці да паказальніка, які не паказваючы на ​​што-небудзь? У гэтым выпадку я думаю, тэхнічна паказальнік паказвае на нешта. Гэта паказвае на нулявы, які з'яўляецца тэхнічна 0, але, што называецца ў сегменце, які не даступны па вашай праграме, так што вы атрымаеце памылку сегментацыі таму што вы не доступу да памяці, які ў дзеючы сегмент як сегмент кучы або стэку сегмент або сегмент дадзеных. Cool. Любыя пытанні аб Цэзара? Давайце рухацца далей. Давайце паглядзім на перагляд 2 вельмі хутка. Вось Виженера. Тут, у Виженера Мы пройдзем праз гэта даволі хутка, таму што, зноў жа, Виженера і Цэзара вельмі падобныя. Загалоўку гэтай заўвагі раней, # Вызначыць гэта перш за пазбегнуць выкарыстання гэтых магічных лікаў. Прыемна тое, што мы хочам, каб перайсці да розных алфавіту ці нешта накшталт гэтага. Замест таго, каб ісці ўручную змяняць усе 26 у кодзе мы маглі б змяніць гэта 27 або кінуць яго ўніз калі б мы выкарыстоўвалі розныя алфавіты, розныя мовы. Зноў жа, у нас ёсць гэтая праверка колькасць аргументаў, і сапраўды можна амаль прыняць гэта ў якасці шаблону. Практычна кожны праграме вы павінны напісаць- калі ён прымае аргументы каманднага радка-некаторая паслядоўнасць ліній , Які чытаецца як гэта ў самым пачатку. Гэта адно з першых выпрабаванняў здаровае вы хочаце зрабіць. Вось тое, што мы рабілі, было мы пераканаліся, што Ключавое слова сапраўды было, і гэта была другая праверка, што мы і зрабілі. Звярніце ўвагу яшчэ раз, што мы аддзяліліся ад гэтага ARGC і 2. Звярніце ўвагу, што ў гэтым выпадку адна рэч, якую мы павінны былі зрабіць, было, замест выкарыстання, каб я, мы хацелі праверыць усю радок, і для таго, каб рабіць, што вы на самой справе трэба ісці па адным знаку за радком. Там няма добры спосаб называць штосьці на ёй таму што нават, напрыклад, каб я верне 0 калі ён не можа разабраць цэлае, так што нават не працуе. Зноў жа, добрае паведамленне аб тым, карыстачу менавіта тое, што адбылося. Тады тут, зноў жа, мы таксама апрацоўваем выпадак, калі Карыстальнік ўводзіць у элемент кіравання D выпадковы характар. І тады Шарлота было пытанне раней пра тое, як нам удасца прапусціць прасторы У нашым радок тут. Гэта было збольшага падобна на тое, што мы зрабілі з Myspace праграмы што мы зрабілі ў раздзеле, і тое, як гэта працуе тое, што мы адсочвалі колькасць лістоў, якія мы бачылі. Калі мы ішлі праз радок паведамлення, як мы ішлі па адным знаку, Мы адсочвалі індэкс як частка нашага цыклу, і тады мы таксама адсочвалі колькасць літар, так што без спецыяльных сімвалаў, без лічбаў, без прабелаў што мы бачылі ў асобнай зменнай. А потым гэтае рашэнне змяняе ключ каб атрымаць фактычны ключ цэлае, і ён робіць гэта на лета, Права, перш чым ён потым ідзе для шыфравання фактычны характар ​​паведамленні. Ёсць некаторыя рашэнні, якія былі цалкам выдатнымі таксама што б змяніць ўверх пры праверцы дзеянні ключа. У дадатак да пераканаўшыся, што характар ​​і ключавое слова быў літары Аказалася таксама, што ў цэлае У 0 да 25 дыяпазон затым прапусціць таго, каб зрабіць гэта пазней у гэтым цыкле. Зноў жа, вы бачыце тут, гэта сапраўды сапраўды такі жа код якія мы выкарыстоўвалі ў Цэзар у гэтай кропцы. Ты робіш адно і тое ж, так што рэальны трук з'яўляецца высвятленне таго, як уключыць ключавое слова ў цэлае. Адна рэч, якую мы зрабілі тут, што некалькі шчыльных гэта мы паўтарылі гэтую фразу, я думаю, вы маглі б назваць яго, 3 асобных разы на 58 ліній, 59 і 61. Можа хто-небудзь растлумачыць, што менавіта гэтая фраза робіць? Гэта доступе характар, як вы сказалі. Так, гэта [неразборліва] знакаў у ключавых слоў, і таму гэты лік літар бачыў, таму што вы толькі рухаючыся ўздоўж Ключавое слова раз вы бачылі ліст, так што гэта будзе эфектыўна прапусціць прастор і таму падобнае. Так, менавіта так. А потым, як толькі вы бачылі ключавое слова пустым вы проста мода, каб вы вярнуцца вакол. Менавіта так. Гэта ідэальнае тлумачэнне. Што Кевін сказаў, што мы хочам, каб індэкс ў ключавое слова. Мы хочам, каб num_letters_seen характар, калі хочаце, Але калі num_letters_seen перавышае даўжыню ключавога слова, Так мы вернемся ў адпаведным дыяпазоне мы выкарыстоўваем мод аператара эфектыўна абгарнуць вакол. Напрыклад, як у кароткатэрміновай, наша ключавое слова бекон, і гэта 5 літар. Але мы бачылі 6 літар у нашай тэкстам у гэтай кропцы і зашыфраваныя 6. Мы ў канчатковым выніку доступ да num_letters_seen, , Што на 6, мод даўжыня ключавога слова, 5, і такім чынам мы атрымаем 1, і так, што мы будзем рабіць гэта мы будзем доступ да першага ў характары нашага ключавога слова ў гэтай кропцы. Добра, любыя пытанні па Виженера перш чым рухацца далей? Вы, хлопцы, адчуваў сябе даволі добра з гэтай нагоды? Крута, вялікае. Я хачу, каб пераканацца, што вы, хлопцы атрымліваюць шанец убачыць код што мы думаем, выглядае добра, і ёсць шанец даведацца ад яго. Гэта будзе апошняй мы будзем выкарыстоўваць прабелы ў цяперашні час, і мы збіраемся пераходзіць цяпер, і я збіраюся пайсці ў cs50.net/lectures так што мы можам зрабіць трохі агляду віктарыны. Лепшы спосаб Я думаю, што пачаць рабіць тэст агляд павінен прыйсці да гэтай лекцыі старонцы, cs50.net/lectures, і пад кожным з загалоўкаў тыдзень, так што калі я гляджу тут на Тыдні 0, Я бачу, што ў нас ёсць спіс пытанняў, якія мы абмяркоўвалі ў тыдзень 0. Калі любая з гэтых тэм здаецца незнаёмай для вас вы вызначана хочаце, каб вярнуцца і прочесать лекцыі і, магчыма, нават бегла лекцыі, глядзець іх зноў, калі вы хочаце каб адчуваць сябе за тое, што адбываецца з кожным з гэтых тэм. Скажу дадаткова ў гэтым годзе адзін з прахалодных рэсурсы ў нас ёсць Менавіта гэтыя шорты, якія мы стварылі, і калі вы паглядзіце на Тыдні 0, у нас няма ўсіх тэмах, але ў нас ёсць даволі шмат з іх, некаторыя з іх складаней, таму назіраць гэтыя шорты зноў гэта добры спосаб, каб вы да хуткасці. У прыватнасці, я збіраюся паставіць у раз'ём для 3 на дне, так як я зрабіў тыя. Але калі вы змагаецеся з двайковай, біты, шасцігранныя, у такім жа родзе, двайковых з'яўляецца выдатным месцам для пачатку. ASCII яшчэ адзін, гэта добра, каб прагледзець таксама. Вы нават можаце сачыць за мной у 1,5 разы хуткасць, калі я буду занадта павольным для вас. Так як гэта водгук, не саромейцеся рабіць гэта. Проста, каб пачаць вельмі хутка, мы збіраемся прайсці праз пару такіх віктарыны праблемы проста хутка адтоку праз іх. Напрыклад, давайце паглядзім на праблемы 16, што ў мяне прама тут на дошцы. У нас гэта наступны разлік у двайковай, і мы хочам паказаць любую працу. Добра, я збіраюся даць гэтаму стрэл. Вы, хлопцы, павінны прытрымлівацца разам з паперай, і мы будзем рабіць гэта вельмі хутка. Мы хочам, каб выканаць наступныя разлікі ў двайковай сістэме. У мяне 00110010. І я збіраюся дадаць да яго 00110010. Для геніяў матэматыкі вынікаючы ўздоўж дома, Гэта фактычна памнажэннем на 2. Давайце пачнем. Мы збіраемся прытрымлівацца той жа алгарытм таго, што мы робім калі мы дадаем дзесятковых лікаў. Сапраўды Адзіная розніца ў тым, што мы пятля назад вакол калі ў нас будзе 1 + 1, а не толькі мы атрымаем да 10. Калі мы пачнем з правага боку, вельмі хутка, што першая лічба? [Студэнт] 0. >> [Nate H.] 0. Вялікі, другая лічба? [Студэнт] 1. [Nate H.] Гэта 1? 1 + 1 ёсць? [Студэнт] 10. [Nate H.] Сапраўды, так у чым жа лічбу, што я пішу прама пад 2 адзінкі складваюцца? [Студэнт] 1, 0 або 0, а затым правесці 1. [Nate H.] 0 і несці 1, дакладна. Далей 1 ўверх, Васіль, вы ўверх. Які трэці? >> [Васіль] 1. [Nate H.] 1, дасканалым. Кевін? [Кевін] 0. >> [Nate H.] 0, Шарлота? [Charlotte] 0. >> [Nate H.] Так, і што мне рабіць? [Студэнт] 1. [Nate H.] І што мне рабіць? І тады я нясу 1. Perfect, Sahb? >> [Sahb] Зараз у вас ёсць 1. [Nate H.] І я раблю нешта тут? [Sahb] Тады для наступнага ў вас ёсць 1, таму што вы пераносіцца на 1. [Nate H.] Вялікі, так што тут мы можам скончыць гэта. Cool. [Студэнт] Лі 0 + 0 = 0? 0 + 0 = 0. 1 + 1, як вы сказалі, 10, або 1, 0, а. 10 з'яўляецца няправільным, таму што мне 10 азначае лік 10, і гэта дзівацтва, як мы, прадстаўляючы яго, калі мы пішам гэта. Уявім лік 2, 1, 0, а лік 10 трохі адрозніваецца. Што збольшага добра пра бінарных тое, што ёсць на самой справе не так шмат выпадках трэба вучыцца. Там у 0 + 0 = 0, 0 + 1 = 1, 1 + 1 = 0, а затым выканаць 1, а затым вы можаце ўбачыць тут, на трэцім слупку справа у нас было гэта 1, 1, 1. А 1 + 1 + 1 1, і вы несяце іншую 1. Калі вы робіце двайковай Акрамя таго, даволі простая. Я зраблю яшчэ пару гэтых здаровае праверыць сябе перш чым вы ідзяце, таму што гэта верагодна, тое, што мы бачым на віктарыну. Зараз давайце зробім гэта ў наступны таксама. Давайце зробім праблемы 17. Мы збіраемся пераўтварыць наступным двайковага ліку ў дзесятковы. У мяне 10100111001. Памятаеце, у падвоеным відэа, якое я зрабіў Я ішоў праз пару прыкладаў, і я паказаў, як усё працуе, калі вы робіце гэта ў дзесятковай сістэме. Калі вы працуеце ў дзесятковы ўяўленне Я думаю, што мы На дадзены момант у нашай жыцця так бегла кажа на гэта, што гэта даволі лёгка замазаць механіку таго, як яна сапраўды працуе. Але каб зрабіць хуткае рэзюмэ, калі ў мяне ёсць нумар 137 У рэчаіснасці гэта азначае і зноў жа, гэта ў дзесятковы шоу- лік 137 у дзесятковай азначае, што ў мяне ёсць 1 х 100 + 3 х 10 + 7 х 1. Гэта ўсё знаходжання на экране. І потым, калі вы паглядзіце на гэтыя лічбы прама тут, 100, 10 і 1, вы бачыце, што яны на самой справе ўсё паўнамоцтвы 10. У мяне ёсць 10 ², 10 ¹, і ад 10 да нуля. У нас падобнага роду рэчы ў двайковай, выключэннем таго, што наша база, як мы яго называем, складае 2 замест 10. Гэтыя 10s, што я напісаў тут на дне, гэта 10 ², 10 ¹, 10 да нуля, 10, наша база, і паказчык, 0, 1, або 2, выцякае з становішча лічбы ў нумары, што мы пішам. 1, калі мы паглядзім на гэта, гэта 1, у 2-й пазіцыі. 3 у 1-й пазіцыі, а 7 знаходзіцца ў 0-й пазіцыі. Вось як мы атрымаем розныя паказчыкі ніжэй для нашай базы. Пасля ўсяго гэтага МЫ-на самай справе, вы ведаеце, што? Мы зробім усё, дзе ж мой адмяніць кнопку ісці? Там ён ідзе. Я люблю гэтую рэч адмяніць. Пасля гэтага я думаю, для мяне па крайняй меры Самы просты спосаб пачаць пераўтварэнні двайковага ліку або шаснаццатковы лік, дзе база знаходзіцца ў 16 , А не 10 або 2, каб ісці наперад і пішам баз і індэксаў для ўсіх лікаў у маёй двайковага ліку ў верхняй частцы. Калі мы пачнем злева направа зноў, якая з'яўляецца своеасаблівай парадаксальна, Я змяню Back To Black тут, у нас ёсць 2 да 0-я пазіцыя, а то ў нас 2 ¹, 2 ², а затым ад 2 да 3, ад 2 да 4, 2 да 5, 6, 7, 8, 9 і 10. Гэтыя лічбы я выпісаў ўсе паказчыкі. Я толькі напісаў баз тут у першыя 3 толькі для прасторы. На дадзены момант я збіраюся ісці наперад і на самай справе я збіраюся сцерці рэчы, якія мы зрабілі ў дзесятковай, калі гэта нармальна. Вы ўсё зразумеў. Тыя з вас, глядзець онлайн Я ўпэўненая, што зможа пераматаць мяне, калі хочаце. Пераключэнне назад на пяро. Такім чынам, што мы можам зрабіць, калі вы, хлопцы, не цалкам да хуткасці на свае сілы 2, гэта абсалютна выдатна. Гэта бывае. Я разумею. Я калісьці на сумоўе, дзе мне сказалі, што я павінен ведаць усе ступені ліку 2 ўверх праз 2 да 30. Гэта была не праца ў мяне ёсць. У любым выпадку, вы, хлопцы, можаце ісці наперад і рабіць матэматыку тут, але з бінарнымі гэта сапраўды не мае сэнсу, і таксама не мае сэнсу з дзесятковай або шаснаццатковай альбо, рабіць матэматыку, дзе ў вас ёсць нулі. Вы можаце бачыць, у мяне 0 тут, сюды 0, 0 тут, 0 тут, 0 тут, 0 тут. Чаму гэта магло б ніякага сэнсу рабіць фактычныя матэматыцы Для разліку адпаведнай магутнасці 2 на гэтую пасаду? Менавіта так, як сказала Шарлота, гэта будзе 0. Мог бы таксама зэканоміць час, калі вылічэнні ступені ліку 2 не з'яўляецца вашай моцнай бокам. У гэтым выпадку нам трэба толькі вылічыць яго для 2 да 0, што-? [Студэнт] 1. [Nate H.] 1, 2 да 3, які з'яўляецца-? [Студэнт] 8. >> [Nate H.] 8. Ад 2 да 4? [Студэнт] 2. Мне вельмі шкада, 1. [Nate H.] 2 да 4, 16, дакладна. Ад 2 да 5, Кевін? >> 32. [Nate H.] 32, ад 2 да 8? [Студэнт] 32 х 8, 256. [Nate H.] Perfect. І ад 2 да 10? [Студэнт] 1024. [Nate H.] Так, 1024. Пасля таго як мы атрымалі гэтыя лічбы мы можам падвесці іх усе. І гэта, дзе гэта сапраўды важна зрабіць некалькі рэчаў. Адзін з іх, ідучы павольна і праверыць вашу працу. Вы можаце сказаць, што ёсць 1 у канцы гэтага ліку, так што я абавязкова павінны атрымаць няцотны лік, як мой вынік, таму што ўсе астатнія збіраюцца быць цотнымі нумарамі улічваючы, што гэта двайковы лік. Іншая рэч, якую трэба зрабіць, гэта калі вы дабрацца да гэтай кропкі на выпрабавальным і вы напісалі яе так далёка і вы працуеце па-за часам паглядзіце на колькасць ачкоў, што гэтая праблема стаіць. Гэтая праблема, як вы можаце бачыць, калі я сальта назад з маім ноўтбукам сапраўды хутка- гэтая праблема стаіць 2 ачкі, так што гэта не з таго Вы павінны ісці праз, калі вы сапраўды мала часу. Але мы будзем вярнуцца да iPad, і мы будзем прайсці праз гэта вельмі хутка. Мне падабаецца рабіць невялікія ліку спачатку таму што я лічу, што прасцей. Мне падабаецца 32 і 8, таму што яны ідуць разам даволі лёгка, і мы атрымліваем 50. 16 і 1 атрымлівае 17. Там мы атрымаем 57, і тады мы зможам зрабіць усё астатняе з гэтага, так што мы можам зрабіць, 57, 156. Пойдзем. Чалавек, добра, давайце паглядзім. У нас было 57, 256 і 1024. На дадзены момант, я б проста прайсці. Я паняцця не маю. Я выразна трэба чытаць на гэтым. 7, 6, 4, Вы атрымліваеце 17. 1, 5, 5, 2, 13. Тады мы атрымаем 3, а затым мы атрымліваем 1. 1337. Велікоднае яйка, ніхто? Ніхто прызнаць гэты нумар? Крыс прызнаецца ліку. Што гэта значыць, Крыс? [Chris] Leet. Leet, так што калі вы паглядзіце на гэта, падобна, Літ. Хакер рэчы. Сачыце за такога роду рэчы па сярэднетэрміновай або тэст, а. Калі вы бачыце такія рэчы, і вы задаецца пытаннем "А" , Што можа на самой справе нешта значаць. Я не ведаю. Дэвід любіць пакласці яго цалі Гэта добры спосаб праверыць яго стан сьвядомасьці. Як добра, я бачу, што адбываецца. Вось тыдзень 1 0/Week рэчы. Калі вярнуцца да нашых ноўтбукам зараз, паменшыць маштаб, і пару іншых рэчаў. Там у ASCII, якія мы рабілі шмат з праблемай набору. Гэта паняцце капіталу A. Што гэта на самай справе? Ведаючы гэта дзесятковы лік. 65 з'яўляецца тое, што ён адлюстроўваецца ў табліцы ASCII, і вось таму, як кампутар піша ён, і гэта, як мы ўжо сыходзіць з фактычнай запісу характар ​​капіталу і характар ​​ніжняга рэгістра У некаторых з гэтых рашэнняў і праблема набору, што вы рабілі. Некалькі іншых рэчаў. У нас ёсць заявы, лагічныя выразы, умовы, цыклы, зменныя і патокаў. Тыя, усё, здаецца, мае сэнс па большай частцы? Некаторыя з гэтай тэрміналогіі трохі напалоханым ў разы. Мне падабаецца думаць, заявы, як па большай частцы тое, што заканчваецца кропкай з коскі. Такія заявы, як х = 7, якая ўсталёўвае зменную Меркавана называецца х = 7. Меркавана х таксама тып, які можа захаваць нумар 7, так што Int або, магчыма, таркай або кароткая або сімвал, нешта накшталт гэтага. Лагічнае выраз выкарыстоўвае гэтыя падвойныя роўна і выбуху роўная або не роўная, менш, больш, чым, менш або роўныя, усё ў такім жа родзе. Умовы гэта значыць, калі іншае справаздачнасці. Я памятаю, што вы не можаце мець іншае без адпаведных калі. Акрамя таго, вы не можаце мець яшчэ, калі без адпаведных калі. Завесы, нагадаем 3 выгляду завес мы былі ў вас малатком за апошнія пару секцый і праблемы мноства. Выкарыстанне жа час, калі вы атрымліваеце карыстацкага ўводу, выкарыстанне ў той час як завесы, пакуль пэўны ўмова праўдзіва, , А затым з дапамогай гэтых цыклаў, калі вам трэба ведаць, якія ітэрацыі цыклу вы зараз знаходзіцеся, як я думаю пра гэта. Або калі вы робіце для кожнага знака ў радку я хачу нешта зрабіць, Для кожнага элемента ў масіве я хачу нешта зрабіць, каб гэтага элемента. Тэмы і падзеі. Гэтыя якія мы не так відавочна ў C, але памятайце, гэта з нуля. Гэта паняцце, якія маюць розныя сцэнары. Гэта таксама гэта паняцце трансляцыі падзеі. Некаторыя людзі не выкарыстоўвалі вяшчанне ў сваіх праектах на пачатковым этапе, які цалкам халаднавата, але гэтыя 2 розныя спосабы апрацоўкі гэтага больш праблем, паралелізм, які з'яўляецца, як вы атрымліваеце праграм для выканання або, здавалася б выканаць у той жа час? Розныя задачы, якія выконваюцца ў той час як іншыя задачы таксама працуе. Гэта, як ваша аперацыйная сістэма, здаецца, працуе. Вось чаму, хоць, напрыклад, У мяне ёсць мой браўзэр працуе, я таксама можаце ўключыць Spotify і гуляць песні. Гэта больш, канцэптуальныя рэчы, каб зразумець. Я хацеў бы зірнуць на тэмы, коратка Калі вы хочаце даведацца больш аб гэтым. Давайце паглядзім, я лічу, што можна было б Праблема пра гэта ў адным з іх. Зноў жа, я думаю, што тэмы і падзеі, не тое, што мы разгледзім у C толькі таму, што гэта значна цяжэй, чым у Scratch. Вы не павінны турбавацца пра яе, але, безумоўна, разумеюць канцэпцыі, зразумець, што адбываецца. Перш чым рухацца далей, любыя пытанні на тыдзень 0 матэрыялаў? Кожны адчуваў сябе даволі добра? Разуменне зменных і што такое зменная? Рухаемся далей. Тыдзень 1. Некалькі рэчаў тут, якія не былі асабліва пакрытыя У віктарыне водгук абавязкова, а таксама больш канцэптуальныя рэчы, каб думаць. Па-першае, гэта паняцце аб тым, што зыходны код, кампілятары і аб'ектны код ёсць. Хто-небудзь? Васіля. З'яўляецца аб'ектна-код я маю на ўвазе зыходнага кода з'яўляецца тое, што вы паклалі ў ляск, і аб'ектны код з'яўляецца тое, што звонам ставіць так, што ваш кампутар можа прачытаць праграму. Менавіта так. Зыходны код код C, што вы на самай справе надрукаваць. Код аб'екта з'яўляецца тое, што вы выходзіце з ляск. Гэта 0 і 1, што ў двайковым фармаце. Тады што ж адбываецца, калі ў вас ёсць некалькі аб'ектных файлаў, сказаць, што вы збіраеце праект або праграма, якая выкарыстоўвае некалькі файлаў зыходнага кода, якія па дамове прадастаўляецца. з пашырэннем файла. Вось чаму ў нас ёсць caesar.c, vigenère.c. Калі вы пішаце Java праграмы вы даеце ім пашырэнне. Java. Python праграмы маюць пашырэнне. Ру часта. Калі ў вас ёсць некалькі. З файламі, вы іх кампіляцыі. Clang выплёўвае ўсё гэта двайковы смецце. Потым, таму што вы толькі хочаце 1 праграма ў вас ёсць кампаноўнік спасылцы ўсе гэтыя аб'ектныя файлы разам у 1 выкананы файл. Гэта таксама тое, што адбываецца, калі вы выкарыстоўваеце CS50 бібліятэцы, напрыклад. Бібліятэка CS50 з'яўляецца і тое. Ч. файл загалоўка што вы чытаеце, што # includecs50.h. І тады гэта таксама спецыяльны файл бібліятэкі двайковых , Якое было складзена гэта 0 і 1, і што-л сцяг, таму, калі мы вернемся да нашых прасторах і мы глядзім вельмі хутка на тое, што тут адбываецца, калі мы глядзім на нашу каманду ляск, тое, што мы атрымалі, гэта наш зыходны код файла прама тут. Гэта куча сцягоў кампілятара. І тады ў самым канцы, гэтыя-л сцягі спасылку ў фактычныя двайковыя файлы на гэтыя 2 бібліятэкі, CS50 бібліятэкі, а затым матэматычную бібліятэку. Разуменне кожнага тыпу файлаў мэты " У працэсе кампіляцыі з'яўляецца тое, што вы хочаце, каб мець магчымасць даць хоць бы падрабязны агляд. Зыходны код прыходзіць цалі Код аб'екта выходзіць. Файлы Код аб'екта звязаць разам, і вы атрымаеце прыгожы, выкананы файл. Cool. Гэта таксама, дзе вы можаце атрымаць памылкі ў некалькіх кропках У працэсе кампіляцыі. Гэта калі, напрыклад, калі вы возьмеце гэтую сувязь сцяг, CS50 сцяг, і вы апусціце яго ў прасторы або калі вы працуеце ваш код, гэта дзе вы атрымаеце памылку ў стадыі кампаноўкі, і кампаноўнік будзе сказаць: "Гэй, вы завецца функцыяй GetString , Які ў CS50 бібліятэкі ". "Вы сказалі мне, што ў CS50 бібліятэка, і я не магу знайсці код для яго." Вось дзе вы павінны звязаць яго, і гэта асобная ад памылкі кампілятара, таму што кампілятар глядзіць на сінтаксіс і такога роду рэчы. Гэта добра, каб ведаць, што адбываецца, калі. Іншыя рэчы, каб ведаць. Я б сказаў, вы вызначана хочаце, каб зірнуць на кароткім на прывядзенне зроблена Іарданіі каб зразумець, што цэлымі знаходзіцца пад капотам, якія сімвалы знаходзяцца пад капотам. Калі мы гаворым пра ASCII, і мы на самай справе глядзім на табліцу ASCII, што гэта робіць дае нам пад капотам погляд на тое, як кампутар на самай справе ўяўляе капіталу і лічба 7 і коска і знак пытання. Кампутар таксама мае спецыяльныя спосабы прадстаўлення лік 7, як лік. Гэта мае асаблівае спосаб прадстаўлення ліку 7 як лік з якая плавае кропкай, і тых, хто вельмі розныя. Прывядзенне то, як вы кажаце кампутар "Гэй, я хачу вам канвертаваць ад аднаго прадстаўлення да іншага прадстаўленні ". Чаму б нам не паглядзець на гэта. Я хацеў бы таксама зірнуць на кароткіх па бібліятэках і кароткі на кампілятары. Гэтыя размовы аб працэсе кампіляцыі, што бібліятэка, і перайсці на некаторыя з гэтых пытанняў, якія вы маглі б спытаў. Пытанні па тыдзень 1 матэрыял? Ці ёсць тэмы тут, што ў засмучэнне вы хочаце, каб пакрыць? Я стараюся, каб прадуць большасць з іх раней тым, каб мы маглі дабрацца да паказальнікаў і зрабіць трохі рэкурсіі. Думкі? Усё, што для пакрыцця? Час для некаторых шакалад можа быць? Вы, хлопцы, працуеце праз яго. Я буду трымаць пацягваючы свой кавы. 2-я тыдзень. Добрае слова, добры выклік. У 2-я тыдзень, мы гаварылі трохі больш пра функцыях. У першыя некалькі камплектаў праблемы мы сапраўды не пісаць ніякіх функцый на ўсіх акрамя якім функцыя? [Студэнт] Main. >> Галоўнае, дакладна. І так мы бачылі розныя касцюмы, што асноўнай носіць. Там у адной, у якой ён не прымае аргументаў, і мы проста скажам, пустэчу ў круглых дужках, і тады ёсць іншы, дзе мы хочам прымаць аргументы каманднага радка, і, як мы бачылі, што там у вас ёсць Int ARGC і ARGV масіў радкоў ці цяпер, калі мы на самай справе падвяргаецца радкі, каб быць знак *, што мы збіраемся, каб пачаць пісаць яго як сімвал * ARGV, а затым дужкі. У задачы Set 3, вы, хлопцы, бачылі кучу функцый, і вы рэалізавалі кучу функцый, маляваць, глядзець уверх, сутычка. Прататыпы былі напісаныя там для вас. Тое, што я хацеў распавесці пра тут з функцыямі вельмі хутка з'яўляецца тое, што існуе 3 частак да іх кожны раз, калі вы пішаце функцыю. Вы павінны пазначыць тып якое вяртаецца значэння функцыі. Вы павінны паказаць імя функцыі, а затым вы павінны паказаць Спіс аргументаў або спісу параметраў. Напрыклад, калі б я напісаць функцыю, каб падвесці вынікі кучу цэлых лікаў , А затым вярнуцца да мяне суму, што было б майго вяртання тыпу калі б я хацеў, каб падвесці цэлых лікаў, а затым вярнуць суму? Тады імя функцыі. Калі я пайду наперад і напісаць у зялёны, гэтая частка вяртаецца тыпу. Гэтая частка назвы. А потым у дужках Тут я даю аргументы, Часта скарочана аргументы, якія часам называюцца параметрамі для параметраў. І калі ў вас ёсць, вы проста паказваеце адзін. Калі ў вас некалькі вы падзеліце кожны з коскі. І для кожнага аргументу, вы даеце яму 2 рэчы, якія, Кевін? [Кевін] Вы павінны даць тыпу, а затым імя. І тое імя, і імя гэтае імя, якое вы збіраецеся выкарыстоўваць спасылацца на гэты аргумент у межах сумы функцый, у межах функцыі, якія вы ў цяперашні час напісання. Вы не павінны, напрыклад, калі я збіраюся падводзіць вынікі, скажам, масіў цэлых лікаў-Мы робім Int масіва, і я дам сабе некаторыя фігурныя дужкі там- Затым, калі я перадаць масіў у суме функцый Я перадаю яго ў першую пазіцыю спісу аргументаў. Але масіў, які я праходжу ў не павінна мець назву апр. Обр будзе, як я спасылацца на гэты аргумент у целе функцыі. Іншая справа, што мы павінны прыняць да ўвагі, і гэта трохі адрозніваецца ад функцыі, але я думаю, гэта важны момант, з'яўляецца тое, што ў C, калі я пішу гэтую функцыю, як Адкуль я ведаю, колькі элементаў у гэтым масіве? Гэта свайго роду пытанне з падвохам. Мы гаварылі пра гэта трохі ў раздзеле мінулым тыдні. Як мне даведацца колькасць элементаў ўнутры масіва ў C? Ці ёсць спосаб? Аказваецца, што няма ніякага спосабу даведацца. Вы павінны перадаць яго ў асобнасці. Існуе трук, які вы можаце зрабіць калі вы знаходзіцеся ў той жа функцыяй, у якой масіў быў абвешчаны, і вы працуеце са стэкам масіва. Але гэта працуе, толькі калі вы знаходзіцеся ў той жа функцыі. Пасля таго як вы перадаць масіў у іншую функцыю або калі вы абвясцілі масіў а вы ставіце гэты масіў у кучы, вы выкарыстоўвалі таНос  і ў такім жа родзе, то ўсе стаўкі выключаны. Тады вам на самай справе трэба абыйсці адмысловы аргумент ці іншай параметр кажу вам, як вялікі масіў. У гэтым выпадку, я хацеў бы выкарыстаць коску-Прабачце, гэта будзе ад экрана тут- і я б перайсці ў іншы аргумент  і называць яго Int даўжыня па даўжыні. Адна рэч, якая можа прыйсці на тэст просіць вас напісаць або ажыццяўляць пэўную функцыю называюць нешта. Калі мы не дамо вам прататып, так што гэта ўсё справа тут, ўвесь гэты бардак называецца аб'яву функцыі або прататып функцыі, гэта адна з першых рэчаў, якія вы хочаце, каб прыбіць, калі яна не дадзена Вам адразу на віктарыну. Іншы трук я даведаўся, што сказаць, што мы сапраўды даюць вам прататып функцыі, і мы кажам: "Гэй, ты павінен пісаць". Усярэдзіне фігурных дужках, што ў вас на тэст Калі вы заўважыце, што ёсць вяртаецца тыпу, і вы заўважыце, што тып вяртаецца гэта нешта іншае, чым пустата, якая азначае, што функцыя не вяртае нічога, тое, што вы вызначана хочаце зрабіць, гэта напісаць свайго роду вяртанне заявы ў самым канцы функцыі. Вяртанне, і ў гэтым выпадку, мы будзем ставіць пустую, таму што мы хочам, каб запоўніць пустыя. Але гэта атрымлівае вас думаць у правільным кірунку, пра тое, як я буду падыходзіць да гэтай праблемы? І гэта нагадвае вам, што вы будзеце мець, каб вярнуць значэнне выклікалай функцыі. Так. >> [Студэнт] ці стыль ужываецца, калі мы пішам код на віктарыну? Такія, як водступ і ў такім жа родзе? >> [Студэнт] Так. Не, не так шмат. Я думаю, што шмат-гэта тое, што мы будзем ўдакладніць на віктарыну у дзень, але, як правіла турбуючыся аб # ўключае ў сябе і ў такім жа родзе, гэта выгляд звонку. [Студэнт] Вам трэба каментаваць свае рукапісныя код? Вам трэба каментаваць свае рукапісныя код? Каментуючы гэта заўсёды добра, калі вы турбуецеся аб частковай крэдытнай ці вы хочаце паведаміць пра свой намер грэйдэр. Але я, зноў жа, будзе ўдакладніць на віктарыну сябе і ў той дзень, віктарыны, Але я не веру, што вы будзеце абавязаны пісаць каментары, няма. Як правіла, няма, але гэта вызначана тая рэч, дзе Вы можаце паведаміць вашыя намеры, як "Гэй, гэта куды я іду з ім". І часам гэта можа дапамагчы з частковым крэдыту. Cool. Васіля. [Васіль] У чым розніца паміж аб'яве, скажам, унутр мову у аргументах або параметрах у параўнанні з аб'явай зменнай ўнутры функцыі? Wow, кава пайшоў у дыхальнае горла. [Васіль] Як якое рэчаў, якія мы хочам змясціць у аргументах. Так, гэта вялікае пытанне. Як вы выбіраеце тое, што рэчы, якія вы хочаце змясціць у развагах супраць таго, што рэчы, якія вы павінны рабіць ўнутры функцыі? У гэтым выпадку мы ўключылі абодва гэтых якасці аргументаў таму што яны тое, што той, хто збіраецца выкарыстоўваць функцыю сумы Неабходна ўказаць гэтыя рэчы. Сума функцыя, пра якую мы казалі, не мае магчымасці даведацца, наколькі вялікі масіў яна атрымлівае ад свайго абанента або той, хто выкарыстоўвае суму функцыю. Ён не мае магчымасці даведацца, як вялікі, што масіў. Таму мы прайсці ў гэтым даўжыня прама тут у якасці аргументу таму, што гэта тое, што мы ў асноўным кажуць выклікалай функцыі, хто збіраецца выкарыстоўваць функцыю сумы, "Гэй, вы не толькі павінны даць нам масіў цэлых лікаў, вы таксама павінны сказаць нам, як вялікі масіў, які Вы далі нам ". [Васіль] Тыя, абодва будуць аргументы каманднага радка? Не, гэта фактычныя аргументы, якія вы перадаеце ў функцыю. Дазвольце мне зрабіць новую старонку тут. [Васіль] Як імя будзе праходзіць- [Nate H.] Калі ў мяне ёсць Int асноўных (несапраўднымі), і я збіраюся паставіць у маім вяртанні 0 ўніз тут на дне, і сказаць, што я хачу, каб выклікаць функцыю сумы. Я хачу сказаць, Int х = SUM (); Каб выкарыстаць функцыю сумы я павінен прайсці як у масіве, што я хачу, каб падвесці вынік і даўжыня масіва, так што гэта, дзе мяркуючы, што я быў масіў цэлых лікаў, сказаць, што я Int numbaz [] = 1, 2, 3, выгляд выкарыстання, які пасек сінтаксіс там жа, тое, што я хацеў бы зрабіць гэта ў суме я хацеў бы перайсці ў як numbaz і № 3 распавесці суму функцыю "Добра, вось масіў, які я хачу, каб вы падвесці". "Вось яго памеру." Ці мае гэта сэнс? Я адказаў на ваша пытанне? Шмат у чым гэта адбываецца паралельная, што мы робім з асноўнымі калі ў нас ёсць аргументы каманднага радка. Такая праграма, як шыфр Цэзара, напрыклад, што неабходна аргументы каманднага радка не змог бы нічога зрабіць. Не ведаю, як для шыфравання, калі Вы не сказаць яму, што ключ да выкарыстання або калі вы не сказалі яму, што радок, якую вы хацелі зашыфраваць. Падказка для ўводу, гэта дзе ў нас ёсць 2 розных механізмаў для прыняцця ўваходзе ў ад карыстальніка, для прыняцця інфармацыі ад карыстальніка. Для задач 1 мы бачылі, гэта GetInt, GetString, GetFloat шляху навядзення для ўводу, і гэта завецца выкарыстаннем стандартнага ўваходнага струменя. Гэта крыху адрозніваецца. Гэта тое, што вы можаце зрабіць за адзін раз, у адрозненне ад калі вы запускаеце праграму, пры запуску праграма працуе. Аргументы каманднага радка ўсіх паказаных пры запуску праграмы, запушчанай. Мы змешвання двух з іх. Калі мы выкарыстоўваем аргументы функцыі, гэта так жа, як аргументы каманднага радка да асноўнага. Гэта пры выкліку функцыі вы павінны сказаць яму, што менавіта яму трэба для таго, каб выконваць свае задачы. Яшчэ адна добрая рэч, каб глядзець на, і я дам вам паглядзець на гэта ў вольны час, і яна была пакрыта у віктарыне, было гэта паняцце за рамкі і лакальных зменных у параўнанні з глабальнымі зменнымі. У звярнуць увагу на гэта. Цяпер, калі мы становімся на гэтую іншыя рэчы, 3 тыдні мы пачалі гаварыць аб пошуку і сартаванні. Пошук і сартыроўка, па меншай меры, CS50, вельмі увядзеннем у некаторыя з найбольш тэарэтычная частка кампутарнай навукі. Праблема пошуку, задачы сартавання вялікі, кананічнай праблемы. Як вы знаходзіце вызначанага ліку ў масіве мільярдаў лікаў? Як знайсці канкрэтнае імя ў тэлефоннай кнізе , Якая захоўваецца на вашым ноўтбуку? І таму мы ўвядзем гэта паняцце асімптатычнага часу працы сапраўды колькасна, як доўга, як цяжка гэтыя праблемы з'яўляюцца, Як доўга яны прымаюць рашэнні. У, я лічу, 2011 віктарыне ёсць праблема, што я думаю вартасцяў пакрыццё вельмі хутка, што гэта, праблема 12. О не, гэта Omega. Тут мы гаворым аб максімальна магчымай час выканання для канкрэтнага алгарытму, а затым мінімальна магчымы час выканання. Гэта Omega і O ў рэчаіснасці з'яўляюцца толькі цэтлікі. Яны пазначэнняў клавіш для кажучы як хутка ў лепшым выпадку будзе наш алгарытм выканання, і як павольна ў горшым выпадку будзе наш алгарытм бегчы? Давайце зробім некалькі з іх, і яны былі таксама пакрытыя у кароткатэрміновай аб асімптатычнай пазначэнняў, якія я вельмі рэкамендую. Джэксан зрабіў вельмі добрую працу. З бінарны пошук, мы гаворым пра бінарнага пошуку як алгарытм, і мы звычайна кажам пра гэта з пункту гледжання яго вялікі O. Што такое Big O? Што такое мінімальна магчымы час выканання двайковага пошуку? [Студэнт] N ²? Зачыніць, я думаю, падобна на тое. Гэта нашмат хутчэй, чым гэта. [Студэнт] Двайковыя? >> Так, бінарны пошук. [Студэнт] Гэта часопіс з. Уваход п, так што ж ўвайсці п маеце на ўвазе? Гэта паловы гэтага кожнай ітэрацыі. Сапраўды, так і ў мінімальна магчымы выпадак, кажуць, што калі ў вас ёсць адсартаваны масіў мільён цэлых лікаў і нумар, які вы шукаеце гэта альбо першы элемент масіва ці самы апошні элемент масіва. Памятаеце, што алгарытм двайковага пошуку працы, гледзячы на ​​сярэдні элемент, бачачы калі гэта матч, які вы шукаеце. Калі гэта так, то вялікі, вы яго знайшлі. У лепшым выпадку, як хутка робіць выканання двайковага пошуку? [Студэнты] 1. 1, гэта пастаяннае час, вялікая O 1. Так. [Студэнт] У мяне ёсць пытанне. Калі вы кажаце ўвайсці п, вы маеце на ўвазе ў адносінах да падставы 2, правільна? Так, так вось іншая рэч. Мы кажам, § п, і я думаю, калі я вучыўся ў сярэдняй школе Я заўсёды лічыў, што часопіс быў падставай 10. Так, ды так, увайсці падставы 2 звычайна гэта тое, што мы выкарыстоўваем. Зноў жа, вяртаючыся да бінарны пошук, калі вы шукаеце альбо элемента ў самым канцы ці элемент у самым пачатку, таму што вы пачынаеце ў сярэдзіне, і тады вы скідаюць залежнасці ад таго, палова не адказваюць крытэрам, што вы шукаеце, і вы пераходзіце да наступнага паловы і наступную палову і наступная палова. Калі я шукаю найбольшы элемент у мільён цэлых лікаў Я збіраюся ўдвая скараціць яго на самы часопіса 1 мільёна раз перш чым я, нарэшце, пратэставаць і ўбачыць, што элемент я шукаю знаходзіцца ў вялікай або ў вышэйшай індэкс масіва, і што будзе часопіс п, увайсці ў 1 млн. раз. Bubble роду. Хлопцы, вы памятаеце алгарытм пузырьковый сартавання? Кевін, вы можаце даць мне хуткае паўтор таго, што адбылося ў алгарытм сартавання бурбалка? [Кевін] У асноўным гэта праходзіць праз усе, што ў спісе. Ён глядзіць на першых двух. Калі першы больш, чым другой яго свопы іх. Затым ён параўноўвае другой і трэцяй, тое ж самае, свопы, Трэці і чацвёрты, на ўсім шляху ўніз. Вялікія нумары будуць ісці да канца. І пасля аднак многія завесы вы зрабілі. Сапраўды, так што Кевін сказаў, што мы будзем назіраць вялікія ліку Бурбалка да канца масіва. Напрыклад, вы пярэчыце ісці з намі праз гэтую Напрыклад, калі гэта наш масіў? [Кевін] Вы будзеце прымаць 2 і 3. 3 больш, чым 2, так што вы памяняць іх месцамі. [Nate H.] Права, такім чынам, мы перастаўляць іх, і такім чынам мы атрымліваем 2, 3, 6, 4 і 9. [Кевін] Тады вы параўнайце 3 і 6. 3 меньш, чым 6, так што вы пакінеце іх, і 6 і 4, трэба памяняць іх месцамі таму што 4 менш, чым 6. [Nate H.] Права, так што я атрымліваю 2, 3, 4, 6, 9. [Кевін] і 9 больш, чым 6, так што вы пакінеце яго. І вы вярнуліся б праз гэта зноў. [Nate H.] Ці магу я зрабіць у гэты момант? >> [Кевін] Няма І чаму я не рабіў у гэты момант? Таму што ён падобны на майго масіў адсартаваны. Я гляджу на гэта. [Кевін] прайсці праз гэта зноў і пераканайцеся, што няма больш свопы перш чым вы зможаце цалкам спыніць. Менавіта, таму трэба працягваць ісці да канца і пераканайцеся, што няма свопов што вы можаце зрабіць у гэтай кропцы. Гэта было сапраўды проста пашанцавала, як вы сказалі, што мы скончылі толькі таго, каб зрабіць 1 праход, і мы сартуюцца. Але для гэтага, у агульным выпадку, мы на самай справе павінны рабіць гэта зноў і зноў. І на самай справе, гэта быў прыклад лепшым выпадку, як мы бачылі ў праблеме. Мы бачылі, што найлепшае справа N. Мы пайшлі праз масіў 1 раз. Што гэта горшы магчымы выпадак для гэтага алгарытму? [Кевін] N ². І што гэта падобна? Што б масіў падобна, што б узяць п ² час? [Кевін] [неразборліва] адсартаваны. Менавіта, таму, калі ў мяне была маса 9, 7, 6, 5, 2, Спачатку 9 будзе бурбалка на ўсім шляху ўверх. Пасля 1 ітэрацыі мы б 7, 6, 5, 2, 9. Тады 7 будзе тапырыцца, 6, 5, 2, 7, 9, і гэтак далей, і гэтак далей. Мы павінны прайсці праз увесь масіў п раз, і вы можаце атрымаць трохі больш дакладным, чым гэта таму што як толькі мы пераехалі ў 9 ўсе, аж да апошняй у яго магчымае становішчы Мы ведаем, што мы ніколі не павінны параўноўвацца з гэтым элементам зноў. Як толькі мы пачынаем бурбалкі 7 да Мы ведаем, што мы можам спыніць толькі 7 з'яўляецца правам да 9 паколькі мы ўжо па параўнанні з 9 да яе. Калі вы робіце гэта ў разумны спосаб гэта не па-сапраўднаму, я думаю, што шмат часу. Вы не збіраецеся, каб параўнаць усе магчымыя [неразборліва] камбінацыях кожны раз, калі вы праходзіце праз кожную ітэрацыю. Але ўсё ж, калі мы гаворым пра гэта верхняя мяжа мы кажам, што Вы глядзіце на п ² параўнання ўвесь шлях да канца. Давайце вернемся, і так як мы пачынаем атрымліваць крыху менш па часе Я б сказаў, вы павінны абавязкова прайсці астатняй частцы гэтай табліцы, запоўніць усе гэта. Падумайце аб прыкладах. Падумайце аб канкрэтных прыкладах. Гэта сапраўды зручна і карысна зрабіць. Намалюйце яго. Гэта свайго роду табліцу, як вы ідзяце праз ў галіне камп'ютэрных навук Вы павінны сапраўды пачаць ведаем, што гэтыя на памяць. Гэтыя віды пытанняў, якія вы атрымаеце ў інтэрв'ю. Гэта розныя рэчы, якія добра б ведаць, і думаць аб тых крайніх выпадках, сапраўды, высвятляючы, як падумаць аб ведаючы, што для пузырьковый сартавання ў самы непадыходны масіва сартаваць тым, што гэта той, які ў зваротным парадку. Паказальнікі. Давайце трохі пагаворым аб паказальніках. У апошнія некалькі хвілін тут мы маем Я ведаю, гэта тое, што разам з файлавага ўводу / высновы, што з'яўляецца адносна новым. Калі мы гаворым пра паказальнікаў па гэтай прычыне мы хочам казаць пра паказальніках Таму што, адзін, калі мы працуем у C мы сапраўды на даволі нізкім узроўні па параўнанні з большасцю сучасных моў праграмавання. Мы на самай справе здольны маніпуляваць зменнымі ў памяці, высветліць, дзе яны фактычна знаходзяцца ў межах нашай памяці. Пасля таго як вы пайшлі на ўзяцце аперацыйная сістэма класаў, якія вы ўбачыце, , Што гэта, зноў жа, свайго роду абстракцыяй. Гэта не на самай справе. У нас ёсць віртуальная памяць, што хавае гэтыя дэталі ад нас. Але цяпер можна выказаць здагадку, што калі ў вас ёсць праграма, Напрыклад, калі вы пачаць паказ шыфр Цэзара праграму Я пераключыцца назад на мой IPad сапраўды хутка- , Што ў самым пачатку вашай праграмы, калі ў вас, скажам, 4 гігабайтамі аператыўнай памяці на вашым ноўтбуку, Вы атрымаеце адкладзеце гэты кавалак, і мы называем гэта RAM. І ён пачынаецца ў месца, дзе мы збіраемся называць 0, і заканчваецца ў месцы, якое мы будзем называць 4 гігабайт. Я сапраўды не магу пісаць. Чалавек, які ўзламаў. Калі ваша праграма выконвае Аперацыйная сістэма выразае аператыўнай памяці, і ён вызначае розныя сегменты для розных частак праграмы для жылля Тут, унізе гэтай галіне з'яўляецца своеасаблівай нічыйнай зямлі. Калі вы ідзяце крыху далей тут ў вас ёсць на самай справе месца, дзе Код для жыцця праграмы. Гэта фактычна двайковы код, выкананы файл, што на самой справе загружаецца ў памяць калі вы запусціце праграму, і яна жыве ў сегменце кода. І, як ваша праграма выконваецца працэсарам глядзіць на гэты сегмент кода каб высветліць, што з'яўляецца наступная інструкцыя? Якая наступная радок кода мне трэба выканаць? Там таксама сегмент дадзеных, і гэта, дзе гэтыя канстанты радкоў атрымаць захоўваецца, што вы выкарыстоўваеце. А потым далей уверх там гэта месца называецца кучай. Мы доступу да памяці там з дапамогай таНос, , А затым на самым версе вашай праграмы ёсць стэк, а вось дзе мы гулялі на працягу большай частцы пачатку. Гэта не ў маштабе ці нічога. Шмат гэта вельмі залежыць ад машыны, залежыць ад аперацыйнай сістэмы, але гэта адносна, як усе атрымліваюць разбіты ўверх. Калі вы запусціце праграму, і вы абвясьцеце зменную х Я збіраюся зрабіць яшчэ адну скрынку ўніз, і гэта будзе аператыўнай памяці. І я збіраюся паглядзець. Мы будзем маляваць зубчастыя лініі, каб паказаць, гэта ўсяго толькі невялікая частка аператыўнай памяці і не ўсё пра яго, як мы малюем на самым версе. Калі я заяўляю, цэлая пераменная называецца х, тое, што я на самой справе атрымаць адлюстраванне , Якія захоўваюцца ў табліцы знакаў маёй праграмы , Які злучае імя х у гэтую вобласць памяці, якую я намалявала прама тут, паміж вертыкальнымі палосамі. Калі ў мяне ёсць радок кода, у маёй праграме, якая кажа х = 7 Працэсар ведае "О, добра, я ведаю, што х жыццё ў гэтым месцы ў памяці." "Я збіраюся пайсці далей і напісаць 7 існуе". Як ён ведае, што размяшчэнне гэта ў памяці? Добра, што ўсё гэта робіцца падчас кампіляцыі. Кампілятар клапоціцца аб размеркаванні дзе кожная з зменных збіраецеся пайсці і стварэнне спецыяльных адлюстраванне або, хутчэй, злучэнне кропак паміж сімвалам і куды ён ідзе, імя зменнай і дзе ён будзе жыць у памяці. Але аказваецца, што мы сапраўды можам атрымаць да яго доступ у нашых праграмах. Гэта становіцца важным, калі мы пачынаем казаць аб некаторых структур дадзеных, якая з'яўляецца канцэпцыя, што мы збіраемся ўвесці пазней. Але цяпер, як вы можаце ведаць, што я магу стварыць паказальнік на гэтае месца, х. Напрыклад, я магу стварыць зменную-паказальнік. Калі мы ствараем паказальнік зменнай мы выкарыстоўваем пазначэнне зоркі. У гэтым выпадку, гэта кажа, што я збіраюся стварыць паказальнік на Int. Гэта тыпу як і любы іншы. Мы даем яму зменнай, як у, , А затым пакласці яго роўным адрас, па адрасе. У гэтым выпадку, мы можам усталяваць у паказваюць на х прымаючы адрасе х, якія мы робім з гэтым амперсанда, , А затым пакласці ў паказваюць на гэта. Тое, што гэта па сутнасці робіць гэта, калі мы паглядзім на нашу RAM гэта стварае асобную зменную. Гэта будзе называць яго ў, і калі гэты радок кода выконваецца гэта на самай справе збіраецца стварыць невялікі паказальнік, які мы звычайна выкарыстоўваюць, як страла, і ён усталёўвае ў паказваюць на х. Так. [Студэнт] Калі х гэта ўжо паказальнік, вы б проста зрабіць Int * у = х, замест таго, амперсанда? Так. Калі х гэта ўжо паказальнік, то вы можаце ўсталяваць 2 паказальнікаў роўныя адзін аднаму, У гэтым выпадку ў не будзе ўказваць на х, але гэта будзе паказваць на любой х вызначае. На жаль, мы па-за часам. Што я магу сказаць на дадзены момант, мы можам пагаварыць пра гэта ў аўтаномным рэжыме, Але я б сказаў, пачаць працаваць праз гэтую праблему, № 14. Вы можаце ўбачыць там ужо крыху запоўнены для вас тут. Вы можаце бачыць, што, калі мы заяўляем, 2 паказальнікаў, Int * х * і ў, і заўважым, што паказвае * Побач з зменнай было тое, што было зроблена ў мінулым годзе. Аказваецца, што гэта падобна на тое, што мы робім у гэтым годзе. Гэта не мае значэння, дзе вы пішаце *, калі вы аб'яўленні паказальніка. Але мы напісалі * побач з тыпам таму што гэта робіць яго вельмі ясна, што вы аб'яўленні зменнай-паказальніка. Вы можаце бачыць, што абвяшчэнне 2 паказальніка дае нам 2 скрынкі. Вось калі мы ўсталёўваем х роўна таНос што гэта кажа ў адмене памяці ў кучы. Гэты маленькі скрыню прама тут, гэты круг, знаходзіцца ў кучу. X паказвае на гэта. Заўважым, што ў яшчэ не паказваючы ні да чаго. Каб атрымаць памяць для захоўвання ліку 42 у х мы будзем выкарыстоўваць тое, што абазначэнне? [Студэнт] * х = 42. Сапраўды, * х = 42. Гэта азначае, прытрымлівайцеся за стрэлкай і кінуць 42 у там. Тут, дзе мы ўсталёўваем у і х мы ў паказваючы на ​​х. Зноў жа, гэта проста падабаецца тое, што Кевін сказаў, дзе мы ўсталёўваем у роўна х. Y не паказвае на х. Хутчэй, гэта паказвае на тое, што X паказвае на, а таксама. І, нарэшце, у апошнім акне ёсць 2 магчымых рэчаў, якія мы маглі б зрабіць. Адзін з іх мы маглі б сказаць * х = 13. Іншая справа, мы маглі б сказаць, Алекс, вы ведаеце, што мы маглі б зрабіць тут? Можна сказаць, * х = 13 ці- [Студэнт] Можна сказаць, што Int. [Nate H.] Калі гэта былі прылічаныя да Int зменная, якую мы маглі б зрабіць гэта. Мы маглі б таксама сказаць, у * = 13, таму што яны абодва паказваюць на тое ж месца, , Каб мы маглі выкарыстоўваць або зменную туды дабрацца. Так. >> [Студэнт] Што б гэта выглядала, калі мы проста скажам Int х 13? Гэта было б абвясціць новую зменную х, якая не будзе працаваць. Мы павінны былі б сутыкнення, таму што мы абвясцілі х, каб быць паказальнікам тут. [Студэнт] Калі мы проста павінны былі гэта заяву само па сабе тое, што гэта будзе выглядаць з пункту гледжання круга? Калі б мы мелі х = 13, то мы павінны былі б скрынку, і замест таго, каб стрэлка выходзячы з акна мы зрабіць гэта, як толькі 13. [Студэнт] у поле. Добра. Дзякуй за ўвагу і ўдачы на ​​Quiz 0. [CS50.TV]