DAVID мала: Добре, з поверненням. Це CS50. Це початок тижня сім. Так що це було деякий час, так що я думав, що ми прийняти побіжний тур, де ми зупинилися і де ми тепер збираємося. Так що ця річ тут, можливо, доведеться викликало деяку тугу на перший погляд. Але, сподіваюся, ви починаєте акліматизуватися до того, що це позначає тут - зірка представляє покажчик, який тільки те, що, з точки зору більш непрофесіонала? Так що це адресу. Так що це адреса щось в пам'яті. І ми почали відігніть верств Пару тижнів тому, тощо GetString та інших подібних функцій Весь цей час поверталися Адреси речі в пам'яті, як і адресу першого символу в деякої послідовності. Таким чином, ми також ввели Valgrind, яка Ви почнете використовувати для цієї проблеми встановлена, зокрема, для наступного Проблема також встановлений. І Valgrind і що робить для нас? При цьому перевірка на витоки пам'яті, і це також перевіряє зловживання пам'яті. Він може, з деякою вірогідністю, виявити, якщо код стосуватиметься пам'яті що це просто не потрібно. Так що не обов'язково витоку, але якщо ви виходять за межі деякого масиві, а як ви виконаєте VALGRIND і викликають таку поведінку в той час як Valgrind працює у вашій програмі працює всередині нього, ви отримаєте повідомлення, як це - "Невірна писати про розміром 4 ", який, нагадаємо пару тижнів тому означало, що я випадково як на одного десяткового занадто далеко за межами масиву. І таким розміром 4 означає тут розмір цього конкретного внутр. Так прийміть запевнення в тому, що valgrind є вихід, формат його, просто звірячим. Це дійсно важко зрозуміти, через безлад за цікаву інформацію. Отже, що ми зробили тут просто уривок деякі з пари більш цікаві рядки. Але розумію, що 80% valgrind є Вихід буде трохи відволікання. Просто шукайте моделі, як ці - недійсним права, недійсні читати, 40 байт і деяка кількість блоків виразно втрачено, ключові слова, як, що. І те, що ви, ми сподіваємося побачити деякий виду слідів, які функції помилка насправді дюйма У цьому випадку тут, в тому, що лінія мій код помилки мабуть? 26 у файлі з іменем memory.c, який був Наприклад, ми грали з в той час. Так що це, ймовірно, не в Malloc. Це було, мабуть, в своєму коді замість цього. Таким чином, ми побачимо це знову і знову найближчим часом. Так SCANF, це сталося в Пару форми досі. Ми бачили Sscanf коротко. Це було щось поруч Ви пірнули у вашій підготовка до вікторини. І SCANF насправді те, що CS50 Бібліотеки використовують під капот протягом досить довгого часу для того, для отримання даних від користувача. Наприклад, якщо я переїду до CS50 Прилад тут, дозвольте мені відкрити Наприклад сьогодні, що називається SCANF-0.c І це супер просто. Це всього лише кілька рядків коду. Але це показує, дійсно, як GetInt працював весь цей час. У цій програмі, у рядку 16 Зверніть увагу, що я заявляю Int. Так що ніяких покажчиків, нічого магічного там, просто Int. Потім у рядку 17, я запропонує користувача число, будь ласка. Потім, в кінці 18, я використовую SCANF тут. І я вказав, ніби як Е, що я очікую цитуючи кінець цитати відсотків я. Так відсотків я, звичайно, позначає Int. Але зверніть увагу на те, що другий Аргумент SCANF є. Як би ви описали другий Аргумент після коми? Що це? Це адреса х. Так що це корисно, тому що, надаючи SCANF з адресою х, те, що робить , Які дозволяють цій функції робити? Не просто йдуть туди, але і робити те, що? Внести зміни в ньому. Тому що ви можете піти туди, це свого роду як карта до місця розташування в пам'яті. І до тих пір, поки ви надаєте SCANF або будь-яку функцію з такої карти, які Функція може піти туди, і не тільки подивіться значення, але він також може змінити це значення, яке є корисним, якщо Мета в житті є SCANF сканувати вхідні дані від користувача, зокрема з клавіатури. І F позначає відформатованих, так само, як Е, F позначає відформатованих Рядок, яку необхідно роздрукувати. Коротше кажучи, ця лінія 18 просто говорить: спробуйте прочитати Цілочисельне від користувача клавіатури, і зберігає його всередині х, у будь-яку адресу, х, виявляється, живе в. А потім, нарешті, рядок 19 просто говорить, спасибо за Інтернешнл, в цьому випадку. Отже, дозвольте мені піти далі і зробити це. Тому переконайтеся, SCANF 0. Дозвольте мені йти вперед і збільшення масштабу Я піду і виконати це з точками слеш SCANF 0. Номер, ласка? 50. Дякуємо за 50. Так що це досить просто. Тепер те, що він не робить? Це не робить цілий букет перевірки помилок. Наприклад, якщо я не буду співпрацювати, і я не вводити номер, але замість цього я написати щось на кшталт "привіт", це просто странно. І ось одна з речей, CS50 бібліотека була для нас робити для деяких часу є те, що reprompting і reprompting. Повторити фразу відкликання в cs50.c, і це причина того, що в GetInt бібліотеки CS50 фактично весь купа рядків, тому що ми перевірка на дурні речі, як це. Ж користувач не дають нам, по суті, Цілочисельне? Він або вона дати нам щось подібне алфавітним лист? Якщо це так, ми хочемо, щоб виявити , Що і кричати на них. Але все стає цікавішим У наступному прикладі. Якщо я піду в SCANF-1с, те, що одна річ, яка докорінно змінила в Наступний приклад? Я використовую символ *, звичайно, замість Int. Так що це цікаво, тому що символ *, Нагадаємо, що насправді просто Те ж саме у вигляді рядка. Таким чином, схоже, може бути, це супер Проста реалізація GetString. Але я відігнув шару CS50 з бібліотеки, так що я виклику цього символ * зараз. Отже, давайте подивимося, де, якщо завгодно, ми робимо неправильно. Рядок 17 - Я ще раз кажу, будь ласка, дайте мені що-небудь, У цьому випадку, рядок. І тоді в наступному рядку, я називаю SCANF, знову, надавши йому формат коду, але ця пора відсотків. І то цього разу, я надавши йому буфера. А тепер зверніть увагу, що я не використовую амперсанд. Але чому в тому, що тут, ймовірно, добре? Адже що таке буфер вже? Це вже покажчик. Вже адресою. І давайте це слово "плутають", дозвольте мені назвати його просто з, наприклад, для простота. Але я назвав його тому, що в буфер Взагалі, в програмуванні, якщо у вас є частина пам'яті, яка дійсно рядок просто є, ви могли б назвати це буфер. Це місце для зберігання інформації. Схожі речі, як YouTube, коли вони буфер, тому говорити, що просто означає, що він завантаженням бітів з Інтернет та зберігаючи їх у Локальний масив, місцевий шматок пам'яті, так що ви можете дивитися їх без це пропуск або висить на Ви під час відтворення. Так що проблема тут, хоча, , Тому що я кажу SCANF, очікують рядка від користувача. Ось адреса шматок пам'яті. Помістіть цей рядок там. Чому це пов'язане дати нам неприємності, правда? Що це? Чи можу я отримати доступ до що частина пам'яті? Ви знаєте, я не знаю. Тому що володіє буфером инициализирован до чого? Не зовсім так. І так це те, що ми називаємо сміття значення, яке не є офіційним словом. Це просто означає, що ми поняття не маю, які біти всередині з чотирьох байт, які Я виділив в якості буфера. Я не називається Malloc. Я безумовно не називається GetString. Так що хто знає, що насправді всередині буфера? І все ж говорити SCANF наосліп, туди і покласти все, що ввів користувач. Так що, ймовірно, викличе у нашому коді, якщо ми його запустити? Напевно сегментації. Може й ні, але, ймовірно, сегментації. І я кажу, може бути, не тому, що іноді Ви робите, іноді Ви не отримуєте сегментації. Іноді вам просто щастить, але це тим не менше буде помилка в нашій програмі. Отже, дозвольте мені йти вперед і скласти цей. Я збираюся зробити це по-старому школі. Так брязкотом тире 0, SCANF-1, SCANF-1с, Enter. Упс, занадто старої школи. Давайте подивимося. Де я? О, символ * буфера. О, спасибі - Зберегти, OK - дуже стара школа. Гаразд, це було в той час. Так що я тільки що збережений файл після робить, що тимчасові змінити хвилину тому. А тепер я зібрав це вручну за допомогою Clang. І тепер я збираюся йти вперед і запустити SCANF-1, Enter. Струнний ласка. Я наберіть "привіт". А тепер, ось де, чесно кажучи, Е може трохи дратувати. Це насправді не збирається сегментації в цьому разі. Printf стоїть дещо окремо, тому що це так супер широко використовується, що істотно Е робить нам ласку і реалізації, це не дійсний покажчик. Дозвольте мені взяти це на себе, щоб просто роздрукувати в нульові дужки, навіть хоча це і не обов'язково, що ми самі очікували. Тому ми не можемо дійсно легко викликати сегментації з цим, але очевидно, що це не поведінка я хотів. Так в чому ж просте рішення? Ну, а в SCANF-2, дозвольте мені запропонувати, що а насправді просто виділення символ *, дозвольте мені бути трохи розумніші, про це, і дозвольте мені виділити буфер як послідовність з 16 символів. Так що я можу зробити це в кілька способів. Я міг би використовувати абсолютно Malloc. Але я можу повернутися в тиждень два, коли Мені просто потрібно було цілий букет символів. Ось тільки масив. Отже, дозвольте мені замість перевизначити буфер бути масивом з 16 символів. І тепер, коли я проходжу в буфер - , І це те, що ми не говорити в тиждень два - але ви можете розглядати масив як хоча це адреси. Технічно, як ми бачили, вони трохи по-іншому. Але SCANF не заперечуватиме, якщо ви передаєте його ім'я масиву, тому що те, Clang зробить для нас по суті лікувати ім'я цього масиву в якості адреса блоку 16 байт. Так що це краще. Це означає, що тепер, коли я можу, ми сподіваємося, виконати наступне. Дозвольте мені змінити масштаб на мить і роблять SCANF-2, складений в порядку. Зараз зроблю отримав слеш SCANF-2. Струнний ласка. "Hello". І це здавалося, працювали в цей раз. Але хтось може запропонувати сценарій , В якому він не може все ще працює? Так? Щось довше 16 символів. А насправді, ми можемо бути трохи більш точним. Щось довше, ніж 15 символів, тому що дійсно ми повинні мати на увазі, що нам потрібно, що зворотна коса риска нуля неявно в кінці рядка, яка осторонь, як правило, SCANF піклуватися про нас. Отже, дозвольте мені зробити щось подібне - Іноді ми можемо тільки залишити все як є, що. Отже, ми тепер індукованих наші помилки сегментації. Чому? Тому що я набрав в більш ніж 15 символів, і так ми фактично торкнувся пам'яті, що я насправді не повинен був. Так що насправді рішення тут? Ну, а що якщо нам потрібно більш довгий рядок? Ну, ми, можливо, зробити це 32 байт. Ну, а якщо це не досить довго? Як щодо 64 байт? Що робити, якщо це не досить довго? Як щодо 128 або 200 байт? Те, що дійсно є рішення тут, в загальному випадку, якщо ми не знаємо, в заздалегідь, що користувач збирається друкувати? Це просто якась велика біль в дупі, чесно кажучи, саме тому CS50 бібліотеці є кілька десятків рядків коду, які в сукупності реалізують GetString рядок таким чином, що ми не повинні знати заздалегідь, що користувач збирається ввести. Зокрема, якщо ви подивитеся на cs50.c від двох тижнів тому, ви побачите, , Що насправді робить GetString Не використовуйте SCANF таким чином. Швидше, він читає один символ за один раз. Тому що той, хороша річ про читання одного символу, ми можемо гарантувати собі завжди мати принаймні один символ. Я можу просто оголосити символ, а потім прийняти ці воістину кроки дитини просто читати один символ в час від клавіатури. І потім, що ви побачите GetString робить це кожен раз, коли закінчується, скажімо, 16 байт пам'яті, вона використовує Malloc, або двоюрідний брат його, щоб виділити більше пам'яті, копіювання старих пам'яті в нових, а потім поповзом уздовж, отримуючи один символ за один раз, і коли воно закінчується, що шматок пам'яті, викидає його, захвати більший шматок пам'яті, копіює старі в нові і повторює. І це дійсно біль насправді реалізувати щось само просто, як отримання даних від користувача. Таким чином, ви можете використовувати SCANF. Ви можете використовувати інші аналогічні функції. І багато підручників та онлайн приклади роблять, але вони все уразливі до проблем, як ця. І в кінцевому рахунку, отримати сегментації вид дратує. Це не добре для користувача. Але в гіршому випадку, те, що робить це принципово покласти ваші код ризику? Свого роду атаки, потенційно. Ми говорили про одну з таких атак - переповнення стека. Але в цілому, якщо ви маєте на це право Переповнення буфера, як ми зробили Пару тижнів тому, тільки з письмової більше, ніж "привіт" в стеку, ви дійсно може взяти на себе, потенційно, комп'ютер, або, принаймні, отримати дані, які в не належить вам. Коротше кажучи, саме тому у нас є цих навчальних коліс. Але тепер, ми починаємо знімати їх, як наші програми більше не потрібна, обов'язково, введення від користувача. Але у випадку виникнення проблем встановити шість, ваш внесок буде надходити з величезного файл словника з деякими 150 гаком тисяч слів. Так що вам не доведеться турбуватися про довільного користувача введення. Ми дамо вам деякі припущення про цей файл. Будь-які питання за вказівниками або SCANF або введення даних користувачем у цілому? Гаразд, швидкий погляд то на одного задня теми від двох тижнів тому. І це було це поняття структури. Не те, що - це поняття Побудуємо, яке було що? Що структури зробити для нас? Визначити - вибачте? Визначити тип змінної. Так ніби. Ми насправді об'єднання двох темах. Так що з ЬурейеЕ, згадаємо, що ми можемо оголосити типу нашої, як і синонім, як і рядок для символ *. Але використання ЬурейеЕ і структури, ми можемо створити дійсно наші власні структури даних. Наприклад, якщо я повернуся в Gedit тут всього мить, і я йду вперед і зробити щось подібне, дозвольте мені зберегти це як, скажімо, structs.c тимчасово, я просто хочу, йти вперед і включають standardio.h, тап_п недійсними. А потім тут, припустимо, що я хочу написати програму, яка зберігає кілька студентів з декількох будинку, наприклад. Так що це як registrarial даних якийсь. Так що, якщо мені потрібно назву одного студента, я може зробити щось на зразок символу ім'я *, і я зроблю щось на кшталт - Насправді, давайте використовувати бібліотеку CS50 на мить, щоб зробити це трохи простіше, так що ми можемо запозичити тих десятків рядків коду. І давайте просто тримати його проста. Ми будемо тримати це рядок, і тепер GetString. Тому я стверджую, тепер, коли я зберігається назва деяких студентів, і будинок небудь студент, просто за допомогою змінних як ми робили і на тиждень один. Але припустимо, що я тепер хочу підтримати кілька студентів. Гаразд, так що мої інстинкти робити Рядок name2, отримує GetString, рядок Дом2 отримує GetString. А потім наш третій студент, давайте зробимо name3 GetString. Гаразд, так що це, ми сподіваємося, разюче Ви як виду нерозумно, тому що цей процес не буде дійсно ніколи скінчиться, і він просто буде зробити мій код виглядає гірше і все гірше і гірше. Але ми вирішили це теж в тиждень два. Що представляла з себе відносно чистим рішенням коли у нас було кілька змінних той же тип даних, які все зв'язані, але ми не хотіли цього жорстокого безлад з однойменних змінних? Що ми зробили, а? Так що я думаю, що я почув, що кілька місць. У нас було безліч. Якщо ви хочете кілька примірників щось, чому б нам не очистити це все і просто сказати, дайте мені Масив обзивали? А поки, давайте жорсткий 3 коду. А потім дати мені ще один масив звані будинки, і нехай мене Тепер жорсткий код 3. І я масово очищені безлад, що я тільки що створили. Тепер, я як і раніше жорстко 3, але навіть 3 може динамічно виходити від користувача, або агду або тому подібне. Так що це вже чистіше. Але те, що дратує в цьому те, що Тепер, навіть якщо звуть якось принципово пов'язане з студентський дім - це студент, що я дійсно хочемо представити - Тепер у мене є два масиви, які паралельні У тому сенсі, що вони однаковий розмір, і імена кронштейн 0 Імовірно карт для дому кронштейн 0, імена і кронштейном 1 карт Кронштейн в будинку 1. Іншими словами, що студент живе в цей будинок, то, що інший студент життя в цьому іншому будинку. Але, звичайно, це може бути зробили ще більш чисто. Ну, може, насправді. І дозвольте мені йти вперед і відкрити до structs.h, і Ви будете см. цю ідею тут. Зверніть увагу, що я використав, оголошення типу, як ви посилався на момент назад, щоб заявити про свою власний тип даних. Але я також використовую цю іншому ключовому слову називається структура, яка дає мені нове структурі даних. І ця структура даних я стверджую, що відбувається мати дві речі всередині це - рядок називається ім'я та Рядок називається будинком. І ім'я я збираюся дати ця структура даних буде називатися учнем. Я міг би назвати це все, що захочу, але це робить семантично сенс для мене в моїй свідомості. Так що тепер, якщо я відкриваю кращу версію програми я почав писати там, дозвольте мені перейти до вершини. І є ще кілька рядків коду тут, але дозвольте мені зупинитися на момент на один. Я оголосив постійний званих студентів і жорстко 3 на даний момент. Але тепер, зверніть увагу, як чистий мій код починає отримувати. У рядку 22 я заявляю Масив студентів. І зауважте, що студент мабуть Тепер тип даних. Тому що у верхній частині цього файлу, помітить Я включив цей заголовок файлу що я зупинився на хвилину назад. , А цей заголовок файлу просто-напросто було це визначення студента. Так що тепер, я створив мої власні дані користувача Тип що автори років C тому не думали заздалегідь. Але не проблема. Я можу зробити це сам. Так що це масив з ім'ям студентів, кожен з членів якої є студентом структури. І я хочу, три з них в масиві. І зараз, що зробить все інше цієї програми робити? Мені потрібно щось трохи довільним. Так що з онлайн 24 років, Я ітерації від 0 до 3. Я тоді питаю у користувача Ім'я та прізвище учня. А потім використовую GetString, як раніше. Тоді я питаю для дому студента, і я використовую GetString, як раніше. Але зверніть увагу - кілька нових частина синтаксису - Я до сих пір індекс до I-го студента, але як я можу отримати на конкретних даних поле всередині структури? Ну, що мабуть нова частина синтаксису? Це просто точка оператора. Ми насправді не бачив цього раніше. Ви бачили це в PSET п'ять, якщо у вас є пірнув у вже і графічних файлів. Але просто означає, що точка всередині цього структури або кілька полів, дати точку ім'я, або дайте мені точку вдома. Це означає, що ти всередині структури і отримати ці конкретних областях. Що робить решту цієї програми робити? Це ще не все, що сексуально. Зауважте, що я ітерації від 0 до 3 разів, і я просто створюю англійською фраза типу так і так знаходиться в такому і такий будинок, переходячи в точку назву від I-го студента та їх будинку, а також. А потім, нарешті, тепер ми почнемо, щоб отримати Анальний про це, тепер, коли ми знайомі з тим, що і Malloc інші функції були робив весь цей час. Чому я повинен звільнити обидві назви і вдома, хоча я не телефонував Malloc? GetString зробив. І це був маленький брудний секрет для кілька тижнів, але GetString має був витік пам'яті в усьому розмістити весь семестр досі. І, нарешті, valgrand показати це нам. Але це не має великого значення, тому що я знаю що я можу просто звільнити ім'я і будинок, хоча технічно, щоб бути супер, супер безпечний, я повинен бути роблять деякі тут помилки. Які ваші інстинкти кажу? Що я повинен для перевірки перш ніж я безкоштовно Що є Рядок, яку він же символ *? Я повинен дійсно бути перевірка, якщо студенти Кронштейн я точка ім'я не рівним нулю. Тоді все буде в порядку, щоб йти вперед і безкоштовно що покажчик, і те ж або інше , А також. Якщо студенти кронштейн я точка будинок не дорівнює нулю, це тепер захищатиме по відношенню до кута випадок, в якому GetString повертає щось на зразок нульовий. І ми побачили хвилину тому, Е буде захистити нас тут, просто кажучи порожнє значення, що буде виглядати дивно. Але принаймні не падатимуть, як ми вже бачили. Ну, дозвольте мені зробити ще одну річ тут. структур-0 це свого роду безглузді програми , Тому що я все це ввести дані, а потім він втратив, коли програма закінчується. Але дозвольте мені йти вперед і робити це. Дозвольте мені зробити термінал вікна трохи більше. Дозвольте мені зробити структур-1, який це нова версія цього. Я збільшити небагато. А тепер дозвольте мені працювати точка слеш структур-1. Ім'я та прізвище учня - Девід Mather, давайте зробимо Роб Kirkland, давайте зробимо Леверетт Лорен. Що цікаво, тепер повідомлення - і я знаю, що це тільки тому, що Я написав програму - є файл тепер на моєму поточному каталозі з ім'ям students.csv. Деякі з вас можливо, бачили це в реальному світі. Що таке файл CSV? Значень, розділених комами. Це ніби як бідної людини версія файлу Excel. Це таблиця рядків і стовпців, Ви можете відкрити в програму як Excel, або цифри на Mac. І якщо я відкриваю цей файл тут на Gedit, повідомлення - а цифри там немає. Ось тільки говорити GEdit мені номери рядків. Зверніть увагу, на першій лінії цього Файл Давида і Mather. Наступний рядок Rob Kirkland коми. І третя лінія Лорен Леверетт коми. Так що ж я створив? Я тепер написано-програму, яка ефективно може генерувати таблиці які можуть бути відкриті в програми, як Excel. Не все, що переконливим набором даних, але якщо у вас є багато великих шматків дані, які ви дійсно хочете маніпулювати і робити графіки і подобається, це, мабуть, один спосіб створення цих даних. Крім того, CSV, насправді супер загальні просто для зберігання простих даних - Yahoo Finance, наприклад, якщо ви отримуєте котирування акцій за допомогою своїх так званих API, безкоштовний сервіс, який дозволяє отримати струм до-к-дата акції котирування компаній, вони дати дані назад у супер простий формат CSV. Так як же ми це зробимо? Добре помітити, велика частина цієї програми майже те ж саме. Але зверніть увагу, тут, внизу, а не для друку студентів, операції по лінії 35 і далі, я стверджую, що я економлю студентів на диск, так що збереження файлу. Так помітити я оголошую файл * - Тепер, це вид аномалії в C. З якоїсь причини, то файл буде заголовними буквами, який не схожий на більшість інших типів даних в C. Але це вбудований Тип даних, файл *. І я оголошую покажчик на файл, як ви можете думати про це. FOPEN означає відкритий файл. Яку файлову ви хочете відкрити? Я хочу відкрити файл, який я буду Умовно назвемо students.csv. Я можу зателефонувати, що все, що захочу. А потім зробити припущення. Що означає другий аргумент до FOPEN, ймовірно, означає? Право, W для запису, може бути R для читання. Там є для додавання, якщо ви хочете додати рядки, а не переписати все це. Але я просто хочу створити цей файл неодноразово, тому я буду використовувати в лапках Вт І я знаю, що тільки прочитавши документації, або довідкові сторінки. Якщо файл не є нульовим, - іншими словами, якщо нічого не пішло не так там - Дозвольте мені перебору студентів від 0 до 3. А тепер зверніть увагу, є щось дуже трохи різний про лінії 41 тут. Це не Є. Це Fprintf Е для файлу. Так це буде запис у файл. Який файл? Один, покажчик вказати В якості першого аргументу. Потім ми вказуємо рядок формата. Потім ми визначаємо, які рядки ми хочемо плагін для першого з відсотків, а потім інший змінної або другий з відсотків. Тоді ми закриваємо файл з FCLOSE. Чим я звільнити пам'ять, як і раніше, хоча Я повинен повернутися і додати деякі перевірки для нульових. І це все. FOPEN, Fprintf, FCLOSE дає мені можливість створювати текстові файли. Тепер, ви побачите в Архів завдань п'ять, який включає в себе зображення, які ви будете використовувати виконавчі файли замість цього. Але важливо те, що ідея та ж, , Хоча ці функції ви будете бачите, трохи по-іншому. Так ураганний тур, але ви отримаєте занадто добре знайомі з файлу I/O-- вхідні та вихідні - з PSET п'ять. І всі питання про початкові основи тут? Так? Що, якщо ви спробуєте звільнити нульове значення? Я вважаю, якщо безкоштовно не отримала трохи більш зручним для користувачів, ви можете потенційно сегментації. Передача його недійсним погано, тому що я не вірю безкоштовно заважає перевірити для вас, тому що це потенційно може бути порожньою тратою часу для того, щоб зробити для себе кожна людина у світі. Хороше запитання, однако. Добре, тому цей вид отримує нам цікаву тему. Темою проблемою набору п'ять є криміналістика. Принаймні, частина проблеми набору. Криміналістика в цілому ставиться до відновлення інформації, які можуть або не може бути видалений навмисно. І тому я думав, що дам вам швидкий смак того, що відбувається насправді все на цей раз під капотом вашого комп'ютера. Наприклад, якщо у вас є всередині вашого ноутбуці або настільному комп'ютері жорсткий диск, це або механічними пристрій, який насправді спини - є, що називається круговою пластини , Які виглядають зовсім як те, що я тільки що був на екрані тут, хоча це більш старої школи. Це три з половиною дюйма жорсткого диска. І три з половиною дюйма відноситься з з цієї речі, коли ви встановите його в комп'ютері. Багато хто з вас, хлопці, у ваших ноутбуків зараз є твердотільні накопичувачі або твердотільні накопичувачі, які не мають рухомих частин. Вони більше схожі на ОЗП, а не як ці механічні пристрої. Але ідеї всі ті ж, звичайно ж, як вони ставляться на питання, поставлене п'ять. І якщо ви думаєте про тепер жорсткий диск представляє будучи коло, який Я намалюю ось так от. Коли ви створюєте файл на вашому комп'ютері, будь то SSD або в цьому випадку старший шкільний жорсткому диску, цей файл містить декілька бітів. Давайте припустимо, що саме це 0 і 1, цілий букет з 0 і 1. Так що це мій весь жорсткий диск. Це, очевидно, досить великий файл. І він використовує до 0 і 1, що на частина фізичного пластини. Ну, що ж, що фізична частина? Ну, виходить, що на жорсткому диску, принаймні такого типу, є ці маленькі магнітні частинки. І вони по суті є північ і південний полюси до них, так що, якщо ви свою чергу, один з тих магнітних частинок Таким чином, можна сказати, що це представляють 1. І якщо цей догори ногами на південь до Північ, ви могли б сказати, що це представляють 0. Таким чином, в реальному фізичному світі, це як ви могли б представляти собою щось в двійковий стану 0 і 1. Так що все файл. Там ціла купа магнітного частинки, які їх так чи Таким чином, створення моделі 0 і 1. Але, виявляється, коли ви зберігаєте файл, деяка інформація зберігається окремо. Так що це столик, каталог, так би мовити. І я називаю це ім'я стовпця, а Я буду називати цю колонку місці. І я збираюся сказати, припустимо, це моє резюме. Мій resume.doc зберігається при місці, скажімо, 123. Я завжди йду на це число. Але досить сказати, що, як і в оперативній пам'яті, ви можете взяти жорсткий диск ось гігабайт або 200 гігабайт або один терабайт, і ви можете число всіх байтів. Ви можете пронумерувати всі шматки 8 біт. Тому ми будемо говорити, що це 123, є розташування. Так що цей каталог всередині моєї операційної система запам'ятовує, що моя Резюме знаходиться в місці розташування 123. Але найцікавіше, коли Ви видаляєте файл. Так, наприклад - і, до щастя, більшість країн світу має зловили на цьому - що відбувається, коли ви перетягніть файл у ваше сміття Mac OS або ваш Windows кошика? Яка мета робити це? Це, очевидно, щоб позбутися від файлів, але те, що робить акт переміщенні і падіння в ваше сміття або ваш Кошики робити на комп'ютері? Абсолютно нічого, насправді. Це просто, як папки. Це особлива папка, щоб бути впевненим. Та чи так це насправді видалити файл? Ну, немає, тому що деякі з вас, напевно був схожий, ой блин, ви цього не зробили хотів цього робити. Таким чином, ви двічі клацніть Trash або кошика. Ви ткнули навколо, і ви одужали файл, просто перетягнувши його звідти. Отже, ясно, що це не обов'язково видаленням. Добре, що ти розумніший. Ви знаєте, що просто перетягнути його в Trash або кошика не означає, Ви очищенні корзини. Так ви йдете до мене, а ви кажете Очистити кошик або порожній кошика. Тоді що відбувається? Так, так воно віддаляється більше. Але все, що відбувається це. Комп'ютер забуває, де resume.doc було. Але те, що не змінилося мабуть на картинці? Біт, 0 і 1, що я стверджую, є На території деяких фізичних аспектів апаратних засобів. Вони все ще там. Це просто комп'ютер забув, що вони є. Так що це по суті звільнив файлу Біти так що вони можуть бути використані повторно. Але не раніше, ви створюєте декілька файлів, і більше файлів і багато іншого файли ймовірнісно, ​​ті, 0 і 1, ці магнітні частинки, використовуються повторно, вгору або правою стороною вгору, для інші файли, 0 і 1. Так що у вас є цей проміжок часу. І це не передбачуваних Довжина, насправді. Це залежить від розміру жорсткого диск і скільки файлів у вас є і як швидко ви зробити нові. Але є вікно часу, протягом який, що файл все ще чудово відшкодована. Так що якщо ви коли-небудь використовувати програми, як McAfee або Нортон, щоб спробувати відновити даними, всі вони роблять намагається відновити цю так звану каталог з'ясувати, де твій файл був. А іноді Нортон і скаже: Файл 93% видобутих. Ну, що ж це значить? Це просто означає, що деякий інший файл випадково закінчив із використанням, скажімо, ці біти з вихідного файлу. Так що ж насправді бере участь у відновленні даних? Ну, якщо у вас немає щось на зразок Нортон попередньо встановлено на Вашому комп'ютері, Найкраще, що можна іноді зробити, це подивитися на весь жорсткий диск шукає послідовності бітів. І одна з тем проблема набору п'ять у тому, що ви будете шукати аналог жорсткого диска, судово образ компактного флеш-карту від цифрова камера, пошук 0s і 1, які зазвичай з високою ймовірності, представляють початок зображення JPEG. І ви, хлопці, можете відновити ці образи на за умови, якщо я бачу цю модель біти на судово зображення, з висока ймовірність, що знаменує початку JPEG. І якщо я бачу той самий шаблон знову, що, ймовірно, знаменує собою початок інший JPEG, а інший JPEG, а інший у форматі JPEG. І це, як правило, як відновлення даних буде працювати. Те, що добре про формат JPEG є хоча формат файлу сам кілька комплекс, на початку кожного такого файл насправді досить ідентифікованих і простий, як ви побачите, якщо у вас не зробили. Отже, давайте поглянемо під капот як точно, що було відбувається, і те, що ці 0 і 1 Тобто, щоб дати вам трохи більше контекст для цього конкретного виклик. [ВІДТВОРЕННЯ ВІДЕО] -Де Ваш комп'ютер зберігає самі його постійних даних. Щоб зробити це, дані переміщаються з оперативної пам'яті разом із програмним забезпеченням сигнали, які говорять жорсткого диска, як зберігати ці дані. Жорсткий диск Перекласти схем цих сигналів в напругу коливанням. Ці, у свою чергу, контролюють жорсткого диска рухомих частин, деякі з декількох рухомих частин, що залишилися в сучасного комп'ютера. Деякі з сигналів управління двигуном який обертає металевим покриттям пластин. Ваші дані насправді зберігаються на цих пластинах. Інші сигнали переміщення чтения / записи голови, щоб читати або запису даних на пластинах. Цей механізм настільки точні, що людину Волосся не міг навіть пройти між керівники і спінінг пластин. Тим не менш, все це працює на приголомшливою швидкості. [КІНЕЦЬ відеовідтворення] DAVID мала: невелике збільшення глибоке тепер на те, що це насправді на цих пластинах. [ВІДТВОРЕННЯ ВІДЕО] -Давайте подивимося на те, що ми просто бачила в уповільненому темпі. Коли короткого імпульсу електрики направляється в головку читання / запису, якщо перевертається на крихітному для електромагнітних частки секунди. Магніт створює поле, яке зміни полярності крихітний, крихітний частина металевих частинок, які покрити кожну поверхню пластин. Модель серія цих крихітних, стягується територій на диску являє собою один біт Дані в двійковечисло Система, використовувана на комп'ютерах. Тепер, якщо струм направляється в одну сторону через головки читання / запису, площа поляризований в одному напрямку. Якщо струм направляється в протилежному напрямку поляризація змінюється на протилежну. Як ви отримуєте дані з жорсткого диска? Просто повернути процес назад. Так що це частинки на диску що отримують струм в головка читання / запису руху. Всі разом ці мільйони намагнічених сегментів, а також у вас є файл. Тепер, частини одного файлу може бути розкидані по всьому диску страви, ніби як безлад паперів на вашому столі. Так спеціальна додатковий файл відстежує про те, де що знаходиться. Хіба ви не хотіли б мати щось на зразок цього? [КІНЕЦЬ відеовідтворення] DAVID мала: Добре, напевно, немає. Так як багато хто з вас, хлопці ріс з цим? ОК, так що це все менше і менше руки з кожним роком. Але я радий, що ви принаймні знайомі з ними, тому що це і наша власна Книга демо, на жаль, помирають дуже повільну смерть тут фамільярність. Але це те, що я, принаймні, ще в середньої школи, використовував використання для резервного копіювання. І це було дивно, тому що ви може зберігати 1,4 мегабайт на даний диск. І це було високої щільності Версія, як зазначено в HD, який має це означає, перш HD сьогоднішньої відео. Стандартна щільність була 800 кілобайт. А до цього, були 400 кілобайт дисками. А до цього, було 5 і 1/4 дюймові диски, які були по-справжньому гнучких, і трохи ширше і вище ніж ці речі тут. Але ви можете побачити так звану дискети аспект цих дисків. І функціонально, вони насправді дуже схоже на жорстких дисках у міру цього типу. Знову ж, твердотільні диски в нових комп'ютерах працюють трохи інакше. Але якщо ви перенесете, що мало вкладку метал, ви можете побачити трохи печива, або блюді. Це не метал, як цей. Цей насправді деякі дешевші пластикового матеріалу. І ви можете виду ворушити його. І ви Trully просто стертий деяких Число бітів або магнітні частинки з цього диску. Так, на щастя, немає нічого на ньому. Якщо ця річ знаходиться у дорозі - і охоплюють Ваші очі і ті з ваших сусідів - Ви можете тільки почасти здійснити це Загалом від оболонки подібне. Але є трохи весни, так що будьте усвідомлює, що своїми очима. Так що тепер у вас є дійсно дискету. І те, що про цю чудову в тому, що в тій мірі, що це дрібного уявлення більшого жорсткий диск, ці речі супер, супер просто. Якщо ви щіпку дні його, тепер, що металеві речі вимкнений, і шкірка їх відкритими, і все, що складається з двох частин повсті і так званий гнучкий диск з шматком металу на внутрішній стороні. І там йде половина мій диск вміст. Там іде інша половина з них. Але це все, що кружляла всередині вашого комп'ютера в минулих. І знову ж, щоб поставити це в перспективі, наскільки велика більшість ваших Жорсткі диски в ці дні? 500 гігабайт, терабайт, може бути, в настільний комп'ютер, 2 Тб, 3 терабайт, 4 терабайта, вірно? Це один мегабайт, плюс-мінус, , Які не можуть навіть відповідати типовим MP3 більше в ці дні, або деякі Схожі музичні файли. Так невеликий сувенір для вас сьогодні, і Також, щоб допомогти те, що контекст ми будемо приймати як належне Зараз у завдання, поставлене п'ять. Отже, це ваші. Отже, дозвольте мені перехід до якої буде провести наступні PSET також. Так що ми тепер встановлена ​​для цієї сторінки - о, пару оголошення швидко. У цю п'ятницю, якщо ви хочете приєднатися до CS50 на обід, перейдіть на звичайному місці, cs50.net/rsvp. І останній проект - так в програмі, ми відправили остаточної специфікації проекту вже. Зрозумійте, що це не означає, це через особливості найближчим часом. Він відповідав, насправді, лише б отримати ви, хлопці, думав про це. І дійсно, супер значні відсоток ви будете шукати шляхи вирішення дипломні проекти на матеріалі, який ми навіть ще не в класі, але буде вже наступного тижня. Зауважте, однак, що специфікація вимагає кілька різних компонентів остаточний проект. По-перше, протягом декількох тижнів, є передпроектні пропозиції, досить випадковий електронній пошті Вашої TF сказати йому або те, що ви думати про для вашого проекту, з Немає зобов'язань. Пропозиція буде вашим зобов'язання, кажучи, ось, це те, що Я хотів би зробити для мого проекту. Що ви думаєте? Занадто великий? Занадто маленький? Це керованим? І ви бачите, специфікації для більш докладної інформації. Пару тижнів після цього є статус доповідь, яка аналогічним чином випадковий електронній пошті своїм TF сказати, наскільки далеко позаду Ви знаходитесь в своєму остаточному реалізації проекту, а потім CS50 Hackathon яким кожен пропонується, який буде подія з 8:00 вечора на одному вечора до 7:00 Ранку наступного дня. Піца, як я, можливо, згадані в тиждень нулю, Віль бути поданий до 9:00 вечора, Китайська їжа в 1:00 ранку. І якщо ви ще не спав о 5:00 ранку, ми відвеземо вас до IHOP на сніданок. Таким чином, Hackathon є одним з найбільш незабутніх вражень у класі. Потім здійснення пояснюється тим, а Потім кульмінаційної CS50 ярмарок. Більш детальну інформацію про всіх цих в найближчі тижні. Але давайте повернемося до того, старої школи - знову, масив. Так масив був хороший, тому що вирішує проблеми, як ми бачили, тільки Хвилину тому зі студентськими структурами стає трохи з-під контролю, якщо ми хочуть мати одного студента, студент два, три студенти, студент точка точка точка, деякі довільні числа студентів. Так масиви, кілька тижнів тому, напала і вирішив всі наші проблеми не знаючи заздалегідь, скільки речей деякого типу ми могли б хотіти. І ми бачили, що структури можуть допомогти нам подальшої організації нашого коду і зберегти концептуально схоже змінних, таких як ім'я і вдома, разом, так що ми їх можна розглядати як єдине ціле, всередині якої є дрібні шматки. Але масиви мають деякі недоліки. Які деякі з недоліків ми зіткнулися з масивами досі? Що це? Фіксований розмір - так що навіть якщо ви, можливо, зможе виділити пам'ять для Масив, як тільки ви знаєте, скільки студентів у вас є, скільки символів у вас є від користувача, як тільки ви виділили масиві, ви вид пофарбовані себе в кут. Тому що ви не можете вставити нові елементи в середину масиву. Ви не можете вставити більше елементів в кінці масиву. Дійсно, ви змушені вдаватися до створення абсолютно новий масив, як ми вже обговорювали, копіюванням старого в нове. І знову ж, це головний біль, яка GetString займається для вас. Але знову ж таки, ви не можете навіть вставити щось в середину масиву Якщо ставка не повністю заповнена. Наприклад, якщо цей масив тут розмірів шість тільки п'ять речей у ньому, Ну, ви могли просто тактику то на кінці. Але що, якщо ви хочете вставити щось в середині масивом, хоча він може мати п'ять із шести речей у ньому? Ну, що ж ми робимо, коли ми були всі наших людських добровольців на сцені в тижня минулого? Якби ми хотіли поставити когось тут, або ці люди, як рухатися цим До речі, ці люди або як рухатися цим До речі, і це стало дорогим. Переміщення людей всередині Масив закінчилося тим, що додав і вартістю нам час, тому багато наших N квадрат час роботи, як сортування вставкою, для Наприклад, в гіршому випадку. Так масиви є великими, але ви повинні заздалегідь знати, як великий Ви хочете їх. Так добре, от рішення. Якщо я не знаю заздалегідь, скільки Я студентам могли мати, і я знаю, як тільки Я вирішую, хоча, я застряг з цим багато студентів, то чому б мені просто не завжди виділити два рази більше місця як я міг би думаю, що потрібно? Хіба це не розумне рішення? Реально, я не думаю, що ми знадобиться більше 50 слотів в масив для середнього класу, так що давайте просто округлити. Я зроблю 100 слотів в моєму масиві, всього так що ми можемо виразно отримати кількість студентів, яких я очікував бути в деякому середнього класу. Так чому б не оточити і виділити більше пам'яті, зазвичай, для масиву ніж ви думаєте, ви могли б навіть потрібно? Що це просте буксирування до цієї ідеї? Ви просто витрачаєте пам'яті. Буквально кожну програму ви пишете те , Може бути, використовуєте в два рази більше пам'яті, ніж вам дійсно потрібно. І, що просто не хочеться Особливо елегантне рішення. Крім того, він просто зменшує Ймовірність проблема. Якщо вам пощастило мати популярний курс один семестр і у вас є 101 студентів, ваша програма як і раніше принципово стикається з тією ж проблемою. Так на щастя, є рішення це оголошення всі наші проблеми у вигляді структур даних, які складніші, ніж ті ми бачили дотепер. Це, я стверджую, є пов'язаною списком. Це список чисел - 9, 17, 22, 26 і 34 - , Які були пов'язані один з одним за допомогою про те, що я намалював, як стріли. Іншими словами, якби я хотів, щоб представляти масивом, що я міг зробити щось на зразок цього. І я покладу це на накладні через хвилину. Я міг би зробити - привіт, все в порядку. Залишайтеся на зв'язку. Новий комп'ютер тут, ясно - Все в порядку. Так що, якщо у мене є ці числа в масиві - 9, 17, 22, 26, 24 - не обов'язково в масштабі. Гаразд, ось моя масиву - Боже мій. Гаразд, ось моя масиву. О, мій бог. [Сміється] DAVID мала: прикидатися. Це занадто багато зусиль, щоб повернутися і виправити це, так що - 26. Так що у нас є цей масив 9, 17, 22, 26 і 34. Для тих з вас може бачити прикре непорозуміння я тільки що зробив, там це. Тому я стверджую, що це дуже ефективним рішенням. Я виділив стільки як цілі Мені потрібно - раз, два, три, чотири, п'ять, або шість - і я потім зберігаються номери всередині цього масиву. Але припустимо, то, я хочу вставити значення як число 8? Ну, куди це йде? Припустимо, я хочу, щоб вставити число, наприклад 20. Ну, куди це йде? Десь там в середині, або число 35 має піти десь в кінці. Але я все з космосу. І таким чином, це є фундаментальною проблемою масивів яке є рішенням. Я стверджував, хвилину тому, GetString вирішує цю проблему. Якщо Ви хочете вставити шостим номером У цей масив, то, що принаймні один рішення, яке ви можете спертися напевно, так само, як ми робимо з GetString? Що це? Ну, зробити його більше, тим легше сказати, ніж зробити. Ми не можемо обов'язково робити масиву більше, але що ми можемо зробити? Зробити новий масив, який більше, розміром 6, а може, розмір 10, якщо ми хочемо випередити речі, а потім скопіювати старого масиву в новий, а потім звільнити старого масиву. Але те, що час роботи Тепер цього процесу? Це велике О від N, так як копіювання буде коштувати вам кілька одиниць часу, так що не так ідеально, якщо ми повинні виділити новий масив, який буде споживати в два рази більше пам'яті тимчасово. Скопіюйте старі на нові - Я маю на увазі, це просто головний біль, яка , Знову ж таки, чому ми написали GetString для вас. Так що ми могли б зробити замість цього? Ну, що, якщо наші структури даних насправді має прогалини в ньому? Припустимо, що я розслабляюся моєї мети, мають безперервні блоки пам'яті, де 9 знаходиться поруч з 17, який поруч з 22, і так далі. І припустимо, що 9 може бути тут, в Оперативної пам'яті, і 17 може бути тут, в оперативній пам'яті, і 22 може бути тут, в оперативній пам'яті. Іншими словами, я не потребую них навіть спина до спини більше. Мені просто потрібно якось нитку в голку в кожному з цих цифр, або кожен з цих вузлів, як ми будемо називати прямокутниками, як я намалював їх, пам'ятаю, як дістатися до останнього такий вузол від першого. Так у чому ж конструкції програмування ми бачили зовсім недавно, з якою я можна реалізувати, що нитка, або зроблені тут, з якою я можу здійснювати ці стрілки? Тому покажчики, чи не так? Якби я виділити не тільки Інтелект, але вузол - і вузол, я просто означає контейнері. І візуально, я маю на увазі прямокутник. Так вузла мабуть потрібні містити два значення - цілочисельне себе, а потім, як це випливає з нижню половину прямокутника достатньо місця для Int. Так що подбати про це заздалегідь тут, наскільки великий цей вузол, це Контейнер йдеться? Скільки байт для цілочисельне? Імовірно 4, якщо це так само, як звичайно. А потім, скільки байт для покажчика? 4. Так що цей контейнер або цей вузол, є буде 8 байт структури. О, і це щасливий збіг, що ми точно також це поняття структура або структура C. Тому я стверджую, що я хочу зробити крок до цього більш складні реалізація список номерів, зв'язаний список номерів, мені потрібно зробити трохи більше мислення фронт і оголосити не тільки Інтелект, але структура , Що я подзвоню, умовно Тут, вузла. Ми могли б назвати її як завгодно,, але вузол буде тематичним в багатьох з речей, ми почнемо розглядати зараз. Усередині цього вузла буде Int N. А потім цей синтаксис, трохи дивно на перший погляд - Структура вузла * наступний. Ну графічно, що це таке? Тобто нижня половина прямокутник, який ми бачили просто мить тому. Але чому я кажу структура вузла * а не тільки вузлом *? Тому що, якщо цей покажчик вказує на іншому вузлі, це просто адреса вузла. Це узгоджується з того, що ми обговорювали про покажчики до цих пір. Але чому, якщо я стверджую, ця структура називається вузлом, я повинен сказати, що структура вузлом всередині тут? Саме так. Це свого роду дурні реальність C. Визначення типу, так би мовити, не має сталося. З супер буквально. Вона читає ваш код зверху вниз, зліва направо. І, поки не зустріне, що крапка з комою на Суть, думаю, що не існувати як тип даних? Вузла, в лапках вузла. Але через більш детальний Я зробив заяву на першій лінії - ЬурейеЕ вузла структури - тому, що був на першому місці, перед фігурні дужки, що ніби як попереднього навчання Clang, що, ви Знаєте що, дайте мені структури називається структура вузла. Чесно кажучи, я не люблю називати речі Структура вузла, вузла структури всіх протягом всього мого коду. Але я буду використовувати його тільки один раз, тільки всередині, так що я можу ефективно створити свого роду циклічне посилання, а не покажчик на себе такої, але покажчик на інший ідентичного типу. Ось і виходить, що в структурі даних як це, є кілька операції, які можуть бути Цікавлять нас. Ми, можливо, захочете, щоб вставити до списку, як це. Ми, можливо, захочете видалити зі списку, як це. Ми можемо захотіти пошук у списку для значення, або в більш загальному ходу. І траверс просто химерний спосіб почала говорити на лівій і перемістити всі до упору вправо. І зауважте, навіть з цим трохи більш складні структури даних, не кажучи мені пропонують, щоб ми можемо запозичити деякі з ідеї в останні два тижні і реалізувати функцію називають пошук, як це. Це збирається повернути істинним або помилковими, вказуючи, так чи Ні, N в списку. Другий аргумент є покажчиком до списку собі, так покажчик на вузол. Все, що я збираюся зробити, це те заявляю тимчасову змінну. Ми назвемо це PTR за угодою, для покажчика. І я призначу його рівним початок списку. А тепер помічаю той час циклу. До тих пір поки вказівник не одно до нуля, я збираюся перевірити. Чи є стрілка покажчика N рівні N, який був переданий в? І почекайте хвилину - нові частина синтаксису. Що таке стрілка раптом? Так? Саме так. Так у той час як кілька хвилин тому, ми використовували точкову нотацію для доступу щось Всередині структури, якщо змінна Ви не структури себе, але покажчик на структуру, На щастя, частина синтаксису, нарешті, має інтуїтивний сенс. Стрілка означає слідувати за покажчиком, як наші стрілки як правило, означає графічно, і йти у Дані поля всередині. Так стрілка те ж саме, точка, але ви використовуєте його, коли у вас є вказівник. Так просто, щоб резюмувати те, якщо поле N Всередині структури, званих покажчик дорівнює дорівнює N, повернутися правда. В іншому випадку, ця лінія тут - покажчик одно покажчик наступного. Так що ж це робить, зауважте, якщо я я в даний час вказує на структуру містить 9 і 9 Не число Я шукаю - Припустимо, я шукаю для N дорівнює 50 - Я збираюся оновити свій тимчасовий покажчик не вказувати в цьому вузлі більше, але покажчика стрілки поруч, яка збирається поставити мене сюди. Тепер я зрозумів, вихор Введення. У середу, ми насправді зробити це з деякими людьми і з деякими більш коду в більш повільному темпі. Але зрозумійте, ми зараз роблять наші дані більш складні структури, щоб наші Алгоритми можете отримати більш ефективні, які буде умовою для PSET шість, коли ми завантажуємо в, знову ж таки, ті, 150000 слів, але потрібно зробити так ефективно, і, в ідеалі, створюють програма, яка працює для наших користувачів не в лінійної, а не російською мовою в квадраті, а в постійний час, в ідеал. Побачимося в середу. СЛУХАЛИ: Наступного CS50, Девід забуває про своє базовому варіанті. DAVID мала: І от як ви посилаєте текстовими повідомленнями з C. Які - [Різні ТЕКСТ ПОВІДОМЛЕННЯ Звуки повідомлень]