[Review: Quiz 1] [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Universitatea Harvard] [Acest lucru este CS50.] [CS50.TV] [Lucas Freitas] Bine ati venit toată lumea. Acest lucru este revizuire pentru test 1. Doar ca o declarație de renunțare, aceasta este - Adică, vom încerca să acopere de material cât mai mult posibil, dar asta nu înseamnă că vom acoperi toate lucrurile care pot fi la test 1. Deci, asigurați-vă că vă luați, de asemenea, o privire la prelegere, secțiuni, tot ce poți. Quiz 1 va fi miercuri, miercurea viitoare. Deci, asigurați-vă că pentru a studia. O să fie, destul de mult, la fel ca primul test în ceea ce privește formatul său, dar este, probabil, va fi mult mai greu. Cel puțin, anul trecut, atunci când am luat 50 de ani, am crezut că a fost mult mai greu. Astfel de studiu un lot. Am de gând să acopere structuri de date și de codificare Huffman. Acest lucru este ceva care o mulțime de oameni cred că este complex, dar am de gând să încerce să facă la fel de ușor ca posibil. Mai întâi de toate, ceea ce vrem ca voi să știți pentru test 1 este de a înțelege descrierile conceptuale ale fiecăreia dintre structurile de date pe care am de gând să prezinte. Asta înseamnă că nu trebuie să de fapt, să pună în aplicare un tabel hash în testul 1. Noi nu vrem să pună în aplicare un tabel hash întreg, poate vom încerca să vă pună în aplicare unele funcții, cele mai frecvente operațiuni, dar noi nu o să te fac să pună în aplicare tot. Deci, este important să se înțeleagă conceptul din spatele fiecare structură de date și, de asemenea, că sunteți în stare să cod în C, doar cele mai frecvente operațiuni pe care le au pentru fiecare structură de date. Și, de asemenea, să poată revizui indicii și structs, pentru că ele apar foarte mult în aceste structuri de date. În primul rând, liste legate. Listele legate sunt de fapt foarte asemănătoare cu matrice, dar diferența dintre o listă de legat și o matrice, în primul rând, este faptul că o listă legat are o dimensiune foarte flexibil, în timp ce în matrice trebuie să fie de a alege o dimensiune foarte mare de matrice, astfel încât să știi că ai de gând să fie în măsură de a stoca toate datele in matrice, sau va trebui să utilizați malloc pentru a avea o lungime flexibilă de matrice. În liste legate este foarte ușor pentru a obține doar mai multe elemente, pune mai multe elemente în lista de legat sau a elimina elemente. Și de fapt, dacă nu doriți ca lista legate să fie sortate, puteți căuta și elimina elemente în timp constant, deci O (1) timp, asa ca este foarte convenabil. Trebuie doar să fie atent să-și amintească mereu la malloc și gratuit nodurile, doar pentru că dacă nu o faci, vei avea pierderi de memorie. Listele astfel legate - definirea unui nod este la fel ca ceea ce avem acolo. Am pus int n, dar puteți stoca datele pe care doriți. Deci, dacă doriți să stocați un șir, e în regulă. Dacă doriți să stocați un struct, e în regulă, un dublu, tot ce vrei. Am pus int n pentru exemplele de aici. Și aveți un pointer la nodul următor. Deci, practic, o listă legat are unele date, și apoi punctele de la nodul următor. Dacă este ultimul element din lista de legătură, se va indica la NULL. Deci, acesta este un exemplu de listă legat. Ok, deci acum hai sa vedem ce ar trebui să fac dacă vreau să insera un element într-o listă legat. În primul rând, o inserție funcție va fi de tip nule pentru că nu vreau să se întoarcă nimic. Și am de gând să ia un int ca un argument, pentru că vreau să știu ce vreau să inserați. Deci, care este primul lucru pe care ar trebui să facă? Ei bine, eu ar trebui să malloc pe newnode, astfel că este prima linie. Eu doar crearea unui nou nod pentru a pune într-o listă legat. Deci, ce pot face? Ei bine, știm că în implementări noastre de liste legate în clasă, am pus mereu capul ca o variabilă globală. Deci, ce putem face este schimba capul. Pot face acest lucru nou nod fi noul șef, și se va indica la cap anterior. Cum putem face asta? Primul lucru ce trebuie să fac este de a schimba "n" în noul nod de valoare, care a fost transmis funcției. Apoi newnode urmează va fi cap. Capul va fi newnode. Deci, este destul de simplu. Pentru ștergerea unui nod, putem face ca - Un fel am putea face acest lucru este de a spune, bine, dacă am vrut să-l ștergeți, de exemplu, 3, ceea ce am putea face este doar punctul de nodul anterior la următorul nod de 3. Deci, aș face ceva de genul asta. Dar ceea ce este problema cu a face asta? Am o scurgere de memorie, asa ca nu mai au acces la numărul 3. Problema cu care este că eu nu am de gând să fie în măsură pentru a elibera acel nod. Am de gând să aibă scurgere de memorie și (neinteligibil) este de gând să mă urăști. Deci, în loc de a face asta, ar trebui, probabil, să aibă un pointer temporar. Așa că am pus temp. Se va indica la nodul pe care vreau să-l ștergeți. Și apoi mă pot mișca nodurile anterioare la punctul de la nodul următor a nodului pe care vreau să-l ștergeți. Și, în sfârșit, pot elibera indicatorul. Trebuie să elibera indicatorul pe care l-am creat chiar acolo? Nu trebuie să, doar pentru că - diferența este că acest nod a fost creat folosind malloc, așa că este în grămadă, în timp ce acesta a fost declarat doar ca un comutator NULL în stivă. Așa că nu trebuie să-l elibereze. Bine. Deci, acum, hai sa vorbim despre stive. Stive sunt destul de simplă. Am făcut stive și cozile de la clasa, folosind doar tablouri, dar ar trebui să fie familiar - doar să fie conștienți pe care le puteți face, de asemenea, stive, în cozi, folosind liste legate, de asemenea. Deci, dacă aveți un tablou, ceea ce ar fi o stivă? O stivă, în primul rând, va trebui să aibă o dimensiune. Trebuie să stocați ceea ce este dimensiunea stivei pe care le au acum. Și, de asemenea, le-ar fi o matrice, în acest caz de numere, dar, dacă doriți, acesta poate fi un tablou de siruri de caractere, o serie de struct, tot ce doriți să stocați. Despre stiva: Diferența dintre o stivă și o listă de legat este că în stiva trebuie doar acces la ultimul element care a fost pus în stivă. Se numește ultimul intrat, primul ieșit. La fel cum ai avea un stack de tăvi, dacă ai pus o tava pe partea de sus a stivei, trebuie să scoateți tava în primul rând pentru a avea acces la alte tăvi. Este același lucru cu stive. Așa că, dacă vreau să, de exemplu, se adaugă un element la o stivă, ceea ce ar trebui să fac? Se numește împinge, și e destul de simplu. Primul lucru ce trebuie să faceți este să verificați dacă dimensiunea stivei nu este mai mare sau egală cu capacitatea stivei. Pentru că dacă sunt deja pe capacitate maximă, nu puteți adăuga orice altceva. Și apoi, dacă nu, trebuie doar să adăugați elementul de stiva. Și, în sfârșit, incrementa dimensiunea. Deci, este destul de simplu. Așa că am adăuga doar numărul 2. Și dacă vreau să pop, ceea ce înseamnă că vreau să eliminați ultimul element care a fost adăugat și a reveni valoarea elementului, primul lucru pe care trebuie să verifice este că stiva nu este gol. Pentru că dacă e gol, eu nu pot întoarce nimic. În acest caz, mă întorc -1. În caz contrar, am de gând să descrește dimensiunea spec., și numere (s.size) se întoarcă. De ce am descrește mărimea și apoi să se întoarcă s.size? E pentru că, în acest caz, spec. are dimensiunea 4, și doresc să se întoarcă al patrulea element, corect? Dar ceea ce este indicele de al patrulea element? Trei. Din moment ce eu nu mărime - va fi de 3, mă pot întoarce doar s.numbers (s.size) pentru că e 3. Deci, este doar indicele. Acum cozile. Cozile sunt cam același lucru. Singura diferență este că în loc de a avea ultimul intrat, primul ieșit, aveți primul intrat, primul ieșit. Probabil că, dacă sunteți de așteptare pentru a merge la un concert, tu nu ar fi fericit dacă ai avea un stack în loc de o listă de așteptare. Fiind ultima persoană care să vină ar fi prima persoană pentru a intra în concert. Tu, probabil, nu ar fi fericit. În coada de așteptare, prima persoană pentru a obține de la este, de asemenea, prima persoana pentru a ieși. Deci, în definirea unei cozi, pe lângă având în matrice dimensiunea, trebuie, de asemenea, să aibă cap, care este indicele de capul stivei. Deci, primul element chiar acum. Puneți în coadă este același lucru ca și împinge pentru stive. Dacă ați fost foarte naiv, ce-ar spune doar, ei bine, eu pot face exact acelasi lucru ca am facut pentru împinge. Eu pot doar să verificați dacă nu e dincolo de capacitatea. Dacă este, mă voi întoarce false, în caz contrar pot exporta doar noua valoare și apoi incrementează mărimea. Dar de ce este acest lucru greșit? Să vedem acest exemplu. Încerc să Puneți în coadă o grămadă de lucruri, și apoi am de gând să dequeue și Puneți în coadă. Există o mulțime de comenzi, dar e foarte simplu. Am de gând să Puneți în coadă de 5, deci se adaugă 5, și apoi 7, 1, 4, 6, și apoi vreau să dequeue ceva, ceea ce înseamnă că am de gând pentru a elimina primul element. Așa că am de gând să eliminați numărul 3, corect? Primul element. Bine. Acum, dacă am încerca să Puneți în coadă altceva, ce se va întâmpla? În conformitate cu punerea în aplicare a mea, Am fost de gând să pună numărul următor în q.size index. În acest caz, dimensiunea este de 8, astfel încât indicele 8 va fi chiar aici, în ultima poziție. Dacă am încerca să Puneți în coadă o chiar aici, mi-ar fi suprascrierea ultima poziție la numărul 1, care este complet greșit. Ceea ce vreau să faceți este să încheie în jurul și du-te la prima poziție. Poate v-ar spune doar, ei bine, am doar pentru a verifica dacă pot pune de fapt, ceva acolo. Dacă nu, eu spun doar, oh, noua capacitate deplină este, de fapt capacitate - 1, și nu se poate pune un element de acolo. Dar ceea ce este problema? Problema este că, dacă am dequeue doar totul chiar aici și apoi am încercați să adăugați altceva, s-ar spune pur și simplu, bine, ai fost la capacitate maximă, care este 0. Deci, coada dvs. este plecat. Trebuie să-și încheie în jurul, și un fel de ambalaj în jurul că voi învățat în psets vizionare și alte a fost folosirea mod. Puteți să-l încerca la domiciliu pentru a înțelege de ce te-ar face q.size + q.head Capacitatea de mod, dar dacă tu a verifica aici, putem vedea că funcționează. Deci, în ultimul exemplu, q.size a fost de 8 iar capul a fost de 1, pentru că a fost această poziție aici de matrice. Deci, acesta va fi de 8 + 1, 9. Capacitatea de Mod 9 ar fi 0. Aceasta ar merge la indicele 0. Vom fi în poziția corectă. Și apoi încercați coada de la domiciliu. Câteva lucruri importante: să încerce să înțeleagă diferența dintre o stivă și o coadă. La domiciliu, să încercați să obțineți foarte familiarizat cu punerea în aplicare Puneți în coadă, dequeue, împinge și pop. Și, de asemenea, să înțeleagă când le-ar folosi fiecare dintre ele. Deci, haideți să se relaxeze timp de 10 secunde, cu un buchet de pokemoni. Și acum să ne întoarcem la structuri de date. Hash mese. O mulțime de oameni s-au speriat de tabele de dispersie. în problema set 6, Spell Checker. Tabele de dispersie și încearcă, o mulțime de oameni se sperie de ele. Ei cred că sunt atât de greu de înțeles. Da? [Rob Bowden] Problema stabilit 5. Problema stabilit 5, da. Mulțumiri Rob. Da. Șase fost Huff n "Puff, da. Problema a fost stabilit 5 Spell Checker, si tu ai avut de a folosi fie un tabel hash sau un try. O mulțime de oameni crezut că au fost foarte greu de înțeles, dar ele sunt de fapt destul de simplu. Ce este un tabel hash, de fapt? Un tabel hash este o serie de liste legate. Singura diferență dintre o matrice și un tabel hash este că în tabelul hash ai ceva numit o funcție hash. Ce este o funcție hash? Nu știu dacă voi puteți citi aici. Acesta este un exemplu de tabelă hash. Astfel încât să puteți vedea că aveți un tablou cu 31 de elemente. Și ceea ce facem într-un tabel hash este o funcție hash care se va traduce o cheie, fiecare int pentru un index. În cazul în care, de exemplu, dacă vreau să aleagă pentru B. Harrison, Mi-ar pune B. Harrison în funcțiile mele hash, și funcția de distribuire se va întoarce 24. Deci, eu știu că vreau să stocați B. Harrison în 24. Deci, asta e diferența între a avea doar o rețea și un tabel hash. În tabelul hash va avea o funcție care este de gând să-ți spun în cazul în care pentru a stoca datele pe care doriți să le stocați. Pentru funcția de distribuire, vrei să te uiți pentru o funcție hash că este deterministă și bine distribuite. După cum puteți vedea aici, veți vedea că o mulțime de date pe care am vrut să magazin a fost de fapt 19 în loc de a folosi 31 și 30 și 29, care au fost toate gratuite. Deci, funcția de distribuire pe care am folosit nu a fost foarte bine distribuite. Când spunem bine distribuit, înseamnă că vrem să avem, aproximativ, cel puțin 1 sau 2 pentru fiecare din - cum ar fi, o diferență de 1 sau 2 pentru fiecare dintre indicii din matrice. Vrei să aibă, aproximativ, același număr de elemente în fiecare listă legată în matrice. Și este ușor pentru a verifica dacă acesta este valabil în tabelul hash, vezi ca tabele de dispersie. Apoi copaci. Acesta este un copac. Copaci în informatică sunt cu susul în jos pentru un motiv oarecare. Deci, aici aveți rădăcina de copac și apoi frunzele. Ar trebui să știi doar nomenclatura pentru părinți și copii. Fiecare nod are copii săi, care sunt nodurile care sunt sub părintele. Deci, de exemplu, 2 va fi mamă de 3 și pentru celălalt copil acolo, în timp ce 3 va fi mamă pentru 1 și ceilalți copii care sunt acolo. Și 1 va fi copil de 3 lui, și așa mai departe. Noi avem ceva mult mai interesant, numit un arbore binar de căutare, în care toate valorile de pe partea dreaptă a unui nod vor fi pe dreapta, chiar aici - pe dreapta, sunt de gând să fie mai mare decât elementul din rădăcină. Deci, dacă am avea numărul 5, chiar aici, toate elementele de pe partea dreaptă vor fi mai mare de 5, iar în stânga toate elementele sunt de gând să fie mai mică de 5. De ce este aceasta utilă? Ei bine, dacă doriți să verificați dacă numărul 7 este aici, de exemplu, Mă duc doar la 5 mai întâi și am de gând să văd, este de 7 mai mare sau mai mică de 5? Este mai mare, așa că știu că va trebui să fie pe partea dreaptă de copac. Așa că am avea mult mai puțin lucruri să se uite la. La punerea în aplicare a unui arbore binar de căutare, nodul, eu sunt doar de gând să trebuie să aibă date, astfel int n, ai putea avea, de asemenea, un șir sau orice ai vrut. Trebuie doar să fii atent la definirea a ceea ce este mai mare, ceea ce este mai puțin. Deci, dacă ați avut siruri de caractere, de exemplu, ai putea defini că toate aceste lucruri cu privire la dreptul de gând să aibă o lungime mai mare, stânga vor avea lungimi mai mici, așa că într-adevăr până la tine. Cum pot pune în aplicare găsi pentru BST? Primul lucru pe care va trebui să faceți este să verificați dacă rădăcina este NULL. Daca este NULL, aceasta înseamnă că un lucru nu este acolo pentru că nu au nici măcar un copac, nu? Așa că am întoarce false. În caz contrar, am de gând pentru a verifica dacă numărul este mai mare decât valoarea din radacina. Voi încerca să găsească elementul din dreapta din copac. Veți vedea că eu sunt, folosind recursivitate aici. Și apoi, dacă e mai puțin, am de gând să se uite la stânga. Și, în sfârșit, în caz contrar, dacă nu e mai puțin sau nu mai mare, aceasta înseamnă că este valoarea în sine. Așa că mă voi întoarce adevărat. Puteți vedea aici că am folosit în cazul în care, în cazul în care, în cazul în care. Și amintiți-vă, în test 0, am avut o problemă care a avut, dacă, în cazul în care, în cazul în care, și trebuia să găsească ineficiența, și ineficiența a fost că, dacă ați folosit. Tu ar trebui să fi folosit în cazul în care, în cazul în care altcineva, altceva în cazul în care, și altceva. Deci, ar trebui sa folosesc altceva în cazul în care și în cazul în care altcineva și altcineva aici? Are cineva - Da? [Student vorbind, nu pot fi auzite] E perfect. Deci, ea spune că nu contează, doar pentru că ineficiența pe care am avut-o înainte a fost că, deoarece, poate, în cazul în care unele condiție a fost îndeplinită, astfel încât ați efectuat o acțiune, dar apoi te-ai de gând să verifice toate celelalte condiții. Dar, în acest caz, ea a revenit imediat, așa că nu contează. Deci, nu trebuie să folosiți altceva în cazul în care. Și, în sfârșit, hai sa vorbim despre încercări, care este tuturor favorit. O încercare este un copac de matrice. Este foarte rapid pentru a căuta valori, dar se folosește o mulțime de memorie. Și este, de obicei, pentru a filtra cuvinte, astfel încât atunci când Vreau să pună în aplicare, de exemplu, nu știu, cum ar fi o carte de telefon în telefon și doriți să fie în măsură să tip B și doar au nume de oameni care au B. Este foarte ușor să pună în aplicare, care, folosind o încercare, de exemplu. Cum definiți un nod într-o încercare? Trebuie doar să aibă o bool care va fi is_word. Care reprezintă faptul că, folosind toate caracterele înainte de nod, ați fost în măsură să formeze un cuvânt, și apoi veți avea o serie de indicii pentru noduri. Poți vedea că avem o serie de noduri mamă, așa nod * matrice? Da? Să vedem cum va funcționa. Pentru verificarea ortografiei, avem o serie de 27 de elemente, pentru că avem toate literele plus apostrof. Înainte de aici, eu sunt doar de gând să utilizeze 2 pentru că vreau să fie în măsură să scrie pe tablă. Bine. Deci, acesta este un exemplu de un try. Dacă am defini doar primul nod, voi avea o serie de două elemente că sunt două indicii la NULL, așa că am pus "o" și "b". Și am de gând să aibă o bool care spune is_word. O să fie false pentru primul, doar pentru că, înainte de faptul că nu are niciun caracter. Deci, un cuvânt gol nu este un cuvânt. Deci, este fals. Dacă vreau să adăugați "o" în acest dicționar, ceea ce mi-ar trebui să fac? Mi-ar trebui doar să malloc un nou nod pentru "o", și apoi se adaugă cuvântul său de adevărat. Deci, ea reprezintă doar că au "o" va fi adevărat. Face sens? Apoi, dacă vreau să adăugați "ba", va trebui să malloc 1 pentru 'b', și apoi am de gând să înființeze boolean la fals, pentru că "b" de la sine, nu este un cuvânt. Apoi, am de gând să malloc altul pentru "o", astfel "ba", și apoi am de gând să înființeze este un cuvânt de adevărat. Deoarece "ba" este un cuvânt. Și apoi, dacă vreau să văd dacă "b" este în acest dicționar, Eu pot merge doar la primul, "b". Mă duc în jos, și mă uit la este cuvântul, și se spune fals. Deci, nu e un cuvânt. Dacă vreau să verificați "ba", Mă duc la primul, "b", și apoi du-te la "o", și văd adevărat, deci este un cuvânt. Face sens? O mulțime de oameni obține confuz de încercări. Nu? Fine, Huffman de codificare. Codificare Huffman este foarte util pentru a salva memorie și a comprima fișiere text, doar pentru că de multe ori se utilizează "o" și "e", de exemplu, în documente, dar nu știu dacă voi folosi "q" sau "z", la fel de mult. Având doar 1 octet pentru fiecare caracter, fiecare - de 256 de caractere pe care le avem în tabelul ASCII nu este foarte optimă, doar pentru că există unele caractere pe care le folosesc mult mai mult, deci ar trebui, probabil, folosiți mai puțină memorie pentru cei. Cum pot folosi o codificare Huffman? Avem de a face un copac Huffman.  Un copac Huffman are noduri care au un simbol care va fi ca, "a", "b", "c", scrisoarea, orice scrisoare aveti, o frecvență care este frecvența pe care cuvântul apare în text, că ai fost crearea copac Huffman pentru, și apoi un nod care se va indica la stânga de copac Huffman și un alt nod care va indica la dreapta. Deci, la fel ca un copac. Cum vă construi un copac Huffman? Ai de gând să alegeți cele 2 noduri care au cele mai mici frecvențe. Dacă aveți o cravată ai de gând să alegeți cele 2 noduri care au cele mai mici valori ASCII, de asemenea. Atunci ai de gând pentru a crea un nou copac din cele 2 noduri care va avea frecvența combinate în nodul părinte. Și atunci ai de gând să eliminați 2 copii din padure și să le înlocuiască cu părintele. Și ai de gând să repet că până când veți avea doar un copac în pădure. Deci, hai sa vedem cum te-ar face un copac Huffman pentru ZAMYLA. Puteți vedea aici că toate scrisorile au frecvență 1, cu excepția pentru "A", care are frecventa 2. Așa că am creat noduri pentru toate scrisorile pe care le pun în ordine de valoare ASCII și frecvență. Așa că dacă vreau pentru a crea primul copac, acesta va fi cu "L" și "M". Deci e aici. Frecvența perechii va fi 2 pentru că este 1 + 1, atunci următoarea 2 cu cele mai mici frecvențe sunt "Y" și "Z". Și apoi am toate fiind - au o frecvență de 2. Deci, care dintre ele sunt cele care au cea mai mică valoare ASCII pentru cea viitoare? "A" și "L". Așa că am crea un nou nod, și, în final, este de 4 și 2, astfel încât 2 va fi pe stânga. Și aceasta este arborele Huffman. Apoi, dacă vreau să scrie un text, ca în binar pentru a converti la text, folosind arborele Huffman este foarte ușor. De exemplu, dacă eu spun că se deplasează la stânga este un 0 și se deplasează la dreapta este un 1, Ce este că merge să reprezinte? Deci, cum ar fi 1, 1, atât de dreapta, dreapta, și apoi 0, deci ar fi lăsat L, și apoi 1, 0, 0. Deci 1, 0, deci doar 1, 0, 'A'. Apoi 0, 1, deci 'Z'. Și apoi 1, 0, 0 - nu. 0, 0 va fi "Y", atât de leneș. Deci, asta e tot pentru mine, Rob va prelua. [Rob Bowden] Deci, săptămâna 7 lucruri. Avem o mulțime de a trece peste foarte repede. Operatori pe biți, buffer overflow, Bibliotecă CS50, apoi HTML, HTTP, CSS. Tot în ca 15 la 20 de minute. Operatori la nivel de bit. Există 6 dintre ele pe care trebuie să știți. La nivel de bit și, la nivel de bit sau, XOR, schimbare stânga, deplasare dreapta, și nu. Trecerea de drept și nu abia văzut în curs, la toate. Vom merge peste el repede aici, dar e bine să știți că acestea sunt șase care exista. Amintiți-vă că operatorii pe biți sunt ca atunci cand faci 3 + 4. Nu sunt de-a face cu binare de 3 și 4. Cu operatori la nivel de bit vă sunt de fapt a face cu biții individuale ale numerelor 3 și 4. Deci, primul care ne vom spune este la nivel de bit nu, și tot ce face este flip-toate biți. Deci, aici, dacă sunteți scris acest lucru în C, nu s-ar scrie ca ~ 11011 sau orice altceva, v-ar scrie place ~ 4, și apoi s-ar răsturna reprezentarea binară a 4. Deci, aici, ~ de un numar binar 1101101 se va răsturna exact toate de la 1 la 0 și toate 0 la 1 lui. Așa cum am spus acolo, utilizarea frecventă a acestei, și vom vedea într-un pic, este ca și cum ne-o dorim de a veni cu un numar în cazul în care toți biții sunt 1, cu excepția unuia dintre ele. Deci, este de obicei mai ușor să-și exprime numărul în cazul în care doar un singur bit este setat, și apoi să ia ~ de ea, astfel încât orice alt bit este setat în afară de asta. Deci, asta e ceea ce am de gând să folosească mai mult într-un pic. Nivel de bit sau. Aici sunt două numere binare, și aceste 2 numere sunt destul de reprezentative, deoarece ele reprezintă fiecare posibil combinație de biți ai putea avea nevoie pentru a funcționa pe. Aici, când am or'd fiecare bit, suntem doar de gând să compare direct în jos. Deci, pe partea stanga avem un 1 și un 1. Când am nivel de bit | cei, ce am de gând pentru a obține? Unul. Apoi, la nivel de bit | 0 și 1 este de gând să-mi dea? Unul. La nivel de bit 1 și 0 va fi același lucru, unul. La nivel de bit 0 | 0 este de gând să-mi dea 0. Deci, singurul caz în care ajung 0 este în 0 | 0 caz. Și vă puteți gândi că la fel ca RUP tale logice. Deci, dacă te gândești la 1 la fel de adevărat și 0 ca fals, același lucru se aplică și aici. Atât de adevărat sau de adevărat este adevărat, adevărat sau fals este adevărat. Fals sau adevărat este adevărat, fals sau fals este singurul lucru care este de fapt fals. Iată un exemplu care ar trebui să știți ca o destul de bun exemplu, atunci când se utilizează operatori la nivel de bit. Aici, dacă am sau de capital "A" cu Ox20, și ne vom uita la acestea într-un al doilea, vom obține ceva. Și dacă am sau minusculă "o" cu Ox20, avem ceva. Deci, haideți să trageți în sus de masă ASCII. Bine. Aici vedem că "A" este - aici avem "A" este zecimal 65. Dar voi merge cu hexazecimal, care este Ox41. Destul de sigur că am văzut-o în clasă. Cred că am văzut-o în clasă că este destul de ușor să se transforme din hexazecimal în binar. Deci, aici, dacă vreau să pun 4 în binar, care este doar de gând să fie 0100. Acesta este locul 1 lui, locul 2 a lui, locul 4, astfel încât acesta este de 4. Apoi am putea împărți 1 în binar, care va fi 0001. Și așa mai departe acest lucru se întâmplă pentru a fi reprezentarea de "A" în binar. Având litere mici "a", este acum va fi Ox61, în cazul în care, divizare acestea până în binar sale, astfel încât un 6 - Hai să o facem de fapt - nu există nici o radieră? Eraser. Ox61. Deci, divizare 6 în binar va fi 0 + 4 + 2 + 0. Și despicare 1 va fi 0001. Privind la diferența dintre acestea două, vom vedea că singura diferență dintre o literă mică și un capital de "A" este acest singur bit. Deci, revenind la aici - bine. Revenind la aici, dacă ne uităm la ceea ce este bitul Ox20, așa divizare Ox20 în binar acesteia, este 0010, 0000. Ox20, doar bitul care este setat este acest ceva care ne preocupă, cu comutare între capital și litere mici "a". Dacă eu sau "A", care este aceasta, "A", dacă eu sau "A" cu Ox20, ceea ce am de gând pentru a obține? [Student, inaudibil] Minuscule "o", pentru că se va răsturna acest bit la un 1. Și dacă eu sau "o" cu Ox20, ceea ce am de gând pentru a obține? Litere mici o, pentru că doar ring 'a' cu Ox20, Mă duc să fie Oring acest singur bit la un 1, este deja un 1, așa că nu contează. Așa că am obține "un" și "o". Nivel de bit și. Din nou, ne putem gândi la acest lucru ca omologul nostru logic și. Pe partea stângă avem adevărat & adevărat. O să fie adevărat, și pentru toate cazurile, fals și adevărat sau true & false, sau false și false, nici unul dintre aceste lucruri sunt adevărate. Deci, ceea ce ne-am sfârșesc prin obtinerea este de 1000. Deci, acum, aici, aici, unde l-am folosit la nivel de bit de încredere nu, unde am avut Ox20. Deci, aceasta este Ox20. Acum, ceea ce vreau să fac, la nivel de bit ~ de Ox20. Care va răsturna toate biți. Deci, am 1101, 1111. Și așa "A" anded cu ~ Ox20 este de gând să-mi dea ce? Biți numai avem într-adevăr nevoie să se gândească la asta, întrucât, în cazul în care toți acești biți sunt setate la 1, atunci vom obține exact ceea ce "A" a fost, cu excepția, poate, ceea ce acest bit este. Pentru că în cazul în care acesta a fost un 1, acum o să fie setat la o 0, pentru că orice ar fi, anded cu aceasta va fi 0. Deci, ceea ce este "A" și ~ Ox20 de gând să-mi dea? [Studenții răspunde, nu pot fi auzite] Și ceea ce este "un" și - este "A". Și ceea ce este "o" și ~ Ox20 de gând să-mi dea? "A." Deoarece acest lucru este în prezent o 1. Anding cu aceasta 0 este de gând să facă un 0, și acum am de gând să obțineți un "A". Ambele sunt "A", iar ultimul, dar nu cel mai puțin de acest tip, avem XOR. Este foarte mult ca sau, cu excepția înseamnă exclusiv sau. Aceasta este ca și cum ceea ce crezi, de obicei, de drept sau în lumea reală. Astfel încât să nu fie "x" sau "y", dar nu ambele. Aici 1 ^ 1 va fi 0. Pentru că adevărat, aceasta este - nu funcționează la fel de bine cu logică adevărat și fals ca nivel de bit & și sau nu, dar adevărat ^ adevărat este fals. Pentru că vrem doar să se întoarcă adevărat în cazul în care numai una dintre ele este adevărat. Deci, 1 ^ 1 este 0. Ce zici de 0 ^ 1? Este 1. 1 ^ 0 este 1, 0 ^ 0 este 0. Deci, în toate circumstanțele, 0 nivel de bit ceva 0 va fi 0. 1 la nivel de bit ceva 0 0 sau la nivel de bit 1, dacă e | sau ^, va fi un 1, și dacă e si va fi 0. Și singurul caz în care un nivel de bit 1 nu este 1 este de exclusiv sau. Asta este 0110. Deci, aici, acum, folosind XOR - așa ne-am întors la 20. 'A' ^ Ox20 este aceste 2 biți suntem compararea. Deci, un 1 ^ 0 este de gând să-mi dea un ce? Un unul. 'A' ^ Ox20 este de gând să-mi dea? Minuscule o. 'O' ^ Ox20 este de gând să-mi dea? Capital A. Pentru că indiferent de acest lucru este de a face, acest XORing cu Ox20 este flipping în mod eficient, indiferent de acest bit este. În cazul în care acest lucru este un 0, este acum va deveni un 1. Deoarece acesta este un 1, 1 ^ 1 este 0. Deci noastre "o" a devenit "A", și a noastră "A" a devenit "o". Deci, XOR este un mod foarte convenabil de doar flipping cazului. Doar doriți să itera peste un șir de scrisori și un supleant în cazul de fiecare caracter, tu doar XOR totul cu Ox20. Acum am plecat schimbare. Deviere la stânga este doar de gând să, practic, împinge toate numerele în, sau la stânga, și introduceți 0 în spatele lor. Deci, aici avem 00001101. Vom împinge 3 0 de pe partea dreaptă, și ne 01101000. În termeni nonbinary, vom vedea că este într-adevăr de-a face 13 stânga mutat cu 3, ceea ce ne dă 104. Schimbare atât de stânga, vedem aici, x << y este de fapt x * 2 ^ y. 13 * 2 ^ 3, 2 ^ 3 este 8, deci 13 * 8 este 104. Dacă te gândești doar despre binar, în general, modul în care fiecare cifră, dacă pornim de la dreapta, acesta este locul 1, atunci locul 2, atunci locul 4 este. Deci, prin împingerea în 0 de pe partea dreaptă, suntem doar împingând lucrurile care erau în loc 4 la loc de 8, și lucruri care au fost, în loc 8 la loc de 16. Fiecare schimbare doar înmulțește cu 2. Da? [Student] Ce se întâmplă dacă ai mutat de 5? [Bowden] Dacă ați mutat de 5 v-ar pierde doar cifre. În mod inevitabil, e același lucru. Cum ar fi, întregi sunt doar 32 de biți, așa că, dacă adăugați două numere întregi într-adevăr mari, pur si simplu nu se încadrează într-un întreg. Deci, e același lucru aici. Dacă ați mutat de 5, ne-ar pierde doar că unul. Și asta e un fel de ceea ce vreau să spun de "aproximativ" în cazul în care dacă ai schimba prea mult, pierzi biți. Deplasare la dreapta va fi opusul, unde am de gând să bage 0 de pe la sfârșitul, și pentru scopurile noastre, completați 0 de pe partea stângă. Deci, a face acest lucru, suntem practic de mers înapoi ceea ce am făcut deja. Și vom vedea că cele trei 0 e pe dreapta tocmai au căzut, și ne-au împins 1101 tot drumul spre dreapta. Aceasta face 104 3, care este, în mod eficient, x / 2 ^ y. Deci, acum, aici, este o idee similară. De ce este doar aproximativ x / 2 ^ y, și nu de fapt x / 2 ^ y? Pentru că dacă aș fi mutat de 4, mi-ar fi pierdut un 1. Practic, ce crezi despre, cred că doar de diviziune întreg în general. Deci, cum ar fi 5/2 este 2. Nu e 2,5. Este aceeași idee aici. Când ne-am împărți cu 2, putem pierde biți ciudate de-a lungul drum. Deci, acum - asta e de la nivel de bit. Asta e tot ce trebuie să știi. Amintiți-vă de cazuri de utilizare le-am văzut în clasă, cum ar fi o mască de biți este util pentru operatori la nivel de bit, sau de a le utiliza pentru măști de biți. Majuscule și litere mici, conversii este un exemplu destul de prototip. Ok, deci buffer overflow atacuri. Oricine amintesc ce era în neregulă cu această funcție? Observați am declarat o serie de 12 bytes, 12 caractere, și apoi ne-am copia în tampon noastră a 12 caractere intregul bar șir. Deci, care e problema aici? Numărul magic de 12 ar trebui să pop destul de mult imediat ca - de ce 12? Ce se întâmplă dacă bara se întâmplă să fie mai mult de 12 de caractere? Ce se întâmplă dacă bara este milioane de caractere? Aici problema este memcpy. În cazul în care bara este suficient de lung, se va doar complet - "c", "c" nu-i pasă că a fost doar de 12 caractere; "C" nu-i pasă că nu se poate potrivi că multe bytes. Acesta va suprascrie doar complet char, de 12 bytes care le-am alocat pentru aceasta, și tot trecut-o în memorie care nu aparțin de fapt că tampon cu orice bara șir este. Deci asta a fost imaginea am văzut în clasă unde ne-am stiva noastră de creștere. Tu ar trebui să fie utilizate pentru aceste imagini sau sa se familiarizeze cu ei din nou. Ne-am stivă nostru de creștere, adrese de memorie încep de la 0 la partea de sus și să crească până la ca 4 miliarde în partea de jos. Avem array 'c' nostru undeva în memorie, apoi ne-am pointer nostru de a bloca chiar sub ea, și apoi ne-am acest indicator cadru salvate în adresa noastră de întoarcere și stack-ul de rutina nostru părinte. Amintiți-vă ce adresa expeditorului este? Este atunci când principal numește o foo funcție, solicită un bar funcție, în mod inevitabil, bar întoarce. Deci, atunci când se întoarce de bare, ei trebuie să știe că se va întoarce la foo pe care a numit-o. Deci, adresa expeditorului este adresa de funcția pe care trebuie să se întoarcă la atunci când se întoarce de funcții. Motivul pentru care este important pentru atacuri buffer overflow se datorează faptului că, în mod convenabil, hackeri dori să schimbe adresa de retur. În loc de a merge înapoi la foo, am de gând să se întoarcă la oriunde hacker vrea să mă întorc la. Și, în mod convenabil, în cazul în care hacker vrea frecvent pentru a reveni la este începutul tamponului pe care o avea inițial. Deci observa, din nou, Little Indian. Aparatul este un exemplu de sistem Micul indian, astfel încât un număr întreg sau un pointer este stocată cu bytes inversate. Deci, aici vom vedea - este aceasta? Da. Vedem Ox80, OxC0, Ox35, OxO8. Amintiți-vă de cifre hexazecimale? Noi nu inversa cifre hexazecimale în Little Indian, deoarece 2 cifre hexazecimale alcătuiesc un singur octet, iar noi inversa bytes. De aceea noi nu se păstra, cum ar fi, 80530CO8. Noi stoca, în schimb, fiecare pereche de 2 cifre, începând de la dreapta. Această adresă se referă la adresa de început de tampon noastre, care de fapt ne-am dorit pentru a copia în în primul rând. Motivul pentru care este util este că, ceea ce în cazul în care atacatorul sa întâmplat, în loc de a avea un șir care a fost doar un șir de inofensiv cum ar fi, numele lor sau ceva, ceea ce în cazul în care, în schimb, că șir au fost doar câteva cod arbitrar care a făcut tot ce au vrut să facă? Astfel încât acestea ar putea - Nu mă pot gândi la orice cod rece. Ar putea fi orice, totuși. Orice cod dezastruos. Dacă ar fi vrut, ei ar putea face ceva la defecte segmente, dar că ar fi inutil. Ei au, de obicei, o fac pentru a hack sistemul dumneavoastră. Bine. Bibliotecă CS50. Acest lucru este, în principiu, getint, getString, toate aceste funcții am oferit pentru tine. Deci avem char * string, și că este de captare pe care le-a suflat departe la un moment dat în timpul semestrului. Amintiți-vă că un șir este doar o serie de caractere. Deci, aici vom vedea o versiune prescurtată a getString. Tu ar trebui să se uite înapoi la el să-și amintească cum este pusă în aplicare de fapt. Detalii cheie sunt, observa ajungem într-un singur caracter la un moment dat de la standard, care este la fel ca noi tastarea la tastatura. Deci, un singur caracter la un moment dat, și dacă vom obține prea multe caractere, așa că, dacă n + 1 este mai mare decât capacitatea, atunci avem nevoie pentru a crește capacitatea de tampon noastre. Deci, aici suntem dublarea dimensiunea de tampon noastre. Și că poate continua, vom introduce caracterul în tampon nostru până când vom primi o linie nouă sau sfârșitul de fișier sau orice altceva, caz în care, am terminat cu șirul și apoi getString reală micsoreaza memorie, cum ar fi dacă am alocat prea multă memorie va merge înapoi și a reduce un pic. Așa că nu arată că, dar ideea principală este trebuie să citească într-un singur caracter la un moment dat. Nu se poate doar citi într-un lucru întreg dintr-o dată, deoarece tampon lor este doar de o anumită dimensiune. Deci, dacă șirul care se încearcă pentru a insera în tampon este prea mare, atunci s-ar îneca. Deci, aici vom preveni ca citind doar într-un singur caracter la un moment dat și în creștere, ori de câte ori avem nevoie. Astfel getint și celelalte funcții de bibliotecă CS50 tendința de a folosi getString în implementări lor. Așa că am subliniat cele mai importante lucruri aici. Acesta solicită getString pentru a obține un șir de caractere. Dacă getString nu a reușit să se întoarcă de memorie, amintiți-vă că getString mallocs ceva, așa că ori de câte ori te sun getString tu nu ar trebui să (neinteligibil) elibera că șir pe care le ai. Deci, aici, în cazul în care acesta nu a reușit să malloc ceva, ne-am întoarce INT_MAX ca doar un steag care, hei, nu am fost de fapt, posibilitatea de a obține un număr întreg. Ar trebui să ignore ceea ce mă voi întoarce la tine, sau tu nu ar trebui să trateze acest lucru ca pe o intrare validă. În cele din urmă, presupunând că a reușit, vom folosi sscanf cu steagul special, ceea ce înseamnă, în primul rând se potrivi un număr întreg, apoi a se potrivi orice caractere, după care întreg. Așa observa vrem să egaleze 1. Se întoarce atât de sscanf cât de multe meciuri în cazul în care a făcut cu succes? Acesta va reveni 1 în cazul în care se potriveste cu succes un număr întreg, se va întoarce 0 dacă nu se potrivesc un întreg, și se va reveni 2 în cazul în care corespund unui număr întreg, urmată de unele caractere. Deci, ne-am observa încercați din nou în cazul în care ne-am potrivi nimic, dar 1. Deci, dacă am introdus 1, 2, 3, C, sau 1, 2, 3, X, apoi 1, 2, 3 ar primi stocate în numărul întreg, X-ar primi stocate la caracterul, sscanf va întoarce 2, și ne-ar încerca din nou, pentru că ne dorim doar un întreg. Suflare rapid prin HTML, HTTP, CSS. Hypertext Markup Language este structura și semantica de web. Aici este un exemplu de curs unde avem tag-uri HTML. Avem tag-uri cap, tag-uri de corp, Avem exemple de tag-uri goale, unde de fapt nu au un început și aproape tag-ul, am doar link-ul si imaginea. Nu există nici o etichetă imagine închidere, există doar o singură etichetă care realizează tot ceea ce tag-ul trebuie să facă. Link-ul este un exemplu, vom vedea cum vă legați la CSS, script-ul este un exemplu de modul în care se leagă de un JavaScript extern. Este destul de simplu, și amintiți-vă, HTML nu este un limbaj de programare. Aici, amintiți-vă cum ar defini o formă sau cel puțin ceea ce ar face? O astfel de formă are o acțiune și o metodă. Metodele pe care le vor vedea doar vreodată sunt GET și POST. Asa ca este varianta în care lucru este pus în URL-ul. POST este în cazul în care nu se pune în URL-ul. În schimb, toate datele din formularul se introduce mai mult ascuns în cererea HTTP. Deci, aici, acțiune definește în cazul în care cererea HTTP merge. În cazul în care se merge este google.com / search. Metodă. Amintiți-vă de diferențele dintre GET și POST, și, spun doar ca un exemplu, dacă doriți să marcaj ceva. Tu nu va fi capabil să marcați un URL POST deoarece datele nu sunt incluse în URL. HTTP, acum, este Hypertext Transfer Protocol. Hypertext Transfer Protocol, v-ați aștepta să transfere Hypertext Markup Language, și-l face. Dar se transferă, de asemenea, toate imaginile pe care le găsiți pe Web, orice descărcări pe care le face începe ca o cerere HTTP. Deci, HTTP este doar limbajul de World Wide Web. Și aici trebuie să recunoască acest fel de o cerere HTTP. Aici HTTP/1.1 pe partea spune doar că e versiunea protocolului Sunt folosind. Este destul de mult întotdeauna o să fie HTTP/1.1, după cum veți vedea. Apoi, vom vedea că acest lucru a fost GET, alternativa fiind POST, care s-ar putea vedea. Și URL-ul pe care am încercat să viziteze fost www.google.com/search?q = bla, bla, bla. Deci, amintiți-vă că acest lucru, semn de întrebare q = bla bla bla, este genul de lucruri care se depune de către un formular. Răspunsul s-ar putea întoarce la mine ar arata ceva de genul asta. Din nou, începând cu protocolul, care va fi că, urmat de codul de stare. Aici e 200 OK. Și, în final, va fi urmat pagina web pe care l-am întrebat de fapt pentru. Posibil codul de stare s-ar putea vedea, și tu ar trebui să știi mai multe dintre ele. 200 Bine ați văzut, probabil, înainte de. 403 Interzis, 404 Nu a fost găsit, Error 500 Internal Server este, de obicei, dacă te duci la un site web și ceva este rupt sau accidente de cod PHP, în timp ce în aparatul avem acea cutie portocalie mare care vine și spune, ca, ceva este în neregulă, acest cod nu funcționează sau această funcție lui rău. De obicei, site-uri nu vreau ca tu să știi ce funcții sunt de fapt rău, Deci, in loc sa-ti dea doar 500 de erori de server intern. TCP / IP este un strat de sub HTTP. Amintiți-vă că există Internet în afara de World Wide Web. Ca și în cazul în care joci un joc online, care nu trece prin HTTP, se trece printr-o diferit - este încă prin intermediul internetului, dar nu utilizează HTTP. HTTP este doar un exemplu de protocol construit pe TCP / IP. IP înseamnă, literal, Internet Protocol. Fiecare calculator are o adresă IP, care sunt acele lucruri de 4 cifre cum ar fi 192.168.2.1, sau orice altceva, care tinde să fie una locală. Dar că este modelul de o adresă IP. Deci DNS, Domain Name Service, asta e ceea ce se traduce lucruri, cum ar fi google.com la o adresă IP reală. Deci, dacă tastați adresa IP într-o adresă URL, care le-ar aduce la Google, dar ai tendinta de a nu amintesc aceste lucruri. Aveți tendința să-și amintească google.com loc. Ultimul lucru pe care îl avem este de porturi, în cazul în care aceasta este parte a TCP IP. TCP face mai mult. Gândiți-vă, cum ar fi, ai rulează browser-ului tău. Poate ai ceva de funcționare aplicație de e-mail; poate ai un alt program care utilizează funcționare Internet. Toate acestea au nevoie de acces la Internet, dar computerul are doar un card de WiFi sau orice altceva. Deci, porturile sunt modul în care suntem capabili să ne despărțim modul în care aceste aplicații sunt capabili de a utiliza internetul. Fiecare cerere primește un anumit port pe care se poate asculta pe, și în mod implicit, HTTP foloseste portul 80. Unele servicii de e-mail utilizează 25. Cele cu numere mici tind să fie rezervate. Vă sunt, de obicei posibilitatea de a obține cele cu numere mai mari pentru tine. CSS, Cascading Style Sheets. Pagini web noi de stil cu CSS, nu cu HTML. Există 3 locuri puteți pune CSS-ul. Acesta poate fi în linie, între tag-uri de stil, sau într-un fișier complet separate și apoi legat inch Și aici este doar un exemplu de CSS. Tu ar trebui să recunoască acest model, în cazul în care primul exemplu este suntem de potrivire tag-ul body, și aici suntem de centrare tag-ul body. Al doilea exemplu, suntem de potrivire lucru cu subsol ID-ul, și avem aplicarea unor stiluri de asta. Observați că ID-ul de subsol de text-aliniază la stânga, în timp ce corpul de text-aliniază centru. Subsol se află în interiorul corpului. Acesta va fi, în schimb, text-align stânga, chiar dacă trupul spune centru de text-align. Aceasta este partea întreagă cascadă de ea. Puteți avea - puteți specifica stiluri de organism, și apoi lucruri în organism puteți specifica mai multe stiluri specifice, și lucrurile funcționează așa cum vă așteptați. Specificatori mai specifice CSS au prioritate. Cred că asta e tot. [Ali Nahm] Max toată lumea. Dacă aș putea obține doar atentia. Sunt Ali și am de gând să merg prin PHP și SQL foarte repede. Astfel încât să putem începe. PHP este scurt pentru PHP: Hypertext Preprocessor. Și, după cum toți ar trebui să știi, că este un limbaj de scripting server-side, și le folosim pentru capătul din spate de site-uri, și modul în care aceasta are o mulțime de calcule, partea din spatele camerei de filmat. Sintaxă. Nu e ca C, surpriză, surpriză. Ea are întotdeauna să înceapă cu, dacă puteți vedea, - eu nu pot merge mai departe. Puteți vedea ai nevoie de noi tipuri de bretele și apoi ai nevoie, de asemenea, php?. Asta e mereu cum trebuie pentru a încadra textul PHP, codul PHP. Deci, nu poate fi la fel ca C, în cazul în care un fel de pus pe prima. Trebuie să-l înconjoare întotdeauna. Și acum, sintaxa majoră este că toate variabilele trebuie să înceapă cu caracterul $. Ai nevoie de a face acest lucru atunci când sunteți le definirea, aveți nevoie pentru a face acest lucru atunci când te referi la a le mai târziu. Aveți nevoie întotdeauna că $. E cel mai bun prieten, destul de mult. Tu nu - spre deosebire de C, nu aveți nevoie pentru a pune ce fel de tip variabil este. Deci, în timp ce faci nevoie de $, nu aveți nevoie pentru a pune, cum ar fi, int x sau y șir, etcetera, etcetera. Deci, o mică diferență. Ca urmare a acestui fapt, aceasta înseamnă că PHP este un tip slab. PHP este un limbaj de tip slab, și le-a introdus variabile slab. Cu alte cuvinte, ceea ce înseamnă că puteți comuta între diferite tipuri de tipuri de variabile. Puteți stoca numărul de 1 ca un întreg, puteți să le stocați ca un șir, și puteți să le stocați ca un float, și va fi tot ceea ce numărul 1. Chiar dacă sunteți o stocarea în diferite forme, este încă - tipurile de variabile sunt încă deține în cele din urmă. Deci, dacă te uiți aici, dacă vă amintiți de la PSET 7, mulți dintre voi, probabil, au avut probleme cu aceasta. Două semne de șanse, 3 semne egale, 4 semne egale. Bine, nu există 4 semne egale, dar există 2 și 3. Puteți utiliza două semne de șanse pentru a verifica valorile. Se poate verifica pe tipuri. Deci, dacă vă puteți vedea de la primul exemplu, Am num_int num_string ==. Deci, int și șirul de sunt atât, punct de vedere tehnic, 1, dar acestea sunt diferite tipuri. Dar pentru două egali, se va trece încă. Cu toate acestea, pentru egali triple, se verifică valoarea precum și diferite tipuri. Asta înseamnă că nu va trece, în care al doilea caz aici, în cazul în care utilizați 3 semne egale în loc. Astfel că este o diferență majoră care ar trebui toți au demonstrat acum. String concatenare este un alt lucru puternic puteți folosi în PHP. Este practic doar această notație punct la îndemână, și că este modul în care puteți lega siruri de caractere impreuna. Deci, dacă aveți Cat și aveți Dog, și doriți să puneți cele 2 siruri de caractere împreună, puteți folosi perioada, si asta e un fel de modul în care funcționează. Puteți, de asemenea, doar puneți-le unul lângă altul, după cum puteți vedea aici, în exemplul de mai jos, unde am echo șir 1, șir spațiu 2. PHP va ști să le înlocuiască ca atare. Arrays. Acum, în PHP, există două tipuri diferite de matrice. Puteți avea matrice regulate, și puteți avea, de asemenea, tablouri asociative, și vom trece prin ele chiar acum. Matrice regulate sunt doar acest lucru în C, și deci va trebui indici care sunt numerotate. Chiar acum suntem doar de gând să creeze o și a pus - astfel încât acesta este modul în care putem crea un array gol, atunci vom pus în numărul de index 0. Vom pune la numărul 6, valoarea 6. Puteți să-l vedea în partea de jos de aici. Unde e - la numărul de index 1 vom pune valoare numărul 4, și astfel încât să puteți vedea acolo este un 6, există un 4, și apoi ca suntem imprimare lucruri, atunci când vom încerca să imprimați valoarea stocată la index număr 0, atunci vom vedea valoarea 6 fiind imprimate. Rece? Așa că e tablouri regulate pentru tine. Un alt mod puteți adăuga, de asemenea, lucruri de tablouri regulate acum este le puteți adăuga doar la sfârșitul anului. Asta înseamnă că nu trebuie să specifice indicele specific. Puteți vedea numărul, și apoi în parantezele pătrate nu exista nici index specificat. Și se va ști - PHP va ști să-l adăuga doar la sfârșitul listei, următorul loc liber. Deci, puteți vedea o chiar acolo, la acea 0 la fața locului, 2 a fost chiar acolo, la primul loc. 3 merge - se adaugă acolo, de asemenea. Astfel că un fel de sens. Esti doar constant l adaugand, și atunci când suntem ecou indicele de numărul 1, se va imprima valoarea 2. Apoi, avem tablouri, care sunt tablouri asociative. Tablouri asociative, în loc de a avea indici numerici, ceea ce fac ei este, ei au indici care sunt de șir. Puteți vedea, în loc de - Am scăpat de toate aceste indicii de numere, și acum e TAST1, KEY2, key3, și sunt în ghilimele pentru a semnifica faptul că acestea sunt toate siruri de caractere. Astfel încât să putem avea un exemplu în acest sens. Exemplu în acest sens este că avem TF, și care e numele index. Vom pune "Ali", ca nume, la pagina de index, de calorii consumate, putem pune un int data aceasta în loc de un șir de caractere, și apoi la place de index, se poate pune o serie intreaga in interiorul de ea. Deci, aceasta este un fel de - este un concept similar cu modul în care am avut indicii cu numere, dar acum putem schimba indicii în jurul pentru a le avea ca siruri de caractere în loc. Puteți face, de asemenea, acest lucru, în afară de doar o fac în mod individual, puteți face totul într-o singură bucată. Deci, puteți vedea că tf de matrice, și apoi ne-am stabilit-le pe toate într-un singur gigant set paranteză. Astfel că poate accelera lucrurile. Este mai mult de o alegere stilistic decât nu. Avem, de asemenea, bucle. In C avem bucle care funcționează ca aceasta. Am avut gama noastră, și ne-am dus la index 0 la sfârșitul listei, și ne-am tot imprima, corect? Cu excepția problema este, pentru tablouri asociative, nu știm neapărat aceste indici numerici pentru că acum avem indicii șir. Acum vom folosi bucle foreach, care, din nou, vă sperăm utilizate în PSET 7. Bucle foreach va ști doar fiecare parte a listei. Și nu trebuie să știe exact indicele numeric pe care le au. Astfel încât să aibă sintaxa foreach, asa ca este foreach, ai pus matrice. Deci, matrice mea se numește PSET, și apoi ca, cuvantul ca, și apoi ai pus această variabilă temporar local, pe care ai de gând să utilizeze doar pentru un lucru specific care se va ține specifice - o instanță sau o secțiune de matrice. PSET num va organiza o, și atunci poate că va deține numărul 6, și apoi se va organiza la numărul 2. Dar este garantat pentru a merge prin fiecare o singură valoare care este în matrice. Funcții utile pe care ar trebui să știți în PHP sunt necesita, astfel încât face-vă că, inclusiv anumite fișiere, ecou, ​​ieșire, gol. Am foarte recomandăm să te uiți la PSET 7 si uita-te la aceste funcții. S-ar putea să știi cele, așa că mi-ar sti cu siguranta ce, exact, cei care fac toate. Și acum vom trece prin domeniul de aplicare foarte repede. În domeniul de aplicare, PHP este un fel de un lucru de funky, spre deosebire de C, și așa suntem doar de gând să trec prin ea repede. Așa că haideți să spunem că încep de la săgeata pe care le avem acolo. Și vom începe cu $ i. Deci, variabila "i" va fi 0, și noi suntem doar de gând să păstreze de imprimare-l în cutia alb mare acolo. Vom începe cu I0, iar apoi vom merge să-l ecou. Deci nu e zero. Și apoi vom ea incrementa de bucla pentru, și apoi va fi o valoare de 1. Una dintre ele este mai mică de 3, asa ca va trece prin asta pentru bucla, și apoi vom vedea imprimată din nou. Mergem să-l incrementa din nou la 2, și 2 este mai mic de 3, asa ca va trece de buclă, și va imprima 2. Apoi, veți rețineți că 3 nu este mai mic de 3, asa ca vom iesi din bucla for. Deci, acum am ieșit, iar apoi vom merge în aFunction. Bine. Deci, va trebui să rețineți că această variabilă pe care le-am creat, "i" variabila, nu se scoped la nivel local. Asta înseamnă că nu este la bucla locală, și că variabile putem accesa în continuare și de a schimba după aceea, și ea va fi încă în vigoare. Deci, dacă te duci în funcția de acum, veți vedea că vom folosi, de asemenea, "i" variabila, și vom incrementa "i" + +. V-ar crede, la prima, bazat pe C, că este o copie a "i" variabila. Este un lucru total diferit, ceea ce este corect. Așa că atunci când ne-am imprima, vom imprima 'i' + +, care se va imprima că 4, și apoi vom - îmi pare rău. Apoi, vom pune capăt din această funcție, și vom fi în cazul în care săgeata este chiar acum. Asta înseamnă că, atunci, cu toate acestea, deși această funcție modificat valoarea "i", ea nu a schimbat în afara funcției, pentru că funcția are un domeniu de aplicare separat. Asta înseamnă că, atunci când ne echo "i", nu s-au schimbat în domeniul funcției, și așa apoi vom imprima 3 din nou. Diferite lucruri despre domeniul de aplicare în PHP decât în ​​C. Acum, în PHP și HTML. PHP este folosit pentru a face pagini web dinamice. Este un fel de face lucrurile diferit. Avem diferit de HTML. Cu HTML, noi întotdeauna trebuie doar același lucru static, ca și cum Rob a arătat, în timp ce PHP, poți schimba lucrurile în funcție de cine este utilizatorul. Deci, dacă am avea acest lucru, am, "Sunteți autentificat ca -" și apoi numele, și eu pot schimba numele. Deci, chiar acum numele este Joseph, și are "despre mine", dar apoi m-am pot schimba, de asemenea, numele a avea Tommy. Și că ar fi un lucru diferit. Deci putem schimba, de asemenea, lucruri diferite despre el, și se va afișa conținut diferit pe baza numelui. Deci, PHP poate un fel de a schimba ceea ce se întâmplă pe site-ul dvs.. La fel aici. Totuși, rețineți că acestea au un conținut diferit, chiar dacă sunt punct de vedere tehnic încă accesează aceeași pagină web de pe suprafata. Generarea HTML. Există două moduri diferite pe care le puteți face acest lucru. Asa ca vom trece prin asta chiar acum. Primul mod este, ai - Da, îmi pare rău. Deci, va trebui doar regulat pentru buclă în PHP, și apoi vă ecou în PHP și ecou în HTML. Folosind ceea ce ai aratat Rob de script HTML și apoi utilizarea de imprimare PHP pentru a imprima doar pentru a paginii web. Modul de alternativă este de a face acest lucru ca și cum ai separa PHP și HTML. Astfel încât să puteți avea o linie de PHP, care începe pentru buclă, atunci puteți avea linia de HTML într-un lucru separat, și apoi închideți bucla, din nou, cu un PHP. Deci, e un fel de-l separarea. Pe partea stanga, puteți că aveți toate - e doar o bucată de PHP. Pe partea dreaptă, puteți vedea că aveți o linie de PHP, aveți o linie de HTML, si ai din nou o linie de PHP. Așa că separarea în ceea ce faci. Și veți rețineți că nici un fel, pentru nici unul dintre ei, ei încă imprima imaginea, imaginea, imaginea, astfel încât HTML încă este tipărită în același mod. Și atunci veți vedea în continuare cele 3 imagini apar pe site-ul. Deci, este de 2 moduri diferite de a face același lucru. Acum avem forme și cereri. Ca Rob ți-a arătat, există forme de HTML, și vom briza doar prin asta. Aveți o acțiune și aveți o metodă, și acțiunea dvs. un fel de tine în cazul în care ai de gând să-l trimită arată, iar metoda este dacă aceasta va fi o GET sau un POST. Și o cerere GET, așa cum a spus Rob, înseamnă că ai de gând să-l pună într-o formă și veți vedea ca pe un URL, în timp ce o cerere POST nu veți vedea într-un URL. Deci, o mică diferență. Cu toate acestea, un lucru care este un lucru similar este faptul că POST și GET sunt la fel de nesigure. Deci, ați putea crede că doar pentru că tu nu-l vezi în URL-ul, ceea ce înseamnă că POST este mai sigur, dar puteți vedea încă în cookie-urile în informațiile pe care le trimiteți. Deci, nu cred că despre una sau alta. Un alt lucru de remarcat este că veți avea, de asemenea, variabile secțiune. Voi folosi acest lucru în PSET 7 pentru a obține informațiile de ID-ul de utilizator. Ce sa întâmplat a fost că puteți utiliza acest tablou asociativ, $ _SESSION, și apoi ești capabil de a accesa diferite lucruri și stoca lucruri diferite din paginile. Ultimul lucru este că avem SQL, Structured Query Language, iar acest lucru este un limbaj de programare pentru a gestiona bazele de date. Ceea ce, exact, sunt baze de date? Sunt colecții de tabele, și fiecare tabel poate avea tipuri similare de obiecte. Așa că am avut o masă de utilizatori în PSET dumneavoastră finanțe. Și de ce sunt ele utile? Pentru că este o modalitate de stocare permanent informații. Este o modalitate de urmărire a lucrurilor și gestionarea lucrurile și de fapt, să-l văd pe diferite pagini și urmări păstrarea. Întrucât, dacă tu doar se păstrează la acel moment imediat și apoi l utilizați mai târziu, nu va fi capabil de a accesa tot ceea ce le-ați salvat. Avem 4 lucruri importante pe care le folosim pentru comenzi SQL. Avem selectați, insera, șterge, și actualizare. Cei care sunt cu adevărat importante pentru voi să știți pentru testul dumneavoastră. Vom merge repede peste selectați chiar acum. Practic, te selectarea rânduri dintr-o bază de date. Deci, dacă aveți, chiar aici - avem aceste două lucruri diferite, și ne-o dorim pentru a selecta din tabelul de clase unde minunat - în cazul în care în coloana minunat valoarea este 1. Astfel încât să puteți vedea aici, avem aceste două lucruri de numele clasei, CS50 și Stat110, și avem ID-urile de clasă și sloganul. Așa că ne-o dorim pentru a selecta toate aceste informații. Apoi, puteți vedea aici că e un fel de a alege din acea coloană minunat, în cazul în care toate lucrurile sunt 1, și apoi le-a clasei ID-ul, numele de clasă și sloganul care se poate alege. Cum anume faci acest lucru în cod? Va trebui să utilizați PHP. Deci, asta e un fel de modul PHP și SQL sunt legate unele de altele. Acum avem codul nostru, și vom utiliza funcția noastră de interogare așa cum am făcut în PSET 7, și vom executa interogarea SQL. Apoi, vom avea - trebuie întotdeauna să verifice dacă rândul lui triplu egal dacă false. Deci, din nou, pe care doriți să verificați tipul și valoarea, și apoi, dacă nu funcționează, apoi pe care doriți să-mi cer scuze, ca de obicei, așa cum am făcut în PSET 7. În caz contrar, pe care doriți să bucla prin tot ceea ce cu cele la îndemână foreach bucle care tocmai am trecut peste. Acum, că suntem looping prin și l-am făcut trecut, să presupunem că interogarea noastră a trecut, acum avem bucla foreach nostru. Și primul rând are, deci aici e rândul, chiar de aici, e în cutie. Se va imprima toate informațiile pe care le-a primit. Deci, se va imprima în partea de jos "Vrei să Aflați HTML?" Apoi, se va merge la rândul următor, deoarece este finalizat prima de buclă, și așa apoi se va imprima a doua linie de ea, care va fi STAT110, Gaseste toate momentele. Un ultim lucru este pe SQL vulnerabilități. Știu David atins pe aceasta un pic în curs. Puteți citi mai târziu. E foarte amuzant. SQL Injection este un fel de lucru complicat. Să spunem că doar stai aceste variabile chiar în interogare, după cum puteți vedea în primul rând. Deci, se pare bine, nu? Esti doar a pune în numele de utilizator și parola de interogare SQL, și doriți să-l expedieze în afara și de a lua tot ce este în tabelul de date. Asta pare destul de simplu. Deci, haideți să spun cineva pune în, pentru parola, aceasta SAU textul de aici - ar trebui să fie de fapt în caseta de roșu. Deci, haideți să spunem că au pus că parolă în - asta e ceea ce ei intra. Astfel încât acestea să pui sau "1" = 1. Un fel de parolă prostie de a avea. Acum, hai să-l înlocuiască în, și veți rețineți că în această interogare SQL acum, se evaluează la întotdeauna adevărat, pentru că veți rețineți că puteți interogare SQL selecta toate aceste informații sau poti avea doar 1 = 1. Astfel că întotdeauna o să evalua la true. Asta nu va merge într-adevăr, pentru că asta înseamnă că hacker poate rupe în sistemul dumneavoastră. Soluția pentru acest lucru este că va trebui să utilizați sistemul de DOP, ceea ce înseamnă că va trebui să utilizați semne de întrebare, care este ceea ce voi folosite în PSET 7, în cazul în care ai de gând să utilizeze un semn de întrebare în locul de unde doriți să pună ceva, și apoi ai de gând să aibă o virgulă, și apoi veți avea după aceea, după șirul de, diferite variabile pe care doriți să-l înlocuiască în semn de întrebare. Deci, veți remarcat aici că acum am aceste semne de întrebare de culoare roșie. Apoi am pus variabilele după sfori mele, așa că am știu să le înlocuiască, în această ordine după aceea. Acest lucru va asigurați-vă că, dacă cineva o face ca aceasta, și au sau 1 = 1 situația, care va asigura, în partea din spate, asigurați-vă că acesta nu se va rupe de fapt, interogarea SQL. Bine, așa că e destul de mult, un vârtej de PHP și SQL. Cel mai bun de noroc pentru voi toți, și acum la Ore [Oreoluwatomiwa Babarinsa] toată lumea Bine. Timp pentru a trece peste unele JavaScript și alte câteva lucruri foarte repede asa ca nu te ține în seara asta. JavaScript. Da. JavaScript este un fel de un lucru rece, pretins. Lucrurile într-adevăr trebuie să știți despre JavaScript, e un fel de sfârșitul client-side de ceea ce aplicația web este de gând să faci. Există unele lucruri pe care pur și simplu nu doresc să aibă grijă de tot timpul pe partea de server. Toate micile interacțiunile, subliniind un singur lucru, a face ceva să dispară. Tu chiar nu vreau să aibă de a vorbi cu server-ul dvs. tot timpul pentru asta. Și unii dintre care nici măcar nu este posibil să se facă pe partea de server. Acesta este de ce avem nevoie de ceva de genul JavaScript. Lucruri interesante despre JavaScript: Este dinamic tastat. Ce înseamnă acest lucru este că programul nu are nevoie să știe ceea ce, exact, variabilele sunt atunci când îl scrie. Va doar un fel de-mi dau seama ca se funcționare. Alte lucruri care sunt misto despre asta: Este un limbaj acoladă, ceea ce înseamnă sintaxa este similar cu C și PHP. Tu nu trebuie sa faci mult rework atunci când sunteți JavaScript de învățare. Aici avem un pic de JavaScript. Lucru interesant aici este că, dacă te uiți la ea, avem un pic de JavaScript chiar acolo în tag-ul cap. Ceea ce este nu este, în principiu cuprinde doar un fișier JavaScript. Aceasta este o modalitate puteți include JavaScript în programul dumneavoastră. Apoi, al doilea mic bit este de fapt unele JavaScript inline, foarte similar cu un stil inline cu CSS, și tu doar scrie un cod foarte repede acolo. JavaScript are tablouri. Doar un alt mod de a păstra date în jur, foarte util. Sintaxa foarte frumos și ușor. Puteți utiliza paranteze pătrate pentru a accesa tot și să păstreze totul împreună. Nimic prea complex. Lucru misto despre JavaScript si limbaje de scripting, în general, este că nu trebuie să vă faceți griji cu privire la dimensiunile matrice. Puteți folosi doar array.length și urmări de ea, și, de asemenea, matricea poate creste sau micsora ca ai nevoie de ea pentru. Deci, tu nici măcar nu trebuie să vă faceți griji cu privire la orice fel de, oh nu, trebuie să aloce mai multe lucruri, sau ceva de genul asta. Misto lucru aici este că JavaScript are ceva numit obiecte. Este un limbaj orientat-obiect, deci ceea ce a este, în esență, o cale pentru tine de a datelor de grup împreună, oarecum similar cu un struct, dar îl puteți accesa ca un struct sau într-o sintaxă tablou asociativ. Este destul de simplu și ceea ce se poate face cu acest lucru este de date grup împreună dacă aveți o grămadă de date care este legat. Pentru ca e toate lucrurile de care aveți nevoie pentru a descrie o mașină, nu aveți nevoie să-l aibă într-o grămadă de locuri diferite. Poți să-l lipi în 1 obiect în JavaScript. După cum probabil știți, iterarea este una dintre acele sarcini plictisitoare. Trebuie doar so faci pe un peste din nou. Aveți nevoie pentru a vorbi cu fiecare obiect în mașină, sau aveți nevoie pentru a merge prin fiecare element dintr-o listă sau ceva de genul asta. Deci, JavaScript trebuie, similar cu PHP, o sintaxă foreach. În acest caz, este o în buclă. Doriți să utilizați acest lucru numai pe obiecte. Există unele probleme care apar dacă utilizați acest lucru pe matrice. În general, este unul dintre acele lucruri, totuși, că este foarte util, pentru ca elimina o mulțime de deasupra capului pentru că nu aveți de a trage totul în obiect de unul singur. Nu trebuie să-mi amintesc toate numele importante. Ai doar un fel de a le obține înapoi în această sintaxă. În acest sens, cu pentru, vrei doar să-și amintească că vei primi înapoi toate cheile, într-un mod foarte asemănător cu hash masă. Dacă vă amintiți de la care, atunci când v-ar pune într-un șir ați putea obține ceva că ar avea o valoare asociate cu ea. Ce puteți face cu acest lucru este de a putea spune, bine, Am pus într-o mașină, și l-am numit un Ferrari. Astfel încât să puteți pune în șir Ferrari din nou mai târziu, și puteți obține asta. Și tu poți face asta într-o buclă, cu în buclă. Deci, doar mai multe despre obiecte. Cheie de la acest lucru trebuie să vă amintiți este că puteți folosi struct obiect ca sintaxă ori de câte ori doriți cu acestea, cu excepția cazului în cazul în care ceea ce dvs. de gând să utilizeze ca un șir nu este un nume de variabilă valid. Deci, dacă te uiți la faptul că există, avem cheie cu spatii. Ei bine, dacă ați fost de a pune object.key, spațiu, cu, spatiu, spatii, care pur și simplu nu ar avea sens punct de vedere sintactic. Deci, numai tu poți face asta cu acest tip de sintaxă suport. De asemenea, este foarte JavaScript domeniul de aplicare-înțelept pentru a PHP. Aveți două modalități de abordare a domeniului de aplicare. Nu puteți avea var in fata unei variabile, și asta înseamnă că doar aceasta este la nivel global. Puteți să-l vedea de oriunde. Chiar dacă ați fost de a pune aceasta într-o declarație, dacă, oriunde altundeva în codul dvs., după care punctul de ai putea vedea ca variabila. Un alt lucru, însă, este cu var, este limitat la orice funcție sunteți inch Dacă nu sunteți într-o funcție, ei bine, e la nivel mondial. Dar dacă vă aflați într-o funcție este vizibil numai în cadrul acestei funcții. Nu am un exemplu, dar, da. Este unul din acele lucruri în care puteți gestiona ceea ce variabilele pe care doriți să fie global, ceea ce variabilele pe care doriți să fie locale, dar tu nu trebuie să fie atent cu privire la aceasta, pentru că nu aveți de tipul de control fin cereale faci în C, în cazul în care în cazul în care ceva este declarat într-o buclă, o să rămână în care pentru bucla. Lucru de care avem grijă de fapt despre utilizarea JavaScript pentru manipulează pagini web, corect? Vreau să spun, de aceea facem acest lucru. Pentru a face acest lucru, vom folosi ceva numit DOM. Document Object Model. Practic, ceea ce face este nevoie de toate HTML dvs. și modele-l afară într-o grămadă de obiecte care sunt imbricate în interiorul reciproc. Puteți începe cu ceva de genul asta. Aveți, pe dreapta pentru mine, o grămadă de cod acolo, care e un fel de - Ati putea crede ca ar fi foarte greu de a manipula, pentru că ai fi parsarea printr-o grămadă de text și având la cap în afară lucrurile. Și ce dacă nu a fost formatat corect? Lucruri rele s-ar întâmpla. Astfel de activarea JavaScript-are grijă de acest lucru pentru tine, și veți obține o structură de date frumos, cum ar fi cea de pe stânga mea, în cazul în care aveți doar un document, și în care aveți ceva numit HTML, și în care aveți un cap și un corp, și în interiorul capul aveți un titlu, etcetera, etcetera, etcetera. Acest lucru simplifică manipularea o pagină web, astfel că este doar, oh, vreau doar să vorbesc cu acest obiect. Un fel de-un mod foarte asemănător v-ar vorbi cu un alt obiect ai făcut tu. Cum am spus, tot DOM este în obiectul de documente. Fie că e doar un loc si apoi poti sa te duci în ea pentru a găsi lucruri, și o poți face - acesta este stilul vechi de a face asta, acolo sus, în cazul în care face document.getElementById, iar apoi numele, și după cum puteți, probabil, spune, acest lucru devine foarte greoi după un timp. Deci, probabil că nu vrei să faci asta. De aceea, ne-am următorul lucru vom vorbi despre asta după. Cheie lucru aici este că, în regulă, ai toate aceste elemente, nu? Deci, poate că pot schimba culoarea de ceva atunci când pagină se încarcă. Deci, ce? Ce se întâmplă dacă utilizatorul meu clic ceva? Vreau să fac ceva interesant, atunci când faceți clic pe ceva. De aceea, avem evenimente. Puteți, de fapt, găsi orice element din DOM-ul, și apoi spune, hei. Când acest lucru se încarcă sau cineva se fixează, sau atunci când mouse-ul peste el, face ceva cu ea. Și ceea ce ai este, aveți funcții care se ocupa de acest lucru pentru tine. Aceste funcții sunt Stivuitoare eveniment. Ce Theyre - e doar un mod fantezist de a spune, această funcție este executată doar atunci când acest eveniment se întâmplă. Deci, se ocupă de cazul în care se produce. Acesta este modul în care s-ar expune un handler eveniment. Am niște buton, și atunci când faceți clic pe el, explodează. Deci, nu faceți clic pe butonul. Acesta este un mod de abordare ea, corect? Ai o etichetă buton, iar pe clic aveti un șir care spune, oh, apropo, eu fac acest lucru explozie pentru mine. În caz contrar, e la fel ca un buton regulat pe care tocmai ați făcut. Puteți face, de asemenea, acest lucru un alt mod, de hapsân elementul DOM, dar vom salva că după ce vorbim despre jQuery. JQuery: Este o bibliotecă, care este cross-browser. Puteți să-l folosească în ceva destul de mult. Și doar vă oferă o mulțime de instrumente pentru a lucra cu. Deoarece JavaScript, în timp ce puternic, nu are toate instrumentele de care aveți nevoie din cutie pentru a aborda într-adevăr o aplicatie web este posibil să doriți să faceți. Așa că simplifică o mulțime de lucruri, vă oferă o mulțime de funcții afară de la cutie pe care le-ar trebui în mod normal să vă scriu, peste si peste si peste din nou. Și doar face lucrurile foarte simplu. Aveți, de asemenea, selectoare, care vă permit să luați toate aceste elemente din DOM-ul mult mai simplu, în loc de a avea de a utiliza aceste apeluri de funcții foarte lungi. Mai multe despre aceste selectoare. Ai, acolo ai, sa zicem Vreau să ajung un element cu ID-ul "piatra." Ei bine, în jQuery, e doar $ și apoi un șir care are o jumătate de kilogram, iar apoi "rock." Este foarte simplu și mult mai repede decât în ​​mod tradițional JavaScript din abordarea acestei probleme. Și aveți lucruri similare pentru clase și tipuri de elemente. jQuery este - una dintre caracteristicile interesante este ca poti fel de comprima jos întrebările dvs. pe DOM dvs. foarte, foarte repede. Acum ne-am întors la manipulare eveniment, iar acest lucru este modul în care se va ocupa de un eveniment în jQuery. Deci, ceea ce am de gând aici este de ce spunem, în regulă. Am o etichetă scenariu, corect? Așa că am această linie JavaScript. Ceea ce am de gând să faceți este să mergem să spunem, în regulă. În cazul în care documentul este gata, ceea ce înseamnă că documentul a fost incarcat, vom merge în la această funcție, și am de gând să spun, bine, această funcție se face de fapt altceva. Este practic spune, bine, dă-mi elementul cu ID-ul "myid." Si apoi da aceasta o manipulare funcție care execută atunci când faceți clic pe el. Practic ceea ce acest lucru nu este, se spune, în regulă. Pagina este încărcată, așa că am de gând să în, găsi acest element, da acest handler eveniment, și-l practic stabilește pagina dvs. pentru tine. Și acest lucru este modul în care doriți să se gândească de manipulare eveniment. Vrei doar să te gândești, bine, atunci când se întâmplă ceva, ceea ce nu vreau să se întâmple? Tu nu vreau să mă gândesc, bine, am nevoie pentru a face sigur că discuțiile acest lucru la acest lucru, acest lucru blah blah blah, pentru că vrei doar să vorbim lucru în termeni de evenimente. Atunci când se întâmplă acest lucru, acest lucru se întâmplă. Când se întâmplă acest lucru, care se întâmplă. Și dacă lucrurile declanșa alte lucruri, asta e minunat. Dar nu doriți să încercați și de a face codul de complicat cazul în care sunteți de declanșare mai multe lucruri în același timp, pentru ca esti doar de gând să vă dau o durere de cap. Regulă. Acum putem ajunge pagina noastră să se ocupe de evenimente, dar să spunem că utilizatorul meu clic pe un buton. Ce se întâmplă dacă vreau să trimit cererea înapoi la server, dar nu vreau să reîncărcați pagina, pentru că a fi nevoie să reîncărcați o pagină nouă de fiecare dată devine un fel de plictisitoare, și de ce am nevoie pentru a trage în jos antetul din nou, și subsol din nou, și toate elementele paginii din nou doar pentru a reîmprospăta salutul sau de timp? De aceea noi avem ceva de genul Ajax. Ce putem face aici cu Ajax este, putem spune, bine, Vreau să trimit niște date de la server, și vreau să obțineți un răspuns înapoi, așa că am poate actualiza pagina mea, sau poate face doar un calcul algoritmică care nu arată neapărat ceva pentru utilizator. Ce aveți nevoie pentru a face acest lucru? Ei bine, ai nevoie de un URL care aveți nevoie pentru a vorbi cu. Server-ul dvs. nu pot doar asculta magic de la nicăieri. Aveți nevoie pentru a avea un loc specific trimiteți aceste date la. Și aveți nevoie, de asemenea, unele date pentru a trimite, sau poate este o interogare dataless. Vrei doar să ping înapoi la server și spune, hei, eu sunt în viață, sau ceva de genul asta. Și apoi doriți o funcție care, practic, se ocupă cu succes. Să presupunem că te-ai întors niște informații de la server-ul dvs., și doriți să schimbați titlul utilizatorului pe pagina lor. Deci, v-ar lua informațiile din spate, și v-ar împinge că pe ecran. Ce se întâmplă este, atunci când pagina este gata, creați o funcție pe clic pentru acest buton numit greeter. Ce este acest lucru, atunci nu este, în momentul în care este apăsat butonul, vorbești cu greetings.php, vă face o cerere POST, și spui, hei, adu-mi ceva de la pagina ta. Nu avem cu adevărat nevoie pentru a descrie asta, dar greetings.php, hai să spunem, da înapoi "Hello World." Deci, ne întoarcem această "Hello World", iar pe de succes de acest lucru, presupunând că nimic nu merge bine, atunci ne-am merge la acest loc țintă pe care am specificat și noi rămânem doar răspunsul acolo. Și acesta este un mod foarte simplu de a crea o interogare Ajax. Foarte repede, Rob fel a menționat deja acest lucru, lucrurile pot merge prost, lucruri rele se poate întâmpla, astfel încât să doriți să vă familiarizați cu aceste coduri de răspuns HTTP. Care sunt acestea sunt la fel, cum ar fi, de 200, totul a mers bine. Altceva, lucruri rele sa întâmplat. Este, în general, lucru pe care doriți să vă amintiți. Dar e bine să știi toate acestea. Și, în sfârșit, odată ce am trecut prin toate astea, trebuie să vorbim foarte repede despre design, și apoi putem lăsa să plece toți. Proiectare. Lucruri pe care doriți să vă amintiți. Pune-ti urmatoarele intrebari: Cine va folosi acest lucru? Ce vor fi, folosind pentru? Ce-mi pasă de utilizatorii mei? Ce nu le pasa despre? Pur si simplu nu doresc să facă o aplicație și lăsați-l doar să crească și să devină acest gigant, lucru tot consumatoare de care tu nici măcar nu se poate termina. Vrei să aibă obiective discrete și planuri și lucruri pe care doriți să le abordeze. Face fără efort. Toate acestea, spune, în esență, face mai ușor pentru utilizator să-l folosească, nu-l o pată de cerneală gigant de text ca acest slide este de a face, de fapt. Vrei doar să fie ceva unde este foarte ușor pentru cineva să meargă în și de a face ceea ce vor să facă. Tu nu vrei să aibă pentru a naviga 5 pagini pentru a ajunge la prim funcția a site-ului. În cazul în care Google a avut 5 pagini înainte de a putea căuta chiar ceva, nimeni nu l-ar folosi. Și, în fine, prototip de hârtie, focus grup. Au un design bun și practici de testare. Doar pentru că tu crezi că funcționează pentru tine, nu înseamnă că altcineva crede că funcționează. Dar, da, asta-i tot. [CS50.TV]