[Review: Quiz 1] [Али Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Боудън] [Harvard University] [Това е CS50.] [CS50.TV] [Lucas Freitas] Добре дошли на всички. Това е преглед на викторина 1. Точно както един отказ от права, това е - Искам да кажа, ние ще се опитаме да покрие толкова материал, колкото е възможно, но това не означава, че отиваме за покриване на всички от нещата, които могат да бъдат в една викторина. Така че бъдете сигурни, че също така да погледнете на лекция, раздели, всичко, което можете. Quiz 1 ще бъде в сряда, следващата сряда. Така че не забравяйте да учат. Това ще бъде, до голяма степен, като на първата викторина по отношение на формата му, но тя вероятно ще бъде много по-трудно. Най-малко, миналата година, когато взех 50, аз помислих, че е много по-трудно. Така че учи много. Отивам за покриване на структури от данни и Хъфман кодиране. Това е нещо, което много хора мислят, че е сложен, но аз ще се опитам да го направи толкова лесно, колкото е възможно. На първо място, това, което ние искаме вие ​​да знаят за викторина едно е да разберат концептуалното описанията на всяка от структурите на данни, които аз ще представя. Това означава, че не е нужно да се действително прилагане на хеш таблица в една викторина. Ние не искаме да се приложи цялата хеш таблица, може би ние ще се опитаме да ви накара да се приложат някои от функциите, най-често срещаните операции, но ние няма да ви накара да се приложи всичко. Така че е важно да се разбере концепцията зад всяка структура на данните и също така, че вие ​​сте в състояние да се код в C, само най-общи операции, които имат за всяка структура данни. И също така да може да преразгледа указатели и structs, тъй като те се появяват много в тези структури от данни. Първо, свързани списъци. Свързани списъци са всъщност много сходни с масиви, но разликата между свързан списък и масив, на първо място, е, че свързан списък има много гъвкав размер, докато в масиви, което трябва да изберете или много голям размер за масива, така че знам, че ти започваш да бъде в състояние да съхранявате всичките си данни в този масив, или ще трябва да използвате изчистване да има гъвкава дължина на масив. В свързани списъци, че е много лесно просто да получите повече елементи, поставите повече елементи в свързан списък или премахнете елементи. И всъщност, ако не искате на свързан списък, за да бъдат сортирани, можете да търсите и да премахнете елементи в константно време, така O (1) време, така че е много удобно. Вие просто трябва да бъдат внимателни, за да винаги да помним, да изчистване и безплатни възли, Просто защото, ако не го направите, вие ще имате памет течове. Така че, свързани списъци - определението на един възел е точно като това, което имаме тук. Сложих Int N, но вие може да се съхранява всички данни, които искате. Така че, ако искате да съхранявате низ, всичко е наред. Ако искате да запазите структурата, всичко е наред, двойна, каквото си искате. Пуснах Int н за примерите тук. И вие имате указател към следващия възел. Така че, общо взето, свързан списък има някои данни, и след това го насочва към следващия възел. Ако това е последният елемент в свързан списък, че ще ходи да сочи към NULL. Така че това е един пример за свързан списък. Добре, така че сега нека да видим какво трябва да направя, ако искам да вмъкнете елемент в свързан списък. Първо, функция вложка ще бъде от тип нищожен защото аз не искам да се върне нищо. И аз ще взема едно цяло число като аргумент, защото аз искам да знам какво искам да вмъкнете. И така, какво е първото нещо, което трябва да правя? Е, аз трябва да изчистване на newnode, така че е на първа линия. Аз съм просто създаване на нов възел да се сложи в свързан списък. Така че, това, което мога да направя? Е, ние знаем, че в нашите реализации на свързани списъци в клас, ние винаги се поставя на главата като глобална променлива. Така че това, което можем да направим е да сменим главата. Мога да направя този нов възел да бъде новият началник, и то се случва да сочи към предишната глава. Как можем да направим това? Първото нещо, което трябва да направите, е да сменим "N" в новия възел да стойност, които се предават към функцията. Тогава newnode е следващият ще бъде на главата. Главата ще бъде newnode. Така че това е доста проста. За изтриване на възел, ние можем да го правим така - Един начин бихме могли да направите това е да се каже, Добре, ако аз исках да изтриете, например, 3, това, което мога да направя е просто точка на предишния възел на следващия възел 3. Така че аз просто ще направя нещо подобно. Но какъв е проблемът с това, че? Имам изтичане на памет, така че аз не разполагат с достъп до номер 3 вече. Проблемът с това е, че аз няма да бъда в състояние да се освободи този възел. Отивам да имат памет течове и (неразбираемо) ще ме намрази. Така че вместо да правиш това, аз може би трябва да имат временен показалка. Така че сложих темп. Тя ще се насочи към възела, който аз искам да изтриете. И тогава може да се движи на предишните възли точка до следващия възел на възела, че искате да изтриете. И най-накрая, мога да освободите показалеца. Трябва ли да се освободите показалеца, че съм създал точно там? Не е нужно да, просто защото - разликата е, че този възел е създаден с помощта изчистване, така че е в купчината, докато тази е била обявена просто като превключвател NULL в стека. Така че не е нужно да го освободи. Добре. Така че сега нека поговорим за стакове. Stacks са доста прости. Ние направихме стекове и опашки в клас само с помощта на масиви, но трябва да сте запознати - просто да са наясно че можете да направите купища опашки, използвайки свързани списъци, както добре. Така че, ако имате масив, какво би било стак? A комин, на първо място, ще трябва да имат размери. Вие трябва да се съхранява, какъв е размерът на стека, че имате точно сега. А също така можете да имате масив, в този случай на номера, но ако искате, може да бъде масив от низове, масив от структура, нещо, което искате да съхраните. За стека: Разликата между комин и свързан списък е, че в стека имате достъп до последния елемент, който е бил пуснат в стека само. Тя се нарича последно, първи излязъл. Точно като имате куп тави, ако ви постави поднос на върха на купчината, трябва да се премахне тази тава първо да имат достъп до други тавите. Това е едно и също нещо с стакове. Така че, ако искате, например, да добавите елемент към стека, какво трябва да направя? Нарича се бута, а това е доста ясен. Първото нещо, което трябва да направите, е да проверява дали размерът на стека не е по-голяма или равна на тази на пакета. Защото, ако вече сте на пълен капацитет, не можете да добавите още нещо. И след това, ако не, просто трябва да добавите елемент към стека. И накрая, нарастване на размера. Така че това е доста ясен. Така че аз просто добавете номер 2. И ако искам да се появи, което означава, че искам да се отстрани последният елемент, който се прибавя и връща стойността на елемента, първото нещо, което трябва да проверите е, че топчето не е празна. Защото, ако е празна, не може да се върне нищо. В този случай, аз връщам -1. В противен случай, аз ще декрементира размера на спецификацията, и да се върнете номера (s.size). Защо съм декрементира размера и след това се върнете s.size? Това е така, защото в този случай, спец. има размер 4, и аз искам да се върне на четвърти елемент, нали? Но това, което е индексът на четвъртия елемент? Три. Тъй като аз си размер - ще бъде 3, мога само да се върне s.numbers (s.size) защото това е 3. Така че това е просто индекса. Сега опашки. Опашките са почти едно и също нещо. Единствената разлика е, че вместо да се налага последният влязъл, първи излязъл, имате първи влязъл, първи излязъл. Вероятно, ако чакаш да отидеш на концерт, не би бил щастлив, ако имаше стак вместо опашка. Да бъдеш последният човек, който дойде ще бъде първият човек, който влезе на концерта. Вие вероятно няма да бъде щастлив. В опашката, първият човек, за да получите в е и първият човек, за да се измъкнем. Така че в дефиницията на опашка, освен като размера на масива, вие също трябва да има на главата, която е индексът на ръководителя на стека. Така че първият елемент в момента. Enqueue е същото нещо като тласък за стакове. Ако сте били много наивно, просто ще кажа, Е, мога само да направя точно същото нещо, както аз направих за натискане. Мога само да се провери дали то не е извън възможностите. Ако е така, аз връщане фалшиви, в противен случай може просто да изнася новата стойност и след това нарастване на размера. Но защо това е грешно? Да видим този пример. Опитвам се да Enqueue куп неща, и след това аз ще dequeue и Enqueue. Има много команди, но това е много проста. Отивам да Enqueue 5, така, се добавя 5, и след това 7, 1, 4, 6, и след това искам да dequeue нещо, което означава, че аз отивам да премахнете първия елемент. Така че аз отивам да се премахне номера 3, нали? Първият елемент. Добре. Сега, ако се опитам да Enqueue нещо друго, какво ще се случи? Според моето изпълнение, Щях да се сложи следващия номер в индекса q.size. В този случай, размерът е 8, така индексът 8 ще бъде точно тук, в последната позиция. Ако се опитам да Enqueue един точно тук, бих се презаписване на последната позиция до номер 1, което е напълно погрешно. Това, което искам да направите, е да обгърне и да преминете към първата позиция. Може би просто ще кажа, добре, аз просто трябва да се провери ако действително мога да сложа нещо там. Ако не, аз само да кажа, о, новият пълния капацитет всъщност капацитет - 1, и вие не може да се сложи елемент там. Но какъв е проблемът? Проблемът е, че ако аз просто dequeue всичко точно тук и след това се опитам да добавя нещо друго, тя просто ще кажа, добре, ти беше с пълен капацитет, което е 0. Така че вашата опашка е отишъл. Трябва да обгърне, и начин за опаковане на около че вие, момчета, научени по време визионерски и други psets е използвал мод. Можете да го изпробвате у дома, за да се разбере защо бихте направили q.size + q.head Министерството на отбраната на капацитет, но ако ви се покажат точно тук, можем да видим, че тя работи. Така че в последния пример, q.size е 8 и главата е едно, защото тя е тази позиция тук на масива. Така ще бъде 8 + 1, 9. Mod капацитет 9 ще бъде 0. Той ще отиде на индекса 0. Ние ще бъдем в правилната позиция. И след това се опитайте опашката у дома. Някои важни неща: Опитайте се да се разбере разликата между комин и опашка. В дома, опитайте се да получите много добре запознати с прилагането Enqueue, dequeue, бута и поп. И също така да разберат, когато можете да използвате всеки един от тях. Така че нека да се отпуснете за 10 секунди с един куп Pokemons. А сега нека се върнем към структури от данни. Hash таблици. Много хора са уплашени от хеш таблици. в определен проблем 6, проверка на правописа. Хеш таблици и се опитва, много хора се плашат от тях. Те мислят, че те са толкова трудно да се разбере. Да? [Rob Боудън] Проблем комплект 5. Проблем комплект 5, да. Благодарение Роб. Да. Six беше Huff N 'Puff, да. Проблем комплект 5 е за проверка на правописа, и трябваше да се използва или хеш таблица, или да опитате. Много от хората смята, че те са били супер трудно да се разбере, но те са всъщност доста проста. Какво е хеш таблица, в общи линии? A хеш таблица е масив от свързани списъци. Единствената разлика между масив и хеш таблица е, че в хеш таблицата имате нещо, наречено хеш функция. Какво е хеш функция? Аз не знам, ако вие може да прочетете тук. Това е един пример за хеш таблица. Така че можете да видите, че имате масив с 31 елемента. И това, което правим в хеш таблица е да има функция хашиш че ще преведат ключ, всеки INT на индекс. Ако, например, ако искате да изберете за Б. Харисън, Бих поставил Б. Харисън в моите хеш функции, и функцията за сегментиране ще се върне 24. Така че аз знам, че искате да съхранявате Б. Харисън в 24. Така че това е разликата между просто като една решетка и с хеш таблица. В хеш таблицата ще имате функция, която ще ви кажа къде да се съхраняват данните, които искате да съхраните. За хеш функция, която искате да търсите за хеш функция че е детерминирана и добре разпределен. Както можете да видите тук, ще видите, че много от данните, които съм искал да магазин всъщност беше 19 вместо да се използва 31 и 30 и 29, всички, които са били свободни. Така че функцията на хашиш, че аз използвах не беше много добре разпределен. Когато казваме, добре разпределени, това означава, че искаме да имаме, приблизително, най-малко 1 или 2 за всеки от - като, за разлика от 1 или 2 за всеки от индексите в масиви. Вие искате да има, грубо, същия брой елементи във всеки свързан списък в масива. И това е лесно да се провери дали това е валидно в хеш таблица, видите като хеш таблици. Тогава дървета. Това е дърво. Дърветата в компютърните науки са обърнати по някаква причина. Така че тук имате корена на дървото и след това листата. Ти просто трябва да знаеш номенклатурата за родители и деца. Всеки възел има своите деца, които са възлите, които са под родителя. Така че, например, два ще бъде на родителя за 3, и за другото дете точно там, а 3 ще бъде на родителя за един и другите деца, които са там. И един ще бъде дете на 3, и така нататък. Ние имаме нещо много по-интересно, нарича двоично търсене дърво, в което всички стойности на правото на възел ще бъде от дясно, точно тук - в дясно, ще бъде по-голяма, отколкото на елемента в корена. Така че, ако са с номер 5, точно тук, всички елементи на правото ще бъде по-голяма от 5, и в ляво всички елементи ще бъдат по-малко от 5. Защо е полезно това? Е, ако искам да се провери дали числото 7 е тук, например, Просто отидете на пет първи и аз отивам да видя, е 7-голямо или по-малко от 5? Това е по-голяма, така че аз знам, че ще трябва да бъде отдясно на дървото. Така че аз имам много по-малко неща за гледане. В изпълнение на двоично търсене дърво, възел, аз съм просто ще трябва да разполагаме с данни, така Int N; вие също може да има низ или всичко, което искаше. Вие просто трябва да бъдете внимателни при определянето какво е по-голямо, което е по-малко. Така че, ако сте имали низове, например, можете да дефинирате че всички тези неща в дясно ще имат по-голяма дължина, ляво ще имат по-ниски дължини, така че това е наистина зависи от вас. Как мога да приложи намерите за BST? Първото нещо, което ще трябва да направите, е да се провери, ако коренът е NULL. Ако това е NULL, това означава, че нещо не е там защото не е нужно дори да има дърво, нали? Така че аз се върне фалшиви. В противен случай, аз отивам да се провери, ако броят е по-голям от стойността в корена. Аз ще се опитам да намеря елемента на правото на дървото. Вие виждате, че аз съм с рекурсия тук. И след това, ако това е по-малко, аз отивам да гледам на ляво. И накрая, в противен случай, ако не е по-малко или не по-голяма, това означава, че това е самата стойност. Така че аз просто се върнете вярно. Тук можете да видите, че аз използва, ако, ако, ако. И не забравяйте, в викторина 0, имахме проблем, който имал, ако, ако, ако, и е трябвало да се намери неефективността, и неефективността е, че ако сте използвали. Вие би трябвало да се използва, ако, в противен случай, ако друго, и друго. Така че, трябва да използвам друго, ако и друго, ако и друг тук? Има ли някой - Така ли? [Student говорене, недоловим] Това е перфектно. И така, тя казва, че тя не е от значение, просто защото неефективността че имахме преди беше, че тъй като, може би, ако някакво условие е изпълнено, така че да е извършил действие, но след това, че ще ви се покажат всички други условия. Но в този случай, тя се върна веднага, така че няма значение. Така че не е нужно да използвате друг, ако. И накрая, нека да говорим за опита, която е любимата на всички. Опит е дърво на масиви. Това е много бързо, за да търсите стойности, но той използва много памет. И това е обикновено, за да филтрирате думи, така че когато искат да приложат, например, аз не знам, като телефонен указател в телефона си и искате да сте в състояние да въведете B и просто да се имена на хора, които имат B. Тя е много лесна за изпълнение, които с помощта на опит, например. Как определяте възел в пробвам? Ти просто трябва да имаш булев, че ще бъде is_word. Това означава, че използването на всички герои, преди този възел, сте били в състояние да образуват една дума, и след това ще имате масив от указатели към възли. Виждаш ли, че имаме масив от възли майки, така възел * масив? Да? Така че нека да видим как това ще проработи. За проверка на правописа, имаме масив от 27 елемента, защото имаме всички писма плюс апостроф. Преди тук аз съм просто ще използват два, защото искам да бъде в състояние да напише на дъската. Добре. Така че това е един пример на опит. Ако аз просто определят първия възел, ще има масив от два елемента , които са две указатели към NULL, така че аз просто сложи "а" и "б". И аз отивам да има булев, която казва is_word. Това ще бъде фалшиво за първи милион, само защото преди това не е нужно никакви символи. Така че една празна дума, не е дума. Така че това е лъжа. Ако искам да добавя "а" до този речник, какво ще трябва да направя? Бих просто трябва да изчистване на нов възел за "а", и след това да добавите своя дума, за да е истина. Така че това просто означава, че след като "а", ще бъде вярно. Направи ли смисъл? След това, ако искате да добавите "ба", аз ще трябва да изчистване 1 за "б", и след това отивам да се създаде Булев с неверни, защото "б" от само себе си не е дума. Тогава аз ще изчистване още един за "а", така че "ба", и след това отивам да се създаде това е дума, за да е истина. Защото "ба" е дума. И след това, ако искате да видите дали "б" е в този речник, Мога просто да отидете до първия милион, 'B'. Сляза и аз гледам е дума, но тя казва неверни. Така че това не е една дума. Ако искам да се провери "ба", Аз отивам към първия милион, "Б", а след това отидете на "а", и виждам, вярно, така че това е една дума. Направи ли смисъл? Много хора се бърка с опита. Не? Накрая, кодиране на Huffman. Huffman кодиране е много полезен цел пестене на памет и сгъстяване на текстови файлове, просто защото много пъти се използват "а" и "д", например, в документите си, но аз не знам, ако вие използвате "Q" или "Z", както много. Ако имате само един байт за всеки един символ, всеки един - от 256 знака, които имаме в таблицата на ASCII не е много оптимални, просто защото има някои знаци, които се използват много повече така че може би трябва да се използва по-малко памет за тези. Как мога да използвам Хъфман кодиране? Ние трябва да направим Хъфман дърво.  A Хъфман дърво има възли че има символ, който ще бъде като "а", "б", "в", писмото, каквото и писмо, което имате, честота, която е честотата, че думата се появява в текста, че сте били създаването на дървото за Хъфман, и след това възлова точка, която ще се отбележи от ляво на дървото Huffman и още един възел, който ще се насочи към правото. Така че просто като дърво. Как да се изгради един Хъфман дърво? Отиваш да вземем две възли, които имат най-ниските честоти. Ако имате вратовръзка ти започваш да вземем две възли които имат най-ниските стойности на ASCII, както добре. Тогава започваш да създадете нова дърво от тези две възли че ще има комбинираната честота в родител възел. И тогава започваш да се премахнат две деца от гората и да ги замени с родителя. И ти започваш да се повтаря, че докато имате само едно дърво в гората. Така че нека да видим как ще се направи Хъфман дърво за ZAMYLA. Тук можете да видите, че всички писма имат честота 1 с изключение на 'A'; който има честота 2. Така че съм създал възли за всички писма, които сложих в ред на ASCII стойност и честота. Така че, ако искате да създадете първото дърво, то ще бъде с "L" и "M". Така че това е тук. Честотата на двойката ще бъде 2 защото е 1 + 1, тогава следващите 2 с най-ниските честоти са "Y" и "Z". И тогава аз имам всички от тях са - имат честота от 2. Така че кои са тези, които имат най-ниска ASCII стойност за следващия един? "А" и "L". Така че създаването на новия възел, и най-накрая, че е 4 и 2, така че 2 ще бъде в ляво. И това е дървото Хъфман. Тогава, ако искам да пиша някакъв текст, като в двоичен да преобразувате в текст, като използва дървото Хъфман е много лесно. Например, ако кажа, че се премести в ляво е 0 и се движи вдясно е един, Какво е, че ще представлява? Така че, като 1, 1, така дясно, дясно, и след 0, така че ще бъде оставен L, и след това 1, 0, 0. Така един, 0, така че просто един, 0, 'A'. И след 0, 1, така че "Z". И тогава един, 0, 0 - не. 0, 0, ще бъде "Y", толкова мързелив. Така че това е всичко за мен, Роб ще поеме. [Rob Боудън] Така, седмица 7 неща. Имаме много да отидем много по-бързо. Побитови оператори, препълване на буфера, CS50 библиотека, след това HTML, HTTP, CSS. Всички в като 15 до 20 минути. Побитови оператори. Има шест от тях, които трябва да знаете. Побитовото и побитови или, XOR, олевяване, нали смени, и не. Right смени и не можете едва видях в лекция на всички. Ние ще го прегледаме бързо тук, но това е добре да се знае, че те са шест, които съществуват. Не забравяйте, че побитовите оператори са като когато правите 3 + 4. Не се занимаваме с двоичен на 3 и 4. С побитови оператори, вие всъщност се занимава с отделните битове на числата 3 и 4. Така че първият, който ще каже, е побитова не, и всичко, което прави, е да обърнете всички битове. Така че тук, ако сте написването на тази в C, не бихте го напиша като ~ 11011 или каквото и да, ще можете да пишете харесва ~ 4, и след това ще флип двоичното представяне на четири. Така че тук, ~ на някои двоично число 1101101 ще точно флип всички 1 на 0 и всички 0 до 1 години. Както казах там, честото използване на това, и ние ще го видим след малко, е като искаме да излезем с някакъв номер където всички битове са 1, с изключение на един от тях. Така че това е обикновено по-лесно да се изрази броя където само, че един бит е зададен, и тогава се взема ~ от него, така че всеки бит се определя с изключение на този. Така че това е, което ние ще използваме по-малко. Побитово или. Тук са две двоични числа, и тези две числа са доста представителна, тъй като те представляват всички възможни комбинация от битове може да се наложи да работят на. Тук, когато or'd всеки бит, ние просто ще сравни право надолу. Така че от лявата страна имаме едно и едно. Когато побитови | тези, аз какво ще получа? One. Тогава побитови | 0 и 1 ще ми дадеш? One. Побитовото 1 и 0 ще бъде едно и също нещо, едно. Побитовото 0 | 0 ще ми даде 0. Така че единственият случай, когато получавам 0 е в 0 | 0 случая. И можеш да се сетиш, че точно като вашите логически НОР. Така че, ако мислите, че на един толкова вярно и 0 като фалшиво, същото важи тук. Така че, вярно или вярно е вярно; вярно или невярно е вярно. False или вярно е вярно; невярна или фалшива е единственото нещо, което всъщност е фалшива. Ето и пример, който трябва да знаете като един доста добър пример за това, когато се използва побитови оператори. Тук, ако ние или капитал "А" с Ox20, и ние ще разгледаме това в секунда, ние се получи нещо. И ако ние или малки букви "а" с Ox20, ние получаваме нещо. Така че нека да спра ASCII таблица. Добре. Тук ние виждаме, че "А" е - тук имаме "A" е десетични 65. Но аз ще отида с шестнадесетичен, което е Ox41. Доста сме сигурни, че го видях в клас. Мисля, че го видях в клас че това е доста лесно да конвертирате от шестнадесетичен за двоичен. Така че тук, ако искам да се сложи 4 в двоичен, че просто ще бъде 0100. Това е един кът, две на място, четири на място, така че това е 4. Тогава можете да разделите един в двоичен, който ще бъде 0001. И така, това ще бъде представянето на 'A' в двоичен. Като малки букви "а", сега тя щеше да бъде Ox61, където, разделяне тези нагоре в своето двоично, така че 6 - Нека всъщност го направя - не съществува гумичка? Eraser. Ox61. Така че разделянето 6 в двоичен ще е 0 + 4 + 2 + 0. И цепене 1 ще бъде 0001. С поглед към разликата между тези две, ние виждаме, че единствената разлика между малки и главно 'A' е този единствен бит. Така че да се върне към тук - добре. Връщайки се тук, ако се вгледаме в това, което е най-малко Ox20, така разделяне Ox20 в своята двоичен, е 0010, 0000. Ox20, единственият бит, който е зададен, е това малко, че сме загрижени, с превключване между главни и малки букви "а". Ако аз или "A", който е тази, 'A', ако аз или "A" с Ox20, аз какво ще получа? [Student, недоловим] Малки букви "а", защото то се случва да обърне тази част до един. И ако аз или "а" с Ox20, аз какво ще получа? Малки букви а, защото просто oring "а" с Ox20, Аз съм просто ще се oring този единствен бит до 1, то е вече един, така че няма значение. Така че ние се "а" и "а". Побитово и. Отново, можем да мислим за това като ни логично и колега. От лявата страна имаме вярна и вярно. Това ще бъде вярно, и за всеки един от случаите, невярно и вярно или е вярно и невярно, или невярно и фалшиво, нито едно от тези неща са верни. Така че това, което ние в крайна сметка получаване е 1000. Така че сега, тук, тук е мястото, където съм използвал надежден Побитовото не, където имахме Ox20. Така че това е Ox20. Сега това, което искам да направя, побитова ~ на Ox20. Това ще флип всички битове. Така че аз имам 1101, 1111. И така, "A" anded с ~ Ox20 ще ми даде това? Единственият бит ние наистина трябва да се мисли за това е едно, тъй като, ако всички тези битове са определени 1, тогава започваш да се получи точно това, което 'A' е, с изключение, може би, това, което този бит е. Защото, ако това беше едно, сега това ще бъде настроен на 0, защото каквото и да е, anded с това ще бъде 0. Така че това, което е "A" & ~ Ox20 ще ми дадеш? [Студентите отговорят, недоловим] И какво е "а" и - това е 'A'. И това, което е "а" и ~ Ox20 ще ми дадеш? "A." Тъй като това е в момента с 1. Anding с този 0 ще направи го на 0, а сега отиваме да се получи 'A'. И двете са "A", и накрая, но не на последно място от този тип, имаме XOR. Това е много подобно или, освен това означава, изключително или. Това е подобно на това, което обикновено мислим като или в реалния свят. Така че, когато правите едно "X" или "Y", но не и двете. Ето един ^ 1 ще бъде 0. Тъй вярно, това е - тя не работи, както и с логическата истина и лъжа като побитови & и или направя, но е истина ^ вярно е фалшива. Защото ние искаме само да се върне вярно, ако само един от тях е вярно. Така 1 ^ 1 е 0. Какво около 0 ^ 1? Е 1. 1 ^ 0 е 1, 0 ^ 0 е 0. Така че, при всички обстоятелства, 0 побитова нещо 0 ще бъде 0. 1 побитова нещо 0 или 0 побитова 1, ако това е | или ^, това ще бъде един, и ако това е и ще бъде 0. И единственият случай, когато един побитова 1 не е 1 е с изключителна или. Това е 0110. Така че тук, сега, като се използват XOR - така че сме се върнали в 20. 'A' ^ Ox20 е тези два бита сме сравняващи. Така че един милион ^ 0 ще ми даде това, което? А една. 'A' ^ Ox20 ще ми дадеш? Малки букви а. "А" ^ Ox20 ще ми дадеш? Capital A. Защото каквото и да се прави, това XORing с Ox20 е ефективно обръщане каквото и да е малко. Ако това е 0, това е сега ще се превърне в едно. Тъй като това е 1, 1 ^ 1 е 0. Така че нашата "а" се превърна 'A', и нашата "А" е станала "а". Така че XOR е наистина удобен начин просто обръщане на случая. Вие просто искате да превъртите през поредица от букви и се редуват случая на всеки един символ, просто XOR всичко с Ox20. Сега сме олевяване. Олевяване е просто ще, общо взето, настоява всички номера в или до ляво и поставете 0 зад тях. Така че тук имаме 00001101. Отиваме да прокара 3 0 е отдясно, и получаваме 01101000. В nonbinary термини, ние виждаме, че това е наистина справяне 13 лявата изместен с три, което ни дава 104. Така че лявата променяща се, ние виждаме тук, х << г. е основно х * 2 ^ ш. 13 * 2 ^ 3, 2 ^ 3 е 8, така че 13 * 8 е 104. Ако просто мисля за двоичен като цяло, как всяка цифра, ако започнем от правото, това е едно на място, а след това на два на място, а след това на 4 на място. Така чрез натискане на 0 е отдясно, ние просто бутане неща, които бяха в 4 на мястото на 8 на място, и нещата, които са били в 8 на място на 16 на мястото си. Всяка промяна просто умножава по 2. Да? [Student] Какво се случва, ако изместен от 5? [Боудън] Ако изместен от 5 просто ще загубят цифри. Неизбежно, това е едно и също нещо. Подобно, числа са само 32 бита, така че ако можете да добавите два наистина големи числа, той просто не се вписва в цяло число. Така че това е едно и също нещо тук. Ако изместен от 5, ние само ще загубят, че един. И това е нещо, което искам да кажа с "грубо" където ако се измести твърде далеч, вие губите бита. Изместване надясно ще бъде обратното, къде отиваме да набутам 0 е на разстояние от края, и за нашите цели, попълнете 0 от левия. Така че правя това, ние сме основно заден това, което вече е направено. И ние виждаме, че трите 0-те години на правото са просто паднали, и ние сме бутна 1101 по целия път надясно. Това прави 104 3, което е ефективно, х / 2 ^ ш. Така че сега, ето, това е подобна идея. Защо това е просто грубо х / 2 ^ Y, а не действително х / 2 ^ ш? Защото ако бях изместен от 4, щях да загубя 1. По принцип, това, което се сетиш, просто мисля за целочислено деление като цяло. Така че, като 2.5 е 2. Това не е 2.5. Това е една и съща идея тук. Когато ние разделяме с 2, ние можем да загубим нечетни битове по протежение на пътя. Така че сега - това е за побитова. Това е всичко, което трябва да знаете. Не забравяйте използването случаи, които видяхме в клас, като малко маска е полезна за побитови оператори, или можете да ги използвате за битови маски. Главни букви и малки букви, преустройства е доста прототипния пример. Добре, препълване на буфер атаки. Всеки, който си спомня какво се е случило с тази функция? Забележете, ние обявена за масив от 12 байта, 12 символа, и тогава ние копирате в нашия буфер от 12 символа на целия низ бар. Така че какъв е проблемът тук? Магическото число 12 трябва почти веднага изскочи като - защо 12? Ами ако бар се случва да бъде повече от 12 символа? Ами ако е бар милиони герои? Тук въпросът е memcpy. Ако бар е достатъчно дълъг, тя просто ще напълно - "C", "C" не се интересува, че е само на 12 символа; "В" не се интересува, че не може да се побере, че много байта. Тя просто ще замени напълно Чар, на 12 байта сме разпределени за нея, и всичко покрай в паметта, които всъщност не принадлежат към буфера с каквото бара е низ. Така че това беше картината видяхме в клас където имаме в нашата разрастваща се купчина нагоре. Вие трябва да се използва за тези снимки или да се запознаят с тях отново. Ние сме в нашата разрастваща се купчина нагоре, адреси на паметта започват от 0 в горната и растат до искали 4,0 милиарда на дъното. Ние разполагаме със масив "в" някъде в паметта, тогава имаме нашия указател към бар точно под него, и тогава ние имаме това спаси рамка показалка в нашата обратен адрес и стак нашата майка е рутинна. Помниш ли какво обратния адрес е? Това е, когато основната призовава функция Foo, извиква функция, бар, неизбежно, бар възвръщаемост. Така че, когато бар възвръщаемост, те трябва да знаят, че това е връщане назад към Foo, че се обади. Така че обратния адрес е адресът на функцията, която тя трябва да се върне, когато се връща от функцията. Причината, поради която е важно за препълване на буфера атаки е така, защото, удобно, хакери искали да промените, че обратен адрес. Вместо да ходят обратно към Foo, аз отивам да се върна там, където хакер иска от мен да се върна в. И, удобно, където хакер често иска да се върне към е началото на буфер, който първоначално имахме. Така че забележите, отново, Little Indian. Уредът е пример за Little Indian система, така цяло число или указател е съхранен с байтове обърнати. Така че тук ние виждаме - това ли е? Да. Виждаме Ox80, OxC0, Ox35, OxO8. Помнете цифри шестнадесетични? Ние не променят шестнадесетични цифри в Little Indian, защото две шестнадесетични цифри правят един байт, и ние се обърне байтове. Ето защо ние не съхраняваме, като, 80530CO8. Ние съхранява, вместо, всяка двойка от две цифри, като се започне от право. Това се отнася до адрес адреса на старта на нашия буфер, който ние всъщност исках да копирате в на първо място. Причината, че е полезно, защото, ами ако нападателят стана с, вместо да се налага низ, който беше само безобиден като низ от своето име или нещо такова, Ами ако, вместо това, че низ са само някои произволен код че е направил всичко, което исках да направя? Така че те биха могли да - аз не мога да се сетя за готино код. Тя може да бъде нещо, все пак. Всяко бедствено код. Ако искаха, можеха просто да направим нещо по сегменти грешки, но това би било безсмислено. Те обикновено го направя, за да проникна вашата система. Добре. CS50 библиотека. Това е, общо взето, getInt, getString, всички тези функции, ние, предвидени за вас. Така че ние имаме Чар * низ, и това е абстракция, че ние отвя в някакъв момент по време на семестъра. Не забравяйте, че низ е просто един набор от знаци. Така че тук ние виждаме съкратена версия на getString. Трябва да погледнем назад към това да се помни, как се прилага на практика. Ключови подробности са, забележете, ние получите в един символ в даден момент от стандарт, който е точно като нас, пишете на клавиатурата. Така че един символ в даден момент, и ако получим твърде много герои, така че ако N + 1 е по-голяма от капацитета, тогава ние трябва да се увеличи капацитетът на нашия буфер. Така че тук ние сме удвояване на размера на нашия буфер. И това продължава да работи, ние да го вмъкнете в нашия буфер докато не получа нова линия или в края на файл или каквото и да, като в този случай, ние сме готови с въжето и след това реално getString свива паметта, като, ако ние разпределя прекалено много памет, че ще се върна и да се свие малко. Така че ние не показваме това, но основната идея е тя трябва да се чете в един символ в даден момент. Не може просто да прочетете в цялата работа наведнъж, защото тяхната буфер е само на определен размер. Така че, ако низа, че той се опитва да вмъкнете в буфер е твърде голям, а след това ще прелее. Така че тук можем да предотвратим, че само с четене на един символ в даден момент и отглеждане, когато имаме нужда да. Така getInt и други библиотечни функции CS50 са склонни да използват getString в техните реализации. Така че аз подчерта важните неща тук. Той призовава getString да получите низ. Ако getString не успя да се върне паметта, не забравяйте, че getString mallocs нещо, така че всеки път, когато ти се обадя getString Вие не трябва да (неразбираемо) освободи че низ, че имаш. Така че тук, ако той не успя да изчистване нещо, връщаме INT_MAX само като знаме, че хей, ние всъщност не бяха в състояние да получи цяло число. Трябва да игнорираме каквото и да се върне към вас, или Вие не трябва да се отнесем към това като валиден вход. Накрая, като се предполага, че са успели, ние използваме sscanf с този специален флаг, което означава, първо съответства на цяло число, тогава съвпадна с никакви знаци след това число. Така че забележите искаме тя да е равна 1. Така sscanf връща колко мачове, ако успешно направени? Той ще се върне 1, ако то е успешно съвпадение цяло число, тя ще се върне 0 ако не съответства на цяло число, и тя ще се върне 2 ако той съвпада цяло число, последвано от някои характер. Така че забележите ние повторен опит, ако съвпада с нищо, но един. Така че, ако влезе 1, 2, 3, C, или 1, 2, 3, X, след 1, 2, 3 ще се съхраняват в цяло число, X ще се съхраняват в характера, sscanf ще се върне 2, и ние ще се опита отново, защото ние искаме само едно число. Бързо духаше през HTML, HTTP, CSS. HyperText Markup Language е структурата и семантиката на мрежата. Ето пример от лекция, където имаме HTML тагове. Имаме тагове главата, тялото, тагове имаме примери на празни тагове, където ние всъщност не разполагат с начало и близо етикет, ние просто трябва връзка и имидж. Не е затваряне тагове образ; има само един таг, който постига всичко етикет трябва да се направи. Връзката е пример, ние ще видим как ще се свърже с CSS, скрипт е пример за това как можете да се свържете външен JavaScript. Това е доста ясен, и не забравяйте, HTML не е език за програмиране. Ето, спомням как бихте определи формуляр или поне това, което това ще правим? Такава форма има действие и метод. Методите ви само някога ще видят, са GET и POST. Така че да е версията, когато нещо стане постави в URL адреса. POST е мястото, където това не се поставя в URL адреса. Вместо това, се добавят още скрити в искането за HTTP никакви данни от формата. Така че тук, действие определя къде искане на HTTP отива. Къде ще е google.com / търсене. Метод. Запомни разликите между GET и POST, и, да кажем, като пример, ако искате да отбележите нещо. Вие никога няма да бъде в състояние да маркирате URL на POST тъй като данните не са включени в URL адреса. HTTP, сега, е HyperText Transfer Protocol. Протокол за трансфер на хипертекст, което бихте очаквали да прехвърляте HyperText Markup Language, и го прави. Но тя също така прехвърля всякакви изображения, които намерите на уеб, всяко сваляне правите започват като заявка за HTTP. Така че HTTP е само на езика на World Wide Web. И тук трябва да се признае този вид заявка за HTTP. Тук HTTP/1.1 на страната просто казва, че това е версия на протокола, аз съм с помощта. Това е почти винаги ще бъде HTTP/1.1, като ще го видите. След това ние виждаме, че това е GET, алтернативата е POST, за да видиш. И адреса, че аз се опитвах да посетите беше www.google.com/search?q = дрън, дрън, дрън. Така че не забравяйте, че това, въпросителен знак на Q = бла бла бла, е от онези неща, които е подадено от форма. В отговор той може да се върне при мен ще изглежда нещо като това. Отново, като се започне с протокола, който ще бъде, че, последван от кода на състоянието. Ето това е 200 OK. И най-накрая, на уеб страницата, която аз всъщност поисках ще бъде последван. Възможно кодът на състоянието можете да видите, и вие трябва да знаете няколко от тях. 200 OK вероятно сте виждали преди. 403 Forbidden, 404 не е намерена, 500 вътрешна грешка в сървър обикновено, ако отидете в един сайт и нещо не е счупено или техните PHP код катастрофи, докато в уреда имаме тази голяма оранжева кутия , който идва и казва, като, нещо не е наред, този код не работи или тази функция е лошо. Обикновено уеб сайтове не искат да знаят какви функции всъщност са лоши, Така че, вместо те просто ще ви дам 500 вътрешния сървър грешки. TCP / IP е един слой под HTTP. Не забравяйте, че има интернет извън World Wide Web. Например, ако играете онлайн игра, която не минава през 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 прави повече. Помислете за това, като, имате работещ уеб браузър. Може би имате някои бягане приложение за електронна поща; може би имате някаква друга програма, която използва Интернет управлението. Всички те се нуждаят от достъп до интернет, но компютърът разполага само с един WiFi карта или нещо такова. Така че пристанищата са начинът, по който ние сме в състояние да се разделим как тези приложения са в състояние да използват интернет. Всяко заявление получава един специфичен порт, който тя може да слушате на, и по подразбиране, HTTP използва порт 80. Някои имейл услуги използват 25. Ниските-номерирани тези са склонни да бъдат запазени. Вие обикновено са в състояние да получи по-висок номерирани от тях за себе си. CSS, Cascading Style Sheets. Ние стил уеб страници с CSS, а не с HTML. Има три места, можете да поставите вашия CSS. Тя може да бъде инлайн, между стил тагове, или в съвсем отделен файл и след това свързан инча И тук е само един пример за CSS. Трябва да се признае този модел, където първият пример е, че ние сме съвпадение на тялото маркер, и тук ние сме центриране на тялото маркер. Вторият пример, ние сме съвпадение на нещо с ID букмейкър, и ние сме прилагане на някои стилове на това. Забележете, че ID букмейкър подравнява вляво, докато тялото текстови подравнява център. Footer е вътре в тялото. Тя ще, вместо това, подравняване на текста наляво, въпреки че тялото казва подравняване на текста център. Това е цяло каскаден част от него. Вие може да има - можете да зададете стилове за тялото, и след това нещата в организма, можете да зададете по-конкретни стилове, и нещата работят според очакванията ви. По-специфични CSS спецификатори имат предимство. Мисля, че това е всичко. [Ali Nahm] Здравейте всички. Ако можех просто да привлече вниманието ви. Аз съм Али и аз отивам да мине през PHP и SQL наистина бързо. Така че можем да започнем. PHP е съкращение от PHP: Hypertext Preprocessor. И тъй като всичко, което трябва да знаете, че това е от страна на сървъра скриптов език, и ние го използваме за задния край на уеб сайтове, и как го прави много изчисления, зад кулисите част на. Синтаксис. Това не е като C, изненада, изненада. Тя винаги трябва да започнем с това, ако можете да видите, - аз не мога да се движи напред. Можете да видите, вие се нуждаете от нови видове скоби и след това вие също се нуждаете от? PHP. Това е винаги, как трябва да се оформи вашата PHP текст, вашият PHP код. Така че не може просто да бъде като C, където можете вид го постави на първо място. Трябва винаги да го заобикалят. И сега, основният синтаксис е, че всички променливи трябва да се започне с $ характер. Трябва да го направя, когато сте ги дефинира, вие трябва да го направим , когато имате предвид, за да ги по-късно. Вие винаги се нуждаят, че $. Това е вашият нов най-добър приятел, доста много. Вие не - за разлика от C, не е нужно да се сложи какъв тип променлива е то. Така че, докато имате нужда долара, не е нужно да се сложи, като, Int X или Y низ, и така нататък, и така нататък. Така една малка разлика. В резултат на това, това означава, че PHP е слабо тип. PHP е слабо език тип, и е слабо написали променливи. С други думи, това означава, че можете да превключвате между различните видове променливи видове. Можете да съхранявате на вашия номер едно като едно цяло число, можете да го съхранявате като низ, и можете да го съхранявате като поплавък, и всичко това ще бъде, че номер 1. Въпреки, че сте го съхранявате в различни форми, тя все още е - типовете променливи все още съществува в края на краищата. Така че, ако погледнете тук, ако си спомняте от PSET 7, много от вас вероятно имаше проблеми с това. Две еднакви знаци, 3 равни знаци, 4 равни знаци. Добре, няма четири равни знаци, но има 2 и 3. Можете да използвате две равни знаци, за да се покажат стойностите. Тя може да се провери целия видове. Така че, ако можете да видите в първия пример, Имам num_int == num_string. Така че вашата Int и си низ са както технически, 1, но те са различни видове. Но за двойните за равенство, то все пак ще мине. Въпреки това, за тройни равенство, той проверява стойност, както и различни видове. Това означава, че той няма да премине в този втори случай тук, къде сте с помощта на 3 равни знаци вместо. Така че това е една основна разлика, че всички трябва да са показали сега. String конкатенация е друг мощен нещо, което може да се използва в PHP. Тя е основно само този удобен нотацията с точка, и това е начина, по който може да се свърже струни заедно. Така че, ако имате котка и имате куче, а вие искате да поставите две струни заедно, можете да използвате този период, както и че е вид на това как тя работи. Можете също така просто да ги поставите една до друга, както можете да видите тук, в долния пример, където съм ехо низ 1, пространството низ 2. PHP ще знаете, за да ги замени като такива. Масиви. Сега, в PHP, има два различни масиви. Можете да имате редовни масиви, и можете също да имат асоциативни масиви, и ние ще мине през тях точно сега. Редовни масиви са просто тази в C, и така имате индекси, които са номерирани. Точно сега ние просто ще се създаде една и сложи - така че това е начина, по който се създава празен масив, след това отиваме да пусната в индексния номер 0. Отиваме да се сложи под номер 6, на стойност 6. Можете да го видите на дъното тук. Where's - с индекс номер 1 отиваме да се сложи стойност номер 4, и така можете да видите, че има шест, има 4, и след това, тъй като ние сме печат неща, когато ние се опитваме и да отпечатате стойността съхранява при пореден номер 0, тогава ще видите, че стойността 6 се отпечатва. Cool? Така че това е редовно масиви за вас. Друг начин можете да добавяте неща, за да редовни масиви сега е просто да ги добавите в края. Това означава, че не е нужно да се уточни конкретната индекса. Можете да видите номера, а след това в квадратните скоби, че няма определен индекс. И тя няма да разбере - PHP ще знаете, за да го добавите към края на списъка, следващата безплатно място. Така че можете да видите на едно точно там в този 0 петно, на два отиде право там в първия място. The 3 отива - добавя там. Така че този вид има смисъл. Ти просто постоянно да го добавите, и тогава, когато сме в духа на индекса на номер 1, той ще отпечата стойността 2. Тогава ние имаме масиви, които са асоциативни масиви. Асоциативни масиви, вместо като числови индекси, това, което те правят, е, че имат показатели, които са от низ. Можете да видите, вместо - Отървах се от всички тези цифри индекси, и сега е key1, key2, key3, и те са в двойни кавички, за да покаже, че те са всички струни. Така че ние можем да имаме един пример за това. Примерът за това е, че ние имаме TF, и това е името на индекса. Отиваме да се сложи "Али", както е името, в индекса, калории изядени, ние може да се сложи вътр този път вместо на низ, и след това в индексни харесва, можем да сложим целия масив вътре в него. Така че това е един вид - това е подобна концепция за това как сме имали индекси с номера, но сега можем да променим индексите около да ги има като струни, вместо. Можете също така да направи това, освен просто да го прави поотделно, можете да направите всичко това в едно парче. Така че можете да видите, че TF на този масив, и след това ние ги зададете в една гигантска квадратна скоба комплект. Така че може да ускори нещата. Това е повече от стилистичен избор, отколкото не. Ние също имаме примки. В C имаме вериги, които работят по този начин. Имахме нашия масив, и ние отидохме от индекса 0 до края на списъка, и ние го отпечатате всички, нали? Освен проблемът е, за асоциативни масиви, ние не непременно знаете тези числови индекси защото сега имаме индексите на струнни. Сега ние използваме foreach цикли, които, отново, да се надяваме, използвани в PSET 7. Foreach примки просто ще знаят всяка една част на списъка. И това не трябва да се знае точно числения индекс, който имате. Така че ще трябва синтаксис foreach, така че е foreach, да поставите на масива. Така че моята масив се нарича PSET, и след това, тъй като тази дума, и след това да поставите този местен временна променлива, че започваш да се използва само за конкретното нещо, което ще се проведе на специфичните - Например един или една част от масива. PSET брой ще проведе една, и тогава може би ще се проведе под номер 6, и след това ще се проведе под номер 2. Но това е гарантирано да мине през всяка една стойност, която е в масива. Полезни функции, които трябва да знаете в PHP са на изискванията, така че да гарантира, че сте включително определени файлове, ехо, напускането, празни. Аз силно препоръчвам ви да погледнете PSET 7 и гледам на тези функции. Може би трябва да се знае тези, така че аз определено ще знаете какво точно тези са всички прави. И сега отиваме да мине през обхват наистина бързо. В обхват, PHP е един вид нещо фънки, за разлика от C, И така, ние просто ще мине през него бързо. Така че нека да кажем, че сме започне в тази стрела, че имаме там. И ние ще започнем с $ аз. Така че променливата "Аз" ще бъде 0, и ние просто ще го задържи печат в тази голяма бяла кутия там. Ние ще започнем с i0, а след това ние ще го повторя. Така че там е 0. И тогава ние ще го увеличите от за линия, и след това тя ще бъде на стойност 1. Един от тях е по-малко от 3, така че няма да мине през това за цикъл, и след това отиваме да го видя отново отпечатана. Отиваме, за да го увеличите отново до 2, и 2 е по-малко от 3, така че ще премине на линия за, и това ще отпечата две. Тогава ще се отбележи, че 3 не е по-малко от 3, така че ние ще избягаме от за линия. Така че сега ние сме излезли, а след това ние ще отидем в aFunction. Добре. Така че ще трябва да се отбележи, че тази променлива, която сме създали, на "Аз" променлива, не е локално с обхват. Това означава, че тя не е местно, така и на цикъла, и тази променлива ние все още може да има достъп и да промените по-късно, и тя все още ще бъде ефективна. Така че, ако отидете в функцията сега, вие ще видите, че ние също да използвате "Аз" променлива, и ние отиваме да увеличите "аз" + +. Може би си мислите, на първо място, на базата на C, че това е копие на "Аз" променлива. Това е съвсем различно нещо, което е правилно. Така че, когато ние го отпечатате, отиваме да отпечатате 'аз' + +, който ще се разпечатва, че 4, и след това отиваме да - съжалявам. После отиваме до края от тази функция, и ние ще бъдем там, където тази стрела е точно сега. Това означава, че след това, обаче, въпреки че функцията променя стойността на "I", не се променя извън функция защото функцията има отделен обхват. Това означава, че когато ехо "I", това не се е променила в обхвата на функцията и така след това отиваме да отпечатате 3 отново. Различни неща за обхват в PHP, отколкото в C. Сега в PHP и HTML. PHP се използва за направата на уеб страници динамично. Тя вид прави нещата по-различно. Имаме го различава от HTML. С HTML, ние винаги просто имат същото нещо статично, като как Rob показа, като има предвид, PHP, можете да промените нещата, въз основа на които е потребителят. Така че, ако имам това, което имам, "сте влезли в системата като -" и след това името, и мога да промените името. Така че точно сега името е Йосиф, и тя има "За мен", но след това също може да се промени името да има Tommy. И това ще бъде нещо различно. Така че след това ние можем да променим различни неща за него, и ще покаже различно съдържание на базата на името. Така че PHP може да вид промени това, което се случва във вашия сайт. Same тук. Все пак, имайте предвид, че те имат различно съдържание, макар и да са технически все още достъп до същата тази уеб страница на повърхността. Генериране на HTML. Има два различни начина, по които можете да направите това. Така че ние ще мине през това точно сега. Първият начин е, че имате - Да, съжалявам. Така че просто трябва редовно си за цикъл в PHP, и тогава ехо в PHP и ехо от HTML. Използвайки това, което Rob ви показах на HTML скрипт и след това с помощта на PHP шрифт просто да го разпечатате на уеб страницата. Алтернативният начин е да го направите, като че ли отделянето на PHP и HTML. Така че можете да имате линия на PHP, която стартира за линия, тогава може да има линията на HTML в отделно нещо, и след това ти свърши цикъла, отново, с PHP. Така че това е един вид го отделя. От лявата страна, че можете да имате всичко - това е просто едно парче от PHP. В дясно можете да видите, че имате една линия на PHP, имате една линия на HTML, а вие имате една линия на PHP отново. Така че отделянето в това, което правят. И вие ще се отбележи, че и в двата случая, за някоя от тях, те все още отпечатате изображението, изображението, изображението, така че HTML все още се отпечатва по същия начин. И тогава все още ще видите три изображения се показват на вашия сайт. Така че това е два различни начини за правене на едно и също нещо. Сега имаме форми и искания. Както Rob ви показах, има форми на HTML, и ние просто ще бриз през тази. Имате действия и имате метод, и вашите действия мило от твоя страна, когато ти започваш да го изпратите показва, и методът е дали това ще бъде GET или POST. И искане за GET, както каза Роб, означава, че ти започваш да го сложи във форма и вие ще го видите като URL, като заявка за POST няма да видите в URL. Така една малка разлика. Въпреки това, едно нещо, което е подобно нещо е, че POST и GET са еднакво несигурни. Така че може да си мислите, че само защото не го виждам в URL, това означава, че на мненията е по-сигурна, но все още можете да го видите в бисквитките в информацията, която сте изпращане. Така че не мисля, че за една или друга страна. Друго нещо е да се отбележи, е, че вие ​​също имате раздел променливи. Вие, момчета, използвани в този PSET 7, за да получите информация за потребителя ID. Какво се е случило е, че можете да използвате този асоциативен масив, на $ _SESSION, и тогава вие сте в състояние за достъп до различни неща и съхраняване на различни неща по страниците. Последното нещо е, че ние имаме SQL, Structured Query Language, и това е език за програмиране, за да управлявате бази данни. Какво точно са бази данни? Те са колекции от маси, и всяка таблица може да има подобен вид обекти. Така че ние трябваше таблица на потребителите във вашата финанси PSET. И защо те са полезни? Защото това е начин на трайно съхраняване на информация. Това е начин за проследяване на неща и управление на неща и всъщност го виждаме по различни страници и водене песен. Като има предвид, ако просто го съхранява в този един момент незабавно и след това да го използвате по-късно, няма да бъде в състояние да получите достъп до всичко, което сте записали. В момента има 4 основни неща, които ние използваме за SQL команди. Ние имаме избор, вмъкване, изтриване и актуализация. Тези, които са наистина важни за вас, момчета да знаят за вашия тест. Ние бързо ще премине изберете точно сега. По принцип, който сте избрали редове от база данни. Така че, ако имате, точно тук - имаме тези две различни неща, а ние искаме да изберете от таблицата на класове където страхотно - къде в страхотно колоната стойност е 1. Така че можете да видите тук, ние имаме тези две неща от името на класа, CS50 и Stat110, а ние имаме документи за самоличност класа и лозунга. Така че ние искаме да изберете всички на тази информация. След това можете да видите тук, че това е вид на подбиране на това страхотно колона, където всички неща са едно, а след това го има клас ID, името на класа и слогана, че тя може да избирам. Как точно го правиш това в кода? Вие трябва да използвате PHP. Така че това е вид как PHP и SQL са свързани един с друг. Сега имаме нашия код, и ние ще използваме нашата функция заявка както направихме в PSET 7, и ние отиваме да стартирате заявката за SQL. След това ние ще трябва - ние винаги трябва да се провери дали тройната равен ред, ако лъжа. Така че отново, вие искате да се провери вида и стойността, и след това, ако тя не работи, а след това искате да се извини, както обикновено, както направихме в PSET 7. В противен случай, вие искате да се накъдрят през всичко с тези, удобен foreach цикли, че ние просто се приближи. Сега, че ние сме примка през и сме го направи миналото, нека приемем, че нашата заявка премина, сега имаме нашия foreach цикъл. И на първия ред го има, така че тук е ред, точно тук, той е опакован. Това ще отпечата цялата информация, която го е намерила. Така че няма да разпечатате на дъното "Wanna Научете HTML?" След това ще преминете към следващия ред, защото е завършил първият за линия, и така след това, че ще ходи да разпечатате на втора линия от него, която ще бъде STAT110, Намери всички моменти. Едно последно нещо, което е на SQL уязвимости. Знам, че Дейвид докосна по този малко в лекция. Можете да прочетете по-късно. Това е наистина смешно. SQL Injection е вид сложно нещо. Да кажем, че просто се придържаме тези променливи право в заявката си, както можете да видите, че в първата линия. Така че изглежда добре, нали? Вие сте просто поставяне в името на потребителя и парола, за да си SQL заявка, и искате да го пращам и да получите всичко, което е във вашата таблица данни. Това изглежда доста проста. Така че нека да кажем някой поставя в, за паролата, това OR текст точно тук - всъщност трябва да бъде в червената кутия. Така че нека да кажем, че те поставят тази парола в - това е, което те влизат. Така че те са пускането OR "1" = 1. Нещо глупаво парола да има. Сега нека просто да го замени в, и вие ще се отбележи, че в тази SQL заявка сега, тя оценява, че винаги е вярно, тъй като ще се отбележи, че можете да SQL заявка изберете всички на тази информация или може просто да имат 1 = 1. Така че винаги ще се оцени като истина. Това не се случва наистина да работи, защото това означава, че хакерът може да се счупят в системата ви. Решението за това е, че трябва да се използва системата ЗНП, което означава, че вие ​​трябва да използвате въпросителни знаци, което е това, което вие, момчета, използвани в PSET 7, къде отиваш да използвате въпросителен знак на мястото на мястото, където искате да сложите нещо, и тогава започваш да има запетая, а след това ще имате по-късно, след низ, различните променливи, които искате да заместите във вашия въпросителен знак. Така че ще се отбележи тук, че сега имам тези червени въпросителни знаци. Тогава сложих променливите след моите струни, така че знам, за да ги замени в този ред след това. Това ще се уверете, че ако някой го прави по този начин, и те имат или 1 = 1 ситуация, която ще се уверете, в задния край, се уверете, че той всъщност няма да се прекъсне заявката за SQL. Добре, така че това е доста много, вихрушка на PHP и SQL. Най-доброто от късмет на всички вас, а сега и на Орегон [Oreoluwatomiwa Babarinsa] Добре всички. Време е да вървим по някои JavaScript и някои други неща, много бързо, така че ние не ви държат тази вечер. JavaScript. Да. JavaScript е вид на нещо готино, се предполага. Нещата, които наистина трябва да знаете за JavaScript, това е нещо като страна на клиента края на това, което вашата Web App ще се прави. Има някои неща, които просто не искат да се грижат за цялото време на сървъра страна. Всички малки взаимодействия, изтъквайки едно нещо, което прави нещо да изчезне. Наистина не искам да трябва да говоря с вашия сървър през цялото време за това. А някои от които дори не е възможно да се направи на сървъра страна. Ето защо се нуждаем от нещо като JavaScript. Готини неща за JavaScript: Тя е динамично напечатани. Какво означава това е, че вашата програма не е необходимо да знаете какво по-точно, променливите са, когато го напиша. Тя просто ще вид го разбера като това е тичане. Други неща, които са страхотно за него: Това е къдрава език презрамки, което означава, че синтаксис е подобен на C и PHP. Не е нужно да се направи много преработи, когато сте обучение JavaScript. Тук имаме малко JavaScript. Интересното тук е, че, ако се вгледате в него, имаме малко на JavaScript точно там в главата маркер. Какво ли е основно само да включите файл с JavaScript. Това е един начин можете да включите JavaScript във вашата програма. Тогава вторият малко бит е всъщност някои инлайн JavaScript, много подобен на инлайн стил с CSS, и сте само писмено някакъв код много бързо там. JavaScript има решетки. Просто още един начин да се пазят данни наоколо, много полезен. Много приятен и лесен синтаксис. Можете да използвате квадратни скоби, за да получите достъп до всичко и държи всичко заедно. Нищо прекалено сложно. В готино нещо за JavaScript и скриптови езици като цяло е, че не е нужно да се притеснявате за размера на масива. Можете просто да използвате array.length и следите от него, , а също и на масива може да расте или се свива, колкото е необходимо да. Така че дори не е нужно да се притеснявате за всякакъв вид, О, не, аз трябва да се отпуснат повече неща, или нещо подобно. В готино нещо тук е, че JavaScript е нещо, наречено обекти. Той е обектно-ориентиран език, така че това, което го има, е, по същество, начин, за да можете да групирате данните заедно, донякъде подобна на структурата, но можете да я ползвате като структура или в асоциативен масив синтаксис. Това е доста проста и какво можете да правите с това е група данни, заедно ако имате един куп данни, които е свързано. Защото това е всичко, което имате нужда, за да се опише една кола, не е нужно да го има в един куп от различни места. Можете просто да го вкарвам в един обект в JavaScript. Както вероятно знаете, итерации е един от тези досадни задачи. Вие просто го направи над отново. Трябва да говоря с всеки обект в колата, или ще трябва да мине през всеки елемент от списък или нещо подобно. Така че JavaScript е, подобно на PHP, синтаксис foreach. В този случай, тя е в цикъл. Вие искате да използвате това само върху обекти. Има някои проблеми, които възникват, ако използвате този на масиви. Като цяло той е едно от онези неща, макар, че е много полезно, защото елиминира много режийни защото не е нужно да спра всичко в обект от себе си. Не е нужно да си спомня всички ключови имена. Просто някак си ги върнат в този синтаксис. В това, в продължение на, просто искам да си спомням че сте се обратно всички ключове, по много подобен начин да хеш таблица. Ако си спомняте от този, когато ще постави в низ бихте могли да получите нещо че ще има стойност, свързана с него. Какво можете да направите с това е, може да се каже, добре, Сложих в една кола, и аз го нарича Ferrari. Така че можете да сложите в низ Ферари отново по-късно, и можете да получите това. И вие можете да направите това в една линия, с в цикъл. Така че просто повече за обекти. Най-важното нещо от това, което трябва да се помни, е, че можете да използвате обект STRUCT като синтаксис, когато пожелаете с тях, освен ако това, което ви ще се използва като низ не е валидно име на променлива. Така че, ако се вгледате в това там, ние имаме ключ с интервали. Е, ако ви се налага да слагам object.key, пространство, с, пространство, пространства, че просто не би имало смисъл, синтактично. Така че само мога да направя това с този вид на скоба синтаксис. Също така, JavaScript е много поле-разумно да се PHP. Имате два начина за решаване на проблема обхват. Не можете да имате Вар в предната част на променлива, и това просто означава, че това е глобален. Можете да го видите от никъде. Дори ако ви се налага да се сложи това в изявление, ако, никъде другаде в кода си, след този момент можете да видите, че променлива. Друго нещо, което, обаче, е с вар, то е ограничено до това, което функция сте влезли Ако не сте в една функция, добре, това е глобална. Но ако сте във функция, тя е видима само в рамките на тази функция. Аз нямам за пример, но, да. Това е едно от онези неща, в които можете да управлявате това, което променливи искате да бъде глобален, какво променливи, които искате да бъдат локални, но трябва да бъдете внимателни за това, защото не е нужно вида на фин контрол на зърно, което правите в C, където, ако нещо е обявено в за линия, тя ще остане в това за цикъл. Това, което ние всъщност се грижи за използването на JavaScript за манипулира уеб страници, нали? Искам да кажа, че това е защо правим това. За да направите това, ние използваме нещо, наречено DOM. Document Object Model The. По принцип, това, което той прави, е това отнема цялото си HTML и модели го изпробва в един куп обекти, които са вложени една в друга. Вие се започне с нещо като това. Имате право, от правото за мен, един куп код там, че е нещо като - Може би си мислите, че ще бъде много трудно да се манипулира, защото вие искате да се разбор през куп текст и се налага да се сглоби един от друг неща. И какво, ако не беше правилно форматиран? Лоши неща ще се случват. Така че JavaScript се грижи за това за вас, а вие да получите хубава структура на данните, като един от лявата ми страна, където можете просто да има документ, и вътре, че имате нещо, наречено HTML, и вътре, че имате на главата и тялото, и вътре, че главата ви да имат заглавие, и така нататък, и така нататък, и така нататък. Това опростява манипулиране на уеб страница, така че това е просто, ох, аз просто искам да говоря с този обект. Нещо много подобен начин можете да говорите с друг обект, който сте направили сами. Както казах, всички DOM е в предмета на документа. Или това е просто едно място и след това можете да отидете в него да намерите неща, и можете да го направите - това е най-стария стил на го прави, там горе, когато правиш document.getElementById, а след това името, и както вероятно можете да кажа, това става много тромава след известно време. Така че най-вероятно не искате да направите това. Ето защо ние имаме следващото нещо, което ние ще говорим за след това. Най-важното тук е, че, добре, имате всички тези елементи, нали? Така че може би мога да променя цвета на нещо, когато страница се зарежда. И какво от това? Какво става, ако моят потребител кликне нещо? Искам да направя нещо интересно, когато щракнете върху нещо. Ето защо ние трябва събития. Можете да, общо взето, да намерите всеки елемент във вашия DOM, и след това казват, ей. Когато това се зарежда или някой го щракне, или когато мишката върху него, направи нещо с него. И това, което имаме, е, че имате функции, които се справят с това за вас. Тези функции са работещи събитие. Какво Те са - това е просто един луксозен начин на казвайки: тази функция се изпълнява само когато това събитие се случва. Така че дръжки случай, че се случи. Това е начина, по който ще бъдат изложени манипулатор на събитие. Имам някакъв бутон, и когато щракнете върху него, тя експлодира. Така че не щракнете върху бутона. Това е един от начините да го приближава, нали? Имате етикет бутон, и при щракване имате низ, който казва: О, между другото, аз правя тази експлодираща нещо за мен. В противен случай, това е просто като обикновен бутон, който току-що направихте. Можете да направите това и по друг начин, чрез хващане на DOM елемент, но ние ще спестите, че след като ние говорим за Jquery. Jquery: Това е библиотека, която е крос-браузър. Можете да го използвате в почти всичко. И то просто ви дава много инструменти, за да работим. Тъй като JavaScript, като същевременно мощен, не разполага с всички инструменти, необходими от кутията наистина да се справи с уеб приложение може да искате да направите. Така че това опростява много неща, ти дава много функции изваждането му от кутията, която обикновено вие ще трябва да си пиша, отново и отново, и отново. И просто прави нещата много проста. Вие също трябва селектори, които ви позволяват да вземе всички тези елементи от вашия DOM много по-просто, вместо да се налага да се използват тези много дълги извиквания. Повече за тези селектори. Имате право, там сте, нека да кажем, Аз искам да отида на елемент с ID на "скалата". Е, в Jquery, това е само $ и след поредица, която има половин килограм, а след това "рок". Това е много проста и много по-бързо от традиционната JavaScript начин за справяне с този проблем. И вие имате подобни неща за класове и типове елементи. Jquery е - един от най-страхотните възможности е, че може нещо да компресирате вашите заявки на вашия DOM много, много бързо. Сега ние се връщаме на работа събитие, и това е начина, по който ще се справят с едно събитие в Jquery. Така че това, което ще е тук, което казваме, всичко е наред. Имам таг скрипт, нали? Така че аз имам този инлайн JavaScript. Това, което ние ще направим е, че започваш да се каже, всичко е наред. Когато документът е готов, което означава, че е бил натоварен на документа, ние ще вляза при тази функция, и ние отиваме да се каже, добре, тази функция е всъщност прави нещо друго. Това е в общи линии казва, добре, дай ми елемент с ID на "myid." И след това дава тази функция манипулатор, който изпълнява, когато щракнете върху него. Основно това, което прави е, той казва, всичко е наред. Страницата е заредена, така че аз отивам в, да намерите този елемент, го даде това събитие манипулатор, и то основно създава своята страница за вас. И това е начина, по който искам да мисля за работа събитие. Вие просто искате да си помисля, добре, когато се появи нещо, което искам да се случи? Вие не искате да се мисли за, добре, трябва да се уверете, че разговорите в нея са за това нещо, това нещо бла бла бла, защото просто искам да говоря нещо от гледна точка на събития. Когато това се случи, това се случи. Когато това се случи, че се случва. И ако нещата да задействат други неща, това е страхотно. Но вие не искате да се опита да направи сложен код къде задейства няколко неща в същото време, защото ти просто ще си дадете главоболие. Добре. Сега можем да вземем нашата страница, за да се справят събития, но нека да кажем, ми потребител кликне върху бутон. Какво става, ако искате да изпратите това искане обратно на сървъра, но аз не искам да презаредите страницата, защото се налага да презареди нова страница всеки път получава вид досаден, и защо ми е необходим да събарят заглавната отново, и отново на долния, и всички елементи на страницата отново само за да обновите поздрав или времето? Така че това е защо ние имаме нещо като Ajax. Какво можем да направим тук с Ajax е, че ние може да се каже, добре, Искам да изпратя някои данни към сървъра, и аз искам да получа отговор обратно за да мога да се актуализира моята страница, или може би просто да се направят някои алгоритмични изчисления, че не е задължително да се покаже нещо за потребителя. Какво ви е необходимо да се направи това? Е, имате нужда от URL, което трябва да говорите. Вашият сървър не може просто магически слушате от нищото. Трябва да има специфично място сте изпращане на тези данни, за да. И вие също трябва някои данни, за да изпратите, или може би това е въпрос dataless. Вие просто искате да пинг обратно на сървъра и да кажа, хей, аз съм жив, или нещо подобно. И след това искате функция, която основно се занимава с успех. Да речем, че се върна някаква информация от вашия сървър, и искате да промените заглавието на потребителя на страницата си. Така вие ще получите информацията, обратно, и вие ще настоява, че на екрана. Какво се случва, е, когато страницата е готова, създавате на кликване функция за този бутон, наречен посрещач. Това, което след това се прави, е, когато този бутон е натиснат, искаш да говориш с greetings.php, направите заявка за POST, а вие казвате, хей, дай ми нещо от вашия сайт. Ние наистина не трябва да се опише това, но greetings.php, нека просто кажем, дава назад "Hello World". Така че да се върнем тази "Hello World", и при успех на тази, ако приемем, нищо не е наред, тогава ние просто отидете на тази цел място че ние определено и ние просто се придържаме отговора там. И това е един много лесен начин за създаване на заявка за Аякс. Много бързо, Rob вид спомена вече, неща могат да се объркат, лоши неща могат да се случат, така че искате да се запознаете с тези кодове HTTP отговор. Какво те са само, като, 200, всичко мина добре. Нещо друго, лоши неща се случиха. Това е обикновено нещо, което искате да запомните. Но е хубаво да се знае всичко това. И най-накрая, след като сме преминали през всичко това, ние трябва да говорим много бързо за проектиране, и тогава ще можем да нека всички да си тръгнеш. Design. Неща, които искате да запомните. Задайте си следните въпроси: Кой ще се използва това? Какво ще бъде да го използвате за? Какво ми пука за потребителите? Какво не те интересува? Вие просто не искам да се направи един апартамент, и нека тя просто расте и да стане този гигант, всепоглъщаща нещо, което дори не може да завърши. Вие искате да имате отделни цели и планове и неща, които искате да се справи. Направи го без усилие. Всичко това, казва, основно, направи лесно за потребителя да я използват; не го гигантска петно ​​на текст като този слайд, е да, всъщност. Вие просто искате да бъде нещо, където това е много лесно за някой, който да отиде в и правят това, което искам да правя. Вие не искате те да имат, за да навигирате 5 страници за да стигне до премиер функция на вашия сайт. Ако Google има пет страници, преди да можете дори да намерите нещо, никой няма да го използвам. И накрая, хартия прототип, фокус група. Има добър дизайн и практики за тестване. Само защото си мислиш, че работи за вас, не означава, че някой друг мисли, че тя работи. Но да, това е всичко. [CS50.TV]