[Powered by Google Translate] [Nedēļa 4] [David J. Malan] [Hārvarda] [Tas ir CS50.] [CS50.TV] Labi, tas ir CS50, un tas ir sākums 4 nedēļas, un tas ir viens no vislēnāko iespējamo kārtošanas algoritmiem. Kuriem viens bija tas, ka mēs tikko noskatījos tur? Tas bija burbulis šķirot, lai Big O (n ^ 2) + summa, un tiešām mēs neesam vienīgie šajā pasaulē, lai šķiet, zina kāda burbulis kārtošanas ir vai tās darbības laiks. Patiešām, tas bija intervija ar Google Eric Schmidt un bijušais senators Baraks Obama tikai dažus gadus atpakaļ. Tagad, senators, tu esi šeit Google, un man patīk domāt par prezidentūru un darba interviju. Tagad, tas ir grūti atrast darbu, jo prezidents, un jūs iet cauri drebuļi tagad. Tas ir arī grūti, lai iegūtu darbu pie Google. Mums ir jautājumi, un mēs lūdzam mūsu kandidātiem jautājumus, un tas viens ir no Larry Schwimmer. Jūs puiši domājat, ka es esmu kidding? Tas ir labi šeit. Kāds ir visefektīvākais veids, lai sakārtotu miljons 32 bitu integers? [Smiekli] Labi Man žēl >> Nē, nē, nē, nē.. Es domāju, ka burbulis kārtošanas būtu nepareizs veids, kā iet. Nāc, kurš stāstīja šo? Pagājušajā nedēļā atgādināt mums bija pārtraukums no koda, vismaz uz vienu dienu, un sāka koncentrēties uz dažām augstākā līmeņa ideju un problēmu risinājumu kopumā saistībā ar meklēšanu un kārtošanu, un mēs ieviesa kaut kas mums nav iepļaukāt šo vārdu uz pagājušajā nedēļā, bet asimptotiskās apzīmējums, Big O, Big Omega, un dažreiz Big Theta pieraksts, un tie bija vienkārši veidi aprakstīt darbības laiku algoritmu, cik daudz laika tas aizņem par algoritmu, lai darbotos. Un jūs varat atcerēties, ka jūs runājāt par darba laika ziņā lielumu no ieejas, ko mēs parasti saucam par n neatkarīgi problēma var būt, kur n ir to cilvēku skaits, kas telpā, gada lapās tālruņa grāmatu skaits, un mēs sākām rakstīt lietas piemēram O (n ^ 2) vai O (N) vai O (n log n), un pat tad, kad matemātikas nav gluži darbs, kas tik perfekti un tas bija n ² - n / 2 vai kaut kas tamlīdzīgs mēs tā vietā vienkārši mest prom daži no zemākas kārtas nosacījumiem, un motivācija ir, ka mēs patiešām gribam kārtot objektīvi novērtētu gada programmu rezultātiem vai algoritmu sniegumu ka beigās, dienā nav nekāda sakara, piemēram, ar ātrumu datora šodien. Piemēram, ja jums īstenot burbulis šķirot, vai jūs īstenot apvienot kārtošanas vai izvēle kādas par šodienas datora, 2 GHz dators, un jūs palaist to, un tas prasa zināmu skaitu sekundes, nākamajā gadā tur 3 GHz vai 4 GHz dators, un jūs varētu pēc tam apgalvot, ka "Wow, mans algoritms Tagad ir divreiz tik strauji, "kad patiesībā tas acīmredzot nav tas gadījums. Tas ir tikai aparatūra ir gotten ātrāk, bet jūsu dators nav, un tāpēc mēs patiešām vēlamies mest prom lietas, piemēram, sastāvēt no 2 vai sastāvēt no 3 kad runa apraksta cik ātri vai lēni algoritms un tiešām tikai koncentrēties uz n vai kādu faktoru punktu, daži vara to, kā gadījumā, no pagājušajā nedēļā veidu. Un atcerēties, ka ar palīdzību no sapludināšanas šķirot mēs varējām darīt daudz labāk nekā burbulis kārtot un atlases kārtot un pat ievietošanas šķirot. Mēs saņēmām līdz n log n, un atkal, atgādināt, ka log n parasti attiecas uz kaut ko, kas aug lēnāk tad n, tāpēc n log n līdz šim bija labi jo tas bija mazāks nekā n ². Bet, lai sasniegtu n log n ar sapludināšanas kārtot kāda bija pamata dīgļi ideja, ka mums bija, lai piesaistītu ka mēs arī pārvirzīt atpakaļ 0 nedēļā? Kā mēs risinātu šo kārtošanas problēmu gudri ar sapludināšanas veida? Kāds bija galvenais ieskatu, varbūt? Kāds vispār. Labi, pieņemsim veikt soli atpakaļ. Aprakstīt apvienot kārtot saviem vārdiem. Kā tas darbojas? Labi, mēs rinda atpakaļ nedēļā 0. Labi, jā. [Dzirdams-students] Labi, labi, tāpēc mēs sadalīta masīvu numuru uz 2 gabaliem. Sakārtots katru no šiem gabaliem, un tad mēs apvienojām to, un mēs esam redzējuši šo ideju pirms gada ņemot problēma, ka tas ir liels un kapāšanas to uz augšu uz problēmu, ka tas ir liels vai tas ir liels. Atgādināt tālruņu grāmatas piemēru. Atcerēties sevi skaitīšanas algoritms no nedēļas atpakaļ, tāpēc apvienot kārtot tika apkopoti šīs pseudocode šeit. Kad jūs esat dota n elementiem, vispirms tas bija vesels saprāts pārbaudīt. Ja n <2, tad neko nedara vispār jo, ja n <2, tad n ir acīmredzami 0 vai 1, un tāpēc, ja tas ir vai nu 0 vai 1 nekas kārtot. Jūs esat darīts. Jūsu saraksts ir jau trivially sakārtots. Bet citādi, ja jums 2 vai vairāki elementi iet uz priekšu un sadalīt tos uz 2 daļās, pa kreisi un pa labi. Kārtot katru no šiem pusēm, un pēc tam apvienot sakārtoti pusītes. Bet problēma ir tā, ka pēc pirmā acu uzmetiena šis jūtas kā mēs punting. Tas ir apļveida definīcija, ka, ja es esmu lūgusi, lai sakārtotu šos n elementiem un tu man saki: "Labi, labi, mēs sakārtot šo n / 2 un tiem N / 2 elementiem," tad mans nākamais jautājums būs "Fine, kā jūs kārtot n / 2 elementiem?" Bet tāpēc, ka struktūras šo programmu, jo tur ir vispārējais gadījums, tā teikt, šis īpašais gadījums, kas saka, ja n > Sāra, viss labi. Kelly. >> Kelly un? Villijs. >> Villijs, Sāra, Kelly, un Willy. Tieši tagad man ir lūgusi šo jautājumu, kāds cik daudz cilvēku ir uz augšu uz šīs skatuves, un man nav ne jausmas. Tas ir patiešām garš saraksts, un tā vietā es esmu gatavojas darīt šo triku. Es esmu gatavojas lūgt personai man blakus darīt lielāko daļu darbu, un, kad viņa tiek darīts dara lielākā daļa no darba Es esmu gatavojas darīt vismazāk darba apjomu iespējamo un vienkārši pievienot 1 lai kāds viņas atbilde ir, tāpēc šeit mēs iet. Es esmu jautāja, cik daudz cilvēku ir uz skatuves. Cik daudz cilvēku ir uz skatuves pa kreisi no jums? Kreisi no manis >> Labi?, Bet nav pievilt. Tas ir labi, ka ir pareizi, bet, ja mēs vēlamies turpināt šo loģiku pieņemsim, ka jūs tāpat vēlaties punktēt šo problēmu pa kreisi no jums, Tātad, nevis atbildot tieši iet uz priekšu un tikai iet buks. Ak, cik daudz cilvēku ir pa kreisi no manis? Cik daudzi cilvēki ir pa kreisi? 1. [Smiekli] Labi, tāpēc 0, lai to, ko tagad Villijs ir paveicis tiek esat atgriezies savu atbildi šajā virzienā sakot 0. Tagad, ko darīt? >> 1. Labi, lai jūs esat 1, lai jums teikt: "Labi, es esmu gatavojas pievienot 1 lai neatkarīgi Willy s skaits bija, "tā 1 + 0. Tu esi tagad 1 lai jūsu atbilde uz labo tagad- 1. >> Un raktuves būtu 2. Labi, lai jūs lietojat iepriekšējo atbildi 1, pieskaitot minimālo darba apjomu, ko vēlaties darīt, kas ir 1. Jums tagad ir 2, un jūs pēc tam nodot man, kas vērtība? 3, es domāju, žēl, 2. Labi. Nu, mums bija 0, lai kreisi. Tad mums bija 1, un tad mēs pievienot 2, un tagad jūs nododot man ir numurs 2, un tāpēc es saku, labi, +1, 3. Tur tiešām 3 cilvēki stāv blakus man uz šīs skatuves, lai mēs varētu acīmredzot izdarīts ļoti lineāri, ļoti daudz acīmredzamas modes, bet ko īsti mēs tiešām darīt? Mums bija problēmas 3 izmēru sākotnēji. Mēs pēc tam lauza to uz leju problēmu 2 izmēru, tad problēma 1 izmēra, un tad beidzot vispārējo gadījumu bija ļoti, ak, tur neviens tur, kurā brīdī Villijs atgriezās efektīvi iekodēts atbilde pāris reizes, un otrs tika kūsāja, kūsāja, kūsāja, un pēc tam pievienojot šo vienu papildu 1 mēs esam ieviesušas šo pamatideju recursion. Tagad, šajā gadījumā tas nav īsti atrisināt problēmu jebkurš efektīvāk, tad mēs esam redzējuši līdz šim. Bet domāju par algoritmiem, mēs esam darīts uz skatuves līdz šim. Mums bija 8 papīra gabaliņus uz tāfeles, gada video, kad Šons bija meklējot numuru 7, un ko viņš īsti dara? Nu, viņš nav arī jebkāda veida skaldi un valdi. Viņš nav arī jebkāda veida recursion. Drīzāk viņš vienkārši darīja šo lineāru algoritmu. Bet, kad mēs iepazīstināja ar ideju sakārtots skaitļu uz skatuves dzīvot pagājušajā nedēļā tad mums bija šī instinkts iet uz vidu, kurā brīdī mums bija mazāka sarakstu izmēra 4 vai cita 4 lielumu sarakstu, un tad mums bija tieši tā pati problēma, tāpēc mēs atkārtoti, atkārtoti, atkārtoti. Citiem vārdiem sakot, mēs recursed. Liels paldies mūsu 3 brīvprātīgie šeit, lai demonstrētu rekursija ar mums. Redzēsim, vai mēs nevaram padarīt šo tagad nedaudz vairāk betona, risinot problēmas, kas atkal mēs varētu darīt diezgan viegli, bet mēs to izmantot kā atspēriena īstenojot šo pamatideju. Ja es gribu, lai aprēķinātu sasummēt ķekars numuriem, Piemēram, ja jums iet ar numuru 3, Es vēlos, lai dotu jums vērtību 3 sigma, tāpēc summa 3 + 2 + 1 + 0. Es vēlos saņemt atpakaļ atbildi 6, tāpēc mēs īstenotu šo sigma funkciju, tas sasummēt funkcija , ka atkal uzņem ievadi, un pēc tam atgriež sasummēt šo numuru visu ceļu uz leju līdz 0. Mēs varētu darīt diezgan vienkārši, vai ne? Mēs varētu darīt to ar kādu looping struktūru, tāpēc ļaujiet man iet uz priekšu un iegūt šo darbu. Iekļaut stdio.h. Ļaujiet man iegūt sevi par galveno strādāt ar šeit. Pieņemsim saglabājiet to kā sigma.c. Tad es iešu šeit, un es esmu gatavojas pasludināt int n, un es esmu gatavojas darīt tālāk, kamēr lietotājs nevēlas sadarboties. Kamēr lietotājs nav devis man pozitīvu skaitli ļaujiet man iet uz priekšu un liek tos n = GetInt, un ļaujiet man sniegt viņiem dažus norādījumus par to, ko darīt, tāpēc printf ("Pozitīvs vesels lūdzu"). Tikai kaut samērā vienkāršs, piemēram, tas, lai līdz brīdim, kad mēs hit līniju 14 mums tagad ir pozitīvs skaitlis domājams, n. Tagad pieņemsim kaut ko darīt ar to. Ļaujiet man iet uz priekšu un aprēķināt sasummēt, lai int summa = sigma (n). Sigma ir tikai sasummēt, tāpēc es esmu tikai rakstiski to mīļotājs veidā. Mēs vienkārši to saucam sigma tur. Tas ir summa, un tagad es esmu gatavojas izdrukāt rezultātu, printf ("summa ir% d, \ n", summa). Un tad es ņemšu atgriezties 0 labs pasākums. Mēs esam darījuši visu, lai šī programma prasa izņemot Interesanti, kas ir faktiski īstenot sigma funkciju. Ļaujiet man iet uz leju šeit apakšā, un ļaujiet man paziņot funkciju Sigma. Tas ir got veikt mainīgo, kas ir tipa skaitlim, un kādi dati tips vēlos atgriezties, iespējams no Sigma? Int, jo es gribu, lai atbilstu manas cerības par 15 rindā. Jo šeit ļaujiet man iet uz priekšu un īstenot šo tādā diezgan vienkārša veidā. Iesim uz priekšu un saka, int summa = 0, un tagad es iešu būt mazliet par cilpu šeit kas notiek, lai pateikt kaut ko tādu, par (int i = 0; es <= skaits; i + +) summa + = i. Un tad es esmu gatavojas atgriezties summu. Es varētu būt īstenots šis jebkurā vairākos veidos. Es varētu būt izmantoti, kamēr cilpa. Es varētu būt izlaidis izmantojot summu mainīgo, ja es tiešām gribēju, bet īsi sakot, mēs vienkārši ir funkcija, kas, ja man nav muļķis deklarē summa ir 0. Tad tas vairākkārt uzsvērts no 0 uz augšu pa numuru, un par katru atkārtojumā tā piebilst, ka pašreizējā vērtību summu un pēc tam atgriežas summa. Tagad tur ir neliels optimizācija šeit. Tas ir iespējams izšķērdēta solis, bet lai tā būtu. Tas ir sods par tagad. Mēs esam vismaz ir rūpīga un iet 0 visu ceļu uz augšu. Nav ļoti grūti un diezgan vienkārši, bet izrādās, ka ar sigma funkcija mums ir tādas pašas iespējas kā mēs šeit uz skatuves. Uz skatuves mēs vienkārši skaitītas cik daudz cilvēku bija man blakus, bet, ja mēs vēlējāmies, lai saskaitītu 3 + 2 + 1 0 līdz pat varējām līdzīgi punktēt uz funkciju ka es ņemšu vietā aprakstīt kā rekursīvas. Lūk Darīsim ātri veselība pārbaudītu, un pārliecinieties, ka man nav muļķis. Es zinu, tur ir vismaz viena lieta, kas šajā programmā, ka man darīt nepareizi. Kad es hit ievadīt es gatavojas saņemt jebkāda veida kliedza uz mani? Ko man būs kliedza aptuveni? Jā, es aizmirsu prototips, tāpēc es esmu, izmantojot funkciju sauc Sigma 15 līnijas, bet tas nav deklarēta līdz 22 līnija, tāpēc es vislabāk aktīvi iet uz augšu šeit un atzīt prototipu, un es jums saku int Sigma (int skaits), un tas arī viss. Tas ir īstenots apakšā. Vai cits veids, kā es varētu atrisināt šo, Es varētu pārvietot funkcija tur, kas nav slikti, bet vismaz, kad jūsu programmas sāk saņemt ilgi, atklāti sakot, Es domāju, tur ir daži vienmēr ņemot galvenais augšā vērtība lai jums lasītājs var atvērt failu un pēc tam uzreiz redzēt ko programma dara bez meklēt caur to meklē šo galveno funkciju. Iesim uz leju, lai manu termināļa loga šeit, mēģināt padarīt sigma darīt Sigma, un es ieskrūvē augšu arī šeit. Netiešs deklarācija funkcija GetInt nozīmē, ka es esmu aizmirsis darīt ko vēl? [Dzirdams-students] Labi, tāpēc acīmredzot izplatīta kļūda, tāpēc pieņemsim, nodot šo up šeit, cs50.h, un tagad iesim atpakaļ uz manu termināļa loga. Es notīrītu ekrānu, un es ņemšu atkārtojiet darīt Sigma. Tas, šķiet, ir apkopoti. Ļaujiet man tagad palaist Sigma. Es ierakstiet numuru 3, un man nebija saņemt 6, tāpēc nav stingra pārbaude, bet vismaz tas, šķiet, darbojas pēc pirmā acu uzmetiena, bet tagad pieņemsim kraķis to nošķir, un pieņemsim faktiski sviras ideju recursion, atkal, jo ļoti vienkāršā kontekstā, lai pēc pāris nedēļām kad mēs sākam pētīt mīļotājs datu struktūras nekā masīvi mums ir citu rīku komplekta, ar kuru manipulēt šos datu struktūras, kā mēs redzēsim. Tas ir iteratīvs pieeja, cilpa balstītu pieeju. Ļaujiet man vietā tagad darīt. Ļaujiet man vietā teikt, ka sasummēt skaita uz leju līdz 0 ir patiešām tas pats, kas numuru + Sigma (skaits - 1). Citiem vārdiem sakot, tāpat kā uz skatuves es punted katram no cilvēkiem man blakus, un tie savukārt tur punting kamēr mēs beidzot zemāko pie Willy, kas bija atgriezties iekodēts atbildi, piemēram 0. Šeit tagad mēs esam līdzīgi punting uz sigma to pašu funkciju kā sākotnēji tika saukta, bet galvenais ieskats šeit ir tāds, ka mēs esam ne aicinot Sigma identiski. Mēs esam ne iet uz n. Mēs esam skaidri iet skaits - 1, tāpēc nedaudz mazāks problēma, nedaudz mazāks problēma. Diemžēl, tas nav gluži risinājums vēl, un pirms mēs noteikt Kas varētu būt lekt kā acīmredzama daži no jums ļaujiet man iet uz priekšu un atkārto darīt. Šķiet, lai apkopotu labi. Ļaujiet man atkārto Sigma ar 6. Whoops, ļaujiet man atkārto Sigma ar 6. Mēs esam redzējuši šo pirms, gan nejauši pēdējo reizi, kā arī. Kāpēc man šis noslēpumains segmentēšanas vaina? Yeah. [Dzirdams-students] Nav pamata situāciju, un jo īpaši, kādi, iespējams, noticis? Tas ir simptoms kāda uzvedība? Pasaki to nedaudz skaļāk. [Dzirdams-students] Tas bezgalīga cilpa efektīvi, un ar bezgalīgu cilpu problēma ja tie ir saistīti rekursija šajā gadījumā, funkcija zvana pats, kas notiek katru reizi, kad jūs izsauktu funkciju? Nu, domāju, ka atpakaļ uz to, kā mēs izstrādājām atmiņu datorā. Mēs teicām, ka tur ir šis atmiņas rieciens sauc kaudze, kas ir apakšā, un katru reizi, kad jūs zvanu funkcija nedaudz vairāk atmiņas izpaužas likts par šo tā saukto kaudze satur šīs uzdevums ir vietējo mainīgie vai parametru, tāpēc, ja sigma aicina sigma zvanus sigma aicina Sigma  aicina Sigma Kur šī stāsta beigas? Nu, tas beidzot pārsniegumi kopējā summa atmiņas, kas jums ir pieejamas jūsu datorā. Jūs pārsniegts segmentu, kas jūs vajadzēja palikt robežās, un jūs saņemt šo segmentācijas vaina, kodols dempinga cenas, un ko kodols dempinga nozīmē, ka man tagad ir failu sauc kodols kas ir fails satur nullēm un tiem kas faktiski nākotnē būs diagnostiski noderīga. Ja tas nav skaidrs ar jums, kur jūsu kļūda ir Jūs faktiski var darīt mazliet kriminālistiku, tā teikt, Šajā galveno dump failu, kas, atkal, ir tikai viss ķekars nullēm un tiem kas būtībā atspoguļo stāvokli jūsu programmas atmiņā brīdis tas avarēja šādā veidā. Noteikt šeit ir, ka mēs varam ne tikai akli atgriezties Sigma, numuru + sigma no nedaudz mazāku problēmu. Mums ir nepieciešams, lai būtu sava veida bāzes gadījumā šeit, un ko vajadzētu bāzes scenārijs iespējams, būtu? [Dzirdams-students] Labi, kamēr skaitlis ir pozitīvs mums būtu reāli atgriezties šo, vai citiem vārdiem sakot, ja numurs ir, teiksim, <= līdz 0 jūs zināt, ko, es iešu uz priekšu un atpakaļ 0, līdzīgi Villijs darīja, un cits, es esmu gatavojas iet uz priekšu un atgriezties šo, tāpēc tas nav tik daudz īsāks nekā atkārtojamā versiju, ka mēs saputo vispirms izmantojot par cilpu, bet paziņo, ka tur ir šis elegance uz to kārtot. Tai vietā, lai kādu numuru un veicot visu šo matemātiku un pievienojot lietas, līdz ar vietējās mainīgie jūs tā vietā sakot: "Labi, ja tas ir super viegli problēma, piemēram skaits ir <0, ļaujiet man uzreiz atgriezties 0. " Mēs nebrauksim apnikt atbalsta negatīvus skaitļus, tāpēc es esmu gatavojas grūti kodu 0 vērtība. Bet citādi, lai īstenotu šo ideju summējot visi no šiem numuriem kopā jūs varat efektīvi veikt nelielu iekost no problēmas, līdzīgi mēs šeit uz skatuves, tad punt pārējo problēmas uz nākamo personu, bet šajā gadījumā nākamais cilvēks ir pats. Tas identiski nosaukts funkciju. Vienkārši iet tai mazāku un mazākas un mazākas problēma katru reizi, un pat ja mēs neesam gluži formulēti lietas kodu šeit tas ir tieši tas, kas notiek, kas ar telefona grāmatu 0 nedēļā. Tas ir tieši tas, kas notiek, kas pēdējo nedēļu laikā ar Šonu un ar mūsu demonstrāciju meklējot numuriem. Tas ir ņemot problēmu un dalot to atkal un atkal. Citiem vārdiem sakot, tur ir veids, kā tagad par tulkošanas Šī reālā pasaule konstrukcija, tas augstāks līmenis būvēt gada skaldi un valdi un darot kaut ko atkal un atkal ar kodu, tāpēc tas ir kaut mēs redzēsim atkal laika gaitā. Tagad, kā malā, ja jūs esat jauns, lai recursion jums vajadzētu vismaz tagad saprotu kāpēc tas ir smieklīgi. Es iešu uz google.com, un es esmu gatavojas meklēt dažus padomus un trikus par recursion, ievadiet. Pastāstiet personai blakus jums, ja tie nav smejoties tikai tagad. Vai jūs domājāt rekursija? Vai jūs domājāt-ah, tur mums iet. Labi, tagad tas ir pārējo ikvienam. Maz Lieldienu olu iestrādāta kaut kur Google. Kā malā, viens no saitēm Mēs ieliekam par kursu mājas lapā šodien ir tikai šī dažādas šķirošanas algoritmu režģis, daži no kuriem mēs paskatījās pagājušajā nedēļā, bet to, kas ir jauka par šo vizualizāciju kā jūs mēģināt wrap savas domas ap dažādām lietām, kas saistītas ar algoritmiem zināt, ka jūs varat ļoti viegli tagad sākt ar dažāda veida izejvielu. Ieejas viss pretēja, izejvielas galvenokārt sakārtoti, izejvielas izlases un tā tālāk. Kā jūs mēģināt vēlreiz, nošķirt šīs lietas savā prātā saprotam, ka šis URL uz kursu mājas lapā lekcijas lapā varētu palīdzēt jums iemesls, izmantojot kādu no tiem. Šodien mēs beidzot nokļūt, lai atrisinātu šo problēmu, no brītiņa atpakaļ, kas bija, ka tas swap funkcija vienkārši nestrādāja, un kāda bija būtiska problēma ar šo funkciju swap, , kuras mērķis bija, atkal, lai apmainītos ar vērtību šeit un šeit tā, ka tas notiek? Šis nav faktiski strādā. Kāpēc? Yeah. [Dzirdams-students] Tieši, izskaidrojums šim bugginess vienkārši bija tāpēc, kad jūs zvanu funkcijas C un tās funkcijas veikt argumentus, kā un b šeit, Jūs braucat garām kopijās ir kāda vērtība, jūs nodrošināt ar šo funkciju. Jūs neesat nodrošinot sākotnējās vērtības paši, tāpēc mēs redzējām šo kontekstā buggyc, buggy3.c, kas izskatījās mazliet kaut kas līdzīgs šim. Atgādināt, ka mums bija x un y inicializēts ar 1 un 2, attiecīgi. Mēs pēc tam izdrukāt to, ko viņi bija. Es tad apgalvoja, ka man bija pārnešana viņiem zvanot mijmaiņas x, y. Bet problēma bija tā, ka swapping strādāja, bet tikai jomas mijmaiņas darboties pati. Tiklīdz mēs hit līniju 40 šīm samainīti vērtībām Tika izmest, un tā nekas sākotnējā funkcija galvenais faktiski tika mainījies vispār, Tātad, ja jūs domājat, toreiz par to, kā tas izskatās, gan no mūsu atmiņas ja tas kreisā pusē kuģa pārstāv- un es darīšu manas vislabāk, lai ikviens varētu redzēt šo, ja tas kreisajā pusē kuģa pārstāv, teiksim, jūsu RAM, un kaudze gatavojas augt uz augšu šādā veidā, un mēs saucam funkciju, piemēram, galvenais, un galvenais ir 2 vietējās mainīgie, X un Y pieņemsim aprakstītu tiem kā x šeit, un pieņemsim aprakstīt kā tie y šeit, un pieņemsim nodot vērtībām 1 un 2, tāpēc tas šeit ir galvenais, un kad galvenais aicina mijmaiņas funkcija operētājsistēmu dod Swap Function savu vālu atmiņas uz skursteņa, savu rāmis uz skursteņa, lai runāt. Tas arī piešķir 32 bitus šīm Ints. Tas notiek ar viņiem piezvanīt un b, bet tas ir pilnīgi patvaļīgi. Tā varētu būt sauc viņus kāds tā grib, bet kas notiek, ja galvenais Aicina mijmaiņa tas aizņem šo 1, liek kopiju tur, liek kopiju tur. Ir 1 citu vietējo mainīgais swap, lai gan, ko sauc ko? >> Tmp. Tmp, tāpēc ļaujiet man sniegt sev vēl 32 bitus šeit, un ko man darīt ar šo funkciju? Es teicu int tmp izpaužas, tā ir 1, tāpēc es izdarīja, kad mēs pēdējo reizi spēlēja ar šo piemēru. Tad kļūst b, tāpēc b ir 2, tāpēc tagad tas kļūst 2, un tagad b kļūst temp, tāpēc temperatūra ir 1, tāpēc tagad b kļūst to. Tas ir lieliski. Tā strādāja. Bet tad tiklīdz funkcija atgriež Mijmaiņas darījuma atmiņa faktiski pazūd, lai to varētu izmantot atkārtoti ar kādu citu funkciju nākotnē, un galvenais ir acīmredzami pilnīgi nemainīgs. Mums ir nepieciešams veids, kā būtiski šīs problēmas risināšanai, un šodien mēs beidzot ir veids, kā to izdarīt, ar ko mēs varam ieviest kaut ko sauc rādītājs. Izrādās, ka mēs varam atrisināt šo problēmu nevis iet kopijās ir x un y bet tā vietā iet ar kādiem, jūsuprāt, uz apmaiņas funkciju? Yeah, kas par adresi? Mums nav īsti runāja par adresēm daudz sīkāk, bet, ja tas tāfele ir mana datora atmiņu Mēs, protams, var sākt numerāciju baitus manā RAM un saka, tas ir baits # 1, tas ir baits # 2, baitu # 3, baits # 4, baits # ... 2 miljardiem euro, ja man ir 2 gigabaiti RAM, tāpēc mēs noteikti varētu nākt klajā ar kādu patvaļīgu numerācijas shēmu par visu individuālo baitu mana datora atmiņā. Ko darīt, ja tā vietā, kad es aicinu mijmaiņas nevis caurlaide kopijas x un y kāpēc ne es, nevis iet uz adresi x šeit, adresi y šeit, būtībā pasta adrese X un Y, jo tad swap, ja viņš informē no adreses atmiņā no x un y, tad swap, ja mēs apmācīti viņam mazliet, viņš, iespējams, varētu vadīt uz šo adresi, tā teikt, x, un mainīt numuru tur, tad braukt uz adresi y, mainīt numuru tur, pat nav reāli panākt kopijas šīm vērtībām pats, Tātad, pat ja mēs runājām par to kā Main atmiņu un minēto metodi kā Mijmaiņas darījuma atmiņā spēcīgs un bīstams daļa no C ir tā, ka jebkurš funkciju var pieskarties atmiņas jebkur ar datoru, un tas ir spēcīgs, ka jūs varat darīt ļoti iedomātā lietas ar datoru programmām C. Tas ir bīstami, jo jūs varat arī skrūvējamu pat ļoti viegli. Patiesībā, viens no visbiežāk veidus, lai programmas šajās dienās tiks izmantotas joprojām ir programmētājs nav saprast ka viņš vai viņa ir ļauj datu kas rakstīts vietā atmiņu, kas nav paredzēta. Piemēram, viņš vai viņa deklarē masīvs 10 izmēra bet tad nejauši mēģina likt 11 bytes vērā, ka masīva atmiņu, un jūs sākat pieskaras daļas atmiņā, kas vairs nav derīgi. Tikai, lai konteksta to, daži no jums varētu zināt, ka programmatūras bieži liek jums par sērijas numuriem vai reģistrācijas atslēgas, Photoshop un Word un programmām, kā šis. Pastāv plaisas, kā daži no jums zina, internetā, kur jūs varat palaist maz programmu, un voila, ne vairāk pieprasījumu par sērijas numuru. Kā ir, ka strādā? Daudzos gadījumos šīs lietas ir vienkārši konstatējums datoriem teksta segmentus datora faktisko nullēm un tiem kur ir šī funkcija, ja sērijas numurs tiek pieprasīta, un jūs pārrakstīt to telpu, vai kamēr programma darbojas Jūs varat izdomāt, kur galvenais ir faktiski uzglabā izmantojot kaut ko sauc atkļūdotājs, un jūs varat kreka programmatūras, ka veidā. Tas nav teikt, ka tas ir mūsu mērķis, lai nākamo pāris dienu laikā, bet tas ir ļoti reālās pasaules atzari. Ka viens notiek, lai iesaistītu zādzības programmatūru, bet tur ir arī kompromiss par visu mašīnu. Patiesībā, kad mājas šajās dienās tiek izmantoti un apdraudēta un dati ir noplūdis un paroles tiek nozagts Tas ļoti bieži ir saistīta ar sliktu pārvaldību par savu atmiņu, vai, attiecībā uz datubāzēm, nespēja prognozēt sacīkstes ieejas, tā vairāk par to nedēļās nākt, bet tagad tikai ložņāt preview no veida kaitējumu, kas var darīt ne gluži saprast, kā lietas strādā zem motora pārsega. Iesim par izpratni, kāpēc tas tiek sadalīts ar instrumentu, kas kļūs arvien vairāk un vairāk noderīgs kā mūsu programmas iegūtu sarežģītāka. Līdz šim, ja jūs esat bijusi kļūda savā programmā kā jūs esat aizgājuši par atkļūdošanu to? Kādas ir jūsu metodes bijušas līdz šim, vai māca savu TF vai vienkārši autodidaktisks? [Studentu] Printf. Printf, tāpēc printf, iespējams, bijis jūsu draugs, ka, ja jūs vēlaties redzēt Kas notiek iekšpusē jūsu programmā Jūs vienkārši ielieciet printf šeit, printf šeit, printf šeit. Tad jūs palaist to, un jūs saņemsiet visu ķekars stuff uz ekrāna ka jūs varat izmantot, lai pēc tam secināt, kas ir faktiski notiek nepareizi jūsu programmā. Printf mēdz būt ļoti spēcīgs lieta, bet tas ir ļoti manuālais process. Jums ir, lai printf šeit, printf šeit, un ja jūs nodot to iekšpusē cilpa jūs varētu saņemt 100 līnijas no produkcijas, jums tad ir izsijāt caur. Tas nav ļoti lietotājam draudzīgu vai interaktīvu mehānisms atkļūdošanas programmu, bet par laimi pastāv alternatīvas. Tur programma, piemēram, sauc gdb, GNU atkļūdotājs, kas ir nedaudz mistiskā kā jūs to izmantot. Tas mazliet sarežģīti, bet atklāti sakot, šī ir viena no tām lietām, kur, ja tu nevienai šajā nedēļā, un nākamo papildu stundu, lai saprastu kaut ko līdzīgu gdb tas ietaupīs jums, iespējams, desmitiem stundu ilgtermiņā, Tātad ar to, ļaujiet man sniegt jums teaser par to, kā šī lieta darbojas. Es esmu savā termināļa logā. Ļaujiet man iet uz priekšu un apkopo šo programmu, buggy3. Tas jau līdz šim. Ļaujiet man palaist to tāpat kā mēs to darījām, bet atpakaļ, un, protams, tas ir bojāts. Bet kāpēc tas ir? Varbūt es ieskrūvē up mijmaiņas funkciju. Varbūt tas ir un b. Es neesmu gluži pārvietojot tos apkārt pareizi. Ļaujiet man iet uz priekšu un darīt to. Nevis vienkārši palaist buggy3 ļaujiet man nevis palaist šo programmu GDB, un es esmu gatavojas pateikt to palaist buggy3, un es esmu gatavojas iekļaut komandrindas argumentu,-TUI un mēs nodot to nākamajām problēmām spec lai atgādinātu. Un tagad šis melnā un baltā interfeiss popped up, ka atkal ir nedaudz milzīgs sākumā, jo tur ir viss tas garantijas informācija šeit lejā, bet vismaz tur ir kaut kas pazīstams. In augšpusē loga ir mans faktiskais kods, un ja es ritiniet šeit ļaujiet man atrodiet ļoti augšpusē manu failu, un tiešām, tur ir buggy3.c, un paziņojums apakšā šo logu Man ir šī GDB uzvedni. Tas nav tas pats, kas manu parasto John Harvard uzvednes. Tas ir ātri, kas notiek, lai ļauj man kontrolēt GDB. Gdb ir atkļūdotājs. Debugger ir programma, kas ļauj staigāt pa izpilde savu programmas pozīcijai pa līniju, pa ceļam darīt kaut ko vēlaties ar programmu, pat aicinot funkcijas, vai meklē, vēl svarīgāk, dažādos mainīgā vērtībām. Iesim uz priekšu un darīt to. Es iešu uz priekšu un ierakstiet darbināšanas pie GDB s ātru, tāpēc paziņojums apakšā pa kreisi no ekrāna es esmu drukāti palaist, un es esmu hit ievadīt, un ko tas varēja darīt? Tā burtiski bija mana programma, bet man nav faktiski redzēt daudz iet šeit jo man nav faktiski teicis atkļūdotājs apstāties pie konkrētā brīdī. Tikai rakstīt palaist palaiž programmu. Man nav faktiski redzēt neko. Es nevaru manipulēt ar to. Vietā ļaujiet man darīt. Šajā gdb uzvednē ļaujiet man vietā ierakstīt pārtraukumu, ievadiet. Tas nav tas, ko es gribēju rakstīt. Pieņemsim nevis rakstiet pārtraukums galvenais. Citiem vārdiem sakot, es gribu, lai uzstādītu kaut ko sauc pārtraukumpunkts, kas ir aptly nosaukts, jo tā būs pārtraukums vai pauze izpilde savu programmu šajā konkrētajā vietā. Galvenais ir vārds manu darbību. Ievērojiet, ka Gdb ir diezgan gudrs. Tā sapratu, ka galvenais notiek sākt aptuveni pēc 18 līnija gada buggy3.c, un tad pamanīt šeit augšējā kreisajā b + ir tieši blakus ar 18 līniju. Tas ir atgādinot man, ka man ir noteikt pārtraukumpunkts pēc 18 līnijas. Tas laiks, kad es tipa palaist, es esmu gatavojas palaist savu programmu līdz tas hits, ka koncentrācija, tāpēc programma būs pauze man pēc 18 līnijas. Šeit mēs iet, skriet. Nekas, šķiet, ir noticis, bet paziņojums apakšā pa kreisi Sākot programma, buggy3, jo galvenais 1 robežpunkta pie buggy3.c rindā 18. Ko es varu darīt tagad? Paziņojums Es varētu sākt rakstīt lietas, piemēram, drukāt, nav printf, drukas x, un tagad tas ir dīvaini. $ 1 ir tikai zinātkāre, kā mēs redzēsim Katru reizi, kad jūs drukāt kaut ko jūs saņemsiet jaunu $ vērtību. Tas ir, lai jūs varētu nodot atpakaļ iepriekšējās vērtības tikai gadījumā, bet tagad ko drukāt ir spēcīgi mani, ka vērtība x šajā brīdī stāsts acīmredzot 134.514.032. Kas? No kurienes, kas vēl nāk no? [Dzirdams-students] Patiešām, tas ir tas, ko mēs saucam par atkritumu vērtību, un mēs esam nav runājuši par šo ziņu, bet tāpēc, ka jūs sāktu mainīgos acīmredzot tāpēc, ka viņiem ir kāda vērtība, ka jūs vēlaties, lai būtu. Bet nozveju atgādināt, ka jūs varat deklarēt mainīgos piemēram, I did pirms brīža manā sigma Piemēram bez faktiski dodot viņiem vērtību. Atceros, ko es darīju pāri šeit Sigma. Es paziņoja n, bet kāda vērtība bija man arī tā? Neviens, jo es zināju, ka dažos nākamajos līnijām GetInt parūpēsies par problēmu, liekot vērtību iekšpusē n. Bet šajā brīdī stāsts 11 līnijas un līniju 12 un līniju 13 un līniju 14 visā tām vairākas līnijas, kas ir n vērtība? C jūs vienkārši nezināt. Tas parasti daži atkritumu vērtība, daži pilnīgi nejauši skaits kas ir palikuši pāri pēc būtības no dažiem iepriekšējiem funkcijas kam ir darboties, lai jūsu programma darbojas atgādināt, ka funkcija izpaužas funkcija, funkcija, funkcija. Visi šie kadri get likts uz atmiņu, un tam šīm funkcijām atdevi, un tāpat kā man ieteica ar dzēšgumiju to atmiņu ir beidzot atkārtoti. Nu, tas tikai tā notiek, ka šī mainīgā X šajā programmā šķiet, ir ietverti daži atkritumu vērtība, piemēram 134514032 no dažiem iepriekšējiem funkcijas, nevis viens, ka es uzrakstīju. Tas varētu būt kaut kas nāk efektīvi ar operētājsistēmu, dažas funkcijas zem motora pārsega. Labi, ka ir jauki, bet pieņemsim tagad pārietu uz nākamo rindiņu. Ja es tipa "Next" pie mana GDB uzvednē un es hit ievadīt, pamanīt, ka uzsverot pārceļas uz leju līdz 19 līnija, bet loģiski izriet, ka līnija 18 tagad gatavo izpildes, tāpēc, ja es atkal rakstīt "Izdrukāt X" Es tagad vajadzētu redzēt 1, un tiešām, man. Atkal, $ stuff ir veids, GDB atgādinot jums ko izdruku vēsturi, ka jūs esat darījuši. Tagad ļaujiet man iet uz priekšu un izdrukāt y, un, protams, y ir daži traki vērtību, kā arī, bet nav liels galā, jo 19 līnijā mēs esam par to uzticēs vērtība 2, tāpēc ļaujiet man rakstīt "Next" vēlreiz. Un tagad mēs esam uz printf līnijas. Ļaujiet man darīt Print X. Ļaujiet man darīt drukas y. Atklāti sakot, es saņemu mazliet noguris no drukāšanas to. Ļaujiet man vietā ierakstīt "displejs X" un "displejs y," un tagad katru reizi es ierakstiet komandu nākotnē Es tiks atgādināts par to, kas ir x un y, kas ir x un y, kas ir x un y. Es varu arī, kā malā, tipa "Info vietējie iedzīvotāji." Info ir īpaša komanda. Vietējie nozīmē tā rāda man vietējo mainīgie. Tikai gadījumā, ja es neaizmirsīšu, vai tas ir traks, sarežģīts funkcijas ka es vai kāds cits rakstīja info vietējie jums pateiks kādi ir visi vietējie mainīgie iekšā šajā vietējās funkcijas ka jūs varētu rūpēties par to, ja jūs vēlaties, lai kule apkārt. Tagad, printf gatavojas izpildīt, tāpēc ļaujiet man iet uz priekšu un vienkārši tips "Next". Jo mēs esam šajā vidē mēs faktiski nav redzēt to izpildīt šeit lejā, bet pamanāt tas kļūst mazliet mangled šeit. Bet pamanāt tas primāri ekrānu tur, tāpēc tas nav ideāls programmu šeit, bet tas ir labi, jo es vienmēr var pabāzt ap izmantojot Print, ja es gribu. Ļaujiet man rakstīt nākamo atkal, un tagad šeit ir interesanti daļa. Šobrīd stāsts y 2, un x ir 1, kā šeit ieteikts, un atkal, Iemesls tas tiek automātiski parādīti tagad ir, jo es izmanto komandu displejs x un y displejs, tāpēc brīdis man rakstīt nākamo teorētiski x un y jākļūst nomainīju. Tagad mēs jau zinām, ka nav gatavojas būt gadījums, bet mēs redzēsim pēc brīža, kā mēs varam nirt dziļāk saprast, kāpēc tā ir taisnība. Nākamais, un diemžēl, y ir vēl 2 un x ir vēl 1, un es varu apstiprināt tik daudz. Izdrukāt X, drukas y. Patiešām, nav pārnešana ir faktiski noticis, tāpēc sāksim šo pāri. Skaidri mijmaiņas tiek sadalīti. Pieņemsim vietā ierakstīt "Run" vēlreiz. Ļaujiet man teikt, jā, es gribu, lai atsāktu to no sākuma, ievadiet. Tagad es esmu atpakaļ uz augšu pēc 18 līnijas. Tagad paziņojums x un y ir atkritumu vērtības vēlreiz. Nākamais, nākamais, nākamais, nākamais. Ja man garlaicīgi es varētu arī vienkārši ierakstīt n par nākamo. Jūs varat saīsināt to, lai iespējami īsākā rakstzīmju rindas. Swap ir sabrukusi. Pieņemsim nirt, tā vietā rakstīt nākamo, Tagad es esmu gatavojas rakstīt solis, lai es esmu pastiprināšanu iekšā šīs funkcijas lai es varētu staigāt pa to, lai es hit soli un tad ievadīt. Ievērojiet, ka izceļot lec noteikti zemāki manā programmā 36 līniju. Tagad, kādi ir vietējie mainīgie? Info vietējie. Nekas, tikai vēl, jo mēs esam nav gotten uz šo līniju, tāpēc pieņemsim iet uz priekšu un saka "Next". Tagad mēs, šķiet, ir tmp, drukas tmp. Atkritumu vērtību, labi? Es tā domāju. Kā par drukāt, drukas B, 1 un 2? Jo brīdī, tiklīdz es rakstīt nākamo atkal TPP ir gatavojas veikt uz vērtību 1, cerams, jo TPP gatavojas piešķirt vērtību. Tagad pieņemsim do drukāt, drukas b, bet tagad drukāt tmp, un tas ir tiešām 1. Ļaujiet man darīt tālāk. Ļaujiet man darīt tālāk. Es esmu beidzis mijmaiņas funkciju. Es esmu vēl iekšpusē tā 40 līnija, tāpēc ļaujiet man drukāt, drukas b, un man nav vienalga, ko TVP ir. Izskatās mijmaiņas ir pareizs, ja runa ir pārnešana a un b. Bet, ja es tagad rakstīt nākamo, es lēkt atpakaļ līdz 25 līnija, un, protams, ja es ierakstiet x un drukas y viņi joprojām nemainīgs, tāpēc mēs neesam noteikta problēma. Bet diagnostiski tagad varbūt ar šo GDB programmu mēs esam vismaz gotten vienu soli tuvāk izpratnei kas notiek nepareizi, bez pakaišiem mūsu kodu liekot printf šeit, printf šeit, printf šeit un tad darbojas to atkal un atkal mēģinot saprast, kas notiek nepareizi. Es iešu uz priekšu un atmest no šīs pavisam ar atmest. Tas notiek, lai tad saka: "Vienalga iziet?" Jā. Tagad es esmu atpakaļ pie mana normālā ātri, un es esmu darīts, izmantojot GDB. Kā malā, jums nav nepieciešams, lai izmantotu šo-TUI karogu. Patiesībā, ja jūs izlaist to jums būtībā apakšējo pusi no ekrāna. Ja es pēc tam ierakstiet pauze galvenais un tad palaist Es vēl joprojām var palaist savu programmu, bet ko tas būs jādara, ir daudz tekstuāli tikai parādiet man pašreizējo līniju vienam laikā. -TUI, tekstuālā lietotāja interfeiss, tikai parāda jums vairāk par programmas uzreiz, kas, iespējams, mazliet konceptuāli vieglāk. Bet patiešām, es varu tikai darīt tālāk, nākamais, nākamais, un es esmu gatavojas, lai redzētu vienu līniju laikā, un, ja es tiešām gribu redzēt, kas notiek Es varu rakstīt sarakstu un redzēt visu ķekars kaimiņu līniju. Ir video, kas mēs esam lūdza jūs skatīties problēma komplekti 3 kurā Nate aptver dažas no gdb intricacies, un šī ir viena no tām lietām, godīgi, kur daži nav triviāls procents no jums nekad pieskarties GDB, un ka būs slikti jo burtiski jūs galu galā izdevumu vairāk laika vēlāk šajā semestrī pakaļdzīšanās nosaka bugs tad jums būtu, ja jūs nodot šajā pusstundā / stundā šonedēļ un nākamajā mācību iegūt apmierināti ar gdb. Printf bija jūsu draugs. Gdb tagad būtu jūsu draugs. Kādi jautājumi par gdb? Un šeit ir ātrs sarakstu ar dažiem no spēcīgākajiem un noderīgs komandas. Yeah. >> Vai jūs drukāt virkni? Vai jūs varat drukāt virkni? Absolūti. Tas nav vienkārši būt veseli skaitļi. Ja mainīgais s ir virkne tikai veids drukas s. Tas jums parādīs, ko tas virkne mainīgais. [Dzirdams-students] Tas dos Jums adresi un virkni pati. Tas parādīs jums abiem. Un viena pēdējā lieta, tikai tāpēc, ka tie ir labi zināt pārāk. Izcelsme un rāmi, ļaujiet man nodoties šo vienu pēdējo reizi, pats precīzs programma ar gdb. Ļaujiet man iet uz priekšu un palaist tekstuālo lietotāja interfeisa versiju, pauze galvenais. Ļaujiet man iet uz priekšu un palaist vēlreiz. Šeit es esmu. Tagad ļaujiet man iet blakus, nākamais, nākamais, nākamais, nākamais, soli, ievadiet. Un tagad pieņemsim, ka es esmu tagad swap apzināti, bet es esmu, piemēram, "Sasodīts, kas bija vērtība x?" Es nevaru darīt X vairs. Es nevaru darīt y, jo viņi nav joma. Viņi ne kontekstā, bet nekādu problēmu. Es varētu rakstīt Izcelsme. Tas parāda man visas funkcijas, kas ir paveikti līdz šim brīdī. Ievērojiet, ka apakšā viens, galvenais, līnijas līdz ar galvenā ir par apakšā mūsu priekšstatu šeit. Fakts, ka mijmaiņas ir virs tā līniju līdz ar mijmaiņas pārsniedzot tai atmiņā šeit, un, ja es gribu, lai saņemtu atpakaļ uz galveno laiku es varētu teikt "rāmis". Kas numuru? Galvenais ir rāmis # 1. Es iešu uz priekšu un saka: "rāmi 1". Tagad es esmu atpakaļ galvenais, un es varu izdrukāt x, un es varu izdrukāt y, bet es nevaru izdrukāt vai b. Bet es varu, ja es saku: "Labi, pagaidiet minūti Kur bija swap?". Ļaujiet man iet uz priekšu un saka "rāmis 0." Tagad es esmu atpakaļ, kur es vēlos būt, un kā malā, tur ir citas komandas arī, piemēram, ja jūs tiešām kļūst garlaicīgi rakstīt nākamo, nākamais, nākamais, nākamais, Jūs varat parasti saka lietas, piemēram, "10 nākamā", un kas soli pa tuvāko 10 līnijām. Jūs varat arī rakstīt "turpināt", kad jūs patiešām iegūt apnikuši ar pastiprināšanu caur to. Turpiniet būs palaist savu programmu bez pārtraukuma, līdz tas hits cita pārtraukumpunkts, vai pa apli vai pazemināt nosaka jūsu programmā. Šajā gadījumā mēs turpinājām līdz beigām, un programma iziet normāli. Tas ir iedomātā veids, sliktāks procesu. Tikai jūsu programma izbrauc normāli. Vairāk par to video un atkļūdošanas sesiju nākt. Tas bija daudz. Paņemsim mūsu 5 minūšu pārtraukumu šeit, un mēs atgrieztos ar structs un failiem. Ja jums ir ienira šīs nedēļas PSET jau jūs zināt, ka mēs izmantojam sadales kodu, avota kodu, kas mums sniedz, lai jūs kā sākumpunktu, dažas jaunas metodes. Jo īpaši, mēs ieviesusi šo jauno atslēgvārdu sauc struktūrai, par struktūru, lai mēs varētu izveidot pielāgotus mainīgos veidu. Mēs arī ieviesa jēdzienu failu I / O, failu ieejas un izejas, un tas ir tāpēc, lai mēs varētu saglabāt stāvokli Jūsu motokross kuģa uz failu diskā tā ka mācību puiši, un es varu saprast kas notiek iekšpusē jūsu programma bez manuāli spēlēt desmitiem spēlēs motokross. Mēs varam izdarīt vairāk automatedly. Šis struct ideja atrisina diezgan pārliecinošu problēmas. Pieņemsim, ka mēs vēlamies īstenot kādu programmu ka kaut seko informācija par studentu, un skolēni varētu būt, piemēram, ID, vārdu un vietā kā Hārvarda māja, tāpēc tie ir 3 gabali informācijas Mēs vēlamies, lai saglabātu apmēram, tāpēc ļaujiet man iet uz priekšu un sākt rakstīt maz programmu šeit, ietver stdio.h. Ļaujiet man darīt arī cs50.h. Un tad sākt savu galveno funkciju. Es ne apgrūtināt ar jebkādām komandrindas argumentus, un šeit es gribu būt students, tāpēc es esmu gatavojas teikt studentam ir vārds, tāpēc es esmu gatavojas teikt "virknes nosaukumu." Tad es esmu gatavojas teikt studentam arī ir ID, tā int id, un students ir māja, tāpēc es esmu arī gatavojas teikt "stīgu māju." Tad es ņemšu pasūtīt šos nedaudz vairāk tīri kā šis. Labi, tagad man ir 3 mainīgie, ar kuru pārstāv students, tāpēc "students." Un tagad es gribu, lai aizpildītu šīs vērtības, tāpēc ļaujiet man iet uz priekšu un teikt kaut ko līdzīgu "Id = 123." Nosaukums ir gatavojas saņemt Dāvidu. Teiksim māja ir gatavojas iegūt Mather, un tad es esmu gatavojas darīt kaut ko patvaļīgi piemēram printf ("% s, kura ID ir% d, dzīvo% s. Un tagad, ko es vēlos, lai kontaktdakšu šeit, viens pēc otra? Vārds, id, māja; atgriezties 0. Labi, ja es ieskrūvē kaut kur šeit Es domāju, ka mums ir diezgan laba programma, kas saglabā viens students. Protams, tas nav tik interesanti. Ko darīt, ja es gribu, lai ir 2 studenti? Tas nav liels galā. Es varu atbalstīt 2 cilvēki. Ļaujiet man iet uz priekšu un izcelt to un iet uz leju šeit, un es varu teikt "id = 456", lai kāds, piemēram Rob kas dzīvo Kirkland. Labi, pagaidiet, bet es nevaru piezvanīt tiem pats, un izskatās, ka es esmu nāksies kopēt šo, tāpēc ļaujiet man teikt, ka tie būs Dāvida mainīgie, un ļaujiet man iegūt dažas kopijas šiem par Rob. Mēs saucam tos Rob ir, bet tas nav dodas uz darbu tagad jo man ir-gaidīt, pieņemsim mainīt mani ieliktņiem ID1, nosaukums1 un house1. Rob būs 2, 2. Man, lai mainītu šo šeit, šeit, šeit, šeit, šeit, šeit. Pagaidiet, ko par Tommy? Darīsim to atkal. Protams, ja jūs joprojām domājat, ka tas ir labs veids, kā to izdarīt, tas nav, tāpēc copy / paste slikti. Bet mēs atrisināt šo pirms nedēļas. Kāds bija mūsu risinājums, ja mēs vēlējāmies, lai būtu vairākus gadījumus paša datu tipu? [Studenti] masīvs. Masīvs, tāpēc ļaujiet man mēģināt tīrīt šo augšu. Ļaujiet man veikt dažas telpa sevi augšā, un ļaujiet man tā vietā darīt šeit. Mēs saucam šos cilvēkus, un tā vietā es esmu gatavojas teikt "INT ID", un es esmu gatavojas atbalstīt 3 no mums tagad. Es esmu gatavojas teikt "stīgu vārdus," un es ņemšu atbalstu 3 no mums, un tad es esmu gatavojas teikt "stīgu namus," un es esmu gatavojas atbalstīt 3 no mums. Šobrīd šeit, nevis Deivids iegūt savas vietējo mainīgie mēs varam atbrīvoties no tiem. Kas jūtas labi, ka mēs esam tīrīšanas šo augšu. Es tad var teikt Dāvids būs [0] un nosaukumi [0] un mājas [0]. Un tad Rob mēs varam līdzīgi ietaupīt uz šo. Paraudzīsimies uz leju šeit, tāpēc viņš dodas uz patvaļīgi būs IDS [1]. Viņš būs nosaukumi [1], un tad visbeidzot, mājas [1]. Vēl nedaudz garlaicīgs, un tagad man ir izdomāt šo out, tāpēc pieņemsim, ka "vārdi [0], id [0], mājas [0], un pieņemsim pluralize šo. IDS, IDS, IDS. Un atkal, es esmu darot to, lai atkal, es esmu jau pārdalot copy / paste atkal, tāpēc izredzes ir tur cits risinājums šeit. Es varu droši tīrīt šo izveidota vēl ar cilpu vai kaut kas tamlīdzīgs, Tātad īsumā, tas ir mazliet labāk, bet joprojām jūtas kā Es esmu spiesta copy / paste, bet pat tas, man apgalvo, nav īsti fundamentāli pareizais risinājums, jo Ko darīt, ja dažkārt mēs izlemt jūs zināt, ko? Mēs tiešām būtu bijis glabāšanai e-pasta adreses par Dāvidu un aplaupīt un ikviens cits šajā programmā. Mums vajadzētu arī saglabāt tālruņu numurus. Mums vajadzētu arī glabāt ārkārtas kontaktu numuri. Mums ir visas šīs gabalus datus, ka mēs vēlamies, lai uzglabātu, tā kā jūs iet par darot, ka? Jūs atzīt citu masīvu augšā, un tad jūs manuāli pievienot pasta adrese [0], e-pasta adrese [1] par Dāvidu un Rob un tā tālāk. Bet tur patiešām ir tikai pieņēmums balstās šis dizains ka es esmu, izmantojot goda sistēmu zināt, ka [I] katrā no vairākām masīvu tikai tā notiek, lai atsauktos uz to pašu personu, tik [0] jo IDS ir skaitlis 123, un es esmu gatavojas pieņemt, ka vārdi [0] ir tā pati persona vārdu un mājas [0] ir tā pati persona māja un tā tālāk par visiem dažādu masīvu, kas man rada. Bet paziņo, ka tur nav būtiskas uzkare Starp šiem 3 gabalu informācijas, id, vārds un māja, lai gan uzņēmums, mēs cenšamies paraugam šajā programmā nav masīvi. Masīvi ir tikai šo programmatiskā veidā to izdarīt. Ko mēs patiešām vēlamies, lai modelētu mūsu programmā ir cilvēks kā David, persona, piemēram Rob iekšā kas vai iekapsulētājmateriālu ir vārds un ID un māju. Vai mēs varam kaut kā paust šo ideju iekapsulēšanas kad cilvēks ir ID, nosaukuma un māja un nevis ķerties pie tiešām šo kapāt kurā mēs tikko ticu, ka bracket kaut attiecas uz pašu cilvēku vienības katrā no šīm atšķirīgu masīvu? Mēs faktiski var darīt. Ļaujiet man iet virs galvenais tagad, un ļaujiet man izveidot savu datu tipu par tiešām pirmo reizi. Mēs izmantoja šo tehniku ​​motokross, bet šeit es esmu gatavojas iet uz priekšu un izveidot datu tipu, un jūs zināt, ko, es esmu dodas uz zvanu to students vai persona, un es esmu gatavojas izmantot typedef lai noteiktu veidu. Es esmu gatavojas teikt, ka šis ir struktūra, un tad šī struktūra būs tipa students, mēs teiksim, pat ja tas ir mazliet datēts tagad par mani. Mēs sakām "int id." Mēs sakām "virknes nosaukumu." Tad mēs sakām "virknes nams," tāpēc tagad līdz gada beigām šo dažas rindiņas kodu Es tikko mācīja šķindēt ka pastāv datu tips turklāt Ints, turklāt stīgām, turklāt dubultspēlē, turklāt pludiņi. No šī brīža ar laika līniju 11, tagad jauna datu tips sauc studenti, un tagad es varu paziņot studenta mainīgo jebkur es gribu, tāpēc ļaujiet man ritiniet šeit cilvēkiem. Tagad es varu atbrīvoties no šī, un es varētu doties atpakaļ uz leju, lai Dāvida šeit, un par Dāvidu es patiesībā var teikt, ka Deivids, mēs varam burtiski nosaukt mainīgo pēc sevi, būs tipa students. Tas varētu izskatīties mazliet dīvaini, bet tas nav viss, kas atšķiras deklarēt kaut kā int vai virkni vai rīvdēli. Tas tikai tā notiek, ir sauc students tagad, un, ja es gribu, lai kaut kas iekšā par šo struktūru Man tagad ir jāizmanto jaunu gabals sintaksi, bet tas ir diezgan vienkārši, david.id = 123, david.name = "Dāvids" galvaspilsētā D, un david.house = "Mather," un tagad es varu atbrīvoties no šīs stuff šeit. PAZIŅOJUMS Mēs esam tagad pārveidojām mūsu programmu tiešām daudz labāks veids jo tagad mūsu programma atspoguļo reālo pasauli. Tur reālās pasaules jēdziens personai vai students. Te mums tagad ir C versija personas vai precīzāk students. Iekšā šīs personas ir šīs būtiskās īpašības, ID, nosaukums un māju, lai Robs būtībā kļūst pats šeit lejā, tāpēc students aplaupīt, un tagad rob.id = 456, rob.name = "Robs." Fakts, ka mainīgais sauc Rob ir sava veida bezjēdzīga. Mēs varētu to ir nodēvējuši x vai y vai z. Mēs tikko nosauca to Rob būt semantiski konsekventi, bet tiešām vārds ir iekšā šajā jomā pati, tāpēc tagad man ir šis. Arī tas nav justies kā labāko dizainu, jo es esmu smagi kodētu Dāvidu. Es esmu grūti kodē Rob. Un man vēl ir jāizmanto kādu kopēt un ielīmēt katru reizi, kad es gribu jaunus mainīgos. Turklāt, man ir šķietami katru no šiem mainīgajiem nosaukumu, kaut gan es daudz labprātāk aprakstīt šos mainīgos  vairāk vispārīgi, jo studenti. Tagad mēs varam apvienot idejas, kas ir strādājuši labi mums un tā vietā saka: "Ziniet ko, man mainīgs saucamos studentus, un pieņemsim ir tas būtu 3 izmēra, "tāpēc tagad es varētu uzlabot šo tālāk, atbrīvoties no rokām deklarētās Dāvidu un es varētu tā vietā teikt kaut ko līdzīgu studentu [0] šeit. Es tad var teikt skolēniem [0] šeit, skolēni [0] šeit, un tā tālāk, un es varu iet apkārt un tīru, kas izveidota Rob. Es varētu arī iet par tagad varbūt pievienojot cilpu un izmantojot GetString un GetInt faktiski iegūtu šīs vērtības no lietotāja. Es varētu iet par pievienojot nemainīgs, jo tas parasti ir slikta prakse uz cietā kodam daži patvaļīgi skaits, piemēram, 3 tieši šeit un tad tikai atcerieties, ka jums vajadzētu likt ne vairāk kā 3 studentus tajā. Tas, iespējams, būtu labāk izmantot # define augšpusē manu failu un faktoru, kas ārā, tāpēc tiešām, ļaujiet man iet uz priekšu un vispārināt šo. Ļaujiet man atvērt piemēru, kas ir starp mūsdienu piemēri jau iepriekš, structs1. Tas ir daudz pilnīga programma, kas izmanto # define šeit un saka, ka mēs esam nāksies 3 studenti pēc noklusējuma. Šeit es esmu deklarējot klases vērts studentu, tāpēc klasē skolēnu, un tagad es esmu, izmantojot cilpu tikai, lai kodu nedaudz vairāk elegants, apdzīvot klasi ar lietotāja ievadītajiem datiem, lai pārietu no i = 0 par līdz studentiem, kas ir 3. Un tad es nekavējoties lietotājam šajā versijā  kāda ir studenta ID, un man to ar GetInt. Kas studenta vārdu, un tad man tas ar GetString. Kas studenta māju? Man to ar GetString. Un tad apakšā šeit es tikko nolēma mainīt cik es esmu izdrukāt šos, un faktiski izmantot cilpu, Un kas es esmu drukāšanas? Saskaņā ar komentāriem es esmu drukāšanas ikvienam, Mather, un tas arī viss tik Rob un Tomijs un tā tālāk-faktiski Tommija jo Mather. Tomijs un Deivids būtu drukāts šajā gadījumā, bet kā ir šī darba? Mēs neesam redzējuši šo funkciju pirms, bet ņemt minējums par to, ko tas dara. Salīdzina stīgas. Tas nedaudz ārpus skaidrs, kā tas izskatās salīdzinājumā stīgas, jo tā izrādās ja tas atgriež 0, kas nozīmē stīgas ir vienādas. Ja tas atgriež -1, kas nozīmē viena nāk alfabētiski pirms otru, un ja tas atgriež 1, kas nozīmē citu vārdu nāk alfabēta Pirms otru, un jūs varat meklēt internetā vai pie cilvēks lapā lai redzētu, tieši kādā veidā ir kas, bet tas viss tagad dara, ir tas saka ja [i]. māja ir vienāds ar "Mather" tad iet uz priekšu un izdrukāt tik un tā ir Mather. Bet šeit ir kaut kas mums nav redzējis, un mēs atgriezties pie šī. Es neatceros nekad ņemot darīt jebkurā no manas programmas. Bezmaksas acīmredzot atsaucas uz atmiņu, atbrīvojot atmiņu, bet ko atmiņas es acīmredzot atbrīvojot šajā cilpas apakšā šo programmu? Tas izskatās tāpat kā es esmu atbrīvojot personas vārdu un cilvēka māju, bet kāpēc tā? Izrādās visu šo nedēļu, kas jūs esat, izmantojot GetString Mēs esam sava veida ir ieviest bug par katru no jūsu programmas. GetString pēc uzbūves sadala atmiņu, lai tā varētu atgriezties pie jums stīgu, piemēram Deivids vai Robs, un jūs varat darīt, ko vien vēlaties ar šo auklu jūsu programmā, jo mēs esam rezervēta atmiņas jums. Problēma ir visu šo laiku katru reizi, kad zvana GetString mēs, GetString autori, ir lūdzot operētājsistēmu lai dotu mums mazliet RAM šīs virknes. Dodiet mums mazliet RAM šim nākamajam virknes. Dodiet mums daži vairāk RAM šim nākamajam virknes. Ko jūs, programmētājs, nekad darot dod mums, ka atmiņas atpakaļ, tāpēc par šiem vairākas nedēļas visas programmas esat rakstiski ir bijis tas, ko sauc par atmiņas lēciens ar kuru tās saglabāt, izmantojot vairāk un vairāk atmiņas katru reizi, kad jūs zvanu GetString, un tas ir jauki. Mēs apzināti darīt, ka pirmajās nedēļās, jo tas nav tik interesanti lai būtu jāuztraucas par to, kur virkne nāk no. Visi jūs vēlaties, ir vārds Rob nākt atpakaļ, kad lietotājs to iekšā Bet virzās uz priekšu, mums tagad ir jāsāk kļūst sarežģītākas par šo. Katru reizi, kad mēs piešķirt atmiņu mēs labāk beidzot atdot to atpakaļ. Pretējā reālajā pasaulē uz jūsu Mac vai PC jums varētu būt reizēm pieredzējis simptomi, kur jūsu dators ir pilnībā apstājušies beidzot vai stulba vērpšanas pludmales bumba ir tikai aizņem datora Visa uzmanība un jūs nevarat darīt lietas. Tas izskaidrojams ar jebkuru skaitu bugs, bet starp tām iespējamām kļūdām ir lietas, ko sauc atmiņas noplūde, kurā kāds, kurš rakstīja, ka gabals programmatūru jūs izmantojat neatcerējās, lai atbrīvotu atmiņu ka viņš vai viņa lūdza operētājsistēmu, neizmanto GetString, jo tas ir CS50 lieta, bet, izmantojot līdzīgas funkcijas kas lūdz operētājsistēmu atmiņas. Ja jūs vai viņi skrūvējamu augšu un nekad reāli atgriezties, ka atmiņas simptoms, kas var būt, ka programma palēnina un palēnina un palēnina ja jūs atceraties, lai izsauktu bezmaksas. Mēs būsim atpakaļ, kad un kāpēc jums būtu zvanīt bez maksas, bet iesim uz priekšu tikai labu pasākumu un mēģināt darboties šo konkrēto programmu. Tas tika saukts structs1, ievadiet. Ļaujiet man iet uz priekšu un palaist structs1, 123, Deivids Mather, 456, Rob Kirkland, 789, Tommy Mather, un mēs redzam Dāvida jo Mather, Tommija jo Mather. Tas ir tikai nedaudz veselība pārbaudītu, ka programma darbojas. Tagad, diemžēl, šī programma ir mazliet nomākta, jo Es darīju visu, kas strādā, es drukāti 9 dažādās virknes, hit ievadīt, Tika teikts, kurš bija Mather, bet acīmredzot es zināju kas bija Mather jau tāpēc, ka es rakstītu. Tas būtu vismaz jauki, ja šī programma ir vairāk kā datubāzes un tas tiešām atceras, ko esmu ievadījis tāpēc es nekad atkal ir ieejas šie studentu ierakstus. Varbūt tas ir kā registrarial sistēmu. Mēs varam izdarīt, izmantojot šo metodi sauc par failu I / O, failu ieejas un izejas, ļoti vispārējs veids, kā pateikt jebkurā laikā vēlaties lasīt failus vai rakstīt failus jūs varat darīt ar noteiktu funkciju kopumu. Ļaujiet man iet uz priekšu un atvērt šo piemēru structs2.c, kas ir gandrīz identisks, bet paskatīsimies, ko tā tagad dara. Augšpusē faila Es paziņoju klasi studentiem. Es tad apdzīvot klasē ar lietotāja ievadi, tāpēc šie koda rindas ir tieši tāpat pirms tam. Tad, ja es ritiniet uz leju šeit es izdrukāt ikviens, kurš ir Mather patvaļīgi kā agrāk, bet tas ir interesants jauna iezīme. Šīs koda līnijas ir jauns, un tās ievieš kaut ko šeit, Failu, visas cepures, un tā ir * jo arī šeit. Ļaujiet man pāriet šis nekā šeit, a * nekā šeit, kā labi. Šī funkcija mēs esam nav redzējis, fopen, bet tas nozīmē failu atvērt, tāpēc pieņemsim iziet caur šiem, un tas ir kaut mēs atgriezīsimies pie nākotnē psets, bet šī līnija šeit būtībā atver failu ar nosaukumu datubāze, un tas īpaši atver to tādā veidā, ka to var darīt, ko tā? [Dzirdams-students] Labi, tāpēc "W" vienkārši nozīmē, ka tas ir stāsta operētājsistēmu atvērt šo failu tādā veidā, ka es varētu rakstīt ar to. Es nevēlos, lai to izlasītu. Es nevēlos, lai tikai skatās. Es vēlos to mainīt un pievienot stuff potenciāli uz to, un fails būs saukt datubāzi. Tas varētu saukt neko. Tas varētu būt database.txt. Tas varētu būt. Db. Tas varētu būt vārdu, piemēram, foo, bet es patvaļīgi izvēlējās nosaukt failu bāzi. Tas ir maz veselība pārbaudītu, ka mēs atgriezīsimies pie ļoti detalizēti laika gaitā, ja FP, failu rādītājs, nav vienāds NULL tas nozīmē viss ir labi. Garš stāsts īss, funkcijas, piemēram, fopen dažreiz nespēj. Varbūt fails neeksistē. Varbūt jūs no diska vietas. Varbūt jums nav atļauja uz šo mapi, tāpēc, ja fopen atgriež null kaut kas slikts noticis. Savukārt, ja fopen neatgriež Null viss ir labi un es varētu sākt rakstīt uz šo failu. Lūk jauns triks. Tas ir par cilpa, kas ir atkārtojot pār katru no maniem studentiem, un tas izskatās tik līdzīgs tam, ko mēs esam darījuši līdz šim, bet šī funkcija ir brālēns printf aicināja fprintf failu printf, un pamanāt, ka tas ir atšķirīgs tikai 2 veidos. Viens, tas sākas ar F nevis p, bet tad tās pirmais arguments ir acīmredzami, ko? [Studenti] Faila. >> Tas fails. Šī lieta, ko sauc FP, ko mēs beidzot kaitināt izņemot to, ko fails rādītājs ir, bet tagad FP vienkārši atspoguļo failu, kas man ir atvērts, tāpēc fprintf šeit saka izdrukātu šo lietotāja ID uz failu, nevis uz ekrāna. Izdrukāt lietotāja vārdu uz failu, nevis uz ekrāna, māja uz failu, nevis uz ekrāna, un tad noteikti šeit, protams, aizvērt failu, un pēc tam uz leju šeit bez atmiņas. Vienīgā atšķirība starp šo versiju 2 un Versija 1 ir fopen ieviešanu un to ar * Failu un šis fprintf jēdziens, tāpēc redzēsim, ko gala rezultāts ir. Ļaujiet man iet manā termināļa loga. Ļaujiet man palaist structs2, ievadiet. Izskatās viss ir labi. Pieņemsim atkārto structs2. 123, Deivids Mather, 456, Rob Kirkland, 789, Tommy Mather, ievadiet. Izskatās, ka tas uzvedās pats, bet, ja es tagad darīt ls paziņojums, ko fails ir šeit, starp visu manu kodu, datu bāzes, tāpēc pieņemsim sākt, ka gedit datubāzes, un apskatīt to. Tas nav sexiest failu formātus. Tas patiešām ir viens gabals datu līnijas katrā rindā uz līnijas, bet tiem no jums, kas izmanto Excel vai CSV failus, komatu vērtības, Es, protams, var būt izmantoti fprintf lai vietā varbūt darīt kaut kas līdzīgs šim tāpēc ka es patiešām varētu radīt ekvivalentu Excel failu nodalot lietas ar komatiem, ne tikai jaunas līnijas. Šajā gadījumā, ja man būtu tā vietā izmanto komatus, nevis jaunas līnijas Es varētu burtiski atvērt šo datubāzes failu Excel, ja es tā vietā, kas tas izskatās šādi. Īsi sakot, tagad, kad mums ir tiesības, lai rakstītu failus tagad mēs varam sākt pastāvošās datus, turot to apkārt diskā lai mēs varētu saglabāt informāciju apkārt atkal un atkal. Pamanīt pāris citas lietas, kas tagad ir nedaudz vairāk pazīstams. Augšpusē šīs C lietas mums ir typedef jo mēs vēlējāmies izveidot datu tipu, kas pārstāv vārdu, tāpēc šis veids tiek saukts vārds, un iekšā par šo struktūru tas mazliet mīļotājs tagad. Kāpēc vārds veido šķietami masīva? Kas ir vārds tikai intuitīvi? Tas masīvs rakstzīmes. Tas ir rakstzīmju secība atpakaļ atpakaļ atpakaļ. VĒSTULES visos cepures notiek, mēs patvaļīgi teikt maksimālais garums kāds vārds vārdnīcā, ko izmantojam, lai motokross. Kāpēc man ir 1? Nulles raksturs. Atcerēties, kad mēs to darīja Bananagrams piemēru mēs nepieciešama īpaša vērtība beigās vārda, lai sekotu , kur vārdi faktiski beidzās, un kā šī problēma komplekts specifikācija saka šeit mēs saista ar konkrētu vārdu Būla vērtību, karogu, tā sakot, patiess vai nepatiess. Vai jums atrast šo vārdu jau, jo mēs saprotam mums tiešām ir nepieciešams veids, kā atcerēties ne tikai to vārds ir motokross bet vai jūs, cilvēka, ir konstatēts, ka tā ka, ja jūs atradīsiet vārdu "" jūs nevarat vienkārši ierakstiet, ieiet,, ienākt, ievadiet un iegūt 3 punktus, 3 punkti, 3 punkti, 3 punktus. Mēs vēlamies, lai varētu melnajam sarakstam šo vārdu, nosakot bool līdz patiess, ja jūs esat jau atradis, un tā, ka tāpēc mēs iekapsulēti to šajā struktūrā. Tagad, noteikti šeit motokross tur ir šis cits struktūrai sauc vārdnīca. Neierasties šeit ir vārds typedef jo šajā gadījumā mums vajadzēja rezumēju ideju par vārdnīcu, un vārdnīca ir visai ķekars vārdu, uz ko norāda šī masīvā, un cik daudzi no šiem vārdiem ir tur? Nu, kāds tas mainīgo sauc lielumu saka. Bet mēs vienkārši nepieciešams viens vārdnīca. Mums nav vajadzīga datu tipu sauc vārdnīca. Mums tikai vajag vienu no tām, tāpēc izrādās C ka, ja jums nav teikt typedef, jūs vienkārši pateikt struct, tad iekšpusē cirtaini lencēm jūs nodot savu mainīgos, tad jūs nodot nosaukumu. Tas ir atzīts vienu mainīgo sauc vārdnīcu ka izskatās šādi. Savukārt, šīs līnijas rada vairākkārt izmantojamu datu struktūra sauc vārdu ka jūs varat izveidot vairākas kopijas, tāpat kā mēs izveidojām vairākas kopijas studentiem. Ko tas galu galā ļauj mums darīt? Ļaujiet man iet atpakaļ, teiksim, vienkāršāku piemēru no vienkāršākiem laikiem, un ļaujiet man atvērt, teiksim, compare1.c. Problēma šeit pie rokas ir faktiski mizu atpakaļ gada virknes slānis un sākt pacelšanos šīs mācību diski jo izrādās, ka virkne visu šo laiku ir, kā mēs solīts nedēļa 1 tiešām tikai segvārdu, sinonīmu no CS50 bibliotēkas kaut kas izskatās nedaudz vairāk mistisks, char *, un mēs esam redzējuši šo zvaigzni pirms tam. Mēs redzējām to kontekstā ar failiem. Pieņemsim tagad saprast, kāpēc mēs esam slēpjot šo detaļu kādu laiku tagad. Šeit ir failu sauc compare1.c, un tas acīmredzot prasa lietotājam uz 2 stīgām, s un t, un tad mēģina salīdzināt šos virknes līdztiesību 26 līnijā, un ja viņi vienādi tā saka, "Tu ierakstījis pats," un ja viņi nav vienādi tā saka, "Tu drukāti dažādas lietas." Ļaujiet man iet uz priekšu un palaist šo programmu. Ļaujiet man iet manā avota direktorijā, veikt compare1. Tā apkopo labi. Ļaujiet man palaist compare1. Es tuvinātu, ievadiet. Kaut ko pateikt. HELLO. Es saku kaut vēlreiz. HELLO. Es noteikti nav rakstīt dažādas lietas. Ļaujiet man mēģināt šo vēlreiz. Bye Bye. Noteikti nav atšķirīga, tāpēc to, kas šeit notiek? Nu, ko tiešām tiek salīdzināta ar 26 rindā? [Dzirdams-students] Jā, tā izrādās, ka virkne, datu tips, ir sava veida balto meli. Virkne ir char *, bet kāda ir char *? Char *, kā viņi saka, ir rādītājs, un rādītājs ir faktiski adrese, summu vieta atmiņā, un, ja jūs notikt ir drukāti ar vārdu, piemēram, HELLO, atceros no iepriekšējiem diskusijās stīgas Tas ir tāpat kā vārds HELLO. Atcerieties, ka, piemēram, sveiki vārds var tikt pārstāvētas kā masīvu rakstzīmju kā šis un tad ar īpašu raksturu beigās sauc null raksturs, kā \ apzīmē. Kas ir faktiski virkne? Ievērojiet, ka šī ir vairākas gabalos atmiņas, un patiesībā, tā gals ir zināma tikai tad, kad jūs meklēt pa visu string meklē īpašo null raksturs. Bet, ja tas ir rieciens atmiņas no mana datora atmiņā, pieņemsim patvaļīgi teikt, ka šī virkne tikko ieguva laimīgs, un tā ieguva novieto pašā sākumā mana datora RAM. Tas ir baits 0, 1, 2, 3, 4, 5, 6 ... Kad es saku kaut ko līdzīgu GetString un man String s = GetString kas īsti tiek atgriezta? Šīm vairāku pēdējo nedēļu, kas īsti glabājas s nav šī virkne per se, bet šajā gadījumā to, kas tiek glabātas, ir skaits 0, jo to, ko GetString faktiski dara ir tas nav fiziski atgriezties virkni. Tas pat nav īsti darīt konceptuālo jēga. Kas tas atdeve ir skaitlis. Šis skaits ir adrese HELLO atmiņā, un stīgu s tad, ja mēs mizu atpakaļ šis slānis, stīgu nav īsti nepastāv. Tas ir tikai vienkāršošanai CS50 bibliotēkā. Tas tiešām ir kaut ko sauc char *. Char ir jēga, jo to, kas ir vārds, piemēram HELLO? Nu, tas ir virkne chars, sērijas burtiem. Char * nozīmē adresi raksturs, Tātad, ko tas nozīmē, lai atgrieztos virkni? Jauks, vienkāršs veids kā atgriezt virkni ir nevis mēģināt izdomāt, kā man atgriezties uz 5 vai 6 dažādām baitu ļaujiet man atgriezties uz adresi, kas baits? Pirmais. Citiem vārdiem sakot, ļaujiet man sniegt jums adresi rakstura atmiņā. Tas ko char * pārstāv, adrese vienā rakstura atmiņā. Zvanu, ka mainīgo s. Veikals s ka īpaši adrese, ko es patvaļīgi teicu ir 0, tikai, lai saglabātu lietas vienkārši, bet patiesībā tas ir vispār lielāks skaits. Pagaidiet minūti. Ja jūs tikai dod man adresi pirmās rakstzīmes, kā es varu zināt, ko adrese ir Otrā raksturs, trešais, ceturtais un piektais? [Dzirdams-students] Jūs tikai zināt, kur virknes beigas ir kā šo ērts triks, tāpēc, ja jūs izmantojat kaut ko līdzīgu printf, ko printf burtiski ņem kā savu argumentu, atceros, ka mēs izmantojam šo% s vietturi, un tad jums iet ar mainīgais, kas ir glabājusi virkni. Ko jūs patiešām iet ir adrese pirmās rakstzīmes šajā virknē. Printf tad izmanto par cilpu vai kamēr cilpa saņemot šo adresi, Piemēram, 0, tāpēc ļaujiet man darīt tagad, printf ("% s \ n" i); Kad es aicinu printf ("% s \ n" i); ko es esmu patiešām nodrošinot printf ar ir adrese pirmais rakstura s, kas šajā patvaļīga gadījumā ir H. Kā printf zināt, ko tieši parādīt uz ekrāna? Persona, kas īsteno printf īstenots, kamēr cilpa, vai cilpa ka saka tas raksturs vienāds īpašo null raksturs? Ja tā nav, to izdrukāt. Kā par šo vienu? Ja ne izdrukāt, izdrukāt, izdrukāt, to izdrukāt. Ak, šī ir īpaša. Apturēt drukāšanu un atgrieztos lietotājam. Un tas ir burtiski viss, kas ir bijis notiek zem pārsega, un tas ir daudz sagremot pirmajā dienā klases, bet tagad tas patiešām pamatelements izpratni viss kas ir bijis notiek iekšpusē mūsu datora atmiņā, un galu galā mēs kaitināt tas, izņemot ar nelielu palīdzību no viena no mūsu draugiem Stenfordas. Profesors Niks Parlante Stenfordas ir paveicis šo brīnišķīgo video secībā no visiem dažādās valodās, kas ieviesti veidu Šī maz Claymation raksturs Binky. Balss jūs par to dzirdēt tikai dažu 2. ložņāt preview ir, ka Stenfordas profesors, un jūs saņemat tikai 5 vai 6 sekundes šīs tiesības tagad, bet tas ir piezīme par kuru mēs secināt šodien un sākt trešdien. Es jums Pointer Fun ar Binky, priekšskatījuma. [♪ Mūzika ♪] [profesors Parlante] Hei, Binky. Mosties. Ir pienācis laiks, lai rādītāja fun. [Binky] Kas tas ir? Uzziniet par norādes? Ak, našķis! Mēs redzēsim tevi trešdien. [CS50.TV]