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