[Powered by Google Translate] Раздзел праблеме Set 2: Hacker выданне
Роб Боуден, Гарвардскі універсітэт
Гэта CS50. CS50.TV
Дык вось, я Роб. Я старэйшы ў Kirkland. Гэта мой трэці год TFing CS50.
Гэта першы раз, калі мы мяняем ад традыцыйных лекцый стыль падзелу,
дзе мы толькі часткова водгук, што адбылося ў лекцыю, а затым вы, хлопцы, задаваць пытанні,
Цяпер, каб быць нашмат больш праблем на аснове, дзе мы выкарыстоўваем прасторы, і -
О, так ідэя пайсці ў ссылку, што Я паслаў цябе, і тады вы будзеце ў маім прасторы.
Хто-небудзь няма ноўтбука? Добра.
Такім чынам, мы будзем выкарыстоўваць гэта, і мы збіраемся рабіць праблемамі жывуць у раздзеле
і абмяркоўваць іх і высветліць, што здарылася
і я мог бы падцягнуць некаторыя з вашага кода, і я мог бы абмеркаваць вашыя ідэі.
Так хто-небудзь з працай?
Вы можаце мець зносіны на бок, я не ведаю, калі мы будзем мець падставы для гэтага.
Цяпер, як і ў папярэднім supersection, калі вы былі ў гэтым класе, вы ведаеце, што гэта а.
На ўсіх мностваў P там будзе ў гэтых раздзелах.
Такім чынам, P-набор 2, спецыфікацыі, я думаю, вы бачылі гэта на P-1 ужо мноства.
Але мы можам паглядзець на P-камплект 2 за тое, што мы збіраемся ісці на сёння.
І вы ўбачыце профіль пытанняў.
Такім чынам, гэта будзе ва ўсіх P-мностваў, там будзе профіль пытанняў.
Да гэтага часу мы казалі, "Разгледзім гэтую магчымасць на практыцы".
Вы не будзе прапанавана прадставіць гэтую праграму.
Ідэя складаецца ў тым, што гэта, як мяркуецца, выгляд дапамагчы вам пачаць з праблемай набору.
Я думаю, на Hacker выданне, многія з іх павінны быць проста новыя, цікавыя рэчы, каб вучыцца.
Яны не могуць быць непасрэдна дастасавальныя да праблемы набор.
І зараз мы не маюць вы прадставіць іх, але ў тэорыі,
для наступнага мноства праблем, вы можаце прадставіць іх, і такім чынам, вы можаце прыйсці да падзелу
або паглядзець профіль, каб атрымаць адказы на пытанні, ці вы можаце проста атрымаць іх па сваім меркаванні
Калі вы не адчуваеце, як атрымліваць асалоду ад сваёй прысутнасцю.
Так што - я думаю, гэта першае.
Ох. Акрамя таго, у гэтых раздзелах пытанні мы і вы будзеце задаваць пытанні аб шортах.
Так што я думаю, у тэорыі, вы павінны глядзець на гэтых да прыезду ў раздзеле
але гэта выдатна, калі вы гэтага не зробіце, мы пойдзем на іх у любым выпадку.
Такім чынам, мы можам пачаць з гэтым: «Як у той час як цыкл адрозніваецца ад зрабі той час як цыкл?
Калі апошняя асабліва карысна? "
Такім чынам, у каго-небудзь -
[Студэнт] зрабі той час як цыкл будзе заўсёды выконваць па крайняй меры, адзін раз.
Так. Так што ёсць розніца. Час цыкла - I'll проста зрабіць гэта тут - у той час як пятля, маем ўмова
прама тут, у той час як зрабі той час як, у вас няма ўмоў пакуль мы не атрымаем тут.
І таму, калі вашы праграмы выконваецца, і ён трапляе ў той час як цыкл,
ён адразу правярае, калі гэта ўмова праўдзіва.
Калі гэта ўмова не выконваецца, гэта будзе проста прапусціць цыкл цалкам.
Зрабі той час як цыкл, так як праграма выконваецца, ён дабіраецца да "рабіць".
Нічога не адбываецца ў гэты момант, проста працягвае выконвацца.
Потым, калі яна трапляе на ", а", калі ўмова праўдзіва, гэта будзе цыкл вярнуцца і зрабіць гэта зноў
і зноў, і зноў, пакуль ўмова не выконваецца, а затым проста правальваецца.
Такім чынам, розніца ў тым, што гэта можа прапусціць з самага пачатку.
Гэта абавязкова выконваецца адзін раз і затым можа выканаць больш раз, калі ўмова застаецца ў сіле.
Такім чынам, у той час як цыкл будзе рабіць гэта толькі адзін раз, або - у той час як завесы - мы не павінны рабіць гэта на ўсіх,
паколькі, як толькі мы дабяромся да яго, калі ўмова ілжыва, мы проста адразу перайсці на яго.
Прымаючы пад увагу, зрабі той час як цыкл, мы будзем выконваць яго адзін раз, абавязкова.
Потым, калі мы дойдзем да стану, мы правяраем, калі гэта праўда ці хлусня.
Калі гэта праўда, мы зробім гэта зноў, калі яно ілжыва, мы проста працягваем ісці.
Так, калі апошні асабліва карысна?
Таму я магу сказаць, што ў сукупнасці 4 гады, 3 гады, што заўгодна,
што я займаўся праграмаваннем, я выкарыстаў гэта, як, па 10 разоў.
І, напэўна, 5 з іх знаходзяцца ў CS50, калі мы ўяўляем рабіць, у той час як завесы.
Таму, калі вы выкарыстоўвалі рабіць-то час завесы?
Калі - так?
[Студэнт] Калі вы спрабуеце атрымаць карыстацкі ўвод, або тое, што вы хочаце праверыць -
Так. Так што, у той час як завесы, што ўводзіць карыстальнік, вялікі.
Вось чаму на першых набораў праблема пары, калі вы хочаце спытаць у карыстальніка, як,
"Дайце мне радок," вы не можаце працягваць, пакуль вы не атрымаеце гэтую радок.
І таму вы, абавязкова, неабходна звярнуцца за радком па крайняй меры, адзін раз.
Але тады, калі яны адказваюць нешта дрэннае, то вы павінны цыклу назад і спытаць яшчэ раз.
Але акрамя ўводу дадзеных карыстачом, гэта вельмі рэдкае, што я сутыкаемся з выпадкам
, Дзе я хачу, каб пятля "па крайняй меры адзін раз", але, магчыма, больш.
Пытанні або -? Хто-небудзь выкарыстаў зрабі той час як цыкл дзе-небудзь яшчэ?
Добра. Такім чынам, наступны: "Што ж неаб'яўленай ідэнтыфікатар
звычайна паказваюць, калі выдаюцца звон? "
Дык які код я магу напісаць, каб атрымаць «Неабвешчаная ідэнтыфікатар?
[Студэнт], што х = 2?
Так што мы можам толькі паспрабаваць яго тут, х = 2.
Мы будзем працаваць гэта - ой, я не пстрыкніце па ім. І вось мы атрымліваем - усё ў парадку.
"Выкарыстанне неаб'яўленых х ідэнтыфікатар".
Дык вось неаб'яўленай ідэнтыфікатар, зменная.
Гэта часта называюць зменнай ідэнтыфікатар.
Такім чынам, яна можа не ведаць, што гэта на самай справе зменная, яна не ведае, што гэта такое.
Так што гэта ідэнтыфікатар.
Дык чаму ж гэта неабвешчаная? Так.
Такім чынам, каб унесці яснасць у тэрміналогію, аб'ява зменнай
гэта калі вы кажаце "Int х", або "у радкі," што заўгодна.
Ініцыялізацыі зменнай ці прызначэнне зменнай,
гэта кожны раз, калі вы кажаце "х = 2".
Такім чынам, мы можам зрабіць гэта ў асобных крокаў, Int х, х = 2, а пакуль - мы можам мець кучу рэчаў тут -
але да гэтай лініі адбываецца, х яшчэ не ініцыялізаваны, але яна была абвешчаная.
І таму, відавочна, можна зрабіць гэта ў 1 лінію, і зараз мы аб'яўляем і ініцыялізацыі.
Пытанні?
І, нарэшце, "Чаму шыфр Цэзара не вельмі бяспечна?"
Такім чынам, па-першае, хто-небудзь хачу сказаць, што шыфр Цэзара?
[Студэнт] Caesar Cipher толькі тое, што Вы карце, вы перакласці кожную літару,
пэўную колькасць літар перайсці і вярнуцца за, і гэта не вельмі бяспечна, таму што
ёсць толькі 26 магчымых варыянтаў, і вы проста павінны паспрабаваць кожнае 1 з тых, пакуль вы не атрымаеце яго.
Ох. Так што, я павінна паўтараць?
Шыфр Цэзара, it's - я маю на ўвазе, вы будзеце мець справу з яго праблемамі, што вы -
ці я думаю, што і стандартная рэдакцыя пастаўленай задачы гэта не на хакерскай выданне.
Такім чынам, на стандартным выданні пастаўленай задачы, вы атрымаеце паведамленне тыпу: "Прывітанне, свет"
і ў вас таксама ёсць шэраг як 6, і вы прымаеце гэта паведамленне, і кожны індывідуальны характар,
Вы павярніце яго на 6 пазіцый у алфавіце.
Такім чынам, 'H' у Прывітанне стане ч-і-т-к-л-м-н.
Такім чынам, першы ліст будзе п. Мы робім тое ж самае з электроннай.
Калі ў нас ёсць, быццам бы, г або нешта, то мы скончым назад да '.
Але кожны персанаж атрымлівае цыклічнае 6 знакаў пазней у алфавіце, а гэта не вельмі бяспечна
так як ёсць толькі 26 магчымасцяў для колькімі спосабамі можна абгарнуць адну літару.
Такім чынам, вы можаце проста паспрабаваць усе 26 з іх, і, па-відаць, на працягу досыць доўгага паведамленне
толькі 1 з магчымых 26 рэчаў будзе разборліва,
і разборліва, ніхто не збіраецца быць зыходнае паведамленне.
Так што гэта не вельмі добры спосаб шыфравання наогул нічога.
Па-за усякай сувязі з тым, шорты, "Што такое функцыя?"
Так што ж такое функцыя? Так.
[Студэнт] Гэта як асобны кавалак кода, які вы можаце патэлефанаваць, каб прайсці, а затым атрымаць вяртаецца значэнне заўгодна.
Так. Так я адкажу на яго таксама адказаць на наступны - або паўтор ад таксама проста адказаўшы на наступны.
Вы можаце выкарыстоўваць функцыі, а не проста скапіяваць і ўставіць код зноў і зноў.
Проста вазьміце гэты код, паклаў яго ў Fuction, а затым вы можаце проста выклікаць функцыю
дзе б вы ні былі капіявання і ўстаўкі.
Такім чынам, функцыі карысныя.
Так што цяпер мы будзем рабіць актуальных праблем.
Першы. Так што ідэя першага, вы перадаеце яго радка, і незалежна ад таго, -
ці ж яна сказаць, што ўсе малыя? Не сказаць, што ўсё ў ніжнім рэгістры.
Такім чынам, паведамленне можа быць што заўгодна, і - о, няма. Гэта робіць.
"Для прастаты можна лічыць, што карыстач будзе толькі ўваход малой літары і прабелы".
Такім чынам, мы перадаем яму паведамленне з толькі малыя літары, а затым мы чаргаваць
паміж капіталам і малыя - мы зменім радок у загалоўныя і малыя, чаргуючы.
Таму, перш чым даць вам другіх нават пагрузіцца ў праблему,
што першае, што мы павінны зрабіць?
Ах, які ж я проста націсніце на? О, я проста націснуў на электронную тут.
Таму першае, што мы павінны зрабіць, - я гляджу не той?
Ці з'яўляецца гэта часткай гэтага?
Не, гэта ўсё яшчэ там, хоць.
Добра, усё яшчэ тут.
Цяпер мы не можам выказаць здагадку - Так. Тут мы не можам выказаць здагадку, што гэта толькі малыя і прабелы.
Так што цяпер мы маем справу з тым, што лісты могуць быць якімі мы хочам іх бачыць.
І таму першае, што мы хочам зрабіць, гэта проста атрымаеце паведамленне.
Нам проста трэба, каб атрымаць String, String S = GetString, добра.
Зараз гэтая праблема, ёсць некалькі спосабаў зрабіць гэта.
Але мы збіраемся хочаце выкарыстоўваць бітаў аператары тут.
Ёсць людзі, якія альбо не былі ў supersection,
ці нешта, і не ведаю, што пабітавае аператараў?
Або, як яны ставяцца да ASCII ў любым выпадку?
[Студэнт] Я не быў на supersection, але я ведаю, што пабітавае аператараў.
Добра. Тады я не павінен ісці па асновах з іх, але я растлумачу
тое, што мы збіраемся хочаце выкарыстоўваць тут.
Такім чынам, 'A': двайковага ўяўленне капітал, лік 65.
Я проста буду глядзець на - 41 будзе 01000001.
Так што павінна быць 65 у дзесятковай, так што гэта Двайковыя ўяўленне сімвала сталіцы A.
Цяпер, двайковым прадстаўленнем знакаў ніжняга рэгістра 'а'
будзе тое ж самае, амаль. Гэта - 6, так. Гэта правільна.
Такім чынам, двайковы капіталу, двайковыя маленькая '.
Так заўважыць, што розніца паміж А і 'а' гэта адзін біт.
І гэта здараецца, 32 біт, біт, які ўяўляе лік 32.
І гэта мае сэнс, паколькі з'яўляецца 65; 'а' 97.
Розніца паміж імі 32.
Такім чынам, цяпер мы ведаем, што можам пераўтварыць ад А да 'а', беручы
і бітаў ORing гэта, з - якая выглядае як 1.
Гэта пабітавае АБО, з 00100000, і што дасць нам ".
І мы можам атрымаць ад 'А' да лагічнага множання на пабітава
з 11, 0 у тым месцы, 11111.
Такім чынам, гэта дасць нам менавіта тое, што 'а' было, але адмяніць гэтую асобнага біта,
так што нам прыйдзецца 01000001, я не ведаю, калі я налічыў права.
Але гэтая тэхніка пабітава ORing, каб атрымаць ад сталіцы ў ніжні рэгістр,
і бітаў аперацыі AND, каб атрымаць з ніжняга рэгістра ў сталіцу не толькі для А.
Усе лісты, K супраць K, Z супраць г,
усе яны толькі збіраюцца адрозніваюцца гэтым адзін біт.
І таму вы можаце выкарыстоўваць гэта, каб змяніць любой малой літары любой літары, і наадварот.
Добра. Так просты спосаб атрымаць з гэтага - так замест таго, каб
напісаць усё, што ёсць 1011111 - лёгкі спосаб прадстаўлення гэтага ліку, а гэта не адзін
што я пайшоў у supersection, але тыльды (~) з'яўляецца яшчэ адным пабітава аператара.
Што ~ робіць гэта глядзіць на бітнае ўяўленне.
Давайце возьмем любы лік.
Гэта толькі некаторыя двайковыя ліку, і тое, што робіць ~ гэта проста перагортвае ўсе біты.
Так што гэта было 1, зараз 0, то гэта 0, цяпер 1, 010100.
Так што гэта ўсё ~ робіць. Такім чынам, 32 будзе нумар - пазбавіцца ад гэтага -
32 так будзе нумар 00100000, і так ~ гэтага будзе
гэты нумар тут, што я аперацыя AND'' с.
Ці ўсё бачылі? Гэта даволі распаўсюджаная, як і калі вы хочаце, каб высветліць
для наступнага рэчы, якія мы маглі б бачыць, калі мы хочам убачыць, калі -
ці мы хочам, каб усе, кожны набор біт за выключэннем 1
Вы схільныя рабіць ~ з трохі, што мы не хочам ўсталяваць.
Такім чынам, мы не хочам ў 32 біт, таму мы ~ 32.
Добра. Так што мы можам выкарыстоўваць усе тут.
Добра, гэта выдатна, калі вы не зрабілі, мы павінны павольна хадзіць па сукупнасці
ці хадзіць па гэтай нагоды, так - праз гэта. Прайдзіце праз гэта.
Такім чынам, у нас ёсць радок, і мы хочам, каб цыкл па кожнаму знаку ў радку, што і рабіць нешта для гэтага.
Так як жа мы цыкл па радку? Што мы павінны выкарыстоўваць?
Я не збіраюся рабіць гэта тут. Так.
Так што ў мяне ёсць итератор, і ён сказаў, што гэта, але як я магу ведаць, колькі знакаў у радку?
STRLEN (ы), то я + +.
Так што я тут зрабіў, гэта не лепшы спосаб рабіць рэчы.
Хто-небудзь ведае, чаму?
Таму што вы правяраеце на мове радок кожны раз.
Такім чынам, мы збіраемся жадаеце перамясціць StrLen, я мог бы сказаць тут, унутр даўжыня = StrLen (ы),
і тады я <даўжыня, а ў выпадку, калі вы не бачылі гэта раней,
Я мог бы таксама зрабіць Int = 0, даўжыня = StrLen (ы).
І так гэта некалькі пераважней, так як цяпер я абмежавала сферу
зменнай даўжыні ўсяго гэтага 'для' цыкл, замест таго, каб абвясціць яго да
і што яно заўсёды існуе, і ў выпадку, калі вы не заўважылі, чаму гэта дрэнна,
ці чаму арыгінальная было дрэнна, it's - пачаць з цыклу.
Я праверыў стан. Гэта я <даўжыня з?
Такім чынам, даўжыня з, давайце папрацуем з "прывітанне" ўвесь час.
Такім чынам, даўжыня S, Н-е-л-л-о. Даўжыня 5.
Так што я = 0, даўжыня 5, так што я не <5, так што цыкл працягваецца.
Тады мы ідзем зноў. Мы правяраем стан. Гэта я <даўжыня Прывітанне?
Так давайце праверым даўжыню прывітанне. Н-е-л-л-о. Гэта 5, я не <5, таму мы працягваем зноў.
Такім чынам, мы разлічваем, мы разлічваем прывітанне, для кожнай ітэрацыі,
нават не думаў, што гэта ніколі не зменіцца, ён заўсёды будзе 5.
Так што мы проста памятаем 5 да пярэдняй, і цяпер усё лепш.
Такім чынам, ітэрацыі па ўсёй радку.
Што мы хочам зрабіць для кожнага знака радкі?
[Студэнт кажучы, неразборліва]
Так. Такім чынам, калі персанаж знаходзіцца неалфавітныя, то мы проста хочам, каб прапусціць яго.
Таму што мы клапоцімся толькі пра літар алфавіту, мы не можам скарыстацца нумарам.
Так як мы можам гэта зрабіць? Такім чынам, нашы ўмовы, таму калі мы хочам нешта - праверыць, калі ён алфавітным парадку.
Так як жа нам праверыць гэта?
[Студэнт] Вы можаце проста выкарыстоўваць функцыю альфа.
Гэта ўключана ў любы з гэтых ці любых ўключаюць як, char.h, ці што?
Давайце не будзем выкарыстоўваць гэта альфа функцыі, і выкарыстоўваць відавочнае - так у нас з [я],
, Што з'яўляецца восьмым характару з, памятаеце, што радок ўяўляе сабой масіў сімвалаў,
так восьмым характару з.
Цяпер, калі гэта літара, мы ведаем, што павінна быць у пэўным дыяпазоне.
І што гэта за дзеянні?
Так. Такім чынам, калі з [я] складае ≥ 65 гадоў, і з [я] складае ≤ 90, што я павінен рабіць замест гэтага?
Так. Такім чынам, вы павінны быць абсалютна нават не трэба ведаць ASCII значэння ні пра што ніколі.
Ніколі не думайце з лікаў 65, 90, 97 і 102, ці што гэта такое.
Вам не трэба - 112 - вы не павінны ведаць тых, хто наогул. Гэта няправільна таксама.
Выкарыстоўвайце толькі адзінарныя двукоссі знакаў, адным канстанты цытаты. Такім чынам, 'A' і менш за 90 з'яўляецца "З."
І гэта значна лепш - я не ведаю, з верхняй частцы маёй галавы, што Z = 90.
Я ведаю, з верхняй частцы маёй галавы, што 'Z' з'яўляецца сталіцай Z.
Так што, пакуль гэта знаходзіцца ў дыяпазоне капіталу да капіталу Z, ці мы можам праверыць ніжнім рэгістры,
Ці, калі яна знаходзіцца ў дыяпазоне ≥ 'а' і ≤ г.
Так што гэта наша ўмова.
Стыль, дзе паставіць гэтыя рэчы мяняецца.
Я зраблю гэта, як гэта.
Такім чынам, што ж мы хочам зрабіць?
Мы ведаем, што гэты ліст характар, алфавіту.
Так што мы павінны чаргавацца ці гэта цяпер павінна быць літары або малой літары.
Як мы адсочваем, адзін з якіх мы хочам быць?
[Студэнт галасы, неразборліва]
Так што, так, але дазвольце мне праверыць.
Модуль 0-2 было сказана, была прапанова выкінутыя, і я з гэтым згодны.
Акрамя заўважыць, што, напрыклад, - гэта выпадак? Так.
Гэта кожны другі, але мы не можам модуль 2 я, ці я модулю 2, так як
заўважыць, што E з'яўляецца сталіцай і 'а' у ніжнім рэгістры? Але ёсць прастора, што раздзяляе іх?
Такім чынам, яны будуць такімі ж, па модулі 2, але яны розныя выпадкі.
[Студэнт пытанне, неразборліва]
Так. Так што мы проста будзем трымаць рахунку.
Мы маглі б таксама зрабіць гэта тут, калі мы хацелі, то маглі б атрымаць трохі грувасткім
у цыкле заявы, я пакладу яго тут.
Так соипЬ = пачынаецца з 0.
І вось цяпер, я буду лічыць, колькі літарныя сімвалы, якія мы мелі.
Такім чынам, мы непазбежна будзем разлічваць + +, так як мы знайшлі іншага алфавіту.
Але, так што цяпер вы кажаце, калі колькасць модулю 2.
Так што, калі колькасць модулю 2? Ох. Я зраблю == 0 на дадзены момант.
Мы таксама будзем ісці па гэтай нагоды. Такім чынам, калі колькасць мод 2 == 0, то што?
[Студэнты адказ, неразборліва]
Такім чынам, мы хочам, каб ён у канчатковым выніку ў верхнім рэгістры.
Ёсць 2 выпадках; вялікіх і малых з'яўляюцца 2-х выпадках.
Так што, калі мы ў ніжнім рэгістры, мы павінны зрабіць гэта верхні рэгістр.
Калі гэта вялікія нам не трэба нічога рабіць.
Але ёсць спосаб - shouldn't было перавернута -
што мы нават не трэба праверыць, ці з'яўляецца гэта Вялікая або маленькая?
Што мы можам зрабіць, каб заўсёды пераканацца, што мы заўсёды ў канчатковым выніку ў верхнім рэгістры?
Так заўважыць, што мы зрабілі ў ніжнім рэгістры ";, што калі б мы зрабілі гэта сапраўды такі жа рэчы ў верхні рэгістр?
Ці ёсць верхні рэгістр змены, ці ж змена значэння?
Так. Такім чынам, любая літара пабітава аперацыі AND з ~ 32 будзе той жа знак верхняга рэгістра
таму што для любога знака ў верхнім рэгістры 32-й біт не ўстаноўлены.
Такім чынам, калі мы хочам прынесці характару з [я], мы хочам, каб ён стаў маленькіх або вялікіх літар.
Так што, калі гэта было ў ніжнім рэгістры, то зараз вялікімі літарамі, калі б гэта быў верхні рэгістр, ён па-ранейшаму вялікімі літарамі, вось і ўсё.
Я сказаў пра гэта ў supersection: Вы можаце выкарыстоўваць 32, калі вы хочаце, але я аддаю перавагу рабіць "а" -,
замест таго, каб проста 32, таму што гэта можа быць любая іншая няшмат.
Пасля таго, як 32-разрадныя, гэта можа быць любы з іх, ці ў нас не будзе дастаткова
Нумары для прадстаўлення ўсіх знакаў.
Так што, калі вы атрымліваеце 32 біт, гэта можа быць 64 біт, гэта можа быць 128 біт.
Любы з гэтых бітаў можа быць трохі, што адрозненне паміж вялікімі і малымі літарамі.
Я не павінен ведаць, што гэта 32 біт.
Я магу выкарыстоўваць гэтую "а" - каб атрымаць крыху адрозніваецца, што паміж двума
без неабходнасці спадзявацца на магічнае лік, якое роўна 32.
І вось цяпер, інакш разлічваць было дзіўна, так што я хачу рабіць?
[Адказы студэнтаў, неразборліва]
[Студэнт] Што гэта?
Я зраблю гэта за 1 секунду.
Так што цяпер, калі я хачу - я хачу, каб пераканацца, што персанаж знаходзіцца цяпер у ніжнім рэгістры,
і так я магу або на 32, і "'32 сэнс - A.
Але заўважце, па тым жа меркаваннях, што і папярэдні, што калі
Ліст было ўжо ніжнім рэгістры, а затым на 32 ORing проста трымае яго ніжні рэгістр.
Ён не змяніў першапачатковы характар.
Але зараз у мяне няма, каб не сказаць: "Калі ў ніжнім рэгістры, проста забыцца пра яго,
калі гэта вялікія, а затым змяніць яго ».
Гэта значна зручней рабіць гэта.
[Студэнт] Ці будзе гэтая стратэгія аднімання з вялікіх маленькіх працу, калі б не 32?
Калі б гэта было, накшталт, 34 ці нешта?
Такім чынам, вы павінны ведаць, што розніца паміж 2 з'яўляецца -? >> 1 біт.
Гэта можа быць больш, чым 1 біт, пакуль усё біты ніжэй гэтай пазіцыі супадаюць.
Так што нам трэба па крайняй меры 26 сімвалаў - ці, існуе 26 знакаў.
Так што нам трэба па крайняй меры 26 нумароў ўяўляюць сабой розніцу -
Розніца паміж і'' павінен быць не менш 26,
інакш мы б не былі прадстаўлены ўсе нумары капіталу.
Гэта азначае, што, калі мы пачнем з 1, ён збіраецца выкарыстоўваць усе гэтыя біты,
Усе гэтыя першыя 5 біт, прадстаўляюць усе праз Z.
Вось чаму наступны біт, ці гэты біт, наступны біт з'яўляецца той, які абраны, каб адрозніваць і '.'
Гэта таксама, чаму ў ASCII табліцы, існуе 5 знакаў падзелу загалоўнымі літарамі ад маленькіх літар.
З тых часоў з'яўляюцца сімваламі, што дадатковыя 5 выхоўвае 32-быцця розніца паміж імі.
[Студэнт] Такім чынам, мы можам гэта зрабіць, таму што ASCII распрацавана такім чынам.
Так. Але ASCII - розніца можа быць таксама абодва гэтых біта.
Маўляў, калі былі 10000001 і 'а' быў 11100001 - я забыўся, што заўгодна.
Але калі б гэта было, то мы ўсё яшчэ можам выкарыстоўваць'' - A.
Гэта проста цяпер розніца паміж А і 'а' па-ранейшаму гэтыя 2 біта.
Я думаю, што гэта напісана 48. Гэта 32 + 64? Я думаю, што гэта?
Ён усё роўна будзе 2 біта, кожны асобны знак, быццам бы, Z і Z, K і K,
яны да гэтага часу дакладна такі ж біты, за выключэннем тых 2 біта.
Так што, пакуль што гэта заўсёды так, незалежна ад таго, калі мы выкарыстоўваем ASCII або іншыя сістэмы,
пакуль ёсць толькі пэўную колькасць бітаў, якія розныя для кожнага персанажа,
тое, што добра працуе.
Гэта проста, што 32 была створана таму, што гэта першы, які мы маглі б выкарыстоўваць. >> Cool.
Я аддаю перавагу, у выпадку, калі вы не бачылі, калі блок з'яўляецца толькі аднаго радка,
Вы можаце пазбавіцца ад фігурныя дужкі, так што я аддаю перавагу рабіць гэта.
Акрамя таго, вы ведаеце, як мы можам рабіць такія рэчы з [я] + = 1?
Вы таксама можаце зрабіць з [я] пабітавае І = 32.
І пабітавае OR = 32.
Акрамя таго, разлічваць мод 2 == 0.
Таму памятайце, што - я не буду пісаць гэта - любое выдатнае ад нуля значэнне праўдзіва, і 0 няправільна.
Такім чынам, "калі колькасць Модуль 2 == 0" такі ж, як кажуць, "калі не лічыць той 2".
Я б, напэўна, проста адмяніў ліній і сказаў: "калі колькасць модулю 2,
у OR 1, яшчэ ў AND 1 ", так што мне не трэба" не ".
Але гэта працуе так жа добра.
А што яшчэ я магу тут рабіць?
Вы можаце спалучаць іх з трайной, калі вы хацелі, але потым, што б проста зрабіць усё брудней
і, верагодна, больш цяжкім для чытання, таму мы не будзем гэтага рабіць.
Любы, ёсць якія-небудзь іншыя прапановы?
Гэта ўсё, што праблема прасіў? Ах так.
Так што пазбавіцца ад гэтых пустых радкоў, зараз мы будзем друкаваць F,% ы быць адзін для радкі,
Мы будзем друкаваць F, S.
Зараз давайце запусцім яго. Я зрабіў нешта не так?
Гэта \ ", я хачу н.
Добра. Цяпер мы будзем запускаць яго. Гэта, напэўна, крычаць на мяне.
STRLEN ў string.h.
Так што гэта добрая рэч аб Clang гэта кажа вам, што ён знаходзіцца ў,
замест GCC, які проста кажа: "Гэй, ты забыўся нешта, я не ведаю, што гэта было".
Але гэта скажа мне: "Ты павінна ўключаць string.h".
Так што я не падкажуць ні на што, так што гэта нічога не кажу.
Але мы будзем рабіць іх, напрыклад, "Дзякуй 4 Дадаць".
Гэта выглядае правільна. Ура.
Такім чынам, вяртаючыся да вашай асноўнай, я амаль ніколі не робяць гэтага.
Гэта неабавязкова. А галоўнае гэта адзіная функцыя, для якіх ён не з'яўляецца абавязковым.
Калі вы нічога не вяртаюць ад галоўнага, то мяркуецца, што вы хацелі вяртаць 0.
Пытанні?
Добра. Так што цяпер другая праблема.
"Успомніце з другой лекцыі тыдзень 2 аб тым, што замена значэння 2 зменных, перадаючы
гэтыя 2 зменныя функцыі (нават калі называюць своп) дакладна не працуе, па меншай меры, не без «паказальнікі».
І ігнараваць паказальнікі, пакуль мы не атрымаем на іх.
Мы хочам, каб памяняць 2 зменныя, мы не выкарыстоўваем функцыю зрабіць гэта.
Мы ўсё яшчэ збіраемся зрабіць гэта ў галоўным, як ён кажа.
Але выкарыстоўваць гэтыя 2 зменныя, мы не хочам выкарыстоўваць часовую зменную.
Ёсць 2 спосабу зрабіць гэта.
Вы можаце зрабіць гэта з дапамогай традыцыйных бінарных аператараў.
Так хто-небудзь ведае хуткі і брудны спосаб зрабіць гэта?
Гэта сапраўды можа заняць хвіліну мыслення. Калі ў мяне ёсць -
Я паставіў задачу ўверх, як яны просяць. Так што, калі ў мяне ёсць 2 зменныя, A, які знаходзіцца ўсяго ў цэлае
што яны даюць мне, і сумай зменных B, якая з'яўляецца яшчэ адным цэлым, што мне даюць.
Так што, калі ў мяне ёсць гэтыя 2 зменныя, цяпер я хачу, каб памяняць іх месцамі.
Традыцыйна, з дапамогай рэгулярных бінарных аператараў, я маю на ўвазе, напрыклад, +, -, ÷.
Ня бітаў аператары, якія дзейнічаюць на двайковы.
Такім чынам, выкарыстанне -, +, ÷, і ўсіх тых.
Мы маглі б памяняцца, робячы нешта накшталт = A + B, і B = A - B, A = A - B.
Такім чынам, праверка спраўнасці, і тады мы ўбачым, чаму гэта працуе.
Скажам = 7, бы = 3, то A + B будзе 10.
Так што мы зараз мяркуючы а = 10, а затым мы робім B = A - B.
Такім чынам, мы робім B = A - B, які будзе 7, а B = A - B зноў,
ці = A - B. Які будзе 10 - 7, якая з'яўляецца 3.
Так што цяпер, правільна, "а" было 7, б было 3 гады, і ў цяперашні час знаходзіцца ў 7 б і 'а' 3.
Так што выгляд мае сэнс; «а» з'яўляецца спалучэнне 2-х нумароў.
На дадзены момант, 'а' гэта спалучэнне, а затым мы аднімання з арыгінальных б,
а потым мы адніманнем, што было першапачатковым ".
Але гэта не працуе для ўсіх нумароў.
Каб пераканацца ў гэтым, давайце разгледзім сістэму, таму мы звычайна думаем пра цэлых лікаў у выглядзе 32 біт.
Давайце працаваць на тое, што, як толькі 4 біта.
Спадзяюся, я прыдумаў добры прыклад прама цяпер.
Дык вось, я ведаю, гэта будзе нялёгка.
Скажам, нашы 2 нумары 1111, і 1111, так што мы ў двайковай прама цяпер.
На самай знакаў пасля коскі, калі вы хочаце думаць пра яго, такім чынам, = 15 і B = 15.
І таму мы чакаем, пасля таго як мы абмяняць іх - яны нават не павінны быць аднолькавымі нумарамі,
але я зрабіў гэта такім чынам.
Давайце зробім іх не аднолькавымі нумарамі. Давайце зробім 1111 і 0001.
Такім чынам, = 15 і B = 1.
Пасля таго як мы памяняць іх месцамі, мы чакаем "а" роўна 1 і B на 15.
Такім чынам, наш першы крок = а + б.
Нашы нумара толькі 4 біта, так што "", які з'яўляецца 1111, + Ь, 0001,
будзе ў канчатковым выніку 10000, але ў нас ёсць толькі 4 біта.
Так што цяпер = 0.
А зараз мы хочам ўсталяваць B = A - B - на самай справе, гэта ўсё яшчэ працуе выдатна.
= A - B - давайце паглядзім, калі гэта працуе выдатна.
Тады B = 0 - 1, якое ўсё роўна будзе 15, а затым = A - B, які быў бы 1.
Можа быць, гэта сапраўды працуе.
Я адчуваю, што ёсць прычына, яна не працуе з выкарыстаннем рэгулярных.
Такім чынам, які працуе на здагадцы, што яна не працуе з звычайнымі бінарнымі аперацыямі,
і я буду шукаць - я Google, каб пераканацца, што гэта праўда.
Такім чынам, мы хочам зрабіць гэта з дапамогай бітавых аператараў, і ключ тут XOR.
Такім чынам, увядзенне XOR (^), калі вы яго яшчэ не бачыла.
Гэта, зноў жа, аператар пабітава так ён дзейнічае па макулінках, і it's -
Калі ў вас ёсць біты 0 і 1, то гэта будзе 1.
Калі ў вас ёсць біты 1 і 0, то гэта будзе 1, у вас ёсць біты 0 і 0, гэта будзе 0,
і калі ў вас ёсць біты 1 і 1 гэта будзе 0.
Так што гэта як OR. Калі адзін з бітаў праўда, гэта 1, але ў адрозненне ад OR, яно не можа быць і бітамі, якія з'яўляюцца праўдзівымі.
Ці б гэта быць 1, XOR б гэта быць 0.
Такім чынам, мы збіраемся хочаце выкарыстоўваць XOR тут.
Задумайцеся аб гэтым на хвіліну, я збіраюся Google.
Ну, вы не можаце прачытаць, што, я ў цяперашні час знаходжуся на алгарытм падпампоўкі старонак XOR.
Спадзяюся, гэта будзе растлумачыць, чаму Я не магу -
Гэта менавіта алгарытм, які мы толькі што зрабілі.
Я ўсё яшчэ не разумею, чаму - я, павінна быць, проста выбраў дрэнны прыклад,
але гэта выпадак, калі «а» адбылося стаць 0, пасля атрымання да 5 біт, так што цяпер "а" роўна 0,
гэта тое, што завецца "цэлалікавых перапаўненне".
Згодна з Вікіпедыі, "у адрозненне ад XOR падпампоўкі, гэты варыянт патрабуе, што яна выкарыстоўвае некалькі метадаў
каб гарантаваць, што х + у не выклікае перапаўненне цэлага ".
Так што гэта сапраўды ёсць праблемы, гэта было цэлалікавага перапаўнення, але я зрабіў нешта не так.
Я не ўпэўнены. Я паспрабую прыдумаць іншы.
[Студэнт] Ну, не цэлалікавых перапаўненне, калі вы спрабуеце паставіць побач там
больш, чым колькасць біт вы вылучылі?
Так. У нас ёсць 4 біта. That's - у нас было 4 біта, тады паспрабуйце дадаць да яго 1, так што мы ў канчатковым выніку з 5 біт.
Але 5. біт проста атрымлівае адрэзаць, так.
Гэта магло б на самой справе -
[Студэнт] Ці значыць гэта, кінуць вас пра памылку, ці ж, што - бы, што выдасць памылку?
Нумар Таму няма памылкі. Калі вы дойдзеце да ўзроўню зборкі, спецыяльны біт
дзесьці ўстаноўлена, што сказаў, што перапаўненне, але ў C вы, здаецца, проста не справіцца з гэтым.
На самай справе вы не можаце справіцца з гэтым, калі вы выкарыстоўваеце спецыяльныя інструкцыі па зборцы ў C.
Давайце падумаем аб XOR падпампоўкі.
І я думаю, што артыкулы Вікіпедыі, магчыма, таксама казалі, што -
Так ён і выхоўваўся модульнай арыфметыцы, так што я думаю, я быў, па ідэі, рабіць модулярный арыфметыкі
Калі я сказаў, што 0 - 1 у 15 разоў.
Так што можа на самой справе - на рэгулярнай працэсара, што робіць 0 - 1 = 15.
Так як мы ў канчатковым выніку на 0, мы адымаем 1, так то проста азірайцеся назад да 1111.
Такім чынам, гэты алгарытм можа на самай справе працуюць, A + B, A - B, B -, то можа быць штраф.
Але ёсць некаторыя працэсары, якія не робяць гэтага, і таму ён не будзе добра ў гэтыя спецыфічныя.
XOR своп будзе працаваць на любым працэсары. Добра.
Ідэя складаецца ў тым, што ён павінен быць такім жа, усё ж.
Дзе мы выкарыстоўваем XOR нейкім чынам атрымаць інфармацыю як у 1 зменных,
, А затым выцягнуць інфармацыю з асобных зменных зноў.
Так хто-небудзь ёсць ідэі / адказ?
[Студэнт адказ, неразборліва]
Так гэта павінна працаваць, а таксама, XOR з'яўляецца коммутативной.
Незалежна ад таго, у якім парадку гэтыя 2 нумары здарыцца быць у тут,
Гэты вынік будзе той жа.
Так ^ Ь Ь.
Вы таксама можаце ўбачыць гэта ў выглядзе = B, B =, = б зноў.
Такім чынам, гэта права, і зразумець, чаму гэта працуе, думаюць пра бітах.
З дапамогай невялікага ліку, скажам, 11001, 01100 і.
Так што гэта 'а', гэта б.
Такім чынам, ^ = Ь.
Мы збіраемся быць усталяваны ў 'а' = да XOR гэтыя 2 рэчы.
Такім чынам, 1 ^ 0, 1, 1 ^ 1 = 0, 0 ^ 1 = 1, і 0 ^ 0 = 0, 1 = 0 = 1.
Такім чынам, ',', калі вы паглядзіце на дзесятковы лік, яно будзе -
Вы не ўбачыце вялікую частку адносін паміж арыгіналам "а" і новага ","
але, гледзячы на ​​біт "," цяпер, як сетка інфармацыі
як арыгінал "і арыгінальныя б.
Такім чынам, калі мы возьмем Ь, мы бачым, што мы ў канчатковым выніку на арыгінал ".
А калі ўзяць арыгінал "'^ новыя", "мы бачым, мы ў канчатковым выніку на арыгінальныя б.
Такім чынам, (Ь) ^ B = арыгінал ".
І (Ь) ^ = арыгінальныя б.
Існуе - яшчэ адзін спосаб убачыць гэта нічога XOR сам заўсёды роўны 0.
Такім чынам, 1101 * 1101, усе біты будзе тое ж самае.
Так што там ніколі не будзе выпадак, калі 1 з'яўляецца 0, а іншы роўны 1.
Такім чынам, гэта 0000.
Тое ж і з гэтым. (Ь) ^ б, як ^ (Ь б).
(Б ^ б) будзе 0, а Ф 0 толькі збіраецца быць "," так як усе біты роўныя 0.
Такім чынам, толькі тыя, якія збіраюцца быць там, дзе "а" першапачаткова быў 1 - было з іх.
І тая ж ідэя тут, я ўпэўнены, што гэта таксама коммутативна.
Так. Я ж кажу, да гэтага яна была коммутативной.
^ ',' І гэта асацыятыўныя, так што цяпер (Ь) ^.
І мы можам зрабіць, Ь (^).
І вось зноў, мы атрымаем арыгінальны б.
Такім чынам,'' цяпер спалучэнне 'а' і б разам.
Выкарыстоўваючы наш новы комба "а" мы кажам, B = комба'' ^ арыгінальных б, атрымліваем арыгінальны '.
А цяпер комба = 'а' ^ новы б, які быў арыгінальным - і які цяпер, што было "а" ці б.
Вось гэты выпадак тут. Гэта = б, старая б.
Так што цяпер усё зноў у парадку памяняліся месцамі.
Калі б мы паглядзелі на біты, B = ^ B, будзе XOR гэтых 2,
і адказ будзе гэтага, а затым = ^ Коммерсанта XORing гэтыя 2 і адказ заключаецца ў наступным.
Пытанні? Добра. Такім чынам, апошні некалькі значна больш цяжкім.
[Студэнт] Я думаю, што ў яго ёсць сумневы. >> Ой, прабачце.
[Студэнт] Што на самай справе хутчэй? Калі вы выкарыстоўваеце гэты XOR, ці гэта, калі вы аб'явіце новую зменную?
Так што ж такое на самай справе хутчэй, абвясціўшы новую зменную або з дапамогай XOR, каб памяняць?
Адказ, па ўсёй верагоднасці, часовай зменнай.
І гэта таму, што як толькі ён складзены ўніз - так, на ўзроўні зборкі,
няма такой рэчы, як лакальныя зменныя або часовыя пераменныя або любое з гэтага матэрыялу.
Яны проста хацелі - ёсць памяць, і ёсць рэгістры.
Рэгістры, дзе ўсё актыўна адбываецца.
Вы не дадаюць 2 рэчы ў памяці, вы дадаюць 2 рэчы ў рэгістрах.
І вы прыносіце рэчы з памяці ў рэгістры затым дадаць іх,
а затым вы можаце пакласці іх назад у памяць, але ўсё дзеянне адбываецца ў рэгістрах.
Такім чынам, калі вы з дапамогай часовай зменнай падыход, як правіла, адбываецца тое,
гэтыя 2 нумары ўжо знаходзяцца ў рэгістрах.
А потым з гэтага моманту, пасля таго як вы іх месцамі,
гэта будзе проста пачаць выкарыстаць іншы рэгістр.
Дзе б вы ні былі выкарыстаннем Коммерсанта, гэта будзе проста выкарыстоўваць рэгістр, які быў ужо захоўванні ".
Так што не трэба нічога рабіць на самай справе рабіць замены. Да?
[Студэнт] Але гэта таксама патрабуе больш памяці, правільна?
Гэта зойме больш памяці, калі гэта неабходна для захоўвання, што часовая зменная.
Напрыклад, калі вы пазней выкарыстоўваць гэтую часовую зменную зноў дзесьці,
Затым - ці вы прызначаеце нешта, што часовая зменная.
Так, калі ў любы момант часу ',' б ў тэмпературы маюць розныя значэнні або нешта,
то гэта будзе мець розныя месцы ў памяці, але гэта праўда, што
Ёсць шмат лакальных зменных, якія існуюць толькі ў рэгістрах.
У такім выпадку, ён ніколі не ставіў у памяць, і таму вы ніколі не марнуючы памяці.
Добра. Апошні пытанне крыху больш.
Дык вось, у гэтым CS50 прыбор, ёсць слоўнік.
І прычына гэтага ў тым, што [? B66] з'яўляецца праверка арфаграфіі, дзе вы будзеце пісаць
з выкарыстаннем хэш-табліц або спроб ці некаторыя структуры дадзеных.
Вы збіраецеся пісаць праверкі арфаграфіі, і вы збіраецеся выкарыстаць гэты слоўнік, каб зрабіць гэта.
Але для гэтай задачы, мы проста будзем глядзець уверх, каб убачыць, калі адно слова ёсць у слоўніку.
Такім чынам, замест таго, каб захоўваць увесь слоўнік ў некаторай структуры дадзеных
, А затым, азіраючыся на ўвесь дакумент, каб убачыць, калі нічога гэта няправільна,
Мы проста хочам, каб знайсці 1 слова. Такім чынам, мы можам проста сканаваць па ўсёй слоўнік
і калі мы ніколі не знойдзем слова ва ўсім слоўніку, то ён не быў там.
Калі мы праглядаем па ўсёй слоўнік і бачу слова, тое, што мы добрыя, мы знайшлі яго.
Тут гаворыцца, што мы хочам, каб пачаць глядзець на файл-функцыі апрацоўкі C, у
так як мы хочам, каб прачытаць слоўнік,
але я дам падказку тут пра тое, якія функцыі вы павінны думаць.
Я напішу іх на прасторах.
Такім чынам, асноўнымі з якіх вы хочаце, каб глядзець на гэта адкрытая F, а затым, непазбежна, F замкнёна,
, Якія пойдуць у канцы вашай праграмы, і е е сканавання.
Вы таксама можаце выкарыстоўваць F чытаць, але вы, верагодна, не хочуць
таму што - вы не ў канчатковым выніку трэба гэта.
F сканавання F з'яўляецца тое, што вы збіраецеся выкарыстоўваць для сканавання па слоўніку.
І таму вам не трэба, каб закадаваць да рашэння, проста паспрабуйце і, як псеўда-код свой шлях
Да раствору, а затым мы абмяркуем гэта.
А на самай справе, паколькі я ўжо даў вам гэта, калі вы ідзяце ў любым тэрмінале або абалонкі прыбора, у
Я хацеў бы - я звычайна - калі вы яшчэ не бачылі, я не ведаю, калі б вы зрабілі ў класе,
але чалавек, таму старонках мужчына, даволі карысна для гледзячы на ​​амаль любой функцыі.
Так што я магу зрабіць, быццам бы, MAN F, сканаванне ф.
Гэта цяпер Інфармацыя пра сям'ю сканавання F функцый.
Я мог бы таксама зрабіць MAN F, адкрытай, і што дасць мне інфармацыю пра гэта.
Так што, калі вы ведаеце, якія функцыі вы выкарыстоўваеце, або вы праглядаеце код
, І вы ўбачыце некаторыя функцыі, і вы накшталт: "Што ж гэта рабіць?"
Проста чалавек, што імя функцыі.
Ёсць некалькі дзіўных прыкладаў, дзе вы маглі б сказаць,
падабаецца. Чалавек 2, што імя функцыі, або чалавека 3, што імя функцыі,
але Вы толькі павінны зрабіць, што калі чалавек імя функцыі не бывае, каб працаваць у першы раз.
[Студэнт] Так што я чытаў даведачную старонку для адкрытага, але я да гэтага часу блытаюць аб тым, як яго выкарыстоўваць і праграмы.
Добра. Многія мужчыны старонак менш, чым карысным.
Яны больш карысныя, калі вы ўжо ведаеце, што яны робяць
а затым вы проста павінны памятаць, парадак аргументаў ці чамусьці.
Ці яны могуць даць вам агульнае ўяўленне, але некаторыя з іх вельмі пераважнай.
Як і F сканавання F, а таксама. Гэта дае вам інфармацыю для ўсіх гэтых функцый,
і 1 радок тут адбываецца, сказаць: "F F сканавання счытвае з пункту радок або паток".
Але F адкрыць. Такім чынам, як мы выкарыстоўваем F адкрыта?
Ідэя праграмы, якія неабходна зрабіць файл уводу / высновы з'яўляецца тое, што
Вы спачатку трэба адкрыць файл, які вы хочаце зрабіць нешта з, і непазбежна,
чытаць рэчы з гэтага файла і рабіць рэчы з імі.
F адкрытых тое, што мы выкарыстоўваем, каб адкрыць файл.
Тое, што мы вернемся, так што файл мы хочам адкрыць, яна дае нам -
Тут ён кажа: "/ карыстальніка / долі / Dict / слова».
Гэта файл, які мы хочам адкрыць, і мы хочам, каб адкрыць яго -
мы павінны відавочна паказаць, ці жадаем мы, каб адкрыць яго для чытання або, калі мы хочам, каб адкрыць яго пісаць.
Там у пару камбінацый і іншае, але мы хочам, каб адкрыць гэта для чытання.
Мы хочам, каб чытанне з файла.
Такім чынам, што ж гэта вяртанне? Яна вяртае файл зорачкай (*),
і я проста пакажу ўсё, што ў зменнай F, так *,
зноў жа, гэта паказальнік, але мы не хочам мець справу з паказальнікамі.
Вы можаце думаць, як F, F цяпер пераменная вы збіраецеся выкарыстоўваць для прадстаўлення файла.
Так што, калі вы хочаце прачытаць з файла, вы чытаеце з ф.
Калі вы хочаце, каб закрыць файл, вы зачыняеце ф.
Так, у канцы праграмы, калі мы непазбежна хочуць зачыніць файл, тое, што мы павінны рабіць?
Мы хочам, каб закрыць ф.
Так што зараз апошняя функцыя файл, які мы збіраемся хочаце выкарыстоўваць сканаванне F, F сканавання ф.
І што, што робіць гэта яна скануе на файл шукае шаблонам.
Гледзячы на ​​мужчыну старонцы тут, мы бачым Int F сканавання F, ігнараваць вяртаецца значэнне на дадзены момант.
Першым аргументам з'яўляецца файл патоку *, так што першы аргумент мы збіраемся хочаце перадаць IS-F.
Мы сканавання па ф.
Другі аргумент з'яўляецца радком фармату.
Я дам вам фармат радкі прама цяпер.
Я думаю, што мы, здараецца, кажуць, 127s \ п, шмат гэта непатрэбным.
Ідэя пра тое, што гэты фармат радкі, што вы можаце думаць аб е сканаванне як супрацьлегласць друку ф.
Такім чынам, друк F, F друку, мы таксама выкарыстоўваем гэты тып фармату параметру,
але ў друку F тое, што мы робім, - давайце паглядзім на эквіваленту.
Такім чынам, друк е, і ёсць на самай справе таксама F друк F, дзе першы аргумент будзе ф.
Калі вы друкуеце F, мы маглі б сказаць нешта накшталт: "друк 127s \ п", а затым, калі мы перададзім яму некаторыя радкі,
ён збіраецца надрукаваць гэты радок, а затым з новага радка.
Якія сродкі 127, я ўпэўнены, але я ніколі не абмяжоўваў сябе да яго,
Вы нават не трэба казаць '127 'у друкаваных F,
Але што гэта азначае, раздрукуйце 1. 127 знакаў.
Так што я ўпэўнены, што гэта так. Вы можаце Google за гэта.
Але ў наступны я амаль упэўнены, гэта азначае, што.
Так што гэта надрукавана першая 127 знакаў, а затым з новага радка.
F сканавання F цяпер, замест таго, каб, гледзячы на ​​зменную і друк,
гэта будзем глядзець на некаторыя радкі і захаваць шаблон ў зменную.
Давайце рэальна выкарыстоўваць сканаванне е ў іншы прыклад.
Так скажам, у нас былі некаторыя INT, х = 4,
і мы хацелі стварыць радок зроблены з - хацелі стварыць радок
, Што было падобна, гэта прыйдзе значна пазней,
тое, што сапраўды гэтак жа як 4.jpg.
Такім чынам, гэта можа быць праграма, дзе вы будзеце мець суму лічыльніка,
Падводзячы супрацьдзеянні я, і вы хочаце зэканоміць кучу фатаграфій.
Такім чынам, вы хочаце захаваць i.jpg, дзе я некаторы ітэрацыі цыкле.
Так як жа нам зрабіць гэты радок, што JPEG?
Калі вы хочаце раздрукаваць 4.jpg, мы маглі б проста сказаць, друк F,% d.jpg,
, А затым яна будзе друкаваць для гэтага JPEG.
Але калі мы хочам захаваць радок 4.jpg, мы выкарыстоўваем сканаванне ф.
Такім чынам, радок S - на самай справе мы не можаш - сімвал, сімвал S, давай 100.
Так што я проста заявілі некаторыя масіў з 100 сімвалаў,
і вось што мы непазбежна будзем захоўваць, што JPEG цалі
Так што мы збіраемся выкарыстаць сканаванне е, і фармат, як мы б сказалі,% d.jpg
для таго, каб раздрукаваць 4.jpg, фармат гэтага будзе d.jpg%.
Такім чынам, фармат% d.jpg, што мы хочам замяніць% D, з'яўляецца х,
і зараз мы павінны захоўваць гэты радок недзе.
А дзе мы будзем захоўваць гэтую радок у масіве с.
Такім чынам, пасля гэтага радка кода, а, калі мы друкуем F,% з зменнай с,
ён збіраецца друкаваць 4.jpg.
Такім чынам, F сканавання F такая ж, як сканіраванне F, толькі зараз яна глядзіць на гэты файл
за тое, што захоўваць у с.
Гэта тое, што апошні аргумент будзе.
Мы хочам, каб захоўваць - "Scan е сямейства функцый сканавання і ў адпаведнасці з фарматам, як спрабаваў ніжэй.
Калі захоўваецца ў размяшчэнні пунктаў вы маглі б вярнуцца - "
Не, мы маглі б быць добрымі. Дазвольце мне думаць ні на секунду.
Такім чынам, сканаванне F - не, якога чорта гэта функцыя, якая робіць гэта?
Такім чынам, сканаванне F не збіраецца прымаць цэлае і зрабіць кропку JPG.
Гэта будзе [мармыча].
Захаваць Int зменнай у радок Int C.
Што гэта зменная, або тое, што гэтая функцыя называецца?
Так. That's - так. Так што я быў вызначальным для вас да гэтага быў з друку F,
які - што нашмат больш сэнсу, таму я сказаў, што гэта значна больш падобна друку ф.
Сканіраванне F-ранейшаму накшталт як друк F, але з друку F будзе праверыць яго на
і замяніць зменныя і цяпер захоўваць яго ў радок.
Замест друку, яно захоўвае яго ў радок.
Так што ігнараваць цалкам. Вы ўсё яшчэ можаце думаць фармату, як такія друку ф.
Так што цяпер, калі мы хацелі зрабіць 4.jpg рэч, мы будзем рабіць з друку F, X аб гэтым.
Так што сканаванне F робіць - тое, што ваша пытанне будзе?
[Студэнт] Я проста заблытаўся ў тое, што мы спрабуем зрабіць прама тут
з JPEG. Ці можаце вы растлумачыць, што 1 больш часу?
Так што гэта было - гэта менш за relevent для сканавання F F цяпер, спадзяюся, ён будзе звязваць яшчэ ў нейкі шлях.
Але тое, што я першапачаткова збіраўся паказаць было - гэта на самай справе непасрэднае дачыненне да гэтых [? F5]
Вы збіраецеся выкарыстоўваць друк з F, дзе ў нас ёсць 100 малюнкаў,
і вы хочаце чытаць 1.jpg малюнка, 2.jpg, 3.jpg.
Таму для таго, каб зрабіць гэта, вам трэба е адкрытае, а затым вы павінны перадаць у радок, якую вы хочаце адкрыць.
Такім чынам, мы хацелі б адкрыць 1.jpg, для таго, каб стварыць радок, якая 1.jpg,
Мы робім пячатку з Р% d.jpg--мы не рабілі для Int = 0.
я <40, я + +.
Такім чынам, з друк F% d.jpg ўводу.
Такім чынам, пасля гэтай лініі, цяпер пераменная або масіў, а збіраецца 1.jpg.
Ці, 0.jpg, 1.jpg, 2.jpg. І такім чынам мы можам адкрыць, у сваю чаргу, кожнае малюнак для чытання.
Так што тое, што з друку F робіць. Вы бачыце, што з друку F цяпер рабіць?
[Студэнт] Такім чынам, ён прымае - ён стварае радок, something.jpg, а затым захоўвае яго.
Так. Гэта стварае - гэта яшчэ адзін радок фармату, як сканіраванне і друк F F,
, Дзе ён устаўляе ўсе зменныя ў другім аргуменце, можа быць ёй, у адрозненне ад мяне.
Можа быць - я маю на ўвазе, што гэта так. Але ў любым парадку аргументаў.
Гэта будзе ўставіць ўсе зменныя ў радок фармату
, А затым захаваць у нашым буферы; мы называем гэта буфер, дзе мы захоўвання радка.
Такім чынам, мы захоўваем ўнутры з правільнай радкі ў фармаце,% D быўшы заменены 4.
[Студэнт] Такім чынам, калі б мы зрабілі гэта, з'яўляецца зменнай F толькі збіраецца быць пераназначаны?
Так. Такім чынам, мы павінны зачыніць арыгінальную е, перш чым рабіць гэта.
Але - і тут жа, калі б не было F адкрываюць тут, то мы павінны былі б сказаць -
Так. Але было б адкрыць сотні розных файлаў.
[Студэнт] Але мы не былі б у стане атрымаць доступ або - нармальна.
Добра. Такім чынам, сканаванне F, F сканавання F, гэта свайго роду тая ж ідэя,
але замест таго, замест таго, каб захоўваць яго ў радок, гэта больш падобна вы зараз
пераходзячы джала і супастаўлення з гэтай радком і захоўванне вынікаў у зменныя.
Вы можаце выкарыстоўваць сканаванне F разабраць на нешта накшталт 4.jpg, і захоўваць цэлы лік 4 у суме х Int.
Гэта тое, што мы можам выкарыстоўваць для сканавання е.
F F сканавання збіраецца зрабіць гэта ў камандным радку.
Я на самой справе упэўнены, што гэта тое, што бібліятэка CS50 робіць.
Таму, калі вы кажаце: "атрымаць Int", гэта сканаванне F-ня больш - сканаванне F з'яўляецца спосаб атрымання карыстацкага ўводу.
F сканавання F будзе рабіць тое ж самае, але з выкарыстаннем файлаў для сканавання па.
Дык вось, мы сканаванні над гэтым файлам.
Ўзор, які мы спрабуем адпавядаць некаторая радок, якая складае 127 сімвалаў
рушыла ўслед новая лінія
Так што я ўпэўнены, што мы маглі б нават проста сказаць: "адпавядае ы", так як у слоўніку
Мы, аказваецца, ёсць, мы гарантавана няма слоў з'яўляецца тое, што доўгая,
а таксама F сканавання е, я думаю, будзе спыняцца на новай лініі ні на што.
Але мы будзем ўключаць новыя радкі ў матчы, і -
[Студэнт] Калі мы не будзем ўключаць новыя лініі, не было б знайсці часткі слова?
Гэта - кожнаму - гледзячы на ​​слоўнік -
Так, у слоўніку, усе гэтыя нашы словы.
Кожны з іх з новага радка.
F сканавання збіраецца забраць гэтае слова.
Калі мы не будзем ўключаць новыя лініі, то цалкам магчыма, што наступны F сканаванне будзе проста прачытаць новую радок.
Але ў тым ліку новыя лініі, то будзе проста ігнараваць новую радок.
Але мы ніколі не атрымаем частка слова, так як мы заўсёды чытаў да новай лініі, нягледзячы ні на што.
[Студэнт] Але што, калі вы шукаеце слова "перакручаны апетыт", як перакручаны апетыт.
Ці будзе гэта, што і казаць, што гэта матч?
І вось мы - ён будзе чытаць - гэта на самай справе добры момант.
Мы ніколі з выкарыстаннем бягучага - слова, якое мы шукаем першы аргумент каманднага радка.
Такім чынам, радок, слова = ARGV 1.
Такім чынам, радок мы шукаем з'яўляецца ARGV 1.
Мы не шукаем слова наогул у нашым сканавання ф.
Тое, што мы рабілі з сканаванні F становіцца кожнае слова ў слоўніку,
, А затым, калі ў нас, што слова, якое мы збіраемся выкарыстаць STRCMP каб параўнаць іх.
Мы збіраемся параўнаць нашы словы і тое, што мы толькі што прачыталі цалі
Такім чынам, непазбежна, мы збіраемся ў канчатковым выніку робіць кучу сканаванне ФС
пакуль не так ужо здарылася, што сканаванне F вернецца -
ён будзе вяртаць адзін, пакуль яна адпавядае новым словам,
і ён будзе вяртаць нешта іншае, як толькі яно не адпавядае слова.
Мы чытаем па ўсім слоўніку, захоўванне радок за радком кожнае слова ў зменную с.
Затым мы параўноўваем слова з, а калі параўнанне == 0,
STRCMP адбываецца давесці 0, калі матч быў зроблены.
Так што, калі гэта быў 0, то мы можам надрукаваць F, супадаюць,
або слова ў слоўніку, або што вы хочаце надрукаваць ф.
І потым - мы не хочам, каб F закрыць зноў і зноў.
Гэта такая рэч, што мы хочам зрабіць, і мы не проста шукаеце слова ў слоўніку.
Такім чынам, мы маглі б зрабіць гэта, калі б мы хацелі паглядзець на іх карціны, перакручаны апетыт, як вы казалі,
калі мы хочам, каб шукаць гэтую схему, то яно не будзе ў тым выпадку,
таму што гэта на самай справе не словы, а адно з слоў у слоўніку, здараецца, што ў ім.
Так што гэта будзе адпавядаць гэтым словам, але гэта падмноства слова не само слова.
Але гэта не тое, як мы выкарыстоўваем яе, мы чытаем у кожным слове
, А затым параўноўваючы слова ў нас з гэтым словам.
Такім чынам, мы заўсёды параўнанні поўным слоў.
Я магу адправіць завершана рашэнне пазней.
Гэта свайго роду амаль правільны адказ, я думаю.
[Студэнт каментар, неразборліва]
О, я пазбавіцца ад гэтага раней? Char з, я думаю, мы сказалі 127 - я забыўся, што найбуйнейшы ёсць.
Мы проста робім 128; так што цяпер ёй досыць доўга.
Мы не трэба нічога друкаваць.
Мы таксама збіраемся хочаце, каб закрыць файл, і што павінна быць прыкладна правільны адказ.
CS50.TV