[Агляд: Віктарына 1] [Алі Нама, Oreoluwa Barbarinsa, Лукас Фрейтас, Роб Боуден] [Гарвардскі універсітэт] [Гэта CS50.] [CS50.TV] [Лукас Фрейтас] Вітаю ўсіх. Гэта водгук для віктарыны 1. Гэтак жа, як за дакладнасць інфармацыі, гэта - я маю на ўвазе, што мы збіраемся, каб паспрабаваць пакрыць як шмат матэрыялу, як гэта магчыма, але гэта не азначае, што мы збіраемся ахапіць усе рэчы, якія могуць быць у віктарыне 1. Так што будзьце ўпэўненыя, вы таксама зірнуць на лекцыі, часткамі, усё, што можна. Віктарына 1 будзе ў сераду, у наступную сераду. Так што не забудзьцеся вывучыць. Гэта будзе, у значнай ступені, як і першы віктарыны адносна яго фармат, але гэта, верагодна, будзе значна складаней. Па крайняй меры, у мінулым годзе, калі я ўзяў 50, я думаў, што гэта было значна складаней. Так шмат вучыцца. Я збіраюся пакрыць структуры дадзеных і кадаваньне Хафман. Гэта тое, што многія людзі думаюць, з'яўляецца складанай, але я збіраюся паспрабаваць зрабіць гэта як мага прасцей. Перш за ўсё, тое, што мы хочам, вы, хлопцы, каб ведаць віктарыны 1 з'яўляецца зразумець канцэптуальныя апісання кожнай з структур дадзеных, якія я збіраюся ўявіць. Гэта азначае, што ў вас няма на самай справе рэалізацыі хэш-табліцу ў вашай віктарыны 1. Мы не хочам вам рэалізаваць цэлы хэш-табліцу, можа быць, мы пастараемся каб вы рэалізаваць некаторыя функцыі, найбольш распаўсюджаныя аперацыі, але мы не збіраемся, каб вы рэалізаваць усе. Таму важна, што вы разумееце паняцце ззаду кожнай структуры дадзеных а таксама, што вы можаце кадзіраваць ў C, толькі самыя распаўсюджаныя аперацыі, якія яны маюць для кожнай структуры дадзеных. А таксама зможаце праглядзець паказальнікі і структуры, таму што яны з'яўляюцца шмат у гэтых структур дадзеных. Па-першае, звязаныя спісы. Звязаныя спісы на самай справе вельмі падобны на масівах, але розніца паміж звязаны спіс і масіў, перш за ўсё, у тым, што звязаны спіс мае вельмі гнуткі памер, у той час як у масівах вы павінны альбо абраць вельмі вялікі памер для масіва, так што вы ведаеце, што вы збіраецеся быць у стане захоўваць усе вашыя дадзеныя ў гэтым масіве, ці вы павінны выкарыстоўваць Таноса мець гнуткую даўжыню масіва. У звязаных спісаў, што гэта вельмі лёгка, каб проста атрымаць больш элементаў, пакласці больш элементаў у звязаным спісе ці выдаляць элементы. А на самай справе, калі вы не хочаце звязаны спіс павінен быць адсартаваны, Вы можаце шукаць і выдаляць элементы ў пастаянны час, так O (1) часу, так што гэта вельмі зручна. Вы проста павінны быць асцярожныя, каб заўсёды памятаць, каб Malloc і бясплатна вузлы, толькі таму, што калі вы гэтага не зробіце, вы будзеце мець уцечак памяці. Так звязаныя спісы - вызначэнне вузла сапраўды гэтак жа як тое, што мы маем права там. Я паклаў Int N, але вы можаце захоўваць любыя дадзеныя, якія вы хочаце. Так што калі вы хочаце захаваць радок, гэта выдатна. Калі вы хочаце захаваць структуру, гэта выдатна, двайны, што вы хочаце. Я проста пакласці Int N для прыкладаў тут. І ў вас ёсць паказальнік на наступны вузел. Так, у асноўным, звязаны спіс мае некаторыя дадзеныя, а затым ён паказвае на наступны вузел. Калі гэта апошні элемент у звязаным спісе, гэта будзе паказваць на NULL. Такім чынам, гэта з'яўляецца прыкладам звязанага спісу. Добра, зараз давайце паглядзім, што мы павінны рабіць, калі я хачу, каб ўставіць элемент у звязаным спісе. Па-першае, функцыя ўстаўкі будзе тыпу пустэчу таму што я не хачу нічога вяртаць. І я збіраюся прыняць Int ў якасці аргументу, таму што я хачу ведаць, што я хачу, каб ўставіць. Так што першае, што я павінен рабіць? Ну, я павінен Malloc на newnode, так што гэта першая лінія. Я проста стварэнне новага вузла паставіць у звязаным спісе. Так што я магу зрабіць? Ну, мы ведаем, што ў нашых рэалізацый звязаных спісаў у класе, мы заўсёды ставім галоўку як глабальная пераменная. Такім чынам, што мы можам зрабіць, гэта змяніць галавой. Я магу зрабіць гэта новы вузел будзе новы кіраўнік, і гэта будзе паказваць на папярэдняй кіраўніка. Як мы можам гэта зрабіць? Першае, што я павінен зрабіць, гэта змяніць 'N' у новым вузле ў кошту, які быў прыняты ў функцыю. Тады newnode далей будзе кіраўнік. Галава будзе newnode. Так што гэта даволі проста. Для выдалення вузла, мы можам зрабіць гэта як - Адзін са спосабаў мы маглі зрабіць гэта, каб сказаць, добра, калі б я хацеў, каб выдаліць, напрыклад, 3, што я мог зрабіць, гэта проста паказаць папярэдні вузел да наступнага вузла 3. Так што я б проста зрабіць нешта накшталт гэтага. Але ў чым праблема з, што рабіць? У мяне ёсць ўцечка памяці, так што ў мяне няма доступу да ліку 3 больш. Праблема ў тым, што я не збіраюся быць у стане вызваліць гэты вузел. Я збіраюся мець ўцечка памяці і (неразборліва) збіраецца мяне ненавідзіш. Такім чынам, замест таго, каб рабіць гэта, я, верагодна, варта мець часовы паказальнік. Так што я паклаў тэмп. Яна збіраецца паказваць на вузле, што я хачу, каб выдаліць. А потым я магу рухацца папярэднія вузлы пункту да наступнага вузла вузла, што я хачу, каб выдаліць. І, нарэшце, я магу вызваліць паказальнік. Ці ёсць у мяне, каб вызваліць паказальнік, які я стварыў тут? Я не павінен, толькі таму, што - розніца ў тым, што гэты вузел быў створаны з дапамогай Таноса, так што гэта ў кучы, а гэты быў проста абвешчаны ў якасці перамыкача NULL ў стэку. Так у мяне няма, каб вызваліць яе. Добра. Так што цяпер давайце пагаворым аб стэкаў. Штабелі даволі простыя. Мы зрабілі стэкі і чэргі ў класе толькі з дапамогай масіваў, але вы павінны быць знаёмыя - проста трэба ведаць што вы таксама можаце зрабіць стэкі ў чэргах з дапамогай звязаных спісаў, а таксама. Так што калі ў вас ёсць масіў, што было б стэк? Стэк, па-першае, павінны мець памер. Вы павінны захаваць тое, што гэта памер стэка, што ў вас ёсць цяпер. А таксама вы б масіў, у дадзеным выпадку лікаў, але калі вы хочаце, гэта можа быць масівам радкоў, масіў структуры, усё, што вы хочаце захаваць. Аб стэка: Розніца паміж стэкам і звязанага спісу з'яўляецца тое, што ў стэку ў вас ёсць толькі доступ да апошніх элементам, здадзенай у стэку. Яна называецца апошні ўвайшоў, першы выйшаў. Гэтак жа, як у вас ёсць чарка падносаў, калі вы паклалі паднос на вяршыні стэка, Вы павінны выдаліць гэты латок першым, каб мець доступ да іншых латкоў. Гэта тое ж самае са стэкамі. Так што, калі я хачу, каб, напрыклад, дадаць элемент у стэку, што я павінен рабіць? Яна называецца штуршок, і гэта даволі проста. Першае, што вы павінны зрабіць, гэта праверыць, калі памер стэка не больш або роўная ёмістасці стэка. Таму што, калі ў вас ужо ёсць на поўную магутнасць, вы не можаце што-небудзь яшчэ дадаць. І потым, калі не, то вы проста павінны дадаць элемент у стэк. І, нарэшце, павялічваюць памер. Так што гэта даволі проста. Так што я проста дадаць нумар 2. І калі я хачу, каб соваць, а гэта значыць, што я хачу, каб выдаліць апошні элемент, які дадаюць і вяртае значэнне элемента, Першае, што я павінен праверыць, што стэк не пусты. Таму што, калі ён пусты, я нічога не магу вярнуцца. У гэтым выпадку, я вяртаюся -1. У адваротным выпадку, я збіраюся паменшыць памер спецыфікацыі, і вярнуцца лічбы (s.size). Чаму я паменшыць памер, а затым вярнуцца s.size? Гэта таму, што, у дадзеным выпадку, спецыфікацыя мае памер 4, і я хачу вярнуцца чацвёрты элемент, ці не так? Але тое, што індэкс чацвёртага элемента? Тры. Так як я памер - будзе 3, я магу проста вярнуцца s.numbers (s.size) таму што гэта 3. Так што гэта проста індэкс. Зараз чэргі. Чэргі ў значнай ступені тое ж самае. Розніца толькі ў тым, што замест таго, апошні ўвайшоў, першы выйшаў, ў вас ёсць першы ўвайшоў, першы выйшаў. Верагодна, калі вы чакаеце, каб пайсці на канцэрт, Вы не былі б шчаслівыя, калі б у вас быў стэк замест чарзе. Будучы апошнім чалавекам, які прыйшоў бы першым чалавекам, каб увайсці ў канцэрт. Вы, напэўна, не быў бы шчаслівы. У чарзе, першым чалавекам, каб атрымаць у таксама першым чалавекам, каб выйсці. Такім чынам, у вызначэнні чарзе, акрамя таго, што памер масіва, Вы таксама павінны мець галаву, якая індэкс да галавы стэка. Такім чынам, першы элемент прама цяпер. Ставіць гэта тое ж самае, як штуршок для стэкаў. Калі вы былі вельмі наіўныя, вы б проста сказаць, ну, я магу проста зрабіць тое ж самае, што і я зрабіў для штуршка. Я магу проста праверыць, калі гэта не выходзіць за межы магчымасцяў. Калі гэта так, я вярнуцца ілжывым, інакш я магу проста экспартаваць новае значэнне і затым павялічыць памер. Але чаму гэта так? Давайце паглядзім гэты прыклад. Я спрабую паставіць у чаргу кучу рэчаў, а затым я збіраюся з чаргі і пастаноўкі ў чаргу. Там вельмі шмат каманд, але гэта вельмі проста. Я збіраюся паставіць у чаргу 5, так што дадайце 5, а затым 7, 1, 4, 6, а затым я хачу з чаргі нешта, Гэта азначае, што я збіраюся выдаліць першы элемент. Так што я збіраюся зняць нумар 3, ці не так? Першы элемент. Добра. Цяпер, калі я спрабую паставіць у чаргу нешта яшчэ, што адбудзецца? Па маёй рэалізацыі, Я збіраўся паставіць наступны нумар у індэксе q.size. У гэтым выпадку, памер 8, таму індэкс 8 будзе прама тут, у апошняй пазіцыі. Калі я спрабую паставіць у чаргу 1 прама тут, я быў бы перазапісу апошнюю пазіцыю да № 1, якое з'яўляецца цалкам няправільным. Тое, што я хачу зрабіць, гэта абгарнуць вакол і перайсці да першай пазіцыі. Можа быць, вы б проста сказаць, ну, я проста павінны праверыць калі я магу на самой справе пакласці што-то там. Калі няма, я проста кажу, о, новы поўную магутнасць на самай справе магутнасць - 1, і вы не можаце змясціць элемент ёсць. Але ў чым жа праблема? Праблема ў тым, што, калі я проста з чаргі ўсё прама тут а затым я спрабую дадаць нешта яшчэ, было б проста сказаць, ну, вы былі на поўную магутнасць, што з'яўляецца 0. Так што ваша чаргу сышла. Вы павінны абгарнуць вакол, і спосаб обцяканьне што вы, хлопцы даведаліся ў дальнабачныя і іншых psets выкарыстаў мод. Вы можаце паспрабаваць яго дома, каб зразумець, чаму вы маглі б зрабіць q.size + q.head мод ёмістасць, але калі вы паглядзіце прама тут, мы бачым, што яна працуе. Такім чынам, у апошнім прыкладзе, q.size было 8 і галава была 1, таму што гэта было гэта становішча тут масіва. Так будзе 8 + 1, 9. Мод ёмістасць 9 будзе 0. Было б пайсці ў індэксе 0. Мы будзем у правільным становішчы. А потым паспрабуйце чаргу дома. Некаторыя важныя рэчы: паспрабаваць зразумець розніцу паміж стэкам і чэргі. Дома, паспрабаваць атрымаць вельмі добра знаёмыя з рэалізацыі ў чаргу, Dequeue, штуршок і поп-музыкі. А таксама зразумець, калі вы будзеце выкарыстоўваць кожны з іх. Так што давайце адпачыць на працягу 10 секунд з кучай покемонов. А цяпер давайце вернемся да структур дадзеных. Хэш-табліцы. Шмат людзей былі напалоханыя хэш-табліцы. ў праблему набор 6, Spell Checker. Хэш-табліцы і спрабуе, шмат людзей палохаюцца з іх. Яны думаюць, што яны так цяжка зразумець. Да? [Роб Боуден] Архіў задач 5. Архіў задач 5, так. Дзякуючы Роб. Так. Шэсць быў Хафф-н-Puff, так. Архіў задач 5 быў Spell Checker, і вы павінны былі выкарыстоўваць або хэш-табліцу або спробу. Многія людзі думаюць, што яны былі супер цяжка зразумець, але яны на самай справе даволі проста. Што такое хэш-табліцу, у прынцыпе? Хэш-табліца ўяўляе сабой масіў звязаных спісаў. Адзіная розніца паміж масівам і хэш-табліцы з'яўляецца тое, што ў хэш-табліцы ў вас ёсць тое, што называецца хэш-функцыя. Што такое хэш-функцыя? Я не ведаю, калі вы, хлопцы можаце прачытаць тут. Гэта з'яўляецца прыкладам хэш-табліцы. Такім чынам, вы можаце бачыць, што ў вас ёсць масіў з 31 элементамі. І тое, што мы робім у хэш-табліцы з'яўляецца мець хэш-функцыю што збіраецца перавесці ключ, кожны дзесятковага індэксе. Калі, напрыклад, калі я хачу, каб выбраць для Б. Харысан, Я б паставіў Б. Харысан ў маіх хэш-функцый, і хэш-функцыя вернецца 24. Так што я ведаю, што я хачу захаваць Б. Харысан ў 24. Дык вось розніца паміж проста маючы масіў і з хэш-табліцу. У хэш-табліцы вы будзеце мець функцыю, якая збіраецца, каб сказаць вам дзе захоўваць дадзеныя, якія вы хочаце захаваць. Для хэш-функцыі, вы хочаце паглядзець на хэш-функцыі што з'яўляецца дэтэрмінаваных і добра размеркаваны. Як вы можаце бачыць тут, вы бачыце, што шмат дадзеных, якія я хацеў краме было на самай справе 19 замест выкарыстання 31 і 30 і 29, якія былі ўсе бясплатна. Такім чынам, хэш-функцыя, што я выкарыстаў не вельмі добра размеркаваны. Калі мы кажам, добра размеркаваны, гэта азначае, што мы хочам мець, прыкладна, па меншай меры, 1 або 2 для кожнага з - як, розніца ў 1 або 2 для кожнага з індэксаў у масівах. Вы хочаце, каб, груба кажучы, тое ж колькасць элементаў у кожным звязаным спісе ў масіве. І гэта лёгка праверыць, калі яна дзейнічае ў хэш-табліцы, паглядзець як хэш-табліцы. Тады дрэвы. Гэта дрэва. Дрэвы ў інфарматыцы з ног на галаву чамусьці. Так прама тут у вас ёсць корань дрэва, а затым лісце. Вы павінны проста ведаць наменклатуру для бацькоў і дзіцяці. Кожны вузел мае сваіх дзяцей, якія з'яўляюцца вузлы, якія знаходзяцца ніжэй з бацькоў. Так, напрыклад, 2 збіраецца быць бацькам для 3 і для іншага дзіцяці тут жа, у той час як 3 будзе бацькоўскім для 1 і іншыя дзеці, якія там. І 1 будзе 3 дзіця, і гэтак далей. У нас ёсць нешта значна больш цікавае, званы бінарнае дрэва, , У якім усе значэння ў правай частцы вузла будуць справа, прама тут - на правым, будуць больш, чым элемент у корані. Таму калі я нумар 5 прама тут, усе элементы на правы будуць больш за 5, і злева ўсе элементы будуць менш 5. Чаму гэта карысна? Ну, калі я хачу, каб праверыць, калі лік 7 тут, напрыклад, Я проста перайдзіце да 5 першым, і я збіраюся бачыць, з'яўляецца 7 больш або менш 5? Гэта больш, так што я ведаю, што гэта будзе мець, каб быць на справа ад дрэва. Так што ў мяне значна менш рэчаў, каб глядзець на. У рэалізацыі бінарнага дрэва пошуку, вузла, я проста хачу, каб мець дадзеныя, так Int N, вы маглі б таксама ёсць радок ці ўсё, што вы хацелі. Вы проста павінны быць асцярожнымі на вызначэнні таго, што больш, чым менш. Так што калі вы былі радкі, напрыклад, можна вызначыць што ўсе тыя рэчы, якія тычацца правы будуць мець вялікую даўжыню, левая будзеце мець больш нізкія даўжыні, так што гэта сапраўды залежыць ад вас. Як я магу рэалізаваць знайсці для BST? Першае, што мы павінны зрабіць, гэта праверыць, калі корань NULL. Калі гэта NULL, гэта азначае, што рэч не існуе таму што вы нават не дрэва, дакладна? Так што я вярнуцца ілжывым. У адваротным выпадку, я збіраюся праверыць, калі лік больш чым значэнне ў корані. Я збіраюся паспрабаваць знайсці элемент справа з дрэва. Вы бачыце, што я выкарыстоўваю рэкурсіі тут. І потым, калі гэта менш, я збіраюся паглядзець на злева. І, нарэшце, у адваротным выпадку, калі гэта не менш або не больш, гэта азначае, што гэта само значэнне. Так што я проста вярнуцца дакладна. Тут можна ўбачыць, што я выкарыстаў, калі, калі, калі. І памятайце, у віктарыне 0, у нас была праблема, што, калі б, калі, калі, і вы павінны былі знайсці неэфектыўнасць, і неэфектыўнасць у тым, што вы выкарыстоўвалі, калі. Вы павінны былі выкарыстаць, калі, яшчэ, калі, яшчэ, калі, і яшчэ. Так, я павінен выкарыстоўваць яшчэ, калі і яшчэ, калі і яшчэ тут? Хто-небудзь - да? [Студэнт кажучы, неразборліва] Выдатна. Так яна кажа, што гэта не мае значэння, толькі таму, што неэфектыўнасць, што ў нас было раней было тое, што, таму што, можа быць, калі некаторы ўмова было выканана, так што вы выканалі дзеянні, але тады вы збіраліся праверыць ўсе іншыя ўмовы. Але ў гэтым выпадку, ён вярнуўся адразу ж, так што гэта не мае значэння. Так што вам не давядзецца выкарыстоўваць яшчэ, калі. І, нарэшце, давайце пагаворым аб спробаў, які з'яўляецца улюбёнцам. Спроба гэта дрэва масіваў. Гэта вельмі хутка для пошуку значэння, але ён выкарыстоўвае шмат памяці. І гэта, як правіла, для фільтрацыі словы, таму, калі вы хочаце рэалізаваць, напрыклад, я не ведаю,, як тэлефонная кніга ў тэлефоне і вы хочаце, каб мець магчымасць тыпу У і проста імёны людзей, якія маюць B. Гэта вельмі лёгка ажыццявіць, што выкарыстанне паспрабаваць, напрыклад. Як вы вызначаеце вузел у спробе? Вы проста павінны мець лагічнае значэнне, якое збіраецца быць is_word. Гэта ўяўляе, што выкарыстанне ўсіх сімвалаў да гэтага вузла, Вы былі ў стане сфармаваць слова, і тады вы будзеце мець масіў паказальнікаў на вузлы. Ці бачыце вы, што ў нас ёсць масіў бацькоўскіх вузлоў, так што вузел * масіў? Да? Такім чынам, давайце паглядзім, як гэта будзе працаваць. Для праверкі правапісу, у нас ёсць масіў з 27 элементаў, таму што ў нас усё лісты і прэміі апостраф. Перад тут я проста буду выкарыстоўваць 2 таму што я хачу, каб мець магчымасць пісаць на дошцы. Добра. Так што гэта прыклад спробы. Калі б я проста вызначыць першы вузел, я буду ёсць масіў 2-х элементаў што 2 паказальнікі на NULL, так што я проста пакласці 'A' і 'B'. І я буду мець лагічнае значэнне, якое кажа is_word. Гэта збіраецца быць ілжывым для першага, толькі таму, што, перш чым, што ў вас няма ніякіх знакаў. Так пустое слова не з'яўляецца словам. Так што гэта хлусня. Калі я хачу дадаць 'А' да гэтага слоўніка, што б я павінен зрабіць? Я б проста павінны Malloc новы вузел для "а", , А затым дадаць сваё слова да ісціны. Так што проста ўяўляе, што, 'а' збіраецца, каб быць праўдай. Сэнс? Тады, калі я хачу дадаць 'ба', я павінен буду Таноса 1 для 'B', а затым я збіраюся наладзіць лагічнае хлусня, таму «б» само па сабе не з'яўляецца словам. Тады я збіраюся Malloc яшчэ адзін для "а", так што "ба", а затым я збіраюся стварыць гэтае слова да ісціны. Таму што «ба» гэтае слова. І потым, калі я хачу, каб убачыць, калі «б» ў гэтым слоўніку, Я магу проста пайсці ў першы, 'B'. Я спускаюся, і я гляджу на гэтае слова, і ён кажа, з'яўляецца ілжывым. Так што гэта не словы. Калі я хачу, каб праверыць "ба", Я іду ў першы, 'B', а затым перайсці да "а", і я бачу, праўда, так гэтае слова. Сэнс? Шмат людзей заблытацца спробаў. Няма? Нарэшце, кадавання Хафман. Кадаваньне Хафман вельмі карысна для эканоміі памяці і сціскаць тэкставыя файлы, толькі таму, што шмат раз вы выкарыстоўваеце 'A' і 'е', напрыклад, ў вашых дакументах, але я не ведаю, калі вы, хлопцы, выкарыстоўваць 'Q' ці 'Z', як шмат. Маючы ўсяго ў 1 байт для кожнага персанажа, кожны - у 256 знакаў, якія мы маем у табліцы ASCII не вельмі аптымальным, толькі таму, што ёсць некаторыя сімвалы, якія вы выкарыстоўваеце многае іншае, так што вы, верагодна, варта выкарыстаць менш памяці для тых. Як я магу выкарыстоўваць кадаваньне Хафман? Мы павінны зрабіць дрэва Хафман.  Дрэва Хафман мае вузлы што ёсць сімвал, які збіраецца быць падобным, 'а', 'б', 'C', лісты, што ліст у вас ёсць, частата, частата, якая з'яўляецца слова ў тэксце, што вы стваралі дрэва Хафман для, а затым вузел, які будзе паказваць на злева ад дрэва Хафман і іншай вузел, які будзе паказваць на справа. Гэтак жа, як дрэва. Як вы будуеце дрэва Хафман? Вы збіраецеся выбраць 2 вузла, якія маюць самыя нізкія частоты. Калі ў вас ёсць гальштук вы збіраецеся выбраць 2 вузла якія маюць самыя нізкія значэнні ASCII, а таксама. Тады вы збіраецеся стварыць новае дрэва з тых 2 вузлоў што будзе мець камбінаваны частату ў бацькоўскай вузле. А потым вы хочаце сцерці 2 дзяцей з лесу і замяніць іх бацькоў. І вы збіраецеся паўтарыць, што, пакуль вы толькі не маюць 1 дрэва ў лесе. Такім чынам, давайце паглядзім, як вы маглі б зрабіць дрэва Хафман для ZAMYLA. Тут можна ўбачыць, што ўсе літары маюць частату 1 для 'A', акрамя; што мае частату 2. Так што я стварыў вузлы для ўсіх лістоў, якія я прыводзяць у парадак кошту і частаце ASCII. Так што, калі я хачу стварыць першае дрэва, ён будзе з 'L' і 'M'. Так што гэта тут. Частата пары будзе два таму што гэта 1 + 1, то наступны 2 з самымі нізкімі частотамі з'яўляюцца 'Y' і 'Z'. А то ў мяне ўсё з іх - маюць частату 2. Дык якія з іх з'яўляюцца тыя, якія маюць найменшае значэнне ASCII для наступнага? «А» і «L». Так што я стварыць новы вузел, І, нарэшце, гэта 4 і 2, таму 2 будзе злева. І гэта дрэва Хафман. Тады, калі я хачу напісаць тэкст, як у двайковым, каб пераўтварыць у тэкст, выкарыстоўваючы дрэва Хафман вельмі лёгка. Напрыклад, калі я кажу, што рухаючыся налева з'яўляецца 0 і рухаецца направа з'яўляецца 1, Што гэта будзе ўяўляць? Бо 1, 1, так правільна, правільна, і затым 0, так што засталося б L, а затым 1, 0, 0. Так 1, 0, так што проста 1, 0, 'А'. І тады 0, 1, так 'Z'. А потым 1, 0, 0 - не. 0, 0, 'Y', так Гультай. Так што ўсё для мяне, Роб збіраецца ўзяць на сябе. [Роб Боуден] Такім чынам, тыдзень 7 матэрыял. У нас ёсць шмат, каб перайсці вельмі хутка. Бітаў аперацыі, перапаўненне буфера, Бібліятэка CS50, то HTML, HTTP, CSS. У як ад 15 да 20 хвілін. Бітаў аперацыі. Ёсць 6 з іх, што вам трэба ведаць. Бітаў і, пабітавае АБО, якое выключае АБО, зрух налева, зрух направа, а не. Зрух направа, а не вы толькі бачылі ў лекцыі наогул. Мы пойдзем па ім хутка тут, але гэта добра, каб ведаць, што гэта 6, што існуе. Памятаеце, што бітаў аперацыі, як, калі вы робіце 3 + 4. Вы не маеце справу з бінарнымі 3 і 4. З пабітава аператараў вы на самой справе маем справу з асобнымі бітамі лікаў 3 і 4. Так першае, што мы будзем казаць пабітава няма, і ўсё гэта робіць фліп ўсе біты. Дык вось, калі вы пішаце гэта ў C, вы б не напісаць яго як ~ 11011 або любы іншы, можна было б напісаць гэта падабаецца ~ 4, і то было б перавярнуць бінарнае ўяўленне 4. Дык вось, ~ некаторага двайковага ліку 1101101 збіраецца дакладна перавярнуць усё 1 да 0 і ўсё 0 да 1 ст. Як я кажу, што, частае выкарыстанне гэтага і мы ўбачым яго ў трохі, гэта, як мы хочам, каб прыдумаць нейкі колькасці дзе ўсе біты роўныя 1, для аднаго з іх, за выключэннем. Так што гэта, як правіла, лягчэй выказаць колькасць дзе толькі што адзін біт усталяваны, а затым ўзяць ~ яго, такім чынам, кожны сябра усталяваны біт для гэтай выключэннем аднаго. Дык вось тое, што мы збіраемся выкарыстаць больш у няшмат. Пабітава або. Вось 2 двайковыя лікі, і гэтыя 2 лічбы даволі прадстаўнічым, так як яны прадстаўляюць усе магчымыя Спалучэнне біт вам можа спатрэбіцца для працы на. Пры гэтым, калі я or'd кожны біт, мы толькі збіраемся параўноўваць прама ўніз. Такім чынам, на левай баку мы маем адзін і 1. Калі я пабітавае | тых, што я збіраюся атрымаць? Адзін. Тады пабітавае | 0 і 1 збіраецца даць мне? Адзін. Бітаў 1 і 0 будзе тое ж самае, адзін. Бітаў 0 | 0 збіраецца даць мне 0. Такім чынам, адзіны выпадак, калі я атрымліваю 0 знаходзіцца ў 0 | 0 так. І вы можаце думаць аб тым, што так жа, як вашыя лагічныя ПРС. Так што калі вы думаеце, што з 1 як праўдзівы і 0 як ілжывы, тое ж самае дастасавальна і тут. Так праўда ці праўда, то праўда, праўду або ілжыва гэта праўда. Хлусня ці праўда, то праўда; хлусня ці хлусня гэта адзінае, што на самой справе ілжывае. Вось прыклад, які вы павінны ведаць, як даволі добры прыклад, калі бітаў аператары выкарыстоўваюцца. Вось калі б мы ці капіталу "А" з OX20, і мы будзем глядзець на іх праз секунду, мы атрымліваем нешта. І калі мы ці маленькая'' з OX20, мы атрымліваем нешта. Так што давайце падцягнуць табліцу ASCII. Добра. Тут мы бачым, што «А» з'яўляецца - тут мы маем «А» з'яўляецца дзесятковай 65. Але я пайду з шаснаццатковым, які Ox41. Упэўнены, што мы бачылі яго ў класе. Я думаю, што мы бачылі яго ў класе што гэта даволі лёгка канвертаваць з шаснаццатковай ў двойкавую. Дык вось, калі я хачу паставіць 4 у двайковы, вось толькі будзе 0100. Гэта 1 у названае месца, 2 у названае месца, 4 у названае месца, так што гэта 4. Тады я магу падзяліць 1 у двайковы, які збіраецца быць 0001. І такім чынам, гэта будзе прадстаўленне «А» ў двайковым выглядзе. Прымаючы ніжні рэгістр 'а', то цяпер збіраецца быць Ox61, дзе, падзяліўшы гэтыя ўверх у яго двайковы, таму 6 - Давайце на самай справе гэта зрабіць - ці няма гумка? Гумка. Ox61. Так падзяліўшы 6 у двайковы будзе 0 + 4 + 2 + 0. І расшчапленне 1 будзе 0001. Гледзячы на ​​розніцу паміж гэтымі 2, мы бачым, што адзіная розніца паміж маленькай і вялікай 'А' гэта адзін біт. Так вяртаючыся да тут - усё ў парадку. Вяртаючыся да тут, калі мы паглядзім на тое, што крыху OX20 з'яўляецца, так расшчапленне OX20 ў яго двайковы, з'яўляецца 0010, 0000. OX20, адзіны біт, які усталёўваецца гэта крыху, што мы маем справу з, з пераключэннем паміж капіталам і ніжні рэгістр 'A'. Калі я або «А», які з'яўляецца гэты, «А», калі я ці "А" з OX20, што я збіраюся атрымаць? [Студэнт, неразборліва] маленькая 'а', таму што ён збіраецца перавярнуць гэты біт ў 1. І калі я ці "а" з OX20, што я збіраюся атрымаць? Ніжнім рэгістра, таму што як раз Öring «а» з OX20, Я проста хачу, каб быць Öring гэты адзін біт на 1, гэта ўжо 1, так што гэта не мае значэння. Такім чынам, мы атрымліваем 'A' і 'A'. Пабітава і. Зноў жа, мы можам лічыць, што гэта наш лагічнага і калегам. З левага боку ў нас ёсць праўда і праўда. Гэта збіраецца быць праўдай, і для ўсіх выпадкаў, хлусня і праўда ці праўда і хлусня, ці хлусня і хлусня, ні адна з гэтых рэчаў не дакладныя. Такім чынам, што мы ў канчатковым выніку атрымаць 1000. Так што цяпер, вось, вось дзе я выкарыстаў верны пабітавае няма, дзе ў нас былі OX20. Так што гэта OX20. Цяпер тое, што я хачу зрабіць, пабітавае ~ з OX20. Гэта збіраецца перавярнуць усё біты. Так што ў мяне 1101, 1111. І так «А» аперацыя AND з ~ OX20 збіраецца даць мне тое, што? Адзіная частка мы сапраўды павінны думаць пра тое, на гэты раз, так, калі ўсе гэтыя біты ўсталёўваюцца ў 1, затым мы збіраемся, каб атрымаць менавіта тое, што «А» быў, за выключэннем, можа быць, тое, што гэты біт. Таму што, калі гэта быў 1, зараз ён збіраецца быць усталяваны на 0, таму што гэта, аперацыя AND з гэтым будзе 0. Так што ж такое "А" і ~ OX20 збіраюся даць мне? [Студэнты адказаць, неразборліва] А што такое "а" і - гэта "А". А што такое "а" і ~ OX20 збіраюся даць мне? 'А.' Паколькі гэта ў цяперашні час 1. Андинг з гэтым +0 збіраецца зрабіць гэта 0, і зараз мы збіраемся, каб атрымаць 'A'. Абодва ',' і не ў апошнюю чаргу гэтага тыпу, у нас ёсць XOR. Гэта вельмі падобна або, акрамя гэта азначае выключна або. Гэта як тое, што вы звычайна думаеце, як і ў рэальным свеце. Такім чынам, вы выканаеце адно 'х' ці 'у', але не абодва. Тут 1 ^ 1 будзе 0. Таму што праўда, гэта - ён не працуе, а з лагічным сапраўдным і ілжывым як пабітавае & і ці зрабіць, але факт ^ дакладна няправільна. Таму што мы толькі хочам, каб вярнуцца дакладна, калі толькі адзін з іх дакладна. Так 1 ^ 1 0. А як наконт 0 ^ 1? Роўна 1. 1 ^ 0 роўна 1, 0 ^ 0: 0. Так пры любых абставінах, 0 пабітавае нешта 0 будзе 0. 1 пабітавае нешта 0 або 0 пабітавае 1, калі гэта | або ^, гэта будзе 1, а калі і гэта будзе 0. І адзіны выпадак, калі 1 пабітавае 1 ня 1 з эксклюзіўным або. Гэта 0110. Дык вось цяпер, выкарыстоўваючы XOR - так мы вярнуліся ў 20. "А" ^ OX20 гэтыя 2 біта мы параўноўваем. Так 1 ^ 0 збіраецца даць мне што? Адзін. "А" ^ OX20 збіраецца даць мне? Ніжнім рэгістра. 'А' ^ OX20 збіраецца даць мне? Капітал А. Таму што ўсе, што гэта робіць, гэта аперацыі XOR з OX20 эфектыўна гартаць усе гэты біт. Калі гэта 0, то цяпер збіраецца стаць 1. Так як гэта 1, 1 ^ 1 роўны 0. Такім чынам, наш «а» стала «А», і наш «А» стаў «а». Так XOR з'яўляецца сапраўды зручным спосабам проста гартаць справа. Вы проста хочаце перабраць радок літар і чаргаваць справа кожнага асобнага персанажа, вы проста XOR ўсё з OX20. Цяпер мы пакінулі зрух. Зрух налева проста будзе, у асноўным, націснуць ўсе нумары ў, або налева, а затым устаўце 0 за імі. Так вось у нас 00.001.101. Мы збіраемся, каб падштурхнуць 3 0 у праход па правай, і мы атрымліваем 01.101.000. У небинарных кропкі, мы бачым, што, што на самой справе справу 13 левай Зрушэнне 3, што дае нам 104. Так левы зрух, мы бачым тут, х << у ў асноўным х * 2 ^ у. 13 * 2 ^ 3, 2 ^ 3 8, так што 13 * 104 8. Калі вы проста думаеце пра двайковым наогул, як кожнай лічбы, калі зыходзіць з правы, гэта ў 1 у названае месца, то ў 2 названае месца, то ў 4 у названае месца. Так, націснуўшы на 0-х гадоў па правым флангу, мы проста штурхае рэчы, якія былі ў 4 у месцы з 8 па месцы, і рэчы, якія былі ў 8 у месцы, каб у 16 ​​свайго месца. Кожная змена проста памнажае на 2. Да? [Студэнт] Што адбудзецца, калі вы перайшлі на 5? [Боуден] Калі вы зрушваецца на 5, вы проста страціце лічбы. Безумоўна, гэта адно і тое ж. Маўляў, цэлыя лікі толькі 32 біт, так што калі вы дадаць 2 сапраўды вялікія цэлыя лікі, ён проста не ўпісваецца ў цэлы лік. Так што гэта тое ж самае тут. Калі вы перайшлі па 5, мы б проста страціць, што адзін. І гэта накшталт таго, што я маю на ўвазе "прыкладна" , Дзе, калі вы пераносіце занадта далёка, вы губляеце біты. Зрух направа будзе наадварот, куды мы ідзем засунуць 0-х ад канца, і для нашых мэтаў, запоўніце 0 з левага. Так рабіць гэта, мы ў асноўным назад тое, што мы ўжо зрабілі. І мы бачым, што тры 0 аб праве толькі адвалілася, і мы падштурхнулі 1101 усё да ўпора направа. Гэта робіць 104 3, які з'яўляецца, па сутнасці, х / 2 ^ у. Так што цяпер, тут, гэта падобная ідэя. Чаму гэта толькі прыкладна х / 2 ^ у, а не на самай справе х / 2 ^ у? Таму што, калі я зрушыўся на 4, я б страціў 1. У прынцыпе, што вы думаеце пра, проста думаю, цэлалікавага дзялення ў цэлым. Так што, як 5/2 складае 2. Гэта не 2.5. Гэта тая ж ідэя тут. Калі мы дзелім на 2, мы можам страціць няцотныя біты на гэтым шляху. Так што цяпер - вось гэта для пабітава. Вось і ўсё, што вам трэба ведаць. Запомніць прэцэдэнты, якія мы бачылі ў класе, як бітаў маска карысная для аператараў пабітава ці вы выкарыстоўваеце іх для бітавых масак. Загалоўныя літары і малыя літары, пераўтварэння з'яўляецца даволі Найпросты прыклад. Добра, так нападаў на перапаўненне буфера. Хто-небудзь памятае, што здарылася з гэтай функцыяй? Звярніце ўвагу, мы абвясцілі масіў 12 байт, 12 знакаў, а затым мы капіяваны ў нашу буфера 12 сімвалаў ўся штрых радок. Так у чым жа праблема? Магічнае лік 12 павінна ў значнай ступені неадкладна выскачыць як - чаму 12? Што рабіць, калі бар, здараецца больш за 12 сімвалаў? Што рабіць, калі бар мільёны герояў? Тут гаворка ідзе тетсру. Калі бар дастаткова доўга, гэта будзе проста цалкам - 'C', 'C' не хвалюе, што гэта было толькі 12 знакаў; 'З' не клапоціцца, што яна не можа змясціцца, што колькасць байтаў. Гэта будзе проста цалкам перапісаць Чары, 12 байт мы выдзеленыя для яго, і ўсё міма яго ў памяці, што на самой справе не належаць гэтаму буфера з тым, што радок бар. Так што гэта была карціна мы бачылі ў класе дзе ў нас ёсць наш стэк рос. Вы павінны быць выкарыстаны для гэтых карцін або азнаёміцца ​​з імі зноў. Мы наш стэк рос, адрасы памяці пачынаюцца з 0 на вяршыні і расці да падабаецца 4000000000 на дне. У нас ёсць масіў 'з' дзесьці ў памяці, то ў нас ёсць паказальнік на бар прама пад ім, а то ў нас гэты захаваны паказальнік кадра ў нашым зваротнага адрасу і стэк нашай мацярынскай руціны ст. Памятаеце, што ваш зваротны адрас? Гэта калі асноўны выклікае функцыянальны Фу, выклікае функцыянальны бар, непазбежна, бар аддачу. Таму, калі бар вяртаецца, яны павінны ведаць, што ён збіраецца вярнуцца да Foo, які выклікаў яе. Такім чынам, зваротны адрас з'яўляецца адрасам функцыі, што ён павінен вярнуцца ў калі функцыя вяртае. Прычына, па якой важна для нападаў перапаўнення буфера адбываецца таму, што, зручна, хакеры хацеў змяніць гэтую зваротны адрас. Замест таго, каб вяртацца да Foo, я збіраюся вярнуцца туды, дзе хакер хоча, каб я вярнуцца. І, зручна, дзе хакер часта хоча вярнуцца да з'яўляецца пачаткам буфера, які мы першапачаткова мелі. Так заўважыць, зноў жа, Little Indian. Прыбор з'яўляецца прыкладам Маленькая індыйскай сістэме, так цэлае або паказальнік захоўваецца з байтах ў зваротным парадку. Дык вось, мы бачым - гэта? Так. Мы бачым Ox80, OxC0, Ox35, OxO8. Памятаеце шаснаццаткавыя лічбы? Мы не звярнуць назад шаснаццаткавыя лічбы ў Little Indian, таму што 2 шаснаццаткавыя лічбы складаюць адзін байт, і мы памяняем байт. Вось чаму мы не захоўваем, як, 80530CO8. Мы захоўваем, замест гэтага, кожную пару 2 лічбы, пачынаючы справа. Гэты адрас паказвае на адрас пачатку нашага буфера, што мы на самай справе хацелі скапіяваць у у першую чаргу. Прычына, па якой карысна таму, што, што, калі зламыснік здарылася з, замест таго, радок, якая была проста Бяскрыўдны радок, як іх імя або нешта, што, калі замест, што радок былі толькі некаторыя адвольнага кода што зрабіў усё, што яны хацелі, каб гэта зрабіць? Такім чынам, яны маглі - я не магу думаць ні аб якім прахалодным кода. Гэта можа быць што заўгодна, усё ж. Любы катастрафічнымі код. Калі б яны хацелі, яны маглі б проста зрабіць нешта на сегментах няспраўнасцяў, але гэта было б недарэчы. Як правіла, яны робяць гэта, каб зламаць вашу сістэму. Добра. CS50 бібліятэка. Гэта, у асноўным, GetInt, GetString, усе гэтыя функцыі мы падалі для вас. Таму ў нас ёсць сімвал * радок, і гэта абстракцыя, што мы садзьмуў ў нейкі момант падчас семестра. Памятаеце, што радок проста масіў знакаў. Дык вось мы бачым скарочаны версію GetString. Вы павінны азірнуцца на яго, каб успомніць, як гэта на самай справе рэалізуецца. Асноўныя дэталі, звярніце ўвагу мы атрымліваем у адзін знак за адзін раз ад стандартных ў, якая як бы нам набраўшы іх з клавіятуры. Так адзін сімвал за адзін раз, і калі мы атрымаем занадта шмат сімвалаў, таму, калі п + 1 больш магутнасці, то мы павінны павялічыць прапускную здольнасць нашага буфера. Дык вось мы падвойвае памер нашага буфера. І гэта працягвае ісці, мы ўставіць знак у нашу буфера пакуль мы не атрымаем новую лінію або канец файла або любы іншы, у гэтым выпадку, мы скончылі з радка, а затым рэальнай GetString сціскаецца памяць, як калі б мы выдзелена занадта шмат памяці ён будзе вярнуцца і садзяцца няшмат. Такім чынам, мы не паказваюць, што, але асноўная ідэя заключаецца ён павінен чытаць у адзін знак за адзін раз. Яна не можа проста прачытаць у цэлым рэч адразу, таму што іх буфер толькі пэўнага памеру. Такім чынам, калі радок, яна паспрабуе ўставіць у буфер занадта вялікі, то гэта было б перапоўніць. І вось мы прадухіліць гэта толькі чытанне ў адзін знак у той час, і расце, калі нам трэба. Так GetInt і іншыя бібліятэчныя функцыі CS50 як правіла, выкарыстоўваюць GetString у іх рэалізацыі. Так што я звярнуў увагу на важныя рэчы. Ён заклікае GetString, каб атрымаць радок. Калі GetString не вярнуўся памяць, памятаеце, што GetString mallocs нешта, таму, калі вы тэлефануеце GetString вы не павінны (неразборліва) бясплатна гэты радок, які вы атрымалі. Дык вось, калі яго не ўдалося Malloc нешта, мы вяртаемся INT_MAX проста як сцяг, які, эй, мы не былі на самай справе ў стане атрымаць цэлае. Вы павінны ігнараваць усё, што я вярнуся да вас, ці вы не павінны разглядаць гэта як правільны ўвод. Нарэшце, мяркуючы, што так атрымаецца, мы выкарыстоўваем Sscanf з тым адмысловым сцягам, што азначае, у першую адпавядаць цэлае, Затым адпавядаць любым сімвалаў пасля гэтага цэлага. Так заўважыце, што мы хочам, каб ён роўны 1. Так Sscanf вяртаецца колькі матчаў, калі паспяхова зрабіў? Гэта верне 1, калі яна паспяхова падабраныя цэлае, гэта верне 0, калі яна не адпавядае цэлае, і ён вернецца 2 калі яно адпавядае цэламу ліку ідуць некаторым характарам. Так заўважыце, што мы паўтарыць, наколькі мы падыходзім нічога, акрамя 1. Такім чынам, калі мы ўвайшлі 1, 2, 3, C, або 1, 2, 3, X, затым 1, 2, 3 будзе атрымліваць захоўваецца ў цэлае, X будзе атрымаць захоўваюцца на характар, Sscanf вернецца 2, і мы хацелі б паўтарыць, таму што мы толькі хочам цэлае. Хутка прадзьмуху HTML, HTTP, CSS. Мова разметкі гіпертэксту з'яўляецца структура і семантыка ў Інтэрнэце. Вось прыклад з лекцыі, дзе ў нас ёсць HTML-тэгі. У нас ёсць галавы тэгі, тэгі цела, у нас ёсць прыклады пустых тэгаў, дзе мы на самай справе не маюць пачатку і зачыняе тэг, мы проста павінны спасылку і малюнак. Там няма закрыцця тэг карцінкі; ёсць толькі адзін тэг, які выконвае ўсе тэг павінен рабіць. Сувязь з'яўляецца прыкладам; мы ўбачым, як Вы даяце спасылку на CSS, сцэнар з'яўляецца прыкладам таго, як Вы даяце спасылку на знешні JavaScript. Гэта даволі проста, і памятайце, HTML не з'яўляецца мовай праграмавання. Вось, памятаеце, як бы вы вызначыць форму або па крайняй меры тое, што гэта будзе рабіць? Такая форма мае дзеянне, і спосаб. Метады, якія вы толькі калі-небудзь бачыце, GET і POST. Так GET з'яўляецца версія, дзе рэч атрымлівае пакласці ў URL. POST, дзе не ставіцца ў URL. Замест гэтага любыя дадзеныя з формы ўстаўляецца больш схаваныя ў запыце HTTP. Дык вось, дзеянне вызначае, калі запыт HTTP ідзе. Дзе ён збіраецца гэта google.com / Пошук. Метад. Запомніць адрозненні паміж GET і POST, і, проста сказаць у якасці прыкладу, калі вы хочаце закладкі нечым. Вы ніколі не будзеце мець магчымасць усталяваць закладку на POST URL паколькі дадзеныя не ўключаны ў URL. HTTP, зараз, з'яўляецца пратакол перадачы гіпертэксту. Пратакол перадачы гіпертэксту, можна было б чакаць, што для перадачы Мова разметкі гіпертэксту, і гэта робіць. Але гэта таксама перадае любыя выявы, якія вы знойдзеце ў Інтэрнэце, любыя загрузкі вы робіце пачаць як запыце HTTP. Так HTTP проста мова World Wide Web. І тут трэба прызнаць гэты від запыту HTTP. Тут HTTP/1.1 на баку проста кажа, што гэта версія пратаколу я выкарыстоўваю. Гэта ў значнай ступені заўсёды будзе HTTP/1.1, як вы ўбачыце яго. Тады мы бачым, што гэта было GET, альтэрнатыва быць POST, што вы можаце ўбачыць. І URL, што я спрабаваў наведаць быў www.google.com/search?q = бла, бла, бла. Так што памятаеце, што гэта, знак пытання д = бла бла бла, з'яўляецца свайго роду матэрыял, які прадстаўляецца ў форме. Адказ можа вярнуцца да мяне б выглядаць прыкладна так. Зноў жа, пачынаючы з пратаколу, які збіраецца быць, што, затым код стану. Вось гэта 200 ОК. І, нарэшце, вэб-старонкі, што я на самой справе папрасіў рушыць услед. Магчымы код стану вы можаце ўбачыць, і вы павінны ведаць некаторыя з іх. 200 ОК вы, напэўна, бачылі раней. 403 Forbidden, 404 Not Found, Error 500 Internal Server , Як правіла, калі вы ідзяце на сайт і нешта не працуе або іх аварый PHP код, у той час як ў прыборы маем вялікі аранжавы прастакутнік што прыходзіць і кажа, быццам бы, нешта не так, гэты код не працуе або гэтая функцыя дрэнна. Звычайна вэб-сайты не хачу, каб вы, ведаючы, якія функцыі на самай справе дрэнна, так замест гэтага яны проста дам вам 500 Унутраныя памылкі сервера. TCP / IP з'яўляецца 1 пласт пад HTTP. Памятаеце, што існуе Інтэрнэт за межамі Сусветнай павуціны. Падобна гэтаму, калі вы гуляеце ў онлайн гульні, якая не праходзіць праз HTTP, гэта будзе праз іншага - яна па-ранейшаму з выкарыстаннем Інтэрнэту, але ён не выкарыстоўвае HTTP. HTTP з'яўляецца толькі адным з прыкладаў пратаколу пабудаваны на TCP / IP. IP літаральна азначае Internet Protocol. Кожны кампутар мае IP-адрас, яны гэтыя 4-значныя рэчы як 192.168.2.1, або што, то, як правіла, лакальны характар. Але гэта карціна з IP-адрасы. Такім чынам, DNS, Domain Name Service, гэта тое, што перакладае такія рэчы, як google.com да фактычнага IP адрасе. Так што калі вы ўведзяце, што IP-адрас у URL, што б прывесці вас да Google, але вы, як правіла не ўспамінаць гэтыя рэчы. Вы, як правіла, замест памятаць google.com. Апошняе, што мы маем, парты, дзе гэта TCP часткай IP. TCP робіць больш. Падумайце аб тым,, як, вы запусцілі вэб-браўзэра. Можа быць, у вас ёсць некаторыя якія працуюць прыкладання электроннай пошты, можа быць, у вас ёсць іншыя праграмы, якая выкарыстоўвае Інтэрнэт працуе. Усе яны маюць патрэбу ў доступе да сеткі Інтэрнэт, але ваш кампутар мае толькі 1 WiFi карты або любы іншы. Так парты так, што мы ў стане падзяліць як гэтыя праграмы могуць выкарыстоўваць Інтэрнэт. Кожны дадатак атрымлівае 1 пэўны порт, што ён можа слухаць на, і па змаўчанні, HTTP выкарыстоўвае порт 80. Некаторыя паштовыя службы выкарыстоўваюць 25. Тыя, нізкім нумарам, як правіла, абаронены. Вы, як правіла, у стане атрымаць больш высокім нумарам тыя для сябе. CSS, каскадныя табліцы стыляў. Мы стылі вэб-старонак з дапамогай CSS, а не з HTML. Ёсць 3 месцы, якія вы можаце змясціць свой CSS. Гэта можа быць убудаваным, паміж тэгамі стылі, або ў зусім асобным файле і затым звязаныя цалі А вось як раз прыклад CSS. Вы павінны прызнаць гэтую мадэль, дзе першы прыклад мы адпаведныя тэгі цела, і тут мы цэнтравання тэг цела. Другі прыклад, мы не саступаюць рэч з ID зносцы, і мы ўжываем некаторыя стылі да гэтага. Звярніце ўвагу, што ID Зноска выраўноўвае налева, у той час як цела тэкставыя выраўноўвае цэнтр. Footer знаходзіцца ўсярэдзіне цела. Гэта будзе, замест гэтага, выраўноўвання тэксту засталося, хоць цела кажа выраўноўвання тэксту цэнтр. У гэтым уся каскадных часткай. Вы можаце мець - можна паказаць стылі для цела, і тады ўсё ў арганізме можна паказаць больш канкрэтныя стылі, і ўсё гэта працуе, як вы чакаеце. Больш за канкрэтныя CSS спецификаторы маюць прыярытэт. Я думаю, што гэта ён. [Алі Нама] Прывітанне ўсім. Калі б я мог прыцягнуць вашу ўвагу. Я Алі, і я збіраюся прайсці праз PHP і SQL вельмі хутка. Такім чынам, мы можам пачаць. PHP з'яўляецца скарачэннем PHP: Hypertext Preprocessor. І, як вы ўсе павінны ведаць, што гэта на боку сервера скрыптовы мова, і мы выкарыстоўваем яго для задняй частцы вэб-сайтаў, і як яна робіць шмат вылічэнняў, з боку за кадрам. Сінтаксіс. Гэта не падобна на C, здзіўленне, здзіўленне. Гэта заўсёды павінна пачынацца з, калі вы бачыце, - я не магу рухацца наперад. Вы можаце бачыць, вам патрэбныя новыя віды брекетов, а затым вы таксама маюць патрэбу ў PHP?. Гэта заўсёды, як вы павінны сфармуляваць свой PHP тэкст, ваш код PHP. Таму ён не можа быць проста, як З, дзе вы, здаецца, пакласці яго ў першую чаргу. Вы павінны заўсёды атачаюць яго. А цяпер, маёр сінтаксіс, што ўсе зменныя павінны пачаць з знака $. Вы павінны зрабіць гэта, калі вы вызначаеце іх, вы павінны зрабіць гэта калі вы маеце на ўвазе да іх пазней. Вы заўсёды павінны, што $. Гэта ваш новы лепшы сябар, даволі шмат. Вы не - у адрозненне ад C, вам не трэба ставіць якую тыпу зменнай гэта. Такім чынам, хоць вы сапраўды маеце патрэбу ў $, вам не трэба ставіць, як, унутр х ці радок у, і гэтак далей, і гэтак далей. Так невялікая розніца. У выніку гэтага, гэта азначае, што РНР з'яўляецца слаба тыпу. PHP з'яўляецца слаба мова Тып, і ён слаба тыпізаваных зменныя. Іншымі словамі, гэта азначае, што вы можаце перамыкацца паміж рознымі відамі тыпаў зменных. Вы можаце захаваць свой нумар 1 у выглядзе цэлага ліку, Вы можаце захаваць яго ў выглядзе радка, і вы можаце захаваць яго як паплавок, і гэта ўсё будзе, што лік 1. Нават калі вы захоўваць яго ў розных формах, яна па-ранейшаму - тыпы зменных ўсё яшчэ трымаюць у рэшце рэшт. Так што, калі вы паглядзіце сюды, калі вы памятаеце з PSet 7, многія з вас, верагодна, былі праблемы з гэтым. Два знака роўнасці, 3 знака роўнасці, 4 знака роўнасці. Добра, няма 4 знака роўнасці, але ёсць 2 і 3. Вы можаце выкарыстоўваць два знака роўнасці для праверкі значэнняў. Ён можа праверыць па тыпах. Так што калі вы можаце бачыць на першым прыкладзе, У мяне ёсць num_int == num_string. Так што ваш унутр і ваша радок абодва, тэхнічна, 1, але яны розныя тыпы. Але для падвойных роўных, гэта будзе яшчэ прайсці. Тым не менш, для патройных роўных, ён правярае значэнне, а таксама розныя тыпы. Гэта азначае, што ён не збіраецца ў той другім выпадку тут, дзе вы выкарыстоўваеце 3 знак роўнасці, а не. Дык вось галоўнае адрозненне, што вы павінны ўсё паказалі цяпер. Аб'яднанне радкоў з'яўляецца яшчэ адным магутным, што вы можаце выкарыстоўваць у PHP. Гэта ў асноўным толькі гэты зручны кропкавай натацыі, і вось як можна прывязаць радкоў разам. Так што калі ў вас ёсць котка і ў вас ёсць сабака, і вы хочаце, каб пакласці 2 радкі разам, Вы можаце выкарыстоўваць перыяд, і гэта збольшага, як гэта працуе. Вы таксама можаце проста размясціць іх побач адзін з адным, як вы можаце бачыць тут, у ніжняй Напрыклад, дзе я рэха радок 1, прастору радок 2. PHP будзе ведаць, каб замяніць іх у якасці такіх. Масівы. Зараз, у PHP, ёсць 2 розныя віды масіваў. Вы можаце мець рэгулярныя масівы, і вы таксама можаце мець асацыятыўныя масівы, і мы збіраемся прайсці праз іх прама цяпер. Рэгулярныя масівы проста гэта ў C, і таму вы павінны індэксаў, якія пранумараваны. Зараз мы толькі збіраемся, каб стварыць адну і пакласці - так што гэта, як мы ствараем пусты масіў, то мы збіраемся пакласці ў індэкс колькасці 0. Мы збіраемся паставіць нумар 6, значэнне 6. Вы можаце бачыць гэта на дне тут. Where's - у з парадкавым нумарам 1, мы збіраемся паставіць значэнне нумар 4, і таму вы можаце ўбачыць, што ёсць 6, ёсць 4, а затым, як мы друку рэчы, калі мы спрабуем і раздрукаваць значэння з індэксам колькасці 0, тады мы ўбачым значэнне 6 яго раздрукоўкі. Крута? Дык вось рэгулярныя масівы для вас. Іншым спосабам вы можаце дадаць рэчы звычайных масіваў зараз што вы можаце проста дадаць іх у канцы. Гэта азначае, што вам не прыйдзецца паказваць канкрэтны індэкс. Вы можаце ўбачыць нумар, а затым у квадратных дужках няма паказаны індэкс. І ён будзе ведаць, - PHP будзе ведаць, каб проста дадаць яго ў канец спісу, наступнага вольнае месца. Такім чынам, вы можаце ўбачыць 1 тут жа у той 0 месцы, 2 пайшоў тут жа ў першым месцы. 3 ідзе - дадаецца там жа. Так што выгляд мае сэнс. Ты проста пастаянна дадаваць яго, а потым, калі мы паўтараючы індэкс колькасці 1, ён выдасць значэнне 2. Тады ў нас ёсць масівы, якія з'яўляюцца асацыятыўныя масівы. Асацыятыўныя масівы, замест таго, лікавыя індэксы, што яны робяць, яны маюць індэксы, якія па радку. Вы можаце бачыць, замест таго, каб - я пазбавіўся ад усіх гэтых лікавых індэксаў, і зараз гэта ключ1, ключ2, ключ3, і яны ў падвойныя двукоссі, каб паказаць, што яны ўсе радкі. Так мы можам мець прыклад гэтага. Прыкладам гэтага з'яўляецца тое, што ў нас ёсць TF, і гэта імя азначніка. Мы збіраемся паставіць "Алі" у якасці імя, на індэкс, калорыі з'едзены, мы можам пакласці цэлалікавых гэты раз замест радка, , А затым у індэксных любіць, мы можам пакласці ўвесь масіў ўнутры яго. Так што гэта свайго роду - гэта аналагічная канцэпцыя таго, як мы павінны былі індэксы з нумарамі, але зараз мы можам змяніць індэксы вакол мець іх як радкі, а не. Вы таксама можаце зрабіць гэта, акрамя ўсяго рабіць гэта індывідуальна, Вы можаце зрабіць усё гэта ў адным кавалку. Такім чынам, вы можаце бачыць, што TF гэтага масіва, і тое пакладзем іх у адну гіганцкую квадратнага набор кранштэйнаў. Так што можа паскорыць працэс. Гэта хутчэй стылістычны выбар, чым няма. У нас таксама ёсць завесы. У C мы маем завесы, якія працуюць, як гэта. У нас быў наш масіў, і мы пайшлі з індэксам 0 ў канцы спісу, і мы друкуем усё гэта, ці не так? Акрамя праблема, для асацыятыўных масіваў, мы не абавязкова ведаць гэтыя лікавыя індэксы таму што цяпер у нас ёсць малыя індэксы. Цяпер мы выкарыстоўваем FOREACH завесы, якія, зноў жа, вы, спадзяемся, што выкарыстоўваюцца ў PSet 7. Foreach завесы будзе проста ведаю, кожны частка спісу. І гэта не абавязкова павінен дакладна ведаць лікавы індэкс, што ў вас ёсць. Так у вас ёсць сінтаксіс Еогеасп, так што гэта Еогеасп, вы паклалі масіў. Так што мой масіў называецца PSET, а затым, слова як, а затым вы пакладзеце гэты лакальны часовую зменную, што вы збіраецеся выкарыстоўваць толькі для канкрэтнай рэчы, што адбываецца правесці канкрэтны - адзін асобнік або адна частка масіва. Pset піт правядзе 1, а затым, можа быць, будзе ўтрымліваць нумар 6, , А затым ён будзе ўтрымліваць нумар 2. Але гэта гарантавана прайсці кожны адно значэнне, гэта ў масіве. Карысныя функцыі, якія вы павінны ведаць у PHP з'яўляюцца патрабуюць, так што робіць ўпэўненыя, што вы ў тым ліку пэўныя файлы, рэха, выхад, пусты. Я настойліва рэкамендую вам паглядзець на PSet 7 і паглядзець на гэтых функцый. Магчыма, вам прыйдзецца ведаць тых, так што я дакладна ведаю, будзе тое, што, уласна, тыя, усё робяць. А зараз мы збіраемся прайсці праз рамкі вельмі хутка. У рамках, PHP з'яўляецца свайго роду фанкі рэчы, у адрозненне ад C, і так мы толькі збіраемся прайсці праз гэта хутка. Так скажам, мы пачынаем у гэтым стрэлкі, што ў нас ёсць. І мы збіраемся пачаць з $ я. Такім чынам, пераменная 'я' будзе 0, і мы толькі збіраемся працягваць друкаваць яго ў гэтай вялікай белай скрынцы там. Мы збіраемся пачаць з i0, а затым мы збіраемся паўтарыць яго. Такім чынам, ёсць 0. А потым мы збіраемся павялічваць яго на цыкл, , А затым ён будзе значэнне 1. Адзін менш 3, таму ён збіраецца прайсці праз гэта цыкл, і тады мы ўбачым яго зноў надрукаваныя. Мы збіраемся павялічыць яго зноў да 2, і 2 менш 3, таму ён пройдзе цыкл, і ён будзе друкаваць 2. Тады вы заўважыце, што 3 не менш як 3, таму мы вырвацца з цыклу. Так што цяпер мы выйшлі, а затым мы збіраемся ісці ў спыненне функцыі. Добра. Такім чынам, вы павінны адзначыць, што гэта зменная, якую мы стварылі, "Я" зменнай, ня лакальнай вобласцю бачнасці. Гэта азначае, што яно не з'яўляецца лакальным ў пятлю, і што пераменная, якую мы да гэтага часу могуць атрымаць доступ і змяніць пасля, і яна па-ранейшаму будзе эфектыўным. Так што, калі вы ідзяце ў функцыю зараз, вы ўбачыце, што мы таксама выкарыстоўваем "Я" зменную, і мы збіраемся, каб павялічыць 'я' + +. Можна было б падумаць, па-першае, на аснове C, што гэта копія «Я» зменнай. Гэта зусім розныя рэчы, што з'яўляецца правільным. Таму, калі мы друкуем яго, мы збіраемся надрукаваць 'я' + +, які будзе друкаваць, што 4, а затым мы збіраемся - прабачце. Тады мы збіраемся ў канчатковым з гэтай функцыі, і мы збіраемся быць там, дзе, што стрэлка знаходзіцца цяпер. Гэта азначае, што тое, тым не менш, нават калі функцыя змянілі значэнне "Я", гэта не змяніла за межамі функцыі, таму што функцыя мае асобны аб'ём. Гэта азначае, што, калі мы рэха 'я', яна не змянілася ў вобласці дзеяння функцыі, і так, то мы збіраемся надрукаваць 3 раз. Розныя рэчы пра рамкі ў PHP, чым у С. Зараз у PHP і HTML. PHP выкарыстоўваецца, каб зрабіць вэб-старонкі дынамічнымі. Гэта збольшага робіць рэчы розныя. У нас ёсць яго адрозненне ад HTML. З HTML, мы заўсёды толькі маюць той жа статычны рэч, як тое, як Роб паказаў, у той час як PHP, вы можаце змяніць рэчы на ​​аснове, кім з'яўляецца карыстальнік. Так што, калі ў мяне ёсць гэта, я, "Вы ўвайшлі як -" а затым імя, і я магу змяніць імя. Так што цяпер клічуць Іосіф, і ў яго ёсць "пра мяне", але тады я магу таксама змяніць імя, каб мець Томі. І гэта была б іншая справа. Так тады мы можам таксама змяняць розныя рэчы пра яго, і ён пакажа рознае ўтрыманне на аснове імя. Такім чынам, PHP можа збольшага змяніць тое, што адбываецца ў вашым сайце. Тое ж самае тут. Тым не менш, звярніце ўвагу, што ў іх ёсць розны кантэнт, нават калі вы тэхнічна ўсё яшчэ доступ да гэтай жа вэб-старонку на паверхні. Стварэнне HTML. Ёсць 2 розных спосабаў, якімі вы можаце зрабіць гэта. Такім чынам, мы пройдзем гэта прама цяпер. Першы спосаб, у вас ёсць - так, шкада. Такім чынам, вы проста павінны вашай звычайнай для завесы ў PHP, і тады вы рэхам у PHP, і вы рэха з HTML. Выкарыстоўваючы тое, што Роб паказаў вам з HTML сцэнара а затым з дапамогай PHP друк, каб проста раздрукаваць яго на вэб-старонку. Альтэрнатыўны спосаб, каб рабіць гэта як калі б вы вылучыць на PHP і HTML. Такім чынам, вы можаце мець лінію PHP, які пачынаецца цыкл, то вы можаце мець лінію HTML ў асобным рэчы, а затым вы ў канчатковым пятлю, зноў жа, з PHP. Так што гэта свайго роду падзелу яго. З левага боку, вы можаце, што ў вас ёсць усё - гэта проста 1 кавалак PHP. Справа вы можаце бачыць, што ў вас ёсць лінію PHP, ў вас ёсць лінію HTML, і ў вас ёсць лінію PHP зноў. Так падзелу яго ў тое, што яны робяць. І вы заўважыце, што ў любым выпадку, для любога з іх, яны па-ранейшаму раздрукаваць малюнак, вобраз, выява, так што HTML-ранейшаму друкуецца такім жа чынам. А потым вы ўсё роўна ўбачыце 3 малюнка з'яўляюцца на вашым сайце. Так што гэта 2 розныя спосабы рабіць тое ж самае. Цяпер у нас ёсць формы і запыты. Як Роб паказаў вам, Ёсць формы HTML, і мы як раз вецер праз гэта. У вас ёсць дзеянне і ў вас ёсць метад, і вашы дзеянні выгляд паказвае вам, дзе вы збіраецеся адправіць яго, а метад, ці з'яўляецца ён збіраецца быць GET або POST. І запыт GET, як сказаў Роб, азначае, што вы збіраецеся пакласці яго ў выглядзе і вы ўбачыце яго як URL, у той час як запыт POST, вы не ўбачыце ў URL. Так невялікая розніца. Тым не менш, адна рэч, якая нешта падобнае з'яўляецца тое, што POST і GET ў роўнай ступені небяспечна. Такім чынам, вы можаце думаць, што толькі таму, што вы не бачыце яго ў URL, гэта азначае, што POST з'яўляецца больш бяспечным, але вы ўсё яшчэ можаце ўбачыць гэта ў тваіх печыва ў інфармацыі, вы пасылаеце. Так што не думаю, што аб адным або сябрам. Іншая справа, варта адзначыць, што ў вас таксама ёсць раздзел зменных. Вы, хлопцы выкарыстоўвалі гэта ў PSet 7, каб атрымаць ідэнтыфікатар карыстальніка інфармацыю. Здарылася так, што вы можаце выкарыстоўваць гэты асацыятыўны масіў, $ _SESSION, А затым вы зможаце атрымаць доступ да розных рэчы і захоўваць розныя рэчы па старонках. Апошняя справа, што ў нас ёсць SQL, Structured Query Language, і гэта мова праграмавання для кіравання базамі дадзеных. Што, уласна, ўяўляюць сабой базы дадзеных? Яны калекцыі табліц, і кожная табліца можа мець падобныя віды аб'ектаў. Так у нас быў стол карыстальнікаў у вашай фінансавай PSet. І чаму яны карысныя? Таму што гэта спосаб пастаяннага захоўвання інфармацыі. Гэта спосаб адсочвання рэчы і кіраванне рэчы і на самай справе бачым яго на розных старонках і адсочванне. У той час як, калі вы проста захоўваць яго ў то аднаго непасрэднай момант а затым выкарыстоўваць яго пазней, вы не зможаце атрымаць доступ да ўсё, што вы захавалі. У нас ёсць 4 асноўныя рэчы, якія мы выкарыстоўваем для каманд SQL. У нас ёсць выбіраць, ўстаўляць, выдаляць і абнаўлення. Тыя, якія сапраўды важныя для вас, хлопцы ведаюць, для вашага віктарыны. Мы хутка перайсці абярыце прама цяпер. У прынцыпе, вы выбару радкоў з базы дадзеных. Так што калі ў вас ёсць, прама тут - у нас ёсць гэтыя 2 розныя рэчы, і мы хочам, каб выбраць з табліцы класаў дзе дзіўным - дзе ў дзіўным калонцы значэнне роўна 1. Такім чынам, вы можаце бачыць тут, у нас ёсць гэтыя 2 рэчы імя класа, CS50 і Stat110, і ў нас ёсць коды класаў і лозунг. Таму мы хочам, каб выбраць усе, што інфармацыя. Тады вы можаце ўбачыць прама тут, што гэта збольшага выбіраючы з гэтай дзіўнай калонцы, дзе ўсе рэчы 1, а затым яна мае ідэнтыфікатар класа, імя класа і лозунг, што ён можа выбраць з. Як менавіта вы будзеце рабіць гэта ў кодзе? Вы павінны выкарыстоўваць PHP. Так што накшталт як PHP і SQL звязаны адзін з адным. Цяпер у нас ёсць наш код, і мы збіраемся выкарыстоўваць нашу функцыю запыту як мы рабілі ў PSet 7, і мы збіраемся запусціць SQL запыт. Тады мы будзем мець - мы заўсёды павінны праверыць, калі тройка роўная Роу калі фальшыва. Такім чынам, яшчэ раз, вы хочаце праверыць тып і значэнне, а затым, калі ён не працуе, то вы хочаце, каб папрасіць прабачэння, як звычайна, як мы рабілі ў PSet 7. У адваротным выпадку, вы хочаце перабраць усе з тымі зручна Еогеасп завесы, што мы проста перайшлі. Цяпер, калі мы прабягаем па і мы зрабілі гэта ў мінулым, давайце выкажам здагадку, што наш запыт прайшоў, зараз у нас ёсць цыкл па кожнаму элементу. І першая радок мае, так што вось радок, прама тут, гэта ў скрынку. Гэта збіраецца раздрукаваць ўсю інфармацыю, якую ён атрымаў. Дык гэта будзе раздрукаваць на дне "Хочаш даведацца HTML?" Тады гэта будзе перайсці да наступнага шэрагу, таму што яна завершана першая цыкл, і так, то гэта будзе раздрукаваць другі радок ёй, які будзе STAT110, Знайсці ўсе моманты. І яшчэ адно знаходзіцца на SQL уразлівасцяў. Я ведаю, Дэвід закрануў гэтага трохі ў лекцыі. Вы можаце прачытаць гэта пазней. Гэта сапраўды пацешна. SQL-ін'екцыя з'яўляецца свайго роду складаная рэч. Давайце выкажам здагадку, што вы проста прытрымлівацца гэтых зменных прама ў вашым запыце, як вы можаце бачыць у гэтым першай лініі. Так што, падобна выдатна, ці не так? Вы проста пакласці ў імя карыстальніка і пароль у ваш запыт, і вы хочаце грузіць яго і атрымаць тое, што знаходзіцца ў табліцы дадзеных. Гэта здаецца даволі простым. Так што давайце казаць хтосьці кладзе ў, для пароля, гэта ці тэкст прама тут - павінны на самай справе быць у чырвонай скрынцы. Так скажам, што яны ўкладаюць у гэты пароль - гэта тое, што яны ўваходзяць. Так яны змяшчаюць або "1" = 1. Выгляд дурной пароль, каб мець. Зараз давайце проста замяніць яго, і вы заўважыце, што ў гэтым SQL-запыт, цяпер, ён ацэньвае заўсёды дакладна, таму што вы заўважыце, што Вы можаце SQL запытаў выберыце ўсю гэтую інфармацыю ці вы можаце проста ёсць 1 = 1. Так што заўсёды будзе ацаніць да ісціны. Гэта не будзе па-сапраўднаму працаваць, таму што гэта азначае, што хакер можа ўзламаць вашу сістэму. Рашэнне гэтай праблемы з'яўляецца тое, што вы павінны выкарыстоўваць сістэму PDO, Гэта азначае, што вы павінны выкарыстоўваць пытальныя знакі, што і вы, хлопцы, якія выкарыстоўваюцца ў PSet 7, дзе вы збіраецеся выкарыстоўваць пытальнік на месцы, дзе вы хочаце, каб пакласці што-то, і тады вы будзеце мець коску, а затым вы будзеце мець пасля гэтага, пасля радка, розныя зменныя, якія вы хочаце замяніць у ваш знак пытання. Такім чынам, вы будзеце адзначыць, што зараз у мяне ёсць гэтыя чырвоныя пытальныя знакі. Тады я паклаў зменныя пасля маіх радкоў так што я ведаю, каб замяніць іх у такім парадку пасля гэтага. Гэта дазволіць пераканацца, што калі хто-то робіць гэта, як гэта, і ў іх ёсць ці 1 = 1 сітуацыю, што будзе пераканацца, ў задняй часткі, пераканайцеся, што ён не будзе на самой справе зламаць SQL запыт. Добра, такім чынам, што ў значнай ступені ён, віхор PHP і SQL. Поспехі ўсім вам, і цяпер, каб штат Арэгон [Oreoluwatomiwa Babarinsa] Добра ўсё. Час перайсці некаторы наяўнасць і некаторыя іншыя рэчы вельмі хутка, таму мы не трымаць вас сёння ўвечары. JavaScript. Так. JavaScript з'яўляецца своеасаблівай прахалодным рэчы, нібыта. Тое, што вы сапраўды павінны ведаць аб JavaScript, гэта накшталт як на баку кліента канец таго, што ваш вэб-дадатак будзе рабіць. Там-то рэчы, якія вы проста не хочаце, каб клапаціцца аб ўвесь час на боку сервера. Усе маленькія ўзаемадзеяння, падкрэсліўшы адно, што робіць нешта знікае. Вы сапраўды не хочаце, каб пагаварыць з вашым серверам ўвесь час для гэтага. І некаторыя, што нават не ўяўляецца магчымым зрабіць на боку сервера. Вось чаму мы павінны нешта накшталт JavaScript. Прахладны рэчы пра JavaScript: Ён дынамічна тыпізаваных. Што гэта азначае, што ваша праграма не трэба ведаць што менавіта зменныя, калі вы пішаце яго. Гэта будзе проста свайго роду зразумець гэта, як гэта працуе. Іншыя рэчы, якія выдатна аб гэтым: Гэта кучаравыя мова дужкі, гэта азначае, што сінтаксіс падобны на З і РНР. Вы не павінны рабіць шмат пераробак, калі вы вучыцеся JavaScript. Тут у нас ёсць трохі JavaScript. Цікавая рэч прама тут у тым, што, калі вы паглядзіце на яе, у нас ёсць трохі JavaScript тут жа ў галаве тэгі. Што такое робіць, у асноўным проста ўключыць файл JavaScript. Гэта адзін са спосабаў вы можаце ўключыць JavaScript ў вашу праграму. Тады другі крыху на самай справе некаторыя убудаваныя JavaScript, вельмі падобна на убудаванага стылю з CSS, і вы проста пісаць код вельмі хутка там. JavaScript мае масівы. Проста яшчэ адзін спосаб захаваць дадзеныя вакол, вельмі карысна. Вельмі прыемна і лёгка сінтаксіс. Вы можаце выкарыстоўваць квадратныя дужкі для доступу усё і трымаць усё разам. Нішто не занадта складаным. Самае выдатнае JavaScript і скрыптовых моў у цэлым з'яўляецца тое, што вам не прыйдзецца турбавацца аб памерах масіва. Вы можаце проста выкарыстоўваць array.length і адсочваць яго, а таксама масіў можа расці або памяншацца, як вам гэта трэба. Такім чынам, вы нават не трэба турбавацца аб якіх-небудзь, о не, мне трэба вылучыць больш рэчаў, або што-небудзь у гэтым родзе. Выдатная рэч у тым, што JavaScript мае тое, што называецца аб'екты. Гэта аб'ектна-арыентаваная мова, так што ён, па сутнасці, спосаб для вас для групоўкі дадзеных разам, чымсьці нагадвае на структуру, але вы можаце атрымаць доступ да яго, як структуры або ў сінтаксісе асацыятыўнага масіва. Гэта даволі проста, а што вы можаце зрабіць з гэтым група дадзеных разам калі ў вас ёсць куча дадзеных, што звязана. Таму што гэта ўсё рэчы, якія трэба апісаць аўтамабіль, Вам не трэба мець яго ў кучу розных месцах. Вы можаце проста прытрымлівацца яго ў 1 аб'екта ў JavaScript. Як вы, напэўна, ведаеце, ітэрацыі з'яўляецца адным з тых працаёмкіх задач. Вы проста зрабіць гэта на працягу зноў. Вам трэба пагаварыць з кожнага аб'екта ў аўтамабілі, ці вам трэба прайсці праз кожны элемент у спісе ці нешта накшталт гэтага. Так JavaScript мае, падобна PHP, сінтаксіс Еогеасп. У гэтым выпадку, гэта для у цыкле. Вы жадаеце выкарыстоўваць гэты толькі на аб'ектах. Ёсць некаторыя праблемы, якія ўзнікаюць, калі вы выкарыстоўваеце гэта на масівах. Гэта наогул адна з тых рэчаў, аднак, што вельмі карысна, таму што вы ліквідаваць шмат накладных выдаткаў таму што вы не павінны падцягнуць усё ў вашай аб'екта самастойна. Вы не павінны памятаць ўсе ключавыя імёны. Вы толькі выгляд атрымаць іх назад у гэтым сінтаксісе. У гэтым, з на працягу, вы проста хочаце, каб памятаць што вы атрымліваеце зваротна ўсе ключы, у вельмі падобным чынам, каб хэш-табліцы. Калі вы памятаеце гэтага, калі вы паклалі б у радку вы маглі б атрымаць нешта з што будзе мець значэнне, звязанае з ім. Што вы можаце зрабіць з гэтым вы можаце сказаць, усё ў парадку, Я пасадзілі ў машыну, і я назваў яго Ferrari. Такім чынам, вы можаце змясціць у радку Ferrari пазней, і вы можаце атрымаць гэта. І вы можаце зрабіць гэта ў цыкле, з Бо ў пятлі. Так што проста больш аб аб'ектах. Галоўнае з гэтага вы павінны памятаць, з'яўляецца тое, што вы можаце выкарыстоўваць аб'ектную структуру падобны сінтаксіс, калі вы хочаце з гэтым, акрамя таго, калі тое, што ты збіраешся выкарыстоўваць у выглядзе радка не з'яўляецца дапушчальным імем зменнай. Так што, калі вы паглядзіце на што, у нас ёсць ключ з прабеламі. Ну, калі б вы былі паставіць object.key, прастору, з, прастору, прасторы, што проста не мела б сэнсу сінтаксічна. Такім чынам, вы толькі можаце зрабіць гэта з такога роду сінтаксісу кранштэйна. Акрамя таго, JavaScript вельмі Сфера-мудра PHP. У вас ёсць 2 шляхі вырашэння сферу. Вы не можаце мець вар перад зменнай, і гэта проста азначае, што гэта глабальная. Вы можаце бачыць гэта з любой кропкі свету. Нават калі вы былі паставіць пра гэта ў калі заява, нідзе ў кодзе пасля гэтага пункту, вы маглі бачыць гэтую зменную. Іншая справа, тым не менш, з Вар, яна абмежаваная любой функцыі вы цалі Калі вы не ў функцыі, ну, гэта глабальная. Але калі вы знаходзіцеся ў функцыі гэта відаць толькі ў гэтай функцыі. Я не ёсць прыклад, але, так. Гэта адна з тых рэчаў, дзе Вы можаце кіраваць тым, што зменныя, якія вы хочаце быць глабальным, якія зменныя вы хочаце быць лакальным, але вы павінны быць асцярожныя, пра гэта, таму што вы не маеце тып тонкага кантролю збожжа, што вы робіце ў C, дзе калі нешта аб'яўляецца ў цыкле, гэта збіраецца застацца ў тым, што цыкл. Тое, што мы на самай справе хвалюе, выкарыстоўваючы наяўнасць для маніпулюе вэб-старонак, ці не так? Я маю на ўвазе, вось чаму мы робім гэта. Каб зрабіць гэта, мы выкарыстоўваем тое, што называецца DOM. Аб'ектнай мадэлі дакумента. Увогуле, што яна робіць гэта займае ўвесь ваш HTML і мадэлі яго ў кучу аб'ектаў, якія ўкладзеныя сябар у сябра. Вы пачынаеце з чымсьці накшталт гэтага. У вас ёсць, справа для мяне, куча кода, што там накшталт - Можна падумаць, што было б вельмі цяжка маніпуляваць, таму што вы б разбору праз кучу тэксту і таго, каб сабраць акрамя рэчы. А што, калі ён не быў правільна адфарматаваны? Дрэнныя рэчы здарыцца. Так JavaScript клапоціцца аб гэтым для вас, і вы атрымаеце добры структуру дадзеных, так, як на мой левы, дзе вы проста мець дакумент, і ўнутры, што ў вас ёсць тое, што называецца HTML, і ўнутры, што ў вас ёсць галава і цела, і ўнутры гэтай галавы ў вас ёсць назва, і гэтак далей, і гэтак далей, і гэтак далей. Гэта спрашчае маніпуляцыі вэб-старонкі, так што гэта проста, о, я проста хачу пагаварыць з гэтым аб'ектам. Накшталт вельмі падобна вы гаварыць з іншым аб'ектам вы зрабілі самі. Як я ўжо сказаў, усё DOM у аб'екце дакумента. Альбо гэта проста адно месца, а затым вы можаце пайсці ў ім, каб знайсці рэчы, і вы можаце зрабіць гэта - гэта стары стыль робяць гэта, там, дзе вы робіце document.getElementById, а затым імя, і, як вы, верагодна, можа сказаць, гэта становіцца вельмі грувасткім праз некаторы час. Такім чынам, вы, верагодна, не хочуць гэтага рабіць. Вось чаму ў нас ёсць Наступнае, што мы збіраемся казаць аб пасля гэтага. Галоўнае тут тое, што, усё ў парадку, у вас ёсць усе гэтыя элементы, ці не так? Таму, магчыма, я магу змяніць колер нешта пры загрузцы старонкі. Ну і што? Што рабіць, калі карыстальнік націскае нешта? Я хачу, каб зрабіць нешта цікавае, калі ён націскае нешта. Вось чаму ў нас ёсць падзеі. Вы можаце, у прынцыпе, знайсці любы элемент у вашым DOM, а потым кажуць, эй. Калі гэта загружае або хтосьці націскае на яе, ці калі яны мышы над ім, нешта зрабіць з ім. І што ў вас ёсць, у вас ёсць функцыі, якія апрацоўваюць гэта для вас. Гэтыя функцыі апрацоўшчыкі падзей. Што they're - гэта ўсяго толькі мудрагелісты спосаб сказаць, гэтая функцыя выконваецца толькі пры ўзнікненні гэтай падзеі. Так ён апрацоўвае падзея, якое ўзнікае. Гэта, як вы б выкласці апрацоўшчык падзей. У мяне ёсць кнопкі, а пры націску яе, яна выбухае. Так што не націснуць кнопку. Гэта адзін са спосабаў набліжэння да яго, ці не так? У вас ёсць кнопка тэг, і па пстрычцы ў вас ёсць радок, якая кажа, о, дарэчы, я раблю гэта які выбухае рэч для мяне. У адваротным выпадку, гэта проста, як звычайны кнопку вы толькі што зрабілі. Вы таксама можаце зрабіць гэта па-іншаму, , Захопліваючы элемент DOM, але мы пакінем, што пасля таго як мы кажам пра JQuery. JQuery: Гэта бібліятэка, якая з'яўляецца крос-браузерный. Вы можаце выкарыстоўваць яго ў значнай ступені чаго-небудзь. І гэта як раз дае шмат інструментаў для працы з. Паколькі JavaScript, у той час як магутны, не ўсе інструменты, неабходныя са скрынкі, каб сапраўды вырашаць вэб-дадатак, вы можаце зрабіць. Так што спрашчае шмат рэчаў, дае вам шмат функцый з скрынкі, якія вы звычайна прыходзіцца пісаць самастойна, зноў і зноў і зноў. І гэтак жа, робіць рэчы вельмі проста. У вас таксама ёсць селектары, якія дазваляюць вывезці ўсё тыя элементы, ад вашага DOM значна больш проста, замест таго, каб выкарыстоўваць гэтыя вельмі доўгія выклікі функцый. Яшчэ на гэтых селектараў. У вас ёсць, там вы, скажам, Я хачу атрымаць элемент з ID "рок". Ну, у JQuery, гэта проста $, а затым радок, якая мае фунт, а затым "рок". Гэта вельмі проста і нашмат хутчэй, чым традыцыйным JavaScript шляхі вырашэння гэтай праблемы. А ў вас ёсць падобныя рэчы для класаў і тыпаў элементаў. JQuery - адзін з цікавых функцый, што вы можаце роду сціскаць ўніз запыты, што Вы на вашым DOM вельмі, вельмі хутка. Цяпер мы вярнуліся да апрацоўкі падзей, і гэта, як вы б справіцца адна падзея ў JQuery. Так што мы збіраемся тут мы кажам, усё ў парадку. У мяне ёсць тэг сцэнара, ці не так? Таму ў мяне ёсць гэты инлайн JavaScript. Тое, што мы збіраемся зрабіць, гэта мы збіраемся сказаць, усё ў парадку. Калі дакумент будзе гатовы, а гэта значыць, гэта быў загружаны дакумент, мы збіраемся ісці да гэтай функцыі, і мы збіраемся сказаць, усё ў парадку, гэтая функцыя на самай справе рабіць нешта яшчэ. Гэта ў асноўным кажуць, усё ў парадку, дай мне элемент з ID "MyID." А потым даць гэта апрацоўшчык функцыі, якая выконвае, калі вы пстрыкніце па ім. У асноўным тое, што гэта робіць, ён кажа, усё ў парадку. Старонка загружаецца, таму я збіраюся ў, знайсці гэты элемент, даць яму гэты апрацоўшчык падзей, і гэта ў асноўным настройвае старонкі для вас. І гэта, як вы хочаце думаць аб апрацоўцы падзей. Вы проста хочаце, каб думаць, усё ў парадку, калі нешта адбываецца, тое, што я хачу каб гэта адбылося? Вы ж не хочаце, каб думаць пра, добра, мне трэба, каб пераканацца, гэтая рэч перамовы на гэтую рэч, гэтая рэч бла-бла-бла, таму што вы проста хочаце пагаварыць рэч з пункту гледжання падзей. Калі гэта адбываецца, гэта адбываецца. Калі гэта адбываецца, што адбываецца. І калі падзеі выклікаюць іншыя рэчы, гэта выдатна. Але вы не хочаце, каб паспрабаваць зрабіць складаны код дзе вы выклікаўшы некалькі рэчаў адначасова, таму што вы толькі збіраецеся даць сабе галаўны боль. Добра. Цяпер мы можам атрымаць нашу старонку для апрацоўкі падзей, але, скажам, мой карыстальнік націскае кнопку. Што рабіць, калі я хачу адправіць гэтую просьбу назад на сервер, але я не хачу, каб перазагрузіць старонку, таму што неабходнасці перазагрузкі новую старонку кожны раз, калі становіцца збольшага стомна, і навошта ён мне патрэбен знесці загаловак зноў, а ў ніжнім зноў, і ўсе элементы старонкі зноў проста каб абнавіць прывітанне або час? Дык вось чаму ў нас ёсць нешта накшталт Ajax. Што мы можам зрабіць тут з Ajax з'яўляецца, можна сказаць, усё ў парадку, Я хачу адправіць некаторыя дадзеныя на сервер, і я хачу, каб атрымаць адказ назад, каб я мог абнаўляць сваю старонку, ці можа быць проста рабіць некаторыя алгарытмічныя вылічэнні, што не абавязкова паказваць усё, каб карыстальніку. Што трэба для гэтага? Ну, вам патрэбен URL вам трэба пагаварыць. Ваш сервер не можа проста чароўна слухаць з ніадкуль. Вы павінны мець пэўнае месца вы пасылаеце гэтыя дадзеныя. І вы таксама павінны некаторыя дадзеныя для адпраўкі, або, можа быць, гэта без дадзеных запытаў. Вы проста хочаце, каб праверыць сувязь назад на сервер і сказаць, эй, я жывы, ці нешта накшталт гэтага. А потым вы хочаце функцыю, якая ў асноўным апрацоўвае поспехам. Дапусцім, вы вярнуцца некаторую інфармацыю з вашага сервера, і вы хочаце змяніць пасаду карыстальніка на сваёй старонцы. Так вы атрымаеце інфармацыю назад, і будзе вы націскаеце, што на экране. Што адбываецца, з'яўляецца, калі старонка гатовая, Вы ствараеце на функцыі клік для гэтай кнопкі пад назвай зазывала. Што гэта, то робіць гэта, калі, што кнопка націснутая, Вы кажаце з greetings.php, вы робіце запыт POST, а вы кажаце, эй, дай мне што-небудзь з вашай старонцы. Мы сапраўды не трэба, каб апісаць гэта, але greetings.php, давайце проста скажам,, аддае "Hello World". Такім чынам, мы атрымліваем назад гэты "прывітанне свет", і ў выпадку паспяховага завяршэння гэтага мяркуючы ўсё ідзе не так, то мы проста пайсці ў гэты мэтавай месцы што мы вызначылі, і мы проста прытрымлівацца адказ там. І гэта вельмі просты спосаб стварэння запыту Ajax. Вельмі хутка, Роб роду згадаў пра гэта ўжо, усё можа пайсці не так, дрэнныя рэчы могуць здарыцца, так што вы хочаце, каб азнаёміцца ​​з гэтымі кодамі HTTP рэагавання. Што гэта проста, як, 200, усё прайшло добра. Нешта яшчэ, дрэнныя рэчы адбылося. Гэта ўвогуле, што вы хочаце запомніць. Але прыемна ведаць, усё гэта. І, нарэшце, як толькі мы прайшлі праз усё гэта, мы павінны казаць вельмі хутка аб дызайне, і тады мы зможам дазволіць вам усім сысьці. Дызайн. Тое, што вы хочаце запомніць. Задайце сабе гэтыя пытанні: Хто будзе выкарыстоўваць гэта? Што яны будуць выкарыстоўваць яго для? Што мае карыстальнікі клапоцяцца аб? Што яны не клапоцяцца аб? Вы проста не хочаце зрабіць дадатак, і хай ён проста расці і стаць гэты гігант, усёпаглынальнай, што вы не можаце нават скончыць. Вы хочаце мець дыскрэтныя мэты і планы і рэчы, якія вы хочаце звярнуцца. Зрабіць гэта лёгка. Усё гэта кажа, у асноўным, зрабіць яго лёгкім для карыстальніка, каб выкарыстоўваць яго, не зрабіць яго гіганцкі згустак тэксту як гэты слайд, уласна. Вы проста хочаце, каб ён нешта дзе гэта вельмі лёгка для кагосьці ісці ў і рабіць тое, што яны хочуць зрабіць. Вы ж не хочаце, каб яны мелі арыентавацца 5 старонак каб дабрацца да вашага прэм'ер-функцыі вашага сайта. Калі Google было 5 старонак, перш чым вы маглі нават шукаць нешта, ніхто не будзе выкарыстоўваць яго. І, нарэшце, папера прататып, фокус-група. Ёсць добры дызайн і практыкі тэставання. Проста таму, што вы думаеце, ён працуе для вас, не азначае, хто-то яшчэ думае, што гэта працуе. Але так, вось яно што. [CS50.TV]