1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [Review] [Quiz 0] 2 00:00:03,000 --> 00:00:05,000 >> [Lexi Ross, Tommy MacWilliam, Lucas Freitas, Joseph Ong] [Universitato Harvard] 3 00:00:05,000 --> 00:00:08,000 >> [Jen CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:10,000 >> Hej, ĉiuj. 5 00:00:10,000 --> 00:00:15,000 Bonvenon al la revizio kunsido por Quiz 0, kiu okazas ĉi merkredo. 6 00:00:15,000 --> 00:00:19,000 Kion ni faros ĉi tiu nokto, mi estas kun 3 aliaj TFs, 7 00:00:19,000 --> 00:00:24,000 kaj kune ni tuj iru tra revizio de kion ni faris en la kurso ĝis nun. 8 00:00:24,000 --> 00:00:27,000 Oni ne tuj estos 100% kompleta, sed ĝi devus doni al vi pli bonan ideon 9 00:00:27,000 --> 00:00:31,000 tion, kion vi jam havas malsupren kaj kion vi ankoraŭ bezonas studi antaŭ merkredo. 10 00:00:31,000 --> 00:00:34,000 Kaj bonvolu levi vian manon kun demandoj kiel ni iras kune, 11 00:00:34,000 --> 00:00:38,000 sed memoru, ke ni ankaux havas iom da tempo al la fino- 12 00:00:38,000 --> 00:00:41,000 se ni finos pri kelkaj minutoj al libera-fari ĝeneralajn demandojn, 13 00:00:41,000 --> 00:00:47,000 tiel subteni ke en menso, kaj tial ni tuj komencos komence kun Semajno 0. 14 00:00:47,000 --> 00:00:50,000 >> [Kvizo 0 Review!] [Parto 0] [Lexi Ross] Sed antaŭ ol ni faras tion let parolu pri 15 00:00:50,000 --> 00:00:53,000 la aranĝon de la kvizo. 16 00:00:53,000 --> 00:00:55,000 >> [Logistics] [Quiz okazas merkrede 10/10 en loko de prelego] 17 00:00:55,000 --> 00:00:57,000 >> [(Vidu http://cdn.cs50.net/2012/fall/quizzes/0/about0.pdf por detaloj)] Estas merkrede, oktobro 10-a. 18 00:00:57,000 --> 00:01:00,000 >> Tio estas tio merkredo, kaj se vi iros al oriento URL tie, 19 00:01:00,000 --> 00:01:03,000 kiu estas ankaŭ atingebla de CS50.net-tie estas ligilo al ĝi- 20 00:01:03,000 --> 00:01:06,000 vi povas vidi informojn pri kien iri bazita sur 21 00:01:06,000 --> 00:01:10,000 via lasta nomo aŭ lernejo afiliación tiel kiel 22 00:01:10,000 --> 00:01:14,000 rakontas pri ĝuste kion la kvizo kovros kaj la tipoj de demandoj kiujn vi ricevos. 23 00:01:14,000 --> 00:01:19,000 Konsideru ke vi ankaŭ havas ŝancon por revizii por la kvizo en transeco, 24 00:01:19,000 --> 00:01:21,000 tiel viaj TFs devus iri super iu praktiko problemoj, 25 00:01:21,000 --> 00:01:29,000 kaj tio estas alia bona ŝanco por vidi kie vi ankoraŭ bezonas studi ĉe la kvizo. 26 00:01:29,000 --> 00:01:32,000 Ni komencu komence kun Bitoj 'n' Bytes. 27 00:01:32,000 --> 00:01:35,000 Memoru iom estas nur 0 aŭ 1, 28 00:01:35,000 --> 00:01:38,000 kaj bajto estas kolekto de 8 el tiuj bitoj. 29 00:01:38,000 --> 00:01:42,000 Ni rigardu ĉi tiu kolekto de bitoj ĉi tie. 30 00:01:42,000 --> 00:01:44,000 Ni devus kapabli kalkuli kiom da bitoj estas. 31 00:01:44,000 --> 00:01:48,000 Kie ni kalkulu tie estas nur 8 el ili, ok 0 aŭ 1 unuoj. 32 00:01:48,000 --> 00:01:51,000 Kaj ĉar ne estas 8 bitoj, jen 1 bajto, 33 00:01:51,000 --> 00:01:53,000 kaj ni konverti ĝin al deksesuma. 34 00:01:53,000 --> 00:01:58,000 Deksesuma estas bazo 16, kaj ĝi estas bela facile konverti 35 00:01:58,000 --> 00:02:01,000 numeron en duuma, kiu estas kiu tiu estas, al nombro en deksesuma. 36 00:02:01,000 --> 00:02:04,000 Ĉiuj ni estas ni rigardas grupoj de 4, 37 00:02:04,000 --> 00:02:07,000 kaj ni konverti ilin al la konvena deksesuma cifero. 38 00:02:07,000 --> 00:02:11,000 Ni komencu per la dekstra plej grupo de 4, do 0011. 39 00:02:11,000 --> 00:02:16,000 Tio tuj estos unu 1 kaj unu 2, do kune kiu faras 3. 40 00:02:16,000 --> 00:02:19,000 Kaj tiam ni rigardu la alia bloko de 4. 41 00:02:19,000 --> 00:02:24,000 1101. Tio tuj estos unu 1, unu 4, kaj unu 8. 42 00:02:24,000 --> 00:02:28,000 Kune ke tuj estos 13, kiu faras D. 43 00:02:28,000 --> 00:02:32,000 Kaj ni memoru, ke en deksesuma ni ne nur iri 0 tra 9. 44 00:02:32,000 --> 00:02:36,000 Ni iru 0 tra F, do post 9, 10 korespondas al A, 45 00:02:36,000 --> 00:02:40,000 11 al B, kaj tiel plu kie F estas la 15. 46 00:02:40,000 --> 00:02:44,000 Jen 13 estas D, 47 00:02:44,000 --> 00:02:49,000 tiel por konverti ĝin al dekuma ĉiuj ni estas ni efektive 48 00:02:49,000 --> 00:02:52,000 trakti ĉiu pozicio kiel povo de 2. 49 00:02:52,000 --> 00:02:58,000 Tio estas unu 1, unu 2, nula 4s, nula 8s, unu 16, kaj tiel plu, 50 00:02:58,000 --> 00:03:03,000 kaj estas iom malfacile kalkuli en la kapo, sed se ni iros al la venonta slide 51 00:03:03,000 --> 00:03:05,000 ni povas vidi la respondon al tio. 52 00:03:05,000 --> 00:03:09,000 >> Esence ni iras trans de dekstre al maldekstre, 53 00:03:09,000 --> 00:03:14,000 kaj ni multiplikante ĉiu cifero por la responda potenco de 2. 54 00:03:14,000 --> 00:03:19,000 Kaj memoru, por deksesuma ni signifi tiuj nombroj kun 0x komence 55 00:03:19,000 --> 00:03:23,000 tial ni ne konfuzu ĝin kun dekuma nombro. 56 00:03:23,000 --> 00:03:29,000 Daŭrigante on, ĉi tiu estas Askio Tabelo, 57 00:03:29,000 --> 00:03:35,000 kaj kion ni uzas ASCII por estas mapaj de karakteroj por nombraj valoroj. 58 00:03:35,000 --> 00:03:39,000 Memoru en la ĉifriko pset ni faris vastan uzon de la ASCII Tabelo 59 00:03:39,000 --> 00:03:43,000 por uzi diversajn metodojn de ĉifriko, 60 00:03:43,000 --> 00:03:47,000 Cezaro kaj la Vigenère, por konverti malsamaj literoj 61 00:03:47,000 --> 00:03:52,000 en ĉenon laŭ la ŝlosilo donita de la uzanto. 62 00:03:52,000 --> 00:03:56,000 Ni rigardu iom de ASCII math. 63 00:03:56,000 --> 00:04:02,000 Rigardante 'P' + 1, en karaktero formo kiu estus Q, 64 00:04:02,000 --> 00:04:07,000 kaj memoru, ke '5 '≠ 5. 65 00:04:07,000 --> 00:04:10,000 Kaj kiel precize devus ni konverti inter tiuj 2 formojn? 66 00:04:10,000 --> 00:04:13,000 Ne vere tro peza. 67 00:04:13,000 --> 00:04:16,000 Por akiri 5 ni subtrahi '0 ' 68 00:04:16,000 --> 00:04:20,000 ĉar estas 5 lokoj inter la '0 'kaj la '5'. 69 00:04:20,000 --> 00:04:23,000 Por iri la alia vojo ni simple aldonu la 0, 70 00:04:23,000 --> 00:04:25,000 do ĝi estas speco de kiel regula aritmetiko. 71 00:04:25,000 --> 00:04:29,000 Nur memoras ke kiam io estas citaĵoj ĉirkaŭ ĝi temas pri karaktero 72 00:04:29,000 --> 00:04:37,000 kaj tiel respondas al valoro en la ASCII tablo. 73 00:04:37,000 --> 00:04:40,000 Enirante en pli ĝenerala komputikaj temoj. 74 00:04:40,000 --> 00:04:43,000 Ni lernis kio algoritmo estas kaj kiel ni uzas programado 75 00:04:43,000 --> 00:04:45,000 apliki algoritmoj. 76 00:04:45,000 --> 00:04:48,000 Kelkaj ekzemploj de algoritmoj estas iu vere simpla kiel 77 00:04:48,000 --> 00:04:51,000 kontrolanta ĉu nombro estas para aŭ nepara. 78 00:04:51,000 --> 00:04:54,000 Por memori ni mod la nombro de 2 kaj kontroli, ĉu la rezulto estas 0. 79 00:04:54,000 --> 00:04:57,000 Se jes, ĝi estas vespero. Se ne, ĝi estas nepara. 80 00:04:57,000 --> 00:04:59,000 Kaj tio estas ekzemplo de vere baza algoritmo. 81 00:04:59,000 --> 00:05:02,000 >> Iom iom de pli implikitaj estas duuma serĉo, 82 00:05:02,000 --> 00:05:05,000 kiuj ni iros pli malfrue en la revizio kunsido. 83 00:05:05,000 --> 00:05:09,000 Kaj programado estas la termino kiun ni uzas por preni algoritmo 84 00:05:09,000 --> 00:05:15,000 kaj konvertado al kodi la komputilo povas legi. 85 00:05:15,000 --> 00:05:20,000 2 Ekzemploj de programado estas Scratch, 86 00:05:20,000 --> 00:05:22,000 kiu estas kion ni faris en Semajno 0. 87 00:05:22,000 --> 00:05:25,000 Eĉ kvankam ni ne vere tajpi el la kodo ĝi estas vojo de apliko 88 00:05:25,000 --> 00:05:29,000 ĉi tiu algoritmo, kiu estas presi la numeroj 1-10, 89 00:05:29,000 --> 00:05:32,000 kaj tie ni fari same en la C programlingvo. 90 00:05:32,000 --> 00:05:41,000 Ĉi tiuj estas funkcie ekvivalentaj, ĝuste skribita en malsamaj lingvoj aŭ sintakso. 91 00:05:41,000 --> 00:05:44,000 Ni tiam lernis pri bulea esprimoj, 92 00:05:44,000 --> 00:05:48,000 kaj bulea estas valoro kiu estas ĉu vera aŭ malvera, 93 00:05:48,000 --> 00:05:51,000 kaj tie ofte bulea esprimoj 94 00:05:51,000 --> 00:05:55,000 iras ene de kondiĉoj, do se (x ≤ 5), 95 00:05:55,000 --> 00:06:00,000 bone, ni jam starigis x = 5, tiel ke kondiĉo tuj taksi al vera. 96 00:06:00,000 --> 00:06:03,000 Kaj se ĝi estas vera, kio ajn kodo estas sub la kondiĉo 97 00:06:03,000 --> 00:06:08,000 tuj estos taksitaj de la komputilo, por ke kordoj tuj estos presita 98 00:06:08,000 --> 00:06:12,000 al la normo eligo, kaj la termino kondiĉo 99 00:06:12,000 --> 00:06:16,000 referencas al kio ajn ene de la krampoj de la se aserto. 100 00:06:16,000 --> 00:06:20,000 Memoru ĉiuj operatoroj. 101 00:06:20,000 --> 00:06:26,000 Memoru ke estas && kaj | | kiam ni provas kombini 2 aŭ pli kondiĉoj, 102 00:06:26,000 --> 00:06:30,000 == Ne = por kontroli ĉu 2 aĵoj estas egalaj. 103 00:06:30,000 --> 00:06:36,000 Memoru ke = estas por atribuo dum == estas bulea operatoro. 104 00:06:36,000 --> 00:06:41,000 ≤, ≥, kaj poste la fina 2 estas mem-klarigan. 105 00:06:41,000 --> 00:06:45,000 Ĝenerala revizio de bulea logiko tie. 106 00:06:45,000 --> 00:06:48,000 Kaj bulea esprimoj estas ankaŭ grava en cikloj, 107 00:06:48,000 --> 00:06:50,000 kiuj ni transiru nun. 108 00:06:50,000 --> 00:06:56,000 Ni lernis pri 3 tipoj de cikloj ĝis nun en CS50, por, dum, kaj faru tempon. 109 00:06:56,000 --> 00:06:59,000 Kaj estas grave scii ke dum por pli celoj 110 00:06:59,000 --> 00:07:02,000 ni povas reale uzi ajnan tipon de buklo ĝenerale 111 00:07:02,000 --> 00:07:06,000 estas certaj tipoj de celoj aŭ komuna ŝablonoj 112 00:07:06,000 --> 00:07:09,000 en programado kiu specife vokas unu el tiuj cikloj 113 00:07:09,000 --> 00:07:13,000 kiuj faras ĝin la plej efika aŭ eleganta por kodi ĝin en tiu vojo. 114 00:07:13,000 --> 00:07:18,000 Ni transiru kion ĉiu el tiuj cikloj inklinas uzi por plej ofte. 115 00:07:18,000 --> 00:07:21,000 >> En a por buklo ni ĝenerale jam scias kiom da fojoj ni volas persisti. 116 00:07:21,000 --> 00:07:24,000 Tio estas kion ni metis en la kondiĉo. 117 00:07:24,000 --> 00:07:28,000 Ĉar, i = 0, i <10, ekzemple. 118 00:07:28,000 --> 00:07:31,000 Ni jam scias, ke ni volas fari ion 10-foje. 119 00:07:31,000 --> 00:07:34,000 Nun, dum tempo buklo, ĝenerale ni ne nepre 120 00:07:34,000 --> 00:07:36,000 scias, kiom da fojoj ni volas ke la buklo kuri. 121 00:07:36,000 --> 00:07:39,000 Sed ni scias ian kondiĉo, ke ni volas ke ĝi 122 00:07:39,000 --> 00:07:41,000 ĉiam esti vera aŭ ĉiam esti malvera. 123 00:07:41,000 --> 00:07:44,000 Ekzemple, dum estas metita. 124 00:07:44,000 --> 00:07:46,000 Diru, ke estas bulea variablo. 125 00:07:46,000 --> 00:07:48,000 Dum tio estas vera ni volas ke la kodo por taksi, 126 00:07:48,000 --> 00:07:52,000 do iom pli etendebla, iomete pli ĝenerala ol por ciklo, 127 00:07:52,000 --> 00:07:55,000 sed neniu por buklo povas ankaŭ esti konvertita al tempo buklo. 128 00:07:55,000 --> 00:08:00,000 Fine, do dum bukloj, kiu povas esti la trickiest kompreni tuj, 129 00:08:00,000 --> 00:08:04,000 estas ofte uzata, kiam ni volas taksi la kodo unua 130 00:08:04,000 --> 00:08:06,000 antaŭ la unua fojo ni kontrolu la kondiĉo. 131 00:08:06,000 --> 00:08:09,000 Komuna uzo kazo por fari dum buklo 132 00:08:09,000 --> 00:08:12,000 estas kiam oni volas akiri uzanto enigo, kaj vi scias, ke vi volas demandi al la uzanto 133 00:08:12,000 --> 00:08:15,000 por enigo almenaŭ unufoje, sed se ili ne donos al vi bonan eniron tuj 134 00:08:15,000 --> 00:08:18,000 vi volas teni petante ilin ĝis ili donos al vi la bonan enigo. 135 00:08:18,000 --> 00:08:21,000 Tio estas la plej komuna uzo de ĉu dum ciklo, 136 00:08:21,000 --> 00:08:23,000 kaj ni rigardu la efektiva strukturo de ĉi tiuj cikloj. 137 00:08:23,000 --> 00:08:27,000 Ili tipe ĉiam emas sekvi tiujn mastrojn. 138 00:08:27,000 --> 00:08:30,000 >> Sur la por buklo ene vi havas 3 komponantoj: 139 00:08:30,000 --> 00:08:35,000 inicialización, tipe iu kiel int i = 0 kie i estas la vendotablo, 140 00:08:35,000 --> 00:08:40,000 kondiĉo, kie ni volas diri kuri ĉi por buklo dum ĉi tiu kondiĉo ankoraŭ tenas, 141 00:08:40,000 --> 00:08:44,000 kiel i <10, kaj tiam fine, ŝanĝo, kiu estas kiel ni pliigo 142 00:08:44,000 --> 00:08:47,000 la vendotablo variablo en ĉiu punkto en la ciklo. 143 00:08:47,000 --> 00:08:50,000 Komuna afero vidi tie estas nur mi + +, 144 00:08:50,000 --> 00:08:52,000 kio signifas pliigo i per 1 ĉiufoje. 145 00:08:52,000 --> 00:08:55,000 Vi povus ankaŭ fari ion kiel i + = 2, 146 00:08:55,000 --> 00:08:58,000 kio signifas aldoni 2 al mi ĉiufoje vi iros tra la ciklo. 147 00:08:58,000 --> 00:09:03,000 Kaj tiam la fari ĉi nur aludas al iu kodo kiu vere kuras kiel parto de la ciklo. 148 00:09:03,000 --> 00:09:09,000 Kaj por momento buklo, ĉifoje ni efektive havas la inicialización ekster la buklo, 149 00:09:09,000 --> 00:09:12,000 tiel ekzemple, ni diras, ke ni provas fari la saman tipon de buklo kiel mi ĵus priskribis. 150 00:09:12,000 --> 00:09:16,000 Ni dirus int i = 0 antaŭ la buklo komencas. 151 00:09:16,000 --> 00:09:20,000 Tiam ni povus diri dum i <10 fari tion, 152 00:09:20,000 --> 00:09:22,000 do la sama bloko de kodo kiel antaŭe, 153 00:09:22,000 --> 00:09:26,000 kaj ĉi-foje la ĝisdatigo parto de la kodo, ekzemple, mi + +, 154 00:09:26,000 --> 00:09:29,000 reale iras ene de la ciklo. 155 00:09:29,000 --> 00:09:33,000 Kaj fine, por fari dum ĝi estas simila al la dum ciklo, 156 00:09:33,000 --> 00:09:36,000 sed ni devas memori ke la kodo taksos unufoje 157 00:09:36,000 --> 00:09:40,000 antaŭ la kondiĉo estas kontrolita, do ĝi faras multe pli sentita 158 00:09:40,000 --> 00:09:44,000 se vi rigardas ĝin en ordo de supro al malsupro. 159 00:09:44,000 --> 00:09:49,000 En fari dum buklo la kodo taksas antaŭ vi eĉ rigardi la dum kondiĉo, 160 00:09:49,000 --> 00:09:55,000 dum kelka tempo buklo, ĝi kontrolas unue. 161 00:09:55,000 --> 00:09:59,000 Deklaroj kaj variabloj. 162 00:09:59,000 --> 00:10:04,000 Kiam ni volas krei novan variablon ni unue volas pravalorizi ĝin. 163 00:10:04,000 --> 00:10:07,000 >> Ekzemple, int trinkejo inicializa la variablo trinkejo, 164 00:10:07,000 --> 00:10:10,000 sed ne doni valoron, do kio estas trinkejo valoro nun? 165 00:10:10,000 --> 00:10:12,000 Ni ne scias. 166 00:10:12,000 --> 00:10:14,000 Ĝi povus esti iu rubo valoro kiu estis antaŭe konservitaj en memoro tie, 167 00:10:14,000 --> 00:10:16,000 kaj ni ne volas uzi tiun variablon 168 00:10:16,000 --> 00:10:19,000 ĝis ni vere donas valoron, 169 00:10:19,000 --> 00:10:21,000 do ni deklaras ĝin ĉi tie. 170 00:10:21,000 --> 00:10:24,000 Tiam ni pravalorizi ĝin esti 42-sube. 171 00:10:24,000 --> 00:10:28,000 Nun, kompreneble, ni scias ĉi tiu povas esti farita en unu linio, int trinkejo = 42. 172 00:10:28,000 --> 00:10:30,000 Sed nur por esti klara la multnombraj paŝoj kiuj okazadas, 173 00:10:30,000 --> 00:10:34,000 la deklaro kaj la inicialización okazas aparte tie. 174 00:10:34,000 --> 00:10:38,000 Ĝi okazas en unu paŝo, kaj la sekva, int baz = trinkejo + 1, 175 00:10:38,000 --> 00:10:44,000 tiu deklaracio sube, ke pliigoj baz, do fine de ĉi tiu kodo bloko 176 00:10:44,000 --> 00:10:48,000 se ni devis presi la valoro de baz estus 44 177 00:10:48,000 --> 00:10:52,000 ĉar ni deklaras kaj pravalorizi ĝin al esti 1> trinkejo, 178 00:10:52,000 --> 00:10:58,000 kaj poste ni pliigo ĝin refoje kun la + +. 179 00:10:58,000 --> 00:11:02,000 Ni iris super ĉi bela mallonge, sed estas bone havi ĝeneralan 180 00:11:02,000 --> 00:11:04,000 kompreno de kio fadenoj kaj eventoj. 181 00:11:04,000 --> 00:11:06,000 Ni ĉefe faris tion en Scratch, 182 00:11:06,000 --> 00:11:09,000 tiel vi povas pensi pri fadenoj kiel multnombraj sekvencoj de kodo 183 00:11:09,000 --> 00:11:11,000 kurante al la sama tempo. 184 00:11:11,000 --> 00:11:14,000 En realeco, ĝi probable ne ruliĝas samtempe, 185 00:11:14,000 --> 00:11:17,000 sed ia abstrakte oni povas pensi pri ĝi en tiu vojo. 186 00:11:17,000 --> 00:11:20,000 >> En Scratch, ekzemple, ni havis la multnombraj sprites. 187 00:11:20,000 --> 00:11:22,000 Ĝi povus ekzekuti malsamajn kodo samtempe. 188 00:11:22,000 --> 00:11:26,000 Unu povus promeni dum la alia diras ion 189 00:11:26,000 --> 00:11:29,000 en alia parto de la ekrano. 190 00:11:29,000 --> 00:11:34,000 Eventoj estas alia maniero de disigi ekster la logiko 191 00:11:34,000 --> 00:11:37,000 inter malsamaj elementoj de via kodo, 192 00:11:37,000 --> 00:11:40,000 kaj en Scratch ni povis simuli okazaĵoj uzante la Broadcast, 193 00:11:40,000 --> 00:11:43,000 kaj tio efektive Kiam mi Ricevu, ne Kiam mi Aŭskultu, 194 00:11:43,000 --> 00:11:47,000 sed esence estas maniero por transdoni informon 195 00:11:47,000 --> 00:11:49,000 de unu sprite al alia. 196 00:11:49,000 --> 00:11:52,000 Ekzemple, vi eble volas transdoni ludo finiĝis, 197 00:11:52,000 --> 00:11:56,000 kaj kiam alia sprite ricevas ludo finiĝis, 198 00:11:56,000 --> 00:11:58,000 respondas en certa maniero. 199 00:11:58,000 --> 00:12:03,000 Estas grava modelo por kompreni por programado. 200 00:12:03,000 --> 00:12:07,000 Nur, por transiri la baza Semajno 0, kion ni iris trans ĝis nun, 201 00:12:07,000 --> 00:12:10,000 ni rigardu tiun simplan C programon. 202 00:12:10,000 --> 00:12:14,000 La teksto estu iom malgranda el ĉi tie, sed mi tuj iros vere rapida. 203 00:12:14,000 --> 00:12:20,000 Ni inkludante 2 header files ĉe la supro, cs50.h kaj stdio.h. 204 00:12:20,000 --> 00:12:23,000 Ni tiam difini konstanta nomata limo por esti 100. 205 00:12:23,000 --> 00:12:26,000 Ni tiam apliki nia ĉefa funkcio. 206 00:12:26,000 --> 00:12:29,000 Ekde ni ne uzas komandlinio argumentoj tie ni bezonas meti void 207 00:12:29,000 --> 00:12:32,000 kiel la argumentojn por ĉefa. 208 00:12:32,000 --> 00:12:38,000 Ni vidas int supre ĉefa. Tio estas la reveno tipo, do reveni 0 je la fundo. 209 00:12:38,000 --> 00:12:41,000 Kaj ni uzas CS50 biblioteko funkcio get int 210 00:12:41,000 --> 00:12:45,000 demandi al la uzanto por enigo, kaj ni konservas ĝin en ĉi variablo x, 211 00:12:45,000 --> 00:12:51,000 do ni deklari x supre, kaj ni pravalorizi ĝin kun x = GetInt. 212 00:12:51,000 --> 00:12:53,000 >> Ni tiam kontrolu vidi se la uzanto donis al ni bonajn enigo. 213 00:12:53,000 --> 00:12:59,000 Se estas ≥ limo ni volas reveni eraro kodo de 1 kaj presi erarmesagxon. 214 00:12:59,000 --> 00:13:02,000 Kaj fine, se la uzanto donis al ni bonajn enigo 215 00:13:02,000 --> 00:13:08,000 ni iras al akordi la numeron kaj presi tiun rezulton. 216 00:13:08,000 --> 00:13:11,000 Nur por certigi ke tiuj ĉiuj sukceson hejmen 217 00:13:11,000 --> 00:13:17,000 vi povas vidi la etiketoj de malsamaj partoj de la kodo tie. 218 00:13:17,000 --> 00:13:19,000 Mi menciis konstanto, header files. 219 00:13:19,000 --> 00:13:21,000 Ho, int x. Certiĝu memori ke estas loka variablo. 220 00:13:21,000 --> 00:13:24,000 Tio kontrastas ĝin el fonto malloka variablo, kiu ni parolos pri 221 00:13:24,000 --> 00:13:27,000 iom poste en la revizio kunsido, 222 00:13:27,000 --> 00:13:30,000 kaj ni alvokas la biblioteko funkcio printf, 223 00:13:30,000 --> 00:13:34,000 do se ni ne inkludis la stdio.h kapdosiero 224 00:13:34,000 --> 00:13:37,000 ni ne povos nomi printf. 225 00:13:37,000 --> 00:13:42,000 Kaj mi kredas, la sago ke got detrancxis tie indikante la% d, 226 00:13:42,000 --> 00:13:45,000 kiu estas formatado ĉenon en printf. 227 00:13:45,000 --> 00:13:52,000 Ĝi diras presi ĉi variablo kiel nombro,% d. 228 00:13:52,000 --> 00:13:58,000 Kaj tio estas por Semajno 0. 229 00:13:58,000 --> 00:14:06,000 Nun Lucas tio daŭros. 230 00:14:06,000 --> 00:14:08,000 Hej, knaboj. Mia nomo estas Lucas. 231 00:14:08,000 --> 00:14:10,000 Mi estas sophomore en la pli bona domo campus, Mather, 232 00:14:10,000 --> 00:14:14,000 kaj mi tuj parolos iom pri Semajno 1 kaj 2.1. 233 00:14:14,000 --> 00:14:16,000 [Semajno 1 kaj 2,1!] [Lucas Freitas] 234 00:14:16,000 --> 00:14:19,000 Kiel Lexi estis diranta, kiam ni komencis traduki vian kodon de Scratch al C 235 00:14:19,000 --> 00:14:23,000 unu el la aĵoj kiuj ni rimarkis, ke vi ne povas simple 236 00:14:23,000 --> 00:14:26,000 skribi vian kodon kaj ruli ĝin uzante verda flago plu. 237 00:14:26,000 --> 00:14:30,000 Vere, vi devas uzi iujn paŝojn por fari viajn C programon 238 00:14:30,000 --> 00:14:33,000 fariĝu ruleblan dosieron. 239 00:14:33,000 --> 00:14:36,000 Esence, kion vi faras, kiam vi skribas programo estas ke 240 00:14:36,000 --> 00:14:40,000 vi traduki vian ideon al lingvo kiun kompililon povas kompreni, 241 00:14:40,000 --> 00:14:44,000 do kiam vi skribas programon en C 242 00:14:44,000 --> 00:14:47,000 kion vi faras vere skribi ion, ke via tradukilo tuj komprenas, 243 00:14:47,000 --> 00:14:50,000 kaj tiam la tradukilo tuj traduki tiu kodo 244 00:14:50,000 --> 00:14:53,000 en ion, ke via komputilo komprenos. 245 00:14:53,000 --> 00:14:55,000 >> Kaj la afero estas, via komputilo estas vere tre stulta. 246 00:14:55,000 --> 00:14:57,000 Via komputilo povas nur kompreni _0s_ kaj _1s_, 247 00:14:57,000 --> 00:15:01,000 do fakte en la unua komputiloj homoj ĝenerale planita 248 00:15:01,000 --> 00:15:04,000 uzante _0s_ kaj _1s_, sed ne plu, dank 'al Dio. 249 00:15:04,000 --> 00:15:07,000 Ni ne devas parkeri la sekvencoj por _0s_ kaj _1s_ 250 00:15:07,000 --> 00:15:10,000 por a por buklo aŭ por tempo loop kaj tiel plu. 251 00:15:10,000 --> 00:15:13,000 Tial ni havas tradukilo. 252 00:15:13,000 --> 00:15:17,000 Kia tradukilo faras estas esence tradukas la C-kodo, 253 00:15:17,000 --> 00:15:21,000 en nia kazo, al lingvo ke via komputilo komprenos, 254 00:15:21,000 --> 00:15:25,000 kio estas la objekto kodo, kaj la tradukilon, ke ni uzas 255 00:15:25,000 --> 00:15:30,000 nomas clang, do ĉi tiu estas vere la simbolo por clang. 256 00:15:30,000 --> 00:15:33,000 Kiam vi havas vian programon, vi devas fari 2 aĵoj. 257 00:15:33,000 --> 00:15:37,000 Unue, vi devas kompili vian programon, kaj tiam vi tuj kuri via programo. 258 00:15:37,000 --> 00:15:41,000 Por traduki via programo vi havas multajn eblojn por tion fari. 259 00:15:41,000 --> 00:15:44,000 La unua estas fari clang program.c 260 00:15:44,000 --> 00:15:47,000 en kiu programo estas la nomo de via programo. 261 00:15:47,000 --> 00:15:51,000 En ĉi tiu kazo vi povas vidi ili estas nur diras "Hej, kompili mia programo." 262 00:15:51,000 --> 00:15:56,000 Vi ne diras "mi volas ke tiu nomo por mia programo" aŭ io. 263 00:15:56,000 --> 00:15:58,000 >> La dua eblo, donas nomon al via programo. 264 00:15:58,000 --> 00:16:02,000 Vi povas diri clang-o kaj tiam la nomo kiun vi volas 265 00:16:02,000 --> 00:16:06,000 la ruleblan dosieron por esti nomata kiel kaj poste program.c. 266 00:16:06,000 --> 00:16:11,000 Kaj vi povas ankaŭ fari fari programon, kaj vidu, kiel en la unuaj 2 kazoj 267 00:16:11,000 --> 00:16:15,000 Mi metis. C, kaj en la tria mi nur havas programojn? 268 00:16:15,000 --> 00:16:18,000 Yeah, vi vere ne devas meti. C kiam vi uzas fari. 269 00:16:18,000 --> 00:16:22,000 Alie la tradukilo estas vere tuj krias al vi. 270 00:16:22,000 --> 00:16:24,000 Kaj ankaŭ, mi ne scias se vi infanoj memoras, 271 00:16:24,000 --> 00:16:29,000 sed multe da fojoj ni ankaŭ uzas-lcs50 aŭ-lm. 272 00:16:29,000 --> 00:16:31,000 Tio estas nomata kunligi. 273 00:16:31,000 --> 00:16:35,000 Ĝi simple rakontas la tradukilo, ke vi uzos tiujn bibliotekoj dekstra tie, 274 00:16:35,000 --> 00:16:39,000 do se vi volas uzi cs50.h vi vere devas tajpi 275 00:16:39,000 --> 00:16:43,000 clang program.c-lcs50. 276 00:16:43,000 --> 00:16:45,000 Se vi ne faras tion, la tradukilo ne tuj scias 277 00:16:45,000 --> 00:16:50,000 ke vi uzas tiujn funkciojn en cs50.h. 278 00:16:50,000 --> 00:16:52,000 Kaj kiam vi volas kuri via programo vi havas 2 eblojn. 279 00:16:52,000 --> 00:16:57,000 Se vi faris clang program.c vi ne donis nomon al via programo. 280 00:16:57,000 --> 00:17:01,000 Vi devas kuri ĝin uzante. / A.out. 281 00:17:01,000 --> 00:17:06,000 A.out estas normo nomo kiu clang donas via programo, se vi ne donas al ĝi nomon. 282 00:17:06,000 --> 00:17:11,000 Alie vi faros. / Programo se vi donis nomon al via programo, 283 00:17:11,000 --> 00:17:15,000 kaj ankaŭ se vi faris fari programon la nomo de programo tuj akiri 284 00:17:15,000 --> 00:17:23,000 Jam tuj plani la sama nomo kiel la c dosiero. 285 00:17:23,000 --> 00:17:26,000 Tiam ni parolis pri datumtipoj kaj datumojn. 286 00:17:26,000 --> 00:17:31,000 >> Esence datumtipoj estas la sama afero kiel iom skatoloj uzas 287 00:17:31,000 --> 00:17:35,000 stoki valorojn, tiel datumtipoj estas fakte ĝuste kiel Pokémons. 288 00:17:35,000 --> 00:17:39,000 Ili venas en ĉiuj grandecoj kaj tipoj. 289 00:17:39,000 --> 00:17:43,000 Mi ne scias se tiu analogio havas sencon. 290 00:17:43,000 --> 00:17:46,000 La datumoj grandeco fakte dependas de la maŝino arkitekturo. 291 00:17:46,000 --> 00:17:49,000 Ĉiuj datumoj grandecoj ke mi iros por montri ĉi tie 292 00:17:49,000 --> 00:17:53,000 estas fakte por 32-bita maŝino, kiu estas la kazo de nia aparaton, 293 00:17:53,000 --> 00:17:56,000 sed se vi vere kodigo Mac aŭ en Vindozo ankaŭ 294 00:17:56,000 --> 00:17:59,000 probable vi tuj havos 64-bita maŝino, 295 00:17:59,000 --> 00:18:03,000 do memori ke la datumoj grandecoj ke mi iros por montri ĉi tie 296 00:18:03,000 --> 00:18:06,000 estas por la 32-bita maŝino. 297 00:18:06,000 --> 00:18:08,000 La unua, kiun ni vidis estis int, 298 00:18:08,000 --> 00:18:10,000 kiu estas sufiĉe simpla. 299 00:18:10,000 --> 00:18:13,000 Vi uzas int stoki entjero. 300 00:18:13,000 --> 00:18:16,000 Ni vidis ankaŭ la karaktero, la signo. 301 00:18:16,000 --> 00:18:20,000 Se vi volas uzi leteron aŭ iom simbolo vi probable tuj uzi char. 302 00:18:20,000 --> 00:18:26,000 A char havas 1 bajto, kio signifas 8 bitoj, kiel Lexi diris. 303 00:18:26,000 --> 00:18:31,000 Esence ni havas ASCII Tabelo kiu havas 256 304 00:18:31,000 --> 00:18:34,000 eblaj kombinoj de _0s_ kaj _1s_, 305 00:18:34,000 --> 00:18:37,000 kaj kiam vi tajpi babilas tuj traduki 306 00:18:37,000 --> 00:18:44,000 la karaktero kiu enigas vin numero kiu vi havas en la ASCII tablo, kiel Lexi diris. 307 00:18:44,000 --> 00:18:48,000 Ni havas ankaŭ la kaleŝego, kiun ni uzas por stoki decimalaj numeroj. 308 00:18:48,000 --> 00:18:53,000 Se vi volas elekti 3.14, ekzemple, vi tuj uzi kaleŝego 309 00:18:53,000 --> 00:18:55,000 aŭ duobla kiu havas pli precizeco. 310 00:18:55,000 --> 00:18:57,000 Al kaleŝego havas 4 bitokoj. 311 00:18:57,000 --> 00:19:01,000 Duobla havas 8 bajtoj, do la sola diferenco estas la precizeco. 312 00:19:01,000 --> 00:19:04,000 Ni ankaŭ havas longan kiu uzas por entjeroj, 313 00:19:04,000 --> 00:19:09,000 kaj vi povas vidi por 32-bita maŝino an int kaj longan havas la saman grandecon, 314 00:19:09,000 --> 00:19:13,000 do ĝi ne vere havas sencon uzi longan en 32-bita maŝino. 315 00:19:13,000 --> 00:19:17,000 >> Sed se vi uzas Mac kaj 64-bita maŝino, reale longan havas grandecon 8, 316 00:19:17,000 --> 00:19:19,000 tiel vere dependas de la arkitekturo. 317 00:19:19,000 --> 00:19:22,000 Por la 32-bita maŝino ne havas sencon uzi longan vere. 318 00:19:22,000 --> 00:19:25,000 Kaj poste longa longa, aliflanke, havas 8 bajtoj, 319 00:19:25,000 --> 00:19:30,000 tial estas tre bona se vi volas havi pli longa entjero. 320 00:19:30,000 --> 00:19:34,000 Kaj fine, ni havas ĉenon, kiu estas vere char *, 321 00:19:34,000 --> 00:19:37,000 kiu estas puntero al char. 322 00:19:37,000 --> 00:19:40,000 Estas tre facile kredi ke la grandeco de la kordo tuj estos kiel 323 00:19:40,000 --> 00:19:42,000 la nombro da karakteroj, ke vi havas tie, 324 00:19:42,000 --> 00:19:45,000 sed fakte la char * sin 325 00:19:45,000 --> 00:19:49,000 havas la grandecon de puntero al char, kiu estas 4 bitokoj. 326 00:19:49,000 --> 00:19:52,000 La grandeco de char * estas 4 bitokoj. 327 00:19:52,000 --> 00:19:56,000 Ne gravas se vi havas malgrandan vorton aŭ leteron aŭ nenion. 328 00:19:56,000 --> 00:19:58,000 Ĝi tuj estos 4 bitokoj. 329 00:19:58,000 --> 00:20:01,000 Ni ankaŭ lernis iomete pri malplenigita, 330 00:20:01,000 --> 00:20:04,000 tiel kiel vi povas vidi, se vi havas, ekzemple, programo kiu diras 331 00:20:04,000 --> 00:20:08,000 int x = 3 kaj do printf ("% d", x / 2) 332 00:20:08,000 --> 00:20:12,000 do you guys scias kio okazas al presi sur ekrano? 333 00:20:12,000 --> 00:20:14,000 >> Iu? >> [Studentoj] 2. 334 00:20:14,000 --> 00:20:16,000 1. >> 1, yeah. 335 00:20:16,000 --> 00:20:20,000 Kiam vi faras 3/2 ĝi ​​tuj akiri 1,5, 336 00:20:20,000 --> 00:20:24,000 sed ekde ni uzas entjero ĝi tuj ignori la dekuma parto, 337 00:20:24,000 --> 00:20:26,000 kaj vi tuj havos 1. 338 00:20:26,000 --> 00:20:29,000 Se vi ne volas ke tio okazas, kion vi povas fari, ekzemple, 339 00:20:29,000 --> 00:20:33,000 estas deklari kaleŝego y = x. 340 00:20:33,000 --> 00:20:40,000 Tiam x kiu kutimis esti 3 nun tuj estos 3,000 en y. 341 00:20:40,000 --> 00:20:44,000 Kaj tiam vi povas presi la y / 2. 342 00:20:44,000 --> 00:20:50,000 Fakte, mi devus havi 2. tien. 343 00:20:50,000 --> 00:20:55,000 Oni faros 3.00/2.00, 344 00:20:55,000 --> 00:20:58,000 kaj vi tuj akiri 1,5. 345 00:20:58,000 --> 00:21:06,000 Kaj ni havas ĉi .2 f simple peti 2 dekuma unuoj en la dekuma parto. 346 00:21:06,000 --> 00:21:12,000 Se vi havas .3 f ĝi tuj devos vere 1,500. 347 00:21:12,000 --> 00:21:16,000 Se ĝi estas 2 tio tuj estos 1,50. 348 00:21:16,000 --> 00:21:18,000 Ni ankaŭ havas ĉi kazo tie. 349 00:21:18,000 --> 00:21:22,000 Se vi faras kaleŝego x = 3.14 kaj tiam vi printf x 350 00:21:22,000 --> 00:21:24,000 vi ricevos 3.14. 351 00:21:24,000 --> 00:21:29,000 Kaj se vi faros x = la int de x, 352 00:21:29,000 --> 00:21:34,000 kio signifas trakti x kiel int kaj vi presi x nun 353 00:21:34,000 --> 00:21:36,000 vi havos 3.00. 354 00:21:36,000 --> 00:21:38,000 Ĉu tio havas sencon? 355 00:21:38,000 --> 00:21:41,000 Ĉar vi unue trakti x kiel entjero, do vi ignorante la dekuma parto, 356 00:21:41,000 --> 00:21:45,000 kaj tiam vi presi x. 357 00:21:45,000 --> 00:21:47,000 Kaj fine, vi povas ankaŭ fari tion, 358 00:21:47,000 --> 00:21:52,000 int x = 65, kaj poste vi deklaras char c = x, 359 00:21:52,000 --> 00:21:56,000 kaj poste, se vi presas la c vi efektive ricevos 360 00:21:56,000 --> 00:21:59,000 A, do esence kion vi faras ĉi tie 361 00:21:59,000 --> 00:22:02,000 estas traduki la entjero en la karaktero, 362 00:22:02,000 --> 00:22:05,000 samkiel la ASCII Tabelo faras. 363 00:22:05,000 --> 00:22:08,000 Ni ankaŭ parolis pri matematikaj operatoroj. 364 00:22:08,000 --> 00:22:14,000 La plimulto de ili estas sufiĉe simpla, tial +, -, *, /, 365 00:22:14,000 --> 00:22:20,000 kaj ankaŭ ni parolis pri mod, kiu estas la resto de divido de 2 nombroj. 366 00:22:20,000 --> 00:22:23,000 Se vi havas 10% 3, ekzemple, 367 00:22:23,000 --> 00:22:27,000 ĝi signifas dividi 10 per 3, kaj kio estas la resto? 368 00:22:27,000 --> 00:22:30,000 Ĝi okazas al esti 1, do ĝi estas vere tre utila por multaj el la programoj. 369 00:22:30,000 --> 00:22:38,000 Por Vigenère kaj Cezaro mi sufiĉe certas ke vi ĉiuj infanoj uzas mod. 370 00:22:38,000 --> 00:22:43,000 Pri matematikaj operatoroj, esti tre zorgema kiam kombinante * kaj /. 371 00:22:43,000 --> 00:22:48,000 >> Ekzemple, se vi faras (3/2) * 2 kion vi intencas akiri? 372 00:22:48,000 --> 00:22:50,000 [Studentoj] 2. 373 00:22:50,000 --> 00:22:54,000 Yeah, 2, ĉar 3/2 estas tuj estos 1,5, 374 00:22:54,000 --> 00:22:57,000 sed cxar vi faras operaciojn inter 2 entjeroj 375 00:22:57,000 --> 00:22:59,000 vi fakte ĝuste tuj konsideri 1, 376 00:22:59,000 --> 00:23:03,000 kaj tiam 1 * 2 tuj estos 2, do estus tre, tre zorgema 377 00:23:03,000 --> 00:23:07,000 farinte aritmetiko kun entjeroj ĉar 378 00:23:07,000 --> 00:23:12,000 vi eble akiri ke 2 = 3, en tiu kazo. 379 00:23:12,000 --> 00:23:14,000 Kaj ankaŭ estus tre singarda pri prioritaton. 380 00:23:14,000 --> 00:23:21,000 Vi devus kutimas uzi krampojn por esti certa, ke vi scias kion vi faras. 381 00:23:21,000 --> 00:23:27,000 Kelkaj utilaj ŝparvojoj, kompreneble, estas mi + + aŭ mi + = 1 382 00:23:27,000 --> 00:23:30,000 aŭ uzante + =. 383 00:23:30,000 --> 00:23:34,000 Tio estas la sama afero kiel faras mi = mi + 1. 384 00:23:34,000 --> 00:23:39,000 Vi ankaŭ povas fari i - aŭ mi - = 1, 385 00:23:39,000 --> 00:23:42,000 kiu estas la sama afero kiel i = i -1, 386 00:23:42,000 --> 00:23:46,000 io you guys uzi multon in por cikloj, almenaŭ. 387 00:23:46,000 --> 00:23:52,000 Ankaŭ, por *, se vi uzas * = kaj se vi faros, ekzemple, 388 00:23:52,000 --> 00:23:57,000 i * = 2 estas la samo kiel dirante i = i * 2, 389 00:23:57,000 --> 00:23:59,000 kaj la sama afero por divido. 390 00:23:59,000 --> 00:24:08,000 Se vi faras i / = 2 ĝi estas la sama afero kiel i = i / 2. 391 00:24:08,000 --> 00:24:10,000 >> Nun pri funkcioj. 392 00:24:10,000 --> 00:24:13,000 You guys lernis ke funkcioj estas tre bona strategio por savi kodo 393 00:24:13,000 --> 00:24:16,000 dum vi programado, do se vi volas fari la saman taskon 394 00:24:16,000 --> 00:24:20,000 en kodo denove kaj denove, probable vi volas uzi funkcio 395 00:24:20,000 --> 00:24:25,000 nur tiel vi ne devas kopii kaj almeti la kodo denove kaj denove. 396 00:24:25,000 --> 00:24:28,000 Fakte, ĉefa estas funkcio, kaj kiam mi montras al vi la formaton de funkcio 397 00:24:28,000 --> 00:24:32,000 vi tuj vidos, ke tio estas bela evidenta. 398 00:24:32,000 --> 00:24:35,000 Ni ankaŭ uzas funkcioj de kelkaj bibliotekoj, 399 00:24:35,000 --> 00:24:39,000 ekzemple, printf, GetIn, kiu estas el la CS50 biblioteko, 400 00:24:39,000 --> 00:24:43,000 kaj aliaj funkcioj kiel toupper. 401 00:24:43,000 --> 00:24:46,000 Ĉiuj el tiuj funkcioj estas vere implementado en aliaj bibliotekoj, 402 00:24:46,000 --> 00:24:49,000 kaj kiam vi metis tiujn tether dosieroj en la komenco de via programo 403 00:24:49,000 --> 00:24:53,000 Via diro povas bonvole doni al mi la kodo por tiuj funkcioj 404 00:24:53,000 --> 00:24:57,000 do mi ne devas apliki ilin per mi mem? 405 00:24:57,000 --> 00:25:00,000 Kaj vi povas ankaŭ skribi viajn proprajn funkciojn, do kiam vi komencos programado 406 00:25:00,000 --> 00:25:04,000 vi rimarkas ke bibliotekoj ne havas ĉiujn funkciojn kiujn vi bezonas. 407 00:25:04,000 --> 00:25:10,000 Por la lasta pset, ekzemple, ni skribis desegni, scramble, kaj lookup, 408 00:25:10,000 --> 00:25:13,000 kaj ĝi estas tre, tre grava por povi skribi funkciojn 409 00:25:13,000 --> 00:25:17,000 ĉar ili estas utilaj, kaj ni uzas ilin la tutan tempon en programado, 410 00:25:17,000 --> 00:25:19,000 kaj ĝi ŝparas multe da kodo. 411 00:25:19,000 --> 00:25:21,000 La formato de funkcio estas ĉi tiu. 412 00:25:21,000 --> 00:25:24,000 Ni havas reveno tipo en la komenco. Kio estas la reveno tipo? 413 00:25:24,000 --> 00:25:27,000 Estas nur kiam via funkcio tuj revenos. 414 00:25:27,000 --> 00:25:29,000 Se vi havas funkcion, ekzemple, faktorialo, 415 00:25:29,000 --> 00:25:31,000 kiu iras al kalkuli faktorialo de entjero, 416 00:25:31,000 --> 00:25:34,000 probable tuj revenos entjero ankaŭ. 417 00:25:34,000 --> 00:25:37,000 Tiam la reveno tipo tuj estos int. 418 00:25:37,000 --> 00:25:41,000 Printf reale havas reveno tipo void 419 00:25:41,000 --> 00:25:43,000 ĉar vi ne reveni nenion. 420 00:25:43,000 --> 00:25:45,000 Vi nur presi aĵojn al la ekrano 421 00:25:45,000 --> 00:25:48,000 kaj lasi la funkcio poste. 422 00:25:48,000 --> 00:25:51,000 Tiam vi havas la nomon de la funkcio kiun vi povas elekti. 423 00:25:51,000 --> 00:25:55,000 Vi devus esti iom prudenta, kiel ne elektas nomon kiel xyz 424 00:25:55,000 --> 00:25:58,000 aŭ kiel x2f. 425 00:25:58,000 --> 00:26:02,000 Provu konsistigas nomo kiu havas sencon. 426 00:26:02,000 --> 00:26:04,000 >> Ekzemple, se ĝi estas faktorialo, diru faktorialo. 427 00:26:04,000 --> 00:26:08,000 Se estas funkcio kiu tuj desegni ion, nomu ĝin desegni. 428 00:26:08,000 --> 00:26:11,000 Kaj tiam ni havas la parametroj, kiuj estas ankaŭ nomita argumentoj, 429 00:26:11,000 --> 00:26:14,000 kiuj estas kiel la rimedojn por ke via funkcio bezonas 430 00:26:14,000 --> 00:26:17,000 de via kodo por realigi lian taskon. 431 00:26:17,000 --> 00:26:20,000 Se vi volas kalkuli la faktorialon de nombro 432 00:26:20,000 --> 00:26:23,000 probable vi bezonas havi kelkajn kalkuli faktorialo. 433 00:26:23,000 --> 00:26:27,000 Unu el la argumentoj, ke vi havos estas la nombro mem. 434 00:26:27,000 --> 00:26:31,000 Kaj tiam ĝi tuj fari ion kaj redoni la valoron je la fino 435 00:26:31,000 --> 00:26:35,000 krom se ĝi estas malplena funkcio. 436 00:26:35,000 --> 00:26:37,000 Ni vidu ekzemplon. 437 00:26:37,000 --> 00:26:40,000 Se mi volas skribi funkcio kiu resumas ĉiujn numerojn en tabelo de entjeroj, 438 00:26:40,000 --> 00:26:43,000 unue, la reveno tipo tuj estos int 439 00:26:43,000 --> 00:26:46,000 ĉar mi havas aron de entjeroj. 440 00:26:46,000 --> 00:26:51,000 Kaj poste mi iros al havi la funkcio nomo kiel sumArray, 441 00:26:51,000 --> 00:26:54,000 kaj tiam tuj prenos la tabelo mem, por int nums, 442 00:26:54,000 --> 00:26:58,000 kaj tiam la longo de la tabelo do mi scias, kiom da ciferoj Mi devas resumi. 443 00:26:58,000 --> 00:27:02,000 Tiam mi devas pravalorizi variablo nomata sumo, ekzemple, al 0, 444 00:27:02,000 --> 00:27:08,000 kaj ĉiufoje mi vidas ero en la tabelo mi aldonu ĝin al sumo, do mi faris por buklo. 445 00:27:08,000 --> 00:27:15,000 Samkiel Lexi diris, vi faru int i = 0, i 00:27:20,000 Kaj por ĉiu elemento en la tabelo mi faris sumo + = nums [i], 447 00:27:20,000 --> 00:27:24,000 kaj poste mi revenis al la sumo, do ĝi estas tre simpla, kaj ĝi ŝparas multe da kodo 448 00:27:24,000 --> 00:27:28,000 se vi uzas tiun funkcion multajn fojojn. 449 00:27:28,000 --> 00:27:32,000 Tiam ni prenis rigardu kondiĉoj. 450 00:27:32,000 --> 00:27:38,000 Ni havas se, alie, kaj alie se. 451 00:27:38,000 --> 00:27:42,000 Ni vidu, kio estas la diferenco inter tiuj. 452 00:27:42,000 --> 00:27:45,000 Rigardu tiuj 2 kodoj. Kio estas la diferenco inter ili? 453 00:27:45,000 --> 00:27:49,000 La unua estas-esence la kodoj volas ke vi diru 454 00:27:49,000 --> 00:27:51,000 se numero estas +, -, aŭ 0. 455 00:27:51,000 --> 00:27:55,000 La unua diras se estas> 0 tiam ĝi estas pozitiva. 456 00:27:55,000 --> 00:28:00,000 Se ĝi estas = al 0 tiam ĝi estas 0, kaj se estas <0 tiam ĝi estas negativa. 457 00:28:00,000 --> 00:28:04,000 >> Kaj la aliaj unu faras se, alie se, alian. 458 00:28:04,000 --> 00:28:07,000 La diferenco inter la du estas, ke ĉi tiu estas vere tuj 459 00:28:07,000 --> 00:28:13,000 kontroli ĉu> 0, <0 aŭ = 0 tri fojojn, 460 00:28:13,000 --> 00:28:17,000 do se vi havas la numeron 2, ekzemple, ĝi tuj venas tie kaj diru 461 00:28:17,000 --> 00:28:21,000 if (x> 0), kaj ĝi tuj diri jes, do mi presi pozitiva. 462 00:28:21,000 --> 00:28:25,000 Sed kvankam mi scias ke ĝi estas> 0 kaj ĝi ne iras al esti 0 aŭ <0 463 00:28:25,000 --> 00:28:29,000 Mi ankoraŭ volas fari estas 0, estas <0, 464 00:28:29,000 --> 00:28:33,000 do mi vere iras ene de IFS ke mi ne devis 465 00:28:33,000 --> 00:28:38,000 ĉar mi jam scias ke ĝi ne iras por kontentigi iun el ĉi tiuj kondiĉoj. 466 00:28:38,000 --> 00:28:41,000 Mi povas uzi la se, alie se, alie komunikaĵo. 467 00:28:41,000 --> 00:28:45,000 Ĝi esence diras se x = 0 mi presi la pozitiva. 468 00:28:45,000 --> 00:28:48,000 Se ĝi ne estas, mi tuj ankaŭ testi tion ĉi. 469 00:28:48,000 --> 00:28:51,000 Se ĝi estas 2 ne mi faros tion. 470 00:28:51,000 --> 00:28:54,000 Esence, se mi havis x = 2 vi dirus 471 00:28:54,000 --> 00:28:57,000 if (x> 0), jes, do presi ĉi. 472 00:28:57,000 --> 00:29:00,000 Nun ke mi scias, ke ĝi estas> 0 kaj ke ĝi kontentigis la unua se 473 00:29:00,000 --> 00:29:02,000 Mi eĉ ne tuj kuri ĉi tiu kodo. 474 00:29:02,000 --> 00:29:09,000 La kodo kuras pli rapide, fakte, 3 fojojn pli rapide se vi uzas ĉi. 475 00:29:09,000 --> 00:29:11,000 Ni ankaŭ lernis pri kaj kaj aŭ. 476 00:29:11,000 --> 00:29:15,000 Mi ne tuj iros tra ĉi ĉar Lexi jam parolis pri ili. 477 00:29:15,000 --> 00:29:17,000 Estas nur la && kaj | | operatoro. 478 00:29:17,000 --> 00:29:21,000 >> La sola afero, mi diras estas singardi kiam oni havas 3 kondiĉojn. 479 00:29:21,000 --> 00:29:24,000 Uzu krampoj ĉar ĝi estas tre konfuza kiam vi havas kondiĉo 480 00:29:24,000 --> 00:29:27,000 kaj alia aŭ alia. 481 00:29:27,000 --> 00:29:30,000 Uzu krampoj nur por esti certa ke via kondiĉoj sencon 482 00:29:30,000 --> 00:29:34,000 ĉar en tiu kazo, ekzemple, vi povas imagi ke 483 00:29:34,000 --> 00:29:38,000 povus esti la unua kondiĉo kaj unu aŭ la alia 484 00:29:38,000 --> 00:29:41,000 aŭ la 2 kondiĉoj kombinis en kaj 485 00:29:41,000 --> 00:29:45,000 aŭ la tria, tiel simple zorgu. 486 00:29:45,000 --> 00:29:48,000 Kaj fine, ni parolis pri ŝaltiloj. 487 00:29:48,000 --> 00:29:53,000 Al ŝaltilo estas tre utila kiam vi havas variablo. 488 00:29:53,000 --> 00:29:55,000 Diru, ke vi havas variablo kiel n 489 00:29:55,000 --> 00:29:59,000 kiu povas esti 0, 1, aŭ 2, kaj por ĉiu el tiuj kazoj 490 00:29:59,000 --> 00:30:01,000 vi tuj realigi taskon. 491 00:30:01,000 --> 00:30:04,000 Vi povas diri ŝanĝi la variablo, kaj ĝi indikas, ke 492 00:30:04,000 --> 00:30:08,000 la valoro tiam estas kiel value1 Mi faros tion, 493 00:30:08,000 --> 00:30:12,000 kaj tiam mi rompos, kio signifas ke mi ne tuj rigardi iun de la aliaj kazoj 494 00:30:12,000 --> 00:30:15,000 ĉar ni jam kontenta tiu kazo 495 00:30:15,000 --> 00:30:20,000 kaj tiam value2 kaj tiel plu, kaj mi ankaŭ povas havi defaŭlta ŝaltilon. 496 00:30:20,000 --> 00:30:24,000 Tio signifas, se ĝi ne kontentigas iun el la kazoj kiujn mi havis 497 00:30:24,000 --> 00:30:29,000 ke mi tuj faru ion alian, sed tio estas laŭvola. 498 00:30:29,000 --> 00:30:36,000 Tio estas ĉio por mi. Nun ni havas Tommy. 499 00:30:36,000 --> 00:30:41,000 Bone, ĉi tiu tuj estos Semajno 3-ish. 500 00:30:41,000 --> 00:30:45,000 Ĉi tiuj estas kelkaj el la temoj ni povas kovri, kripto, atingo, tabeloj, kaj tiel plu. 501 00:30:45,000 --> 00:30:49,000 Nur rapidan vorto sur kripto. Ni ne tuj martelo ĉi hejmo. 502 00:30:49,000 --> 00:30:52,000 >> Ni faris tion en pset 2, sed por la kvizo certigi vi scias la diferenco 503 00:30:52,000 --> 00:30:54,000 inter la cezaro kodita kaj la Vigenère, 504 00:30:54,000 --> 00:30:57,000 kiel ambaŭ el tiuj koditaj laboro kaj kio estas kiel por ĉifri 505 00:30:57,000 --> 00:30:59,000 kaj deĉifri teksto uzante tiujn 2 ĉifroj. 506 00:30:59,000 --> 00:31:03,000 Memoru, la cezaro kodita simple turnas ĉiu karaktero de la sama kvanto, 507 00:31:03,000 --> 00:31:06,000 certigante vin mod per la nombro de literoj en la alfabeto. 508 00:31:06,000 --> 00:31:09,000 Kaj la Vigenère, aliflanke, turnas ĉiu karaktero 509 00:31:09,000 --> 00:31:12,000 per malsama kvanto, do anstataŭ diri 510 00:31:12,000 --> 00:31:15,000 ĉiun karakteron turnita per 3 Vigenère rotará ĉiu karaktero 511 00:31:15,000 --> 00:31:17,000 per malsama kvanto depende iuj ŝlosilvorto 512 00:31:17,000 --> 00:31:20,000 kie ĉiu litero en la ŝlosilvorto reprezentas iun malsama kvanto 513 00:31:20,000 --> 00:31:26,000 turni la klara teksto de. 514 00:31:26,000 --> 00:31:28,000 Ni unue diskuto pri variablo medion. 515 00:31:28,000 --> 00:31:30,000 Estas 2 malsamaj tipoj de variabloj. 516 00:31:30,000 --> 00:31:33,000 Ni havas lokajn variablojn, kaj ĉi tiuj tuj esti difinita 517 00:31:33,000 --> 00:31:36,000 eksteren de ĉefa aŭ ekster iu funkcio aŭ bloko, 518 00:31:36,000 --> 00:31:39,000 kaj ĉi tiuj estos atingebla ie ajn en via programo. 519 00:31:39,000 --> 00:31:41,000 Se vi havas funkcion kaj en tiu funkcio estas dum buklo 520 00:31:41,000 --> 00:31:44,000 la granda tutmonda variablo estas atingebla ĉie. 521 00:31:44,000 --> 00:31:48,000 Loka variablo, aliflanke, estas scoped al la loko kie ĝi estas difinita. 522 00:31:48,000 --> 00:31:53,000 >> Se vi havas funkcion tie, ekzemple, ni havas ĉi tiun funkcion g, 523 00:31:53,000 --> 00:31:56,000 kaj ene de g estas variablo tie nomis y, 524 00:31:56,000 --> 00:31:58,000 kaj tio signifas ke ĉi tiu estas loka variablo. 525 00:31:58,000 --> 00:32:00,000 Kvankam ĉi variablo y estas nomata 526 00:32:00,000 --> 00:32:03,000 kaj ĉi variablo estas nomita y tiuj 2 funkcioj 527 00:32:03,000 --> 00:32:06,000 Ne havas ideon kion ĉiu alia loka variabloj estas. 528 00:32:06,000 --> 00:32:10,000 Aliflanke, tien ni diras int x = 5, 529 00:32:10,000 --> 00:32:12,000 kaj ĉi tiu estas ekster la medio de ajna funkcio. 530 00:32:12,000 --> 00:32:16,000 Estas ekstere la medio de ĉefa, do ĉi tiu estas malloka variablo. 531 00:32:16,000 --> 00:32:20,000 Tio signifas ke ene de tiuj 2 funkciojn kiam mi diras x - aŭ x + + 532 00:32:20,000 --> 00:32:26,000 Mi konsentas la sama x per ĉi y kaj y ĉi estas malsamaj variabloj. 533 00:32:26,000 --> 00:32:30,000 Tio estas la diferenco inter malloka variablo kaj loka variablo. 534 00:32:30,000 --> 00:32:33,000 Koncerne dezajno raportas, foje ĝi estas probable bona ideo 535 00:32:33,000 --> 00:32:37,000 teni variabloj lokaj kiam ajn vi eble povas 536 00:32:37,000 --> 00:32:39,000 ekde havi faskon de tutmonda variabloj povas akiri vere malklara. 537 00:32:39,000 --> 00:32:42,000 Se vi havas aron da funkcioj ĉiuj modifante la saman aferon 538 00:32:42,000 --> 00:32:45,000 vi eble forgesi kion se tiu funkcio hazarde modifas ĉi tutmonda, 539 00:32:45,000 --> 00:32:47,000 kaj tiu alia funkcio ne scias pri tio, 540 00:32:47,000 --> 00:32:50,000 kaj ĝi oni multe konfuza kiel vi ricevas pli kodo. 541 00:32:50,000 --> 00:32:53,000 Subtenante variabloj lokaj kiam ajn vi eble povas 542 00:32:53,000 --> 00:32:56,000 estas nur bona dezajno. 543 00:32:56,000 --> 00:33:00,000 Arrays, memoru, estas simple listoj de eroj de la sama tipo. 544 00:33:00,000 --> 00:33:04,000 Ene de CI ne povas havi liston kiel 1, 2.0, saluton. 545 00:33:04,000 --> 00:33:06,000 Ni tute ne povas fari tion. 546 00:33:06,000 --> 00:33:11,000 >> Kiam ni deklaras tabelo en C ĉiuj elementoj devas esti de la sama tipo. 547 00:33:11,000 --> 00:33:14,000 Jen mi havas aron de 3 entjeroj. 548 00:33:14,000 --> 00:33:18,000 Jen mi havas la longon de la tabelo, sed se mi simple deklarante ĝin en multaj lingvoj 549 00:33:18,000 --> 00:33:21,000 kie mi precizigi kion ĉiuj eroj estas ne teknike bezonas tiun 3. 550 00:33:21,000 --> 00:33:25,000 La tradukilo estas sufiĉe inteligenta por elkompreni kiel granda la tabelo devas esti. 551 00:33:25,000 --> 00:33:28,000 Nun, kiam mi volas aŭ aro de la valoro de tabelo 552 00:33:28,000 --> 00:33:30,000 ĉi tiu estas la sintakson por fari tion. 553 00:33:30,000 --> 00:33:33,000 Tio efektive modifas la dua ero de la tabelo ĉar, memoru, 554 00:33:33,000 --> 00:33:36,000 kalkulado komenciĝas je 0, ne 1. 555 00:33:36,000 --> 00:33:42,000 Se mi volas legi tiun valoron mi povas diri ion kiel int x = array [1]. 556 00:33:42,000 --> 00:33:44,000 Aŭ se mi volas meti tiun valoron, kiel mi faras ĉi tie, 557 00:33:44,000 --> 00:33:47,000 Mi povas diri tabelo [1] = 4. 558 00:33:47,000 --> 00:33:50,000 Tiu epoko alirante elementoj laŭ iliaj indekso 559 00:33:50,000 --> 00:33:52,000 aŭ ilia pozicio aŭ kie ili estas en la tabelo, 560 00:33:52,000 --> 00:33:57,000 kaj tio de kantoj startas je 0. 561 00:33:57,000 --> 00:34:00,000 Ni povas ankaŭ havi tabeloj de tabeloj, 562 00:34:00,000 --> 00:34:03,000 kaj ĉi nomiĝas _multi_-dimensia tabelo. 563 00:34:03,000 --> 00:34:05,000 Kiam ni havas multi-dimensia tabelo 564 00:34:05,000 --> 00:34:07,000 tio signifas ke ni povas havi iun kiel vicoj kaj kolumnoj, 565 00:34:07,000 --> 00:34:11,000 kaj ĉi tiu estas nur unu vojo de bildiganta tiu aŭ pensi pri ĝi. 566 00:34:11,000 --> 00:34:14,000 Kiam mi havas multi-dimensia tabelo kiu signifu mi tuj komencos bezoni 567 00:34:14,000 --> 00:34:17,000 pli ol 1 indekso ĉar se mi havas krado 568 00:34:17,000 --> 00:34:19,000 nur diras kion vico vi estas en ĝi ne donas al ni nombro. 569 00:34:19,000 --> 00:34:22,000 Tio vere nur tuj donos al ni liston de nombroj. 570 00:34:22,000 --> 00:34:25,000 Diru Mi havas ĉi tabelo tie. 571 00:34:25,000 --> 00:34:30,000 Mi havas tabelo nomis krado, kaj mi diris ke estas 2 vicoj kaj 3 kolumnoj, 572 00:34:30,000 --> 00:34:32,000 kaj tiel ĉi tiu estas unu formo de bildiganta ĝin. 573 00:34:32,000 --> 00:34:37,000 Kiam mi diras, ke mi volas ricevi la elemento en [1] [2] 574 00:34:37,000 --> 00:34:41,000 tio signifas, ke pro tiuj estas vicoj unua kaj tiam kolumnoj 575 00:34:41,000 --> 00:34:44,000 Mi tuj salti al remi 1 pro tio mi diris 1. 576 00:34:44,000 --> 00:34:49,000 >> Tiam mi tuj venos ĉi tien por kolumno 2, kaj mi iros por ricevi la valoron 6. 577 00:34:49,000 --> 00:34:51,000 Sencon? 578 00:34:51,000 --> 00:34:55,000 Multi-dimensia arrays, memoru, estas teknike nur tabelo de tabeloj. 579 00:34:55,000 --> 00:34:57,000 Ni povas havi tabeloj de tabeloj de tabeloj. 580 00:34:57,000 --> 00:35:00,000 Ni povas gardi tuj, sed vere oni maniero pensi 581 00:35:00,000 --> 00:35:03,000 kiel tiu estas metita ekstere kaj kio okazas estas bildigi ĝin 582 00:35:03,000 --> 00:35:09,000 en krado ŝatas tion. 583 00:35:09,000 --> 00:35:12,000 Kiam ni pasis arrays al funkcioj, ili tuj konduti 584 00:35:12,000 --> 00:35:16,000 iom malsame ol kiam ni pasas regula variabloj al funkcioj 585 00:35:16,000 --> 00:35:18,000 kiel pasas la int aŭ kaleŝego. 586 00:35:18,000 --> 00:35:21,000 Kiam ni pasis en int aŭ char nek iu ajn el ĉi tiuj aliaj datumtipoj 587 00:35:21,000 --> 00:35:24,000 ni simple prenis rigardi se la funkcio modifas 588 00:35:24,000 --> 00:35:28,000 la valoro de tiu variablo kiu ŝanĝo ne tuj propagi supren 589 00:35:28,000 --> 00:35:32,000 al la nomante funkcio. 590 00:35:32,000 --> 00:35:35,000 Kun tabelo, aliflanke, tio okazos. 591 00:35:35,000 --> 00:35:39,000 Se mi pasas en tabelo por iu funkcio kaj tiu funkcio ŝanĝas kelkajn el la elementoj, 592 00:35:39,000 --> 00:35:43,000 kiam mi revenos supren al la funkcio kiu nomis ĝin 593 00:35:43,000 --> 00:35:47,000 mia tabelo nun tuj estos malsama, kaj la vortaro por tiu 594 00:35:47,000 --> 00:35:50,000 Estas tabeloj estas pasitaj por referenco, kiel ni vidos poste. 595 00:35:50,000 --> 00:35:53,000 Ĉi tiu estas rilatanta al kiel punteros laboro, kie ĉi tiuj bazaj datumtipoj, 596 00:35:53,000 --> 00:35:55,000 aliflanke, estas transdonata de valoro. 597 00:35:55,000 --> 00:35:59,000 >> Ni povas pensi ke kiel fari kopion de iu variablo kaj tiam pasante en la kopio. 598 00:35:59,000 --> 00:36:01,000 Ne gravas kion ni faras kun tiu variablo. 599 00:36:01,000 --> 00:36:06,000 La nomi funkcio ne konscii ke tio estis ŝanĝita. 600 00:36:06,000 --> 00:36:10,000 Arrays estas malmulta malsamaj en tiu rilate. 601 00:36:10,000 --> 00:36:13,000 Ekzemple, kiel ni ĵus vidis, ĉefa estas simple funkcio 602 00:36:13,000 --> 00:36:15,000 kiu povas preni en 2 argumentojn. 603 00:36:15,000 --> 00:36:20,000 La unua argumento al la ĉefa funkcio estas argc, aŭ la nombro de argumentoj, 604 00:36:20,000 --> 00:36:23,000 kaj la dua argumento nomiĝas argv, 605 00:36:23,000 --> 00:36:27,000 kaj tiuj estas la realaj valoroj de tiuj argumentoj. 606 00:36:27,000 --> 00:36:30,000 Diru Mi havas programon nomata this.c, 607 00:36:30,000 --> 00:36:34,000 kaj mi diras fari tion, kaj mi iros por kuri ĉi ĉe la komandlinio. 608 00:36:34,000 --> 00:36:38,000 Nun pasi en iuj argumentoj al mia programo nomata ĉi, 609 00:36:38,000 --> 00:36:42,000 Mi povus diri iun kiel. / Tiu estas cs 50. 610 00:36:42,000 --> 00:36:45,000 Jen kion ni imagas Davido fari ĉiutage ĉe la stacio. 611 00:36:45,000 --> 00:36:48,000 Sed nun la ĉefa funkcio ene de tiu programo 612 00:36:48,000 --> 00:36:52,000 havas tiujn valorojn, tiel argc estas 4. 613 00:36:52,000 --> 00:36:56,000 Ĝi povus esti iom konfuza ĉar vere ni nur pasante en estas cs 50. 614 00:36:56,000 --> 00:36:58,000 Tio estas nur 3. 615 00:36:58,000 --> 00:37:02,000 Sed memoru ke la unua ero de argv aŭ la unua argumento 616 00:37:02,000 --> 00:37:05,000 estas la nomo de la funkcio mem. 617 00:37:05,000 --> 00:37:07,190 Do tio signifas ke ni havas 4 aĵoj ĉi tie, 618 00:37:07,190 --> 00:37:10,530 kaj la unua elemento tuj estos. / ĉi. 619 00:37:10,530 --> 00:37:12,970 Kaj tiu estos reprezentita kiel linio. 620 00:37:12,970 --> 00:37:18,590 Tiam la ceteraj eroj estas kion ni tajpis en laux la nomo de la programo. 621 00:37:18,590 --> 00:37:22,720 Do ĝuste kiel la rando, kiel ni probable vidis en pset 2, 622 00:37:22,720 --> 00:37:28,780 memoru ke la ŝnuro estas 50 ≠ la entjero 50. 623 00:37:28,780 --> 00:37:32,520 Do ni ne povas diri ion kiel, 'int x = argv 3.' 624 00:37:32,520 --> 00:37:36,470 >> Tio simple ne tuj havas sencon, ĉar ĉi estas ĉeno, kaj ĉi tiu estas entjero. 625 00:37:36,470 --> 00:37:38,510 Do se vi volas konverti inter la 2, memoru, ni iras al 626 00:37:38,510 --> 00:37:40,810 havas tiun magian funkcio nomita atoi. 627 00:37:40,810 --> 00:37:46,270 Kiu prenas ĉenon kaj redonas la entjero reprezentis ene de tiu linio. 628 00:37:46,270 --> 00:37:48,360 Por ke estas facila eraro fari en la kvizo, 629 00:37:48,360 --> 00:37:51,590 nur pensante ke tio estos aŭtomate esti la ĝusta tipo. 630 00:37:51,590 --> 00:37:53,860 Sed ĝuste scias ke ĉi tiuj ĉiam estos kordoj 631 00:37:53,860 --> 00:38:00,920 eĉ se la kordo nur enhavas entjero aŭ karaktero aŭ kaleŝego. 632 00:38:00,920 --> 00:38:03,380 Do nun ni parolu pri rula tempo. 633 00:38:03,380 --> 00:38:06,700 Kiam ni havas ĉiujn tiujn algoritmoj kiuj faras cxion cxi freneza aferojn, 634 00:38:06,700 --> 00:38:11,580 ĝi iĝas vere utila por demandi la demandon, "Kiel longe vi prenas?" 635 00:38:11,580 --> 00:38:15,500 Ni reprezentas ke kun iu nomita asimptota skribmaniero. 636 00:38:15,500 --> 00:38:18,430 Do tio signifas ke - nu, diru ni donos niajn algoritmo 637 00:38:18,430 --> 00:38:20,840 iuj vere, vere, vere granda enigo. 638 00:38:20,840 --> 00:38:23,840 Ni volas demandi al la demando "Kiom longe ĝi tuj prenos? 639 00:38:23,840 --> 00:38:26,370 Kiom da ŝtupoj oni bezonas nian algoritmon por kuri 640 00:38:26,370 --> 00:38:29,980 kiel funkcio de la grandeco de la eniga? " 641 00:38:29,980 --> 00:38:33,080 Do la unua maniero ni povas priskribi kuri horo estas kun granda O. 642 00:38:33,080 --> 00:38:35,380 Kaj jen estas nia plej malbona-kazo kurado tempo. 643 00:38:35,380 --> 00:38:38,590 Do, se ni volas ordigi tabelo, kaj ni donos niajn algoritmo tabelo 644 00:38:38,590 --> 00:38:41,000 jen en malsuprenira ordon kiam devus esti en kreska ordo, 645 00:38:41,000 --> 00:38:43,130 ke okazas al esti la plej malbona kazo. 646 00:38:43,130 --> 00:38:49,800 Ĉi tiu estas nia supera baro en la maksimuma longeco de tempo nia algoritmo prenos. 647 00:38:49,800 --> 00:38:54,740 Aliflanke, ĉi Ω tuj priskribi plej kazo rula tempo. 648 00:38:54,740 --> 00:38:58,210 Do, se ni donas jam ordo tabelo al ordiga algoritmo, 649 00:38:58,210 --> 00:39:00,940 kiom da tempo oni bezonas ordigi ĝin? 650 00:39:00,940 --> 00:39:06,610 Kaj jen, do, priskribas suba baro sur rula tempo. 651 00:39:06,610 --> 00:39:10,980 Do jen estas nur iuj vortoj kiuj priskribas iujn komunajn kurante foje. 652 00:39:10,980 --> 00:39:13,120 Ĉi tiuj estas en suprenira ordo. 653 00:39:13,120 --> 00:39:16,060 La plej rapida rula tempo ni havas estas nomita konstanto. 654 00:39:16,060 --> 00:39:19,800 >> Tio signifas ne gravas kiom da eroj ni donos niajn algoritmo, 655 00:39:19,800 --> 00:39:22,280 kiel ajn granda nia tabelo estas, ordigi ĝin 656 00:39:22,280 --> 00:39:26,510 aŭ farante ajn ni faras al la tabelo estos ĉiam preni la sama kvanto de tempo. 657 00:39:26,510 --> 00:39:30,270 Do ni povas reprezenti ke nur kun 1, kiu estas konstanto. 658 00:39:30,270 --> 00:39:32,410 Ni ankaŭ rigardis logaritma tempo de ekzekuto. 659 00:39:32,410 --> 00:39:34,800 Do iu kiel duuma serĉo estas logaritma, 660 00:39:34,800 --> 00:39:37,140 kie ni tranĉis la problemo en duono ĉiufoje 661 00:39:37,140 --> 00:39:40,970 kaj tiam aĵoj simple akiri pli alta de tie. 662 00:39:40,970 --> 00:39:43,580 Kaj se vi iam verkas ho de ajna faktorialo algoritmo, 663 00:39:43,580 --> 00:39:47,850 vi probable ne devus konsideri tion kiel vian laboron. 664 00:39:47,850 --> 00:39:53,910 Kiam oni komparas kurante fojoj ĝi estas grave konsideri tion. 665 00:39:53,910 --> 00:39:57,760 Do, se mi havas algoritmon tio O (n), kaj iu alia 666 00:39:57,760 --> 00:40:03,590 estas algoritmo de O (2n) tiuj estas fakte asimptote ekvivalento. 667 00:40:03,590 --> 00:40:06,590 Do, se ni imagi n esti granda nombro kiel dekunu milionoj: 668 00:40:06,590 --> 00:40:13,090 do kiam ni komparas dekunu milionoj al iu kiel dekunu miliardoj + 3, 669 00:40:13,090 --> 00:40:17,640 subite ke +3 ne vere faras grandan diferencon plu. 670 00:40:17,640 --> 00:40:20,980 Tial ni tuj komencos konsideri tion al esti ekvivalento. 671 00:40:20,980 --> 00:40:24,220 Do aliaj similaj konstantaj tie, tie estas 2 × ĉi, aŭ aldonante 3, 672 00:40:24,220 --> 00:40:27,180 tiuj estas nur konstantaj, kaj ĉi tiuj tuj faligi supren. 673 00:40:27,180 --> 00:40:32,480 Tial do ĉiu 3 de tiuj run horoj estas la sama kiel diri ke ili estas O (n). 674 00:40:32,480 --> 00:40:37,490 Simile, se ni havas 2 aliajn run tempoj, diru O (n ³ + 2n ²), ni povas aldoni 675 00:40:37,490 --> 00:40:42,070 + N, + 7, kaj tiam ni havi alia tempo de ekzekuto tio estas nur O (n ³). 676 00:40:42,070 --> 00:40:46,290 denove, tio estas la sama afero ĉar tiuj - tiuj ne estas la sama. 677 00:40:46,290 --> 00:40:49,840 Tio estas la sama aĵoj, sorry. Do tio estas la sama ĉar 678 00:40:49,840 --> 00:40:53,090 ĉi n ³ tuj regi ĉi 2n ². 679 00:40:53,090 --> 00:40:59,130 >> Kio ne estas la sama afero estas se ni kuros tempoj kiel O (n ³) kaj O (n ²) 680 00:40:59,130 --> 00:41:02,820 ĉar ĉi n ³ estas multe pli granda ol tiu n ². 681 00:41:02,820 --> 00:41:05,470 Do, se ni havas eksponentoj, subite ĉi komencas gravas, 682 00:41:05,470 --> 00:41:08,280 sed kiam ni simple pritraktas faktoroj kiel ni estas ĉi tie, 683 00:41:08,280 --> 00:41:12,810 tiam ne iras al gravas ĉar estas ĝuste tuj forlasi. 684 00:41:12,810 --> 00:41:16,760 Ni rigardu kelkajn el la algoritmoj ni vidis ĝis nun 685 00:41:16,760 --> 00:41:19,260 kaj paroli pri siaj tempo de ekzekuto. 686 00:41:19,260 --> 00:41:23,850 La unua maniero de serĉi numeron en listo, kiun ni vidis, estis lineara serĉo. 687 00:41:23,850 --> 00:41:26,950 Kaj la efektivigo de lineara serĉo is super simpla. 688 00:41:26,950 --> 00:41:30,490 Ni nur havas liston, kaj ni iras al rigardi ĉiu unuopa elemento en la listo 689 00:41:30,490 --> 00:41:34,260 ĝis ni trovos la nombro ni serĉas. 690 00:41:34,260 --> 00:41:38,370 Do tio signifas ke en la plej malbona kazo, ĉi O (n). 691 00:41:38,370 --> 00:41:40,860 Kaj la plej malbona kazo tie povus esti se la ero estas 692 00:41:40,860 --> 00:41:45,710 la lasta elemento, tiam uzanta lineara serĉo, ni devas en ĉiu sola ero 693 00:41:45,710 --> 00:41:50,180 ĝis ni atingos la lasta por scii ke estis vere en la listo. 694 00:41:50,180 --> 00:41:52,910 Ni ne povas simple forlasi duonvoje, kaj diros: "Estas probable ne ekzistas." 695 00:41:52,910 --> 00:41:55,980 Kun lineara serĉo ni devas rigardi la tutan aferon. 696 00:41:55,980 --> 00:41:59,090 La plej kazo kurado tempo, aliflanke, estas konstanta 697 00:41:59,090 --> 00:42:04,200 ĉar en la plej bona kazo la elemento ni serĉas estas nur la unua en la listo. 698 00:42:04,200 --> 00:42:08,930 Do ĝi estas tuj prenos al ni precize 1 paŝo, kiel ajn granda la listo estas 699 00:42:08,930 --> 00:42:12,140 se ni serĉas la unua elemento ĉiufoje. 700 00:42:12,140 --> 00:42:15,390 >> Do kiam vi serĉi, memoru, ĝi ne postulas, ke nia listo povas ordo. 701 00:42:15,390 --> 00:42:19,430 Ĉar ni simple tuj serĉos sur cxiu unuopa elemento, kaj ĝi ne vere gravas 702 00:42:19,430 --> 00:42:23,560 kiu ordo tiuj eroj estas in 703 00:42:23,560 --> 00:42:28,110 Pli inteligenta serĉo algoritmo estas io kiel duuma serĉo. 704 00:42:28,110 --> 00:42:31,500 Memoru, la apliko de duuma serĉo estas kiam vi iras al 705 00:42:31,500 --> 00:42:34,320 teni rigardante la mezo de la listo. 706 00:42:34,320 --> 00:42:38,000 Kaj ĉar ni rigardas la mezo, ni postulas, ke la listo estas ordigita 707 00:42:38,000 --> 00:42:40,580 alie ni ne scias kie la meza estas, kaj ni devas pli 708 00:42:40,580 --> 00:42:44,480 la tuta listo trovi ĝin, kaj poste en tiu punkto ni simple perdi tempon. 709 00:42:44,480 --> 00:42:48,480 Do, se ni havas ordo listo kaj ni trovos la mezo, ni tuj kompari la mezo 710 00:42:48,480 --> 00:42:51,590 al la elemento ni serĉas. 711 00:42:51,590 --> 00:42:54,640 Se ĝi estas tro alta, tiam ni povas forgesi la dekstra duono 712 00:42:54,640 --> 00:42:57,810 ĉar ni scias, ke se nia ero estas jam tro alta 713 00:42:57,810 --> 00:43:01,080 kaj ĉiu al la rajto de tiu elemento estas eĉ pli alten, 714 00:43:01,080 --> 00:43:02,760 tiam ni ne bezonas rigardi tie plu. 715 00:43:02,760 --> 00:43:05,430 Kie aliflanke, se nia ero estas tro malalta, 716 00:43:05,430 --> 00:43:08,700 ni scias ĉion maldekstren de tiu elemento estas ankaŭ tro malalta, 717 00:43:08,700 --> 00:43:11,390 do ĝi ne vere havas sencon por rigardi tie, ĉu. 718 00:43:11,390 --> 00:43:15,760 Tiel, kun ĉiu paŝo kaj ĉiufoje ni rigardas la mezpunkto de la listo, 719 00:43:15,760 --> 00:43:19,060 ni iras al tranĉi nia problemo en duono ĉar subite ni scias 720 00:43:19,060 --> 00:43:23,040 tuta aro da nombroj, ke ne povas esti tiu, ni serĉas. 721 00:43:23,040 --> 00:43:26,950 >> En _pseudocode_ ĉi tio aspektas io tiamaniere, 722 00:43:26,950 --> 00:43:30,990 kaj ĉar ni tranĉante la listo en duono ĉiu sola fojo, 723 00:43:30,990 --> 00:43:34,920 nia plej malbona-kazo tempo de ekzekuto saltas de lineara al logaritma. 724 00:43:34,920 --> 00:43:39,260 Tiel subite ni havas logo-en paŝojn por trovi elementon en lerta. 725 00:43:39,260 --> 00:43:42,460 La plej kazo kurado tempo, tamen, estas ankoraŭ konstanta 726 00:43:42,460 --> 00:43:45,180 ĉar nun, ni simple diri, ke la elemento ni serĉas estas 727 00:43:45,180 --> 00:43:48,380 ĉiam la ĝusta mezo de la originala listo. 728 00:43:48,380 --> 00:43:52,080 Do ni povas kreski nia listo tiel grandaj kiel ni volas, sed se la elemento ni serĉas estas en la mezo, 729 00:43:52,080 --> 00:43:54,910 tiam ĝi estas nur tuj porti nin 1 paŝo. 730 00:43:54,910 --> 00:44:00,920 Do jen kial ni estas O (log n) kaj Ω (1) aŭ konstanto. 731 00:44:00,920 --> 00:44:04,510 Ni efektive kuris duuma serĉu per tiu listo. 732 00:44:04,510 --> 00:44:08,020 Do diru ke ni serĉas la elemento 164. 733 00:44:08,020 --> 00:44:11,650 La unua afero tuj fari estas trovi la mezpunkto de tiu listo. 734 00:44:11,650 --> 00:44:15,060 Simple tiel okazas ke la mezpunkto tuj falos en inter tiuj 2 nombroj, 735 00:44:15,060 --> 00:44:18,960 do ni nur arbitre diras, ĉiufoje kiam la mezpunkto falas inter 2 nombroj, 736 00:44:18,960 --> 00:44:21,150 ni nur ĉirkaŭ supren. 737 00:44:21,150 --> 00:44:24,330 Ni nur bezonas certigi ni faros ĉi ĉiu paŝo de la vojo. 738 00:44:24,330 --> 00:44:29,040 Do ni tuj ĉirkaŭprenis, kaj ni tuj diru, ke 161 estas la mezo de nia listo. 739 00:44:29,040 --> 00:44:34,640 Do 161 <164, kaj ĉiu ero al la maldekstra de 161 740 00:44:34,640 --> 00:44:39,120 Ankaŭ <164, do ni scias ke ĝi ne iras por helpi nin en ĉiuj 741 00:44:39,120 --> 00:44:42,690 komenci transrigardante tie ĉar la elemento oni serĉas ne povas esti tie. 742 00:44:42,690 --> 00:44:47,060 Do kion ni povas fari estas ni povas simple forgesu pri tiu tuta maldekstra duono de la listo, 743 00:44:47,060 --> 00:44:51,700 kaj nun nur konsideri de la rajto de la 161 antaŭen. 744 00:44:51,700 --> 00:44:54,050 >> Do denove, ĉi tiu estas la mezpunkto; ni nur ĉirkaŭ supren. 745 00:44:54,050 --> 00:44:56,260 Nun 175 estas tro granda. 746 00:44:56,260 --> 00:44:59,180 Do ni scias ne iras por helpi nin rigardi tie aŭ ĉi tie, 747 00:44:59,180 --> 00:45:06,610 do ni povas simple ĵeti ke for, kaj eventuale ni batis la 164. 748 00:45:06,610 --> 00:45:10,560 Demandojn sur duuma serĉo? 749 00:45:10,560 --> 00:45:14,180 Ni movi sur la esplorrigardo tra jam-ordo listo 750 00:45:14,180 --> 00:45:17,660 al reale preni listo de nombroj en iu ajn ordo 751 00:45:17,660 --> 00:45:20,960 kaj farante ke lerta en suprenira ordo. 752 00:45:20,960 --> 00:45:24,060 La unua algoritmo ni rigardis nomis bobelo varon. 753 00:45:24,060 --> 00:45:27,300 Kaj ĉi tio estus pli simpla de la algoritmoj ni vidis. 754 00:45:27,300 --> 00:45:32,970 Bobelo speco diras ke kiam ajna 2 eroj ene de la listo estas maloportune, 755 00:45:32,970 --> 00:45:36,500 signifo estas pli alta numero al la maldekstra de malsupera numeron, 756 00:45:36,500 --> 00:45:40,190 tiam ni tuj interŝanĝi ilin, ĉar tio signifas ke la listo estos 757 00:45:40,190 --> 00:45:42,860 "Pli ordo" ol estis antaŭe. 758 00:45:42,860 --> 00:45:45,180 Kaj ni nur daŭros tiu procezo denove kaj denove kaj denove 759 00:45:45,180 --> 00:45:52,100 ĝis fine la elementoj ia bobelo al lia ĝentila situo kaj ni havas ordo listo. 760 00:45:52,100 --> 00:45:57,230 >> La tempo de ekzekuto de ĉi tiu tuj estos O (n ²). Kial? 761 00:45:57,230 --> 00:46:00,370 Nu, ĉar en la plej malbona kazo, ni iras preni ĉiu ero, kaj 762 00:46:00,370 --> 00:46:04,570 nin tuj finos kompari ĝin al ĉiu alia ero en la listo. 763 00:46:04,570 --> 00:46:08,030 Sed en la plej bona kazo, ni havas jam ordo listo, bobelo speco de 764 00:46:08,030 --> 00:46:12,230 nur tuj iros tra unufoje, diri "Nope. Mi ne faris ajnan svopoj, do mi faris." 765 00:46:12,230 --> 00:46:17,410 Do ni havas plej kazo rula tempo de Ω (n). 766 00:46:17,410 --> 00:46:20,680 Ni kuras bobelo speco sur listo. 767 00:46:20,680 --> 00:46:23,560 Aŭ unua, ni nur rigardas iujn _pseudocode_ vere rapide. 768 00:46:23,560 --> 00:46:28,160 Ni volas ke ni volas konservi trako de, en ĉiu ripeto de la ciklo, 769 00:46:28,160 --> 00:46:32,190 teni spuri de ĉu ni ŝanĝis ajna elementoj. 770 00:46:32,190 --> 00:46:37,610 Do la kialo estas, ni tuj haltos kiam ni ne interŝanĝis ajna elementoj. 771 00:46:37,610 --> 00:46:41,980 Do je la komenco de nia ciklo ni ne interŝanĝis nenion, do ni diros, ke estas falsaj. 772 00:46:41,980 --> 00:46:47,170 Nun, ni tuj iru tra la listo kaj kompari elemento i al elemento i + 1 773 00:46:47,170 --> 00:46:50,310 kaj se ĝi estas la kazo, ke estas pli granda numero al la maldekstra de pli malgranda nombro, 774 00:46:50,310 --> 00:46:52,310 tiam ni ĵus tuj interŝanĝi ilin. 775 00:46:52,310 --> 00:46:54,490 >> Kaj poste ni iras al memori, ke ni interŝanĝis ero. 776 00:46:54,490 --> 00:46:58,900 Tio signifas ke ni devas iri tra la listo almenaŭ ankoraŭ 1 horo 777 00:46:58,900 --> 00:47:02,160 ĉar la kondiĉo, en kiu ni haltis estas kiam la tuta listo estas jam ordo, 778 00:47:02,160 --> 00:47:04,890 signifo ni ne faris ajnan svopoj. 779 00:47:04,890 --> 00:47:09,960 Tial do, nia kondiĉo cxi tie estas 'dum iuj elementoj estis svopitaj.' 780 00:47:09,960 --> 00:47:13,720 Do nun ni simple rigardi tiun kurante sur listo. 781 00:47:13,720 --> 00:47:16,640 Mi havas la liston 5,0,1,6,4. 782 00:47:16,640 --> 00:47:19,850 Bobelo speco tuj komenci la tuta vojo al la maldekstra, kaj ĝi tuj kompari 783 00:47:19,850 --> 00:47:24,700 la i elementoj, do 0 al mi + 1, kio estas ero 1. 784 00:47:24,700 --> 00:47:29,020 Oni intencis diri, bone 5> 0, sed nun 5 estas maldekstre, 785 00:47:29,020 --> 00:47:32,500 do mi bezonas interŝanĝi la 5 kaj la 0. 786 00:47:32,500 --> 00:47:35,470 Kiam mi interŝanĝi ilin, subite I get this malsamaj listo. 787 00:47:35,470 --> 00:47:38,260 Nun 5> 1, do ni tuj interŝanĝi ilin. 788 00:47:38,260 --> 00:47:42,160 5 ne> 6, do ni ne bezonas fari ion tie. 789 00:47:42,160 --> 00:47:46,690 Sed 6> 4, do ni bezonas interŝanĝi. 790 00:47:46,690 --> 00:47:49,740 Denove, ni bezonas kuri tra la tuta listo por eventuale eltrovi 791 00:47:49,740 --> 00:47:52,330 ke tiuj estas el ordon; ni interŝanĝi ilin, 792 00:47:52,330 --> 00:47:57,120 kaj je ĉi tiu punkto ni devas kuri tra la listo ankoraŭ 1 horo 793 00:47:57,120 --> 00:48:05,390 certigi ke ĉiu estas en lia ordono, kaj je ĉi tiu punkto bobelo varo finita. 794 00:48:05,390 --> 00:48:10,720 Malsama algoritmo por preni iujn elementojn kaj ordigi ilin estas elekto varon. 795 00:48:10,720 --> 00:48:15,740 La ideo malantaŭ selektado varo estas, ke ni tuj konstruos al ordo parton de la listo 796 00:48:15,740 --> 00:48:18,150 1 ero samtempe. 797 00:48:18,150 --> 00:48:23,170 >> Kaj la vojon ni tuj faros kiu estas por la konstruo de la maldekstra segmento de la listo. 798 00:48:23,170 --> 00:48:27,510 Kaj esence, ĉiu - sur ĉiu paŝo, ni iras preni la plej malgranda ero ni forlasis 799 00:48:27,510 --> 00:48:32,310 kiu ne estis ordo ankoraŭ, kaj ni iras al movi gxin en tiu ordo segmento. 800 00:48:32,310 --> 00:48:35,850 Tio signifas ke ni bezonas senĉese trovi la minimuma unsorted elemento 801 00:48:35,850 --> 00:48:40,720 kaj tiam preni tiun minimuman elementon kaj interŝanĝi ĝin kun kion ajn 802 00:48:40,720 --> 00:48:45,090 forlasis-plej ero kiu ne ordo. 803 00:48:45,090 --> 00:48:50,890 La tempo de ekzekuto de ĉi tiu tuj estos O (n ²) ĉar en la plej malbona kazo 804 00:48:50,890 --> 00:48:55,070 ni bezonas kompari ĉiun elementon al ĉiu alia ero. 805 00:48:55,070 --> 00:48:59,250 Ĉar ni diras ke se ni starti je la maldekstra duono de la listo, ni bezonas 806 00:48:59,250 --> 00:49:02,970 iri tra la tuta dekstra segmento por trovi la plej malgranda ero. 807 00:49:02,970 --> 00:49:05,430 Kaj tiam, denove, ni devas iri super la tuta dekstra segmento kaj 808 00:49:05,430 --> 00:49:08,210 teni tuj super tiu super kaj denove kaj denove. 809 00:49:08,210 --> 00:49:11,350 Tio okazas al esti n ². Ni tuj bezonas por buklo ene de alia por buklo 810 00:49:11,350 --> 00:49:13,350 kio sugestas n ². 811 00:49:13,350 --> 00:49:16,530 En la plej bona kazo penso, diru ni donu al ĝi jam ordo listo; 812 00:49:16,530 --> 00:49:19,270 ni efektive ne faras pli bone ol n ². 813 00:49:19,270 --> 00:49:21,730 Ĉar elekto varo havas neniun manieron de scii ke 814 00:49:21,730 --> 00:49:25,540 la minimuma ero estas nur la unu mi okazi esti rigardante. 815 00:49:25,540 --> 00:49:28,970 Ĝi ankoraŭ bezonas certigi ke ĉi tio estas vere la minimumo. 816 00:49:28,970 --> 00:49:31,670 >> Kaj la sola maniero certigi, ke ĝi estas la minimumo, uzante tiun algoritmon, 817 00:49:31,670 --> 00:49:34,640 estas serĉi en ĉiu sola ero denove. 818 00:49:34,640 --> 00:49:38,420 Do vere, se vi donas ĝin - se vi donos elekton speco jam ordo listo, 819 00:49:38,420 --> 00:49:42,720 ĝi ne faros estas pli bona ol doni ĝin listo kiu ne ordo ankoraŭ. 820 00:49:42,720 --> 00:49:46,320 Parenteze, se hazarde estas la kazo, ke io estas O (iu) 821 00:49:46,320 --> 00:49:50,640 kaj la omega de io, oni povas simple diri pli koncize, ke ĝi estas θ de iu. 822 00:49:50,640 --> 00:49:52,760 Do se vi vidas ke venu ie, ke estas kio ke ĝuste signifas. 823 00:49:52,760 --> 00:49:57,580 >> Se io estas theta de n ², ĝi estas kaj granda O (n ²) kaj Ω (n ²). 824 00:49:57,580 --> 00:49:59,790 Do bona kazo kaj plej malbona kazo, ĝi ne faras diferencon, 825 00:49:59,790 --> 00:50:04,400 la algoritmo tuj faros la samon ĉiufoje. 826 00:50:04,400 --> 00:50:06,610 Do ĉi tiu estas kion _pseudocode_ por selektado speco povus aspekti. 827 00:50:06,610 --> 00:50:10,630 Ni esence intencas diri ke mi volas persisti super la listo 828 00:50:10,630 --> 00:50:15,180 de maldekstre al dekstre, kaj je ĉiu ripeto de la ciklo, mi iros por movi 829 00:50:15,180 --> 00:50:19,780 la minimuma ero en ĉi ordo parton de la listo. 830 00:50:19,780 --> 00:50:23,260 Kaj iam mi movi ion tie, mi neniam devas rigardi tiun elementon denove. 831 00:50:23,260 --> 00:50:28,600 Ĉar kiam mi interŝanĝi ero en la maldekstra segmento de la listo, ĝi estas ordo 832 00:50:28,600 --> 00:50:32,600 ĉar ni faras ĉion en suprenira ordon uzante minimumoj. 833 00:50:32,600 --> 00:50:38,740 Do ni diris, estas bone, ni estas en la pozicio i, kaj ni devas rigardi ĉiujn elementojn 834 00:50:38,740 --> 00:50:42,260 al la dekstra de i por trovi la minimumo. 835 00:50:42,260 --> 00:50:46,150 Do tio signifas ke ni volas rigardi el i + 1 al la fino de la listo. 836 00:50:46,150 --> 00:50:51,610 Kaj nun, se la elemento kiu ni aktuale rigardante estas malpli ol nia minimuma ĝis nun, 837 00:50:51,610 --> 00:50:54,190 kiu, memoru, ni ekde la minimuma ekstere al nur esti 838 00:50:54,190 --> 00:50:57,020 kion ajn elementon ni aktuale ĉe; Mi supozas ke estas la minimumo. 839 00:50:57,020 --> 00:51:00,270 Se mi trovos elemento kiu estas pli malgranda ol tiu, tiam mi intencis diri, estas bone, 840 00:51:00,270 --> 00:51:02,700 bone, mi trovis novan minimumo. 841 00:51:02,700 --> 00:51:06,080 Mi tuj memori kie tiu minimumo estis. 842 00:51:06,080 --> 00:51:09,560 >> Do nun, unu fojon mi iris tra tiu rajto unsorted segmento, 843 00:51:09,560 --> 00:51:16,690 Mi povas diri mi iros por interŝanĝi la minimuma elemento kun la elemento kiu estas en pozicio i. 844 00:51:16,690 --> 00:51:21,100 Tio okazas por konstrui mian liston, mia ordo parton de la listo de maldekstre al dekstre, 845 00:51:21,100 --> 00:51:25,190 kaj ni ne cxiam bezonas rigardi ero denove iam estas en tiu parto. 846 00:51:25,190 --> 00:51:27,930 Iam ni interŝanĝis ĝin. 847 00:51:27,930 --> 00:51:30,260 Do ni kuros selektado speco sur tiu listo. 848 00:51:30,260 --> 00:51:38,220 La blua elemento tie tuj estos la i, kaj la ruĝa elemento tuj estos la minimuma elemento. 849 00:51:38,220 --> 00:51:41,570 Do mi startas la tuta vojo al la maldekstra de la listo, do ĉe 5. 850 00:51:41,570 --> 00:51:44,610 Nun ni bezonas trovi la minimuman unsorted elemento. 851 00:51:44,610 --> 00:51:49,480 Do ni diru 0 <5, tiel 0 estas mia nova minimumo. 852 00:51:49,480 --> 00:51:53,820 >> Sed mi ne povas halti tie, ĉar kvankam ni povas agnoski, ke 0 estas la plej malgranda, 853 00:51:53,820 --> 00:51:59,390 ni bezonas kuri tra ĉiu alia ero de la listo por certiĝi. 854 00:51:59,390 --> 00:52:01,760 Do 1 estas pli grandaj, 6 estas pli granda, 4 estas granda. 855 00:52:01,760 --> 00:52:05,850 Tio signifas, ke post rigardi ĉiujn tiujn elementojn, mi determinis 0 estas la plej malgranda. 856 00:52:05,850 --> 00:52:09,800 Do mi iros por interŝanĝi la 5 kaj la 0. 857 00:52:09,800 --> 00:52:15,480 Iam mi interŝanĝi ke, mi iros akiri novan liston, kaj mi scias ke mi neniam devas rigardi ke 0 denove 858 00:52:15,480 --> 00:52:19,380 ĉar unufoje mi interŝanĝis ĝin, mi ordo kaj ni faris. 859 00:52:19,380 --> 00:52:22,730 Nun nur tiel okazas, ke la blua elemento estas denove la 5, 860 00:52:22,730 --> 00:52:26,030 kaj ni bezonas rigardi la 1, la 6 kaj la 4 determini ke 1 861 00:52:26,030 --> 00:52:31,520 estas la plej malgranda minimuma elemento, do ni devos interŝanĝi la 1 kaj la 5. 862 00:52:31,520 --> 00:52:36,890 Denove, ni bezonas rigardi - kompari la 5 al la 6 kaj la 4, 863 00:52:36,890 --> 00:52:39,830 kaj ni tuj interŝanĝi la 4 kaj la 5, kaj fine, kompari 864 00:52:39,830 --> 00:52:45,740 tiuj 2 nombroj kaj interŝanĝi ilin ĝis ni atingos nian ordo listo. 865 00:52:45,740 --> 00:52:49,730 Demandojn sur selektado speco? 866 00:52:49,730 --> 00:52:56,420 Okay. Ni movi al la lasta temo ĉi tie, kaj tiu estas rekursio. 867 00:52:56,420 --> 00:52:59,810 >> Rekursio, memoru, estas ĉi vere meta afero kie funkcio 868 00:52:59,810 --> 00:53:02,740 ree nomas sin. 869 00:53:02,740 --> 00:53:05,620 Do en iu momento, dum nia fuction estas ree sin nomas, 870 00:53:05,620 --> 00:53:10,100 tie devas esti iu punkto en kiu ni haltas nomante nin mem. 871 00:53:10,100 --> 00:53:13,670 Ĉar se ni ne faros tion, tiam ni ĵus tuj daŭre fari tion por ĉiam, 872 00:53:13,670 --> 00:53:16,660 kaj nia programo estas simple ne tuj finiĝi. 873 00:53:16,660 --> 00:53:19,200 Ni nomas tiun ĉi kondiĉon la bazo kazo. 874 00:53:19,200 --> 00:53:22,570 Kaj la bazo kazo diras, anstataŭ nomi funkcio denove, 875 00:53:22,570 --> 00:53:25,330 Mi nur tuj revenos iun valoron. 876 00:53:25,330 --> 00:53:28,080 Do iam ni revenis valoro, ni haltis nomante nin, 877 00:53:28,080 --> 00:53:32,550 kaj la resto de la alvokoj ni faris ĝis nun ankaŭ povas reveni. 878 00:53:32,550 --> 00:53:36,050 La malo de la bazo kazo estas la rekursiaj kazo. 879 00:53:36,050 --> 00:53:39,050 Kaj jen estas, kiam ni volas fari alian alvokon al la funkcio kiun ni aktuale in 880 00:53:39,050 --> 00:53:44,690 Kaj ni probable, kvankam ne ĉiam, volas uzi malsamajn argumentojn. 881 00:53:44,690 --> 00:53:48,940 >> Do, se ni havas funkcion nomis f, kaj f ĵus nomis prenu 1 argumento, 882 00:53:48,940 --> 00:53:52,010 kaj ni simple observu nomante f (1), f (1), f (1), kaj ĝi nur tiel okazas ke 883 00:53:52,010 --> 00:53:56,510 la argumento 1 falas en rekursie kazo, ni ankoraŭ neniam tuj halti. 884 00:53:56,510 --> 00:54:01,620 Eĉ se ni havas bazon kazo, ni bezonas certigi ke eventuale ni iras por bati tiu bazo kazo. 885 00:54:01,620 --> 00:54:04,250 Ni ne nur konservi restante en ĉi rekursie kazo. 886 00:54:04,250 --> 00:54:09,870 Ĝenerale, kiam ni vokas nin, ni probable tuj havos malsamajn argumento ĉiufoje. 887 00:54:09,870 --> 00:54:12,700 Jen vere simpla rikura funkcio. 888 00:54:12,700 --> 00:54:15,090 Do tiu estos komputi la faktorialo de nombro. 889 00:54:15,090 --> 00:54:17,790 Supren top tie ni havas nian bazon kazo. 890 00:54:17,790 --> 00:54:22,330 En la kazo ke n ≤ 1, ni ne tuj voki faktorialo denove. 891 00:54:22,330 --> 00:54:26,490 Ni tuj halti; ni nur tuj revenos iun valoron. 892 00:54:26,490 --> 00:54:30,170 Se ĉi tio ne estas vera, tiam ni tuj batis nia rekursie kazo. 893 00:54:30,170 --> 00:54:33,550 Rimarku tie ni ne nur nomi faktorialo (n), ĉar tio ne estus tre utila. 894 00:54:33,550 --> 00:54:36,810 Ni tuj voki faktorialo de io alia. 895 00:54:36,810 --> 00:54:40,850 >> Kaj tial vi povas vidi, eventuale se ni pasi faktorialo (5) aŭ iu, 896 00:54:40,850 --> 00:54:45,900 ni iras por voki faktorialo (4) kaj tiel plu, kaj eventuale ni iras por bati tiun bazon kazo. 897 00:54:45,900 --> 00:54:51,730 Do tiu aspektas bone. Ni vidu kio okazas kiam ni efektive kuri ĉi. 898 00:54:51,730 --> 00:54:57,840 Ĉi tiu estas la pilo, kaj diru, ke ĉefa tuj nomas tiun funkcion kun argumento (4). 899 00:54:57,840 --> 00:55:02,200 Do iam faktorialo vidas kaj = 4, faktorialo nomos sin. 900 00:55:02,200 --> 00:55:05,010 Nun, subite, ni havas faktorialo (3). 901 00:55:05,010 --> 00:55:10,780 Do tiuj funkcioj tuj teni kreskantan ĝis fine ni batis nian bazon kazo. 902 00:55:10,780 --> 00:55:17,830 Je ĉi tiu punkto, la reveno valoro de ĉi tiu estas la reveno (nx la reveno valoro de ĉi tiu), 903 00:55:17,830 --> 00:55:21,290 la reveno valoron de tio estas nx la reveno valoro de ĉi. 904 00:55:21,290 --> 00:55:23,290 Eventuale ni bezonas bati iu nombro. 905 00:55:23,290 --> 00:55:26,560 Ĉe la supro tie, ni diru reveno 1. 906 00:55:26,560 --> 00:55:30,650 Tio signifas, ke iam ni revenos tiu numero, ni povas popo ĉi fronte al la pilo. 907 00:55:30,650 --> 00:55:36,570 Do ĉi faktorialo (1) estas farita. 908 00:55:36,570 --> 00:55:41,190 Kiam 1 revenas, ĉi faktorialo (1) revenas, ĉi tiu reveno al 1. 909 00:55:41,190 --> 00:55:46,910 La reveno valoro de tio, memoru, estis nx la reveno valoro de ĉi. 910 00:55:46,910 --> 00:55:50,720 Tiel subite, ĉi ulo scias ke mi volas reveni 2. 911 00:55:50,720 --> 00:55:55,910 >> Do memoru, revenu valoron de tio estas simple nx la reveno valoro ĝis ĉi tie. 912 00:55:55,910 --> 00:56:01,160 Do nun ni povas diri 3 x 2, kaj fine, jen ni povas diri 913 00:56:01,160 --> 00:56:04,010 ĉi tiu estas nur tuj estos 4 x 3 x 2. 914 00:56:04,010 --> 00:56:09,570 Kaj fojo ĉi revenas, ni preni malsupren al sola entjero ene de ĉefa. 915 00:56:09,570 --> 00:56:15,460 Demandojn sur rekursio? 916 00:56:15,460 --> 00:56:17,090 Bone. Do tie estas pli da tempo por demandoj al la fino, 917 00:56:17,090 --> 00:56:23,360 sed nun Jozef kovros la ceteraj temoj. 918 00:56:23,360 --> 00:56:25,590 >> [Jozef Ong] Bone. Do nun ni jam parolis pri recursions, 919 00:56:25,590 --> 00:56:27,840 ni parolu iomete pri kio kunfandi varo estas. 920 00:56:27,840 --> 00:56:31,740 Kunfandi varo estas esence alia formo de ordigi liston de nombroj. 921 00:56:31,740 --> 00:56:36,430 Kaj kiel ĝi funkcias estas, kun merge speco vi havas liston, kaj kion ni faras estas 922 00:56:36,430 --> 00:56:39,120 ni diras, ni fendi ĉi en 2 duonoj. 923 00:56:39,120 --> 00:56:42,750 Ni unue kuri kunfandi speco denove sur la maldekstra duono, 924 00:56:42,750 --> 00:56:45,040 tiam ni kuros kunfandi speco sur la dekstran duonon, 925 00:56:45,040 --> 00:56:50,240 kaj kiu donas al ni nun 2 duonoj kiuj ordo, kaj nun ni iras kombini tiujn duonoj kune. 926 00:56:50,240 --> 00:56:55,010 Estas iom malfacile por vidi sen ekzemplo, do ni iros tra la moviĝoj kaj vidu kio okazas. 927 00:56:55,010 --> 00:56:59,590 Do vi komencu per tiu listo, ni fendi ĝin en 2 duonoj. 928 00:56:59,590 --> 00:57:02,300 Ni kuras kunfandi speco en la maldekstra duono unua. 929 00:57:02,300 --> 00:57:06,660 Do jen la maldekstra duono, kaj nun ni kuras ilin tra tiu listo denove 930 00:57:06,660 --> 00:57:09,800 kiu prenas eniris merge varo, kaj poste ni rigardos, denove, 931 00:57:09,800 --> 00:57:13,270 ĉe la maldekstra flanko de ĉi tiu listo kaj ni kuras kunfandi speco sur ĝi. 932 00:57:13,270 --> 00:57:15,880 Nun, ni preni malsupren al listo de 2 nombroj, 933 00:57:15,880 --> 00:57:19,010 kaj nun la maldekstra duono estas nur 1 ero longa, kaj ni ne povas 934 00:57:19,010 --> 00:57:23,380 fendi liston tio nur 1 elemento en duono, do ni nur diros, iam ni havos 50, 935 00:57:23,380 --> 00:57:26,400 kiu estas nur 1 elemento, ĝi estas jam ordo. 936 00:57:26,400 --> 00:57:29,860 >> Iam ni faris kun tio, ni povas vidi, ke ni povas 937 00:57:29,860 --> 00:57:32,230 movi sur la dekstra duono de tiu listo, 938 00:57:32,230 --> 00:57:36,480 kaj 3 estas ankaŭ ordo, do nun, ke ambaŭ duonoj de ĉi tiu listo estas ordo 939 00:57:36,480 --> 00:57:39,080 ni povas aliĝi al tiuj nombroj reen kune. 940 00:57:39,080 --> 00:57:45,320 Do ni rigardu 50 kaj 3, 3 estas pli malgranda ol 50, do ĝi iras en unua kaj tiam 50 envenas 941 00:57:45,320 --> 00:57:49,340 Nun, ke tio faris, ni reiru al tiu listo kaj varo pravas duono. 942 00:57:49,340 --> 00:57:52,440 42 estas ĝia propra nombro, do ĝi estas jam ordo. 943 00:57:52,440 --> 00:57:57,850 Do nun ni komparas tiujn 2 kaj 3 estas pli malgranda ol 42, tiel ke gets metis en la komenco, 944 00:57:57,850 --> 00:58:02,340 nun 42 gets metis en, kaj 50 gets enmetita tien 945 00:58:02,340 --> 00:58:07,220 Nun, ke tio ordo, ni iru la tuta vojo reen al la supro, 1337 kaj 15. 946 00:58:07,220 --> 00:58:14,560 Nu, ni nun rigardu la maldekstra duono de ĉi tiu listo; 1337 estas per si mem tiel ĝi estas ordo kaj sama kun 15. 947 00:58:14,560 --> 00:58:19,020 Do nun ni kombini tiujn 2 numeroj ordigi tiu originala listo, 15 <1337, 948 00:58:19,020 --> 00:58:23,060 do ĝi iras en la komenco, tiam 1337 iras in 949 00:58:23,060 --> 00:58:26,640 Kaj nun ni ordo ambaŭ duonoj de la originala listo supren supro. 950 00:58:26,640 --> 00:58:30,440 Kaj ĉiuj ni devas fari estas kombini tiujn. 951 00:58:30,440 --> 00:58:36,890 Ni rigardu la unuaj 2 numerojn de ĉi tiu listo, 3 <15, do ĝi iras en la varo tabelo unua. 952 00:58:36,890 --> 00:58:44,460 15 <42, tia iras in Nun, 42 <1337, kiu iras in 953 00:58:44,460 --> 00:58:51,010 50 <1337, do ĝi iras in Kaj rimarki, ke ni simple prenis 2 numeroj ekstere de tiu listo. 954 00:58:51,010 --> 00:58:53,640 Do ni ne nur alternante inter la 2 listojn. 955 00:58:53,640 --> 00:58:56,050 Ni nur rigardante la komenco, kaj ni preni la elemento 956 00:58:56,050 --> 00:59:00,270 jen malgranda kaj tiam metante gxin en nia tabelo. 957 00:59:00,270 --> 00:59:04,080 Nun ni kuniĝis ĉiuj duonoj kaj ni faris. 958 00:59:04,080 --> 00:59:07,780 >> Demandojn pri kunfandi speco? Jes? 959 00:59:07,780 --> 00:59:14,190 [Studenta] Se estas dividi en malsamaj grupoj, kial ne simple dividas ĝin unufoje 960 00:59:14,190 --> 00:59:19,970 kaj vi havas 3 kaj 2 en grupo? [Resto de demando ininteligibles] 961 00:59:19,970 --> 00:59:24,940 La kialo - do la demando estas, kial ni ne nur kunfandi ilin en tiu unua paŝo post ni havas ilin? 962 00:59:24,940 --> 00:59:29,530 La kialo povas fari tion, komenci ĉe la maldekstra plej elementojn de ambaŭ flankoj, 963 00:59:29,530 --> 00:59:33,040 kaj poste prenu la plej malgranda kaj metis ĝin en, estas, ke ni scias, ke tiuj 964 00:59:33,040 --> 00:59:35,290 individuaj listoj en ordo ordonojn. 965 00:59:35,290 --> 00:59:37,290 Do, se mi rigardas la maldekstra plej elementojn de ambaŭ duonoj, 966 00:59:37,290 --> 00:59:40,490 Mi scias ili tuj estos la plej malgranda eroj de tiuj listoj. 967 00:59:40,490 --> 00:59:43,930 Do mi povas meti ilin en la plej malgranda ero makuloj de tiu granda listo. 968 00:59:43,930 --> 00:59:47,810 Aliflanke, se mi rigardas tiujn 2 lertaj en la dua nivelo tien, 969 00:59:47,810 --> 00:59:51,640 50, 3, 42, 1337 kaj 15, tiuj ne estas ordo. 970 00:59:51,640 --> 00:59:55,770 Do, se mi rigardas 50 kaj 1337, mi tuj metos 50 en mian liston unua. 971 00:59:55,770 --> 01:00:00,130 Sed tio ne vere havas sencon, ĉar 3 estas la plej malgranda ero de cxiuj el tiuj. 972 01:00:00,130 --> 01:00:04,390 Do la sola kialo ni povas fari ĉi kombinante paŝo estas ĉar nia lertaj jam ordo. 973 01:00:04,390 --> 01:00:07,010 Tial ni devas preni malsupren la tuta vojo al la fundo 974 01:00:07,010 --> 01:00:09,800 ĉar kiam ni havas nur unu nombro, vi scias ke sola nombro 975 01:00:09,800 --> 01:00:14,120 en kaj de sin jam ekzistas ordo listo. 976 01:00:14,120 --> 01:00:19,360 >> Demandojn? Ne? 977 01:00:19,360 --> 01:00:24,260 Komplekseco? Nu, vi povas vidi, ke ĉe ĉiu paŝo ekzistas fino nombroj, 978 01:00:24,260 --> 01:00:27,590 kaj ni povas dividi liston en duono logo n fojoj, 979 01:00:27,590 --> 01:00:31,700 kio estas kie ni atingos ĉi n × log n komplekseco. 980 01:00:31,700 --> 01:00:34,940 Kaj vi vidos la plej bona kazo por merge varo estas n logo n, kaj ĝi nur tiel pasas 981 01:00:34,940 --> 01:00:39,340 ke la plej malbona kazo, aŭ la Ω tie, estas ankaŭ n log n. 982 01:00:39,340 --> 01:00:42,480 Ion por teni en la menso. 983 01:00:42,480 --> 01:00:45,750 Movante en, ni iru antauxen al iuj super baza dosiero mi / O. 984 01:00:45,750 --> 01:00:48,830 Se vi rigardis Scramble, vi rimarkos ni havis ian sistemon 985 01:00:48,830 --> 01:00:51,270 kie vi povus skribi al log-dosiero, se vi legis tra la kodon. 986 01:00:51,270 --> 01:00:53,730 Ni vidos kiel vi eble fari tion. 987 01:00:53,730 --> 01:00:57,450 Nu, ni havas fprintf, kiun vi povas pensi pri kiel ĝuste printf, 988 01:00:57,450 --> 01:01:01,720 sed ĝuste presi al dosiero anstataŭ, kaj tie la f je la komenco. 989 01:01:01,720 --> 01:01:07,570 Tiu speco de kodo tien, kio faras estas, kiel vi eble vidis en Scramble, 990 01:01:07,570 --> 01:01:12,310 iras tra viaj 2-dimensia tabelo impreso el linion post linio, kion la nombroj estas. 991 01:01:12,310 --> 01:01:17,850 En ĉi tiu kazo, printf presas al viaj terminalo aŭ kion ni nomas la norma eligo de sekcio. 992 01:01:17,850 --> 01:01:22,170 >> Kaj nun, en ĉi tiu kazo, ĉiuj ni devas fari estas anstataŭi printf kun fprintf, 993 01:01:22,170 --> 01:01:26,770 sciigi kion dosiero kiun vi volas presi al, kaj en tiu kazo nur presas gxin al tiu dosiero 994 01:01:26,770 --> 01:01:32,230 anstataŭ presi gxin al via fina stacio. 995 01:01:32,230 --> 01:01:36,500 Nu, tiam tiu petegas la demando: Kie ni preni ĉi tia dosiero de, ĉu ne? 996 01:01:36,500 --> 01:01:39,840 Ni pasis ensaluti por ĉi fprintf fuction sed ni tute ne sciis kie venis. 997 01:01:39,840 --> 01:01:43,980 Nu, frue en la kodo, kion ni havis estis ĉi parton de kodo super ĉi tie, 998 01:01:43,980 --> 01:01:48,340 kiu esence diras ke malferma dosiero vokas log.txt. 999 01:01:48,340 --> 01:01:53,220 Kion ni faru post tio estas ni devas certigi ke la dosiero estas efektive malfermis sukcese. 1000 01:01:53,220 --> 01:01:57,070 Do eble malsukcesos por multnombraj kialoj; vi ne havas sufiĉan spacon en via komputilo, ekzemple. 1001 01:01:57,070 --> 01:01:59,790 Do ĝi estas ĉiam grava antaux vi faros neniun operacioj kun la dosiero 1002 01:01:59,790 --> 01:02:03,300 ke ni kontrolu ĉu tiu dosiero estis malfermita sukcese. 1003 01:02:03,300 --> 01:02:09,330 Do kio ke, jen argumento por fopen, nu, ni povas malfermi dosieron en multaj manieroj. 1004 01:02:09,330 --> 01:02:13,510 Kion ni povas fari estas, ni povas pasi ĝin w, kiu signifas nuligi la dosieron se eliroj jam, 1005 01:02:13,510 --> 01:02:18,070 Ni povas pasi al, kiu aldonas al la fino de la dosiero anstataŭ supera ĝin, 1006 01:02:18,070 --> 01:02:22,730 aŭ ni povas specifi r, kio signifas, ni malfermu la dosieron kiel nurlega. 1007 01:02:22,730 --> 01:02:24,890 Do se la programo provas fari ajnan ŝanĝojn al la dosiero, 1008 01:02:24,890 --> 01:02:30,140 krias al ili kaj ne lasu ilin fari tion. 1009 01:02:30,140 --> 01:02:33,320 Fine, iam ni faris kun la dosiero, farita fari operaciojn sur ĝi, 1010 01:02:33,320 --> 01:02:35,860 ni bezonas por certigi ni fermas la dosiero. 1011 01:02:35,860 --> 01:02:38,830 Kaj tial ĉe la fino de via programo, vi tuj pasi ilin denove 1012 01:02:38,830 --> 01:02:42,120 ĉi tiu dosiero, kiun vi malfermis, kaj ĝuste fermi ĝin. 1013 01:02:42,120 --> 01:02:44,650 Do ĉi tiu estas io grava, ke vi devas certigi vin fari. 1014 01:02:44,650 --> 01:02:47,180 Do memoras vi povas malfermi dosieron, tiam vi povas skribi al la dosiero, 1015 01:02:47,180 --> 01:02:51,270 fari operacioj en la dosiero, sed tiam vi devas fermi la dosieron ĉe la fino. 1016 01:02:51,270 --> 01:02:53,270 >> Demandojn pri la bazaj dosiero / S? Jes? 1017 01:02:53,270 --> 01:02:58,050 [Studenta demando, nekomprenebla] 1018 01:02:58,050 --> 01:03:02,480 Ĝuste ĉi tie. La demando estas, kiel tio ĉi log.txt dosiero aperos? 1019 01:03:02,480 --> 01:03:07,890 Nu, se vi simple donu log.txt, kredas ĝin en la sama dosierujo kiel la ruleblan. 1020 01:03:07,890 --> 01:03:10,500 Do se you're - >> [Studenta demando, nekomprenebla] 1021 01:03:10,500 --> 01:03:18,830 Jes. En la sama dosierujo, aŭ en la sama dosierujo, kiel vi nomas ĝin. 1022 01:03:18,830 --> 01:03:21,400 Nun memoro, stako, kaj amaso. 1023 01:03:21,400 --> 01:03:23,400 Do kiel estas memoro metitaj en la komputilo? 1024 01:03:23,400 --> 01:03:26,270 Nu, vi povas imagi memoro kiel speco de ĉi tiu bloko tie. 1025 01:03:26,270 --> 01:03:30,260 Kaj en memoro ni havas, kion nomas la havaĵon pusxis tien, kaj la pilo jen tie malsupre. 1026 01:03:30,260 --> 01:03:34,480 Kaj la amaso kreskas malsupren kaj la pilo kreskas supren. 1027 01:03:34,480 --> 01:03:38,620 Do kiel Tommy menciita - ho, nu, kaj ni havas ĉi tiujn aliaj 4 segmentoj kiujn mi ricevos por en dua - 1028 01:03:38,620 --> 01:03:42,890 Kiel Tommy diris antaŭe, vi scias, kiel liaj funkcioj nomas sin kaj nomas unu la alian? 1029 01:03:42,890 --> 01:03:44,930 Ili konstruos ĉi speco de pilo kadro. 1030 01:03:44,930 --> 01:03:47,360 Nu, se ĉefa alvokoj foo, foo gets surmetis la stako. 1031 01:03:47,360 --> 01:03:52,430 Foo nomas trinkejo, trinkejo akiri la surmetis la pilo, kaj ke gets surmetis la pilo poste. 1032 01:03:52,430 --> 01:03:57,040 Kaj dum ili revenas, ili ĉiu get demetis la stako. 1033 01:03:57,040 --> 01:04:00,140 Kion ĉiu el tiuj lokoj kaj memoro tenas? 1034 01:04:00,140 --> 01:04:03,110 Nu, la supro, kiu estas la teksto segmento, enhavas la programon mem. 1035 01:04:03,110 --> 01:04:06,390 Do la maŝino kodo, jen tie, kiam oni kompilas via programo. 1036 01:04:06,390 --> 01:04:08,520 Tuj poste, neniu inicializado tutmonda variabloj. 1037 01:04:08,520 --> 01:04:12,660 >> Do vi havas mallokajn variablojn en via programo, kaj vi diros kiel, a = 5, 1038 01:04:12,660 --> 01:04:15,260 ke gets metis en tiu segmento, kaj ĝuste sub tiu, 1039 01:04:15,260 --> 01:04:18,990 vi havas uninitialized tutmonda datumoj, kiuj estas simple int a, 1040 01:04:18,990 --> 01:04:20,990 sed vi ne diras ke estas egala al nenio. 1041 01:04:20,990 --> 01:04:23,870 Realigi tiuj estas tutmonda variabloj, do ili estas ekster ĉefa. 1042 01:04:23,870 --> 01:04:28,560 Do tio signifas ajna tutmonda variabloj kiuj estas deklaritaj, sed ne estas inicializado. 1043 01:04:28,560 --> 01:04:32,310 Do kio estas en la havaĵo? Memoro atribuitaj uzante malloc, kiun ni ricevos en en iomete. 1044 01:04:32,310 --> 01:04:35,990 Kaj fine, kun la pilo vi havas lokajn variablojn 1045 01:04:35,990 --> 01:04:39,950 kaj iu ajn funkciojn vi povus nomi en iu ajn el siaj parametroj. 1046 01:04:39,950 --> 01:04:43,720 La lasta afero, vi ne vere devas scii kion la medio variabloj fari, 1047 01:04:43,720 --> 01:04:46,700 sed kiam ajn vi kuros programo, estas iu asociita, kiel 1048 01:04:46,700 --> 01:04:49,550 ĉi tiu estas la salutnomo de la persono kiu kuris la programo. 1049 01:04:49,550 --> 01:04:51,550 Kaj tiu tuj estos speco de malsupre. 1050 01:04:51,550 --> 01:04:54,540 En terminoj de memoro adresojn, kiuj estas deksesuma valoroj, 1051 01:04:54,540 --> 01:04:58,170 la valoroj ĉe la supro komencas je 0, kaj ili iru la tuta vojo ĝis la fundo. 1052 01:04:58,170 --> 01:05:00,440 En ĉi tiu kazo, se vi estas en la 32-bita sistemo, 1053 01:05:00,440 --> 01:05:05,390 la adreso malsupre tuj estos 0x, sekvita de af, ĉar tio estas 32 bitoj, 1054 01:05:05,390 --> 01:05:10,890 kiu estas 8 bajtoj, kaj en ĉi tiu kazo 8 bajtoj respondas al 8 deksesumaj ciferoj. 1055 01:05:10,890 --> 01:05:20,110 Do ĉi tie vi havos, kiel, 0xffffff, kaj tie vi havos 0. 1056 01:05:20,110 --> 01:05:23,660 Do kio estas punteros? Kelkaj el vi eble ne estus kovrita tion en sekcio antaŭe. 1057 01:05:23,660 --> 01:05:26,660 sed ni ne transiru en konferenco, do puntero estas nur datumtipo 1058 01:05:26,660 --> 01:05:34,030 kiu tendencas, anstataŭ ia valoro kiel 50, stokas la adreso de iu loko en memoro. 1059 01:05:34,030 --> 01:05:36,020 Kiel tiu memoro [nekompreneblaj]. 1060 01:05:36,020 --> 01:05:41,120 Do ĉi-kaze, kion ni estas, ni havas puntero al entjero aŭ int *, 1061 01:05:41,120 --> 01:05:46,210 kaj ĝi enhavas tiun deksesuma adreso de 0xDEADBEEF. 1062 01:05:46,210 --> 01:05:50,880 >> Do kion ni havas estas, nun, ĉi puntero punktoj en iu loko en memoro, 1063 01:05:50,880 --> 01:05:56,020 kaj tio estas nur, la valoro 50 estas en ĉi tiu memoro loko. 1064 01:05:56,020 --> 01:06:01,810 Sur iuj 32-bita sistemoj, sur ĉiuj 32-bita sistemoj, punteros levu 32 bitoj aŭ 4 bitokoj. 1065 01:06:01,810 --> 01:06:06,020 Sed, ekzemple, sur 64-bita sistemo, punteros estas 64 bitoj. 1066 01:06:06,020 --> 01:06:08,040 Por ke io vi volas teni en la menso. 1067 01:06:08,040 --> 01:06:12,310 Ktp finon-bitoj, puntero estas fino bitoj longa. 1068 01:06:12,310 --> 01:06:17,320 Punteros estas ia malfacile digestas sen ekstra aĵoj, 1069 01:06:17,320 --> 01:06:20,300 do ni iru tra ekzemplo de dinamika memoro atribuo. 1070 01:06:20,300 --> 01:06:25,130 Kio dinamika memoro atribuo faras por vi, aŭ kion ni nomas malloc, 1071 01:06:25,130 --> 01:06:29,280 ĝi ebligas atribui ian datumoj ekster la aro. 1072 01:06:29,280 --> 01:06:31,830 Do tiu datumo estas ia pli permanenta por la daŭro de la programo. 1073 01:06:31,830 --> 01:06:36,430 Ĉar kiel vi scias, se vi rakontos x ene de funkcio, kaj tiu funkcio redonas, 1074 01:06:36,430 --> 01:06:40,910 vi jam ne havas aliron al la datumoj kiuj estis stokitaj en x. 1075 01:06:40,910 --> 01:06:44,420 Kio punteros ni faras estas ili ni stoki memoro aŭ vendejo valoroj 1076 01:06:44,420 --> 01:06:46,840 en malsama segmento de memoro, nome la amaso. 1077 01:06:46,840 --> 01:06:49,340 Nun unufoje ni revenos el funkcio, tiel longe, kiel ni havas puntero 1078 01:06:49,340 --> 01:06:54,960 al tiu loko en memoro, tiam kion ni povas fari estas ni povas simple rigardi la valoroj tie. 1079 01:06:54,960 --> 01:06:58,020 Ni rigardu ekzemplon: Ĉi tiu estas nia memoro aranĝo denove. 1080 01:06:58,020 --> 01:07:00,050 Kaj ni havas la saman funkcion, ĉefa. 1081 01:07:00,050 --> 01:07:06,870 Kion faras estas - estas bone, tiel simpla, ĉu ne? - Int x = 5, tio estas nur variablo en la pilo en ĉefa. 1082 01:07:06,870 --> 01:07:12,450 >> Aliflanke, ni nun deklari puntero kiu nomas la funkcion giveMeThreeInts. 1083 01:07:12,450 --> 01:07:16,800 Kaj tial nun ni iru en tiu funkcio kaj ni kreu novan pilon kadro por ĝi. 1084 01:07:16,800 --> 01:07:20,440 Tamen, en ĉi tiu pilo kadro, ni deklaras int * temp, 1085 01:07:20,440 --> 01:07:23,210 kiu en mallocs 3 entjeroj por ni. 1086 01:07:23,210 --> 01:07:25,880 Do grandeco de int donos al ni, kiom da bitokoj ĉi int estas, 1087 01:07:25,880 --> 01:07:29,620 kaj malloc donas al ni, ke multaj bajtoj de spaco sur la monteto. 1088 01:07:29,620 --> 01:07:32,890 Do ĉi-kaze, ni kreis sufiĉan spacon por 3 entjeroj, 1089 01:07:32,890 --> 01:07:36,830 kaj la amaso estas maniero tie supre, kio estas kial mi desegnis ĝin pli alte. 1090 01:07:36,830 --> 01:07:42,900 Iam ni faris, ni revenu ĉi tien, vi nur bezonas 3 ints revenis, 1091 01:07:42,900 --> 01:07:47,000 kaj denove la adreso, en ĉi tiu kazo super kie tiu memoro estas. 1092 01:07:47,000 --> 01:07:51,250 Kaj ni starigis pointer = ŝaltilon, kaj tie ni havas nur alia puntero. 1093 01:07:51,250 --> 01:07:54,550 Sed kion tiu funkcio redonas estas plata tie kaj malaperas. 1094 01:07:54,550 --> 01:07:59,250 Do temp malaperas, sed ni ankoraŭ subtenas la adreso de kie 1095 01:07:59,250 --> 01:08:01,850 tiuj 3 entjeroj estas ene de elektra reto. 1096 01:08:01,850 --> 01:08:06,180 Do en tiu aro, la punteros estas scoped loke por la plata kadro, 1097 01:08:06,180 --> 01:08:09,860 sed la memoro al kiu aludas estas en la havaĵo. 1098 01:08:09,860 --> 01:08:12,190 >> Ĉu tio havas sencon? 1099 01:08:12,190 --> 01:08:14,960 [Studenta] Ĉu vi povas ripeti tion? >> [Joseph] Jes. 1100 01:08:14,960 --> 01:08:20,270 Do se mi reiros malmulta, vi vidos ke temp asignitaj 1101 01:08:20,270 --> 01:08:23,500 iuj memoro sur la havaĵon tie supre. 1102 01:08:23,500 --> 01:08:28,680 Kaj post tiu funkcio, giveMeThreeInts revenas, ĉi pilo tie tuj malaperos. 1103 01:08:28,680 --> 01:08:35,819 Kaj per ĝi iun el la variabloj, en ĉi tiu kazo, ĉi puntero kiu atribuitaj en plata kadro. 1104 01:08:35,819 --> 01:08:39,649 Kiu tuj malaperas, sed kiam ni revenis temp 1105 01:08:39,649 --> 01:08:46,330 kaj ni starigis pointer = temp, pointer afero nun tuj notas la sama memoro de situo kiel temp estis. 1106 01:08:46,330 --> 01:08:50,370 Do nun, eĉ se ni perdos temp, ke lokaj pointer, 1107 01:08:50,370 --> 01:08:59,109 ni ankoraŭ konservas la memoron adreso de kio indikante ene de tiu variablo puntero. 1108 01:08:59,109 --> 01:09:03,740 Demandoj? Tio povas esti speco de konfuza temo, se vi ne estus transirinta en sekcio. 1109 01:09:03,740 --> 01:09:09,240 Ni povas, via TF definitive transiru ĝin kaj certe ni povas respondi demandojn 1110 01:09:09,240 --> 01:09:11,500 fine de la recenzo kunsido por ĉi tio. 1111 01:09:11,500 --> 01:09:14,220 Sed ĉi tiu estas speco de kompleksa temo, kaj mi havas pli ekzemploj kiuj tuj aperas 1112 01:09:14,220 --> 01:09:18,790 kiu helpos klarigi kion punteros reale estas. 1113 01:09:18,790 --> 01:09:22,500 >> En ĉi tiu kazo, punteros estas ekvivalentaj al arrays, 1114 01:09:22,500 --> 01:09:25,229 do mi povas simple uzi tiun puntero kiel la sama afero kiel int tabelo. 1115 01:09:25,229 --> 01:09:29,840 Do mi indeksado en 0, kaj ŝanĝi la unua entjero al 1, 1116 01:09:29,840 --> 01:09:39,689 ŝanĝi la dua entjera al 2, kaj la 3a entjero al 3. 1117 01:09:39,689 --> 01:09:44,210 Do pli en punteros. Nu, memoru Binky. 1118 01:09:44,210 --> 01:09:48,319 En ĉi tiu kazo ni destinis puntero, aŭ ni deklaris pointer, 1119 01:09:48,319 --> 01:09:52,760 sed komence, kiam mi ĵus deklarita pointer, ĝi ne indikante ie ajn en memoro. 1120 01:09:52,760 --> 01:09:54,930 Estas nur rubo valoroj ene de ĝi. 1121 01:09:54,930 --> 01:09:56,470 Do mi ne havas ideon kie ĉi puntero estas indikante. 1122 01:09:56,470 --> 01:10:01,630 Ĝi havas adreson kiu estas nur plenigita kun 0-aj kaj 1-oj kie estis komence deklaris. 1123 01:10:01,630 --> 01:10:04,810 Mi ne povas fari ion kun tiu ĝis mi nomas malloc sur ĝi 1124 01:10:04,810 --> 01:10:08,390 kaj tiam donas al mi iom spaco sur la havaĵon, kie mi povas meti valoroj ene. 1125 01:10:08,390 --> 01:10:11,980 Tiam denove, mi ne scias kio estas ene de ĉi memoro. 1126 01:10:11,980 --> 01:10:16,780 Do la unua afero Mi devas fari estas kontroli ĉu la sistemo havis sufiĉan memoron 1127 01:10:16,780 --> 01:10:20,850 doni al mi reen 1 entjero en la unua loko, kio estas kial mi faras ĉi kontroli. 1128 01:10:20,850 --> 01:10:25,020 Se puntero estas nula, tio signifas ke ĝi ne havas sufiĉan spacon aŭ iu alia eraro, 1129 01:10:25,020 --> 01:10:26,320 do mi devas eliri el mia programo. 1130 01:10:26,320 --> 01:10:29,400  Sed se ĝi faris sukcesos, mi nun povas uzi tiun puntero 1131 01:10:29,400 --> 01:10:35,020 kaj kion * puntero faras estas sekvas kie la adreso estas 1132 01:10:35,020 --> 01:10:38,480 al kie tiu valoro estas, kaj starigos ĝin egala al 1. 1133 01:10:38,480 --> 01:10:41,850 Do ĉi tie, ni kontrolas se tiu memoro ekzistis. 1134 01:10:41,850 --> 01:10:45,380 >> Iam vi scias ĝi ekzistas, vi povas meti en ĝin 1135 01:10:45,380 --> 01:10:50,460 kio valoro vi volas meti en ĝin; en ĉi tiu kazo 1. 1136 01:10:50,460 --> 01:10:53,060 Iam ni el tio, vi bezonas liberigi ke puntero 1137 01:10:53,060 --> 01:10:57,160 ĉar ni bezonas reiri al la sistemo kiu memoro kiun vi petis en la unua loko. 1138 01:10:57,160 --> 01:10:59,690 Ĉar la komputilo ne scias kiam ni el tio. 1139 01:10:59,690 --> 01:11:02,510 En ĉi tiu kazo ni eksplicite diri ĝin, bone, ni faris kun tiu memoro. 1140 01:11:02,510 --> 01:11:10,780 Se iu alia procezo bezonas ĝin, iu alia programo bezonas ĝin, bonvolu iri antaŭen kaj preni ĝin. 1141 01:11:10,780 --> 01:11:15,110 Kion ni povas ankaŭ fari estas ni povas nur atingi la adreson de lokaj variabloj en la aro. 1142 01:11:15,110 --> 01:11:19,080 Do int x estas interne la plata kadro de ĉefa. 1143 01:11:19,080 --> 01:11:23,060 Kaj kiam ni uzas-signo, oriento kaj operatoro, kio faras estas 1144 01:11:23,060 --> 01:11:27,310 prenas x, kaj x estas nur iuj datumoj en memoro, sed ĝi havas adreson. 1145 01:11:27,310 --> 01:11:33,790 Ĝi estas lokita ie. Do per voko & x, kio estas tiu faras estas ĝi donas al ni la adreson de x. 1146 01:11:33,790 --> 01:11:38,430 Por fari tion, ni faras puntero punkto al kie x estas en memoro. 1147 01:11:38,430 --> 01:11:41,710 Nun ni simple iu kiel * x, ni ricevos 5 dorso. 1148 01:11:41,710 --> 01:11:43,820 La stelo estas nomata dereferencing ĝin. 1149 01:11:43,820 --> 01:11:46,640 Vi sekvu la adreson kaj vi ricevos la valoron de tio stokita tie. 1150 01:11:51,000 --> 01:11:53,310 >> Demandojn? Jes? 1151 01:11:53,310 --> 01:11:56,500 [Studenta] Se vi ne faras la 3-pinta afero, ĉu tio ankoraŭ kompili? 1152 01:11:56,500 --> 01:11:59,490 Jes. Se vi ne faras la 3-puntero afero, ĝi estas ankoraŭ tuj kompili, 1153 01:11:59,490 --> 01:12:02,720 sed mi montros al vi kio okazas en dua, kaj sen fari tion, 1154 01:12:02,720 --> 01:12:04,860 tion ni nomas memoro fugo. Vi ne doni la sistemo 1155 01:12:04,860 --> 01:12:07,850 apogi lian memoron, do post momento la programo tuj amasigos 1156 01:12:07,850 --> 01:12:10,940 memoro kiun ĝi ne uzas, kaj nenio alia povas uzi ĝin. 1157 01:12:10,940 --> 01:12:15,750 Se vi iam vidis Firefox kun 1,5 milionoj kilobajtoj en via komputilo, 1158 01:12:15,750 --> 01:12:17,840 en la tasko direktisto, jen kio okazas. 1159 01:12:17,840 --> 01:12:20,760 Vi havas memoron fugo en la programo kiu ili ne manipulas. 1160 01:12:23,080 --> 01:12:26,240 Do kiel faras puntero aritmetiko laboro? 1161 01:12:26,240 --> 01:12:29,480 Nu, pointer aritmetiko estas ia kiel indeksado en tabelo. 1162 01:12:29,480 --> 01:12:36,370 En ĉi tiu kazo, mi havas pointer, kaj kion mi faras estas mi faras puntero punkton al la unua ero 1163 01:12:36,370 --> 01:12:42,100 de tiu tabelo de 3 entjeroj ke mi destinis. 1164 01:12:42,100 --> 01:12:46,670 Do nun tio, kion mi faru, stelo puntero nur ŝanĝas la unua ero en la listo. 1165 01:12:46,670 --> 01:12:49,140 Stelo puntero +1 points tie. 1166 01:12:49,140 --> 01:12:53,140 Do puntero estas tie, pointer +1 estas tie, pointer +2 estas super tie. 1167 01:12:53,140 --> 01:12:56,610 >> Do ĝuste aldonante 1 estas la sama afero kiel movanta laŭ tiu tabelo. 1168 01:12:56,610 --> 01:12:59,880 Kion ni faras estas, kiam ni faras puntero +1 vi ricevas la adreson ĉi tie, 1169 01:12:59,880 --> 01:13:04,180 kaj por ricevi la valoron en ĉi tie, vi metu stelon en de la tuta esprimo 1170 01:13:04,180 --> 01:13:05,990 al dereference ĝin. 1171 01:13:05,990 --> 01:13:09,940 Do, en tiu kazo, mi opcio la unua loko en ĉi tiu tabelo al 1, 1172 01:13:09,940 --> 01:13:13,970 dua loko al 2, kaj tria loko al 3. 1173 01:13:13,970 --> 01:13:18,180 Tiam kion mi faras sur jen Mi presi nian puntero +1, 1174 01:13:18,180 --> 01:13:19,970 kiu nur donas al mi 2. 1175 01:13:19,970 --> 01:13:23,650 Nun mi pliigante pointer, do puntero egalas puntero +1, 1176 01:13:23,650 --> 01:13:26,780 kiu movas ĝin antaŭen. 1177 01:13:26,780 --> 01:13:30,810 Kaj tial nun, se mi presi puntero +1, +1 puntero nun 3, 1178 01:13:30,810 --> 01:13:33,990 kiu en ĉi tiu kazo presas el 3. 1179 01:13:33,990 --> 01:13:36,560 Kaj por liberigi iun, la puntero ke mi donu ĝin 1180 01:13:36,560 --> 01:13:40,540 devas esti montrante al la komenco de la tabelo kiun mi reiris de malloc. 1181 01:13:40,540 --> 01:13:43,430 Do, en ĉi tiu kazo, se mi estus nomi 3 dekstra tie, ĉi tiu ne estus bone, 1182 01:13:43,430 --> 01:13:45,070 ĉar ĝi estas en la mezo de la tabelo. 1183 01:13:45,070 --> 01:13:48,820 Mi devas subtrahi por atingi la originalan situo 1184 01:13:48,820 --> 01:13:50,420 la komenca unua loko antaŭ ol mi povos liberigi ĝin. 1185 01:13:56,300 --> 01:13:58,450 Do, jen pli implikitaj ekzemplo. 1186 01:13:58,450 --> 01:14:03,360 En ĉi tiu kazo, ni atribui 7 gravuloj en karaktero tabelo. 1187 01:14:03,360 --> 01:14:06,480 >> Kaj en ĉi tiu kazo kion ni faras estas ni looping super la unuaj 6 el ili, 1188 01:14:06,480 --> 01:14:09,900 kaj ni opcio ilin al Z. 1189 01:14:09,900 --> 01:14:13,350 Do, por int i = 0, i> 6, i + +, 1190 01:14:13,350 --> 01:14:16,220 Do, pointer + i estos nur al ni, en ĉi tiu kazo, 1191 01:14:16,220 --> 01:14:20,860 pointer, pointer +1, pointer +2, +3 pointer, kaj tiel plu kaj tiel plu en la ciklo. 1192 01:14:20,860 --> 01:14:24,040 Kio okazas fari estas alvenas tiu adreso, dereferences ĝin akiri la valoron, 1193 01:14:24,040 --> 01:14:27,440 kaj ŝanĝoj kiuj valoron al Z. 1194 01:14:27,440 --> 01:14:30,350 Tiam fine memori ĉi estas ĉeno, ĉu ne? 1195 01:14:30,350 --> 01:14:33,560 Ĉiuj kordoj devas finiĝi per la nula finanta karaktero. 1196 01:14:33,560 --> 01:14:38,620 Do, kion mi faras estas en montrilo 6 Mi metis la nula Terminator karaktero in 1197 01:14:38,620 --> 01:14:43,980 Kaj nun kion mi esence fari super tie apliki printf por kordoj, ĉu ne? 1198 01:14:43,980 --> 01:14:46,190 >> Do, kiam tio printf nun kiam ĝi atingis la finon de ĉeno? 1199 01:14:46,190 --> 01:14:48,230 Kiam batas la nula finanta karaktero. 1200 01:14:48,230 --> 01:14:52,030 Do, en tiu kazo, mia originala puntero punktoj al la komenco de ĉi tabelo. 1201 01:14:52,030 --> 01:14:56,410 Mi presis la unuan karakteron eksteren. Mi movi ĝin super unu. 1202 01:14:56,410 --> 01:14:58,420 Mi presi tiu karaktero eksteren. Mi movi ĝin. 1203 01:14:58,420 --> 01:15:02,180 Kaj mi konservos fari ĉi ĝis mi atingis la finon. 1204 01:15:02,180 --> 01:15:07,750 Kaj nun la fino * puntero volo dereference ĉi kaj akiri la nula finanta karaktero dorso. 1205 01:15:07,750 --> 01:15:11,780 Kaj tial mia dum buklo kuras nur kiam tiu valoro ne estas la nula finanta karaktero. 1206 01:15:11,780 --> 01:15:13,770 Do, nun mi eliri el ĉi tiu ciklo. 1207 01:15:18,780 --> 01:15:21,180 Kaj tial, se mi subtrahi 6 de ĉi pointer, 1208 01:15:21,180 --> 01:15:22,860 Mi reiros tuta vojo al la komenco. 1209 01:15:22,860 --> 01:15:27,880 Memoru, mi faras ĉi tion ĉar mi devas iri al la komenco por liberigi ĝin. 1210 01:15:27,880 --> 01:15:30,270 >> Do, mi scias, ke estis tre. Ĉu estas demandoj? 1211 01:15:30,270 --> 01:15:31,870 Bonvolu, jes? 1212 01:15:31,870 --> 01:15:36,610 [Studenta demando ininteligibles] 1213 01:15:36,610 --> 01:15:38,190 Ĉu vi povas diri ke pli laŭte? Pardonu. 1214 01:15:38,190 --> 01:15:44,140 [Studenta] Sur la lasta slide ĝuste antaŭ vi liberigis la puntero, 1215 01:15:44,140 --> 01:15:47,300 kie vi estis efektive ŝanĝanta la valoro de la puntero? 1216 01:15:47,300 --> 01:15:50,370 [Joseph] Do, ĉi tie. >> [Studenta] Ho, bone. 1217 01:15:50,370 --> 01:15:51,890 [Joseph] Do, mi havas puntero minus minus, dekstra, 1218 01:15:51,890 --> 01:15:54,140 kiu movas la afero reen, kaj tiam mi liberigi ĝin, 1219 01:15:54,140 --> 01:15:57,000 ĉar ĉi puntero devas indikis la komencon de la tabelo. 1220 01:15:57,000 --> 01:16:00,420 [Studenta] Sed tio ne estus necesa estis vi haltis post tiu linio. 1221 01:16:00,420 --> 01:16:03,130 [Joseph] Do, se mi ĉesis post ĉi tio, ĉi tiu devus esti konsiderata memoro fugo, 1222 01:16:03,130 --> 01:16:04,810 ĉar mi ne ruli la libera. 1223 01:16:04,810 --> 01:16:11,290 [Studenta] I [nekompreneblaj] post la unuaj tri linioj kie vi havis puntero +1 [nekompreneblaj]. 1224 01:16:11,290 --> 01:16:13,140 [Joseph] Uh-huh. Do, kio estas la demando tie? 1225 01:16:13,140 --> 01:16:14,780 Pardonu. Ne, ne. Iru, iru, bonvolu. 1226 01:16:14,780 --> 01:16:16,870 [Studenta] Do, vi ne ŝanĝi la valoron de punteros. 1227 01:16:16,870 --> 01:16:19,130 Vi ne devis fari puntero minus minus. 1228 01:16:19,130 --> 01:16:19,730 [Joseph] Jes, ĝuste. 1229 01:16:19,730 --> 01:16:21,890 Do, kiam mi faras puntero +1 kaj puntero +2, 1230 01:16:21,890 --> 01:16:24,410 Mi ne faras puntero egalas puntero +1. 1231 01:16:24,410 --> 01:16:27,260 Do, la puntero nur restas montrante al la komenco de la tabelo. 1232 01:16:27,260 --> 01:16:31,460 Estas nur kiam mi faras pli pli ke ĝi fiksas la valoron reen interne de la puntero, 1233 01:16:31,460 --> 01:16:33,550 ke ĝi efektive movas ĉi kune. 1234 01:16:36,860 --> 01:16:37,780 Bone. 1235 01:16:40,550 --> 01:16:42,030 Pli demandoj? 1236 01:16:44,680 --> 01:16:47,790 >> Denove, se ĉi tiu estas speco de blindiga, ĉi estos kovrita en kunsido. 1237 01:16:47,790 --> 01:16:50,710 Demandu vian instruadon ulo pri tio, kaj ni povas respondi demandojn je la fino. 1238 01:16:53,510 --> 01:16:56,600 Kaj kutime ni ne ŝatas fari tion minus afero. 1239 01:16:56,600 --> 01:16:59,760 Tiu devas postuli min konservanta trako de kiom mi ofseto en la tabelo. 1240 01:16:59,760 --> 01:17:04,520 Do, ĝenerale, ĉi tiu estas nur por klarigi kiel puntero aritmetiko verkoj. 1241 01:17:04,520 --> 01:17:07,970 Sed kion ni kutime deziras fari estas ni ŝatas krei kopion de la puntero, 1242 01:17:07,970 --> 01:17:11,640 kaj tiam ni uzas tiun kopion kiam ni movi ĉirkaŭ en la kordo. 1243 01:17:11,640 --> 01:17:14,660 Do, en tiuj kazo vi uzas la kopio por presi la tutan ĉenon, 1244 01:17:14,660 --> 01:17:19,040 sed ni ne devas fari kiel puntero minus 6 aŭ konservi trako de kiom ni kopiis en tio, 1245 01:17:19,040 --> 01:17:22,700 nur ĉar ni scias ke nia originala punkto ankoraŭ montris la komenco de la listo 1246 01:17:22,700 --> 01:17:25,340 kaj cxio, kion ni ŝanĝita estis ĉi kopio. 1247 01:17:25,340 --> 01:17:28,250 Do, ĝenerale, aliigi kopiojn de via originala puntero. 1248 01:17:28,250 --> 01:17:32,350 Ne provu ordigi de kiel - ne batu ŝanĝi originalojn. 1249 01:17:32,350 --> 01:17:35,290 Provante ŝanĝi nur kopiojn de via originala. 1250 01:17:41,540 --> 01:17:44,870 Do, vi rimarkos, kiam ni pasas la kordo en printf 1251 01:17:44,870 --> 01:17:48,990 vi ne devas meti stelon antaŭ ĝi kiel ni faris kun ĉiuj aliaj dereferences, ĉu ne? 1252 01:17:48,990 --> 01:17:54,180 Do, se vi presi la tutan ĉenon% s atendas estas adreso, 1253 01:17:54,180 --> 01:17:57,610 kaj en ĉi tiu kazo puntero aŭ en ĉi tiu kazo kiel aron da karakteroj. 1254 01:17:57,610 --> 01:18:00,330 >> Karakterojn, char * s, kaj tabeloj estas la sama afero. 1255 01:18:00,330 --> 01:18:03,690 Pointer estas signoj, kaj karaktero tabeloj estas la sama afero. 1256 01:18:03,690 --> 01:18:05,720 Kaj tiel, ĉiuj ni devas fari estas pasi en puntero. 1257 01:18:05,720 --> 01:18:08,150 Ni ne devas pasi en kiel * puntero aŭ io kiel tio. 1258 01:18:13,110 --> 01:18:14,930 Do, tabeloj kaj punteros estas la sama afero. 1259 01:18:14,930 --> 01:18:19,160 Kiam vi faras iun kiel x [y] super tie por tabelo, 1260 01:18:19,160 --> 01:18:21,960 kio ĝi estas fari sub la kapuĉo estas ĝi estas jene bone, estas karaktero tabelo, 1261 01:18:21,960 --> 01:18:23,690 do ĝi estas puntero. 1262 01:18:23,690 --> 01:18:26,510 Kaj tiel x estas la sama afero, 1263 01:18:26,510 --> 01:18:28,650 kaj tiel kion faras estas aldonas y al x, 1264 01:18:28,650 --> 01:18:31,820 kiu estas la sama afero kiel movanta antaŭen en memoro ke multe. 1265 01:18:31,820 --> 01:18:34,930 Kaj nun x + y donas al ni ian adreson, 1266 01:18:34,930 --> 01:18:37,570 kaj ni dereference la adreso aŭ sekvu la sagon 1267 01:18:37,570 --> 01:18:41,640 al kie tiu loko en memoro estas kaj ni preni la valoron el tiu loko en memoro. 1268 01:18:41,640 --> 01:18:43,720 Do, tiel tiuj du estas ekzakte la sama afero. 1269 01:18:43,720 --> 01:18:45,840 Estas nur sintaksa sukero. 1270 01:18:45,840 --> 01:18:48,090 Ili faras la samon. Ili estas nur malsamaj syntactics por ĉiu alia. 1271 01:18:51,500 --> 01:18:57,590 >> Do, kio povas iri malbone kun indikoj? Kiel, tre. Okay. Do, malbona aĵoj. 1272 01:18:57,590 --> 01:19:02,410 Kelkaj malbonaj aĵoj vi povas fari ne kontrolanta se via malloc alvoko revenas nula, ĉu ne? 1273 01:19:02,410 --> 01:19:06,560 En ĉi tiu kazo, mi petas la sistemo por doni al mi - kio estas tiu numero? 1274 01:19:06,560 --> 01:19:11,200 Kiel 2 miliardoj fojoj 4, ĉar la grandeco de entjero estas 4 bitokoj. 1275 01:19:11,200 --> 01:19:13,810 Mi petas tion kiel la 8 miliardoj bajtoj. 1276 01:19:13,810 --> 01:19:17,270 Kompreneble mia komputilo ne tuj povos doni al mi ke multe memoro dorso. 1277 01:19:17,270 --> 01:19:20,960 Kaj ni ne kontrolu se ĉi tiu estas nula, do kiam ni provas dereference ĝin tie - 1278 01:19:20,960 --> 01:19:24,270 sekvi la sago al kie tuj - ni ne havas tiun memoron. 1279 01:19:24,270 --> 01:19:27,150 Jen kion ni nomas dereferencing nula puntero. 1280 01:19:27,150 --> 01:19:29,710 Kaj ĉi esence faligas vin segfault. 1281 01:19:29,710 --> 01:19:31,790 Tiu estas unu el la manieroj vi povas segfault. 1282 01:19:34,090 --> 01:19:38,090 Aliaj malbonaj aĵoj vi povas fari - ho bone. 1283 01:19:38,090 --> 01:19:40,650 Tio estis dereferencing nula puntero. Okay. 1284 01:19:40,650 --> 01:19:45,160 Aliaj malbonaj aĵoj - nu, fiksi, ke vi simple metas ĉekon tien 1285 01:19:45,160 --> 01:19:46,980 ke kontrolas ĉu la puntero estas nula 1286 01:19:46,980 --> 01:19:51,000 kaj eliri el la programo se ĝi okazas ke malloc revenas nula puntero. 1287 01:19:55,110 --> 01:19:59,850 Tio estas la xkcd komika. Homoj komprenas ĝin nun. Ordigi de. 1288 01:20:06,120 --> 01:20:09,350 >> Do, memoro. Kaj mi iris sur ĉi. 1289 01:20:09,350 --> 01:20:12,000 Ni alvokas malloc en buklo, sed ĉiufoje ni nomas malloc 1290 01:20:12,000 --> 01:20:14,370 ni perdas spuro de kie ĉi tiu puntero estas indikante, 1291 01:20:14,370 --> 01:20:15,750 ĉar ni clobbering ĝin. 1292 01:20:15,750 --> 01:20:18,410 Do, la komenca alvokon al malloc donas al mi memoron pri tie. 1293 01:20:18,410 --> 01:20:19,990 Mia puntero punteros al ĉi tio. 1294 01:20:19,990 --> 01:20:23,020 Nun, mi ne liberigi ĝin, do nun mi vokas malloc denove. 1295 01:20:23,020 --> 01:20:26,070 Nun notas super tie. Nun mia memoro notas super tie. 1296 01:20:26,070 --> 01:20:27,640 Atentigante pri tie. Atentigante pri tie. 1297 01:20:27,640 --> 01:20:31,820 Sed mi miskalkulis la adresoj de la tuta memoro super tie ke mi destinis. 1298 01:20:31,820 --> 01:20:35,100 Kaj tial mi nun ne havas referencon ilin plu. 1299 01:20:35,100 --> 01:20:37,230 Do, mi ne povas liberigi ilin ekster tiu ciklo. 1300 01:20:37,230 --> 01:20:39,390 Kaj tiel por fiksi ion kiel ĉi tiu, 1301 01:20:39,390 --> 01:20:42,250 se vi forgesu libera memoro kaj vi ricevos tiun memoron fugo, 1302 01:20:42,250 --> 01:20:45,810 Vi devas liberigi la memoron ene de ĉi buklo iam vi el tio. 1303 01:20:45,810 --> 01:20:51,400 Nu, jen kio okazas. Mi scias multe pri vi malamas ĉi. 1304 01:20:51,400 --> 01:20:55,270 Sed nun - yay! Vi ricevas kiel 44.000 kilobajtoj. 1305 01:20:55,270 --> 01:20:57,110 Do, vi liberigi ĝin ĉe la fino de la ciklo, 1306 01:20:57,110 --> 01:20:59,770 kaj ke tuj ĝuste liberigi la memoron ĉiufoje. 1307 01:20:59,770 --> 01:21:03,620 Esence, via programo ne havas memoron fugo plu. 1308 01:21:03,620 --> 01:21:08,150 >> Kaj nun io alia vi povas fari estas liberigi iun memoro kiun vi petis dufoje. 1309 01:21:08,150 --> 01:21:11,060 En ĉi tiu kazo, vi malloc ion, vi ŝanĝu ĝian valoron. 1310 01:21:11,060 --> 01:21:13,140 Vi liberigi ĝin iam ĉar vi diris ke vi estis faritaj per ĝi. 1311 01:21:13,140 --> 01:21:14,940 Sed tiam ni liberigis ĝin denove. 1312 01:21:14,940 --> 01:21:16,730 Tio estas iu kiu estas sufiĉe malbona. 1313 01:21:16,730 --> 01:21:18,820 Oni ne tuj komence segfault, 1314 01:21:18,820 --> 01:21:23,350 sed post momento kion ĉi tio estas duobla liberigante ĉi koruptas vian amaso strukturo, 1315 01:21:23,350 --> 01:21:27,200 kaj vi lernos iom pli pri ĉi tio se vi elektos preni klaso kiel CS61. 1316 01:21:27,200 --> 01:21:30,000 Sed esence post momento via komputilo tuj get konfuzita 1317 01:21:30,000 --> 01:21:33,010 pri kio memoro lokoj estas kie kaj kie ĝi estas stokita - 1318 01:21:33,010 --> 01:21:34,800 kie datumoj stokitaj en memoro. 1319 01:21:34,800 --> 01:21:38,080 Kaj tiel liberigante puntero dufoje estas malbona afero, kiun vi ne volas fari. 1320 01:21:38,080 --> 01:21:41,600 >> Aliajn aĵojn kiuj povas iri malbone ne uzante sizeof. 1321 01:21:41,600 --> 01:21:44,460 Do, en tiu kazo vi malloc 8 bajtoj, 1322 01:21:44,460 --> 01:21:46,700 kaj tio estas la sama afero kiel du entjeroj, ĉu ne? 1323 01:21:46,700 --> 01:21:49,580 Do, jen perfekte sekura, sed estas ĝi? 1324 01:21:49,580 --> 01:21:52,160 Nu, kiel Lucas parolis pri diversaj arkitekturoj, 1325 01:21:52,160 --> 01:21:54,220 entjeroj estas de malsamaj longoj. 1326 01:21:54,220 --> 01:21:57,970 Do, en la aparaton kiun vi uzas, entjeroj estas proksimume 4 bajtoj, 1327 01:21:57,970 --> 01:22:02,370 sed sur iu alia sistemo ili estu 8 bajtoj aŭ ili povus esti 16 bajtoj. 1328 01:22:02,370 --> 01:22:05,680 Do, se mi nur uzas tiun numeron sur ĉi tie, 1329 01:22:05,680 --> 01:22:07,310 tiu programo povus labori en la aparaton, 1330 01:22:07,310 --> 01:22:10,360 sed ne iras destini sufiĉan memoron pri kelkaj aliaj sistemo. 1331 01:22:10,360 --> 01:22:14,020 En ĉi tiu kazo, ĉi tio estas kion la sizeof operatoro estas uzata por. 1332 01:22:14,020 --> 01:22:16,880 Kiam ni nomas sizeof (int), kio estas tiu faras estas 1333 01:22:16,880 --> 01:22:21,910  ĝi donas al ni la grandeco de entjero en la sistemo, ke la programo kuras. 1334 01:22:21,910 --> 01:22:25,490 Do, en ĉi tiu kazo, sizeof (int) revenos 4 en iun kiel la aparaton, 1335 01:22:25,490 --> 01:22:29,980 kaj nun tiu volo 4 * 2, kiu estas 8, 1336 01:22:29,980 --> 01:22:32,330 kio estas ĝuste la sumo de spaco necesa por du entjeroj. 1337 01:22:32,330 --> 01:22:36,710 Sur malsama sistemo, se int estas kiel 16 bitokoj aŭ 8 bajtoj, 1338 01:22:36,710 --> 01:22:39,380 ĝi estas ĵus tuj revenos sufiĉe bitokoj stoki tiu kvanto. 1339 01:22:41,830 --> 01:22:45,310 >> Kaj fine, structs. 1340 01:22:45,310 --> 01:22:48,340 Do, se vi volas stoki Sudoku tabulo en memoro, kiom eble ni faru tion? 1341 01:22:48,340 --> 01:22:51,570 Vi povus pensi kiel variablo por la unua afero, 1342 01:22:51,570 --> 01:22:53,820 variablo por la dua afero, variablo por la tria afero, 1343 01:22:53,820 --> 01:22:56,420 variablo por la kvara afero - malbona, ĉu? 1344 01:22:56,420 --> 01:23:00,750 Do, unu plibonigo vi povas fari supre sur ĉi estas fari 9 x 9 tabelo. 1345 01:23:00,750 --> 01:23:04,480 Ke estas bone, sed kio se vi volas asociigi aliaj aĵoj kun la Sudoku tabulo 1346 01:23:04,480 --> 01:23:06,490 ŝati kion la malfacileco de la tabulo estas, 1347 01:23:06,490 --> 01:23:11,740 aŭ, ekzemple, kion via partituro estas, aŭ kiom da tempo ĝi estos prenita vin solvi ĉi tiu forumaro? 1348 01:23:11,740 --> 01:23:14,970 Nu, kion vi povas fari estas vi povas krei struct. 1349 01:23:14,970 --> 01:23:18,910 Kion mi esence dirante estas mi difinanta tiu strukturo super ĉi tie, 1350 01:23:18,910 --> 01:23:23,230 kaj mi difinanta Sudoku tabulo kiu konsistas de tabulo kiu estas 9 x 9. 1351 01:23:23,230 --> 01:23:26,650 >> Kaj kion ĝi havas ĝin havas punteros al la nomo de la nivelo. 1352 01:23:26,650 --> 01:23:30,730 Ĝi ankaŭ havas x kaj y, kiuj estas la koordinatoj de kie mi estas nun. 1353 01:23:30,730 --> 01:23:35,980 Ĝi ankaŭ tempo dediĉita [nekompreneblaj], kaj ĝi havas la tuta nombro de movoj mi inputted ĝis nun. 1354 01:23:35,980 --> 01:23:40,010 Kaj tiel en tiu ĉi kazo, mi povas kolekti tutan faskon da datumoj en nur unu strukturo 1355 01:23:40,010 --> 01:23:42,790 anstataŭ havi ĝin kiel flugante ĉirkaŭ en kiel malsamaj variabloj 1356 01:23:42,790 --> 01:23:44,540 ke mi ne povas vere kontroli kiu faras. 1357 01:23:44,540 --> 01:23:49,720 Kaj tion permesas al ni havas nur belaj sintakson por ia referenco malsamaj aĵoj interne de ĉi struct. 1358 01:23:49,720 --> 01:23:53,430 Mi povas nur fari board.board, kaj mi alvenas la Sudoku tabulo dorso. 1359 01:23:53,430 --> 01:23:56,320 Board.level, mi alvenas kiel malmola estas. 1360 01:23:56,320 --> 01:24:00,540 Board.x kaj board.y donu al mi la koordinatoj de kie mi povus esti en la estraro. 1361 01:24:00,540 --> 01:24:04,730 Kaj tiel mi konsentas kion ni nomas kampojn en la struct. 1362 01:24:04,730 --> 01:24:08,840 Ĉi tiu difinas sudokuBoard, kiu estas tipo, kiun mi havas. 1363 01:24:08,840 --> 01:24:14,800 Kaj nun ni estas ĉi tie. Mi havas variablo nomita "estraro" de tipo sudokuBoard. 1364 01:24:14,800 --> 01:24:18,820 Kaj tial mi nun povas aliri ĉiujn kampojn kiuj konsistigas tiun strukturon super tie. 1365 01:24:20,830 --> 01:24:22,450 >> Demandojn pri structs? Jes? 1366 01:24:22,450 --> 01:24:25,890 [Studenta] Por int x, y, vi deklaris ambaŭ en unu linio? >> [Joseph] Uh-huh. 1367 01:24:25,890 --> 01:24:27,400 [Studenta] Do, vi povus simple fari tion kun ĉiuj el ili? 1368 01:24:27,400 --> 01:24:31,200 Kiel en x, y komo fojoj ke entute? 1369 01:24:31,200 --> 01:24:34,460 [Joseph] Jes, vi povus definitive fari tion, sed la kialo mi metis x kaj y en la sama linio - 1370 01:24:34,460 --> 01:24:36,330 kaj la demando estas kial ni povas nur fari tion en la sama linio? 1371 01:24:36,330 --> 01:24:38,600 Kial ni ne simple metu ĉiuj tiuj sur la sama linio estas 1372 01:24:38,600 --> 01:24:42,090 x kaj y estas rilatanta al ĉiu alia, 1373 01:24:42,090 --> 01:24:44,780 kaj ĉi tiu estas nur stile pli ĝentila, iusence, 1374 01:24:44,780 --> 01:24:46,600 ĉar ĝi estas kolektante du aferoj en la sama linio 1375 01:24:46,600 --> 01:24:49,340 kiu kiel ia rilatas al la sama afero. 1376 01:24:49,340 --> 01:24:51,440 Kaj mi nur fendi tiuj aparte. Estas nur stilo afero. 1377 01:24:51,440 --> 01:24:53,720 Ĝi funkcie faras ne diferenco kion. 1378 01:24:58,150 --> 01:24:59,270 Ajna alia demandojn sur structs? 1379 01:25:03,030 --> 01:25:06,620 Vi povas difini Pokédex kun struct. 1380 01:25:06,620 --> 01:25:11,720 Al Pokémon havas numeron kaj ĝi havas literon, posedanto, tipo. 1381 01:25:11,720 --> 01:25:16,990 Kaj tiam se vi havas tabelo de Pokémon, vi povas konsistigas Pokédex, ĉu ne? 1382 01:25:16,990 --> 01:25:20,810 Konsentite, cool. Do, la demandoj sur structs. Tiuj estas rilataj al structs. 1383 01:25:20,810 --> 01:25:25,270 >> Fine, GDB. Kion GDB lasu vin fari? Ĝi permesas elpurigi via programo. 1384 01:25:25,270 --> 01:25:27,650 Kaj se vi ne uzas GDB, mi rekomendas rigardi la mallonga 1385 01:25:27,650 --> 01:25:31,250 kaj nur irante super kio GDB estas, kiel vi laboras kun ĝi, kiel vi povus uzi ĝin, 1386 01:25:31,250 --> 01:25:32,900 kaj provi ĝin sur programo. 1387 01:25:32,900 --> 01:25:37,400 Kaj tiel kion GDB permesas fari estas tio lasas paŭzo la [nekompreneblaj] vian programon 1388 01:25:37,400 --> 01:25:38,920 kaj praktika linio. 1389 01:25:38,920 --> 01:25:42,600 Ekzemple, mi volas paŭzi ekzekuto ĉe kiel linio 3 de mia programo, 1390 01:25:42,600 --> 01:25:46,010 kaj kiam mi estas en la linio 3 Mi povas presi ĉiujn valorojn kiuj estas tie. 1391 01:25:46,010 --> 01:25:49,710 Kaj tiel kion ni nomas kiel deteni en linio 1392 01:25:49,710 --> 01:25:52,350 estas ni nomas tion metante Haltpunkto en tiu linio 1393 01:25:52,350 --> 01:25:55,920 kaj poste ni povas presi la variabloj ĉe la stato de la programo en tiu tempo. 1394 01:25:55,920 --> 01:25:58,990 >> Ni povas tiam el tie treti tra la programo linio-per-linio. 1395 01:25:58,990 --> 01:26:03,200 Kaj tiam ni povas rigardi la stato de la pilo de la epoko. 1396 01:26:03,200 --> 01:26:08,600 Kaj tiel en ordo uzi GDB, kion ni faras estas ni nomas clang sur la C-dosiero, 1397 01:26:08,600 --> 01:26:11,290 sed ni devas pasi ĝin la-ggdb flago. 1398 01:26:11,290 --> 01:26:15,850 Kaj unufoje ni faris kun ni nur kuri gdb en la rezultanta eliro dosiero. 1399 01:26:15,850 --> 01:26:18,810 Kaj tiel vi havos iujn kiel maso de teksto kiel ĉi tiu, 1400 01:26:18,810 --> 01:26:21,990 sed vere ĉiuj vi devas fari estas entajpi komandojn en la komenco. 1401 01:26:21,990 --> 01:26:24,250 Rompi ĉefa metas Haltpunkto ĉe ĉefa. 1402 01:26:24,250 --> 01:26:28,470 Listo 400 listas la linioj de kodo ĉirkaŭ linio 400. 1403 01:26:28,470 --> 01:26:31,410 Kaj tiel en tiu ĉi kazo vi povas simple rigardi sin kaj diros, ho, 1404 01:26:31,410 --> 01:26:34,360 Mi volas agordi Haltpunkto ĉe linio 397, kiu estas tiu linio, 1405 01:26:34,360 --> 01:26:37,170 kaj tiam via programo kuras en tiun paŝon kaj ĝi tuj rompos. 1406 01:26:37,170 --> 01:26:41,120 Ĝi tuj paŭzo tie, kaj vi povas presi, ekzemple, valoro de malaltaj aŭ altaj. 1407 01:26:41,120 --> 01:26:46,410 Kaj tiel estas plenmano da ordonoj vi bezonas scii, 1408 01:26:46,410 --> 01:26:48,660 kaj ĉi Bildoprezento iros en la retejo, 1409 01:26:48,660 --> 01:26:54,000 do se vi volas nur referenci tiuj aŭ kiel meti ilin sur vian cheat littukoj, bonvolu. 1410 01:26:54,000 --> 01:27:00,650 >> Cool. Tio estis Quiz Review 0, kaj ni batas ĉirkaŭ se vi havas demandojn. 1411 01:27:00,650 --> 01:27:03,850 Bone. 1412 01:27:03,850 --> 01:27:09,030 >>  [Aplaŭdo] 1413 01:27:09,030 --> 01:27:13,000 >> [CS50.TV]