1 00:00:00,000 --> 00:00:02,270 >> [Review: Quiz 1] 2 00:00:02,270 --> 00:00:04,620 [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Universitatea Harvard] 3 00:00:04,620 --> 00:00:07,660 [Acest lucru este CS50.] [CS50.TV] 4 00:00:07,660 --> 00:00:11,610 [Lucas Freitas] Bine ati venit toată lumea. Acest lucru este revizuire pentru test 1. 5 00:00:11,610 --> 00:00:15,040 Doar ca o declarație de renunțare, aceasta este - Adică, vom încerca să acopere 6 00:00:15,040 --> 00:00:17,770 de material cât mai mult posibil, dar asta nu înseamnă că 7 00:00:17,770 --> 00:00:20,780 vom acoperi toate lucrurile care pot fi la test 1. 8 00:00:20,780 --> 00:00:25,270 Deci, asigurați-vă că vă luați, de asemenea, o privire la prelegere, secțiuni, tot ce poți. 9 00:00:25,270 --> 00:00:28,240 Quiz 1 va fi miercuri, miercurea viitoare. 10 00:00:28,240 --> 00:00:33,800 Deci, asigurați-vă că pentru a studia. O să fie, destul de mult, la fel ca primul test 11 00:00:33,800 --> 00:00:36,390 în ceea ce privește formatul său, dar este, probabil, va fi mult mai greu. 12 00:00:36,390 --> 00:00:39,600 Cel puțin, anul trecut, atunci când am luat 50 de ani, am crezut că a fost mult mai greu. 13 00:00:39,600 --> 00:00:42,410 Astfel de studiu un lot. 14 00:00:42,410 --> 00:00:45,190 >> Am de gând să acopere structuri de date și de codificare Huffman. 15 00:00:45,190 --> 00:00:47,910 Acest lucru este ceva care o mulțime de oameni cred că este complex, 16 00:00:47,910 --> 00:00:51,930 dar am de gând să încerce să facă la fel de ușor ca posibil. 17 00:00:51,930 --> 00:00:56,330 Mai întâi de toate, ceea ce vrem ca voi să știți pentru test 1 este de a 18 00:00:56,330 --> 00:01:00,970 înțelege descrierile conceptuale ale fiecăreia dintre structurile de date pe care am de gând să prezinte. 19 00:01:00,970 --> 00:01:03,960 Asta înseamnă că nu trebuie să de fapt, 20 00:01:03,960 --> 00:01:07,020 să pună în aplicare un tabel hash în testul 1. 21 00:01:07,020 --> 00:01:10,250 Noi nu vrem să pună în aplicare un tabel hash întreg, poate vom încerca 22 00:01:10,250 --> 00:01:13,090 să vă pună în aplicare unele funcții, 23 00:01:13,090 --> 00:01:16,940 cele mai frecvente operațiuni, dar noi nu o să te fac să pună în aplicare tot. 24 00:01:16,940 --> 00:01:21,010 Deci, este important să se înțeleagă conceptul din spatele fiecare structură de date 25 00:01:21,010 --> 00:01:23,510 și, de asemenea, că sunteți în stare să cod în C, 26 00:01:23,510 --> 00:01:27,880 doar cele mai frecvente operațiuni pe care le au pentru fiecare structură de date. 27 00:01:27,880 --> 00:01:30,090 Și, de asemenea, să poată revizui indicii și structs, 28 00:01:30,090 --> 00:01:33,470 pentru că ele apar foarte mult în aceste structuri de date. 29 00:01:33,470 --> 00:01:37,380 >> În primul rând, liste legate. Listele legate sunt de fapt foarte asemănătoare cu matrice, 30 00:01:37,380 --> 00:01:39,930 dar diferența dintre o listă de legat și o matrice, 31 00:01:39,930 --> 00:01:45,160 în primul rând, este faptul că o listă legat are o dimensiune foarte flexibil, 32 00:01:45,160 --> 00:01:50,060 în timp ce în matrice trebuie să fie de a alege o dimensiune foarte mare de matrice, 33 00:01:50,060 --> 00:01:53,710 astfel încât să știi că ai de gând să fie în măsură de a stoca toate datele in matrice, 34 00:01:53,710 --> 00:01:59,370 sau va trebui să utilizați malloc pentru a avea o lungime flexibilă de matrice. 35 00:01:59,370 --> 00:02:03,680 În liste legate este foarte ușor pentru a obține doar mai multe elemente, 36 00:02:03,680 --> 00:02:07,210 pune mai multe elemente în lista de legat sau a elimina elemente. 37 00:02:07,210 --> 00:02:09,370 Și de fapt, dacă nu doriți ca lista legate să fie sortate, 38 00:02:09,370 --> 00:02:13,950 puteți căuta și elimina elemente în timp constant, 39 00:02:13,950 --> 00:02:16,800 deci O (1) timp, asa ca este foarte convenabil. 40 00:02:16,800 --> 00:02:20,660 Trebuie doar să fie atent să-și amintească mereu la malloc și gratuit nodurile, 41 00:02:20,660 --> 00:02:25,510 doar pentru că dacă nu o faci, vei avea pierderi de memorie. 42 00:02:25,510 --> 00:02:31,480 Listele astfel legate - definirea unui nod este la fel ca ceea ce avem acolo. 43 00:02:31,480 --> 00:02:35,110 Am pus int n, dar puteți stoca datele pe care doriți. 44 00:02:35,110 --> 00:02:37,280 Deci, dacă doriți să stocați un șir, e în regulă. 45 00:02:37,280 --> 00:02:41,690 Dacă doriți să stocați un struct, e în regulă, un dublu, tot ce vrei. 46 00:02:41,690 --> 00:02:44,630 Am pus int n pentru exemplele de aici. 47 00:02:44,630 --> 00:02:46,800 Și aveți un pointer la nodul următor. 48 00:02:46,800 --> 00:02:51,940 Deci, practic, o listă legat are unele date, și apoi punctele de la nodul următor. 49 00:02:51,940 --> 00:02:56,710 Dacă este ultimul element din lista de legătură, se va indica la NULL. 50 00:02:56,710 --> 00:02:59,060 Deci, acesta este un exemplu de listă legat. 51 00:02:59,250 --> 00:03:05,960 >> Ok, deci acum hai sa vedem ce ar trebui să fac dacă vreau să insera un element într-o listă legat. 52 00:03:05,960 --> 00:03:08,810 În primul rând, o inserție funcție va fi de tip nule 53 00:03:08,810 --> 00:03:11,350 pentru că nu vreau să se întoarcă nimic. 54 00:03:11,350 --> 00:03:14,200 Și am de gând să ia un int ca un argument, 55 00:03:14,200 --> 00:03:17,090 pentru că vreau să știu ce vreau să inserați. 56 00:03:17,090 --> 00:03:21,840 Deci, care este primul lucru pe care ar trebui să facă? Ei bine, eu ar trebui să malloc pe newnode, 57 00:03:21,840 --> 00:03:24,240 astfel că este prima linie. 58 00:03:24,240 --> 00:03:27,580 Eu doar crearea unui nou nod pentru a pune într-o listă legat. 59 00:03:27,580 --> 00:03:32,360 Deci, ce pot face? Ei bine, știm că în implementări noastre de liste legate 60 00:03:32,360 --> 00:03:38,180 în clasă, am pus mereu capul ca o variabilă globală. 61 00:03:38,180 --> 00:03:41,800 Deci, ce putem face este schimba capul. 62 00:03:41,800 --> 00:03:44,300 Pot face acest lucru nou nod fi noul șef, 63 00:03:44,300 --> 00:03:46,670 și se va indica la cap anterior. 64 00:03:46,670 --> 00:03:50,390 Cum putem face asta? Primul lucru ce trebuie să fac 65 00:03:50,390 --> 00:03:54,770 este de a schimba "n" în noul nod de valoare, 66 00:03:54,770 --> 00:03:57,530 care a fost transmis funcției. 67 00:03:57,530 --> 00:04:01,050 Apoi newnode urmează va fi cap. 68 00:04:01,050 --> 00:04:05,800 Capul va fi newnode. Deci, este destul de simplu. 69 00:04:05,800 --> 00:04:10,090 Pentru ștergerea unui nod, putem face ca - 70 00:04:10,090 --> 00:04:14,790 Un fel am putea face acest lucru este de a spune, 71 00:04:14,790 --> 00:04:18,160 bine, dacă am vrut să-l ștergeți, de exemplu, 3, 72 00:04:18,160 --> 00:04:24,850 ceea ce am putea face este doar punctul de nodul anterior 73 00:04:24,850 --> 00:04:27,580 la următorul nod de 3. 74 00:04:27,580 --> 00:04:29,400 Deci, aș face ceva de genul asta. 75 00:04:29,400 --> 00:04:33,400 Dar ceea ce este problema cu a face asta? 76 00:04:33,400 --> 00:04:37,400 Am o scurgere de memorie, asa ca nu mai au acces la numărul 3. 77 00:04:37,400 --> 00:04:42,480 Problema cu care este că eu nu am de gând să fie în măsură pentru a elibera acel nod. 78 00:04:42,480 --> 00:04:45,360 Am de gând să aibă scurgere de memorie și (neinteligibil) este de gând să mă urăști. 79 00:04:45,360 --> 00:04:49,370 Deci, în loc de a face asta, ar trebui, probabil, să aibă un pointer temporar. 80 00:04:49,370 --> 00:04:53,210 Așa că am pus temp. Se va indica la nodul pe care vreau să-l ștergeți. 81 00:04:53,210 --> 00:04:58,170 Și apoi mă pot mișca nodurile anterioare la punctul de la nodul următor 82 00:04:58,170 --> 00:05:00,390 a nodului pe care vreau să-l ștergeți. 83 00:05:00,390 --> 00:05:02,730 Și, în sfârșit, pot elibera indicatorul. 84 00:05:02,730 --> 00:05:07,480 Trebuie să elibera indicatorul pe care l-am creat chiar acolo? 85 00:05:07,480 --> 00:05:09,560 Nu trebuie să, doar pentru că - 86 00:05:09,560 --> 00:05:13,430 diferența este că acest nod a fost creat folosind malloc, 87 00:05:13,430 --> 00:05:17,280 așa că este în grămadă, în timp ce acesta a fost declarat doar ca un comutator NULL în stivă. 88 00:05:17,280 --> 00:05:20,000 Așa că nu trebuie să-l elibereze. 89 00:05:20,000 --> 00:05:22,030 >> Bine. Deci, acum, hai sa vorbim despre stive. 90 00:05:22,030 --> 00:05:24,680 Stive sunt destul de simplă. 91 00:05:24,680 --> 00:05:29,540 Am făcut stive și cozile de la clasa, folosind doar tablouri, 92 00:05:29,540 --> 00:05:32,820 dar ar trebui să fie familiar - doar să fie conștienți 93 00:05:32,820 --> 00:05:40,740 pe care le puteți face, de asemenea, stive, în cozi, folosind liste legate, de asemenea. 94 00:05:40,740 --> 00:05:44,460 Deci, dacă aveți un tablou, ceea ce ar fi o stivă? 95 00:05:44,460 --> 00:05:46,810 O stivă, în primul rând, va trebui să aibă o dimensiune. 96 00:05:46,810 --> 00:05:49,950 Trebuie să stocați ceea ce este dimensiunea stivei pe care le au acum. 97 00:05:49,950 --> 00:05:52,980 Și, de asemenea, le-ar fi o matrice, în acest caz de numere, 98 00:05:52,980 --> 00:05:55,120 dar, dacă doriți, acesta poate fi un tablou 99 00:05:55,120 --> 00:06:00,380 de siruri de caractere, o serie de struct, tot ce doriți să stocați. 100 00:06:00,380 --> 00:06:03,240 Despre stiva: Diferența dintre o stivă și o listă de legat 101 00:06:03,240 --> 00:06:08,590 este că în stiva trebuie doar acces la ultimul element care a fost pus în stivă. 102 00:06:08,590 --> 00:06:11,770 Se numește ultimul intrat, primul ieșit. 103 00:06:11,770 --> 00:06:15,090 La fel cum ai avea un stack de tăvi, 104 00:06:15,090 --> 00:06:17,670 dacă ai pus o tava pe partea de sus a stivei, 105 00:06:17,670 --> 00:06:22,670 trebuie să scoateți tava în primul rând pentru a avea acces la alte tăvi. 106 00:06:22,670 --> 00:06:26,310 Este același lucru cu stive. 107 00:06:26,310 --> 00:06:31,220 Așa că, dacă vreau să, de exemplu, se adaugă un element la o stivă, ceea ce ar trebui să fac? 108 00:06:31,220 --> 00:06:34,070 Se numește împinge, și e destul de simplu. 109 00:06:34,070 --> 00:06:37,130 Primul lucru ce trebuie să faceți este să verificați dacă dimensiunea stivei 110 00:06:37,130 --> 00:06:40,150 nu este mai mare sau egală cu capacitatea stivei. 111 00:06:40,150 --> 00:06:45,810 Pentru că dacă sunt deja pe capacitate maximă, nu puteți adăuga orice altceva. 112 00:06:45,810 --> 00:06:51,140 Și apoi, dacă nu, trebuie doar să adăugați elementul de stiva. 113 00:06:51,140 --> 00:06:54,530 Și, în sfârșit, incrementa dimensiunea. Deci, este destul de simplu. 114 00:06:54,530 --> 00:06:57,140 Așa că am adăuga doar numărul 2. 115 00:06:57,140 --> 00:07:00,350 Și dacă vreau să pop, ceea ce înseamnă că vreau să eliminați 116 00:07:00,350 --> 00:07:03,870 ultimul element care a fost adăugat și a reveni valoarea elementului, 117 00:07:03,870 --> 00:07:09,180 primul lucru pe care trebuie să verifice este că stiva nu este gol. 118 00:07:09,180 --> 00:07:11,510 Pentru că dacă e gol, eu nu pot întoarce nimic. 119 00:07:11,510 --> 00:07:14,820 În acest caz, mă întorc -1. 120 00:07:14,820 --> 00:07:18,960 În caz contrar, am de gând să descrește dimensiunea spec., 121 00:07:18,960 --> 00:07:22,510 și numere (s.size) se întoarcă. 122 00:07:22,510 --> 00:07:27,230 De ce am descrește mărimea și apoi să se întoarcă s.size? 123 00:07:27,230 --> 00:07:30,930 E pentru că, în acest caz, spec. are dimensiunea 4, 124 00:07:30,930 --> 00:07:33,810 și doresc să se întoarcă al patrulea element, corect? 125 00:07:33,810 --> 00:07:36,030 Dar ceea ce este indicele de al patrulea element? Trei. 126 00:07:36,030 --> 00:07:44,510 Din moment ce eu nu mărime - va fi de 3, mă pot întoarce doar s.numbers (s.size) 127 00:07:44,510 --> 00:07:48,410 pentru că e 3. Deci, este doar indicele. 128 00:07:48,410 --> 00:07:50,380 >> Acum cozile. Cozile sunt cam același lucru. 129 00:07:50,380 --> 00:07:54,950 Singura diferență este că în loc de a avea ultimul intrat, primul ieșit, 130 00:07:54,950 --> 00:07:57,480 aveți primul intrat, primul ieșit. 131 00:07:57,480 --> 00:07:59,460 Probabil că, dacă sunteți de așteptare pentru a merge la un concert, 132 00:07:59,460 --> 00:08:04,260 tu nu ar fi fericit dacă ai avea un stack în loc de o listă de așteptare. 133 00:08:04,260 --> 00:08:07,730 Fiind ultima persoană care să vină ar fi prima persoană pentru a intra în concert. 134 00:08:07,730 --> 00:08:09,760 Tu, probabil, nu ar fi fericit. 135 00:08:09,760 --> 00:08:15,020 În coada de așteptare, prima persoană pentru a obține de la este, de asemenea, prima persoana pentru a ieși. 136 00:08:15,020 --> 00:08:18,720 Deci, în definirea unei cozi, pe lângă având în matrice dimensiunea, 137 00:08:18,720 --> 00:08:23,360 trebuie, de asemenea, să aibă cap, care este indicele de capul stivei. 138 00:08:23,360 --> 00:08:29,000 Deci, primul element chiar acum. 139 00:08:29,000 --> 00:08:32,710 Puneți în coadă este același lucru ca și împinge pentru stive. 140 00:08:32,710 --> 00:08:34,980 Dacă ați fost foarte naiv, ce-ar spune doar, 141 00:08:34,980 --> 00:08:39,289 ei bine, eu pot face exact acelasi lucru ca am facut pentru împinge. 142 00:08:39,289 --> 00:08:44,030 Eu pot doar să verificați dacă nu e dincolo de capacitatea. 143 00:08:44,030 --> 00:08:48,760 Dacă este, mă voi întoarce false, în caz contrar pot exporta doar noua valoare 144 00:08:48,760 --> 00:08:50,630 și apoi incrementează mărimea. 145 00:08:50,630 --> 00:08:52,750 Dar de ce este acest lucru greșit? 146 00:08:52,750 --> 00:08:55,010 Să vedem acest exemplu. 147 00:08:55,010 --> 00:08:57,020 Încerc să Puneți în coadă o grămadă de lucruri, 148 00:08:57,020 --> 00:08:58,390 și apoi am de gând să dequeue și Puneți în coadă. 149 00:08:58,390 --> 00:09:00,550 Există o mulțime de comenzi, dar e foarte simplu. 150 00:09:00,550 --> 00:09:04,790 Am de gând să Puneți în coadă de 5, deci se adaugă 5, și apoi 7, 151 00:09:04,790 --> 00:09:09,310 1, 4, 6, și apoi vreau să dequeue ceva, 152 00:09:09,310 --> 00:09:12,000 ceea ce înseamnă că am de gând pentru a elimina primul element. 153 00:09:12,000 --> 00:09:14,640 Așa că am de gând să eliminați numărul 3, corect? 154 00:09:14,640 --> 00:09:17,320 Primul element. Bine. 155 00:09:17,320 --> 00:09:21,450 Acum, dacă am încerca să Puneți în coadă altceva, ce se va întâmpla? 156 00:09:21,450 --> 00:09:24,290 În conformitate cu punerea în aplicare a mea, 157 00:09:24,290 --> 00:09:31,040 Am fost de gând să pună numărul următor în q.size index. 158 00:09:31,040 --> 00:09:35,140 În acest caz, dimensiunea este de 8, 159 00:09:35,140 --> 00:09:38,640 astfel încât indicele 8 va fi chiar aici, în ultima poziție. 160 00:09:38,640 --> 00:09:43,900 Dacă am încerca să Puneți în coadă o chiar aici, mi-ar fi suprascrierea ultima poziție 161 00:09:43,900 --> 00:09:45,870 la numărul 1, care este complet greșit. 162 00:09:45,870 --> 00:09:49,870 Ceea ce vreau să faceți este să încheie în jurul și du-te la prima poziție. 163 00:09:49,870 --> 00:09:52,870 Poate v-ar spune doar, ei bine, am doar pentru a verifica 164 00:09:52,870 --> 00:09:55,600 dacă pot pune de fapt, ceva acolo. 165 00:09:55,600 --> 00:09:58,560 Dacă nu, eu spun doar, oh, noua capacitate deplină 166 00:09:58,560 --> 00:10:02,010 este, de fapt capacitate - 1, și nu se poate pune un element de acolo. 167 00:10:02,010 --> 00:10:06,150 Dar ceea ce este problema? Problema este că, dacă am dequeue doar totul chiar aici 168 00:10:06,150 --> 00:10:08,240 și apoi am încercați să adăugați altceva, s-ar spune pur și simplu, 169 00:10:08,240 --> 00:10:11,210 bine, ai fost la capacitate maximă, care este 0. 170 00:10:11,210 --> 00:10:13,620 Deci, coada dvs. este plecat. 171 00:10:13,620 --> 00:10:16,990 Trebuie să-și încheie în jurul, și un fel de ambalaj în jurul 172 00:10:16,990 --> 00:10:22,040 că voi învățat în psets vizionare și alte a fost folosirea mod. 173 00:10:22,040 --> 00:10:29,090 Puteți să-l încerca la domiciliu pentru a înțelege de ce te-ar face q.size + q.head 174 00:10:29,090 --> 00:10:31,080 Capacitatea de mod, dar dacă tu a verifica aici, 175 00:10:31,080 --> 00:10:34,760 putem vedea că funcționează. 176 00:10:34,760 --> 00:10:37,760 Deci, în ultimul exemplu, q.size a fost de 8 177 00:10:37,760 --> 00:10:47,590 iar capul a fost de 1, pentru că a fost această poziție aici de matrice. 178 00:10:47,590 --> 00:10:51,970 Deci, acesta va fi de 8 + 1, 9. Capacitatea de Mod 9 ar fi 0. 179 00:10:51,970 --> 00:10:56,640 Aceasta ar merge la indicele 0. Vom fi în poziția corectă. 180 00:10:56,640 --> 00:10:59,750 Și apoi încercați coada de la domiciliu. 181 00:10:59,750 --> 00:11:04,950 Câteva lucruri importante: să încerce să înțeleagă diferența dintre o stivă și o coadă. 182 00:11:04,950 --> 00:11:11,620 La domiciliu, să încercați să obțineți foarte familiarizat cu punerea în aplicare Puneți în coadă, dequeue, împinge și pop. 183 00:11:11,620 --> 00:11:16,560 Și, de asemenea, să înțeleagă când le-ar folosi fiecare dintre ele. 184 00:11:16,560 --> 00:11:22,830 >> Deci, haideți să se relaxeze timp de 10 secunde, cu un buchet de pokemoni. 185 00:11:22,830 --> 00:11:26,080 Și acum să ne întoarcem la structuri de date. 186 00:11:26,080 --> 00:11:29,770 Hash mese. O mulțime de oameni s-au speriat de tabele de dispersie. 187 00:11:29,770 --> 00:11:33,650 în problema set 6, Spell Checker. 188 00:11:33,650 --> 00:11:35,980 Tabele de dispersie și încearcă, o mulțime de oameni se sperie de ele. 189 00:11:35,980 --> 00:11:38,540 Ei cred că sunt atât de greu de înțeles. Da? 190 00:11:38,540 --> 00:11:41,490 [Rob Bowden] Problema stabilit 5. >> Problema stabilit 5, da. Mulțumiri Rob. 191 00:11:41,490 --> 00:11:43,370 Da. Șase fost Huff n "Puff, da. 192 00:11:43,370 --> 00:11:49,340 Problema a fost stabilit 5 Spell Checker, si tu ai avut de a folosi fie un tabel hash sau un try. 193 00:11:49,340 --> 00:11:55,360 O mulțime de oameni crezut că au fost foarte greu de înțeles, dar ele sunt de fapt destul de simplu. 194 00:11:55,360 --> 00:12:01,290 Ce este un tabel hash, de fapt? Un tabel hash este o serie de liste legate. 195 00:12:01,290 --> 00:12:06,730 Singura diferență dintre o matrice și un tabel hash 196 00:12:06,730 --> 00:12:09,730 este că în tabelul hash ai ceva numit o funcție hash. 197 00:12:09,730 --> 00:12:12,080 Ce este o funcție hash? 198 00:12:12,080 --> 00:12:13,970 Nu știu dacă voi puteți citi aici. 199 00:12:13,970 --> 00:12:16,090 Acesta este un exemplu de tabelă hash. 200 00:12:16,090 --> 00:12:19,220 Astfel încât să puteți vedea că aveți un tablou cu 31 de elemente. 201 00:12:19,220 --> 00:12:22,440 Și ceea ce facem într-un tabel hash este o funcție hash 202 00:12:22,440 --> 00:12:26,660 care se va traduce o cheie, fiecare int pentru un index. 203 00:12:26,660 --> 00:12:31,740 În cazul în care, de exemplu, dacă vreau să aleagă pentru B. Harrison, 204 00:12:31,740 --> 00:12:34,190 Mi-ar pune B. Harrison în funcțiile mele hash, 205 00:12:34,190 --> 00:12:36,960 și funcția de distribuire se va întoarce 24. 206 00:12:36,960 --> 00:12:40,930 Deci, eu știu că vreau să stocați B. Harrison în 24. 207 00:12:40,930 --> 00:12:46,580 Deci, asta e diferența între a avea doar o rețea și un tabel hash. 208 00:12:46,580 --> 00:12:48,740 În tabelul hash va avea o funcție care este de gând să-ți spun 209 00:12:48,740 --> 00:12:54,740 în cazul în care pentru a stoca datele pe care doriți să le stocați. 210 00:12:54,740 --> 00:12:57,040 Pentru funcția de distribuire, vrei să te uiți pentru o funcție hash 211 00:12:57,040 --> 00:13:00,600 că este deterministă și bine distribuite. 212 00:13:00,600 --> 00:13:07,810 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 213 00:13:07,810 --> 00:13:12,470 în loc de a folosi 31 și 30 și 29, care au fost toate gratuite. 214 00:13:12,470 --> 00:13:16,920 Deci, funcția de distribuire pe care am folosit nu a fost foarte bine distribuite. 215 00:13:16,920 --> 00:13:20,710 Când spunem bine distribuit, înseamnă că vrem să avem, 216 00:13:20,710 --> 00:13:26,520 aproximativ, cel puțin 1 sau 2 pentru fiecare din - 217 00:13:26,520 --> 00:13:32,190 cum ar fi, o diferență de 1 sau 2 pentru fiecare dintre indicii din matrice. 218 00:13:32,190 --> 00:13:43,950 Vrei să aibă, aproximativ, același număr de elemente în fiecare listă legată în matrice. 219 00:13:43,950 --> 00:13:48,600 Și este ușor pentru a verifica dacă acesta este valabil în tabelul hash, vezi ca tabele de dispersie. 220 00:13:48,600 --> 00:13:51,770 Apoi >> copaci. Acesta este un copac. 221 00:13:51,770 --> 00:13:56,400 Copaci în informatică sunt cu susul în jos pentru un motiv oarecare. 222 00:13:56,400 --> 00:14:00,150 Deci, aici aveți rădăcina de copac și apoi frunzele. 223 00:14:00,150 --> 00:14:05,630 Ar trebui să știi doar nomenclatura pentru părinți și copii. 224 00:14:05,630 --> 00:14:12,880 Fiecare nod are copii săi, care sunt nodurile care sunt sub părintele. 225 00:14:12,880 --> 00:14:19,660 Deci, de exemplu, 2 va fi mamă de 3 și pentru celălalt copil acolo, 226 00:14:19,660 --> 00:14:25,290 în timp ce 3 va fi mamă pentru 1 și ceilalți copii care sunt acolo. 227 00:14:25,290 --> 00:14:29,990 Și 1 va fi copil de 3 lui, și așa mai departe. 228 00:14:29,990 --> 00:14:34,610 Noi avem ceva mult mai interesant, numit un arbore binar de căutare, 229 00:14:34,610 --> 00:14:39,040 în care toate valorile de pe partea dreaptă a unui nod 230 00:14:39,040 --> 00:14:41,660 vor fi pe dreapta, chiar aici - pe dreapta, 231 00:14:41,660 --> 00:14:46,780 sunt de gând să fie mai mare decât elementul din rădăcină. 232 00:14:46,780 --> 00:14:49,780 Deci, dacă am avea numărul 5, chiar aici, toate elementele de pe partea dreaptă 233 00:14:49,780 --> 00:14:51,940 vor fi mai mare de 5, iar în stânga 234 00:14:51,940 --> 00:14:56,770 toate elementele sunt de gând să fie mai mică de 5. 235 00:14:56,770 --> 00:14:58,780 De ce este aceasta utilă? 236 00:14:58,780 --> 00:15:01,660 Ei bine, dacă doriți să verificați dacă numărul 7 este aici, de exemplu, 237 00:15:01,660 --> 00:15:05,960 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? 238 00:15:05,960 --> 00:15:09,540 Este mai mare, așa că știu că va trebui să fie pe partea dreaptă de copac. 239 00:15:09,540 --> 00:15:13,980 Așa că am avea mult mai puțin lucruri să se uite la. 240 00:15:13,980 --> 00:15:19,520 La punerea în aplicare a unui arbore binar de căutare, nodul, eu sunt doar de gând să trebuie să aibă date, 241 00:15:19,520 --> 00:15:21,750 astfel int n, ai putea avea, de asemenea, un șir 242 00:15:21,750 --> 00:15:23,630 sau orice ai vrut. 243 00:15:23,630 --> 00:15:28,100 Trebuie doar să fii atent la definirea a ceea ce este mai mare, ceea ce este mai puțin. 244 00:15:28,100 --> 00:15:30,390 Deci, dacă ați avut siruri de caractere, de exemplu, ai putea defini 245 00:15:30,390 --> 00:15:34,690 că toate aceste lucruri cu privire la dreptul de gând să aibă o lungime mai mare, 246 00:15:34,690 --> 00:15:40,940 stânga vor avea lungimi mai mici, așa că într-adevăr până la tine. 247 00:15:40,940 --> 00:15:44,930 >> Cum pot pune în aplicare găsi pentru BST? 248 00:15:44,930 --> 00:15:47,840 Primul lucru pe care va trebui să faceți este să verificați dacă rădăcina este NULL. 249 00:15:47,840 --> 00:15:50,920 Daca este NULL, aceasta înseamnă că un lucru nu este acolo 250 00:15:50,920 --> 00:15:53,330 pentru că nu au nici măcar un copac, nu? 251 00:15:53,330 --> 00:15:55,790 Așa că am întoarce false. 252 00:15:55,790 --> 00:15:58,740 În caz contrar, am de gând pentru a verifica dacă numărul este mai mare 253 00:15:58,740 --> 00:16:01,720 decât valoarea din radacina. 254 00:16:01,720 --> 00:16:04,250 Voi încerca să găsească elementul din dreapta 255 00:16:04,250 --> 00:16:08,590 din copac. 256 00:16:08,590 --> 00:16:11,310 Veți vedea că eu sunt, folosind recursivitate aici. 257 00:16:11,310 --> 00:16:14,150 Și apoi, dacă e mai puțin, am de gând să se uite la stânga. 258 00:16:14,150 --> 00:16:18,330 Și, în sfârșit, în caz contrar, dacă nu e mai puțin sau nu mai mare, 259 00:16:18,330 --> 00:16:20,660 aceasta înseamnă că este valoarea în sine. 260 00:16:20,660 --> 00:16:23,010 Așa că mă voi întoarce adevărat. 261 00:16:23,010 --> 00:16:26,360 Puteți vedea aici că am folosit în cazul în care, în cazul în care, în cazul în care. 262 00:16:26,360 --> 00:16:30,820 Și amintiți-vă, în test 0, am avut o problemă care a avut, dacă, în cazul în care, în cazul în care, 263 00:16:30,820 --> 00:16:32,780 și trebuia să găsească ineficiența, 264 00:16:32,780 --> 00:16:35,180 și ineficiența a fost că, dacă ați folosit. 265 00:16:35,180 --> 00:16:39,060 Tu ar trebui să fi folosit în cazul în care, în cazul în care altcineva, altceva în cazul în care, și altceva. 266 00:16:39,060 --> 00:16:44,240 Deci, ar trebui sa folosesc altceva în cazul în care și în cazul în care altcineva și altcineva aici? 267 00:16:44,240 --> 00:16:46,200 Are cineva - Da? 268 00:16:46,200 --> 00:16:51,140 [Student vorbind, nu pot fi auzite] 269 00:16:51,140 --> 00:16:53,480 E perfect. Deci, ea spune că nu contează, 270 00:16:53,480 --> 00:16:55,930 doar pentru că ineficiența pe care am avut-o înainte 271 00:16:55,930 --> 00:16:59,550 a fost că, deoarece, poate, în cazul în care unele condiție a fost îndeplinită, 272 00:16:59,550 --> 00:17:03,570 astfel încât ați efectuat o acțiune, dar apoi te-ai de gând să verifice toate celelalte condiții. 273 00:17:03,570 --> 00:17:06,319 Dar, în acest caz, ea a revenit imediat, așa că nu contează. 274 00:17:06,319 --> 00:17:09,220 Deci, nu trebuie să folosiți altceva în cazul în care. 275 00:17:09,220 --> 00:17:11,740 >> Și, în sfârșit, hai sa vorbim despre încercări, 276 00:17:11,740 --> 00:17:13,800 care este tuturor favorit. 277 00:17:13,800 --> 00:17:15,980 O încercare este un copac de matrice. 278 00:17:15,980 --> 00:17:20,369 Este foarte rapid pentru a căuta valori, dar se folosește o mulțime de memorie. 279 00:17:20,369 --> 00:17:22,530 Și este, de obicei, pentru a filtra cuvinte, astfel încât atunci când 280 00:17:22,530 --> 00:17:27,920 Vreau să pună în aplicare, de exemplu, nu știu, cum ar fi o carte de telefon în telefon 281 00:17:27,920 --> 00:17:30,440 și doriți să fie în măsură să tip B 282 00:17:30,440 --> 00:17:32,510 și doar au nume de oameni care au B. 283 00:17:32,510 --> 00:17:37,960 Este foarte ușor să pună în aplicare, care, folosind o încercare, de exemplu. 284 00:17:37,960 --> 00:17:39,820 Cum definiți un nod într-o încercare? 285 00:17:39,820 --> 00:17:43,910 Trebuie doar să aibă o bool care va fi is_word. 286 00:17:43,910 --> 00:17:48,660 Care reprezintă faptul că, folosind toate caracterele înainte de nod, 287 00:17:48,660 --> 00:17:51,920 ați fost în măsură să formeze un cuvânt, 288 00:17:51,920 --> 00:17:57,230 și apoi veți avea o serie de indicii pentru noduri. 289 00:17:57,230 --> 00:18:03,120 Poți vedea că avem o serie de noduri mamă, așa nod * matrice? Da? 290 00:18:03,120 --> 00:18:06,050 Să vedem cum va funcționa. Pentru verificarea ortografiei, 291 00:18:06,050 --> 00:18:08,230 avem o serie de 27 de elemente, 292 00:18:08,230 --> 00:18:12,150 pentru că avem toate literele plus apostrof. 293 00:18:12,150 --> 00:18:17,800 Înainte de aici, eu sunt doar de gând să utilizeze 2 pentru că vreau să fie în măsură să scrie pe tablă. 294 00:18:17,800 --> 00:18:20,230 Bine. Deci, acesta este un exemplu de un try. 295 00:18:20,230 --> 00:18:25,600 Dacă am defini doar primul nod, voi avea o serie de două elemente 296 00:18:25,600 --> 00:18:29,290 că sunt două indicii la NULL, așa că am pus "o" și "b". 297 00:18:29,290 --> 00:18:32,430 Și am de gând să aibă o bool care spune is_word. 298 00:18:32,430 --> 00:18:34,420 O să fie false pentru primul, 299 00:18:34,420 --> 00:18:37,370 doar pentru că, înainte de faptul că nu are niciun caracter. 300 00:18:37,370 --> 00:18:40,900 Deci, un cuvânt gol nu este un cuvânt. Deci, este fals. 301 00:18:40,900 --> 00:18:46,320 Dacă vreau să adăugați "o" în acest dicționar, ceea ce mi-ar trebui să fac? 302 00:18:46,320 --> 00:18:49,760 Mi-ar trebui doar să malloc un nou nod pentru "o", 303 00:18:49,760 --> 00:18:54,630 și apoi se adaugă cuvântul său de adevărat. 304 00:18:54,630 --> 00:19:00,180 Deci, ea reprezintă doar că au "o" va fi adevărat. Face sens? 305 00:19:00,180 --> 00:19:04,120 Apoi, dacă vreau să adăugați "ba", va trebui să malloc 1 pentru 'b', 306 00:19:04,120 --> 00:19:07,550 și apoi am de gând să înființeze boolean la fals, 307 00:19:07,550 --> 00:19:10,160 pentru că "b" de la sine, nu este un cuvânt. 308 00:19:10,160 --> 00:19:13,010 Apoi, am de gând să malloc altul pentru "o", astfel "ba", 309 00:19:13,010 --> 00:19:16,290 și apoi am de gând să înființeze este un cuvânt de adevărat. 310 00:19:16,290 --> 00:19:18,950 Deoarece "ba" este un cuvânt. 311 00:19:18,950 --> 00:19:21,910 Și apoi, dacă vreau să văd dacă "b" este în acest dicționar, 312 00:19:21,910 --> 00:19:26,730 Eu pot merge doar la primul, "b". Mă duc în jos, și mă uit la este cuvântul, și se spune fals. 313 00:19:26,730 --> 00:19:30,110 Deci, nu e un cuvânt. Dacă vreau să verificați "ba", 314 00:19:30,110 --> 00:19:38,010 Mă duc la primul, "b", și apoi du-te la "o", și văd adevărat, deci este un cuvânt. Face sens? 315 00:19:38,010 --> 00:19:41,950 O mulțime de oameni obține confuz de încercări. Nu? 316 00:19:41,950 --> 00:19:44,740 >> Fine, Huffman de codificare. Codificare Huffman este foarte util 317 00:19:44,740 --> 00:19:47,550 pentru a salva memorie și a comprima fișiere text, 318 00:19:47,550 --> 00:19:52,270 doar pentru că de multe ori se utilizează "o" și "e", de exemplu, 319 00:19:52,270 --> 00:19:57,710 în documente, dar nu știu dacă voi folosi "q" sau "z", la fel de mult. 320 00:19:57,710 --> 00:20:02,040 Având doar 1 octet pentru fiecare caracter, 321 00:20:02,040 --> 00:20:08,520 fiecare - de 256 de caractere pe care le avem în tabelul ASCII nu este foarte optimă, 322 00:20:08,520 --> 00:20:11,410 doar pentru că există unele caractere pe care le folosesc mult mai mult, 323 00:20:11,410 --> 00:20:15,180 deci ar trebui, probabil, folosiți mai puțină memorie pentru cei. 324 00:20:15,180 --> 00:20:17,560 Cum pot folosi o codificare Huffman? 325 00:20:17,560 --> 00:20:20,010 Avem de a face un copac Huffman. 326 00:20:20,010 --> 00:20:23,370  Un copac Huffman are noduri 327 00:20:23,370 --> 00:20:27,760 care au un simbol care va fi ca, "a", "b", "c", scrisoarea, 328 00:20:27,760 --> 00:20:32,990 orice scrisoare aveti, o frecvență care este frecvența pe care cuvântul apare în text, 329 00:20:32,990 --> 00:20:36,280 că ai fost crearea copac Huffman pentru, 330 00:20:36,280 --> 00:20:41,800 și apoi un nod care se va indica la stânga de copac Huffman 331 00:20:41,800 --> 00:20:47,210 și un alt nod care va indica la dreapta. Deci, la fel ca un copac. 332 00:20:47,210 --> 00:20:49,440 Cum vă construi un copac Huffman? 333 00:20:49,440 --> 00:20:54,020 Ai de gând să alegeți cele 2 noduri care au cele mai mici frecvențe. 334 00:20:54,020 --> 00:20:56,490 Dacă aveți o cravată ai de gând să alegeți cele 2 noduri 335 00:20:56,490 --> 00:20:59,870 care au cele mai mici valori ASCII, de asemenea. 336 00:20:59,870 --> 00:21:02,420 Atunci ai de gând pentru a crea un nou copac din cele 2 noduri 337 00:21:02,420 --> 00:21:08,030 care va avea frecvența combinate în nodul părinte. 338 00:21:08,030 --> 00:21:13,240 Și atunci ai de gând să eliminați 2 copii din padure 339 00:21:13,240 --> 00:21:15,570 și să le înlocuiască cu părintele. 340 00:21:15,570 --> 00:21:18,930 Și ai de gând să repet că până când veți avea doar un copac în pădure. 341 00:21:18,930 --> 00:21:23,840 Deci, hai sa vedem cum te-ar face un copac Huffman pentru ZAMYLA. 342 00:21:23,840 --> 00:21:29,220 Puteți vedea aici că toate scrisorile au frecvență 1, cu excepția pentru "A", care are frecventa 2. 343 00:21:29,220 --> 00:21:34,090 Așa că am creat noduri pentru toate scrisorile pe care le pun în ordine de valoare ASCII și frecvență. 344 00:21:34,090 --> 00:21:40,090 Așa că dacă vreau pentru a crea primul copac, acesta va fi cu "L" și "M". 345 00:21:40,090 --> 00:21:43,100 Deci e aici. Frecvența perechii va fi 2 346 00:21:43,100 --> 00:21:49,470 pentru că este 1 + 1, atunci următoarea 2 cu cele mai mici frecvențe sunt "Y" și "Z". 347 00:21:49,470 --> 00:21:53,180 Și apoi am toate fiind - au o frecvență de 2. 348 00:21:53,180 --> 00:22:00,470 Deci, care dintre ele sunt cele care au cea mai mică valoare ASCII pentru cea viitoare? 349 00:22:00,470 --> 00:22:04,830 "A" și "L". Așa că am crea un nou nod, 350 00:22:04,830 --> 00:22:09,930 și, în final, este de 4 și 2, astfel încât 2 va fi pe stânga. 351 00:22:09,930 --> 00:22:12,430 Și aceasta este arborele Huffman. 352 00:22:12,430 --> 00:22:16,060 Apoi, dacă vreau să scrie un text, 353 00:22:16,060 --> 00:22:24,440 ca în binar pentru a converti la text, folosind arborele Huffman este foarte ușor. 354 00:22:24,440 --> 00:22:30,220 De exemplu, dacă eu spun că se deplasează la stânga este un 0 și se deplasează la dreapta este un 1, 355 00:22:30,220 --> 00:22:32,410 Ce este că merge să reprezinte? 356 00:22:32,410 --> 00:22:35,530 Deci, cum ar fi 1, 1, atât de dreapta, dreapta, 357 00:22:35,530 --> 00:22:40,370 și apoi 0, deci ar fi lăsat L, și apoi 1, 0, 0. 358 00:22:40,370 --> 00:22:43,950 Deci 1, 0, deci doar 1, 0, 'A'. 359 00:22:43,950 --> 00:22:47,540 Apoi 0, 1, deci 'Z'. 360 00:22:47,540 --> 00:22:52,170 Și apoi 1, 0, 0 - nu. 361 00:22:52,170 --> 00:22:56,780 0, 0 va fi "Y", atât de leneș. 362 00:22:56,780 --> 00:23:06,060 Deci, asta e tot pentru mine, Rob va prelua. 363 00:23:06,060 --> 00:23:08,400 >> [Rob Bowden] Deci, săptămâna 7 lucruri. 364 00:23:08,400 --> 00:23:11,390 Avem o mulțime de a trece peste foarte repede. 365 00:23:11,390 --> 00:23:13,430 Operatori pe biți, buffer overflow, 366 00:23:13,430 --> 00:23:16,760 Bibliotecă CS50, apoi HTML, HTTP, CSS. 367 00:23:16,760 --> 00:23:20,990 Tot în ca 15 la 20 de minute. 368 00:23:20,990 --> 00:23:24,330 Operatori la nivel de bit. Există 6 dintre ele pe care trebuie să știți. 369 00:23:24,330 --> 00:23:31,200 La nivel de bit și, la nivel de bit sau, XOR, schimbare stânga, deplasare dreapta, și nu. 370 00:23:31,200 --> 00:23:35,420 Trecerea de drept și nu abia văzut în curs, la toate. 371 00:23:35,420 --> 00:23:40,480 Vom merge peste el repede aici, dar e bine să știți că acestea sunt șase care exista. 372 00:23:40,480 --> 00:23:45,070 Amintiți-vă că operatorii pe biți sunt ca atunci cand faci 3 + 4. 373 00:23:45,070 --> 00:23:49,420 Nu sunt de-a face cu binare de 3 și 4. 374 00:23:49,420 --> 00:23:56,550 Cu operatori la nivel de bit vă sunt de fapt a face cu biții individuale ale numerelor 3 și 4. 375 00:23:56,550 --> 00:23:59,120 >> Deci, primul care ne vom spune este la nivel de bit nu, 376 00:23:59,120 --> 00:24:02,340 și tot ce face este flip-toate biți. 377 00:24:02,340 --> 00:24:05,500 Deci, aici, dacă sunteți scris acest lucru în C, nu s-ar scrie 378 00:24:05,500 --> 00:24:09,380 ca ~ 11011 sau orice altceva, v-ar scrie place ~ 4, 379 00:24:09,380 --> 00:24:12,970 și apoi s-ar răsturna reprezentarea binară a 4. 380 00:24:12,970 --> 00:24:24,800 Deci, aici, ~ de un numar binar 1101101 se va răsturna exact toate de la 1 la 0 și toate 0 la 1 lui. 381 00:24:24,800 --> 00:24:27,600 Așa cum am spus acolo, utilizarea frecventă a acestei, 382 00:24:27,600 --> 00:24:30,830 și vom vedea într-un pic, este ca și cum ne-o dorim de a veni cu un numar 383 00:24:30,830 --> 00:24:35,460 în cazul în care toți biții sunt 1, cu excepția unuia dintre ele. 384 00:24:35,460 --> 00:24:38,560 Deci, este de obicei mai ușor să-și exprime numărul 385 00:24:38,560 --> 00:24:40,630 în cazul în care doar un singur bit este setat, 386 00:24:40,630 --> 00:24:44,650 și apoi să ia ~ de ea, astfel încât orice alt bit este setat în afară de asta. 387 00:24:44,650 --> 00:24:50,300 Deci, asta e ceea ce am de gând să folosească mai mult într-un pic. 388 00:24:50,300 --> 00:24:58,220 >> Nivel de bit sau. Aici sunt două numere binare, și aceste 2 numere 389 00:24:58,220 --> 00:25:00,780 sunt destul de reprezentative, deoarece ele reprezintă fiecare posibil 390 00:25:00,780 --> 00:25:07,290 combinație de biți ai putea avea nevoie pentru a funcționa pe. 391 00:25:07,290 --> 00:25:13,540 Aici, când am or'd fiecare bit, suntem doar de gând să compare direct în jos. 392 00:25:13,540 --> 00:25:15,410 Deci, pe partea stanga avem un 1 și un 1. 393 00:25:15,410 --> 00:25:20,510 Când am nivel de bit | cei, ce am de gând pentru a obține? Unul. 394 00:25:20,510 --> 00:25:25,320 Apoi, la nivel de bit | 0 și 1 este de gând să-mi dea? Unul. 395 00:25:25,320 --> 00:25:27,840 La nivel de bit 1 și 0 va fi același lucru, unul. 396 00:25:27,840 --> 00:25:31,880 La nivel de bit 0 | 0 este de gând să-mi dea 0. 397 00:25:31,880 --> 00:25:37,300 Deci, singurul caz în care ajung 0 este în 0 | 0 caz. 398 00:25:37,300 --> 00:25:40,020 Și vă puteți gândi că la fel ca RUP tale logice. 399 00:25:40,020 --> 00:25:44,830 Deci, dacă te gândești la 1 la fel de adevărat și 0 ca fals, același lucru se aplică și aici. 400 00:25:44,830 --> 00:25:50,040 Atât de adevărat sau de adevărat este adevărat, adevărat sau fals este adevărat. 401 00:25:50,040 --> 00:25:57,150 Fals sau adevărat este adevărat, fals sau fals este singurul lucru care este de fapt fals. 402 00:25:57,150 --> 00:26:00,100 Iată un exemplu care ar trebui să știți 403 00:26:00,100 --> 00:26:05,160 ca o destul de bun exemplu, atunci când se utilizează operatori la nivel de bit. 404 00:26:05,160 --> 00:26:08,660 Aici, dacă am sau de capital "A" cu Ox20, 405 00:26:08,660 --> 00:26:11,830 și ne vom uita la acestea într-un al doilea, vom obține ceva. 406 00:26:11,830 --> 00:26:16,020 Și dacă am sau minusculă "o" cu Ox20, avem ceva. 407 00:26:16,020 --> 00:26:26,750 Deci, haideți să trageți în sus de masă ASCII. 408 00:26:26,750 --> 00:26:34,000 Bine. Aici vedem că "A" este - 409 00:26:34,000 --> 00:26:36,920 aici avem "A" este zecimal 65. 410 00:26:36,920 --> 00:26:45,120 Dar voi merge cu hexazecimal, care este Ox41. 411 00:26:45,120 --> 00:26:48,280 Destul de sigur că am văzut-o în clasă. Cred că am văzut-o în clasă 412 00:26:48,280 --> 00:26:52,730 că este destul de ușor să se transforme din hexazecimal în binar. 413 00:26:52,730 --> 00:26:55,280 Deci, aici, dacă vreau să pun 4 în binar, 414 00:26:55,280 --> 00:26:59,550 care este doar de gând să fie 0100. 415 00:26:59,550 --> 00:27:03,620 Acesta este locul 1 lui, locul 2 a lui, locul 4, astfel încât acesta este de 4. 416 00:27:03,620 --> 00:27:08,550 Apoi am putea împărți 1 în binar, care va fi 0001. 417 00:27:08,550 --> 00:27:14,280 Și așa mai departe acest lucru se întâmplă pentru a fi reprezentarea de "A" în binar. 418 00:27:14,280 --> 00:27:22,720 Având litere mici "a", este acum va fi Ox61, 419 00:27:22,720 --> 00:27:27,050 în cazul în care, divizare acestea până în binar sale, astfel încât un 6 - 420 00:27:27,050 --> 00:27:37,830 Hai să o facem de fapt - nu există nici o radieră? Eraser. 421 00:27:37,830 --> 00:27:48,220 Ox61. Deci, divizare 6 în binar va fi 0 + 4 + 2 + 0. 422 00:27:48,220 --> 00:27:54,610 Și despicare 1 va fi 0001. 423 00:27:54,610 --> 00:27:56,520 Privind la diferența dintre acestea două, 424 00:27:56,520 --> 00:28:04,250 vom vedea că singura diferență dintre o literă mică și un capital de "A" este acest singur bit. 425 00:28:04,250 --> 00:28:11,810 Deci, revenind la aici - bine. 426 00:28:11,810 --> 00:28:15,920 Revenind la aici, dacă ne uităm la ceea ce este bitul Ox20, 427 00:28:15,920 --> 00:28:22,210 așa divizare Ox20 în binar acesteia, 428 00:28:22,210 --> 00:28:27,310 este 0010, 0000. 429 00:28:27,310 --> 00:28:33,470 Ox20, doar bitul care este setat este acest ceva care ne preocupă, 430 00:28:33,470 --> 00:28:38,210 cu comutare între capital și litere mici "a". 431 00:28:38,210 --> 00:28:47,610 Dacă eu sau "A", care este aceasta, "A", 432 00:28:47,610 --> 00:28:50,580 dacă eu sau "A" cu Ox20, 433 00:28:50,580 --> 00:28:53,490 ceea ce am de gând pentru a obține? 434 00:28:53,490 --> 00:28:58,960 [Student, inaudibil] >> Minuscule "o", pentru că se va răsturna acest bit la un 1. 435 00:28:58,960 --> 00:29:04,170 Și dacă eu sau "o" cu Ox20, ceea ce am de gând pentru a obține? 436 00:29:04,170 --> 00:29:08,780 Litere mici o, pentru că doar ring 'a' cu Ox20, 437 00:29:08,780 --> 00:29:14,580 Mă duc să fie Oring acest singur bit la un 1, este deja un 1, așa că nu contează. 438 00:29:14,580 --> 00:29:17,960 Așa că am obține "un" și "o". 439 00:29:17,960 --> 00:29:24,820 >> Nivel de bit și. Din nou, ne putem gândi la acest lucru ca omologul nostru logic și. 440 00:29:24,820 --> 00:29:28,180 Pe partea stângă avem adevărat & adevărat. 441 00:29:28,180 --> 00:29:31,160 O să fie adevărat, și pentru toate cazurile, 442 00:29:31,160 --> 00:29:36,270 fals și adevărat sau true & false, sau false și false, 443 00:29:36,270 --> 00:29:38,550 nici unul dintre aceste lucruri sunt adevărate. 444 00:29:38,550 --> 00:29:44,170 Deci, ceea ce ne-am sfârșesc prin obtinerea este de 1000. 445 00:29:44,170 --> 00:29:48,830 Deci, acum, aici, aici, unde l-am folosit la nivel de bit de încredere nu, 446 00:29:48,830 --> 00:29:52,230 unde am avut Ox20. 447 00:29:52,230 --> 00:29:54,350 Deci, aceasta este Ox20. 448 00:29:54,350 --> 00:29:59,570 Acum, ceea ce vreau să fac, la nivel de bit ~ de Ox20. 449 00:29:59,570 --> 00:30:03,600 Care va răsturna toate biți. 450 00:30:03,600 --> 00:30:09,330 Deci, am 1101, 1111. 451 00:30:09,330 --> 00:30:18,940 Și așa "A" anded cu ~ Ox20 este de gând să-mi dea ce? 452 00:30:18,940 --> 00:30:22,430 Biți numai avem într-adevăr nevoie să se gândească la asta, 453 00:30:22,430 --> 00:30:26,020 întrucât, în cazul în care toți acești biți sunt setate la 1, 454 00:30:26,020 --> 00:30:29,000 atunci vom obține exact ceea ce "A" a fost, 455 00:30:29,000 --> 00:30:31,260 cu excepția, poate, ceea ce acest bit este. 456 00:30:31,260 --> 00:30:34,460 Pentru că în cazul în care acesta a fost un 1, acum o să fie setat la o 0, 457 00:30:34,460 --> 00:30:39,810 pentru că orice ar fi, anded cu aceasta va fi 0. 458 00:30:39,810 --> 00:30:43,280 Deci, ceea ce este "A" și ~ Ox20 de gând să-mi dea? 459 00:30:43,280 --> 00:30:48,200 [Studenții răspunde, nu pot fi auzite] >> Și ceea ce este "un" și - este "A". 460 00:30:48,200 --> 00:30:52,170 Și ceea ce este "o" și ~ Ox20 de gând să-mi dea? 461 00:30:52,170 --> 00:30:56,720 "A." Deoarece acest lucru este în prezent o 1. 462 00:30:56,720 --> 00:30:59,570 Anding cu aceasta 0 este de gând să facă un 0, 463 00:30:59,570 --> 00:31:02,530 și acum am de gând să obțineți un "A". 464 00:31:02,530 --> 00:31:06,600 >> Ambele sunt "A", iar ultimul, dar nu cel mai puțin de acest tip, 465 00:31:06,600 --> 00:31:10,830 avem XOR. Este foarte mult ca sau, 466 00:31:10,830 --> 00:31:14,400 cu excepția înseamnă exclusiv sau. 467 00:31:14,400 --> 00:31:18,420 Aceasta este ca și cum ceea ce crezi, de obicei, de drept sau în lumea reală. 468 00:31:18,420 --> 00:31:23,190 Astfel încât să nu fie "x" sau "y", dar nu ambele. 469 00:31:23,190 --> 00:31:28,700 Aici 1 ^ 1 va fi 0. 470 00:31:28,700 --> 00:31:33,650 Pentru că adevărat, aceasta este - nu funcționează la fel de bine cu logică adevărat și fals 471 00:31:33,650 --> 00:31:37,150 ca nivel de bit & și sau nu, 472 00:31:37,150 --> 00:31:40,100 dar adevărat ^ adevărat este fals. 473 00:31:40,100 --> 00:31:44,810 Pentru că vrem doar să se întoarcă adevărat în cazul în care numai una dintre ele este adevărat. 474 00:31:44,810 --> 00:31:50,950 Deci, 1 ^ 1 este 0. Ce zici de 0 ^ 1? 475 00:31:50,950 --> 00:31:56,010 Este 1. 1 ^ 0 este 1, 0 ^ 0 este 0. 476 00:31:56,010 --> 00:32:03,890 Deci, în toate circumstanțele, 0 nivel de bit ceva 0 va fi 0. 477 00:32:03,890 --> 00:32:10,270 1 la nivel de bit ceva 0 0 sau la nivel de bit 1, 478 00:32:10,270 --> 00:32:14,660 dacă e | sau ^, va fi un 1, și dacă e si va fi 0. 479 00:32:14,660 --> 00:32:20,850 Și singurul caz în care un nivel de bit 1 nu este 1 este de exclusiv sau. 480 00:32:20,850 --> 00:32:24,580 Asta este 0110. 481 00:32:24,580 --> 00:32:36,520 Deci, aici, acum, folosind XOR - așa ne-am întors la 20. 482 00:32:36,520 --> 00:32:43,480 'A' ^ Ox20 este aceste 2 biți suntem compararea. 483 00:32:43,480 --> 00:32:50,020 Deci, un 1 ^ 0 este de gând să-mi dea un ce? Un unul. 484 00:32:50,020 --> 00:32:58,430 'A' ^ Ox20 este de gând să-mi dea? Minuscule o. 485 00:32:58,430 --> 00:33:04,010 'O' ^ Ox20 este de gând să-mi dea? Capital A. 486 00:33:04,010 --> 00:33:09,310 Pentru că indiferent de acest lucru este de a face, acest XORing cu Ox20 487 00:33:09,310 --> 00:33:15,380 este flipping în mod eficient, indiferent de acest bit este. 488 00:33:15,380 --> 00:33:21,240 În cazul în care acest lucru este un 0, este acum va deveni un 1. 489 00:33:21,240 --> 00:33:26,160 Deoarece acesta este un 1, 1 ^ 1 este 0. 490 00:33:26,160 --> 00:33:33,280 Deci noastre "o" a devenit "A", și a noastră "A" a devenit "o". 491 00:33:33,280 --> 00:33:36,910 Deci, XOR este un mod foarte convenabil de doar flipping cazului. 492 00:33:36,910 --> 00:33:39,960 Doar doriți să itera peste un șir de scrisori 493 00:33:39,960 --> 00:33:44,330 și un supleant în cazul de fiecare caracter, 494 00:33:44,330 --> 00:33:50,680 tu doar XOR totul cu Ox20. 495 00:33:50,680 --> 00:33:55,220 >> Acum am plecat schimbare. Deviere la stânga este doar de gând să, practic, 496 00:33:55,220 --> 00:34:01,250 împinge toate numerele în, sau la stânga, și introduceți 0 în spatele lor. 497 00:34:01,250 --> 00:34:05,550 Deci, aici avem 00001101. 498 00:34:05,550 --> 00:34:08,560 Vom împinge 3 0 de pe partea dreaptă, 499 00:34:08,560 --> 00:34:13,580 și ne 01101000. 500 00:34:13,580 --> 00:34:16,380 În termeni nonbinary, 501 00:34:16,380 --> 00:34:24,699 vom vedea că este într-adevăr de-a face 13 stânga mutat cu 3, ceea ce ne dă 104. 502 00:34:24,699 --> 00:34:32,530 Schimbare atât de stânga, vedem aici, x << y este de fapt x * 2 ^ y. 503 00:34:32,530 --> 00:34:40,139 13 * 2 ^ 3, 2 ^ 3 este 8, deci 13 * 8 este 104. 504 00:34:40,139 --> 00:34:45,679 Dacă te gândești doar despre binar, în general, modul în care fiecare cifră, 505 00:34:45,679 --> 00:34:49,530 dacă pornim de la dreapta, acesta este locul 1, atunci locul 2, atunci locul 4 este. 506 00:34:49,530 --> 00:34:51,330 Deci, prin împingerea în 0 de pe partea dreaptă, 507 00:34:51,330 --> 00:34:55,080 suntem doar împingând lucrurile care erau în loc 4 la loc de 8, 508 00:34:55,080 --> 00:34:57,920 și lucruri care au fost, în loc 8 la loc de 16. 509 00:34:57,920 --> 00:35:01,280 Fiecare schimbare doar înmulțește cu 2. Da? 510 00:35:01,280 --> 00:35:05,210 [Student] Ce se întâmplă dacă ai mutat de 5? 511 00:35:05,210 --> 00:35:10,790 [Bowden] Dacă ați mutat de 5 v-ar pierde doar cifre. 512 00:35:10,790 --> 00:35:15,410 În mod inevitabil, e același lucru. Cum ar fi, întregi sunt doar 32 de biți, 513 00:35:15,410 --> 00:35:20,750 așa că, dacă adăugați două numere întregi într-adevăr mari, pur si simplu nu se încadrează într-un întreg. 514 00:35:20,750 --> 00:35:23,660 Deci, e același lucru aici. Dacă ați mutat de 5, 515 00:35:23,660 --> 00:35:25,650 ne-ar pierde doar că unul. 516 00:35:25,650 --> 00:35:28,820 Și asta e un fel de ceea ce vreau să spun de "aproximativ" 517 00:35:28,820 --> 00:35:37,470 în cazul în care dacă ai schimba prea mult, pierzi biți. 518 00:35:37,470 --> 00:35:39,830 >> Deplasare la dreapta va fi opusul, 519 00:35:39,830 --> 00:35:43,090 unde am de gând să bage 0 de pe la sfârșitul, 520 00:35:43,090 --> 00:35:48,400 și pentru scopurile noastre, completați 0 de pe partea stângă. 521 00:35:48,400 --> 00:35:52,910 Deci, a face acest lucru, suntem practic de mers înapoi ceea ce am făcut deja. 522 00:35:52,910 --> 00:35:57,780 Și vom vedea că cele trei 0 e pe dreapta tocmai au căzut, 523 00:35:57,780 --> 00:36:02,020 și ne-au împins 1101 tot drumul spre dreapta. 524 00:36:02,020 --> 00:36:08,380 Aceasta face 104 >> 3, care este, în mod eficient, x / 2 ^ y. 525 00:36:08,380 --> 00:36:11,200 Deci, acum, aici, este o idee similară. 526 00:36:11,200 --> 00:36:18,720 De ce este doar aproximativ x / 2 ^ y, și nu de fapt x / 2 ^ y? 527 00:36:18,720 --> 00:36:22,240 Pentru că dacă aș fi mutat de 4, mi-ar fi pierdut un 1. 528 00:36:22,240 --> 00:36:25,950 Practic, ce crezi despre, cred că doar de diviziune întreg în general. 529 00:36:25,950 --> 00:36:31,070 Deci, cum ar fi 5/2 este 2. Nu e 2,5. 530 00:36:31,070 --> 00:36:35,000 Este aceeași idee aici. Când ne-am împărți cu 2, 531 00:36:35,000 --> 00:36:39,910 putem pierde biți ciudate de-a lungul drum. 532 00:36:39,910 --> 00:36:43,870 Deci, acum - asta e de la nivel de bit. Asta e tot ce trebuie să știi. 533 00:36:43,870 --> 00:36:46,340 Amintiți-vă de cazuri de utilizare le-am văzut în clasă, 534 00:36:46,340 --> 00:36:49,340 cum ar fi o mască de biți este util pentru operatori la nivel de bit, 535 00:36:49,340 --> 00:36:53,220 sau de a le utiliza pentru măști de biți. 536 00:36:53,220 --> 00:36:58,620 Majuscule și litere mici, conversii este un exemplu destul de prototip. 537 00:36:58,620 --> 00:37:01,640 >> Ok, deci buffer overflow atacuri. 538 00:37:01,640 --> 00:37:05,110 Oricine amintesc ce era în neregulă cu această funcție? 539 00:37:05,110 --> 00:37:10,140 Observați am declarat o serie de 12 bytes, 12 caractere, 540 00:37:10,140 --> 00:37:18,510 și apoi ne-am copia în tampon noastră a 12 caractere intregul bar șir. 541 00:37:18,510 --> 00:37:25,080 Deci, care e problema aici? 542 00:37:25,080 --> 00:37:32,270 Numărul magic de 12 ar trebui să pop destul de mult imediat ca - de ce 12? 543 00:37:32,270 --> 00:37:35,050 Ce se întâmplă dacă bara se întâmplă să fie mai mult de 12 de caractere? 544 00:37:35,050 --> 00:37:41,200 Ce se întâmplă dacă bara este milioane de caractere? 545 00:37:41,200 --> 00:37:46,010 Aici problema este memcpy. În cazul în care bara este suficient de lung, 546 00:37:46,010 --> 00:37:50,330 se va doar complet - "c", "c" nu-i pasă că a fost doar de 12 caractere; 547 00:37:50,330 --> 00:37:53,280 "C" nu-i pasă că nu se poate potrivi că multe bytes. 548 00:37:53,280 --> 00:37:58,250 Acesta va suprascrie doar complet char, de 12 bytes care le-am alocat pentru aceasta, 549 00:37:58,250 --> 00:38:01,830 și tot trecut-o în memorie care nu aparțin de fapt că tampon 550 00:38:01,830 --> 00:38:06,520 cu orice bara șir este. 551 00:38:06,520 --> 00:38:09,780 Deci asta a fost imaginea am văzut în clasă 552 00:38:09,780 --> 00:38:12,220 unde ne-am stiva noastră de creștere. 553 00:38:12,220 --> 00:38:16,040 Tu ar trebui să fie utilizate pentru aceste imagini sau sa se familiarizeze cu ei din nou. 554 00:38:16,040 --> 00:38:21,260 Ne-am stivă nostru de creștere, adrese de memorie încep de la 0 la partea de sus 555 00:38:21,260 --> 00:38:26,270 și să crească până la ca 4 miliarde în partea de jos. 556 00:38:26,270 --> 00:38:28,820 Avem array 'c' nostru undeva în memorie, 557 00:38:28,820 --> 00:38:32,260 apoi ne-am pointer nostru de a bloca chiar sub ea, 558 00:38:32,260 --> 00:38:38,720 și apoi ne-am acest indicator cadru salvate în adresa noastră de întoarcere și stack-ul de rutina nostru părinte. 559 00:38:38,720 --> 00:38:40,800 Amintiți-vă ce adresa expeditorului este? 560 00:38:40,800 --> 00:38:45,360 Este atunci când principal numește o foo funcție, solicită un bar funcție, 561 00:38:45,360 --> 00:38:48,100 în mod inevitabil, bar întoarce. 562 00:38:48,100 --> 00:38:52,610 Deci, atunci când se întoarce de bare, ei trebuie să știe că se va întoarce la foo pe care a numit-o. 563 00:38:52,610 --> 00:39:01,360 Deci, adresa expeditorului este adresa de funcția pe care trebuie să se întoarcă la atunci când se întoarce de funcții. 564 00:39:01,360 --> 00:39:05,830 Motivul pentru care este important pentru atacuri buffer overflow se datorează faptului că, în mod convenabil, 565 00:39:05,830 --> 00:39:09,580 hackeri dori să schimbe adresa de retur. 566 00:39:09,580 --> 00:39:14,950 În loc de a merge înapoi la foo, am de gând să se întoarcă la oriunde hacker vrea să mă întorc la. 567 00:39:14,950 --> 00:39:17,760 Și, în mod convenabil, în cazul în care hacker vrea frecvent pentru a reveni la 568 00:39:17,760 --> 00:39:22,400 este începutul tamponului pe care o avea inițial. 569 00:39:22,400 --> 00:39:26,170 Deci observa, din nou, Little Indian. 570 00:39:26,170 --> 00:39:28,490 Aparatul este un exemplu de sistem Micul indian, 571 00:39:28,490 --> 00:39:34,140 astfel încât un număr întreg sau un pointer este stocată cu bytes inversate. 572 00:39:34,140 --> 00:39:38,980 Deci, aici vom vedea - este aceasta? Da. 573 00:39:38,980 --> 00:39:45,660 Vedem Ox80, OxC0, Ox35, OxO8. 574 00:39:45,660 --> 00:39:48,250 Amintiți-vă de cifre hexazecimale? 575 00:39:48,250 --> 00:39:50,640 Noi nu inversa cifre hexazecimale în Little Indian, 576 00:39:50,640 --> 00:39:56,110 deoarece 2 cifre hexazecimale alcătuiesc un singur octet, iar noi inversa bytes. 577 00:39:56,110 --> 00:40:00,300 De aceea noi nu se păstra, cum ar fi, 80530CO8. 578 00:40:00,300 --> 00:40:07,520 Noi stoca, în schimb, fiecare pereche de 2 cifre, începând de la dreapta. 579 00:40:07,520 --> 00:40:10,880 Această adresă se referă la adresa de început 580 00:40:10,880 --> 00:40:15,190 de tampon noastre, care de fapt ne-am dorit pentru a copia în în primul rând. 581 00:40:15,190 --> 00:40:19,230 Motivul pentru care este util este că, ceea ce în cazul în care atacatorul 582 00:40:19,230 --> 00:40:24,100 sa întâmplat, în loc de a avea un șir care a fost doar 583 00:40:24,100 --> 00:40:27,060 un șir de inofensiv cum ar fi, numele lor sau ceva, 584 00:40:27,060 --> 00:40:33,900 ceea ce în cazul în care, în schimb, că șir au fost doar câteva cod arbitrar 585 00:40:33,900 --> 00:40:38,610 care a făcut tot ce au vrut să facă? 586 00:40:38,610 --> 00:40:45,630 Astfel încât acestea ar putea - Nu mă pot gândi la orice cod rece. 587 00:40:45,630 --> 00:40:47,780 Ar putea fi orice, totuși. Orice cod dezastruos. 588 00:40:47,780 --> 00:40:51,440 Dacă ar fi vrut, ei ar putea face ceva la defecte segmente, dar că ar fi inutil. 589 00:40:51,440 --> 00:40:54,950 Ei au, de obicei, o fac pentru a hack sistemul dumneavoastră. 590 00:40:54,950 --> 00:40:59,930 >> Bine. Bibliotecă CS50. 591 00:40:59,930 --> 00:41:04,800 Acest lucru este, în principiu, getint, getString, toate aceste funcții am oferit pentru tine. 592 00:41:04,800 --> 00:41:10,630 Deci avem char * string, și că este de captare pe care le-a suflat departe 593 00:41:10,630 --> 00:41:12,450 la un moment dat în timpul semestrului. 594 00:41:12,450 --> 00:41:18,220 Amintiți-vă că un șir este doar o serie de caractere. 595 00:41:18,220 --> 00:41:23,240 Deci, aici vom vedea o versiune prescurtată a getString. 596 00:41:23,240 --> 00:41:25,920 Tu ar trebui să se uite înapoi la el să-și amintească cum este pusă în aplicare de fapt. 597 00:41:25,920 --> 00:41:30,950 Detalii cheie sunt, observa ajungem într-un singur caracter la un moment dat 598 00:41:30,950 --> 00:41:34,570 de la standard, care este la fel ca noi tastarea la tastatura. 599 00:41:34,570 --> 00:41:37,890 Deci, un singur caracter la un moment dat, și dacă vom obține prea multe caractere, 600 00:41:37,890 --> 00:41:40,580 așa că, dacă n + 1 este mai mare decât capacitatea, 601 00:41:40,580 --> 00:41:44,140 atunci avem nevoie pentru a crește capacitatea de tampon noastre. 602 00:41:44,140 --> 00:41:47,780 Deci, aici suntem dublarea dimensiunea de tampon noastre. 603 00:41:47,780 --> 00:41:51,840 Și că poate continua, vom introduce caracterul în tampon nostru 604 00:41:51,840 --> 00:41:56,220 până când vom primi o linie nouă sau sfârșitul de fișier sau orice altceva, 605 00:41:56,220 --> 00:41:59,380 caz în care, am terminat cu șirul și apoi getString reală 606 00:41:59,380 --> 00:42:05,120 micsoreaza memorie, cum ar fi dacă am alocat prea multă memorie va merge înapoi și a reduce un pic. 607 00:42:05,120 --> 00:42:08,830 Așa că nu arată că, dar ideea principală este 608 00:42:08,830 --> 00:42:11,960 trebuie să citească într-un singur caracter la un moment dat. 609 00:42:11,960 --> 00:42:17,140 Nu se poate doar citi într-un lucru întreg dintr-o dată, 610 00:42:17,140 --> 00:42:19,550 deoarece tampon lor este doar de o anumită dimensiune. 611 00:42:19,550 --> 00:42:26,590 Deci, dacă șirul care se încearcă pentru a insera în tampon este prea mare, atunci s-ar îneca. 612 00:42:26,590 --> 00:42:28,940 Deci, aici vom preveni ca citind doar într-un singur caracter 613 00:42:28,940 --> 00:42:33,750 la un moment dat și în creștere, ori de câte ori avem nevoie. 614 00:42:33,750 --> 00:42:40,270 Astfel getint și celelalte funcții de bibliotecă CS50 tendința de a folosi getString 615 00:42:40,270 --> 00:42:42,310 în implementări lor. 616 00:42:42,310 --> 00:42:45,370 Așa că am subliniat cele mai importante lucruri aici. 617 00:42:45,370 --> 00:42:49,460 Acesta solicită getString pentru a obține un șir de caractere. 618 00:42:49,460 --> 00:42:51,710 Dacă getString nu a reușit să se întoarcă de memorie, 619 00:42:51,710 --> 00:42:54,270 amintiți-vă că getString mallocs ceva, așa că ori de câte ori te sun getString 620 00:42:54,270 --> 00:42:57,820 tu nu ar trebui să (neinteligibil) elibera că șir pe care le ai. 621 00:42:57,820 --> 00:43:02,870 Deci, aici, în cazul în care acesta nu a reușit să malloc ceva, ne-am întoarce INT_MAX ca doar un steag care, 622 00:43:02,870 --> 00:43:05,650 hei, nu am fost de fapt, posibilitatea de a obține un număr întreg. 623 00:43:05,650 --> 00:43:10,830 Ar trebui să ignore ceea ce mă voi întoarce la tine, sau 624 00:43:10,830 --> 00:43:15,540 tu nu ar trebui să trateze acest lucru ca pe o intrare validă. 625 00:43:15,540 --> 00:43:21,360 În cele din urmă, presupunând că a reușit, vom folosi sscanf cu steagul special, 626 00:43:21,360 --> 00:43:23,820 ceea ce înseamnă, în primul rând se potrivi un număr întreg, 627 00:43:23,820 --> 00:43:26,770 apoi a se potrivi orice caractere, după care întreg. 628 00:43:26,770 --> 00:43:29,070 Așa observa vrem să egaleze 1. 629 00:43:29,070 --> 00:43:32,940 Se întoarce atât de sscanf cât de multe meciuri în cazul în care a făcut cu succes? 630 00:43:32,940 --> 00:43:37,010 Acesta va reveni 1 în cazul în care se potriveste cu succes un număr întreg, 631 00:43:37,010 --> 00:43:40,890 se va întoarce 0 dacă nu se potrivesc un întreg, și se va reveni 2 632 00:43:40,890 --> 00:43:45,920 în cazul în care corespund unui număr întreg, urmată de unele caractere. 633 00:43:45,920 --> 00:43:49,780 Deci, ne-am observa încercați din nou în cazul în care ne-am potrivi nimic, dar 1. 634 00:43:49,780 --> 00:43:55,230 Deci, dacă am introdus 1, 2, 3, C, sau 1, 2, 3, X, 635 00:43:55,230 --> 00:43:57,400 apoi 1, 2, 3 ar primi stocate în numărul întreg, 636 00:43:57,400 --> 00:43:59,620 X-ar primi stocate la caracterul, 637 00:43:59,620 --> 00:44:06,410 sscanf va întoarce 2, și ne-ar încerca din nou, pentru că ne dorim doar un întreg. 638 00:44:06,410 --> 00:44:09,810 >> Suflare rapid prin HTML, HTTP, CSS. 639 00:44:09,810 --> 00:44:15,340 Hypertext Markup Language este structura și semantica de web. 640 00:44:15,340 --> 00:44:19,960 Aici este un exemplu de curs unde avem tag-uri HTML. 641 00:44:19,960 --> 00:44:22,110 Avem tag-uri cap, tag-uri de corp, 642 00:44:22,110 --> 00:44:27,770 Avem exemple de tag-uri goale, unde de fapt nu au un început și aproape tag-ul, 643 00:44:27,770 --> 00:44:30,820 am doar link-ul si imaginea. 644 00:44:30,820 --> 00:44:38,480 Nu există nici o etichetă imagine închidere, există doar o singură etichetă care realizează tot ceea ce tag-ul trebuie să facă. 645 00:44:38,480 --> 00:44:41,950 Link-ul este un exemplu, vom vedea cum vă legați la CSS, 646 00:44:41,950 --> 00:44:45,910 script-ul este un exemplu de modul în care se leagă de un JavaScript extern. 647 00:44:45,910 --> 00:44:53,100 Este destul de simplu, și amintiți-vă, HTML nu este un limbaj de programare. 648 00:44:53,100 --> 00:44:58,250 Aici, amintiți-vă cum ar defini o formă sau cel puțin ceea ce ar face? 649 00:44:58,250 --> 00:45:01,740 O astfel de formă are o acțiune și o metodă. 650 00:45:01,740 --> 00:45:06,210 Metodele pe care le vor vedea doar vreodată sunt GET și POST. 651 00:45:06,210 --> 00:45:09,040 Asa ca este varianta în care lucru este pus în URL-ul. 652 00:45:09,040 --> 00:45:11,680 POST este în cazul în care nu se pune în URL-ul. 653 00:45:11,680 --> 00:45:18,520 În schimb, toate datele din formularul se introduce mai mult ascuns în cererea HTTP. 654 00:45:18,520 --> 00:45:22,390 Deci, aici, acțiune definește în cazul în care cererea HTTP merge. 655 00:45:22,390 --> 00:45:27,490 În cazul în care se merge este google.com / search. 656 00:45:27,490 --> 00:45:32,890 Metodă. Amintiți-vă de diferențele dintre GET și POST, 657 00:45:32,890 --> 00:45:37,200 și, spun doar ca un exemplu, dacă doriți să marcaj ceva. 658 00:45:37,200 --> 00:45:40,660 Tu nu va fi capabil să marcați un URL POST 659 00:45:40,660 --> 00:45:44,970 deoarece datele nu sunt incluse în URL. 660 00:45:44,970 --> 00:45:49,790 >> HTTP, acum, este Hypertext Transfer Protocol. 661 00:45:49,790 --> 00:45:54,080 Hypertext Transfer Protocol, v-ați aștepta să transfere 662 00:45:54,080 --> 00:45:57,710 Hypertext Markup Language, și-l face. 663 00:45:57,710 --> 00:46:00,170 Dar se transferă, de asemenea, toate imaginile pe care le găsiți pe Web, 664 00:46:00,170 --> 00:46:05,400 orice descărcări pe care le face începe ca o cerere HTTP. 665 00:46:05,400 --> 00:46:10,350 Deci, HTTP este doar limbajul de World Wide Web. 666 00:46:10,350 --> 00:46:15,610 Și aici trebuie să recunoască acest fel de o cerere HTTP. 667 00:46:15,610 --> 00:46:19,300 Aici HTTP/1.1 pe partea spune doar că e versiunea 668 00:46:19,300 --> 00:46:21,570 protocolului Sunt folosind. 669 00:46:21,570 --> 00:46:25,770 Este destul de mult întotdeauna o să fie HTTP/1.1, după cum veți vedea. 670 00:46:25,770 --> 00:46:30,110 Apoi, vom vedea că acest lucru a fost GET, alternativa fiind POST, care s-ar putea vedea. 671 00:46:30,110 --> 00:46:40,790 Și URL-ul pe care am încercat să viziteze fost www.google.com/search?q = bla, bla, bla. 672 00:46:40,790 --> 00:46:44,240 Deci, amintiți-vă că acest lucru, semn de întrebare q = bla bla bla, 673 00:46:44,240 --> 00:46:49,040 este genul de lucruri care se depune de către un formular. 674 00:46:49,040 --> 00:46:51,830 Răspunsul s-ar putea întoarce la mine ar arata ceva de genul asta. 675 00:46:51,830 --> 00:46:54,050 Din nou, începând cu protocolul, care va fi că, 676 00:46:54,050 --> 00:46:59,190 urmat de codul de stare. Aici e 200 OK. 677 00:46:59,190 --> 00:47:05,060 Și, în final, va fi urmat pagina web pe care l-am întrebat de fapt pentru. 678 00:47:05,060 --> 00:47:08,210 Posibil codul de stare s-ar putea vedea, și tu ar trebui să știi mai multe dintre ele. 679 00:47:08,210 --> 00:47:12,770 200 Bine ați văzut, probabil, înainte de. 680 00:47:12,770 --> 00:47:17,830 403 Interzis, 404 Nu a fost găsit, Error 500 Internal Server 681 00:47:17,830 --> 00:47:22,140 este, de obicei, dacă te duci la un site web și ceva este rupt sau accidente de cod PHP, 682 00:47:22,140 --> 00:47:24,930 în timp ce în aparatul avem acea cutie portocalie mare 683 00:47:24,930 --> 00:47:27,830 care vine și spune, ca, ceva este în neregulă, acest cod nu funcționează 684 00:47:27,830 --> 00:47:30,380 sau această funcție lui rău. 685 00:47:30,380 --> 00:47:33,230 De obicei, site-uri nu vreau ca tu să știi ce funcții sunt de fapt rău, 686 00:47:33,230 --> 00:47:37,880 Deci, in loc sa-ti dea doar 500 de erori de server intern. 687 00:47:37,880 --> 00:47:43,050 >> TCP / IP este un strat de sub HTTP. 688 00:47:43,050 --> 00:47:47,550 Amintiți-vă că există Internet în afara de World Wide Web. 689 00:47:47,550 --> 00:47:52,270 Ca și în cazul în care joci un joc online, care nu trece prin HTTP, 690 00:47:52,270 --> 00:47:55,740 se trece printr-o diferit - este încă prin intermediul internetului, 691 00:47:55,740 --> 00:47:58,900 dar nu utilizează HTTP. 692 00:47:58,900 --> 00:48:02,470 HTTP este doar un exemplu de protocol construit pe TCP / IP. 693 00:48:02,470 --> 00:48:07,820 IP înseamnă, literal, Internet Protocol. 694 00:48:07,820 --> 00:48:11,500 Fiecare calculator are o adresă IP, care sunt acele lucruri de 4 cifre 695 00:48:11,500 --> 00:48:16,510 cum ar fi 192.168.2.1, sau orice altceva, care tinde să fie una locală. 696 00:48:16,510 --> 00:48:23,390 Dar că este modelul de o adresă IP. 697 00:48:23,390 --> 00:48:29,060 Deci DNS, Domain Name Service, 698 00:48:29,060 --> 00:48:33,410 asta e ceea ce se traduce lucruri, cum ar fi google.com la o adresă IP reală. 699 00:48:33,410 --> 00:48:37,700 Deci, dacă tastați adresa IP într-o adresă URL, 700 00:48:37,700 --> 00:48:40,850 care le-ar aduce la Google, dar ai tendinta de a nu amintesc aceste lucruri. 701 00:48:40,850 --> 00:48:45,470 Aveți tendința să-și amintească google.com loc. 702 00:48:45,470 --> 00:48:51,560 Ultimul lucru pe care îl avem este de porturi, în cazul în care aceasta este parte a TCP IP. 703 00:48:51,560 --> 00:48:54,880 TCP face mai mult. Gândiți-vă, cum ar fi, ai rulează browser-ului tău. 704 00:48:54,880 --> 00:48:58,670 Poate ai ceva de funcționare aplicație de e-mail; 705 00:48:58,670 --> 00:49:02,150 poate ai un alt program care utilizează funcționare Internet. 706 00:49:02,150 --> 00:49:05,090 Toate acestea au nevoie de acces la Internet, 707 00:49:05,090 --> 00:49:08,100 dar computerul are doar un card de WiFi sau orice altceva. 708 00:49:08,100 --> 00:49:10,780 Deci, porturile sunt modul în care suntem capabili să ne despărțim 709 00:49:10,780 --> 00:49:13,550 modul în care aceste aplicații sunt capabili de a utiliza internetul. 710 00:49:13,550 --> 00:49:17,230 Fiecare cerere primește un anumit port pe care se poate asculta pe, 711 00:49:17,230 --> 00:49:19,670 și în mod implicit, HTTP foloseste portul 80. 712 00:49:19,670 --> 00:49:22,410 Unele servicii de e-mail utilizează 25. 713 00:49:22,410 --> 00:49:24,490 Cele cu numere mici tind să fie rezervate. 714 00:49:24,490 --> 00:49:29,270 Vă sunt, de obicei posibilitatea de a obține cele cu numere mai mari pentru tine. 715 00:49:29,270 --> 00:49:32,010 >> CSS, Cascading Style Sheets. 716 00:49:32,010 --> 00:49:36,030 Pagini web noi de stil cu CSS, nu cu HTML. 717 00:49:36,030 --> 00:49:38,440 Există 3 locuri puteți pune CSS-ul. 718 00:49:38,440 --> 00:49:46,300 Acesta poate fi în linie, între tag-uri de stil, sau într-un fișier complet separate și apoi legat inch 719 00:49:46,300 --> 00:49:48,470 Și aici este doar un exemplu de CSS. 720 00:49:48,470 --> 00:49:50,450 Tu ar trebui să recunoască acest model, 721 00:49:50,450 --> 00:49:54,310 în cazul în care primul exemplu este suntem de potrivire tag-ul body, 722 00:49:54,310 --> 00:49:56,680 și aici suntem de centrare tag-ul body. 723 00:49:56,680 --> 00:50:00,420 Al doilea exemplu, suntem de potrivire lucru 724 00:50:00,420 --> 00:50:04,740 cu subsol ID-ul, și avem aplicarea unor stiluri de asta. 725 00:50:04,740 --> 00:50:07,310 Observați că ID-ul de subsol de text-aliniază la stânga, 726 00:50:07,310 --> 00:50:09,840 în timp ce corpul de text-aliniază centru. 727 00:50:09,840 --> 00:50:13,180 Subsol se află în interiorul corpului. 728 00:50:13,180 --> 00:50:16,470 Acesta va fi, în schimb, text-align stânga, chiar dacă trupul spune centru de text-align. 729 00:50:16,470 --> 00:50:18,880 Aceasta este partea întreagă cascadă de ea. 730 00:50:18,880 --> 00:50:22,110 Puteți avea - puteți specifica stiluri de organism, 731 00:50:22,110 --> 00:50:25,320 și apoi lucruri în organism puteți specifica mai multe stiluri specifice, 732 00:50:25,320 --> 00:50:28,160 și lucrurile funcționează așa cum vă așteptați. 733 00:50:28,160 --> 00:50:34,420 Specificatori mai specifice CSS au prioritate. 734 00:50:34,420 --> 00:50:46,140 Cred că asta e tot. 735 00:50:46,140 --> 00:50:49,260 >> [Ali Nahm] Max toată lumea. Dacă aș putea obține doar atentia. 736 00:50:49,260 --> 00:50:53,990 Sunt Ali și am de gând să merg prin PHP și SQL foarte repede. 737 00:50:53,990 --> 00:51:00,310 Astfel încât să putem începe. PHP este scurt pentru PHP: Hypertext Preprocessor. 738 00:51:00,310 --> 00:51:03,730 Și, după cum toți ar trebui să știi, că este un limbaj de scripting server-side, 739 00:51:03,730 --> 00:51:06,800 și le folosim pentru capătul din spate de site-uri, 740 00:51:06,800 --> 00:51:12,540 și modul în care aceasta are o mulțime de calcule, partea din spatele camerei de filmat. 741 00:51:12,540 --> 00:51:17,510 Sintaxă. Nu e ca C, surpriză, surpriză. 742 00:51:17,510 --> 00:51:22,060 Ea are întotdeauna să înceapă cu, dacă puteți vedea, - eu nu pot merge mai departe. 743 00:51:22,060 --> 00:51:31,340 Puteți vedea ai nevoie de noi tipuri de bretele și apoi ai nevoie, de asemenea, php?. 744 00:51:31,340 --> 00:51:35,780 Asta e mereu cum trebuie pentru a încadra textul PHP, codul PHP. 745 00:51:35,780 --> 00:51:39,180 Deci, nu poate fi la fel ca C, în cazul în care un fel de pus pe prima. 746 00:51:39,180 --> 00:51:42,290 Trebuie să-l înconjoare întotdeauna. 747 00:51:42,290 --> 00:51:47,610 Și acum, sintaxa majoră este că toate variabilele trebuie să înceapă cu caracterul $. 748 00:51:47,610 --> 00:51:49,490 Ai nevoie de a face acest lucru atunci când sunteți le definirea, aveți nevoie pentru a face acest lucru 749 00:51:49,490 --> 00:51:51,860 atunci când te referi la a le mai târziu. 750 00:51:51,860 --> 00:51:56,510 Aveți nevoie întotdeauna că $. E cel mai bun prieten, destul de mult. 751 00:51:56,510 --> 00:52:01,690 Tu nu - spre deosebire de C, nu aveți nevoie pentru a pune ce fel de tip variabil este. 752 00:52:01,690 --> 00:52:04,940 Deci, în timp ce faci nevoie de $, nu aveți nevoie pentru a pune, cum ar fi, 753 00:52:04,940 --> 00:52:09,470 int x sau y șir, etcetera, etcetera. 754 00:52:09,470 --> 00:52:11,490 Deci, o mică diferență. 755 00:52:11,490 --> 00:52:15,590 Ca urmare a acestui fapt, aceasta înseamnă că PHP este un tip slab. 756 00:52:15,590 --> 00:52:19,310 PHP este un limbaj de tip slab, și le-a introdus variabile slab. 757 00:52:19,310 --> 00:52:24,020 Cu alte cuvinte, ceea ce înseamnă că puteți comuta între diferite tipuri de tipuri de variabile. 758 00:52:24,020 --> 00:52:27,230 Puteți stoca numărul de 1 ca un întreg, 759 00:52:27,230 --> 00:52:29,650 puteți să le stocați ca un șir, și puteți să le stocați ca un float, 760 00:52:29,650 --> 00:52:33,550 și va fi tot ceea ce numărul 1. 761 00:52:33,550 --> 00:52:36,080 Chiar dacă sunteți o stocarea în diferite forme, 762 00:52:36,080 --> 00:52:39,120 este încă - tipurile de variabile sunt încă deține în cele din urmă. 763 00:52:39,120 --> 00:52:41,540 Deci, dacă te uiți aici, dacă vă amintiți de la PSET 7, 764 00:52:41,540 --> 00:52:43,500 mulți dintre voi, probabil, au avut probleme cu aceasta. 765 00:52:43,500 --> 00:52:47,280 Două semne de șanse, 3 semne egale, 4 semne egale. 766 00:52:47,280 --> 00:52:49,990 Bine, nu există 4 semne egale, dar există 2 și 3. 767 00:52:49,990 --> 00:52:53,320 Puteți utiliza două semne de șanse pentru a verifica valorile. 768 00:52:53,320 --> 00:52:55,830 Se poate verifica pe tipuri. 769 00:52:55,830 --> 00:52:58,770 Deci, dacă vă puteți vedea de la primul exemplu, 770 00:52:58,770 --> 00:53:02,210 Am num_int num_string ==. 771 00:53:02,210 --> 00:53:06,710 Deci, int și șirul de sunt atât, punct de vedere tehnic, 1, 772 00:53:06,710 --> 00:53:10,790 dar acestea sunt diferite tipuri. Dar pentru două egali, se va trece încă. 773 00:53:10,790 --> 00:53:15,510 Cu toate acestea, pentru egali triple, se verifică valoarea precum și diferite tipuri. 774 00:53:15,510 --> 00:53:18,760 Asta înseamnă că nu va trece, în care al doilea caz aici, 775 00:53:18,760 --> 00:53:22,350 în cazul în care utilizați 3 semne egale în loc. 776 00:53:22,350 --> 00:53:26,590 Astfel că este o diferență majoră care ar trebui toți au demonstrat acum. 777 00:53:26,590 --> 00:53:31,570 >> String concatenare este un alt lucru puternic puteți folosi în PHP. 778 00:53:31,570 --> 00:53:34,080 Este practic doar această notație punct la îndemână, 779 00:53:34,080 --> 00:53:36,230 și că este modul în care puteți lega siruri de caractere impreuna. 780 00:53:36,230 --> 00:53:40,800 Deci, dacă aveți Cat și aveți Dog, și doriți să puneți cele 2 siruri de caractere împreună, 781 00:53:40,800 --> 00:53:44,080 puteți folosi perioada, si asta e un fel de modul în care funcționează. 782 00:53:44,080 --> 00:53:46,660 Puteți, de asemenea, doar puneți-le unul lângă altul, 783 00:53:46,660 --> 00:53:49,030 după cum puteți vedea aici, în exemplul de mai jos, 784 00:53:49,030 --> 00:53:51,610 unde am echo șir 1, șir spațiu 2. 785 00:53:51,610 --> 00:53:56,930 PHP va ști să le înlocuiască ca atare. 786 00:53:56,930 --> 00:53:59,780 Arrays. Acum, în PHP, există două tipuri diferite de matrice. 787 00:53:59,780 --> 00:54:03,180 Puteți avea matrice regulate, și puteți avea, de asemenea, tablouri asociative, 788 00:54:03,180 --> 00:54:06,040 și vom trece prin ele chiar acum. 789 00:54:06,040 --> 00:54:08,280 Matrice regulate sunt doar acest lucru în C, 790 00:54:08,280 --> 00:54:11,240 și deci va trebui indici care sunt numerotate. 791 00:54:11,240 --> 00:54:13,160 Chiar acum suntem doar de gând să creeze o și a pus - 792 00:54:13,160 --> 00:54:15,500 astfel încât acesta este modul în care putem crea un array gol, atunci vom 793 00:54:15,500 --> 00:54:17,310 pus în numărul de index 0. 794 00:54:17,310 --> 00:54:19,200 Vom pune la numărul 6, valoarea 6. 795 00:54:19,200 --> 00:54:21,500 Puteți să-l vedea în partea de jos de aici. 796 00:54:21,500 --> 00:54:24,240 Unde e - la numărul de index 1 vom pune valoare numărul 4, 797 00:54:24,240 --> 00:54:26,720 și astfel încât să puteți vedea acolo este un 6, există un 4, 798 00:54:26,720 --> 00:54:29,160 și apoi ca suntem imprimare lucruri, 799 00:54:29,160 --> 00:54:33,550 atunci când vom încerca să imprimați valoarea stocată la index număr 0, 800 00:54:33,550 --> 00:54:36,900 atunci vom vedea valoarea 6 fiind imprimate. Rece? 801 00:54:36,900 --> 00:54:40,160 Așa că e tablouri regulate pentru tine. 802 00:54:40,160 --> 00:54:42,750 Un alt mod puteți adăuga, de asemenea, lucruri de tablouri regulate acum 803 00:54:42,750 --> 00:54:44,780 este le puteți adăuga doar la sfârșitul anului. 804 00:54:44,780 --> 00:54:47,240 Asta înseamnă că nu trebuie să specifice indicele specific. 805 00:54:47,240 --> 00:54:51,000 Puteți vedea numărul, și apoi în parantezele pătrate nu exista nici index specificat. 806 00:54:51,000 --> 00:54:56,270 Și se va ști - PHP va ști să-l adăuga doar la sfârșitul listei, următorul loc liber. 807 00:54:56,270 --> 00:54:59,190 Deci, puteți vedea o chiar acolo, la acea 0 la fața locului, 808 00:54:59,190 --> 00:55:02,690 2 a fost chiar acolo, la primul loc. 809 00:55:02,690 --> 00:55:04,690 3 merge - se adaugă acolo, de asemenea. 810 00:55:04,690 --> 00:55:06,720 Astfel că un fel de sens. Esti doar constant l adaugand, 811 00:55:06,720 --> 00:55:09,360 și atunci când suntem ecou indicele de numărul 1, 812 00:55:09,360 --> 00:55:13,080 se va imprima valoarea 2. 813 00:55:13,080 --> 00:55:16,800 >> Apoi, avem tablouri, care sunt tablouri asociative. 814 00:55:16,800 --> 00:55:19,370 Tablouri asociative, în loc de a avea indici numerici, 815 00:55:19,370 --> 00:55:23,630 ceea ce fac ei este, ei au indici care sunt de șir. 816 00:55:23,630 --> 00:55:25,670 Puteți vedea, în loc de - Am scăpat de toate aceste indicii de numere, 817 00:55:25,670 --> 00:55:32,140 și acum e TAST1, KEY2, key3, și sunt în ghilimele pentru a semnifica faptul că acestea sunt toate siruri de caractere. 818 00:55:32,140 --> 00:55:34,470 Astfel încât să putem avea un exemplu în acest sens. 819 00:55:34,470 --> 00:55:38,790 Exemplu în acest sens este că avem TF, și care e numele index. 820 00:55:38,790 --> 00:55:42,030 Vom pune "Ali", ca nume, la pagina de index, de calorii consumate, 821 00:55:42,030 --> 00:55:47,640 putem pune un int data aceasta în loc de un șir de caractere, 822 00:55:47,640 --> 00:55:52,240 și apoi la place de index, se poate pune o serie intreaga in interiorul de ea. 823 00:55:52,240 --> 00:55:55,490 Deci, aceasta este un fel de - este un concept similar cu modul în care am avut 824 00:55:55,490 --> 00:55:58,930 indicii cu numere, dar acum putem schimba indicii în jurul 825 00:55:58,930 --> 00:56:03,890 pentru a le avea ca siruri de caractere în loc. 826 00:56:03,890 --> 00:56:06,070 Puteți face, de asemenea, acest lucru, în afară de doar o fac în mod individual, 827 00:56:06,070 --> 00:56:09,400 puteți face totul într-o singură bucată. Deci, puteți vedea că tf de matrice, 828 00:56:09,400 --> 00:56:13,350 și apoi ne-am stabilit-le pe toate într-un singur gigant set paranteză. 829 00:56:13,350 --> 00:56:15,220 Astfel că poate accelera lucrurile. 830 00:56:15,220 --> 00:56:19,730 Este mai mult de o alegere stilistic decât nu. 831 00:56:19,730 --> 00:56:21,550 Avem, de asemenea, bucle. 832 00:56:21,550 --> 00:56:26,020 In C avem bucle care funcționează ca aceasta. 833 00:56:26,020 --> 00:56:29,690 Am avut gama noastră, și ne-am dus la index 0 la sfârșitul listei, 834 00:56:29,690 --> 00:56:31,740 și ne-am tot imprima, corect? 835 00:56:31,740 --> 00:56:33,880 Cu excepția problema este, pentru tablouri asociative, 836 00:56:33,880 --> 00:56:36,610 nu știm neapărat aceste indici numerici 837 00:56:36,610 --> 00:56:39,610 pentru că acum avem indicii șir. 838 00:56:39,610 --> 00:56:44,800 Acum vom folosi bucle foreach, care, din nou, vă sperăm utilizate în PSET 7. 839 00:56:44,800 --> 00:56:48,930 Bucle foreach va ști doar fiecare parte a listei. 840 00:56:48,930 --> 00:56:52,450 Și nu trebuie să știe exact indicele numeric pe care le au. 841 00:56:52,450 --> 00:56:56,490 Astfel încât să aibă sintaxa foreach, asa ca este foreach, ai pus matrice. 842 00:56:56,490 --> 00:57:00,430 Deci, matrice mea se numește PSET, și apoi ca, cuvantul ca, 843 00:57:00,430 --> 00:57:04,530 și apoi ai pus această variabilă temporar local, pe care ai de gând să utilizeze 844 00:57:04,530 --> 00:57:10,690 doar pentru un lucru specific care se va ține specifice - 845 00:57:10,690 --> 00:57:14,770 o instanță sau o secțiune de matrice. 846 00:57:14,770 --> 00:57:18,350 PSET num va organiza o, și atunci poate că va deține numărul 6, 847 00:57:18,350 --> 00:57:20,410 și apoi se va organiza la numărul 2. 848 00:57:20,410 --> 00:57:26,630 Dar este garantat pentru a merge prin fiecare o singură valoare care este în matrice. 849 00:57:26,630 --> 00:57:30,530 Funcții utile pe care ar trebui să știți în PHP sunt necesita, 850 00:57:30,530 --> 00:57:35,880 astfel încât face-vă că, inclusiv anumite fișiere, ecou, ​​ieșire, gol. 851 00:57:35,880 --> 00:57:40,490 Am foarte recomandăm să te uiți la PSET 7 si uita-te la aceste funcții. 852 00:57:40,490 --> 00:57:42,810 S-ar putea să știi cele, 853 00:57:42,810 --> 00:57:47,060 așa că mi-ar sti cu siguranta ce, exact, cei care fac toate. 854 00:57:47,060 --> 00:57:50,080 >> Și acum vom trece prin domeniul de aplicare foarte repede. 855 00:57:50,080 --> 00:57:53,490 În domeniul de aplicare, PHP este un fel de un lucru de funky, spre deosebire de C, 856 00:57:53,490 --> 00:57:56,170 și așa suntem doar de gând să trec prin ea repede. 857 00:57:56,170 --> 00:57:58,930 Așa că haideți să spunem că încep de la săgeata pe care le avem acolo. 858 00:57:58,930 --> 00:58:02,900 Și vom începe cu $ i. Deci, variabila "i" va fi 0, 859 00:58:02,900 --> 00:58:06,730 și noi suntem doar de gând să păstreze de imprimare-l în cutia alb mare acolo. 860 00:58:06,730 --> 00:58:09,220 Vom începe cu I0, iar apoi vom merge să-l ecou. 861 00:58:09,220 --> 00:58:12,670 Deci nu e zero. 862 00:58:12,670 --> 00:58:15,210 Și apoi vom ea incrementa de bucla pentru, 863 00:58:15,210 --> 00:58:17,810 și apoi va fi o valoare de 1. 864 00:58:17,810 --> 00:58:20,070 Una dintre ele este mai mică de 3, asa ca va trece prin asta pentru bucla, 865 00:58:20,070 --> 00:58:23,230 și apoi vom vedea imprimată din nou. 866 00:58:23,230 --> 00:58:25,520 Mergem să-l incrementa din nou la 2, 867 00:58:25,520 --> 00:58:29,860 și 2 este mai mic de 3, asa ca va trece de buclă, și va imprima 2. 868 00:58:29,860 --> 00:58:35,100 Apoi, veți rețineți că 3 nu este mai mic de 3, asa ca vom iesi din bucla for. 869 00:58:35,100 --> 00:58:40,050 Deci, acum am ieșit, iar apoi vom merge în aFunction. 870 00:58:40,050 --> 00:58:45,010 Bine. Deci, va trebui să rețineți că această variabilă pe care le-am creat, 871 00:58:45,010 --> 00:58:48,270 "i" variabila, nu se scoped la nivel local. 872 00:58:48,270 --> 00:58:50,280 Asta înseamnă că nu este la bucla locală, 873 00:58:50,280 --> 00:58:58,060 și că variabile putem accesa în continuare și de a schimba după aceea, și ea va fi încă în vigoare. 874 00:58:58,060 --> 00:59:02,160 Deci, dacă te duci în funcția de acum, veți vedea că vom folosi, de asemenea, "i" variabila, 875 00:59:02,160 --> 00:59:05,320 și vom incrementa "i" + +. 876 00:59:05,320 --> 00:59:09,410 V-ar crede, la prima, bazat pe C, că este o copie a "i" variabila. 877 00:59:09,410 --> 00:59:12,830 Este un lucru total diferit, ceea ce este corect. 878 00:59:12,830 --> 00:59:16,560 Așa că atunci când ne-am imprima, vom imprima 'i' + +, care se va imprima că 4, 879 00:59:16,560 --> 00:59:19,640 și apoi vom - îmi pare rău. 880 00:59:19,640 --> 00:59:22,030 Apoi, vom pune capăt din această funcție, 881 00:59:22,030 --> 00:59:24,820 și vom fi în cazul în care săgeata este chiar acum. 882 00:59:24,820 --> 00:59:29,190 Asta înseamnă că, atunci, cu toate acestea, deși această funcție modificat valoarea "i", 883 00:59:29,190 --> 00:59:32,620 ea nu a schimbat în afara funcției, 884 00:59:32,620 --> 00:59:35,060 pentru că funcția are un domeniu de aplicare separat. 885 00:59:35,060 --> 00:59:38,960 Asta înseamnă că, atunci când ne echo "i", nu s-au schimbat în domeniul funcției, 886 00:59:38,960 --> 00:59:43,660 și așa apoi vom imprima 3 din nou. 887 00:59:43,660 --> 00:59:47,520 Diferite lucruri despre domeniul de aplicare în PHP decât în ​​C. 888 00:59:47,520 --> 00:59:51,130 >> Acum, în PHP și HTML. 889 00:59:51,130 --> 00:59:53,510 PHP este folosit pentru a face pagini web dinamice. 890 00:59:53,510 --> 00:59:58,660 Este un fel de face lucrurile diferit. 891 00:59:58,660 --> 01:00:02,090 Avem diferit de HTML. 892 01:00:02,090 --> 01:00:05,230 Cu HTML, noi întotdeauna trebuie doar același lucru static, ca și cum Rob a arătat, 893 01:00:05,230 --> 01:00:09,370 în timp ce PHP, poți schimba lucrurile în funcție de cine este utilizatorul. 894 01:00:09,370 --> 01:00:11,830 Deci, dacă am avea acest lucru, am, "Sunteți autentificat ca -" și apoi numele, 895 01:00:11,830 --> 01:00:14,420 și eu pot schimba numele. Deci, chiar acum numele este Joseph, 896 01:00:14,420 --> 01:00:18,880 și are "despre mine", dar apoi m-am pot schimba, de asemenea, numele a avea Tommy. 897 01:00:18,880 --> 01:00:21,700 Și că ar fi un lucru diferit. 898 01:00:21,700 --> 01:00:23,840 Deci putem schimba, de asemenea, lucruri diferite despre el, 899 01:00:23,840 --> 01:00:27,070 și se va afișa conținut diferit pe baza numelui. 900 01:00:27,070 --> 01:00:31,430 Deci, PHP poate un fel de a schimba ceea ce se întâmplă pe site-ul dvs.. 901 01:00:31,430 --> 01:00:33,540 La fel aici. Totuși, rețineți că acestea au un conținut diferit, 902 01:00:33,540 --> 01:00:38,870 chiar dacă sunt punct de vedere tehnic încă accesează aceeași pagină web de pe suprafata. 903 01:00:38,870 --> 01:00:43,450 Generarea HTML. Există două moduri diferite pe care le puteți face acest lucru. 904 01:00:43,450 --> 01:00:48,980 Asa ca vom trece prin asta chiar acum. Primul mod este, ai - Da, îmi pare rău. 905 01:00:48,980 --> 01:00:51,150 Deci, va trebui doar regulat pentru buclă în PHP, 906 01:00:51,150 --> 01:00:56,270 și apoi vă ecou în PHP și ecou în HTML. 907 01:00:56,270 --> 01:00:58,720 Folosind ceea ce ai aratat Rob de script HTML 908 01:00:58,720 --> 01:01:04,030 și apoi utilizarea de imprimare PHP pentru a imprima doar pentru a paginii web. 909 01:01:04,030 --> 01:01:09,520 Modul de alternativă este de a face acest lucru ca și cum ai separa PHP și HTML. 910 01:01:09,520 --> 01:01:11,940 Astfel încât să puteți avea o linie de PHP, care începe pentru buclă, 911 01:01:11,940 --> 01:01:16,020 atunci puteți avea linia de HTML într-un lucru separat, 912 01:01:16,020 --> 01:01:19,700 și apoi închideți bucla, din nou, cu un PHP. 913 01:01:19,700 --> 01:01:21,800 Deci, e un fel de-l separarea. 914 01:01:21,800 --> 01:01:24,020 Pe partea stanga, puteți că aveți toate - 915 01:01:24,020 --> 01:01:26,360 e doar o bucată de PHP. 916 01:01:26,360 --> 01:01:28,510 Pe partea dreaptă, puteți vedea că aveți o linie de PHP, 917 01:01:28,510 --> 01:01:32,540 aveți o linie de HTML, si ai din nou o linie de PHP. 918 01:01:32,540 --> 01:01:36,870 Așa că separarea în ceea ce faci. 919 01:01:36,870 --> 01:01:39,330 Și veți rețineți că nici un fel, pentru nici unul dintre ei, 920 01:01:39,330 --> 01:01:41,980 ei încă imprima imaginea, imaginea, imaginea, 921 01:01:41,980 --> 01:01:44,540 astfel încât HTML încă este tipărită în același mod. 922 01:01:44,540 --> 01:01:49,870 Și atunci veți vedea în continuare cele 3 imagini apar pe site-ul. 923 01:01:49,870 --> 01:01:52,820 Deci, este de 2 moduri diferite de a face același lucru. 924 01:01:52,820 --> 01:01:55,060 >> Acum avem forme și cereri. Ca Rob ți-a arătat, 925 01:01:55,060 --> 01:01:59,400 există forme de HTML, și vom briza doar prin asta. 926 01:01:59,400 --> 01:02:02,040 Aveți o acțiune și aveți o metodă, și acțiunea dvs. 927 01:02:02,040 --> 01:02:04,350 un fel de tine în cazul în care ai de gând să-l trimită arată, iar metoda este dacă 928 01:02:04,350 --> 01:02:06,960 aceasta va fi o GET sau un POST. 929 01:02:06,960 --> 01:02:11,220 Și o cerere GET, așa cum a spus Rob, înseamnă că ai de gând să-l pună într-o formă 930 01:02:11,220 --> 01:02:15,760 și veți vedea ca pe un URL, în timp ce o cerere POST nu veți vedea într-un URL. 931 01:02:15,760 --> 01:02:17,840 Deci, o mică diferență. 932 01:02:17,840 --> 01:02:19,950 Cu toate acestea, un lucru care este un lucru similar 933 01:02:19,950 --> 01:02:22,560 este faptul că POST și GET sunt la fel de nesigure. 934 01:02:22,560 --> 01:02:26,430 Deci, ați putea crede că doar pentru că tu nu-l vezi în URL-ul, 935 01:02:26,430 --> 01:02:28,790 ceea ce înseamnă că POST este mai sigur, 936 01:02:28,790 --> 01:02:34,420 dar puteți vedea încă în cookie-urile în informațiile pe care le trimiteți. 937 01:02:34,420 --> 01:02:38,260 Deci, nu cred că despre una sau alta. 938 01:02:38,260 --> 01:02:42,160 Un alt lucru de remarcat este că veți avea, de asemenea, variabile secțiune. 939 01:02:42,160 --> 01:02:45,850 Voi folosi acest lucru în PSET 7 pentru a obține informațiile de ID-ul de utilizator. 940 01:02:45,850 --> 01:02:48,550 Ce sa întâmplat a fost că puteți utiliza acest tablou asociativ, 941 01:02:48,550 --> 01:02:53,310 $ _SESSION, și apoi ești capabil de a accesa diferite lucruri 942 01:02:53,310 --> 01:02:57,720 și stoca lucruri diferite din paginile. 943 01:02:57,720 --> 01:03:00,750 >> Ultimul lucru este că avem SQL, Structured Query Language, 944 01:03:00,750 --> 01:03:04,360 iar acest lucru este un limbaj de programare pentru a gestiona bazele de date. 945 01:03:04,360 --> 01:03:08,220 Ceea ce, exact, sunt baze de date? Sunt colecții de tabele, 946 01:03:08,220 --> 01:03:10,630 și fiecare tabel poate avea tipuri similare de obiecte. 947 01:03:10,630 --> 01:03:14,990 Așa că am avut o masă de utilizatori în PSET dumneavoastră finanțe. 948 01:03:14,990 --> 01:03:20,610 Și de ce sunt ele utile? Pentru că este o modalitate de stocare permanent informații. 949 01:03:20,610 --> 01:03:22,840 Este o modalitate de urmărire a lucrurilor și gestionarea lucrurile 950 01:03:22,840 --> 01:03:25,890 și de fapt, să-l văd pe diferite pagini și urmări păstrarea. 951 01:03:25,890 --> 01:03:29,930 Întrucât, dacă tu doar se păstrează la acel moment imediat 952 01:03:29,930 --> 01:03:33,720 și apoi l utilizați mai târziu, nu va fi capabil de a accesa tot ceea ce le-ați salvat. 953 01:03:33,720 --> 01:03:37,660 Avem 4 lucruri importante pe care le folosim pentru comenzi SQL. 954 01:03:37,660 --> 01:03:40,190 Avem selectați, insera, șterge, și actualizare. 955 01:03:40,190 --> 01:03:42,880 Cei care sunt cu adevărat importante pentru voi să știți pentru testul dumneavoastră. 956 01:03:42,880 --> 01:03:45,990 >> Vom merge repede peste selectați chiar acum. 957 01:03:45,990 --> 01:03:48,540 Practic, te selectarea rânduri dintr-o bază de date. 958 01:03:48,540 --> 01:03:52,400 Deci, dacă aveți, chiar aici - 959 01:03:52,400 --> 01:03:56,740 avem aceste două lucruri diferite, și ne-o dorim pentru a selecta din tabelul de clase 960 01:03:56,740 --> 01:04:01,480 unde minunat - în cazul în care în coloana minunat valoarea este 1. 961 01:04:01,480 --> 01:04:04,460 Astfel încât să puteți vedea aici, avem aceste două lucruri de numele clasei, 962 01:04:04,460 --> 01:04:08,490 CS50 și Stat110, și avem ID-urile de clasă și sloganul. 963 01:04:08,490 --> 01:04:13,150 Așa că ne-o dorim pentru a selecta toate aceste informații. 964 01:04:13,150 --> 01:04:17,480 Apoi, puteți vedea aici că e un fel de a alege din acea coloană minunat, 965 01:04:17,480 --> 01:04:25,170 în cazul în care toate lucrurile sunt 1, și apoi le-a clasei ID-ul, numele de clasă și sloganul care se poate alege. 966 01:04:25,170 --> 01:04:28,100 Cum anume faci acest lucru în cod? Va trebui să utilizați PHP. 967 01:04:28,100 --> 01:04:33,830 Deci, asta e un fel de modul PHP și SQL sunt legate unele de altele. 968 01:04:33,830 --> 01:04:38,130 Acum avem codul nostru, și vom utiliza funcția noastră de interogare 969 01:04:38,130 --> 01:04:41,370 așa cum am făcut în PSET 7, și vom executa interogarea SQL. 970 01:04:41,370 --> 01:04:43,870 Apoi, vom avea - 971 01:04:43,870 --> 01:04:46,280 trebuie întotdeauna să verifice dacă rândul lui triplu egal dacă false. 972 01:04:46,280 --> 01:04:49,010 Deci, din nou, pe care doriți să verificați tipul și valoarea, 973 01:04:49,010 --> 01:04:53,880 ș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. 974 01:04:53,880 --> 01:04:55,870 În caz contrar, pe care doriți să bucla prin tot ceea ce cu cele la îndemână 975 01:04:55,870 --> 01:04:59,410 foreach bucle care tocmai am trecut peste. 976 01:04:59,410 --> 01:05:01,280 Acum, că suntem looping prin și l-am făcut trecut, 977 01:05:01,280 --> 01:05:05,080 să presupunem că interogarea noastră a trecut, acum avem bucla foreach nostru. 978 01:05:05,080 --> 01:05:11,050 Și primul rând are, deci aici e rândul, chiar de aici, e în cutie. 979 01:05:11,050 --> 01:05:14,010 Se va imprima toate informațiile pe care le-a primit. 980 01:05:14,010 --> 01:05:18,070 Deci, se va imprima în partea de jos "Vrei să Aflați HTML?" 981 01:05:18,070 --> 01:05:23,370 Apoi, se va merge la rândul următor, deoarece este finalizat prima de buclă, 982 01:05:23,370 --> 01:05:26,510 și așa apoi se va imprima a doua linie de ea, 983 01:05:26,510 --> 01:05:32,120 care va fi STAT110, Gaseste toate momentele. 984 01:05:32,120 --> 01:05:34,290 >> Un ultim lucru este pe SQL vulnerabilități. 985 01:05:34,290 --> 01:05:37,300 Știu David atins pe aceasta un pic în curs. 986 01:05:37,300 --> 01:05:40,730 Puteți citi mai târziu. E foarte amuzant. 987 01:05:40,730 --> 01:05:45,320 SQL Injection este un fel de lucru complicat. 988 01:05:45,320 --> 01:05:49,890 Să spunem că doar stai aceste variabile chiar în interogare, 989 01:05:49,890 --> 01:05:52,290 după cum puteți vedea în primul rând. 990 01:05:52,290 --> 01:05:54,520 Deci, se pare bine, nu? Esti doar a pune în numele de utilizator 991 01:05:54,520 --> 01:05:58,820 și parola de interogare SQL, și doriți să-l expedieze în afara și de a lua tot ce este în tabelul de date. 992 01:05:58,820 --> 01:06:01,450 Asta pare destul de simplu. Deci, haideți să spun cineva pune în, 993 01:06:01,450 --> 01:06:04,910 pentru parola, aceasta SAU textul de aici - 994 01:06:04,910 --> 01:06:06,780 ar trebui să fie de fapt în caseta de roșu. 995 01:06:06,780 --> 01:06:11,920 Deci, haideți să spunem că au pus că parolă în - asta e ceea ce ei intra. 996 01:06:11,920 --> 01:06:16,520 Astfel încât acestea să pui sau "1" = 1. 997 01:06:16,520 --> 01:06:20,880 Un fel de parolă prostie de a avea. 998 01:06:20,880 --> 01:06:25,070 Acum, hai să-l înlocuiască în, și veți rețineți că în această interogare SQL acum, 999 01:06:25,070 --> 01:06:29,090 se evaluează la întotdeauna adevărat, pentru că veți rețineți că 1000 01:06:29,090 --> 01:06:32,240 puteți interogare SQL selecta toate aceste informații 1001 01:06:32,240 --> 01:06:35,420 sau poti avea doar 1 = 1. 1002 01:06:35,420 --> 01:06:41,030 Astfel că întotdeauna o să evalua la true. 1003 01:06:41,030 --> 01:06:46,610 Asta nu va merge într-adevăr, pentru că asta înseamnă că hacker poate rupe în sistemul dumneavoastră. 1004 01:06:46,610 --> 01:06:49,300 Soluția pentru acest lucru este că va trebui să utilizați sistemul de DOP, 1005 01:06:49,300 --> 01:06:51,360 ceea ce înseamnă că va trebui să utilizați semne de întrebare, 1006 01:06:51,360 --> 01:06:53,350 care este ceea ce voi folosite în PSET 7, 1007 01:06:53,350 --> 01:06:57,620 în cazul în care ai de gând să utilizeze un semn de întrebare în locul de unde doriți să pună ceva, 1008 01:06:57,620 --> 01:07:01,430 și apoi ai de gând să aibă o virgulă, și apoi veți avea după aceea, 1009 01:07:01,430 --> 01:07:07,610 după șirul de, diferite variabile pe care doriți să-l înlocuiască în semn de întrebare. 1010 01:07:07,610 --> 01:07:10,330 Deci, veți remarcat aici că acum am aceste semne de întrebare de culoare roșie. 1011 01:07:10,330 --> 01:07:15,420 Apoi am pus variabilele după sfori mele, așa că am știu să le înlocuiască, în această ordine după aceea. 1012 01:07:15,420 --> 01:07:18,470 Acest lucru va asigurați-vă că, dacă cineva o face ca aceasta, 1013 01:07:18,470 --> 01:07:24,050 și au sau 1 = 1 situația, care va asigura, 1014 01:07:24,050 --> 01:07:30,490 în partea din spate, asigurați-vă că acesta nu se va rupe de fapt, interogarea SQL. 1015 01:07:30,490 --> 01:07:33,660 Bine, așa că e destul de mult, un vârtej de PHP și SQL. 1016 01:07:33,660 --> 01:07:41,520 Cel mai bun de noroc pentru voi toți, și acum la Ore 1017 01:07:41,520 --> 01:07:44,270 >> [Oreoluwatomiwa Babarinsa] toată lumea Bine. Timp pentru a trece peste unele JavaScript 1018 01:07:44,270 --> 01:07:48,840 și alte câteva lucruri foarte repede asa ca nu te ține în seara asta. 1019 01:07:48,840 --> 01:07:56,930 JavaScript. Da. JavaScript este un fel de un lucru rece, pretins. 1020 01:07:56,930 --> 01:07:59,090 Lucrurile într-adevăr trebuie să știți despre JavaScript, e un fel de 1021 01:07:59,090 --> 01:08:03,810 sfârșitul client-side de ceea ce aplicația web este de gând să faci. 1022 01:08:03,810 --> 01:08:08,280 Există unele lucruri pe care pur și simplu nu doresc să aibă grijă de tot timpul pe partea de server. 1023 01:08:08,280 --> 01:08:12,880 Toate micile interacțiunile, subliniind un singur lucru, a face ceva să dispară. 1024 01:08:12,880 --> 01:08:15,340 Tu chiar nu vreau să aibă de a vorbi cu server-ul dvs. tot timpul pentru asta. 1025 01:08:15,340 --> 01:08:18,069 Și unii dintre care nici măcar nu este posibil să se facă pe partea de server. 1026 01:08:18,069 --> 01:08:21,899 Acesta este de ce avem nevoie de ceva de genul JavaScript. 1027 01:08:21,899 --> 01:08:24,359 Lucruri interesante despre JavaScript: Este dinamic tastat. 1028 01:08:24,359 --> 01:08:27,149 Ce înseamnă acest lucru este că programul nu are nevoie să știe 1029 01:08:27,149 --> 01:08:30,970 ceea ce, exact, variabilele sunt atunci când îl scrie. 1030 01:08:30,970 --> 01:08:34,510 Va doar un fel de-mi dau seama ca se funcționare. 1031 01:08:34,510 --> 01:08:37,520 Alte lucruri care sunt misto despre asta: Este un limbaj acoladă, 1032 01:08:37,520 --> 01:08:41,359 ceea ce înseamnă sintaxa este similar cu C și PHP. 1033 01:08:41,359 --> 01:08:47,050 Tu nu trebuie sa faci mult rework atunci când sunteți JavaScript de învățare. 1034 01:08:47,050 --> 01:08:49,180 Aici avem un pic de JavaScript. 1035 01:08:49,180 --> 01:08:52,560 Lucru interesant aici este că, dacă te uiți la ea, 1036 01:08:52,560 --> 01:08:56,330 avem un pic de JavaScript chiar acolo în tag-ul cap. 1037 01:08:56,330 --> 01:08:59,479 Ceea ce este nu este, în principiu cuprinde doar un fișier JavaScript. 1038 01:08:59,479 --> 01:09:02,260 Aceasta este o modalitate puteți include JavaScript în programul dumneavoastră. 1039 01:09:02,260 --> 01:09:06,910 Apoi, al doilea mic bit este de fapt unele JavaScript inline, 1040 01:09:06,910 --> 01:09:10,790 foarte similar cu un stil inline cu CSS, 1041 01:09:10,790 --> 01:09:16,180 și tu doar scrie un cod foarte repede acolo. 1042 01:09:16,180 --> 01:09:18,120 JavaScript are tablouri. 1043 01:09:18,120 --> 01:09:20,850 Doar un alt mod de a păstra date în jur, foarte util. 1044 01:09:20,850 --> 01:09:25,180 Sintaxa foarte frumos și ușor. 1045 01:09:25,180 --> 01:09:29,870 Puteți utiliza paranteze pătrate pentru a accesa tot și să păstreze totul împreună. 1046 01:09:29,870 --> 01:09:35,020 Nimic prea complex. 1047 01:09:35,020 --> 01:09:38,630 Lucru misto despre JavaScript si limbaje de scripting, în general, 1048 01:09:38,630 --> 01:09:40,920 este că nu trebuie să vă faceți griji cu privire la dimensiunile matrice. 1049 01:09:40,920 --> 01:09:43,880 Puteți folosi doar array.length și urmări de ea, 1050 01:09:43,880 --> 01:09:46,960 și, de asemenea, matricea poate creste sau micsora ca ai nevoie de ea pentru. 1051 01:09:46,960 --> 01:09:49,279 Deci, tu nici măcar nu trebuie să vă faceți griji cu privire la orice fel de, 1052 01:09:49,279 --> 01:09:57,050 oh nu, trebuie să aloce mai multe lucruri, sau ceva de genul asta. 1053 01:09:57,050 --> 01:10:00,090 >> Misto lucru aici este că JavaScript are ceva numit obiecte. 1054 01:10:00,090 --> 01:10:04,800 Este un limbaj orientat-obiect, deci ceea ce a este, în esență, 1055 01:10:04,800 --> 01:10:10,100 o cale pentru tine de a datelor de grup împreună, oarecum similar cu un struct, 1056 01:10:10,100 --> 01:10:17,280 dar îl puteți accesa ca un struct sau într-o sintaxă tablou asociativ. 1057 01:10:17,280 --> 01:10:22,520 Este destul de simplu și ceea ce se poate face cu acest lucru este de date grup împreună 1058 01:10:22,520 --> 01:10:24,810 dacă aveți o grămadă de date care este legat. 1059 01:10:24,810 --> 01:10:26,850 Pentru ca e toate lucrurile de care aveți nevoie pentru a descrie o mașină, 1060 01:10:26,850 --> 01:10:29,050 nu aveți nevoie să-l aibă într-o grămadă de locuri diferite. 1061 01:10:29,050 --> 01:10:35,300 Poți să-l lipi în 1 obiect în JavaScript. 1062 01:10:35,300 --> 01:10:39,090 După cum probabil știți, iterarea este una dintre acele sarcini plictisitoare. 1063 01:10:39,090 --> 01:10:43,810 Trebuie doar so faci pe un peste din nou. Aveți nevoie pentru a vorbi cu fiecare obiect în mașină, 1064 01:10:43,810 --> 01:10:47,340 sau aveți nevoie pentru a merge prin fiecare element dintr-o listă sau ceva de genul asta. 1065 01:10:47,340 --> 01:10:51,770 Deci, JavaScript trebuie, similar cu PHP, o sintaxă foreach. 1066 01:10:51,770 --> 01:10:54,590 În acest caz, este o în buclă. 1067 01:10:54,590 --> 01:10:57,300 Doriți să utilizați acest lucru numai pe obiecte. 1068 01:10:57,300 --> 01:11:01,030 Există unele probleme care apar dacă utilizați acest lucru pe matrice. 1069 01:11:01,030 --> 01:11:03,750 În general, este unul dintre acele lucruri, totuși, că este foarte util, 1070 01:11:03,750 --> 01:11:06,590 pentru ca elimina o mulțime de deasupra capului 1071 01:11:06,590 --> 01:11:10,270 pentru că nu aveți de a trage totul în obiect de unul singur. 1072 01:11:10,270 --> 01:11:12,300 Nu trebuie să-mi amintesc toate numele importante. 1073 01:11:12,300 --> 01:11:18,270 Ai doar un fel de a le obține înapoi în această sintaxă. 1074 01:11:18,270 --> 01:11:21,500 În acest sens, cu pentru, vrei doar să-și amintească 1075 01:11:21,500 --> 01:11:27,180 că vei primi înapoi toate cheile, într-un mod foarte asemănător cu hash masă. 1076 01:11:27,180 --> 01:11:30,880 Dacă vă amintiți de la care, atunci când v-ar pune într-un șir ați putea obține ceva 1077 01:11:30,880 --> 01:11:33,840 că ar avea o valoare asociate cu ea. 1078 01:11:33,840 --> 01:11:36,360 Ce puteți face cu acest lucru este de a putea spune, bine, 1079 01:11:36,360 --> 01:11:42,120 Am pus într-o mașină, și l-am numit un Ferrari. 1080 01:11:42,120 --> 01:11:45,290 Astfel încât să puteți pune în șir Ferrari din nou mai târziu, și puteți obține asta. 1081 01:11:45,290 --> 01:11:50,000 Și tu poți face asta într-o buclă, cu în buclă. 1082 01:11:50,000 --> 01:11:53,320 Deci, doar mai multe despre obiecte. Cheie de la acest lucru trebuie să vă amintiți 1083 01:11:53,320 --> 01:12:00,340 este că puteți folosi struct obiect ca sintaxă ori de câte ori doriți cu acestea, 1084 01:12:00,340 --> 01:12:04,590 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. 1085 01:12:04,590 --> 01:12:07,650 Deci, dacă te uiți la faptul că există, avem cheie cu spatii. 1086 01:12:07,650 --> 01:12:12,500 Ei bine, dacă ați fost de a pune object.key, spațiu, cu, spatiu, spatii, 1087 01:12:12,500 --> 01:12:15,320 care pur și simplu nu ar avea sens punct de vedere sintactic. 1088 01:12:15,320 --> 01:12:22,730 Deci, numai tu poți face asta cu acest tip de sintaxă suport. 1089 01:12:22,730 --> 01:12:26,520 >> De asemenea, este foarte JavaScript domeniul de aplicare-înțelept pentru a PHP. 1090 01:12:26,520 --> 01:12:29,050 Aveți două modalități de abordare a domeniului de aplicare. 1091 01:12:29,050 --> 01:12:31,960 Nu puteți avea var in fata unei variabile, 1092 01:12:31,960 --> 01:12:34,060 și asta înseamnă că doar aceasta este la nivel global. 1093 01:12:34,060 --> 01:12:37,050 Puteți să-l vedea de oriunde. Chiar dacă ați fost de a pune aceasta într-o declarație, dacă, 1094 01:12:37,050 --> 01:12:42,430 oriunde altundeva în codul dvs., după care punctul de ai putea vedea ca variabila. 1095 01:12:42,430 --> 01:12:46,730 Un alt lucru, însă, este cu var, este limitat la orice funcție sunteți inch 1096 01:12:46,730 --> 01:12:48,870 Dacă nu sunteți într-o funcție, ei bine, e la nivel mondial. 1097 01:12:48,870 --> 01:12:53,900 Dar dacă vă aflați într-o funcție este vizibil numai în cadrul acestei funcții. 1098 01:12:53,900 --> 01:12:56,420 Nu am un exemplu, dar, da. Este unul din acele lucruri în care 1099 01:12:56,420 --> 01:12:59,900 puteți gestiona ceea ce variabilele pe care doriți să fie global, 1100 01:12:59,900 --> 01:13:03,810 ceea ce variabilele pe care doriți să fie locale, dar tu nu trebuie să fie atent cu privire la aceasta, 1101 01:13:03,810 --> 01:13:06,890 pentru că nu aveți de tipul de control fin cereale faci în C, 1102 01:13:06,890 --> 01:13:15,820 în cazul în care în cazul în care ceva este declarat într-o buclă, o să rămână în care pentru bucla. 1103 01:13:15,820 --> 01:13:18,790 Lucru de care avem grijă de fapt despre utilizarea JavaScript pentru manipulează pagini web, corect? 1104 01:13:18,790 --> 01:13:21,800 Vreau să spun, de aceea facem acest lucru. 1105 01:13:21,800 --> 01:13:23,840 >> Pentru a face acest lucru, vom folosi ceva numit DOM. 1106 01:13:23,840 --> 01:13:25,850 Document Object Model. 1107 01:13:25,850 --> 01:13:29,430 Practic, ceea ce face este nevoie de toate HTML dvs. 1108 01:13:29,430 --> 01:13:34,110 și modele-l afară într-o grămadă de obiecte care sunt imbricate în interiorul reciproc. 1109 01:13:34,110 --> 01:13:37,080 Puteți începe cu ceva de genul asta. 1110 01:13:37,080 --> 01:13:44,770 Aveți, pe dreapta pentru mine, o grămadă de cod acolo, care e un fel de - 1111 01:13:44,770 --> 01:13:46,640 Ati putea crede ca ar fi foarte greu de a manipula, 1112 01:13:46,640 --> 01:13:48,700 pentru că ai fi parsarea printr-o grămadă de text 1113 01:13:48,700 --> 01:13:52,080 și având la cap în afară lucrurile. Și ce dacă nu a fost formatat corect? 1114 01:13:52,080 --> 01:13:54,880 Lucruri rele s-ar întâmpla. 1115 01:13:54,880 --> 01:13:58,140 Astfel de activarea JavaScript-are grijă de acest lucru pentru tine, și veți obține o structură de date frumos, 1116 01:13:58,140 --> 01:14:01,390 cum ar fi cea de pe stânga mea, în cazul în care aveți doar un document, 1117 01:14:01,390 --> 01:14:03,530 și în care aveți ceva numit HTML, 1118 01:14:03,530 --> 01:14:05,600 și în care aveți un cap și un corp, 1119 01:14:05,600 --> 01:14:08,420 și în interiorul capul aveți un titlu, etcetera, etcetera, etcetera. 1120 01:14:08,420 --> 01:14:11,810 Acest lucru simplifică manipularea o pagină web, astfel că este doar, 1121 01:14:11,810 --> 01:14:14,190 oh, vreau doar să vorbesc cu acest obiect. 1122 01:14:14,190 --> 01:14:21,340 Un fel de-un mod foarte asemănător v-ar vorbi cu un alt obiect ai făcut tu. 1123 01:14:21,340 --> 01:14:25,980 Cum am spus, tot DOM este în obiectul de documente. 1124 01:14:25,980 --> 01:14:29,290 Fie că e doar un loc si apoi poti sa te duci în ea pentru a găsi lucruri, 1125 01:14:29,290 --> 01:14:33,880 și o poți face - acesta este stilul vechi de a face asta, acolo sus, 1126 01:14:33,880 --> 01:14:38,130 în cazul în care face document.getElementById, iar apoi numele, 1127 01:14:38,130 --> 01:14:42,420 și după cum puteți, probabil, spune, acest lucru devine foarte greoi după un timp. 1128 01:14:42,420 --> 01:14:44,480 Deci, probabil că nu vrei să faci asta. De aceea, ne-am 1129 01:14:44,480 --> 01:14:48,760 următorul lucru vom vorbi despre asta după. 1130 01:14:48,760 --> 01:14:52,510 Cheie lucru aici este că, în regulă, ai toate aceste elemente, nu? 1131 01:14:52,510 --> 01:14:56,400 Deci, poate că pot schimba culoarea de ceva atunci când pagină se încarcă. 1132 01:14:56,400 --> 01:14:58,380 Deci, ce? Ce se întâmplă dacă utilizatorul meu clic ceva? 1133 01:14:58,380 --> 01:15:00,540 Vreau să fac ceva interesant, atunci când faceți clic pe ceva. 1134 01:15:00,540 --> 01:15:02,600 De aceea, avem evenimente. 1135 01:15:02,600 --> 01:15:05,330 Puteți, de fapt, găsi orice element din DOM-ul, 1136 01:15:05,330 --> 01:15:08,560 și apoi spune, hei. Când acest lucru se încarcă sau cineva se fixează, 1137 01:15:08,560 --> 01:15:11,410 sau atunci când mouse-ul peste el, face ceva cu ea. 1138 01:15:11,410 --> 01:15:15,330 Și ceea ce ai este, aveți funcții care se ocupa de acest lucru pentru tine. 1139 01:15:15,330 --> 01:15:17,980 Aceste funcții sunt Stivuitoare eveniment. 1140 01:15:17,980 --> 01:15:20,440 Ce Theyre - e doar un mod fantezist de a spune, 1141 01:15:20,440 --> 01:15:23,500 această funcție este executată doar atunci când acest eveniment se întâmplă. 1142 01:15:23,500 --> 01:15:28,070 Deci, se ocupă de cazul în care se produce. 1143 01:15:28,070 --> 01:15:30,810 Acesta este modul în care s-ar expune un handler eveniment. 1144 01:15:30,810 --> 01:15:34,750 Am niște buton, și atunci când faceți clic pe el, explodează. 1145 01:15:34,750 --> 01:15:40,560 Deci, nu faceți clic pe butonul. 1146 01:15:40,560 --> 01:15:42,910 Acesta este un mod de abordare ea, corect? 1147 01:15:42,910 --> 01:15:46,430 Ai o etichetă buton, iar pe clic aveti un șir care spune, 1148 01:15:46,430 --> 01:15:50,460 oh, apropo, eu fac acest lucru explozie pentru mine. 1149 01:15:50,460 --> 01:15:53,990 În caz contrar, e la fel ca un buton regulat pe care tocmai ați făcut. 1150 01:15:53,990 --> 01:15:56,550 Puteți face, de asemenea, acest lucru un alt mod, 1151 01:15:56,550 --> 01:16:02,770 de hapsân elementul DOM, dar vom salva că după ce vorbim despre jQuery. 1152 01:16:02,770 --> 01:16:07,580 >> JQuery: Este o bibliotecă, care este cross-browser. 1153 01:16:07,580 --> 01:16:09,580 Puteți să-l folosească în ceva destul de mult. 1154 01:16:09,580 --> 01:16:12,090 Și doar vă oferă o mulțime de instrumente pentru a lucra cu. 1155 01:16:12,090 --> 01:16:15,850 Deoarece JavaScript, în timp ce puternic, nu are toate instrumentele de care aveți nevoie 1156 01:16:15,850 --> 01:16:20,550 din cutie pentru a aborda într-adevăr o aplicatie web este posibil să doriți să faceți. 1157 01:16:20,550 --> 01:16:24,650 Așa că simplifică o mulțime de lucruri, vă oferă o mulțime de funcții 1158 01:16:24,650 --> 01:16:28,760 afară de la cutie pe care le-ar trebui în mod normal să vă scriu, peste si peste si peste din nou. 1159 01:16:28,760 --> 01:16:31,600 Și doar face lucrurile foarte simplu. 1160 01:16:31,600 --> 01:16:35,780 Aveți, de asemenea, selectoare, care vă permit să luați toate aceste elemente 1161 01:16:35,780 --> 01:16:42,800 din DOM-ul mult mai simplu, în loc de a avea de a utiliza aceste apeluri de funcții foarte lungi. 1162 01:16:42,800 --> 01:16:46,630 Mai multe despre aceste selectoare. Ai, acolo ai, sa zicem 1163 01:16:46,630 --> 01:16:49,800 Vreau să ajung un element cu ID-ul "piatra." 1164 01:16:49,800 --> 01:16:56,450 Ei bine, în jQuery, e doar $ și apoi un șir care are o jumătate de kilogram, iar apoi "rock." 1165 01:16:56,450 --> 01:17:01,960 Este foarte simplu și mult mai repede decât în ​​mod tradițional JavaScript din abordarea acestei probleme. 1166 01:17:01,960 --> 01:17:06,120 Și aveți lucruri similare pentru clase și tipuri de elemente. 1167 01:17:06,120 --> 01:17:08,140 jQuery este - una dintre caracteristicile interesante este ca poti fel de comprima 1168 01:17:08,140 --> 01:17:14,350 jos întrebările dvs. pe DOM dvs. foarte, foarte repede. 1169 01:17:14,350 --> 01:17:18,980 Acum ne-am întors la manipulare eveniment, iar acest lucru este modul în care se va ocupa de un eveniment în jQuery. 1170 01:17:18,980 --> 01:17:23,090 Deci, ceea ce am de gând aici este de ce spunem, în regulă. Am o etichetă scenariu, corect? 1171 01:17:23,090 --> 01:17:25,400 Așa că am această linie JavaScript. 1172 01:17:25,400 --> 01:17:27,750 Ceea ce am de gând să faceți este să mergem să spunem, în regulă. 1173 01:17:27,750 --> 01:17:30,860 În cazul în care documentul este gata, ceea ce înseamnă că documentul a fost incarcat, 1174 01:17:30,860 --> 01:17:34,660 vom merge în la această funcție, și am de gând să spun, bine, 1175 01:17:34,660 --> 01:17:37,060 această funcție se face de fapt altceva. 1176 01:17:37,060 --> 01:17:42,320 Este practic spune, bine, dă-mi elementul cu ID-ul "myid." 1177 01:17:42,320 --> 01:17:47,960 Si apoi da aceasta o manipulare funcție care execută atunci când faceți clic pe el. 1178 01:17:47,960 --> 01:17:49,820 Practic ceea ce acest lucru nu este, se spune, în regulă. 1179 01:17:49,820 --> 01:17:52,630 Pagina este încărcată, așa că am de gând să în, găsi acest element, 1180 01:17:52,630 --> 01:17:56,420 da acest handler eveniment, și-l practic stabilește pagina dvs. pentru tine. 1181 01:17:56,420 --> 01:18:00,520 Și acest lucru este modul în care doriți să se gândească de manipulare eveniment. 1182 01:18:00,520 --> 01:18:06,310 Vrei doar să te gândești, bine, atunci când se întâmplă ceva, ceea ce nu vreau să se întâmple? 1183 01:18:06,310 --> 01:18:10,520 Tu nu vreau să mă gândesc, bine, am nevoie pentru a face sigur că discuțiile acest lucru la acest lucru, 1184 01:18:10,520 --> 01:18:14,660 acest lucru blah blah blah, pentru că vrei doar să vorbim lucru în termeni de evenimente. 1185 01:18:14,660 --> 01:18:17,650 Atunci când se întâmplă acest lucru, acest lucru se întâmplă. Când se întâmplă acest lucru, care se întâmplă. 1186 01:18:17,650 --> 01:18:20,240 Și dacă lucrurile declanșa alte lucruri, asta e minunat. 1187 01:18:20,240 --> 01:18:22,150 Dar nu doriți să încercați și de a face codul de complicat 1188 01:18:22,150 --> 01:18:24,130 cazul în care sunteți de declanșare mai multe lucruri în același timp, 1189 01:18:24,130 --> 01:18:28,860 pentru ca esti doar de gând să vă dau o durere de cap. 1190 01:18:28,860 --> 01:18:32,340 >> Regulă. Acum putem ajunge pagina noastră să se ocupe de evenimente, 1191 01:18:32,340 --> 01:18:35,640 dar să spunem că utilizatorul meu clic pe un buton. 1192 01:18:35,640 --> 01:18:38,040 Ce se întâmplă dacă vreau să trimit cererea înapoi la server, 1193 01:18:38,040 --> 01:18:41,100 dar nu vreau să reîncărcați pagina, pentru că a fi nevoie să reîncărcați o pagină nouă 1194 01:18:41,100 --> 01:18:44,390 de fiecare dată devine un fel de plictisitoare, și de ce am nevoie 1195 01:18:44,390 --> 01:18:47,430 pentru a trage în jos antetul din nou, și subsol din nou, 1196 01:18:47,430 --> 01:18:49,670 și toate elementele paginii din nou 1197 01:18:49,670 --> 01:18:53,180 doar pentru a reîmprospăta salutul sau de timp? 1198 01:18:53,180 --> 01:18:55,290 De aceea noi avem ceva de genul Ajax. 1199 01:18:55,290 --> 01:18:59,150 Ce putem face aici cu Ajax este, putem spune, bine, 1200 01:18:59,150 --> 01:19:01,290 Vreau să trimit niște date de la server, 1201 01:19:01,290 --> 01:19:04,010 și vreau să obțineți un răspuns înapoi, așa că am poate actualiza pagina mea, 1202 01:19:04,010 --> 01:19:12,120 sau poate face doar un calcul algoritmică care nu arată neapărat ceva pentru utilizator. 1203 01:19:12,120 --> 01:19:15,500 Ce aveți nevoie pentru a face acest lucru? Ei bine, ai nevoie de un URL care aveți nevoie pentru a vorbi cu. 1204 01:19:15,500 --> 01:19:18,650 Server-ul dvs. nu pot doar asculta magic de la nicăieri. 1205 01:19:18,650 --> 01:19:21,960 Aveți nevoie pentru a avea un loc specific trimiteți aceste date la. 1206 01:19:21,960 --> 01:19:26,240 Și aveți nevoie, de asemenea, unele date pentru a trimite, sau poate este o interogare dataless. 1207 01:19:26,240 --> 01:19:31,380 Vrei doar să ping înapoi la server și spune, hei, eu sunt în viață, sau ceva de genul asta. 1208 01:19:31,380 --> 01:19:35,150 Și apoi doriți o funcție care, practic, se ocupă cu succes. 1209 01:19:35,150 --> 01:19:38,250 Să presupunem că te-ai întors niște informații de la server-ul dvs., 1210 01:19:38,250 --> 01:19:42,960 și doriți să schimbați titlul utilizatorului pe pagina lor. 1211 01:19:42,960 --> 01:19:44,930 Deci, v-ar lua informațiile din spate, 1212 01:19:44,930 --> 01:19:48,860 și v-ar împinge că pe ecran. 1213 01:19:48,860 --> 01:19:51,170 Ce se întâmplă este, atunci când pagina este gata, 1214 01:19:51,170 --> 01:19:56,500 creați o funcție pe clic pentru acest buton numit greeter. 1215 01:19:56,500 --> 01:19:58,810 Ce este acest lucru, atunci nu este, în momentul în care este apăsat butonul, 1216 01:19:58,810 --> 01:20:03,700 vorbești cu greetings.php, vă face o cerere POST, 1217 01:20:03,700 --> 01:20:07,290 și spui, hei, adu-mi ceva de la pagina ta. 1218 01:20:07,290 --> 01:20:09,890 Nu avem cu adevărat nevoie pentru a descrie asta, dar greetings.php, 1219 01:20:09,890 --> 01:20:12,480 hai să spunem, da înapoi "Hello World." 1220 01:20:12,480 --> 01:20:15,650 Deci, ne întoarcem această "Hello World", iar pe de succes de acest lucru, 1221 01:20:15,650 --> 01:20:20,730 presupunând că nimic nu merge bine, atunci ne-am merge la acest loc țintă 1222 01:20:20,730 --> 01:20:25,720 pe care am specificat și noi rămânem doar răspunsul acolo. 1223 01:20:25,720 --> 01:20:31,560 Și acesta este un mod foarte simplu de a crea o interogare Ajax. 1224 01:20:31,560 --> 01:20:34,340 >> Foarte repede, Rob fel a menționat deja acest lucru, 1225 01:20:34,340 --> 01:20:37,170 lucrurile pot merge prost, lucruri rele se poate întâmpla, 1226 01:20:37,170 --> 01:20:42,660 astfel încât să doriți să vă familiarizați cu aceste coduri de răspuns HTTP. 1227 01:20:42,660 --> 01:20:46,030 Care sunt acestea sunt la fel, cum ar fi, de 200, totul a mers bine. 1228 01:20:46,030 --> 01:20:48,670 Altceva, lucruri rele sa întâmplat. 1229 01:20:48,670 --> 01:20:50,790 Este, în general, lucru pe care doriți să vă amintiți. 1230 01:20:50,790 --> 01:20:53,440 Dar e bine să știi toate acestea. 1231 01:20:53,440 --> 01:20:55,970 Și, în sfârșit, odată ce am trecut prin toate astea, 1232 01:20:55,970 --> 01:20:58,680 trebuie să vorbim foarte repede despre design, 1233 01:20:58,680 --> 01:21:00,620 și apoi putem lăsa să plece toți. 1234 01:21:00,620 --> 01:21:03,410 Proiectare. Lucruri pe care doriți să vă amintiți. 1235 01:21:03,410 --> 01:21:06,950 Pune-ti urmatoarele intrebari: Cine va folosi acest lucru? 1236 01:21:06,950 --> 01:21:09,580 Ce vor fi, folosind pentru? Ce-mi pasă de utilizatorii mei? 1237 01:21:09,580 --> 01:21:11,750 Ce nu le pasa despre? 1238 01:21:11,750 --> 01:21:14,500 Pur si simplu nu doresc să facă o aplicație și lăsați-l doar să crească 1239 01:21:14,500 --> 01:21:18,270 și să devină acest gigant, lucru tot consumatoare de care tu nici măcar nu se poate termina. 1240 01:21:18,270 --> 01:21:23,900 Vrei să aibă obiective discrete și planuri și lucruri pe care doriți să le abordeze. 1241 01:21:23,900 --> 01:21:29,000 Face fără efort. Toate acestea, spune, în esență, 1242 01:21:29,000 --> 01:21:34,950 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. 1243 01:21:34,950 --> 01:21:38,020 Vrei doar să fie ceva unde este foarte ușor pentru cineva să meargă în 1244 01:21:38,020 --> 01:21:40,800 și de a face ceea ce vor să facă. 1245 01:21:40,800 --> 01:21:42,920 Tu nu vrei să aibă pentru a naviga 5 pagini 1246 01:21:42,920 --> 01:21:45,460 pentru a ajunge la prim funcția a site-ului. 1247 01:21:45,460 --> 01:21:49,290 În cazul în care Google a avut 5 pagini înainte de a putea căuta chiar ceva, 1248 01:21:49,290 --> 01:21:53,080 nimeni nu l-ar folosi. 1249 01:21:53,080 --> 01:21:55,890 Și, în fine, prototip de hârtie, focus grup. 1250 01:21:55,890 --> 01:21:59,220 Au un design bun și practici de testare. 1251 01:21:59,220 --> 01:22:00,730 Doar pentru că tu crezi că funcționează pentru tine, 1252 01:22:00,730 --> 01:22:04,860 nu înseamnă că altcineva crede că funcționează. 1253 01:22:04,860 --> 01:22:14,490 Dar, da, asta-i tot. 1254 01:22:14,490 --> 01:22:17,490 [CS50.TV]