DAVID J. Malan: Nu labi. Tik laipni pirmo CS50 līķa sekcija uz viktorīnas. Mēs domājam, ka mēs iezvanīt šī tradīcija šogad. Un šī būs iespēja staigāt pa risinājumus viktorīnā. Un mēs paātrināt vai palēnināt, pamatojoties par interesēm, kas šeit. Tātad, jūs, iespējams, šeit, jo jūs esat interesē, kā jūs varētu būt, vai būtu jāatbild dažus no šīm problēmām. Tātad, kāpēc nav mēs to apskatīt Šajā nodaļā vispirms? Tā kļūst stīgas. Tas tev trīs dažādās versijās no programmas, kas bija, galu galā, domāts, lai iegūtu virkni no lietotāja. Vai tas bija, ka bija pa kreisi, lai jums, lai noteiktu. Un mēs jautājām jautājuma 0, pieņemsim, ka versija 1 ir apkopoti un izpildīts. Kāpēc varētu programma segfault? No pirmā acu uzmetiena, kādi ieteikumi par to, kāpēc? Jā. Mērķauditorija: Tāpēc es atceros redzēt to iepriekšējais piemērs meklē char * s un redzēt skenēšanas s un redzot, jo tas ir rādītājs, cik bija tas ietekmē to, ko jūs skenētas? Tas ir S vai adrese s? DAVID J. Malan: OK. Labs. Tātad galu galā, avots jebkuru problēmu ir iespējams, gatavojas samazināt uz šo mainīgo s. Un tas ir patiešām mainīgs. Datu tips šim mainīgajam ir char *, kas nozīmē, ka tas būs satur adresi raksturs. Un tur ir ieskats. Tas notiek, lai apturētu adresi raksturu vai, vispārīgāk, adrese pirmā rakstura viss bloks rakstzīmju. Bet nozveju, ka skenēšanas s, mērķis ir dzīve, tiek dota adresi un, ņemot vērā formāta kods, piemēram,% s, lasīt string vērā rieciens Atmiņas šajā adresē. Bet tāpēc, ka tur nav vienādības zīme pirms ka semikols par pirmo līnija koda, jo mums nav reāli piešķirt jebkādu atmiņu malloc, jo tas nebija reāli piešķirt masīva kāda lieluma, visi jūs darāt, ir lasījumā lietotāja tastatūru uz dažām pabeigta atkritumu vērtību, kas ir s pēc noklusējuma. Tātad izredzes ir, jūs gatavojas segfault ja šī adrese nav tieši tā gadās būt vērtība, ka jūs varat, Patiesībā, rakstiet. Tik slikti nepiešķirt atmiņas tur. Tātad jautājums 1, mēs jautājām, pieņemsim, ka versija 2 ir apkopoti un izpildīts. Tāpēc, iespējams, šī programma segfault? Tātad šī ir mazāk buggy. Un tur tiešām tikai viens acīmredzams veids, kur jūs varat izraisīt segfault šeit. Un tas ir tematiska. Katru reizi, kad mēs izmantojam C atmiņā, ko jūs varētu darīt, lai izraisītu segfault ar 2 versiju? Mērķauditorija: Ja jūs izmantojat šo ieguldītos virkne, kas ir ilgāks par 49 rakstzīmes. DAVID J. Malan: Tieši tā. Katru reizi, kad jūs redzat kaut ko fiksētu garumu kad runa ir par masīvu, Jūsu radara vajadzētu iet off, ka tas varētu būt problemātiska, ja jūs neesat pārbaudīt robežas masīvu. Un tas ir problēma šeit. Mēs joprojām izmanto scanf. Mēs joprojām izmanto% s, kas nozīmē, mēģiniet lasīt virkni no lietotāja. Kas notiek, lai būtu jālasa s, kas, šajā brīdī, ir faktiski adrese rieciens atmiņas vai tā ir līdzvērtīga. Tas ir vārds no masīva rakstzīmju atmiņas. Bet tieši tā, ka, ja jūs lasīt virkni kas ir garāks par 49 rakstzīmēm, 49 jo jums ir nepieciešams telpu slīpsvītru 0, jūs gatavojas pārplūst ka buferšķīdums. Un jūs varētu saņemt Lucky un jāspēj uzrakstīt 51 rakstzīmi, 52, 53. Bet kādā brīdī, OS teiks, nē. Tas noteikti nav atmiņas jūs esat atļauts pieskarties. Un programma būs segfault. Tātad tur, heuristics vajadzētu būt jebkura reizi, kad jūs esat ieguvuši noteikta garuma, jums ir lai pārliecinātos, ka jūs pārbaudīt garumu un kāds tas ir jūs mēģināt lasīt to. Mērķauditorija: Tātad, lai atrisinātu, ka jūs varētu ir bijusi paziņojumu pārbaudes faktiski ir garums lielāks vai mazāks nekā? DAVID J. Malan: Protams. Jums vienkārši ir stāvoklī ka saka, ja - vai drīzāk jums nav obligāti zināt iepriekš, cik rakstzīmes lietotājs gatavojas rakstīt, jo Jums ir vistu un olu. Nav, kamēr jūs esat lasīt to ar scanf Jūs varat izrēķināt, cik ilgi tas ir. Bet tajā brīdī, tas ir pārāk vēlu, jo jūs esat jau lasīt to daži bloka atmiņas. Tā kā malā, tad CS50 bibliotēka izvairās šis jautājums vispār, atsaukšana izmantojot fgetc. Un tā nolasa vienu zīmi vienā reizē, tip-toeing kopā, zinot, ka jums nevar pārplūdes raksturs, ja jūs lasīt pa vienam. Nozvejas ir ar getstring atsaukšanu ir ka mums ir pastāvīgi atkārtoti izmēra ka rieciens atmiņas, kas ir tikai sāpes. Tas ir daudz līniju kodu, lai to izdarītu. Tāpēc cita pieeja būtu faktiski izmantot brālēns, tāpēc runāt, un scanf. Ir varianti daudz no šiem funkcijas, kas faktiski pārbaudīt garums, cik rakstzīmes Jūs varētu lasīt maksimāli. Un jūs varētu norādīt, ne lasīt vairāk nekā 50 rakstzīmes. Lai būtu cita pieeja, bet mazāk uzņem no lielākiem ieguldījumiem. Tātad jautājums 2 jautā, pieņemsim, ka versija 3 tiek apkopoti un izpildīts. Tāpēc, iespējams, ka programma segfault? Tātad šī ir faktiski tas pats atbildēt, pat ja tas izskatās mazliet mīļotājs. Mēs esam izmantojot malloc, kas jūtas kā mēs dodam sev vairāk iespēju. Un tad mēs esam atbrīvojot ka atmiņas beigās. Tas joprojām ir tikai 50 baiti atmiņas. Tāpēc mēs vēl varētu mēģināt lasīt 51, 52, 1000 bytes. Tas notiek, lai segfault par tieši tā paša iemesla dēļ. Bet ir vēl viens iemesls, too. Kas vēl varētu malloc atdevi, turklāt adrese rieciens atmiņas? Tā varētu atgriezties null. Un tāpēc, ka mēs esam ne pārbaudot ka mēs varētu darīt kaut ko stulba cita iemesla dēļ, proti, ka mēs varētu būt stāsta scanf lasīt lietotāja ievadi no klaviatūras uz 0 vietu, AKA null. Un tas arī, noteikti būs izraisīt segfault. Tātad viktorīnu ir mērķi, mēs varētu ir pieņēmuši vienu no tiem, kā pamatots iemesls. Viens no tiem ir identiska. Viens no tiem ir mazliet niansētāk. Visbeidzot, attiecībā uz programmu īstenošanai izmantošana atmiņas, kā darīt versija 2 un versija 3 atšķiras? Tātad, par to, ko ir vērts, mēs redzējām šķietami nebeidzamu piegādi ir iespējams atbildes uz to. Un starp cilvēku atbildēm, ko mēs bijām cerot, bet mēs pieņēmām citi lietas, bija daži pieminēts Fakts, ka versija 2 izmanto tā saukto kaudze. Versija 3 izmanto kaudze. Un funkcionāli, tas nav īsti darīt visu, ka daudz atšķirību. Beigās, dienā, mēs vēl tikai iegūt 50 baiti atmiņas. Bet tas bija viens no iespējamiem risinājumiem ka mēs meklē. Bet jūs redzēsiet, kā jūs saņemsiet viktorīnas atpakaļ no TFS, ka mēs to izdarījām pieņemt citus diskusijas par to atšķirīgi izmantošanas atmiņas, kā arī. Bet kaudze un kaudze būtu bijis viegli atbildēt, lai iet ar. Kādi jautājumi? Es jums Rob. ROB BOWDEN: Tātad problēma 4. Tas ir viens, kur jums bija jāaizpilda in baitu skaitu no visiem šie dažādie izmantoti. Tātad pirmā lieta, ko mēs redzam. Pieņemsim, 32 bitu arhitektūru, patīk šī CS50 ierīces. Tātad viena no galvenajām lietām, par 32 bitu arhitektūra, kas stāsta mums tieši tā, cik liels rādītājs, kas notiek būt arhitektūru. Nekavējoties, mēs zinām, ka jebkurš rādītājs veids ir 32-bitu vai 4 baiti. Tātad, aplūkojot šo tabulu, mezglā * ir rādītājs tipa. Kas būs 4 baiti. Struct mezglā *, kas ir burtiski identisks mezglu zvaigzne. Un tā tas būs 4 baiti. String, tāpēc tas nav izskatās Pointer vēl, bet typedef, virkne ir tikai char *, kas ir rādītājs tipa. Tā, ka būs 4 baiti. Tātad šie trīs ir visi 4 baiti. Tagad, mezglu un studentu ir nedaudz sarežģītāka. Tāpēc meklē mezglu un studentu, mēs redzam mezglu kā vesels skaitlis, un rādītājs. Un students ir divas norādes iekšpusē no tā. Tāpēc vismaz mūsu gadījumā šeit, kā ka mēs galu galā aprēķinot lielumu tas struktūrai ir tikai saskaitīt visu kas ir iekšā struktūrai. Tātad mezglu, mums ir vesels skaitlis, kas ir 4 baiti. Mums ir rādītājs, kas ir 4 baiti. Un tāpēc viens mezgls iet uzsākt 8 baiti. Un līdzīgi aprēķina students, mēs esam rādītājs, ka ir 4 baiti un vēl rādītājs, kas ir 4 baiti. Tā, kas notiek, lai beigtu ar to, ka 8 baiti. Tik mezglu un studentu ir 8 baiti. Un šie trīs ir visi 4 baiti. Jautājumi par šo? Jā. Mērķauditorija: Vai tas bija 64-bit arhitektūra, būtu, ka dubultā visi no tiem? ROB BOWDEN: Tas nebūtu dubultā visi no tiem. Tā 64-bit arhitektūra, tas atkal izmaiņas, kas būtiski lieta, ka rādītājs tagad ir 64 biti. Jā. Tā rādītājs ir 8 baiti. Tāpēc tie, kas ir 4 baiti būs 8 baiti. Students, kas bija divas norādes, labi, tagad tas būs ir 8 biti, 8 baiti. Tas notiek, lai 16 baiti. Bet mezgls ir 4 baiti. Tātad šis rādītājs būs būs 8 baiti. Tas ir 4 baiti. Tāpēc mezgls ir tikai gatavojas ir 12 baiti. Jebkādi citi jautājumi par šo vienu? Tātad nākamais, tie ir HTTP statusa kodi. Un jums bija, lai aprakstītu apstākļus saskaņā ar kuru šie pasākumi var jānosūta atpakaļ uz jums. viena problēma, ka es dzirdēju dažus skolēnus ir tas, ka viņi mēģināja darīt kļūdas būt par klienta beigām. Tātad, kad mēs cenšamies, lai pieprasījumu ar serveri, kaut kas nepareizi par mūsu beigām. Bet kopumā, šie kodi ir nosūta atpakaļ uz serveri. Tāpēc mēs vēlamies, lai noskaidrotu, kas notiek nepareizi vai pa labi uz servera, kas izraisa šīs lietas jāatdod. Tātad, kāpēc varētu serverī atgriežas statusa kods 200? Jebkurš domas? Jā. Tātad kaut kas par veiksmīgi pieprasījums pārdzīvoja. Un viņi varēs atgriezties ko jūs lūdza. Tātad, viss bija labi. Ko par 302 atrasts? Jā. Mērķauditorija: serveris meklē par to, ko jūs pieprasījāt. Bet tā nevarēja atrast. Tātad tur ir kļūda. ROB BOWDEN: Tātad serveris meklē to, ko jūs vēlējāties. Tik vienkārši meklē šeit, 302 atrasts, tā varēja atrast. Mērķauditorija: Es atvainojos. Konstatēts, nozīmē, ka viņi atrast. Piedodiet. ROB BOWDEN: Līdz 302 atrasts. Serveris var atrast ko jūs vēlējāties. Mērķauditorija: Bet tas nav attēlot to? ROB BOWDEN: Atšķirība starp šī 302 un 200 ir tāds, ka tas zina, ko jūs vēlaties. Bet tas nav tieši tur, kur jums gribēju jautāt. Tātad 302 ir tipisks novirzīšana. Tātad jūs pieprasījāt lapu. Tā zina, ak, es gribu atgriezties jums šo. Bet tas ir atšķirīgs URL. Tātad hey, jūs tiešām vēlaties to. DAVID J. Malan: Tas ir gabals, kas teica: ka mēs deva jums, puiši pārorientēt funkcija, kas izmanto galvenes funkciju kas, savukārt, izdrukāt atrašanās vietu, resnās zarnas, un pēc tam URL, uz kuru Jūs vēlaties, lai atteiktu lietotājam. Pat ja jūs neredzat 302 tieši tur, tas ir tas, ko PHP būtu maģiski Iekļaut galvenes sakot, tieši to, ko Rob tur teica - atrasts. Bet iet šeit vietā. ROB BOWDEN: OK. Tātad, ko par 403 aizliegti? Mērķauditorija: Es domāju, ka tas, ka serveris būtībā sakot, ka klients nevar piekļūt mājas lapā. ROB BOWDEN: Tātad, jā. Nu, tipisks atbilde mēs bijām sagaidot, ir kaut kas līdzīgs, faili nav chmodded pienācīgi. Tas ir iespējams, kādos apstākļos Jūs viņus redzēja. Bet ir iemesls, ka klienta varētu būt pie vainas šeit. Tur tiešām cita statusa kods - 401. Tāpēc tie ir ļoti līdzīgi. 401 ir neatļauta. Un 403 ir aizliegta. Un tā neatļautu jūs tikai iegūt, ja jūs neesat ienācis Bet piesakoties varētu nozīmēt ka jums ir tiesības. Bet, ja jūs esat jau pieteicies, un jūs vēl joprojām nav atļaujas, tad Jūs varat arī saņemt aizliegta. Tātad, ja jums ir pieteicies un nav atļauju, aizliegts ir arī kaut ko jūs varat saņemt. DAVID J. Malan: Un mehānisms kas šīs problēmas parasti atrisinātas servera ar ko komanda? Chmod, ja tas ir patiešām ir atļaujas izsniedz uz failu vai direktoriju. ROB BOWDEN: Tad 404 nav atrasts. Jā. Tātad, atšķirībā no 302, ja tas nav tieši kur jūs esat jautā, bet zina, ko Jūs vēlaties, tas, tas vienkārši ir ne jausmas, ko jūs vēlaties. Un jums nav lūdz kaut ko derīgu. 418 Es esmu tējkanna un pēc tam 500 iekšēja servera. Tātad, kāpēc jūs varētu saņemt, ka? Tā segfault - Es tiešām nezinu šķirošanas standarts to. Bet, ja jūsu PHP kodu bija kaut kas nepareizs tajā, teorētiski, tas varētu faktiski segfault, tādā gadījumā šis 500 iekšēja servera kļūda, kaut ir nepareizi ar savu servera konfigurācija. Vai tur ir sintakses kļūda savu PHP kodu. Vai kaut kas slikts notiek. DAVID J. Malan: Mums nebija sk segfault Starp dažiem cilvēku atbildes. Un tehniski, tas varētu notikt. Bet tas būtu PHP, programma raksta citi cilvēki, kas faktiski segfaulted, kas tikai tad, ja šie cilvēki ieskrūvē up un rakstīja buggy kodu viņu tulks būtu PHP pati segfault. Tātad, pat ja 500 ir kā segfault pēc būtības, tas ir gandrīz vienmēr rezultāts konfigurācijas failu jautājumu ar jūsu tīmekļa servera vai, kā teica Rob, sintakses kļūda, tāpat kā jūs nebija aizvērt cenas. Vai esat pazaudējis semikolu kaut kur. Mērķauditorija: Tātad Shuttle PSET, es domāju, ka tad, kad es to darīju, kad es noklikšķinājuši pārlūku, bet nekas nāca klajā, tas, ko viņi sauc par baltu lapu. Bet tas bija tāpēc, ka kodu. Es domāju, ka bija JavaScript, vai ne? ROB BOWDEN: Jā. Mērķauditorija: Vai šī kļūda vēl joprojām nākas? ROB BOWDEN: Tātad jums nebūtu gotten Šī kļūda, jo viss no tīmekļa servera viedokļa bija pilnīgi fine. Bet jūs pieprasījāt index.html. Jūs pieprasījāt shuttle.js un service.js. Un tas varēja sekmīgi atgriezties jums visiem par šīm lietām - 200. OK. Tas ir tikai tad, ja jūsu pārlūkprogrammā mēģināja interpretēt JavaScript kodu, kas tas ir tāpat, pagaidiet, tas nav derīgs JavaScript kļūda. Kādi citi jautājumi? Labi. DAVID J. Malan: Tātad nākamais up bija numurs 11. Un 11 bija scariest par daudz cilvēku. Tāpēc vissvarīgākā lieta atzīmēt šeit bija tas, ka tas, protams, par to divkārt saistīts saraksts. , Bet tas nav tāds pats kā pērn divkārt saistīts saraksts problēmas, kas nedeva jums brīdinājumu, ka sarakstu varētu, patiesībā, ir nešķirotiem. Tātad fakts, ka saraksts ir nešķirotu un tas, ka šis vārds bija uzsvērts, ka bija paredzēts, lai sniegtu ka tas ir faktiski vienkāršošana par to, kas citādi būtu bijis grūtāks problēma un garāks. Tik izplatīta kļūda šeit bija gūt vārtus pagājušā gada risinājumu jūsu vienu peidžeri un tad tikai akli kopēt ka uz leju, kā atbilde, kas ir tiesības atbildēt uz citu jautājumu līdzīgi garā. Bet nianses šeit bija šādi. Tik viens, mēs esam mezglu deklarēta un definēta kā parasti šeit. Tad mēs noteikti saraksts ir globāla rādītājs inicializēts null. Tad acīmredzot, tur ir divas funkcijas mums ir prototipus šeit, ievietot un noņemt. Un tad mums ir dažas parauga kodu šeit darīt ķekars ievietošanas. Un tad mēs lūdzam Jūs aizpildīt īstenošana ieliktņa tālāk tādā veidā, ka tas ievieto n uz sarakstu pastāvīgu laiku, arī uzsvēra, pat tad, ja tas jau ir klāt. Tā skaistums ir iespēja ievietot pastāvīgu laiku, ir, ka tas nozīmē, ka jums ir jāievieto jaunā mezglu kur? Uz priekšu. Tāpēc tas novērš, par laimi, vismaz viens no gadījumiem, kas izmantoti, lai pieprasītu vēl vairāk rindas kods, kā tas notika pagājušajā gadā un pat klasē, kad mēs runāja ar šāda veida lieta ar cilvēkiem un ar dažām verbālās pseido kodu. Tātad risinājums šeit, pieņemsim izlaist to, ka vienkārši ir redzes On ekrāns. Ievērojiet, ka mēs darām šādi. Un arī paziņojums citu vienkāršošanu bija tas, ka pat tad, ja tas ir jau klāt, tāpēc tas nozīmē, ka pat tad, ja numurs jau ir tur, jūs varat tikai akli ievietot citā tā kopiju. Un, ka, too, bija paredzēti, lai vienkāršošana, lai jūs varētu koncentrēties uz, tiešām, daži vairāk intelektuāli interesanti daļa un ne tikai daži papildu kļūdu pārbaude ņemot vērā ierobežoto laiku. Tātad šajā parauga šķīduma, mēs piešķirt rādītājs no kreisās puses otru šeit mezglā. Tagad saprotam, ka rādītāju, jo Rob teica, ir tikai 32 biti. Un tas nav faktiski satur adresi, kamēr jūs piešķirt tai adresi. Un mēs to darām, ka labās rokas pusē, izmantojot malloc. Kā labs pilsonis, mēs pārbaudām, ka malloc nav, faktiski, null, lai mums nav nejauši radīt segfault šeit. Un jebkurā laikā jūs izmantojat malloc dzīvē, jums vajadzētu pārbaudīt, null, citādi Jums ir smalks kļūda. Tad mēs sāktu šo null pēc piešķirot n un iepriekšējo un nākamo. Un šajā gadījumā šeit, es inicializēts iepriekšējā null, jo šī jaunā mezglā būs jauno sākumā manā sarakstā. Tāpēc tur būs nekas pirms tam. Un es gribu, lai būtībā pievienot esošo sarakstu ar jaunu mezglu, ko nosakot blakus vienāds uzskaitīt sevi. Bet es neesmu darījis tikai yet. Tātad, ja pats saraksts jau pastāv, un tur ir vismaz viens mezgls jau ir, ja tas ir saraksts šeit un es ievietojiet jaunu mezglu šeit, es ir nepieciešams, lai pārliecinātos, ka mans bijušais mezgls norāda atpakaļ uz savu jauno mezglu, jo tas ir, atkal, divkārt saistīts saraksts. Tāpēc mēs darām veselība pārbaudītu. Ja saraksts nav nulle, ja tur ir jau vienu vai vairākiem punktiem tur, tad piebilst, ka atpakaļ atsauci, lai runāt. Un tad ir ļoti pēdējā lieta, mums ir nepieciešams to darīt, ir faktiski atjaunot globālo mainīgo sarakstu sevi norādīt ar šo jauno mezglu. Jā. Mērķauditorija: In rādītāja bultiņas [Dzirdams] ir vienāds ar null, tas, ka nodarbojas ar sarakstu, jo saraksts ir nulle? DAVID J. Malan: Nē. Tas ir tikai man ir proaktīvi uzmanīgi, jo, ja tas ir mans Sākotnējais saraksts ar varbūt vēl daži mezgliem vairāk nekā šeit, un es esmu ievietojot manu Jaunais mezglā nekā šeit, tur būs būt nekas vairāk nekā šeit. Un es gribu, lai attēlotu, ka ideja nosakot iepriekšējā null par jauno mezglu. Un, iespējams, ja mans kods ir pareizs un tur nav citu veidu, kā ievietot mezglu, kas nav šo funkciju, domājams, pat ja sarakstā jau ir viens vai vairāki mezgli tajā, iespējams, Sarakstā pirmais mezglā, būtu iepriekšējais rādītājs Null pati. Mērķauditorija: Un tikai pēcpārbaudes. Iemesls, jūs nodot rādītājs nākamās vienāds sarakstu jūs gūstat rādītāju Pirms saraksts, ka tā ir vērsta uz nākamo, es domāju - I Don 't - tikai saraksti? DAVID J. Malan: Tieši tā. Un tāpēc pieņemsim patiesībā ir divas lietas šeit tiešām, lai gan pasūtījums mēs uzskata tos nav diezgan tāds pats kā kodu. Bet augstā līmenī, ja tas ir sarakstu, un tas ir 32-bit rādītājs, vienkāršākais scenārijs ir ka tas ir spēkā pēc noklusējuma. Un domāju, ka es gribu, lai ievietotu numuru 50 bija pirmais numurs. Tāpēc es esmu gatavojas iet uz priekšu un piešķirt mezglu, kas notiek ar satur trīs jomas - n, iepriekšējais un nākamais. Es esmu gatavojas nodot skaits 50 šeit, jo tas būs n. Tas būs nākamais. Un tas būs iepriekšējais. Un tā, ko man darīt šajā gadījumā? Nu, es esmu tikko veikts līnija 1 šeit. Pointer n saņem n. Es pēc tam sakot, iepriekšējā vajadzētu saņemt null. Tātad šis būs nulle. Tad es esmu gatavojas teikt nākamo gatavojas saņemt sarakstu. Un tas tikai darbojas labi. Tas ir null. Un tāpēc es saku, jaunais mezgls nākamās paaudzes jomā vajadzētu saņemt neatkarīgi no tā. Tāpēc, ka tā ir vēl viens null tur. Un tad pēdējā lieta Man ir pārbaudīt šeit. Ja saraksts nav vienāds ar nulli, bet tas ir vienāds ar nulli, tāpēc mēs izlaist šo vispār. Un tā viss man blakus ir saraksts kļūst rādītājs, kas gleznieciski rezultātā attēlu, piemēram, ka. Tātad tas ir viens scenārijs. Un viens, ka tu jautā par īpaši ir situācija, piemēram, tas, kur mums jau ir viena mezglu sarakstu. Un, ja es dodos atpakaļ uz augšu oriģinālā Problēma paziņojumu, nākamais Mēs ievietot teiksim ir 34, tikai labad diskusijas. Tāpēc es esmu gatavojas tikai ērti izdarīt, ka vairāk nekā šeit. Esmu tikko malloced. Pieņemsim, ka es esmu pārbaudot null. Tagad es esmu gatavojas, lai sāktu n, ir 34. Un tas būs n. Tas būs nākamais. Un tas būs iepriekšējais. Pieņemsim, pārliecinieties, ka man nebija saņemt šo atpakaļ. Iepriekšējais ir pirmajā vietā definīcijā. Ļaujiet man noteikt šo. Tas ir iepriekšējais. Tas ir blakus. Pat ja tie ir identiski, pieņemsim glabā to konsekventa. Iepriekšējā. Tas ir blakus. Tāpēc es tikko malloced manu piezīmi, pārbauda Null, piešķir 34 uz mezglā. Iepriekšējā izpaužas null. Lai dod man to. Nākamais izpaužas sarakstā. Tāpēc saraksts ir tas. Tāpēc tas ir tas pats, kas tagad zīmējumu tas arrow, lai tie norādītu uz vienu pats. Un tad es esmu pārbaudīt, vai saraksts nav vienāds ar nulli. Un tas ir ne šoreiz. Tad es esmu gatavojas darīt sarakstu iepriekšējā izpaužas rādītāju. Tāpēc uzskaitīt iepriekšējā izpaužas PTR. Tāpēc tas ir sekas, liekot grafisko arrow šeit. Un tas kļūst nedaudz viļņaina, līnijas. Un tad, visbeidzot, es atjaunināt sarakstu, lai norādītu uz rādītāju. Tāpēc tagad tas norāda uz šo puisis. Un tagad, pieņemsim do ātri veselība pārbaudītu. Šeit ir saraksts, kas ir globālo mainīgo. Pirmais mezgls ir, protams, 34, jo Es esmu pēc šīs bultiņas. Un tas ir pareizi, jo es gribu ievietot sākumā saraksta visi jaunie mezglu. Viņa nākamais lauka man liek šo puisis. Ja es glabāt notiek, es hit nākamais ir nulle. Tāpēc tur vairs sarakstā. Ja es hit iepriekšējā, man atpakaļ, ja es gaidīt. Tā vēl joprojām ir dažas norādes, protams, manipulēt. Bet fakts, ka jums bija teicis darīt tas pastāvīgi laikā nozīmē, ka jūs tikai ir ierobežots vairākas lietas jums ir tiesības to darīt. Un kas ir šis numurs? Tas varētu būt viens solis. Tas varētu būt divi. Tas varētu būt 1000 pakāpieni. Bet tas ir ierobežots, kas nozīmē, ka jūs nevarat ir jebkāda veida looping notiek šeit nav rekursijas, ne cilpas. Tas ir tikai tagad ir iekodēts līnijas kodu, kā mēs esam šajā paraugā. Tātad nākamais problēma 12 lūdza mūs pabeigt īstenot izdzēst turpmāk tādā veidā, ka tas noņem n no saraksta lineāro laiku. Tātad jums ir mazliet vairāk valstīties telpā tagad. Jūs varat pieņemt, ka n, ja klāt sarakstā, būs klāt ne vairāk kā vienu reizi. Un tas arī ir domāts, lai būtu viktorīna balstīta vienkāršojot pieņēmums, tāpēc ka, ja jūs atradīsiet skaits 50 kaut kur sarakstā, jums nav arī jāuztraucas par to turpināt atkārtot, meklē katru iespēju kopiju 50, kas vienkārši nodot uz kādu minutia ierobežotā laikā. Tātad ar novilkt, tas viens bija noteikti grūtāks un vairāk kodu rakstīt. Bet pēc pirmā acu uzmetiena, godīgi sakot, tas varētu izskatās milzīgs, un, piemēram, kaut ko nav veids, kā jūs varētu būt nākt klajā ar uz viktorīnas. Bet, ja mēs koncentrējamies uz atsevišķiem posmiem, Cerams, ka tā pēkšņi streikot, ka katrs no šiem atsevišķajiem pasākumi rada acīmredzamu jēga retrospektīvi. Tātad, pieņemsim to apskatīt. Tātad, pirmkārt, mēs sāktu rādītāju lai būtu uzskaitīt sevi. Jo es gribu lineārā laika, tas nozīmē Es esmu gatavojas ir dažas cilpas. Un kopīgs veids, kā atkārtot vairāk mezgliem saraksta struktūrā vai jebkāda veida struktūras iteratīvi ir veikt rādītāju uz priekšu no datu struktūra, un tad sāciet atjaunināšanu to un iet savu ceļu caur datu struktūru. Tāpēc es esmu gatavojas darīt tieši to. Bet rādītājs, mana pagaidu mainīgo, nav vienāds ar nulli, pieņemsim iet uz priekšu un pārbaudīt. Vai es paveiksies? Ir n lauks mezglā es esmu šobrīd meklē vienāds ar numurs, es esmu meklē? Un ja tā, pieņemsim kaut ko darīt. Tagad, pamanīt to, ja nosacījums ieskauj visu Šādas rindas kodu. Tas ir vienīgais, ko es rūp - atrast virkni jautājumu. Tāpēc nav cits, kas vienkāršo lietas konceptuāli mazliet. Bet tagad, es sapratu, un jums varētu būt tikai sapratu, tas pēc domāšanas tai cauri mazliet, tur faktiski divas lietas šeit. Viens ir, ja mezgls ir at sākot no saraksta, kas mazliet kaitinošas, jo tas ir īpašs gadījums, jo jums ir galā ar šo lietu, kas ir vienīgā anomālija. Visur citur sarakstā, tas pats. Tur iepriekšējā mezglu un nākamais mezglā, iepriekšējais mezglu, blakus mezglā. Bet tas puisis ir nedaudz īpašs ja viņš ir sākumā. Tātad, ja rādītājs ir vienāds sarakstu pats par sevi, tādēļ, ja Es sākumā sarakstu un man ir konstatēts n, man vajag darīt pāris lietas. Viens, man ir nepieciešams, lai mainītu sarakstu norāda uz nākamo lauku, 50. Tāpēc domāju, ka es cenšos noņemt 34. Tātad šis puisis dabūja iet prom tikai brīdi. Tāpēc es esmu gatavojas teikt, sarakstu izpaužas Pointer nākamo. Nu, tas ir rādītājs. Nākamais ir vērsta vairāk nekā šeit. Tāpēc tas mainās šo arrow tiesības Tagad, lai norādītu uz šo puisis šeit. Tagad, atcerieties, mums ir pagaidu mainīgo. Tāpēc mēs neesam bāreņiem nekādus mezglus, jo man arī ir šī puisis manā īstenošanu Noņemt. Tāpēc tagad, ja saraksts pats par sevi nav null, Man vajag, lai noteiktu mazliet kaut ko. Man vajag, lai tagad, lai pārliecinātos, ka tas bultiņa, , kas iepriekš ir vērsta 50-34, tas ir ieguvuši, lai iet prom, jo, ja es cenšos atbrīvoties no 34, 50 bija labāk nav saglabāt jebkādu veida atpakaļ atsauce uz to, kā arrow ierosināts. Tāpēc es vienkārši darīju šo līniju. Tātad, tad es esmu darījis. Šī lieta ir faktiski diezgan viegli. Nocērtot galvu saraksta ir salīdzinoši vienkārša. Diemžēl, tas ir kaitinošas cits bloks. Tāpēc tagad man ir izskatīt lietu ja tur ir kaut kas pa vidu. Bet tas nav pārāk briesmīgi, izņemot par sintaksi, kā šis. Tātad, ja es neesmu sākumā sarakstu, es esmu kaut kur pa vidu. Un šī līnija šeit saka, sākums Pie kāda mezglā jūs esat. Doties uz iepriekšējo mezglu nākamo lauku un norāda, ka rādītāja. Darīsim to ar piktogrammām. Tas bija kļūst sarežģīti. Tātad, ja man ir iepriekšējās lauki šeit - Darīsim to - nākamie lauki šeit. Es esmu gatavojas vienkāršot manas norādes, nevis nekā izdarīt visu ķekars lietas un atpakaļ crisscrossing otru. Un tagad, pieņemsim tikai teikt, tas ir 1, 2, 3 labad diskusijas, pat ja tas nesakrīt ar problēma. Tātad, šeit ir mana saistīts saraksts. Es cenšos, lai novērstu divas šajā īpaši versiju stāsts. Tāpēc es esmu atjaunināts rādītāju ir vērsta uz šo puisi. Tāpēc tas ir PTR. Viņš norāda šeit. Šis ir saraksts, kas pastāv pasaulē kā iepriekš. Un viņš norāda šeit, vienalga ko. Un tagad, es cenšos, lai novērstu divas. Tātad, ja rādītājs ir vērsta šeit, es esmu gatavojas sekot, acīmredzot, iepriekšējais rādītājs, kas liek man uz 1. Es esmu tam gatavojas teikt, ka nākamais jomā, kas nes mani vairāk uz šo kaste šeit, gatavojas vienāds rādītājs nākamo. Tātad, ja šis rādītājs, tas ir blakus. Tas nozīmē, ka šis arrow vajadzībām lai norādītu uz šo puisis. Tātad, kas tas līnija kods ir tikai darīts, ir mazliet par to. Un tagad, tas ir meklējat, piemēram, solis pareizā virzienā. Mēs galvenokārt gribam drēbnieks 2 out gada vidū 1 un 3. Tātad, tas ir jēga, ka mēs vēlamies, lai maršruta šo rādītāju ap to. Tātad šis nākamais rindā ir pārbaudīt, ja rādītājs Nākamais nav null, tur ir tiešām kāds pa labi 2, tas nozīmē, ka mums ir arī jādara mazliet griezt šeit. Tāpēc man tagad ir nepieciešams ievērot šo rādītāju un atjaunināt iepriekšējo rādītāju uz tas puisis darīt mazliet PROFILAKSE šeit punktu šeit. Un tagad, vizuāli tas ir jauki. Tas ir mazliet netīrs, jo tur ir neviens norādot uz 2 vairs. 2 ir vērsta uz kreiso pusi. Un 2 ir vērsta uz labo pusi. Bet viņš var darīt visu, ko grib, jo viņš ir apmēram, lai saņemtu atbrīvots. Un tas nav svarīgi, ko šīs vērtības ir vairs. Kas ir svarīgi ir tas, ka atlikušais puiši maršrutēšanas iepriekš un zem viņu tagad. Un, protams, tas, ko mēs darām tālāk. Mēs free rādītājs, kas nozīmē, ka mēs pateikt operētājsistēmu, jūs esat laipni atgūt to. Un tad visbeidzot, mēs atgriežamies. Else netieši, ja mēs vēl nav atgriezušies, mēs esam ieguvuši, lai saglabātu meklējat. Tā rādītājs ir vienāds rādītājs blakus tikko nozīmē pārvietot šo puisis šeit. Pārvietot šo puisis šeit. Pārvietot šo puisis šeit, ja, patiesībā, mēs neatradām numuru mēs meklējam vēl. Tik atklāti, tas izskatās pilnīgi milzīgs, es domāju, ka sākumā skatienu, it īpaši, ja esat cīnījušies ar šo viktorīnu laikā, tad redzētu kaut kas līdzīgs šim. Un jūs pat sevi par atpakaļ. Nu, nav veids, kā es varētu būt nākt klajā ar to uz viktorīnas. Bet es teiktu, jūs varat, ja jūs pauze tā uz leju šos individuālo gadījumos un tikai staigāt pa to uzmanīgi, lai gan, protams, saskaņā stresa apstākļos. Par laimi, situācija, kas viss laimīgāki. Jūs varētu izdarīt šo jebkurš vairāki veidi. Jums nav darīt to crisscrossing lieta šeit. Jūs varētu darīt to ar taisnu līnijas, kā šis. Bet būtība no šīs problēmas, jo Kopumā bija saprast, ka attēlu beigās vajadzētu izskatīties nedaudz kaut kas līdzīgs šim, jo, pastāvīgs laiks nozīmēja, ka jums saglabāt traucēšanas un traucēšanas un traucēšanas jaunas virsotnes sākumā saraksta. Kādi jautājumi? Iespējams, vislielākās grūtības protams kodēšanas jautājumiem. Mērķauditorija: Tā ir saraksts līdzīgs galvu iepriekšējos piemēros. DAVID J. Malan: Tieši tā, tieši tā. Tikai atšķirīgu nosaukumu globālo mainīgo. Visā pasaulē, ko? ROB BOWDEN: OK. Tāpēc tas ir viens, kur jūs bija rakstīt rindkopu. Daži cilvēki rakstīja esejas par šo jautājumu. Bet jūs vienkārši nepieciešams, lai izmantotu šos sešus terminus lai aprakstītu to, kas notiek, kad Jūs mēģināt sazināties facebook.com. Tāpēc es ņemšu tikai runāt caur process izmantojot visus šos terminus. Tātad mūsu pārlūku, mēs tipa facebook.com un hit Enter. Tātad mūsu pārlūku gatavojas būvēt HTTP pieprasīt, ka tas notiek, lai nosūtītu caur kādu procesa facebook Facebook atbildēt uz mums ar HTML tās lapas. Tātad, kas ir process, kas HTTP pieprasījums faktiski izpaužas Facebook? Tātad, pirmkārt, mums ir nepieciešams tulkot Facebook.com. Tik vienkārši, ņemot vērā vārdu Facebook.com, ja tiešām HTTP pieprasījumu jāiet? Tāpēc mums ir nepieciešams tulkot Facebook.com uz IP adresi, kas unikāli nosaka, kāda mašīna mēs faktiski vēlaties nosūtīt šo lūgumu. Jūsu klēpjdators ir IP adrese. Jebkas savienots ar internetu IP adrese. Tātad DNS, Domain Name System, kas ir kas notiek rīkoties tulkojumu no facebook.com ar IP adresi, kas Jūs tiešām vēlaties, lai sazinātos. Tātad mēs sazināties ar DNS serverus un teiksim, kas ir facebook.com? Tajā teikts, ak, tas ir IP adrese 190,212 kaut ko, kaut ko, kaut ko. Labi. Tagad es zinu, ko mašīna Es gribu, lai sazinātos. Tātad jūs sūtiet savu HTTP pieprasījumu vairāk nekā uz šo mašīnu. Tātad, kā tas nokļūt uz šo mašīnu? Nu, pieprasījums iet no router maršrutētāju veselīgs. Atcerēties piemēru klasē, kur Mēs tiešām redzēju maršrutu, ka paketes notika, kad mēs mēģinājām lai sazinātos. Mēs redzējām, ka lēkt pāri Atlantijas okeānam Ocean ir viens punkts vai neatkarīgi. Tātad pēdējais termiņš osta. Tāpēc tagad tas ir jūsu datorā. Jums var būt vairākas lietas, kas pašlaik communicating with the internetu. Lai es varētu darboties, piemēram, Skype. Es varētu būt interneta pārlūku atvērtu. Es varētu būt kaut kas torrenting failus. Tātad visas šīs lietas ir communicating with internetā kaut kādā veidā. Tātad, ja jūsu dators saņem dažus datus no interneta, kā to dara zināt, cik pieteikumu faktiski grib datus? Kā tas zināms, vai šis konkrētais dati tiek domāts torrenting pieteikumu pretstatā uz interneta pārlūku? Tātad šis ir mērķis ostām, kas visi no šiem pieteikumiem ir apgalvoja portu datorā. Tātad jūsu interneta pārlūku saka, hey, Es esmu klausoties portu 1000. Un jūsu torrenting programma saka, Es esmu klausoties portu 3000. Un Skype saka, es esmu, izmantojot portu 4000. Tātad, ja jums daži dati, kas pieder uz vienu no šiem pieteikumiem, datu ir marķēta ar kuru ostas faktiski jāsūta līdzi. Tātad šis saka, ak, es piederu ostā 1000. Es zinu, tad man ir nepieciešams nosūtīt šo gar manu interneta pārlūku. Tā iemesls, tas ir būtiski šeit ir tas, ka web serveri mēdz klausīties par ostas 80. Tātad, kad es sazināties Facebook.com, es esmu sazinoties ar kādu mašīnu. Bet man ir nepieciešams pateikt, kurš ostu, kas mašīna Es gribu, lai sazinātos ar jums. Un web serveri mēdz būt klausīšanās par ostas 80. Ja viņi vēlas, viņi var noteikt to augšu, lai tā sarakstus, kā par ostas 7000. Un tad interneta pārlūku, es varētu manuāli veida Facebook.com: 7000 līdz nosūtīt pieprasījumu ostā 7000 no Facebook tīmekļa serveri. DAVID J. Malan: Un šajā gadījumā, pat tad, lai gan mums neprasīja, ka cilvēki min to, šajā gadījumā, ko port būtu lūgums faktiski iet uz? Mēģiniet vēlreiz. Tieši tā. Nemeklē, taču veiklība tas tur nav pēdējā. ROB BOWDEN: Tātad HTTPS, jo tas ir klausīšanās īpaši šifrēta, tas ir par ostas 4430. Mērķauditorija: un e-pastus, ir 25, vai ne? DAVID J. Malan: Outbound e-pastus, 25, yep. ROB BOWDEN: Man nav pat zināt, lielākā daļa - visi apakšējo tiem mēdz būt rezervēts lietām. Es domāju, ka viss zem 1024 ir rezervēts. Mērķauditorija: Kāpēc jūs sakāt 3 bija nepareizs skaitlis? ROB BOWDEN: Jo IP adresi, tur ir četri grupējumu cipariem. Un viņi ir no 0 līdz 255. Tāpēc 192.168.2.1 ir kopīgs lokālā tīkla IP adresi. Paziņojuma visi no tiem ir mazāks nekā 255. Tātad, kad es sāku ar 300, kas varētu nav iespējams būt ir viens no numuriem. DAVID J. Malan: Bet tas muļķīgi klips no - tas bija CSI, kur viņi bija numuru, kas ir pārāk liels IP adresi. ROB BOWDEN: Kādi jautājumi par šo? Nākamo, tik pilnīga maiņa topic, bet mums ir šis PHP masīvs mājas, kas quad. Un mums ir Nekārtots saraksts. Un mēs gribam izdrukāt saraksta elementu vienkārši satur mājas nosaukumu. Tāpēc mums ir foreach cilpa. Līdz ar to atcerēties, sintakse ir foreach masīvs kā posteni masīvā. Tāpēc ar katru atkārtojuma cilpas, house notiek, lai uz vienu no vērtības iekšpusē masīva. Par pirmā atkārtojuma, māja būs Cabot House. Par otrajā atkārtojuma, māja būs būt Courier Māja un tā tālāk. Tāpēc katram quad kā mājā, mēs esam tikai gatavojas drukāt - jūs arī varētu būt piebalsoja - saraksta elements, un tad māju nosaukums un pēc tam aizveriet saraksta elementu. Cirtaini bikšturi ir obligāti šeit. Un tad mēs arī teica jautājumā sevi, atcerieties, lai aizvērtu Nekārtots saraksts tag. Tāpēc mums ir nepieciešams, lai izietu PHP režīma Lai to paveiktu. Vai mēs būtu varējuši piebalsoja aizvērt Nenumurēts saraksts tag. DAVID J. Malan: Arī fine šeit būtu ir izmantot veco skolu cilpa ar $ i = 0 0 un, izmantojot skaitu uz izrēķināt garumu ray. Pilnīgi naudas sodu arī vienkārši nedaudz wordier. Mērķauditorija: Tātad, ja jūs gatavojas [Dzirdams], tu darītu - Es aizmirst to, ko cilpa [nedzirdama] ir. Vai jums $ quad kronšteinu i? DAVID J. Malan: Tieši tā. Jā, tieši tā. ROB BOWDEN: kaut kas cits? DAVID J. Malan: Nu labi. Kompromisi. Tāpēc bija ķekarus atbildes iespējams, katrs no tiem. Mums bija tiešām tikai meklē kaut pārliecinoši par otrādi un negatīvie. Un skaitlis 16 jautāja, apstiprinot lietotāju ieeja klienta puses, jo ar JavaScript, nevis servera pusē, jo ar PHP. Tātad, kas ir otrādi un darot klienta pusē? Nu, viena no lietām, ko mēs ierosinājām, ir ka jūs samazināt latentuma, jo jums nav apnikt sazinoties servera, kas var aizņemt dažas milisekundes vai pat pāris sekundes izvairoties no ka, un tikai apstiprināšanu lietotāju ievades klienta puses pa izraisot on-iesniegt kopējs un tikai pārbaudīt, viņi ierakstiet kaut kas par vārdu? Vai viņi kaut ko rakstīt in e-pasta adresi? Viņi izvēlas kopmītnes, no drop-down menu? Jūs varat dot viņiem tūlītēju atgriezenisko saiti izmantojot gigahercu datoru vai kāds viņi ir, ka tas faktiski par viņu galda. Tātad, tas ir tikai labāku lietotāju pieredze parasti. Bet negatīvie to darīt klienta puses validācija, ja jūs darīt to bez arī darot servera puses validāciju ir tas, ka lielākā daļa ikviens, kas nāk no CS50 zina ka jūs varat nosūtīt jebkuru informāciju, ko vēlaties serverī jebkuru vairākos veidos. Atklāti sakot, vairumā jebkuru pārlūku, jūs varat noklikšķiniet pa iestatījumiem, un tikai izslēgtu JavaScript, kas būtu, Tāpēc, atslēgt jebkādu validācija. Bet jūs arī varētu atgādināt, ka pat es bija daži mistiskā lietas klasē, izmantojot telnet un faktiski izliekoties ir pārlūku, nosūtot get pieprasījumus uz serveri. Un tas, protams, nav izmantojot jebkuru JavaScript. Tas ir tikai man rakstīt komandas ar klaviatūru. Tik tiešām, kāds programmētājs laikā pietiekami komforts ar web un HTTP var nosūtīt neatkarīgi datus, kurus viņš vai viņa vēlas serverī bez apstiprināšanas. Un, ja jūsu serveris nav arī pārbaudīt, viņi dod man vārdu, ir tas patiesībā derīgu e-pasta adresi, darīja viņi izvēlas kopmītnes, jūs varētu beigties up ievietojot viltus vai tikai tukša datu savā datu bāzē, kas, iespējams, nav būs labi, ja jūs pieņemot, ka tas bija tur. Tāpēc tas ir kaitinošas realitāte. Bet vispār, klienta puses validācija ir lieliski. Bet tas nozīmē, divreiz tik daudz darba. Kaut gan patiešām pastāv dažādas bibliotēkas, JavaScript bibliotēkas Piemēram, kas padara to daudz, daudz mazāk galvassāpes. Un jūs varat atkārtoti daži kodu servera puses, klienta puses. Bet saprast, ka tas ir parasti papildu darbs. Jā. Mērķauditorija: Tātad, ja mēs vienkārši teica, ka tik droši - DAVID J. Malan: [smejas] Ugh. Tie vienmēr ir grūtāk tiem jālemj. ROB BOWDEN: Tas būtu Ir pieņemts. DAVID J. Malan: Kas? ROB BOWDEN: Es izveidojis šo problēmu. Kas būtu pieņemts. DAVID J. Malan: Jā. Mērķauditorija: Cool. ROB BOWDEN: Bet mēs nepieņēma par pirmo - labi, ko mēs meklējam, ir kaut kā jums nav komunicēt ar serveri. Mēs nepieņēma tikai ātrāk. Mērķauditorija: Kas par nav pārlādēt lapu? ROB BOWDEN: Jā. Tas bija pieņemts atbilde. DAVID J. Malan: kaut kur mēs filcs tas bija vairāk iespējams nekā nav iespējams ka jums zināja, ko jūs bijāt sakot, kas ir grūts līnija izdarīt reizēm. Izmantojot saistīts saraksts vietā masīva saglabātu sakārtoti sarakstu veseli skaitļi. Tāpēc otrādi, mēs bieži citē ar saistīti saraksti, kas motivēja viņu visu ieviešana bija jums dinamiku. Tās var augt. Tās var sarukt. Tātad jums nav, lai izlēkt ar stīpām faktiski radītu vairāk atmiņas ar masīvu. Vai arī jums nav tikai saka, žēl, lietotājs. Masīvs ir piepildīta. Tik dinamiska izaugsme saraksta. Negatīvie gan savienoto sarakstiem? Mērķauditorija: Tas ir lineāra. Meklējot saistīta sarakstā ir lineāra nevis to, ko jūs log in DAVID J. Malan: Tieši tā. Meklējot saistītajā sarakstā ir lineāra, pat ja tas ir sakārtots, jo jūs varat tikai sekot šiem maizes drupatas, šie norādes, no sākuma saraksta līdz galam. Jūs nevarat sviras brīvpieejas un, Tādējādi, bināro meklēšanu, pat ja tas ir sakārtoti, lai jūs varētu darīt ar masīvu. Un tur ir arī citu izmaksu. Jā. Mērķauditorija: Memory neefektīvi? DAVID J. Malan: Jā. Nu, es nebūtu obligāti saka neefektīva. Bet tas izmaksās jums vairāk atmiņas, jo jums ir nepieciešams 32 bitus ik mezglu par papildu rādītāju, pie Vismaz par atsevišķi saistīta sarakstā. Tagad, ja jūs tikai uzglabāt skaitļu un jūs pievienojot rādītāju, kas ir faktiski veida nav triviāla. Tas divkāršot atmiņas. Bet patiesībā, ja jūs uzglabāt saistīts saraksts structs, kas varētu būt 8 biti, 16 biti, vēl vairāk par to, varbūt tas ir mazāk ar zemām izmaksām. Bet tas ir izmaksas tomēr. Tātad vai nu no tiem būtu esam bijis labi kā ēnas. 18. Izmantojot PHP, nevis C rakstīt komandrindas programmu. Tātad šeit, tas bieži vien ātrāk, lai izmantotu valodas, piemēram, PHP vai Ruby vai Python. Jūs vienkārši ātri atvērtu up teksta redaktoru. Jums ir daudz vairāk funkcijas pieejams jums. PHP ir virtuves izlietne funkciju, tā kā C, jūs ir ļoti, ļoti maz. Patiesībā, puiši zina, cietā veidā ka jums nav hash tabulas. Jums nav saistīti sarakstus. Ja vēlaties tos, jums ir īstenot tos pats. Tātad viena otrādi PHP, vai tiešām visiem interpretē valoda ir ātrums ar kuru jūs varat rakstīt kodu. Bet negatīvie, mēs redzējām to, kad es ātri saputota up Misspeller īstenošana lekciju, izmantojot PHP, ir ka, izmantojot interpretēt valodu parasti ir lēnāka. Un mēs redzējām, ka acīmredzami ar pieaugums laikā no 0,3 sekundēm līdz 3 sekundes, jo interpretācijas , kas patiesībā notiek. Vēl viens otrādi bija, ka jums nav sastādīt. Tātad tas arī paātrina attīstību starp citu, jo jums nav Divi soļi, lai programmas palaišanas. Jums tikai viens. Un tā tas ir diezgan pārliecinoši, kā arī. Izmantojot SQL datu bāzi, nevis CSV failu, lai saglabātu datus. Tātad SQL datu bāze tiek izmantota pset7. CSV failus neizmantoja daudz. Bet tu to izmanto netieši pset7 kā labi, runājot ar Yahoo Finance. Bet CSV ir tāpat kā Excel failā, bet super vienkārši, ja kolonnas ir vienkārši demarked ar komatiem iekšpusē no citādi teksta failu. Un, izmantojot SQL datu bāzē ir nedaudz vairāk pārliecinoša. Tas ir otrādi, jo jūs saņemsiet lietas piemēram, izvēlēties un ievietot un izdzēst. Un jums, iespējams, indeksi, kas MySQL un citām datu bāzēm, piemēram, Orākuls, izveidot jums atmiņā, kurā nozīmē, ka jūsu izvēlēties, iespējams, nav būs lineāra augšas uz leju. Tas tiešām būs kaut kas piemēram, bināro meklēšanu vai kaut ko līdzīgi garā. Tāpēc viņi parasti ātrāk. Bet negatīvie ir tas, ka tas ir tikai vairāk darba. Tas ir vairāk pūļu. Jums ir jāsaprot datu bāzes. Jums ir noteikt to uz augšu. Jums ir nepieciešams serveris, lai palaistu ka datu bāze. Jums ir nepieciešams, lai izprastu kā konfigurēt to. Tātad šie ir tikai tie veida kompromisiem. Tā kā CSV failu, jūs varat izveidot to ar gedit. Un jūs labi iet. Nav sarežģīti ārpus tā. Izmantojot Trie vietā hash tabulas ar atsevišķu Virknējuma lai uzglabātu vārdnīca vārdiem, kas atgādina gada pset5. Tāpēc mēģina otrādi, teorētiski vismaz, ir tas, ko? Nemainīgs laiku, vismaz, ja jūs esat sajaukšanai ar katru no indivīda burti vārdu, kā jūs varētu būt par pset5. Tas varētu būt pieci hashes, seši hashes, ja tur ir piecas vai sešas burti vārdā. Un tas ir diezgan laba. Un, ja tur ir augšējo robežu, kā ilgi jūsu vārdiem, varētu būt, ka tas patiešām asimptotiski nemainīgs laiku. Tā hash tabulu ar atsevišķu Ķēžu, problēma ir ar to veida datu struktūra ir tāda, ka veiktspēju jūsu algoritmu parasti atkarīgs no vairākiem lietas jau datu struktūru. Un tas noteikti ir gadījums ar ķēdēm, ar kuru vairāk sīkumi jūs likts uz hash tabulu, ilgāk tos ķēdes iet, kas nozīmē, sliktākajā lieta, ko jūs varētu meklē ir visu ceļu beigās vienu no ķēdēm, kas efektīvi devolves kaut lineārā. Tagad praksē, tas varētu pilnīgi būt gadījums, ka hash tabulu ar ķēdes ir ātrāk nekā atbilst trie īstenošanu. Bet tas ir dažādu iemeslu dēļ, tai skaitā , kas mēģina izmantot visai daudz atmiņa, kas var faktiski, lēni lietas uz leju, jo jūs nesaņemat jauki priekšrocības, ko sauc caching, ja lietas, kas ir cieši kopā atmiņā var piekļūt bieži vien ātrāk. Un dažreiz jūs varat nākt klajā ar ļoti labs hash funkciju. Pat ja jums ir, lai atkritumu mazliet atmiņa, jūs varētu, protams, jābūt iespējai atrast lietas, ātri un nav tik slikti, kā lineāri. Tātad īsi sakot, nebija obligāti ar kādu no šiem vienu vai pat divas īpašas lietas, ko mēs meklējām. Tiešām kaut pārliecinošs kā otrādi, un negatīvie parasti nozvejotas mūsu acs. ROB BOWDEN: Tātad otrādi, mēs darījām nepieņem pati "ātrāk." Jums bija kaut ko teikt par to. Pat ja jūs teicāt teorētiski ātrāk, Mēs zinājām, ka jūs veida saprot ka tas ir 0 no 1. Un hash tabulu, teorētiski, nav 0, 1. Pieminēt kaut ko par runtime parasti got jums punktus. Bet "ātrāk", lielākā daļa no risinājumiem, liela valde, kas tika mēģina bija objektīvi lēnāk nekā risinājumi kas bija hash tabulas. Tāpēc ātrāk un pats par sevi nav īsti taisnība. DAVID J. Malan: Dom de dom dom. Es droši vien esmu vienīgais, kas saprot tas, kā tas ir paredzēts, lai jāizrunā, vai ne? ROB BOWDEN: Man bija tiešām ne jausmas. DAVID J. Malan: Tas lika sajūtu manā galvā. ROB BOWDEN: Es esmu darot šo vienu. OK. Tāpēc tas ir viens, kur jums bija izdarīt diagramma līdzīgi jums varētu esmu redzējis uz iepriekšējiem eksāmeniem. Tāpēc pieņemsim tikai apskatīt šo. Tāpēc no HTML mezglā, mums ir divas bērni, galvas un ķermeņa. Tāpēc mēs filiāle - galvu un ķermeni. Galva ir nosaukums tag. Tāpēc mums ir nosaukums. Tagad, viena lieta, daudzi cilvēki aizmirsu, ka šie teksta mezgli elementi ietvaros šo koku. Tāpēc šeit mēs gadās izdarīt tos kā ovāli lai atšķirtu tos no šiem veidi mezglu. Bet paziņojums ir arī šeit mums ir top, vidus un lejas galu galā ir teksta mezgli. Tātad, aizmirstot, kas bija nedaudz kopēja kļūda. Ķermenis ir trīs bērni - šie trīs divs. Tātad, div, div, div un pēc tam teksta mezglu bērni šo divs. Tas ir diezgan daudz to Attiecībā uz šo jautājumu. DAVID J. Malan: Un tas ir vērts atzīmēt, pat ja mums nav aiztures par šiem detaļas, kad mēs tērējam JavaScript, ka rīkojums nav, jo Fakts, jautājums tehniski. Tātad, ja galva nāk pirms organismā HTML, tad tam vajadzētu parādīties uz pa kreisi no ķermeņa faktisko DOM. Ka viņa ir, vispār, tikai FYI, kaut ko sauc par dokumentu rīkojumu, kurā tas nav jautājums. Un, ja jūs īstenot parsētājs, programma, kas skan HTML ēkā up koku atmiņā, ja godīgi, tas ir intuitīvi iespējams, ko jūs anyway - no augšas uz leju, kreisās uz labo pusi. ROB BOWDEN: Jautājumi par šo? Man vajadzētu darīt nākamo? DAVID J. Malan: Protams. ROB BOWDEN: OK. Tātad šis ir bufera pārsniegts uzbrukums jautājums. Galvenais atzīt šeit ir, labi, cik varētu pretinieks triks šīs programmas uz izpildes patvaļīgu kodu? Tātad argv1, pirmais komandrindas arguments, lai šo programmu, kas var būt patvaļīgi ilgi. Bet šeit mēs esam, izmantojot memcpy kopēt argv1, kas šeit atrodas bārs. Mēs esam iet kā argumentu. Un tā tas ir, ņemot par nosaukumu joslā. Tāpēc mēs esam memcpying bar šajā bufera c. Cik baiti mēs kopēšanu? Nu tomēr daudzi baiti bar notiek izmantojat, garumu šo argumentu. Bet c ir tikai 12 baiti plata. Tātad, ja mēs ierakstiet komandrindas argumentu kas ir garāks par 12 baitiem, mēs esam gatavojas pārplūdes šo īpaši buffer. Tagad, kā varētu pretinieks triks programma par izpildes patvaļīgu kodu? Tātad, atcerieties, ka šeit Galvenais zvana foo. Un tad galvenie zvani foo. Pieņemsim izdarīt to. Tāpēc mums ir kaudze. Un galvenais ir kaudze rāmi apakšā. Kādā brīdī, galvenās zvani foo. Nu, uzreiz, galvenais zvani foo. Un tā foo saņem savu kaudze rāmi. Tagad, kādā brīdī, foo gatavojas atgriezties. Un gāja foo peļņu, mums ir nepieciešams zināt, kāda koda rindu iekšpusē galvenā mēs bija, lai zinātu, kur mums vajadzētu atsākt galvenais. Mēs varam zvanīt foo no kopumā ķekars dažādās vietās. Kā mēs zinām, kur atgriezties? Nu, mums ir nepieciešams, lai saglabātu, ka kaut kur. Tātad kaut kur šeit tieši apkārt, mēs saglabājam kur mums vajadzētu atgriezties pie reiz Foo atgriežas. Un tas ir atgriešanās adresi. Tātad, kā pretinieks varētu izmantot tas ir fakts, ka šis buferis c uzglabā, pieņemsim saka, šeit ir c. Tāpēc mēs esam ieguvuši 12 baiti c. Tas ir c. Un tas ir Foo žetonu gredzenu. Tātad, ja ļaunprātīgs lietotājs ievada vairāk baiti nekā 12, vai arī ievadiet komandu line arguments, kas ir ilgāks par 12 rakstzīmes, tad mēs ejam uz pārpilda šo buferi. Mēs varam glabāt notiek. Un kādā brīdī mēs tālu pietiekami, ka mēs sākam pārrakstot šo atpakaļadresi. Tātad, kad mēs pārrakstīt atpakaļadresi, Tas nozīmē, ka tad, kad foo atgriežas, mēs esam atpakaļ, lai kur ļaunprātīgs lietotājs stāsta to, ko kāda vērtība ir ievadīta ar jebkādiem rakstzīmes lietotājs ieraksta. Un tāpēc, ja ļaunprātīgs lietotājs tiek īpaši gudrs, viņš var būt tas atgrieztos kaut kur printDef funkciju vai kaut kur malloc funkcija, tikai jebkur patvaļīgs. Bet vēl vairāk gudrs ir tas, ko tad, ja viņš ir lietotājs atgriezties šeit. Un tad jūs sākat izpildīt kā tie rindas kodu. Tātad šajā brīdī, lietotājs var ievadīt visu, ko grib šajā reģionā. Un viņam ir pilnīga kontrole pār savu programmu. Jautājumi par šo? Tātad nākamais jautājums ir pabeigta versija, foo tādā veidā ka tas vairs nav neaizsargāti. Tātad tur ir pāris veidos jūs varētu darīt to. Mums joprojām ir c tikai to garuma 12. Jūs varētu būt mainījies to kā daļa no jūsu risinājums. Mums ir arī pievienoja čeku, lai veiktu Noteikti bar nebija null. Kaut arī jums nav nepieciešams ka pilnu kredītu. Tāpēc mēs esam pārbaudīt vispirms virknes garums bar. Ja tas ir lielāks par 12, tad nav faktiski darīt kopiju. Tātad tas ir viens no veidiem, kā noteikt to. Vēl viens nosakot to veids ir nevis kam c būt tikai garums ir 12, ir to būt garuma strlen (bar). Vēl viens nosakot to veids ir faktiski tikai atgriezties. Tātad, ja jūs tikko bija gotten atbrīvoties no visiem tas, ja jūs tikko bija svītrots visu rindiņas kodu, jūs esat gotten pilna kredītu, jo šo funkciju nav reāli paveikt neko. Tas kopēt komandrindas Arguments par kādu masīva tās vietējā kaudze rāmi. Un tad ir tas atgriežas. Un neatkarīgi no tā paveikto ir pagājis. Tāpēc atgriešanās bija pietiekams veids, kā iegūt pilnu kredītu. DAVID J. Malan: Ne gluži gars jautājums, bet pieņemams vienam spec tomēr. ROB BOWDEN: Jautājumi par kādu, kas? Viena lieta, ka jūs vismaz vajadzēja būt apkopojot kodu. Tātad, pat ja tehniski Jūs neesat neaizsargāti, ja jūsu kods nav apkopot, mēs to nepieņemam, ka. Neviens jautājumi? OK. DAVID J. Malan: Vai jūs vēlaties teikt šo titulu? ROB BOWDEN: Nē. DAVID J. Malan: Tātad šo vienu, tas bija vai nu laba ziņa vai slikta ziņa. Tas ir burtiski pati problēma kā pirmajam viktorīnu. Un tas ir gandrīz tāds pats problēma, jo pset1. Bet tas bija apzināti vienkāršots, lai būtu vienkāršāku piramīda, viens, kas var būt atrisināt ar nedaudz vienkāršāka atkārtojuma. Un tiešām, ko mēs kļūst par šeit bija ne tik daudz loģika, jo, iespējams, šajā brīdī jūs esat ērtāk, nekā jums bija nedēļā viens ar cilpas vai kāpēc cilpas, bet tiešām kaitināt izņemot, ka tu esi mazliet apmierināti ar Priekšstats, ka PHP ir ne tikai par to, ko programmēšana. Tas faktiski var izmantot kā valodas rakstīt komandrindas programmas. Un, protams, tas, ko mēs cenšamies vērst jūsu uzmanību. Tas ir komandrindas PHP programmas. Tātad C kodu šeit, bet pareizs C, nav pareizs PHP. Bet kods patiešām ir tāda pati. Ja jūs salīdzināt risinājumus Viktorīna 0 pret Viktorīna 1, jūs atradīsiet, ka tas ir gandrīz identiski, izņemot daži dolāra zīmes, un, lai neesamība datu tipa. It īpaši, ja mēs to apskatīt šeit jūs redzēsiet, ka mēs atkārtot, šajā gadījumā, no 1 līdz ar 7. Mēs būtu varējuši izdarīt to 0 indeksu. Bet dažreiz, es domāju, ka tas ir tikai garīgi vieglāk domāt par lietām no 1 līdz 7. Ja jūs vēlaties vienu bloku, tad divas bloki, tad trīs, tad dot, dot, dot septiņi. Mēs esam j tiek inicializēts 1 un tad paļaujas uz līdz i. Un viss šeit ir citādi identiski. Bet ievērības cienīgs ir pāris lietas. Mēs jums šīs divas līnijas, tas pirmais viens, goofily nosaukti kā zaņķis sharp sprādziena. Un tas tikai norāda ceļu, mape, kurā programma var būt konstatēts, ka jūs vēlaties izmantot interpretēt šo failu. Un tad līnija pēc tam, un Protams, ir jāievada PHP režīmā. Un līnijas pašā apakšā ir izeja PHP režīmā. Un tas darbojas, vispār, ar interpretē valodas. Tas ir sava veida kaitinošas, ja jūs rakstīt programmu failu ar nosaukumu foo.php. Un tad jūsu lietotājiem ir tikai atcerieties, OK, lai palaistu šo programmu, es ir tipa "php telpa foo.php." Veids kaitinošas, ja nekas cits. Un tas arī parāda, ka jūsu programma ir uzrakstīts PHP, kas ir ne visi ka apgaismodama lietotājam. Tātad jūs varat izņemt. Php vispār atsaukt no lekciju. Un jūs faktiski var darīt. / Foo ja jūs esat chmodded to, padarot to izpildāmā. Tāpēc chmod + x foo būtu darījuši. Un, ja jūs arī pievienot zaņķis šeit. Bet tiešām, problēma tika kļūst par izdrukāt kaut kas līdzīgs šim. Ne HTML, ne C kods, protams, tikai daži PHP. Tāpēc Milo tad atgriezās problēmas 25. Un 25, jums tika dota šādiem skelets kods, kas bija diezgan vienkārša mājas lapa. Un sulīgs daļa HTML gudrs bija uz leju vietas, kur mums ir iekšpusē ķermeņa forma, kas ir unikāls ID izejvielas iekšpusē, kas ir divas ieejas, viena ar ideju par vārda, viena ar ideju par pogu. Pirmais bija ierakstiet tekstu, Otrā tipa iesniegt. Un tā mēs deva jums, faktiski, vairāk sastāvdaļas, nekā jūs, kas vajadzīgi, tikai tik jūs puiši bija iespējas, ar kuru lai atrisinātu šo problēmu. Jums nav obligāti nepieciešams visas šīs ID. Bet tas ļauj jums, lai atrisinātu to dažādos veidos. Un augšā, pamanīsiet, ka mērķis bija, lai iedarbinātu logu kā šis - Sveiki, Milo! - pop up pārlūkprogrammā, izmantojot super vienkārši, ja nav neglīts, trauksmes funkciju. Un tā, galu galā, tas vārīties uz leju konceptuāli kaut klausās argumenti veidlapas klienta puses , Nevis servera pusē, kaut atbildot uz iesnieguma satveršanas vērtību, lietotājs drukāti Lai nosaukuma laukā, un pēc tam parādot to ķermeņa brīdinājumam. Tāpēc viens veids, kā jūs varat darīt, tas ir, ar jQuery, kas izskatās nedaudz sintaktiski perplexing sākumā. To var izdarīt ar tīru DOM kodu - document.getelement pēc ID. Bet pieņemsim apskatīt šo versiju. Man ir pāris svarīgu līnijas pirmās. Tāpēc viens, mēs esam šo līniju, kas ir identisks tam, ko jūs varētu būt redzējis kas, manuprāt, form2.html no klases nedēļā 9. Un tas ir tikai saku, izpildīt šādu kodu, kad dokuments ir gatava. Tas ir svarīgi, tikai tāpēc, ka HTML lapas ir lasīt no augšas uz apakšas, no kreisās uz labo. Un tāpēc, ja jūs mēģināt darīt kaut kodu šeit uz kādu DOM elements, daži HTML tagu, kas ir uz leju Šeit jūs darāt to pārāk ātri, jo tā ir pat ir jālasa atmiņā. Tā sakot, šo document.ready līniju, mēs esam sakot, šeit ir daži kodu, pārlūku. Bet nav izpildīt to līdz pilnībā dokuments ir gatavs, kas ir DOM koks pastāv atmiņā. Šis viena ir nedaudz vairāk vienkārši, ja sintaktiski mazliet atšķirīgs, ja es saku, grab HTML elementu, kura unikālais identifikators ir ieejas. Tas ir tas, ko hash tag apzīmē, unikālu ID. Un tad es esmu aicinot. Iesniegt. Tā. Iesniegt šeit ir funkcija, citādi pazīstams kā metodi, kas ir iekšpusē objekta uz kreisās puses pusē tur, ka man nav izcelt. Tātad, ja jūs domājat par izejvielu, kā objekts atmiņā - un tas patiešām ir. Tā ir mezgls ar koku - . Iesniegt līdzekļus, ja šo veidlapu ar iesniedz to ID, izpildīt šādu kodu. Man vienalga, ko nosaukums funkcija es esmu izpildes. Tātad, šeit es, esmu, izmantojot kā līdz šim, kas ir sauc lambda funkciju vai anonīms funkcija. Tas nemaz nav intelektuāli interesanti izņemot tas nav nosaukuma, kas ir labi, ja jūs tikai kādreiz saukšu to vienu reizi. Un iekšā tur es tiešām rīkotos iesniegšanas formu. Es pirmo reizi deklarēt mainīgo sauc par vērtību. Un tad kāda ir šī ietekme izceltas daļa šeit un tagad? Ko tas darīt augsta līmeņa par mani? Mērķauditorija: Tā izpaužas vērtību, lietotājs nav zemāk HTML. Tas izpaužas, ka ID un pēc tam konstatē vērtību tā. DAVID J. Malan: Tieši tā. Tā grabs mezglu, kura unikālais identifikators ir nosaukums. Tas izpaužas vērtību tajā, kas ir, iespējams, kāda lietotājs drukāti viņam sevi. Un pēc tam to uzglabā ka mainīgo sauc par vērtību. Kā malā, jūs varētu būt arī izdarīts nedaudz savādāk. Pilnīgi pieņemams darot kaut ko meli VAR vērtība izpaužas document.getElementById. Un tas ir iemesls, kāpēc tas ir nedaudz garlaicīgs neizmantot jQuery. "Name". Vērtība. Tik pilnīgi pieņemams. Dažādi veidi, kā to izdarīt. jQuery tikai mēdz būt nedaudz vairāk īss un noteikti vairāk populārs starp programmētājiem. Tagad, es esmu dara mazliet veselība pārbaudīt, jo problēmu paziņojumā mēs skaidri teica, ja Lietotājs vēl nav drukāti viņa vai viņas nosaukums, neliecina par brīdinājumu. Bet jūs varat pārbaudīt, ka, tikai pārbaudi par tukšu virknes quote-likt pēdiņas beigās, ja tur ir nekas patiesībā. Bet, ja tas nav vienāds ar citātu-likt pēdiņas beigās, Es vēlos aicināt brīdinājumus. Un interesantākais ir tas, ka Mēs esam izmantojot plus operatoru, kura ko dara JavaScript? Saķēdēt. Tātad, tas ir tāpat kā PHPs dot operatoram. Pati ideja, nedaudz atšķirīga sintakse. Un es esmu tikai radot virkni, kas redzējāt uz ekrāna shot - Sveiki, tik un tā. Un tad pēdējais detail tas ir. Kāpēc man atgriezties viltus iekšpusi Šīs anonīmu funkciju? Mērķauditorija: Nav vērtības. Jūs nodot to formā. Tā vienkārši saka, ja vērtība nav vienāds ar tukšu, tad dariet to. Tur bija tukša minētajā iesniegumā. DAVID J. Malan: OK. Uzmanīgiem, lai gan. Tur neviens cits šeit. Un ka ieguldītā viltus atrodas ārpus un ja apstākļi. Tāpēc tas izcēla līniju, atgriezties viltus, izpilda vienalga ko, kad iesniegšanas formu. Kāda atgriešanās nepatiesu iekšpusi šo notikumu apdarinātājs, kā to sauc, attiecīgais pasākums ir iesniegums? Mērķauditorija: Jo tas notiek tikai vienu reizi. DAVID J. Malan: notiek tikai vienu reizi. Ne gluži. Yeah? Mērķauditorija: Tas novērš veidlapu iesniedzot noklusējuma uzvedību, kas padarītu lapu pārlādēt. DAVID J. Malan: Tieši tā. Tāpēc es esmu pārslogošanas termins iesniegt šeit tāpēc es saku, forma ir iesniegšanas. Bet kā jūs ieteiktu, tas tiešām nav iesniegts patieso HTTP veidā. Kad jūs noklikšķiniet uz Iesniegt, jo mūsu onSubmit apdarinātājs, mēs pārtvērēja ka formas iesniegumu, lai runāt. Mēs tad darot savu lietu ar JavaScript kodu. Bet es esmu apzināti atgriežas nepatiesa, jo tas, ko es nevēlos, lai notiktu split otrais vēlāk, ir visai formu sevi jāiesniedz tīmeklī serveris ar galvenajiem vērtību pārus, mainot URL, lai būtu kaut kas līdzīgs q = kaķi vai ko mēs darījām, Piemēram, klasē. Es nevēlos, ka varētu notikt, jo Nav servera klausīšanās šo veidlapu iesniegšanas. Tas ir tīri darīts JavaScript kodu. Un tas ir iemesls, kāpēc man nav pat darbība atribūtika manā formā, jo es nedomā par to nekad iet uz serveri. Tāpēc tas tiek iesniegts. Bet mēs esam pārtvērēja šo veidlapu iesniegšanu un novērst noklusējuma uzvedība, kas ir faktiski iet visu ceļu uz serveri. Mērķauditorija: Tātad, saglabājot to klienta puses. DAVID J. Malan: Keeping tā klienta puses. Tieši labi. Nākamā bija mana oh MySQL. ROB BOWDEN: OK. Tāpēc šis pirmais jautājums bija kopumā raupja cilvēkiem. Lai gan vēlāk tiem gāja labāk. Tātad jums bija izvēlēties pareizo informāciju tipi abi šie kolonnām. Un abi šie ir daži lietas par viņiem, ka izdarīt izvēli grūti. Tāpēc int nebija derīgs tipa par numuru. Iemesls ir 12 ciparu konts numuru, int nav pietiekami liela, lai uzglabāt kopējos ciparus. Tāpēc derīga izvēle būtu bijis liels int, ja jūs notikt zināt, ka. Vēl viena izvēle varētu būt char jomā garums ir 12. Tātad vai nu no tiem būtu strādājuši. Int nebūtu. Tagad, līdzsvaru, domāju, ka atpakaļ uz pset7. Tāpēc mēs īpaši izmanto decimāldaļu saglabātu vērtību akciju vai - DAVID J. Malan: Cash. ROB BOWDEN: Cash. Mēs izmantojām decimāldaļu uzglabāt daudzumu naudas, ka lietotājs šobrīd ir. Tā iemesla dēļ mēs to darām, ir jo, atcerieties, pludiņi. Tur peldošā punkts precizitāti. To nevar precīzi glabāt naudu vērtības, piemēram, mēs vēlamies šeit. Tātad zīme aiz komata ir spējīgs precīzi veikals kaut ko, teiksim, divas zīmes aiz komata. Tieši tāpēc līdzsvars, mēs gribam būt decimal, nevis peldēt. DAVID J. Malan: Un arī, pārāk, lai gan tas varētu būt gudrs citos kontekstiem domāt, varbūt tas ir iespēja int. Es ņemšu tikai sekot lietas pennies. Jo mēs skaidri parādīja noklusējuma vērtība ir 100.00, ka nozīmē, ka tas var būt tikai int. Un vēl smalkumu arī ar vairākiem bija, ka tas nav domāts būt āķīgs jautājums. Bet atceros, ka int MySQL, , piemēram, C, vismaz ierīce, ir 32-bit. Un, pat ja mēs negaidām, lai jūs precīzi zināt, cik daudz ciparu, kas līdzekļiem, vai atcerēties, ka lielākais skaits jūs varat pārstāvēt potenciāli ar 32-bitu skaits ir aptuveni tas, ko? Cik lielā skaitā mēs vienmēr sakām? 2 līdz 32, kas ir tas aptuveni? Jums nav jāzina precīzi. Bet aptuveni ir noderīga dzīvē. Tas ir aptuveni 4 miljardi. Tāpēc mēs esam teica, ka pāris reizes. Es zinu, es jau teicu, ka pāris reizes. Un tas ir aptuveni 4 miljardi. Un tas ir labs noteikums īkšķis zināt. Ja jums ir 8 biti, 256 ir burvju numuru. Ja jums ir 32 biti, 4 miljards dot vai ņemt. Tātad, ja jūs vienkārši pierakstīt 4 miljardus, Jūs redzēsiet, ka tas ir mazāk ciparu nekā 12, kas nozīmē, ka tas, protams, nav pietiekami ekspresivitāte, lai attēlotu 12-ciparu konta numurs. ROB BOWDEN: OK. Tāpēc citi tiem gāja labāk. Tātad pieņemsim, ka banka uzliek $ 20 ik mēnesi apkalpošanas maksa uz visiem kontiem. Ar ko SQL vaicājumu varētu banka atskaitīt $ 20 no katra skaits, pat ja tas noved pie negatīvām atlikumu? Tātad, būtībā, ir četri galvenie veidi vaicājumu - ievietot, atlasiet, atjaunināt un dzēst. Tātad, ko mēs domājam, mēs esam gatavojas izmantot šeit? Atjaunināt. Tātad, pieņemsim to apskatīt. Tāpēc šeit mēs esam atjaunināšanu. Kas galda mēs atjaunināt kontus? Tā atjaunināšanu kontu. Un tad sintakse saka, ko kontos, mēs atjaunināt? Nu, mēs esam nosakot līdzsvaru, kas vienāds ar pašreizējo vērtību bilances mīnus 20. Tāpēc tas atjauninās visas rindas kontu, atņemot $ 20 no bilances. DAVID J. Malan: Izplatīta kļūda šeit pat ja mēs dažreiz piedeva to, bija tiešām ir PHP kodu šeit zvanot vaicājumu funkciju vai nodot pēdiņas ap visu, kas nav nepieciešams būt tur. ROB BOWDEN: Atcerieties, ka MySQL ir atsevišķu valodu no PHP. Mēs gadās būt rakstiski MySQL PHP. Un PHP tad nosūtīt to vairāk nekā uz MySQL serveri. Bet jums nav nepieciešams PHP, lai sazināties ar MySQL serveri. DAVID J. Malan: Tieši tā. Līdz ar to nav mainīgie ar dolāra zīmes būtu šajā kontekstā. To var vienkārši darīt visu math ietvaros datubāzes pašas. ROB BOWDEN: OK. Tātad nākamais. Tas ir nākamais? Jā. Tātad, ar ko SQL vaicājumu varētu banka ielādētu konta numurus ITS bagātākajiem klientiem, tiem, kam atlikumi lielāki nekā 1000? Tātad, kurš no četriem galvenajiem veidiem mēs gatavojas vēlaties šeit? Izvēlieties. Tāpēc mēs vēlamies, lai izvēlētos. Ko mēs gribam, lai izvēlētos? Kas kolonna mēs vēlamies, lai izvēlētos? Mēs īpaši vēlamies lai izvēlētos numuru. Bet, ja jūs teicāt zvaigzne, mēs arī atzina, ka. Tātad izvēlieties numuru no kāda galda? Konti. Un tad nosacījums, mēs gribam? Ja atlikums ir lielāks par 1000. Mēs arī pieņēma vairāk vai vienāda. Pēdējais. Ar ko SQL vaicājumu varētu banka tuvu, proti, dzēst katru kontu, kurā ir no 0 $ līdzsvaru? Tātad, kas no četriem mēs gatavojas vēlaties izmantot? Izdzēst. Tātad sintakse, kas? Izdzēst no kāda galda? Konti. Un tad nosacījums, uz kura Mēs vēlamies, lai dzēstu - ja atlikums ir vienāds ar nulli. Tātad izdzēst visas rindas no kontiem kur atlikums ir nulle. Jautājumi par kādu no šiem? Vēlaties, lai rindā? DAVID J. Malan: Queue guide. Tātad šo vienu, mēs deva jums nedaudz iepazinušies struktūra, mēs izpētīt bit klasē līdzās structs, , kas bija datu struktūrām saistītie garā. Atšķirība tomēr ar rindā ir ka mums bija kaut kā atcerēties, kas bija priekšā rindā, kas lielā daļa, lai mēs varētu padarīt efektīva izmantošana atmiņā, vismaz ja mēs, izmantojot masīvu. Jo atgādināt, ja mums ir masīvs, ja, , piemēram, tas ir priekšpuse rinda, ja es nokļūt rindā šeit un tad kāds saņem saskaņā aiz manis, man aiz muguras, aiz manis, un viens cilvēks soļus no līnijas, jūs varētu, kā mēs redzējām dažus no mūsu cilvēku brīvprātīgie klasē, ir visi pāriet šādā veidā. Bet vispār, kam visi dara kaut kas nav labākais laika izmantošanu programmā, jo tas nozīmē, ka jūsu algoritms darbojas kādā asimptotiskās darbības laiks? Tas ir lineāra. Un es jūtu, ka ir sava veida stulba. Ja nākamais cilvēks rindā ir nākamais Persona, kas ir paredzēts, lai iet uz veikals, tie nav visi ir pārvietoties kopā. Vienkārši ļaut, ka persona ir noplūktas off kad laiks, piemēram. Tātad, mēs varam ietaupīt daudz laika tur. Un tā, lai to izdarītu, lai gan, tas nozīmē ka galva rindā vai priekšējā rindā gatavojas pakāpeniski virzīties dziļāk un dziļāk uz masīva un galu galā varētu faktiski aptīšanas ja mēs izmantojam masīvs, lai saglabātu cilvēkus Šajā rindā. Tātad jūs varat gandrīz iedomāties array kā riņķveida datu struktūru ziņā. Tātad jums kaut kā ir, lai sekotu no tā lieluma vai tiešām beigas tā un tad, ja sākumā tā ir. Tāpēc mēs ierosinām, ka Jūs deklarējat viena šāda rinda, zvanot tas q, tikai viens burts. Tad mēs ierosinām, ka priekšējais būt initialized ar nulli un ka izmērs inicializēts līdz nullei. Tātad tagad, tur nekas iekšā šajā rindā. Un mēs lūdzam Jūs aizpildīt īstenošana Enqueue tālāk tādā veidā, ka funkcija piebilst n līdz Q beigām un pēc tam atgriež patiess. Bet, ja q ir pilna vai negatīvs, funkcija būtu vietā atgriezties viltus. Un mēs tev pāris pieņēmumi. Bet viņi nav īsti funkcionāli vajadzīgs, tikai, ka bool pastāv, jo, tehniski, bool nav pastāv C, ja vien jūs arī skaidrs header failu. Tāpēc, ka bija tikai pārliecināties, ka Tika ne tas triks Jautājums veida lieta. Tātad Enqueue, mēs ierosināts paraugā risinājumus, lai īstenotu šādi. Viens, mēs vispirms pārbaudiet vieglumu, zemo piekārtiem augļi. Ja rinda ir pilna vai numuru, kas jūs mēģināt ievietot mazāk par nulli, ko mēs teicām specifikācija problēmu vajadzētu nedrīkst pieļaut, jo mēs tikai vēlamies nav negatīvas vērtības, tad jums vajadzētu vienkārši atgriezties viltus nekavējoties. Tāpēc daži salīdzinoši viegli kļūdu pārbaudi. Ja tomēr vēlaties pievienot, ka faktiskais numurs, kas jums bija darīt mazliet domāšana šeit. Un tas ir, ja tas ir mazliet kaitinošas garīgi, jo jums ir izdomāt, kā rīkoties izliektais. Bet dīgļi idejas šeit, kas ir par interese, lai mums ir, ka izliektais bieži vien nozīmē modulāra aritmētisko un mod operators procenti pusē, kur var aiziet no lielāka vērtība atpakaļ uz nulli, un tad viens un divi, un trīs un tad atpakaļ ap nulli, viens un divi un trīs, un tā tālāk atkal un atkal. Tā kā mēs ierosinām izdarīt ir ka mēs gribam, lai indeksēt masīvs sauc numurus, ja Mūsu veseli skaitļi meli. Bet tur nokļūt, mēs vispirms vēlamies darīt neatkarīgi no izmēra rindā ir tikai Pēc tam pievienot to, ka neatkarīgi priekšpuse sarakstā. Un ietekme, kas ir likt mums pareizā stāvoklī rindā un nevar pieņemt, ka pirmais cilvēks rindā ir sākumā, kuru viņš Viņa pilnīgi varētu būt, ja mēs Tika arī novirzot ikvienam. Bet mēs esam tikai darba vietu radīšanā par sevi, ja mēs ņēmām ka īpaša ceļš. Tātad, mēs varam saglabāt to salīdzinoši vienkārši. Mums ir jāatceras, ka mēs tikko pievienotas int rindai. Un tad mēs vienkārši atgriezties true. Tikmēr dequeue, mēs jautājām jūs darīt šādi. Īstenot to tādā veidā, ka tas dequeues, tas noņem un atdeve, int priekšā rindā. Lai noņemtu int, pietiek aizmirst to. Jums nav nepieciešams ignorēt to mazliet. Tāpēc tas joprojām ir patiesībā. Tāpat kā datus par cieto disku, mēs esam tikai ignorējot faktu, ka tas ir tagad. Un, ja q ir tukšs, mums vajadzētu vietā atgriezties negatīvu 1. Tāpēc šis jūtas patvaļīgs. Kāpēc atgriešanās Negatīva 1 vietā nepatiess? Jā. Mērķauditorija: Q glabāšanai pozitīvās vērtības. Jo jums ir tikai saglabāt pozitīvās vērtības ar q, negatīvā ir kļūda. DAVID J. Malan: Labi, taisnība. Tāpēc, ka mēs esam tikai glabāšanai pozitīvs vērtības vai nulle, tad tas ir naudas sods atgriešanās negatīvu vērtību kā Sentinel vērtību, īpašu simbolu. Bet jūs vēstures pārrakstīšana tur, tāpēc, ka iemesls, kādēļ mēs esam tikai nav negatīvas vērtības atgriežas ir tāpēc, ka mēs gribam, lai ir kontrolputnus vērtības. Tātad precīzāk, kāpēc ne tikai atgriezties viltus gadījumos kļūdas? Jā. Mērķauditorija: Jūs esat neizdevās atgriezties vesels skaitlis. DAVID J. Malan: Tieši tā. Un tas ir, ja C izpaužas diezgan ierobežojot. Ja jūs sakāt jūs gatavojas atgriezties int, jūs esat ieguvuši atgriezties int. Jūs nevarat saņemt iedomātā, un sākt atgriezties bool vai peldēt, vai stīgu vai kaut kas tamlīdzīgs. Tagad, tikmēr, JavaScript un PHP, un dažas citas valodas var, faktiski, tu esi atpakaļ atšķiras veidi vērtībām. Un tas patiesībā var būt noderīga, ja jūs varētu atgriezties pozitīvi Ints, nullēm, negatīvas ints, vai nepatiesa vai Null pat neizsaka kļūda. Bet mums nav, ka daudzpusība C. Tātad ar dequeue, ko mēs ierosina to darīt, ir - ROB BOWDEN: Jūs varat atgriezties viltus. Tas ir tikai, ka nepatiesa ir hash noteikt viltus līdz nullei. Tātad, ja jūs atgriezties viltus, jūs atpakaļ nulle. Un nulles ir derīga lieta mūsu rindā, tā kā negatīvs 1 nav, ja viltus gadījās būt negatīvs 1. Bet jums nav pat jāzina, ka. DAVID J. Malan: Tas ir kāpēc man nav pateikt. ROB BOWDEN: Bet tas nav taisnība ka jūs nevarat atgriezties viltus. DAVID J. Malan: Protams. Tātad dequeue, pamanīt mēs pieņemam par spēkā neesošu, jo tā argumentu. Un tas ir tāpēc, ka mēs neesam iet kaut ko iekšā Mēs vienkārši vēlamies, lai novērstu elementu priekšā rindā. Tātad, kā mēs varbūt iet par to izdarīt? Nu, pirmkārt, pieņemsim to izdarītu ātri veselība pārbaudītu. Ja rinda izmērs ir 0, tad ir neviens darbs, kas jādara. Atgriešanās negatīvs 1. Darīts. Tāpēc, ka ir dažas rindiņas manā programmā. Tātad tikai četras līnijas paliek. Tātad, šeit es nolemt Samazināt izmēra. Un decrementing izmēru efektīvi nozīmē, ka es esmu aizmirstot kaut kas ir tur. Bet man ir arī jāatjaunina, kur priekšā numuriem ir. Tātad, lai to izdarītu, man ir nepieciešams darīt divas lietas. Man vispirms ir nepieciešams atcerēties, kāda numuru ir priekšā rindā, jo man ir nepieciešams, lai atgrieztos, ka lieta. Tāpēc es nevēlos, lai nejauši aizmirst par to, un pēc tam pārrakstīt. Es esmu tikai gatavojas atcerēties int. Un tagad, es gribu, lai atjauninātu q.front kas q.front +1. Tātad, ja tas bija pirmais cilvēks līnija, tagad, es gribu darīt plus 1 līdz norāda uz nākamo personu rindā. Bet man rīkoties, ka izliektais. Un, ja jauda ir globāla nemainīgs, kas notiek, lai ļauj man, lai pārliecinātos, kā es norādīt līdz pēdējai personai līnija, moduļa darbība dos mani atpakaļ līdz nullei priekšējā rindā. Un kas apstrādā izliektais šeit. Un tad es turpinu atgriezties n. Tagad, stingri runājot, man nav ir jādeklarē n. Man nebija paķert to un uzglabāt to laiku, jo vērtība ir joprojām. Lai es varētu tikai darīt pareizās aritmētisko atgriezties bijušais vadītājs no rindā. Bet es tikai jutu, ka tas bija skaidrs faktiski greifers int, ielieciet to in n, un pēc tam atpakaļ, ka skaidrības labad, bet nav noteikti nepieciešams. Psst. Viņi visi izrunājamu manā galvā. ROB BOWDEN: Tātad pirmais jautājums ir bināro koku problēma. Tātad, pirmais jautājums ir, mēs esam ņemot vērā, ka šie skaitļi. Un mēs vēlamies, lai kaut kā ievietot tos šiem mezgliem tā, ka tas ir derīgs bināro meklēšanas koku. Tātad viena lieta atcerēties par bināro meklēšanas koku ir tas, ka tas nav tikai, ka lieta, pa kreisi ir mazāks, un lieta tiesības ir lielāka. Tā ir jābūt, ka visa koku kreisā ir mazāks, un visu koku pa labi, ir lielāka. Tātad, ja man 34 here augšdaļā, un pēc tam Man 20 šeit, tā ka ir spēkā tik tālu, jo 34 šeit. 20 būs pa kreisi. Tātad tas ir mazāk. Bet es nevaru tad ielieciet 59 šeit, jo pat tad, ja 59 atrodas pa labi 20, tas joprojām ir pa kreisi no 34. Tātad ar šo ierobežojumu prātā, Vieglākais veids, kā iespējams atrisināt šo problēma ir tikai sava no šiem numuriem - līdz 20, 34, 36, 52, 59, 106. Un pēc tam ievietojiet tos no kreisās puses uz labo. Tātad, 20 iet šeit. 34 iet šeit. 36 iet šeit. 52, 59, 106. Un jūs arī varētu būt izpētījuši, ar daži tapām un realizējot, Ak, pagaidiet, man nav pietiekami daudz numurus aizpildīt to vairāk nekā šeit. Tāpēc man ir nepieciešams, lai reshift ko manu maršruta piezīme būs. Bet paziņo, ka gala trīs, ja jūs lasīt no kreisās uz labo pusi, tas ir augošā secībā. Tāpēc tagad, mēs vēlamies paziņot, kāda struktūrai būs par mezgliem šo koku. Tātad, ko mums vajag ar bināro koku? Tātad, mēs vērtība ir tipa int, tāpēc daži int vērtību. Es nezinu, ko mēs saucām tā šķīdumā - int n. Mums ir nepieciešams rādītāju pa kreisi bērnam un rādītāju uz labo bērnam. Tātad, tas notiek, lai izskatās šādi. Un tas būs tiešām izskatās pirms kad bija divkārt saistīts sarakstu stuff, tāpēc paziņojums - Es esmu nāksies, lai ritinātu visu ceļu atpakaļ uz leju, lai problēmu 11. Tāpēc pamanāt, ka tas izskatās identiski tam, izņemot mēs vienkārši izsaucat šos dažādi nosaukumi. Mums vēl ir vesels skaitlis vērtību un divas norādes. Tas ir tikai, ka tā vietā, lai ārstētu norādes, kā norādot uz nākamo lieta un iepriekšējā lieta, mēs esam apstrādājot uz norādes, lai norādītu uz kreiso bērnam un labais bērns. OK. Tātad tas ir mūsu struct mezglā. Un tagad, vienīgā funkcija mums īstenot tam ir traversa, kas mēs gribam iet pa koku, drukāšanas out vērtībām no koka, lai. Tātad meklē šeit, mēs gribētu, lai drukātu out 20, 34, 36, 52, 59 un 106. Kā mēs to paveiktu? Tātad, tas ir diezgan līdzīgs. Ja redzējāt pagājušajā eksāmenu problēmu kas jums vēlējās izdrukāt viss koks ar komatiem starp viss, faktiski tas bija pat vieglāk, nekā to. Tātad, šeit ir risinājums. Tas bija ievērojami atvieglo ja jūs to rekursīvi. Es nezinu, ja kāds mēģināja to darīt iteratīvi. Bet vispirms mums ir mūsu vispārējo gadījumu. Ko darīt, ja sakne ir nulle? Tad mēs esam tikai gatavojas atgriezties. Mēs nevēlamies, lai drukāt neko. Citādi mēs ejam, lai šķērsotu rekursīvi leju. Drukāt visu kreiso apakškoka. Tāpēc drukāt visu mazāk par manu pašreizējo vērtību. Un tad es esmu gatavojas drukāt sevi. Un tad es esmu gatavojas recurse leju manu viss labais subtree, lai viss lielāka par manu vērtību. Un tas notiek, lai drukātu out viss kārtībā. Jautājumi par to, kā tas patiesībā accomplishes šo? Mērķauditorija: Man ir jautājums gada [nedzirdama]. ROB BOWDEN: Tik viens veids, kā tuvojas jebkurš rekursīvas problēma ir tikai domāt par to, piemēram, jums ir jādomā par visiem stūru gadījumos. Tāpēc uzskatu, ka mēs vēlamies, lai izdrukāt visu šo koku. Tāpēc viss, ko mēs gribam pievērsties tas ir īpaši mezglu - 36. Rekursīvie zvanus, mēs izliekamies tie vienkārši strādāt. Tātad šeit tas rekursīvas zvans gaitas, mēs pat bez domāšanas par to, tikai šķērso pa kreisi trīs, iedomājieties, ka jau drukā 20 un 34 mums. Un tad, kad mēs beidzot rekursīvi zvaniet traversa par labi, ka būs pareizi drukāt 52, 59 un 106 par mums. Tātad, ņemot vērā, ka tas var drukāt 20, 34, un citi var izdrukāt 52, 59, 108, viss, kas mums ir nepieciešams, lai varētu to izdarīt, ir drukāt ourself vidū, kas. Tāpēc izdrukāt visu pirms mums. Drukāt ourself, tāpēc pašreizējā mezglā print 36, regulāri Printf, un pēc tam drukāt visu pēc mums. DAVID J. Malan: Tas ir, ja rekursija izpaužas tiešām skaista. Tā tas ir pārsteidzošs lēciens ticības, kur jūs visniecīgākās mazliet darba. Un tad jūs let kāds cits darīt pārējo. Un, ka kāds cits ir ironiski, jūs. Tik nopietnu gariņš punktiem, ja ritinot augšup uz jautājumiem - ROB BOWDEN: Uz jautājumiem? DAVID J. Malan: Un uz leju, maz skaitļi, vai kāds zina, kur šie skaitļi ir no? ROB BOWDEN: Man ir burtiski ne jausmas. DAVID J. Malan: Tie parādās visā viktorīnas. Mērķauditorija: Vai tie paši skaitļi? DAVID J. Malan: Šie skaitļi. Maz Lieldienu olu. Tātad tiem no jums skatīties tiešsaistē mājās, ja jūs varat pateikt mums pa e-pastu heads@CS50.net kāda nozīme no šīs atkārtojas sešas skaitļi ir Visā Viktorīna 1, mēs duša jūs ar pārsteidzošu uzmanību galīgo lekciju un stress bumbu. Jauki, smalks. ROB Bowden: Kādi pēdējie jautājumi par kaut ko viktorīnu?