1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [Semajno 4] 2 00:00:03,000 --> 00:00:05,000 [Davido J. Malan] [Universitato Harvard] 3 00:00:05,000 --> 00:00:08,000 [Jen CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Bone, ĉi tiu estas CS50, kaj ĉi tiu estas la komenco de la semajno 4, 5 00:00:12,000 --> 00:00:16,000 kaj ĉi tiu estas unu el la plej malrapida ebla ordigo algoritmoj. 6 00:00:16,000 --> 00:00:19,000 Kiu trovis ĝin, ke ni nur rigardis tie? 7 00:00:19,000 --> 00:00:24,000 Tio estis bobelo varo, por granda O (n ^ 2) + sumo, 8 00:00:24,000 --> 00:00:28,000 kaj ja ni ne estas la solaj en ĉi tiu mondo al ŝajnas scii 9 00:00:28,000 --> 00:00:30,000 kio bobelo varo estas aŭ ĝia rula tempo. 10 00:00:30,000 --> 00:00:33,000 Efektive, tiu estis intervjuo kun Eric Schmidt de Google 11 00:00:33,000 --> 00:00:45,000 kaj eksa senatano Barack Obama ĵus antaŭ kelkaj jaroj. 12 00:00:45,000 --> 00:00:48,000 >> Nun, Senatano, vi estas ĉi tie en Google, 13 00:00:48,000 --> 00:00:54,000 kaj mi ŝatas pensi pri la prezidanteco kiel laboron intervjuo. 14 00:00:54,000 --> 00:00:58,000 Nun, estas malfacile akiri laboron kiel prezidanto, kaj vi tuj tra la rigorecoj nun. 15 00:00:58,000 --> 00:01:00,000 Estas ankaŭ malfacile akiri laboron en Google. 16 00:01:00,000 --> 00:01:05,000 Ni havas demandojn, kaj ni petas niajn kandidatoj demandoj, 17 00:01:05,000 --> 00:01:10,000 kaj ĉi tiu estas de Larry Schwimmer. 18 00:01:10,000 --> 00:01:14,000 You guys pensas mi kidding? Estas ĉi tie. 19 00:01:14,000 --> 00:01:18,000 Kio estas la plej efika maniero por ordigi miliono 32-bita entjeroj? 20 00:01:18,000 --> 00:01:21,000 [Ridado] 21 00:01:21,000 --> 00:01:24,000 Nu- 22 00:01:24,000 --> 00:01:26,000 Mi pardonpetas. >> Ne, ne, ne, ne. 23 00:01:26,000 --> 00:01:34,000 Mi kredas ke la bobelo speco estus la malĝustan vojon al iri. 24 00:01:34,000 --> 00:01:39,000 >> Venu, kiu rakontis al li tion? 25 00:01:39,000 --> 00:01:43,000 Pasintsemajne memori ni prenis ripozon de kodo, almenaŭ por unu tago, 26 00:01:43,000 --> 00:01:46,000 kaj komencis enfokusigante iu pli alta nivelo ideoj kaj problemo solvanta pli ĝenerale 27 00:01:46,000 --> 00:01:49,000 en la kunteksto de serĉado kaj ordigi, 28 00:01:49,000 --> 00:01:53,000 kaj ni enkondukis iu kiun ni ne abofetear ĉi nomon sur pasintsemajne, 29 00:01:53,000 --> 00:01:56,000 sed asimptota skribmaniero, la Granda a, la Granda Omega, 30 00:01:56,000 --> 00:02:00,000 kaj kelkfoje la Big Theta skribmaniero, kaj tiuj estis simple manieroj 31 00:02:00,000 --> 00:02:02,000 de priskribanta la rula tempo de algoritmoj, 32 00:02:02,000 --> 00:02:05,000 kiom da tempo ĝi prenas por algoritmo por kuri. 33 00:02:05,000 --> 00:02:08,000 >> Kaj vi povas memori ke vi parolis pri la rula tempo en terminoj de la grandeco 34 00:02:08,000 --> 00:02:11,000 de la enigo, kiu ni ĝenerale nomas n, kion ajn la problemo povas esti, 35 00:02:11,000 --> 00:02:13,000 kie n estas la nombro de homoj en la ĉambron, 36 00:02:13,000 --> 00:02:17,000 la nombro de paĝoj en telefono libro, kaj ni komencis skribi aferojn 37 00:02:17,000 --> 00:02:21,000 kiel O (n ^ 2) aŭ O (n) aŭ O (n log n), 38 00:02:21,000 --> 00:02:24,000 kaj eĉ kiam la math ne sufiĉe ellabori tiel perfekte 39 00:02:24,000 --> 00:02:28,000 kaj estis n ² - n / 2 aŭ io simila 40 00:02:28,000 --> 00:02:31,000 ni anstataŭ simple forĵeti kelkajn el la suba ordo terminoj, 41 00:02:31,000 --> 00:02:34,000 kaj la motivado estas ke ni vere volas 42 00:02:34,000 --> 00:02:37,000 speco de objektiva maniero de taksi 43 00:02:37,000 --> 00:02:39,000 la agado de programoj aŭ la rendimenton de algoritmoj 44 00:02:39,000 --> 00:02:42,000 ke je la fino de la tago havas nenion por fari, ekzemple, 45 00:02:42,000 --> 00:02:45,000 kun la rapido de via komputilo hodiaŭ. 46 00:02:45,000 --> 00:02:47,000 >> Ekzemple, se vi apliki bobelo varo, 47 00:02:47,000 --> 00:02:50,000 aŭ vi apliki kunfandi varo aŭ selektado speco en la hodiaŭa komputilo, 48 00:02:50,000 --> 00:02:53,000 a 2 GHz komputilo, kaj vi kuros ĝin, 49 00:02:53,000 --> 00:02:56,000 kaj ĝi portas iun numeron de duaj, venontjare tie estas 3 GHz 50 00:02:56,000 --> 00:02:59,000 aŭ 4 GHz komputilo, kaj vi povus tiam aserti ke "Wow, mia algoritmo 51 00:02:59,000 --> 00:03:03,000 nun estas duoble rapida, "kiam fakte tio evidente ne estas la kazo. 52 00:03:03,000 --> 00:03:06,000 Estas nur la aparataro alvenis rapida, sed via komputilo 53 00:03:06,000 --> 00:03:10,000 ne, kaj tiel ni vere volas forĵeti aĵojn kiel 54 00:03:10,000 --> 00:03:13,000 obloj de 2 aŭ obloj de 3, kiam temas pri priskribanta 55 00:03:13,000 --> 00:03:17,000 kiel rapide aŭ kiel malrapida algoritmo estas kaj vere nur enfokusigi 56 00:03:17,000 --> 00:03:20,000 sur n aŭ iu faktoro gxiajn 57 00:03:20,000 --> 00:03:24,000 iuj potenco gxiaj kiel en la kazo de la varoj de la lasta semajno. 58 00:03:24,000 --> 00:03:27,000 Kaj memoru ke kun la helpo de merge speco 59 00:03:27,000 --> 00:03:31,000 ni povis fari tion multe pli bone ol bobelo varo kaj selektado speco 60 00:03:31,000 --> 00:03:33,000 kaj eĉ inserción varon. 61 00:03:33,000 --> 00:03:36,000 >> Ni deiris al n logo n, kaj denove, 62 00:03:36,000 --> 00:03:39,000 memori, ke log n ĝenerale aludas al iu kiu kreskas 63 00:03:39,000 --> 00:03:43,000 pli malrapide tiam n, do n logo n tiel multe estis bona 64 00:03:43,000 --> 00:03:45,000 ĉar estis malpli ol n ². 65 00:03:45,000 --> 00:03:47,000 Sed por atingi n log n kun merge speco 66 00:03:47,000 --> 00:03:51,000 kio estis la baza ĝermo de ideo, ke ni devis utiligi 67 00:03:51,000 --> 00:03:54,000 ke ni ankaŭ leveraged reen en semajno 0? 68 00:03:54,000 --> 00:03:58,000 Kiel ni pritrakti la ordiga problemo lerte kun merge speco? 69 00:03:58,000 --> 00:04:04,000 Kio estis la ŝlosilo sagaceco, eble? 70 00:04:04,000 --> 00:04:07,000 Iu ajn. 71 00:04:07,000 --> 00:04:09,000 Konsentite, ni preni retropaŝon. 72 00:04:09,000 --> 00:04:11,000 Ekverku kunfandi varo en viaj propraj vortoj. 73 00:04:11,000 --> 00:04:15,000 Kiel ĝi funkcias? 74 00:04:15,000 --> 00:04:17,000 Konsentite, ni remi reen al semajno 0. 75 00:04:17,000 --> 00:04:19,000 Konsentite, yeah. 76 00:04:19,000 --> 00:04:22,000 [Inaudible-studento] 77 00:04:22,000 --> 00:04:26,000 Okay, bona, do ni dividas la tabelo de nombroj en 2 pecojn. 78 00:04:26,000 --> 00:04:29,000 Ni ordo ĉiu de tiuj pecoj, kaj poste ni kunfandis ilin, 79 00:04:29,000 --> 00:04:33,000 kaj ni vidis ĉi tiun ideon antaŭ de prenante problemo kiu estas tiu granda 80 00:04:33,000 --> 00:04:36,000 kaj batante ĝin en problemo kiu estas tio granda aŭ ĉi granda. 81 00:04:36,000 --> 00:04:38,000 >> Memori la telefono libro ekzemplo. 82 00:04:38,000 --> 00:04:42,000 Memori la mem-kalkula algoritmo de semajnoj, 83 00:04:42,000 --> 00:04:45,000 tiel kunfandi varo estis resumita de ĉi _pseudocode_ tie. 84 00:04:45,000 --> 00:04:48,000 Kiam vi donita n eroj, la unua estis prudento kontroli. 85 00:04:48,000 --> 00:04:51,000 Se n <2 tiam ne faras ion ajn 86 00:04:51,000 --> 00:04:55,000 ĉar se n <2 tiam n estas evidente 0 aŭ 1, 87 00:04:55,000 --> 00:04:57,000 kaj kio se ĝi estas ĉu 0 aŭ 1 estas nenio por ordigi. 88 00:04:57,000 --> 00:04:59,000 Vi faris. 89 00:04:59,000 --> 00:05:01,000 Via listo estas jam bagatele ordo. 90 00:05:01,000 --> 00:05:04,000 Sed alie se vi havas 2 aŭ pli elementoj antaŭeniri kaj dividi ilin 91 00:05:04,000 --> 00:05:06,000 en 2 duonoj, maldekstra kaj dekstra. 92 00:05:06,000 --> 00:05:09,000 Ordigi ĉiu el tiuj duonoj, kaj poste kunfandi la ordo duonoj. 93 00:05:09,000 --> 00:05:13,000 Sed la problemo estas, ke je la unua vido tio sentas kiel ni punting. 94 00:05:13,000 --> 00:05:17,000 Ĉi tiu estas cirkla difino en ke se mi petis vin ordigi tiujn n eroj 95 00:05:17,000 --> 00:05:22,000 kaj vi diras al mi "Bone, bone, ni ordigi tiujn n / 2 kaj tiuj n / 2 elementoj," 96 00:05:22,000 --> 00:05:27,000 tiam mia sekva demando tuj estos "Belaj, kiel vi ordigi la n / 2 eroj?" 97 00:05:27,000 --> 00:05:30,000 >> Sed pro la strukturo de tiu programo, 98 00:05:30,000 --> 00:05:33,000 ĉar estas ĉi tiu bazo kazo, por tiel diri, 99 00:05:33,000 --> 00:05:39,000 ĉi tiu speciala kazo kiu diras se n estas 00:05:42,000 Ne respondas kun tiu sama cirkulero respondo. 101 00:05:42,000 --> 00:05:46,000 Ĉi tiu procezo, ĉi ciclicidad eventuale fini. 102 00:05:46,000 --> 00:05:50,000 Se mi demandas vin "Ordigi tiuj n eroj," kaj vi diras, "Belaj, ordigi tiujn n / 2," 103 00:05:50,000 --> 00:05:53,000 tiam vi diros, "Belaj, varo tiuj n / 4, n / 8, n/16," 104 00:05:53,000 --> 00:05:56,000 eventuale vi dividu per sufiĉe granda nombro 105 00:05:56,000 --> 00:05:59,000 ke vi havos nur 1 ero maldekstren, je kiu punkto oni povas diri, 106 00:05:59,000 --> 00:06:02,000 "Jen, jen ordo sola ero." 107 00:06:02,000 --> 00:06:06,000 Tiam la brilo de ĉi tiu algoritmo ĝis tie estas derivi de la fakto 108 00:06:06,000 --> 00:06:09,000 ke iam vi havas ĉiujn tiujn individue ordo lertaj, 109 00:06:09,000 --> 00:06:12,000 ĉiuj kiuj estas de amplekso 1, kiu ŝajnas esti senutilaj, 110 00:06:12,000 --> 00:06:15,000 iam vi komencas kunfandi ilin kaj kunfandi ilin 111 00:06:15,000 --> 00:06:19,000 vi konstruos fine kiel Rob faris en la video oni fine ordo listo. 112 00:06:19,000 --> 00:06:22,000 >> Sed tiu ideo etendas multe pli tie ordigado. 113 00:06:22,000 --> 00:06:26,000 Estas ĉi tiu ideo enigita en tiu programo konata kiel rekursio, 114 00:06:26,000 --> 00:06:29,000 la ideo laŭ kiu vi estas programo, 115 00:06:29,000 --> 00:06:32,000 kaj solvi iun problemon vi nomas vin, 116 00:06:32,000 --> 00:06:36,000 aŭ metitaj en la kunteksto de programlingvoj vi estas funkcio, 117 00:06:36,000 --> 00:06:39,000 kaj por solvi problemon, vi la funkcio vokas vin 118 00:06:39,000 --> 00:06:42,000 denove kaj denove kaj denove, sed al vi la funkcio 119 00:06:42,000 --> 00:06:44,000 ne povas nomi vin malfinie multaj fojoj. 120 00:06:44,000 --> 00:06:47,000 Eventuale vi devas fundo eksteren, por tiel diri, 121 00:06:47,000 --> 00:06:49,000 kaj havas iom malmola kodita bazo kondiĉo kiu diras 122 00:06:49,000 --> 00:06:53,000 en ĉi tiu punkto halti nomante mem tiel ke la tuta procezo 123 00:06:53,000 --> 00:06:56,000 fine ĝi fakte ĉesas. 124 00:06:56,000 --> 00:06:58,000 Kion tio vere signifas, por recurse? 125 00:06:58,000 --> 00:07:01,000 >> Ni vidu, se ni povas fari simplan, bagatela ekzemplo kun, ekzemple, 126 00:07:01,000 --> 00:07:03,000 3 personoj kun mi ĉi tien sur la scenejo, se iu estas komforta. 127 00:07:03,000 --> 00:07:06,000 1, venu supren, 2 kaj 3. 128 00:07:06,000 --> 00:07:09,000 Se vi 3 volas veni tien. 129 00:07:09,000 --> 00:07:12,000 Se vi volas stari tuj apud mi cxi tie en linio, supozu ke la problemo je mano 130 00:07:12,000 --> 00:07:15,000 estas tre bagatele grafo la nombro de homoj kiuj estas tie. 131 00:07:15,000 --> 00:07:18,000 Sed sincere, mi estas laca de ĉiuj tiuj rakonti ekzemploj. 132 00:07:18,000 --> 00:07:21,000 Tiu tuj prenos iom da tempo, 1, 2, kaj pentras, punkto, ĝi pentras. 133 00:07:21,000 --> 00:07:23,000 Ĝi tuj prenu eterne. 134 00:07:23,000 --> 00:07:25,000 Mi preferas ke nur liberigas tiun problemon aro kun la helpo de-kio estas via nomo? 135 00:07:25,000 --> 00:07:27,000 Sara. >> Sara, tute certe. 136 00:07:27,000 --> 00:07:29,000 Kelly. >> Kelly kaj? 137 00:07:29,000 --> 00:07:31,000 >> Willy. >> Willy, Sara, Kelly, kaj Willy. 138 00:07:31,000 --> 00:07:34,000 Ĝuste nun mi demandis la demando de iu 139 00:07:34,000 --> 00:07:37,000 kiom da homoj sur tiu etapo, kaj mi ne havas ideon. 140 00:07:37,000 --> 00:07:40,000 Tio estas vere longa listo, kaj tiel anstataŭ mi faros ĉi tiu lertaĵo. 141 00:07:40,000 --> 00:07:43,000 Mi tuj demandos la persono apud mi faru la plejparto de la laboro, 142 00:07:43,000 --> 00:07:46,000 kaj unu fojon ŝi estas farita faras la plimulton de la laboro 143 00:07:46,000 --> 00:07:49,000 Mi tuj faros la malplej kvanto de laboro ebla kaj justa aldoni 1 144 00:07:49,000 --> 00:07:51,000 al kiom ŝi respondo estas, do jen ni iru. 145 00:07:51,000 --> 00:07:54,000 Min oni petis kiom da homoj estas en la scenejo. 146 00:07:54,000 --> 00:07:57,000 Kiom da homoj estas en la scenejo de la maldekstra de vi? 147 00:07:57,000 --> 00:08:00,000 Maldekstre de mi? >> Konsentite, sed ne trompi. 148 00:08:00,000 --> 00:08:04,000 Tio estas bona, tio estas ĝusta, sed se ni volas daŭrigi ĉi logiko 149 00:08:04,000 --> 00:08:08,000 ni supozu, ke vi simile volas liberigas tiun problemon al la maldekstra de vi, 150 00:08:08,000 --> 00:08:11,000 tial anstataŭ respondo rekte antaŭeniri kaj simple pasigi la cervo. 151 00:08:11,000 --> 00:08:14,000 Ho, kiom da homoj estas maldekstre de mi? 152 00:08:14,000 --> 00:08:16,000 Kiom da homoj estas por la maldekstra? 153 00:08:16,000 --> 00:08:18,000 1. 154 00:08:18,000 --> 00:08:27,000 [Ridado] 155 00:08:27,000 --> 00:08:30,000 Okay, do 0, tia kiu nun Willy faris 156 00:08:30,000 --> 00:08:33,000 estas vi revenis vian respondon tiu direkto dirante 0. 157 00:08:33,000 --> 00:08:36,000 Nun, kio devus fari? >> 1. 158 00:08:36,000 --> 00:08:39,000 Okay, do vi estas la 1, do vi diras, "Bone, mi iros por aldoni 1 159 00:08:39,000 --> 00:08:41,000 al kiom Willy la grafo estis, "do 1 + 0. 160 00:08:41,000 --> 00:08:43,000 Vi estas nun 1 tial via respondo al la rajto estas nun- 161 00:08:43,000 --> 00:08:45,000 1. >> Kaj mia estus 2. 162 00:08:45,000 --> 00:08:48,000 Bona, do vi prenis la antaŭan respondon de 1, 163 00:08:48,000 --> 00:08:51,000 aldono de la minimuma kvanto de laboro vi volas fari, kiu estas +1. 164 00:08:51,000 --> 00:08:55,000 Vi nun havas 2, kaj vi tiam transdonos al mi, kiu valoro? 165 00:08:55,000 --> 00:08:57,000 3, mi volas diri, sorry, 2. 166 00:08:57,000 --> 00:08:59,000 Bona. 167 00:08:59,000 --> 00:09:02,000 >> Nu, ni devis 0 al la maldekstra. 168 00:09:02,000 --> 00:09:05,000 Tiam ni havis 1, kaj tiam ni aldonas 2, 169 00:09:05,000 --> 00:09:07,000 kaj nun vi transdonis al mi la nombro 2, 170 00:09:07,000 --> 00:09:10,000 kaj tiel Mi dirante bone, +1, 3. 171 00:09:10,000 --> 00:09:13,000 Estas ja 3 personoj starantaj apud mi en ĉi tiu stadio, 172 00:09:13,000 --> 00:09:16,000 tiel ni povus esti evidente faris tion tre lineare, 173 00:09:16,000 --> 00:09:19,000 tre en la evidenta maniero, sed kion ni vere faru? 174 00:09:19,000 --> 00:09:21,000 Ni prenis problemon de amplekso 3 komence. 175 00:09:21,000 --> 00:09:24,000 Ni tiam rompis ĝin al problemo de amplekso 2, 176 00:09:24,000 --> 00:09:27,000 tiam problemo de amplekso 1, kaj tiam fine la bazo kazo 177 00:09:27,000 --> 00:09:29,000 Estis vere, ho, tie estas neniu tie, 178 00:09:29,000 --> 00:09:33,000 je kiu punkto Willy revenis efektive malmola-kodita respondon kelkajn fojojn, 179 00:09:33,000 --> 00:09:36,000 kaj la dua estis tiam bobelis supren, bobelis supren, bobelis supren, 180 00:09:36,000 --> 00:09:39,000 kaj poste per aldono en ĉi tiu aldona 1 181 00:09:39,000 --> 00:09:41,000 ni implementado tiu baza ideo de rekursio. 182 00:09:41,000 --> 00:09:44,000 >> Nun, en tiu kazo ĝi ne vere solvi problemon 183 00:09:44,000 --> 00:09:46,000 neniu pli efike poste ni vidis ĝis nun. 184 00:09:46,000 --> 00:09:48,000 Sed pensi pri la algoritmoj ni faris en la scenejo ĝis nun. 185 00:09:48,000 --> 00:09:51,000 Ni havis 8 pecoj de papero en la chalkboard, 186 00:09:51,000 --> 00:09:55,000 en video kiam Estu serĉis la numero 7, kaj kion li vere faras? 187 00:09:55,000 --> 00:09:58,000 Nu, li ne faris ian ajn dividu kaj regu. 188 00:09:58,000 --> 00:10:01,000 Li ne faris ian ajn rekursio. 189 00:10:01,000 --> 00:10:03,000 Prefere li nur faris tion lineara algoritmo. 190 00:10:03,000 --> 00:10:07,000 Sed kiam ni enkondukis la ideon de ordo numerojn sur la scenejo vivi pasintsemajne 191 00:10:07,000 --> 00:10:09,000 tiam ni havis ĉi instinkto de iri al la mezo, 192 00:10:09,000 --> 00:10:13,000 je kiu punkto ni havis pli malgrandan liston de grandeco 4 aŭ alia listo de grandeco 4, 193 00:10:13,000 --> 00:10:17,000 kaj poste ni havis la ĝusta sama problemo, do ni ripetas, ripetis, ripetita. 194 00:10:17,000 --> 00:10:19,000 Alivorte, ni recursed. 195 00:10:19,000 --> 00:10:24,000 Grandan dankon al niaj 3 volontuloj tie por pruvante rekursio kun ni. 196 00:10:24,000 --> 00:10:28,000 >> Ni vidu se ni ne povas fari ĉi nun iom pli konkreta, 197 00:10:28,000 --> 00:10:30,000 solvanta problemon kiu ni denove povis fari belan facile, 198 00:10:30,000 --> 00:10:34,000 sed ni uzos ĝin kiel ŝtupo al efektivigo de ĉi tiu baza ideo. 199 00:10:34,000 --> 00:10:37,000 Se mi volas komputi la sumado de faskon da nombroj, 200 00:10:37,000 --> 00:10:39,000 ekzemple, se vi pasas en la numero 3, 201 00:10:39,000 --> 00:10:42,000 Mi volas doni al vi la valoro de sigmo 3, 202 00:10:42,000 --> 00:10:46,000 do la sumo de 3 + 2 + 1 + 0. 203 00:10:46,000 --> 00:10:48,000 Mi volas reiri la respondo 6, 204 00:10:48,000 --> 00:10:51,000 do ni havos apliki ĉi sigma funkcio, ĉi sumada funkcio 205 00:10:51,000 --> 00:10:54,000 ke, denove, prenas en enigo, kaj poste redonas la sumado 206 00:10:54,000 --> 00:10:57,000 de tiu numero la tuta vojo malsupren al 0. 207 00:10:57,000 --> 00:10:59,000 Ni povus fari tion sufiĉe simple, ĉu ne? 208 00:10:59,000 --> 00:11:01,000 Ni povus fari tion kun ia looping strukturo, 209 00:11:01,000 --> 00:11:04,000 do lasu min antaŭeniri kaj akiri ĉi komencis. 210 00:11:04,000 --> 00:11:07,000 >> Inkluzivi stdio.h. 211 00:11:07,000 --> 00:11:09,000 Lasu min preni min en ĉefaj por labori kun ĉi tien. 212 00:11:09,000 --> 00:11:12,000 Ni savu tion kiel sigma.c. 213 00:11:12,000 --> 00:11:14,000 Tiam mi tuj iros tien, kaj mi tuj deklaru int n, 214 00:11:14,000 --> 00:11:18,000 kaj mi faros la sekvajn dum la uzanto ne kunlabori. 215 00:11:18,000 --> 00:11:22,000 Dum la uzanto ne donis al mi pozitiva nombro 216 00:11:22,000 --> 00:11:26,000 lasu min iri antaŭen kaj instigas ilin por n = GetInt, 217 00:11:26,000 --> 00:11:28,000 kaj mi donos al ili iom da instrukcioj pri kion fari, 218 00:11:28,000 --> 00:11:33,000 tiel printf ("Pozitiva entjero bonvolu"). 219 00:11:33,000 --> 00:11:39,000 Nur iu relative simpla kiel tiu por ke per la tempo ni batis linio 14 220 00:11:39,000 --> 00:11:42,000 ni nun havas pozitiva entjero supozeble en n. 221 00:11:42,000 --> 00:11:44,000 >> Nun ni faru ion kun tio. 222 00:11:44,000 --> 00:11:50,000 Lasu min kaj komputi la sumado, do int sumo = sigmo (n). 223 00:11:50,000 --> 00:11:54,000 Sigma estas nur sumado, do mi simple skribas ĝin en la amatoro vojo. 224 00:11:54,000 --> 00:11:56,000 Ni simple nomas ĝin sigma tie. 225 00:11:56,000 --> 00:11:58,000 Tio estas la sumo, kaj nun mi iros al presi la rezulton, 226 00:11:58,000 --> 00:12:08,000 printf ("La sumo estas% d, \ n", sumo). 227 00:12:08,000 --> 00:12:11,000 Kaj poste mi revenos 0 por bona mezuro. 228 00:12:11,000 --> 00:12:15,000 Ni faris ĉion ĉi programo postulas krom la interesa parto, 229 00:12:15,000 --> 00:12:18,000 kiu estas reale efektivigi la sigmo funkcio. 230 00:12:18,000 --> 00:12:22,000 >> Lasu min iri cxi tie al la fundo, kaj lasu min deklari funkcio sigma. 231 00:12:22,000 --> 00:12:26,000 Oni alvenis al variablo kiu estas de tipo entjero, 232 00:12:26,000 --> 00:12:30,000 kaj kion datumtipo mi volas reveni supozeble de sigmo? 233 00:12:30,000 --> 00:12:34,000 Int, ĉar mi volas ke ĝi kongruas miaj atendoj on line 15. 234 00:12:34,000 --> 00:12:37,000 En ĉi tie lasu min antaŭeniri kaj realigi tiun 235 00:12:37,000 --> 00:12:41,000 en bela simpla maniero. 236 00:12:41,000 --> 00:12:45,000 >> Ni iru antaŭen kaj diru int sumo = 0, 237 00:12:45,000 --> 00:12:47,000 kaj nun mi tuj iros havas iom por buklo tie 238 00:12:47,000 --> 00:12:50,000 ke tuj diri ion kiel tion, 239 00:12:50,000 --> 00:13:01,000 por (_int_ i = 0; mi <= nombro; i + +) sumo + = i. 240 00:13:01,000 --> 00:13:05,000 Kaj poste mi tuj revenos sumo. 241 00:13:05,000 --> 00:13:07,000 Mi povus esti realigita ĉi en ajna nombro de manieroj. 242 00:13:07,000 --> 00:13:09,000 Mi povus esti uzita dum ciklo. 243 00:13:09,000 --> 00:13:11,000 Mi povus esti saltis uzanta la sumo variablo se mi vere volis, 244 00:13:11,000 --> 00:13:15,000 sed en fino, ni nur havas funkcion, ke se mi ne goof deklaras sumo estas 0. 245 00:13:15,000 --> 00:13:18,000 Tiam iterates de 0 sur supren tra la numeron, 246 00:13:18,000 --> 00:13:23,000 kaj sur ĉiu ripeto aldonas, ke la aktuala valoro al sumo kaj poste revenas sumo. 247 00:13:23,000 --> 00:13:25,000 >> Nun, estas malpeza optimumigo tie. 248 00:13:25,000 --> 00:13:29,000 Tio estas probable malŝparis paŝo, sed tiel estu. Ke estas bone por la momento. 249 00:13:29,000 --> 00:13:32,000 Ni estas almenaŭ esti ĝisfunda kaj irante 0 tuta vojo plu supren. 250 00:13:32,000 --> 00:13:34,000 Ne tre forta kaj bela simpla, 251 00:13:34,000 --> 00:13:37,000 sed ĝi rezultas ke kun la sigmo funkcion havas la saman ŝancon 252 00:13:37,000 --> 00:13:39,000 kiel ni faris ĉi tie sur la scenejo. 253 00:13:39,000 --> 00:13:42,000 En la scenejo ni simple rakontitaj kiom da homoj estis apud mi, 254 00:13:42,000 --> 00:13:47,000 sed anstataŭ se ni volis havi la numeron 3 + 2 + 1 255 00:13:47,000 --> 00:13:51,000 malsupren al 0 ni povis simile liberigas al funkcio 256 00:13:51,000 --> 00:13:55,000 ke mi anstataŭ priskribi kiel rekursie. 257 00:13:55,000 --> 00:13:57,000 Jen ni do rapida prudento kontroli kaj certigi mi ne goof. 258 00:13:57,000 --> 00:14:00,000 >> Mi scias ke estas almenaŭ unu aĵo en tiu programo, kiun mi ne faru malbonon. 259 00:14:00,000 --> 00:14:04,000 Kiam mi batis eniri mi povos akiri ia kriante ĉe mi? 260 00:14:04,000 --> 00:14:06,000 Kion mi devas kriis je proksimume? 261 00:14:06,000 --> 00:14:11,000 Jes, mi forgesis la prototipo, do mi uzas funkcio nomita sigma on line 15, 262 00:14:11,000 --> 00:14:16,000 sed ne deklaris ĝis linio 22, do mi pli bona proactivamente iru tien 263 00:14:16,000 --> 00:14:22,000 kaj deklari prototipo, kaj mi diros int sigmo (int nombro), kaj tio estas ĝi. 264 00:14:22,000 --> 00:14:24,000 Ĝi estas implementado malsupre. 265 00:14:24,000 --> 00:14:27,000 >> Aŭ alia maniero mi povus solvi tiun, 266 00:14:27,000 --> 00:14:30,000 Mi povis movi la funkcio tie supre, kio ne estas malbona, 267 00:14:30,000 --> 00:14:32,000 sed almenaŭ kiam via programoj komencos akiri longan, sincere, 268 00:14:32,000 --> 00:14:35,000 Mi kredas ke estas iu valoro en havante ĉiam ĉefa supre 269 00:14:35,000 --> 00:14:38,000 por ke vi en la leganto povas malfermi la dosieron kaj tiam tuj vidos 270 00:14:38,000 --> 00:14:40,000 kion la programo faras sen devi serĉi tra ĝi 271 00:14:40,000 --> 00:14:42,000 serĉas ke ĉefa funkcio. 272 00:14:42,000 --> 00:14:49,000 Ni iru al mia fina fenestro tie, provu fari sigma fari sigma, 273 00:14:49,000 --> 00:14:51,000 kaj mi ŝraŭbita tien ankaŭ. 274 00:14:51,000 --> 00:14:55,000 Implica deklaro de funkcio GetInt signifas Mi forgesis fari kion ajn? 275 00:14:55,000 --> 00:14:57,000 [Inaudible-studento] 276 00:14:57,000 --> 00:15:00,000 Bona, do ŝajne komuna eraro, do ni metis ĉi tien, 277 00:15:00,000 --> 00:15:04,000 cs50.h, kaj nun ni reiros al mia fina fenestro. 278 00:15:04,000 --> 00:15:08,000 >> Mi certe la ekrano, kaj mi rerun fari sigmo. 279 00:15:08,000 --> 00:15:11,000 Ŝajnas esti kompilita. Permesu al mi kuri sigmo. 280 00:15:11,000 --> 00:15:15,000 Mi tajpas en la numero 3, kaj mi ne atingas 6, tiel ne estas rigora ĉeko, 281 00:15:15,000 --> 00:15:18,000 sed almenaŭ ŝajnas esti laboranta ĉe la unua rigardo, sed nun ni ŝiri ĝin aparte, 282 00:15:18,000 --> 00:15:21,000 kaj ni efektive utiligi la ideon de rekursio, denove, 283 00:15:21,000 --> 00:15:24,000 en tre simpla kunteksto por ke post kelkaj semajnoj 'tempo 284 00:15:24,000 --> 00:15:27,000 kiam ni komencos esplori amatoro datumstrukturoj ol arrays 285 00:15:27,000 --> 00:15:30,000 ni havas alian ilon en la ilaron kun kiuj 286 00:15:30,000 --> 00:15:33,000 manipuli tiujn datumstrukturoj kiel ni vidos. 287 00:15:33,000 --> 00:15:36,000 Ĉi tiu estas la ripeta alproksimiĝo, la buklo bazita alproksimiĝon. 288 00:15:36,000 --> 00:15:39,000 >> Lasu min anstataŭ nun faras tion. 289 00:15:39,000 --> 00:15:44,000 Lasu min anstataŭ diri ke la sumado de numero 290 00:15:44,000 --> 00:15:48,000 malsupren al 0 estas vere la sama afero kiel 291 00:15:48,000 --> 00:15:53,000 numeron + sigmo (numero - 1). 292 00:15:53,000 --> 00:15:57,000 Alivorte, samkiel en la scenejo mi punted al ĉiu el la popolo apud mi, 293 00:15:57,000 --> 00:16:00,000 kaj ili laŭvice observis punting ĝis ni fine fundo tra Willy, 294 00:16:00,000 --> 00:16:03,000 kiu devis reveni malmola-kodita respondon kiel 0. 295 00:16:03,000 --> 00:16:07,000 Jen nun ni simile punting al sigmo 296 00:16:07,000 --> 00:16:10,000 la sama funkcio kiel origine nomis, sed la ŝlosilo _insight_ tie 297 00:16:10,000 --> 00:16:12,000 estas ke ni ne nomante sigma idente. 298 00:16:12,000 --> 00:16:14,000 Ni ne pasante en n. 299 00:16:14,000 --> 00:16:17,000 Ni klare pasante en numero - 1, 300 00:16:17,000 --> 00:16:20,000 tiel iomete pli malgranda problemo, iomete pli malgranda problemo. 301 00:16:20,000 --> 00:16:23,000 >> Bedaŭrinde, tiu ne estas sufiĉe solvo ankoraux, kaj antaŭ ni ripari 302 00:16:23,000 --> 00:16:26,000 kio povus esti saltante kiel evidenta en iu el vi 303 00:16:26,000 --> 00:16:28,000 lasu min iri antaŭen kaj rerun fari. 304 00:16:28,000 --> 00:16:30,000 Ŝajnas al kompili okay. 305 00:16:30,000 --> 00:16:32,000 Lasu min rerun sigma kun 6. 306 00:16:32,000 --> 00:16:37,000 Whoops, lasu min rerun sigma kun 6. 307 00:16:37,000 --> 00:16:42,000 Ni vidis tiun antaŭe, kvankam hazarde lasta fojo ankaŭ. 308 00:16:42,000 --> 00:16:48,000 Kial mi akiri ĉi críptico segmentación kulpo? Yeah. 309 00:16:48,000 --> 00:16:50,000 [Inaudible-studento] 310 00:16:50,000 --> 00:16:53,000 Ne bazo kazo, kaj pli specife, kion probable okazis? 311 00:16:53,000 --> 00:16:58,000 Tio estas simptomo de tio, kion konduto? 312 00:16:58,000 --> 00:17:00,000 Diru ĝin iom pli laŭta. 313 00:17:00,000 --> 00:17:02,000 [Inaudible-studento] 314 00:17:02,000 --> 00:17:05,000 Estas senfina ciklo efike, kaj la problemo kun malfinia maŝojn 315 00:17:05,000 --> 00:17:08,000 kiam engaĝi rekursio en ĉi tiu kazo, funkcio kiu nomas sin, 316 00:17:08,000 --> 00:17:10,000 kio okazas ĉiufoje vi nomas funkcio? 317 00:17:10,000 --> 00:17:13,000 Nu, pensu reen al kiel ni planis la memoro en komputilo. 318 00:17:13,000 --> 00:17:16,000 Ni diris, ke tie estas tio eron de memoro nomis la pilo tio ĉe la fundo, 319 00:17:16,000 --> 00:17:19,000 kaj ĉiufoje vi nomas funkcio iom pli memoro gets metis 320 00:17:19,000 --> 00:17:24,000 en ĉi tiu tiel nomata pilo enhavis tiun funkcion de loka variabloj aŭ parametroj, 321 00:17:24,000 --> 00:17:27,000 do se sigma nomas sigma alvokoj sigma nomas sigmo 322 00:17:27,000 --> 00:17:29,000  flamo sigma kie faras ĉi rakonto fino? 323 00:17:29,000 --> 00:17:31,000 >> Nu, finfine overruns la tuta kvanto 324 00:17:31,000 --> 00:17:33,000 de memoro, ke vi havas disponebla por via komputilo. 325 00:17:33,000 --> 00:17:37,000 Vi invadita la segmento kiu vi supozis resti interne, 326 00:17:37,000 --> 00:17:40,000 kaj vi ricevos tiun segmentación kulpo, kerno verŝis, 327 00:17:40,000 --> 00:17:43,000 kaj kion kerno verŝis signifas estas ke mi nun havas dosieron nomatan kerno 328 00:17:43,000 --> 00:17:46,000 kiu estas dosiero enhavanta nuloj kaj 329 00:17:46,000 --> 00:17:49,000 ke vere en la estonteco estos diagnostically utila. 330 00:17:49,000 --> 00:17:52,000 Se ĝi ne estas evidenta al vi kie estas via eraro estas 331 00:17:52,000 --> 00:17:54,000 vi povas reale fari iom de jura analizo, por tiel diri, 332 00:17:54,000 --> 00:17:58,000 en ĉi tiu kerno dump dosiero, kiu, denove, estas nur aro faskon da nuloj kaj 333 00:17:58,000 --> 00:18:02,000 kiu esence reprezentas la staton de via programo en memoro 334 00:18:02,000 --> 00:18:05,000 la momento frakasis tiamaniere. 335 00:18:05,000 --> 00:18:11,000 >> La riparas tie estas ke ni ne povas simple blinde reveni sigma, 336 00:18:11,000 --> 00:18:14,000 la nombro + sigma de iomete pli malgranda problemo. 337 00:18:14,000 --> 00:18:16,000 Ni bezonas havi ian bazon kazo ĉi tie, 338 00:18:16,000 --> 00:18:19,000 kaj kion faru la bazo kazo probable estus? 339 00:18:19,000 --> 00:18:22,000 [Inaudible-studento] 340 00:18:22,000 --> 00:18:25,000 Konsentite, tiel longe kiel la nombro estas pozitiva ni vere revenos ĉi, 341 00:18:25,000 --> 00:18:29,000 aŭ meti alian vojon, se nombro estas, diri, <= al 0 342 00:18:29,000 --> 00:18:32,000 vi scias kion, mi iros antaŭen kaj reveni 0, 343 00:18:32,000 --> 00:18:36,000 multe kiel Willy faris, kaj alie, mi tuj iros antaŭen 344 00:18:36,000 --> 00:18:41,000 kaj revenu ĉi, do ĝi ne estas tiom da mallongaj 345 00:18:41,000 --> 00:18:44,000 ol la ripeta versio kiu ni ekfrapis unua uzante por ciklo, 346 00:18:44,000 --> 00:18:48,000 sed rimarkas ke estas ĉi tia eleganteco al ĝi. 347 00:18:48,000 --> 00:18:51,000 Anstataŭ reveni iu nombro kaj realigante ĉio ĉi math 348 00:18:51,000 --> 00:18:54,000 kaj aldonante aĵoj kun lokaj variabloj 349 00:18:54,000 --> 00:18:57,000 vi anstataŭ diri "Konsentite, se ĉi tiu estas super facila problemo, 350 00:18:57,000 --> 00:19:01,000 kiel la nombro estas <0, lasu min tuj revenos 0. " 351 00:19:01,000 --> 00:19:03,000 >> Ni ne tedi apogas negativaj nombroj, 352 00:19:03,000 --> 00:19:05,000 do mi tuj forte kodo la valoro de 0. 353 00:19:05,000 --> 00:19:08,000 Sed alie, por apliki tiun ideon de sumanta 354 00:19:08,000 --> 00:19:11,000 ĉiuj el tiuj numeroj kune vi povas efektive fari malgrandan mordo 355 00:19:11,000 --> 00:19:14,000 eksteren de la problemo, multe kiel ni faris ĉi tie sur scenejo, 356 00:19:14,000 --> 00:19:18,000 tiam liberigas la resto de la problemo al la sekvanta persono, 357 00:19:18,000 --> 00:19:20,000 sed en ĉi tiu kazo la sekvanta persono estas vi mem. 358 00:19:20,000 --> 00:19:22,000 Ĝi estas idente nomata funkcio. 359 00:19:22,000 --> 00:19:25,000 Nur pasi ĝin pli malgranda kaj pli malgrandaj kaj pli malgrandaj problemo ĉiu tempo, 360 00:19:25,000 --> 00:19:28,000 kaj eĉ se ni ne havas sufiĉe formaligita aĵojn en kodo tie 361 00:19:28,000 --> 00:19:33,000 ĉi tiu estas precize kio okazas en semajno 0 kun la telefono libro. 362 00:19:33,000 --> 00:19:36,000 Tio estas ekzakte kio okazas en pasintaj semajnoj kun Sean 363 00:19:36,000 --> 00:19:39,000 kaj estis kun niaj manifestacioj de serĉanta por nombroj. 364 00:19:39,000 --> 00:19:42,000 Oni prenas problemo kaj dividante ĝin denove kaj denove. 365 00:19:42,000 --> 00:19:44,000 >> Alivorte, ne estas maniero nun traduki 366 00:19:44,000 --> 00:19:47,000 ĉi reala mondo konstruas, tiun altan nivelon konstruo 367 00:19:47,000 --> 00:19:51,000 de dividi kaj venki kaj farante ion ĉiam denove 368 00:19:51,000 --> 00:19:56,000 en kodo, do ĉi tiu estas io ni vidos denove la tempo. 369 00:19:56,000 --> 00:20:00,000 Nun, kiel flanken, se vi estas nova al rekursio vi devus almenaŭ kompreni nun 370 00:20:00,000 --> 00:20:02,000 kial tiu estas amuza. 371 00:20:02,000 --> 00:20:05,000 Mi tuj iros al google.com, 372 00:20:05,000 --> 00:20:17,000 kaj mi tuj serĉi iujn konsilojn kaj lertaĵoj de rekursio, eniru. 373 00:20:17,000 --> 00:20:21,000 Diru al la persono apud vi, se ili ne ridas gxuste nun. 374 00:20:21,000 --> 00:20:23,000 Ĉu vi volas diri rekursio? 375 00:20:23,000 --> 00:20:25,000 Ĉu vi volas diri-ha, tie ni iru. 376 00:20:25,000 --> 00:20:28,000 Okay, nun tio estas la resto de ĉiuj. 377 00:20:28,000 --> 00:20:30,000 Iom Easter egg enigita ie tie en Google. 378 00:20:30,000 --> 00:20:33,000 Kiel flanken, unu el la ligiloj ni surmetis la kurso de afiŝinto 379 00:20:33,000 --> 00:20:36,000 hodiaŭ estas nur tiun kradon de diversaj ordigado algoritmoj, 380 00:20:36,000 --> 00:20:39,000 iuj de kiuj ni rigardis lasta semajno, sed kio estas bela pri tiu videbligo 381 00:20:39,000 --> 00:20:43,000 kiel vi provas kovri vian menson ĉirkaŭ diversaj aferoj rilataj al algoritmoj 382 00:20:43,000 --> 00:20:46,000 scias, ke vi povas tre facile nun starti kun malsamaj tipoj de enigoj. 383 00:20:46,000 --> 00:20:50,000 La enigoj ĉiuj renversis, La enigoj plejparte ordo, la enigoj hazarda ks. 384 00:20:50,000 --> 00:20:53,000 Kiel vi klopodos, denove, distingi tion en via menso 385 00:20:53,000 --> 00:20:57,000 rimarkas ke ĉi tiu URL en la paso de afiŝinto sur Prelegoj paĝo 386 00:20:57,000 --> 00:21:00,000 povus helpi al vi kialon por iu el tiuj. 387 00:21:00,000 --> 00:21:05,000 >> Hodiaŭ ni finfine atingos solvi tiun problemon de kelka tempo reen, 388 00:21:05,000 --> 00:21:08,000 kio estis tiu ĉi interŝanĝo funkcio simple ne funkcias, 389 00:21:08,000 --> 00:21:12,000 kaj kio estis la fundamenta problemo kun ĉi tiu funkcio interŝanĝa, 390 00:21:12,000 --> 00:21:15,000 la celo de kiu estis, denove, por interŝanĝi valoron tie kaj tie 391 00:21:15,000 --> 00:21:17,000 tia, ke ĉi tio okazas? 392 00:21:17,000 --> 00:21:20,000 Ĉi tio ne vere funkcias. Kial? 393 00:21:20,000 --> 00:21:22,000 Yeah. 394 00:21:22,000 --> 00:21:28,000 [Inaudible-studento] 395 00:21:28,000 --> 00:21:31,000 Precize, la ekspliko por ĉi bugginess 396 00:21:31,000 --> 00:21:34,000 simple estis ĉar kiam vi nomas funkcioj en C 397 00:21:34,000 --> 00:21:38,000 kaj tiuj funkcioj preni argumentoj, kiel a kaj b tie, 398 00:21:38,000 --> 00:21:42,000 vi pasas en kopioj de kiom valoron vi havigante al tiu funkcio. 399 00:21:42,000 --> 00:21:46,000 Vi ne estas havigi la originalaj valoroj sin, 400 00:21:46,000 --> 00:21:49,000 do ni vidis tion en la kunteksto de buggyc, 401 00:21:49,000 --> 00:21:52,000 buggy3.c, kiu aspektis iom io tiamaniere. 402 00:21:52,000 --> 00:21:57,000 >> Memori, ke ni havis x kaj y inicializado al 1 kaj 2 respektive. 403 00:21:57,000 --> 00:21:59,000 Ni tiam presitaj el kio ili estis. 404 00:21:59,000 --> 00:22:03,000 Mi tiam asertis, ke mi estis interŝanĝi ilin nomante swap de x, y. 405 00:22:03,000 --> 00:22:06,000 Sed la problemo estis, ke la interŝanĝante laboris, 406 00:22:06,000 --> 00:22:10,000 sed nur en la medio de la interŝanĝa funkcii mem. 407 00:22:10,000 --> 00:22:13,000 Tuj kiam ni batis linio 40 tiuj interŝanĝis valoroj 408 00:22:13,000 --> 00:22:16,000 estis ĵetitaj for, do nenio 409 00:22:16,000 --> 00:22:21,000 en la originala funkcio ĉefa estis vere ŝanĝis tute ne, 410 00:22:21,000 --> 00:22:26,000 do se vi opinias tiutempe pri kio ĉi aspektas kiel en terminoj de nia memoro 411 00:22:26,000 --> 00:22:29,000 se ĉi tiu maldekstra flanko de la tabulo reprezentas- 412 00:22:29,000 --> 00:22:33,000 kaj mi faros mian plejeblon por ĉiuj por vidi ĉi-se ĉi maldekstra flanko de la tabulo 413 00:22:33,000 --> 00:22:37,000 reprezentas, diru vian RAM, kaj la pilo tuj kreskas sur tiun vojon, 414 00:22:37,000 --> 00:22:43,000 kaj ni nomas funkcio kiel ĉefa, kaj ĉefa havas 2 lokaj variabloj, x kaj y, 415 00:22:43,000 --> 00:22:48,000 ni priskribas tiujn kiel x tie, kaj ni priskribas tiujn kiel y tie, 416 00:22:48,000 --> 00:22:55,000 kaj ni metis en la valoroj de 1 kaj 2, do ĉi tie estas ĉefa, 417 00:22:55,000 --> 00:22:58,000 kaj kiam ĉefa nomas la interŝanĝa funkcio la mastruma sistemo 418 00:22:58,000 --> 00:23:02,000 donas la interŝanĝa funkcio propran swath de memoro pri la pilo, 419 00:23:02,000 --> 00:23:04,000 lia propra kadro sur la pilo, por tiel diri. 420 00:23:04,000 --> 00:23:08,000 Ĝi ankaŭ allocates 32 bitoj por tiuj ints. 421 00:23:08,000 --> 00:23:11,000 Ĝi okazas nomi ilin a kaj b, sed tio estas tute arbitra. 422 00:23:11,000 --> 00:23:13,000 Ĝi povus ilin vokis ajn ĝi volas, sed kio okazas kiam ĉefa 423 00:23:13,000 --> 00:23:19,000 alvokoj interŝanĝa estas prenas ĉi 1, metas kopion tie, metas kopion tie. 424 00:23:19,000 --> 00:23:23,000 >> Estas 1 aliaj lokaj variablo en interŝanĝa, kvankam, nomita kio? >> Tmp. 425 00:23:23,000 --> 00:23:27,000 Tmp, do mi donos al mi alian 32 bitoj tie, 426 00:23:27,000 --> 00:23:29,000 kaj kion mi faras en ĉi tiu funkcio? 427 00:23:29,000 --> 00:23:34,000 Mi diris int tmp ricevas, tial havas 1, do mi faris tion kiam ni lastaj ludis kun ĉi tiu ekzemplo. 428 00:23:34,000 --> 00:23:39,000 Tiam ricevas b, do b estas 2, do nun ĉi iĝas 2, 429 00:23:39,000 --> 00:23:42,000 kaj nun b gets temp, do temp estas 1, 430 00:23:42,000 --> 00:23:44,000 tial nun b igas ĉi. 431 00:23:44,000 --> 00:23:46,000 Tio estas granda. Ĝi funkciis. 432 00:23:46,000 --> 00:23:49,000 Sed tiam kiam la funkcio redonas 433 00:23:49,000 --> 00:23:52,000 interŝanĝa la memoro efektive malaperas tiel ke ĝi povas esti reuzata 434 00:23:52,000 --> 00:23:58,000 de iu alia funkcio en la estonteco, kaj ĉefa estas evidente tute senŝanĝe. 435 00:23:58,000 --> 00:24:00,000 Ni bezonas metodo fundamente solvi ĉi tiun problemon, 436 00:24:00,000 --> 00:24:03,000 kaj hodiaŭ ni fine havas vojon por tion fari per 437 00:24:03,000 --> 00:24:06,000 ni povas enkonduki iun nomita puntero. 438 00:24:06,000 --> 00:24:09,000 Rezultas, ke ni povas solvi ĉi tiun problemon 439 00:24:09,000 --> 00:24:12,000 ne per paŝo en kopioj de x kaj y 440 00:24:12,000 --> 00:24:18,000 sed anstataŭ per pasante en kio, ĉu vi opinias, al la interŝanĝa funkcio? 441 00:24:18,000 --> 00:24:20,000 Yeah, kio pri la adreso? 442 00:24:20,000 --> 00:24:22,000 Ni ne vere parolis pri adresoj en multa detalo, 443 00:24:22,000 --> 00:24:25,000 sed se tiu pizarrón reprezentas mia komputilo memoro 444 00:24:25,000 --> 00:24:28,000 ni povus certe komencos numeri la bajtoj en mia memoro RAM 445 00:24:28,000 --> 00:24:31,000 kaj diru ĉi estas bajto # 1, ĉi tiu estas bajto # 2, # 3 bajto, 446 00:24:31,000 --> 00:24:35,000 bajto # 4, bajto # ... 2 miliardoj se mi havas 2 gigabajtoj de RAM, 447 00:24:35,000 --> 00:24:38,000 do ni povus certe venos kun iu ajna kalkulado skemo 448 00:24:38,000 --> 00:24:41,000 por ĉiuj individuaj bajtoj en mia komputilo memoro. 449 00:24:41,000 --> 00:24:43,000 >> Kio se anstataŭ kiam mi vokas interŝanĝa 450 00:24:43,000 --> 00:24:47,000 anstataŭ pasu en kopioj de x kaj y 451 00:24:47,000 --> 00:24:51,000 kial ne mi anstataŭ pasi en la sidejo de x ĉi tie, 452 00:24:51,000 --> 00:24:55,000 la adreso de y tie, esence la poŝta adreso 453 00:24:55,000 --> 00:24:59,000 de x kaj y ĉar tiam interŝanĝi, se li informis 454 00:24:59,000 --> 00:25:01,000 de la adreso en memoro de x kaj y, 455 00:25:01,000 --> 00:25:04,000 tiam interŝanĝi, se ni trejnis lin iom, 456 00:25:04,000 --> 00:25:07,000 li povus potenciale forpelos al tiu adreso, por tiel diri, 457 00:25:07,000 --> 00:25:11,000 x, kaj ŝanĝi la nombron tie, tiam forpelos al la adreso de y, 458 00:25:11,000 --> 00:25:16,000 ŝanĝi la nombron tie, eĉ dum ne vere atingi kopioj de tiuj valoroj mem, 459 00:25:16,000 --> 00:25:19,000 do eĉ se ni parolis pri tiu kiel ĉefa memoro 460 00:25:19,000 --> 00:25:23,000 kaj ĉi tiu estas interŝanĝa la memoro la potencaj kaj la danĝera parto de C 461 00:25:23,000 --> 00:25:28,000 estas ke neniu funkcio povas tuŝi memoro ie ajn en la komputilo, 462 00:25:28,000 --> 00:25:32,000 kaj ĉi tiu estas potenca en kiu vi povas fari tre kapricaj aĵoj kun komputilaj programoj en C. 463 00:25:32,000 --> 00:25:36,000 Tiu estas danĝera ĉar vi povas ankaŭ ŝraŭbo supren tre facile. 464 00:25:36,000 --> 00:25:39,000 Fakte, unu el la plej komunaj formoj por programoj tiuj tagoj por esti ekspluatita 465 00:25:39,000 --> 00:25:42,000 ankoraŭ estas por programisto ne rimarki 466 00:25:42,000 --> 00:25:45,000 ke li aŭ ŝi estas permesante datumoj 467 00:25:45,000 --> 00:25:49,000 esti skribitaj en loko en memoro kiu ne estis intencita. 468 00:25:49,000 --> 00:25:51,000 >> Ekzemple, li aŭ ŝi deklaras tabelo de amplekso 10 469 00:25:51,000 --> 00:25:56,000 sed tiam hazarde provas meti 11 bitokoj en tiun tabelo de memoro, 470 00:25:56,000 --> 00:25:59,000 kaj vi komencos tuŝi partoj de memoro kiu ne plu estas valida. 471 00:25:59,000 --> 00:26:02,000 Nur por contextual tio, kelkaj el vi sciu, ke 472 00:26:02,000 --> 00:26:06,000 programaro ofte vin avertas por seria nombroj aŭ registriĝo klavoj, 473 00:26:06,000 --> 00:26:08,000 Photoshop kaj Word kaj programoj kiel ĉi tio. 474 00:26:08,000 --> 00:26:12,000 Ekzistas fendetoj, kiel kelkaj el vi scias, online, kie vi povas kuri iomete programo, 475 00:26:12,000 --> 00:26:14,000 kaj voila, ne pli peto por seria numero. 476 00:26:14,000 --> 00:26:16,000 Kiel ĝi estas laborante? 477 00:26:16,000 --> 00:26:21,000 En multaj kazoj ĉi tiuj aferoj estas simple trovi en la komputiloj 478 00:26:21,000 --> 00:26:24,000 teksto segmentoj en la komputilo reala nuloj kaj 479 00:26:24,000 --> 00:26:28,000 kie estas tiu funkcio, kie la seria numero petas, 480 00:26:28,000 --> 00:26:31,000 kaj vi anstatauxigas tiu spaco, aŭ dum la programo kuras 481 00:26:31,000 --> 00:26:33,000 vi povas elŝeligi kie la ŝlosilo estas vere stokita 482 00:26:33,000 --> 00:26:37,000 uzante iun nomita erarserĉilo, kaj vi povas fendi programaro kiu vojo. 483 00:26:37,000 --> 00:26:40,000 Tio ne estas diri, ke ĉi tiu estas nia celo por la venonta paro de tagoj, 484 00:26:40,000 --> 00:26:42,000 sed ĝi havas tre reala mondo ramificaciones. 485 00:26:42,000 --> 00:26:45,000 Tiu okazas impliki ŝtelo de la programaro, 486 00:26:45,000 --> 00:26:47,000 sed estas ankaŭ kompromison de tutaj maŝinoj. 487 00:26:47,000 --> 00:26:50,000 >> Fakte, kiam retejoj tiuj tagoj estas ekspluatita 488 00:26:50,000 --> 00:26:53,000 kaj kompromitita kaj datumoj estas filtritaj kaj pasvortoj estas ŝtelitaj 489 00:26:53,000 --> 00:26:58,000 tion tre ofte rilatas al malriĉaj mastrumado de onia memoro, 490 00:26:58,000 --> 00:27:01,000 aŭ, en la kazo de datumbazoj, fiasko anticipi 491 00:27:01,000 --> 00:27:03,000 adversarial enigo, do pli en kiuj en la semajnoj por veni, 492 00:27:03,000 --> 00:27:07,000 sed por nun nur sneak antaŭmontro de la varo de damaĝo, kiun vi povas fari 493 00:27:07,000 --> 00:27:11,000 por ne sufiĉe kompreni kiel aferoj funkcias sub la kapuĉo. 494 00:27:11,000 --> 00:27:14,000 Ni iru pri kompreni kial ĉi estas rompita 495 00:27:14,000 --> 00:27:17,000 kun ilo kiu igos pli kaj pli utila 496 00:27:17,000 --> 00:27:19,000 kiel niaj programoj akiri pli kompleksa. 497 00:27:19,000 --> 00:27:21,000 Tiel malproksime kiam vi havis cimon en via programo 498 00:27:21,000 --> 00:27:23,000 kiel vi iradis, elpurigante ĝin? 499 00:27:23,000 --> 00:27:25,000 Kion viaj teknikoj estis tiel malproksime, ĉu instruis per via TF 500 00:27:25,000 --> 00:27:27,000 aŭ nur memlernanto? 501 00:27:27,000 --> 00:27:29,000 [Studenta] printf. 502 00:27:29,000 --> 00:27:31,000 Printf, do printf estas probable estis via amiko en kiu, se vi volas vidi 503 00:27:31,000 --> 00:27:33,000 kio okazas ene de via programo 504 00:27:33,000 --> 00:27:36,000 vi simple metas printf tie, printf tie, printf tie. 505 00:27:36,000 --> 00:27:38,000 Tiam vi kuros, kaj vi ricevos tutan faskon da aĵoj sur la ekrano 506 00:27:38,000 --> 00:27:43,000 ke vi povas uzi por tiam dedukti kio reale iras malĝustan en via programo. 507 00:27:43,000 --> 00:27:45,000 >> Printf emas esti tre potenca afero, 508 00:27:45,000 --> 00:27:47,000 sed estas tre manlibro procezo. 509 00:27:47,000 --> 00:27:49,000 Vi devas enmeti printf tie, printf tie, 510 00:27:49,000 --> 00:27:51,000 kaj se vi metas ĝin interne de ciklo vi povus ricevi 100 linioj 511 00:27:51,000 --> 00:27:53,000 de eliro, ke vi tiam devas kribri tra. 512 00:27:53,000 --> 00:27:58,000 Ne tre uzantamika aŭ interaga mekanismo por elpurigi programoj, 513 00:27:58,000 --> 00:28:00,000 sed dankeme ekzistas alternativoj. 514 00:28:00,000 --> 00:28:03,000 Jen programo, ekzemple, nomita GDB, la GNU sencimigilo, 515 00:28:03,000 --> 00:28:06,000 kiu estas iom arcano en kiel vi uzas ĝin. 516 00:28:06,000 --> 00:28:08,000 Ĝi estas iom kompleksa, sed sincere, 517 00:28:08,000 --> 00:28:11,000 tio estas unu el tiuj aĵoj kie se vi metas en ĉi tiun semajnon kaj apud 518 00:28:11,000 --> 00:28:14,000 la ekstra horo por kompreni iun kiel GDB 519 00:28:14,000 --> 00:28:18,000 ĝin savos vin probable dekojn da horoj en la longa, 520 00:28:18,000 --> 00:28:21,000 do kun tio, mi donos al vi teaser de kiel tion funkcias. 521 00:28:21,000 --> 00:28:23,000 >> Mi estas en mia fina fenestro. 522 00:28:23,000 --> 00:28:26,000 Lasu min kaj kompili tiun programon, buggy3. 523 00:28:26,000 --> 00:28:28,000 Estas jam ĝis nun. 524 00:28:28,000 --> 00:28:31,000 Lasu min ruli ĝin samkiel ni faris dum dorso, kaj ja, ĝi estas rompita. 525 00:28:31,000 --> 00:28:34,000 Sed kial estas tio? Eble mi ŝraŭbita ĝis la interŝanĝa funkcio. 526 00:28:34,000 --> 00:28:37,000 Eble estas a kaj b. Mi ne sufiĉe movi ilin ĉirkaŭ ĝuste. 527 00:28:37,000 --> 00:28:39,000 Lasu min kaj faros. 528 00:28:39,000 --> 00:28:43,000 Anstataŭ nur kuri buggy3 lasu min anstataŭ kuri ĉi programo GDB, 529 00:28:43,000 --> 00:28:48,000 kaj mi tuj rakontos ĝin kuri buggy3, 530 00:28:48,000 --> 00:28:52,000 kaj mi tuj inkludas komandlinio argumento,-tui, 531 00:28:52,000 --> 00:28:55,000 kaj ni metos tion en estonteco problemoj ĉe spec memorigi. 532 00:28:55,000 --> 00:28:57,000 Kaj nun tiu nigra-blanka interfaco pusxis supren ke, denove, 533 00:28:57,000 --> 00:28:59,000 estas iom blindiga unue ĉar tie estas ĉiuj ĉi 534 00:28:59,000 --> 00:29:02,000 garantio informojn cxi tie, sed almenaŭ estas iu familiara. 535 00:29:02,000 --> 00:29:04,000 En la pinto de la fenestro estas mia reala kodo, 536 00:29:04,000 --> 00:29:08,000 kaj se mi rulumu supren tie lasu min rulumi la plejsupro de mia dosiero, 537 00:29:08,000 --> 00:29:11,000 kaj ja, ekzistas buggy3.c, kaj anonco en la fundo de tiu fenestro 538 00:29:11,000 --> 00:29:13,000 Mi havas ĉi GDB prompto. 539 00:29:13,000 --> 00:29:16,000 >> Ĉi tiu ne estas la sama kiel mia normala John Harvard prompto. 540 00:29:16,000 --> 00:29:19,000 Tio ĉi estas prompto ke tuj permesos ke mi kontroli GDB. 541 00:29:19,000 --> 00:29:21,000 GDB estas erarserĉilo. 542 00:29:21,000 --> 00:29:24,000 Al erarserĉilo estas programo kiu ebligas trairu 543 00:29:24,000 --> 00:29:27,000 ekzekuto de via programo linio por linio por linio, 544 00:29:27,000 --> 00:29:30,000 la vojo faras ion vi volas al la programo, 545 00:29:30,000 --> 00:29:33,000 eĉ nomante funkcioj, aŭ rigardi, pli grave, 546 00:29:33,000 --> 00:29:35,000 ĉe diversaj variablo de valoroj. 547 00:29:35,000 --> 00:29:37,000 Ni faru tion. 548 00:29:37,000 --> 00:29:40,000 Mi tuj iros antaŭen kaj tajpu en afiŝo en GDB la prompto, 549 00:29:40,000 --> 00:29:43,000 tiom rimarkos malsupre maldekstre de la ekrano mi tajpis kuri, 550 00:29:43,000 --> 00:29:45,000 kaj mi batis eniros, kaj kion tiu faras? 551 00:29:45,000 --> 00:29:50,000 Ĝi laŭvorte kuris mia programo, sed mi ne vere vidas multe iru tien 552 00:29:50,000 --> 00:29:55,000 ĉar mi ne vere diris la erarserĉilo 553 00:29:55,000 --> 00:29:57,000 paŭzi en aparta momento en tempo. 554 00:29:57,000 --> 00:29:59,000 Nur tajpi run kuras la programo. 555 00:29:59,000 --> 00:30:01,000 Mi ne vere vidas nenion. Mi ne povas manipuli ĝin. 556 00:30:01,000 --> 00:30:03,000 >> Anstataŭ lasu min fari tion. 557 00:30:03,000 --> 00:30:08,000 En ĉi GDB prompto lasu min anstataŭ tajpi paŭzo, eniru. 558 00:30:08,000 --> 00:30:10,000 Tio ne estas kion mi celis tajpi. 559 00:30:10,000 --> 00:30:13,000 Ni anstataŭ tajpi ripozon ĉefa. 560 00:30:13,000 --> 00:30:15,000 Alivorte, mi volas establi iu nomita Haltpunkto, 561 00:30:15,000 --> 00:30:18,000 kiu estas _aptly_ nomis ĉar ĝi rompos aŭ paŭzo 562 00:30:18,000 --> 00:30:21,000 ekzekuto de via programo en tiu aparta loko. 563 00:30:21,000 --> 00:30:23,000 Artikolo estas la nomo de mia funkcio. 564 00:30:23,000 --> 00:30:25,000 Rimarku ke GDB estas sufiĉe inteligenta. 565 00:30:25,000 --> 00:30:28,000 Ĝi supozis, ke ĉefa okazas komenci malglate ĉe linio 18 566 00:30:28,000 --> 00:30:32,000 de buggy3.c, kaj poste rimarkis tie en supre maldekstre 567 00:30:32,000 --> 00:30:34,000 b + estas tuj apud linio 18. 568 00:30:34,000 --> 00:30:38,000 Tio memorigis min ke mi aperigos Haltpunkto ĉe linio 18. 569 00:30:38,000 --> 00:30:42,000 Ĉi-foje kiam mi tajpas kuras, mi tuj kuras mia programo 570 00:30:42,000 --> 00:30:45,000 supren ĝis batas ke Haltpunkto, 571 00:30:45,000 --> 00:30:48,000 tial la programo faros paŭzon por mi en linio 18. 572 00:30:48,000 --> 00:30:50,000 Ĉi tie ni iros, kuri. 573 00:30:50,000 --> 00:30:53,000 Nenio ŝajnas esti okazinta, sed avizo je fundo forlasis 574 00:30:53,000 --> 00:30:58,000 komencante programo, buggy3, Haltpunkto 1 en ĉefa ĉe buggy3.c linio 18. 575 00:30:58,000 --> 00:31:00,000 Kion mi povas fari nun? 576 00:31:00,000 --> 00:31:03,000 >> Rimarku mi povas ektajpu aĵojn kiel presita, 577 00:31:03,000 --> 00:31:08,000 ne printf, presita x, kaj nun jen stranga. 578 00:31:08,000 --> 00:31:11,000 La $ 1 estas nur vidindaĵo, kiel ni vidos 579 00:31:11,000 --> 00:31:14,000 ĉiufoje kiam vi presas ion vi acxetas novan $ valoro. 580 00:31:14,000 --> 00:31:18,000 Tio estas tiel ke vi povas raporti al antaŭaj valoroj ĉiaokaze, 581 00:31:18,000 --> 00:31:21,000 sed por nun kion print diras al mi estas ke la valoro de x je ĉi tiu punkto en la historio 582 00:31:21,000 --> 00:31:26,000 estas ŝajne 134514032. 583 00:31:26,000 --> 00:31:29,000 Kio? Kien ke eĉ venis? 584 00:31:29,000 --> 00:31:31,000 [Inaudible-studento] 585 00:31:31,000 --> 00:31:34,000 Ja, tio estas, kion ni nomas rubo valoron, kaj ni ne parolis pri tiu ankoraux, 586 00:31:34,000 --> 00:31:37,000 sed la kialo ke vi pravalorizi variabloj 587 00:31:37,000 --> 00:31:40,000 Estas evidente ke ili havas iun valoron, kiun vi volas ilin havi. 588 00:31:40,000 --> 00:31:44,000 Sed la kaptaĵo estas memori, ke vi povas deklari variablojn 589 00:31:44,000 --> 00:31:46,000 kiel mi faris antaŭ momento en mia sigma Ekzemplo 590 00:31:46,000 --> 00:31:48,000 sen efektive donante ilin valoro. 591 00:31:48,000 --> 00:31:50,000 Memori kion mi faris super tie en sigmo. 592 00:31:50,000 --> 00:31:52,000 Mi deklaris n, sed kion valoro ĉu mi donu ĝin? 593 00:31:52,000 --> 00:31:56,000 Neniu, ĉar mi sciis, ke en la venontaj linioj 594 00:31:56,000 --> 00:31:59,000 GetInt okupus de la problemo de meti valoron ene de n. 595 00:31:59,000 --> 00:32:02,000 >> Sed en ĉi tiu punkto en la historio de linio 11 596 00:32:02,000 --> 00:32:05,000 kaj linio 12 kaj linio 13 kaj linio 14 597 00:32:05,000 --> 00:32:08,000 laŭlonge de tiuj pluraj linioj, kio estas la valoro de n? 598 00:32:08,000 --> 00:32:10,000 En C vi simple ne scias. 599 00:32:10,000 --> 00:32:14,000 Estas ĝenerale iu rubo valoron, iuj tute hazarda nombro 600 00:32:14,000 --> 00:32:17,000 ke tio lasis sur esence de iu antaŭa funkcio 601 00:32:17,000 --> 00:32:21,000 estinte kuras, por ke via programo kuras 602 00:32:21,000 --> 00:32:24,000 memori, ke funkcio atingas funkcio, funkcio, funkcio. 603 00:32:24,000 --> 00:32:27,000 Ĉiuj ĉi tiuj kadroj get surmetis memoro, kaj tiam tiuj funkcioj reveno, 604 00:32:27,000 --> 00:32:31,000 kaj kiel mi sugestis per la Eraser lia memoro estas eventuale reutilizado. 605 00:32:31,000 --> 00:32:37,000 Nu, ĝuste tiel okazas ke ĉi variablo x en tiu programo 606 00:32:37,000 --> 00:32:41,000 ŝajnas esti enhavis iujn rubo valoro kiel 134514032 607 00:32:41,000 --> 00:32:44,000 de iu antaŭa funkcio, ne tia mi skribis. 608 00:32:44,000 --> 00:32:47,000 Ĝi povus esti iu kiu venas efike kun la mastruma sistemo, 609 00:32:47,000 --> 00:32:49,000 iu funkcio sub la kapuĉo. 610 00:32:49,000 --> 00:32:52,000 >> Konsentite, ke estas bone, sed ni nun antaŭi al la sekvanta linio. 611 00:32:52,000 --> 00:32:55,000 Se mi tajpas "proksima" en mia GDB prompto kaj mi batis eniros, 612 00:32:55,000 --> 00:32:58,000 rimarki, ke la reliefigante movas malsupren al linio 19, 613 00:32:58,000 --> 00:33:01,000 sed la logika implikacio estas tiu linio 18 614 00:33:01,000 --> 00:33:06,000 nun finita ekzekuti, do se mi denove tajpi "print x" 615 00:33:06,000 --> 00:33:10,000 Mi devus nun vidas 1, kaj fakte, mi faras. 616 00:33:10,000 --> 00:33:14,000 Denove, la $ stuff estas maniero de GDB memorante vin 617 00:33:14,000 --> 00:33:17,000 kion la historio de gravuraĵoj estas ke vi faris. 618 00:33:17,000 --> 00:33:21,000 Nun lasu min antaŭeniri kaj presi y, kaj vere, y estas iu freneza valoro tiel, 619 00:33:21,000 --> 00:33:24,000 sed neniu granda interkonsento ĉar en linio 19 ni estas sur atribui ĝin 620 00:33:24,000 --> 00:33:27,000 la valoro 2, do lasu min tajpi "proksima" denove. 621 00:33:27,000 --> 00:33:29,000 Kaj nun ni estas en la printf linio. 622 00:33:29,000 --> 00:33:31,000 Lasu min fari print x. 623 00:33:31,000 --> 00:33:34,000 Lasu min fari print y. Sincere, mi ricevas iom laca de presi ĉi. 624 00:33:34,000 --> 00:33:38,000 Lasu min anstataŭ tajpi "display x" kaj "ekrano y," 625 00:33:38,000 --> 00:33:41,000 kaj nun ĉiufoje mi tajpu la komandon en la estonteco 626 00:33:41,000 --> 00:33:45,000 Mi estos memoras kio estas x kaj y, kio estas x kaj y, kio estas x kaj y. 627 00:33:45,000 --> 00:33:48,000 >> Mi povas ankaŭ, kiel flanken, tajpu "info lokaj". 628 00:33:48,000 --> 00:33:50,000 Informoj estas speciala komando. 629 00:33:50,000 --> 00:33:52,000 Lokaj signifas ĝi montras al mi la lokaj variabloj. 630 00:33:52,000 --> 00:33:55,000 Ĉiaokaze mi forgesas aŭ ĉi estas freneza, komplika funkcio 631 00:33:55,000 --> 00:33:57,000 ke mi aŭ iu alia skribis info lokaj diros al vi 632 00:33:57,000 --> 00:34:00,000 kio estas ĉiuj lokaj variabloj ene ĉi tiu loka funkcio 633 00:34:00,000 --> 00:34:03,000 ke vi zorgas pri se vi volas poke ĉirkaŭe. 634 00:34:03,000 --> 00:34:07,000 Nun, printf estas por ekzekuti, tiel ke mi iru antaŭen kaj nur tajpu "sekva". 635 00:34:07,000 --> 00:34:10,000 Ĉar ni estas en ĉi tiu medio ni ne reale vidi ĝin 636 00:34:10,000 --> 00:34:14,000 ekzekuti cxi tie, sed rimarkas ĝin Fariĝas iom disŝiritaj tie. 637 00:34:14,000 --> 00:34:17,000 Sed rimarki ĝi estas supera la ekrano tie, 638 00:34:17,000 --> 00:34:21,000 do ĝi ne estas perfekta programo tie, sed tio estas bone, ĉar mi povas ĉiam poke ĉirkaŭ 639 00:34:21,000 --> 00:34:23,000 uzante print se mi volas. 640 00:34:23,000 --> 00:34:26,000 >> Lasu min tajpi sekva denove, kaj nun jen la interesa parto. 641 00:34:26,000 --> 00:34:29,000 Je ĉi tiu punkto en la historio y estas 2, kaj x estas 1, 642 00:34:29,000 --> 00:34:32,000 kiel sugestis tie, kaj denove, 643 00:34:32,000 --> 00:34:35,000 la kialo ĉi estas aŭtomate montri nun estas ĉar mi uzis la komando 644 00:34:35,000 --> 00:34:40,000 display x kaj y ekrano, do la momento mi tajpas sekva 645 00:34:40,000 --> 00:34:43,000 en teorio x kaj y fariĝu svopitaj. 646 00:34:43,000 --> 00:34:45,000 Nun, ni jam scias ke tio ne tuj estos la kazo, 647 00:34:45,000 --> 00:34:49,000 sed ni vidos en momento kiel ni povas plonĝi profunda eltrovi kial tio estas vera. 648 00:34:49,000 --> 00:34:54,000 Tuj poste, kaj bedaŭrinde, y estas ankoraŭ 2 kaj x estas ankoraŭ 1, kaj mi povas konfirmi tiel. 649 00:34:54,000 --> 00:34:56,000 Print x, presita kaj. 650 00:34:56,000 --> 00:34:59,000 Ja, ne interŝanĝante fakte okazis, do ni komencu la aferon. 651 00:34:59,000 --> 00:35:01,000 Klare interŝanĝa estas rompita. 652 00:35:01,000 --> 00:35:04,000 Ni anstataŭ tajpi "kuri" denove. 653 00:35:04,000 --> 00:35:07,000 Lasu min diri jes, mi volas rekomenci ĝin de la komenco, eniru. 654 00:35:07,000 --> 00:35:09,000 >> Nun mi revenas ĉe linio 18. 655 00:35:09,000 --> 00:35:11,000 Nun rimarki x kaj y estas rubo valoroj denove. 656 00:35:11,000 --> 00:35:15,000 Tuj poste, proksima, sekva, apud. 657 00:35:15,000 --> 00:35:17,000 Se I get bored mi povas ankaŭ simple tajpu n por alia. 658 00:35:17,000 --> 00:35:21,000 Vi povas mallongigi ĝin al la plej mallonga ebla vico de signoj. 659 00:35:21,000 --> 00:35:23,000 Swap nun rompita. 660 00:35:23,000 --> 00:35:25,000 Ni pikita en, tial anstataŭ tajpi proksima, 661 00:35:25,000 --> 00:35:30,000 Nun mi tajpi paŝo por ke mi tretante ene de ĉi tiu funkcio 662 00:35:30,000 --> 00:35:33,000 por ke mi povas marŝi tra ĝi, do mi batis paŝo kaj tiam eniri. 663 00:35:33,000 --> 00:35:37,000 Rimarku ke la reliefigante saltas malsupren suba en mia programo por linio 36. 664 00:35:37,000 --> 00:35:39,000 Nun kio estas la loka variabloj? 665 00:35:39,000 --> 00:35:41,000 Informoj lokaj. 666 00:35:41,000 --> 00:35:43,000 Nenio nur ankoraŭ ĉar ni ne alvenis al tiu linio, 667 00:35:43,000 --> 00:35:47,000 do ni iru antaŭen kaj diri "poste." 668 00:35:47,000 --> 00:35:50,000 Nun ni ŝajnas havi tmp, presita tmp. 669 00:35:50,000 --> 00:35:52,000 Garbage valoro, ĉu ne? Mi kredas tiel. 670 00:35:52,000 --> 00:35:55,000 Kion pri presi, presita b, 1 kaj 2? 671 00:35:55,000 --> 00:35:58,000 En momento, kiam mi tajpas sekva denove 672 00:35:58,000 --> 00:36:02,000 tmp tuj alpreni valoron de 1, espereble, 673 00:36:02,000 --> 00:36:05,000 ĉar tmp tuj estos atribuitaj la valoro de. 674 00:36:05,000 --> 00:36:08,000 >> Nun ni ne presi, presita b, 675 00:36:08,000 --> 00:36:11,000 sed nun presi tmp, kaj estas ja 1. 676 00:36:11,000 --> 00:36:14,000 Lasu min fari. Lasu min fari. 677 00:36:14,000 --> 00:36:16,000 Mi finis la interŝanĝa funkcio. 678 00:36:16,000 --> 00:36:19,000 Mi ankoraŭ ene de ĝi en linio 40, do lasu min presi, 679 00:36:19,000 --> 00:36:22,000 print b, kaj Mi ne zorgas kion tmp estas. 680 00:36:22,000 --> 00:36:27,000 Ĝi aspektas kiel interŝanĝa estas korekta, kiam temas pri interŝanĝi a kaj b. 681 00:36:27,000 --> 00:36:31,000 Sed se mi nun tajpas sekva, mi saltas reen al linio 25, 682 00:36:31,000 --> 00:36:34,000 kaj sendube, se mi tajpu x kaj y print 683 00:36:34,000 --> 00:36:38,000 ili estas ankoraŭ sen ŝanĝoj, do ni ne riparis la problemon. 684 00:36:38,000 --> 00:36:41,000 Sed diagnostically nun eble kun ĉi GDB programo 685 00:36:41,000 --> 00:36:44,000 ni almenaŭ alveninta unu paŝon pli al kompreno 686 00:36:44,000 --> 00:36:47,000 kio okazas erara sen devi portilo nia kodo per meto de printf tie, 687 00:36:47,000 --> 00:36:50,000 printf tie, printf tie kaj tiam kurante ĝin denove kaj denove 688 00:36:50,000 --> 00:36:52,000 provi elkompreni kio okazas erara. 689 00:36:52,000 --> 00:36:55,000 >> Mi tuj iros antaŭen kaj quit el tiu aro kun quit. 690 00:36:55,000 --> 00:36:57,000 Ĝi tuj poste diras, "Quit ĉiuokaze?" Jes. 691 00:36:57,000 --> 00:37:00,000 Nun mi estas ree en mia normala prompto, kaj mi faris uzante GDB. 692 00:37:00,000 --> 00:37:03,000 Kiel flanken, vi ne bezonas por uzi ĉi-tui flago. 693 00:37:03,000 --> 00:37:07,000 Fakte, se vi preterlasas ke vi ricevas esence la fundo de la duono de la ekrano. 694 00:37:07,000 --> 00:37:11,000 Se mi tiam tajpas ripozon ĉefa kaj poste ekzekuti 695 00:37:11,000 --> 00:37:15,000 Mi povas ankoraŭ kuri mia programo, sed kion ĝi faros pli laŭvorte 696 00:37:15,000 --> 00:37:18,000 nur montri al mi la nunan linion unuope. 697 00:37:18,000 --> 00:37:21,000 The-tui, teksta uzantinterfaco, 698 00:37:21,000 --> 00:37:25,000 nur montras al vi pli de la programo samtempe, kio estas verŝajne iom koncepte pli facila. 699 00:37:25,000 --> 00:37:27,000 Sed ja, mi povas nur fari poste, proksima, apud, 700 00:37:27,000 --> 00:37:30,000 kaj mi tuj vidos unu linio samtempe, kaj se mi vere volas vidi kio okazas 701 00:37:30,000 --> 00:37:35,000 Mi povas tajpi listo kaj vidi tutan faskon da apudaj linioj. 702 00:37:35,000 --> 00:37:39,000 >> Jen video kiun ni petis, ke vi rigardas al problemo aroj 3 703 00:37:39,000 --> 00:37:43,000 en kiu Nate kovras iujn de la intricacies de GDB, 704 00:37:43,000 --> 00:37:46,000 kaj ĉi tiu estas unu el tiuj aĵoj, honeste, kie iuj ne-bagatela procento de vi 705 00:37:46,000 --> 00:37:49,000 neniam tuŝi GDB, kaj ke estos malbona 706 00:37:49,000 --> 00:37:53,000 ĉar laŭvorte vi finos pasi pli da tempo poste ĉi semestro 707 00:37:53,000 --> 00:37:56,000 persekutante malsupren erarojn tiam vi estus se vi metas en tiu duonhoro / horo 708 00:37:56,000 --> 00:38:00,000 ĉi tiu semajno kaj apud lernado akiri komforta kun GDB. 709 00:38:00,000 --> 00:38:02,000 Printf estis via amiko. 710 00:38:02,000 --> 00:38:05,000 GDB devus nun esti via amiko. 711 00:38:05,000 --> 00:38:08,000 >> Demandojn sur GDB? 712 00:38:08,000 --> 00:38:12,000 Kaj jen rapida listo de iuj el la plej potenca kaj utila ordonojn. 713 00:38:12,000 --> 00:38:15,000 Yeah. >> Cxu vi povas presi ĉeno? 714 00:38:15,000 --> 00:38:17,000 Ĉu vi povas presi ĉeno? Tute ne. 715 00:38:17,000 --> 00:38:19,000 Ĝi ne devas esti nur entjeroj. 716 00:38:19,000 --> 00:38:22,000 Se variablo s estas ĉeno nur tajpu print s. 717 00:38:22,000 --> 00:38:24,000 Ĝi montros al vi kion tiu ĉeno variablo estas. 718 00:38:24,000 --> 00:38:26,000 [Inaudible-studento] 719 00:38:26,000 --> 00:38:28,000 Ĝi donos al vi la adreson kaj la kordo mem. 720 00:38:28,000 --> 00:38:32,000 Ĝi montros al vi ambaŭ. 721 00:38:32,000 --> 00:38:34,000 Kaj unu lasta afero, nur ĉar tiuj estas bone scii ankaŭ. 722 00:38:34,000 --> 00:38:37,000 Retrospuro kaj kadron, lasu min mergi en ĉi tiu lasta fojo, 723 00:38:37,000 --> 00:38:39,000 sama ekzakta programo kun GDB. 724 00:38:39,000 --> 00:38:44,000 Lasu min antaŭeniri kaj rompi la teksta uzantinterfaco versio, 725 00:38:44,000 --> 00:38:46,000 rompi ĉefa. 726 00:38:46,000 --> 00:38:49,000 Lasu min kaj kuras denove. Jen mi estas. 727 00:38:49,000 --> 00:38:55,000 Nun lasu min iri sekva, apud, apud, apud, apud, paŝo, eniru. 728 00:38:55,000 --> 00:39:00,000 >> Kaj nun supozas ke mi estas nun en interŝanĝa intence, sed mi ŝatas "Malbenita, kio estis la valoro de x?" 729 00:39:00,000 --> 00:39:02,000 Mi ne povas fari x plu. 730 00:39:02,000 --> 00:39:05,000 Mi ne povas fari y ĉar ili ne estas en la medio. 731 00:39:05,000 --> 00:39:07,000 Ili estas ne en kunteksto, sed ne estas problemo. 732 00:39:07,000 --> 00:39:09,000 Mi povas tajpi retrospuro. 733 00:39:09,000 --> 00:39:13,000 Tio montras al mi ĉiujn funkciojn kiuj ekzekutis ĝis ĉi tiu punkto en la tempo. 734 00:39:13,000 --> 00:39:16,000 Rimarku ke la unu sur la fundo, ĉefa, regiono kun ĉefa 735 00:39:16,000 --> 00:39:18,000 esti sur la fundo de nia bildo tie. 736 00:39:18,000 --> 00:39:22,000 La fakto ke interŝanĝa estas super ĝi regiono kun interŝanĝa tretante en memoro tie, 737 00:39:22,000 --> 00:39:26,000 kaj se mi volas reiri al ĉefa provizore mi povas diri "kadro." 738 00:39:26,000 --> 00:39:30,000 Kio numeron? Artikolo estas kadro # 1. 739 00:39:30,000 --> 00:39:32,000 Mi tuj iros antaŭen kaj diru "kadro 1." 740 00:39:32,000 --> 00:39:36,000 >> Nun mi estas denove en ĉefa, kaj mi povas printi x, kaj mi povas printi y, 741 00:39:36,000 --> 00:39:40,000 sed mi ne povas presi aŭ b. 742 00:39:40,000 --> 00:39:43,000 Sed mi povas, se mi diras, "Bone, atendu momenton. Kie estis la interŝanĝa?" 743 00:39:43,000 --> 00:39:46,000 Lasu min kaj diru "kadro 0." 744 00:39:46,000 --> 00:39:48,000 Nun mi estas reen, kie mi volas esti, kaj kiel flanken, 745 00:39:48,000 --> 00:39:52,000 ekzistas aliaj komandoj ankaŭ, kiel se vi vere atingi truita tajpante sekva, apud, apud, tuj poste, 746 00:39:52,000 --> 00:39:56,000 vi povas ĝenerale diri tion kiel "proksimaj 10", kaj kiu havos paŝo tra la proksimaj 10 linioj. 747 00:39:56,000 --> 00:39:59,000 Vi ankaŭ povas skribi "daŭrigi" kiam vi vere get sata tretante tra ĝi. 748 00:39:59,000 --> 00:40:05,000 Daŭrigu kuros via programo sen interrompo ĝis batas alian Haltpunkto, 749 00:40:05,000 --> 00:40:07,000 cxu en ciklo aŭ malsupreniri en via programo. 750 00:40:07,000 --> 00:40:11,000 >> En ĉi tiu kazo ni daŭrigis ĝis la fino, kaj la programo eliris kutime. 751 00:40:11,000 --> 00:40:13,000 Tio ĉi estas ornama metodo, malsupera procezo. 752 00:40:13,000 --> 00:40:16,000 Nur via programo eliris kutime. 753 00:40:16,000 --> 00:40:24,000 Pli sur kiuj en la video kaj en elpurigante kunsidoj veni. 754 00:40:24,000 --> 00:40:26,000 Tio estis tre. 755 00:40:26,000 --> 00:40:35,000 Ni prenu nian 5-minuta paŭzo tie, kaj ni revenos kun structs kaj dosieroj. 756 00:40:35,000 --> 00:40:38,000 >> Se vi plonĝis en ĉi tiu semajno pset jam 757 00:40:38,000 --> 00:40:41,000 vi scias, ke ni uzas en la dissendo kodo, 758 00:40:41,000 --> 00:40:45,000 la fontkodo kiun ni ofertas al vi kiel deirpunkto, iuj novaj teknikoj. 759 00:40:45,000 --> 00:40:50,000 En aparta, ni enkondukis tiun novan ŝlosilvorton nomis struct, por strukturo, 760 00:40:50,000 --> 00:40:53,000 tiel ke ni povas krei akomoditan variabloj de varoj. 761 00:40:53,000 --> 00:40:57,000 Ni ankaŭ enkondukis la nocion de dosiero I / O, dosiero enigo kaj eligo, 762 00:40:57,000 --> 00:41:00,000 kaj ĉi tiu estas por ke ni povu konservi la staton 763 00:41:00,000 --> 00:41:03,000 de via Scramble estraro al dosiero en disko 764 00:41:03,000 --> 00:41:06,000 por ke la instruado uloj kaj mi povas kompreni 765 00:41:06,000 --> 00:41:09,000 kio okazas ene de via programo sen devi permane tuŝi 766 00:41:09,000 --> 00:41:11,000 dekoj da ludoj de Scramble. 767 00:41:11,000 --> 00:41:13,000 Ni povas fari ĉi pli automatedly. 768 00:41:13,000 --> 00:41:18,000 >> Tiu ideo de struct solvas sufiĉe konvinkaj problemo. 769 00:41:18,000 --> 00:41:21,000 Supozu ke ni volas apliki iun programon 770 00:41:21,000 --> 00:41:25,000 ke iel subtenas spuro de informoj pri studentoj, 771 00:41:25,000 --> 00:41:28,000 kaj studentoj havu, ekzemple, oni ID, nomo 772 00:41:28,000 --> 00:41:31,000 kaj domo en loko kiel Harvard, do ĉi tiuj estas 3 pecoj de informo 773 00:41:31,000 --> 00:41:34,000 ni volas konservi ĉirkaŭe, do lasu min antaŭeniri kaj komenci skribi iom programo tie, 774 00:41:34,000 --> 00:41:38,000 inkluzivas stdio.h. 775 00:41:38,000 --> 00:41:42,000 Lasu min fari inkluzivas cs50.h. 776 00:41:42,000 --> 00:41:44,000 Kaj tiam komencos mia ĉefa funkcio. 777 00:41:44,000 --> 00:41:46,000 Mi ne tedos kun ajna komandlinio argumentoj, 778 00:41:46,000 --> 00:41:49,000 kaj tie mi volas havi studento, do mi tuj diros 779 00:41:49,000 --> 00:41:54,000 studento havas nomon, do mi tuj diros "string nomo." 780 00:41:54,000 --> 00:41:59,000 Tiam mi intencis diri studento ankaŭ havas ID, do int id, 781 00:41:59,000 --> 00:42:03,000 kaj studento havas domon, do mi ankaŭ intencas diri "string domo." 782 00:42:03,000 --> 00:42:06,000 Tiam mi mendos tiuj iom pli pure kiel ĉi tio. 783 00:42:06,000 --> 00:42:11,000 Okay, nun mi havas 3 variabloj, per kiu ĝi reprezentas studento, do "studento". 784 00:42:11,000 --> 00:42:15,000 >> Kaj nun mi volas popoli tiuj valoroj, do lasu min antaŭeniri kaj diru ion kiel 785 00:42:15,000 --> 00:42:18,000 "Id = 123." 786 00:42:18,000 --> 00:42:21,000 Nomo tuj akiri Davido. 787 00:42:21,000 --> 00:42:24,000 Diru domo tuj akiri Mather, 788 00:42:24,000 --> 00:42:31,000 kaj tiam Mi faros ion arbitre kiel printf ("% s, 789 00:42:31,000 --> 00:42:37,000 kies ID estas% d, vivas en% s. 790 00:42:37,000 --> 00:42:41,000 Kaj nun, kion mi volas ŝtopi ĉi tien, unu post la alia? 791 00:42:41,000 --> 00:42:47,000 Nomo, id, domo; reveno 0. 792 00:42:47,000 --> 00:42:50,000 Konsentite, se mi ne ŝraŭbita supren ie tie 793 00:42:50,000 --> 00:42:54,000 Mi kredas ke ni havas sufiĉe bona programo kiu stokas unu lernanto. 794 00:42:54,000 --> 00:42:57,000 Kompreneble, ĉi tio ne estas ĉio, kion interesa. Kio se mi volas havi 2 studentoj? 795 00:42:57,000 --> 00:42:59,000 Tio ne estas granda interkonsento. Mi povas apogi 2 personoj. 796 00:42:59,000 --> 00:43:03,000 Lasu min kaj reliefigi tion kaj iru malsupren tie, 797 00:43:03,000 --> 00:43:09,000 kaj mi povas diri "id = 456" por iu kiel Rob kiu vivas en Kirkland. 798 00:43:09,000 --> 00:43:12,000 >> Konsentite, atendi, sed mi ne povas nomi tiujn la saman aferon, 799 00:43:12,000 --> 00:43:15,000 kaj ĝi aspektas kiel mi tuj devos kopii ĉi, 800 00:43:15,000 --> 00:43:19,000 do lasu min diri, ke ĉi tiuj estos David variabloj, 801 00:43:19,000 --> 00:43:23,000 kaj lasu min akiri iuj kopioj de tiuj por Rob. 802 00:43:23,000 --> 00:43:27,000 Ni vokos tiuj Rob la sed tion oni ne tuj funkcias nun 803 00:43:27,000 --> 00:43:33,000 ĉar mi-atendi, ni ŝanĝas min id1, name1 kaj house1. 804 00:43:33,000 --> 00:43:35,000 Rob estos 2, 2. 805 00:43:35,000 --> 00:43:42,000 Mi devas ŝanĝi ĉi tie, tie, tie, tie, tie, tie ĉi. 806 00:43:42,000 --> 00:43:45,000 Atendu, kio pri Tommy? Ni faru ĉi denove. 807 00:43:45,000 --> 00:43:49,000 Evidente se vi ankoraŭ pensas, ke estas bona maniero por tion fari, ne, 808 00:43:49,000 --> 00:43:52,000 tiel kopii / alglui malbona. 809 00:43:52,000 --> 00:43:55,000 Sed ni solvis ĉi antaŭ unu semajno. 810 00:43:55,000 --> 00:43:59,000 >> Kio estis nia solvo, kiam ni volis havi plurajn aperojn de la sama datumtipo? 811 00:43:59,000 --> 00:44:01,000 [Studentoj] An tabelo. 812 00:44:01,000 --> 00:44:03,000 Tabelo, do lasu min provas purigi ĉi supre. 813 00:44:03,000 --> 00:44:07,000 Lasu min fari iujn ĉambron por mi mem ĉe la supro, kaj lasu min anstataŭ fari ĉi tie. 814 00:44:07,000 --> 00:44:12,000 Ni vokos tiuj homoj, kaj anstataŭe mi intencis diri "int IDS," 815 00:44:12,000 --> 00:44:14,000 kaj mi tuj apogos 3 el ni nun. 816 00:44:14,000 --> 00:44:18,000 Mi intencis diri "string nomoj," kaj mi apogas 3 de ni, 817 00:44:18,000 --> 00:44:22,000 kaj tiam mi iros diri "string domoj," kaj mi tuj apogos 3 de ni. 818 00:44:22,000 --> 00:44:26,000 Nun en ĉi tie anstataŭ Davido atingi sian proprajn lokajn variablojn 819 00:44:26,000 --> 00:44:28,000 ni povas forigi tiuj. 820 00:44:28,000 --> 00:44:30,000 Kiu sentas bone, ke ni purigi ĉi supre. 821 00:44:30,000 --> 00:44:35,000 Mi povas do diri Davido tuj estos [0] kaj nomoj [0] 822 00:44:35,000 --> 00:44:38,000 kaj domoj [0]. 823 00:44:38,000 --> 00:44:41,000 Kaj poste Rob ni povas simile ŝpari en ĉi. 824 00:44:41,000 --> 00:44:46,000 Ni metis tiun cxi tie, do li tuj arbitre esti IDS [1]. 825 00:44:46,000 --> 00:44:50,000 Li tuj estos nomoj [1], 826 00:44:50,000 --> 00:44:53,000 kaj poste persiste, domoj [1]. 827 00:44:53,000 --> 00:44:57,000 >> Ankoraŭ iom teda, kaj nun mi devas kompreni ĉi tion, 828 00:44:57,000 --> 00:45:03,000 do ni diru "nomoj [0], id [0], domoj [0], 829 00:45:03,000 --> 00:45:06,000 kaj ni pluralize ĉi. 830 00:45:06,000 --> 00:45:09,000 IDS, IDS, IDS. 831 00:45:09,000 --> 00:45:12,000 Kaj denove, mi faras, tiel denove, mi jam recurriendo kopii / alglui denove, 832 00:45:12,000 --> 00:45:14,000 tiel malakordo estas tie estas alia solvo ĉi tie. 833 00:45:14,000 --> 00:45:18,000 Mi povas probable purigi ĉi supren plu kun buklo aŭ io simila, 834 00:45:18,000 --> 00:45:21,000 tial en fino, ĝi estas iom pli bona sed ankoraŭ sentas 835 00:45:21,000 --> 00:45:24,000 Mi recurriendo kopii / alglui, sed eĉ tio, mi asertas, 836 00:45:24,000 --> 00:45:27,000 ne estas vere fundamente dekstre solvo ĉar 837 00:45:27,000 --> 00:45:29,000 kion se iam ni decidas vi scias kion? 838 00:45:29,000 --> 00:45:32,000 Ni vere devus esti stokante retadresoj al David kaj Rob 839 00:45:32,000 --> 00:45:34,000 kaj ĉiuj aliaj en ĉi tiu programo. 840 00:45:34,000 --> 00:45:36,000 Ni devas ankaŭ stoki telefonnumerojn. 841 00:45:36,000 --> 00:45:39,000 Ni devas ankaŭ stoki kriz kontakto nombroj. 842 00:45:39,000 --> 00:45:41,000 Ni havas ĉiujn tiujn pecojn de datumoj kiuj ni volas konservi, 843 00:45:41,000 --> 00:45:43,000 tiel kiel vi irados tra fari tion? 844 00:45:43,000 --> 00:45:46,000 >> Vi rakontos alian tabelo supre, kaj tiam vi permane aldoni 845 00:45:46,000 --> 00:45:49,000 retadreson [0], retadreso [1] 846 00:45:49,000 --> 00:45:51,000 al David kaj Rob kaj tiel plu. 847 00:45:51,000 --> 00:45:56,000 Sed estas vere nur supozo suba ĉi dezajno 848 00:45:56,000 --> 00:45:59,000 ke mi uzas la honoron sistemo por scii ke 849 00:45:59,000 --> 00:46:03,000 [I] en ĉiu de la pluraj tabeloj 850 00:46:03,000 --> 00:46:06,000 nur tiel okazas por raporti al la sama persono, 851 00:46:06,000 --> 00:46:10,000 tiel [0] en IDS estas numero 123, 852 00:46:10,000 --> 00:46:13,000 kaj mi tuj supozi ke nomoj [0] 853 00:46:13,000 --> 00:46:16,000 estas la sama persono nomo kaj domoj [0] 854 00:46:16,000 --> 00:46:21,000 estas la sama persono domo kaj tiel plu por ĉiuj el la diversaj tabeloj, ke mi krei. 855 00:46:21,000 --> 00:46:24,000 Sed rimarki ke mankas fundamenta ligo 856 00:46:24,000 --> 00:46:27,000 inter tiuj 3 pecoj de informo, id, nomo kaj domo, 857 00:46:27,000 --> 00:46:32,000 kvankam la ento ni provas modelo en tiu programo ne estas tabeloj. 858 00:46:32,000 --> 00:46:35,000 Arrays estas nur tiun programita maniero fari tion. 859 00:46:35,000 --> 00:46:38,000 Kion ni vere volas modela en nia programo estas persono 860 00:46:38,000 --> 00:46:41,000 kiel Davido, persono kiel Rob ene de kiuj 861 00:46:41,000 --> 00:46:46,000 aŭ encapsulando estas nomo kaj ID kaj domo. 862 00:46:46,000 --> 00:46:49,000 >> Ĉu ni povas iel esprimi ĉi tiun ideon de encapsulación 863 00:46:49,000 --> 00:46:52,000 per persono havas ID, nomo kaj domo 864 00:46:52,000 --> 00:46:55,000 kaj ne recurrir por vere ĉi hack per kiu ni ĵus 865 00:46:55,000 --> 00:46:58,000 konfidi ke krampo ion 866 00:46:58,000 --> 00:47:02,000 rilatas al la sama homa ento en ĉiu el tiuj pafas tabeloj? 867 00:47:02,000 --> 00:47:04,000 Ni povas vere fari tion. 868 00:47:04,000 --> 00:47:08,000 Lasu min iri super ĉefa nuntempe, kaj lasu min krei mian propran datumtipo 869 00:47:08,000 --> 00:47:10,000 cxar vere la unuan fojon. 870 00:47:10,000 --> 00:47:14,000 Ni uzis tiun teknikon en Scramble, 871 00:47:14,000 --> 00:47:17,000 sed tie mi tuj iros antaŭen kaj krei datumtipo, 872 00:47:17,000 --> 00:47:19,000 kaj vi scias kion, mi iros nomi ĝin studento aŭ persono, 873 00:47:19,000 --> 00:47:23,000 kaj mi tuj uzos typedef por difini tipo. 874 00:47:23,000 --> 00:47:25,000 Mi intencis diri, ke ĉi tiu estas strukturo, 875 00:47:25,000 --> 00:47:29,000 kaj tiam ĉi tiu strukturo tuj estos de tipo studento, ni diros, 876 00:47:29,000 --> 00:47:31,000 kvankam ĝi estas iom datita nun por mi. 877 00:47:31,000 --> 00:47:33,000 Ni diras "int id." 878 00:47:33,000 --> 00:47:35,000 Ni diras "string nomo." 879 00:47:35,000 --> 00:47:37,000 Tiam ni diras "string domo," 880 00:47:37,000 --> 00:47:40,000 tial nun por la fino de tiuj malmultaj linioj de kodo 881 00:47:40,000 --> 00:47:45,000 Mi ĵus instruis clang ke ekzistas 882 00:47:45,000 --> 00:47:49,000 datumtipo krom ints, krom kordoj, krom duobloj, krom flosas. 883 00:47:49,000 --> 00:47:54,000 >> De ĉi tiu momento en tempo linio 11, estas nun nova datumtipo nomata studentoj, 884 00:47:54,000 --> 00:47:58,000 kaj nun mi povas deklari studento variablo ie ajn mi volas, 885 00:47:58,000 --> 00:48:01,000 do lasu min rulumi malsupren tie al la homo. 886 00:48:01,000 --> 00:48:05,000 Nun mi povas forigi tion, kaj mi povas reiri malsupren al David tie, 887 00:48:05,000 --> 00:48:10,000 kaj al David mi povas vere diri, ke David, 888 00:48:10,000 --> 00:48:13,000 ni povas laŭvorte enoficigi la variablo post mi, 889 00:48:13,000 --> 00:48:16,000 tuj estos de tipo studento. 890 00:48:16,000 --> 00:48:18,000 Tio povas aspekti iom stranga, sed ĉi tio ne estas tiom malsimila 891 00:48:18,000 --> 00:48:22,000 anonci ion kiel int aŭ ĉeno aŭ kaleŝego. 892 00:48:22,000 --> 00:48:24,000 Simple tiel okazas esti nomata studenta nun, 893 00:48:24,000 --> 00:48:28,000 kaj se mi volas meti ion ene de ĉi tiu strukturo 894 00:48:28,000 --> 00:48:31,000 Mi nun devas uzi novan pecon de sintakso, sed estas bela simpla, 895 00:48:31,000 --> 00:48:39,000 david.id = 123, david.name = "Davido" en ĉefurbo D, 896 00:48:39,000 --> 00:48:42,000 kaj david.house = "Mather," 897 00:48:42,000 --> 00:48:46,000 kaj nun mi povas forigi ĉi tiujn aferojn tie. 898 00:48:46,000 --> 00:48:51,000 Rimarku ni nun rediseñado nia programo en vere tre bona maniero 899 00:48:51,000 --> 00:48:54,000 en tiu nun nia programo reflektas la reala mondo. 900 00:48:54,000 --> 00:48:57,000 >> Jen reala mondo nocio de persono aŭ lernanto. 901 00:48:57,000 --> 00:49:02,000 Jen ni havas nun C versio de persono aŭ pli specife studento. 902 00:49:02,000 --> 00:49:05,000 Ene de tiu persono estas tiuj gravaj karakterizaĵoj, 903 00:49:05,000 --> 00:49:10,000 IRU, nomo kaj domo, do Rob esence igas la samon ĉi tie, 904 00:49:10,000 --> 00:49:14,000 tiel studento ŝteli, kaj nun rob.id = 456, 905 00:49:14,000 --> 00:49:17,000 rob.name = "Rob." 906 00:49:17,000 --> 00:49:20,000 La fakto ke la variablo estas nomita Rob estas speco de sensignifa. 907 00:49:20,000 --> 00:49:22,000 Ni povis esti nomis x aŭ y aŭ z. 908 00:49:22,000 --> 00:49:25,000 Ni nur nomis ĝin Rob esti semantike konsekvenca, 909 00:49:25,000 --> 00:49:28,000 sed vere la nomo estas ene de tiu kampo mem, 910 00:49:28,000 --> 00:49:30,000 do nun mi havas ĉi. 911 00:49:30,000 --> 00:49:33,000 Ĉi tro ne sentas kiel la pli bona dezajno en tiu mi forte kodita Davido. 912 00:49:33,000 --> 00:49:35,000 Mi forte kodita Rob. 913 00:49:35,000 --> 00:49:39,000 Kaj mi ankoraŭ devas recurrir al iu kopio kaj gluu ĉiufoje mi volas novan variabloj. 914 00:49:39,000 --> 00:49:43,000 Cetere, mi devas ŝajne doni al ĉiu el ĉi tiuj variabloj nomon, 915 00:49:43,000 --> 00:49:46,000 kvankam mi multe preferas priskribi ĉi tiuj variabloj 916 00:49:46,000 --> 00:49:48,000  pli genéricamente kiel lernantoj. 917 00:49:48,000 --> 00:49:52,000 >> Nun ni povas kunfandi la ideoj kiuj estis laborante bone por ni 918 00:49:52,000 --> 00:49:56,000 kaj anstataŭ diri, "Vi scias kion, donu al mi variablo nomita studentoj, 919 00:49:56,000 --> 00:50:01,000 kaj ni havas ĝin esti de amplekso 3, "do nun mi povas rafini ĉi plui, 920 00:50:01,000 --> 00:50:04,000 forigi la permane deklaris David 921 00:50:04,000 --> 00:50:08,000 kaj mi povas anstataŭe diri ion kiel studentoj [0] tie. 922 00:50:08,000 --> 00:50:11,000 Mi povas do diri studentoj [0] ĉi tie, 923 00:50:11,000 --> 00:50:14,000 studentoj [0] ĉi tie, kaj tiel plu, kaj mi povas iri ĉirkaŭ 924 00:50:14,000 --> 00:50:16,000 kaj purigi ke ĉe Rob. 925 00:50:16,000 --> 00:50:19,000 Mi povus ankaŭ iri nun eble aldonante buklo 926 00:50:19,000 --> 00:50:23,000 kaj uzante GetString kaj GetInt al reale preni tiujn valorojn de la uzanto. 927 00:50:23,000 --> 00:50:27,000 Mi povis iri aldonante konstanta ĉar ĉi tio estas ĝenerale malbona praktiko 928 00:50:27,000 --> 00:50:29,000 al malmola kodo iuj arbitraj numeron kiel 3 dekstra tie 929 00:50:29,000 --> 00:50:33,000 kaj tiam simple memoru, ke vi devus meti ne pli ol 3 studentoj en ĝi. 930 00:50:33,000 --> 00:50:36,000 Estus probable pli bone uzi # difini sur la supro de mia dosiero 931 00:50:36,000 --> 00:50:40,000 kaj faktoro kiu, do ja, lasu min antaŭeniri kaj ĝeneraligi tion. 932 00:50:40,000 --> 00:50:43,000 >> Lasu min malfermi ekzemplo jen inter hodiaŭa 933 00:50:43,000 --> 00:50:46,000 ekzemploj anticipe, structs1. 934 00:50:46,000 --> 00:50:49,000 Tio estas pli kompleta programo kiu uzas # difini ĉi tien 935 00:50:49,000 --> 00:50:51,000 kaj diras, ke ni tuj havas 3 studentoj defaŭlte. 936 00:50:51,000 --> 00:50:54,000 Jen Mi deklarante klaso valoro de studentoj, 937 00:50:54,000 --> 00:50:57,000 tial klasĉambro de studentoj, kaj nun mi uzas buklo 938 00:50:57,000 --> 00:51:00,000 nur por fari la kodon iom pli eleganta, popoli la klaso 939 00:51:00,000 --> 00:51:05,000 kun la uzanto enigo, do persisti de mi = 0 sur supren al studentoj, kiuj estas 3. 940 00:51:05,000 --> 00:51:07,000 Kaj tiam mi instigas la uzanton en tiu ĉi versio 941 00:51:07,000 --> 00:51:10,000  kio estas la studenta ID, kaj mi alvenas gxin per GetInt. 942 00:51:10,000 --> 00:51:13,000 Kio estas la studenta nomo, kaj tiam I get it kun GetString. 943 00:51:13,000 --> 00:51:15,000 Kio estas la studenta domo? I get it kun GetString. 944 00:51:15,000 --> 00:51:19,000 Kaj poste ĉe la malsupro tie Mi nur decidis ŝanĝi 945 00:51:19,000 --> 00:51:22,000 kiom mi presi tiujn el kaj al reale uzi buklo, 946 00:51:22,000 --> 00:51:24,000 kaj kiu mi estas presi? 947 00:51:24,000 --> 00:51:27,000 Laŭ la komento mi presi iun en Mather, 948 00:51:27,000 --> 00:51:30,000 kaj tio estas tiel Rob kaj Tommy ks-reale Tommy en Mather. 949 00:51:30,000 --> 00:51:34,000 Tommy kaj Davido estus presita en ĉi tiu kazo, sed kiel estas ĉi laborante? 950 00:51:34,000 --> 00:51:40,000 Ni ne vidis ĉi tiun funkcion antaŭe, sed preni guess pri kio ĉi faras. 951 00:51:40,000 --> 00:51:42,000 Komparas kordoj. 952 00:51:42,000 --> 00:51:45,000 >> Ĝi estas iom ne-evidenta kiel komparas kordoj ĉar ĝi rezultas 953 00:51:45,000 --> 00:51:49,000 se ĝi redonas 0 kiu signifas la kordoj estas egalaj. 954 00:51:49,000 --> 00:51:53,000 Se ĝi redonas -1 kiu signifu venas alfabete antaux la alia, 955 00:51:53,000 --> 00:51:57,000 kaj se li revenas +1 kiu signifas la alia vorto venas alfabete 956 00:51:57,000 --> 00:52:00,000 antaŭ la alia, kaj vi povas rigardi en linio aŭ la viro paĝo 957 00:52:00,000 --> 00:52:04,000 vidi precize kien estas kio, sed ĉiuj ĉi nun faras estas ĝi estas jene 958 00:52:04,000 --> 00:52:09,000 se la [i]. domo estas egala al "Mather" 959 00:52:09,000 --> 00:52:13,000 tiam iru antaŭen kaj presi tiel kaj tiel estas en Mather. 960 00:52:13,000 --> 00:52:16,000 Sed jen io ne vidis antaŭe, kaj ni revenos al ĉi tio. 961 00:52:16,000 --> 00:52:21,000 Mi ne memoras iam devi fari tion en iu ajn el miaj programoj. 962 00:52:21,000 --> 00:52:24,000 Libera estas ŝajne raportante al memoro, liberigante memoro, 963 00:52:24,000 --> 00:52:31,000 sed kion memoro mi ŝajne liberigante en ĉi buklo en la fundo de tiu programo? 964 00:52:31,000 --> 00:52:34,000 Ĝi aspektas kiel mi liberigante la nomo de persono 965 00:52:34,000 --> 00:52:37,000 kaj persono domo, sed kial estas tio? 966 00:52:37,000 --> 00:52:41,000 >> Ĝi rezultas ĉiuj tiuj semajnoj ke vi estis uzante GetString 967 00:52:41,000 --> 00:52:45,000 ni ia estis enkonduki cimon en ĉiun el viaj programoj. 968 00:52:45,000 --> 00:52:51,000 GetString per dezajno allocates memoro por ke ĝi povas reveni al vi ŝnuron, 969 00:52:51,000 --> 00:52:55,000 kiel Davido, aŭ Rob, kaj vi povos tiam faru kion vi volas 970 00:52:55,000 --> 00:52:59,000 kun tiu ĉeno en via programo ĉar ni rezervis la memoro pri vi. 971 00:52:59,000 --> 00:53:02,000 La problemo estas tiel tempo ĉiufoje vi nomas GetString 972 00:53:02,000 --> 00:53:05,000 ni, la aŭtoroj de GetString, estis petante la mastruma sistemo 973 00:53:05,000 --> 00:53:07,000 doni al ni iom da RAM por ĉi linio. 974 00:53:07,000 --> 00:53:09,000 Donu al ni iom da RAM por ĉi sekva linio. 975 00:53:09,000 --> 00:53:11,000 Donu al ni kelkajn pli RAM por ĉi sekva linio. 976 00:53:11,000 --> 00:53:13,000 Kion vi, la programisto, neniam faras 977 00:53:13,000 --> 00:53:15,000 , donas al ni, ke memoro reen, 978 00:53:15,000 --> 00:53:17,000 tial por tiuj pluraj semajnoj ĉiuj programoj vi skribis 979 00:53:17,000 --> 00:53:20,000 havis kio nomiĝas memoro salton per ili plu uzi 980 00:53:20,000 --> 00:53:24,000 pli kaj pli memoro ĉiufoje vi nomas GetString, kaj tio estas fajna. 981 00:53:24,000 --> 00:53:27,000 Ni intence fari tion en la unuaj semajnoj ĉar ĝi ne estas tiu interesa 982 00:53:27,000 --> 00:53:29,000 devos maltrankviligi kie la kordo venas de. 983 00:53:29,000 --> 00:53:34,000 Ĉiuj vi volas estas la vorto Rob reveni kiam la uzanto tajpas ĝin in 984 00:53:34,000 --> 00:53:38,000 >> Sed movi antaŭen ni nun devas starti atingi pli kompleksa alproksimigas ĉi. 985 00:53:38,000 --> 00:53:42,000 Ajn ni rezervi memoron ni pli bone eventuale transdoni ĝin. 986 00:53:42,000 --> 00:53:45,000 Alie en la reala mondo sur vian Mac aŭ PC vi havu tempo al tempo spertis 987 00:53:45,000 --> 00:53:50,000 simptomoj kie via komputilo estas muelantaj detenis eventuale 988 00:53:50,000 --> 00:53:54,000 aŭ la malsaĝaj ŝpinita strando pilko estas nur okupante la komputilo 989 00:53:54,000 --> 00:53:56,000 tutan atenton kaj vi ne povas fari tion. 990 00:53:56,000 --> 00:54:00,000 Tio povas klarigi por ajna nombro da eraroj, sed inter tiuj eblaj eraroj 991 00:54:00,000 --> 00:54:03,000 estas aferoj nomis memoro filtras per iu, kiu skribis, ke peco de programaro 992 00:54:03,000 --> 00:54:07,000 vi uzas ne memoris al libera memoro 993 00:54:07,000 --> 00:54:10,000 ke li aŭ ŝi demandis la mastruma sistemo por, 994 00:54:10,000 --> 00:54:14,000 ne uzante GetString, ĉar tio estas CS50 afero, sed uzante similajn funkciojn 995 00:54:14,000 --> 00:54:16,000 kiuj petos la mastruma sistemo por memoro. 996 00:54:16,000 --> 00:54:19,000 Se vi aŭ ŝraŭbo supren kaj neniam vere reveni tiu memoro 997 00:54:19,000 --> 00:54:24,000 simptomo de tiu eblas ke programo malrapido kaj bremsas kaj paŭzo 998 00:54:24,000 --> 00:54:26,000 se vi ne memoras nomi libera. 999 00:54:26,000 --> 00:54:28,000 >> Ni revenos al kiam kaj kial vi nomas libera, 1000 00:54:28,000 --> 00:54:32,000 sed ni iru antaŭen nur por bona mezuro kaj provu kurante tiu aparta programo. 1001 00:54:32,000 --> 00:54:35,000 Ĉi nomis structs1, eniru. 1002 00:54:35,000 --> 00:54:40,000 Lasu min kaj kuras structs1, 123, Davido Mather, 1003 00:54:40,000 --> 00:54:47,000 456, Rob Kirkland, 789, 1004 00:54:47,000 --> 00:54:50,000 Tommy Mather, kaj ni vidu David en Mather, Tommy en Mather. 1005 00:54:50,000 --> 00:54:53,000 Tiu estas nur iom prudento ĉeko ke la programo funkcias. 1006 00:54:53,000 --> 00:54:56,000 Nun, bedaŭrinde, tiu programo estas iom frustra en tiu 1007 00:54:56,000 --> 00:55:00,000 Mi ne ĉiuj kiuj laboras, mi tajpis en 9 malsamaj kordoj, batis eniros, 1008 00:55:00,000 --> 00:55:04,000 Oni raportis al kiu estis en Mather, tamen evidente mi sciis kiu estis en Mather jam ĉar mi tajpis ĝin. 1009 00:55:04,000 --> 00:55:07,000 Estus almenaŭ agrabla se tiu programo estas pli kiel datumbazo 1010 00:55:07,000 --> 00:55:10,000 kaj ĝi efektive memoras kion mi tajpis en 1011 00:55:10,000 --> 00:55:12,000 do mi ne plu devas enigo tiuj studento diskoj. 1012 00:55:12,000 --> 00:55:15,000 Eble estas kiel registrarial sistemo. 1013 00:55:15,000 --> 00:55:21,000 >> Ni povas fari ĉi tion uzante tiun teknikon konata kiel dosiero I / O, dosiero enigo kaj eligo, 1014 00:55:21,000 --> 00:55:24,000 tre ĝenerala maniero diri ajn vi volas legi aŭ skribi dosierojn dosieroj 1015 00:55:24,000 --> 00:55:26,000 vi povas fari tion per iu aro de funkcioj. 1016 00:55:26,000 --> 00:55:29,000 Lasu min kaj malfermu tiun ekzemplon structs2.c, 1017 00:55:29,000 --> 00:55:33,000 kiu estas preskaŭ identaj, sed ni vidu kion nun faras. 1018 00:55:33,000 --> 00:55:36,000 Sur la supro de la dosiero mi deklaras klaso de studentoj. 1019 00:55:36,000 --> 00:55:38,000 Mi tiam popoli la klaso kun la uzanto enigo, 1020 00:55:38,000 --> 00:55:41,000 do tiuj linioj de kodo estas ĝuste kiel antaŭe. 1021 00:55:41,000 --> 00:55:45,000 Tiam se mi rulumu malsupren tie mi presi ĉiu, kiu estas en Mather arbitre kiel antaŭe, 1022 00:55:45,000 --> 00:55:47,000 sed ĉi tiu estas interesa nova trajto. 1023 00:55:47,000 --> 00:55:51,000 Tiuj linioj de kodo estas nova, kaj ili enkondukas ion ĉi tie, 1024 00:55:51,000 --> 00:55:55,000 DOSIERO, ĉiuj ĉapoj, kaj ĝi havas * en ĉi tie ankaŭ. 1025 00:55:55,000 --> 00:55:58,000 Lasu min movi ĉi tien, al * super tie ankaŭ. 1026 00:55:58,000 --> 00:56:00,000 >> Ĉi tiu funkcio ne vidis antaŭe, fopen, 1027 00:56:00,000 --> 00:56:03,000 sed signifas dosiero malfermita, do ni skim tra ĉi tiuj, 1028 00:56:03,000 --> 00:56:05,000 kaj ĉi tiu estas io ni revenos al en estonteco psets, 1029 00:56:05,000 --> 00:56:10,000 sed ĉi tiu linio tie esence malfermas dosieron nomatan datumbazo, 1030 00:56:10,000 --> 00:56:13,000 kaj specife malfermas ĝin en tia maniero, ke ĝi povas fari kion ĝi? 1031 00:56:13,000 --> 00:56:15,000 [Inaudible-studento] 1032 00:56:15,000 --> 00:56:19,000 Bone, do "w" nur signifas ĝi estas diras la mastruma sistemo 1033 00:56:19,000 --> 00:56:21,000 malfermu tiun dosieron en tia maniero, ke mi povas skribi al ĝi. 1034 00:56:21,000 --> 00:56:23,000 Mi ne volas legi ĝin. Mi ne volas nur rigardi ĝin. 1035 00:56:23,000 --> 00:56:26,000 Mi volas ŝanĝi ĝin kaj aldoni stuff potenciale al ĝi, 1036 00:56:26,000 --> 00:56:28,000 kaj la dosiero estas tuj nomos datumbazo. 1037 00:56:28,000 --> 00:56:30,000 Tio povus nomi ion. 1038 00:56:30,000 --> 00:56:32,000 Tio povus esti database.txt. Tio povus esti. Db. 1039 00:56:32,000 --> 00:56:37,000 Tio povus esti vorto kiel foo, sed mi arbitre elektis nomi la dosieron datumbazo. 1040 00:56:37,000 --> 00:56:42,000 Tio estas iom prudento ĉeko ke ni revenos al tre detale kun la tempo, 1041 00:56:42,000 --> 00:56:47,000 se fp, por dosiero pointer, ne egala NULL tio signifas ĉio estas bone. 1042 00:56:47,000 --> 00:56:51,000 >> Longan rakonton, funkcioj kiel fopen kelkfoje maltrafi. 1043 00:56:51,000 --> 00:56:53,000 Eble la dosiero ne ekzistas. Eble vi estas el disko spaco. 1044 00:56:53,000 --> 00:56:55,000 Eble vi ne havas permeson por tiu dosierujo, 1045 00:56:55,000 --> 00:56:58,000 do se fopen revenas nula io malbona okazis. 1046 00:56:58,000 --> 00:57:02,000 Male, se fopen ne revenas nula ĉiuj estas bone 1047 00:57:02,000 --> 00:57:04,000 kaj mi povas komenci skribi al ĉi tiu dosiero. 1048 00:57:04,000 --> 00:57:06,000 Jen nova artifiko. 1049 00:57:06,000 --> 00:57:08,000 Tio estas por buklo ke tio ripetanta super ĉiu el miaj studentoj, 1050 00:57:08,000 --> 00:57:10,000 kaj ĉi aspektas tiel simila al kio ni faris antaŭe, 1051 00:57:10,000 --> 00:57:15,000 sed ĉi tiu funkcio estas unua de printf nomis fprintf por dosiero printf, 1052 00:57:15,000 --> 00:57:18,000 kaj rimarki ke estas malsamaj en nur 2 manieroj. 1053 00:57:18,000 --> 00:57:20,000 Unu, ĝi komenciĝas per f anstataŭ p, 1054 00:57:20,000 --> 00:57:23,000 sed tiam lia unua argumento estas ŝajne kio? 1055 00:57:23,000 --> 00:57:25,000 [Studentoj] Dosiero. >> Estas dosiero. 1056 00:57:25,000 --> 00:57:30,000 Tion nomis fp, kiun ni devos eventuale tease aparte kio dosieron puntero estas, 1057 00:57:30,000 --> 00:57:35,000 sed por nun fp simple reprezentas la dosiero kiun mi malfermis, 1058 00:57:35,000 --> 00:57:41,000 tiel fprintf tie dirante presi ĉi uzanto ID al la dosiero, ne al la ekrano. 1059 00:57:41,000 --> 00:57:44,000 Presi la uzanto nomon al la dosiero, ne al la ekrano, 1060 00:57:44,000 --> 00:57:47,000 la domo por la dosiero, ne al la ekrano, kaj poste malsupren tie, evidente, 1061 00:57:47,000 --> 00:57:50,000 fermi la dosieron, kaj tiam ĉi tie liberan la memoro. 1062 00:57:50,000 --> 00:57:53,000 >> La sola diferenco inter ĉi tiu versio 2 kaj versio 1 1063 00:57:53,000 --> 00:57:58,000 estas la enkonduko de fopen kaj ĉi DOSIERO kun * 1064 00:57:58,000 --> 00:58:01,000 kaj tiu nocio de fprintf, do ni vidu kion la fina rezulto estas. 1065 00:58:01,000 --> 00:58:03,000 Lasu min iri al mia fina fenestro. 1066 00:58:03,000 --> 00:58:06,000 Mi kuros structs2, eniru. 1067 00:58:06,000 --> 00:58:09,000 Aspektas kiel ĉiuj estas bone. Ni rerun structs2. 1068 00:58:09,000 --> 00:58:15,000 123, Davido Mather, 456, Rob Kirkland, 1069 00:58:15,000 --> 00:58:19,000 789, Tommy Mather, eniru. 1070 00:58:19,000 --> 00:58:23,000 Aspektas kiel ĝi kondutis la sama, sed se mi nun faru ls 1071 00:58:23,000 --> 00:58:28,000 rimarki kion dosiero estas en ĉi tie inter ĉiuj miaj kodo, datumbazo, 1072 00:58:28,000 --> 00:58:32,000 do ni malfermos ke, gedit de datumbazo, kaj rigardu tion. 1073 00:58:32,000 --> 00:58:34,000 Ĝi ne estas la sexy de dosiero formatoj. 1074 00:58:34,000 --> 00:58:38,000 Vere estas unu peco de datumoj linio por linio por linio, 1075 00:58:38,000 --> 00:58:42,000 sed tiuj el vi kiuj uzas Excel aŭ CSV-dosieroj, apartigita de komoj valoroj, 1076 00:58:42,000 --> 00:58:47,000 Mi povus certe uzis fprintf al anstataŭ eble fari ion kiel tiu 1077 00:58:47,000 --> 00:58:50,000 por ke mi povus vere krei la ekvivalento de Excel dosieron 1078 00:58:50,000 --> 00:58:53,000 per disigi aĵojn kun komoj, ne nur novaj linioj. 1079 00:58:53,000 --> 00:58:56,000 >> En ĉi tiu kazo se mi anstataŭe uzas komojn anstataŭ novaj linioj 1080 00:58:56,000 --> 00:59:01,000 Mi povis laŭvorte malfermu tiun datumbazon dosiero en Excel se mi anstataŭ faris aspekti ĉi. 1081 00:59:01,000 --> 00:59:03,000 Mallonge, nun ke ni havas la povon por skribi al dosieroj 1082 00:59:03,000 --> 00:59:07,000 ni povas nun starti persistante datumoj, tenante ĝin ĉirkaŭ sur disko 1083 00:59:07,000 --> 00:59:10,000 por ke ni povu konservi informon ĉirkaŭe denove kaj denove. 1084 00:59:10,000 --> 00:59:14,000 Rimarki kelkajn aliajn aferojn, kiuj estas nun iom pli familiara. 1085 00:59:14,000 --> 00:59:16,000 Sur la supro de ĉi tiu dosiero C ni havas typedef 1086 00:59:16,000 --> 00:59:21,000 ĉar ni volis krei datumtipo kiu reprezentas vorton, 1087 00:59:21,000 --> 00:59:25,000 tial ĉi tiu tipo estas nomitaj vorto, kaj ene de tiu strukturo 1088 00:59:25,000 --> 00:59:27,000 ĝi estas iom amatoro nun. 1089 00:59:27,000 --> 00:59:30,000 Kial vorto konsistas el ŝajne tabelo? 1090 00:59:30,000 --> 00:59:33,000 Kio estas vorto simple intuicie? 1091 00:59:33,000 --> 00:59:35,000 >> Ĝi estas aro de karakteroj. 1092 00:59:35,000 --> 00:59:37,000 Ĝi estas vico de signoj malantaŭo al malantaŭo al malantaŭo. 1093 00:59:37,000 --> 00:59:41,000 LITEROJ en ĉiuj kaskedoj hazarde estas ni arbitre diras la maksimuma longo 1094 00:59:41,000 --> 00:59:44,000 de iu vorto en la vortaro ke ni uzas por Scramble. 1095 00:59:44,000 --> 00:59:46,000 Kial mi havas +1? 1096 00:59:46,000 --> 00:59:48,000 La nula karaktero. 1097 00:59:48,000 --> 00:59:51,000 Memori, kiam ni faris la Bananagrams Ekzemple ni bezonis specialan valoron 1098 00:59:51,000 --> 00:59:55,000 fine de la vorto por konservi trako 1099 00:59:55,000 --> 00:59:59,000 de kie vortoj fakte finiĝis, kaj kiel la problemo aro specifo diras 1100 00:59:59,000 --> 01:00:03,000 tie ni renkontas donita vorto bulea valoro, 1101 01:00:03,000 --> 01:00:05,000 flagon, por tiel diri, vera aŭ malvera. 1102 01:00:05,000 --> 01:00:09,000 Ĉu vi trovis tiun vorton jam, ĉar ni rimarkas 1103 01:00:09,000 --> 01:00:13,000 ni vere bezonas metodo memorante ne nur kia vorto estas en Scramble 1104 01:00:13,000 --> 01:00:15,000 sed ĉu vi, la homo, trovis ĝin 1105 01:00:15,000 --> 01:00:20,000 tiel ke se vi faros trovi la vorton "la" oni povas ne nur tajpi la, eniru, la, eniru, la, eniri 1106 01:00:20,000 --> 01:00:23,000 kaj akiri 3 punktoj, 3 punktoj, 3 punktoj, 3 punktoj. 1107 01:00:23,000 --> 01:00:26,000 Ni volas povi vortlisto tiun vorton per opcio oni bool 1108 01:00:26,000 --> 01:00:29,000 al vera se vi jam trovis ĝin, do jen kial ni 1109 01:00:29,000 --> 01:00:31,000 encapsuladas ĝin en tiu strukturo. 1110 01:00:31,000 --> 01:00:35,000 >> Nun, cxi tie en Scramble tie estas tio alia struct nomis vortaro. 1111 01:00:35,000 --> 01:00:39,000 Ausente tie estas la vorto typedef ĉar en tiu kazo 1112 01:00:39,000 --> 01:00:43,000 ni bezonis encapsular la ideo de vortaro, 1113 01:00:43,000 --> 01:00:46,000 kaj vortaron enhavas tuta amaso de vortoj, 1114 01:00:46,000 --> 01:00:49,000 kiel implicita de ĉi tabelo, kaj kiel multaj el tiuj vortoj estas tie? 1115 01:00:49,000 --> 01:00:51,000 Nu, kio ajn tio variablo nomas grandecon diras. 1116 01:00:51,000 --> 01:00:53,000 Sed ni nur bezonas unu vortaron. 1117 01:00:53,000 --> 01:00:55,000 Ni ne bezonas datumtipo nomata vortaro. 1118 01:00:55,000 --> 01:00:58,000 Ni nur bezonas unu el ili, do rezultas en C 1119 01:00:58,000 --> 01:01:03,000 ke se vi ne diras typedef, vi simple diru struct, tiam ene la frizita krampoj 1120 01:01:03,000 --> 01:01:05,000 vi metis vian variabloj, tiam vi metu la nomon. 1121 01:01:05,000 --> 01:01:09,000 Ĉi tiu estas deklari unu variablo nomis vortaro 1122 01:01:09,000 --> 01:01:11,000 kiu similas ĉi. 1123 01:01:11,000 --> 01:01:16,000 Kontraste, tiuj linioj estas krei reuzebla datumstrukturo nomata vorto 1124 01:01:16,000 --> 01:01:19,000 ke vi povas krei plurajn kopiojn de, ĝuste kiel ni kreis 1125 01:01:19,000 --> 01:01:22,000 multnombraj ekzempleroj de studentoj. 1126 01:01:22,000 --> 01:01:24,000 >> Kion tio finfine permesas al ni fari? 1127 01:01:24,000 --> 01:01:30,000 Lasu min iri returne en, ni diru, pli simpla ekzemplo de simpla tempoj, 1128 01:01:30,000 --> 01:01:34,000 kaj lasu min malfermi, diru, compare1.c. 1129 01:01:34,000 --> 01:01:38,000 La problemo tie en mano estas vere senŝeligi reen 1130 01:01:38,000 --> 01:01:41,000 la mantelo de kordo kaj komenci despegando tiuj trejnado radoj 1131 01:01:41,000 --> 01:01:44,000 ĉar ĝi rezultas ke ĉeno tiel tempo 1132 01:01:44,000 --> 01:01:47,000 Estas kiel ni promesis en semajno 1 vere nur alnomo, 1133 01:01:47,000 --> 01:01:51,000 sinonimo de la CS50 biblioteko por iu kiu aspektas iom pli kripta, 1134 01:01:51,000 --> 01:01:53,000 char *, kaj ni vidis tiun stelon antaŭe. 1135 01:01:53,000 --> 01:01:55,000 Ni vidis ĝin en la kunteksto de dosieroj. 1136 01:01:55,000 --> 01:01:59,000 >> Ni nun vidas kial ni estis kaŝante tiun detalon dum iom da tempo nun. 1137 01:01:59,000 --> 01:02:02,000 Jen dosiero nomata compare1.c, 1138 01:02:02,000 --> 01:02:07,000 kaj ĝi ŝajne demandas al la uzanto por 2 kordoj, s kaj t, 1139 01:02:07,000 --> 01:02:11,000 kaj tiam provas kompari tiujn ŝnurojn por egaleco en linio 26, 1140 01:02:11,000 --> 01:02:14,000 kaj se ili estas egalaj diras, "Vi tajpis la saman," 1141 01:02:14,000 --> 01:02:17,000 kaj se ili ne estas egalaj diras, "Vi tajpis malsamaj aferoj." 1142 01:02:17,000 --> 01:02:19,000 Lasu min kaj kuras ĉi tiu programo. 1143 01:02:19,000 --> 01:02:23,000 Lasu min iri al mia fonto dosierujo, faru compare1. Kompilis okay. 1144 01:02:23,000 --> 01:02:25,000 Mi kuros compare1. 1145 01:02:25,000 --> 01:02:27,000 Mi zomi, eniru. 1146 01:02:27,000 --> 01:02:29,000 Diru ion. SALUTON. 1147 01:02:29,000 --> 01:02:32,000 Mi diros ion alian fojon. SALUTON. 1148 01:02:32,000 --> 01:02:34,000 Mi certe ne tajpi malsamaj aĵoj. 1149 01:02:34,000 --> 01:02:37,000 >> Lasu min provi tion denove. Bye Bye. 1150 01:02:37,000 --> 01:02:40,000 Certe ne malsama, do kio okazas ĉi tie? 1151 01:02:40,000 --> 01:02:44,000 Nu, kio estas vere esti komparitaj en linio 26? 1152 01:02:44,000 --> 01:02:46,000 [Inaudible-studento] 1153 01:02:46,000 --> 01:02:49,000 Jes, do rezultas ke ĉenon, datumtipo, estas speco de blanka mensogo. 1154 01:02:49,000 --> 01:02:53,000 Kordo estas char *, sed kio estas char *? 1155 01:02:53,000 --> 01:02:56,000 A char *, kiel ili diras, estas puntero, 1156 01:02:56,000 --> 01:03:00,000 kaj puntero estas efektive adreson, 1157 01:03:00,000 --> 01:03:05,000 sumo situo en memoro, kaj se vi hazarde havas tajpita en vorto kiel SALUTON, 1158 01:03:05,000 --> 01:03:08,000 memori de pasintaj diskutoj de kordoj 1159 01:03:08,000 --> 01:03:16,000 ĉi tiu estas kiel la vorto SALUTON. 1160 01:03:16,000 --> 01:03:19,000 Memoru ke vorto kiel SALUTON povas esti prezentita 1161 01:03:19,000 --> 01:03:22,000 tiel tablo de karakteroj kiel tiu 1162 01:03:22,000 --> 01:03:25,000 kaj poste kun speciala karaktero fine vokis la nula karaktero, 1163 01:03:25,000 --> 01:03:27,000 kiel la \ signifas. 1164 01:03:27,000 --> 01:03:29,000 Kio estas fakte kordoj? 1165 01:03:29,000 --> 01:03:32,000 Rimarku ke ĉi tio estas multnombraj pecoj de memoro, 1166 01:03:32,000 --> 01:03:36,000 kaj fakte, la fino de ĝi nur konas unu fojon vi rigardas tra la tuta ĉeno 1167 01:03:36,000 --> 01:03:38,000 serĉante la specialaj nula karaktero. 1168 01:03:38,000 --> 01:03:41,000 Sed se tiu estas peco de memoro de mia komputilo memoro, 1169 01:03:41,000 --> 01:03:44,000 ni arbitre diri ke ĉi tiu ĉeno just got bonŝanca, 1170 01:03:44,000 --> 01:03:47,000 kaj got metita en la komenco de mia komputilo RAM. 1171 01:03:47,000 --> 01:03:54,000 Ĉi tiu estas bajto 0, 1, 2, 3, 4, 5, 6 ... 1172 01:03:54,000 --> 01:04:02,000 >> Kiam mi diras ion kiel GetString kaj mi faras string s = GetString 1173 01:04:02,000 --> 01:04:04,000 kio vere esti revenis? 1174 01:04:04,000 --> 01:04:08,000 Por ĉi tiuj lastaj semajnoj, kio vere esti stokita en s 1175 01:04:08,000 --> 01:04:13,000 Ne ĉi kordoj per, sed en tiu kazo kio esti stokita estas 1176 01:04:13,000 --> 01:04:18,000 la nombro 0 ĉar kion GetString reale faras 1177 01:04:18,000 --> 01:04:20,000 estas ne fizike revenas ĉenon. 1178 01:04:20,000 --> 01:04:22,000 Tio ne eĉ vere fari koncepta senco. 1179 01:04:22,000 --> 01:04:24,000 Kion ĝi faras reveno estas nombro. 1180 01:04:24,000 --> 01:04:28,000 Tiu numero estas la adreso de SALUTON en memoro, 1181 01:04:28,000 --> 01:04:32,000 kaj ŝnuro s tiam, se ni senŝeligi reen ĉi tavolo, kordoj ne vere ekzistas. 1182 01:04:32,000 --> 01:04:35,000 Tio estas nur simpligo en la CS50 biblioteko. 1183 01:04:35,000 --> 01:04:38,000 >> Tiu vere estas io nomata char *. 1184 01:04:38,000 --> 01:04:41,000 Char havas sencon ĉar kio estas vorto, kiel SALUTON? 1185 01:04:41,000 --> 01:04:44,000 Nu, estas serio de signoj, serio de karakteroj. 1186 01:04:44,000 --> 01:04:47,000 Char * signifas la adreson de karaktero, 1187 01:04:47,000 --> 01:04:50,000 do kion tio signifas reveni ĉeno? 1188 01:04:50,000 --> 01:04:53,000 Bela, simpla maniero de reveni ĉeno 1189 01:04:53,000 --> 01:04:57,000 estas anstataŭ provi elkompreni kiel mi revenu al 5 aŭ 6 malsamaj bitokoj 1190 01:04:57,000 --> 01:05:01,000 lasu min reveni al la adreso de kiu bitoko? 1191 01:05:01,000 --> 01:05:03,000 La unua. 1192 01:05:03,000 --> 01:05:06,000 En aliaj vortoj, mi donos al vi la adreson de karaktero en memoro. 1193 01:05:06,000 --> 01:05:10,000 Tion char * reprezentas, la adreso de unu sola signo en memoro. 1194 01:05:10,000 --> 01:05:12,000 Voku ke variablo s. 1195 01:05:12,000 --> 01:05:15,000 Vendejo en s tiu aparta adreso, kiun mi arbitre diris estas 0, 1196 01:05:15,000 --> 01:05:19,000 nur por konservi aferojn simplajn, sed fakte ĝi estas ĝenerale pli grandan numeron. 1197 01:05:19,000 --> 01:05:21,000 >> Atendu minuton. 1198 01:05:21,000 --> 01:05:23,000 Se vi nur donas al mi la adreson de la unua signo, kiel mi scias, kion la adreso estas 1199 01:05:23,000 --> 01:05:25,000 de la dua karaktero, la tria, la kvara kaj la kvina? 1200 01:05:25,000 --> 01:05:27,000 [Inaudible-studento] 1201 01:05:27,000 --> 01:05:31,000 Vi nur scias kie la fino de la linio estas pere de ĉi tiu oportuna lertaĵo, 1202 01:05:31,000 --> 01:05:35,000 do kiam vi uzas iun kiel printf, kion printf laŭvorte prenas kiel ĝia argumento, 1203 01:05:35,000 --> 01:05:39,000 memori, ke ni uzu ĉi% s lokokupilo, kaj tiam vi pasos en 1204 01:05:39,000 --> 01:05:41,000 la variablo ke tio stokante ĉenon. 1205 01:05:41,000 --> 01:05:47,000 Kion vi vere pasante estas la adreso de la unua signo de tiu linio. 1206 01:05:47,000 --> 01:05:50,000 Printf tiam uzas por buklo aŭ dum buklo sur ricevi tiun adreson, 1207 01:05:50,000 --> 01:05:53,000 ekzemple, 0, do lasu min fari tion nun, 1208 01:05:53,000 --> 01:06:02,000 printf ("% s \ n" j); 1209 01:06:02,000 --> 01:06:07,000 Kiam mi vokas printf ("% s \ n" j); kion mi vere havigante printf kun 1210 01:06:07,000 --> 01:06:13,000 estas la adreso de la unua signo en s, kiu en ĉi tiu kazo estas arbitraj H. 1211 01:06:13,000 --> 01:06:16,000 >> Kiel printf scias kion ekzakte montri sur la ekrano? 1212 01:06:16,000 --> 01:06:19,000 La persono kiu implementado printf implementó dum buklo aŭ por buklo 1213 01:06:19,000 --> 01:06:23,000 kiu diras tiu ĉi karaktero egali la specialaj nula karaktero? 1214 01:06:23,000 --> 01:06:25,000 Se ne, presi ĝin. Kion pri ĉi tiu? 1215 01:06:25,000 --> 01:06:28,000 Se ne presi ĝin, presas ĝin, presas ĝin, presas ĝin. 1216 01:06:28,000 --> 01:06:32,000 Ho, ĉi tiu estas speciala. Ĉesu impreso kaj reveni al la uzanto. 1217 01:06:32,000 --> 01:06:35,000 Kaj tio estas laŭvorte ĉiuj ke tio estis okazas sub la kapuĉo, 1218 01:06:35,000 --> 01:06:38,000 kaj tio estas multe digesti en la unua tago de klaso, 1219 01:06:38,000 --> 01:06:43,000 sed por nun estas vere la konstruaĵo bloko de kompreno ĉio 1220 01:06:43,000 --> 01:06:46,000 ke tio daŭras interne de nia komputilo memoro, 1221 01:06:46,000 --> 01:06:49,000 kaj finfine ni tease ĉi aparte kun iom helpo 1222 01:06:49,000 --> 01:06:51,000 de unu el niaj amikoj en Stanford. 1223 01:06:51,000 --> 01:06:56,000 >> Profesoro Nick Parlante Stanford faris tion mirinda video sekvenco 1224 01:06:56,000 --> 01:06:58,000 el ĉiaj malsamaj lingvoj kiuj enkondukis 1225 01:06:58,000 --> 01:07:00,000 tiu malgranda Claymation karaktero Binky. 1226 01:07:00,000 --> 01:07:03,000 La voĉo vi pri aŭdi en nur kelkaj dua sneak antaŭmontro 1227 01:07:03,000 --> 01:07:05,000 estas tiu de Stanford instruisto, kaj vi ricevas 1228 01:07:05,000 --> 01:07:07,000 nur 5 aŭ 6 duaj de ĉi tiu momento, 1229 01:07:07,000 --> 01:07:09,000 sed ĉi tiu estas la noto, sur kiu ni konkludi hodiaŭ 1230 01:07:09,000 --> 01:07:11,000 kaj komencos la merkredoj. 1231 01:07:11,000 --> 01:07:15,000 Mi donas al vi Pointer Fun kun Binky, la antaŭmontro. 1232 01:07:15,000 --> 01:07:18,000 [♪ ♪ Muziko] [Profesoro Parlante] Hey, Binky. 1233 01:07:18,000 --> 01:07:21,000 Veki. Estas tempo por puntero amuzo. 1234 01:07:21,000 --> 01:07:24,000 [Binky] Kio estas tio? Lernu pri punteros? 1235 01:07:24,000 --> 01:07:26,000 Ho, Goody! 1236 01:07:26,000 --> 01:07:29,000 >> Ni vidos vin merkredon. 1237 01:07:29,000 --> 01:07:32,000 [CS50.TV]