[Powered by Google Translate] [Тыдзень 3] [David J. малая - Гарвардскі універсітэт] [Гэта CS50. - CS50.TV] Дазвольце мне накіраваць нас у бок, дзе мы спыніліся ў мінулы раз, які пачынаў думаць, што крыху больш, чым пра сінтаксісе і спрабаваць думаць крыху менш аб усіх дробязях , Што займае крыху часу, каб прывыкнуць да гэтага часу ва ўмовах коскі і дужкі і фігурныя дужкі, пачаць прымаць рэчы крыху больш высокай канцэптуальным узроўні так што праблемы, якія мы зараз прыступіць да вырашэння на працягу бліжэйшых некалькіх тыдняў збіраюцца прыцягнуць значна больш на больш высокім узроўні канцэптуальных праблем і крыху менш у сінтаксічным, як вы атрымаеце вашы ногі мокрыя і вашы рукі брудныя з некаторымі з сінтаксісу ад гэтых апошніх некалькіх тыдняў. Так Нагадаем, што на мінулым тыдні мы ўвялі гэта паняцце масіва. І масіва на англійскай мове можа быць апісана як што? >> [Неразборліва адказ студэнта] Прабачце? Калекцыя? >> [Неразборліва адказ студэнта] >> Добра, добра. Калекцыя прадметаў. Такім чынам, мы ўбачылі масіваў у Scratch. Калі ў вас адбылося выкарыстоўваць для PSET 0 адзін з спісаў драпін, якія можна перацягваць рэчы як апельсіны і бананы ў, пералік гатункаў, , Што накшталт як тое, што масіў. І тады тэхнічна больш, у кантэксце фактычнага кампутар, Масіў гэта проста бесперапынны кавалак памяці. Іншымі словамі, у вас ёсць байт, то другі байт, то другі байт, то другі байт, і калі б вы былі зрабіць гэтыя байты ў карціне, яны былі б спіна да спіны, каб спіна да спіны. Вось што мы маем на ўвазе пад бесперапынным. Так што гэта байт нумар 1, потым 2, потым 3. Гэта не значыць, тут, тут, тут, тут. Масіў ўяўляе сабой бесперапынны кавалак 0 або больш байтаў. Так што яны карысныя для? Нагадаем, у нас была такая надуманы прыклад гатункаў захоўвання людзей віктарыны ў праграме вылічыць ваш тэст сярэднім для некаторых, вядома, і ўспомнім, што мы маглі б пачаць пісаць гэтую праграму, абвясціўшы зменную quiz1. Тады мы маглі б мець іншую зменную quiz2. Але тады, калі было 3 віктарын ў гэтым класе, quiz4. Або калі б была штотыднёвая віктарына, было б quiz5, quiz6, quiz7. Такім чынам, вы б усе гэтыя зменныя, абвешчаныя ўнутры асноўнага ці дзе-небудзь яшчэ ў вашай праграме, і праблема з гэтым падыходам, лёгка, хоць гэта, каб проста скапіяваць і ўставіць, гэта проста вельмі хутка становіцца грувасткім. Не дай Бог вы на самой справе ёсць 30 або 50 тэстаў віктарыны. Калі гэта падобна на школу стылі поп штодзённыя віктарыны, то вам проста неймаверна доўгі спіс зменных, аб'яўляе, і гэта проста вельмі хутка выходзіць з-пад кантролю. Гэта непрыгожа, гэта цяжка падтрымліваць, гэта значна прасцей зрабіць памылку друку калі вы атрымліваеце 1 нумар памылку друку дзесьці ў вашай праграме. Такім чынам, мы ўвялі паняцце масіва, а. І нагадаем, што мы рэалізавалі гэтую праграму, выканаўшы трохі нешта накшталт гэтага. Адпусціце мяне ў крыніца сённяшніх 3 каталог панядзелак і адкрыць масіва, які мы бачылі ў апошні раз. І хоць там было некалькі новых трукаў C тут, Сярод іх паняцце пастаяннае, Нагадаем, што мы абвясцілі некалькі паплаўкоў па сутнасці, выкарыстоўваючы наступны сінтаксіс: якая плавае кропкай, то імя зменнай, то мы выкарыстоўвалі квадратныя дужкі сапраўды ў першы раз, і тое, што мы зрабілі ў гэтых квадратных дужках быў фактычна паклаў побач. Але замест таго, каб нумар, я стаўлю гэтае слова капіталізаваць, віктарыны. І тое, што было матывацыяй для здачы капіталізаваць слова, як тэсты а затым з дапамогай трука лінію 17 тут на самай справе даць, што колькасць? Якая была матывацыя ёсць? Так. [Неразборліва адказ студэнта] >> Менавіта так. Калі мы хочам змяніць гэтае значэнне 2, у нас ёсць толькі змяніць яго ў 1-е месца таму што лічу - я нават не памятаю, што гэтая праграма зрабіла сапраўды, але калі вы проста абястлушчанае яго вы бачыце віктарыны, віктарыны. Вы бачыце віктарыны, тут больш віктарыны. Так што, калі ў нас не было гэтага пастаяннага, гэта выкарыстанне вострых вызначыць, мы набралі б 2, то 2, то 2, то 2, і гэта добра. Было б так жа, як правільны. Але выкажам здагадку, што ў наступным годзе ў нас ёсць 3 віктарын ў CS50. Так што я павінен пайсці і абнавіць код, я павінен перакампіляваць яго, але праблема ў тым, калі я раблю нешта дурное, як я ўжо выходзяць 1 згадка з 2 і забудзьцеся падключыць 3, уся праграма цалкам можа зламацца. Так што мы проста напрошваецца на непрыемнасці. Такім чынам, паняцце пастаяннага гэта ўсё аб факторынг некаторыя часткі дадзеных, ці з'яўляецца гэта радок або знак ці лік з якая плавае кропкай або любы іншы, і аб'явіць яго 1-е месца, так што вы можаце больш лёгка змяніць яго ў будучыні. І гэта таксама, шчыра кажучы, крыху лягчэй чытаць, таму што, калі вы проста думаеце пра гэта цяпер, гэта віктарынах, ці мы маглі б нават пераназваць яго нешта накшталт NUMBER_OF_QUIZZES ці нешта больш відавочнай. Код проста становіцца трохі больш відавочна, як тое, што ён робіць, і вы дзівіцеся, крыху менш, што лік 2 можа здарыцца з выгляду. Такім чынам, пастаянная не мае нічога агульнага з прынцыпова масіваў. Масіў быў уведзены шляхам гэтыя квадратныя дужкі. Такім чынам, адзначым, што ў радку 23 мы просім карыстальнікаў, "Якія былі вашы ацэнкі віктарыне?" Тады мы проста павінны гэта цыкл, які па-відаць запытвае ў карыстальніка, для іх ацэнкі. Як? Гэта ітэрацыі ад 0 да 2. І я кажу 2, так як тэсты ва ўсіх вялікіх літарах у цяперашні час 2. Такім чынам, ітэрацыі ад 0 да 2, а затым ён друкуе Віктарына # нешта пра што-то, а затым выкарыстоўвае GetFloat, каб атрымаць значэнне ад карыстальніка. Так што заўважыць гэта можна будзе толькі з новай часткай сінтаксісу ў мінулую сераду. Калі вы хочаце захаваць штосьці ў пэўным месцы ў гэтым масіве, Вы зноў выкарыстоўваць квадратныя дужкі. Так што крыху дыхатаміі тут. Першы раз, калі вы выкарыстоўваеце квадратныя дужкі Вы выкарыстоўваеце яго, каб паказаць, наколькі вялікі Вы хочаце, каб масіў будзе. Але гэта наступны кантэкст тут, дзе мы зноў выкарыстоўваць гэтыя квадратныя дужкі значыць, дзе ў гэтым масіве вы хочаце паставіць некаторыя каштоўнасці? І адрозненне тут можа быць выведзена з кантэксту. Звярніце ўвагу, тут мы маем тып дадзеных, гэта значыць імя зменнай, Затым у нас ёсць квадратныя дужкі з лікам ўнутры, кропка з коскі. Вось і ўсё. Так што гэтую заяву. Гэта проста, як быццам мы зрабілі нешта накшталт паплаўка Grade1; паплавок grade2; але зноў жа, гэта вельмі хутка ператворыцца ў занадта шмат капіяваць, ўставіць, так што замест гэтага мы проста спрасціў яе як такую, што азначае, з гэтага часу ў нас ёсць клас, які можа быць захаваны на кранштэйн 0, у нас ёсць іншы клас, які можа быць захаваны на кранштэйны 1, Але што, калі я лох, а, напрыклад, мой цыкл працягваецца да гэтага часу - Напрыклад, я магу зрабіць гэта менш ці роўна, Нагадаем які быў крыніцай папярэдняга памылка - што фактычна азначае, што на некаторы 3. выпадковае ітэрацыі гэтага цыклу Я выкарыстоўваю кранштэйны 2. Эфектыўна, што можа здарыцца тут? Прабачце? [Студэнт] Гэта збіраецца быць замененыя. >> Гэта збіраецца быць заменены? Што б замяніць? Гэта літаральна кажуць замяніць тое, што знаходзіцца на месцы 2 з вяртае значэнне GetFloat. Але праблема наколькі вялікі масіў на дадзены момант у гэтай гісторыі? [Неразборліва адказ студэнта] >> масіва па-ранейшаму толькі памерам 2 Паколькі масіў, як і любая пераменная, быў абвешчаны першым, перш чым мы выкарыстоўвалі яго, і мы паказана тут з-за гэтай пастаяннай, што ў мяне ёсць 2 гатункі, якія я збіраюся ставіць. Але памятайце, навукоўцы-кампутарнікі пачаць адлік з 0. Такім чынам, першае месца ў гэтым масіве з'яўляецца кранштэйнам 0. Наступны размяшчэнне 1. Гэтая рэч вельмі трохі занадта далёка ў бок. Такім чынам, іншымі словамі, калі я на самай справе быў гэты масіў - і дайце мне паглядзець, наколькі добра гэтая супрацоўнічае тут для нас - калі ў мяне ёсць масіў, які я проста праводзіцца наступным чынам і я вылучыў месца для 2-х элементаў, я мог бы зрабіць гэта, як гэта ў памяці дзе гэты вялікі белы палатно. Гэта проста RAM ў мяне ў кампутары, гігабайт аператыўнай памяці, 2 гігабайтамі аператыўнай памяці, што заўгодна, але гэтыя 2 скрынкі ў цяперашні час уяўляюць сабой індывідуальна з якая плавае кропкай, 32 біт. Так што, калі я пастаўлю 1 нумар тут, як 1,0, то я стаўлю іншы нумар тут, як 3,2 Але тады я кранштэйна 2, як пакласці нешта тут. А так як карціна мяркуе, там нічога няма. Гэта накшталт як нічыйная зямля, таму што я не прасіў аперацыйнай сістэмы , Каб даць мне гэтую трэцюю віктарыны. Калі я хачу, што трэці тэст, я павінен быў прадбачліва звярнуцца да аперацыйнай сістэме для яго, заявіўшы, віктарыны быць не 2 але замест гэтага роўная 3. Такім чынам, іншымі словамі, карціна, якую мы эфектыўна мець пад рукой выглядае вось так вось. Гэта зноў жа нічыйнай зямлі. Нам лепш не спрабаваць запісу значэнняў тут. Але зноў жа, таму, што навукоўцы кампутара лічыць ад 0, Калі мы гаворым аб гэтым месцы ў масіве, які павінен быць размяшчэнне 0, гэта павінна быць нумарам 1, і гэта нават не існуе таму што мы толькі спытаў аперацыйнай сістэмы для 2 такіх месцы. Так што тыя з вас, вопыт праграмавання на іншых мовах можа ведаеце, што гэта не заўсёды так з масівамі або, што называецца вектараў. Хутчэй за ўсё, вы можаце проста дадаваць і дадаваць і дадаваць рэчы масіваў, якія, шчыра кажучы, у нас было, што здольнасць да пашкоджанняў, і ўсё ж мы, здаецца, далі яму тут таму што з C праграмаванні значна больш відавочна. Гэта толькі вы і кампутар прама зараз, і кампутар будзе толькі рабіць што вы кажаце гэта рабіць. Так што калі вы толькі сказаць яму, каб даць вам 2 паплаўка шляхам лініі 22 тут, гэта ўсё, што вы збіраецеся вярнуцца з аперацыйнай сістэмы: месца для 2. Так, усё часцей вашых праграм будзе часам быць памылка ў сувязі з масівамі. Гэта проста свайго роду прырода звера якой усе з нас ўласціва памыляцца, і ў нейкі момант вы, вельмі верагодна, індэкса за межы масіва. І гэта толькі мудрагелісты спосаб сказаць, што вы пайшлі ў кранштэйне нешта і нешта было занадта вялікія ліку. Вы выйшлі за межы масіва. Але верх цяпер гэта. У астатняй частцы гэтай праграмы сапраўды не мае нічога прынцыпова рабіць з масівамі. Гэта ўсяго толькі аб некаторых простых арыфметычных для вылічэнні сярэдніх значэнняў. Такім чынам, мы маем тут, у гэтым цыкл тут упершыню пераменная сума, якую мы пачынаючы з 0. Тады мы ітэрацыі ад 0 да 2 раз і дадаць да гэтага пераменная сумавання га класа, таму кранштэйны 0, то кранштэйны 1. І тое, як вы маглі б зрабіць у пачатковай школе для вылічэння сярэдняга, мы проста бярэм гэтую суму падзяліць на агульная колькасць віктарын, , А затым для добрай мерай мы выклікаем функцыю тут завецца раўнд. Цяпер, як і ў бок, што здзелка з гэтым дужках Int на лініі 34? Можна было б прыдумаць ўжо ў раздзеле, сапраўды не казалі пра гэта афіцыйна тут, але што гэта Int у дужках, верагодна, рабіць? >> [Неразборліва адказ студэнта] Так, гэта ставіцца да ліцця або тыпажоў, што азначае бяруць 1 тыпу дадзеных і пераўтварэнні яго ў іншы. Вы не можаце зрабіць гэта з дапамогай усіх тыпаў дадзеных, таму што часам гэта было б крыху дзіўна. Але ў гэтым выпадку, калі вяртаецца значэнне раунд паплаўком таму што, у рэшце рэшт, я бяру з якая плавае кропкай і дзялення яго на ліку, як 2, Я збіраюся вярнуцца з якая плавае кропкай. Але людзі класе школы не вельмі хацелася ведаць, што іх сярэдняя была 93,4 таму што яны разумеюць, што яны былі вельмі блізкія да, што 95 акруглення кропку. Такім чынам, мы хочам выкарыстоўваць замест Int акругліць усё да бліжэйшага INT, які ў гэтым выпадку будзе не 94 з кропкай пасля яе. Так што проста трохі матэматычнага трука. І мы вернемся да гэтага паняцця ліцця, таму што гэта будзе мець наступствы, Калі вы не знайшлі ўжо для задачы усталяваны 2. Такім чынам, масіў, то вы можаце думаць - ён збіраецца прымусіць мяне ўсміхацца ўвесь дзень. Выглядае гэта так, калі вы малюеце карціну, але галоўнае ў тым, што памер таксама абраны вамі калі вы просіце яго з аперацыйнай сістэмы. Любыя пытанні, то на масівах? Так. [Неразборліва пытанне студэнта] Ах, добры пытанне. Пытанне заключаецца ў тым, што адбываецца з нулявой 0 у масіве? Яна не існуе ў гэтым кантэксце. Гэта існуе толькі ў кантэксце радкі, якія мы збіраемся прыехаць у адзін момант. Але для масіва, як у дадзеным выпадку, усё, што вы атрымаеце тое, што вы просіце аперацыйнай сістэме для. І як у бок, каб гэта незразумела, Я ўвесь час кажу, што вы спытаеце аперацыйнай сістэмы, спытаеце аперацыйнай сістэмы. Аперацыйная сістэма, як вы, напэўна, ведаеце, Mac OS, Windows, Linux. Калі вы выклікаеце функцыі, такія як GetFloat ці вы аб'яўляеце зменныя, такія як класы, У канцы дня вы фактычна прасіць кагосьці яшчэ, каб даць вам, што памяць таму што мы імкнемся як праграмісты паняцця не маю, як на самой справе атрымаць фізічны доступ да памяці. Але хтосьці робіць: аперацыйная сістэма. Так, акрамя дорыць нам з даволі абразкоў і меню і тэчкі і да т.п. , Які вы бачыце на працоўным стале, няхай гэта будзе Mac ці PC, аперацыйнай сістэмы і зрабіць нізкі ўзровень мірскіх рэчаў, асабліва тэхнічных рэчаў кіравання гігабайт або 2 гігабайтамі памяці, якая ў вас ёсць, кіраўнік працэсар, які ў вас ёсць, і так далей. Таму, калі вы пішаце код, Вы сапраўды падлучэння ў вашай аперацыйнай сістэме ў гэтым сэнсе. Я хачу, каб звесці да мінімуму гэта. Добра. Іншыя пытанні аб масівах? Няма? Добра. Такім чынам, пераход ад натуральна масівы на самай справе ў тэме, гэта трохі знаёмыя. І мы выглядалі вельмі коратка на гэты мінулы раз таксама. Гэта быў прыклад радкі ў сераду. Гэты радок прыкладу была даволі простая праграма, і я сапраўды спрасціў яго на пару ліній для мэт сёння. Усё гэта адбываецца ў радку 19, гэта атрымаць радок ад карыстальніка, захоўвае яго ў зменнай с. Затым у радку 22 наперад гэта відавочна друку, што радок 1 знак у радку. Але як ён гэта робіць? Мы аб'яўленні зменнай я, усталяваўшы яго роўным 0, і гэта становіцца старой звычцы цяпер. Мы не бачылі гэтага да асяроддзя, але вы можаце збольшага выводзяць з яго назвы StrLen проста вяртае тое, што пры увядзенні з? Даўжыня радка. Так што, калі я перадаць яго радка, цытую канец цытаты DAVID, гэта, мы спадзяемся, збіраецца вярнуцца да мяне лік 5, паколькі Давіда. Так вось яго мэта ў жыцці, каб прымаць радок, няхай гэта будзе жорстка вамі ці ў дадзеным выпадку падлучаны ў якасці зменнай, у якасці аргументу, і ён высвятляе, што даўжыня гэтага радка. Дык вось зараз мы запазычаючы некаторыя абазначэння з папярэдняга прыкладу віктарыны. Гэта не мае нічога агульнага з паплаўком, не мае нічога агульнага з віктарыны, але аказваецца, што маленькая хлусня ў выратаванне, мы казалі вам, так як тыдзень 1 з'яўляецца тое, што радок сапраўды не існуе ў C. Радком у рэшце рэшт на самай справе проста масіў. Гэта масіў байт, так што байт, байт, байт, байт, які нагадаем, знаходзіцца ўсяго ў 8 біт, так што кавалак памяці, блок памяці, блок памяці, блок памяці. І сродкі, з дапамогай якіх ажыццяўляецца радком гэта пакласці першы знак тут, то тут, то тут, то тут, спіна да спіны да спіны ў памяці кампутара. Так што калі вы хацелі выкласці слова, як HELLO, Вы змясцілі б 1 сімвал H, Затым Е, то L, то L, то O - 5 знакаў, у агульнай складанасці - дзесьці ў аператыўнай памяці кампутара. Але ключавой дэталлю з'яўляецца тое, што яны збіраюцца стаць спіной да спіны, каб спіна да спіны, побач адзін з адным. Калі, калі я кажу з [я], што ў ангельскай мове гэта дае мне? Што з [я] прадстаўляюць у гэтым выпадку? Так. [Студэнт]-га знака ў радку. >> Менавіта так. Га знака ў радку. Зараз, я маю намер пачаць у 0, на мой цыкл тут, але гэта добра, таму што ўсё пачынаецца адлік з 0. Такім чынам, з [0] будзе прадстаўляць літару H ў слова, як HELLO, з [1] будзе прадстаўляць ліст, як Е ў слове, як HELLO, і гэтак далей. І тое, што мы, здаецца, робяць на кожнай ітэрацыі гэтага цыклу Часова захоўванні й сімвал ў зменнай с, якая з'яўляецца проста сімвал, а потым мы раздрукоўкі з так што ў канцы дня, што гэтая праграма робіць наступнае. Калі я іду ў зыходны каталог, і я раблю string1, і я іду наперад і запусціць string1, а потым увядзіце слова, як HELLO, увядзіце, усё гэта робіць друк 1 сімвал за адзін раз. Так што ёсць магчымасць для ўдакладнення тут. Я накшталт робяць больш працы, нават калі гэта больш ясным, можа быць, такім чынам, чым гэта неабходна. Якія радкі кода тут я магу, верагодна, выкінулі наогул? Так. Лінія 24. У радку 24 Я аб'яўленні зменнай с. Я захоўванні га характару з у гэта, але тады я выкарыстоўваю C тут. Так што я выкарыстоўваю C, так што я адчуваю, што я не магу проста выкінуць лініі 24 ад гатэля. [Неразборліва каментар студэнт] >> Менавіта так. Так што, калі справа даходзіць да размоў аб распрацоўцы праграм, заўважыць гэтага невялікага спрашчэння кода, які гэтак жа, як для чытання, але разумею, што з гэта проста зменная, тып дадзеных з'яўляецца масіў, так з [я] проста будзе імгненна вернецца да вас-й знак у гэтай радку. І калі вы хочаце, каб раздрукаваць яго, што ўсё ў парадку. Вы проста павінны выкарыстоўваць% З, таму што вы не друкуе радкі, вы друкуеце знак у радку, і гэта таксама мае эфект друку й характар. І ўспомніць толькі розніцай, сапраўды з мінулага тыдня з выкарыстаннем Printf з'яўляецца тое, што ў той час як на працягу некалькіх тыдняў раней мы маглі б зрабіць нешта супер проста як запаўняльнік% S затым імя радкі тут, Цяпер мы апускання ў трохі глыбей пад капотам і кажа: не друкаваць радок; друк аднаго знака ў ім. Такім чынам, мы можам зрабіць нешта крыху па-іншаму тут, таму што ёсць яшчэ 1 - не памылка таму што гэтая праграма з'яўляецца правільным, але я раблю нешта дурное што я коратка згадаў ў сераду. Але успамінаючы, як бы дызайн гэтай праграмы будуць палепшаныя яшчэ больш? Так. [Неразборліва адказ студэнта] >> О, добра. Так нагадаем, што мы ўвялі 2. зменнай п ў мінулы раз, які, здаецца, супярэчыць самім сабе, таму што мая мэта секунду назад быў проста выкінуць зменнай як непатрэбныя, але нагадаем, што ў сераду мы на самай справе гэта зрабіў. Я змяніў цыкл на самай справе ёсць коска тут, то п = StrLen, , А затым тут я зрабіў я <п, то я зрабіў крок. У чым прынцыповае ўзмацненне, што я дасягнення шляхам змены майго ініцыялізацыі для гэтага і мая ўмова для гэтага цяпер? >> [Неразборліва адказ студэнта] >> Менавіта так. Я не спасылаючыся StrLen зноў і зноў і зноў, таму што памятаю, як за цыкл работ. Нават калі яны пачынаюць атрымліваць больш складаныя з выгляду, Нагадаем, што рэч да першай коскі ініцыялізацыі, які адбываецца адзін раз. Умовай, аднак, у сярэдзіне, і гэта становіцца праверылі кожны раз, калі вы ідзяце праз пятлю. Так гэта накшталт дурное задаваць кампутара і тое ж пытанне зноў і зноў - Які даўжыні Ала? Які даўжыні Ала? Які даўжыні Ала? - таму што, як мы бачым сёння і ў сераду, гэта, безумоўна, зойме час, і гэта не вельмі добра выкарыстоўваць час, таму што, каб высветліць даўжыню радка на самай справе займае трохі намаганняў. Гэта не імгненнае, як гэта адбываецца ў некаторых мовах. Такім чынам, змяняючы гэтую п, цана, якую я плачу гэта што? Мы бачым, што кампраміс тут. Я магу зэканоміць час, не задаваць той жа пракляты пытанне зноў і зноў, але гэта будзе каштаваць мне нешта, што ёсць што? [Студэнт] Вы губляеце пэўны аб'ём памяці. >> Менавіта так. Гэта будзе каштаваць мне крыху памяці. Такім чынам, у дадзеным выпадку гэта будзе каштаваць мне што? Яшчэ 32 біта, таму што п толькі цэлы лік, як вынікае са слоў Int тут. Але ці так гэта добра? Шчыра кажучы, гэта, напэўна, добра, таму што, калі вы думаеце пра гэта, больш радкоў, тым больш часу я збіраюся марнаваць марна таму што StrLen будзе выклікацца зноў і зноў і зноў для кожнай ітэрацыі цыклу. І ў гэтыя дні, мой Mac з 2 гігабайтамі аператыўнай памяці, у гэтыя дні 4 гігабайтамі аператыўнай памяці часам. Я думаю, што я магу сабе дазволіць 4 з гэтых байт на самай справе паскорыць працэс. Але гэта будзе кампраміс і тэма сапраўды ў праграмаванні і камп'ютэрных навук з ніколі не атрымліваючы нічога бясплатна. Калі вы жадаеце нешта палепшыць тут, вам прыйдзецца плаціць за яго ў другой руцэ-то. Касмічны ад часу ў гэтым выпадку. Так што гэта ўсе вядучыя да чаму-то загадкава, як гэта, , Які, як вы, напэўна, зразумелі, у цяперашні час, на самай справе кажа? [Неразборліва адказ студэнта] >> Так, так што гэта, пераканайцеся, што піць Ovaltine, фактычна выкарыстоўваючы алгарытм, званы ROT13, ROT 1-3, які проста азначае, круцяцца ўсе лісты 13 месцаў, што азначае прыняць, а затым дадаць 13 да ёй і ісці кропка, кропка, кропка аж да 13. лісты ад гатэля, зрабіце тое ж самае для B і C і D і гэтак далей. І таму, калі мы на самай справе пераўтварыць гэта тут, выкарыстоўваючы зрух на 13 месцаў, мы вернемся да таго, што мала Ральф быў той, які, пераканайцеся, што піць Ovaltine. Але зараз праблема ўсталяваць 2, у стандартным выданні па крайняй меры, Вы павінны рабіць выгляд гэтай шыфравання сябе, і мы павінны нейкім чынам браць пад ўваходным як гэта і зашыфраваць або расшыфраваць яго. Так якая з гэтых асновах роду прыводзіць нас да такой магчымасці? Давайце зірнем на гэты трэці прыклад. Перш за ўсё, гэта называецца ASCII. Што ASCII звярнуцца да? Амерыканскі стандартны код для абмену інфармацыяй, , Які з'яўляецца сапраўды доўгі шлях кажу, што? Што такое ASCII? [Неразборліва адказ студэнта] >> Што гэта такое? >> [Студэнт] знакаў. >> Знакаў. Ён проста адлюстроўвае нумары з літарамі, таму што свет мае стандартызаваны якія нумары будуць прадстаўляць, якія літары так, што кожны з нас можа выкарыстоўваць кампутары і ўсе нашы праграмы толькі сумяшчальныя, калі гаворка заходзіць аб друку з рэчаў на экране. Так Нагадаем, што 65 адбываецца прадстаўляць, 97, здараецца, уяўляюць сабой ніжні рэгістр. І вось гэтая простая праграма тут ASCII карыстаецца той факт, - аб тым, што свет ведае, што капітал складае 65 - і гэта толькі друк карт. Таму, перш чым мы паглыбімся ў гэты код, дазвольце мне замест гэтага адкрыць акно тэрмінала. Дазвольце мне пайсці далей і зрабіць ASCII, а затым давайце проста запусціць гэтую рэч проста сапсаваць выходныя. І гэта як раз робіць гэта: сапраўды вялікая дыяграма, якая проста кажа мне ўсё розныя коды для ўсіх розных літар. Такім чынам, супер проста праграма, але ў мяне не было на цвёрдым кода гэтых 52 відаў прадукцыі: 26 вялікіх, 26 маленькіх літар. Замест гэтага, я зрабіў гэта праграмна з парай завес. Звярніце ўвагу на тое, што я зрабіў тут. Я ад паўторнага Я складае 65 на да 65 + 26, таму што я хацеў, каб раздрукаваць 26 літар у англійскай алфавіце, я + + на кожнай ітэрацыі, і цяпер заўважаю гэта зноў. Гэта паўтор нашага сябра тыпажоў , У якім вы пераўтварыць 1 тыпу дадзеных у іншы таму што я хачу рабіць у дадзенай праграме? Я хачу, каб падлічыць колькасна таму што менавіта так я вырас падліку - 65, 66, 67, і гэтак далей - Але я не хачу, каб надрукаваць толькі лічбы. Я хачу, каб раздрукаваць ліст, варта нумар. Я хачу надрукаваць: колькасць, B: нумар, але я магу зрабіць гэта з сапраўды такой жа зменнай. Так што я раздрукаваць% у якасці запаўняльніка для характару, % D у якасці запаўняльніка для лічбы ці ліку. Тады што ж я падлучыць на працягу тых 2 запаўняльнікі? Я спачатку падлучыць характар ​​эквіваленце я, а потым я раздрукаваць я сам. Так што заўважыць гэта занадта проста працуе. Гэтак жа, як я магу кінуць ад плавае кропкай у цэлы лік для таго, каб перайсці ад рэчавага ліку ў цэлы лік, Тут я магу пайсці ад Int на знак, які з'яўляецца трохі дзіўным - не зусім адлюстраванне на рэальны свет, - але ў кампутарах сімвал проста нумар, пад капотам, таму мы быць вельмі відавочнымі тут, каб кампутар, кажучы Printf, раздрукаваць не я як 65, раздрукаваць яго, як яе лікавы эквівалент. І аказваецца, што я тэхнічна не трэба нават гэтага. Тое, што я рабіў хвіліну назад відавочна ліцця , Паказаўшы, што тып дадзеных я хачу пайсці ад і да. Але заўважыў, што ў мяне ўжо ёсць гэтая з запаўняльнікам% і гэта іншае% з запаўняльнікам тут. Нават калі гэта не з'яўляецца цэлым лікам, кампутар разумее, што знак, гэта проста Int пад капотам. Так што, калі я на самай справе перакампіляваць і перазапусціць праграму ASCII, заўважыў ён па-ранейшаму працуе толькі таму, што кампутар разумее, што гэтая перапіска. Дык вось, гэта больш важна зрабіць відавочнае прывядзенне ў свеце ўсплывае на цэлых таму што вы на самой справе робіць разлічана рашэнне: выкінуць ўсё пасля коскі. Вось там сапраўды нічога выкінуць, таму што характар ​​гэта проста лік, і радок гэта проста масіў знакаў. Так што, калі справа даходзіць да рэалізацыі некаторых шыфравання або дэшыфраванні, як атрымліваецца, што мы сапраўды можам перавесці нешта накшталт гэтага нонсэнс, Будзьце ўпэўненыя, каб піць Ovaltine? Што рабіць, калі мы ведаем цяпер - давайце, як здагадка - пра тое, што ключ, нумар, які мы верціцца ўсе гэтыя лісты, з'яўляецца лік 13? Такім чынам, мы адправіліся з ліста B аж да высновы ў пачатку прапановы, Будзьце ўпэўненыя, каб піць Ovaltine, таму што калі я гэта зраблю B а потым я іду C, D, E, F, G, H, I, J, K, L, M, N, O, Вось чаму шыфравання лісты B становіцца O таму што я проста дададзена 13 да яго. Так што, калі я хачу, каб расшыфраваць гэта, я па сутнасці павінны прыняць O, а затым адняць 13 з яе. Ці, калі шчыра, таму што ёсць 26 літар у алфавіце, гэта цудоўна сіметрычны, мы таксама можам проста дадаць 13 і мы вернемся да ліста B. Але як вы ісці аб рэалізацыі нешта накшталт гэтага ў Caesar ці сапраўды маніпулявання радкамі ў цэлым? Калі літара B з'яўляецца тое, што колькасць? Якая літара B? Так што гэта 66, ці не так? Такім чынам, калі ліст складае 65 і літара B складае 66, так 66, усё, што трэба зрабіць, гэта дадаць 13 да ёй, і гэта дае мне 79. І калі мы ідзем у нашу маленькую шпаргалку, 79 сапраўды адлюстроўвае на О. Але ёсць трохі кута ў дадзеным выпадку. Што такое, скажам, літара Z? Калі мы будзем рабіць 66 + 25 прайсці ўвесь шлях да канца алфавіту, мы на 91. 91 + 13 дае мне 104, і адгадайце што? 104 не роўныя загалоўнай літары. Давайце вернемся да маленькай шпаргалку тут. Калі я паўторна гэтую праграму ў прыбор, звярніце ўвагу, што 104, калі я вярнуся ў акно тэрмінала, 104, па-відаць маленькай гадзіну. Так што нам трэба некаторыя ключавыя Хітрасць тут у тым, каб пераканацца, што, калі мы пачынаем на Z і мы дадамо 13 да гэтага мы не хочам, каб проста трымаць прасоўваюцца наперад, каб усё больш і больш лікаў. Што мы сапраўды хочам зрабіць? Вы хочаце, каб абгарнуць вакол. Вось і атрымліваецца, як вы бачылі, верагодна, у раздзеле ў цяперашні час або ў спецыфікацыі праблемай само мноства зразумеў, што гэта іншы аператар у C, што таксама з'яўляецца знакам адсотка, але ў той час мы выкарыстоўвалі%, каб паказаць запаўняльніка, Вядома, што, асабліва для задач 2, ёсць таксама нешта накшталт гэтага: Int х = у Z%. Дазвольце мне прадставіць гэта як вельмі агульнай форме пра гэта. Працэнт азначае, што ў мове праграмавання? >> [Студэнт] Modulo. Модулю, які з'яўляецца мудрагелісты спосаб сказаць астатку. Хоць ёсць невялікае адрозненне з вызначэннем там, гэта азначае, падзеліце у на г, але не вяртаюць вынік, што падзел; Замест гэтага, вярнуць рэшта. Так што, калі ёсць на самой справе 3 і Z на самай справе 2, 3, падзеленае на 2 у 1 з астаткам 1, так што ж на самай справе х роўныя ў гэтым выпадку? 1. Гэта такая простая, нізкім узроўнем ідэя. Гэта зойме трохі часу, каб ваш розум абгорнутыя вакол яго таму што гэта, верагодна, быў час, так вы нават прыйшлося клапаціцца аб рэшткі і фактычна выкарыстоўваць іх для чагосьці мэтанакіраваны, але ў гэтым выпадку просты факт, што вы можаце перайсці ад вялікай колькасці, як 3 для адносна невялікай колькасці, як 2, а затым абгарнуць вакол эфектыўна з дапамогай астатак на меншае значэнне, як 1 будзе неацэнным трук , Які можна выкарыстоўваць як для нешта накшталт Цэзара і гэтая іншая рэч Vigenere У задачу ўсталяваць 2, але гэта будзе паўтаральным трук на працягу семестра. Гэтая простая, простая ідэя проста ўзяцця астатку ў цэлым збіраецца дазволіць нам абгарнуць вакол. І, як мы пачынаем гуляць больш з масівамі, як мы пачынаем гуляць больш з самой памяці, гэта будзе станавіцца ўсё больш і больш магутнай трук. Такім чынам, любыя пытанні, то на ASCII або прадстаўленне радкі як масівы? І мы будзем лічыць, што на 1 выманне далей. Так. [Неразборліва пытанне студэнта] >> Добры пытанне. Што гэта значыць, калі пераменная мае зорачку перад ім? Дазвольце мне адкласці адказ, што ў любы дэталі, але гэта ставіцца да тэмы вядомы як паказальнік. Паказальнікі павінны зрабіць з памяццю, і мы на самай справе сёння зрабіўшы першы крок да гэтага абмеркавання але цяпер, дазвольце мне прыкідвацца, што зорка не існуе і мы будзем працягваць выкліку радкі радкі замест выкарыстання знакаў *, які вы, напэўна, бачылі раней, і я пакладу на экране за ўсё на імгненне, як тізер. Такім чынам, мы вернемся да гэтага ў шляхі больш падрабязна, чым многія з вас, верагодна, падабаецца. У рэшце рэшт, не сёння. Так. [Неразборліва пытанне студэнта] У якім кантэксце вы павінны даць знак для персанажа? >> [Студэнт] Так. Такім чынам, па змаўчанні, калі вы не ставіце +, толькі станоўчыя ліку, як мяркуецца. Так што, калі проста напісаць нумар 1, гэта пазітыўны 1. Калі вы сапраўды хочаце, каб паказаць адмаўленнем значэння, Вы літаральна павінны зрабіць -1 на клавіятуры. Але гэта, верагодна, не ваша пытанне. >> [Неразборліва адказ студэнта] Добры пытанне. Добра. Такім чынам, гэта павінен рабіць, як я разумею, з нейкай памылкай вы сутыкнуліся з таму што вы пераўтварэння цэлага ліку ў характары, але так ці інакш быў уцягнуты адмоўна, і так характары толькі што выйшлі распазнаўшы-то. Так, цяпер, дазвольце мне спрашчаць трохі, пакуль мы не вернемся да такой тэме. На дадзены момант, думаю, такое становішча рэчаў - і гэта спрашчэнне. Але ў свеце лік, у вас ёсць, колькі біт у вашым распараджэнні? У вас ёсць 32 біт. І да гэтага часу мы казалі аб агульнай колькасці цэлых лікаў можна, такім чынам, уяўляюць складае прыкладна 4 млрд. у агульным, таму што ў вас ёсць 32 біт, так што гэта ад 2 да 32, так што гэта прыкладна 4 мільярды даляраў. Але мы бачылі, тыдзень ці 2 назад, што вы сапраўды не маюць дыяпазоне лікаў ад 0 пра да 4 мільярдаў долараў. Дыяпазон замест гэтага ідзе прыкладна з адмоўнымі 2 млрд. станоўчых 2 мільярды даляраў. Але напрошваецца пытанне, як вы ўяўляеце паняцце адмоўнае 2000000000 не кажучы ўжо пра адмоўную 1? На дадзены момант, мы можам спрасціць і проста сказаць, што мы збіраемся выкарыстоўваць левы біт з гэтых 32 біт, і калі гэта 1 гэтае адмоўнае лік, і калі ён роўны 0, гэта станоўчае лік. Праблема з гэтым спрошчанае ўяўленне адмоўных лікаў з'яўляецца тое, што калі вы свядома хітруе і спрабуе канвертаваць з характару да шэрагу ці, наадварот, не існуе такой рэчы, як адмоўны персанаж. У свеце ASCII, якія выкарыстоўваюцца толькі 8 біт, усе 8 з гэтых пытання біт, і левы біт не мае нічога агульнага з негатывам. І гэтак жа, каб быць ясным, калі я кажу, левы біт, Нагадаем, што калі мы рабілі наш біт адпаведныя прыклады ў першыя тыдні Нагадаю, што мы зрабілі нешта накшталт 1001101, нешта накшталт гэтага. Калі я кажу, левы біт, я проста літаральна азначае 1, што вы пішаце ўсю дарогу злева. Такім чынам, у свеце знакаў не існуе паняцця негатыву, так што левы біт на самай справе мае нешта рабіць з ASCII, нічога агульнага з негатывам. Так гэта гучыць як - і з кантэксту цяжка адказаць дакладна - але так ці інакш, ваш код у зман, што левы біт прадстаўляюць адмоўныя значэння калі гэта сапраўды была частка характару ў пытанне. І зноў жа, я спрашчэннем, таму што кампутары сапраўды зрабіць нешта крыху аматар чым проста змяненне, што левы біт у 1 для адмоўнага знака па параўнанні з 0. Яны замест гэтага, калі вам цікава Google, выкарыстоўваць нешта звычайна называецца дадаткам 2 у, , Які з'яўляецца трохі больш складанай падыходу але ідэя ў канчатковым выніку тое ж самае. Карацей кажучы, гэта было звязана з тым, што вы былі масажу лік у знак ці наадварот, але ваш код не ўсведамляе той факт, , Што 1 з гэтых бітаў меў значэнне ў лічбавай свет. Гэта не справа ў характары свету. Але гэта гучыць, як вы фіксаваны, і ў гэтым выпадку спрэчны цяпер. Іншыя пытанні. Добра. Такім чынам, да гэтага часу, усе праграмы, якія мы напісалі ўзялі ўваход, можа быць, ад карыстальнікаў ў выглядзе функцый, такіх як GetInt, GetString, або калі вы чыталі наперад у розных кнігах або ў Інтэрнэце спасылкі, Вы самі маглі б выкарыстоўваць такія функцыі, як SCANF якія, шчыра кажучы, мы выкарыстоўваем у CS50 бібліятэкі. Але праз тыдзень ці 2, мы на самай справе паказаць вам, як бібліятэка CS50 рэалізаваны так што мы можам узяць гэтыя навучальныя колаў ад ў цэлым. Але, аказваецца, ёсць яшчэ адзін спосаб атрымання дадзеных ад карыстальніка. На самай справе, мы самі ўжо выкарыстоўваюць аргументы каманднага радка на працягу некалькіх тыдняў. Кожны раз, калі мы сутыкнуліся Clang або мы сутыкнуліся зрабіць, Мы не толькі набралі ляск, Enter, мы не набралі зрабіць, Enter. Што мы звычайна напісана пасля слова ляск на нашым тэрмінале радку Windows? [Студэнт] імя файла. >> Імя файла, ці не так? Hello.c або mario.c або што адпаведнае імя файла. І ў гэтым сэнсе тое, што вы сапраўды зрабілі, вы паўплывалі на паводзіны Clang таму што, вядома, людзі, якія пісалі Clang паняцця не меў, што мала вам гадоў збіраўся напісаць праграму пад назвай mario.c гадоў праз. Такім чынам, вы павінны былі нейкім чынам уплываць на паводзіны гэтай праграмы, і што праграма Clang павінна была быць напісана такім чынам, што ён можа прымаць ўвод ад вас шляхам дадання слова ў радку да таго, як карыстач націскае Enter. Такім чынам, атрымліваецца, што на працягу некаторага часу мы былі абвясціць амаль усе нашы праграмы для пачатку, як гэта - Int асноўных (несапраўднымі) - і тады мы пайшлі наперад і пачаў пісаць наш код. І мы маглі б мець некаторыя рэзкія ўключае ў верхняй частцы файла, але амаль усе нашы праграмы да гэтага часу пачалі з гэтага нават калі вы, магчыма, бачылі ў раздзеле, у кнігах, Інтэрнэце спасылкі што гэта не на самай справе павінны быць несапраўднымі. Іншы законнай формай для гэтага зрабіць, гэта Int агдс, а затым радкі ARGV []. Так што цяпер, што гэта намякаеш? Аказваецца, што агдс, які з'яўляецца чалавекам канвенцыі - Вы маглі б назваць гэтую Фу, але гэта толькі будзе нашмат менш, ясна чытачоў - агдс проста аргумент функцыі называюцца асноўнымі, якая прадстаўляе што? Што агдс стаяць для тых, хто знаёмы? [Неразборліва адказ студэнта] >> Так, колькасць аргументаў або аргументы рахунку. Гэта так проста. Як шмат аргументаў было перададзена ў гэтую праграму? Што гэта значыць? Калі ў камандным радку я запусціць нешта накшталт гэтага - ляск mario.c-- агдс, калі я ударыў Enter збіраецца ўзяць на значэнне, некалькі цьмяна, 2. Такім чынам, атрымліваецца, што агдс гэта колькасць аргументаў, але па гістарычных прычынах, назва самой праграмы уключаны ў тым, што кольк. Так агдс складае 2, калі я пісала ляск mario.c. Што ARGV ўтрымліваць? Перш за ўсё, ARGV выглядае як струна, але не зусім таму што, як у мінулую сераду, і тым больш сёння, гэтыя квадратныя дужкі азначаюць, што? Гэта масіва. Там няма ліку ў масіве, і гэта павінна мець сэнс інтуітыўна таму што людзі, якія пісалі Clang гадоў назад, вядома, паняцця не меў, колькі слоў людзей, як мы павінны набіраць у радку перад націскам Enter. Таму ў дадзеным выпадку тут яны заявілі функцыі асноўнага як прыняцце масіў аргументаў, 0 або больш аргументаў. Яны не ведаюць загадзя, колькі ёсць, так што наўмысна не лікам ўнутры гэтых квадратных дужках. Але тое, што ў квадратных дужках ёсць кажуць кампутар, чакаць масіва. Argv проста скарочанае пазначэнне для вектара аргументаў. Вектар мудрагелісты спосаб сказаць масіва, і масіў ўяўляе сабой мудрагелісты спосаб сказаць спісу або калекцыі. Так што гэта проста азначае, што калі вы пішаце асноўны, як гэта замест таго, каб, як, як мы рабілі гэта на працягу мінулых некалькіх тыдняў, Ваша праграма цяпер мае права прымаць аргументы каманднага радка так што Вам больш не трэба пісаць Марыё, а затым націсніце Enter, Затым увядзіце нумар, на колькі блокаў вы хочаце высокую піраміду быць, затым націсніце Enter яшчэ раз. Мы нават не трэба выкарыстоўваць GetString больш або GetInt або GetFloat па гэтым пытанні. Мы можам толькі чакаць, што карыстач можа ўвесці гэтыя словы ў адказ на запыт самой гэтак жа, як аўтары Clang вырашыў, што будзе сапраўды раздражняе праграмы калі скампіляваць код першай тыпізаваных звон, ударыў Enter, Затым мы сказалі карыстальнік, калі ласка, увядзіце імя файла, які вы хочаце сабраць, Затым мы ўводзім у mario.c і націсніце Enter. Але гэта менавіта тое, што мы робім для нашых карыстальнікаў за апошнія некалькі тыдняў. Мы выкарыстоўваем GetString і чакаем, пакуль праграма працуе, каб падштурхнуць іх ўводу. Гэта не павінна быць так. Такім чынам, у гэтым прыкладзе, у нас зараз ёсць радкі ARGV, і гэта таксама спрашчэнне, падрыхтоўкі колаў, што вельмі хутка адарвацца. Гэта больш правільны спосаб напісання гэтай альтэрнатыўнай дэкларацыі асноўных таму што аказваецца, што тое, што мы ўвесь час выклікае радкі на самай справе мае зорку, Зорачка, у сваю фактычнае азначэнне, але гэта толькі здаецца складаным, гэта заблытаным на першы, так што мы па спрашчэнні проста стварае сінонім роду У CS50 бібліятэку, якая адлюстроўвае знак * да гэтага больш зручным словам радка. Так што давайце на самой справе спрабуюць гэта потым. Дазвольце мне ісці наперад і адкрываць Gedit тут. Дазвольце мне ісці наперад і адкрыць ARGV 1. Гэтая праграма па-відаць друкуе аргументы, але на англійскай мове тэрмінаў, гледзячы на ​​гэты код, што гэта зрабіць канкрэтна? Калі я набярыце ў камандным a.out Foo Bar, тое, што надрукавана ў маёй чорнай і белай вокны? A.out Foo Bar, Enter. Ідзем далей. Так. >> [Неразборліва адказ студэнта] Добра. Так a.out, новая лінія, Фу, новая лінія, бар, новая радок. Чаму гэта адбываецца? Мы, безумоўна, можа пацвердзіць толькі на імгненне. Гэта свайго роду пухнатыя радкі кода.  Гэта проста друкуе новую радок проста зрабіць усё прыгажэй на экране. Гэта пятля, што гэта перабор з 0 на да агдс, і гэта прырашчэнне на кожнай ітэрацыі + +. Так што гэта цяпер кажуць, надрукаваць радок, як вынікае з гэтай% с. ARGV [я] у значнай ступені тую ж самую ідэю з папярэдняга прыкладу. Мы прывыклі называць зменную с, цяпер гэта называецца, адвольна, argv. Гэта азначае, раздрукаваць й аргумент, які быў уведзены ў камандным радку, і пасля гэтага ўсё гэта будзе зроблена, проста для добрай мерай раздрукаваць яшчэ адну новую лінію. Такім чынам, давайце паглядзім гэта. Дазвольце мне адкрыць акно тэрмінала. Дазвольце мне скампіляваць ARGV 1, а цяпер дазвольце мне выканаць ARGV 1, Enter. Хм. Добра. Давайце запусцім Foo Bar. Цікава. Баз. І калі вы калі-небудзь задумваліся, чаму я друкую гэта, гэта як раз і дурныя канвенцыі па інфарматыцы. Свет часта мае патрэбу толькі славесныя запаўняльнікі для слоў. Так што, калі вы хочаце пагаварыць аб некаторых агульных радкоў, кампутарныя навукоўцы ўсяго схільныя казаць Foo калі яны маюць патрэбу ў выпадковым слове, Затым яны кажуць, бар, калі яны маюць патрэбу 2. выпадковае слова, Затым яны кажуць, Баз, калі яны маюць патрэбу трэцяе слова, то яны кажуць qux, калі яны маюць патрэбу чацвёртае слова, і тады ёсць вялікі рэлігійны онлайн дэбаты адносна таго, што будзе пасля qux, так што вы можаце Google, што высветліць, што іншыя адвольнае слова павінна быць. Але гэтыя не маюць ніякага значэння, хоць Foo Bar, калі вы, што Google, што мае сэнс, , Якая з'яўляецца часткай этымалогіі тут. Так што ўсё гэта робяць, то друкуе 1 з гэтых радкоў у кожнай радку. Так што, калі я замест гэтага, аднак, хацеў атрымаць крыху аматар, Выкажам здагадку, што я не хацеў друкаваць кожную радок у радку; Я хацеў друкаваць кожны знак з кожнай радкі ў кожнай радку. Як я мог замест гэтага? Што трэба змяніць у гэтай праграме, калі я хачу надрукаваць не кожнае слова але я хачу, каб надрукаваць кожнае слова, літара за літарай на пісьме, то ў наступным лісце слова па літарах? Як нам сумясціць гэтыя ідэі да гэтага часу? Так. [Студэнт]% с. >> Усё правільна. Такім чынам, мы дзесьці трэба% с. Добра, таму што я не хачу, каб надрукаваць усе радкі, я хачу надрукаваць сімвалы. Што яшчэ? [Неразборліва адказ студэнта] >> Цікава. Так што нам трэба роду 2. вымярэнні тут і цяпер таму што думаюць пра ARGV як масіў, але гэта масіў радкоў. Але на, быццам бы, 15 хвілін назад, што радкі? Гэта масіў знакаў. Такім чынам, сапраўды, ARGV ўяўляе сабой масіў масіў сімвалаў, Масіў масіваў знакаў. Вось і атрымліваецца, што мы можам выкарыстоўваць толькі больш квадратных дужках наймення. Так давайце зробім гэта. У верхняй часткі гэтага цыкла ў радку 19, я збіраюся паўтараць ад Я да агдс, але потым я збіраюся зрабіць гэта: для - я не магу выкарыстоўваць я цяпер. Мне патрэбна яшчэ адна пераменная, таму што я хачу для перабору слоў а затым і больш літар у словах так што я накшталт як вертыкальнай восі і гарызантальнай восі, як бы канцэптуальна. Так Int J атрымлівае 0, то я хачу зрабіць J тых часоў, як J менш - і я Прыбярыце гэта ў няшмат. Як перабору літар у радку? Мы зрабілі гэтую хвіліну таму. STRLEN з ARGV [I]. Добра. І зноў жа, я раблю трохі неэфектыўнасці тут, не ствараючы п або любы іншы, але мы вернемся да гэтага. Так што цяпер J + +. Цяпер я павінен водступ тут. Што мне цяпер хочуць друкаваць на кожнай ітэрацыі? [Неразборліва адказ студэнта] >> Так што [я] дасць мне слова. [I] [J], накшталт як матрыца. Тыя з вас з матэматыкай у-фонаў, Мы быццам індэксацыі яшчэ глыбей у гэтую матрыцу ці гэта масіў масіваў, Гэты 2-мерных структуру. Такім чынам, цяпер давайце паглядзім, што адбываецца тут. Дазвольце мне адкрыць мае вялікія вокны тэрмінала. Дазвольце мне паўторна зрабіць з ARGV 1. І я аблажаўся тут, што з'яўляецца добрым урокам, таму што я таксама забыўся гэта зрабіць. Невідавочнае аб'яву "StrLen 'C бібліятэчныя функцыі без знака тыпу' - Я нават не ведаю, што астатнім гэта значыць, але я бачыў гэта раней, няяўна аб'яве. Кожны раз, калі мы бачым гэтую памылку, што гэта звычайна значыць? [Неразборліва адказ студэнта] >> Я забыў бібліятэка наверсе. Але пачакайце хвіліну. Звычайна я аблажаўся, таму што я забыўся CS50 бібліятэкі, але гэта там. Звычайна я аблажаўся, таму што я забыўся стандартныя I / O. І, шчыра кажучы, я нават не трэба гэта. Мы не выкарыстоўваем GetString сёння. Так што мне не хапае? Там іншая бібліятэка, якая цяпер мы павінны выкарыстоўваць часам называюць string.h, і гэта толькі яшчэ адна бібліятэка, якая мае больш функцый, якіх няма ў стандартным I / O. Так што давайце вернемся да майго вялікага акна тэрмінала. Добра. Цяпер, чорт вазьмі, я думаю, я быў няправы. Я выкарыстоўваю CS50 бібліятэкі. Такім чынам, мы можам выправіць гэта ў любым з 2 спосабаў. Мы можам узяць на сябе падрыхтоўку колаў ад прама зараз, і проста рабіць гэта, або від давайце трымацца ад усяго, што спрашчэнне зараз, устаўце гэты назад, вырашыць гэтую праблему, і цяпер вярнуцца ў акне тэрмінала. Такім чынам, каб было зразумела, у бібліятэцы CS50 не толькі функцыі, гэта таксама ключавое слова радок, якая з'яўляецца, чаму гэтая памылка толькі што адбылося. Такім чынам, тут мы ідзем. Я усталяваў абодва з бібліятэкі пытанняў. Enter. Добра. Argv 1, Foo Bar, Enter. Выдатна. Так што цяпер у нас ёсць кожная літара кожнага слова друкаваных 1 на лінію, якія не робяць для вельмі цікавую праграму, але зьвярніце ўвагу, зараз у нас ёсць магчымасць не толькі ітэрацыі па словах але і за асобныя літары ў словы, якое гучыць жудасна знаёма нават самых простых прыкладанняў, такіх як скремблирования літары ў радок, як гэта. Давайце ісці наперад і прымаць наш 5-хвілінны перапынак тут. І калі мы вернемся, мы пачнем гаварыць аб эфектыўнасці з якой мы можам рабіць усе гэтыя рэчы лепш. Добра. Мы вярнуліся. Дзякуючы аднаму з нашых ТФ, які гуляе шмат bananagrams, Мы на самай справе ёсць цэлая куча знакаў з намі тут сёння фізічнае ўвасабленне гэтых маленькіх пластмасавых частак, і дазвольце мне прапанаваць, што гэта пустая белая шыфер тут прадстаўляе сабой RAM ў маім кампутары - наўтбукаў, настольных, што заўгодна, - і там выглядае, як шмат ён таму што, калі мы пачнем секчы гэтую аператыўнай памяці ў невялікі памер байта штук, Давайце адвольна сказаць, што тое, што памер і размыта, што ўяўляе сабой - там мы ідзем, і давайце маштаб трохі тут - Давайце казаць тое, што памер ўяўляе сабой адзін байт. Такім чынам, мы сапраўды можам падыходзіць цэлую кучу байтаў ці знакаў ўнутры гэтай памяці, як гэта было прапанавана адносны памер тут. Так Выкажам здагадку зараз, што мэта складаецца ў выдзяленні памяці для радка. Як гэта на самай справе працуе? У праграмах мы пісалі, мы звычайна выкарыстоўваем GetString, але цяпер, відавочна, ёсць гэта іншы канал, праз які мы можам атрымаць карыстацкі ўвод у ARGV з дапамогай аргументаў каманднага радка. Але тое, што адбываецца на самай справе пад капотам? Аказваецца, калі мы называем - давайце Калі ласка, вярніцеся да GetString - функцыя GetString У бібліятэцы CS50, карыстачу будзе прапанавана ўвесці радок, Карыстальнік ўводзіць у некаторы слова - давайце назавем гэта HELLO. І мы казалі на працягу апошніх некалькіх тыдняў, што вяртае значэнне GetString на самай справе з'яўляецца радком, як і слова HELLO. Але тое, што GetString самай справе? Як карыстальнік ўводзіць у HELLO, Enter, GetString з'яўляецца высвятленне таго, Добра, колькі знакаў гэта? Гэта Н-Е-Л-Л-О. Такім чынам, неабходна вылучыць, ён павінен спытаць аперацыйнай сістэмы - Linux у дадзеным выпадку - па крайняй меры, 5 байт для захоўвання HELLO. І тое, што ён затым пераходзіць зрабіць, як толькі яна вернецца гэтыя 5 байт з аперацыйнай сістэмы гэта выкласці ПРЫВІТАННЕ спіной да спіны, каб спіна да спіны. І таму тое, што сапраўды вярнуўся з GetString з'яўляецца блок дадзеных, які выглядае наступным. Але гэта крыху недакладнымі, паколькі аказваецца, што гэта не так проста, як толькі захоўванне PRIVET у памяці кампутара таму выкажам здагадку, што мая праграма, што я пішу ў C выклікае GetString зноў, і наступнае слова карыстальнік ўводзіць у гэта Bye, Bye. Ну, мне трэба, каб адпавядаць гэтым словам BYE дзесьці ў памяці. Я не магу калашмаціць HELLO. Я, напрыклад, не хочаце, каб кампутар проста пачаць перазапіс, як гэта зыходнае слова, таму што я ўсё яшчэ могуць выкарыстоўваць слова PRIVET у зменную дзесьці ў іншым месцы ў маёй праграме. Такім чынам, B-Y-E мае ў канчатковым выніку дзесьці ў іншым месцы ў памяці. Але канвенцыя правіла, з'яўляецца тое, што наступная радок, якую вы вылучыць магчыма, але не заўсёды, будзе ў канчатковым выніку на наступны даступны вочка памяці. І калі б я не спытаў аперацыйнай сістэмы для любой памяці так як я ў апошні раз называлі GetString, хутчэй за ўсё, слова BYE будзе ў канчатковым выніку адразу пасля слова PRIVET у памяці. Але ў гэты момант вы, магчыма, можа ўбачыць, дзе патэнцыйная праблема ўзнікае. Таму што наступны участкаў памяці, наступны байт, якія былі проста бясплатна - чыстага белага ліста - у памяці кампутара былі побач з HELLO, ён адчувае, як першы радок я папрасіла можа раптам змяніцца зараз таму што я істотна змяніў яго на HELLOBYE замест таго, каб неяк demarcing пачатку BYE і ў канцы HELLO. Вось і атрымліваецца, што тое, што адбываецца на самай справе пад капотам, якія вы, магчыма, убачыў у Інтэрнэце спасылкі ці распранула ці кнігі ці ўвогуле не проста яшчэ тое, што ёсць на самой справе з'яўляецца наўмысным дэмаркацыі паміж словамі ў памяці кампутара. І на самай справе, у дадзеным выпадку тут, а не проста паставіць BYE побач з HELLO, замест гэтага, кампутар ставіць асаблівы характар, асаблівы пусты знак, так бы мовіць, якая прадстаўлена з дапамогай маркера з касымі 0. Так Карацей кажучы, нагадаем, што знакі прадстаўлены ў ASCII. ASCII з'яўляецца толькі адпаведнасць паміж лічбамі і літарамі, і большасць з гэтых літар пачынаюцца прыкладна 65 на капітал, але, аказваецца, можна, вядома, уяўляюць сабой ліку 0 як цэлае або ў двайковай, і аказваецца, што свет вырашыў даўным-даўно: "Вы ведаеце, што?" "Рэзерв Давайце лік 0, як не ўяўляюць любыя сімвалы на клавіятуры - "Ні лістоў, ні нумароў, ні знакаў прыпынку. 0 з'яўляецца асаблівым". "Гэта будзе спецыяльны пусты знак, і мы збіраемся пісаць як \ 0". Розніца ў тым, калі б мы проста напісалі 0, 0, знак. Нагадаем, што існуюць ASCII коды 0, 1, 2, 3 таму што знак 0 адрозніваецца ад колькасці 0. І вы можаце бачыць, што калі вы азірнецца назад ад тыдня 1, калі мы ўпершыню загаварылі аб ASCII, 0 і 1, 2 і 3 на ўсім шляху да 9 маюць свае ўласныя ASCII кодах. Яны не з'яўляюцца, па супадзенні, ад 0 да 9. Яны вельмі розныя. Такім чынам, 0 азначае толькі: «Я асаблівы," і \ 0 азначае, літаральна, "Я не сімвал 0." "Я гэтаму асаблівага значэння, нулявы сімвал." Так што я на самой справе трэба яшчэ адзін з гэтых паколькі я не магу рабіць тую ж памылку двойчы. Такім чынам, пасля слоў BYE мы таксама спатрэбіцца яшчэ адзін з гэтых нулявых знакаў. Дазвольце мне ўзяць маё пяро тут і дазвольце мне хутка зрабіць яшчэ адзін \ 0 так што пасля таго як я спытаў аперацыйнай сістэмы на 2 радкі праз GetString быў яшчэ адзін выклік GetString, гэта тое, што на самой справе ў памяці. Так што, калі я вярнуся радкі, я сапраўды вяртаецца, што, і калі я атрымліваю наступную радок, я сапраўды вяртаецца гэтым. Такім чынам, узнікае пытанне, StrLen, у першую чаргу, тое, што ён павінен вярнуцца? Калі я называю StrLen на радок з і з было слова PRIVET, што карыстач увёў у, Што ж мы, відавочна, сказаць даўжынёй ПРЫВІТАННЕ было некалькі хвілін назад? Гэта было 5, ці не так? Н-Е-Л-Л-О. І гэта сапраўды як StrLen работ. Ён вяртае тое, што звычайнаму чалавеку было б чакаць, што даўжыня радка будзе. Але ў рэчаіснасці, наколькі вялікі масіў сімвалаў, які захоўванні Прывітанне? Гэта на самай справе 6. Так StrLen не згадвае гэты факт для вас. Але пад капотам кампутара, сапраўды, з выкарыстаннем 6 байт для захоўвання ў 5-ці літар, і гэта справядліва незалежна ад таго, як доўга слова. Там заўсёды будзе спецыяльная нулявы завяршальны знак у канцы радка у Demarc яе агульнай даўжыні. Такім чынам, калі вы ў цяперашні час асоба, якая ажыццяўляе StrLen 20, 30 гадоў таму, Як вы ісці аб рэалізацыі StrLen сябе? Мы лічым само сабой якія разумеюцца, што яна існуе, гэтак жа, як мы лічым само сабой якія разумеюцца, што Printf існуе, Але калі ПРЫВІТАННЕ гэтае слова ў пытанні і тое, што ў мяне ў памяці, нешта накшталт гэтага, калі б вам прыйшлося перавызначыць StrLen, таму што вы прасілі ці таму, што, шчыра кажучы, вы не ведаеце, StrLen існавала - Вы павінны былі пайсці гэтым па сваім меркаванні - як вы маглі ажыццяўляць StrLen Пры дадзенай нешта накшталт гэтага? Цяпер мы ведаем, радок ўяўляе сабой масіў, мы можам перабіраць кожны з асобных сімвалаў выкарыстоўваючы нешта накшталт - Давайце паспрабуем зрабіць гэта на лета. Адпусціце мяне ў прыбор. Дазвольце мне стварыць новы файл, strlen.c. Дазвольце мне зараз ісці наперад і не ўключае stdio.h так, што мы маем доступ да Printf. Дазвольце мне зрабіць Int асноўных (несапраўднымі). Ох. Я проста раблю гэта на маім уласным цяпер тое. [Смяецца] Дзякуй. Гэта тое, што я раблю. Добра. Таму, перш чым я павярнуўся на экране, я надрукаваў ўсё гэта. А зараз тое, што я збіраюся зрабіць, заключаецца ў наступным: Е ("Дайце мне радкі:") Вось толькі пухнатыя інструкцыі. Цяпер дазвольце мне рабіць = GetString радок з. Я ўжо трэба ўнесці змены цяпер. Я выкарыстоўваю CS50 бібліятэкі раптоўна, так што дазвольце мне ісці наперад і ўвесці ў cs50.h. А цяпер давайце зробім гэта: Е ("Даўжыня:% D, StrLen [з] - і я яшчэ не скончыў. Што яшчэ я павінен дадаць да гэтай праграме? [Студэнт] string.h. >> String.h. Такім чынам, на дадзены момант, мы выкарыстоўваем StrLen, так давайце пераканаемся, што кампілятар ведае, дзе гэта, так мала санітарнай праверкі. Я атрымліваю радок у радку 8, а ў радку 9 я друкую яго даўжыню з% г. Так што давайце ісці наперад і адкрыць гэта. Мы робяць StrLen - кампілюе нармальна - StrLen - дазвольце мне павялічыць - Enter, Н-Е-Л-Л-О Enter. Даўжыня 5. Такім чынам, StrLen, здаецца, працуе, але свет гэта ведаў. Такім чынам, давайце рэалізацыі StrLen сябе як след. Дазвольце мне скарыстацца гэтай бібліятэцы гатэля. Мы больш не маюць доступу да string.h, таму што я нават не ведаў пра яго існаванне. Але гэта нармальна, таму што я магу рэалізаваць сябе StrLen і ў мяне прымаюць радок называюць уваходам, і цяпер мне трэба высветліць, даўжыня гэтага радка. Так як я магу гэта зрабіць? Што рабіць, калі я раблю - давайце паглядзім, як гэта зрабіць - Што вы хочаце зрабіць? [Неразборліва адказ студэнта] >> Добра. Такім чынам, мы можам зрабіць гэта ў кучу спосабаў. Дазвольце мне паспрабаваць прыняць такі падыход. Дазвольце мне прывесці сябе Int зменнай я, так што я пачынаецца з 0. І дазвольце мне сказаць вось што: у той час як уваход [я] не роўна што? \ 0. Вось і атрымліваецца, як і ў выпадку з усімі сімвалаў пры напісанні іх літаральна ў праграме, Вы павінны выкарыстоўваць адзінарныя двукоссі, а не падвойныя двукоссі. Так што, калі б я пісаў ліст, я хацеў бы зрабіць гэта, ліст б, я б зрабіў гэта. Гэта, наадварот, будзе радком, а не індывідуальны характар. Таму я хачу \ 0 у літаральным сэнсе. Што я хачу зрабіць у гэтым цыкле? На самай справе, мне патрэбна яшчэ адна пераменная, таму Int даўжыні атрымлівае 0. Нават калі вы не ўпэўненыя, чаму мы пачалі так, як мы зрабілі, Цяпер, калі мы збіраемся ісці па гэтым шляху, тое, што я хачу зрабіць на лініі 9? Даўжыня + +, а затым тут, на лініі 10, вяртанне даўжыні. Такім чынам, як StrLen рэалізаваны? Гэта на самай справе рэалізаваны, верагодна, як гэта. Можа быць, чалавек выкарыстаў для цыклу, можа быць, рабіць падчас цыклу - хто ведае? Мы сапраўды павінны глядзець пад капотам на фактычны зыходны код У некаторых файл з імем string.c напэўна. Але вось давайце падумаем пра тое, што я раблю. Я аб'яўленні зменнай я, усталяваўшы яго роўным 0. Я тады абвясціць іншую зменную даўжыню, усталяваўшы яго роўным 0. Тады я кажу, у той час як га характару на ўваходзе не роўна спецыяльны сімвал NULL, \ 0, павялічваць даўжыню. Але як толькі й сімвал гэтага адмысловы знак, тое, што адбываецца ў цыкле? Гэта кароткае замыканне. Ён спыняецца, якая азначае, што мы затым імгненна вярнуцца даўжыні. Так што, калі я не сапсуе, давайце ісці наперад і вярнуцца да маёй акне тэрмінала. Дазвольце мне перакампіляваць. І я сапсаваць. Несумяшчальныя пераазначэнне функцыі бібліятэкі StrLen. Так што я спрабаваў атрымаць занадта разумны для майго ж дабра тут. Кампілятар на самай справе ведае, што ёсць функцыя пад назвай StrLen нават калі мы не ўключылі ў бібліятэку. Гэта нармальна. Усё роўна. Мы проста будзем супрацоўнічаць тады. Давайце перайменаваць гэтую даўжыню. Дазвольце мне змяніць выкарыстанне яго даўжыня тут, і гэта зробіць Clang шчаслівей. Як у баку, таму што некаторыя з гэтых функцый з'яўляюцца так па-чартоўску часта - StrLen, prinf - яны на самай справе маюць выгляд асаблівы статус. І так Clang проста ведае сёе-тое адмысловае пра іх. Гэта не заўсёды ў выпадку з большасцю функцый, дык вось чаму мы атрымалі крычаў на. Дазвольце мне паспрабаваць яшчэ раз. На шчасце, ён працаваў таго часу. Так што цяпер дазвольце мне выканаць мой уласны StrLen праграмы. Дайце мне радкі: Н-Е-Л-Л-О Enter. І я аблажаўся. Чаму? >> [Неразборліва адказ студэнта] >> Менавіта так. Так што я сябе тут вельмі прыгожы бясконцы цыкл таму што, хоць я павялічваючы даўжыню на кожнай ітэрацыі, Што я відавочна не робіце? Я не павялічваючы я. Добра. Лёгка выправіць. Да? Добра. Нумар Цяпер мы перапыніла б некаторыя іншыя распаўсюджаная памылка, калі мне трэба дужкі. І, шчыра кажучы, гэты код пачынае выглядаць невыносны, таму мы прыняць ўдар на ачыстку гэтага ў дадзены момант. Але цяпер я павялічваючы даўжыню і я. Шчыра кажучы, я ўжо бачу магчымасць для паляпшэння, але мы вернемся да гэтага. Такім чынам, цяпер давайце проста пераканацца, што мы па крайняй меры прагрэсу. Гэта адбылося на некаторыя з вас, і я забыўся згадаць пра гэта загадзя. Калі вы маеце няшчасце падобны сцэнар, як вы гэта выправіць коратка аб аднаўленні прыбора або кампутара або закрыццё вокны? Гэта на самай справе лёгка. Упраўленне C пашлю гэтую маленькую моркву сімвал C, а проста спыняе большасці праграм. Калі ў вас ёсць сапраўды дрэнныя бясконцы цыкл, што чэргі друку матэрыял бясконца шмат разоў, Часам вам давядзецца ударыць Control C тысяч раз, каб зрабіць яго на самай справе гэта чуць. Так што цяпер разумею, таму што я не друкуе нічога, што было даволі лёгка. І тэхнічна, як толькі хапае, але я нецярплівы і звычайна я ударыў яго, што шмат разоў. Так StrLen. Дайце мне радкі: Добры дзень. Ці будзе яна працаваць на гэты раз? Добра. Яшчэ адна распаўсюджаная памылка. Давядзецца перакампіляваць. Гэта было наўмыснае, што адзін. Добра. Так StrLen, H-E-L-L-O, Enter. Выдатна. Так што цяпер у нас ёсць StrLen да 5. Такім чынам, мы літаральна перавызначаны, што кола. А цяпер давайце ачысціць гэта, таму што гэта не робіць мяне ўразіла з дызайнам майго кода. Што мы можам выразна ліквідаваць у гэтую праграму, каб ачысціць гэта? [Неразборліва адказ студэнта] >> Так. Літаральна, мы лячэння я і даўжыні аднолькава. Так чаму б нам проста не разумнічай і сказаць, у той час як даўжыня? Хутчэй за ўсё, давайце проста называць яго даўжыня Пачнем з таго, ініцыялізаваць яго ў 0 таму што па змаўчанні радок не мае даўжыні, пакуль мы не высвятлім, што гэта такое. Зараз мы гэта робім, і цяпер гэта даволі элегантнае праграмы. Адна зменная. Я ачысьціў яго, зацягнуць яго. А цяпер давайце вернемся да маёй акне тэрмінала. Давайце пойдзем далей і запусціць гэта. Зрабіць StrLen. Выглядае добра. Выканаць StrLen зноў, Enter. Дайце мне радкі: Добры дзень, Enter. І гэта, здаецца, працуе як 5. Цяпер, каб быць яснай, калі б я не напісаў, напрыклад, ПРЫВІТАННЕ ў 1 радок , А затым BYE ў іншы, мы, безумоўна, можа мець некалькі слоў. Калі выраз я на самой справе хацеў ўвесці не было прывітанне, але, напрыклад, Hello World, звярніце ўвагу, што тое, што мы б не гэтая сітуацыя, так? Таму можна выказаць здагадку, што гэта 2 радка. Вы, вядома, можаце мець знакі прабелу, таму, калі мы на самай справе набралі ў больш фразай Прывітанне, свет, як тое, што мы сапраўды маем у памяці выглядае крыху нешта падобнае ёсць. Добра. Любыя пытанні, то аб прадстаўленні тут радкоў? Няма? Добра. Так што я сказаў раней, што выклік StrLen зноў і зноў, як знарок, што верагодна, гэта не лепшая ідэя, таму што вы збіраецеся рабіць шмат працы зноў і зноў, і зноў. На самай справе, якую працу неабходна высветліць даўжыню радка, па-відаць? Вы павінны пачаць з самага пачатку, а затым глядзіце, глядзіце, глядзіце, глядзіце, глядзіце пакуль вы, нарэшце, ўбачыце, што асаблівы характар, і ў гэты момант, ах, цяпер я ведаю даўжыню. Так што раней, калі мы StrLen называюць зноў і зноў і зноў, Таму я прапанаваў, што было даволі дурное, таму што зноў жа, што радок выглядае так. Гэта не збіраецца змяняць кожны раз, калі вы перабіраюцца некаторыя завесы, так вы робіце лішнюю працу. У той жа час вы павінны ведаць, як у бок, што кампілятары, як Clang ў гэтыя дні былі распрацаваны на працягу многіх гадоў, і кампілятараў, праграмістаў, даволі разумная. І так атрымліваецца, што Clang і іншыя кампілятары могуць на самай справе зразумець, што, Добра, так, Вы пісалі StrLen ў вашым стане, якія тэхнічна азначае, што мы назвалі б яго зноў і зноў і зноў. Але разумныя кампілятары сапраўды можа аптымізаваць гэтыя віды дрэнных рашэнняў карыстальнікаў з вашага кода для выпраўлення рэчаў. Так што проста разумець, што часам кампілятар разумнейшы за нас і выгляд хаваць нашы ўласныя памылкі. Але, вядома, калі гаворка ідзе пра праблему наборы і г.д., ды будзе думаць аб тых прынцыпова памылковыя праектныя рашэнні магчыма, па той простай прычыне, што мы будзем рабіць нашмат больш працы чым мы на самой справе трэба рабіць. Але колькі яшчэ працы? У выпадку Hello World, давайце пачнем абагульніць памер гэтай праблеме. Які даўжыні праблемы або памер праблемы калі слова карыстальнік ўводзіць у гэта Алё? Гэта па-відаць 5, магчыма, 6. Плюс або мінус 1. Усё роўна. Гэта так блізка, што мы проста называем гэта 5. Так у чым жа памеру, што праблема тут, калі спрабуюць высветліць, даўжыня Ала? Гэта 1, 2, 3, 4, 5, 6, можа быць, апошні сімвал, але давайце абагульняць, што пры п. Так што я, проста пераменная п, з'яўляецца тое, што кампутар навукоўцы звычайна выкарыстоўваюць для апісання памеру праблема, а праблема ў руцэ як доўга Ала? Колькі часу StrLen ўзяць? Гэта займае каля п крокаў, дзе кожны крок азначае погляд на характар, паглядзець на знак, паглядзіце на характар. І мы ўжо абмяркоўвалі гэта некаторы час таму, колькасць аперацый, нешта прымае. Самы першы дзень заняткаў мы ўсё няёмка ўстаць, а потым усё пачалося на пары адзін з адным для таго каб рэальна разлічваць ідэальна, колькі чалавек было ў пакоі. І мы таксама зрабілі іншая справа паводле якога, калі я зрабіў гэта замест старой школы за ўсё, пачынаючы з 1, 2, 3, 4, 5, 6 і т. д., , Што таксама, памеры, што праблема была памерам з. Былі рускіх людзей у пакоі. Але я магла б паскорыць, што, праўда? Grade стыль школе я мог пачаць адлік у 2s. 2, 4, 6, 8, 10, 12. І што адчувае сябе так нашмат хутчэй, і гэта сапраўды так. Гэта літаральна ў два разы хутчэй, але зноў жа, калі іншы 400 чалавек увайшоў у гэты пакой ўсё адразу, гэтыя алгарытмы спатрэбіцца яшчэ 400 ці можа быць 200 крокаў. Але, наадварот, калі мы сапраўды атрымаем разумны і мы замест гэтага ёсць усе вы лічыце сябе, Успомнім, як гэты алгарытм працуе. Вы ўсё ўсталі. Дазвольце мне хутка чакаю гэтага. Вы ўсё ўсталі, вы на пары, то палова з вас сеў, палова з вас сеў, палова з вас сеў, і на кожнай ітэрацыі гэтага цыклу ад тыдня 0, удвая праблемы пад рукой і пайшоў да п / 2, то п / 4, то п / 8. І наступствы гэтага з'яўляецца тое, што калі яшчэ 400 людзей хадзіць у пакой, нічога страшнага, нам спатрэбіцца яшчэ 1 раўнд, а не 400 больш раўндаў, а не яшчэ 200 патронаў. І вось гісторыя, якую мы распавялі некаторы час таму быў зрабіць сёе-тое з гэтым. Гэта чырвоная лінія тут з'яўляецца лінейным, гэта прамая, і ён пазначаны як п таму як памер праблема расце, калі ваш алгарытм ці праграма, з якой вы яе рашэнні прымае п крокаў, мы можам пабудаваць яе ў выглядзе прамой лініі, дзе яна займае больш часу, чым больш памер праблемы. І twosies падыход, лічачы 2, 4, 6, 8, па-ранейшаму прамой лініі, толькі крыху лепш. Гэта зойме трохі менш часу, так што жоўтая лінія знаходзіцца ніжэй чырвонай кропкай лініі кропкі. Але яшчэ лепш было гэта Святой Грааль, што мы называем лагарыфмічнай час дзе нават калі мы зноў падвоіць колькасць людзей у пакоі, Мы падвоіць памер, што тэлефонная кніга з першага дня класа, нічога страшнага, гэта займае яшчэ 1 старонка слязу, займае 1 больш пасяджэнне ўніз для таго, каб вырашыць праблему, якая ў два разы большым. І таму размова мы цяпер можам пачаць мець у Як мы на самай справе вырашаць праблемы эфектыўна калі мы разгледзім найпросты з такіх праблем, як гэта? Выкажам здагадку, у нас ёсць 8 дзверы, за якімі некаторыя ліку, і кожнае з гэтых лікаў ня адсартаваныя ў любым выпадку, яны проста выпадковых лікаў за гэтымі дзвярыма, і мы задаем пытанне, як вы ідзяце аб пошуку нумары - хто ведае - 7 за гэтымі дзвярыма? Што б вы, чалавека, зрабіць для таго, каб знайсці мяне нумарам 7 калі зноў кожны з іх дзверы і бачыць значэнне, якое вы павінны адкрыць дзверы? Што б ваш алгарытм будзе магчыма? [Неразборліва адказ студэнта] >> Так што пачніце з левай і адкрыць дзверы, адкрыць дзверы, адкрыць дзверы. А ў горшым выпадку, як доўга ён збіраецца ўзяць нас, каб знайсці лік 7? І зноў жа, яны не адсартаваныя, так што гэта не так проста, як, ну, я збіраюся адкрыць 7-й дзверы. Гэта можа заняць нас, максімальна, 8 крокаў. У горшым выпадку, 7 выпадкова ў самым канцы лініі дзвярэй, такім чынам, мы, магчыма, прыйдзецца паспрабаваць усё п дзверы. Такім чынам, яшчэ раз тут, мы, здаецца, ёсць лінейны алгарытм. На самай справе, мы зрабілі гэта ўсяго толькі пару гадоў таму. Адзін з вашых папярэднікаў былі аспрэчаныя менавіта з гэтым дзе ў нас не было лічбавай версіі, замест гэтага мы былі дошцы некаторыя паперкі на ім. І тое, што я думаў, я хацеў бы зрабіць, гэта ўзяць хуткі погляд назад, як гэта пайшло, адна з лепшых і, мабыць, самае няёмкае магчымасці на сцэну мець дэманстрацыю прама тут, на Сандэрса. У нас было 2 шэрагу лікаў. Мы толькі будзем глядзець на тое, што тут адбываецца з Шонам на самым версе гэтых радкоў. Калі ніхто ніколі зноў добраахвотнікаў у CS50, у нас было дабраславеньне Шона, каб трымаць гэта на камеру, так што ён ведае, што сотні людзей назіралі за гэтым цяпер на працягу многіх гадоў. Але Шон прарабіў ўзрушаючую працу - ці ён - на самай справе знайсці нас пэўную колькасць. Такім чынам, давайце паглядзім, як ён вырашыў гэтую алгарытм так, што мы будзем аднавіць гэты размову ў хуткім часе пра тое, як мы знаходзім рэчы эфектыўна. [Малая на відэа] я хаваецца за гэтымі дзвярыма № 7, але схаваны ў некаторых з гэтых дзвярэй, а іншыя неадмоўных лікаў, і ваша мэта, каб думаць пра гэта верхні шэраг лікаў, як толькі масіў ці проста паслядоўнасць паперкі з нумарамі за імі, і ваша мэта, выкарыстоўваючы толькі верхнюю масіва тут, знайсці мне нумар 7. І мы тады будзем крытыкі, як вы ідзяце аб выкананні гэтага. >> Усё правільна. [Малая] Знайсці нас нумар 7, калі ласка. [Смех] [Малая] Няма [смяецца] 5, 19, 13, [смех]. Гэта не пытанне з падвохам. 1. [Смех] У гэты момант ваш кошт не вельмі добра, так што вы можаце таксама працягваць. [Смех] 3. Працягвайце. Шчыра кажучы, я не магу не задацца пытаннем, што вы нават думаць. [Смех] Толькі ў верхнім шэрагу, так што ў вас ёсць 3 злева. Так што знайдзіце мне 7. [Студэнтам нараканьні] [Малая] 17. [Студэнтам нараканьні] [Малая] 7! [Апладысменты] Так што ў сераду мы пагрузіліся ў гэтым і больш складаныя алгарытмы для знаходжання рэчы. На дадзены момант мы пакінем вас з Шонам і бачыць Вас у сераду. [CS50.TV]