DAVID Malan: Labi, welcome atpakaļ. Tas ir CS50. Tas ir sākums septiņiem nedēļā. Tātad tas ir bijis, bet, tāpēc es domāju, mēs gribētu veikt viesulis tūre, kur mēs left off, un kur mēs esam tagad iet. Tātad šī lieta šeit varētu būt radījis zināmu Angst sākumā. Bet, cerams, jūs esat sākuši aklimatizēties, ko tas nozīmē šeit - zvaigžņu pārstāv rādītāju, kas ir tikai to, kas vairāk lajs izteiksmē? Tātad, tas ir adrese. Tātad, tas ir adrese kaut ko atmiņā. Un mēs sākām mizu atpakaļ slāņiem pāris nedēļas atpakaļ, lietas, piemēram, GetString un citas šādas funkcijas visu šo laiku ir atgriešanās adreses lietas atmiņā, piemēram, adrese pirmās rakstzīmes daži secība. Tāpēc mēs arī ieviesa Valgrind, kas jūs sākat izmantot šo problēmu noteikt, jo īpaši uz nākamo Problēma, kas, kā labi. Un Valgrind ko dara mūsu labā? Tā pārbauda atmiņas noplūdes, un tas arī pārbauda ļaunprātīgu atmiņu. Tā var, ar kādu varbūtību, atklāt, ja Jūsu kods ir gatavojas pieskarties atmiņu ka tas vienkārši nav. Līdz ar to ne vienmēr ir noplūdi, bet, ja jūs pārsniedz dažu robežām masīvs, un jūs faktiski vadīt Valgrind un panākt, ka uzvedību, vienlaikus Valgrind darbojas savā programmā, ir darbojas iekšpusē no tā, jūs saņemsiet ziņas, piemēram, šo - "par spēkā neesošu rakstīt par izmērs 4 ", kas, atgādināt pāris nedēļas atpakaļ nozīmēja, ka man bija nejauši piemēram, par vienu int pārāk tālu ārpus masīva robežām. Un tā izmērs 4 nozīmē šeit lielumu šo konkrēto int. Lai ņemtu mierinājumu ar to, ka Valgrind izlaidē, formātu no tā, ir vienkārši šausmīgs. Tas ir patiešām grūti redzēt cauri putru par interesantu informāciju. Tātad, ko mēs esam darījuši šeit ir tikai fragments daži no pāris vairāk interesantas līnijas. Bet saprast, ka 80% no Valgrind s izeja būs mazliet uzmanību. Paskatieties uz modeļiem, piemēram, šo - nederīgs labi, nederīgs lasīt, 40 baiti un daži no blokiem skaits ir noteikti zaudēja, atslēgvārdi, piemēram, ka. Un ko jūs, cerams, redzēt, ir daži veida izsekot kādu funkciju kļūda ir faktiski iekšā Šajā gadījumā šeit, jo to, ko līnija no mans kods bija kļūda acīmredzot? 26 failā ar nosaukumu memory.c, kas bija Piemēram mēs spēlējām ar tajā laikā. Tātad, tas ir iespējams, nav malloc. Tas bija iespējams, manā kodu vietā. Tātad mēs redzam atkal un atkal pirms ilgi. Tātad scanf, tas nāca klajā ar pāris formu līdz šim. Mēs redzējām sscanf īsi. Tas bija kaut kas vairāk Jūs ienira arī jūsu preparāti uz viktorīnas. Un scanf ir faktiski ko CS50 bibliotēka ir bijis, izmantojot zem pārsegs ilgu laiku secībā lai iegūtu informāciju no lietotāja. Piemēram, ja es pāriet uz CS50 ar ierīce šeit, ļaujiet man atvērt Piemēram, šodien, ka sauc scanf-0.c Un tas ir super vienkārši. Tas ir tikai dažas rindiņas kodu. Bet tas parāda, tiešām, cik getInt ir darba visu laiku. Ar šo programmu šeit, jo 16 līnijas , Paziņojums, ka es apliecinu int. Līdz ar to nav norādes, nekas maģisks tur, tikai int. Tad 17 rindā, es ātri lietotāju par numuru, lūdzu. Tad 18 beigās, es izmantot scanf šeit. Un esmu norādījis, veida, piemēram, printf, ka es esmu gaidījis citātu likt pēdiņas beigās procenti i. Tātad procenti i, protams, apzīmē int. Bet paziņojums, ko otrajā arguments scanf ir. Kā jūs raksturotu otrais arguments aiz komata? Kas ir tas, ka? Tas ir adrese x. Tātad tas ir noderīgi, jo, sniedzot scanf ar adresi x, ko dara kas dotu šo funkciju, lai darīt? Ne tikai iet tur, bet arī darīt to, ko? Veikt izmaiņas tajā. Tāpēc, ka jūs varat iet tur, tas ir sava veida kā karte uz vietu atmiņā. Un tik ilgi, kamēr jūs sniedzat scanf, vai kādas funkcijas ar šādu karti, ka funkcija var iet tur, un ne tikai apskatīt vērtībā, bet tā var arī mainītu šo vērtību, kas ir noderīgi, ja dzīvē uz scanf mērķis ir skenēt informāciju no lietotāja, jo īpaši no klaviatūras. Un f apzīmē formatēti, tāpat kā printf, f apzīmē format virkne, kas jūs vēlaties izdrukāt. Tātad, īsi sakot, šī līnija 18 vienkārši saka, mēģināt lasīt int no lietotāja tastatūru un uzglabāt to iekšpusē x, pie neatkarīgi adrese x notiek dzīvot. Un tad visbeidzot, līnija 19 vienkārši saka, paldies par int, šajā gadījumā. Tātad, ļaujiet man iet uz priekšu un darīt to. Tātad, lai scanf 0. Ļaujiet man iet uz priekšu un pietuvinātu objektu Es iešu un palaist to ar punkti slash scanf 0. Numuru, lūdzu? 50. Paldies par 50. Tātad tas ir diezgan vienkārši. Tagad to, kas ir tā nedara? Tas nav darīt visu ķekars ar kļūdu labošanas. Piemēram, ja man nav sadarboties, un es nav veids vairākās, bet tā vietā es rakstīt kaut ko līdzīgu "sveiki", tas ir tikai sava veida dīvaini. Un tā viena no lietām, CS50 bibliotēka ir darījis mums dažām laiks ir tāds, ka reprompting un reprompting. Retry frāze atsaukšanu bija cs50.c, un tas ir iemesls, ka getInt kas CS50 bibliotēka ir faktiski viss ķekars līniju ilgi, jo mēs esam pārbaudot stulba sīkumi kā šis. Vai lietotājs nedod mums, patiesībā, int? Vai viņš vai viņa dod mums kaut ko piemēram, alfabēta burtu? Ja tā, mēs vēlamies, lai atklātu kas un kliegt pie viņiem. Bet lietas iegūt vairāk interesanti šajā nākamajā piemērā. Ja es eju uz Scanf-1.c, kas ir viens lieta, kas ir būtiski mainījies Šis nākamais piemērs? Es esmu, izmantojot char *, protams, nevis int. Tātad, tas ir interesanti, jo char *, atceros, ir tiešām tikai pats kā virkni. Tāpēc tā uzskata, piemēram, varbūt tas ir super vienkāršs īstenošanu GetString. Bet es esmu nomizoti atpakaļ slāni no CS50 bibliotēkas, tāpēc es esmu Piezvanot uz šo char * tagad. Tātad, pieņemsim redzēt, kur, ja visur, mēs ejam nepareizi. Līnija 17 - Es vēlreiz saku, lūdzu, iedodiet man kaut ko, Šajā gadījumā, string. Un tad nākamajā rindā, es aicinu scanf, atkal, piešķirot tam formāta kodu, bet šoreiz procenti s. Un tad šoreiz, es esmu piešķirot tam buferi. Tagad paziņojums, es neesmu, izmantojot zīme &. Bet kāpēc ir tā, ka, iespējams, OK šeit? Jo to, kas ir bufera jau? Tas ir jau rādītājs. Tas jau adresi. Un pieņemsim šo vārdu "sajaukt," let me tikai sauc to s, piemēram, attiecībā uz vienkāršību. Bet es esmu sauc to buferi, jo vispārēja, programmēšanā, ja jums ir rieciens atmiņas, kas stīgu patiešām vienkārši, jūs varētu aicināt to buferis. Tā ir vieta, kur glabāt informāciju. Līdzīgi lietām, piemēram, YouTube, kad viņi buferizācijas, tā sakot, ka vienkārši nozīmē, ka tas ir lejupielādēt biti no interneta un uzglabājot tos vietējā masīvs, vietējo rieciens atmiņas, lai ka jūs varat noskatīties to vēlāk, tā izlaižot vai karājas jūs spēlējot atpakaļ. Tātad tur ir problēma, lai gan, jo es esmu stāsta scanf, kas paredz string no lietotāja. Lūk adrese rieciens atmiņas. Nodot, ka virkne tur. Kāpēc ir tā, ka saistās dot mums problēmas, lai gan? Kas tas ir? Es atļauts piekļūt ka daļa no atmiņas? Ziniet, es nezinu. Tāpēc, ka ir buferi ir inicializēts uz kaut ko? Nav īsti. Un tāpēc tas ir tas, ko mēs esam aicinājuši atkritumu vērtību, kas nav formāls vārda. Tas tikai nozīmē, ka mums nav ne jausmas, ko biti ir iekšā no četriem baitiem, ka Man ir piešķirti kā buferis. Es neesmu sauc malloc. Es esmu noteikti nav sauc GetString. Tātad, kurš zina, kas ir faktiski iekšpusē no bufera? Un tomēr stāsta scanf akli, iet uz turieni un ielieciet kāds lietotājs drukāti. Tātad, kas var izraisīt mūsu kodu, ja mēs palaist to? Iespējams segfault. Varbūt ne, bet, iespējams, segfault. Un es saku varbūt nav, jo dažreiz jūs darāt, dažreiz jūs nesaņemat segfault. Reizēm jūs vienkārši saņemt laimīgs, bet tas tomēr būs bug mūsu programmā. Tātad, ļaujiet man iet uz priekšu un apkopo šo. Es esmu gatavojas to darīt vecās skolas ceļu. Tā šķindēt dash 0, scanf-1, scanf-1.c, Enter. Hmm, arī vecās skolas. Let 's redzēt. Uz kurieni es eju? Ak, char * buferis. Ak, paldies - Saglabāt, OK - ļoti vecs skolas. Labi, tas ir bijis, bet. Tāpēc es esmu tikko saglabāto failu pēc padarot šo pagaidu mainīt pirms brīža. Un tagad es esmu apkopojusi to manuāli ar šķindēt. Un tagad es iešu uz priekšu un palaist Scanf-1, Enter. String lūdzu. Es veida "sveiki". Un tagad, lūk, kur, godīgi sakot, printf var, ir mazliet kaitinošas. Tas nav faktiski gatavojas segfault šajā gadījumā. Printf ir nedaudz īpašs, jo tas ir tik super, ko parasti izmanto, ka būtībā printf dara mūs atbalsta, un saprotot, tas nav derīgs rādītājs. Ļaujiet man ņemt to uz sevi, lai tikai drukāt kas iekavās null, pat lai gan tas ne vienmēr tas, ko mēs paši gaidīts. Tātad, mēs nevaram īsti viegli izraisīt segfault ar šo, bet skaidri tas nav uzvedība es gribēju. Tātad, kas ir vienkāršs risinājums? Nu, Scanf-2, ļaujiet man ierosināt nevis faktiski tikai piešķirot char *, ļaujiet man būt mazliet gudrāki par to, un ļaujiet man piešķirt buferi jo secība 16 simboliem. Lai es varētu darīt to pāris veidos. Es varētu pilnīgi izmantot malloc. Bet es varu doties atpakaļ uz divām nedēļā, kad Man vajadzēja tikai visu ķekars rakstzīmes. Tas ir tikai masīvs. Tātad, ļaujiet man vietā jauna buferi būt masīvs 16 rakstzīmes. Un tagad, kad es iet bufera - un tas ir kaut kas, mēs neesam runāt par divu nedēļu - bet jūs varat ārstēt masīvu kā lai gan tas ir adrese. Tehniski, kā mēs esam redzējuši, viņi mazliet atšķirīgs. Bet scanf nebūs prātā, ja jūs nodot to nosaukums masīva, jo tas, ko Šķindēt darīs mūs būtībā ārstēt nosaukumu ka masīva kā adrese rieciens 16 baitu. Tātad, tas ir labāk. Tas nozīmē, ka šobrīd es varu cerams veiciet šādas darbības. Ļaujiet man attālinātu uz brīdi, un darīsim Scanf-2, apkopoti OK. Tagad ļaujiet man darīt tagad slīpsvītra scanf-2. String lūdzu. "Sveiki". Un tas šķita strādāt šo laiku. Bet var kāds ieteikt scenāriju , kurā tā varētu joprojām strādā? Yeah? Kaut kas garāks par 16 simboliem. Un patiesībā, mēs varam būt nedaudz precīzāks. Kaut ilgāk, tad 15 rakstzīmes, jo tiešām mums ir nepieciešams paturēt prātā ka mums ir nepieciešams, ka slīpsvītru nulles netieši beigās virknes, kas ir malā scanf parasti rūpējas par mums. Tātad, ļaujiet man darīt kaut kas līdzīgs - Dažreiz mēs varam vienkārši atstāt to, piemēram, ka. Labi, tāpēc mēs esam tagad izraisa Mūsu segmentāciju vaina. Kāpēc? Tāpēc, ka es drukāti uz vairāk nekā 15 rakstzīmes, un tāpēc mēs esam patiesībā pieskārās atmiņa, kas es patiesībā nevajadzētu būt. Tātad, kas īsti risinājums šeit? Nu, ko tad, ja mums ir nepieciešams ilgāks virkni? Nu, mēs varbūt būtu 32 baiti. Nu, ko tad, ja tas nav pietiekami ilgi? Kā par 64 baiti? Ko darīt, ja tas nav pietiekami ilgi? Kā par 128 vai 200 baiti? Kas īsti ir risinājums šeit vispārējā gadījumā, ja mēs nezinām, kas sekmēt to, ko lietotājs ir gatavojas rakstīt? Tas ir tikai sava veida liels sāpes ass, ja godīgi, kas ir kāpēc CS50 bibliotēkā ir daži desmiti rindiņas kodu, kas kopīgi īsteno GetString virkni, tādā veidā, ka mums nav ir iepriekš zināt, ko lietotājs gatavojas rakstīt. Jo īpaši, ja paskatās atpakaļ cs50.c no pirms divām nedēļām, jūs redzēsiet ka GetString tiešām nedrīkst izmantot scanf šādā veidā. Drīzāk, tas skan vienu rakstzīmi laikā. Tāpēc, ka viena jauka lieta par lasot vienu rakstzīmi ir, mēs varam nodrošināt sevi vienmēr ir vismaz viens char. Es tikai varu paziņot, char, un tad šie patiesi bērnu soļi, lai vienkārši lasīt vienu rakstzīmi pie laiks no klaviatūras. Un tad, ko jūs redzēsiet GetString tas ir katru reizi, kad tas iztek no, teiksim, 16 baitu atmiņas, tā izmanto malloc, vai brālēns tā, lai piešķirt vairāk atmiņas, kopējot vecā Atmiņas par jaunu, un tad indeksēšanu kopā, kļūst par vienu rakstzīmi laikā, un tad, kad tas darbojas no ka rieciens atmiņas, met to prom, greiferi lielāku rieciens atmiņas, kopijas vecs jaunu, un atkārtojas. Un tas ir patiesi sāpes, faktiski ieviest kaut ko tik vienkārši, kā iegūt datus no lietotāja. Tātad jūs varat izmantot scanf. Jūs varat izmantot citas līdzīgas funkcijas. Un mācību grāmatu daudz un tiešsaistes piemēriem, bet viņi visi neaizsargāta pret problēmām, piemēram, šo. Un galu galā, kļūst segfault ir sava veida kaitinošas. Tas nav labi, lai lietotājam. Bet sliktākajā gadījumā, ko dara tas būtībā nodot savu kods risks? Sava veida uzbrukumu, iespējams. Mēs runājām par vienu šādu uzbrukumu - pārpildīta kaudzīti. Bet vispār, ja jūs esat atļauts pārplūdes buferis, kā mēs to izdarījām pāris nedēļas atpakaļ, tikai ar rakstisku vairāk nekā "hello" uz skursteņa, jūs patiešām var pārņemt, iespējams, dators, vai vismaz nokļūt pie datiem, kas nepieder jums. Tātad, īsi sakot, tas ir iemesls, kāpēc mēs esam šie mācību riteņi. Bet tagad, mēs sākam ņemt tos off, kā mūsu programmas vairs nav nepieciešams, obligāti, ieeja no lietotāja. Bet, ja problēmas noteikts seši, Jūsu ieguldījums nāks no milzīga vārdnīca fails ar 150 dažiem nepāra tūkstoš vārdiem. Tātad jums nebūs jāuztraucas par lietotāja patvaļīgu ieejas. Mēs sniegsim jums dažus pieņēmumus par šo failu. Visus jautājumus par norādes vai Scanf vai lietotāja ievadi vispār? Visas tiesības, lai ātri apskatīt tad vienā trailing tēmu no pirms divām nedēļām. Un tas bija šis jēdziens no struktūrai. Ne, ka - šis jēdziens struct, kas bija tas, ko? Ko struktūrai darīt mums? Definēt - žēl? Definēt mainīgo tipu. Tātad sava veida. Mēs esam patiešām apvienojot divas tēmas. Tātad ar typedef, atcerēties, ka mēs varam atzīt veida mūsu pašu, piemēram, sinonīmu, piemēram, virkni par char *. Bet izmantojot typedef un struct, mēs varam radīt patiesi mūsu pašu datu struktūras. Piemēram, ja es dodos atpakaļ uz gedit šeit tikai brīdi, un es iet uz priekšu un darīt kaut ko līdzīgu, ļaujiet man ietaupīt to, kā, teiksim, structs.c laiku, es esmu tikai gatavojas iet uz priekšu, un arī standardio.h, int main spēkā neesošu. Un tad šeit, domāju, ka es gribu Uzrakstiet programmu, kas saglabā vairāki studenti no vairākām mājas, piemēram. Tātad, tas ir tāpat kā registrarial datu bāze sava veida. Tātad, ja man ir nepieciešams, vārdu viens students, es varētu darīt kaut ko līdzīgu char * Vārds, un es darīšu kaut ko līdzīgu - patiesībā, pieņemsim izmantot CS50 bibliotēku tikai brīdi, lai padarītu šo nedaudz vienkāršāka, lai mēs varētu aizņemties šie desmitiem rindas kodu. Un pieņemsim tikai saglabātu tā vienkārši. Mēs turpināsim to stīgu, un tagad GetString. Tāpēc es apgalvot tagad, ka es esmu saglabājis nosaukumu par kādu studentu, un nama daži students, vienkārši izmantojot mainīgos kā mēs un vienas nedēļas laikā. Bet domāju, ka es tagad gribu, lai atbalstītu vairāki studenti. Visas tiesības, lai mani instinkti ir jādara name2 stīgu, saņem GetString, stīgu house2 izpaužas GetString. Un tad mūsu trešais students, darīsim NAME3 GetString. Visas tiesības, tāpēc tas ir cerams pārsteidzoši Jums kā sava veida stulba, jo šis process ir tiešām nekad beigsies, un tas ir tikai gatavojas padarīt manu kods izskatās sliktāk un sliktāk un sliktāk. Bet mēs atrisināt šo pārāk otrajā nedēļā. Kāds bija mūsu salīdzinoši tīrs risinājums kad mums bija vairākas mainīgo tas pats datu tips, kas visi ir saistīti, bet Mēs nevēlējāmies šo zvērīgās putru ar līdzīgi nosaukumu mainīgie? Ko mēs darām tā vietā? Tāpēc es domāju, ka es dzirdēju dažas vietas. Mums bija masīvs. Ja jūs vēlaties vairākus gadījumus kaut kas, kāpēc nav mēs tīrs tas viss uz augšu un tikai saka, dod man masīvs sauc nosaukumus? Un tagad, pieņemsim, ir grūti koda 3. Un tad dod man citu masīvs sauc māju, un ļaujiet man Tagad grūti koda 3. Un es esmu masveidā sakopta haoss, ka es tikko izveidots. Tagad, es esmu vēl grūti kodēta 3, bet pat 3 varētu dinamiski nākt no lietotājs, vai argv, vai, piemēram,. Tātad tas jau ir tīrāks. Bet kas ir kaitinošas par šo ir tas, ka Tagad, pat ja nosaukums ir kaut būtībā saistīts ar studenta māja - tas ir students, kas man patiešām vēlas pārstāvēt - Man tagad ir divi bloki, kas ir paralēlas tādā ziņā, ka viņi ir tikpat liels, un vārdi kronšteins 0 domājams kartes uz mājas grupā 0, un nosaukumi kronšteins 1 kartes mājām stiprinājums 1. Citiem vārdiem sakot, ka studentu dzīvo ka nams, un ka citi studentu dzīvo šajā citā mājā. Bet, protams, tas varētu būt darīts vēl tīri. Nu, tas ir iespējams, patiesībā. Un ļaujiet man iet uz priekšu un atvērt uz augšu structs.h, un jūs redzēt šo ideju šeit. Ievērojiet, ka es esmu, ko izmanto typedef, kā jūs norādīja uz brīdi pirms pasludināt mūsu pašu datu tips. Bet es esmu arī izmantojot šo citu atslēgvārdu sauc struktūrai, kas dod man jaunu datu struktūra. Un tas datu struktūra es varu pieprasīt notiek ir divas lietas iekšpusē tā - stīgu sauc vārdu, un stīgu sauc māja. Un vārdu es esmu gatavojas dot šie dati tiek veidotas jaunas struktūras saukt students. Es varētu saukt kaut ko es gribu, bet tas semantiski padarītu jēga man manā prātā. Tāpēc tagad, ja es atvērtu labāku versiju Programmas es sāku rakstīt tur, ļaujiet man ritiniet uz augšu. Un tur ir vēl daži koda rindiņas šeit, bet ļaujiet man koncentrēties uz brīdis par vienu. Esmu paziņoja konstantu saucamo studentiem un grūti kodē 3 tagad. Bet tagad, pamanīsiet, cik tīrs mans kods sāk saņemt. 22 rindā, es apliecinu masīvs studentiem. Un ievēroju, ka students ir acīmredzami Tagad datu tips. Jo augšpusē šo failu, paziņojums Es esmu iekļauts, ka header failu ka es velk uz augšu tieši pirms brīža. Un tas header failu gluži vienkārši bija šī definīcija students. Tāpēc tagad, es esmu izveidojis savu pielāgoto datu veids, ka autori C gadus Pirms nedomāja par iepriekš. Bet nekādu problēmu. Es varu darīt to pats. Tātad tas ir masīvs sauc studenti, katrs locekļu ir students struktūra. Un es gribu, trīs no tiem masīvā. Un tagad, ko dara pārējie Šīs programmas darīt? Man vajadzēja kaut nedaudz patvaļīgu. Līdz ar to no tiešsaistes 24 vēlāk, Es atkārtot 0-3. Es tad pieprasīt no lietotāja studenta vārdu. Un tad es izmantoju GetString kā iepriekš. Tad es lūgt studenta mājā, un es izmantot GetString kā iepriekš. Bet paziņojums - nedaudz jauns gabals sintaksi - Es joprojām varat indekss i-tās students, bet kā es varu nokļūt pie konkrētiem datiem lauks iekšpusē struktūrai? Nu, kas ir acīmredzami jauns gabals sintaksi? Tas ir tikai dot operatoram. Mēs esam īsti redzējis to pirms tam. Jūs esat redzējuši to piecu PSET, ja jūs esat dived jau ar bitmap failus. Bet dot tikai nozīmē, iekšpusē tas struktūrai vai vairākus laukus, dot dot nosaukums, vai dot man dot māju. Tas nozīmē, ka iet iekšā no struct un saņemt šīs konkrētās jomās. Ko nozīmē šīs programmas atpūtas darīt? Tas vēl nav viss, kas seksīgi. Ievērojiet, ka es pārietu no 0 līdz 3 atkal, un es vienkārši izveidot angļu frāze, piemēram, tik un tā ir tāda un piemēram, māju, iet uz dot vārdu no i-students, un to māju, kā arī. Un tad visbeidzot, tagad mēs sāksim saņemt anālais par šo, tagad, ka mēs esam pazīstams ar to, malloc un citas funkcijas ir darot visu šo laiku. Kāpēc man, lai atbrīvotu gan vārdu un mājas, lai gan es nezvana malloc? GetString izdarīja. Un tas bija netīrs maz noslēpums vairākas nedēļas, taču GetString ir nav noplūdes atmiņā visā vieta visu pusgadu līdz šim. Un valgrand beidzot atklāj to mums. Bet tas nav liels galā, jo es zinu ka es varu vienkārši atbrīvot nosaukumu un māju, gan tehniski, lai būtu super, super droša, es būtu darot kādu kļūdu pārbaudi šeit. Kādas ir jūsu instinkti stāsta jums? Ko man vajadzētu pārbaudīt, pirms es atbrīvot to, kas ir string, aka kas char *? Es tiešām vajadzētu pārbaudīt, ja skolēni kronšteins i dot vārdu nav vienādi null. Tad tas būs OK, lai iet uz priekšu un bez maksas ka rādītājs, un tas pats vai cits viens, kā labi. Ja skolēni kronšteins i dot māja nav vienāds ar nulli, tagad tas pasargās pret stūra gadījumā, kurā GetString atgriež kaut ko līdzīgu null. Un mēs redzējām pirms brīža, printf būs aizsargātu mūs šeit, vienkārši sakot, null, kas gatavojas izskatās dīvaini. Bet vismaz tas nebūs segfault, kā mēs esam redzējuši. Nu, ļaujiet man darīt viena cita lieta šeit. structs-0, ir sava veida stulba programmas jo es ievadīt visus šos datus, un pēc tam tas ir zaudējis, kad programma beidzas. Bet ļaujiet man iet uz priekšu un darīt to. Ļaujiet man termināla logu nedaudz lielāks. Ļaujiet man structs-1, kas ir jauna versija par to. Es tuvinātu mazliet. Un tagad ļaujiet man palaist dot slash structs-1. Studenta vārds - David Mather, pieņemsim do Rob Kirkland, darīsim Lauren Leverett. Kas ir interesanti tagad ir paziņojums - un es zinu tikai tāpēc, ka Es uzrakstīju programmu - tur ir fails tagad mana pašreizējā direktorija sauc students.csv. Daži no jums varētu būt redzējis šie reālajā pasaulē. Kas ir CSV fails? Komatu atdalītas vērtības. Tas ir veida, piemēram, nabadzīgo ļaužu versija Excel failā. Tā ir tabula ar rindu un kolonnu, kas Jūs varat atvērt programmas, piemēram, Excel, vai Skaitļi par Mac. Un, ja es atvērtu šo failu šeit gedit, Paziņojums - un to skaits nav tur. Tas ir tikai gedit stāsta me līniju numuri. Paziņojums par pirmās līnijas tas fails ir Dāvids un Mather. Nākamais rindā ir Rob komats Kirkland. Un trešajā rindā ir Lauren komats Leverett. Tātad, kas ir I izveidojis? Man tagad ir rakstīts C programmu, kas faktiski var radīt izklājlapas kas var tikt atvērts programma, piemēram, Excel. Ne visi, kas pārliecinoši datu kopumu, bet ja jums ir daudz lielākas gabalos dati, ka jūs tiešām vēlaties manipulēt un izdarīt grafikus un piemēram, tas ir iespējams, ir viens veids, kā radīt šos datus. Turklāt, CSVs ir faktiski super kopīgas tikai glabāšanai vienkāršu datu - Yahoo Finance, piemēram, ja jums akciju cenas, izmantojot savu tā saukto API, bezmaksas pakalpojums, kas ļauj saņemt pašreizējo up-to-atjauninātu sastāvu pēdiņām uzņēmumi, tie sniedz datus atpakaļ super vienkārši CSV formātā. Tātad, kā mēs to darām? Nu novērojat, lielākā daļa no šīs programmas ir gandrīz vienāds. Bet paziņojums šeit lejā, nevis drukāt studenti uzmanību, par 35 līniju tālāk, es apgalvot, ka es esmu ietaupot studenti uz diska, lai saglabājot failu. Tāpēc paziņojums es esmu deklarējot failu * - Tagad, tas ir sava veida anomālija, kas C. Kaut kāda iemesla dēļ, FILE ir visi vāciņi, kas nav tāpat kā lielākā daļa citu datu tipu in C. Bet tas ir iebūvēts datu tips, FILE *. Un es esmu atzīst rādītāju uz failu, ir, kā jūs varat iedomāties, ka. fopen nozīmē atvērtu failu. Ko fails jūs vēlaties, lai atvērtu? Es gribu, lai atvērtu failu, ka es patvaļīgi zvanu students.csv. Es varētu saukt, ka kaut ko es gribu. Un tad ņem minējums. Kāda otrais arguments līdz fopen iespējams, nozīmē? Tiesības, W rakstīt, varētu būt r par lasīt. Tur, lai pievienot, ja jūs vēlaties pievienot rindas un ne pārrakstīt visu lieta. Bet es tikai vēlos, lai izveidotu šo failu vienu reizi, tāpēc es ņemšu izmantot quote likt pēdiņas beigās w. Un es zinu, ka tikai izlasot dokumentāciju, vai cilvēks lapā. Ja fails nav Null - citiem vārdiem sakot, ja nekas nogāja greizi tur - ļaujiet man atkārtot vairāk studenti no 0 līdz 3. Un tagad paziņojums tur ir kaut kas kādreiz tik nedaudz atšķiras par line 41 šeit. Tas nav printf. Tas ir fprintf failu printf. Tātad, tas ir gatavojas rakstīt failā. Kuru failu? Viens, kuru rādītājs norādāt kā pirmais arguments. Tad mēs norādīt formāta virknes. Tad mēs precizē, kāda stīgu mēs vēlamies plug in par pirmo procentu s, un tad vēl mainīgu vai otrais procenti s. Tad mēs aizveriet failu ar fclose. Nekā es atbrīvotu atmiņu, kā līdz šim, kaut Man vajadzētu doties atpakaļ un pievienot dažas pārbaudes null. Un tas arī viss. fopen, fprintf, fclose dod man Spēja radīt teksta failus. Tagad jūs redzēsiet problēmu kopumu pieciem, kas ietver attēlus, jūs izmantojat bināro failu vietā. Bet būtībā, iecere ir tāda pati, pat ja funkcijas jūs redzēt ir nedaudz atšķirīgs. Tātad viesulis ceļojums, bet jūs saņemsiet pārāk pazīstams ar failu I/O-- ieejas un izejas - ar pieciem PSET. Un kādi jautājumi par sākotnējie pamati šeit? Yeah? Ko darīt, ja jūs mēģināt, lai atbrīvotu Null vērtību? Es uzskatu, ka, ja vien bez maksas ir gotten nedaudz vairāk lietotājam draudzīgu, jūs varat potenciāli segfault. Iet tas null ir slikti, jo man nav uzskata, brīvi traucē, lai pārbaudītu jums, jo tas, iespējams, varētu būt atkritumi laika, lai to darīt sevi visiem visā pasaulē. Labs jautājums, lai gan. Labi, tāpēc šāda veida izpaužas mums interesantu tēmu. Tēma problēmu kopuma pieci ir kriminālistikas. Vismaz tas ir daļa par problēmu kopu. Kriminālistikas parasti attiecas uz atgūt informāciju, kas var vai iespējams, nav izdzēsts apzināti. Un tāpēc es domāju, es gribētu jums ātri garša par to, kas patiesībā notiek visu šoreiz zem kapuci datora. Piemēram, ja jums ir iekšpusē jūsu klēpjdatoru vai darbvirsmas datoru cietais disks, tas ir vai nu mehāniska ierīce, kas faktiski griežas - tur ir apļveida lietas, ko sauc šķīvji , kas izskatās gluži tāpat kā tas, ko es tikko bija up ekrānā šeit, lai gan tas ir arvien vairāk vecās skolas. Tas ir trīs-un-ar pusi collu cieto disku. Un trīs ar pusi collas attiecas uz ar no lieta, kad jūs instalējiet to ar datoru. Daudzi no jums, puiši jūsu klēpjdatorus tagad ir cietvielu disku, vai SSD, kas nav kustīgu daļu. Viņi vairāk, piemēram, RAM un mazāk kā šīs mehāniskās ierīces. Bet idejas joprojām ir tas pats, protams, tie attiecas līdz problēma noteikti pieci. Un, ja jūs domājat par to tagad cieto disku ir ir aplis, kas Es izdarīt, piemēram, šo šeit. Kad jūs izveidojat failu uz jūsu datora, vai tas ir SSD, vai Šajā gadījumā vecāki, skola cieto disku, ka fails ietver vairākas bitiem. Pieņemsim, ka tas ir šis 0 un 1, viss ķekars 0s un 1s. Tātad šis ir mans visu cieto disku. Tas ir acīmredzami diezgan liels fails. Un tas ir, izmantojot uz augšu 0s un 1s pie ka daļa fiziskā plate. Nu, kas tas ir fiziskā daļa? Nu, izrādās, ka uz cietā diska, vismaz no šāda veida, tur šie tiny maz magnētiskās daļiņas. Un tie būtībā ir uz ziemeļiem un dienvidiem stabi viņiem, tā, ka, ja jūs savukārt vienu no šīm magnētiskajām daļiņām Tādā veidā, jūs varētu teikt, ka tā ir pārstāv 1. Un, ja tas ir otrādi dienvidiem ziemeļiem, jūs varētu teikt, ka tas ir pārstāv 0. Tātad reālajā fiziskajā pasaulē, tas ir Kā jūs varētu būt kaut kas bināro no 0 stāvoklis un 1. Tātad tas viss fails ir. Tur viss ķekars magnētiskā daļiņas, kas ir to šādā veidā, vai šādā veidā, radot modeļus no 0s un 1s. Bet izrādās, kad saglabājat failu, kāda informācija tiek saglabāta atsevišķi. Tātad tas ir galdiņš, direktoriju, lai runāt. Un es aicinu šo kolonnas nosaukuma, un Es aicinu šo sleju vietu. Un es esmu gatavojas teikt, pieņemsim, ka šis ir mans CV. Mans resume.doc tiek uzglabāts vieta, teiksim 123. Es vienmēr iet uz šo numuru. Bet pietiek pateikt, ka tāpat kā RAM, jūs varat veikt cieto disku Tas ir gigabaitu vai 200 gigabaitiem vai terabaitu, un jūs varat skaits, visi baiti. Jūs varat saskaitīt visus gabalus 8 biti. Tāpēc mēs sakām, ka šis ir vieta 123. Tātad šajā direktorijā iekšpusē manas darbības Sistēma atceras, ka mana atsākt ir 123 vietu. Bet tā kļūst interesanti, kad izdzēšat failu. Tātad, piemēram - un par laimi, lielākā daļa pasaulē ir noķerti uz šo - kas notiek, kad Velkot failu uz jūsu Mac OS miskastes vai jūsu Windows Recycle Bin? Kāda ir to izdarīt, mērķis? Tas ir acīmredzami, lai atbrīvotos no faila, bet ko tas velkot aktu un krītot uz jūsu miskastes, vai jūsu Recycle Bin paveikt ar datoru? Absolūti nekas, tiešām. Tas ir tāpat kā mapē. Tas ir īpašs mapi, lai pārliecinātos. Bet vai tas tiešām izdzēst failu? Nu, nē, jo daži no jums, iespējams, ir bijis, piemēram, oh damn, jums nav nozīmē, lai to izdarītu. Tātad jūs dubultklikšķi Trash vai Recycle Bin. Jūs esat poked apkārt un jūs esat jāatgūst failu, vienkārši velkot to no tur. Tik skaidri, tas ne vienmēr ir dzēšanu. Labi, jūs esat gudrāki, nekā. Jūs zināt, ka vienkārši velkot to Trash vai Recycle Bin nenozīmē jūs iztukšot miskasti. Tātad jūs iet uz augšu uz izvēlni, un jūs sakāt Empty Trash vai Empty Recycle Bin. Kas notiks tālāk? Jā, tāpēc tas tiek izdzēsts vairāk. Bet viss, kas notiek, tas ir. Dators aizmirst, kur resume.doc bija. Bet ko nav mainījies acīmredzot attēlā? Biti, 0s un 1s, ka es varu pieprasīt, ir uz vietas dažu fizisko aspektu aparatūras. Viņi joprojām. Tas ir tikai dators ir aizmirsuši, kas viņi ir. Tātad, tas ir būtībā atbrīvoja fails ir biti tā, ka tos var izmantot atkārtoti. Bet ne, kamēr jums izveidot vairākus failus, un vairāk failus, un vairāk faili probabilistically, kas 0s un 1s, šie magnētiskās daļiņas, saņemt atkārtoti, Otrādi vai labajā pusē uz augšu, uz citi faili, 0s un 1s. Tātad jums ir šo logu laika. Un tas nav prognozējama garums, tiešām. Tas ir atkarīgs no lieluma jūsu cietā disku un cik daudz failus, jums ir un cik ātri jūs veicat jaunas. Bet tur tas ir laika logs laikā kas tas fails joprojām ir pilnīgi atlīdzināmi. Tātad, ja jūs kādreiz izmantot programmas, piemēram, McAfee vai Norton, lai mēģinātu atgūt datiem, visi viņi dara, cenšas atgūt šo tā saukto direktoriju izdomāt, kur jūsu fails bija. Un dažreiz Norton un teiks, fails ir 93% atlīdzināmi. Nu, ko tas nozīmē? Tas tikai nozīmē, ka kādu citu failu nejauši beidzās ar, teiksim, šie biti no jūsu sākotnējā faila. Tātad, kas ir faktiski iesaistīti atgūt datus? Nu, ja jums nav kaut kas līdzīgs Norton iepriekš instalēta datorā, labākais jūs varat dažreiz darīt, ir meklēt pēc visu cieto disku meklē modeļus bitiem. Un viens no problēmu kopumu tēmas pieci ir, ka jūs meklēt ekvivalentu cieto disku, kriminālistikas tēls kompaktu flash karti no digitālā kamera, meklējot 0s un 1s ka parasti, ar augstu varbūtība, pārstāv sākums JPEG attēlu. Un jūs guys var atgūt šos attēlus, pieņemot, ka, ja es redzu šo modeli biti uz tiesu tēlu, ar liela varbūtība, kas iezīmē sākums JPEG. Un, ja es redzu to pašu modeli atkal, ka, iespējams, iezīmē sākumu cits JPEG, un vēl JPEG, un vēl JPEG. Un tas parasti ir, kā datu atgūšanas strādās. Kas ir jauka par JPEG ir kaut faila formāts pats par sevi ir nedaudz komplekss, sākums katra šāda fails ir faktiski diezgan identificējama un vienkārši, kā jūs redzēsiet, ja jūs esat jau nav. Tātad, pieņemsim ņemt tuvāk apskatīt zem hood par to, tieši to, kas ir bijis notiek, un kādi tie 0s un 1s ir, lai dotu jums mazliet vairāk konteksts šo konkrēto problēmu. [VIDEO PLAYBACK] -Ja jūsu dators saglabā visvairāk tās pastāvīgajiem datiem. Lai to izdarītu, datu ceļo no RAM kopā ar programmatūras signāliem, kas liecina cieto disku, kā uzglabāt šos datus. Cieto disku shēmas tulkot šie signāli uz sprieguma svārstības. Tie, savukārt, kontrolē cietais disks ir kustīgās daļas, daži maz kustīgās daļas palikušas Mūsdienu dators. Daži no signālu kontrolēt motoru kas griežas metāla pārklājumu šķīvji. Jūsu dati ir faktiski uzglabā par šiem šķīvji. Citi signāli pārvietot lasīšanas / rakstīšanas galvas, lai lasītu vai rakstīt datus par šķīvji. Šī mašīna tik precīzs, ka cilvēka mati pat nevarēja paiet galvas un vērpšanas šķīvji. Tomēr, tas viss strādā drausmīgs ātrumu. [END VIDEO PLAYBACK] DAVID Malan: Zoom in nedaudz dziļāk tagad to, kas ir faktiski par šīm šķīvji. [VIDEO PLAYBACK] -Apskatīsim ko mēs tikko redzēja palēninājumā. Ja īsu impulsu elektroenerģijas ir nosūtīts uz lasīšanas / rakstīšanas galviņu, ja flips uz tiny elektromagnētisko par daļa otrā. Magnēts rada lauku, kas mainās polaritāte tiny, tiny daļa no metāla daļiņas, kas mētelis katru plate virsmu. Modelis sērija no šiem tiny, uzlādēts-up jomas, uz diska pārstāv vienu bitu dati bināro numuru sistēma, ko izmanto datoros. Tagad, ja strāva tiek nosūtīta viens veids ar lasīšanas / rakstīšanas galviņu, teritoriju ir polarizēts vienā virzienā. Ja strāva ir nosūtīts pretējā virzienā, polarizācija ir pretēja. Kā jūs iegūt datus no cietā diska? Vienkārši mainīt šo procesu. Tātad, tas ir daļiņas uz diska ka iegūt strāva lasīšanas / rakstīšanas galviņa pārvietojas. Savākt miljoniem šos magnetizētus segmenti, un tev failu. Tagad, tad vienā failā gabali var būt izkaisīti pa visu disku s šķīvji, veida, piemēram, putru par dokumentus par sava rakstāmgalda. Tāpēc īpaša papildu fails seko , kur viss ir. Vai ne jūs vēlaties jums bija kaut kā tā? [END VIDEO PLAYBACK] DAVID Malan: Labi, iespējams, nav. Tik, cik daudzi no jums puiši uzauguši ar šiem? Labi, tāpēc tas ir mazāk un mazāk rokas katru gadu. Bet es esmu priecīgs jūs vismaz pazīstami ar viņiem, jo ​​šo un mūsu pašu Grāmata demo, diemžēl, mirst ļoti lēna nāve šeit familiaritāte. Bet tas ir tas, ko es, vismaz, atpakaļ vidusskolas, ko izmanto izmantošana backups. Un tas bija pārsteidzošs, jo jūs var uzglabāt 1,4 megabaiti par šo konkrēto disku. Un tas bija augsta blīvuma versiju, kā norādīts ar HD, kas ir kas nozīmē, pirms šodienas HD video. Standarta blīvums bija 800 kilobaiti. Un pirms tam, bija 400 kilobaiti diski. Un pirms tam, bija 5 un 1/4 collu diski, kas bija patiešām disketes, un nedaudz platāks un augstāks par šīm lietām šeit. Bet jūs faktiski var redzēt tā saukto floppy aspekts šiem diskiem. Un funkcionāli, viņi faktiski diezgan līdzīgs diskdziņiem pie Vismaz šāda veida. Atkal, SSD ar jaunāku datoru strādā nedaudz savādāk. Bet, ja jūs pārvietoties ka maz metāla cilni, Jūs faktiski var redzēt nedaudz cookie, vai plate. Tas nav metāla, piemēram, šo vienu. Tas viens ir tiešām dažas lētāk plastmasas materiāls. Un jūs varat veida valstīties it. Un jūs esat trully tikai jānoslauka dažas bitu skaitu vai magnētiskām daļiņām no šī diska. Tātad par laimi, tur nekas par to. Ja šī lieta ir ceļā - un aptver acis un Jūsu kaimiņš - Jūs varat vienkārši veida pull šo Visa apvalks off, piemēram, ka. Bet tur ir maz pavasarī, tāpēc apzinās, ka ar jūsu acīm. Tātad, tagad jums ir patiesi disketi. Un, kas ir ievērojams par šo ir tā, ka ir tik daudz, cik tas ir maza mēroga pārstāvība lielāka cietais disks, šīs lietas ir super, super vienkārši. Ja jūs saņemiet apakšā to tagad, ka metāla lieta ir off, un miza tos atvērt, viss notiek, ir divi gabali filcs un tā saukto diskete ar metāla gabals no iekšpuses. Un tur iet pusi mana diska saturu. Tur iet vēl puse no tiem. Bet tas ir viss, kas bija vērpšanai iekšpusē Jūsu datorā vakardienas. Un atkal, tas tiktu ieviests perspektīvā, cik liels ir lielākā daļa no jūsu cieto disku šajās dienās? 500 gigabaiti, terabaitu, varbūt galddators, 2 terabaitiem, 3 terabaitiem, 4 terabaitiem, labi? Šis ir viens megabaitu, sniegt vai pieņemt, kas nevar pat fit tipiska MP3 vairs šajās dienās, vai dažas līdzīgi mūzikas failu. Tik maz suvenīru jums šodien, un arī palīdzēt kontekstualizēt ko mēs, ņemot par pašsaprotamu tagad problēma noteikti pieci. Tātad tie ir jūsu, lai saglabātu. Tātad, ļaujiet man pāreja, kur būs izdevumu nākamo PSET, kā arī. Tāpēc mēs esam tagad ir noteikts šo lapu - oh, pāris paziņojumiem ātri. Šo piektdien, ja vēlaties pievienoties CS50 pusdienām, dodieties uz ierastajā vietā, cs50.net/rsvp. Un galīgais projekts - tāpēc vienu mācību, mēs esam ievietojis galīgais projekts specifikācija jau ir. Saprast, ka tas nenozīmē, ka tas ir saistīts īpaši ātri. Tas ir ievietojis, tiešām, tikai, lai iegūtu jūs guys domāt par to. Un tiešām, super ievērojams procentos no jums būs novērst galīgie projekti par materiālu, ko mēs nav pat gotten uz klasē, bet būs jau nākamajā nedēļā. Paziņojuma, lai gan, ka spec aicina daži dažādu komponenti galīgais projekts. Pirmais, pēc pāris nedēļām, ir kārtas pieteikumā, diezgan gadījuma e-pastu Jūsu TF pateikt viņam, ko jūs esat domāt par savu projektu, ar nekādas saistības. Priekšlikums būs jūsu īpaši saistības, sakot, šeit, tas ir tas, ko Es gribētu darīt manu projektu. Ko jūs domājat? Pārāk liels? Pārāk mazs? Vai tas ir pārvaldāms? Un jūs redzat spec lai saņemtu sīkāku informāciju. Pāris nedēļas pēc tam, kad tas ir statuss ziņojums, kas ir līdzīgi gadījuma e-pastu uz jūsu TF pateikt, cik tālu aiz jums ir jūsu gala projekta īstenošana, kam seko CS50 Hackathon uz kuru visi ir aicināta, kas būs notikums, no 20:00 uz vienu vakaru līdz 07:00 AM nākamajā rītā. Picas, kā es varētu būt minēts nedēļā nulle, wil tiks pasniegtas 09:00, Ķīniešu virtuve at 01:00. Un, ja jūs joprojām nomodā 05:00, mēs tevi IHop brokastīm. Tā Hackathon ir viens no vairāk neaizmirstamu pieredzi šajā klasē. Tad īstenošana ir saistīts, un tad klimatiskajiem CS50 Fair. Sīkāka informācija par visiem šiem dažu nedēļu laikā nākt. Bet iesim atpakaļ uz kaut ko vecās skolas - atkal, masīvs. Tātad masīvs bija jauki, jo tas atrisina problēmas, piemēram, mēs redzējām tikai pirms brīža ar studentu struktūrām kļūst mazliet ārpus kontroles, ja mēs gribu būt students vienu, students divas, students trīs, students dot dot dot, daži patvaļīgi studentu skaits. Tātad blokiem, pirms dažām nedēļām, swooped un atrisināt visas mūsu problēmas, ne iepriekš zināt, cik daudz no kaut kāda veida mēs varētu vēlēties. Un mēs esam redzējuši, ka structs var palīdzēt mums turpmāk organizēt mūsu kodu un saglabāt konceptuāli līdzīgi mainīgie, piemēram, nosaukums un māja, kopā, lai mēs var uzskatīt tos par vienu vienību, iekšpusē no kuriem ir mazāki gabali. Bet masīvi ir daži trūkumi. Kādi ir daži no trūkumiem mēs esam saskārušās ar masīviem līdz šim? Kas tas ir? Fiksēta izmēra - tā, pat ja jūs varētu varētu piešķirt atmiņu masīvs, kad jūs zināt, cik daudz studentu Jums ir, cik rakstzīmes jums ir no lietotāja, kad esat sadala masīvs, jūs esat veida krāsots sevi stūrī. Tāpēc, ka jūs nevarat ievietot jaunus elementus uz centru no masīva. Jūs nevarat ievietot vairāk elementiem gada beigās masīva. Tiešām, jums ir jāizmanto, lai izveidotu pilnīgi jaunu masīvs, kā mēs esam apspriests, kopējot vecā uz jauno. Un atkal, ka ir galvassāpes, kas GetString nodarbojas ar jums. Bet atkal, jūs pat nevarat ievietot kaut kas vērā vidū masīva ja likme nav pilnībā aizpildīta. Piemēram, ja šis masīvs šeit lieluma seši ir tikai piecas lietas tajā, labi, jūs varētu vienkārši lavierēt kaut uz beigām. Bet ko tad, ja vēlaties ievietot kaut ko vērā vidū masīvs, lai gan tas varētu būt piecas no sešām lietām tajā? Nu, ko mēs darām, kad mums bija visi no mūsu brīvprātīgajiem skatuves ar nedēļas agrāk? Ja mēs vēlējāmies, lai kāds šeit, vai nu šie cilvēki, kā pārvietot šo veidā, vai šie cilvēki, kā virzīties uz šo veids, un tas kļuva dārgi. Novirzot cilvēku iekšpusē masīvs beidzās saskaitot un izmaksu mums laiku, līdz ar to daudz mūsu n kvadrātā rādīt reizes, piemēram ievietošanas kārtot, lai Piemēram, sliktākajā gadījumā. Tātad bloki ir liels, bet jums ir iepriekš zināt, cik liels vēlaties tos. Tātad Labi, šeit ir risinājums. Ja man nav iepriekš zināt, cik daudz studentiem es varētu būt, un es zinu, reiz Es nolemju, lai gan, es esmu iestrēdzis ar to daudzi studenti, kāpēc ne es tikai vienmēr piešķirt divreiz tik daudz vietas kā es varētu domāt, man ir nepieciešams? Vai tas nav saprātīgs risinājums? Reāli, es nedomāju, ka mēs esam būs nepieciešams vairāk nekā 50 slots masīva par vidēja lieluma klases, tāpēc pieņemsim tikai noapaļot uz augšu. Es ņemšu veikt 100 nišas manā masīvs, vienkārši lai mēs varētu noteikti iegūt studentu skaits, es gaidīt, lai būt kāda vidēja izmēra klasē. Tātad, kāpēc ne tikai noapaļot uz augšu, un piešķirt vairāk atmiņas, parasti, masīva nekā jūs domājat, ka jums var būt pat nepieciešama? Kas tas ir vienkāršs pushback ar šo ideju? Jūs vienkārši izšķērdēt atmiņu. Burtiski katru programmu, jums rakstīt, tad ir varbūt izmantojot divreiz tik daudz atmiņas, kā jums tiešām ir nepieciešams. Un tas vienkārši nav justies kā Īpaši elegants risinājums. Turklāt, tas tikai samazinās varbūtība problēmu. Ja jums gadās būt populārs kursu viens semestris un jums ir 101 studenti, jūsu programma ir vēl pamatos vērsts uz to pašu jautājumu. Tātad par laimi, tur ir risinājums, lai Šī reklāma visas mūsu problēmas, kas izpaužas datu struktūras, kas ir sarežģītāka nekā tiem, mēs esam redzējuši līdz šim. Tas, es pretenziju, ir saistīts saraksts. Šis ir saraksts ar numuriem - 9, 17, 22, 26, 34 un - , kas ir savstarpēji saistīti ar ceļu par to, ko es esmu sagatavots kā bultiņām. Citiem vārdiem sakot, ja es gribēju, lai pārstāvētu masīvs, es varētu darīt kaut kas līdzīgs šim. Un es nolikšu to pie griestiem tikai brīdi. Es varētu darīt - sveiki, visi labi. Gaidīšanas. Jauns dators šeit, skaidrs - Labi. Tātad, ja man ir šos skaitļus masīvā - 9, 17, 22, 26, 24 - ne vienmēr mērogā. Labi, tāpēc šeit ir mana masīvs - Ak mans Dievs. Labi, tāpēc šeit ir mana masīvs. Ak mans Dievs. [Smiekli] DAVID Malan: Pretend. Tas ir pārāk daudz pūļu, lai dotos atpakaļ un noteikt, ka tā tur - 26. Tātad mums ir šis masīvs 9, 17, 22, 26, 34 un. Attiecībā uz tiem no jums, var redzēt neērts kļūda Es tikko veikts, tur tas ir. Tāpēc es apgalvo, ka tas ir ļoti efektīvs risinājums. Esmu piešķirti tik daudz ints kā Man vajag - viens, divi, trīs, četriem, pieciem, sešiem vai - un es esmu tam uzglabā skaitļus iekšā šajā masīvā. Bet pieņemsim, tad, es gribu, lai ievietotu vērtība, piemēram, ar numuru 8? Nu, ja tas iet? Pieņemsim, ka es gribu, lai ievietotu numuru, piemēram, 20. Nu, ja tas iet? Kaut kur pa vidu, vai skaitlis 35 ir iet kaut kur beigās. Bet es esmu visu no kosmosa. Un tā tas ir būtisks izaicinājums ar masīvu tas ir risinājums. Es apgalvoja pirms brīža, GetString atrisina šo problēmu. Ja vēlaties ievietot sesto numuru šajā masīva, kas ir vismaz viens risinājums, jūs varat krist atpakaļ, lai pārliecinātos, tāpat kā mēs ar GetString? Kas tas ir? Nu, padarītu to lielāku ir vieglāk pateikt, nekā izdarīt. Mēs nevaram vienmēr padarīt masīvs lielāks, bet ko mēs varam darīt? Izveidojiet jaunu masīvu, kas ir lielāka, par lielumu 6, vai varbūt size 10, ja mēs vēlamies lai apsteigtu lietām, un tad kopēt vecais masīvs uz jaunu, un pēc tam atbrīvotu veco masīvs. Bet kas ir darba laiks Tagad šī procesa? Tas ir liels O n, jo kopēšana gatavojas izmaksas jums dažas vienības laiks, tāpēc nav tik ideāls, ja mums ir piešķirt jaunu masīvu, kas notiek patērēt divreiz tik daudz atmiņā laiku. Kopēt veco par jaunu - Es domāju, tas ir tikai galvassāpes, kas ir, atkal, kāpēc mēs rakstījām GetString jums. Tātad, ko mēs varbūt darīt tā vietā? Nu, ko tad, ja mūsu datu struktūra patiesībā ir nepilnības to? Pieņemsim, ka es atpūsties savu mērķi, kam kaimiņu gabalos atmiņas, kur 9 ir tieši blakus 17, kas ir blakus 22, un tā tālāk. Un pieņemsim, ka 9 var būt vairāk nekā šeit RAM, 17 un var būt vairāk nekā šeit RAM, un 22 var būt vairāk nekā šeit RAM. Citiem vārdiem sakot, man nav nepieciešams tos pat atpakaļ atpakaļ vairs. Man vienkārši ir kaut ievērt adatā diegu caur katru no šiem numuriem, vai katrs no šiem mezgliem, kā mēs to saucam taisnstūri, kā es esmu izstrādāti tiem, uz atceros, kā nokļūt līdz pēdējo piemēram mezglu no pirmās. Tātad, kas ir plānošanas būvēt mēs esam redzējuši pavisam nesen, ar kuru es var īstenot šo pavedienu, vai izstrādāts šeit, ar kuru es varu īstenotu šos bultas? Tātad norādes, vai ne? Ja es piešķirt ne tikai int, bet mezglu - un mezglā, es tikai domāju konteiners. Un vizuāli, es domāju taisnstūri. Tātad mezglu acīmredzot vajadzībām lai ir divas vērtības - int pati par sevi, un pēc tam, kā tas ir norādīts apakšējā puse no taisnstūra, pietiekami daudz vietas, lai int. Tik vienkārši domāšana uz priekšu šeit, cik liels ir šis mezgls, tas konteineru attiecīgais? Cik baiti int? Jādomā 4, ja tas ir tāds pats kā parasti. Un tad cik daudz baitu par rādītāju? 4. Tātad šis konteiners, vai šis mezgls, ir būs 8 baitu struktūra. Ak, un tas ir laimīga sakritība, ka mēs tikko ieviesusi šo jēdzienu struktūrai, vai C struktūra. Tāpēc es apgalvot, ka es gribu spert soli pret šo sarežģītākas īstenošanu saraksta numuru, ar saistīts saraksts ar skaitļiem, man ir jādara nedaudz vairāk, līdz priekšā domāšana un atzīt ne tikai int, bet struct ka es zvanu, parasti šeit, mezglu. Mēs varētu saukt kaut ko mēs gribam, bet mezglā būs tematiska daudz lietas, ko mēs sākt meklēt tagad. Inside šo mezglā ir int n. Un tad tas sintaksi, nedaudz dīvaini, pēc pirmā acu uzmetiena - struct mezglā * nākamo. Nu piktogrammām, kas tas ir? Tas ir apakšējā puse no taisnstūris, ka mēs redzējām tikai pirms brīža. Bet kāpēc es saku struct mezglā * nevis tikai mezglu *? Jo, ja tas rādītājs ir vērsta citā mezglā, tas ir tikai adrese mezglā. Tas ir saskaņā ar to, ko mēs esam apspriesti par norādes līdz šim. Bet kāpēc, ja man apgalvo, šī struktūra ir sauc par mezglu, man jāsaka struct mezglu iekšā šeit? Tieši tā. Tas ir sava veida stulbu realitātes C. Typedef, tā sakot, tā nav noticis yet. C ir super burtiski. Tas skan jūsu kodu augšas uz apakšas, kreisās puses uz labo. Un, kamēr tas hits, ka semikolu par apakšējā līnija, uzminēt, ko nav pastāvēt kā datu tipu? Mezglā, citējot likt pēdiņas beigās mezglā. Bet tāpēc, ka vairāk runīgs deklarācija I did pirmajā līnijā - typedef struktūrai mezglu - tāpēc, ka tas bija pirmais, pirms cirtaini bikšturi, tas ir veida, piemēram, iepriekš izglītojot šķindēt, ka jūs zināt, ko, iedodiet man struct sauc struct mezglā. Atklāti sakot, man nepatīk, aicinot lietas struct mezglā, struktūrai mezgls visu visā manā kodu. Bet es ņemšu izmantot tikai to vienu reizi, tikai iekšpusē, tāpēc, ka es varu efektīvi radīt sava veida apļveida atsauces, kas nav rādītāju uz sevi per se, bet gan rādītājs uz citu identiska tipa. Tātad izrādās, ka par datu struktūru kā šis, tur ir maz darbības, kas varētu būt , kas interesē mūs. Mēs varētu vēlēties, lai ievietotu par sarakstu, piemēram, šis. Mēs varētu vēlēties, lai dzēstu no saraksta, piemēram, šis. Mēs varētu vēlēties, lai meklētu sarakstu vērtību, vai, plašākā nozīmē, traversa. Un traversa ir tikai iedomātā veids sakot sākt pa kreisi, un pārvietot visus veids, kā labi. Un paziņojums, pat ar to nedaudz vairāk sarežģītu datu struktūra, lai es ierosinu, ka mēs varam aizņemties dažus idejas, kas pēdējo divu nedēļu laikā un īstenotu ko sauc funkciju meklēt, kā šis. Tas notiek, lai atgrieztos taisnība, vai nepatiesi, norādot, jā vai nē, n ir sarakstā. Tās Otrs arguments ir rādītājs līdz sarakstā pati, tā rādītāju uz mezglu. Viss, ko es esmu gatavojas, lai pēc tam darīt, ir atzīt pagaidu mainīgo. Mēs to saucam par PTR pēc vienošanās, par rādītāju. Un es piešķirt to vienāds sākumā sarakstā. Un tagad paziņojums, kamēr cilpa. Tik ilgi, kamēr rādītājs nav vienāds Null, es esmu gatavojas pārbaudīt. Ir rādītājs arrow n ir vienāds ar n, kas tika pieņemts? Bet pagaidiet minūti - jauns gabals sintaksi. Kas ir bultiņa pēkšņi? Yeah? Tieši tā. Tātad, tā kā pirms dažām minūtēm, mēs izmantojām dot notācija piekļūt kaut ko iekšpusē ar struktūrai, ja mainīgais Jums nav struct pati par sevi, bet rādītājs uz struktūrai, par laimi, gabals sintaksi, ka beidzot padara intuitīvu sajūtu. Bultiņa nozīmē sekot rādītāju, tāpat kā mūsu bultiņas parasti nozīmē gleznieciski, un iet pie datu lauks iekšā. Tātad bultiņa ir tas pats, kas dot, bet jūs to izmantot, ja jums ir rādītājs. Tik vienkārši, lai Atgādinājums, tad, ja n lauks iekšpusē struktūrai sauc rādītāju vienāds vienāds n, atgriešanās patiess. Pretējā gadījumā šī līnija šeit - rādītājs vienāds ar rādītāju nākamo. Tātad, ko tas dara, paziņojums, ir, ja es esmu šobrīd, norādot uz struct , kas satur 9, 9 un ir ne numurs Es esmu meklē - domāju, ka es esmu meklē par n ir vienāds ar 50 - Es esmu gatavojas atjaunināt savu pagaidu rādītāju ne norādīt uz šajā mezglā vairs, bet rādītājs bultiņas blakus, kas gatavojas nodot mani šeit. Tagad, es sapratu, ir viesulis ieviešana. Trešdien, mēs faktiski darīt ar dažiem cilvēkiem un dažas vairāk kods lēnākā tempā. Bet saproti, mēs tagad padarīt mūsu datiem struktūras sarežģītāka tāpēc, ka mūsu algoritmi var iegūt efektīvāku, kas būs priekšnosacījums PSET seši, kad mēs slodze, atkal, tie, 150000 vārdi, bet ir nepieciešams to darīt efektīvi, un ideālā gadījumā, izveidot programma, kas darbojas, lai mūsu lietotājiem nav lineāra, nevis n kvadrātā, bet konstante laiks, ideālā. Mēs tiksimies trešdien. SPEAKER: Nākamajā CS50, David aizmirst savu pamata lietu. DAVID Malan: Un tas, kā jūs sūtīt īsziņas ar C. Ko - [DAŽĀDU īsziņā PAZIŅOJUMS SOUNDS]