1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [Недеља 4] 2 00:00:03,000 --> 00:00:05,000 [Давид Ј. Малан] [Универзитет Харвард] 3 00:00:05,000 --> 00:00:08,000 [Ово је ЦС50.] [ЦС50.ТВ] 4 00:00:08,000 --> 00:00:12,000 >> Добро, ово је ЦС50, и то је почетак седмице 4, 5 00:00:12,000 --> 00:00:16,000 и ово је један од најспоријих могућих сортирање алгоритама. 6 00:00:16,000 --> 00:00:19,000 Која је то што смо управо гледали тамо? 7 00:00:19,000 --> 00:00:24,000 То је балон врста, како би велики О (н ^ 2) + сума, 8 00:00:24,000 --> 00:00:28,000 и заиста ми нисмо једини у овом свету изгледа да зна 9 00:00:28,000 --> 00:00:30,000 шта мехур врста, или његов пут узастопно. 10 00:00:30,000 --> 00:00:33,000 Заиста, ово је био разговор са Ериц Сцхмидт на Гоогле 11 00:00:33,000 --> 00:00:45,000 и бивши сенатор Барак Обама пре само неколико година. 12 00:00:45,000 --> 00:00:48,000 >> Сада, сенаторе, овде си на Гоогле-у, 13 00:00:48,000 --> 00:00:54,000 и ја волим да мислим председништва као интервју за посао. 14 00:00:54,000 --> 00:00:58,000 Сада, тешко је добити посао као председника, а ти идеш кроз интензивну сада. 15 00:00:58,000 --> 00:01:00,000 Такође је тешко добити посао у Гоогле. 16 00:01:00,000 --> 00:01:05,000 Имамо питања и тражимо наше кандидате питања, 17 00:01:05,000 --> 00:01:10,000 и ово је један од Ларри Швимер. 18 00:01:10,000 --> 00:01:14,000 Ви мислите да се шалим? То је овде. 19 00:01:14,000 --> 00:01:18,000 Који је најефикаснији начин да сортирате милион 32-битне целе бројеве? 20 00:01:18,000 --> 00:01:21,000 [Смех] 21 00:01:21,000 --> 00:01:24,000 Добро 22 00:01:24,000 --> 00:01:26,000 Жао ми је >> Не, не, не, не.. 23 00:01:26,000 --> 00:01:34,000 Мислим да је балон врста би био погрешан пут. 24 00:01:34,000 --> 00:01:39,000 >> Хајде, ко му је рекао ово? 25 00:01:39,000 --> 00:01:43,000 Прошле недеље смо се сећам паузу од кода, бар на један дан, 26 00:01:43,000 --> 00:01:46,000 и почео фокусирајући се на неким вишим идејама и решавање проблема генерално 27 00:01:46,000 --> 00:01:49,000 у контексту претраживања и сортирања, 28 00:01:49,000 --> 00:01:53,000 а увели смо нешто што нисмо шамар ово име на претходну недељу, 29 00:01:53,000 --> 00:01:56,000 али Асимптотска нотација, Биг О, Биг Омега, 30 00:01:56,000 --> 00:02:00,000 и понекад Велики Тета нотација, а то су једноставно начини 31 00:02:00,000 --> 00:02:02,000 од описује време рада алгоритама, 32 00:02:02,000 --> 00:02:05,000 колико времена је потребно за алгоритма за покретање. 33 00:02:05,000 --> 00:02:08,000 >> И можда се сећате да сте говорили о трајању у смислу величине 34 00:02:08,000 --> 00:02:11,000 инпута, коју углавном називамо н, шта год да је проблем може бити, 35 00:02:11,000 --> 00:02:13,000 где је н број људи у соби, 36 00:02:13,000 --> 00:02:17,000 број страна у телефонском именику, а ми смо почели да пишу ствари 37 00:02:17,000 --> 00:02:21,000 као О (н ^ 2) или О (н) или О (н лог н) 38 00:02:21,000 --> 00:02:24,000 па чак и када је математика није баш ишло тако савршено 39 00:02:24,000 --> 00:02:28,000 и то је био н ² - н / 2 или нешто слично 40 00:02:28,000 --> 00:02:31,000 уместо тога би само баци неки од нижих реда условима, 41 00:02:31,000 --> 00:02:34,000 а мотивација је да ми заиста желимо 42 00:02:34,000 --> 00:02:37,000 врста објективан начин процене 43 00:02:37,000 --> 00:02:39,000 перформансе програма или перформансе алгоритама 44 00:02:39,000 --> 00:02:42,000 да на крају дана нема никакве везе, на пример, 45 00:02:42,000 --> 00:02:45,000 брзином рачунара данас. 46 00:02:45,000 --> 00:02:47,000 >> На пример, ако спроведе сортирање балон, 47 00:02:47,000 --> 00:02:50,000 или спроведе обједините сортирања или избор врсте на рачунару данашњем 48 00:02:50,000 --> 00:02:53,000 2 ГХз рачунар, а ви га покренете, 49 00:02:53,000 --> 00:02:56,000 и то траје одређени број секунди, следеће године има 3 ГХз 50 00:02:56,000 --> 00:02:59,000 или 4 ГХз рачунар, а можда онда тврдите да је "Вау, мој алгоритам 51 00:02:59,000 --> 00:03:03,000 је сада дупло брже ", када у стварности то очигледно није случај. 52 00:03:03,000 --> 00:03:06,000 То је само хардвер је стечен брже, али рачунар 53 00:03:06,000 --> 00:03:10,000 није, па смо заиста желе да баце такве ствари 54 00:03:10,000 --> 00:03:13,000 Умношци од 2 или 3 мултипликатора када је у питању описивање 55 00:03:13,000 --> 00:03:17,000 колико брзо или споро како алгоритам је и стварно се фокусирамо 56 00:03:17,000 --> 00:03:20,000 од н или неки фактор истог, 57 00:03:20,000 --> 00:03:24,000 нека сила томе као у случају сорти из прошле недеље. 58 00:03:24,000 --> 00:03:27,000 И сећам да је уз помоћ стапања врсте 59 00:03:27,000 --> 00:03:31,000 ми смо били у стању да уради много боље од балон врсте и селекције сортирање 60 00:03:31,000 --> 00:03:33,000 па чак и постављање врста. 61 00:03:33,000 --> 00:03:36,000 >> Морамо до н лог н, а опет, 62 00:03:36,000 --> 00:03:39,000 Подсећамо да лог н генерално односи на нешто што расте 63 00:03:39,000 --> 00:03:43,000 спорије затим н, односно н лог н до сада је била добра 64 00:03:43,000 --> 00:03:45,000 јер је мање од н ². 65 00:03:45,000 --> 00:03:47,000 Али да постигне н лог н са стапања врстом 66 00:03:47,000 --> 00:03:51,000 шта је основна клица идеје које смо морали да искористе 67 00:03:51,000 --> 00:03:54,000 да смо и искористио назад у недељи 0? 68 00:03:54,000 --> 00:03:58,000 Како смо се позабаве проблемом сортирање паметно са стапања врсте? 69 00:03:58,000 --> 00:04:04,000 Шта је био кључни увид, можда? 70 00:04:04,000 --> 00:04:07,000 Свако уопште. 71 00:04:07,000 --> 00:04:09,000 Ок, хајде да се вратимо корак. 72 00:04:09,000 --> 00:04:11,000 Опишите врсту стапања у својим речима. 73 00:04:11,000 --> 00:04:15,000 Како то функционише? 74 00:04:15,000 --> 00:04:17,000 Ок, ми ћемо ред назад недеље 0. 75 00:04:17,000 --> 00:04:19,000 Ок, да. 76 00:04:19,000 --> 00:04:22,000 [Нечујан-студент] 77 00:04:22,000 --> 00:04:26,000 Ок, добро, тако да смо поделили низ бројева на 2 комада. 78 00:04:26,000 --> 00:04:29,000 Ми сортирана сваки од тих комада, а онда смо их спојили, 79 00:04:29,000 --> 00:04:33,000 и ми смо видели ову идеју пре узимања проблем који је ово велика 80 00:04:33,000 --> 00:04:36,000 и сецкање га у проблем да је ово велика или ово велико. 81 00:04:36,000 --> 00:04:38,000 >> Подсетимо пример телефонског именика. 82 00:04:38,000 --> 00:04:42,000 Подсетимо се само-бројања алгоритам из недеље пре, 83 00:04:42,000 --> 00:04:45,000 па споји некако је сажето у овом Псеудокод овде. 84 00:04:45,000 --> 00:04:48,000 Када сте дали н елемената, прво је то био разум провери. 85 00:04:48,000 --> 00:04:51,000 Ако је н <2 онда не ради ништа уопште 86 00:04:51,000 --> 00:04:55,000 јер ако н <2 онда је н очигледно 0 или 1, 87 00:04:55,000 --> 00:04:57,000 па ако је то било то 0 или 1 нема ништа да сортирате. 88 00:04:57,000 --> 00:04:59,000 Завршили сте. 89 00:04:59,000 --> 00:05:01,000 Ваша листа је већ тривијално сортирају. 90 00:05:01,000 --> 00:05:04,000 Али иначе ако имаш 2 или више елемената напред и поделите их 91 00:05:04,000 --> 00:05:06,000 на 2 половине, лево и десно. 92 00:05:06,000 --> 00:05:09,000 Сортирајте сваки од тих пола, а затим се стапа сортиране половине. 93 00:05:09,000 --> 00:05:13,000 Али проблем је у томе што на први поглед ово изгледа као да смо Пунтинг. 94 00:05:13,000 --> 00:05:17,000 Ово је кружна дефиниција да ако сам вас замолио да сортирате ове н елемената 95 00:05:17,000 --> 00:05:22,000 а ви ми кажете "У реду, у реду, ми ћемо сортирати те н / 2 и оне н / 2 елемената" 96 00:05:22,000 --> 00:05:27,000 онда моје следеће питање ће бити "Добро, како сте сортирали н / 2 елемената?" 97 00:05:27,000 --> 00:05:30,000 >> Али због структуре овог програма, 98 00:05:30,000 --> 00:05:33,000 јер је то основни случај, да тако кажем, 99 00:05:33,000 --> 00:05:39,000 овај посебан случај који каже ако је н одмах <неку фиксну вредност као 2 повратка. 100 00:05:39,000 --> 00:05:42,000 Не реагује са истом кружном одговор. 101 00:05:42,000 --> 00:05:46,000 Овај процес, то ће на крају завршити цицлицити. 102 00:05:46,000 --> 00:05:50,000 Ако сам вас "Сортирај ови елементи н", а ти кажеш: "Добро, сортирати ове Н / 2" 103 00:05:50,000 --> 00:05:53,000 онда кажете, "Добро, нека то н / 4, н / 8, н/16" 104 00:05:53,000 --> 00:05:56,000 на крају ћете поделити по великом броју довољно 105 00:05:56,000 --> 00:05:59,000 да ћете имати само 1 лево елемент, након чега можете да кажете, 106 00:05:59,000 --> 00:06:02,000 "Ево, овде је поредани један елемент." 107 00:06:02,000 --> 00:06:06,000 Онда сјај овог алгоритма овде је извести из чињенице 108 00:06:06,000 --> 00:06:09,000 да када имате све ове појединачно разврстаних листама, 109 00:06:09,000 --> 00:06:12,000 сви који су величине 1, који изгледа бескорисно, 110 00:06:12,000 --> 00:06:15,000 када почнете да их спајање и спајање их 111 00:06:15,000 --> 00:06:19,000 правите коначно као Роб учинио у видео коначно сортиране листе. 112 00:06:19,000 --> 00:06:22,000 >> Али ова идеја протеже далеко изван сортирање. 113 00:06:22,000 --> 00:06:26,000 Постоји та идеја уграђена у овај програм познат као рекурзије, 114 00:06:26,000 --> 00:06:29,000 Идеја којом сте програм 115 00:06:29,000 --> 00:06:32,000 и да реши неки проблем себе назвали, 116 00:06:32,000 --> 00:06:36,000 или стави у контекст програмских језика које су функције, 117 00:06:36,000 --> 00:06:39,000 и да би се решио проблем, функција се позива 118 00:06:39,000 --> 00:06:42,000 опет и опет и опет, али функција 119 00:06:42,000 --> 00:06:44,000 Не могу себе називаш бесконачно много пута. 120 00:06:44,000 --> 00:06:47,000 Коначно имате на дно напоље, да тако кажем, 121 00:06:47,000 --> 00:06:49,000 и имају неке тешко стање кодирану базу која каже 122 00:06:49,000 --> 00:06:53,000 У овом тренутку заустави називајући себе, тако да се цео процес 123 00:06:53,000 --> 00:06:56,000 коначно се у ствари престати. 124 00:06:56,000 --> 00:06:58,000 Шта то заправо значи, да рецурсе? 125 00:06:58,000 --> 00:07:01,000 >> Да видимо, да ли можемо да урадимо једноставан, тривијалан пример са, рецимо, 126 00:07:01,000 --> 00:07:03,000 3 особе са мном овде на бини, ако неко је удобан. 127 00:07:03,000 --> 00:07:06,000 1, хајде уп, 2 и 3. 128 00:07:06,000 --> 00:07:09,000 Ако 3 желе да дођу овде. 129 00:07:09,000 --> 00:07:12,000 Ако желите да стоје поред мене овде у реду, претпостављам да је проблем у руци 130 00:07:12,000 --> 00:07:15,000 веома тривијално избројати људи који су овде. 131 00:07:15,000 --> 00:07:18,000 Али искрено, ја сам уморан од свих ових бројања примера. 132 00:07:18,000 --> 00:07:21,000 Ово ће потрајати, 1, 2, и тачка, тачка, тачка. 133 00:07:21,000 --> 00:07:23,000 То ће трајати заувек. 134 00:07:23,000 --> 00:07:25,000 Радије бих само пунта овај проблем у потпуности уз помоћ-како се зовеш? 135 00:07:25,000 --> 00:07:27,000 Сара. >> Сара, у реду. 136 00:07:27,000 --> 00:07:29,000 Кели. >> Кели и? 137 00:07:29,000 --> 00:07:31,000 >> Вили >> Вили, Сара, Кели и Вили.. 138 00:07:31,000 --> 00:07:34,000 Сада сам поставио питање од стране некога 139 00:07:34,000 --> 00:07:37,000 колико људи су се на овој сцени, а ја немам појма. 140 00:07:37,000 --> 00:07:40,000 Ово је заиста дугачак списак, па уместо тога ћу да урадим овај трик. 141 00:07:40,000 --> 00:07:43,000 Ја ћу да питам особу поред мене да уради највећи део посла, 142 00:07:43,000 --> 00:07:46,000 а када она врши ради највећи део посла 143 00:07:46,000 --> 00:07:49,000 Ја ћу да урадим најмању могућу количину рада и само додати 1 144 00:07:49,000 --> 00:07:51,000 на било њен одговор је, па идемо. 145 00:07:51,000 --> 00:07:54,000 Био сам питао колико је људи на сцени. 146 00:07:54,000 --> 00:07:57,000 Колико људи на сцени лево од вас? 147 00:07:57,000 --> 00:08:00,000 Лево од мене >> Добро,? Али не варају. 148 00:08:00,000 --> 00:08:04,000 То је добро, то је тачно, али ако желимо да наставимо ову логику 149 00:08:04,000 --> 00:08:08,000 претпоставимо да желите да на сличан пунта овај проблем лево од вас, 150 00:08:08,000 --> 00:08:11,000 па уместо одговора директно иду напред и само пребацују. 151 00:08:11,000 --> 00:08:14,000 Ох, како су многи људи са леве стране од мене? 152 00:08:14,000 --> 00:08:16,000 Колико људи са леве стране? 153 00:08:16,000 --> 00:08:18,000 1. 154 00:08:18,000 --> 00:08:27,000 [Смех] 155 00:08:27,000 --> 00:08:30,000 Ок, па 0, па шта сад Вили учинио 156 00:08:30,000 --> 00:08:33,000 је си се вратио твој одговор у овом правцу каже 0. 157 00:08:33,000 --> 00:08:36,000 Сада, шта би требало да урадите >> 1. 158 00:08:36,000 --> 00:08:39,000 Ок, ти си 1, па кажете: "У реду, ја ћу да додам 1 159 00:08:39,000 --> 00:08:41,000 шта год Вилли је бројање било ", па 1 + 0. 160 00:08:41,000 --> 00:08:43,000 Сада сте 1 тако да ваш одговор на десној страни је сада 161 00:08:43,000 --> 00:08:45,000 1. >> И моја би 2. 162 00:08:45,000 --> 00:08:48,000 Добро, па узимаш претходни одговор 1, 163 00:08:48,000 --> 00:08:51,000 додајући минималну количину рада коју желите да урадите, што је +1. 164 00:08:51,000 --> 00:08:55,000 Ви сада имате 2, и онда предајте ми који вредност? 165 00:08:55,000 --> 00:08:57,000 3, мислим, извини, 2. 166 00:08:57,000 --> 00:08:59,000 Добро. 167 00:08:59,000 --> 00:09:02,000 >> Па, имали смо 0 лево. 168 00:09:02,000 --> 00:09:05,000 Онда смо имали 1, а онда додамо 2, 169 00:09:05,000 --> 00:09:07,000 и сад си ми предаје број 2, 170 00:09:07,000 --> 00:09:10,000 па ја кажем, ок, +1, 3. 171 00:09:10,000 --> 00:09:13,000 Заиста Има 3 људи стајали поред мене на овој сцени, 172 00:09:13,000 --> 00:09:16,000 тако да смо могли да очигледно то урадили веома линеарно, 173 00:09:16,000 --> 00:09:19,000 веома у моди очигледне, али шта ми стварно радимо? 174 00:09:19,000 --> 00:09:21,000 Узели смо у почетку проблем величине 3. 175 00:09:21,000 --> 00:09:24,000 Затим смо га покварио на проблем величине 2, 176 00:09:24,000 --> 00:09:27,000 онда проблем величине 1, а затим коначно основни случај 177 00:09:27,000 --> 00:09:29,000 био заиста, ох, нема никог, 178 00:09:29,000 --> 00:09:33,000 на којој тачки Вили вратио ефикасно тешко кодирани одговор пар пута, 179 00:09:33,000 --> 00:09:36,000 а други је тада бубблед горе, бубблед горе, бубблед горе, 180 00:09:36,000 --> 00:09:39,000 а затим додавањем у овом једном додатном 1 181 00:09:39,000 --> 00:09:41,000 Добили смо ову реализује основну идеју рекурзије. 182 00:09:41,000 --> 00:09:44,000 >> Сада, у овом случају то није стварно реши проблем 183 00:09:44,000 --> 00:09:46,000 било ефикасније онда смо видели до сада. 184 00:09:46,000 --> 00:09:48,000 Али размислите о алгоритмима смо урадили на сцени до сада. 185 00:09:48,000 --> 00:09:51,000 Ми смо имали 8 комада папира на табли, 186 00:09:51,000 --> 00:09:55,000 на видео када је Шон био у потрази за број 7, и шта је он заправо урадио? 187 00:09:55,000 --> 00:09:58,000 Па, он није урадио никакву завади па владај. 188 00:09:58,000 --> 00:10:01,000 Он није урадио никакву рекурзије. 189 00:10:01,000 --> 00:10:03,000 Уместо да само то урадио линеарну алгоритам. 190 00:10:03,000 --> 00:10:07,000 Али када смо увели идеју разврстаних бројева на позорници живети прошле недеље 191 00:10:07,000 --> 00:10:09,000 онда смо имали ту инстинкт иде у средини, 192 00:10:09,000 --> 00:10:13,000 на којој тачки смо имали мањи списак величине 4 или неки други списак величине 4, 193 00:10:13,000 --> 00:10:17,000 и онда смо имали исти проблем, па смо поновили, понавља, понавља. 194 00:10:17,000 --> 00:10:19,000 Другим речима, ми рецурсед. 195 00:10:19,000 --> 00:10:24,000 Хвала вам пуно на нашим волонтерима 3 овде за демонстрацију рекурзија са нама. 196 00:10:24,000 --> 00:10:28,000 >> Хајде да видимо, ако не можемо да то сада мало више бетона, 197 00:10:28,000 --> 00:10:30,000 решавању проблема који смо поново могли да ураде врло лако, 198 00:10:30,000 --> 00:10:34,000 али ћемо га користити као одскочну даску за спровођење овог основну идеју. 199 00:10:34,000 --> 00:10:37,000 Ако желим да израчуна сума од гомиле бројева, 200 00:10:37,000 --> 00:10:39,000 На пример, ако прође у броју 3, 201 00:10:39,000 --> 00:10:42,000 Желим да вам дам вредност СИГМА 3, 202 00:10:42,000 --> 00:10:46,000 тако да збир 3 + 2 + 1 + 0. 203 00:10:46,000 --> 00:10:48,000 Желим да се вратим на одговор 6, 204 00:10:48,000 --> 00:10:51,000 па ћемо имплементирати ову функцију Сигма, ово сума функције 205 00:10:51,000 --> 00:10:54,000 то, опет, води у улаз, а онда се враћа сума 206 00:10:54,000 --> 00:10:57,000 од тог броја свега скроз доле до 0. 207 00:10:57,000 --> 00:10:59,000 Могли би ово прилично једноставно, зар не? 208 00:10:59,000 --> 00:11:01,000 Могли бисмо то урадили са неком врстом петље структуре, 209 00:11:01,000 --> 00:11:04,000 па ћу ићи напред и да је то почело. 210 00:11:04,000 --> 00:11:07,000 >> Укључи стдио.х. 211 00:11:07,000 --> 00:11:09,000 Дозволите ми да се уђе у главни за рад са овде. 212 00:11:09,000 --> 00:11:12,000 Хајде да сачувате ово као сигма.ц. 213 00:11:12,000 --> 00:11:14,000 Онда ћу да идем овде, а ја ћу да прогласе инт н, 214 00:11:14,000 --> 00:11:18,000 и ја ћу да урадим следеће док корисник не сарађује. 215 00:11:18,000 --> 00:11:22,000 Док корисник није дао позитиван број 216 00:11:22,000 --> 00:11:26,000 пусти ме напред и подстиче их за н = ГетИнт, 217 00:11:26,000 --> 00:11:28,000 и пусти ме да им дам неке инструкције о томе шта треба да уради, 218 00:11:28,000 --> 00:11:33,000 па принтф ("Позитиван цео молимо"). 219 00:11:33,000 --> 00:11:39,000 Само нешто релативно једноставно овако, тако да када смо погодио линију 14 220 00:11:39,000 --> 00:11:42,000 сада имамо позитиван цео број вероватно у н. 221 00:11:42,000 --> 00:11:44,000 >> Сада хајде да урадимо нешто са њим. 222 00:11:44,000 --> 00:11:50,000 Пусти ме напред и израчуна сума, тако инт збир = сигма (н). 223 00:11:50,000 --> 00:11:54,000 Сигма је само сума, тако да сам ја то писао у одгајивач начин. 224 00:11:54,000 --> 00:11:56,000 Само ћемо назвати ту сигма. 225 00:11:56,000 --> 00:11:58,000 То је сума, а сада ћу да одштампате резултат, 226 00:11:58,000 --> 00:12:08,000 принтф ("Збир је% д \ н", збир). 227 00:12:08,000 --> 00:12:11,000 А онда ћу вратити 0 за добру меру. 228 00:12:11,000 --> 00:12:15,000 Урадили смо све да овај програм захтева, осим занимљивог дела, 229 00:12:15,000 --> 00:12:18,000 а то је у ствари спроводи СИГМА функцију. 230 00:12:18,000 --> 00:12:22,000 >> Пусти ме да идем доле на дну, и дозволите ми да прогласи функцију сигма. 231 00:12:22,000 --> 00:12:26,000 Има да се променљиве која је типа цео број, 232 00:12:26,000 --> 00:12:30,000 и шта тип података желим да претпоставља се врати из Сигма? 233 00:12:30,000 --> 00:12:34,000 Инт, јер желим да моја очекивања одговара на линији 15. 234 00:12:34,000 --> 00:12:37,000 Овде пусти ме напред и остваре ово 235 00:12:37,000 --> 00:12:41,000 на прилично једноставан начин. 236 00:12:41,000 --> 00:12:45,000 >> Идемо напред и рећи инт сума = 0, 237 00:12:45,000 --> 00:12:47,000 а сада ћу морати да одем мало за петљу овде 238 00:12:47,000 --> 00:12:50,000 што ће рећи овако нешто, 239 00:12:50,000 --> 00:13:01,000 фор (инт и = 0; И <= број; и + +) сума + = и. 240 00:13:01,000 --> 00:13:05,000 А онда ћу вратити суму. 241 00:13:05,000 --> 00:13:07,000 Могао сам да спроводи ово у било ком броју различитих начина. 242 00:13:07,000 --> 00:13:09,000 Могао сам користио док петљу. 243 00:13:09,000 --> 00:13:11,000 Могао сам прескочио користите збир променљиве ако сам заиста желео да, 244 00:13:11,000 --> 00:13:15,000 али укратко, имамо само функцију да ако нисам глупан проглашава је збир 0. 245 00:13:15,000 --> 00:13:18,000 Онда понавља од 0 на горе кроз броју, 246 00:13:18,000 --> 00:13:23,000 и на свакој итерацији додаје да тренутни вредност збира а онда се враћа суму. 247 00:13:23,000 --> 00:13:25,000 >> Сада, овде је мало оптимизације. 248 00:13:25,000 --> 00:13:29,000 Ово је вероватно изгубљено корак, али тако да буде. То је у реду за сада. 249 00:13:29,000 --> 00:13:32,000 Ми смо барем што темељно и иде 0 скроз горе. 250 00:13:32,000 --> 00:13:34,000 Није тешко и прилично једноставан, 251 00:13:34,000 --> 00:13:37,000 али се испоставило да је са Сигма функцијом имамо исту прилику 252 00:13:37,000 --> 00:13:39,000 као што смо овде радили на сцени. 253 00:13:39,000 --> 00:13:42,000 На сцени смо управо избројао колико је људи било поред мене, 254 00:13:42,000 --> 00:13:47,000 али уместо тога, ако смо хтели да пребројите број 3 + 2 + 1 255 00:13:47,000 --> 00:13:51,000 на доле до 0 смо могли слично пунта у функцији 256 00:13:51,000 --> 00:13:55,000 да сам уместо тога ћу описати као рекурзивно. 257 00:13:55,000 --> 00:13:57,000 Ево хајде да брзо разум проверите и уверите се да нисам глупан. 258 00:13:57,000 --> 00:14:00,000 >> Знам да постоји најмање једна ствар у овом програму да сам урадио праву. 259 00:14:00,000 --> 00:14:04,000 Када сам ударио ући ћу добити било какву виче на мене? 260 00:14:04,000 --> 00:14:06,000 Шта ћу ја да се драо на око? 261 00:14:06,000 --> 00:14:11,000 Да, заборавио сам прототип, па сам користећи функцију која се зове сигма на линији 15, 262 00:14:11,000 --> 00:14:16,000 али то није објављено све до линије 22, тако да сам најбољи проактивно идем овде 263 00:14:16,000 --> 00:14:22,000 и прогласи прототип, а ја ћу рећи инт Сигма (инт број), и то је то. 264 00:14:22,000 --> 00:14:24,000 Је реализован је на дну. 265 00:14:24,000 --> 00:14:27,000 >> Или још један начин на који сам могао да реши ово 266 00:14:27,000 --> 00:14:30,000 Могао преместите функцију тамо, што није лоше, 267 00:14:30,000 --> 00:14:32,000 али барем када су ваши програми почети да се дуго, искрено, 268 00:14:32,000 --> 00:14:35,000 Мислим да постоји нека вредност у увек има главни на врх 269 00:14:35,000 --> 00:14:38,000 тако да код читаоца може да отвори датотеку, а затим одмах видети 270 00:14:38,000 --> 00:14:40,000 шта програм ради без да тражи кроз њега 271 00:14:40,000 --> 00:14:42,000 у потрази за ту основну функцију. 272 00:14:42,000 --> 00:14:49,000 Идемо доле на мој прозор терминала овде, покушајте да направите сигма сигма, 273 00:14:49,000 --> 00:14:51,000 и ја сам зајебао овде. 274 00:14:51,000 --> 00:14:55,000 Имплицитна декларација функције ГетИнт значи да сам заборавио да урадим оно друго? 275 00:14:55,000 --> 00:14:57,000 [Нечујан-студент] 276 00:14:57,000 --> 00:15:00,000 Добро, тако је очигледно уобичајена грешка, па хајде да ставимо ово овде горе, 277 00:15:00,000 --> 00:15:04,000 цс50.х, а сада да се вратимо на мој прозор терминала. 278 00:15:04,000 --> 00:15:08,000 >> Ја ћу брисање екрана, а ја ћу направити репризу сигма. 279 00:15:08,000 --> 00:15:11,000 Изгледа да смо саставили. Дозволите ми да се сада води сигма. 280 00:15:11,000 --> 00:15:15,000 Ја ћу унети број 3, а ја нисам добио 6, тако да није ригорозна провера, 281 00:15:15,000 --> 00:15:18,000 али барем изгледа да раде на први поглед, али хајде да то рип апарт, 282 00:15:18,000 --> 00:15:21,000 и идемо заправо искористе идеју рекурзије, опет, 283 00:15:21,000 --> 00:15:24,000 на врло једноставан контексту, тако да у време неколико недеља 284 00:15:24,000 --> 00:15:27,000 када почнемо истраживање одгајивач структуре података од низова 285 00:15:27,000 --> 00:15:30,000 имамо још један алат у алата са којима се 286 00:15:30,000 --> 00:15:33,000 манипулисање тим структурама података, као што ћемо видети. 287 00:15:33,000 --> 00:15:36,000 Ово је итеративни приступ, петља заснован приступ. 288 00:15:36,000 --> 00:15:39,000 >> Дозволите ми да, уместо сада урадили. 289 00:15:39,000 --> 00:15:44,000 Дозволите ми да кажем да уместо збир броја 290 00:15:44,000 --> 00:15:48,000 доле до 0 је стварно иста ствар као 291 00:15:48,000 --> 00:15:53,000 број + сигма (број - 1). 292 00:15:53,000 --> 00:15:57,000 Другим речима, баш као на позорници сам пунтед свакој од људи поред мене, 293 00:15:57,000 --> 00:16:00,000 а они за узврат држали Пунтинг док смо коначно дотакла дно у Вили, 294 00:16:00,000 --> 00:16:03,000 који је морао да врати тешко кодирану одговор као 0. 295 00:16:03,000 --> 00:16:07,000 Ево сад смо се слично Пунтинг да Сигма 296 00:16:07,000 --> 00:16:10,000 исту функцију као што је првобитно назван, али овде је кључ увид 297 00:16:10,000 --> 00:16:12,000 је да ми не зове сигма идентично. 298 00:16:12,000 --> 00:16:14,000 Нећемо пролази у н. 299 00:16:14,000 --> 00:16:17,000 Ми јасно пролазите у броју - 1, 300 00:16:17,000 --> 00:16:20,000 тако нешто мањи проблем, нешто мањи проблем. 301 00:16:20,000 --> 00:16:23,000 >> Нажалост, ово није баш решење још увек, и пре него што смо поправити 302 00:16:23,000 --> 00:16:26,000 Шта може да се скаче се као очигледно на неки од вас 303 00:16:26,000 --> 00:16:28,000 пусти ме напред и реприза направити. 304 00:16:28,000 --> 00:16:30,000 Изгледа да се састави у реду. 305 00:16:30,000 --> 00:16:32,000 Дозволите ми да реприза сигма са 6. 306 00:16:32,000 --> 00:16:37,000 Упс, дозволите ми реприза сигма са 6. 307 00:16:37,000 --> 00:16:42,000 Видели смо то и раније, мада случајно последњи пут као добро. 308 00:16:42,000 --> 00:16:48,000 Зашто сам добио ову грешку шифровану сегментирања? Да. 309 00:16:48,000 --> 00:16:50,000 [Нечујан-студент] 310 00:16:50,000 --> 00:16:53,000 Нема основа случај, и још конкретније, шта се вероватно догодило? 311 00:16:53,000 --> 00:16:58,000 То је симптом онога понашање? 312 00:16:58,000 --> 00:17:00,000 Реци мало гласније. 313 00:17:00,000 --> 00:17:02,000 [Нечујан-студент] 314 00:17:02,000 --> 00:17:05,000 То је бесконачна петља ефикасно, а проблем са бесконачним петље 315 00:17:05,000 --> 00:17:08,000 када укључују рекурзија у овом случају, функција се зове, 316 00:17:08,000 --> 00:17:10,000 оно што се дешава сваки пут када позовете функцију? 317 00:17:10,000 --> 00:17:13,000 Па, мислим да вратите како смо изложио меморију рачунара. 318 00:17:13,000 --> 00:17:16,000 Ми смо рекли да постоји тај комад меморије назива стек који је на дну, 319 00:17:16,000 --> 00:17:19,000 и сваки пут када позовете функцију мало више меморије добија пут 320 00:17:19,000 --> 00:17:24,000 на овом такозваном стеку садржи локалне тој функцији је варијабле или параметре, 321 00:17:24,000 --> 00:17:27,000 па ако сигма позива Сигма Сигма позиве зове сигма 322 00:17:27,000 --> 00:17:29,000  позива сигма одакле овој причи крај? 323 00:17:29,000 --> 00:17:31,000 >> Па, ускоро премашује укупан износ 324 00:17:31,000 --> 00:17:33,000 меморије коју имате на располагању рачунару. 325 00:17:33,000 --> 00:17:37,000 Ти превазишао сегмент који сте требали да остану у, 326 00:17:37,000 --> 00:17:40,000 и добили овај сегментирања грешку, језгро бачена, 327 00:17:40,000 --> 00:17:43,000 и шта значи језгро бачена је да сада имам фајл који се зове језгро 328 00:17:43,000 --> 00:17:46,000 који је фајл који садржи нуле и јединице 329 00:17:46,000 --> 00:17:49,000 да заправо ће у будућности бити дијагностички корисно. 330 00:17:49,000 --> 00:17:52,000 Ако није јасно да вам где је ваша грешка је 331 00:17:52,000 --> 00:17:54,000 ви у ствари можете да урадите мало форензичке анализе, да тако кажем, 332 00:17:54,000 --> 00:17:58,000 на овом фајлу језгра депоније, која је, опет, само гомила нула и јединица 333 00:17:58,000 --> 00:18:02,000 који у суштини представља стање вашег програма у меморији 334 00:18:02,000 --> 00:18:05,000 тренутак се срушио на овај начин. 335 00:18:05,000 --> 00:18:11,000 >> Решење је у томе што ми не можемо само слепо врати сигма, 336 00:18:11,000 --> 00:18:14,000 број + сигма на нешто мањем проблему. 337 00:18:14,000 --> 00:18:16,000 Морамо да овде имамо неку врсту основног случаја, 338 00:18:16,000 --> 00:18:19,000 и шта би требало да основни случај вероватно бити? 339 00:18:19,000 --> 00:18:22,000 [Нечујан-студент] 340 00:18:22,000 --> 00:18:25,000 Ок, док је број позитиван заправо треба да се врати ово, 341 00:18:25,000 --> 00:18:29,000 или другим речима, ако је број, рецимо, <= 0 да 342 00:18:29,000 --> 00:18:32,000 знате шта, ја ћу ићи напред и врати 0, 343 00:18:32,000 --> 00:18:36,000 слично као Вили урадио, а друго, ја ћу да наставим 344 00:18:36,000 --> 00:18:41,000 и врати ово, па није то много краће 345 00:18:41,000 --> 00:18:44,000 од итеративне верзије које смо шлагом, прво се користи за петље, 346 00:18:44,000 --> 00:18:48,000 али приметите да постоји ова врста елеганције до њега. 347 00:18:48,000 --> 00:18:51,000 Уместо да се врати неки број и обављање сав овај математику 348 00:18:51,000 --> 00:18:54,000 и додаје ствари са локалним варијаблама 349 00:18:54,000 --> 00:18:57,000 Ви уместо да кажете "ОК, ако је ово супер лако проблем 350 00:18:57,000 --> 00:19:01,000 као број <0, дозволите ми да одмах врати 0 ". 351 00:19:01,000 --> 00:19:03,000 >> Нећемо смета подржавају негативне бројеве, 352 00:19:03,000 --> 00:19:05,000 па ћу на хард код вредност 0. 353 00:19:05,000 --> 00:19:08,000 Али иначе, да спроведе ову идеју сабирања 354 00:19:08,000 --> 00:19:11,000 свих ових бројева заједно можете ефикасно узети мали залогај 355 00:19:11,000 --> 00:19:14,000 из проблема, слично као ми овде радили на сцени, 356 00:19:14,000 --> 00:19:18,000 онда пунта остатак проблема на следећу особу, 357 00:19:18,000 --> 00:19:20,000 али у овом случају следећа особа себе је. 358 00:19:20,000 --> 00:19:22,000 То је идентично имену функција. 359 00:19:22,000 --> 00:19:25,000 Само да прође мањи и мањи и мањи проблем сваки пут, 360 00:19:25,000 --> 00:19:28,000 и иако имамо овде није сасвим формализована ствари у коду 361 00:19:28,000 --> 00:19:33,000 то је управо оно што се дешава у недељу 0 са телефонском именику. 362 00:19:33,000 --> 00:19:36,000 То је управо оно што се дешава у последњих неколико недеља са Сеан 363 00:19:36,000 --> 00:19:39,000 и са нашим демонстрацијама потрази за бројеве. 364 00:19:39,000 --> 00:19:42,000 То је узимање проблем и дели га поново и поново. 365 00:19:42,000 --> 00:19:44,000 >> Другим речима, постоји начин да се сада превођења 366 00:19:44,000 --> 00:19:47,000 ово стваран свет конструкт, овај виши ниво конструкт 367 00:19:47,000 --> 00:19:51,000 од завади па владај, а нешто опет и опет 368 00:19:51,000 --> 00:19:56,000 у коду, тако да је ово нешто што ће поново видети током времена. 369 00:19:56,000 --> 00:20:00,000 Сада, као и на страну, ако сте нови у рекурзије треба барем сад схватам 370 00:20:00,000 --> 00:20:02,000 зашто је ово смешно. 371 00:20:02,000 --> 00:20:05,000 Ја идем на гоогле.цом, 372 00:20:05,000 --> 00:20:17,000 и ја ћу тражити неке савете и трикове о рекурзије, ентер. 373 00:20:17,000 --> 00:20:21,000 Реците особу поред вас, ако они нису смејали сада. 374 00:20:21,000 --> 00:20:23,000 Да ли сте мислили рекурзија? 375 00:20:23,000 --> 00:20:25,000 Да ли сте мислили-ах, тамо идемо. 376 00:20:25,000 --> 00:20:28,000 Ок, то је сада остало све. 377 00:20:28,000 --> 00:20:30,000 Мало Ускршње јаје уграђен негде тамо у Гоогле. 378 00:20:30,000 --> 00:20:33,000 Као на страну, један од линкова смо ставили на сајту наравно а 379 00:20:33,000 --> 00:20:36,000 за данас је управо то мрежа различитих сортирање алгоритама, 380 00:20:36,000 --> 00:20:39,000 неке од њих смо гледали прошле недеље, али оно што је лепо о овом визуализације 381 00:20:39,000 --> 00:20:43,000 као што покушате да заврши свој ум око разних ствари везаних за алгоритама 382 00:20:43,000 --> 00:20:46,000 Знам да можете врло лако сада почети са различитим типовима инпута. 383 00:20:46,000 --> 00:20:50,000 Улази све преокренути су инпути углавном поредани су инпути случајна и тако даље. 384 00:20:50,000 --> 00:20:53,000 Као што покушате да, поново, направити разлику између ових ствари у вашем уму 385 00:20:53,000 --> 00:20:57,000 схвате да је то УРЛ на сајту наравно је на предавања страници 386 00:20:57,000 --> 00:21:00,000 Можда вам разлог кроз неке од њих. 387 00:21:00,000 --> 00:21:05,000 >> Данас смо коначно добили да реше овај проблем из времена уназад, 388 00:21:05,000 --> 00:21:08,000 која је била да ова функција свап једноставно не ради, 389 00:21:08,000 --> 00:21:12,000 и шта је основни проблем са овим функцијом свап, 390 00:21:12,000 --> 00:21:15,000 циљ који је, опет, да се размењују вредности овде и овде 391 00:21:15,000 --> 00:21:17,000 тако да се то догоди? 392 00:21:17,000 --> 00:21:20,000 То није заправо раде. Зашто? 393 00:21:20,000 --> 00:21:22,000 Да. 394 00:21:22,000 --> 00:21:28,000 [Нечујан-студент] 395 00:21:28,000 --> 00:21:31,000 Тачно, објашњење за ову буггинесс 396 00:21:31,000 --> 00:21:34,000 једноставно је зато што када позовете функцију у Ц 397 00:21:34,000 --> 00:21:38,000 и те функције преузме аргументе, као и б овде, 398 00:21:38,000 --> 00:21:42,000 ви пролазите у копијама год вредност коју пружа на ту функцију. 399 00:21:42,000 --> 00:21:46,000 Ви не пружају изворним вриједностима себе, 400 00:21:46,000 --> 00:21:49,000 па смо видели у контексту буггиц, 401 00:21:49,000 --> 00:21:52,000 бугги3.ц, који изгледао мало овако нешто. 402 00:21:52,000 --> 00:21:57,000 >> Подсетимо се да смо имали кии иницијализује на 1 и 2, респективно. 403 00:21:57,000 --> 00:21:59,000 Затим штампа смо се шта су били. 404 00:21:59,000 --> 00:22:03,000 Тада сам тврдио да сам их замене позивајући замену за к, и. 405 00:22:03,000 --> 00:22:06,000 Али проблем је био да замене радио, 406 00:22:06,000 --> 00:22:10,000 али само у оквиру замене себе функционисати. 407 00:22:10,000 --> 00:22:13,000 Чим смо ударили линију 40 оних заменили вредности 408 00:22:13,000 --> 00:22:16,000 су бачене, па ништа 409 00:22:16,000 --> 00:22:21,000 у оригиналној функцији главни заправо променило, 410 00:22:21,000 --> 00:22:26,000 па ако размишљам онда о томе шта ово личи, у смислу нашег памћења 411 00:22:26,000 --> 00:22:29,000 ако је ово са леве стране одбора представља- 412 00:22:29,000 --> 00:22:33,000 а ја ћу се потрудити да сви виде ово-ако је ово са леве стране управног одбора 413 00:22:33,000 --> 00:22:37,000 представља, рецимо, своју меморију, а стек ће да расте на горе овај начин, 414 00:22:37,000 --> 00:22:43,000 и зовемо функцију као главни, а главни има 2 локалних променљивих, Кс и И, 415 00:22:43,000 --> 00:22:48,000 хајдемо описују их као к овде, па да опише то што и овде, 416 00:22:48,000 --> 00:22:55,000 и да ставимо у вредности 1 и 2, тако да је ово овде је главни, 417 00:22:55,000 --> 00:22:58,000 а када је главни назива своп функција оперативни систем 418 00:22:58,000 --> 00:23:02,000 даје замени функције, свој откос меморије на стек, 419 00:23:02,000 --> 00:23:04,000 свој кадар на стек, да тако кажем. 420 00:23:04,000 --> 00:23:08,000 Он такође издваја 32 бита за ове Интс. 421 00:23:08,000 --> 00:23:11,000 То се дешава да их назовем и б, али то је потпуно произвољна. 422 00:23:11,000 --> 00:23:13,000 Могао је да их зове шта год хоће, али шта се дешава када је главни 423 00:23:13,000 --> 00:23:19,000 позиви своп је то потребно ове 1, ставља копију тамо, ставља ту копију. 424 00:23:19,000 --> 00:23:23,000 >> Постоји још 1 локална променљива у свап, међутим, позвао шта >> Тмп. 425 00:23:23,000 --> 00:23:27,000 Тмп, па ћу себи дати још 32 бита овде, 426 00:23:27,000 --> 00:23:29,000 и шта сам урадио у овој функцији? 427 00:23:29,000 --> 00:23:34,000 Рекао сам инт тмп добија, тако да има 1, па сам то урадио када смо последњи пут играли са овим примером. 428 00:23:34,000 --> 00:23:39,000 Тада добија б, па је б 2, па сад ово постаје 2, 429 00:23:39,000 --> 00:23:42,000 и сада б добија температуру, тако да температура је 1, 430 00:23:42,000 --> 00:23:44,000 па сад б постаје ово. 431 00:23:44,000 --> 00:23:46,000 То је одлично. Успело је. 432 00:23:46,000 --> 00:23:49,000 Али онда, чим функција враћа 433 00:23:49,000 --> 00:23:52,000 своп је меморија ефективно нестаје, тако да се може поново користити 434 00:23:52,000 --> 00:23:58,000 од стране неке друге функције у будућности, и главни је очигледно потпуно непромењен. 435 00:23:58,000 --> 00:24:00,000 Потребан нам је начин фундаментално решавање овог проблема, 436 00:24:00,000 --> 00:24:03,000 а данас смо коначно ћемо имати начин да то урадите при 437 00:24:03,000 --> 00:24:06,000 можемо увести нешто што се зове показивач. 438 00:24:06,000 --> 00:24:09,000 Испоставило се да можемо решити овај проблем 439 00:24:09,000 --> 00:24:12,000 не пролази у копијама кии 440 00:24:12,000 --> 00:24:18,000 већ доношењем у шта, мислиш да свап функцију? 441 00:24:18,000 --> 00:24:20,000 Да, шта је са адресом? 442 00:24:20,000 --> 00:24:22,000 Нисмо баш причали о адресама у много детаља, 443 00:24:22,000 --> 00:24:25,000 али ако табла представља меморију мог рачунара 444 00:24:25,000 --> 00:24:28,000 свакако могли почети нумерисање на бајтове у мом РАМ 445 00:24:28,000 --> 00:24:31,000 и кажу да је ово бајт # 1, ово је бајт # 2, # 3 бајта, 446 00:24:31,000 --> 00:24:35,000 бајт # 4, бајт # ... 2 милијарде ако имам 2 гигабајта РАМ-а, 447 00:24:35,000 --> 00:24:38,000 тако да смо сигурно могли доћи до неког уског нумерације шеме 448 00:24:38,000 --> 00:24:41,000 за све појединачне бајта у меморији мог рачунара. 449 00:24:41,000 --> 00:24:43,000 >> Шта ако уместо када зовем своп 450 00:24:43,000 --> 00:24:47,000 него пролаз у копијама кии 451 00:24:47,000 --> 00:24:51,000 зашто не бих уместо проћи у обраћању к овде, 452 00:24:51,000 --> 00:24:55,000 адресу и овде, у суштини поштанска адреса 453 00:24:55,000 --> 00:24:59,000 од кии јер онда мењате, ако је он обавестио 454 00:24:59,000 --> 00:25:01,000 на адресу у меморији кии, 455 00:25:01,000 --> 00:25:04,000 затим свап, ако смо га тренирао мало, 456 00:25:04,000 --> 00:25:07,000 Он потенцијално могао да вози за ту адресу, да тако кажем, 457 00:25:07,000 --> 00:25:11,000 к, и промените број тамо, а затим вози на адресу и, 458 00:25:11,000 --> 00:25:16,000 промените ту број, чак и док не заправо добијају копије тих Самог вредности, 459 00:25:16,000 --> 00:25:19,000 па иако смо причали о томе као ГЛАВНИ меморија 460 00:25:19,000 --> 00:25:23,000 а ове као Свап меморија моћна и опасна део Ц 461 00:25:23,000 --> 00:25:28,000 је да свака функција тоуцх меморије било где у рачунару, 462 00:25:28,000 --> 00:25:32,000 и то је моћан у коју можете да урадите веома фенси ствари са компјутерским програмима у Ц. 463 00:25:32,000 --> 00:25:36,000 Ово је опасно, јер можете забрљати врло лако. 464 00:25:36,000 --> 00:25:39,000 У ствари, један од најчешћих начина за програме ових дана да буде експлоатисан 465 00:25:39,000 --> 00:25:42,000 ипак је за програмер не схватају 466 00:25:42,000 --> 00:25:45,000 да он или она дозвољавајући података 467 00:25:45,000 --> 00:25:49,000 да буде написан на локацији у меморији која није била намењена. 468 00:25:49,000 --> 00:25:51,000 >> На пример, он или она изјављује низ величине 10 469 00:25:51,000 --> 00:25:56,000 али онда случајно покушава да стави 11 бајтова у том низу меморије, 470 00:25:56,000 --> 00:25:59,000 и почнете додиривања делова меморије која се више не важи. 471 00:25:59,000 --> 00:26:02,000 Само да контекстуални ово, неки од вас можда знају да 472 00:26:02,000 --> 00:26:06,000 софтвер често ће вас упитати за серијским бројевима или регистарских кључева, 473 00:26:06,000 --> 00:26:08,000 Пхотосхоп и Ворд и програми као што је овај. 474 00:26:08,000 --> 00:26:12,000 Постоји пукотина, као што неки од вас знају, на мрежи, где можете да покренете мали програм, 475 00:26:12,000 --> 00:26:14,000 и воила, нема више захтева за серијским бројем. 476 00:26:14,000 --> 00:26:16,000 Како се то ради? 477 00:26:16,000 --> 00:26:21,000 У многим случајевима ове ствари су једноставно проналажење у рачунарима 478 00:26:21,000 --> 00:26:24,000 текстуални сегменти у стварним рачунара нуле и јединице 479 00:26:24,000 --> 00:26:28,000 где је та функција у којој се тражи серијски број, 480 00:26:28,000 --> 00:26:31,000 и заменити тај простор, или док програм ради 481 00:26:31,000 --> 00:26:33,000 можете схватити где кључ заправо чувају 482 00:26:33,000 --> 00:26:37,000 помоћу нечега што се зове дебуггер, а можете црацк софтвера на тај начин. 483 00:26:37,000 --> 00:26:40,000 То не значи да је то наш циљ за наредних неколико дана, 484 00:26:40,000 --> 00:26:42,000 али је веома стварном свету последице. 485 00:26:42,000 --> 00:26:45,000 Тај се дешава да се укључе крађу софтвера, 486 00:26:45,000 --> 00:26:47,000 али такође постоји компромис читавих машина. 487 00:26:47,000 --> 00:26:50,000 >> У ствари, када сајтови ових дана су експлоатисане 488 00:26:50,000 --> 00:26:53,000 и угрожен и подаци процурели и лозинке су украдене 489 00:26:53,000 --> 00:26:58,000 ово веома често односи на лоше управљање нечијег сећања, 490 00:26:58,000 --> 00:27:01,000 или, у случају базе података, неуспех да се предвиди 491 00:27:01,000 --> 00:27:03,000 контрадикторно улаз, тако да више о томе у недељама које долазе, 492 00:27:03,000 --> 00:27:07,000 али за сада само увид у врсте штете које можете да урадите 493 00:27:07,000 --> 00:27:11,000 што није баш разумевање како ствари раде испод хаубе. 494 00:27:11,000 --> 00:27:14,000 Идемо о разумевању зашто је сломљен 495 00:27:14,000 --> 00:27:17,000 са алатом који ће постати све више и више користан 496 00:27:17,000 --> 00:27:19,000 као наши програми се сложенија. 497 00:27:19,000 --> 00:27:21,000 До сада, када сте имали грешку у свом програму 498 00:27:21,000 --> 00:27:23,000 како сте отишли ​​о његовом дебуггинг? 499 00:27:23,000 --> 00:27:25,000 Који су ваши технике су до сада, без обзира да ли учио од свог ТФ 500 00:27:25,000 --> 00:27:27,000 или само самоуки? 501 00:27:27,000 --> 00:27:29,000 [Студентски] принтф. 502 00:27:29,000 --> 00:27:31,000 Принтф, па принтф је вероватно био ваш пријатељ у да ако желите да видите 503 00:27:31,000 --> 00:27:33,000 шта се дешава унутар вашег програма 504 00:27:33,000 --> 00:27:36,000 само стави иф овде, иф овде, иф овде. 505 00:27:36,000 --> 00:27:38,000 Онда га покренете, и добићете гомилу ствари на екрану 506 00:27:38,000 --> 00:27:43,000 које можете да користите да бисте онда закључити шта се заправо дешава у реду у вашем програму. 507 00:27:43,000 --> 00:27:45,000 >> Принтф има тенденцију да буде веома моћна ствар, 508 00:27:45,000 --> 00:27:47,000 али то је врло ручни процес. 509 00:27:47,000 --> 00:27:49,000 Морате да ставите иф овде, иф овде, 510 00:27:49,000 --> 00:27:51,000 и ако га ставите унутар петље можете добити 100 линија 511 00:27:51,000 --> 00:27:53,000 оутпута који онда треба да прегледати. 512 00:27:53,000 --> 00:27:58,000 То није врло разумљив или интерактивни механизам за отклањање грешака програма, 513 00:27:58,000 --> 00:28:00,000 али срећом постоји алтернатива. 514 00:28:00,000 --> 00:28:03,000 Ту је програм, на пример, зове ГДБ, ГНУ Дебуггер, 515 00:28:03,000 --> 00:28:06,000 што је мало тајанствени у томе како да га користите. 516 00:28:06,000 --> 00:28:08,000 То је мало сложенији, али искрено, 517 00:28:08,000 --> 00:28:11,000 ово је једна од оних ствари где ако сте ставили у овој недељи и следећи 518 00:28:11,000 --> 00:28:14,000 екстра сат да разумеју нешто ГДБ 519 00:28:14,000 --> 00:28:18,000 то ће вам уштедети вероватно десетине сати на дуге стазе, 520 00:28:18,000 --> 00:28:21,000 па са тим, дозволите ми да вам дам један теасер како ово функционише. 521 00:28:21,000 --> 00:28:23,000 >> Ја сам у свом терминалу. 522 00:28:23,000 --> 00:28:26,000 Дозволите ми да иде напред и саставити овај програм, бугги3. 523 00:28:26,000 --> 00:28:28,000 То је већ до сада. 524 00:28:28,000 --> 00:28:31,000 Дозволите ми да га воде, као што смо урадили док леђа, и заиста, она је покварена. 525 00:28:31,000 --> 00:28:34,000 Али, зашто је ово? Можда сам се зезнуо свап функцију. 526 00:28:34,000 --> 00:28:37,000 Можда је и б. Нисам баш их креће исправно. 527 00:28:37,000 --> 00:28:39,000 Пусти ме само напред и урадите то. 528 00:28:39,000 --> 00:28:43,000 Уместо само трчите бугги3 пусти ме, уместо покренули ову ГДБ програма, 529 00:28:43,000 --> 00:28:48,000 и ја ћу га рећи да покренете бугги3, 530 00:28:48,000 --> 00:28:52,000 и ја ћу да се укључи аргумент командне линије,-ТУИ, 531 00:28:52,000 --> 00:28:55,000 и ми ћемо ставити то у будуће проблеме у спец да подсети. 532 00:28:55,000 --> 00:28:57,000 И сада ова црна и бела интерфејс појавио да, опет, 533 00:28:57,000 --> 00:28:59,000 је мало неодољив на први јер је све ово 534 00:28:59,000 --> 00:29:02,000 Информације о гаранцији овде доле, али барем нешто познато. 535 00:29:02,000 --> 00:29:04,000 У врху прозора је мој стварни број, 536 00:29:04,000 --> 00:29:08,000 и ако сам помицати овде пусти ме дођите до самог врха мом досијеу, 537 00:29:08,000 --> 00:29:11,000 и заиста, ту је бугги3.ц, а обавештење на дну овог прозора 538 00:29:11,000 --> 00:29:13,000 Имам тај гдб промпт. 539 00:29:13,000 --> 00:29:16,000 >> Ово није исто као мој нормалан Џон Харвард линији. 540 00:29:16,000 --> 00:29:19,000 Ово је брз то ће ми дозволити да контролишу ГДБ. 541 00:29:19,000 --> 00:29:21,000 ГДБ је дебагер. 542 00:29:21,000 --> 00:29:24,000 Дебуггер је програм који вам омогућава да прођем кроз 543 00:29:24,000 --> 00:29:27,000 извршење свог програма линију по линију по линију, 544 00:29:27,000 --> 00:29:30,000 Успут ради ништа желите да програм, 545 00:29:30,000 --> 00:29:33,000 чак позивају функције, или гледа, што је још важније, 546 00:29:33,000 --> 00:29:35,000 на вредностима разне варијабле. 547 00:29:35,000 --> 00:29:37,000 Идемо напред и урадите то. 548 00:29:37,000 --> 00:29:40,000 Идем да иде напред и откуцајте рок у ГДБ је брза, 549 00:29:40,000 --> 00:29:43,000 па приметити у доњем левом углу екрана сам откуцао покрећу, 550 00:29:43,000 --> 00:29:45,000 и ја сам ударио ентер, и шта је то урадио? 551 00:29:45,000 --> 00:29:50,000 То је буквално побегао мој програм, али нисам заправо видели колико иде овде 552 00:29:50,000 --> 00:29:55,000 јер ја нисам заправо рекао дебагер 553 00:29:55,000 --> 00:29:57,000 за паузу у одређеном тренутку. 554 00:29:57,000 --> 00:29:59,000 Само куцање серију покреће програм. 555 00:29:59,000 --> 00:30:01,000 Ја заправо не видим ништа. Ја не могу да манипулишу. 556 00:30:01,000 --> 00:30:03,000 >> Уместо тога пусти ме да радим ово. 557 00:30:03,000 --> 00:30:08,000 На овом ГДБ линији дозволите ми уместо откуцате паузу, ентер. 558 00:30:08,000 --> 00:30:10,000 То није оно што сам мислио да куцате. 559 00:30:10,000 --> 00:30:13,000 Идемо уместо упишите пауза главни. 560 00:30:13,000 --> 00:30:15,000 Другим речима, желим да подесите нешто што се зове преломна тачка, 561 00:30:15,000 --> 00:30:18,000 који је пригодно назван јер ће сломити или пауза 562 00:30:18,000 --> 00:30:21,000 извршење свог програма у том месту. 563 00:30:21,000 --> 00:30:23,000 Главни је име мог функције. 564 00:30:23,000 --> 00:30:25,000 Приметимо да ГДБ је прилично паметно. 565 00:30:25,000 --> 00:30:28,000 То схватио да је главни дешава отприлике почне на линији 18 566 00:30:28,000 --> 00:30:32,000 од бугги3.ц, а онда примети овде у горњем левом углу 567 00:30:32,000 --> 00:30:34,000 б + је тик уз линију 18. 568 00:30:34,000 --> 00:30:38,000 То ме подсећа да сам поставио тачку прекида на линији 18. 569 00:30:38,000 --> 00:30:42,000 Овај пут, када куцам вожњу, ја ћу да водим програм 570 00:30:42,000 --> 00:30:45,000 до погоди ту тачку прекида, 571 00:30:45,000 --> 00:30:48,000 тако Програм ће паузирати за мене на линији 18. 572 00:30:48,000 --> 00:30:50,000 Идемо, трчи. 573 00:30:50,000 --> 00:30:53,000 Ништа изгледа да се деси, али обавештење на дну лево 574 00:30:53,000 --> 00:30:58,000 почиње програм бугги3, преломна тачка 1 у главни у бугги3.ц линији 18. 575 00:30:58,000 --> 00:31:00,000 Шта сад да радим? 576 00:31:00,000 --> 00:31:03,000 >> Приметила сам да почнете да куцате ствари попут штампе, 577 00:31:03,000 --> 00:31:08,000 Не принтф, принт к, а сада то је чудно. 578 00:31:08,000 --> 00:31:11,000 $ 1 је само радозналост, као што ћемо видети 579 00:31:11,000 --> 00:31:14,000 сваки пут када одштампате нешто добијете нову $ вредност. 580 00:31:14,000 --> 00:31:18,000 То је тако да можете да погледате назад на претходне вредности само у случају, 581 00:31:18,000 --> 00:31:21,000 али за сада шта штампа ми говори да вредност к у овом тренутку у причи 582 00:31:21,000 --> 00:31:26,000 је очигледно 134514032. 583 00:31:26,000 --> 00:31:29,000 Шта? Одакле да чак долазе? 584 00:31:29,000 --> 00:31:31,000 [Нечујан-студент] 585 00:31:31,000 --> 00:31:34,000 Заиста, то је оно што ћемо назвати вредност за смеће, а нисмо прицали о томе још, 586 00:31:34,000 --> 00:31:37,000 али разлог да покрене променљиве 587 00:31:37,000 --> 00:31:40,000 је очигледно да они имају неку вредност коју желите да имате. 588 00:31:40,000 --> 00:31:44,000 Али цака је подсетити да можете да декларишете променљиве 589 00:31:44,000 --> 00:31:46,000 као што сам урадио пре тренутак у мом примеру сигма 590 00:31:46,000 --> 00:31:48,000 без заправо дајући им вредност. 591 00:31:48,000 --> 00:31:50,000 Подсетимо шта сам урадио овде у Сигма. 592 00:31:50,000 --> 00:31:52,000 И прогласио н, али шта вредносни сам то дао? 593 00:31:52,000 --> 00:31:56,000 Нема, јер сам знао да ће у наредних неколико редова 594 00:31:56,000 --> 00:31:59,000 ГетИнт ће бринути о проблему стављања вредност унутар н. 595 00:31:59,000 --> 00:32:02,000 >> Али у овом тренутку у причи линије 11 596 00:32:02,000 --> 00:32:05,000 и линија 12 и линија 13 и линија 14 597 00:32:05,000 --> 00:32:08,000 током тих неколико линија која је вредност н? 598 00:32:08,000 --> 00:32:10,000 У Ц једноставно не знам. 599 00:32:10,000 --> 00:32:14,000 То генерално је неки смеће вредност, а неки потпуно случајан број 600 00:32:14,000 --> 00:32:17,000 који је преостао у суштини из неке претходне функције 601 00:32:17,000 --> 00:32:21,000 пошто је покренете, како ваш програм ради 602 00:32:21,000 --> 00:32:24,000 Подсећамо да функција добија функцију, функција, функцију. 603 00:32:24,000 --> 00:32:27,000 Сви ови рамови се стави на меморији, а затим те функције повратак, 604 00:32:27,000 --> 00:32:31,000 и баш као што сам предложио у гумицу њихова меморија поново користи на крају. 605 00:32:31,000 --> 00:32:37,000 Па, то је тако једноставно дешава да овај варијабилни к у овом програму 606 00:32:37,000 --> 00:32:41,000 Изгледа да садржи неку вредност као смеће 134514032 607 00:32:41,000 --> 00:32:44,000 из неког претходног функције, а не онај који сам написао. 608 00:32:44,000 --> 00:32:47,000 То може бити нешто што долази ефикасно са оперативним системом, 609 00:32:47,000 --> 00:32:49,000 неке функције испод хаубе. 610 00:32:49,000 --> 00:32:52,000 >> Ок, то је у реду, али хајде да се сада прешли на следећи ред. 611 00:32:52,000 --> 00:32:55,000 Ако укуцамо "нект" у мојој ГДБ линији и ударио ентер, 612 00:32:55,000 --> 00:32:58,000 Приметићете да истицање потезе до линије 19, 613 00:32:58,000 --> 00:33:01,000 али логично импликација је да је линија 18 614 00:33:01,000 --> 00:33:06,000 сада завршио извршавање, па ако опет откуцате "принт к" 615 00:33:06,000 --> 00:33:10,000 Сада треба да видите 1, и заиста, ја радим. 616 00:33:10,000 --> 00:33:14,000 Опет, $ ствари је начин ГДБ вас подсети 617 00:33:14,000 --> 00:33:17,000 шта историја отисака су да сте урадили. 618 00:33:17,000 --> 00:33:21,000 Сада пусти ме напред и штампају год, и заиста, и је неки луди вредност као добро, 619 00:33:21,000 --> 00:33:24,000 али ништа страшно, јер у складу 19 смо о томе да га доделите 620 00:33:24,000 --> 00:33:27,000 вредност 2, па ћу откуцати "нект" поново. 621 00:33:27,000 --> 00:33:29,000 И сада смо на принтф линији. 622 00:33:29,000 --> 00:33:31,000 Пусти ме да урадим принт к. 623 00:33:31,000 --> 00:33:34,000 Пусти ме да урадим принт год. Искрено, ја добијам мало уморан од штампања овога. 624 00:33:34,000 --> 00:33:38,000 Дозволите ми да уместо откуцајте "дисплаи Кс" и "И" дисплеј 625 00:33:38,000 --> 00:33:41,000 и сад сваки пут куцам команду у будућности 626 00:33:41,000 --> 00:33:45,000 Ја ћу бити подсетио шта је к и и, шта је к и и, шта је к и и. 627 00:33:45,000 --> 00:33:48,000 >> Могу, такође, као по страни, типа "Инфо локалаца". 628 00:33:48,000 --> 00:33:50,000 Инфо је посебна команда. 629 00:33:50,000 --> 00:33:52,000 Мештани значи да ми показује локалне променљиве. 630 00:33:52,000 --> 00:33:55,000 Само у случају да заборави или да је ово лудо, компликована функција 631 00:33:55,000 --> 00:33:57,000 да сам ја или неко други написао инфо мештани ће вам рећи 632 00:33:57,000 --> 00:34:00,000 шта су све локалне променљиве унутар ове локалне функције 633 00:34:00,000 --> 00:34:03,000 да би стало ако желите да око џаку. 634 00:34:03,000 --> 00:34:07,000 Сада, иф треба да изврши, па ћу ићи напред и само укуцајте "нект". 635 00:34:07,000 --> 00:34:10,000 Зато смо у овој средини нисмо заправо видимо 636 00:34:10,000 --> 00:34:14,000 извршава овде доле, али приметите да постаје мало унакаженог овде. 637 00:34:14,000 --> 00:34:17,000 Али приметите да је ту најважнији екран, 638 00:34:17,000 --> 00:34:21,000 тако да није савршен програм овде, али то је у реду, јер ја увек могу да џаку око 639 00:34:21,000 --> 00:34:23,000 помоћу отиска ако хоћу. 640 00:34:23,000 --> 00:34:26,000 >> Дозволите ми да се следеће откуца поново, а сада ево занимљив део. 641 00:34:26,000 --> 00:34:29,000 У овом тренутку у причи је и 2, и к је 1, 642 00:34:29,000 --> 00:34:32,000 како је предложио овде, и опет, 643 00:34:32,000 --> 00:34:35,000 Разлог је то аутоматски приказује сада јер сам користио команду 644 00:34:35,000 --> 00:34:40,000 дисплеј к и и екран, па чим сам упишите следећи 645 00:34:40,000 --> 00:34:43,000 у теорији кии би требало да постане замењен. 646 00:34:43,000 --> 00:34:45,000 Сада већ знамо да то неће бити случај, 647 00:34:45,000 --> 00:34:49,000 али ћемо видети у једном тренутку како можемо заронити дубље да схватим зашто је то истина. 648 00:34:49,000 --> 00:34:54,000 Даље, и нажалост, још увек је и 2 и к је увек 1, а ја могу да потврдим колико. 649 00:34:54,000 --> 00:34:56,000 Штампа к, принт год. 650 00:34:56,000 --> 00:34:59,000 Заиста, нема замене се заправо догодило, па кренимо овоме. 651 00:34:59,000 --> 00:35:01,000 Јасно своп је сломљен. 652 00:35:01,000 --> 00:35:04,000 Идемо уместо укуцавате "Рун". 653 00:35:04,000 --> 00:35:07,000 Дозволите ми да кажем да, желим да га поново из почетка, ентер. 654 00:35:07,000 --> 00:35:09,000 >> Сада сам назад на линији 18. 655 00:35:09,000 --> 00:35:11,000 Сада приметите к и и поново смеће вредности. 656 00:35:11,000 --> 00:35:15,000 Даље, следећи, следећи, следећи. 657 00:35:15,000 --> 00:35:17,000 Ако добијем досадно ја могу само да упишете н за следећи. 658 00:35:17,000 --> 00:35:21,000 Можете га скратили на најкраћи могући низа знакова. 659 00:35:21,000 --> 00:35:23,000 Замени је сада сломљен. 660 00:35:23,000 --> 00:35:25,000 Хајде да зароните у, тако да уместо да куцате следећи, 661 00:35:25,000 --> 00:35:30,000 Сада ћу да откуцате корак, тако да сам у одскочна ове функције 662 00:35:30,000 --> 00:35:33,000 тако да ја могу да прођем кроз њега, тако да сам ударио корак и онда ентер. 663 00:35:33,000 --> 00:35:37,000 Обратите пажњу да су наглашавајући скаче доле ниже у мом програму за линију 36. 664 00:35:37,000 --> 00:35:39,000 Сада шта су локалне променљиве? 665 00:35:39,000 --> 00:35:41,000 Инфо мештани. 666 00:35:41,000 --> 00:35:43,000 Ништа још увек зато што се нисам стигао до те линије, 667 00:35:43,000 --> 00:35:47,000 па идемо напред и рећи "нект". 668 00:35:47,000 --> 00:35:50,000 Сада ми се чини да имамо тмп, ТМП штампања. 669 00:35:50,000 --> 00:35:52,000 Смеће вредност, зар не? Мислим да је тако. 670 00:35:52,000 --> 00:35:55,000 Како би одштампали, штампање б, 1 и 2? 671 00:35:55,000 --> 00:35:58,000 У једном тренутку, чим сам упишите следећи поново 672 00:35:58,000 --> 00:36:02,000 тмп ће да преузме вредност 1, надамо се, 673 00:36:02,000 --> 00:36:05,000 јер тмп ће бити додељена вредност. 674 00:36:05,000 --> 00:36:08,000 >> Сада хајде да штампате, принт б, 675 00:36:08,000 --> 00:36:11,000 али сада штампају тмп, и то је заиста је 1. 676 00:36:11,000 --> 00:36:14,000 Дозволите ми да радимо. Дозволите ми да радимо. 677 00:36:14,000 --> 00:36:16,000 Завршио сам свап функцију. 678 00:36:16,000 --> 00:36:19,000 Ја сам још увек унутар њега у линији 40, па ћу штампање, 679 00:36:19,000 --> 00:36:22,000 принт б, и ја не брига шта тмп је. 680 00:36:22,000 --> 00:36:27,000 Изгледа своп је тачно када је у питању замене А и Б. 681 00:36:27,000 --> 00:36:31,000 Али ако сада упишете следећи, вратио скочи на линији 25, 682 00:36:31,000 --> 00:36:34,000 и наравно, ако сам тип у к и и штампе 683 00:36:34,000 --> 00:36:38,000 они су још увек непромењен, тако да не решите проблем. 684 00:36:38,000 --> 00:36:41,000 Али дијагностички сада, можда са овим програмом ГДБ 685 00:36:41,000 --> 00:36:44,000 смо бар ми стечен један корак ближе разумевању 686 00:36:44,000 --> 00:36:47,000 шта се дешава у реду, без легла наш код стављањем принтф овде, 687 00:36:47,000 --> 00:36:50,000 принтф овде, иф овде и затим га поново покренути и поново 688 00:36:50,000 --> 00:36:52,000 Покушавам да схватим шта се дешава у реду. 689 00:36:52,000 --> 00:36:55,000 >> Идем да иде напред и отказ од овога заједно са отказ. 690 00:36:55,000 --> 00:36:57,000 То ће онда рећи: "Куит уопште?" Да. 691 00:36:57,000 --> 00:37:00,000 Сада сам се вратио на моје нормалне линији, а ја сам урадио користећи ГДБ. 692 00:37:00,000 --> 00:37:03,000 Као на страну, не морате да користите ову-туи заставу. 693 00:37:03,000 --> 00:37:07,000 У ствари, ако га изоставите сте у суштини добили доњу половину екрана. 694 00:37:07,000 --> 00:37:11,000 Ако сам затим упишите пауза главни и покрените 695 00:37:11,000 --> 00:37:15,000 Још увек могу да водим програм, али шта ће учинити више текстуално 696 00:37:15,000 --> 00:37:18,000 Само ми покаже тренутну једне линије у једном тренутку. 697 00:37:18,000 --> 00:37:21,000 Тхе-туи, текстуални кориснички интерфејс, 698 00:37:21,000 --> 00:37:25,000 само ти показује више програма одједном, што је вероватно мало концепцијски лакше. 699 00:37:25,000 --> 00:37:27,000 Али заиста, могу само да се уради, нект, нект, 700 00:37:27,000 --> 00:37:30,000 и ја идем да видим једну линију у једном тренутку, и ако заиста желим да видим шта се дешава 701 00:37:30,000 --> 00:37:35,000 Ја могу да откуцате листу и видим гомилу суседних линија. 702 00:37:35,000 --> 00:37:39,000 >> Постоји видео снимак који смо се питали да ли гледају на проблем поставља 3 703 00:37:39,000 --> 00:37:43,000 у којој Нејт покрива неке од замршеност ГДБ, 704 00:37:43,000 --> 00:37:46,000 и ово је једна од оних ствари, искрено, где су неки не-тривијалан проценат од вас 705 00:37:46,000 --> 00:37:49,000 никада неће додирнути ГДБ, а то ће бити лоша ствар 706 00:37:49,000 --> 00:37:53,000 јер буквално ћете завршити трошење више времена касније овог семестра 707 00:37:53,000 --> 00:37:56,000 јури низ грешака онда би, ако се стави у тој пола сата / сат 708 00:37:56,000 --> 00:38:00,000 ове недеље и поред учења да се удобно са ГДБ. 709 00:38:00,000 --> 00:38:02,000 Принтф је био твој пријатељ. 710 00:38:02,000 --> 00:38:05,000 ГДБ би сада требало да буде ваш пријатељ. 711 00:38:05,000 --> 00:38:08,000 >> Сва питања о ГДБ? 712 00:38:08,000 --> 00:38:12,000 И овде је кратка листа неких од најмоћнијих и корисне команде. 713 00:38:12,000 --> 00:38:15,000 Да. >> Ли можете да одштампате стринг? 714 00:38:15,000 --> 00:38:17,000 Да ли можете да одштампате стринг? Апсолутно. 715 00:38:17,000 --> 00:38:19,000 То не мора да буде само бројеви. 716 00:38:19,000 --> 00:38:22,000 Ако променљива с је ниска само укуцајте у штампи с. 717 00:38:22,000 --> 00:38:24,000 То ће вам показати шта је то ниска променљива. 718 00:38:24,000 --> 00:38:26,000 [Нечујан-студент] 719 00:38:26,000 --> 00:38:28,000 То ће вам дати адресу и саму стринг. 720 00:38:28,000 --> 00:38:32,000 То ће вам показати како. 721 00:38:32,000 --> 00:38:34,000 И још једна ствар, само зато што су добри да превише знају. 722 00:38:34,000 --> 00:38:37,000 Бацктраце и рам, дозволите ми да зароне у овај последњи пут, 723 00:38:37,000 --> 00:38:39,000 Исто тачан програм са ГДБ. 724 00:38:39,000 --> 00:38:44,000 Пусти ме само напред и покрените текстуални верзију корисничког интерфејса, 725 00:38:44,000 --> 00:38:46,000 бреак главни. 726 00:38:46,000 --> 00:38:49,000 Дозволите ми да иде напред и поново покрените. Овде сам. 727 00:38:49,000 --> 00:38:55,000 Сада ме пустите следећи, следећи, следећи, следећи, следећи, корак, унесите. 728 00:38:55,000 --> 00:39:00,000 >> А сада претпоставимо Сада сам у свап намерно, али ја сам као "Проклетство, шта је вредност од к?" 729 00:39:00,000 --> 00:39:02,000 Ја не могу да урадим к више. 730 00:39:02,000 --> 00:39:05,000 Ја не могу да урадим год јер ниси у обиму. 731 00:39:05,000 --> 00:39:07,000 Они нису у контекст, али нема проблема. 732 00:39:07,000 --> 00:39:09,000 Ја могу да упишете Бацктраце. 733 00:39:09,000 --> 00:39:13,000 То ми показује све функције које су извршене до овог тренутка. 734 00:39:13,000 --> 00:39:16,000 Обратите пажњу да је један на дну, главни, линије са Главни 735 00:39:16,000 --> 00:39:18,000 био на дну нашег слике овде. 736 00:39:18,000 --> 00:39:22,000 Чињеница да своп је изнад њега линија са свап буде изнад ње у меморији овде, 737 00:39:22,000 --> 00:39:26,000 и ако желим да се вратим у главни привремено могу да кажем "рам". 738 00:39:26,000 --> 00:39:30,000 Који број? Главни је рам # 1. 739 00:39:30,000 --> 00:39:32,000 Идем да иде напред и рећи "оквир 1". 740 00:39:32,000 --> 00:39:36,000 >> Сада сам се вратио у главни, а ја могу да штампају к, а ја могу да штампају год, 741 00:39:36,000 --> 00:39:40,000 али ја не могу да одштампате или б. 742 00:39:40,000 --> 00:39:43,000 Али могу да кажем: "У реду, чекај мало, где је своп." 743 00:39:43,000 --> 00:39:46,000 Пусти ме напред и рећи "рама 0". 744 00:39:46,000 --> 00:39:48,000 Сада сам тамо где желим да будем, а као страни, 745 00:39:48,000 --> 00:39:52,000 има других команди превише, као да сте стварно досадно куцање следећи, следећи, следећи, следећи, 746 00:39:52,000 --> 00:39:56,000 обично можете рећи ствари као што је "наредних 10", као и да ће корак кроз наредних 10 линија. 747 00:39:56,000 --> 00:39:59,000 Такође можете да пишете "настави" када се заиста доста стајања кроз њега. 748 00:39:59,000 --> 00:40:05,000 Наставите ће покренути ваш програм без прекида све док се не удари другог тачку прекида, 749 00:40:05,000 --> 00:40:07,000 да ли је у петљи или ниже у вашем програму. 750 00:40:07,000 --> 00:40:11,000 >> У овом случају ми смо наставили до краја, а програм изашао нормално. 751 00:40:11,000 --> 00:40:13,000 То је фенси начин, инфериорна процес. 752 00:40:13,000 --> 00:40:16,000 Само ваш програм изашли нормално. 753 00:40:16,000 --> 00:40:24,000 Више о томе у видеу и дебаговање седницама које долазе. 754 00:40:24,000 --> 00:40:26,000 То је много. 755 00:40:26,000 --> 00:40:35,000 Узмимо овде 5-минута паузе, и ми ћемо вратити са Структуре и фајлова. 756 00:40:35,000 --> 00:40:38,000 >> Ако сте заронио у псет овонедељном већ 757 00:40:38,000 --> 00:40:41,000 знаћете да користимо у дистрибутивном коду, 758 00:40:41,000 --> 00:40:45,000 изворни код који пружамо вам као полазну тачку, неке нове технике. 759 00:40:45,000 --> 00:40:50,000 Конкретно, увели смо овај нови кључну реч зове струцт, за структуре, 760 00:40:50,000 --> 00:40:53,000 тако да можемо креирати прилагођене променљиве врста. 761 00:40:53,000 --> 00:40:57,000 Ми такође увео појам филе И / О филе улаза и излаза, 762 00:40:57,000 --> 00:41:00,000 и то је тако да можемо спасити државу 763 00:41:00,000 --> 00:41:03,000 вашег верати одбора у датотеку на диску 764 00:41:03,000 --> 00:41:06,000 тако да су наставни момци и ја могу да разумем 765 00:41:06,000 --> 00:41:09,000 шта се дешава унутар вашег програма, без потребе да ручно играју 766 00:41:09,000 --> 00:41:11,000 десетине игара Сцрамбле. 767 00:41:11,000 --> 00:41:13,000 Можемо да урадимо то више аутоматедли. 768 00:41:13,000 --> 00:41:18,000 >> Ова идеја о струцт решава прилично убедљив проблем. 769 00:41:18,000 --> 00:41:21,000 Претпоставимо да желимо да спроведе неки програм 770 00:41:21,000 --> 00:41:25,000 некако води евиденцију података о студентима, 771 00:41:25,000 --> 00:41:28,000 и студенти могу имати, на пример, ИД, име 772 00:41:28,000 --> 00:41:31,000 и кућа на оваквом месту Харварду, тако да су 3 комада информација 773 00:41:31,000 --> 00:41:34,000 желимо да око задржати, па ћу ићи напред и почните да пишете овде мало програма, 774 00:41:34,000 --> 00:41:38,000 укључују стдио.х. 775 00:41:38,000 --> 00:41:42,000 Пусти ме да радим укључују цс50.х. 776 00:41:42,000 --> 00:41:44,000 И онда почнем главну функцију. 777 00:41:44,000 --> 00:41:46,000 Нећу гњавити са било аргумената командне линије, 778 00:41:46,000 --> 00:41:49,000 и овде желим да имам студента, па ћу да кажем 779 00:41:49,000 --> 00:41:54,000 Ученик има име, па ћу да кажем "име ниске". 780 00:41:54,000 --> 00:41:59,000 Онда ћу да кажем ученик има личну карту, тако инт ид, 781 00:41:59,000 --> 00:42:03,000 и студент има кућу, па сам и ја хтео да кажем "кућу струна". 782 00:42:03,000 --> 00:42:06,000 Онда ћу наредити ово мало чисто овако. 783 00:42:06,000 --> 00:42:11,000 Ок, сада имам 3 променљивих са којима се представљају ученика, тако да "студент". 784 00:42:11,000 --> 00:42:15,000 >> А сада желим да попуните ове вредности, па ћу ићи напред и рећи нешто слично 785 00:42:15,000 --> 00:42:18,000 "Ид = 123". 786 00:42:18,000 --> 00:42:21,000 Име ће добити Давида. 787 00:42:21,000 --> 00:42:24,000 Рецимо кућа ће добити Матхер, 788 00:42:24,000 --> 00:42:31,000 и онда ћу да урадим нешто самовољно попут принтф ("% с, 789 00:42:31,000 --> 00:42:37,000 чији ИД је% д, живи у% с. 790 00:42:37,000 --> 00:42:41,000 А сада, шта ја желим да прикључите овде, један за другим? 791 00:42:41,000 --> 00:42:47,000 Име, ид кућа; повратак 0. 792 00:42:47,000 --> 00:42:50,000 Ок, ако сам зезнуо негде овде 793 00:42:50,000 --> 00:42:54,000 Мислим да имамо прилично добар програм који чува једног ученика. 794 00:42:54,000 --> 00:42:57,000 Наравно, ово није све то интересантно. Шта ако желим да имам 2 ученике? 795 00:42:57,000 --> 00:42:59,000 То није велика ствар. Ја могу да подрже 2 особе. 796 00:42:59,000 --> 00:43:03,000 Дозволите ми да иде напред и истакните ово и иди доле, 797 00:43:03,000 --> 00:43:09,000 и ја могу да кажем "ид = 456" за некога попут Роб који живи у Киркланд. 798 00:43:09,000 --> 00:43:12,000 >> Ок, чекај, али ја не могу да позовем њих иста ствар, 799 00:43:12,000 --> 00:43:15,000 и изгледа као да ћу морати да копирате ово, 800 00:43:15,000 --> 00:43:19,000 па хајде да кажем да ће то бити Давидови променљиве, 801 00:43:19,000 --> 00:43:23,000 и пусти ме да неке примерке ове за Роб. 802 00:43:23,000 --> 00:43:27,000 Ми ћемо позвати ове Робов али то не иде на посао сада 803 00:43:27,000 --> 00:43:33,000 јер сам-чекај ме је промените ид1, име1 и хоусе1. 804 00:43:33,000 --> 00:43:35,000 Роб ће бити 2, 2. 805 00:43:35,000 --> 00:43:42,000 Морам да промени ово овде, овде, овде, овде, овде, овде. 806 00:43:42,000 --> 00:43:45,000 Чекај, шта је са Томијем? Хајде да то урадимо поново. 807 00:43:45,000 --> 00:43:49,000 Очигледно је да ли и даље мислите да је ово добар начин да се то уради, није, 808 00:43:49,000 --> 00:43:52,000 па цопи / пасте лоше. 809 00:43:52,000 --> 00:43:55,000 Али смо решили ово пре недељу дана. 810 00:43:55,000 --> 00:43:59,000 >> Оно што је била наша решење када смо хтели да имамо више инстанци истог типа података? 811 00:43:59,000 --> 00:44:01,000 [Студенти] низ. 812 00:44:01,000 --> 00:44:03,000 Низ, па ћу покушати да очисти ово. 813 00:44:03,000 --> 00:44:07,000 Дозволите ми да мало простора за себе на врху, и дозволите ми уместо урадили овде. 814 00:44:07,000 --> 00:44:12,000 Ми ћемо позвати те људе, и уместо тога ћу да кажем "инт личне карте", 815 00:44:12,000 --> 00:44:14,000 и ја ћу подржати 3 од нас за сада. 816 00:44:14,000 --> 00:44:18,000 Ја ћу да кажем "имена ниски," и ја ћу подржати 3 од нас, 817 00:44:18,000 --> 00:44:22,000 и онда ћу да кажем "куће ниски," и ја ћу подржати 3 од нас. 818 00:44:22,000 --> 00:44:26,000 Сада овде уместо Дејвид добија своје локалне променљиве 819 00:44:26,000 --> 00:44:28,000 можемо се ослободити од њих. 820 00:44:28,000 --> 00:44:30,000 То је добар осећај да смо ово чишћење. 821 00:44:30,000 --> 00:44:35,000 И онда могу да кажем Дејвид ће бити [0] и имена [0] 822 00:44:35,000 --> 00:44:38,000 и куће [0]. 823 00:44:38,000 --> 00:44:41,000 И онда Роб можемо слично може да сачува на ово. 824 00:44:41,000 --> 00:44:46,000 Ставимо ово овде, тако да ће бити произвољно идс [1]. 825 00:44:46,000 --> 00:44:50,000 Он ће бити имена [1], 826 00:44:50,000 --> 00:44:53,000 и онда на крају, куће [1]. 827 00:44:53,000 --> 00:44:57,000 >> Ипак мало досадан, а сада морам да схватим ово, 828 00:44:57,000 --> 00:45:03,000 па хајде да кажемо "имена [0], ид [0], куће [0] 829 00:45:03,000 --> 00:45:06,000 и идемо плурализе ово. 830 00:45:06,000 --> 00:45:09,000 ИДС, ИДС, ИДС. 831 00:45:09,000 --> 00:45:12,000 И опет, ја то радим, па опет, ја сам већ прибегава цопи / пасте опет, 832 00:45:12,000 --> 00:45:14,000 па шансе су ту постоји још једно решење. 833 00:45:14,000 --> 00:45:18,000 Вероватно може да очисти ово даље са петље или нешто слично, 834 00:45:18,000 --> 00:45:21,000 па укратко, то је мало боље, али и даље осећа као 835 00:45:21,000 --> 00:45:24,000 Ја прибегавања цопи / пасте, али чак и ово, ја тврдим, 836 00:45:24,000 --> 00:45:27,000 заправо није фундаментално право решење, јер 837 00:45:27,000 --> 00:45:29,000 шта ако се одлучимо понекад знаш шта? 838 00:45:29,000 --> 00:45:32,000 Ми заиста требало складиштење е-маил адресе за Давида и Роб 839 00:45:32,000 --> 00:45:34,000 и сви остали у овом програму. 840 00:45:34,000 --> 00:45:36,000 Такође, треба да сачувате телефонске бројеве. 841 00:45:36,000 --> 00:45:39,000 Такође, треба да сачувате бројеве за хитне случајеве контакт. 842 00:45:39,000 --> 00:45:41,000 Имамо све ове делове података које желимо да сачува, 843 00:45:41,000 --> 00:45:43,000 па како идете о радиш то? 844 00:45:43,000 --> 00:45:46,000 >> Ти прогласити још низ на врху, а затим ручно додате 845 00:45:46,000 --> 00:45:49,000 емаил адреса [0], емаил адреса [1] 846 00:45:49,000 --> 00:45:51,000 за Давида и Роб и тако даље. 847 00:45:51,000 --> 00:45:56,000 Али стварно постоји само претпоставка у основи овај дизајн 848 00:45:56,000 --> 00:45:59,000 да ја користи систем част да знате да 849 00:45:59,000 --> 00:46:03,000 [И] у сваком од неколико низова 850 00:46:03,000 --> 00:46:06,000 само тако се дешава да се односи на исто лице, 851 00:46:06,000 --> 00:46:10,000 тако [0] у ИДС је број 123, 852 00:46:10,000 --> 00:46:13,000 и ја ћу претпоставити да имена [0] 853 00:46:13,000 --> 00:46:16,000 је иста особа име и куће [0] 854 00:46:16,000 --> 00:46:21,000 је иста особа кућа и тако даље за све разних низова које сам ствара. 855 00:46:21,000 --> 00:46:24,000 Али приметите да нема основна веза 856 00:46:24,000 --> 00:46:27,000 међу тим 3 комада информација, ИД, име и кућу, 857 00:46:27,000 --> 00:46:32,000 иако ентитет покушавамо да модел у овом програму није низови. 858 00:46:32,000 --> 00:46:35,000 Низови су само ова програмска начин да то урадите. 859 00:46:35,000 --> 00:46:38,000 Оно што заиста желимо да моделира у нашем програму је особа 860 00:46:38,000 --> 00:46:41,000 као Давид, лице као Роб унутар којих 861 00:46:41,000 --> 00:46:46,000 или енцапсулатинг је име и ИД и кућа. 862 00:46:46,000 --> 00:46:49,000 >> Можемо некако изразим ову идеју енкапсулација 863 00:46:49,000 --> 00:46:52,000 при чему особа има ИД, име и кућу 864 00:46:52,000 --> 00:46:55,000 и не прибегавају стварно овај пијук којим смо управо 865 00:46:55,000 --> 00:46:58,000 верујем да је нешто носећег 866 00:46:58,000 --> 00:47:02,000 се односи на исте људске ентитета у свакој од ових различитих низова? 867 00:47:02,000 --> 00:47:04,000 Ми заправо можемо урадити. 868 00:47:04,000 --> 00:47:08,000 Дозволите ми да одем горе главни за сада, и дозволите ми да направим свој тип података 869 00:47:08,000 --> 00:47:10,000 за стварно први пут. 870 00:47:10,000 --> 00:47:14,000 Ми смо користили ову технику у Сцрамбле, 871 00:47:14,000 --> 00:47:17,000 али овде ћу да иде напред и створи тип података, 872 00:47:17,000 --> 00:47:19,000 и знате шта, ја ћу да га зову студент или лице, 873 00:47:19,000 --> 00:47:23,000 и ја ћу користити типедеф за дефинисање тип. 874 00:47:23,000 --> 00:47:25,000 Ја ћу да кажем да је ово структура, 875 00:47:25,000 --> 00:47:29,000 а онда структура ће бити типа ученика, рећи ћемо, 876 00:47:29,000 --> 00:47:31,000 иако је мало од сада за мене. 877 00:47:31,000 --> 00:47:33,000 Ми ћемо рећи "инт ид." 878 00:47:33,000 --> 00:47:35,000 Ми ћемо рећи "име ниске". 879 00:47:35,000 --> 00:47:37,000 Онда ћемо рећи "стринг кући" 880 00:47:37,000 --> 00:47:40,000 па сада на крају ових неколико линија кода 881 00:47:40,000 --> 00:47:45,000 Управо сам научио кланг да постоји 882 00:47:45,000 --> 00:47:49,000 Тип података, поред Интс, поред жице, поред дубл, поред сплавова. 883 00:47:49,000 --> 00:47:54,000 >> Од овог тренутка у временској линији 11, сада постоји нови тип података под називом студенти, 884 00:47:54,000 --> 00:47:58,000 и сада може да прогласи променљиву студентски где ја хоћу, 885 00:47:58,000 --> 00:48:01,000 па нека ми помицати овде доле на људе. 886 00:48:01,000 --> 00:48:05,000 Сада могу да се отарасим овога, и ја могу да се вратим доле Дејвиду овде, 887 00:48:05,000 --> 00:48:10,000 и за Давида ја заиста могу да кажем да је Давид, 888 00:48:10,000 --> 00:48:13,000 можемо буквално да име променљиве после мене, 889 00:48:13,000 --> 00:48:16,000 ће бити типа студента. 890 00:48:16,000 --> 00:48:18,000 Ово може изгледати мало чудно, али то није све што другачије 891 00:48:18,000 --> 00:48:22,000 од проглашења нешто као инт или гудачки или плута. 892 00:48:22,000 --> 00:48:24,000 Тако се дешава само да се зове студента сада, 893 00:48:24,000 --> 00:48:28,000 и ако хоћу да ставим нешто унутар ове структуре 894 00:48:28,000 --> 00:48:31,000 Ја сада треба да користите нови комад синтакси, али је прилично једноставан, 895 00:48:31,000 --> 00:48:39,000 давид.ид = 123, давид.наме = "Давид" у главном Д, 896 00:48:39,000 --> 00:48:42,000 и давид.хоусе = "Матхер" 897 00:48:42,000 --> 00:48:46,000 и сада могу да се отарасим ове ствари овде. 898 00:48:46,000 --> 00:48:51,000 ОБАВЕШТЕЊЕ сада смо редизајниран наш програм заиста много бољи начин 899 00:48:51,000 --> 00:48:54,000 у смислу да се сада наш програм одражава стварни свет. 900 00:48:54,000 --> 00:48:57,000 >> Постоји реалном свету појам лице или студента. 901 00:48:57,000 --> 00:49:02,000 Ево сада имамо Ц верзију особе или тачније студент. 902 00:49:02,000 --> 00:49:05,000 Унутар тог лица су ти битне карактеристике, 903 00:49:05,000 --> 00:49:10,000 ИД, име и кућу, па Роб суштини постаје иста ствар овде доле, 904 00:49:10,000 --> 00:49:14,000 тако ученик роб, а сада роб.ид = 456, 905 00:49:14,000 --> 00:49:17,000 роб.наме = "Роб". 906 00:49:17,000 --> 00:49:20,000 Чињеница да променљива се зове Роб је некако бесмислена. 907 00:49:20,000 --> 00:49:22,000 Могли смо га звали к или и или з. 908 00:49:22,000 --> 00:49:25,000 Ми само именован је Роб бити семантички конзистентан, 909 00:49:25,000 --> 00:49:28,000 али стварно име је унутар тог самог поља, 910 00:49:28,000 --> 00:49:30,000 тако да сада имам ово. 911 00:49:30,000 --> 00:49:33,000 То, такође, не осећа као најбољи дизајн у томе сам напорно сам кодираног Давида. 912 00:49:33,000 --> 00:49:35,000 Тешко сам кодирани Роб. 913 00:49:35,000 --> 00:49:39,000 А ја и даље морати да прибегне некој копији и налепите сваки пут желим нове променљиве. 914 00:49:39,000 --> 00:49:43,000 Штавише, морам да дам очигледно сваки од ових варијабли име, 915 00:49:43,000 --> 00:49:46,000 иако бих много радије описати ове променљиве 916 00:49:46,000 --> 00:49:48,000  више уопштено као студенти. 917 00:49:48,000 --> 00:49:52,000 >> Сада можемо спојити идеје које су добро раде за нас 918 00:49:52,000 --> 00:49:56,000 и уместо тога кажу: "Знате шта, ми променљиву зове студената, 919 00:49:56,000 --> 00:50:01,000 и хајде да то буде од величине 3 ", тако да сада могу да рефине ово даље, 920 00:50:01,000 --> 00:50:04,000 отарасити ручно проглашене Дејвиду 921 00:50:04,000 --> 00:50:08,000 а ја уместо да кажем нешто студената [0] овде. 922 00:50:08,000 --> 00:50:11,000 И онда могу да кажем студената [0] овде, 923 00:50:11,000 --> 00:50:14,000 Студенти [0] овде, и тако даље, и ја могу да идем около 924 00:50:14,000 --> 00:50:16,000 и очисти то за Роб. 925 00:50:16,000 --> 00:50:19,000 Такође сам могао да одем сад мозда додајући петљу 926 00:50:19,000 --> 00:50:23,000 и коришћење ГетСтринг и ГетИнт да заиста добити ове вредности од корисника. 927 00:50:23,000 --> 00:50:27,000 Ја могу да идем о додавању константа јер ово је генерално лоша пракса 928 00:50:27,000 --> 00:50:29,000 на хард код неких као произвољан број 3 овде 929 00:50:29,000 --> 00:50:33,000 и онда само запамтите да сте ставили више од 3 ученика у њему. 930 00:50:33,000 --> 00:50:36,000 Вероватно би било боље да користимо # дефине на врху мом досијеу 931 00:50:36,000 --> 00:50:40,000 и фактор који се, па уистину, пусти ме да иде напред и генерализујемо ово. 932 00:50:40,000 --> 00:50:43,000 >> Дозволите ми да отворим један пример који је међу данашњим 933 00:50:43,000 --> 00:50:46,000 примери унапред, струцтс1. 934 00:50:46,000 --> 00:50:49,000 Ово је више комплетан програм који користи # дефине овде 935 00:50:49,000 --> 00:50:51,000 и каже да ћемо имати 3 ученика по дефаулту. 936 00:50:51,000 --> 00:50:54,000 Овде сам проглашењу класе вредну студената, 937 00:50:54,000 --> 00:50:57,000 па учионица за студенте, и сада сам помоћу петље 938 00:50:57,000 --> 00:51:00,000 само да је код мало више елегантан, населити класу 939 00:51:00,000 --> 00:51:05,000 уз учешће корисника, па прелазили од И = 0 на до студената, што је 3. 940 00:51:05,000 --> 00:51:07,000 А онда сам питати корисника у овој верзији 941 00:51:07,000 --> 00:51:10,000  Шта је ученик ИД, а ја га добити са ГетИнт. 942 00:51:10,000 --> 00:51:13,000 Шта је студентска име, а онда се то са ГетСтринг. 943 00:51:13,000 --> 00:51:15,000 Шта је студентска кућа? Капирам са ГетСтринг. 944 00:51:15,000 --> 00:51:19,000 А онда на дну овде сам одлучио да промени 945 00:51:19,000 --> 00:51:22,000 како сам штампање ове напоље и да заправо користе петљу, 946 00:51:22,000 --> 00:51:24,000 и кога ја штампање? 947 00:51:24,000 --> 00:51:27,000 Према коментару сам штампарије никога у Матхер, 948 00:51:27,000 --> 00:51:30,000 и да је тако Роб и Томи, и тако даље, заправо Томми је у Матхер. 949 00:51:30,000 --> 00:51:34,000 Томи и Дејвид ће бити штампан у овом случају, али како се то ради? 950 00:51:34,000 --> 00:51:40,000 Нисмо видели ову функцију пре, али узети погоди о томе шта то ради. 951 00:51:40,000 --> 00:51:42,000 Пореди ниске. 952 00:51:42,000 --> 00:51:45,000 >> То је мало не јасно како се пореди конце, јер се испоставило 953 00:51:45,000 --> 00:51:49,000 ако враћа 0 то значи да су стрингови су једнаки. 954 00:51:49,000 --> 00:51:53,000 Ако се врати -1 значи један алфабетски долази пред другима, 955 00:51:53,000 --> 00:51:57,000 и ако се врати +1 значи другу реч долази по абецеди 956 00:51:57,000 --> 00:52:00,000 пред другима, а можете погледати на мрежи или на ман страници 957 00:52:00,000 --> 00:52:04,000 да видим тачно на који начин је који, али све то сада ради је то да каже 958 00:52:04,000 --> 00:52:09,000 ако [и]. кућа једнака "Матхер" 959 00:52:09,000 --> 00:52:13,000 онда само напред и штампају тако и тако је у Матхер. 960 00:52:13,000 --> 00:52:16,000 Али овде је нешто нисмо видели, а ми ћемо се вратити на ово. 961 00:52:16,000 --> 00:52:21,000 Не сећам се да је икада да се то уради у било ком од мојих програма. 962 00:52:21,000 --> 00:52:24,000 Бесплатно је очигледно односи на меморију, ослобађање меморије, 963 00:52:24,000 --> 00:52:31,000 али шта меморијске ја очигледно ослобађајући у овој петљи на дну овог програма? 964 00:52:31,000 --> 00:52:34,000 Изгледа као да сам ослобађајући име особе 965 00:52:34,000 --> 00:52:37,000 и нечија кућа, али зашто је то тако? 966 00:52:37,000 --> 00:52:41,000 >> Испоставило се свих ових недеља које сте користили ГетСтринг 967 00:52:41,000 --> 00:52:45,000 смо некако били увођења грешку у свакој од својих програма. 968 00:52:45,000 --> 00:52:51,000 ГетСтринг од издваја дизајна меморије, тако да може да се врати на вас ниске, 969 00:52:51,000 --> 00:52:55,000 као Давид, или Роб, и затим могу да ураде шта год желиш 970 00:52:55,000 --> 00:52:59,000 са тим стрингом у вашем програму, јер смо резервисану меморију за вас. 971 00:52:59,000 --> 00:53:02,000 Проблем је све ово време сваки пут када позовете ГетСтринг 972 00:53:02,000 --> 00:53:05,000 ми, аутори ГетСтринг, су тражећи оперативни систем 973 00:53:05,000 --> 00:53:07,000 да нам дају мало РАМ-а за ову жицу. 974 00:53:07,000 --> 00:53:09,000 Дајте нам мало РАМ-а за ову следећу ниске. 975 00:53:09,000 --> 00:53:11,000 Дајте нам мало више РАМ за овај следећи стринг. 976 00:53:11,000 --> 00:53:13,000 Шта ви, програмер, никада нису радили 977 00:53:13,000 --> 00:53:15,000 нам даје ту меморијску леђа, 978 00:53:15,000 --> 00:53:17,000 тако да је за ових неколико недеља све програме које сте написали 979 00:53:17,000 --> 00:53:20,000 имали оно што се зове меморијски скок чиме су га користим 980 00:53:20,000 --> 00:53:24,000 све више и више меморије сваки пут када позовете ГетСтринг, и то је у реду. 981 00:53:24,000 --> 00:53:27,000 Намерно смо то у првим недељама јер није то интересантно 982 00:53:27,000 --> 00:53:29,000 морати да бринете о томе где ниска долази. 983 00:53:29,000 --> 00:53:34,000 Све што желим је реч Роб се вратити када га корисник врсте ин 984 00:53:34,000 --> 00:53:38,000 >> Али напредује сада морамо да почну све више софистициран о томе. 985 00:53:38,000 --> 00:53:42,000 Сваки пут када смо издвојити меморију на крају смо боље да преда назад. 986 00:53:42,000 --> 00:53:45,000 Иначе у стварном свету на вашем Мац-у или ПЦ-можда морати повремено искусног 987 00:53:45,000 --> 00:53:50,000 Симптоми где се ваш рачунар брушење до застоја на крају 988 00:53:50,000 --> 00:53:54,000 или глуп спиновање лопта за плажу тек заузима рачунар је 989 00:53:54,000 --> 00:53:56,000 Цела пажња и да не може да уради ствари. 990 00:53:56,000 --> 00:54:00,000 То се може објаснити било који број грешака, али међу тим могућих грешака 991 00:54:00,000 --> 00:54:03,000 се ствари називају мемори леакс којима неко ко је написао тај комад софтвера 992 00:54:03,000 --> 00:54:07,000 ви користите не заборавите да слободне меморије 993 00:54:07,000 --> 00:54:10,000 да он или она питао оперативни систем за, 994 00:54:10,000 --> 00:54:14,000 не користи ГетСтринг, јер је то ствар ЦС50, али користећи сличне функције 995 00:54:14,000 --> 00:54:16,000 да питам оперативни систем за меморију. 996 00:54:16,000 --> 00:54:19,000 Ако ви или они зајебеш и никада заправо вратити ту меморију 997 00:54:19,000 --> 00:54:24,000 симптом који може бити да програм успорава и успорава и успорава 998 00:54:24,000 --> 00:54:26,000 ако заборавите да позовете бесплатно. 999 00:54:26,000 --> 00:54:28,000 >> Вратићемо се када и зашто ће позвати бесплатно, 1000 00:54:28,000 --> 00:54:32,000 али идемо напред само за добру меру и покушајте да покренете овај посебан програм. 1001 00:54:32,000 --> 00:54:35,000 То се звало струцтс1, ентер. 1002 00:54:35,000 --> 00:54:40,000 Дозволите ми да иде напред и покрените струцтс1, 123, Дејвид Матхер, 1003 00:54:40,000 --> 00:54:47,000 456, Роб Киркланд, 789, 1004 00:54:47,000 --> 00:54:50,000 Томи Матхер и видимо Давидов је у Матхер, Томми је у Матхер. 1005 00:54:50,000 --> 00:54:53,000 Ово је само мало разум проверите да програм ради. 1006 00:54:53,000 --> 00:54:56,000 Сада, нажалост, овај програм је мало фрустрирајуће у томе 1007 00:54:56,000 --> 00:55:00,000 Ја сам све то раде, ја сам откуцао у 9 различитих жице, притисните ентер, 1008 00:55:00,000 --> 00:55:04,000 је рекао ко је био у Матхер, али очигледно сам знао ко је био у Матхер већ зато што сам откуцао. 1009 00:55:04,000 --> 00:55:07,000 Било би лепо ако барем овај програм је више као базе података 1010 00:55:07,000 --> 00:55:10,000 и то је заправо памти оно што сам откуцао у 1011 00:55:10,000 --> 00:55:12,000 па сам опет не морате да унос ове студентске евиденције. 1012 00:55:12,000 --> 00:55:15,000 Можда је као регистрариал система. 1013 00:55:15,000 --> 00:55:21,000 >> Можемо да урадимо ово користећи ову технику познату као филе И / О филе улаза и излаза, 1014 00:55:21,000 --> 00:55:24,000 Веома генерички начин да се каже било које време желите да прочитате фајлове или напиши фајлове 1015 00:55:24,000 --> 00:55:26,000 можете да урадите ово са неког скупа функција. 1016 00:55:26,000 --> 00:55:29,000 Дозволите ми да иде напред и отвори ову струцтс2.ц пример, 1017 00:55:29,000 --> 00:55:33,000 који је готово идентичан, али хајде да видимо шта је то сада чини. 1018 00:55:33,000 --> 00:55:36,000 На врху фајла изјављујем класу студената. 1019 00:55:36,000 --> 00:55:38,000 Онда попуните класу са улаза корисника, 1020 00:55:38,000 --> 00:55:41,000 па те линије кода су управо као пре. 1021 00:55:41,000 --> 00:55:45,000 Онда, ако сам доле помицати овде одштампали свако ко је у Матхер произвољно као и пре, 1022 00:55:45,000 --> 00:55:47,000 али ово је интересантно нова функција. 1023 00:55:47,000 --> 00:55:51,000 Ове линије кода су нови, и они уведу нешто овде, 1024 00:55:51,000 --> 00:55:55,000 Филе, све капе, и то је * у и овде. 1025 00:55:55,000 --> 00:55:58,000 Дозволите ми да померим ово овде, а * овамо као добро. 1026 00:55:58,000 --> 00:56:00,000 >> Ова функција нисмо видели, фопен, 1027 00:56:00,000 --> 00:56:03,000 али то значи фајл отворен, па хајде да прелистам преко њих, 1028 00:56:03,000 --> 00:56:05,000 и то је нешто што ћемо вратити у будућим псетс, 1029 00:56:05,000 --> 00:56:10,000 али овај ред овде у суштини отвара фајл под називом базе података, 1030 00:56:10,000 --> 00:56:13,000 а посебно га отвара на такав начин да може да уради шта на њега? 1031 00:56:13,000 --> 00:56:15,000 [Нечујан-студент] 1032 00:56:15,000 --> 00:56:19,000 Добро, па "в" само значи да говори оперативни систем 1033 00:56:19,000 --> 00:56:21,000 отворите овај фајл на такав начин да могу да пишем на њега. 1034 00:56:21,000 --> 00:56:23,000 Ја не желим да га прочитам. Ја не желим само да га погледам. 1035 00:56:23,000 --> 00:56:26,000 Желим да га промените и додајте ствари потенцијално њега, 1036 00:56:26,000 --> 00:56:28,000 и фајл ће се звати база података. 1037 00:56:28,000 --> 00:56:30,000 То би се могло назвати ништа. 1038 00:56:30,000 --> 00:56:32,000 Ово би могло да буде датабасе.ткт. Ово би могло да буде дб.. 1039 00:56:32,000 --> 00:56:37,000 Ово би могао да буде реч као фоо, али сам самовољно одлучио да именује базу података датотеке. 1040 00:56:37,000 --> 00:56:42,000 Ово је мало разум провера да ћемо се вратити у великом детаљно током времена, 1041 00:56:42,000 --> 00:56:47,000 ако је ФП, за датотеку показивача, није једнак НУЛЛ значи све је добро. 1042 00:56:47,000 --> 00:56:51,000 >> Да скратимо причу, функционише попут фопен понекад не. 1043 00:56:51,000 --> 00:56:53,000 Можда датотека не постоји. Можда сте ван простора на диску. 1044 00:56:53,000 --> 00:56:55,000 Можда немате дозволу за тај фолдер, 1045 00:56:55,000 --> 00:56:58,000 па ако фопен враца нулл нешто лоше десило. 1046 00:56:58,000 --> 00:57:02,000 Насупрот томе, ако фопен не враћа нулл све је добро 1047 00:57:02,000 --> 00:57:04,000 и ја могу да почнем да пишем на овом фајлу. 1048 00:57:04,000 --> 00:57:06,000 Ево нови трик. 1049 00:57:06,000 --> 00:57:08,000 Ово је за петљу која је итератинг над сваким од мојих ученика, 1050 00:57:08,000 --> 00:57:10,000 а ово изгледа тако слично ономе што смо урадили раније, 1051 00:57:10,000 --> 00:57:15,000 али ова функција је рођак иф позвао фпринтф за датотеку принтф, 1052 00:57:15,000 --> 00:57:18,000 и приметио да је то другачије у само 2 начина. 1053 00:57:18,000 --> 00:57:20,000 Једна, она почиње са ф уместо п, 1054 00:57:20,000 --> 00:57:23,000 али онда је први аргумент је очигледно шта? 1055 00:57:23,000 --> 00:57:25,000 [Студенти] Филе. >> То је фајл. 1056 00:57:25,000 --> 00:57:30,000 Ова ствар се зове ФП, који смо на крају ћемо задиркивао, осим што фајл поинтер је, 1057 00:57:30,000 --> 00:57:35,000 али за сада фп једноставно представља фајл који сам отворио, 1058 00:57:35,000 --> 00:57:41,000 па иф овде говори штампање ИД страницу корисника у датотеци, а не на екрану. 1059 00:57:41,000 --> 00:57:44,000 Принт име корисника у датотеци, а не на екрану, 1060 00:57:44,000 --> 00:57:47,000 кућа фајла, не на екрану, а затим овде, очигледно, 1061 00:57:47,000 --> 00:57:50,000 затворите датотеку, а затим овамо без меморије. 1062 00:57:50,000 --> 00:57:53,000 >> Једина разлика између ове верзије 2 и верзија 1 1063 00:57:53,000 --> 00:57:58,000 је увођење фопен и овај фајл са * 1064 00:57:58,000 --> 00:58:01,000 а овај појам фпринтф, па хајде да видимо шта крајњи резултат је. 1065 00:58:01,000 --> 00:58:03,000 Пусти ме да идем у мој прозор терминала. 1066 00:58:03,000 --> 00:58:06,000 Дозволите ми да покренете струцтс2, ентер. 1067 00:58:06,000 --> 00:58:09,000 Изгледа као да је све у реду. Идемо реприза струцтс2. 1068 00:58:09,000 --> 00:58:15,000 123, Дејвид Матхер, 456, Роб Киркланд, 1069 00:58:15,000 --> 00:58:19,000 789, Томи Матхер, унесите. 1070 00:58:19,000 --> 00:58:23,000 Изгледа као да се понашали исто, али ако ја сад лс 1071 00:58:23,000 --> 00:58:28,000 приметити шта датотека је овде међу свим мојим кодом, база података, 1072 00:58:28,000 --> 00:58:32,000 па хајде да отворимо ту, гедит базе података, и поглед на то. 1073 00:58:32,000 --> 00:58:34,000 То није најсексепилнији од формата. 1074 00:58:34,000 --> 00:58:38,000 То је заиста један део података линије по линији по реду, 1075 00:58:38,000 --> 00:58:42,000 али они од вас који користе Екцел или ЦСВ датотеке, зарез раздвојене вредности, 1076 00:58:42,000 --> 00:58:47,000 Би сигурно сам фпринтф користи да уместо можда овако нешто 1077 00:58:47,000 --> 00:58:50,000 тако да сам стварно могао створити еквивалент Екцел фајл 1078 00:58:50,000 --> 00:58:53,000 одвајањем ствари са зарезима, а не само нове линије. 1079 00:58:53,000 --> 00:58:56,000 >> У овом случају, ако сам је користио уместо зареза уместо нове линије 1080 00:58:56,000 --> 00:59:01,000 Буквално сам могао да отвори овај фајл базе података у Екцел ако сам уместо тога направио да изгледа овако. 1081 00:59:01,000 --> 00:59:03,000 Укратко, сада када имамо моћ да пише у фајлове 1082 00:59:03,000 --> 00:59:07,000 сада можемо почети Непромењен податке, држећи га око на диску 1083 00:59:07,000 --> 00:59:10,000 тако да можемо да информације око изнова и изнова. 1084 00:59:10,000 --> 00:59:14,000 Обавештење неколико других ствари које су сада мало позната. 1085 00:59:14,000 --> 00:59:16,000 На врху овог фајла Ц имамо типедеф 1086 00:59:16,000 --> 00:59:21,000 јер смо желели да створе тип података који представља реч, 1087 00:59:21,000 --> 00:59:25,000 тако да овај тип се зове реч, и унутар ове структуре 1088 00:59:25,000 --> 00:59:27,000 то је мало одгајивача сада. 1089 00:59:27,000 --> 00:59:30,000 Зашто је реч састављена од низа очигледно? 1090 00:59:30,000 --> 00:59:33,000 Шта је реч само интуитивно? 1091 00:59:33,000 --> 00:59:35,000 >> То је низ знакова. 1092 00:59:35,000 --> 00:59:37,000 То је низ знакова поново враћа се назад. 1093 00:59:37,000 --> 00:59:41,000 ПИСМА у свим капе деси да ми произвољно рећи максимална дужина 1094 00:59:41,000 --> 00:59:44,000 било речи у речнику који користимо за Сцрамбле. 1095 00:59:44,000 --> 00:59:46,000 Зашто имам +1? 1096 00:59:46,000 --> 00:59:48,000 Поништеног карактер. 1097 00:59:48,000 --> 00:59:51,000 Подсетимо, када смо урадили Бананаграмс пример нам је потребно посебну вредност 1098 00:59:51,000 --> 00:59:55,000 на крају речи, како да пратите 1099 00:59:55,000 --> 00:59:59,000 где речи заиста завршио и као проблем скуп спецификација каже 1100 00:59:59,000 --> 01:00:03,000 Овде смо дружење са датом речју боолеан вредност, 1101 01:00:03,000 --> 01:00:05,000 застава, да тако кажем, тачно или нетачно. 1102 01:00:05,000 --> 01:00:09,000 Да ли сте већ пронашао ову реч, јер смо схватили 1103 01:00:09,000 --> 01:00:13,000 стварно потребан начин сећања не само шта реч је Сцрамбле 1104 01:00:13,000 --> 01:00:15,000 али да ли или не вама, људи, нису га нашли 1105 01:00:15,000 --> 01:00:20,000 тако да ако радите наћи реч "је" не можете куцати, унесите је, унесите је, унесите 1106 01:00:20,000 --> 01:00:23,000 и добити 3 поена, 3 поена, 3 поена, 3 поена. 1107 01:00:23,000 --> 01:00:26,000 Ми желимо да будемо у могућности да црну листу ту реч постављањем боол 1108 01:00:26,000 --> 01:00:29,000 да важи ако сте већ нашли, па зато смо 1109 01:00:29,000 --> 01:00:31,000 садржана је у тој структури. 1110 01:00:31,000 --> 01:00:35,000 >> Сада, овде у јагма да је ово друго струцт зове речник. 1111 01:00:35,000 --> 01:00:39,000 Одсуство овде је реч типедеф јер у том случају 1112 01:00:39,000 --> 01:00:43,000 морали смо да обухвати идеју речнику, 1113 01:00:43,000 --> 01:00:46,000 и речник садржи гомилу речи, 1114 01:00:46,000 --> 01:00:49,000 као подразумевао овом низу, а колико од тих речи су тамо? 1115 01:00:49,000 --> 01:00:51,000 Па, шта год то променљива зове величине каже. 1116 01:00:51,000 --> 01:00:53,000 Али ми само треба један речник. 1117 01:00:53,000 --> 01:00:55,000 Не треба тип података зове речник. 1118 01:00:55,000 --> 01:00:58,000 Ми само треба један од њих, тако да испада у Ц 1119 01:00:58,000 --> 01:01:03,000 да ако не кажеш типедеф, само реци струцт, онда унутар заграда 1120 01:01:03,000 --> 01:01:05,000 сте ставили своје променљиве, онда стави име. 1121 01:01:05,000 --> 01:01:09,000 Ово је прогласио једну променљиву зове речник 1122 01:01:09,000 --> 01:01:11,000 то изгледа овако. 1123 01:01:11,000 --> 01:01:16,000 Насупрот томе, ове линије стварају вишекратну употребу структуру података под називом реч 1124 01:01:16,000 --> 01:01:19,000 да можете да направите више копија, баш као што смо створили 1125 01:01:19,000 --> 01:01:22,000 више копија ученика. 1126 01:01:22,000 --> 01:01:24,000 >> Шта се то на крају нам омогућити да радимо? 1127 01:01:24,000 --> 01:01:30,000 Дозволите ми да се вратим у, рецимо, једноставнији пример од једноставнијих времена, 1128 01:01:30,000 --> 01:01:34,000 и пусти ме да отворим, рецимо, цомпаре1.ц. 1129 01:01:34,000 --> 01:01:38,000 Проблем овде на руци је заправо одлепите 1130 01:01:38,000 --> 01:01:41,000 слој ниске и почети полетање ове обуке точкове 1131 01:01:41,000 --> 01:01:44,000 јер испада да је ниска све ово време 1132 01:01:44,000 --> 01:01:47,000 је као што смо обећали у недељу 1. заиста само надимак, 1133 01:01:47,000 --> 01:01:51,000 синоним из ЦС50 библиотеке за нешто што изгледа мало више криптично, 1134 01:01:51,000 --> 01:01:53,000 цхар *, а ми смо видели ову звезду пре. 1135 01:01:53,000 --> 01:01:55,000 Ми смо то видели у контексту фајлова. 1136 01:01:55,000 --> 01:01:59,000 >> Да сада видимо зашто смо се крије овај детаљ за неко време сада. 1137 01:01:59,000 --> 01:02:02,000 Овде је фајл под цомпаре1.ц, 1138 01:02:02,000 --> 01:02:07,000 и то очигледно пита корисника за 2 жице, С и Т, 1139 01:02:07,000 --> 01:02:11,000 а онда покушава да упореди те жице за равноправност у складу 26, 1140 01:02:11,000 --> 01:02:14,000 и ако су они једнаки каже, "Ти откуцао исту ствар" 1141 01:02:14,000 --> 01:02:17,000 и ако они нису једнаки каже, "Ти откуцао различите ствари." 1142 01:02:17,000 --> 01:02:19,000 Дозволите ми да иде напред и покрените овај програм. 1143 01:02:19,000 --> 01:02:23,000 Пусти ме да идем у мој изворни директоријум, направите цомпаре1. Ок саставио је. 1144 01:02:23,000 --> 01:02:25,000 Дозволите ми да покренете цомпаре1. 1145 01:02:25,000 --> 01:02:27,000 Ја ћу увећали, ентер. 1146 01:02:27,000 --> 01:02:29,000 Реци нешто. ЗДРАВО. 1147 01:02:29,000 --> 01:02:32,000 Ја ћу рећи нешто поново. ЗДРАВО. 1148 01:02:32,000 --> 01:02:34,000 Ја дефинитивно нисам тип различите ствари. 1149 01:02:34,000 --> 01:02:37,000 >> Дозволите ми да покушам поново. Бие бие. 1150 01:02:37,000 --> 01:02:40,000 Дефинитивно не разликује, па шта се овде дешава? 1151 01:02:40,000 --> 01:02:44,000 Па, шта се заиста се пореди у складу 26? 1152 01:02:44,000 --> 01:02:46,000 [Нечујан-студент] 1153 01:02:46,000 --> 01:02:49,000 Да, тако испада да стринг, тип података, је врста беле лажи. 1154 01:02:49,000 --> 01:02:53,000 Стринг је цхар *, али шта је цхар *? 1155 01:02:53,000 --> 01:02:56,000 Цхар *, како кажу, је показивач, 1156 01:02:56,000 --> 01:03:00,000 и показивач је ефикасно адреса, 1157 01:03:00,000 --> 01:03:05,000 збир локација у меморији, а ако вам се деси да сте откуцали у једном речју као ЗДРАВО, 1158 01:03:05,000 --> 01:03:08,000 сећам из претходних дискусија о жицама 1159 01:03:08,000 --> 01:03:16,000 ово је као реч ЗДРАВО. 1160 01:03:16,000 --> 01:03:19,000 Запамтите да реч као здраво може бити представљена 1161 01:03:19,000 --> 01:03:22,000 као низ знакова као што је овај 1162 01:03:22,000 --> 01:03:25,000 а затим са посебним карактером на крају зове нулл карактер, 1163 01:03:25,000 --> 01:03:27,000 као \ означава. 1164 01:03:27,000 --> 01:03:29,000 Шта је заправо ниска? 1165 01:03:29,000 --> 01:03:32,000 Обратите пажњу да је ово више комади меморије, 1166 01:03:32,000 --> 01:03:36,000 и, у ствари, крај ње је позната само када погледате кроз читав низ 1167 01:03:36,000 --> 01:03:38,000 у потрази за специјалне нулл карактером. 1168 01:03:38,000 --> 01:03:41,000 Али, ако је ово комад сећања из меморије мог рачунара, 1169 01:03:41,000 --> 01:03:44,000 хајде произвољно рећи да овај стринг само посрећило, 1170 01:03:44,000 --> 01:03:47,000 а добио налази на самом почетку мог РАМ рачунара. 1171 01:03:47,000 --> 01:03:54,000 То је бајт 0, 1, 2, 3, 4, 5, 6 ... 1172 01:03:54,000 --> 01:04:02,000 >> Када кажем нешто као ГетСтринг и радим Стринг с = ГетСтринг 1173 01:04:02,000 --> 01:04:04,000 шта се заиста враћа? 1174 01:04:04,000 --> 01:04:08,000 За протеклих неколико недеља, шта се заиста се чувају у С 1175 01:04:08,000 --> 01:04:13,000 није овај стринг по себи, али у овом случају оно што се чувају је 1176 01:04:13,000 --> 01:04:18,000 број 0, јер оно што заправо чини ГетСтринг 1177 01:04:18,000 --> 01:04:20,000 се она не врати физички низ. 1178 01:04:20,000 --> 01:04:22,000 То чак не баш да концептуални смисао. 1179 01:04:22,000 --> 01:04:24,000 Шта ради повратак је број. 1180 01:04:24,000 --> 01:04:28,000 Тај број је адреса у меморији ЗДРАВО, 1181 01:04:28,000 --> 01:04:32,000 и гудачки а онда, ако се одлепите овај слој, гудачки заиста не постоји. 1182 01:04:32,000 --> 01:04:35,000 То је само поједностављење у ЦС50 библиотеци. 1183 01:04:35,000 --> 01:04:38,000 >> Ово је заиста нешто што се зове цхар *. 1184 01:04:38,000 --> 01:04:41,000 Знак има смисла, јер шта је реч, као што је ЗДРАВО? 1185 01:04:41,000 --> 01:04:44,000 Па, то је серија карактера, низ знакова. 1186 01:04:44,000 --> 01:04:47,000 Знак * значи адресу карактера, 1187 01:04:47,000 --> 01:04:50,000 па шта то значи да врати стринг? 1188 01:04:50,000 --> 01:04:53,000 Лепо, једноставно начин враћања ниску 1189 01:04:53,000 --> 01:04:57,000 је уместо да покуша да схватим како сам се врати на 5 или 6 различитих бајтова 1190 01:04:57,000 --> 01:05:01,000 дозволите ми да се вратим на адресу коју бајт? 1191 01:05:01,000 --> 01:05:03,000 Прво. 1192 01:05:03,000 --> 01:05:06,000 Другим речима, дозволите ми да вам дам адресу карактера у меморији. 1193 01:05:06,000 --> 01:05:10,000 То је оно што цхар представља, адреса једног карактера у меморији. 1194 01:05:10,000 --> 01:05:12,000 Позив да се променљива с. 1195 01:05:12,000 --> 01:05:15,000 Чувати на с да се посебна адреса, коју сам произвољно рекао је 0, 1196 01:05:15,000 --> 01:05:19,000 Само да све буде једноставно, али у стварности је то генерално је већи број. 1197 01:05:19,000 --> 01:05:21,000 >> Чекај мало. 1198 01:05:21,000 --> 01:05:23,000 Ако само дајеш ми адресу првог карактера, како да знам шта је адреса 1199 01:05:23,000 --> 01:05:25,000 другог карактера, трећи, четврти и пети? 1200 01:05:25,000 --> 01:05:27,000 [Нечујан-студент] 1201 01:05:27,000 --> 01:05:31,000 Ви само знате где крај стринга је путем ове практичне трик, 1202 01:05:31,000 --> 01:05:35,000 тако да када користите нешто иф, иф оно буквално узима као аргумент, 1203 01:05:35,000 --> 01:05:39,000 Подсећамо да користимо ове чувар места% с, и онда прође 1204 01:05:39,000 --> 01:05:41,000 променљива која се складишти стринг. 1205 01:05:41,000 --> 01:05:47,000 Оно што стварно јесте доношење адреса првог карактера тог низа. 1206 01:05:47,000 --> 01:05:50,000 Принтф затим користи за петље или док петља по добијању те адресе, 1207 01:05:50,000 --> 01:05:53,000 на пример, 0, па пусти мене да то сада, 1208 01:05:53,000 --> 01:06:02,000 принтф ("% с \ н", с); 1209 01:06:02,000 --> 01:06:07,000 Када зовем принтф ("% с \ н", с); шта сам стварно принтф пружимо 1210 01:06:07,000 --> 01:06:13,000 је адреса првог карактера у с, што је у овом случају је произвољно Х. 1211 01:06:13,000 --> 01:06:16,000 >> Како принтф знам шта је тачно да се прикаже на екрану? 1212 01:06:16,000 --> 01:06:19,000 Особа која спроводи иф спровела вхиле петљу или за петљу 1213 01:06:19,000 --> 01:06:23,000 која каже да се овај лик једнак посебан карактер нулл? 1214 01:06:23,000 --> 01:06:25,000 Ако није, штампа. Шта мислите о овоме? 1215 01:06:25,000 --> 01:06:28,000 Ако не штампају, да га одштампате, одштампајте, одштампате га. 1216 01:06:28,000 --> 01:06:32,000 Ох, ово је посебна. Стоп штампање и вратити кориснику. 1217 01:06:32,000 --> 01:06:35,000 И то је буквално све што се дешава испод хаубе, 1218 01:06:35,000 --> 01:06:38,000 и то је доста да свари у првом дану класе, 1219 01:06:38,000 --> 01:06:43,000 али за сада је то заиста зграда блок разумевања свега 1220 01:06:43,000 --> 01:06:46,000 која се дешава унутар нашег сећања рачунара, 1221 01:06:46,000 --> 01:06:49,000 и на крају ћемо задиркивао ово осим уз малу помоћ 1222 01:06:49,000 --> 01:06:51,000 од једног од наших пријатеља у Стенфорду. 1223 01:06:51,000 --> 01:06:56,000 >> Професор Ницк Парланте на Станфорду је урадио овај предиван видео секвенцу 1224 01:06:56,000 --> 01:06:58,000 од свих врста различитих језика које су увеле 1225 01:06:58,000 --> 01:07:00,000 ово мало Цлаиматион карактер Бинки. 1226 01:07:00,000 --> 01:07:03,000 Глас да намеравате да чујете у само неколико другом увид 1227 01:07:03,000 --> 01:07:05,000 је да је од Станфорд професора, а ви добијате 1228 01:07:05,000 --> 01:07:07,000 сада само 5 или 6 секунди овог права, 1229 01:07:07,000 --> 01:07:09,000 али ово је белешка о којима ћемо закључити данас 1230 01:07:09,000 --> 01:07:11,000 и почне у среду. 1231 01:07:11,000 --> 01:07:15,000 Дајем вам Поинтер забаве са Бинки, преглед. 1232 01:07:15,000 --> 01:07:18,000 [♪ ♪ Мусиц] [Професор Парланте] Хеј, Бинки. 1233 01:07:18,000 --> 01:07:21,000 Пробудите се. То је време за забаву показивача. 1234 01:07:21,000 --> 01:07:24,000 [Бинки] Шта је то? Сазнајте више о тројке? 1235 01:07:24,000 --> 01:07:26,000 О, снаша! 1236 01:07:26,000 --> 01:07:29,000 >> Ми ћемо вас видети у среду. 1237 01:07:29,000 --> 01:07:32,000 [ЦС50.ТВ]