1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> DAVID J. Malan: Добре. 3 00:00:12,900 --> 00:00:16,790 Така че, добре дошли в първата по рода си CS50 аутопсия за тест. 4 00:00:16,790 --> 00:00:18,340 Ние смятахме, че ще се сложи началото тази традиция тази година. 5 00:00:18,340 --> 00:00:20,960 И това ще бъде възможност да преминете през 6 00:00:20,960 --> 00:00:22,220 решения на теста. 7 00:00:22,220 --> 00:00:26,160 И ние ще се ускори или забави базирани относно интереса на тези тук. 8 00:00:26,160 --> 00:00:29,730 >> Така че, вие вероятно сте тук, защото вие сте интересуват от това как бихте могли да имат или 9 00:00:29,730 --> 00:00:31,170 е трябвало да отговори на някои на тези проблеми. 10 00:00:31,170 --> 00:00:33,300 Така че защо да не можем да разгледаме в този раздел на първо място? 11 00:00:33,300 --> 00:00:34,450 Така че все струни. 12 00:00:34,450 --> 00:00:37,600 Това ще ви даде три различни версии на програма, която е, в крайна сметка, 13 00:00:37,600 --> 00:00:39,650 означаваше да се получи низ от потребителя. 14 00:00:39,650 --> 00:00:42,530 Дали не го е направил, че е наляво, за да можете да се определи. 15 00:00:42,530 --> 00:00:45,150 >> И ние попита Въпрос 0, Предполагам, че тази версия е едно 16 00:00:45,150 --> 00:00:46,400 съставен и се изпълнява. 17 00:00:46,400 --> 00:00:48,860 Защо може segfault програмата? 18 00:00:48,860 --> 00:00:51,150 На пръв поглед, някакви предложения , защо? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 Да. 21 00:00:54,489 --> 00:00:59,260 >> ПУБЛИКАТА: Така Спомням си тази в предишна например за разглеждане на 22 00:00:59,260 --> 00:01:05,506 Чар * е и виждането на сканирането на S и виждайки, защото това е една показалка, как 23 00:01:05,506 --> 00:01:07,971 го засяга това, което сканира? 24 00:01:07,971 --> 00:01:10,940 Дали това е или адреса на е? 25 00:01:10,940 --> 00:01:11,180 >> DAVID J. Malan: OK. 26 00:01:11,180 --> 00:01:11,480 Добре. 27 00:01:11,480 --> 00:01:14,830 Така че, в крайна сметка, източникът на всеки проблем се предполага, че ще се намали 28 00:01:14,830 --> 00:01:16,210 за тази променлива и. 29 00:01:16,210 --> 00:01:17,280 И това е наистина една променлива. 30 00:01:17,280 --> 00:01:19,900 Типът данни на тази променлива е Чар *, което означава, че ще 31 00:01:19,900 --> 00:01:22,570 съдържа адреса на герой. 32 00:01:22,570 --> 00:01:23,850 И в това е прозрението. 33 00:01:23,850 --> 00:01:28,330 Тя ще съдържа адреса на характер или, по-общо казано, 34 00:01:28,330 --> 00:01:32,110 адрес на първия знак в цял блок от символи. 35 00:01:32,110 --> 00:01:36,680 >> Но уловката е, че и сканиране, цел в живот, се дава един адрес и предвид 36 00:01:36,680 --> 00:01:40,960 код формат, като% S, прочетете низ в парчето 37 00:01:40,960 --> 00:01:42,330 памет на този адрес. 38 00:01:42,330 --> 00:01:46,040 Но тъй като има знак за равенство не преди че точка и запетая на първия 39 00:01:46,040 --> 00:01:49,310 ред с код, защото ние всъщност не разпредели всяко памет с 40 00:01:49,310 --> 00:01:53,020 изчистване, защото тя всъщност не разпределят масив от някои размери, всички 41 00:01:53,020 --> 00:01:57,620 , което правиш е четене на потребителя клавиатура вход в някаква пълна 42 00:01:57,620 --> 00:02:00,490 стойност на боклука, който е в а по подразбиране. 43 00:02:00,490 --> 00:02:04,480 Така че шансовете са ти започваш да segfault ако този адрес не просто така се случи, 44 00:02:04,480 --> 00:02:08,009 да бъде на стойност, която можете, в действителност, пишете на. 45 00:02:08,009 --> 00:02:10,889 Така че лошо да не се разпределя паметта си там. 46 00:02:10,889 --> 00:02:13,150 >> Така че в един въпрос, ние попита, Предполагам, че е версия 2 47 00:02:13,150 --> 00:02:14,230 съставен и се изпълнява. 48 00:02:14,230 --> 00:02:15,900 Защо може segfault тази програма? 49 00:02:15,900 --> 00:02:17,990 Така че това е един по-малко бъги. 50 00:02:17,990 --> 00:02:21,470 И там е наистина само една очевиден начин, където можете да 51 00:02:21,470 --> 00:02:22,810 предизвика segfault тук. 52 00:02:22,810 --> 00:02:23,730 И това е тематична. 53 00:02:23,730 --> 00:02:28,180 Всеки път, когато използвате в в паметта, което може ли да направите, за да предизвика segfault 54 00:02:28,180 --> 00:02:30,718 с версия 2? 55 00:02:30,718 --> 00:02:35,560 >> ПУБЛИКАТА: Ако използвате този вход в низ, който е по-дълъг от 49 56 00:02:35,560 --> 00:02:35,975 символа. 57 00:02:35,975 --> 00:02:37,260 >> DAVID J. Malan: Точно така. 58 00:02:37,260 --> 00:02:41,420 Всеки път, когато видите нещо, с фиксирана дължина когато става въпрос за масив, вашият 59 00:02:41,420 --> 00:02:44,650 радар трябва да изгасне, че това би могло да бъде проблематично, ако не сте проверка на 60 00:02:44,650 --> 00:02:45,810 граници на масив. 61 00:02:45,810 --> 00:02:46,650 И това е проблемът тук. 62 00:02:46,650 --> 00:02:47,910 Ние все още използвате scanf. 63 00:02:47,910 --> 00:02:52,200 Ние все още използвате% S, което означава, опитайте да се чете низ от потребителя. 64 00:02:52,200 --> 00:02:56,300 Това ще се чете в S, който, в този момент, е ефективно 65 00:02:56,300 --> 00:02:58,570 адрес на парче памет или това е еквивалентно. 66 00:02:58,570 --> 00:03:02,080 Това е името на масива на символа на паметта. 67 00:03:02,080 --> 00:03:07,610 >> Но точно това, ако прочетете низ това е по-дълъг от 49 символа, 49 68 00:03:07,610 --> 00:03:10,440 защото имате нужда от място за наклонената черта 0, ти започваш да се прелее 69 00:03:10,440 --> 00:03:11,390 че буфер. 70 00:03:11,390 --> 00:03:16,410 И вие може да се късметлия и да бъде в състояние да напиши 51ва характер, 52ри, 53-та. 71 00:03:16,410 --> 00:03:18,560 Но в един момент, операционната система ще кажа, не. 72 00:03:18,560 --> 00:03:21,270 Това определено не е памет ти е позволено да се докоснат. 73 00:03:21,270 --> 00:03:23,380 И програмата ще segfault. 74 00:03:23,380 --> 00:03:26,650 >> Така че, евристичния трябва да има никакви време имаш определена дължина, трябва 75 00:03:26,650 --> 00:03:30,150 да сте сигурни, че проверка на дължината на каквото и да е, което се опитвам 76 00:03:30,150 --> 00:03:31,090 да се чете в него. 77 00:03:31,090 --> 00:03:35,110 >> ПУБЛИКАТА: Така че да се реши, че бихте могли да са имали изявление проверка всъщност 78 00:03:35,110 --> 00:03:37,140 е по-голяма дължина от или по-малко от? 79 00:03:37,140 --> 00:03:37,730 >> DAVID J. Malan: Абсолютно. 80 00:03:37,730 --> 00:03:41,706 Вие просто имате състояние който казва, ако - 81 00:03:41,706 --> 00:03:46,080 или по-скоро, че не е задължително да знаете предварително колко знака на 82 00:03:46,080 --> 00:03:49,060 потребител ще напишете, защото имате пиле и яйцето. 83 00:03:49,060 --> 00:03:51,860 Не и докато не съм го прочете с scanf Може ли да разбера колко дълго е то. 84 00:03:51,860 --> 00:03:54,500 Но в този момент, че е твърде късно, защото вече сте го прочетете в 85 00:03:54,500 --> 00:03:55,710 някои блок на паметта. 86 00:03:55,710 --> 00:03:59,590 Така Като настрана, избягва CS50 библиотечни този въпрос изобщо, отзоваване 87 00:03:59,590 --> 00:04:01,060 с помощта fgetc. 88 00:04:01,060 --> 00:04:05,390 И тя гласи един символ в даден момент, пристъпват на пръсти заедно, знаейки, че сте 89 00:04:05,390 --> 00:04:08,060 не може да прелива с характер, ако четете една в даден момент. 90 00:04:08,060 --> 00:04:11,580 >> Уловът е с getstring отзоваване е че ние трябва постоянно повторно размер 91 00:04:11,580 --> 00:04:13,590 това парче на паметта, която е само болка. 92 00:04:13,590 --> 00:04:15,310 Това е много линии на код, за да направи това. 93 00:04:15,310 --> 00:04:18,779 Така че друг подход би бил да се всъщност използват един братовчед, така че 94 00:04:18,779 --> 00:04:19,790 да се каже, на scanf. 95 00:04:19,790 --> 00:04:22,820 Съществуват варианти на много от тези функции, които всъщност проверяват 96 00:04:22,820 --> 00:04:25,870 дължина на колко знака можете да прочетете максимално. 97 00:04:25,870 --> 00:04:29,430 И вие може да се уточни, не се чете повече от 50 символа. 98 00:04:29,430 --> 00:04:34,110 Така че това ще бъде друг подход, но по-малко сговорчива на по-големи входове. 99 00:04:34,110 --> 00:04:37,040 >> Така че въпрос 2 пита, да предположим, че версия 3 се компилира и изпълнява. 100 00:04:37,040 --> 00:04:39,960 Защо може segfault тази програма? 101 00:04:39,960 --> 00:04:42,650 Така че това е всъщност същото отговоря, въпреки че 102 00:04:42,650 --> 00:04:43,590 изглежда малко по-красиви. 103 00:04:43,590 --> 00:04:46,440 Ние използваме изчистване, което се чувства като ние сме се дава повече опции. 104 00:04:46,440 --> 00:04:48,030 И тогава ние сме освобождавайки че памет в края. 105 00:04:48,030 --> 00:04:49,580 Тя все още е само на 50 байта памет. 106 00:04:49,580 --> 00:04:53,620 Така че ние все още може да се опита да се чете в 51, 52, 1000 байта. 107 00:04:53,620 --> 00:04:55,830 Това ще segfault за точно същата причина. 108 00:04:55,830 --> 00:04:57,530 >> Но има и друга причина също. 109 00:04:57,530 --> 00:05:03,890 Какво друго може да изчистване връщане освен адреса на парче памет? 110 00:05:03,890 --> 00:05:04,920 Той може да се върне нулев. 111 00:05:04,920 --> 00:05:07,560 И тъй като ние не сме проверка за , че ние може да се прави нещо 112 00:05:07,560 --> 00:05:11,350 глупав и по друга причина, а именно, че ние може да се казва, scanf, прочетете 113 00:05:11,350 --> 00:05:16,050 въвеждане на потребителя от клавиатурата в 0 местоположение, AKA нищожна. 114 00:05:16,050 --> 00:05:18,890 И това също определено ще предизвика segfault. 115 00:05:18,890 --> 00:05:21,590 Така че за целта на теста, ние ще са приели нито един от тези, като 116 00:05:21,590 --> 00:05:22,740 основателна причина. 117 00:05:22,740 --> 00:05:23,420 Един от тях е идентичен. 118 00:05:23,420 --> 00:05:25,720 Един от тях е малко по-нюансирана. 119 00:05:25,720 --> 00:05:28,975 >> На последно място, по отношение на програмата използване на памет, как версия 2 и 120 00:05:28,975 --> 00:05:30,350 версия 3 се различава? 121 00:05:30,350 --> 00:05:35,070 Така че за какво си струва, видяхме привидно безкраен запас от възможно 122 00:05:35,070 --> 00:05:35,770 отговори на това. 123 00:05:35,770 --> 00:05:39,300 И сред отговорите на хората, това, което бяхме надявайки се, но ние приехме друга 124 00:05:39,300 --> 00:05:42,250 неща, беше известно споменаване на Всъщност тази версия 2 използва 125 00:05:42,250 --> 00:05:44,560 така наречените стека. 126 00:05:44,560 --> 00:05:46,710 Версия 3 е с помощта на куп. 127 00:05:46,710 --> 00:05:50,060 И функционално, това не прави наистина направи всичко, че голяма част от разликата. 128 00:05:50,060 --> 00:05:54,040 В края на деня, ние все още сме само за да се 50 байта памет. 129 00:05:54,040 --> 00:05:56,640 >> Но това е един от възможните отговори че ние гледахме. 130 00:05:56,640 --> 00:05:59,730 Но ще видите, както можете да си викторини обратно от TFS, че сме направили 131 00:05:59,730 --> 00:06:04,330 приемат други обсъждания на тяхната коренно различни употреби на паметта, както добре. 132 00:06:04,330 --> 00:06:08,600 Но стека купчина и би било един лесен отговор да отида с. 133 00:06:08,600 --> 00:06:11,150 Някакви въпроси? 134 00:06:11,150 --> 00:06:12,400 Аз ви давам Роб. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB BOWDEN: Значи проблем 4. 137 00:06:20,210 --> 00:06:21,985 Това е една, където трябваше да се запълни в броя на байтовете от всички 138 00:06:21,985 --> 00:06:23,460 тези различни видове използвани. 139 00:06:23,460 --> 00:06:24,830 Така че първото нещо, което виждаме. 140 00:06:24,830 --> 00:06:27,930 Да приемем, 32-битова архитектура, като този CS50 уред. 141 00:06:27,930 --> 00:06:33,530 Така че едно от основните неща за 32-битови архитектури, които ни разказва 142 00:06:33,530 --> 00:06:37,490 колко голям е точно показалка ще да бъде в архитектурата. 143 00:06:37,490 --> 00:06:43,020 >> Така че веднага, ние знаем, че всяко показалка тип е 32-бита или 4 байта. 144 00:06:43,020 --> 00:06:46,010 Така че гледам на тази маса, а възел * е тип указател. 145 00:06:46,010 --> 00:06:47,250 Това ще бъде 4 байта. 146 00:06:47,250 --> 00:06:51,640 Struct възел *, това е буквално идентичен с възел звезда. 147 00:06:51,640 --> 00:06:53,590 И така, това ще е 4 байта. 148 00:06:53,590 --> 00:06:58,270 String, така че да не изглежда като показалеца все още, но typedef, A 149 00:06:58,270 --> 00:07:01,590 низ е просто знак *, който е тип показалка. 150 00:07:01,590 --> 00:07:03,550 Така че ще е 4 байта. 151 00:07:03,550 --> 00:07:06,150 >> Така че тези три са всички четири байта. 152 00:07:06,150 --> 00:07:09,350 Сега, възли и ученик са малко по-сложно. 153 00:07:09,350 --> 00:07:15,160 Така че гледам възел и студент, ние виждаме, възел като цяло и показалеца. 154 00:07:15,160 --> 00:07:18,050 И студент е два показалки вътре в него. 155 00:07:18,050 --> 00:07:23,340 Така че поне за нашия случай тук, начинът че края на изчисляване на размера на 156 00:07:23,340 --> 00:07:27,020 тази структура е просто да добавите всичко това е вътре в структурата. 157 00:07:27,020 --> 00:07:30,690 >> Така възел, имаме число, което е 4 байта. 158 00:07:30,690 --> 00:07:32,830 Ние разполагаме с показалка, която е 4 байта. 159 00:07:32,830 --> 00:07:35,820 И така, един възел ще да отнеме до 8 байта. 160 00:07:35,820 --> 00:07:39,490 И по същия начин за студент, ние имаме указател, който е 4 байта и друг 161 00:07:39,490 --> 00:07:40,770 указател, който е 4 байта. 162 00:07:40,770 --> 00:07:43,180 Така че това ще се сложи край сметка е 8 байта. 163 00:07:43,180 --> 00:07:45,480 Така възел и ученик са 8 байта. 164 00:07:45,480 --> 00:07:48,950 И тези три са всички четири байта. 165 00:07:48,950 --> 00:07:50,240 Въпроси за това? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Да. 168 00:07:54,990 --> 00:07:58,413 >> ПУБЛИКАТА: Дали това е 64-битов архитектура, че би 169 00:07:58,413 --> 00:07:59,880 удвои всички от тях? 170 00:07:59,880 --> 00:08:01,790 >> ROB BOWDEN: Той не би удвои всички от тях. 171 00:08:01,790 --> 00:08:05,830 Така 64-битова архитектура, тя отново промени, които фундаментално нещо, че 172 00:08:05,830 --> 00:08:08,910 указател сега е 64 бита. 173 00:08:08,910 --> 00:08:09,290 Да. 174 00:08:09,290 --> 00:08:10,930 Така че показалеца е 8 байта. 175 00:08:10,930 --> 00:08:15,420 Така че тези, които са били 4 байта ще бъде 8 байта. 176 00:08:15,420 --> 00:08:18,617 Един студент, който е бил два указатели, Е, сега това ще 177 00:08:18,617 --> 00:08:19,800 е 8 байта, 8 байта. 178 00:08:19,800 --> 00:08:21,980 Това ще направи 16 байта. 179 00:08:21,980 --> 00:08:25,710 >> Но възел е 4 байта. 180 00:08:25,710 --> 00:08:27,800 Така че този указател ще да бъде 8 байта. 181 00:08:27,800 --> 00:08:28,930 Това е 4 байта. 182 00:08:28,930 --> 00:08:30,870 Така че един възел е само ще да бъде 12 байта. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 Всякакви други въпроси, свързани с това? 185 00:08:39,280 --> 00:08:44,500 Така че следващия милиард, това са кодовете на HTTP статус. 186 00:08:44,500 --> 00:08:48,000 И трябваше да опише обстоятелства , при които те могат да 187 00:08:48,000 --> 00:08:49,810 да ви бъде върната. 188 00:08:49,810 --> 00:08:56,730 един проблем, който съм чувал някои ученици имаме, е, че те се опитаха да направят 189 00:08:56,730 --> 00:08:58,950 грешки да са на края на клиента. 190 00:08:58,950 --> 00:09:02,320 Така че, когато ние се опитваме да направи искане към сървъра, нещо се 191 00:09:02,320 --> 00:09:03,820 нередно в нашия край. 192 00:09:03,820 --> 00:09:07,660 Но като цяло, тези кодове са да бъде върнато от сървъра. 193 00:09:07,660 --> 00:09:11,720 Така че ние искаме да разберем какво се случва грешна или надясно на сървъра, който 194 00:09:11,720 --> 00:09:14,280 причинява тези неща, за да бъдат върнати. 195 00:09:14,280 --> 00:09:18,670 Така че защо да може сървъра връща статус код 200? 196 00:09:18,670 --> 00:09:19,920 Някакви идеи? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> Да. 199 00:09:23,730 --> 00:09:27,850 Значи нещо за успешно искане премина през. 200 00:09:27,850 --> 00:09:30,260 И те са в състояние да се върне каквото си поиска. 201 00:09:30,260 --> 00:09:32,240 Така че всичко е наред. 202 00:09:32,240 --> 00:09:35,662 Какво ще кажете за 302 намерени? 203 00:09:35,662 --> 00:09:36,618 Да. 204 00:09:36,618 --> 00:09:39,008 >> ПУБЛИКАТА: Сървърът е търсил за това, което сте поискали. 205 00:09:39,008 --> 00:09:40,442 Но не можах да го намеря. 206 00:09:40,442 --> 00:09:42,850 Така че има грешка. 207 00:09:42,850 --> 00:09:47,720 >> ROB BOWDEN: Така че сървърът търси това, което исках. 208 00:09:47,720 --> 00:09:51,682 Така че просто гледам тук, 302 намерени, тя е в състояние да го намерите. 209 00:09:51,682 --> 00:09:53,035 >> ПУБЛИКАТА: Съжалявам. 210 00:09:53,035 --> 00:09:54,388 Намерени означава, че те направиха го намерите. 211 00:09:54,388 --> 00:09:55,638 Извинете. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB BOWDEN: Значи 302 намерен. 214 00:10:00,160 --> 00:10:02,350 Сървърът е в състояние да намери това, което исках. 215 00:10:02,350 --> 00:10:04,640 >> ПУБЛИКАТА: Но това не го показва? 216 00:10:04,640 --> 00:10:08,180 >> ROB BOWDEN: Разликата между това 302 и 200 е, че 217 00:10:08,180 --> 00:10:09,280 знае това, което искате. 218 00:10:09,280 --> 00:10:12,000 Но това не е точно там, където което исках да попитам. 219 00:10:12,000 --> 00:10:14,580 Така 302 е типичен пренасочване. 220 00:10:14,580 --> 00:10:16,510 Така че исканата страница. 221 00:10:16,510 --> 00:10:19,590 Той знае, о, аз искам да ви върна това. 222 00:10:19,590 --> 00:10:21,070 Но това е в различен URL. 223 00:10:21,070 --> 00:10:23,534 Така че, хей, вие всъщност искате това. 224 00:10:23,534 --> 00:10:26,950 >> DAVID J. Malan: Това е парче, което каза , че дадохме вие ​​пренасочване 225 00:10:26,950 --> 00:10:30,830 функция, която използва функцията на горния които, от своя страна, отпечатани място, 226 00:10:30,830 --> 00:10:34,110 дебелото черво, и след това адреса на който желаете да отхвърляте потребителя. 227 00:10:34,110 --> 00:10:37,480 Въпреки, че не виждам 302 изрично там, това е, което PHP 228 00:10:37,480 --> 00:10:41,550 магически ще вмъкнете като хедъра казва точно това, което каза Rob там - 229 00:10:41,550 --> 00:10:41,930 намерен. 230 00:10:41,930 --> 00:10:43,180 Но отидете тук, вместо. 231 00:10:43,180 --> 00:10:45,960 232 00:10:45,960 --> 00:10:46,160 >> ROB BOWDEN: OK. 233 00:10:46,160 --> 00:10:47,630 Така че какво да кажем за 403 забранено? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> ПУБЛИКАТА: Мисля, че това е, че сървърът е основно казва, че клиентът 236 00:10:57,120 --> 00:10:59,970 Не мога да вляза в началната страница. 237 00:10:59,970 --> 00:11:03,260 >> ROB BOWDEN: Така че, да. 238 00:11:03,260 --> 00:11:07,670 Е, типичното Отговорът бяхме Очаквах е нещо от рода на файловете 239 00:11:07,670 --> 00:11:08,920 не са chmodded подходящо. 240 00:11:08,920 --> 00:11:11,590 Това вероятно е при какви обстоятелства си ги видял. 241 00:11:11,590 --> 00:11:18,920 Но има една причина, че клиентът може да бъде виновен тук. 242 00:11:18,920 --> 00:11:20,440 Там всъщност е друг код на състоянието - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Така че те са много сходни. 245 00:11:22,820 --> 00:11:24,590 >> 401 е неразрешен. 246 00:11:24,590 --> 00:11:26,130 А 403 е забранено. 247 00:11:26,130 --> 00:11:31,890 И така неразрешен, специално за Вас получите, ако не сте влезли в профила си 248 00:11:31,890 --> 00:11:34,520 Но може да означава да влезете в че сте упълномощени. 249 00:11:34,520 --> 00:11:37,930 Но ако вече сте влезли в и вие все още не разполагат с разрешение, след това 250 00:11:37,930 --> 00:11:40,140 можете да получите също и забранено. 251 00:11:40,140 --> 00:11:45,320 Така че, ако сте влезли в системата и нямат разрешение, забранено е също 252 00:11:45,320 --> 00:11:47,164 нещо, което може да получи. 253 00:11:47,164 --> 00:11:48,900 >> DAVID J. Malan: И механизмът, чрез което тези проблеми са обикновено 254 00:11:48,900 --> 00:11:53,100 решен на сървъра чрез каква команда? 255 00:11:53,100 --> 00:11:57,700 CHMOD, ако това е наистина е разрешения издава на файла или директорията. 256 00:11:57,700 --> 00:11:59,220 >> ROB BOWDEN: 404 Тогава не е намерен. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 Да. 259 00:12:03,470 --> 00:12:10,150 Така че, за разлика от 302, където това не е точно където питаш но тя знае какво 260 00:12:10,150 --> 00:12:12,710 искате, това, тя просто има никаква идея какво искаш. 261 00:12:12,710 --> 00:12:15,648 И не се иска нещо валиден. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Аз съм чайник и след това 500 вътрешен сървър. 264 00:12:22,310 --> 00:12:24,870 Така че, защо да ви се получи това? 265 00:12:24,870 --> 00:12:26,120 >> Така segfault - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 Аз всъщност не знам, че окачествяването стандарт за това. 268 00:12:30,640 --> 00:12:34,850 Но ако вашият PHP код има нещо нередно в него, на теория, то би могло 269 00:12:34,850 --> 00:12:39,650 всъщност segfault, като в този случай, това 500 вътрешна грешка в сървъра, нещо 270 00:12:39,650 --> 00:12:41,400 не е наред с вашия сървър конфигурация. 271 00:12:41,400 --> 00:12:44,320 Или има синтактична грешка във вашата PHP код. 272 00:12:44,320 --> 00:12:46,095 Или нещо лошо се случва. 273 00:12:46,095 --> 00:12:48,320 >> DAVID J. Malan: Ние видяхме segfault сред отговори на няколко хора. 274 00:12:48,320 --> 00:12:49,490 И технически, тя може да се случи. 275 00:12:49,490 --> 00:12:53,820 Но това би било PHP, програмата написани от други хора, всъщност 276 00:12:53,820 --> 00:12:57,790 segfaulted, които само ако тези хора прецаках и пише бъги код в 277 00:12:57,790 --> 00:13:00,680 техния преводач би Самият PHP segfault. 278 00:13:00,680 --> 00:13:06,460 Така че, въпреки че 500 е като segfault по дух, това е почти винаги 279 00:13:06,460 --> 00:13:10,490 резултат на издаване на конфигурационен файл с вашия уеб сървър или, както каза Роб, 280 00:13:10,490 --> 00:13:13,200 синтактична грешка, като теб не го е затворило един цитат. 281 00:13:13,200 --> 00:13:16,180 Или сте загубили точка и запетая някъде. 282 00:13:16,180 --> 00:13:23,677 >> ПУБЛИКАТА: Така че за Shuttle PSET, I мисля, че когато аз го направих веднъж Натиснах 283 00:13:23,677 --> 00:13:26,300 браузър, но нищо не излезе, това, което те наричат ​​бяла страница. 284 00:13:26,300 --> 00:13:28,056 Но това е така, защото на кода. 285 00:13:28,056 --> 00:13:29,440 Мисля, че това е JavaScript, нали? 286 00:13:29,440 --> 00:13:29,770 >> ROB BOWDEN: Да. 287 00:13:29,770 --> 00:13:31,180 >> ПУБЛИКАТА: Бихте тази грешка все още да се качиш? 288 00:13:31,180 --> 00:13:34,290 >> ROB BOWDEN: Значи ти би не са придобили тази грешка, защото всичко, 289 00:13:34,290 --> 00:13:36,930 от гледна точка на уеб сървъра е напълно наред. 290 00:13:36,930 --> 00:13:39,090 Но ти поиска index.html. 291 00:13:39,090 --> 00:13:42,000 Заявили сте shuttle.js и service.js. 292 00:13:42,000 --> 00:13:44,580 И това беше в състояние успешно да се завърнат за всички онези неща, които - 293 00:13:44,580 --> 00:13:44,980 200. 294 00:13:44,980 --> 00:13:45,680 OK. 295 00:13:45,680 --> 00:13:49,330 Тя е само, когато вашия браузър се опита да тълкува кода на JavaScript, че 296 00:13:49,330 --> 00:13:51,370 Това е като, чакай, това не е валиден грешка JavaScript. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 Някакви други въпроси? 299 00:13:58,210 --> 00:14:00,750 Добре. 300 00:14:00,750 --> 00:14:04,120 >> DAVID J. Malan: Така че следващия нагоре беше номер 11. 301 00:14:04,120 --> 00:14:07,610 А 11 беше най-страшното за много хора. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 Така че най-важното нещо е да се отбележи тук е, че това е наистина, за 304 00:14:18,570 --> 00:14:19,840 двойно свързан списък. 305 00:14:19,840 --> 00:14:23,160 Но това не е същото като миналата година списък двойно свързан проблем, 306 00:14:23,160 --> 00:14:27,170 които не ви дават уговорката, че списъка може, в действителност, е сортиран. 307 00:14:27,170 --> 00:14:29,640 >> Така че фактът, че списъкът е сортиран и факта, че тази дума е 308 00:14:29,640 --> 00:14:32,930 подчерта там е трябвало да се предадат че това е действително опростяване 309 00:14:32,930 --> 00:14:35,430 на това, което иначе би било по-голямо предизвикателство проблем 310 00:14:35,430 --> 00:14:36,600 и по-дълъг. 311 00:14:36,600 --> 00:14:40,760 Така често срещана грешка тук е трябвало да сложи миналогодишното решение на вашия милион 312 00:14:40,760 --> 00:14:45,580 пейджър и след това просто копирайте сляпо, че надолу като отговор, който е правото 313 00:14:45,580 --> 00:14:48,520 отговори на друг въпрос подобни по дух. 314 00:14:48,520 --> 00:14:51,340 Но тънкостите тук са, както следва. 315 00:14:51,340 --> 00:14:55,200 >> Така че едно, ние сме обявен възел и определена по обичайния начин тук. 316 00:14:55,200 --> 00:14:59,230 Тогава ние определен списък на бъде глобален показалка инициализира с нула. 317 00:14:59,230 --> 00:15:02,150 Тогава очевидно, има две функции имаме прототипи за тук, вложка 318 00:15:02,150 --> 00:15:03,240 и го извадете. 319 00:15:03,240 --> 00:15:06,600 И тогава имаме някакъв примерен код тук за правене на куп вмъквания. 320 00:15:06,600 --> 00:15:09,930 И тогава ние ви молим да попълните изпълнение на въвеждане долу по такъв 321 00:15:09,930 --> 00:15:14,380 начин, че да въвежда п в списъка в константно време, също така подчерта, 322 00:15:14,380 --> 00:15:15,730 дори и ако вече е налице. 323 00:15:15,730 --> 00:15:20,600 >> Така че красотата е в състояние да вмъкнете в константно време е, че предполага 324 00:15:20,600 --> 00:15:23,060 че трябва да поставите новата възела, където? 325 00:15:23,060 --> 00:15:23,690 В предната част. 326 00:15:23,690 --> 00:15:27,760 Така че тя елиминира, за щастие, най-малко един от случаите, които използват, за да изиска 327 00:15:27,760 --> 00:15:30,520 още повече реда код, като го е направил миналата година и дори в клас, когато ние 328 00:15:30,520 --> 00:15:34,040 говорил чрез този вид на нещо, с хора и с някои 329 00:15:34,040 --> 00:15:35,250 вербална псевдо код. 330 00:15:35,250 --> 00:15:39,190 Така че в разтвора тук, нека да прескачам да, че само за да имат визуален контакт 331 00:15:39,190 --> 00:15:40,480 екрана. 332 00:15:40,480 --> 00:15:42,230 >> Забележете, че ние правим следното. 333 00:15:42,230 --> 00:15:45,140 И също така да забележите друга опростяването е, че дори ако е 334 00:15:45,140 --> 00:15:48,280 вече е налице, така че това означава, че дори ако броят им е вече там, можете да 335 00:15:48,280 --> 00:15:50,280 просто сляпо поставете друг копие от него. 336 00:15:50,280 --> 00:15:52,560 И това също е трябвало да бъде опростяване, така че бихте могли да 337 00:15:52,560 --> 00:15:54,940 съсредоточи върху, наистина, някои от по- интелектуално интересна част и 338 00:15:54,940 --> 00:15:58,090 а не само някои допълнителни проверки за грешки като се има предвид ограниченото време. 339 00:15:58,090 --> 00:16:02,880 >> Така че в този разтвор на пробата, който заделяме показалеца на лявата страна 340 00:16:02,880 --> 00:16:04,510 другата тук на една възлова точка. 341 00:16:04,510 --> 00:16:07,190 Сега осъзнавам, че показалеца, като Роб каза, е само на 32 бита. 342 00:16:07,190 --> 00:16:09,060 И в действителност не съдържа адрес, докато не 343 00:16:09,060 --> 00:16:09,970 присвояване на адрес. 344 00:16:09,970 --> 00:16:13,220 И ние правим това от дясната страна страна чрез изчистване. 345 00:16:13,220 --> 00:16:16,550 Като добър гражданин, ние се провери дали изчистване не е, в действителност, нула, така че 346 00:16:16,550 --> 00:16:18,690 ние не случайно се създаде а segfault тук. 347 00:16:18,690 --> 00:16:22,840 И всеки път, когато използвате изчистване в живота, Трябва да се проверява за нищожна, за да не 348 00:16:22,840 --> 00:16:24,090 имате коварен бъг. 349 00:16:24,090 --> 00:16:28,460 >> Тогава ние се инициализира, че нищожна от възлагане н и предишния и следващия. 350 00:16:28,460 --> 00:16:32,450 И в този случай тук, аз инициализира преди нищожна, тъй като тази нова 351 00:16:32,450 --> 00:16:34,780 възел ще бъде новият в началото на списъка ми. 352 00:16:34,780 --> 00:16:37,050 Така че там ще бъде нищо преди него. 353 00:16:37,050 --> 00:16:42,010 И аз искам да се добави по същество съществуващ списък към новата възела, като 354 00:16:42,010 --> 00:16:44,700 създаване следващия равна на себе си списък. 355 00:16:44,700 --> 00:16:47,120 Но аз просто все още не съм свършил. 356 00:16:47,120 --> 00:16:51,780 Така че, ако самата списъка вече е съществувал, и има най-малко един възел 357 00:16:51,780 --> 00:16:57,070 вече на място, ако това е списъкът тук и аз вмъкнете нов възел тук, I 358 00:16:57,070 --> 00:17:01,840 Трябва да се уверите, че бившият ми възел изтъква назад към моя нов възел, 359 00:17:01,840 --> 00:17:04,260 защото това е отново двойно свързан списък. 360 00:17:04,260 --> 00:17:05,460 >> Така че ние правим проверка здрав разум. 361 00:17:05,460 --> 00:17:10,109 Ако списъкът не е нула, ако има вече един или повече възли там, тогава 362 00:17:10,109 --> 00:17:12,470 добавя, че обратно препратка така да се каже. 363 00:17:12,470 --> 00:17:15,420 И тогава най-последното нещо, което трябва да направите, е всъщност актуализира глобалното 364 00:17:15,420 --> 00:17:20,329 самата променлива списък, за да се отбележи на този нов възел. 365 00:17:20,329 --> 00:17:21,790 Да. 366 00:17:21,790 --> 00:17:26,579 >> ПУБЛИКАТА: В показалка стрелката [Недоловим] се равнява на нула, прави това 367 00:17:26,579 --> 00:17:30,420 се справят със списъка, защото списъкът е нула? 368 00:17:30,420 --> 00:17:30,596 >> DAVID J. Malan: Nope. 369 00:17:30,596 --> 00:17:34,500 Това е просто ми е активно Внимавайте, в която, ако това е моят 370 00:17:34,500 --> 00:17:38,730 Оригинален списък с може би някои повече възли тук и аз съм вмъкване ми 371 00:17:38,730 --> 00:17:42,380 нов възел тук, там ще да бъде нищо повече от тук. 372 00:17:42,380 --> 00:17:44,720 И аз искам да улови тази идея чрез определяне на предишния да 373 00:17:44,720 --> 00:17:47,740 нула на новия възел. 374 00:17:47,740 --> 00:17:51,410 И вероятно, ако ми код е правилен и няма друг начин да се вмъкнете 375 00:17:51,410 --> 00:17:54,970 възли, различни от тази функция, Предполага се, че дори и ако вече има списък 376 00:17:54,970 --> 00:18:00,090 един или повече възли в нея, вероятно на списък на първия възел, ще имат 377 00:18:00,090 --> 00:18:02,750 предишния показалеца на самата нула. 378 00:18:02,750 --> 00:18:03,550 >> ПУБЛИКАТА: И точно проследяване. 379 00:18:03,550 --> 00:18:08,139 Причината поставите показалеца следващите равни списък се правиш на показалеца 380 00:18:08,139 --> 00:18:13,579 преди списък с това, че се посочи към следващата, предполагам - 381 00:18:13,579 --> 00:18:14,980 Аз не - 382 00:18:14,980 --> 00:18:15,450 просто изброява? 383 00:18:15,450 --> 00:18:16,400 >> DAVID J. Malan: Точно така. 384 00:18:16,400 --> 00:18:19,400 И така, нека всъщност разгледа две дела тук наистина, въпреки че 385 00:18:19,400 --> 00:18:22,070 поръчка, ние ще ги разглеждаме не е съвсем същото като на кода. 386 00:18:22,070 --> 00:18:26,250 Но на високо ниво, ако това представлява списък и това е 32-битов 387 00:18:26,250 --> 00:18:29,560 показалка, най-простият сценарий е че това е нищожна по подразбиране. 388 00:18:29,560 --> 00:18:33,010 И предполагам, че искате да вмъкнете номер 50 е първият номер. 389 00:18:33,010 --> 00:18:37,640 Така че аз ще отида напред и да се разпределят възел, който ще съдържа 390 00:18:37,640 --> 00:18:38,770 три области - 391 00:18:38,770 --> 00:18:42,070 н, предишния и следващия. 392 00:18:42,070 --> 00:18:44,580 >> Отивам да сложа номер 50 тук, тъй като това ще бъде п. 393 00:18:44,580 --> 00:18:46,130 Това ще бъде следващата. 394 00:18:46,130 --> 00:18:48,530 И това ще бъде предишния. 395 00:18:48,530 --> 00:18:50,910 И така, какво мога да направя в този случай? 396 00:18:50,910 --> 00:18:53,900 Е, аз току-що направихте линия 1 тук. 397 00:18:53,900 --> 00:18:55,400 Pointer п получава п. 398 00:18:55,400 --> 00:18:57,740 Аз след това казва, предишна трябва да получи нула. 399 00:18:57,740 --> 00:18:59,470 Така че това ще бъде нула. 400 00:18:59,470 --> 00:19:01,365 Тогава аз ще кажа следващия ще получите списък. 401 00:19:01,365 --> 00:19:05,150 >> И това просто работи по добре. 402 00:19:05,150 --> 00:19:06,500 Това е нищожна. 403 00:19:06,500 --> 00:19:10,620 И така, аз казвам, новият възел е следващият област трябва да получите каквото е това. 404 00:19:10,620 --> 00:19:12,570 Така че това поставя друг нула там. 405 00:19:12,570 --> 00:19:14,510 И тогава последното нещо, Правя, е да проверите тук. 406 00:19:14,510 --> 00:19:17,870 Ако списъкът не е равна на нула, но това е равна на нула, така че ние пропуснем 407 00:19:17,870 --> 00:19:18,470 напълно. 408 00:19:18,470 --> 00:19:23,520 И така, всичко, което правя е следващия списък получава показалка, която води до по-картинно 409 00:19:23,520 --> 00:19:25,570 снимка подобно. 410 00:19:25,570 --> 00:19:26,620 Така че това е един сценарий. 411 00:19:26,620 --> 00:19:30,490 >> И този, който се пита за специално е в ситуация като тази, 412 00:19:30,490 --> 00:19:33,190 където вече имаме списък с един възел. 413 00:19:33,190 --> 00:19:36,240 И ако се върна в оригинала изявление проблем, Сега ще 414 00:19:36,240 --> 00:19:39,320 вмъкнете да речем е 34, само за на името на дискусия. 415 00:19:39,320 --> 00:19:46,210 Така че аз съм просто ще се удобно изготвя, че тук. 416 00:19:46,210 --> 00:19:47,540 Току-що malloced. 417 00:19:47,540 --> 00:19:49,310 Нека приемем, че аз съм проверка за нищожна. 418 00:19:49,310 --> 00:19:51,870 >> Сега, аз отивам да се инициализира п да бъде 34. 419 00:19:51,870 --> 00:19:53,040 И това ще бъде п. 420 00:19:53,040 --> 00:19:54,670 Това ще бъде следващата. 421 00:19:54,670 --> 00:19:57,100 И това ще бъде предишния. 422 00:19:57,100 --> 00:19:59,370 Нека се уверим, че не го направих получи това назад. 423 00:19:59,370 --> 00:20:01,110 Предишна идва първо в дефиницията. 424 00:20:01,110 --> 00:20:03,070 Позволете ми да се определи това. 425 00:20:03,070 --> 00:20:04,410 Това е предишния. 426 00:20:04,410 --> 00:20:05,780 Това е следващата. 427 00:20:05,780 --> 00:20:08,620 Въпреки че те са идентични, нека си го запази последователна. 428 00:20:08,620 --> 00:20:09,450 >> Previous. 429 00:20:09,450 --> 00:20:11,030 Това е следващата. 430 00:20:11,030 --> 00:20:16,310 Така че аз съм просто malloced бележката ми, проверих за нула, определен в 34 възела. 431 00:20:16,310 --> 00:20:17,570 Предишна получава нищожна. 432 00:20:17,570 --> 00:20:19,480 Така че това ми дава това. 433 00:20:19,480 --> 00:20:21,010 Следваща получава списък. 434 00:20:21,010 --> 00:20:22,370 Така списък е това. 435 00:20:22,370 --> 00:20:26,520 Така че това е същата сега, както и изготвяне това стрелка, така че да сочи към едно 436 00:20:26,520 --> 00:20:27,940 в същото. 437 00:20:27,940 --> 00:20:30,400 И тогава аз съм проверка, ако списък не е равно на нула. 438 00:20:30,400 --> 00:20:31,740 И това не е този път. 439 00:20:31,740 --> 00:20:35,580 Тогава аз ще направя списък предишния получава показалка. 440 00:20:35,580 --> 00:20:39,700 >> Така се изброят предишния получава PTR. 441 00:20:39,700 --> 00:20:44,300 Така че това има ефект на пускането графичен стрелка тук. 442 00:20:44,300 --> 00:20:46,930 И това става все по-малко вълниста, линиите. 443 00:20:46,930 --> 00:20:50,780 И тогава, накрая, аз се актуализира Списък, за да сочи към показалеца. 444 00:20:50,780 --> 00:20:55,560 Така че сега това говори за този човек. 445 00:20:55,560 --> 00:20:57,170 И сега, нека да направим един бърз проверка здрав разум. 446 00:20:57,170 --> 00:20:59,470 >> Тук е списъка, който е глобалната променлива. 447 00:20:59,470 --> 00:21:02,850 Първият възел е, всъщност, 34, защото Аз съм след стрелка. 448 00:21:02,850 --> 00:21:05,210 И това е правилно, защото искам да поставете в началото на списъка 449 00:21:05,210 --> 00:21:06,070 всички нови възли. 450 00:21:06,070 --> 00:21:08,860 Следващият му поле ме води до това момче. 451 00:21:08,860 --> 00:21:10,710 Ако продължавам, аз удари следващия е нищожна. 452 00:21:10,710 --> 00:21:11,760 Така че няма повече списък. 453 00:21:11,760 --> 00:21:14,460 Ако аз хит предишния, получавам Там, откъдето аз очаквам. 454 00:21:14,460 --> 00:21:16,435 >> Така че все още има няколко насоки, Очевидно е, че да се манипулира. 455 00:21:16,435 --> 00:21:19,870 Но фактът, че ви е било казано да се направи това в постоянен път, когато означава само 456 00:21:19,870 --> 00:21:22,910 има краен брой неща ти е позволено да правя. 457 00:21:22,910 --> 00:21:24,290 И какъв е този номер? 458 00:21:24,290 --> 00:21:25,185 То може да бъде една стъпка. 459 00:21:25,185 --> 00:21:25,700 Тя може да бъде два. 460 00:21:25,700 --> 00:21:26,820 Тя може да е 1000 стъпки. 461 00:21:26,820 --> 00:21:30,500 Но това е крайно, което означава, че не можеш са всякакъв вид на примка става 462 00:21:30,500 --> 00:21:32,010 тук, не рекурсия, без контури. 463 00:21:32,010 --> 00:21:37,390 Тя просто трябва да бъде трудно кодирани линии на код, тъй като ние имаме в тази извадка. 464 00:21:37,390 --> 00:21:42,330 >> Така че следващия проблем 12 ни помоли да завърши изпълнението на премахване 465 00:21:42,330 --> 00:21:46,740 долу по такъв начин, че да премахва п от списъка за линейно време. 466 00:21:46,740 --> 00:21:48,740 Така че ще трябва малко повече мърдам стая. 467 00:21:48,740 --> 00:21:52,380 Може да се предположи, че N, ако е наличен в списъка, ще присъства 468 00:21:52,380 --> 00:21:53,340 не повече от веднъж. 469 00:21:53,340 --> 00:21:56,770 И това също е писано да бъде тест-базирани опростяване предположение, така 470 00:21:56,770 --> 00:21:59,780 че ако намерите номер 50 някъде в списъка, не трябва също така да 471 00:21:59,780 --> 00:22:02,890 трябва да се притеснявате за да продължи да обхождане, търсене на всички възможни 472 00:22:02,890 --> 00:22:06,990 Копие от 50, които просто ще прехвърли в някои дреболии в ограничен период от време. 473 00:22:06,990 --> 00:22:10,460 >> Така че с премахване, това определено беше по-голямо предизвикателство и повече 474 00:22:10,460 --> 00:22:11,640 код, за да пиша. 475 00:22:11,640 --> 00:22:14,990 Но на пръв поглед, честно казано, тя може да изглежда непоносимо и като нещо, 476 00:22:14,990 --> 00:22:17,060 няма начин бихте могли да имат излезе с по викторина. 477 00:22:17,060 --> 00:22:22,450 Но ако ние се фокусираме върху отделните стъпки, надявам се, това ще стане внезапно 478 00:22:22,450 --> 00:22:26,060 те поразява, че всеки един от тези индивидуални стъпки прави очевиден смисъл 479 00:22:26,060 --> 00:22:27,080 в ретроспекция. 480 00:22:27,080 --> 00:22:28,200 Така че нека хвърлим един поглед. 481 00:22:28,200 --> 00:22:32,570 >> Така че, на първо място, ние се инициализира показалка да се изброят. 482 00:22:32,570 --> 00:22:36,040 Защото искам линейното време, това означава, Отивам да има някаква връзка. 483 00:22:36,040 --> 00:22:39,730 И често срещан начин за обхождане на възли в структура списък или всякакъв вид 484 00:22:39,730 --> 00:22:43,860 на структура итеративно е да се вземат указател към предната част на данните 485 00:22:43,860 --> 00:22:46,990 структура и след това просто да започнат да актуализират то и ходи си път 486 00:22:46,990 --> 00:22:48,650 чрез структурата на данните. 487 00:22:48,650 --> 00:22:50,040 Така че аз ще направя точно това. 488 00:22:50,040 --> 00:22:54,260 >> Докато показалеца, моята временна променлива, не е равно на нула, нека 489 00:22:54,260 --> 00:22:55,660 отидете напред и да се провери. 490 00:22:55,660 --> 00:22:56,910 Аз ли се късметлия? 491 00:22:56,910 --> 00:23:01,740 Дали областта на N в възел Аз съм в момента търси в равна на 492 00:23:01,740 --> 00:23:03,380 брой търся? 493 00:23:03,380 --> 00:23:05,410 И ако е така, нека да направим нещо. 494 00:23:05,410 --> 00:23:10,020 Сега, ако забележите това състояние обхваща цялата 495 00:23:10,020 --> 00:23:11,520 следните редове код. 496 00:23:11,520 --> 00:23:14,610 Това е единственото нещо, което ме интересува - намиране на номер в въпрос. 497 00:23:14,610 --> 00:23:18,010 Така че няма друго, което опростява неща концептуално малко. 498 00:23:18,010 --> 00:23:22,040 >> Но сега, аз осъзнах, и може да се наложи само осъзна това след като мислене 499 00:23:22,040 --> 00:23:24,720 него чрез малко, има всъщност два случая тук. 500 00:23:24,720 --> 00:23:28,060 Един от тях е, когато възелът е на началото на списъка, който е 501 00:23:28,060 --> 00:23:31,040 малко досадно, защото това е специален случай, защото трябва да се справим 502 00:23:31,040 --> 00:23:33,340 с това нещо, което е само аномалия. 503 00:23:33,340 --> 00:23:35,720 Навсякъде другаде в списъка, това е едно и също нещо. 504 00:23:35,720 --> 00:23:38,050 Има предишна възел и следващия възел, възел предишния, следващия възел. 505 00:23:38,050 --> 00:23:40,940 Но този човек е малко по-специален ако той е в началото. 506 00:23:40,940 --> 00:23:48,710 >> Така че, ако показалецът е равен на списъка себе си, така че ако аз съм в началото на 507 00:23:48,710 --> 00:23:53,960 списъка и аз не съм намерил N, имам нужда да направите няколко неща. 508 00:23:53,960 --> 00:23:59,230 Едно, че трябва да променя списъка на точка на следващото поле, 50. 509 00:23:59,230 --> 00:24:01,270 Така че предполагам, че аз се опитвам да се премахне 34. 510 00:24:01,270 --> 00:24:03,560 Така че този човек трябва да тръгвам далеч в един момент. 511 00:24:03,560 --> 00:24:07,210 >> Така че аз отивам да се каже, списък получава показалеца следващия. 512 00:24:07,210 --> 00:24:08,570 Е, това е показалеца. 513 00:24:08,570 --> 00:24:10,360 Следваща сочи насам. 514 00:24:10,360 --> 00:24:17,470 Така че това се променя това с дясната стрелка сега, за да сочи към този човек тук. 515 00:24:17,470 --> 00:24:19,580 Сега, не забравяйте, ние имаме временна променлива. 516 00:24:19,580 --> 00:24:23,520 Така че ние не са сираци всички възли, защото аз също имам този човек в моя 517 00:24:23,520 --> 00:24:25,010 изпълнение на премахване. 518 00:24:25,010 --> 00:24:29,600 Така че сега, ако самия списък не е нула, Аз трябва да се определи нещо. 519 00:24:29,600 --> 00:24:32,690 >> Трябва да се уверите, че тази стрелка, който предварително е насочена 520 00:24:32,690 --> 00:24:36,830 50-34, това трябва да си отиде, защото, ако аз се опитвам да се отървете 521 00:24:36,830 --> 00:24:41,910 от 34, 50 е по-добре да не поддържа нито вид на гърба препратка към него като 522 00:24:41,910 --> 00:24:42,820 стрелка предложи. 523 00:24:42,820 --> 00:24:44,820 Така че аз просто направих тази линия. 524 00:24:44,820 --> 00:24:46,520 Така че след като свърша. 525 00:24:46,520 --> 00:24:48,040 Това дело всъщност е доста лесно. 526 00:24:48,040 --> 00:24:51,010 Рязане на разстояние от главата на списъка е относително проста. 527 00:24:51,010 --> 00:24:52,980 >> За съжаление, там е това досадно друг блок. 528 00:24:52,980 --> 00:24:56,170 Така че сега, аз трябва да разгледа делото когато има нещо по средата. 529 00:24:56,170 --> 00:24:59,880 Но това не е твърде ужасно, с изключение на за синтаксис като този. 530 00:24:59,880 --> 00:25:03,080 Така че, ако аз не съм в началото на списък, аз съм някъде по средата. 531 00:25:03,080 --> 00:25:08,160 И тази линия тук се казва, старт По какъвто възел сте у. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Отиди до следващото поле предходната възела и посочи, че в показалеца. 534 00:25:18,550 --> 00:25:20,390 >> Нека да направим това картинно. 535 00:25:20,390 --> 00:25:21,640 Това ставаше все по-сложно. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 Така че, ако имам предишните полета тук - нека да направим това - следващите полета тук. 538 00:25:37,990 --> 00:25:41,200 Отивам да се опрости ми указатели скоро отколкото се направи цял куп 539 00:25:41,200 --> 00:25:45,710 нещата назад и напред, кръстосващи всеки друг. 540 00:25:45,710 --> 00:25:50,870 И сега, нека просто кажем, че това е едно, две, 3 от съображения за обсъждане, дори 541 00:25:50,870 --> 00:25:53,410 макар че не е изравнена с въпросният проблем. 542 00:25:53,410 --> 00:25:55,900 >> Така че тук е моят свързан списък. 543 00:25:55,900 --> 00:25:59,300 Аз съм се опитва да премахне две в тази конкретна версия на историята. 544 00:25:59,300 --> 00:26:01,960 Така че аз съм актуализиран указател към се сочи към този човек. 545 00:26:01,960 --> 00:26:03,315 Така че това е PTR. 546 00:26:03,315 --> 00:26:04,530 Той посочи тук. 547 00:26:04,530 --> 00:26:07,170 Това е списък, който съществува в световен мащаб, както и преди. 548 00:26:07,170 --> 00:26:09,200 И той посочи тук, без значение какво. 549 00:26:09,200 --> 00:26:10,800 И сега, аз съм се опитва да премахне две. 550 00:26:10,800 --> 00:26:13,850 >> Така че, ако стрелката сочи тук, аз съм ще последва, изглежда, 551 00:26:13,850 --> 00:26:17,110 предишния показалка, което ме поставя в едно. 552 00:26:17,110 --> 00:26:22,290 Аз тогава щях да кажа, че следващата поле, което ме навежда към тази 553 00:26:22,290 --> 00:26:25,410 кутия тук, ще равен показалка следващия. 554 00:26:25,410 --> 00:26:28,400 Така че, ако този указател, това е следващия. 555 00:26:28,400 --> 00:26:31,840 Това означава, че тази стрелки нужди да сочи към този човек. 556 00:26:31,840 --> 00:26:35,140 >> И какво от това, че ред код, има само направено е малко от това. 557 00:26:35,140 --> 00:26:37,500 И сега, това се гледа като стъпка в правилната посока. 558 00:26:37,500 --> 00:26:41,390 Ние по същество иска да клъцна 2 на средата на 1 и 3. 559 00:26:41,390 --> 00:26:44,400 Така че има смисъл, че ние искаме да маршрут този указател около него. 560 00:26:44,400 --> 00:26:50,400 Така че това следващия ред се извърши проверка дали показалка следващия не е нула, има 561 00:26:50,400 --> 00:26:54,200 наистина някой, който да правото на две, това означава, че ние също трябва да направим 562 00:26:54,200 --> 00:26:55,850 малко парченце тук. 563 00:26:55,850 --> 00:27:00,590 >> Така че сега трябва да следват този указател и актуализиране на предишния показалеца върху 564 00:27:00,590 --> 00:27:05,410 този човек, за да се направи малко на заобиколно тук въпросът тук. 565 00:27:05,410 --> 00:27:07,100 И сега, визуално, това е хубаво. 566 00:27:07,100 --> 00:27:11,930 Това е малко разхвърлян, в които има никой не посочи към два вече. 567 00:27:11,930 --> 00:27:13,600 2 сочи наляво. 568 00:27:13,600 --> 00:27:14,980 И две сочи надясно. 569 00:27:14,980 --> 00:27:17,480 Но той може да прави каквото си иска, защото той е на път да се освободи. 570 00:27:17,480 --> 00:27:19,480 И няма значение какво тези стойности са вече. 571 00:27:19,480 --> 00:27:23,040 >> Важното е, че останалите момчета са маршрутизирането по-горе 572 00:27:23,040 --> 00:27:24,280 и под него. 573 00:27:24,280 --> 00:27:25,810 И наистина, това е, което ние правим по-нататък. 574 00:27:25,810 --> 00:27:29,360 Ние безплатно показалка, което означава, да кажем на операционна система, вие сте добре дошли 575 00:27:29,360 --> 00:27:30,906 да си върнем това. 576 00:27:30,906 --> 00:27:34,900 И тогава най-накрая, да се върнем. 577 00:27:34,900 --> 00:27:37,220 Else имплицитно, ако ние все още не са върнати, 578 00:27:37,220 --> 00:27:38,290 ние трябва да продължим да търсим. 579 00:27:38,290 --> 00:27:41,485 Така че показалеца е равна показалка следващия просто означава движи този човек тук. 580 00:27:41,485 --> 00:27:42,600 Преместете този човек тук. 581 00:27:42,600 --> 00:27:45,400 Преместете този човек тук, ако в действителност, ние не намери броя 582 00:27:45,400 --> 00:27:46,960 търсим още. 583 00:27:46,960 --> 00:27:49,630 >> Така че, честно казано, това изглежда напълно изумителен, мисля, на първо 584 00:27:49,630 --> 00:27:52,180 поглед, особено ако сте се бореше с това по време на теста и след това вижте 585 00:27:52,180 --> 00:27:52,850 нещо като това. 586 00:27:52,850 --> 00:27:55,050 И ти потупване сами по гърба. 587 00:27:55,050 --> 00:27:57,080 Е, няма начин мога да имам излезе с, че на теста. 588 00:27:57,080 --> 00:28:00,470 Но бих казал, можете, ако нарушите го надолу в тези индивидуални 589 00:28:00,470 --> 00:28:04,400 случаи и само пеша през него внимателно, макар, разбира се, под 590 00:28:04,400 --> 00:28:06,300 стресиращи обстоятелства. 591 00:28:06,300 --> 00:28:09,470 >> За щастие, на снимката направена всичко по-щастливи. 592 00:28:09,470 --> 00:28:11,050 Може да се направи това в произволен брой начини. 593 00:28:11,050 --> 00:28:12,760 Не е нужно да се направи, кръстосващи нещо тук. 594 00:28:12,760 --> 00:28:14,520 Можете да го направите с прав подобни на тези редове. 595 00:28:14,520 --> 00:28:18,790 Но същността на този проблем, в Като цяло, е да осъзнаем, че 596 00:28:18,790 --> 00:28:22,060 картина в края на краищата трябва да изглежда малко нещо подобно, защото 597 00:28:22,060 --> 00:28:25,030 константно време намекна, че продължаваш заглушаване и заглушаване и заглушаване на 598 00:28:25,030 --> 00:28:29,900 нови възли в началото на списъка. 599 00:28:29,900 --> 00:28:31,960 Някакви въпроси? 600 00:28:31,960 --> 00:28:34,565 Вероятно най-голямото предизвикателство на сигурност на въпросите за кодиране. 601 00:28:34,565 --> 00:28:37,690 >> ПУБЛИКАТА: Така е списък, подобен на глава предишните примери. 602 00:28:37,690 --> 00:28:39,640 >> DAVID J. Malan: Точно така, точно така. 603 00:28:39,640 --> 00:28:43,130 Просто друго име за глобална променлива. 604 00:28:43,130 --> 00:28:44,380 В световен мащаб какво? 605 00:28:44,380 --> 00:28:48,880 606 00:28:48,880 --> 00:28:49,730 >> ROB BOWDEN: OK. 607 00:28:49,730 --> 00:28:52,020 Така че това е една, където можете трябваше да се напише параграфа. 608 00:28:52,020 --> 00:28:56,060 Някои хора пишат есета за този въпрос. 609 00:28:56,060 --> 00:29:00,230 Но просто трябва да се използват тези шест условия да се опише това, което се случва, когато 610 00:29:00,230 --> 00:29:02,440 се опитате да се свържете с facebook.com. 611 00:29:02,440 --> 00:29:07,930 Така че аз просто ще говорим през процеса използване на всички тези условия. 612 00:29:07,930 --> 00:29:11,290 Така че в нашия браузър, ние въведете facebook.com и натиснете Enter. 613 00:29:11,290 --> 00:29:17,280 Така че нашият браузър ще построим HTTP заявка, че ще ходи да изпратите 614 00:29:17,280 --> 00:29:22,220 чрез някакъв процес на Facebook за Facebook, за да се отговори на нас с 615 00:29:22,220 --> 00:29:24,450 HTML на страницата си. 616 00:29:24,450 --> 00:29:28,800 >> Така че това, което е процес, чрез които искането за HTTP 617 00:29:28,800 --> 00:29:30,730 действително навлиза в Facebook? 618 00:29:30,730 --> 00:29:32,790 Така че, на първо място, ние трябва да се преведат Facebook.com. 619 00:29:32,790 --> 00:29:38,780 Така че просто дадено името Facebook.com, където всъщност прави искане на HTTP 620 00:29:38,780 --> 00:29:39,940 Трябва да отидете? 621 00:29:39,940 --> 00:29:44,120 Така че ние трябва да се преведат Facebook.com към IP адрес, който еднозначно 622 00:29:44,120 --> 00:29:47,620 идентифицира каква машина ние всъщност искате да изпратите тази молба да. 623 00:29:47,620 --> 00:29:49,310 Вашият лаптоп е един IP адрес. 624 00:29:49,310 --> 00:29:52,240 Всичко, свързано с интернет има IP адрес. 625 00:29:52,240 --> 00:29:59,030 >> Така че DNS, Domain Name System, която е какво се случва, за да се справят с превод 626 00:29:59,030 --> 00:30:03,750 от facebook.com към IP адрес, който всъщност искате да се свържете. 627 00:30:03,750 --> 00:30:08,075 Така че ние се свърже с DNS сървърите и да речем, какво е facebook.com? 628 00:30:08,075 --> 00:30:16,560 Той казва: О, това е IP адрес 190.212 нещо, нещо, нещо. 629 00:30:16,560 --> 00:30:16,900 Добре. 630 00:30:16,900 --> 00:30:18,850 Сега, аз знам какво машина Искам да се свържете. 631 00:30:18,850 --> 00:30:22,360 >> Така че след като изпратите заявка HTTP в тази машина. 632 00:30:22,360 --> 00:30:24,140 Е как няма да го стигнем до тази машина? 633 00:30:24,140 --> 00:30:27,200 Е, искането отива от рутер за рутер подскачащи. 634 00:30:27,200 --> 00:30:32,630 Не забравяйте примера в клас, където ние всъщност видях маршрута, по който 635 00:30:32,630 --> 00:30:35,340 пакети се появиха, когато ние се опитахме да общуват. 636 00:30:35,340 --> 00:30:38,460 Видяхме го да скочи над Атлантическия океан Ocean в един момент или нещо такова. 637 00:30:38,460 --> 00:30:42,820 >> Така последният срок пристанището. 638 00:30:42,820 --> 00:30:46,520 Така че това сега е на вашия компютър. 639 00:30:46,520 --> 00:30:49,970 Можете да имате няколко неща в момента комуникация с интернет. 640 00:30:49,970 --> 00:30:53,730 Така че може да се работи, да речем, Skype. 641 00:30:53,730 --> 00:30:55,670 I може да има уеб браузър с отворен. 642 00:30:55,670 --> 00:30:59,010 Може и да имам нещо, което torrenting файлове. 643 00:30:59,010 --> 00:31:00,880 Така че всички тези неща са Комуникация с 644 00:31:00,880 --> 00:31:02,600 интернет по някакъв начин. 645 00:31:02,600 --> 00:31:08,070 >> Така че, когато компютърът ви получава някои данни от интернет, как го прави 646 00:31:08,070 --> 00:31:10,130 знам какво приложение всъщност иска данните? 647 00:31:10,130 --> 00:31:12,610 Как не го знае дали този конкретен данни са предназначени за 648 00:31:12,610 --> 00:31:16,070 torrenting заявление за разлика към уеб браузъра? 649 00:31:16,070 --> 00:31:20,980 Така че това е целта на пристанища в които всички тези приложения трябва 650 00:31:20,980 --> 00:31:22,720 твърди порт на вашия компютър. 651 00:31:22,720 --> 00:31:27,580 Така че вашия уеб браузър казва, хей, Аз съм за слушане на порт 1000. 652 00:31:27,580 --> 00:31:32,240 И си torrenting програма се казва, Аз съм за слушане на порт 3000. 653 00:31:32,240 --> 00:31:34,770 И Skype казва, аз съм с порт 4000. 654 00:31:34,770 --> 00:31:41,950 >> Така че, когато можете да получите някои данни, че принадлежи до едно от тези приложения, данните 655 00:31:41,950 --> 00:31:45,510 се маркира с кой порт действително трябва да бъде изпратена заедно с. 656 00:31:45,510 --> 00:31:47,950 Така че това казва, о, аз принадлежа към порт 1000. 657 00:31:47,950 --> 00:31:50,950 Знам, че след това трябва да предаде настоящата заедно с моя уеб браузър. 658 00:31:50,950 --> 00:31:56,440 Така че причината за това е от значение тук е, че уеб сървъри са склонни да 659 00:31:56,440 --> 00:31:58,240 слушате на порт 80. 660 00:31:58,240 --> 00:32:02,420 Така че, когато се свържете с Facebook.com, аз съм комуникация с някои машина. 661 00:32:02,420 --> 00:32:06,390 Но аз трябва да кажа, кой порт на тази машина искам да комуникирам с. 662 00:32:06,390 --> 00:32:09,160 И уеб сървъри са склонни да бъдат слушане на порт 80. 663 00:32:09,160 --> 00:32:14,010 >> Ако те искаха, те биха могли да го настроите така тя изброява като на порт 7000. 664 00:32:14,010 --> 00:32:19,090 И след това в уеб браузър, можех ръчно въведете Facebook.com: 7000 665 00:32:19,090 --> 00:32:24,600 изпрати искане до порт 7000 на уеб сървър на Facebook. 666 00:32:24,600 --> 00:32:26,820 >> DAVID J. Malan: И в този случай, дори въпреки че ние не изисква хора 667 00:32:26,820 --> 00:32:30,000 Споменавам това, в този случай, какво пристанище би искането всъщност отидете? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Опитайте отново. 670 00:32:37,880 --> 00:32:42,810 671 00:32:42,810 --> 00:32:44,300 Точно така. 672 00:32:44,300 --> 00:32:47,960 Не търси това, но финес че е там никой последният. 673 00:32:47,960 --> 00:32:51,770 >> ROB BOWDEN: Така HTTPS, тъй като това е слушане специално за 674 00:32:51,770 --> 00:32:55,180 криптирани, че е на порт 4430. 675 00:32:55,180 --> 00:32:57,680 >> Публика: и имейли са 25, нали? 676 00:32:57,680 --> 00:33:00,670 >> DAVID J. Malan: Изходящ имейли, 25, да. 677 00:33:00,670 --> 00:33:03,760 >> ROB BOWDEN: Аз дори не знам повечето от - всичко на по-ниските от тях са склонни да бъдат 678 00:33:03,760 --> 00:33:06,310 запазено за нещата. 679 00:33:06,310 --> 00:33:09,260 Мисля, че всичко е под 1024 е запазено. 680 00:33:09,260 --> 00:33:13,450 >> ПУБЛИКАТА: Защо казахте 3 е грешен номер? 681 00:33:13,450 --> 00:33:18,820 >> ROB BOWDEN: Защото в един IP адрес, Има четири групи от цифри. 682 00:33:18,820 --> 00:33:21,090 И те са от 0 до 255. 683 00:33:21,090 --> 00:33:28,060 Така че 192.168.2.1 е често срещана локална мрежа, IP адрес. 684 00:33:28,060 --> 00:33:30,840 Забележете, всички от тях са по-малко от 255. 685 00:33:30,840 --> 00:33:33,570 Така че, когато аз започнах с 300, че не би могло да има 686 00:33:33,570 --> 00:33:35,210 е един от номерата. 687 00:33:35,210 --> 00:33:38,170 >> DAVID J. Malan: Но това глупаво клип от - е CSI, където те имат 688 00:33:38,170 --> 00:33:39,970 номер, който е твърде голям за IP адреса. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB BOWDEN: Всякакви въпроси за тази? 691 00:33:46,110 --> 00:33:51,710 На следващия един, толкова пълна промяна в тема, но ние имаме това PHP масив за 692 00:33:51,710 --> 00:33:53,270 къщите в четириядрени. 693 00:33:53,270 --> 00:33:56,360 И ние имаме един неподреден списък. 694 00:33:56,360 --> 00:33:59,550 И ние искаме да отпечатате всеки елемент от списъка просто съдържащ името на къщата. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Така че ние имаме един foreach цикъл. 697 00:34:11,870 --> 00:34:17,540 Така че не забравяйте, синтаксисът е foreach масив като елемент в масива. 698 00:34:17,540 --> 00:34:22,360 Така през всяка итерация на цикъла, къща ще отнеме на една от 699 00:34:22,360 --> 00:34:24,060 стойности вътре в масива. 700 00:34:24,060 --> 00:34:26,530 >> На първата итерация, къщата ще бъде Cabot House. 701 00:34:26,530 --> 00:34:30,370 На втора итерация, къщата ще бъде Courier House и така нататък. 702 00:34:30,370 --> 00:34:34,370 Така че за всеки четириядрен като къща, ние сме просто ще се отпечата - 703 00:34:34,370 --> 00:34:37,250 Вие също може да повтори - 704 00:34:37,250 --> 00:34:42,199 елемента списък и след това името на къщата и след това затворете елемента от списъка. 705 00:34:42,199 --> 00:34:45,210 Фигурните скоби, не са задължителни тук. 706 00:34:45,210 --> 00:34:49,480 >> И тогава ние също заяви във въпроса себе си, не забравяйте да затворите 707 00:34:49,480 --> 00:34:50,770 неподреден списък маркер. 708 00:34:50,770 --> 00:34:53,949 Така че ние трябва да излезете от режим на PHP За да направите това. 709 00:34:53,949 --> 00:35:00,280 Или бихме могли да се повтори затворете неподреден списък маркер. 710 00:35:00,280 --> 00:35:02,380 >> DAVID J. Malan: Също така добре тук, ще бил да се използва старото училище за 711 00:35:02,380 --> 00:35:07,340 линия с $ I = 0 0 и използване на броя на разбера дължината на лъча. 712 00:35:07,340 --> 00:35:09,240 Totally добре също, просто малко wordier. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> ПУБЛИКАТА: Така че, ако сте били ще [Недоловим], щяхте да направите - 715 00:35:14,742 --> 00:35:16,734 Забравям какво [недоловим] е на линия. 716 00:35:16,734 --> 00:35:21,380 Бихте ли $ четириядрени скоба аз? 717 00:35:21,380 --> 00:35:21,850 >> DAVID J. Malan: Точно така. 718 00:35:21,850 --> 00:35:23,100 Да, точно така. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB BOWDEN: Нещо друго? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> DAVID J. Malan: Добре. 723 00:35:32,010 --> 00:35:32,300 Компромиси. 724 00:35:32,300 --> 00:35:38,290 Така че имаше букети от отговори възможно за всеки от тях. 725 00:35:38,290 --> 00:35:40,510 Бяхме наистина просто търсите нещо непреодолими за главата и 726 00:35:40,510 --> 00:35:41,100 един недостатък. 727 00:35:41,100 --> 00:35:44,830 И номер 16 попита, валидиране на потребителите " въвеждане от страна на клиента, както и с JavaScript, 728 00:35:44,830 --> 00:35:47,280 вместо от страна на сървъра, както и с PHP. 729 00:35:47,280 --> 00:35:49,450 Така че това, което е с главата на прави от страна на клиента? 730 00:35:49,450 --> 00:35:53,780 >> Е, едно от нещата, които предложихме е че да намалите латентност, защото 731 00:35:53,780 --> 00:35:56,750 не трябва да се притеснява се свържат с сървър, който може да отнеме няколко 732 00:35:56,750 --> 00:36:00,390 милисекунди или дори няколко секунди чрез избягване на това и просто 733 00:36:00,390 --> 00:36:04,670 валидиране на потребителите вход от страна на клиента от задействане на по-представи манипулатор и 734 00:36:04,670 --> 00:36:06,650 Само проверявам, да не те вида нещо за името? 735 00:36:06,650 --> 00:36:08,080 Дали те въведете нещо в за имейл адрес? 736 00:36:08,080 --> 00:36:10,950 Знаете те избират общежитието от от падащото меню? 737 00:36:10,950 --> 00:36:14,360 >> Можете да ги даде моментална обратна връзка използване на гигахерца компютъра 738 00:36:14,360 --> 00:36:16,770 или каквото и те са, че е всъщност на бюрото си. 739 00:36:16,770 --> 00:36:19,310 Така че това е просто по-добър потребителски изпитате обикновено. 740 00:36:19,310 --> 00:36:24,460 Но един недостатък на това от страна на клиента валидиране, ако го направя, без да 741 00:36:24,460 --> 00:36:29,860 прави от страна на сървъра валидиране е, че Най-всеки, излизащ от CS50 знае 742 00:36:29,860 --> 00:36:33,980 , че може просто да изпрати всички данни, които искате към сървър произволен брой начини. 743 00:36:33,980 --> 00:36:37,030 Честно казано, в повечето всеки браузър, можете да кликнете наоколо в настройките и просто 744 00:36:37,030 --> 00:36:40,110 изключите JavaScript, което, ако Следователно, забранете всяка форма на 745 00:36:40,110 --> 00:36:41,080 валидиране. 746 00:36:41,080 --> 00:36:44,460 >> Но вие също може да се припомни, че дори и аз Направих някои тайнствени неща в клас с помощта на 747 00:36:44,460 --> 00:36:47,790 Telnet и всъщност се представя за да бъде браузър чрез изпращане GET 748 00:36:47,790 --> 00:36:49,240 заявки към сървъра. 749 00:36:49,240 --> 00:36:51,030 И това със сигурност не е с използване на JavaScript. 750 00:36:51,030 --> 00:36:53,290 Това е просто ми пишете команди на клавиатура. 751 00:36:53,290 --> 00:36:57,410 Така че наистина, всеки програмист в рамките на достатъчно комфорт с интернет и HTTP 752 00:36:57,410 --> 00:37:01,690 може да изпрати каквото и данни, той или тя иска към сървър без валидиране. 753 00:37:01,690 --> 00:37:05,470 И ако вашият сървър не е също и проверка, е те да ми даде име, е 754 00:37:05,470 --> 00:37:08,930 това всъщност е валиден имейл адрес, направих те избират общежитието, може да се свърши 755 00:37:08,930 --> 00:37:12,800 до поставяне фалшива или просто празен данни във вашата база данни, която вероятно 756 00:37:12,800 --> 00:37:15,450 няма да бъде нещо добро, ако сте се предполага, че е там. 757 00:37:15,450 --> 00:37:16,770 >> Така че това е едно досадно реалност. 758 00:37:16,770 --> 00:37:19,890 Но като цяло, от страна на клиента валидиране е страхотно. 759 00:37:19,890 --> 00:37:21,810 Но това означава два пъти повече работа. 760 00:37:21,810 --> 00:37:25,970 Въпреки че правим съществуват различни библиотеки, JavaScript библиотеки за 761 00:37:25,970 --> 00:37:28,830 например, които правят толкова много, много по-малко от главоболие. 762 00:37:28,830 --> 00:37:31,940 И вие може да използва част от кода от страна на сървъра, от страна на клиента. 763 00:37:31,940 --> 00:37:35,980 Но не осъзнават, че това е типично допълнителна работа. 764 00:37:35,980 --> 00:37:36,415 Да. 765 00:37:36,415 --> 00:37:37,792 >> ПУБЛИКАТА: Така че, ако ние просто каза по-малко сигурен - 766 00:37:37,792 --> 00:37:39,205 >> DAVID J. Malan: [смее се] 767 00:37:39,205 --> 00:37:39,680 Уф. 768 00:37:39,680 --> 00:37:43,105 Тези, които са винаги по-трудно такива да се произнесе. 769 00:37:43,105 --> 00:37:44,480 >> ROB BOWDEN: Това би са били приети. 770 00:37:44,480 --> 00:37:44,810 >> DAVID J. Malan: Какво? 771 00:37:44,810 --> 00:37:45,810 >> ROB BOWDEN: съм създал този проблем. 772 00:37:45,810 --> 00:37:46,735 Това щеше да бъде приет. 773 00:37:46,735 --> 00:37:47,220 >> DAVID J. Malan: Да. 774 00:37:47,220 --> 00:37:47,830 >> ПУБЛИКАТА: Cool. 775 00:37:47,830 --> 00:37:51,770 >> ROB BOWDEN: Но ние не приемаме за първи едно - 776 00:37:51,770 --> 00:37:53,630 Е, това, което търсим, е нещо подобно, че не е нужно да се 777 00:37:53,630 --> 00:37:55,270 комуникира със сървъра. 778 00:37:55,270 --> 00:37:58,355 Ние не приемаме само по-бързо. 779 00:37:58,355 --> 00:38:00,080 >> ПУБЛИКАТА: Какво ще кажете за не презареди страницата? 780 00:38:00,080 --> 00:38:00,430 >> ROB BOWDEN: Да. 781 00:38:00,430 --> 00:38:03,000 Това беше приет отговор. 782 00:38:03,000 --> 00:38:06,300 >> DAVID J. Malan: нещо, когато ние се чувствахме че е по-вероятно, отколкото не е вероятно 783 00:38:06,300 --> 00:38:09,780 че ти знаеше това, което бяха казвайки, който е труден 784 00:38:09,780 --> 00:38:13,500 линия, за да се направи понякога. 785 00:38:13,500 --> 00:38:16,000 С помощта на свързан списък вместо на масива да се поддържа 786 00:38:16,000 --> 00:38:17,590 сортирано списък от цели числа. 787 00:38:17,590 --> 00:38:21,000 Така че с главата ние често се цитират с свързан списъци, които мотивират тяхната цялост 788 00:38:21,000 --> 00:38:22,370 въвеждането е да получите динамика. 789 00:38:22,370 --> 00:38:23,030 Те могат да растат. 790 00:38:23,030 --> 00:38:23,950 Те могат да се свие. 791 00:38:23,950 --> 00:38:27,370 Така че не е нужно да скочи през обръчите действително да се създаде повече памет 792 00:38:27,370 --> 00:38:28,140 с масив. 793 00:38:28,140 --> 00:38:30,310 Или не е нужно просто да кажа, съжалявам, ръководство. 794 00:38:30,310 --> 00:38:31,410 Масивът е изпълнен. 795 00:38:31,410 --> 00:38:35,850 Така динамичен растеж на списъка. 796 00:38:35,850 --> 00:38:37,210 Недостатък обаче на свързани списъци? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> ПУБЛИКАТА: Това е линейна. 799 00:38:43,356 --> 00:38:45,800 Търсене на свързан списък е линейна вместо това, когато влезете инча 800 00:38:45,800 --> 00:38:46,360 >> DAVID J. Malan: Точно така. 801 00:38:46,360 --> 00:38:50,160 Търсене на свързан списък е линейна, дори ако това е сортирана, защото можете да 802 00:38:50,160 --> 00:38:53,170 само следвайте тези галета, те указатели, от началото на списъка 803 00:38:53,170 --> 00:38:53,570 до края. 804 00:38:53,570 --> 00:38:57,970 Вие не можете да се наберат произволен достъп, и по този начин, двоично търсене, дори ако това е 805 00:38:57,970 --> 00:39:00,740 подредени, че бихте могли да общо с масив. 806 00:39:00,740 --> 00:39:02,390 А има и друга цена. 807 00:39:02,390 --> 00:39:02,966 Да. 808 00:39:02,966 --> 00:39:03,800 >> ПУБЛИКАТА: Memory неефективно? 809 00:39:03,800 --> 00:39:04,130 >> DAVID J. Malan: Да. 810 00:39:04,130 --> 00:39:06,940 Е, не е задължително да казват неефективна. 811 00:39:06,940 --> 00:39:10,110 Но тя не ви струва повече памет, защото имате нужда от 32 бита за всеки 812 00:39:10,110 --> 00:39:13,400 възел за допълнително показалеца, в Поне за единично свързан списък. 813 00:39:13,400 --> 00:39:16,660 Сега, ако сте само съхраняване на числа и добавяте показалеца, това е 814 00:39:16,660 --> 00:39:17,830 всъщност вид на не-тривиално. 815 00:39:17,830 --> 00:39:19,340 Това удвояване на размера на паметта. 816 00:39:19,340 --> 00:39:22,330 Но в действителност, ако сте съхраняване на свързан списък на structs които биха могли да имат 817 00:39:22,330 --> 00:39:25,540 8 байта, 16 байта, дори повече от това, може би това е по-малко 818 00:39:25,540 --> 00:39:26,500 на пределните разходи. 819 00:39:26,500 --> 00:39:28,320 Но това е цена все пак. 820 00:39:28,320 --> 00:39:31,880 Така че нито един от тези, които щеше да е добре, както недостатъци. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 Използване на PHP вместо на C да пиша програма за команден ред. 823 00:39:36,100 --> 00:39:41,890 Така че тук, това е често по-бързо да се използва език като PHP или Ruby или Python. 824 00:39:41,890 --> 00:39:43,700 Можете просто да отворите бързо текстов редактор. 825 00:39:43,700 --> 00:39:45,900 Вие имате много повече функции достъпни за Вас. 826 00:39:45,900 --> 00:39:49,325 PHP има кухненска мивка от функции, докато в C, можете 827 00:39:49,325 --> 00:39:50,420 има много, много малко. 828 00:39:50,420 --> 00:39:53,820 В действителност, момчета ноу по трудния начин , че не е нужно хеш таблици. 829 00:39:53,820 --> 00:39:55,000 Не са свързани списъци. 830 00:39:55,000 --> 00:39:57,470 Ако искате тези, трябва да се ги прилагат себе си. 831 00:39:57,470 --> 00:40:00,950 >> Така че една обърната на PHP или наистина всеки интерпретиран език е бързината 832 00:40:00,950 --> 00:40:02,920 с която можете да пишете код. 833 00:40:02,920 --> 00:40:06,660 Но един недостатък, видяхме това, когато бързо шибна един misspeller 834 00:40:06,660 --> 00:40:11,780 изпълнение в лекция, използвайки PHP, е че използването на интерпретиран език 835 00:40:11,780 --> 00:40:13,570 е обикновено по-бавно. 836 00:40:13,570 --> 00:40:18,420 И видяхме, че явно с увеличаване на време от 0.3 секунди до 3 837 00:40:18,420 --> 00:40:24,440 секунди, защото на тълкуването че всъщност се случва. 838 00:40:24,440 --> 00:40:27,060 >> Друг главата беше, че не трябва да компилирате. 839 00:40:27,060 --> 00:40:30,130 Така че това също ускорява развитието между другото, защото не е нужно 840 00:40:30,130 --> 00:40:31,360 две стъпки за изпълнение на програма. 841 00:40:31,360 --> 00:40:32,140 Трябва само един. 842 00:40:32,140 --> 00:40:35,260 И така, това е доста непреодолими, както добре. 843 00:40:35,260 --> 00:40:38,450 Използване на SQL база данни вместо CSV файл за съхранение на данни. 844 00:40:38,450 --> 00:40:40,230 Така че, SQL база данни се използва за pset7. 845 00:40:40,230 --> 00:40:42,060 CSV файлове, които не се използват много. 846 00:40:42,060 --> 00:40:45,960 Но вие го използва непряко в pset7 като и като говорим за Yahoo Finance. 847 00:40:45,960 --> 00:40:49,330 >> Но е точно като CSV файл с Excel, но супер проста, където колоните са 848 00:40:49,330 --> 00:40:54,010 просто demarked със запетаи вътре на иначе текстов файл. 849 00:40:54,010 --> 00:40:56,740 И с помощта на SQL база данни е малко по-убедителна. 850 00:40:56,740 --> 00:41:00,060 Това е главата, защото можете да получите неща като изберете и вмъквате и изтривате. 851 00:41:00,060 --> 00:41:03,790 И вие получавате, Предполага се, индекси, които MySQL и други бази данни, като 852 00:41:03,790 --> 00:41:07,510 Oracle, изгради за вас в паметта, която означава, че вашият избор вероятно не е 853 00:41:07,510 --> 00:41:09,000 ще бъде линейна горе до долу. 854 00:41:09,000 --> 00:41:11,300 Това всъщност ще бъде нещо като двоично търсене или нещо 855 00:41:11,300 --> 00:41:12,520 подобни по дух. 856 00:41:12,520 --> 00:41:13,930 Така че те са като цяло по-бързо. 857 00:41:13,930 --> 00:41:16,040 >> Но един недостатък е, че това е просто повече работа. 858 00:41:16,040 --> 00:41:16,730 Това е повече усилия. 859 00:41:16,730 --> 00:41:18,140 Трябва да разберете, бази данни. 860 00:41:18,140 --> 00:41:18,940 Вие трябва да го изправи. 861 00:41:18,940 --> 00:41:20,840 Имате нужда от сървър, за да стартирате тази база данни на. 862 00:41:20,840 --> 00:41:22,750 Трябва да се разбере как да я конфигурирате. 863 00:41:22,750 --> 00:41:24,930 Така че това са само тези видове компромиси. 864 00:41:24,930 --> 00:41:27,860 Като има предвид, CSV файл, можете да го създаде с Gedit. 865 00:41:27,860 --> 00:41:28,770 И вие сте добре да тръгвам. 866 00:41:28,770 --> 00:41:31,550 Няма никаква сложност отвъд това. 867 00:41:31,550 --> 00:41:34,870 >> Използването на Trie вместо на хеш таблица с отделен верижното да съхранявате 868 00:41:34,870 --> 00:41:37,490 речник от думи, напомнящи на pset5. 869 00:41:37,490 --> 00:41:42,480 Така че се опитва с главата, на теория най-малко, е какво? 870 00:41:42,480 --> 00:41:46,380 Constant време, най-малко, ако сте хеширане на всеки от отделните 871 00:41:46,380 --> 00:41:48,990 буквите в една дума, като теб Може да се наложи за pset5. 872 00:41:48,990 --> 00:41:52,720 Това може да е пет, шест хешове хешове ако има пет или шест 873 00:41:52,720 --> 00:41:53,900 буквите в думата. 874 00:41:53,900 --> 00:41:54,580 И това е доста добро. 875 00:41:54,580 --> 00:41:56,910 И ако има горна граница за това как дълго думите ти биха могли да бъдат, това е 876 00:41:56,910 --> 00:41:59,320 наистина асимптотично константно време. 877 00:41:59,320 --> 00:42:05,180 >> Като има предвид, хеш таблица с отделен верижното, проблемът там с тази 878 00:42:05,180 --> 00:42:09,070 вид на структура данни е, че изпълнение на своите алгоритми обикновено 879 00:42:09,070 --> 00:42:12,700 зависи от броя на нещата вече в структурата на данните. 880 00:42:12,700 --> 00:42:15,660 И това определено е случаят с вериги, с което още нещо, което поставяте 881 00:42:15,660 --> 00:42:18,800 в хеш таблица, колкото по-дълго тези вериги отиват, което означава в най-лошото 882 00:42:18,800 --> 00:42:21,960 случай, нещо, което може да се търси е чак в края на един 883 00:42:21,960 --> 00:42:26,000 на тези вериги, които ефективно преминава в нещо линейна. 884 00:42:26,000 --> 00:42:29,450 >> Сега, на практика, то би могло абсолютно се окаже, че хеш таблица с 885 00:42:29,450 --> 00:42:32,820 вериги е по-бързо от съответния изпълнение Trie. 886 00:42:32,820 --> 00:42:35,570 Но това е, по различни причини, сред която се опитва да използват един куп 887 00:42:35,570 --> 00:42:39,240 памет, която може в действителност, бавни неща надолу, защото те не получават хубаво 888 00:42:39,240 --> 00:42:42,410 ползи от нещо, наречено кеширане, където нещата, които са близо един до друг 889 00:42:42,410 --> 00:42:45,420 в паметта може да бъде достъпен често по-бързо. 890 00:42:45,420 --> 00:42:48,180 И понякога може да излезе с една наистина добра хеш функция. 891 00:42:48,180 --> 00:42:51,060 Дори ако имате да губите малко памет, може да, наистина, да бъде в състояние да 892 00:42:51,060 --> 00:42:54,430 намерите неща, бързо и не толкова зле, колкото линейно. 893 00:42:54,430 --> 00:42:58,410 >> Така че по-кратко, там не беше задължително с всеки един от тях или дори два 894 00:42:58,410 --> 00:43:00,050 специфични неща, които са били търсите. 895 00:43:00,050 --> 00:43:03,080 Наистина нищо убедителен като главата и недостатък 896 00:43:03,080 --> 00:43:04,800 обикновено хвана окото ни. 897 00:43:04,800 --> 00:43:11,840 >> ROB BOWDEN: Така че за посока нагоре, което направихме Не приемам за своя "по-бързо." Ви 898 00:43:11,840 --> 00:43:14,540 Трябваше да каже нещо по въпроса. 899 00:43:14,540 --> 00:43:17,910 Дори ако ти каза теоретично по-бързо, ние знаехме, че някак си се разбира 900 00:43:17,910 --> 00:43:19,470 че е 0 на 1. 901 00:43:19,470 --> 00:43:22,820 И хеш таблица, на теория, не е 0, 1. 902 00:43:22,820 --> 00:43:26,550 Споменаването нищо по време на работа обикновено имаш точките. 903 00:43:26,550 --> 00:43:32,640 Но "бързо", повечето от решенията на големия борд, които са били опити бяха 904 00:43:32,640 --> 00:43:34,990 обективно бавно от решения които бяха хеш таблици. 905 00:43:34,990 --> 00:43:37,250 Така че по-бързо и на себе си всъщност не е вярно. 906 00:43:37,250 --> 00:43:41,550 907 00:43:41,550 --> 00:43:44,380 >> DAVID J. Malan: Dom де дом дом. 908 00:43:44,380 --> 00:43:46,686 Аз съм може би единственият, който осъзнава, Ето как, че е трябвало да 909 00:43:46,686 --> 00:43:47,500 да се произнася, нали? 910 00:43:47,500 --> 00:43:50,400 >> ROB BOWDEN: Имах всъщност нямат представа. 911 00:43:50,400 --> 00:43:51,650 >> DAVID J. Malan: Накара смисъл в главата ми. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB BOWDEN: Правя това едно. 914 00:43:57,580 --> 00:43:58,020 OK. 915 00:43:58,020 --> 00:44:04,243 Така че това е една, където трябваше да се изготви диаграмата, подобен на вас може 916 00:44:04,243 --> 00:44:06,040 видяхме на последните изпити. 917 00:44:06,040 --> 00:44:12,200 Така че нека просто да погледнете това. 918 00:44:12,200 --> 00:44:18,170 Така че от HTML възел, имаме две деца, на главата и тялото. 919 00:44:18,170 --> 00:44:20,570 Така че ние клон - главата и тялото. 920 00:44:20,570 --> 00:44:22,280 Главата има етикет заглавие. 921 00:44:22,280 --> 00:44:23,710 Така че ние имаме заглавие. 922 00:44:23,710 --> 00:44:28,450 >> Сега, едно нещо, което много хора забравили е, че тези текстови възли са 923 00:44:28,450 --> 00:44:30,430 елементи в това дърво. 924 00:44:30,430 --> 00:44:36,260 Така че тук ние се случи да ги привлече като овали за разграничаването им от тези 925 00:44:36,260 --> 00:44:37,380 видове възли. 926 00:44:37,380 --> 00:44:41,450 Но забележете също така тук имаме отгоре, средната и долната крайна сметка ще бъде 927 00:44:41,450 --> 00:44:42,560 текстови възли. 928 00:44:42,560 --> 00:44:46,250 Така че тези, забравяйки е малко на обща грешка. 929 00:44:46,250 --> 00:44:48,770 >> Тялото има три деца - тези три Divs. 930 00:44:48,770 --> 00:44:53,340 Така Разделения, Div, дивизия и след това текста деца възел на тези Divs. 931 00:44:53,340 --> 00:44:55,900 Това е доста много за това, че на въпроса. 932 00:44:55,900 --> 00:44:57,860 >> DAVID J. Malan: И си струва да се отбележи, въпреки че ние не се спирам на тях 933 00:44:57,860 --> 00:45:01,040 детайли във времето, което прекарваме на JavaScript, че заповедта е така, в 934 00:45:01,040 --> 00:45:02,290 Всъщност, технически въпрос. 935 00:45:02,290 --> 00:45:06,330 Така че, ако главата идва преди тялото в HTML, след това трябва да се появи към 936 00:45:06,330 --> 00:45:08,860 останало от тялото в действителната DOM. 937 00:45:08,860 --> 00:45:12,265 Това си е, като цяло, просто FYI, нещо, наречено документ с цел, когато 938 00:45:12,265 --> 00:45:13,260 това има значение. 939 00:45:13,260 --> 00:45:17,470 И ако сте били прилагане на анализатор, програма, която чете HTML в сграда 940 00:45:17,470 --> 00:45:20,960 на дървото в паметта, за да бъда честен, това е интуитивно вероятно това, което ви 941 00:45:20,960 --> 00:45:24,720 направя така или иначе - отгоре до долу, от ляво на дясно. 942 00:45:24,720 --> 00:45:26,116 >> ROB BOWDEN: Въпроси за това? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 Трябва ли да се направи следващата? 945 00:45:30,000 --> 00:45:32,380 >> DAVID J. Malan: Разбира се. 946 00:45:32,380 --> 00:45:33,810 >> ROB BOWDEN: OK. 947 00:45:33,810 --> 00:45:39,320 Така че това е най-буфер превишен атака въпрос. 948 00:45:39,320 --> 00:45:43,740 Основното, което да се признае, тук е, Е, как може един трик противник 949 00:45:43,740 --> 00:45:46,170 тази програма в изпълняващата произволен код? 950 00:45:46,170 --> 00:45:51,860 Така argv1, първият команден ред аргумент за тази програма, която може да бъде 951 00:45:51,860 --> 00:45:53,920 произволно дълго. 952 00:45:53,920 --> 00:45:59,160 Но тук ние използваме memcpy да копирате argv1, които тук се намира бар. 953 00:45:59,160 --> 00:46:00,165 Ще го прехвърляха като аргумент. 954 00:46:00,165 --> 00:46:02,050 И така, това е като в лентата за името. 955 00:46:02,050 --> 00:46:08,040 >> Така че ние сме memcpying бар в този буфер в. 956 00:46:08,040 --> 00:46:09,400 Колко байта сме копиране? 957 00:46:09,400 --> 00:46:14,040 Е обаче много байта бар се случва да се използва, дължината на този довод. 958 00:46:14,040 --> 00:46:17,930 Но с е широк само 12 байта. 959 00:46:17,930 --> 00:46:22,280 Така че, ако ние въведете аргумент на командния ред това е по-дълъг от 12 байта, ние сме 960 00:46:22,280 --> 00:46:25,470 ще прелее тази специално буфер. 961 00:46:25,470 --> 00:46:31,000 Сега, как може да излъже противник на програмирате в изпълнение на произволен код? 962 00:46:31,000 --> 00:46:34,910 >> Така че не забравяйте, че тук Основната се обажда Foo. 963 00:46:34,910 --> 00:46:37,340 И така, след това основните разговори Foo. 964 00:46:37,340 --> 00:46:40,408 Да се ​​направи това. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Така че ние имаме нашия стак. 967 00:46:46,990 --> 00:46:49,090 И главната има стак кадър в дъното. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 В един момент, основните разговори Foo. 970 00:46:53,250 --> 00:46:55,390 Е, веднага, основните разговори Foo. 971 00:46:55,390 --> 00:46:57,130 И така Foo получава своята собствена стека рамка. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Сега, в някакъв момент, Foo няма да се върне. 974 00:47:02,220 --> 00:47:06,810 И отиде Foo възвръщаемост, ние трябва да знаем при какъв ред код вътре в основната ние 975 00:47:06,810 --> 00:47:10,610 са били с цел да се знае къде ние трябва да се възобнови в основния. 976 00:47:10,610 --> 00:47:13,100 Ние можем да наричаме Foo от цяло китка на различни места. 977 00:47:13,100 --> 00:47:14,620 Откъде да знаем, къде да се връщат? 978 00:47:14,620 --> 00:47:16,460 Е, ние трябва да се съхранява, че някъде. 979 00:47:16,460 --> 00:47:23,010 >> Така че някъде точно около тук, ние съхраняваме където трябва да се върнем още веднъж 980 00:47:23,010 --> 00:47:24,070 Foo възвръщаемост. 981 00:47:24,070 --> 00:47:26,350 И това е адреса на подателя. 982 00:47:26,350 --> 00:47:30,490 Е, как противник може да се възползва за това е фактът, че 983 00:47:30,490 --> 00:47:37,550 Този буфер се съхранява в, нека да се каже, точно тук е в. 984 00:47:37,550 --> 00:47:39,690 Така че ние имаме 12 байта за хим. 985 00:47:39,690 --> 00:47:40,540 Това е в. 986 00:47:40,540 --> 00:47:43,030 И това е комин пръстен на Foo. 987 00:47:43,030 --> 00:47:49,970 Така че, ако злонамерен потребител влиза повече байтове, отколкото 12 или те въведете командата 988 00:47:49,970 --> 00:47:54,570 аргумент линия, която е по-дълъг от 12 герои, а след това ние ще 989 00:47:54,570 --> 00:47:57,540 прелее този буфер. 990 00:47:57,540 --> 00:47:59,910 >> Ние можем да продължим. 991 00:47:59,910 --> 00:48:02,220 И в един момент, отиваме далеч достатъчно, че да започнем 992 00:48:02,220 --> 00:48:05,120 презаписване на този обратен адрес. 993 00:48:05,120 --> 00:48:08,310 Така че след като ние презапишете адреса на подателя, това означава, че когато Foo 994 00:48:08,310 --> 00:48:14,220 възвръщаемост, ние сме се завръщат в накъдето злонамерен потребител се обяснява това с 995 00:48:14,220 --> 00:48:19,490 каквото и стойност е влязла, независимо с какви символи въведени от потребителя. 996 00:48:19,490 --> 00:48:24,320 И така, ако злонамерен потребител се особено умен, той може да има този 997 00:48:24,320 --> 00:48:29,255 върнете към някъде в printDef функция или някъде в изчистване 998 00:48:29,255 --> 00:48:31,830 функция, просто навсякъде произволно. 999 00:48:31,830 --> 00:48:38,420 >> Но още по-умно е това, което, ако той има потребителят се върне към точно тук. 1000 00:48:38,420 --> 00:48:41,920 И след това да започнете да изпълнява тези като реда код. 1001 00:48:41,920 --> 00:48:46,610 Така че в този момент, потребителят може да влезе каквото си иска в този регион. 1002 00:48:46,610 --> 00:48:52,210 И той има пълен контрол над вашата програма. 1003 00:48:52,210 --> 00:48:53,460 Въпроси за това? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 Така че следващият въпрос е завършено новото привеждане на Foo по такъв начин, 1006 00:49:00,970 --> 00:49:02,620 че вече не е уязвим. 1007 00:49:02,620 --> 00:49:03,870 >> Така че има няколко начина ти би могъл да направи това. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 Ние все още имаме само в е с дължина 12. 1010 00:49:13,330 --> 00:49:16,480 Може да са се променили тази като част от вашето решение. 1011 00:49:16,480 --> 00:49:18,930 Ние също така добави, проверка, за да се направи сигурен бар не е нищожна. 1012 00:49:18,930 --> 00:49:24,460 Въпреки, че не се нуждае от че за пълен кредит. 1013 00:49:24,460 --> 00:49:27,690 Така че ние сме първата проверка на низ дължина на бар. 1014 00:49:27,690 --> 00:49:31,650 Ако тя е по-голяма от 12, тогава всъщност не направи копие. 1015 00:49:31,650 --> 00:49:33,010 Така че това е един от начините за това определяне. 1016 00:49:33,010 --> 00:49:36,750 >> Друг начин за определяне е вместо като в само с дължина 12, трябва да го 1017 00:49:36,750 --> 00:49:39,310 да бъде с дължина strlen (бар). 1018 00:49:39,310 --> 00:49:43,370 Друг начин за определяне е всъщност просто се върнете. 1019 00:49:43,370 --> 00:49:46,690 Така че, ако току-що се отърва от всички това, ако току-що изтрити всички 1020 00:49:46,690 --> 00:49:51,830 реда код, ще са придобили пълен кредит, тъй като тази функция 1021 00:49:51,830 --> 00:49:54,150 всъщност не се постигне нищо. 1022 00:49:54,150 --> 00:49:57,650 Това е копиране на командния ред аргумент в някакъв масив в 1023 00:49:57,650 --> 00:49:59,960 неин местен стека рамка. 1024 00:49:59,960 --> 00:50:01,310 И тогава нещо се завръща. 1025 00:50:01,310 --> 00:50:04,020 И каквото и да е талантлив е отишъл. 1026 00:50:04,020 --> 00:50:09,740 Така че завръщането е също достатъчно начин за получаване на пълен кредит. 1027 00:50:09,740 --> 00:50:13,425 >> DAVID J. Malan: Не е съвсем в духа на въпроса, но приемлив според 1028 00:50:13,425 --> 00:50:15,580 спец. все пак. 1029 00:50:15,580 --> 00:50:18,260 >> ROB BOWDEN: Въпроси за някой от това? 1030 00:50:18,260 --> 00:50:22,270 Единственото нещо, което най-малко необходимо, за да са съставяне код. 1031 00:50:22,270 --> 00:50:24,810 Така че, въпреки че технически не сте уязвими, ако вашият код не 1032 00:50:24,810 --> 00:50:29,130 събира, ние не приемам това. 1033 00:50:29,130 --> 00:50:31,350 Няма въпроси? 1034 00:50:31,350 --> 00:50:33,320 OK. 1035 00:50:33,320 --> 00:50:34,580 >> DAVID J. Malan: Искате ли да се каже, това заглавие? 1036 00:50:34,580 --> 00:50:37,230 >> ROB BOWDEN: Не. 1037 00:50:37,230 --> 00:50:40,470 >> DAVID J. Malan: Така че в този един, този е или добра новина или лоша новина. 1038 00:50:40,470 --> 00:50:43,870 Това е буквално същия проблем като на първата викторина. 1039 00:50:43,870 --> 00:50:46,140 И това е почти същото проблем, тъй като pset1. 1040 00:50:46,140 --> 00:50:49,980 Но това е умишлено опростена, за да бъде опростена пирамида, която може да бъде 1041 00:50:49,980 --> 00:50:52,330 решен с малко опростена итерация. 1042 00:50:52,330 --> 00:50:55,680 И наистина, това, което сме били получаване на тук не е толкова много на логиката, 1043 00:50:55,680 --> 00:50:58,100 защото най-вероятно, от този момент, вие сте по-удобно, отколкото са били 1044 00:50:58,100 --> 00:51:01,850 в една седмица с вериги за или защо примки, но наистина да дразни, освен че 1045 00:51:01,850 --> 00:51:04,790 сте малко удобно с представа, че PHP не е само за това, което 1046 00:51:04,790 --> 00:51:05,290 програмиране. 1047 00:51:05,290 --> 00:51:07,820 Тя може действително да се използва като език да пишат програми командния ред. 1048 00:51:07,820 --> 00:51:10,060 >> И наистина, това е, което ние се опитвахме да привлека вниманието ви към. 1049 00:51:10,060 --> 00:51:12,060 Това е програма за команден ред PHP. 1050 00:51:12,060 --> 00:51:16,690 Така C код тук, докато правилното в C не коригира за PHP. 1051 00:51:16,690 --> 00:51:17,940 Но код наистина е същото. 1052 00:51:17,940 --> 00:51:21,720 Ако сравните решения за Quiz 0 срещу Quiz 1, вие ще откриете, че 1053 00:51:21,720 --> 00:51:25,630 това е почти идентичен, с изключение на някои доларови знаци, както и за 1054 00:51:25,630 --> 00:51:27,250 отсъствие на тип данни. 1055 00:51:27,250 --> 00:51:31,720 По-специално, ако можем да разгледаме тук, ще видите, че ние обхождане, в това 1056 00:51:31,720 --> 00:51:33,730 случай, от 1 до до 7. 1057 00:51:33,730 --> 00:51:34,910 >> Бихме могли да го направи 0 индекс. 1058 00:51:34,910 --> 00:51:37,320 Но понякога, мисля, че това е просто умствено по-лесно да се мисли за неща, 1059 00:51:37,320 --> 00:51:38,200 1-7. 1060 00:51:38,200 --> 00:51:40,300 Ако искате един блок, а след това два блокове, след това три, тогава 1061 00:51:40,300 --> 00:51:41,770 точка, точка, точка, седем. 1062 00:51:41,770 --> 00:51:45,960 Ние сме J се инициализира с 1 и след това се разчита на до аз. 1063 00:51:45,960 --> 00:51:48,150 И тук всичко е иначе идентична. 1064 00:51:48,150 --> 00:51:49,790 Но заслужават внимание са няколко неща. 1065 00:51:49,790 --> 00:51:53,230 Ние ви даваме тези две линии, този първи един, goofily име като вертеп 1066 00:51:53,230 --> 00:51:54,560 за остър взрив. 1067 00:51:54,560 --> 00:51:58,770 И това само определя пътя, по папка, в която програмата може да бъде 1068 00:51:58,770 --> 00:52:02,160 установено, че искате да използвате да тълкува този файл. 1069 00:52:02,160 --> 00:52:04,710 >> И тогава линията след това, на разбира се, означава, въведете PHP режим. 1070 00:52:04,710 --> 00:52:07,740 И линията на самото дъно означава излизане PHP режим. 1071 00:52:07,740 --> 00:52:09,740 И това работи, като цяло, с тълкува езици. 1072 00:52:09,740 --> 00:52:14,370 Това е нещо досадно, ако ти напиша програма във файл, наречен foo.php. 1073 00:52:14,370 --> 00:52:17,320 И тогава вашите потребители имат само Спомням си, OK, за да стартирате тази програма, аз 1074 00:52:17,320 --> 00:52:22,320 трябва да напишете "PHP пространство foo.php." Вид досадно, ако не друго. 1075 00:52:22,320 --> 00:52:25,270 И тя също така разкрива, че вашата програма е написан на PHP, който не е всичко 1076 00:52:25,270 --> 00:52:27,060 че светещата за потребителя. 1077 00:52:27,060 --> 00:52:30,100 >> Така че можете да премахнете. PHP напълно припомнят от лекция. 1078 00:52:30,100 --> 00:52:35,690 И всъщност можете да направите. / Foo ако сте го chmodded, като я прави 1079 00:52:35,690 --> 00:52:36,500 изпълним. 1080 00:52:36,500 --> 00:52:39,630 Така коригирате а + х Foo би направил това. 1081 00:52:39,630 --> 00:52:41,460 И ако прибавим и отиде по дяволите тук. 1082 00:52:41,460 --> 00:52:45,320 Но наистина, проблемът ставаше в отпечатване на нещо подобно. 1083 00:52:45,320 --> 00:52:51,100 Не HTML, не C-код със сигурност, само някои PHP. 1084 00:52:51,100 --> 00:52:54,100 Така че след това се върна в Milo проблем 25. 1085 00:52:54,100 --> 00:52:58,050 И в 25, които са ти дадени по-долу скелет код, който е бил 1086 00:52:58,050 --> 00:52:59,730 доста проста уеб страница. 1087 00:52:59,730 --> 00:53:04,230 И сочна част HTML-мъдър е намалял тук, където имаме вътре в тялото 1088 00:53:04,230 --> 00:53:09,160 форма, която има уникален ID на входа вътрешността на който е два входа, един 1089 00:53:09,160 --> 00:53:11,950 с идея за име, една с една идея на бутон. 1090 00:53:11,950 --> 00:53:14,240 >> Първият е вид текст, на вторият тип изпратете. 1091 00:53:14,240 --> 00:53:16,930 И така, ние ви даде, всъщност, по- съставки, отколкото са необходими, просто така 1092 00:53:16,930 --> 00:53:19,230 момчета са имали възможности, с които за решаване на този проблем. 1093 00:53:19,230 --> 00:53:21,130 Вие не трябва строго всички тези идентификатори. 1094 00:53:21,130 --> 00:53:23,580 Но тя ви позволява да решите това по различни начини. 1095 00:53:23,580 --> 00:53:27,050 И нагоре към върха, забележите, че Целта е да се предизвика 1096 00:53:27,050 --> 00:53:27,960 прозорец като този - 1097 00:53:27,960 --> 00:53:28,780 Здравейте, Майло! - 1098 00:53:28,780 --> 00:53:31,270 да изскочи в браузъра с използване на супер простите, ако 1099 00:53:31,270 --> 00:53:33,190 не грозен, функция за известяване. 1100 00:53:33,190 --> 00:53:37,480 И така, в крайна сметка, това се свежда концептуално по някакъв начин да слушам за 1101 00:53:37,480 --> 00:53:41,290 подаване на формуляра от страна на клиента , А не от страната на сървъра, някак си 1102 00:53:41,290 --> 00:53:45,640 в отговор на това твърдение от вземете стойността, която потребителят въвели 1103 00:53:45,640 --> 00:53:50,120 в областта на името, и след това я излагат в тялото на сигнал. 1104 00:53:50,120 --> 00:53:53,460 >> Така че един от начините, можете да направите това е с Jquery, което изглежда малко 1105 00:53:53,460 --> 00:53:56,880 синтактично сложен на първо време. 1106 00:53:56,880 --> 00:54:00,760 Можете да направите това с чиста DOM код - document.getelement от ID. 1107 00:54:00,760 --> 00:54:02,530 Но нека да погледнем в тази версия. 1108 00:54:02,530 --> 00:54:05,110 Имам няколко важен линии на първо място. 1109 00:54:05,110 --> 00:54:09,460 Така че едно, ние имаме тази линия, която е идентично с това, което може би сте виждали 1110 00:54:09,460 --> 00:54:13,830 , аз вярвам, form2.html от клас в 9 седмица. 1111 00:54:13,830 --> 00:54:16,960 И това е просто казвам, изпълнява следния код, когато 1112 00:54:16,960 --> 00:54:18,430 документът е готов. 1113 00:54:18,430 --> 00:54:21,770 Това е важно, само защото HTML страници се четат отгоре 1114 00:54:21,770 --> 00:54:23,280 отдолу, отляво на дясно. 1115 00:54:23,280 --> 00:54:27,910 >> И затова, ако се опитате да направите нещо в кода си тук, за да някои DOM 1116 00:54:27,910 --> 00:54:31,560 елемент, някои HTML тагове, че е надолу тук, вие го правите твърде скоро, 1117 00:54:31,560 --> 00:54:34,220 защото това не е дори прочетено в паметта. 1118 00:54:34,220 --> 00:54:37,740 Така че, като казва това document.ready линия, което казваме, 1119 00:54:37,740 --> 00:54:39,040 тук е някакъв код, браузър. 1120 00:54:39,040 --> 00:54:42,440 Но не се изпълни това, докато цялата документ е готово, че е DOM 1121 00:54:42,440 --> 00:54:44,320 съществува дърво в паметта. 1122 00:54:44,320 --> 00:54:47,110 Това е по-малко ясна, ако синтактично на 1123 00:54:47,110 --> 00:54:51,890 малко по-различно, когато казвам, вземете на HTML елемент, чийто уникален 1124 00:54:51,890 --> 00:54:53,560 идентификатор е входове. 1125 00:54:53,560 --> 00:54:56,220 Това е, което етикет хеш означава, уникалният идентификатор. 1126 00:54:56,220 --> 00:54:58,070 И тогава аз се обаждам. Представя. 1127 00:54:58,070 --> 00:55:01,660 >> So. Представя тук е функция, в противен случай известен като метод, който е 1128 00:55:01,660 --> 00:55:05,850 във вътрешността на обекта от лявата страна страна там, че аз не се подчертае. 1129 00:55:05,850 --> 00:55:08,990 Така че, ако мислите, че на входа като обект в паметта - и наистина е така. 1130 00:55:08,990 --> 00:55:10,440 Това е възел в едно дърво - 1131 00:55:10,440 --> 00:55:16,580 . Представи средства, когато с тази форма е подадено това ID, изпълнява 1132 00:55:16,580 --> 00:55:17,700 следния код. 1133 00:55:17,700 --> 00:55:20,290 Не ме интересува какво е името на функция е, че аз съм изпълнение. 1134 00:55:20,290 --> 00:55:23,760 Така че тук аз съм с помощта, както и преди, какво е извикахме функцията ламбда или 1135 00:55:23,760 --> 00:55:24,720 анонимна функция. 1136 00:55:24,720 --> 00:55:27,640 Това не е всичко интелектуално интересно, различно от това няма име, 1137 00:55:27,640 --> 00:55:30,220 което е добре, ако сте само никога няма да го наричат ​​веднъж. 1138 00:55:30,220 --> 00:55:34,490 И вътре има Аз всъщност се справят подаване на формуляра. 1139 00:55:34,490 --> 00:55:36,810 За първи път декларира променлива нарича стойност. 1140 00:55:36,810 --> 00:55:40,610 И тогава какъв е ефектът от това подчерта част тук сега? 1141 00:55:40,610 --> 00:55:44,755 Какво означава, че правя по- високо ниво за мен? 1142 00:55:44,755 --> 00:55:48,539 >> ПУБЛИКАТА: Той получава стойността, която Потребителят все още не е направил в HTML-долу. 1143 00:55:48,539 --> 00:55:50,920 Той получава това име и след това установи стойността на него. 1144 00:55:50,920 --> 00:55:51,590 >> DAVID J. Malan: Точно така. 1145 00:55:51,590 --> 00:55:54,300 Тя грабва възел, чийто уникален идентификатор е името. 1146 00:55:54,300 --> 00:55:56,900 Той получава стойността в него, които е, вероятно, това, което потребителят 1147 00:55:56,900 --> 00:55:58,190 него или себе си написали. 1148 00:55:58,190 --> 00:56:01,020 И след това го съхранява, че в променлива, наречена стойност. 1149 00:56:01,020 --> 00:56:03,720 Като настрана, бихте могли да имат също направи това малко по-различно. 1150 00:56:03,720 --> 00:56:09,250 Напълно приемливо, като направите нещо лъжа VAR стойност получава 1151 00:56:09,250 --> 00:56:10,500 document.getElementById. 1152 00:56:10,500 --> 00:56:12,860 1153 00:56:12,860 --> 00:56:15,460 И това е причината, че е малко досадно да не се използва JQuery. 1154 00:56:15,460 --> 00:56:16,710 "Име" стойност.. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Така че напълно приемливо. 1157 00:56:19,620 --> 00:56:22,770 Различни начини да направите това. Jquery просто има тенденция да бъде малко по-кратка и 1158 00:56:22,770 --> 00:56:25,230 Определено по-популярни сред програмистите. 1159 00:56:25,230 --> 00:56:27,590 >> Сега, аз правя малко на здравия разум проверите, защото в проблема 1160 00:56:27,590 --> 00:56:30,820 декларация ние изрично каза, ако потребител все още не е въвел своето 1161 00:56:30,820 --> 00:56:32,580 име, не показват сигнали за тревога. 1162 00:56:32,580 --> 00:56:35,390 Но можете да проверите за това, като просто проверка за празен низ за 1163 00:56:35,390 --> 00:56:37,850 в кавички, ако има всъщност нищо там. 1164 00:56:37,850 --> 00:56:40,880 Но ако това не е равно на кавички, Искам да се обадя на сигнали. 1165 00:56:40,880 --> 00:56:45,610 И интересното тук е, че ние използваме оператора на плюс, който 1166 00:56:45,610 --> 00:56:48,130 какво прави в JavaScript? 1167 00:56:48,130 --> 00:56:48,740 Свързвам. 1168 00:56:48,740 --> 00:56:50,690 Така че това е като PHPs точка оператор. 1169 00:56:50,690 --> 00:56:52,820 Същата идея, малко по-различен синтаксис. 1170 00:56:52,820 --> 00:56:55,280 И аз съм просто създаване на низа, че те видях на екрана изстрел - 1171 00:56:55,280 --> 00:56:57,750 Здравейте, така и така. 1172 00:56:57,750 --> 00:56:59,200 >> И тогава най-малката подробност е това. 1173 00:56:59,200 --> 00:57:04,970 Защо ми е връщане фалшиви вътре на тази анонимна функция? 1174 00:57:04,970 --> 00:57:07,420 >> ПУБЛИКАТА: Няма никаква стойност. 1175 00:57:07,420 --> 00:57:09,380 Можете да я тури във форма. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 Тя просто казва, ако стойността не е равна на празно, след това го направи. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Имаше празно в това твърдение. 1180 00:57:20,940 --> 00:57:21,170 >> DAVID J. Malan: OK. 1181 00:57:21,170 --> 00:57:21,640 Все пак внимавайте. 1182 00:57:21,640 --> 00:57:22,830 Няма никой друг тук. 1183 00:57:22,830 --> 00:57:25,510 И това връщане невярно е извън на, ако условията. 1184 00:57:25,510 --> 00:57:29,470 Така че това подчерта линия, връщане фалшиви, изпълнява, без значение какво, когато 1185 00:57:29,470 --> 00:57:32,310 формулярът е подаден. 1186 00:57:32,310 --> 00:57:36,810 Какво означава връщане фалшиви вътре в този манипулатор на събитие, както се нарича, 1187 00:57:36,810 --> 00:57:38,450 въпросното събитие е представянето? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> ПУБЛИКАТА: Защото се случва само веднъж. 1190 00:57:44,470 --> 00:57:45,320 >> DAVID J. Malan: Само се случва веднъж. 1191 00:57:45,320 --> 00:57:46,821 Не съвсем. 1192 00:57:46,821 --> 00:57:47,292 Да? 1193 00:57:47,292 --> 00:57:50,589 >> ПУБЛИКАТА: Тя не позволява формата от подаване на поведението по подразбиране, 1194 00:57:50,589 --> 00:57:52,480 което би направило презаредите страницата. 1195 00:57:52,480 --> 00:57:53,110 >> DAVID J. Malan: Точно така. 1196 00:57:53,110 --> 00:57:56,490 Така че аз съм претоварване терминът представя тук, защото аз казвам, формата е 1197 00:57:56,490 --> 00:57:57,670 да бъде представена. 1198 00:57:57,670 --> 00:58:02,240 Но, както ви предлагам, тя всъщност не е е подадено в истинския HTTP начин. 1199 00:58:02,240 --> 00:58:06,870 Когато кликнете върху Изпращане, защото на нашата onSubmit манипулатор, ние сме прихващане 1200 00:58:06,870 --> 00:58:09,040 че формулярът за участие, така да се каже. 1201 00:58:09,040 --> 00:58:11,290 Ние тогава вършим нещо с JavaScript код. 1202 00:58:11,290 --> 00:58:14,070 Но аз умишлено връщането невярна, защото това, което не искам да се случи 1203 00:58:14,070 --> 00:58:18,430 част от секундата по-късно е за цялото формата себе си да бъде представен в интернет 1204 00:58:18,430 --> 00:58:22,800 сървър с двойки ключови стойности, като промените адреса да бъде нещо като 1205 00:58:22,800 --> 00:58:26,180 Q = котки или каквото и да е направил, например, в клас. 1206 00:58:26,180 --> 00:58:29,640 Аз не искам това да се случи, защото не съществува на сървъра слушане за това 1207 00:58:29,640 --> 00:58:30,690 Формуляр за участие. 1208 00:58:30,690 --> 00:58:32,320 Това е чисто направено в JavaScript код. 1209 00:58:32,320 --> 00:58:35,760 И това е защо аз не дори да има действие атрибут на формата ми, защото аз 1210 00:58:35,760 --> 00:58:38,870 нямам намерение за това, за да някога отидете до сървъра. 1211 00:58:38,870 --> 00:58:40,780 >> Така че, това е да бъде представена. 1212 00:58:40,780 --> 00:58:44,340 Но ние сме прихващане тази форма подаване и предотвратяване на по подразбиране 1213 00:58:44,340 --> 00:58:47,477 поведение, което е действително извървим целия път до сървъра. 1214 00:58:47,477 --> 00:58:48,730 >> ПУБЛИКАТА: Така да бъдат пазени от страна на клиента. 1215 00:58:48,730 --> 00:58:49,780 >> DAVID J. Malan: Поддържане то от страна на клиента. 1216 00:58:49,780 --> 00:58:51,030 Точно така. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 Следващата ми беше ох MySQL. 1219 00:58:55,757 --> 00:59:00,000 1220 00:59:00,000 --> 00:59:00,430 >> ROB BOWDEN: OK. 1221 00:59:00,430 --> 00:59:04,990 Така че този първи въпрос е по принцип груб за хората. 1222 00:59:04,990 --> 00:59:07,270 Въпреки, че по-късните отидоха по-добри. 1223 00:59:07,270 --> 00:59:12,260 Така че трябваше да избирам правилните данни видове за двете колони. 1224 00:59:12,260 --> 00:59:17,750 И двете от тях имат някаква неща за тях, които 1225 00:59:17,750 --> 00:59:20,620 направи избор трудно. 1226 00:59:20,620 --> 00:59:24,430 Така Int не е валиден въведете за брой. 1227 00:59:24,430 --> 00:59:29,410 Причината е 12-цифрен акаунт брой, едно цяло число не е достатъчно голям, за да 1228 00:59:29,410 --> 00:59:31,070 съхраните общите цифри. 1229 00:59:31,070 --> 00:59:36,570 Така валиден избор би бил голям INT, ако се случи да се знае това. 1230 00:59:36,570 --> 00:59:42,090 Друг избор би могъл да бъде поле Чар дължина 12. 1231 00:59:42,090 --> 00:59:44,560 Така че нито един от тези, които биха работили. 1232 00:59:44,560 --> 00:59:46,100 Int не би. 1233 00:59:46,100 --> 00:59:50,170 >> Сега, баланс, мисля обратно към pset7. 1234 00:59:50,170 --> 00:59:59,540 Така че ние се използват специално десетични да съхраняване на стойността на акции или - 1235 00:59:59,540 --> 01:00:00,550 >> DAVID J. Malan: Cash. 1236 01:00:00,550 --> 01:00:01,060 >> ROB BOWDEN: Cash. 1237 01:00:01,060 --> 01:00:05,710 Ние използвахме десетични за съхраняване на сумата на пари в брой, които потребителят разполага в момента. 1238 01:00:05,710 --> 01:00:10,950 Така че причината да се направи това е защото, не забравяйте, плавници. 1239 01:00:10,950 --> 01:00:12,480 Има плаваща запетая в точност. 1240 01:00:12,480 --> 01:00:18,200 Тя не може точно да се съхранява парите ценности като искаме тук. 1241 01:00:18,200 --> 01:00:23,630 Така десетични е в състояние точно да магазин нещо, да речем, два знака след десетичната запетая. 1242 01:00:23,630 --> 01:00:27,630 Ето защо баланс, ние го искаме да бъде десетични и не плува. 1243 01:00:27,630 --> 01:00:30,230 >> DAVID J. Malan: И също така, също, въпреки че той може да е бил умен в друга 1244 01:00:30,230 --> 01:00:32,760 контекст, за да мислят, може би това е шанс за вътр. 1245 01:00:32,760 --> 01:00:34,420 Аз просто ще следим нещата с пари. 1246 01:00:34,420 --> 01:00:38,670 Защото ние изрично показа по подразбиране стойност е 100.00, че 1247 01:00:38,670 --> 01:00:40,380 означава, че той може да бъде само едно цяло число. 1248 01:00:40,380 --> 01:00:45,310 И още един финес прекалено с номер беше, че тя не е била предназначена 1249 01:00:45,310 --> 01:00:46,180 да бъде подвеждащ въпрос. 1250 01:00:46,180 --> 01:00:49,860 Но припомни, че едно цяло число в MySQL, като в C, най-малко в 1251 01:00:49,860 --> 01:00:51,440 уред, е 32-битова. 1252 01:00:51,440 --> 01:00:53,960 И въпреки, че ние не очакваме да знам точно колко цифри, които 1253 01:00:53,960 --> 01:00:56,910 средства, си спомням, че най-голям брой Вие може да представлява потенциално 1254 01:00:56,910 --> 01:01:00,710 с 32-битово число е приблизително какво? 1255 01:01:00,710 --> 01:01:02,760 >> Какъв номер да казваме винаги? 1256 01:01:02,760 --> 01:01:04,530 От 2 до 32, което е това, приблизително? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 Не е нужно да се знае точно. 1259 01:01:08,780 --> 01:01:10,580 Но горе-долу е полезно в живота. 1260 01:01:10,580 --> 01:01:12,200 Това е приблизително 4 млрд. евро. 1261 01:01:12,200 --> 01:01:14,430 Така че ние сме каза, че няколко пъти. 1262 01:01:14,430 --> 01:01:16,360 Знам, че мога да кажа, че няколко пъти. 1263 01:01:16,360 --> 01:01:17,670 И това е приблизително 4 млрд. евро. 1264 01:01:17,670 --> 01:01:19,710 И това е едно добро правило на палеца да се знае. 1265 01:01:19,710 --> 01:01:21,880 Ако имате 8 бита, 256 е магическо число. 1266 01:01:21,880 --> 01:01:24,160 Ако имате 32 бита, 4 милиарда даде или отнеме. 1267 01:01:24,160 --> 01:01:27,140 Така че, ако просто напишете надолу 4 млрд. евро, ще видите, че това е по-малко цифри, отколкото 1268 01:01:27,140 --> 01:01:30,970 12, което означава, че явно не е достатъчно изразителност да заснемете 1269 01:01:30,970 --> 01:01:34,220 12-цифрен номер на сметка. 1270 01:01:34,220 --> 01:01:34,940 >> ROB BOWDEN: OK. 1271 01:01:34,940 --> 01:01:38,520 Така че на останалите отидоха по-добри. 1272 01:01:38,520 --> 01:01:40,900 Така че предполагам, че банката налага 20 $ месечно 1273 01:01:40,900 --> 01:01:42,400 Такса поддръжка на всички сметки. 1274 01:01:42,400 --> 01:01:45,506 С какво SQL заявка може банката приспадане на $ 20 от всеки брой, дори ако 1275 01:01:45,506 --> 01:01:47,520 тя води до някои отрицателни салда? 1276 01:01:47,520 --> 01:01:50,380 Така че основно, има четири Основните видове заявки - 1277 01:01:50,380 --> 01:01:52,840 вмъкнете, изберете, обновяване и изтриване. 1278 01:01:52,840 --> 01:01:56,080 Така че това, което си мислим, че сме Ще използвам тук? 1279 01:01:56,080 --> 01:01:57,000 Update. 1280 01:01:57,000 --> 01:01:58,260 >> Така че нека хвърлим един поглед. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Така че тук ние сме актуализиране. 1283 01:02:05,870 --> 01:02:09,900 Какво маса сме актуализиране на сметки? 1284 01:02:09,900 --> 01:02:11,670 Така актуализиране сметки. 1285 01:02:11,670 --> 01:02:15,390 И тогава синтаксиса казва, какво в сметки сме актуализиране? 1286 01:02:15,390 --> 01:02:19,520 Е, ние сме настройка на баланса равен на текущата стойност на баланса минус 20. 1287 01:02:19,520 --> 01:02:22,860 Така че това ще актуализира всички редове на сметките, изваждане 1288 01:02:22,860 --> 01:02:26,250 Двадесет милиона щатски долара от баланса. 1289 01:02:26,250 --> 01:02:29,260 >> DAVID J. Malan: Често срещана грешка тук, въпреки че понякога го простил, 1290 01:02:29,260 --> 01:02:32,990 беше да се действително да има PHP код тук извикване на функцията заявка или пускането 1291 01:02:32,990 --> 01:02:35,460 кавички около всичко, което не трябва да бъде там. 1292 01:02:35,460 --> 01:02:39,780 >> ROB BOWDEN: Не забравяйте, че MySQL е отделен език от PHP. 1293 01:02:39,780 --> 01:02:42,410 Ние се случи да се пише MySQL в PHP. 1294 01:02:42,410 --> 01:02:46,180 И PHP след това да го изпратите над към MySQL сървъра. 1295 01:02:46,180 --> 01:02:51,120 Но не е нужно PHP, за да се комуникират с MySQL сървър. 1296 01:02:51,120 --> 01:02:51,730 >> DAVID J. Malan: Точно така. 1297 01:02:51,730 --> 01:02:54,240 Така че без променливи с доларови знаци трябва да бъде в този контекст. 1298 01:02:54,240 --> 01:02:59,550 Той може просто да направите всичко по математика в самата база данни. 1299 01:02:59,550 --> 01:03:00,080 >> ROB BOWDEN: OK. 1300 01:03:00,080 --> 01:03:01,300 Така че следващия един. 1301 01:03:01,300 --> 01:03:02,731 Това ли е следващата? 1302 01:03:02,731 --> 01:03:03,210 Да. 1303 01:03:03,210 --> 01:03:06,570 Така че с това, което SQL заявка може банката изтегли номерата на сметките на неговата 1304 01:03:06,570 --> 01:03:09,300 най-богатите клиенти, тези, с баланси по-големи от 1000? 1305 01:03:09,300 --> 01:03:13,280 Така коя от четирите основни вида отиваме да искам тук? 1306 01:03:13,280 --> 01:03:14,430 Изберете. 1307 01:03:14,430 --> 01:03:16,650 Така че ние искаме да изберете. 1308 01:03:16,650 --> 01:03:17,610 Какво искаме да изберете? 1309 01:03:17,610 --> 01:03:19,380 Какво колона искаме да изберете? 1310 01:03:19,380 --> 01:03:20,970 Ние специално ще искате , за да изберете номер. 1311 01:03:20,970 --> 01:03:23,910 Но ако ти каза, звезда, ние Също така се приема, че. 1312 01:03:23,910 --> 01:03:25,820 >> Така че изберете номер от какво маса? 1313 01:03:25,820 --> 01:03:26,640 Accounts. 1314 01:03:26,640 --> 01:03:28,370 И след това състоянието, което искаме? 1315 01:03:28,370 --> 01:03:30,140 Когато баланс по-голямо от 1000. 1316 01:03:30,140 --> 01:03:31,720 Ние също приема по-голяма от или равен. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Последно едно. 1319 01:03:36,190 --> 01:03:42,940 С какво SQL заявка може банката близо, т.е., да изтриете всеки има предвид, че 1320 01:03:42,940 --> 01:03:44,480 има баланс от $ 0? 1321 01:03:44,480 --> 01:03:47,620 Така че кой от четиримата сме ще искате да използвате? 1322 01:03:47,620 --> 01:03:48,320 Изтрий. 1323 01:03:48,320 --> 01:03:50,180 Така че синтаксиса за това? 1324 01:03:50,180 --> 01:03:51,890 Изтрий от какво маса? 1325 01:03:51,890 --> 01:03:53,550 Accounts. 1326 01:03:53,550 --> 01:03:55,790 И тогава условието на която ние искаме да изтриете - 1327 01:03:55,790 --> 01:03:57,280 където баланс се равнява на нула. 1328 01:03:57,280 --> 01:04:03,050 Така изтриете всички редове от сметки когато балансът е нула. 1329 01:04:03,050 --> 01:04:04,300 Въпросите за всеки от тях? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 Искате ли да се редят на опашки? 1332 01:04:10,260 --> 01:04:11,200 >> DAVID J. Malan: Queue ръководство. 1333 01:04:11,200 --> 01:04:17,110 Така че в този един, ние ви даде малко по- запознати структура, която ние проучени 1334 01:04:17,110 --> 01:04:20,450 малко в клас заедно на structs, което е данни 1335 01:04:20,450 --> 01:04:21,910 свързани с дух структура. 1336 01:04:21,910 --> 01:04:24,670 Разликата макар и с опашка е че ние трябваше по някакъв начин да си спомня кой 1337 01:04:24,670 --> 01:04:27,900 беше най-отпред на опашката, в голяма част, така че бихме могли да направим повече 1338 01:04:27,900 --> 01:04:30,530 ефективно използване на паметта, най-малко ако сме използвали масив. 1339 01:04:30,530 --> 01:04:35,460 >> Защото изземване, ако имаме масив, ако, Например, това е най-предната част на 1340 01:04:35,460 --> 01:04:38,470 на опашката, ако вляза в опашката тук, и след това някой получава в съответствие 1341 01:04:38,470 --> 01:04:42,710 зад мен, зад мен, зад мен, и един човек стъпки от линия, 1342 01:04:42,710 --> 01:04:45,930 може, както видяхме някои от нашата човешка доброволци в клас, имат всички 1343 01:04:45,930 --> 01:04:47,100 смени по този начин. 1344 01:04:47,100 --> 01:04:50,880 Но като цяло, като всеки направи нещо, което не е най-доброто използване на времето 1345 01:04:50,880 --> 01:04:54,600 в една програма, защото това означава, че вашият алгоритъмът е в ход в какво 1346 01:04:54,600 --> 01:04:56,520 асимптотичната време на работа? 1347 01:04:56,520 --> 01:04:57,420 Това е линейна. 1348 01:04:57,420 --> 01:04:59,600 >> И аз се чувствам като това е много глупаво. 1349 01:04:59,600 --> 01:05:02,890 Ако следващото лице в съответствие е следващата лице, което е трябвало да отидат в 1350 01:05:02,890 --> 01:05:04,660 магазин, те не всички имат да се движат заедно. 1351 01:05:04,660 --> 01:05:08,200 Просто нека този човек се откъсна когато му дойде времето, например. 1352 01:05:08,200 --> 01:05:09,870 Така че ние може да спести малко време там. 1353 01:05:09,870 --> 01:05:14,840 И така, да се направи това обаче, че средства че главата на опашката или на 1354 01:05:14,840 --> 01:05:18,060 отпред на опашката, ще се постепенно се движат по-дълбоко и по-дълбоко 1355 01:05:18,060 --> 01:05:23,340 в масива и в крайна сметка може всъщност обгърне ако ние сме с помощта на 1356 01:05:23,340 --> 01:05:25,790 масив за съхранение на народа в тази опашка. 1357 01:05:25,790 --> 01:05:28,390 Така че почти може да се мисли за масив като кръгъл данни 1358 01:05:28,390 --> 01:05:29,880 структура в този смисъл. 1359 01:05:29,880 --> 01:05:33,970 >> Така че по някакъв начин трябва да се следи за размер на нея, или наистина в края на това 1360 01:05:33,970 --> 01:05:36,250 и след това, когато началото на това е. 1361 01:05:36,250 --> 01:05:39,490 Така че ние предлагаме, че вие ​​декларирате една такава опашка, призвание 1362 01:05:39,490 --> 01:05:41,330 той Q, просто една буква. 1363 01:05:41,330 --> 01:05:44,570 След това ние предлагаме, че отпред е инициализира с нула и че размерът 1364 01:05:44,570 --> 01:05:45,470 да се инициализира с нула. 1365 01:05:45,470 --> 01:05:47,770 >> Така че точно сега, няма нищо във вътрешността на тази опашка. 1366 01:05:47,770 --> 01:05:50,910 И ние ви молим да попълните изпълнение на Enqueue долу в 1367 01:05:50,910 --> 01:05:55,250 такъв начин, че функцията добавя п да края на Q и след това се връща истина. 1368 01:05:55,250 --> 01:05:58,690 Но ако р е пълен или отрицателно, функция трябва вместо връщане фалшиви. 1369 01:05:58,690 --> 01:06:01,060 И ви дадохме няколко на предположения. 1370 01:06:01,060 --> 01:06:04,320 Но те не са наистина функционално уместно, съществува само, че булев, 1371 01:06:04,320 --> 01:06:06,690 защото, технически, булев не съществува в C, освен ако не се включи 1372 01:06:06,690 --> 01:06:07,310 определен файл заглавието. 1373 01:06:07,310 --> 01:06:09,350 Така че просто се уверете, че има бяха не е този трик 1374 01:06:09,350 --> 01:06:10,940 въпрос вид на нещо. 1375 01:06:10,940 --> 01:06:16,280 >> Така Enqueue, ние предложихме в извадката решения за изпълнение, както следва. 1376 01:06:16,280 --> 01:06:20,420 One, ние първо проверете лекотата, на ниско висящите плодове. 1377 01:06:20,420 --> 01:06:23,820 Ако опашката е пълна или номера, който Вие се опитвате да вмъкнете е по-малко 1378 01:06:23,820 --> 01:06:26,380 от нула, което се казва в спецификация на проблема трябва 1379 01:06:26,380 --> 01:06:30,320 не се допуска, защото ние само искаме неотрицателни стойности, тогава трябва да се 1380 01:06:30,320 --> 01:06:31,640 просто връщане фалшиви веднага. 1381 01:06:31,640 --> 01:06:33,820 Така че някои сравнително лесно проверка за грешки. 1382 01:06:33,820 --> 01:06:38,720 Ако все пак искате да се добави, че действителната число, което трябваше да направя малко на 1383 01:06:38,720 --> 01:06:39,440 мислене тук. 1384 01:06:39,440 --> 01:06:41,330 И това е мястото, където това е малко досадно психически, защото трябва да се 1385 01:06:41,330 --> 01:06:43,000 разбера как да се справят с обгръщащ. 1386 01:06:43,000 --> 01:06:46,870 >> Но зародишът на идеята тук е, че на интерес за нас е, че обгръщащ 1387 01:06:46,870 --> 01:06:51,480 често предполага модулна аритметика и Министерството на отбраната оператора, процента страна, 1388 01:06:51,480 --> 01:06:55,140 , където можете да отидете от една по-голяма стойност обратно до нула и след това едно и две и 1389 01:06:55,140 --> 01:06:58,650 три и след това обратно около до нула, една и две и три и т.н. 1390 01:06:58,650 --> 01:06:59,380 отново и отново. 1391 01:06:59,380 --> 01:07:02,880 Така че начина, по който ние предлагаме да се направи това е , че ние искаме да се индексират в 1392 01:07:02,880 --> 01:07:05,850 масив наречен на номерата, когато нашите цели числа лъжат. 1393 01:07:05,850 --> 01:07:10,740 Но за да стигнем до там, ние първо искам да направя независимо от размера на опашката е но 1394 01:07:10,740 --> 01:07:14,080 след това се прибавят, че каквото и предната част на списъка е. 1395 01:07:14,080 --> 01:07:17,880 И резултатът от това е да ни постави в правилната позиция на опашката и 1396 01:07:17,880 --> 01:07:20,970 Не си мислете, че първият човек, в съответствие е в началото, което той или 1397 01:07:20,970 --> 01:07:24,130 тя може да бъде абсолютно, ако ние също бяха измества всички. 1398 01:07:24,130 --> 01:07:26,710 Но ние просто създаване на работа за себе си, ако ние взехме 1399 01:07:26,710 --> 01:07:27,800 че определена траектория. 1400 01:07:27,800 --> 01:07:29,330 >> Така че ние можем да го запази относително проста. 1401 01:07:29,330 --> 01:07:32,180 Ние трябва да помним, че ние просто прибавя Int към опашката. 1402 01:07:32,180 --> 01:07:35,850 И тогава ние просто връщане вярно. 1403 01:07:35,850 --> 01:07:38,560 Междувременно, в dequeue, попитахме можете да направите следното. 1404 01:07:38,560 --> 01:07:42,260 Го приложи по такъв начин, че тя dequeues, че е премахва и се връща, 1405 01:07:42,260 --> 01:07:44,190 на INT в предната част на опашката. 1406 01:07:44,190 --> 01:07:46,410 За да премахнете ПНА, е достатъчно да го забравя. 1407 01:07:46,410 --> 01:07:47,650 Не е необходимо да подменяте нейното малко. 1408 01:07:47,650 --> 01:07:48,820 Така че тя все още е в действителност там. 1409 01:07:48,820 --> 01:07:51,930 Точно като на данни на твърдия диск, ние просто се игнорира факта, 1410 01:07:51,930 --> 01:07:52,970 че това е вече там. 1411 01:07:52,970 --> 01:07:55,520 И ако р е празен, ние трябва да вместо да се върне отрицателен 1. 1412 01:07:55,520 --> 01:07:56,750 Така че това се чувства произволно. 1413 01:07:56,750 --> 01:08:01,640 Защо се върне отрицателен 1 вместо фалшива? 1414 01:08:01,640 --> 01:08:02,620 Да. 1415 01:08:02,620 --> 01:08:05,070 >> ПУБЛИКАТА: Q е съхраняване положителни стойности. 1416 01:08:05,070 --> 01:08:10,950 Тъй като вие се съхранява само положителни стойности в Q, отрицателен е грешка. 1417 01:08:10,950 --> 01:08:11,510 >> DAVID J. Malan: Добре, вярно. 1418 01:08:11,510 --> 01:08:14,850 Така че, тъй като ние сме само съхраняване на положителна стойности или нула, а след това е добре да се 1419 01:08:14,850 --> 01:08:18,050 върне отрицателна стойност като часовой стойност, специален символ. 1420 01:08:18,050 --> 01:08:21,630 Но ти пренаписване на историята там, поради причината, че сме само 1421 01:08:21,630 --> 01:08:25,890 връщане на не-отрицателни стойности е така, защото ние искаме да 1422 01:08:25,890 --> 01:08:27,670 имат стойност Sentinel. 1423 01:08:27,670 --> 01:08:32,617 Така че, по-конкретно, защо просто не връщане фалшиви в случаи на грешки? 1424 01:08:32,617 --> 01:08:33,099 Да. 1425 01:08:33,099 --> 01:08:35,510 >> Публика: Ти се провали да връща цяло число. 1426 01:08:35,510 --> 01:08:36,630 >> DAVID J. Malan: Точно така. 1427 01:08:36,630 --> 01:08:38,569 И това е мястото, където C получава доста ограничаващо. 1428 01:08:38,569 --> 01:08:40,590 Ако искаш да кажеш, че отиваш за да се върнете едно цяло число, имаш 1429 01:08:40,590 --> 01:08:41,279 за да се върнете на вътр. 1430 01:08:41,279 --> 01:08:43,689 Вие не можете да получите фантазия и да започне връщане един булев или с плаваща запетая или 1431 01:08:43,689 --> 01:08:45,040 канап или нещо подобно. 1432 01:08:45,040 --> 01:08:49,370 Сега, междувременно, JavaScript и PHP и някои други езици, може, в действителност, 1433 01:08:49,370 --> 01:08:51,310 са ви връщат различен видове ценности. 1434 01:08:51,310 --> 01:08:54,819 И действително, че може да бъде полезно, когато бихте могли да се върнете положителни цели числа, нули, 1435 01:08:54,819 --> 01:08:59,439 отрицателни цели числа, или невярна или нула дори и да означава грешка. 1436 01:08:59,439 --> 01:09:01,890 Но ние не разполагат с тази гъвкавост в C. 1437 01:09:01,890 --> 01:09:04,569 >> Така че с dequeue, това, което ние предлагам да направите, е - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB BOWDEN: Можете да се върнете фалшива. 1440 01:09:09,830 --> 01:09:13,189 Това е просто, че е фалшива хеш дефинира фалшива до нула. 1441 01:09:13,189 --> 01:09:16,000 Така че, ако се върне фалшиви, сте връщане нула. 1442 01:09:16,000 --> 01:09:25,470 А нулата е нещо валидно в нашата опашка, докато негативният един не е, ако 1443 01:09:25,470 --> 01:09:27,000 невярно случи да бъде отрицателен 1. 1444 01:09:27,000 --> 01:09:29,972 Но вие дори не трябва да Трябва да знаете, че. 1445 01:09:29,972 --> 01:09:32,399 >> DAVID J. Malan: Това е Затова не исках да го кажа. 1446 01:09:32,399 --> 01:09:36,450 >> ROB BOWDEN: Но това не е вярно че не може да се върне фалшиви. 1447 01:09:36,450 --> 01:09:37,700 >> DAVID J. Malan: Разбира се. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 Така dequeue, забележете, ние приемаме анулира като аргумент му. 1450 01:09:44,240 --> 01:09:45,479 И това е така, защото ние не сме минаваща нищо инча 1451 01:09:45,479 --> 01:09:48,359 Ние просто искаме да се премахне елементът в предната част на опашката. 1452 01:09:48,359 --> 01:09:49,819 И така, как бихме могли да го направим? 1453 01:09:49,819 --> 01:09:51,290 Ами, на първо място, нека да направим това бърза проверка здрав разум. 1454 01:09:51,290 --> 01:09:53,350 Ако размерът на опашката е 0, има никаква работа да се свърши. 1455 01:09:53,350 --> 01:09:54,210 Връщане отрицателен 1. 1456 01:09:54,210 --> 01:09:54,800 Готово. 1457 01:09:54,800 --> 01:09:56,340 Така че това е на няколко линии на моята програма. 1458 01:09:56,340 --> 01:09:58,180 Така само четири линии остават. 1459 01:09:58,180 --> 01:10:01,310 >> Така че тук аз решавам да декрементира на размера. 1460 01:10:01,310 --> 01:10:04,620 И ефективно намаляващи размера означава, че аз съм се забравя 1461 01:10:04,620 --> 01:10:06,010 нещо е там. 1462 01:10:06,010 --> 01:10:09,910 Но също така трябва да се актуализира, когато е предната част на цифрите са. 1463 01:10:09,910 --> 01:10:11,620 Така че, за да направи това, имам нужда да направите две неща. 1464 01:10:11,620 --> 01:10:16,390 Аз първо трябва да се помни това, което броят е в предната част на опашката, 1465 01:10:16,390 --> 01:10:17,860 защото имам нужда да се върне това нещо. 1466 01:10:17,860 --> 01:10:20,910 Така че аз не искам да случайно забравите за него и след това да го замените. 1467 01:10:20,910 --> 01:10:22,840 Отивам да си спомня в едно цяло число. 1468 01:10:22,840 --> 01:10:27,310 >> И сега, аз искам да се актуализира q.front да бъде q.front +1. 1469 01:10:27,310 --> 01:10:30,070 Така че, ако това е първият човек в линия, сега, аз искам да направя плюс 1 до 1470 01:10:30,070 --> 01:10:31,930 точка в следващия човек в линия. 1471 01:10:31,930 --> 01:10:33,420 Но аз трябва да се справиш с това обгръщащ. 1472 01:10:33,420 --> 01:10:37,270 И ако капацитетът е глобална константа, че няма да ми позволи да се уверите, 1473 01:10:37,270 --> 01:10:41,140 като I точка до последния човек в линия, операцията по модул ще донесе 1474 01:10:41,140 --> 01:10:43,840 ме върна почти до нула в предната част на опашката. 1475 01:10:43,840 --> 01:10:46,050 И който обработва Маншетът тук. 1476 01:10:46,050 --> 01:10:48,950 И след това да продължа да се върнат п. 1477 01:10:48,950 --> 01:10:51,530 >> Сега, строго погледнато, не съм трябва да декларират п. 1478 01:10:51,530 --> 01:10:53,880 Аз не трябва да го вземете и да го съхранява временно, тъй като стойността е 1479 01:10:53,880 --> 01:10:54,740 все още там. 1480 01:10:54,740 --> 01:10:57,490 Така че аз може просто да направи правилното аритметиката да върне бившия шеф 1481 01:10:57,490 --> 01:10:58,450 на опашката. 1482 01:10:58,450 --> 01:11:01,850 Но аз просто чувствах, че това е по-ясно действително да вземете ПНА, да я тури 1483 01:11:01,850 --> 01:11:04,320 в N, и след това се връща, че заради яснота, но 1484 01:11:04,320 --> 01:11:05,735 не е строго необходимо. 1485 01:11:05,735 --> 01:11:09,313 1486 01:11:09,313 --> 01:11:12,130 Psst. 1487 01:11:12,130 --> 01:11:13,410 Те всички са произносимо в главата ми. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB BOWDEN: Така че първото въпрос е двоичен проблема с дърво. 1490 01:11:19,110 --> 01:11:22,140 Така че първият въпрос е, че сме при тези числа. 1491 01:11:22,140 --> 01:11:27,160 И ние искаме по някакъв начин да ги вмъкнете в тези възли, така че това е 1492 01:11:27,160 --> 01:11:30,110 валидно двоично търсене дърво. 1493 01:11:30,110 --> 01:11:36,260 Така че единственото нещо, което трябва да запомните за двоични дървета за търсене е, че това не е 1494 01:11:36,260 --> 01:11:39,800 само че нещо в ляво е по-малко, а нещо, което да 1495 01:11:39,800 --> 01:11:41,120 правото е по-голяма. 1496 01:11:41,120 --> 01:11:44,580 Тя трябва да бъде, че цялото дърво да ляво е по-малко, и цялото дърво 1497 01:11:44,580 --> 01:11:45,740 надясно е по-голяма. 1498 01:11:45,740 --> 01:11:55,260 >> Така че ако сложа 34 тук в горната част, а след това Сложих 20 тук, така че това е валидно, така 1499 01:11:55,260 --> 01:11:56,970 досега, защото 34 до тук. 1500 01:11:56,970 --> 01:11:57,920 20 ще ляво. 1501 01:11:57,920 --> 01:11:58,950 Така че това е по-малко. 1502 01:11:58,950 --> 01:12:03,640 Но аз не мога след това пуснати 59 тук, защото въпреки че 59 е от дясната страна на 20, 1503 01:12:03,640 --> 01:12:06,140 тя все още е в ляво на 34. 1504 01:12:06,140 --> 01:12:10,760 Така че с това ограничение предвид, Най-лесният начин за решаване на този вероятно 1505 01:12:10,760 --> 01:12:14,330 проблем е просто да подреди на тези номера - 1506 01:12:14,330 --> 01:12:18,720 така 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 И след това поставете тези от ляво на дясно. 1508 01:12:21,640 --> 01:12:23,390 >> Така 20 се поставя тук. 1509 01:12:23,390 --> 01:12:24,630 34 се поставя тук. 1510 01:12:24,630 --> 01:12:25,830 36 се поставя тук. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 И ти също би могъл да измисли с някои включване и реализиране, 1513 01:12:34,730 --> 01:12:38,830 О, чакай, аз не разполагат с достатъчно номера да се запълни тази в тук. 1514 01:12:38,830 --> 01:12:42,170 Така че аз трябва да reshift какво ми маршрут бележка ще бъде. 1515 01:12:42,170 --> 01:12:47,490 Забележете, че в последните три, ако ти чете от ляво на дясно, тя е в 1516 01:12:47,490 --> 01:12:48,740 възходящ ред. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> Така че сега, ние искаме да обяви каква е структурата ще бъде за 1519 01:12:56,540 --> 01:12:58,300 възли в това дърво. 1520 01:12:58,300 --> 01:13:02,720 Така че това, което ни е нужно в двоичен дърво? 1521 01:13:02,720 --> 01:13:05,830 Така че ние имаме една стойност от тип ПНА, така че някои вътр стойност. 1522 01:13:05,830 --> 01:13:07,220 Аз не знам това, което се нарича това в разтвора - 1523 01:13:07,220 --> 01:13:08,500 INT п. 1524 01:13:08,500 --> 01:13:13,570 Имаме нужда от показалеца на лявата детето и показалеца на дясната детето. 1525 01:13:13,570 --> 01:13:17,540 Така тя ще изглежда по този начин. 1526 01:13:17,540 --> 01:13:20,510 И това всъщност ще изглежда, преди когато съм на двойно-свързан 1527 01:13:20,510 --> 01:13:25,090 Списък с неща, така известие - 1528 01:13:25,090 --> 01:13:27,860 Ще трябва да преминете през цялото обратния път надолу до проблем 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> Така че забележите изглежда идентичен с този, освен ние просто се случи да се обадя тези 1531 01:13:36,390 --> 01:13:38,590 различни имена. 1532 01:13:38,590 --> 01:13:41,440 Ние все още имаме цяло число стойност и две насоки. 1533 01:13:41,440 --> 01:13:44,850 Това е просто, че вместо за лечение на указатели като сочеше към следващото нещо 1534 01:13:44,850 --> 01:13:47,955 и предишния нещо, ние сме лечение стрелките, за да сочат към лявата дете 1535 01:13:47,955 --> 01:13:49,205 и дясно дете. 1536 01:13:49,205 --> 01:13:57,372 1537 01:13:57,372 --> 01:13:57,860 OK. 1538 01:13:57,860 --> 01:13:59,650 Така че това е нашата структура възел. 1539 01:13:59,650 --> 01:14:03,920 И сега, единствената функция трябва да приведе в действие за това е траверс, който 1540 01:14:03,920 --> 01:14:08,320 ние искаме да отидем на дърво, отпечатването ценностите на дървото в ред. 1541 01:14:08,320 --> 01:14:15,241 >> Така че търсите тук, ние ще искате да отпечатате от 20, 34, 36, 52, 59 и 106. 1542 01:14:15,241 --> 01:14:17,970 Как можем да постигнем това? 1543 01:14:17,970 --> 01:14:18,890 Така че това е доста сходен. 1544 01:14:18,890 --> 01:14:22,910 Ако сте видели през последната изпита проблема че искате да отпечатате 1545 01:14:22,910 --> 01:14:25,940 цялото дърво със запетаи между всичко, това беше всъщност дори 1546 01:14:25,940 --> 01:14:27,320 лесно от това. 1547 01:14:27,320 --> 01:14:30,950 Така че тук е решението. 1548 01:14:30,950 --> 01:14:33,110 Това е значително по-лесно ако ти го направи рекурсивно. 1549 01:14:33,110 --> 01:14:36,650 Аз не знам дали някой се опитва да го направя итеративно. 1550 01:14:36,650 --> 01:14:38,340 >> Но първо, ние имаме нашата база случай. 1551 01:14:38,340 --> 01:14:39,660 Какво става, ако коренът е нула? 1552 01:14:39,660 --> 01:14:40,610 Тогава ние просто ще се върне. 1553 01:14:40,610 --> 01:14:42,300 Ние не искаме да отпечатате нещо. 1554 01:14:42,300 --> 01:14:45,940 Иначе отиваме да прекосяват рекурсивно надолу. 1555 01:14:45,940 --> 01:14:48,140 Печат на цялата лява поддърво. 1556 01:14:48,140 --> 01:14:51,440 Така отпечатате всичко по-малко от сегашната си стойност. 1557 01:14:51,440 --> 01:14:53,930 И тогава аз отивам да си отпечатате. 1558 01:14:53,930 --> 01:14:57,310 И тогава аз ще самоизвиква надолу ми Цялата полето поддърво, така че всичко 1559 01:14:57,310 --> 01:14:58,810 по-голяма от моята стойност. 1560 01:14:58,810 --> 01:15:03,870 И това се случва, за да отпечатате всичко в ред. 1561 01:15:03,870 --> 01:15:05,860 Въпроси за това как това всъщност постига това? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> ПУБЛИКАТА: Аз имам един въпрос на [недоловим]. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB BOWDEN: Така че един от начините за приближаване всяко рекурсивно проблем е просто да мисля 1566 01:15:23,550 --> 01:15:26,275 за Харесва ли ви се налага да мислите за всички случаи ъгъла. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Така че считам, че ние искаме да отпечатате цялото това дърво. 1569 01:15:38,110 --> 01:15:42,030 Така че всички ние ще се съсредоточи върху е този конкретен възел - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 Рекурсивните разговори, ние се преструват тези, които просто работят. 1572 01:15:47,420 --> 01:15:54,000 Така че тук, това рекурсивно повикване, за да траверса, ние без дори да мисля 1573 01:15:54,000 --> 01:15:58,640 за това, просто преминаващи отляво три, представете си, че вече отпечатва 20 1574 01:15:58,640 --> 01:16:00,730 и 34 за нас. 1575 01:16:00,730 --> 01:16:03,350 И тогава, когато ние в крайна сметка рекурсивно наричаме преминаване по 1576 01:16:03,350 --> 01:16:07,890 Добре, че правилно ще отпечата 52, 59, и 106 за нас. 1577 01:16:07,890 --> 01:16:13,620 >> Така че, имайки предвид, че това може да печата 20, 34, и другият може да печата 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 всичко, което трябва да бъде в състояние да направите, е печат бъдем себе си в средата на това. 1579 01:16:17,180 --> 01:16:21,250 Така отпечатате всичко пред нас. 1580 01:16:21,250 --> 01:16:27,710 Печат бъдем себе си, така че текущата възел печат 36, редовен ФОРМАТ, а след това 1581 01:16:27,710 --> 01:16:31,170 отпечатате всичко след нас. 1582 01:16:31,170 --> 01:16:32,730 >> DAVID J. Malan: Това е мястото, където рекурсия става наистина красива. 1583 01:16:32,730 --> 01:16:36,270 Това е този невероятен скок на вярата, където , което правите най-малката малко работа. 1584 01:16:36,270 --> 01:16:38,460 И тогава нека някой друг да свърши останалото. 1585 01:16:38,460 --> 01:16:40,180 И че някой друг е, по ирония на съдбата, ти. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 Така че за сериозни сладки точки, ако превъртите нагоре по въпросите - 1588 01:16:48,360 --> 01:16:50,530 >> ROB BOWDEN: На въпросите? 1589 01:16:50,530 --> 01:16:53,490 >> DAVID J. Malan: И малко по-надолу, за да цифрите, Някой знае ли къде 1590 01:16:53,490 --> 01:16:55,190 тези числа идват от? 1591 01:16:55,190 --> 01:16:56,610 >> ROB BOWDEN: Имам буквално никаква представа. 1592 01:16:56,610 --> 01:16:59,794 >> DAVID J. Malan: Те се появяват цялата викторина. 1593 01:16:59,794 --> 01:17:01,150 >> ПУБЛИКАТА: същите номера са те? 1594 01:17:01,150 --> 01:17:01,910 >> DAVID J. Malan: Тези числа. 1595 01:17:01,910 --> 01:17:03,260 Малко великденско яйце. 1596 01:17:03,260 --> 01:17:08,100 Така че за тези от вас, гледане онлайн на у дома, ако можете да ни кажете по електронната поща на 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net какво значимостта на тези повтарящи се шест числа са 1598 01:17:12,680 --> 01:17:18,560 цялата Quiz 1, ние ще ви потопи с невероятно внимание към финала 1599 01:17:18,560 --> 01:17:21,610 лекция и стрес топка. 1600 01:17:21,610 --> 01:17:25,460 1601 01:17:25,460 --> 01:17:27,790 Nice, коварен. 1602 01:17:27,790 --> 01:17:29,570 >> ROB Боудън: Някакви последни въпроси за нищо на теста? 1603 01:17:29,570 --> 01:17:32,608