1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID мала: Добре, з поверненням. 3 00:00:12,580 --> 00:00:13,290 Це CS50. 4 00:00:13,290 --> 00:00:15,130 Це початок тижня сім. 5 00:00:15,130 --> 00:00:18,890 Так що це було деякий час, так що я думав, що ми прийняти побіжний тур, де ми 6 00:00:18,890 --> 00:00:20,760 зупинилися і де ми тепер збираємося. 7 00:00:20,760 --> 00:00:23,310 >> Так що ця річ тут, можливо, доведеться викликало деяку тугу на перший погляд. 8 00:00:23,310 --> 00:00:27,680 Але, сподіваюся, ви починаєте акліматизуватися до того, що це позначає тут - 9 00:00:27,680 --> 00:00:32,670 зірка представляє покажчик, який тільки те, що, з точки зору більш непрофесіонала? 10 00:00:32,670 --> 00:00:33,400 Так що це адресу. 11 00:00:33,400 --> 00:00:35,490 >> Так що це адреса щось в пам'яті. 12 00:00:35,490 --> 00:00:38,260 І ми почали відігніть верств Пару тижнів тому, тощо 13 00:00:38,260 --> 00:00:41,800 GetString та інших подібних функцій Весь цей час поверталися 14 00:00:41,800 --> 00:00:46,010 Адреси речі в пам'яті, як і адресу першого символу в 15 00:00:46,010 --> 00:00:46,990 деякої послідовності. 16 00:00:46,990 --> 00:00:50,360 >> Таким чином, ми також ввели Valgrind, яка Ви почнете використовувати для цієї проблеми 17 00:00:50,360 --> 00:00:53,380 встановлена, зокрема, для наступного Проблема також встановлений. 18 00:00:53,380 --> 00:00:54,980 І Valgrind і що робить для нас? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 При цьому перевірка на витоки пам'яті, і це також перевіряє зловживання пам'яті. 21 00:01:01,020 --> 00:01:05,890 >> Він може, з деякою вірогідністю, виявити, якщо код стосуватиметься пам'яті 22 00:01:05,890 --> 00:01:07,100 що це просто не потрібно. 23 00:01:07,100 --> 00:01:10,410 Так що не обов'язково витоку, але якщо ви виходять за межі деякого 24 00:01:10,410 --> 00:01:14,730 масиві, а як ви виконаєте VALGRIND і викликають таку поведінку в той час як 25 00:01:14,730 --> 00:01:17,870 Valgrind працює у вашій програмі працює всередині нього, ви отримаєте 26 00:01:17,870 --> 00:01:21,460 повідомлення, як це - "Невірна писати про розміром 4 ", який, нагадаємо пару 27 00:01:21,460 --> 00:01:25,880 тижнів тому означало, що я випадково як на одного десяткового занадто далеко 28 00:01:25,880 --> 00:01:27,250 за межами масиву. 29 00:01:27,250 --> 00:01:30,790 І таким розміром 4 означає тут розмір цього конкретного внутр. 30 00:01:30,790 --> 00:01:35,260 >> Так прийміть запевнення в тому, що valgrind є вихід, формат його, 31 00:01:35,260 --> 00:01:36,170 просто звірячим. 32 00:01:36,170 --> 00:01:40,180 Це дійсно важко зрозуміти, через безлад за цікаву інформацію. 33 00:01:40,180 --> 00:01:42,910 Отже, що ми зробили тут просто уривок деякі з пари більш 34 00:01:42,910 --> 00:01:43,850 цікаві рядки. 35 00:01:43,850 --> 00:01:46,760 Але розумію, що 80% valgrind є Вихід буде трохи 36 00:01:46,760 --> 00:01:47,650 відволікання. 37 00:01:47,650 --> 00:01:52,820 >> Просто шукайте моделі, як ці - недійсним права, недійсні читати, 40 байт 38 00:01:52,820 --> 00:01:56,690 і деяка кількість блоків виразно втрачено, ключові слова, як, що. 39 00:01:56,690 --> 00:02:01,920 І те, що ви, ми сподіваємося побачити деякий виду слідів, які функції 40 00:02:01,920 --> 00:02:03,340 помилка насправді дюйма 41 00:02:03,340 --> 00:02:07,195 У цьому випадку тут, в тому, що лінія мій код помилки мабуть? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 у файлі з іменем memory.c, який був Наприклад, ми грали з 44 00:02:14,130 --> 00:02:14,890 в той час. 45 00:02:14,890 --> 00:02:16,460 Так що це, ймовірно, не в Malloc. 46 00:02:16,460 --> 00:02:18,630 Це було, мабуть, в своєму коді замість цього. 47 00:02:18,630 --> 00:02:20,910 Таким чином, ми побачимо це знову і знову найближчим часом. 48 00:02:20,910 --> 00:02:24,080 >> Так SCANF, це сталося в Пару форми досі. 49 00:02:24,080 --> 00:02:26,410 Ми бачили Sscanf коротко. 50 00:02:26,410 --> 00:02:28,330 Це було щось поруч Ви пірнули у вашій 51 00:02:28,330 --> 00:02:29,535 підготовка до вікторини. 52 00:02:29,535 --> 00:02:33,130 І SCANF насправді те, що CS50 Бібліотеки використовують під 53 00:02:33,130 --> 00:02:36,560 капот протягом досить довгого часу для того, для отримання даних від користувача. 54 00:02:36,560 --> 00:02:40,420 >> Наприклад, якщо я переїду до CS50 Прилад тут, дозвольте мені відкрити 55 00:02:40,420 --> 00:02:45,315 Наприклад сьогодні, що називається SCANF-0.c І це супер просто. 56 00:02:45,315 --> 00:02:46,590 Це всього лише кілька рядків коду. 57 00:02:46,590 --> 00:02:50,880 Але це показує, дійсно, як GetInt працював весь цей час. 58 00:02:50,880 --> 00:02:54,710 >> У цій програмі, у рядку 16 Зверніть увагу, що я заявляю Int. 59 00:02:54,710 --> 00:02:57,270 Так що ніяких покажчиків, нічого магічного там, просто Int. 60 00:02:57,270 --> 00:03:00,330 Потім у рядку 17, я запропонує користувача число, будь ласка. 61 00:03:00,330 --> 00:03:02,930 Потім, в кінці 18, я використовую SCANF тут. 62 00:03:02,930 --> 00:03:06,910 І я вказав, ніби як Е, що я очікую цитуючи 63 00:03:06,910 --> 00:03:08,110 кінець цитати відсотків я. 64 00:03:08,110 --> 00:03:10,920 >> Так відсотків я, звичайно, позначає Int. 65 00:03:10,920 --> 00:03:14,580 Але зверніть увагу на те, що другий Аргумент SCANF є. 66 00:03:14,580 --> 00:03:17,350 Як би ви описали другий Аргумент після коми? 67 00:03:17,350 --> 00:03:19,450 Що це? 68 00:03:19,450 --> 00:03:20,670 >> Це адреса х. 69 00:03:20,670 --> 00:03:25,490 Так що це корисно, тому що, надаючи SCANF з адресою х, те, що робить 70 00:03:25,490 --> 00:03:29,560 , Які дозволяють цій функції робити? 71 00:03:29,560 --> 00:03:33,010 Не просто йдуть туди, але і робити те, що? 72 00:03:33,010 --> 00:03:34,060 >> Внести зміни в ньому. 73 00:03:34,060 --> 00:03:38,080 Тому що ви можете піти туди, це свого роду як карта до місця розташування в пам'яті. 74 00:03:38,080 --> 00:03:41,900 І до тих пір, поки ви надаєте SCANF або будь-яку функцію з такої карти, які 75 00:03:41,900 --> 00:03:45,840 Функція може піти туди, і не тільки подивіться значення, але він також може 76 00:03:45,840 --> 00:03:49,670 змінити це значення, яке є корисним, якщо Мета в житті є SCANF 77 00:03:49,670 --> 00:03:53,060 сканувати вхідні дані від користувача, зокрема з клавіатури. 78 00:03:53,060 --> 00:03:57,830 І F позначає відформатованих, так само, як Е, F позначає відформатованих 79 00:03:57,830 --> 00:03:58,930 Рядок, яку необхідно роздрукувати. 80 00:03:58,930 --> 00:04:04,430 >> Коротше кажучи, ця лінія 18 просто говорить: спробуйте прочитати Цілочисельне від користувача 81 00:04:04,430 --> 00:04:10,420 клавіатури, і зберігає його всередині х, у будь-яку адресу, х, виявляється, живе в. 82 00:04:10,420 --> 00:04:14,860 А потім, нарешті, рядок 19 просто говорить, спасибо за Інтернешнл, в цьому випадку. 83 00:04:14,860 --> 00:04:15,940 >> Отже, дозвольте мені піти далі і зробити це. 84 00:04:15,940 --> 00:04:18,570 Тому переконайтеся, SCANF 0. 85 00:04:18,570 --> 00:04:20,130 Дозвольте мені йти вперед і збільшення масштабу 86 00:04:20,130 --> 00:04:22,960 Я піду і виконати це з точками слеш SCANF 0. 87 00:04:22,960 --> 00:04:24,020 Номер, ласка? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Дякуємо за 50. 90 00:04:25,730 --> 00:04:27,270 Так що це досить просто. 91 00:04:27,270 --> 00:04:28,160 >> Тепер те, що він не робить? 92 00:04:28,160 --> 00:04:29,940 Це не робить цілий букет перевірки помилок. 93 00:04:29,940 --> 00:04:33,000 Наприклад, якщо я не буду співпрацювати, і я не вводити номер, але 94 00:04:33,000 --> 00:04:37,860 замість цього я написати щось на кшталт "привіт", це просто странно. 95 00:04:37,860 --> 00:04:41,130 І ось одна з речей, CS50 бібліотека була для нас робити для деяких 96 00:04:41,130 --> 00:04:43,440 часу є те, що reprompting і reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Повторити фразу відкликання в cs50.c, і це причина того, що в GetInt 98 00:04:49,320 --> 00:04:51,670 бібліотеки CS50 фактично весь купа рядків, тому що ми 99 00:04:51,670 --> 00:04:53,190 перевірка на дурні речі, як це. 100 00:04:53,190 --> 00:04:55,730 Ж користувач не дають нам, по суті, Цілочисельне? 101 00:04:55,730 --> 00:04:57,910 Він або вона дати нам щось подібне алфавітним лист? 102 00:04:57,910 --> 00:05:01,410 Якщо це так, ми хочемо, щоб виявити , Що і кричати на них. 103 00:05:01,410 --> 00:05:03,915 >> Але все стає цікавішим У наступному прикладі. 104 00:05:03,915 --> 00:05:09,840 Якщо я піду в SCANF-1с, те, що одна річ, яка докорінно змінила в 105 00:05:09,840 --> 00:05:11,135 Наступний приклад? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Я використовую символ *, звичайно, замість Int. 108 00:05:16,010 --> 00:05:19,210 >> Так що це цікаво, тому що символ *, Нагадаємо, що насправді просто 109 00:05:19,210 --> 00:05:20,190 Те ж саме у вигляді рядка. 110 00:05:20,190 --> 00:05:23,840 Таким чином, схоже, може бути, це супер Проста реалізація GetString. 111 00:05:23,840 --> 00:05:26,010 Але я відігнув шару CS50 з бібліотеки, так що я 112 00:05:26,010 --> 00:05:27,550 виклику цього символ * зараз. 113 00:05:27,550 --> 00:05:30,070 Отже, давайте подивимося, де, якщо завгодно, ми робимо неправильно. 114 00:05:30,070 --> 00:05:30,840 >> Рядок 17 - 115 00:05:30,840 --> 00:05:33,950 Я ще раз кажу, будь ласка, дайте мені що-небудь, У цьому випадку, рядок. 116 00:05:33,950 --> 00:05:37,940 І тоді в наступному рядку, я називаю SCANF, знову, надавши йому формат коду, 117 00:05:37,940 --> 00:05:39,310 але ця пора відсотків. 118 00:05:39,310 --> 00:05:41,900 І то цього разу, я надавши йому буфера. 119 00:05:41,900 --> 00:05:43,550 >> А тепер зверніть увагу, що я не використовую амперсанд. 120 00:05:43,550 --> 00:05:47,120 Але чому в тому, що тут, ймовірно, добре? 121 00:05:47,120 --> 00:05:49,760 Адже що таке буфер вже? 122 00:05:49,760 --> 00:05:50,770 Це вже покажчик. 123 00:05:50,770 --> 00:05:51,650 Вже адресою. 124 00:05:51,650 --> 00:05:54,510 >> І давайте це слово "плутають", дозвольте мені назвати його просто з, наприклад, для 125 00:05:54,510 --> 00:05:55,050 простота. 126 00:05:55,050 --> 00:05:58,250 Але я назвав його тому, що в буфер Взагалі, в програмуванні, якщо у вас є 127 00:05:58,250 --> 00:06:02,130 частина пам'яті, яка дійсно рядок просто є, ви могли б назвати це буфер. 128 00:06:02,130 --> 00:06:04,460 Це місце для зберігання інформації. 129 00:06:04,460 --> 00:06:07,400 >> Схожі речі, як YouTube, коли вони буфер, тому говорити, що 130 00:06:07,400 --> 00:06:10,270 просто означає, що він завантаженням бітів з Інтернет та зберігаючи їх у 131 00:06:10,270 --> 00:06:14,160 Локальний масив, місцевий шматок пам'яті, так що ви можете дивитися їх без 132 00:06:14,160 --> 00:06:16,830 це пропуск або висить на Ви під час відтворення. 133 00:06:16,830 --> 00:06:20,930 >> Так що проблема тут, хоча, , Тому що я кажу SCANF, очікують 134 00:06:20,930 --> 00:06:22,320 рядка від користувача. 135 00:06:22,320 --> 00:06:24,410 Ось адреса шматок пам'яті. 136 00:06:24,410 --> 00:06:26,180 Помістіть цей рядок там. 137 00:06:26,180 --> 00:06:31,230 Чому це пов'язане дати нам неприємності, правда? 138 00:06:31,230 --> 00:06:33,490 >> Що це? 139 00:06:33,490 --> 00:06:35,510 Чи можу я отримати доступ до що частина пам'яті? 140 00:06:35,510 --> 00:06:36,250 Ви знаєте, я не знаю. 141 00:06:36,250 --> 00:06:39,210 Тому що володіє буфером инициализирован до чого? 142 00:06:39,210 --> 00:06:39,820 Не зовсім так. 143 00:06:39,820 --> 00:06:43,090 І так це те, що ми називаємо сміття значення, яке 144 00:06:43,090 --> 00:06:44,040 не є офіційним словом. 145 00:06:44,040 --> 00:06:49,200 Це просто означає, що ми поняття не маю, які біти всередині з чотирьох байт, які 146 00:06:49,200 --> 00:06:51,240 Я виділив в якості буфера. 147 00:06:51,240 --> 00:06:52,450 >> Я не називається Malloc. 148 00:06:52,450 --> 00:06:53,940 Я безумовно не називається GetString. 149 00:06:53,940 --> 00:06:56,380 Так що хто знає, що насправді всередині буфера? 150 00:06:56,380 --> 00:07:00,550 І все ж говорити SCANF наосліп, туди і покласти все, що ввів користувач. 151 00:07:00,550 --> 00:07:04,460 >> Так що, ймовірно, викличе у нашому коді, якщо ми його запустити? 152 00:07:04,460 --> 00:07:05,700 Напевно сегментації. 153 00:07:05,700 --> 00:07:07,970 Може й ні, але, ймовірно, сегментації. 154 00:07:07,970 --> 00:07:10,620 І я кажу, може бути, не тому, що іноді Ви робите, іноді 155 00:07:10,620 --> 00:07:11,380 Ви не отримуєте сегментації. 156 00:07:11,380 --> 00:07:14,280 Іноді вам просто щастить, але це тим не менше буде 157 00:07:14,280 --> 00:07:15,340 помилка в нашій програмі. 158 00:07:15,340 --> 00:07:17,060 >> Отже, дозвольте мені йти вперед і скласти цей. 159 00:07:17,060 --> 00:07:18,280 Я збираюся зробити це по-старому школі. 160 00:07:18,280 --> 00:07:23,825 Так брязкотом тире 0, SCANF-1, SCANF-1с, Enter. 161 00:07:23,825 --> 00:07:24,720 Упс, занадто старої школи. 162 00:07:24,720 --> 00:07:26,550 Давайте подивимося. 163 00:07:26,550 --> 00:07:28,440 Де я? 164 00:07:28,440 --> 00:07:29,700 О, символ * буфера. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 О, спасибі - 167 00:07:35,130 --> 00:07:36,930 Зберегти, OK - 168 00:07:36,930 --> 00:07:37,690 дуже стара школа. 169 00:07:37,690 --> 00:07:38,900 Гаразд, це було в той час. 170 00:07:38,900 --> 00:07:41,720 >> Так що я тільки що збережений файл після робить, що тимчасові 171 00:07:41,720 --> 00:07:42,700 змінити хвилину тому. 172 00:07:42,700 --> 00:07:46,090 А тепер я зібрав це вручну за допомогою Clang. 173 00:07:46,090 --> 00:07:49,500 І тепер я збираюся йти вперед і запустити SCANF-1, Enter. 174 00:07:49,500 --> 00:07:50,290 Струнний ласка. 175 00:07:50,290 --> 00:07:51,600 Я наберіть "привіт". 176 00:07:51,600 --> 00:07:54,070 >> А тепер, ось де, чесно кажучи, Е може трохи дратувати. 177 00:07:54,070 --> 00:07:56,020 Це насправді не збирається сегментації в цьому разі. 178 00:07:56,020 --> 00:07:59,860 Printf стоїть дещо окремо, тому що це так супер широко використовується, що 179 00:07:59,860 --> 00:08:03,570 істотно Е робить нам ласку і реалізації, 180 00:08:03,570 --> 00:08:04,830 це не дійсний покажчик. 181 00:08:04,830 --> 00:08:09,080 Дозвольте мені взяти це на себе, щоб просто роздрукувати в нульові дужки, навіть 182 00:08:09,080 --> 00:08:13,340 хоча це і не обов'язково, що ми самі очікували. 183 00:08:13,340 --> 00:08:16,940 >> Тому ми не можемо дійсно легко викликати сегментації з цим, але очевидно, що це 184 00:08:16,940 --> 00:08:18,600 не поведінка я хотів. 185 00:08:18,600 --> 00:08:19,800 Так в чому ж просте рішення? 186 00:08:19,800 --> 00:08:25,650 Ну, а в SCANF-2, дозвольте мені запропонувати, що а насправді просто виділення 187 00:08:25,650 --> 00:08:30,100 символ *, дозвольте мені бути трохи розумніші, про це, і дозвольте мені виділити буфер 188 00:08:30,100 --> 00:08:32,940 як послідовність з 16 символів. 189 00:08:32,940 --> 00:08:34,200 >> Так що я можу зробити це в кілька способів. 190 00:08:34,200 --> 00:08:35,610 Я міг би використовувати абсолютно Malloc. 191 00:08:35,610 --> 00:08:38,980 Але я можу повернутися в тиждень два, коли Мені просто потрібно було цілий букет 192 00:08:38,980 --> 00:08:39,620 символів. 193 00:08:39,620 --> 00:08:40,860 Ось тільки масив. 194 00:08:40,860 --> 00:08:44,870 Отже, дозвольте мені замість перевизначити буфер бути масивом з 16 символів. 195 00:08:44,870 --> 00:08:47,340 >> І тепер, коли я проходжу в буфер - 196 00:08:47,340 --> 00:08:49,940 , І це те, що ми не говорити в тиждень два - 197 00:08:49,940 --> 00:08:53,730 але ви можете розглядати масив як хоча це адреси. 198 00:08:53,730 --> 00:08:56,390 Технічно, як ми бачили, вони трохи по-іншому. 199 00:08:56,390 --> 00:09:01,290 Але SCANF не заперечуватиме, якщо ви передаєте його ім'я масиву, тому що те, 200 00:09:01,290 --> 00:09:05,030 Clang зробить для нас по суті лікувати ім'я цього масиву в якості 201 00:09:05,030 --> 00:09:08,280 адреса блоку 16 байт. 202 00:09:08,280 --> 00:09:09,550 >> Так що це краще. 203 00:09:09,550 --> 00:09:12,110 Це означає, що тепер, коли я можу, ми сподіваємося, виконати наступне. 204 00:09:12,110 --> 00:09:16,800 Дозвольте мені змінити масштаб на мить і роблять SCANF-2, складений в порядку. 205 00:09:16,800 --> 00:09:19,390 Зараз зроблю отримав слеш SCANF-2. 206 00:09:19,390 --> 00:09:22,430 Струнний ласка. "Hello". І це здавалося, працювали в цей раз. 207 00:09:22,430 --> 00:09:26,020 >> Але хтось може запропонувати сценарій , В якому він не може все ще працює? 208 00:09:26,020 --> 00:09:28,550 Так? 209 00:09:28,550 --> 00:09:30,640 Щось довше 16 символів. 210 00:09:30,640 --> 00:09:32,020 А насправді, ми можемо бути трохи більш точним. 211 00:09:32,020 --> 00:09:36,540 Щось довше, ніж 15 символів, тому що дійсно ми повинні мати на увазі, 212 00:09:36,540 --> 00:09:39,920 що нам потрібно, що зворотна коса риска нуля неявно в кінці рядка, 213 00:09:39,920 --> 00:09:42,950 яка осторонь, як правило, SCANF піклуватися про нас. 214 00:09:42,950 --> 00:09:46,210 >> Отже, дозвольте мені зробити щось подібне - 215 00:09:46,210 --> 00:09:48,040 Іноді ми можемо тільки залишити все як є, що. 216 00:09:48,040 --> 00:09:50,630 Отже, ми тепер індукованих наші помилки сегментації. 217 00:09:50,630 --> 00:09:51,000 Чому? 218 00:09:51,000 --> 00:09:54,940 Тому що я набрав в більш ніж 15 символів, і так ми фактично 219 00:09:54,940 --> 00:09:58,280 торкнувся пам'яті, що я насправді не повинен був. 220 00:09:58,280 --> 00:10:00,180 >> Так що насправді рішення тут? 221 00:10:00,180 --> 00:10:02,210 Ну, а що якщо нам потрібно більш довгий рядок? 222 00:10:02,210 --> 00:10:03,960 Ну, ми, можливо, зробити це 32 байт. 223 00:10:03,960 --> 00:10:05,160 Ну, а якщо це не досить довго? 224 00:10:05,160 --> 00:10:06,040 Як щодо 64 байт? 225 00:10:06,040 --> 00:10:07,080 Що робити, якщо це не досить довго? 226 00:10:07,080 --> 00:10:09,640 Як щодо 128 або 200 байт? 227 00:10:09,640 --> 00:10:12,660 Те, що дійсно є рішення тут, в загальному випадку, якщо ми не знаємо, в 228 00:10:12,660 --> 00:10:14,460 заздалегідь, що користувач збирається друкувати? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Це просто якась велика біль в дупі, чесно кажучи, саме тому 231 00:10:23,050 --> 00:10:29,050 CS50 бібліотеці є кілька десятків рядків коду, які в сукупності реалізують 232 00:10:29,050 --> 00:10:32,390 GetString рядок таким чином, що ми не повинні знати заздалегідь, що 233 00:10:32,390 --> 00:10:33,430 користувач збирається ввести. 234 00:10:33,430 --> 00:10:37,370 Зокрема, якщо ви подивитеся на cs50.c від двох тижнів тому, ви побачите, 235 00:10:37,370 --> 00:10:40,480 , Що насправді робить GetString Не використовуйте SCANF таким чином. 236 00:10:40,480 --> 00:10:43,720 Швидше, він читає один символ за один раз. 237 00:10:43,720 --> 00:10:46,010 >> Тому що той, хороша річ про читання одного символу, ми можемо 238 00:10:46,010 --> 00:10:48,490 гарантувати собі завжди мати принаймні один символ. 239 00:10:48,490 --> 00:10:51,740 Я можу просто оголосити символ, а потім прийняти ці воістину кроки дитини просто 240 00:10:51,740 --> 00:10:54,380 читати один символ в час від клавіатури. 241 00:10:54,380 --> 00:10:58,240 І потім, що ви побачите GetString робить це кожен раз, коли закінчується, 242 00:10:58,240 --> 00:11:02,280 скажімо, 16 байт пам'яті, вона використовує Malloc, або двоюрідний брат його, щоб 243 00:11:02,280 --> 00:11:06,810 виділити більше пам'яті, копіювання старих пам'яті в нових, а потім поповзом 244 00:11:06,810 --> 00:11:09,900 уздовж, отримуючи один символ за один раз, і коли воно закінчується, що 245 00:11:09,900 --> 00:11:13,370 шматок пам'яті, викидає його, захвати більший шматок пам'яті, копіює старі 246 00:11:13,370 --> 00:11:14,750 в нові і повторює. 247 00:11:14,750 --> 00:11:18,480 І це дійсно біль насправді реалізувати щось само просто, як 248 00:11:18,480 --> 00:11:19,710 отримання даних від користувача. 249 00:11:19,710 --> 00:11:21,090 >> Таким чином, ви можете використовувати SCANF. 250 00:11:21,090 --> 00:11:22,430 Ви можете використовувати інші аналогічні функції. 251 00:11:22,430 --> 00:11:25,420 І багато підручників та онлайн приклади роблять, але вони все 252 00:11:25,420 --> 00:11:27,210 уразливі до проблем, як ця. 253 00:11:27,210 --> 00:11:29,550 І в кінцевому рахунку, отримати сегментації вид дратує. 254 00:11:29,550 --> 00:11:30,680 Це не добре для користувача. 255 00:11:30,680 --> 00:11:33,560 >> Але в гіршому випадку, те, що робить це принципово покласти ваші 256 00:11:33,560 --> 00:11:37,160 код ризику? 257 00:11:37,160 --> 00:11:39,250 Свого роду атаки, потенційно. 258 00:11:39,250 --> 00:11:41,680 Ми говорили про одну з таких атак - переповнення стека. 259 00:11:41,680 --> 00:11:44,660 Але в цілому, якщо ви маєте на це право Переповнення буфера, як ми зробили 260 00:11:44,660 --> 00:11:48,070 Пару тижнів тому, тільки з письмової більше, ніж "привіт" в стеку, ви 261 00:11:48,070 --> 00:11:52,330 дійсно може взяти на себе, потенційно, комп'ютер, або, принаймні, отримати дані, які в 262 00:11:52,330 --> 00:11:53,510 не належить вам. 263 00:11:53,510 --> 00:11:55,970 >> Коротше кажучи, саме тому у нас є цих навчальних коліс. 264 00:11:55,970 --> 00:11:59,090 Але тепер, ми починаємо знімати їх, як наші програми більше не потрібна, 265 00:11:59,090 --> 00:12:00,610 обов'язково, введення від користувача. 266 00:12:00,610 --> 00:12:03,960 Але у випадку виникнення проблем встановити шість, ваш внесок буде надходити з величезного 267 00:12:03,960 --> 00:12:07,520 файл словника з деякими 150 гаком тисяч слів. 268 00:12:07,520 --> 00:12:10,330 >> Так що вам не доведеться турбуватися про довільного користувача введення. 269 00:12:10,330 --> 00:12:13,720 Ми дамо вам деякі припущення про цей файл. 270 00:12:13,720 --> 00:12:20,340 Будь-які питання за вказівниками або SCANF або введення даних користувачем у цілому? 271 00:12:20,340 --> 00:12:24,450 >> Гаразд, швидкий погляд то на одного задня теми від двох тижнів тому. 272 00:12:24,450 --> 00:12:28,590 І це було це поняття структури. 273 00:12:28,590 --> 00:12:34,180 Не те, що - це поняття Побудуємо, яке було що? 274 00:12:34,180 --> 00:12:35,430 Що структури зробити для нас? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Визначити - 277 00:12:39,860 --> 00:12:41,710 вибачте? 278 00:12:41,710 --> 00:12:42,820 Визначити тип змінної. 279 00:12:42,820 --> 00:12:44,410 Так ніби. 280 00:12:44,410 --> 00:12:46,180 Ми насправді об'єднання двох темах. 281 00:12:46,180 --> 00:12:49,510 Так що з ЬурейеЕ, згадаємо, що ми можемо оголосити типу нашої, як і 282 00:12:49,510 --> 00:12:51,500 синонім, як і рядок для символ *. 283 00:12:51,500 --> 00:12:56,200 Але використання ЬурейеЕ і структури, ми можемо створити дійсно наші власні структури даних. 284 00:12:56,200 --> 00:12:59,600 >> Наприклад, якщо я повернуся в Gedit тут всього мить, і я йду вперед 285 00:12:59,600 --> 00:13:08,230 і зробити щось подібне, дозвольте мені зберегти це як, скажімо, structs.c 286 00:13:08,230 --> 00:13:10,840 тимчасово, я просто хочу, йти вперед і включають 287 00:13:10,840 --> 00:13:14,360 standardio.h, тап_п недійсними. 288 00:13:14,360 --> 00:13:18,960 А потім тут, припустимо, що я хочу написати програму, яка зберігає 289 00:13:18,960 --> 00:13:21,840 кілька студентів з декількох будинку, наприклад. 290 00:13:21,840 --> 00:13:24,430 Так що це як registrarial даних якийсь. 291 00:13:24,430 --> 00:13:29,550 >> Так що, якщо мені потрібно назву одного студента, я може зробити щось на зразок символу ім'я *, 292 00:13:29,550 --> 00:13:31,570 і я зроблю щось на кшталт - 293 00:13:31,570 --> 00:13:34,410 Насправді, давайте використовувати бібліотеку CS50 на мить, щоб зробити це 294 00:13:34,410 --> 00:13:38,380 трохи простіше, так що ми можемо запозичити тих десятків рядків коду. 295 00:13:38,380 --> 00:13:39,340 І давайте просто тримати його проста. 296 00:13:39,340 --> 00:13:42,610 Ми будемо тримати це рядок, і тепер GetString. 297 00:13:42,610 --> 00:13:47,420 >> Тому я стверджую, тепер, коли я зберігається назва деяких студентів, і будинок 298 00:13:47,420 --> 00:13:50,240 небудь студент, просто за допомогою змінних як ми робили і на тиждень один. 299 00:13:50,240 --> 00:13:52,370 Але припустимо, що я тепер хочу підтримати кілька студентів. 300 00:13:52,370 --> 00:13:58,460 Гаразд, так що мої інстинкти робити Рядок name2, отримує GetString, рядок 301 00:13:58,460 --> 00:14:01,370 Дом2 отримує GetString. 302 00:14:01,370 --> 00:14:05,850 А потім наш третій студент, давайте зробимо name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Гаразд, так що це, ми сподіваємося, разюче Ви як виду нерозумно, 304 00:14:09,170 --> 00:14:11,580 тому що цей процес не буде дійсно ніколи скінчиться, і він просто буде 305 00:14:11,580 --> 00:14:13,130 зробити мій код виглядає гірше і все гірше і гірше. 306 00:14:13,130 --> 00:14:14,810 Але ми вирішили це теж в тиждень два. 307 00:14:14,810 --> 00:14:19,450 Що представляла з себе відносно чистим рішенням коли у нас було кілька змінних 308 00:14:19,450 --> 00:14:23,580 той же тип даних, які все зв'язані, але ми не хотіли цього жорстокого безлад 309 00:14:23,580 --> 00:14:26,870 з однойменних змінних? 310 00:14:26,870 --> 00:14:30,060 Що ми зробили, а? 311 00:14:30,060 --> 00:14:31,260 >> Так що я думаю, що я почув, що кілька місць. 312 00:14:31,260 --> 00:14:32,590 У нас було безліч. 313 00:14:32,590 --> 00:14:37,110 Якщо ви хочете кілька примірників щось, чому б нам не очистити це все 314 00:14:37,110 --> 00:14:39,540 і просто сказати, дайте мені Масив обзивали? 315 00:14:39,540 --> 00:14:41,640 >> А поки, давайте жорсткий 3 коду. 316 00:14:41,640 --> 00:14:44,450 А потім дати мені ще один масив звані будинки, і нехай мене 317 00:14:44,450 --> 00:14:45,800 Тепер жорсткий код 3. 318 00:14:45,800 --> 00:14:49,220 І я масово очищені безлад, що я тільки що створили. 319 00:14:49,220 --> 00:14:52,400 Тепер, я як і раніше жорстко 3, але навіть 3 може динамічно виходити від 320 00:14:52,400 --> 00:14:54,350 користувача, або агду або тому подібне. 321 00:14:54,350 --> 00:14:55,720 Так що це вже чистіше. 322 00:14:55,720 --> 00:15:00,100 >> Але те, що дратує в цьому те, що Тепер, навіть якщо звуть якось 323 00:15:00,100 --> 00:15:02,280 принципово пов'язане з студентський дім - 324 00:15:02,280 --> 00:15:04,720 це студент, що я дійсно хочемо представити - 325 00:15:04,720 --> 00:15:08,080 Тепер у мене є два масиви, які паралельні У тому сенсі, що вони 326 00:15:08,080 --> 00:15:13,930 однаковий розмір, і імена кронштейн 0 Імовірно карт для дому кронштейн 0, 327 00:15:13,930 --> 00:15:16,600 імена і кронштейном 1 карт Кронштейн в будинку 1. 328 00:15:16,600 --> 00:15:19,280 Іншими словами, що студент живе в цей будинок, то, що інший студент 329 00:15:19,280 --> 00:15:20,530 життя в цьому іншому будинку. 330 00:15:20,530 --> 00:15:23,720 Але, звичайно, це може бути зробили ще більш чисто. 331 00:15:23,720 --> 00:15:24,990 >> Ну, може, насправді. 332 00:15:24,990 --> 00:15:28,730 І дозвольте мені йти вперед і відкрити до structs.h, і Ви будете 333 00:15:28,730 --> 00:15:31,130 см. цю ідею тут. 334 00:15:31,130 --> 00:15:34,905 Зверніть увагу, що я використав, оголошення типу, як ви посилався на момент назад, щоб заявити про свою 335 00:15:34,905 --> 00:15:35,570 власний тип даних. 336 00:15:35,570 --> 00:15:39,660 Але я також використовую цю іншому ключовому слову називається структура, яка дає мені нове 337 00:15:39,660 --> 00:15:40,790 структурі даних. 338 00:15:40,790 --> 00:15:43,980 >> І ця структура даних я стверджую, що відбувається мати дві речі всередині 339 00:15:43,980 --> 00:15:47,060 це - рядок називається ім'я та Рядок називається будинком. 340 00:15:47,060 --> 00:15:49,820 І ім'я я збираюся дати ця структура даних буде 341 00:15:49,820 --> 00:15:51,005 називатися учнем. 342 00:15:51,005 --> 00:15:54,030 Я міг би назвати це все, що захочу, але це робить семантично 343 00:15:54,030 --> 00:15:55,810 сенс для мене в моїй свідомості. 344 00:15:55,810 --> 00:15:59,160 >> Так що тепер, якщо я відкриваю кращу версію програми я почав писати 345 00:15:59,160 --> 00:16:00,390 там, дозвольте мені перейти до вершини. 346 00:16:00,390 --> 00:16:03,190 І є ще кілька рядків коду тут, але дозвольте мені зупинитися на 347 00:16:03,190 --> 00:16:04,160 момент на один. 348 00:16:04,160 --> 00:16:07,790 Я оголосив постійний званих студентів і жорстко 3 на даний момент. 349 00:16:07,790 --> 00:16:11,110 Але тепер, зверніть увагу, як чистий мій код починає отримувати. 350 00:16:11,110 --> 00:16:15,030 >> У рядку 22 я заявляю Масив студентів. 351 00:16:15,030 --> 00:16:18,760 І зауважте, що студент мабуть Тепер тип даних. 352 00:16:18,760 --> 00:16:23,360 Тому що у верхній частині цього файлу, помітить Я включив цей заголовок файлу 353 00:16:23,360 --> 00:16:24,820 що я зупинився на хвилину назад. 354 00:16:24,820 --> 00:16:28,820 , А цей заголовок файлу просто-напросто було це визначення студента. 355 00:16:28,820 --> 00:16:32,470 >> Так що тепер, я створив мої власні дані користувача Тип що автори років C 356 00:16:32,470 --> 00:16:33,890 тому не думали заздалегідь. 357 00:16:33,890 --> 00:16:34,570 Але не проблема. 358 00:16:34,570 --> 00:16:35,870 Я можу зробити це сам. 359 00:16:35,870 --> 00:16:39,050 Так що це масив з ім'ям студентів, кожен з членів якої 360 00:16:39,050 --> 00:16:41,100 є студентом структури. 361 00:16:41,100 --> 00:16:44,270 І я хочу, три з них в масиві. 362 00:16:44,270 --> 00:16:46,030 >> І зараз, що зробить все інше цієї програми робити? 363 00:16:46,030 --> 00:16:47,550 Мені потрібно щось трохи довільним. 364 00:16:47,550 --> 00:16:51,450 Так що з онлайн 24 років, Я ітерації від 0 до 3. 365 00:16:51,450 --> 00:16:54,000 Я тоді питаю у користувача Ім'я та прізвище учня. 366 00:16:54,000 --> 00:16:56,110 А потім використовую GetString, як раніше. 367 00:16:56,110 --> 00:16:59,410 Тоді я питаю для дому студента, і я використовую GetString, як раніше. 368 00:16:59,410 --> 00:17:01,780 >> Але зверніть увагу - кілька нових частина синтаксису - 369 00:17:01,780 --> 00:17:07,010 Я до сих пір індекс до I-го студента, але як я можу отримати на конкретних даних 370 00:17:07,010 --> 00:17:08,354 поле всередині структури? 371 00:17:08,354 --> 00:17:11,770 Ну, що мабуть нова частина синтаксису? 372 00:17:11,770 --> 00:17:13,339 Це просто точка оператора. 373 00:17:13,339 --> 00:17:14,510 >> Ми насправді не бачив цього раніше. 374 00:17:14,510 --> 00:17:17,819 Ви бачили це в PSET п'ять, якщо у вас є пірнув у вже і графічних файлів. 375 00:17:17,819 --> 00:17:22,372 Але просто означає, що точка всередині цього структури або кілька полів, дати точку 376 00:17:22,372 --> 00:17:24,510 ім'я, або дайте мені точку вдома. 377 00:17:24,510 --> 00:17:28,690 Це означає, що ти всередині структури і отримати ці конкретних областях. 378 00:17:28,690 --> 00:17:30,200 >> Що робить решту цієї програми робити? 379 00:17:30,200 --> 00:17:31,190 Це ще не все, що сексуально. 380 00:17:31,190 --> 00:17:34,640 Зауважте, що я ітерації від 0 до 3 разів, і я просто створюю англійською 381 00:17:34,640 --> 00:17:40,500 фраза типу так і так знаходиться в такому і такий будинок, переходячи в точку назву від 382 00:17:40,500 --> 00:17:43,320 I-го студента та їх будинку, а також. 383 00:17:43,320 --> 00:17:47,560 >> А потім, нарешті, тепер ми почнемо, щоб отримати Анальний про це, тепер, коли ми 384 00:17:47,560 --> 00:17:49,580 знайомі з тим, що і Malloc інші функції були 385 00:17:49,580 --> 00:17:50,570 робив весь цей час. 386 00:17:50,570 --> 00:17:54,220 Чому я повинен звільнити обидві назви і вдома, хоча я 387 00:17:54,220 --> 00:17:56,960 не телефонував Malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString зробив. 389 00:17:58,020 --> 00:18:00,930 І це був маленький брудний секрет для кілька тижнів, але GetString має 390 00:18:00,930 --> 00:18:03,530 був витік пам'яті в усьому розмістити весь семестр досі. 391 00:18:03,530 --> 00:18:05,990 І, нарешті, valgrand показати це нам. 392 00:18:05,990 --> 00:18:10,730 >> Але це не має великого значення, тому що я знаю що я можу просто звільнити ім'я 393 00:18:10,730 --> 00:18:15,750 і будинок, хоча технічно, щоб бути супер, супер безпечний, я повинен бути 394 00:18:15,750 --> 00:18:17,890 роблять деякі тут помилки. 395 00:18:17,890 --> 00:18:19,040 Які ваші інстинкти кажу? 396 00:18:19,040 --> 00:18:22,480 Що я повинен для перевірки перш ніж я безкоштовно Що є 397 00:18:22,480 --> 00:18:25,470 Рядок, яку він же символ *? 398 00:18:25,470 --> 00:18:33,460 >> Я повинен дійсно бути перевірка, якщо студенти Кронштейн я точка ім'я не 399 00:18:33,460 --> 00:18:34,840 рівним нулю. 400 00:18:34,840 --> 00:18:40,400 Тоді все буде в порядку, щоб йти вперед і безкоштовно що покажчик, і те ж або інше 401 00:18:40,400 --> 00:18:41,160 , А також. 402 00:18:41,160 --> 00:18:46,860 Якщо студенти кронштейн я точка будинок не дорівнює нулю, це тепер захищатиме 403 00:18:46,860 --> 00:18:52,520 по відношенню до кута випадок, в якому GetString повертає щось на зразок нульовий. 404 00:18:52,520 --> 00:18:57,310 І ми побачили хвилину тому, Е буде захистити нас тут, просто кажучи 405 00:18:57,310 --> 00:18:58,990 порожнє значення, що буде виглядати дивно. 406 00:18:58,990 --> 00:19:02,340 Але принаймні не падатимуть, як ми вже бачили. 407 00:19:02,340 --> 00:19:05,990 >> Ну, дозвольте мені зробити ще одну річ тут. структур-0 це свого роду безглузді програми 408 00:19:05,990 --> 00:19:09,700 , Тому що я все це ввести дані, а потім він втратив, коли програма закінчується. 409 00:19:09,700 --> 00:19:10,940 Але дозвольте мені йти вперед і робити це. 410 00:19:10,940 --> 00:19:12,830 Дозвольте мені зробити термінал вікна трохи більше. 411 00:19:12,830 --> 00:19:17,000 Дозвольте мені зробити структур-1, який це нова версія цього. 412 00:19:17,000 --> 00:19:18,520 >> Я збільшити небагато. 413 00:19:18,520 --> 00:19:21,620 А тепер дозвольте мені працювати точка слеш структур-1. 414 00:19:21,620 --> 00:19:22,590 Ім'я та прізвище учня - 415 00:19:22,590 --> 00:19:31,500 Девід Mather, давайте зробимо Роб Kirkland, давайте зробимо Леверетт Лорен. 416 00:19:31,500 --> 00:19:33,650 Що цікаво, тепер повідомлення - 417 00:19:33,650 --> 00:19:35,540 і я знаю, що це тільки тому, що Я написав програму - 418 00:19:35,540 --> 00:19:38,930 є файл тепер на моєму поточному каталозі з ім'ям students.csv. 419 00:19:38,930 --> 00:19:40,420 Деякі з вас можливо, бачили це в реальному світі. 420 00:19:40,420 --> 00:19:42,980 >> Що таке файл CSV? 421 00:19:42,980 --> 00:19:44,170 Значень, розділених комами. 422 00:19:44,170 --> 00:19:46,670 Це ніби як бідної людини версія файлу Excel. 423 00:19:46,670 --> 00:19:50,580 Це таблиця рядків і стовпців, Ви можете відкрити в програму як Excel, 424 00:19:50,580 --> 00:19:51,800 або цифри на Mac. 425 00:19:51,800 --> 00:19:55,180 >> І якщо я відкриваю цей файл тут на Gedit, повідомлення - а цифри там немає. 426 00:19:55,180 --> 00:19:57,360 Ось тільки говорити GEdit мені номери рядків. 427 00:19:57,360 --> 00:19:59,740 Зверніть увагу, на першій лінії цього Файл Давида і Mather. 428 00:19:59,740 --> 00:20:01,450 Наступний рядок Rob Kirkland коми. 429 00:20:01,450 --> 00:20:04,170 І третя лінія Лорен Леверетт коми. 430 00:20:04,170 --> 00:20:05,480 >> Так що ж я створив? 431 00:20:05,480 --> 00:20:09,580 Я тепер написано-програму, яка ефективно може генерувати таблиці 432 00:20:09,580 --> 00:20:11,840 які можуть бути відкриті в програми, як Excel. 433 00:20:11,840 --> 00:20:15,520 Не все, що переконливим набором даних, але якщо у вас є багато великих шматків 434 00:20:15,520 --> 00:20:18,440 дані, які ви дійсно хочете маніпулювати і робити графіки і 435 00:20:18,440 --> 00:20:21,260 подобається, це, мабуть, один спосіб створення цих даних. 436 00:20:21,260 --> 00:20:25,370 Крім того, CSV, насправді супер загальні просто для зберігання простих даних - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, наприклад, якщо ви отримуєте котирування акцій за допомогою своїх так званих 438 00:20:28,940 --> 00:20:33,180 API, безкоштовний сервіс, який дозволяє отримати струм до-к-дата акції 439 00:20:33,180 --> 00:20:35,650 котирування компаній, вони дати дані назад у 440 00:20:35,650 --> 00:20:37,800 супер простий формат CSV. 441 00:20:37,800 --> 00:20:39,380 >> Так як же ми це зробимо? 442 00:20:39,380 --> 00:20:42,530 Добре помітити, велика частина цієї програми майже те ж саме. 443 00:20:42,530 --> 00:20:46,870 Але зверніть увагу, тут, внизу, а не для друку студентів, операції по лінії 35 444 00:20:46,870 --> 00:20:51,040 і далі, я стверджую, що я економлю студентів на диск, так що збереження файлу. 445 00:20:51,040 --> 00:20:53,630 >> Так помітити я оголошую файл * - 446 00:20:53,630 --> 00:20:57,260 Тепер, це вид аномалії в C. З якоїсь причини, то файл буде заголовними буквами, 447 00:20:57,260 --> 00:21:00,690 який не схожий на більшість інших типів даних в C. Але це вбудований 448 00:21:00,690 --> 00:21:02,320 Тип даних, файл *. 449 00:21:02,320 --> 00:21:05,900 І я оголошую покажчик на файл, як ви можете думати про це. 450 00:21:05,900 --> 00:21:08,070 >> FOPEN означає відкритий файл. 451 00:21:08,070 --> 00:21:09,470 Яку файлову ви хочете відкрити? 452 00:21:09,470 --> 00:21:12,620 Я хочу відкрити файл, який я буду Умовно назвемо students.csv. 453 00:21:12,620 --> 00:21:14,480 Я можу зателефонувати, що все, що захочу. 454 00:21:14,480 --> 00:21:15,200 >> А потім зробити припущення. 455 00:21:15,200 --> 00:21:18,960 Що означає другий аргумент до FOPEN, ймовірно, означає? 456 00:21:18,960 --> 00:21:21,480 Право, W для запису, може бути R для читання. 457 00:21:21,480 --> 00:21:24,120 Там є для додавання, якщо ви хочете додати рядки, а не 458 00:21:24,120 --> 00:21:25,200 переписати все це. 459 00:21:25,200 --> 00:21:28,005 >> Але я просто хочу створити цей файл неодноразово, тому я буду використовувати в лапках Вт 460 00:21:28,005 --> 00:21:31,880 І я знаю, що тільки прочитавши документації, або довідкові сторінки. 461 00:21:31,880 --> 00:21:35,100 Якщо файл не є нульовим, - іншими словами, якщо нічого не пішло не так там - 462 00:21:35,100 --> 00:21:37,820 Дозвольте мені перебору студентів від 0 до 3. 463 00:21:37,820 --> 00:21:40,410 >> А тепер зверніть увагу, є щось дуже трохи різний 464 00:21:40,410 --> 00:21:42,110 про лінії 41 тут. 465 00:21:42,110 --> 00:21:42,960 Це не Є. 466 00:21:42,960 --> 00:21:46,530 Це Fprintf Е для файлу. 467 00:21:46,530 --> 00:21:47,790 Так це буде запис у файл. 468 00:21:47,790 --> 00:21:48,860 Який файл? 469 00:21:48,860 --> 00:21:53,630 Один, покажчик вказати В якості першого аргументу. 470 00:21:53,630 --> 00:21:55,940 >> Потім ми вказуємо рядок формата. 471 00:21:55,940 --> 00:21:59,660 Потім ми визначаємо, які рядки ми хочемо плагін для першого з відсотків, а 472 00:21:59,660 --> 00:22:04,320 потім інший змінної або другий з відсотків. 473 00:22:04,320 --> 00:22:06,760 Тоді ми закриваємо файл з FCLOSE. 474 00:22:06,760 --> 00:22:09,380 Чим я звільнити пам'ять, як і раніше, хоча Я повинен повернутися і додати 475 00:22:09,380 --> 00:22:10,540 деякі перевірки для нульових. 476 00:22:10,540 --> 00:22:12,090 >> І це все. 477 00:22:12,090 --> 00:22:16,960 FOPEN, Fprintf, FCLOSE дає мені можливість створювати текстові файли. 478 00:22:16,960 --> 00:22:19,640 Тепер, ви побачите в Архів завдань п'ять, який включає в себе зображення, які ви будете використовувати 479 00:22:19,640 --> 00:22:20,990 виконавчі файли замість цього. 480 00:22:20,990 --> 00:22:24,200 Але важливо те, що ідея та ж, , Хоча ці функції ви будете 481 00:22:24,200 --> 00:22:28,710 бачите, трохи по-іншому. 482 00:22:28,710 --> 00:22:32,580 >> Так ураганний тур, але ви отримаєте занадто добре знайомі з файлу I/O-- 483 00:22:32,580 --> 00:22:34,960 вхідні та вихідні - з PSET п'ять. 484 00:22:34,960 --> 00:22:38,607 І всі питання про початкові основи тут? 485 00:22:38,607 --> 00:22:39,857 Так? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Що, якщо ви спробуєте звільнити нульове значення? 488 00:22:43,710 --> 00:22:48,880 Я вважаю, якщо безкоштовно не отримала трохи більш зручним для користувачів, ви можете 489 00:22:48,880 --> 00:22:49,890 потенційно сегментації. 490 00:22:49,890 --> 00:22:54,160 Передача його недійсним погано, тому що я не вірю безкоштовно заважає перевірити для вас, 491 00:22:54,160 --> 00:22:57,330 тому що це потенційно може бути порожньою тратою часу для того, щоб зробити для себе 492 00:22:57,330 --> 00:22:59,022 кожна людина у світі. 493 00:22:59,022 --> 00:23:00,590 Хороше запитання, однако. 494 00:23:00,590 --> 00:23:04,300 >> Добре, тому цей вид отримує нам цікаву тему. 495 00:23:04,300 --> 00:23:07,010 Темою проблемою набору п'ять є криміналістика. 496 00:23:07,010 --> 00:23:08,420 Принаймні, частина проблеми набору. 497 00:23:08,420 --> 00:23:12,030 Криміналістика в цілому ставиться до відновлення інформації, які можуть або 498 00:23:12,030 --> 00:23:14,110 не може бути видалений навмисно. 499 00:23:14,110 --> 00:23:18,680 І тому я думав, що дам вам швидкий смак того, що відбувається насправді все 500 00:23:18,680 --> 00:23:21,230 на цей раз під капотом вашого комп'ютера. 501 00:23:21,230 --> 00:23:23,960 >> Наприклад, якщо у вас є всередині вашого ноутбуці або настільному комп'ютері 502 00:23:23,960 --> 00:23:28,040 жорсткий диск, це або механічними пристрій, який насправді спини - 503 00:23:28,040 --> 00:23:31,650 є, що називається круговою пластини , Які виглядають зовсім як те, що я 504 00:23:31,650 --> 00:23:34,540 тільки що був на екрані тут, хоча це більш старої школи. 505 00:23:34,540 --> 00:23:37,370 Це три з половиною дюйма жорсткого диска. 506 00:23:37,370 --> 00:23:40,070 І три з половиною дюйма відноситься з з цієї речі, коли ви встановите його 507 00:23:40,070 --> 00:23:40,890 в комп'ютері. 508 00:23:40,890 --> 00:23:44,890 >> Багато хто з вас, хлопці, у ваших ноутбуків зараз є твердотільні накопичувачі або твердотільні накопичувачі, 509 00:23:44,890 --> 00:23:46,260 які не мають рухомих частин. 510 00:23:46,260 --> 00:23:49,170 Вони більше схожі на ОЗП, а не як ці механічні пристрої. 511 00:23:49,170 --> 00:23:51,450 Але ідеї всі ті ж, звичайно ж, як вони ставляться 512 00:23:51,450 --> 00:23:52,790 на питання, поставлене п'ять. 513 00:23:52,790 --> 00:23:57,400 >> І якщо ви думаєте про тепер жорсткий диск представляє будучи коло, який 514 00:23:57,400 --> 00:23:58,930 Я намалюю ось так от. 515 00:23:58,930 --> 00:24:02,290 Коли ви створюєте файл на вашому комп'ютері, будь то SSD або в 516 00:24:02,290 --> 00:24:06,610 цьому випадку старший шкільний жорсткому диску, цей файл містить декілька бітів. 517 00:24:06,610 --> 00:24:10,510 Давайте припустимо, що саме це 0 і 1, цілий букет з 0 і 1. 518 00:24:10,510 --> 00:24:11,660 Так що це мій весь жорсткий диск. 519 00:24:11,660 --> 00:24:13,225 Це, очевидно, досить великий файл. 520 00:24:13,225 --> 00:24:18,080 І він використовує до 0 і 1, що на частина фізичного пластини. 521 00:24:18,080 --> 00:24:19,750 >> Ну, що ж, що фізична частина? 522 00:24:19,750 --> 00:24:25,310 Ну, виходить, що на жорсткому диску, принаймні такого типу, є 523 00:24:25,310 --> 00:24:27,340 ці маленькі магнітні частинки. 524 00:24:27,340 --> 00:24:32,630 І вони по суті є північ і південний полюси до них, так що, якщо ви 525 00:24:32,630 --> 00:24:35,710 свою чергу, один з тих магнітних частинок Таким чином, можна сказати, що це 526 00:24:35,710 --> 00:24:36,720 представляють 1. 527 00:24:36,720 --> 00:24:39,340 І якщо цей догори ногами на південь до Північ, ви могли б сказати, що це 528 00:24:39,340 --> 00:24:40,390 представляють 0. 529 00:24:40,390 --> 00:24:43,660 >> Таким чином, в реальному фізичному світі, це як ви могли б представляти собою щось в 530 00:24:43,660 --> 00:24:45,670 двійковий стану 0 і 1. 531 00:24:45,670 --> 00:24:46,720 Так що все файл. 532 00:24:46,720 --> 00:24:49,300 Там ціла купа магнітного частинки, які їх так чи 533 00:24:49,300 --> 00:24:51,920 Таким чином, створення моделі 0 і 1. 534 00:24:51,920 --> 00:24:56,760 >> Але, виявляється, коли ви зберігаєте файл, деяка інформація зберігається окремо. 535 00:24:56,760 --> 00:25:00,000 Так що це столик, каталог, так би мовити. 536 00:25:00,000 --> 00:25:05,810 І я називаю це ім'я стовпця, а Я буду називати цю колонку місці. 537 00:25:05,810 --> 00:25:08,850 >> І я збираюся сказати, припустимо, це моє резюме. 538 00:25:08,850 --> 00:25:14,050 Мій resume.doc зберігається при місці, скажімо, 123. 539 00:25:14,050 --> 00:25:15,390 Я завжди йду на це число. 540 00:25:15,390 --> 00:25:18,810 Але досить сказати, що, як і в оперативній пам'яті, ви можете взяти жорсткий диск 541 00:25:18,810 --> 00:25:22,350 ось гігабайт або 200 гігабайт або один терабайт, і ви можете 542 00:25:22,350 --> 00:25:23,750 число всіх байтів. 543 00:25:23,750 --> 00:25:26,480 Ви можете пронумерувати всі шматки 8 біт. 544 00:25:26,480 --> 00:25:29,030 >> Тому ми будемо говорити, що це 123, є розташування. 545 00:25:29,030 --> 00:25:32,070 Так що цей каталог всередині моєї операційної система запам'ятовує, що моя 546 00:25:32,070 --> 00:25:34,250 Резюме знаходиться в місці розташування 123. 547 00:25:34,250 --> 00:25:36,850 Але найцікавіше, коли Ви видаляєте файл. 548 00:25:36,850 --> 00:25:37,820 >> Так, наприклад - 549 00:25:37,820 --> 00:25:40,790 і, до щастя, більшість країн світу має зловили на цьому - що відбувається, коли 550 00:25:40,790 --> 00:25:45,040 ви перетягніть файл у ваше сміття Mac OS або ваш Windows кошика? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Яка мета робити це? 553 00:25:50,510 --> 00:25:53,860 Це, очевидно, щоб позбутися від файлів, але те, що робить акт переміщенні і 554 00:25:53,860 --> 00:25:57,550 падіння в ваше сміття або ваш Кошики робити на комп'ютері? 555 00:25:57,550 --> 00:25:59,230 >> Абсолютно нічого, насправді. 556 00:25:59,230 --> 00:26:00,320 Це просто, як папки. 557 00:26:00,320 --> 00:26:01,800 Це особлива папка, щоб бути впевненим. 558 00:26:01,800 --> 00:26:04,460 Та чи так це насправді видалити файл? 559 00:26:04,460 --> 00:26:06,780 >> Ну, немає, тому що деякі з вас, напевно був схожий, ой блин, ви цього не зробили 560 00:26:06,780 --> 00:26:07,420 хотів цього робити. 561 00:26:07,420 --> 00:26:09,130 Таким чином, ви двічі клацніть Trash або кошика. 562 00:26:09,130 --> 00:26:11,630 Ви ткнули навколо, і ви одужали файл, просто перетягнувши його 563 00:26:11,630 --> 00:26:12,110 звідти. 564 00:26:12,110 --> 00:26:14,420 Отже, ясно, що це не обов'язково видаленням. 565 00:26:14,420 --> 00:26:15,990 >> Добре, що ти розумніший. 566 00:26:15,990 --> 00:26:18,860 Ви знаєте, що просто перетягнути його в Trash або кошика не означає, 567 00:26:18,860 --> 00:26:19,930 Ви очищенні корзини. 568 00:26:19,930 --> 00:26:24,110 Так ви йдете до мене, а ви кажете Очистити кошик або порожній кошика. 569 00:26:24,110 --> 00:26:25,360 Тоді що відбувається? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Так, так воно віддаляється більше. 572 00:26:32,530 --> 00:26:37,660 Але все, що відбувається це. 573 00:26:37,660 --> 00:26:45,350 Комп'ютер забуває, де resume.doc було. 574 00:26:45,350 --> 00:26:47,400 >> Але те, що не змінилося мабуть на картинці? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Біт, 0 і 1, що я стверджую, є На території деяких фізичних аспектів 577 00:26:55,570 --> 00:26:56,280 апаратних засобів. 578 00:26:56,280 --> 00:26:57,110 Вони все ще там. 579 00:26:57,110 --> 00:26:58,930 Це просто комп'ютер забув, що вони є. 580 00:26:58,930 --> 00:27:03,160 >> Так що це по суті звільнив файлу Біти так що вони можуть бути використані повторно. 581 00:27:03,160 --> 00:27:06,940 Але не раніше, ви створюєте декілька файлів, і більше файлів і багато іншого файли 582 00:27:06,940 --> 00:27:12,150 ймовірнісно, ​​ті, 0 і 1, ці магнітні частинки, використовуються повторно, 583 00:27:12,150 --> 00:27:16,220 вгору або правою стороною вгору, для інші файли, 0 і 1. 584 00:27:16,220 --> 00:27:17,980 >> Так що у вас є цей проміжок часу. 585 00:27:17,980 --> 00:27:19,860 І це не передбачуваних Довжина, насправді. 586 00:27:19,860 --> 00:27:22,240 Це залежить від розміру жорсткого диск і скільки файлів у вас є і 587 00:27:22,240 --> 00:27:23,490 як швидко ви зробити нові. 588 00:27:23,490 --> 00:27:27,050 Але є вікно часу, протягом який, що файл все ще чудово 589 00:27:27,050 --> 00:27:27,770 відшкодована. 590 00:27:27,770 --> 00:27:31,050 >> Так що якщо ви коли-небудь використовувати програми, як McAfee або Нортон, щоб спробувати відновити 591 00:27:31,050 --> 00:27:35,680 даними, всі вони роблять намагається відновити цю так звану каталог 592 00:27:35,680 --> 00:27:37,340 з'ясувати, де твій файл був. 593 00:27:37,340 --> 00:27:40,605 А іноді Нортон і скаже: Файл 93% видобутих. 594 00:27:40,605 --> 00:27:42,020 Ну, що ж це значить? 595 00:27:42,020 --> 00:27:45,690 Це просто означає, що деякий інший файл випадково закінчив із використанням, скажімо, 596 00:27:45,690 --> 00:27:48,920 ці біти з вихідного файлу. 597 00:27:48,920 --> 00:27:51,950 >> Так що ж насправді бере участь у відновленні даних? 598 00:27:51,950 --> 00:27:55,720 Ну, якщо у вас немає щось на зразок Нортон попередньо встановлено на Вашому комп'ютері, 599 00:27:55,720 --> 00:27:59,510 Найкраще, що можна іноді зробити, це подивитися на весь жорсткий диск шукає 600 00:27:59,510 --> 00:28:00,510 послідовності бітів. 601 00:28:00,510 --> 00:28:05,350 І одна з тем проблема набору п'ять у тому, що ви будете шукати 602 00:28:05,350 --> 00:28:09,570 аналог жорсткого диска, судово образ компактного флеш-карту від 603 00:28:09,570 --> 00:28:13,660 цифрова камера, пошук 0s і 1, які зазвичай з високою 604 00:28:13,660 --> 00:28:16,720 ймовірності, представляють початок зображення JPEG. 605 00:28:16,720 --> 00:28:21,120 >> І ви, хлопці, можете відновити ці образи на за умови, якщо я бачу цю модель 606 00:28:21,120 --> 00:28:24,380 біти на судово зображення, з висока ймовірність, що знаменує 607 00:28:24,380 --> 00:28:25,650 початку JPEG. 608 00:28:25,650 --> 00:28:29,520 І якщо я бачу той самий шаблон знову, що, ймовірно, знаменує собою початок 609 00:28:29,520 --> 00:28:32,440 інший JPEG, а інший JPEG, а інший у форматі JPEG. 610 00:28:32,440 --> 00:28:34,970 І це, як правило, як відновлення даних буде працювати. 611 00:28:34,970 --> 00:28:37,870 Те, що добре про формат JPEG є хоча формат файлу сам кілька 612 00:28:37,870 --> 00:28:44,400 комплекс, на початку кожного такого файл насправді досить ідентифікованих 613 00:28:44,400 --> 00:28:47,370 і простий, як ви побачите, якщо у вас не зробили. 614 00:28:47,370 --> 00:28:50,270 >> Отже, давайте поглянемо під капот як точно, що було 615 00:28:50,270 --> 00:28:53,360 відбувається, і те, що ці 0 і 1 Тобто, щоб дати вам трохи більше 616 00:28:53,360 --> 00:28:55,330 контекст для цього конкретного виклик. 617 00:28:55,330 --> 00:28:55,510 >> [ВІДТВОРЕННЯ ВІДЕО] 618 00:28:55,510 --> 00:28:58,700 >> -Де Ваш комп'ютер зберігає самі його постійних даних. 619 00:28:58,700 --> 00:29:03,390 Щоб зробити це, дані переміщаються з оперативної пам'яті разом із програмним забезпеченням сигнали, які говорять 620 00:29:03,390 --> 00:29:06,110 жорсткого диска, як зберігати ці дані. 621 00:29:06,110 --> 00:29:09,410 Жорсткий диск Перекласти схем цих сигналів в напругу 622 00:29:09,410 --> 00:29:10,870 коливанням. 623 00:29:10,870 --> 00:29:14,970 Ці, у свою чергу, контролюють жорсткого диска рухомих частин, деякі з декількох 624 00:29:14,970 --> 00:29:17,910 рухомих частин, що залишилися в сучасного комп'ютера. 625 00:29:17,910 --> 00:29:22,130 >> Деякі з сигналів управління двигуном який обертає металевим покриттям пластин. 626 00:29:22,130 --> 00:29:25,470 Ваші дані насправді зберігаються на цих пластинах. 627 00:29:25,470 --> 00:29:28,610 Інші сигнали переміщення чтения / записи голови, щоб читати або 628 00:29:28,610 --> 00:29:30,710 запису даних на пластинах. 629 00:29:30,710 --> 00:29:35,450 Цей механізм настільки точні, що людину Волосся не міг навіть пройти між 630 00:29:35,450 --> 00:29:37,280 керівники і спінінг пластин. 631 00:29:37,280 --> 00:29:40,316 Тим не менш, все це працює на приголомшливою швидкості. 632 00:29:40,316 --> 00:29:40,660 >> [КІНЕЦЬ відеовідтворення] 633 00:29:40,660 --> 00:29:42,190 >> DAVID мала: невелике збільшення глибоке тепер на те, що це 634 00:29:42,190 --> 00:29:44,360 насправді на цих пластинах. 635 00:29:44,360 --> 00:29:44,720 >> [ВІДТВОРЕННЯ ВІДЕО] 636 00:29:44,720 --> 00:29:47,660 >> -Давайте подивимося на те, що ми просто бачила в уповільненому темпі. 637 00:29:47,660 --> 00:29:51,710 Коли короткого імпульсу електрики направляється в головку читання / запису, якщо перевертається 638 00:29:51,710 --> 00:29:54,650 на крихітному для електромагнітних частки секунди. 639 00:29:54,650 --> 00:29:58,970 Магніт створює поле, яке зміни полярності крихітний, крихітний 640 00:29:58,970 --> 00:30:02,850 частина металевих частинок, які покрити кожну поверхню пластин. 641 00:30:02,850 --> 00:30:05,940 >> Модель серія цих крихітних, стягується територій на диску 642 00:30:05,940 --> 00:30:08,470 являє собою один біт Дані в двійковечисло 643 00:30:08,470 --> 00:30:10,530 Система, використовувана на комп'ютерах. 644 00:30:10,530 --> 00:30:13,775 Тепер, якщо струм направляється в одну сторону через головки читання / запису, площа 645 00:30:13,775 --> 00:30:15,970 поляризований в одному напрямку. 646 00:30:15,970 --> 00:30:17,950 Якщо струм направляється в протилежному напрямку 647 00:30:17,950 --> 00:30:19,930 поляризація змінюється на протилежну. 648 00:30:19,930 --> 00:30:22,370 >> Як ви отримуєте дані з жорсткого диска? 649 00:30:22,370 --> 00:30:24,090 Просто повернути процес назад. 650 00:30:24,090 --> 00:30:26,550 Так що це частинки на диску що отримують струм в 651 00:30:26,550 --> 00:30:27,960 головка читання / запису руху. 652 00:30:27,960 --> 00:30:30,700 Всі разом ці мільйони намагнічених сегментів, а також 653 00:30:30,700 --> 00:30:32,160 у вас є файл. 654 00:30:32,160 --> 00:30:36,060 >> Тепер, частини одного файлу може бути розкидані по всьому диску 655 00:30:36,060 --> 00:30:39,970 страви, ніби як безлад паперів на вашому столі. 656 00:30:39,970 --> 00:30:43,500 Так спеціальна додатковий файл відстежує про те, де що знаходиться. 657 00:30:43,500 --> 00:30:45,985 Хіба ви не хотіли б мати щось на зразок цього? 658 00:30:45,985 --> 00:30:46,470 >> [КІНЕЦЬ відеовідтворення] 659 00:30:46,470 --> 00:30:47,820 >> DAVID мала: Добре, напевно, немає. 660 00:30:47,820 --> 00:30:52,070 Так як багато хто з вас, хлопці ріс з цим? 661 00:30:52,070 --> 00:30:53,970 ОК, так що це все менше і менше руки з кожним роком. 662 00:30:53,970 --> 00:30:56,550 Але я радий, що ви принаймні знайомі з ними, тому що це і наша власна 663 00:30:56,550 --> 00:31:00,520 Книга демо, на жаль, помирають дуже повільну смерть тут фамільярність. 664 00:31:00,520 --> 00:31:04,010 >> Але це те, що я, принаймні, ще в середньої школи, використовував використання для резервного копіювання. 665 00:31:04,010 --> 00:31:08,110 І це було дивно, тому що ви може зберігати 1,4 мегабайт на 666 00:31:08,110 --> 00:31:08,930 даний диск. 667 00:31:08,930 --> 00:31:12,260 І це було високої щільності Версія, як зазначено в HD, який має 668 00:31:12,260 --> 00:31:14,240 це означає, перш HD сьогоднішньої відео. 669 00:31:14,240 --> 00:31:16,400 >> Стандартна щільність була 800 кілобайт. 670 00:31:16,400 --> 00:31:18,640 А до цього, були 400 кілобайт дисками. 671 00:31:18,640 --> 00:31:23,120 А до цього, було 5 і 1/4 дюймові диски, які були по-справжньому гнучких, 672 00:31:23,120 --> 00:31:25,680 і трохи ширше і вище ніж ці речі тут. 673 00:31:25,680 --> 00:31:29,150 Але ви можете побачити так звану дискети аспект цих дисків. 674 00:31:29,150 --> 00:31:32,630 >> І функціонально, вони насправді дуже схоже на жорстких дисках у 675 00:31:32,630 --> 00:31:33,570 міру цього типу. 676 00:31:33,570 --> 00:31:37,270 Знову ж, твердотільні диски в нових комп'ютерах працюють трохи інакше. 677 00:31:37,270 --> 00:31:41,530 Але якщо ви перенесете, що мало вкладку метал, ви можете побачити трохи печива, 678 00:31:41,530 --> 00:31:42,560 або блюді. 679 00:31:42,560 --> 00:31:43,830 >> Це не метал, як цей. 680 00:31:43,830 --> 00:31:46,000 Цей насправді деякі дешевші пластикового матеріалу. 681 00:31:46,000 --> 00:31:46,750 І ви можете виду ворушити його. 682 00:31:46,750 --> 00:31:50,310 І ви Trully просто стертий деяких Число бітів або магнітні частинки 683 00:31:50,310 --> 00:31:51,220 з цього диску. 684 00:31:51,220 --> 00:31:52,710 >> Так, на щастя, немає нічого на ньому. 685 00:31:52,710 --> 00:31:55,790 Якщо ця річ знаходиться у дорозі - і охоплюють Ваші очі і ті з ваших сусідів - 686 00:31:55,790 --> 00:31:58,865 Ви можете тільки почасти здійснити це Загалом від оболонки подібне. 687 00:31:58,865 --> 00:32:01,900 Але є трохи весни, так що будьте усвідомлює, що своїми очима. 688 00:32:01,900 --> 00:32:03,620 Так що тепер у вас є дійсно дискету. 689 00:32:03,620 --> 00:32:07,090 >> І те, що про цю чудову в тому, що в тій мірі, що це 690 00:32:07,090 --> 00:32:10,830 дрібного уявлення більшого жорсткий диск, ці речі супер, 691 00:32:10,830 --> 00:32:11,590 супер просто. 692 00:32:11,590 --> 00:32:15,170 Якщо ви щіпку дні його, тепер, що металеві речі вимкнений, і шкірка 693 00:32:15,170 --> 00:32:20,990 їх відкритими, і все, що складається з двох частин повсті і так званий гнучкий диск 694 00:32:20,990 --> 00:32:22,930 з шматком металу на внутрішній стороні. 695 00:32:22,930 --> 00:32:25,990 >> І там йде половина мій диск вміст. 696 00:32:25,990 --> 00:32:27,540 Там іде інша половина з них. 697 00:32:27,540 --> 00:32:31,375 Але це все, що кружляла всередині вашого комп'ютера в минулих. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> І знову ж, щоб поставити це в перспективі, наскільки велика більшість ваших 700 00:32:38,310 --> 00:32:39,560 Жорсткі диски в ці дні? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 гігабайт, терабайт, може бути, в настільний комп'ютер, 2 Тб, 3 703 00:32:46,230 --> 00:32:47,630 терабайт, 4 терабайта, вірно? 704 00:32:47,630 --> 00:32:52,480 Це один мегабайт, плюс-мінус, , Які не можуть навіть відповідати типовим MP3 705 00:32:52,480 --> 00:32:55,310 більше в ці дні, або деякі Схожі музичні файли. 706 00:32:55,310 --> 00:32:59,500 >> Так невеликий сувенір для вас сьогодні, і Також, щоб допомогти те, що контекст 707 00:32:59,500 --> 00:33:03,570 ми будемо приймати як належне Зараз у завдання, поставлене п'ять. 708 00:33:03,570 --> 00:33:04,820 Отже, це ваші. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Отже, дозвольте мені перехід до якої буде провести наступні PSET також. 711 00:33:13,370 --> 00:33:18,470 Так що ми тепер встановлена ​​для цієї сторінки - о, пару оголошення швидко. 712 00:33:18,470 --> 00:33:21,730 >> У цю п'ятницю, якщо ви хочете приєднатися до CS50 на обід, перейдіть на звичайному місці, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 І останній проект - 715 00:33:25,100 --> 00:33:28,520 так в програмі, ми відправили остаточної специфікації проекту вже. 716 00:33:28,520 --> 00:33:31,410 Зрозумійте, що це не означає, це через особливості найближчим часом. 717 00:33:31,410 --> 00:33:33,990 Він відповідав, насправді, лише б отримати ви, хлопці, думав про це. 718 00:33:33,990 --> 00:33:37,620 І дійсно, супер значні відсоток ви будете шукати шляхи вирішення 719 00:33:37,620 --> 00:33:40,780 дипломні проекти на матеріалі, який ми навіть ще не в класі, 720 00:33:40,780 --> 00:33:42,730 але буде вже наступного тижня. 721 00:33:42,730 --> 00:33:45,530 >> Зауважте, однак, що специфікація вимагає кілька різних компонентів 722 00:33:45,530 --> 00:33:46,190 остаточний проект. 723 00:33:46,190 --> 00:33:49,590 По-перше, протягом декількох тижнів, є передпроектні пропозиції, досить випадковий електронній пошті 724 00:33:49,590 --> 00:33:52,760 Вашої TF сказати йому або те, що ви думати про для вашого проекту, з 725 00:33:52,760 --> 00:33:53,650 Немає зобов'язань. 726 00:33:53,650 --> 00:33:56,710 Пропозиція буде вашим зобов'язання, кажучи, ось, це те, що 727 00:33:56,710 --> 00:33:57,770 Я хотів би зробити для мого проекту. 728 00:33:57,770 --> 00:33:58,250 Що ви думаєте? 729 00:33:58,250 --> 00:33:58,650 Занадто великий? 730 00:33:58,650 --> 00:33:59,145 Занадто маленький? 731 00:33:59,145 --> 00:34:00,330 Це керованим? 732 00:34:00,330 --> 00:34:02,230 І ви бачите, специфікації для більш докладної інформації. 733 00:34:02,230 --> 00:34:05,060 >> Пару тижнів після цього є статус доповідь, яка аналогічним чином 734 00:34:05,060 --> 00:34:08,260 випадковий електронній пошті своїм TF сказати, наскільки далеко позаду Ви знаходитесь в своєму остаточному 735 00:34:08,260 --> 00:34:12,360 реалізації проекту, а потім CS50 Hackathon яким кожен 736 00:34:12,360 --> 00:34:17,520 пропонується, який буде подія з 8:00 вечора на одному вечора до 7:00 737 00:34:17,520 --> 00:34:19,150 Ранку наступного дня. 738 00:34:19,150 --> 00:34:22,560 Піца, як я, можливо, згадані в тиждень нулю, Віль бути поданий до 9:00 вечора, 739 00:34:22,560 --> 00:34:24,120 Китайська їжа в 1:00 ранку. 740 00:34:24,120 --> 00:34:27,929 І якщо ви ще не спав о 5:00 ранку, ми відвеземо вас до IHOP на сніданок. 741 00:34:27,929 --> 00:34:31,310 >> Таким чином, Hackathon є одним з найбільш незабутніх вражень у класі. 742 00:34:31,310 --> 00:34:35,290 Потім здійснення пояснюється тим, а Потім кульмінаційної CS50 ярмарок. 743 00:34:35,290 --> 00:34:38,070 Більш детальну інформацію про всіх цих в найближчі тижні. 744 00:34:38,070 --> 00:34:40,739 >> Але давайте повернемося до того, старої школи - 745 00:34:40,739 --> 00:34:41,920 знову, масив. 746 00:34:41,920 --> 00:34:45,040 Так масив був хороший, тому що вирішує проблеми, як ми бачили, тільки 747 00:34:45,040 --> 00:34:49,290 Хвилину тому зі студентськими структурами стає трохи з-під контролю, якщо ми 748 00:34:49,290 --> 00:34:52,405 хочуть мати одного студента, студент два, три студенти, студент точка точка точка, 749 00:34:52,405 --> 00:34:54,400 деякі довільні числа студентів. 750 00:34:54,400 --> 00:34:58,850 >> Так масиви, кілька тижнів тому, напала і вирішив всі наші проблеми не 751 00:34:58,850 --> 00:35:03,340 знаючи заздалегідь, скільки речей деякого типу ми могли б хотіти. 752 00:35:03,340 --> 00:35:07,390 І ми бачили, що структури можуть допомогти нам подальшої організації нашого коду і зберегти 753 00:35:07,390 --> 00:35:11,660 концептуально схоже змінних, таких як ім'я і вдома, разом, так що ми 754 00:35:11,660 --> 00:35:15,570 їх можна розглядати як єдине ціле, всередині якої є дрібні шматки. 755 00:35:15,570 --> 00:35:17,810 >> Але масиви мають деякі недоліки. 756 00:35:17,810 --> 00:35:19,780 Які деякі з недоліків ми зіткнулися 757 00:35:19,780 --> 00:35:22,320 з масивами досі? 758 00:35:22,320 --> 00:35:23,450 Що це? 759 00:35:23,450 --> 00:35:28,130 Фіксований розмір - так що навіть якщо ви, можливо, зможе виділити пам'ять для 760 00:35:28,130 --> 00:35:32,310 Масив, як тільки ви знаєте, скільки студентів у вас є, скільки символів у вас є 761 00:35:32,310 --> 00:35:35,460 від користувача, як тільки ви виділили масиві, ви вид пофарбовані 762 00:35:35,460 --> 00:35:36,740 себе в кут. 763 00:35:36,740 --> 00:35:40,600 >> Тому що ви не можете вставити нові елементи в середину масиву. 764 00:35:40,600 --> 00:35:43,660 Ви не можете вставити більше елементів в кінці масиву. 765 00:35:43,660 --> 00:35:47,750 Дійсно, ви змушені вдаватися до створення абсолютно новий масив, як ми вже обговорювали, 766 00:35:47,750 --> 00:35:49,320 копіюванням старого в нове. 767 00:35:49,320 --> 00:35:52,610 І знову ж, це головний біль, яка GetString займається для вас. 768 00:35:52,610 --> 00:35:56,170 >> Але знову ж таки, ви не можете навіть вставити щось в середину масиву 769 00:35:56,170 --> 00:35:58,200 Якщо ставка не повністю заповнена. 770 00:35:58,200 --> 00:36:03,010 Наприклад, якщо цей масив тут розмірів шість тільки п'ять речей у ньому, 771 00:36:03,010 --> 00:36:06,080 Ну, ви могли просто тактику то на кінці. 772 00:36:06,080 --> 00:36:08,200 Але що, якщо ви хочете вставити щось в середині 773 00:36:08,200 --> 00:36:11,280 масивом, хоча він може мати п'ять із шести речей у ньому? 774 00:36:11,280 --> 00:36:14,250 >> Ну, що ж ми робимо, коли ми були всі наших людських добровольців на сцені в 775 00:36:14,250 --> 00:36:15,110 тижня минулого? 776 00:36:15,110 --> 00:36:18,710 Якби ми хотіли поставити когось тут, або ці люди, як рухатися цим 777 00:36:18,710 --> 00:36:22,540 До речі, ці люди або як рухатися цим До речі, і це стало дорогим. 778 00:36:22,540 --> 00:36:26,950 Переміщення людей всередині Масив закінчилося тим, що додав і вартістю 779 00:36:26,950 --> 00:36:31,240 нам час, тому багато наших N квадрат час роботи, як сортування вставкою, для 780 00:36:31,240 --> 00:36:32,550 Наприклад, в гіршому випадку. 781 00:36:32,550 --> 00:36:36,520 Так масиви є великими, але ви повинні заздалегідь знати, як великий Ви хочете їх. 782 00:36:36,520 --> 00:36:38,030 >> Так добре, от рішення. 783 00:36:38,030 --> 00:36:43,860 Якщо я не знаю заздалегідь, скільки Я студентам могли мати, і я знаю, як тільки 784 00:36:43,860 --> 00:36:47,870 Я вирішую, хоча, я застряг з цим багато студентів, то чому б мені просто не завжди 785 00:36:47,870 --> 00:36:51,740 виділити два рази більше місця як я міг би думаю, що потрібно? 786 00:36:51,740 --> 00:36:54,450 Хіба це не розумне рішення? 787 00:36:54,450 --> 00:36:58,240 >> Реально, я не думаю, що ми знадобиться більше 50 слотів 788 00:36:58,240 --> 00:37:02,190 в масив для середнього класу, так що давайте просто округлити. 789 00:37:02,190 --> 00:37:07,040 Я зроблю 100 слотів в моєму масиві, всього так що ми можемо виразно отримати 790 00:37:07,040 --> 00:37:10,330 кількість студентів, яких я очікував бути в деякому середнього класу. 791 00:37:10,330 --> 00:37:14,320 Так чому б не оточити і виділити більше пам'яті, зазвичай, для масиву 792 00:37:14,320 --> 00:37:16,290 ніж ви думаєте, ви могли б навіть потрібно? 793 00:37:16,290 --> 00:37:20,190 Що це просте буксирування до цієї ідеї? 794 00:37:20,190 --> 00:37:21,440 >> Ви просто витрачаєте пам'яті. 795 00:37:21,440 --> 00:37:25,350 Буквально кожну програму ви пишете те , Може бути, використовуєте в два рази більше пам'яті, ніж 796 00:37:25,350 --> 00:37:26,680 вам дійсно потрібно. 797 00:37:26,680 --> 00:37:28,990 І, що просто не хочеться Особливо елегантне рішення. 798 00:37:28,990 --> 00:37:31,990 Крім того, він просто зменшує Ймовірність проблема. 799 00:37:31,990 --> 00:37:35,300 Якщо вам пощастило мати популярний курс один семестр і у вас є 101 800 00:37:35,300 --> 00:37:39,610 студентів, ваша програма як і раніше принципово стикається з тією ж проблемою. 801 00:37:39,610 --> 00:37:44,280 >> Так на щастя, є рішення це оголошення всі наші проблеми у вигляді 802 00:37:44,280 --> 00:37:46,790 структур даних, які складніші, ніж ті 803 00:37:46,790 --> 00:37:47,970 ми бачили дотепер. 804 00:37:47,970 --> 00:37:50,530 Це, я стверджую, є пов'язаною списком. 805 00:37:50,530 --> 00:37:51,920 Це список чисел - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26 і 34 - 807 00:37:54,970 --> 00:38:00,120 , Які були пов'язані один з одним за допомогою про те, що я намалював, як стріли. 808 00:38:00,120 --> 00:38:03,580 >> Іншими словами, якби я хотів, щоб представляти масивом, що я міг зробити 809 00:38:03,580 --> 00:38:04,910 щось на зразок цього. 810 00:38:04,910 --> 00:38:07,310 І я покладу це на накладні через хвилину. 811 00:38:07,310 --> 00:38:09,970 Я міг би зробити - 812 00:38:09,970 --> 00:38:12,520 привіт, все в порядку. 813 00:38:12,520 --> 00:38:14,470 Залишайтеся на зв'язку. 814 00:38:14,470 --> 00:38:17,360 Новий комп'ютер тут, ясно - 815 00:38:17,360 --> 00:38:18,090 Все в порядку. 816 00:38:18,090 --> 00:38:21,730 >> Так що, якщо у мене є ці числа в масиві - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 не обов'язково в масштабі. 819 00:38:30,530 --> 00:38:33,730 Гаразд, ось моя масиву - 820 00:38:33,730 --> 00:38:34,980 Боже мій. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Гаразд, ось моя масиву. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 О, мій бог. 825 00:38:45,050 --> 00:38:48,820 >> [Сміється] 826 00:38:48,820 --> 00:38:49,440 >> DAVID мала: прикидатися. 827 00:38:49,440 --> 00:38:52,330 Це занадто багато зусиль, щоб повернутися і виправити це, так що - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Так що у нас є цей масив 9, 17, 22, 26 і 34. 830 00:38:57,650 --> 00:39:00,260 Для тих з вас може бачити прикре непорозуміння я тільки що зробив, 831 00:39:00,260 --> 00:39:00,830 там це. 832 00:39:00,830 --> 00:39:04,490 >> Тому я стверджую, що це дуже ефективним рішенням. 833 00:39:04,490 --> 00:39:07,310 Я виділив стільки як цілі Мені потрібно - раз, два, три, 834 00:39:07,310 --> 00:39:09,100 чотири, п'ять, або шість - 835 00:39:09,100 --> 00:39:11,660 і я потім зберігаються номери всередині цього масиву. 836 00:39:11,660 --> 00:39:15,220 Але припустимо, то, я хочу вставити значення як число 8? 837 00:39:15,220 --> 00:39:16,100 Ну, куди це йде? 838 00:39:16,100 --> 00:39:18,530 Припустимо, я хочу, щоб вставити число, наприклад 20. 839 00:39:18,530 --> 00:39:19,790 Ну, куди це йде? 840 00:39:19,790 --> 00:39:23,160 Десь там в середині, або число 35 має піти 841 00:39:23,160 --> 00:39:24,010 десь в кінці. 842 00:39:24,010 --> 00:39:25,320 Але я все з космосу. 843 00:39:25,320 --> 00:39:29,120 >> І таким чином, це є фундаментальною проблемою масивів яке є рішенням. 844 00:39:29,120 --> 00:39:32,280 Я стверджував, хвилину тому, GetString вирішує цю проблему. 845 00:39:32,280 --> 00:39:37,380 Якщо Ви хочете вставити шостим номером У цей масив, то, що принаймні один 846 00:39:37,380 --> 00:39:40,090 рішення, яке ви можете спертися напевно, так само, як ми робимо з GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Що це? 849 00:39:46,030 --> 00:39:48,190 >> Ну, зробити його більше, тим легше сказати, ніж зробити. 850 00:39:48,190 --> 00:39:52,810 Ми не можемо обов'язково робити масиву більше, але що ми можемо зробити? 851 00:39:52,810 --> 00:39:56,570 Зробити новий масив, який більше, розміром 6, а може, розмір 10, якщо ми хочемо 852 00:39:56,570 --> 00:40:00,490 випередити речі, а потім скопіювати старого масиву в новий, а потім 853 00:40:00,490 --> 00:40:01,680 звільнити старого масиву. 854 00:40:01,680 --> 00:40:05,770 >> Але те, що час роботи Тепер цього процесу? 855 00:40:05,770 --> 00:40:09,870 Це велике О від N, так як копіювання буде коштувати вам кілька одиниць 856 00:40:09,870 --> 00:40:13,480 часу, так що не так ідеально, якщо ми повинні виділити новий масив, який буде 857 00:40:13,480 --> 00:40:15,610 споживати в два рази більше пам'яті тимчасово. 858 00:40:15,610 --> 00:40:16,660 Скопіюйте старі на нові - 859 00:40:16,660 --> 00:40:18,800 Я маю на увазі, це просто головний біль, яка , Знову ж таки, чому ми написали 860 00:40:18,800 --> 00:40:19,920 GetString для вас. 861 00:40:19,920 --> 00:40:21,380 >> Так що ми могли б зробити замість цього? 862 00:40:21,380 --> 00:40:25,000 Ну, що, якщо наші структури даних насправді має прогалини в ньому? 863 00:40:25,000 --> 00:40:30,790 Припустимо, що я розслабляюся моєї мети, мають безперервні блоки пам'яті, де 9 864 00:40:30,790 --> 00:40:34,500 знаходиться поруч з 17, який поруч з 22, і так далі. 865 00:40:34,500 --> 00:40:39,570 >> І припустимо, що 9 може бути тут, в Оперативної пам'яті, і 17 може бути тут, в оперативній пам'яті, 866 00:40:39,570 --> 00:40:40,990 і 22 може бути тут, в оперативній пам'яті. 867 00:40:40,990 --> 00:40:43,610 Іншими словами, я не потребую них навіть спина до спини більше. 868 00:40:43,610 --> 00:40:47,850 Мені просто потрібно якось нитку в голку в кожному з цих цифр, або кожен 869 00:40:47,850 --> 00:40:51,010 з цих вузлів, як ми будемо називати прямокутниками, як я намалював їх, 870 00:40:51,010 --> 00:40:55,670 пам'ятаю, як дістатися до останнього такий вузол від першого. 871 00:40:55,670 --> 00:40:59,940 >> Так у чому ж конструкції програмування ми бачили зовсім недавно, з якою я 872 00:40:59,940 --> 00:41:03,030 можна реалізувати, що нитка, або зроблені тут, з якою я можу 873 00:41:03,030 --> 00:41:05,430 здійснювати ці стрілки? 874 00:41:05,430 --> 00:41:06,500 Тому покажчики, чи не так? 875 00:41:06,500 --> 00:41:09,560 Якби я виділити не тільки Інтелект, але вузол - і 876 00:41:09,560 --> 00:41:10,810 вузол, я просто означає контейнері. 877 00:41:10,810 --> 00:41:12,900 І візуально, я маю на увазі прямокутник. 878 00:41:12,900 --> 00:41:16,420 Так вузла мабуть потрібні містити два значення - 879 00:41:16,420 --> 00:41:21,490 цілочисельне себе, а потім, як це випливає з нижню половину прямокутника 880 00:41:21,490 --> 00:41:23,010 достатньо місця для Int. 881 00:41:23,010 --> 00:41:26,130 >> Так що подбати про це заздалегідь тут, наскільки великий цей вузол, це 882 00:41:26,130 --> 00:41:27,170 Контейнер йдеться? 883 00:41:27,170 --> 00:41:29,250 Скільки байт для цілочисельне? 884 00:41:29,250 --> 00:41:31,310 Імовірно 4, якщо це так само, як звичайно. 885 00:41:31,310 --> 00:41:33,270 А потім, скільки байт для покажчика? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Так що цей контейнер або цей вузол, є буде 8 байт структури. 888 00:41:37,940 --> 00:41:41,760 О, і це щасливий збіг, що ми точно також це поняття 889 00:41:41,760 --> 00:41:44,400 структура або структура C. 890 00:41:44,400 --> 00:41:48,890 >> Тому я стверджую, що я хочу зробити крок до цього більш складні 891 00:41:48,890 --> 00:41:52,560 реалізація список номерів, зв'язаний список номерів, мені потрібно зробити 892 00:41:52,560 --> 00:41:56,920 трохи більше мислення фронт і оголосити не тільки Інтелект, але структура 893 00:41:56,920 --> 00:41:58,620 , Що я подзвоню, умовно Тут, вузла. 894 00:41:58,620 --> 00:42:01,630 Ми могли б назвати її як завгодно,, але вузол буде тематичним в багатьох 895 00:42:01,630 --> 00:42:03,560 з речей, ми почнемо розглядати зараз. 896 00:42:03,560 --> 00:42:06,480 >> Усередині цього вузла буде Int N. 897 00:42:06,480 --> 00:42:09,350 А потім цей синтаксис, трохи дивно на перший погляд - 898 00:42:09,350 --> 00:42:12,960 Структура вузла * наступний. 899 00:42:12,960 --> 00:42:16,900 Ну графічно, що це таке? 900 00:42:16,900 --> 00:42:21,000 Тобто нижня половина прямокутник, який ми бачили 901 00:42:21,000 --> 00:42:22,730 просто мить тому. 902 00:42:22,730 --> 00:42:27,600 >> Але чому я кажу структура вузла * а не тільки вузлом *? 903 00:42:27,600 --> 00:42:31,370 Тому що, якщо цей покажчик вказує на іншому вузлі, це просто 904 00:42:31,370 --> 00:42:32,760 адреса вузла. 905 00:42:32,760 --> 00:42:35,630 Це узгоджується з того, що ми обговорювали про покажчики до цих пір. 906 00:42:35,630 --> 00:42:39,690 Але чому, якщо я стверджую, ця структура називається вузлом, я повинен сказати, що структура 907 00:42:39,690 --> 00:42:42,660 вузлом всередині тут? 908 00:42:42,660 --> 00:42:43,190 >> Саме так. 909 00:42:43,190 --> 00:42:46,490 Це свого роду дурні реальність C. Визначення типу, так би мовити, не має 910 00:42:46,490 --> 00:42:47,220 сталося. 911 00:42:47,220 --> 00:42:48,510 З супер буквально. 912 00:42:48,510 --> 00:42:51,050 Вона читає ваш код зверху вниз, зліва направо. 913 00:42:51,050 --> 00:42:54,930 І, поки не зустріне, що крапка з комою на Суть, думаю, що не 914 00:42:54,930 --> 00:42:57,590 існувати як тип даних? 915 00:42:57,590 --> 00:42:59,060 Вузла, в лапках вузла. 916 00:42:59,060 --> 00:43:03,050 >> Але через більш детальний Я зробив заяву на першій лінії - 917 00:43:03,050 --> 00:43:05,340 ЬурейеЕ вузла структури - 918 00:43:05,340 --> 00:43:08,790 тому, що був на першому місці, перед фігурні дужки, що ніби як 919 00:43:08,790 --> 00:43:11,800 попереднього навчання Clang, що, ви Знаєте що, дайте мені структури 920 00:43:11,800 --> 00:43:13,570 називається структура вузла. 921 00:43:13,570 --> 00:43:16,270 Чесно кажучи, я не люблю називати речі Структура вузла, вузла структури всіх 922 00:43:16,270 --> 00:43:17,090 протягом всього мого коду. 923 00:43:17,090 --> 00:43:20,660 Але я буду використовувати його тільки один раз, тільки всередині, так що я можу ефективно 924 00:43:20,660 --> 00:43:25,010 створити свого роду циклічне посилання, а не покажчик на себе такої, але 925 00:43:25,010 --> 00:43:29,400 покажчик на інший ідентичного типу. 926 00:43:29,400 --> 00:43:32,330 >> Ось і виходить, що в структурі даних як це, є кілька 927 00:43:32,330 --> 00:43:34,470 операції, які можуть бути Цікавлять нас. 928 00:43:34,470 --> 00:43:37,460 Ми, можливо, захочете, щоб вставити до списку, як це. 929 00:43:37,460 --> 00:43:39,850 Ми, можливо, захочете видалити зі списку, як це. 930 00:43:39,850 --> 00:43:43,490 Ми можемо захотіти пошук у списку для значення, або в більш загальному ходу. 931 00:43:43,490 --> 00:43:46,410 І траверс просто химерний спосіб почала говорити на лівій і перемістити всі 932 00:43:46,410 --> 00:43:47,650 до упору вправо. 933 00:43:47,650 --> 00:43:52,640 >> І зауважте, навіть з цим трохи більш складні структури даних, не кажучи 934 00:43:52,640 --> 00:43:56,510 мені пропонують, щоб ми можемо запозичити деякі з ідеї в останні два тижні і 935 00:43:56,510 --> 00:43:58,410 реалізувати функцію називають пошук, як це. 936 00:43:58,410 --> 00:44:01,360 Це збирається повернути істинним або помилковими, вказуючи, так чи 937 00:44:01,360 --> 00:44:03,390 Ні, N в списку. 938 00:44:03,390 --> 00:44:05,960 Другий аргумент є покажчиком до списку собі, так 939 00:44:05,960 --> 00:44:07,920 покажчик на вузол. 940 00:44:07,920 --> 00:44:10,350 >> Все, що я збираюся зробити, це те заявляю тимчасову змінну. 941 00:44:10,350 --> 00:44:12,730 Ми назвемо це PTR за угодою, для покажчика. 942 00:44:12,730 --> 00:44:15,220 І я призначу його рівним початок списку. 943 00:44:15,220 --> 00:44:16,680 >> А тепер помічаю той час циклу. 944 00:44:16,680 --> 00:44:20,640 До тих пір поки вказівник не одно до нуля, я збираюся перевірити. 945 00:44:20,640 --> 00:44:24,520 Чи є стрілка покажчика N рівні N, який був переданий в? 946 00:44:24,520 --> 00:44:26,410 І почекайте хвилину - нові частина синтаксису. 947 00:44:26,410 --> 00:44:29,324 Що таке стрілка раптом? 948 00:44:29,324 --> 00:44:30,574 Так? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Саме так. 951 00:44:34,810 --> 00:44:38,860 Так у той час як кілька хвилин тому, ми використовували точкову нотацію для доступу щось 952 00:44:38,860 --> 00:44:43,080 Всередині структури, якщо змінна Ви не структури 953 00:44:43,080 --> 00:44:47,420 себе, але покажчик на структуру, На щастя, частина синтаксису, 954 00:44:47,420 --> 00:44:48,620 нарешті, має інтуїтивний сенс. 955 00:44:48,620 --> 00:44:52,360 Стрілка означає слідувати за покажчиком, як наші стрілки як правило, означає 956 00:44:52,360 --> 00:44:56,570 графічно, і йти у Дані поля всередині. 957 00:44:56,570 --> 00:44:59,700 Так стрілка те ж саме, точка, але ви використовуєте його, коли у вас є вказівник. 958 00:44:59,700 --> 00:45:05,270 >> Так просто, щоб резюмувати те, якщо поле N Всередині структури, званих покажчик 959 00:45:05,270 --> 00:45:07,760 дорівнює дорівнює N, повернутися правда. 960 00:45:07,760 --> 00:45:11,970 В іншому випадку, ця лінія тут - покажчик одно покажчик наступного. 961 00:45:11,970 --> 00:45:17,540 Так що ж це робить, зауважте, якщо я я в даний час вказує на структуру 962 00:45:17,540 --> 00:45:21,430 містить 9 і 9 Не число Я шукаю - Припустимо, я шукаю 963 00:45:21,430 --> 00:45:22,830 для N дорівнює 50 - 964 00:45:22,830 --> 00:45:25,930 Я збираюся оновити свій тимчасовий покажчик не вказувати в цьому вузлі 965 00:45:25,930 --> 00:45:31,190 більше, але покажчика стрілки поруч, яка збирається поставити мене сюди. 966 00:45:31,190 --> 00:45:34,270 >> Тепер я зрозумів, вихор Введення. 967 00:45:34,270 --> 00:45:37,380 У середу, ми насправді зробити це з деякими людьми і з деякими більш 968 00:45:37,380 --> 00:45:38,900 коду в більш повільному темпі. 969 00:45:38,900 --> 00:45:42,990 Але зрозумійте, ми зараз роблять наші дані більш складні структури, щоб наші 970 00:45:42,990 --> 00:45:45,780 Алгоритми можете отримати більш ефективні, які буде умовою для 971 00:45:45,780 --> 00:45:50,500 PSET шість, коли ми завантажуємо в, знову ж таки, ті, 150000 слів, але потрібно зробити так 972 00:45:50,500 --> 00:45:55,650 ефективно, і, в ідеалі, створюють програма, яка працює для наших користувачів не в 973 00:45:55,650 --> 00:46:00,460 лінійної, а не російською мовою в квадраті, а в постійний час, в ідеал. 974 00:46:00,460 --> 00:46:02,300 >> Побачимося в середу. 975 00:46:02,300 --> 00:46:07,240 >> СЛУХАЛИ: Наступного CS50, Девід забуває про своє базовому варіанті. 976 00:46:07,240 --> 00:46:12,770 >> DAVID мала: І от як ви посилаєте текстовими повідомленнями з C. Які - 977 00:46:12,770 --> 00:46:14,020 >> [Різні ТЕКСТ ПОВІДОМЛЕННЯ Звуки повідомлень] 978 00:46:14,020 --> 00:46:19,734