[Грає музика] Девід Дж Малан: Це як першокурсник семінар сьогодні. ДОБРЕ. Отже, дуже дощова з. Це має тенденцію відбуватися по середах, але все більше можливостей з питань сьогодні. Отже, давайте почнемо насправді з плівкою на хвилину. Але ми почнемо велично, як завжди. Це CS50, і це кінець тижня 4. Так що, якщо ви коли-небудь спостерігав Телевізор або кіно, в якому є деякі комп'ютерні експерти і поліція, ФБР або, або деякі агентства намагається зловити деяких противник, добре, ви, напевно, чули вислів "підвищення", в результаті чого, що технік-то чарівно збільшує в нескінченно далеко, щоб побачити злочинців особистість або номерний знак навіть у відливом дзеркалом або блиск чиєїсь очі. Так насправді, давайте поглянемо на кілька таких сцен з Голлівуду. [ВІДТВОРЕННЯ ВІДЕО] -Добре, Тепер давайте отримати хороший погляд на вас. -Потримай це. Запустіть його назад. -Почекай хвилинку. Ідіть прямо. -Є, Заморозити, що. -Повноекранний. -Добре, Що заморозити. -Tighten На що, чи не так? -векторних У тому, що на хлопець із заднього колеса. -zoom У прямо тут, на цьому місці. -С Правом обладнання, зображення може бути збільшена і заточені. -Що це? -Це Програма підвищення. -Може Ви ясно, що до будь? -Не знаю. Давайте підвищення його. -Enhance Розділі A6. -Я Посилюється деталі, і-- я думаю, що є достатньо, щоб підвищити, відпустіть її, щоб мій екран. -Я Посилюється відображення в її очі. -Давай Це запустити це через поліпшення відео. -Edgar, Ви можете підвищити це? -hang На. -Я Працюю на цьому відображенні. Відображення -Someone в. -відображення. -Є Є відображенням обличчя людини. -The Відображення. -Є Це відображення. -zoom В на дзеркалі. -Ви Можете бачити відображення. -Може Вам підвищити імідж звідси? -Може Вам підвищити його прямо тут? -Може Вам підвищити його? Ви можете збільшити це? -Може Ми збільшуємо це? -Може Вам підвищити його? -Постой На секунду, я підвищення. -zoom На двері. -кратного 10. -Zoom. -В'їхати. -Більше. Почекай, стоп. -Stop. -Pause Його. -rotate Нам 75 градусів навколо вертикальної, будь ласка. -Stop. Поверніться до частини об двері, знову. -Got Енхансером зображення, які можуть растрового зображення? Гей, може бути, ми можемо використовувати Прадіпа Метод вересня бачити у вікна. -Це Програмне забезпечення стан мистецтва. -The Власне вимкнений. -С Права Поєднання algorithm-- Прийняті усунення -Він алгоритми на наступний рівень, і я можу використовувати їх для посилити цю фотографію. -Lock, І збільшити Z-осі. -Enhance. -Enhance. -Enhance. -Freeze І підвищення. [КІНЕЦЬ ПЕРЕГЛЯДУ] Девід Дж Малан: Гаразд, всі ті слова, насправді. Вони просто нанизані в так, що насправді не розумно. І справді, CS50 і курси, як це прагне зруйнувати багато телебачення й кіно для вас. Тому що, коли ті комп'ютерних фахівців які сипати умови і говорив модні речі, як власні, і г-вісь, і будь-яку кількість інших насправді більш технічні терміни, вони насправді просто нанизуючи слова разом занадто часто. Це одна з наших сподівань в тому, що в якості побічного ефекту, курси як це, буде більше людей в Світ дійсно зможе зважити і тільки трохи впливати на Якість і точність цих фільмів? Справді, давайте поглянемо на реальність. Так ось співробітники фото Марія, один з наших товаришів навчання. І нехай вона підозрюється в чомусь. І все ж, є проблиск деякі з доказів на її очі, або у відображенні її очок. Ну, якщо ми робимо саме так, як фільми запропонувати, в якому ми масштабу і "підвищення", це скільки інформації в особі Марії при захопленні зображення з цією оригінальному дозволі. І, справді, ви можете побачити ці точки. І це те, що є звані пікселів, Р-І-Х-E-L-S, який знаходиться всього в квадрат, як правило, тобто точка, яка складає зображення. І ще в той день, а насправді навіть сьогодні з деякими з сьогоднішніх LED-телевізорів або РК-телевізори, якщо у вас є одним у вашому номері або вдома, якщо ви йдете супер близько до нього, і особливо якщо це кілька старше телебачення, Ви, ймовірно, може навіть бачити ці точки і це те, що скласти зображення. І не більше немає Інформація, ніж ця. Ми могли б "підвищити", в тому сенсі, згладжування речі знову і роду виведення вигляд, на зразок того, що Колір повинен бути поруч з оком Марії так що це насправді не так нерівною. Але якщо я продовжую масштабування, є поганий хлопець в її очі. Як це все, Інформація, яку ми маємо. Ви не можете створити Інформація з нічого. Там тільки кінцеве кількість бітів там. Таким чином, в завдання Набір 4, де у вас є можливість грати з такого роду світі. У задачі Set 4, ви досліджувати Світ графіки і експертизи, і насправді писати код що відновлює втрачені зображення. Ви написати код, який маніпулює існуючих зображень і врешті зрозуміти, що відбувається під капотом. І, виявляється, це насправді не все, що складніше. Наприклад, якщо ми хотіли являють собою смайлик де з цих чорних пікселів, або ці чорні точки, Ну, ми могли б просто представляють їх як дійсно растрові. І якщо ви коли-небудь чули, що Вираз растрові, можливо, тепер починає зробити трохи більше сенсу сьогодні. Ми вже знаємо, що трохи є. Це 0 або 1. І карта просто щось як шматок паперу що дає вам напрямки і має може бути, сітка х і у координат. Так от растрові. Це карта бітів в результаті чого, мабуть 1 представлятиме білий піксель, і 0 представлятиме чорний піксель. Але ми, безумовно, може перевернути його навколо. Це насправді не так важливо Поки ми послідовні. А ось як, в binary-- всередині пам'яті комп'ютера, або навіть всередині файлу на ваш жорсткий drive-- можна зберігати найпростіший з смайлик зображень. Але те, що ми, звичайно, не вистачає в цьому образі? Колір, вірно? Це очевидно, наступним кроком або удосконалення поліпшити це з кольором. Тому, на жаль тільки з однією небагато, 0 або 1, можна уявити колір. Це може бути червоним або синім, або чорний, або білий, або зелений, або рожевого, або будь пари кольорів. Але для простоти, ми будемо просто припустити, чорний і білий. Тож логічно нам потрібно, якщо ми хочете реалізувати колір в зображенні? Що ми повинні робити? Подібно до цього, якщо обмежуючим фактором тут є те, що з одним бітом можна тільки представляють два стани, 0 або 1, білий або чорний, те, що ви хочете зробити? Аудиторія: більше даних. Девід Дж Малан: Ще біт, ага більше даних, більше біт. І, дійсно, це саме те, як представлені кольорові зображення. Замість того, щоб використовувати один біт, А 0 або 1 для кожного пікселя, кожна точка, Ви просто використовувати декілька. Може бути, використовувати 8, можливо, частіше використовувати 24, і дійсно, в задачі Набір 4, ви будете грати з файлом Формат, який використовує 24 біта, як правило ,. Але більшість з вас, ймовірно, знайомі з JPEG. Якщо ви коли-небудь фото на телефоні, або завантажені або бачили щось на Facebook або Flickr, будь-яку кількість фото-основі веб-сайтів, ви маєте напевно, бачили зображення JPEG з раніше. І виявляється, це файл Формат ми збираємося використовувати в Pset 4, в якому ви збираєтеся доведеться відновлювати зображення що я випадково видалені з пошкоджений карти пам'яті в камері, якщо ви будете. І виходить, що, хоча JPEG досить sophisticated-- це набагато складніший ніж чорних і білих точок ми бачили кілька хвилин тому, бо є насправді фантазії алгоритми, які використовуються для стиснення JPEG, так що ви можете мати дійсно хороший, якість зображення, але з використанням порівняно мало біт. І ми повернемося до стиснення незабаром. Виявляється, що перший три байти в image-- JPEG незалежно від того, що ви зробили фотографію of-- є значення 255, 216, 255. Іншими словами, якщо ви просто бачити, що набір бітів, тут представлені як трьох байт, або 24 біта складе, з високою ймовірністю можна припустити, що Ви дивитеся на це цей перших три байти JPEG. І це те, що відомо як підпис у форматі JPEG. Багато форматів файлів там, як правило, щоб почати з деякими моделями 0 і 1, так що Windows, і Mac OS, і прошивкою, і Android-знаю, який тип файлу вони це, на додаток до так званої файлу розширення, яке багато файлів є. Якщо ви .jpg, це ще один ключ до комп'ютера. Отже, давайте подивимося на це трохи більш технічно. Ми знаємо десяткової система від 0 до 9. Ми знаємо, двійковий 0 і 1. І якщо ви згадаєте Pset 0, у вас боротися з, для трохи, щось називається шістнадцятковому де у вас є 16 цифр, замість 10 або замість 2. І ці цифри, за угодою, від 0 до 9, а потім через F, де F представляє те, що десяткове число, як швидко розсудливість перевірити? Так, 15. І повинен представляти 10, просто Характер упорядкування, що я дав. Це просто довільне угоду, але це цілком стандартний. Так що, якщо ми подивимося на цей шаблон з трьох bytes-- давайте просто почати дивитися на нього в відповідно до того, як комп'ютерні вчені взагалі дивитися і думати про файлах. Ви, звичайно, можете думати про Файли в 0s, 1с і і десятковій, але насправді, ми схильні використовувати бінарний або більше, як правило, hexadecimal-- назад від Pset 0. Отже, дозвольте мені припустити, що 255, 216, 255 і просто ці моделі 0 і 1. І ви можете перевірити це, якщо ви хочу зробити математику з тижня 0. Але зараз, просто припустити, що це дійсно правильно. Я просто переписати трьох десяткової числа як трьох довічних значень. Тепер те, що я збираюся зробити, це просто додати біле простір, тільки заради читаності в. І зауважте, я тільки збираюся розсунути речі. Тому, перш ніж, після, до, після. Я не роблю нічого цікавого одного ніж просто поширення речі так, що повідомлення кожен набір з восьми Біти тепер два комплекти чотирьох бітів. Це корисно, тому шістнадцятковій Особливо модно бо кожен шістнадцяткова цифра від 0 до F, або, більш конкретно від 0 до 15, може бути представлена з рівно чотири біта. Іншими словами, в шістнадцятковому якщо ви хочу, щоб представляти 0, це просто 0000, чотири нулі. І якщо ви хочете, щоб представляти 15, це 1 111, який чотири біта. І якщо ви робите математику, якщо це місце ті, це місце 16s, що збирається дати you-- а що відбувається , Метою яких вибачте, в двійковому, що відбувається, щоб дати вам 15, з них місце, Двійки місце, четвірок і вісімки місце. Отже, дозвольте мені запропонувати, що це набір з чотирьох бітів зліва це те, що ми збираємося називати п. Це найбільший номер, який ви може представляти з чотирма бітами. І ми вже знаємо з шістнадцятковій е є найбільшим цифра в шістнадцятковому вигляді. У нас є ще один F є, більше того там два. І тепер, тільки прийняти на віру що я зробив математику право і що ліва половина з цих бітів, 1101, це те ж саме, як д в шістнадцятковому вигляді. І права рука, 1000, знаходиться всього в 8. І, що один легко побачити, правильно? 8-represents-- прав під цією вісімки місці. Отже, ми маємо один в стовпці вісімки і нічого в четвереньках, двоє або ті. Так що тепер більш традиційно, люди схильні написати шістнадцяткові цифри, як це, ви просто хлюпати їх разом, і тоді ви префікс їх з 0x. Це нічого не означає, крім візуальний ключ до human-- ось іде шістнадцяткове value-- тому не могли б бути очевидним. Який є, в кінцевому рахунку, що картина з нулів і одиниць, або картина шістнадцятковій цифри ж саме, що ви збирається почати шукати в задачі Набір 4 this-- і проблема Набір 4 специфікації будуть ходити Ви через це більш detail-- але розумію, як свого роду магії, як це може виглядати на перший погляд, Ви почнете бачити це багато. І справді, навіть у GDB, то відладчик ми ввели в понеділок і Ден впроваджує в Pset 3, буде щоб показати вам часто шістнадцяткові значення тільки тому, що вони мають тенденцію бути більш звичайний, ніж десяткова або двійковий у світі комп'ютерів. Тепер давайте поставити це в контексті. Багато хто з вас, можливо, пам'ятаєте, що це Тут картина, яка прийшла від чого? Vista ,, так що навіть раніше, ніж що Windows XP зробив це дебют. Так що це гарний краєвид. І справді, якщо ви копатися online-- Я думаю, що це стаття з Вікіпедії, де хтось дуже дивно вийшов знайшли це місце в світі створена його або її камера саме право place-- і це сьогодні виглядає like-- але це точно так само, установка. Цей образ, хоча, знаходиться у файлі формат, званий растровий, б-м-р. І ми збираємося взяти супер Швидкий погляд на те, що це означає. Але растрові це просто інший спосіб представляють всі зображення, використовуючи пікселі в 0 і 1, в кінцевому рахунку ,. Але в швидкий погляд, він має більш цікавий підпис на початку файлу. Це не тільки три байт, а є ціла купа шаблонів байтів що зумовило сенс. Наприклад, десь у Перші кілька байтів растрового зображення буде розмір з Зображення, ширина зображення, висота зображення, так корисні метадані, якщо ви будете. Корисна інформація, що Photoshop або які-небудь графічні програми ви використовуєте може насправді хвилює. Так докладніше про це в Проблема вказано 4, але це тільки сказати, що в кінці дня всі формати файлів ви використовуєте для years-- файлів Microsoft Word, Номери, файли Excel, будь-яку кількість форматів файлів що, можливо, деякі Відомо, розширення файлу просто 0 і 1 під капотом. І люди вирішили те, що конвенції є, Які моделі 0 і 1 представляють Слово файл в порівнянні файл Excel, в порівнянні з будь-якою кількістю інших форматів. Таким чином, в Pset 4, ви будете мати можливість грати з цим. Але що це означає мати структури. Це насправді хороший переходити в даний час в С, який має тільки пару З додаткових функцій, які ми не дивилися на. Це досить маленький мову і один з симпатичні риси о С є структурою. Наприклад, якщо ви хотів represent-- давайте що ви хотіли, щоб мати змінну, яка представляє студента в деякому програми. Може бути, ви пишете курс програма реєстрації, або ядро ​​торговий інструмент, або щось подібне. Які частини даних, пов'язаних студенту, які приходять на розум? Як студент представлені з тим, що цінує? Так? У вас є ім'я в якості студента. Що ще типовий студент має? АУДИТОРІЯ: [нерозбірливо] Девід Дж Малан: Так, вибачте. АУДИТОРІЯ: Вік. Девід Дж Малан: вік або день народження те ж саме, так. Що ще? АУДИТОРІЯ: Ідентифікаційний номер? Девід Дж Малан: Так ідентифікаційний номер, може бути, номер телефону, може бути, гуртожиток, або будинок, або коледж, або щось подібне. Будь-яка кількість елементів даних, які Ви могли б мати у вашому списку контактів це те, що можна визначити студента. Так що, якщо ми хотіли, щоб це зробити, в коді, ми могли б зробити щось просте, як це. Ми могли б мати програму так, щоб має, скажімо, INT основний (порожнечу). І якщо я хочу, щоб представляти студент, я міг би, наприклад, рядок називається ім'я для цього студента, рядок називається гуртожитки для цього студента, може бути, INT називається ID для цього студента. І тому, що я використовую рядок, я потрібно повернутися і поставити CS50.h. Може бути, я буду потребувати stdio.h. Отже, дозвольте мені превентивно робити тим, і я буду називати цю student.c зараз і зберегти це. І тепер я можу щось зробити з цими змінними. І ми тільки збираємося написати що в якості коментаря в псевдокоді, тому що це не цікаво що ми робимо зараз. ОК, так що це програма, яка то зберігає студента. Що я хочу робити, якщо я хочете зберегти двох студентів? Так що мій перший інстинкт буде все буде добре, почекай хвилинку, якщо у мене є ще один студент, чому не я просто зробити ім'я рядка 2, рядок 2 гуртожитки, INT id2. І ми зробили пішов по цій дорозі до і яке ж було наше рішення, що, здається, щоб бути свого роду хаком пасти копіювання Робота тут? АУДИТОРІЯ: масив. Девід Дж Малан: Так, ми могли б використовувати масив. Право це дуже швидко стає громіздким. Ви повинні сортувати довільно почати називаючи всі ці змінні. А ви, людина, повинні мати відстежувати, що ОК NAME2 відповідає з dorm2 відповідає id2. Це просто стає безлад. Так що це набагато простіше, Нагадаємо, з кілька тижнів тому, просто того, щоб званих імена рядків і, можливо, дати нам три з них. І тоді, можливо, у нас є рядок гуртожитку і є три з них, або з константою, Int ідентифікатори і мають три з них. Але навіть зараз це відчуває трохи недбалий, право. Ми говоримо про студентів і поки Я дійсно зупиняючись на низькому рівні Деталі реалізації. Студент ім'я та гуртожитки і ID. Чому я не можу просто оголосити змінну називається студентом і називають це S. І якщо я хочу іншого студента, чому я не можу просто назвати це т. Або, якщо я хочу цілу купу студентів, чому я не можу просто у мене є цілий клас студенти, і це три з них. Іншими словами, чому я не можу прийти з моєю власною типу даних, званого Студенти, усередині яких є ім'я, є ідентифікатором, є гуртожиток, будь-яку кількість інших областях. І виходить, вам може зробити саме це. Так С має цю функцію під назвою структура. Це особливість мови, який дозволяє зробити саме це. Я збираюся йти вперед і відкрити structs.h куди ми йдемо, щоб побачити наступне визначення студента. Виявляється - і це одна навіть простіше, ніж той, за участю ідентифікатор Хвилину тому. Якщо ви хочете, щоб придумати Ваш домашній тип даних, і на додаток до INT, CHAR і і плавати і всі ці інші, які існують, Ви можете зробити це в буквальному сенсі писати TYPEDEF-структуру, то деякі фігурні дужки, усередині якого ви список змінних, які ви хочете зв'язати з цією новою користувальницької інформації введіть як ім'я та гуртожитку, а потім, після фігурних дужках Ви дати ім'я для нового типу даних. Так, наприклад, студент. І, що приємно про це зараз, що якщо ми подивимося на відповідний код, Конвенція, в першу все, це поставити це у файлі то точка год, файл заголовка, який ми не почали використовувати себе занадто багато. Але ми збираємося, щоб почати використовуючи зовсім небагато в даний час. І те, що ми можемо зробити з цим, У кінцевому рахунку, в ці кілька рядків коду це оголосити, що саме Тип даних, студент. А тепер давайте використовувати його. Я збираюся зараз заглиблюватися в файл називається structs1.c. І давайте подивимося на кілька характеристик тут. Таким чином, матеріал тут є здебільшого знайомі, і ми повернутися до того, що ні знайомі в хвилину. Це, звичайно, в тому числі мій власний Файл заголовка, який є новим, а також, для Pset 3, де окрім, Нагадаємо, у нас є helpers.h. Таким чином, ви, можливо, пам'ятаєте #include helpers.h. Чому, хоча я використовую цитати а кутові дужки? Коли я вибираю між ними? Майже завжди я, здається, використовувати кутові дужки. А потім, раптом на Лінія шостій я використовую подвійні лапки. Чому це може бути? Так? АУДИТОРІЯ: [нерозбірливо] Девід Дж Малан: Це актуально, що? АУДИТОРІЯ: Це в IDE. Девід Дж Малан: Так, що в моїй фактичної IDE. І давайте не будемо зупинятися на IDE, так як це просто інструмент, який я використовую. Ось у моєму струму Каталог, зокрема. Так structs.h мій власний файл не встановлений в IDE, в самій операційній системі, скоріше це в моєму поточному каталозі. Таким чином, Конвенція, якщо ви хочете щоб включити свій власний файл заголовка, Ви просто використовувати подвійні лапки. Що ми називаємо цю річ в лінія 8, взагалі кажучи? Це те, що? #define то. Це являє константи, вірно? Якщо ви хочете, щоб мати значення у вашій програмі використовувати цілий купу разів, це Гарне угоду фактор його, оголосимо його з хеш-символу визначити, то, відповідно до угоди, всього верхній регістр word-- хоча це не строго необхідним, але ця угода людиною заробити константи так що вони вистрибують у вас visually-- простір і те значення, яке ви хочете бути еквівалентно імені, що постійні в. Немає коми, але ви просто випливає, що малюнок є. Так що я роблю в цій фактичного коду. Отже, давайте поглянемо на основна програма тут. У рядку 12, тому що я включили structs.h, Тепер я чарівно на мою утилізація новий тип даних. Я не просто мати доступ до Int, і символ, і поплавок, і рядок, і синій та інші. Тепер у мене є доступ до тип даних студентом. Таким чином, у рядку 12, я об'єднання двох ideas-- один тип даних і два, з використанням масиву. І так у цій програмі, якщо Я хочу, щоб насправді підтримують три різні студентів в моїй програмі, я можна просто сказати, дайте мені змінну звані учні, кожен з яких це типу студентів, які мій користувальницький тип даних. І, зокрема, дати мені три з них в моєму масиві. Так що тепер нам робити в цій програмі? Ось тільки для контуру ітерації від 0 до 3, тому що це те, що величина студентів. Я просто пропонуючи користувачеві дати мені ім'я студента. І тоді в рядку 17, ми є в основному знайомі рядки. У нас є старий друг GetString праворуч. І те, що частина синтаксису мабуть, новий, якщо ви ніколи не програмували в C, перш ніж, і ніколи не використовував структур? Так? Аудиторія: .name. Девід Дж Малан: The .name. Але це не надто багато стрибком, тому що тепер студенти дужки I дає I-й студент. І якщо ви хочете, щоб пірнути всередині цієї структури, ви просто використовуєте один період і то ім'я змінної всередині, або властивість всередині, що Ви хочете, щоб отримати доступ до. Точно те, якщо я тоді спонукати Користувач, дай мені студента гуртожиток, Ви можете так само магазин, який рядок у змінній гуртожитку всередині цій студентській структури. А тепер все стає трохи фантазії. І це буде виглядати на, можливо, багато досить скоро. Але ви побачите, що це набагато більше Pset 4, так що давайте просто погляд на нього зараз. Виявляється, що в рядку 23 через 38, що ви думаєте, що я, можливо, робите? Я зняв коментарі на сьогоднішній день, але версія коду для онлайн- довідник має всі коментарі. Що я, здається, роблять? АУДИТОРІЯ: Збереження файлу з усіма інформація, увійшов користувач. Девід Дж Малан: Так, точно, це новий спосіб що ми бачимо два, Ще одна особливість C, в результаті чого я можу створити мої власні файли. До цих пір, майже кожна програма Ви написали є особою без громадянства. Як тільки це буде зроблено працює, от і все. Там немає пам'яті або спогад про нього. Там немає файлу зберігається. Але якщо ви хочете, щоб зберегти введення, який має сталося, як у грі або програмі як це, виявляється, ми можемо це зробити. І ви побачите, що це більш в Pset 4 і в розділі. Але ця лінія 23 по суті створює файл з ім'ям students.csv. І ви, можливо, бачили це раніше. Навіть якщо ви ніколи не вивчали CS раніше, CSV є розділених комами змінних. Це як дуже бідної людини версія файлу Excel, що означає, що вона може бути відкрита в Excel і в Apple, Numbers, і має рядків і стовпців. Але це не власність Формат, як Microsoft або Apple. Це просто коми, що розділяють цінності, які ми бачимо в даний час. І тільки зробити припущення. У рядку 23, в самому кінець, мій другий аргумент до цієї нової функції, званої е відкритий для відкритого файлу є ш. Що ж, можливо, позначають? Так? АУДИТОРІЯ: Це дозволяє записати у файл? Девід Дж Малан: Це дозволяє Ви пишете у файл. Таким чином, є пара варіантів що ми можемо підключити тут. Але якщо ви просто хочете, щоб прочитати файл, який дивитися на нього і читати його в пам'яті, вам просто використовувати лапки кінець цитати "г". Якщо ви хочете написати в Файл, ви використовуєте цитату кінець цитати "ж". Там же додавати і пару інших речей, якщо ви хочете змінити існуючі файли. Тепер ми збираємося, щоб бачити це річ, то ми повернемося до лінії 24. NULL, то виявляється, спеціальне значення, що можуть бути повернуті певних функцій якщо щось пішло wrong-- якщо файл не існує, якщо ви запустите з пам'яті, або купа інших помилок. Але зараз, давайте припустимо, що це просто звичайний перевірка помилок. Тут, в лінії 26, я ітерації від 0 до 3 протягом всіх моїх студентів. І це свого роду роду нової функції, fprintf, але просто взяти здогад. Якщо Printf просто роздрукувати отформатированную рядок, Що ж fprintf, ймовірно, означає? АУДИТОРІЯ: Друк у файл. Девід Дж Малан: Роздрукуйте отформатированная рядок у файлі. Це те, що додаткові е кошти файлів. І новий перший аргумент повинен бути змінна, яка представляє файл. Тоді ми просто повинні формат рядок, як Printf. І навіть якщо це Синтаксис є новим, це тільки кошти підключити ім'я студента, плагін в студентських гуртожитках, а потім з fclose, закрити файл. А потім lastly-- це новий і ми повернемося до цього Перед long-- Я звільняючи студент з причин що трапилося нагорі там. Але ми повернемося щоб що до long-- це тому, що, як це GetString насправді працює під капотом. Отже, давайте поглянемо тут. Якщо я друкую Ls в моєму каталозі, зауважити, що я не є файл з ім'ям students.csv, просто не існує, не існує. Так що, якщо зараз я скомпілювати цю програму, зробити Структури 1 ,. / Структури-1, і я збираюся йти вперед і ввести в Енді, який живе в Берклі в Єльському університеті. Ми збираємося, щоб мати Роба, який живе в Тайер в ці дні. І давайте придумати, де це, я думаю, Марія знаходиться в Mather, якщо я правильно згадав. Так що нічого, здається, не відбудеться. Але якщо я типу Ls зараз, є students.csv. Давайте йти вперед і відкритий students.csv. Це знову дуже легкий формат. Але я просто прийняла конвенцію що у мене є два рядків і стовпців тут. У першій колонці Перші імена людей. Другий стовпець учня гуртожитки, або коледж, або будинок, або ще багато чого. І тепер я зберіг це на постійній основі у вигляді файлу. Так що це не все, що цікаво. Але це всього лише сходинкою в даний час щоб бути в змозі збереження інформації постійно. Отже, давайте тепер подивимося, що ще ми можемо робити з цими та іншими функціями. Але спочатку, які-небудь питання? Це було багато, і це було швидко. Але ви побачите багато більш Pset 4, а також. Так? АУДИТОРІЯ: Чи є спосіб, щоб продовжити додавання імен в цей файл? Девід Дж Малан: Хороший вопрос. Чи є спосіб, щоб продовжити додавши імена цього файлу? Так. І справді, якщо ви в кінцевому до повторного відкриття файлу, Ви б використовувати цитату кінець цитати "а" для Append, який би просто додати новий рядок, А Нова лінія знову і знову, точно. Гарне питання. Інші питання? Так? АУДИТОРІЯ: Якщо ви побіг Програма знову прямо зараз, б це продовжувати додавати імена в подати або це відкрити новий файл? Девід Дж Малан: Ах, гарне питання. Якщо ви знову одразу побіг програма Тепер, можливо, ввели в нові імена, це може додати в файл або перезаписати файл? Останнє, тому що я не використовуючи на додавання режиму. І тому, що я просто сліпо відкриття файлу для запису, це просто буде перезаписувати файл. Так що я дійсно потрібно буде зробити, це додати, якщо я хочу насправді є довгий термін бази даних. Тепер CSV корисно, чесно кажучи, навіть для, як, якщо ви writing-- і ми в кінцевому підсумку бачимо це пізніше в семестр, коли ми використовуємо томів CSV для інших цілей. Якщо ви хочете зберегти всіх людей хто зареєструвався для якої-небудь події, або зареєструвалися для студента група або щось подібне, зберігання даних в цьому роді формату супер зручно. Тому що буквально, якби я були завантажити цей файл. Я міг би й double-- давайте насправді намагаються це якщо у мене є Excel або Numbers тут. Я збираюся правою кнопкою миші або контроль кнопкою миші мій файл. Упс. Клацніть правою кнопкою миші або контролю кнопкою мій файл. Давай, моя миша не співпрацює. Download-- я збираюся завантажити всі файли ось так тільки так я можу захопити цей. І давайте подивимося, якщо це працює students.csv-- перший раз Я активував. Тепер вони хочуть, щоб побачити мої контакти. Тепер, мені потрібно, щоб зареєструватися. Подивіться, як легко це використовувати томів CSV? Так, тримати його в курсі. Добре, тепер ми готові до класу. ОК, ну, що нового? ОК, близько. Це було чарівно. Добре, тепер у нас є, щоб оновити. І зараз, це забув, що подати Спочатку я відкрив, але те, що A-- ми йдемо. ОК, так що тепер у нас є файл Excel. Дякую. ОК, так що те, що я робив, було легко. Звичайно, я міг би заздалегідь встановлені Excel, або чисел, або те, що програма. Але це добре, тому що Тепер я можу маніпулювати Дані в стандартному форматі. Так що тепер давайте контекст перейти до де ми зупинилися минулого разу, який був почати зняти навчальні колеса. Але спочатку, ви не зробили подивитися раніше обід відбувається знову тут Вогню і Лід в Кембриджі, Ситар в Нью-Хейвені. Зареєструватися на сайті CS50s якнайскоріше приєднатися до студентам і співробітникам CS50. Тому ми прийняли навчальні диски в понеділок, як follows-- Рядок був оголошений в Бібліотека CS50s протягом деякого часу. І це добре, тому що це дозволяє нам говорити про змінних як повних слів і пропозицій і багато іншого. Але, виявляється, рядок не існує. Це просто синонімом, або псевдонім, що ми створили за те, що насправді трохи більше технічна називається символ *. І справді, ми бачили приклад програми на понеділок що не ведуть себе абсолютно, як ми очікували. Це був файл, порівняти і 0. І нагадаємо, що порівнювати-0, якщо Я перекомпілювати програму понеділок і запустити порівнювати-0 і введіть в маму в нижньому регістрі, і мама в нижньому регістрі знову. Програма наполіг, щоб я введіть різні речі, навіть якщо мама, все в в нижньому регістрі, ідентичний візуально. Так що ж коротку відповідь чому комп'ютер вважає ці два рядки відрізняються? Так? АУДИТОРІЯ: [нерозбірливо] Девід Дж Малан: Вірно. Так, мама, вперше Я введіть його в, в даний час зберігаються десь в моїй комп'ютера пам'яті, але в іншому місці ніж вдруге я друкую в мамі. Тепер, звичайно, могли бути оптимізовані. Комп'ютер може бути розумним і реалізувати ці два рядки, гей, вони ідентичні. Дозвольте мені не надлишково зберігати його. Але комп'ютери не роблять, що оптимізація, якщо ви не скажете ім. Так, за замовчуванням, вони просто хочу, щоб в кінцевому підсумку в двох різних місцях в пам'яті. І так більш зрозуміло, коли ми порівняли два рядки, Перша називалася років, другий був викликаний т, що конкретно я був Порівняння тут, на лінії 13? Так. АУДИТОРІЯ: Це місце в пам'яті що змінна буде вказувати на. Девід Дж Малан: Точно, я був Порівнюючи місце в пам'яті що ці змінні вказують на. Так зокрема, якщо мама була в Номер байта 1, і 2, і 3, і 4--, бо пам'ятаю, зворотний слеш 0 повинна бути повністю в кінці. А інший примірник мама, м-о-м, був за адресою 10, 11, 12 і 13. Я порівнював 1, що адреса, що розташування в пам'яті, проти 10, який очевидно, не те ж саме. 1 не 10. Так що це добре в тому, що це досить просто. Але це проблематично, оскільки ми не можемо, здається, для порівняння рядків. Так fundamentally-- і в цьому низькому рівні, якщо ви хочете реалізувати програма для порівняння два окремі слова, які користувач ввів в якість, вони шикуються символ для символ, тільки в загальних рисах, те, що нам потрібно зробити, мабуть? Це не досить просто подивіться на ці дві адреси. Що нам потрібно робити? Так? АУДИТОРІЯ: перебирати рядок [нерозбірливо]. Девід Дж Малан: Так, давайте перебору рядка. Давайте використовувати цикл, у той час як петлі, або Все, що ви найбільш комфортно. І якщо у нас є два рядки десь в пам'яті, давайте подивимося на кожен років Перший символ, то кожна друга характер, то третій, і четвертий, і п'ятий, поки ми не потрапили те, що особливе значення сторожового? АУДИТОРІЯ: [нерозбірливо] Девід Дж Малан: Так, зворотний слеш нулю, і в цей момент в будь-якому рядки ми можемо вирішити, що це його. Хіба ми відповідає кожен символ? Якщо ні, повернутися помилковим. Якщо це так, повертає істину. І так, що саме те, що ця версія програми порівнювати-1.c робить. Це ідентично тому, що ми подивився на понеділок крім того, що я позбувся слова string-- хоча що не має ніякого функціонального impact-- все Я зараз роблю це видалення деякі візуальні навчальні диски, але ясно бачити, що с і Т-адреси. І це те, що зірка, зірочка, являє це адреса, в іншому випадку відомо більш технічно як покажчик. Так що, коли я заявляю, з на рядок 9 і говорять символ * с, це не означає, дати мені рядок. Це означає, що дати мені змінну, Ціль у житті є зберігання адреси. Тому що я збираюся поставити адреса рядка в ньому. І справді, GetString, щоб бути ясно, не повертає рядок. Він не повертає мамі Обернена коса риска нулю, як такі. Що конкретно GetString і точно повернутися? АУДИТОРІЯ: [нерозбірливо] Девід Дж Малан: адреса, адреса адресу першого символу в якійсь рядки він отримав. І ось тепер ми бачимо спеціальне ключове слово знову. І, я згадував про це раніше. Це буде добре конвенція що ми побачимо знову і знову тепер. Я перевіряю, щоб переконатися, що з не нульовий і т не є нульовим. Тому що на основі мого дійсно Швидкий згадка раніше, те, що може означати, якщо не повертає GetString адресу, але Н-У-Л-Л, що знову-таки, деякі особливе значення? АУДИТОРІЯ: Помилка. Девід Дж Малан: Це помилка. Щось пішло не так. І те, що, як правило, може статися, особливо з strings-- яка може бути з невідомої довжини в advance-- Можливо комп'ютери » з пам'яті, може бути, Ви ввели в такому довге слово або пропозицію або вставити таку величезну есе там просто не вистачає пам'яті. І так GetString не може повернутися адреса всій речі, так що просто нічого не повертає. І це говорить про помилку відбулося повернувши особливе значення NULL. Це нульова адреса, так сказати. Тепер з'ясовується, С поставляється з Функція, яка робить цю ітерацію. Ми не повинні реалізовувати це з для циклу або час циклу самі. Ми можемо використовувати функцію, називається лаконічно, перемішати комп, або рядок порівнювати, чия Ціль у житті є саме це і роблять. Ви даєте йому два покажчика, дві адреси, і вона буде йти за цими адресами а потім порівняти лист для буква в букву за якість, зупиняючись тільки коли те, що це правда? Коли інтуїтивно слід перемішати комп припинити ітерації, просто щоб бути зрозуміло? Коли вона потрапляє зворотний слеш 0 в будь-якому Рядок, в цей момент він може вирішити, має все відповідає, або ще не було невідповідність? Таким чином, якщо ми запустимо це зараз і намагаються наша маленька капіталізація гра, тому переконайтеся, порівняти-1, ./compare-1, і введіть мама в нижньому регістрі обидва рази. Тепер те ж саме. І якщо я зроблю це знову рядкові і прописні то, можливо ,. Тепер дійсно відрізняє між великими та малими. Так що не все так складно, або чарівний, але це зараз пояснимо що відбувається під капотом. Так що ще ми можемо витягти від цього виду уроку? Отже, давайте поглянемо на це. Я збираюся йти вперед і написати Швидкий програми тут називається копіювання 0. А тепер давайте йти вперед і фактично давайте зробимо this-- з копією 0, поглянемо на те, що я потрапив сюди. Я спочатку розповісти користувачеві, щось сказати. Тоді я отримую рядок і я зберіг його в с. Потім я перевіряю, якщо їй дорівнює дорівнює NULL, просто повертає 1. Так що це просто стандартна перевірка помилок. Нічого цікавого не відбулося. І справді, якщо ми позбудемося помилки перевірки, як це виглядає тиждень 1 коду на даний момент. Але я почав, щоб отримати трохи краще про це. Зараз у лінії 16, тиждень тому, може бути, навіть пару днів або годин тому, Ви могли б сказати лінії 16 Створення змінної називається т і копіювання S в нього. І це абсолютно розумно винос. Але точніше досі. Що відбувається у рядку 16? Що стає скопійовані справа наліво? Так? АУДИТОРІЯ: т отримувати це адреса з? Девід Дж Малан: Рівне, т стає адреса с. Таким чином, щоб бути ясно, тепер, якщо я йду повернутися до цього попередньому прикладі і я витягнути річ я надрукували. І те, що ми набрали in-- ось с, а ось це те, що я набрав в десь в пам'яті, мама, а потім зворотний слеш 0, який додається для мене. Те, що я зберігаються тут, нагадаємо, Це в місці розташування 1, 2, 3, 4, це те, що в даний час в с. Так що, якщо в рядку 16, я кажу дайте мені іншої змінної називається т і магазин за меншою вартістю з, те, що отримує зберігається тут не буде мама а просто число 1. Так що, якщо ми подивимося вперед у цій програмі Тепер, що станеться? Так зауважити, що є ця функція ви могли використовував це якийсь час назад для Цезаря, або Vigenere, чи, може бути, не на всіх. Я стверджую, з моєї Printf, я збирається отримати вигоду копіювання т. Перший в лінії 19, швидко розсудливості перевірити, STRLEN перевіряє довжину т. Тому що я не хочу, щоб спробуйте скористатися щось якщо немає рядка там. Якщо користувач просто натисніть Enter, немає нічого, щоб отримати вигоду. Так що я не хочу, щоб зробити лінію 21. Так лінія 21 спекулюючи яка буква, мабуть, в т? АУДИТОРІЯ: м? Девід Дж Малан: Це виглядає як це копіювання який? АУДИТОРІЯ: м. Девід Дж Малан: Е-е, м. Отже, першим т, тому повідомлення, що я перейти до TOUPPER, що якщо ви ніколи не бачили його, це просто функція вигоду в якості вхідних даних. т кронштейн нуль означає дати мені нульовий характер т. І так, як робить це зміна зображення, щоб було ясно? Що потрібно, щоб переписати або змінити по відношенню до S і T і мама Обернена коса риска нулю. АУДИТОРІЯ: [нерозбірливо] Девід Дж Малан: Так, так що це одне тут просто необхідно отримати змінилося, метою яких виправити this-- необхідно отримати змінений на літери М. Але тепер, подивіться пізніше в Програма, якщо я роздрукувати с і т, як я чищу тут, дивитися те, що відбудеться роздруківки з і т. Так що копіювання 0, ./copy-0. Дозвольте мені йти вперед і ввести в мамі в нижньому регістрі. Зверніть увагу, як оригінальний і копія були капіталізовані. Чому? Ну, з т і обидва вказуючи на, якщо хочете, те ж саме шматок пам'яті. І, чесно кажучи, це стає дійсно uninteresting-- той факт, що ми використовуємо адреса нулю тут. Я маю на увазі, я дійсно не хвилює, де матеріал в пам'яті. На жаль, я стирання занадто багато. Але я дійсно не хвилює, де речі знаходяться в пам'яті. І так, дійсно те, що програмісти схильні думати про є те, що коли ви говорите про адреса, або покажчик, хто піклується, де вона знаходиться в пам'яті. Я не хвилює, якщо це в байт один або один мільярд. Я просто все одно, що це змінна ефективно вказуючи на те шматок пам'яті. І так відтепер замість каламбур над довільним адресами пам'яті, давайте просто почати малювати покажчики як покажчики, як стріли. Так що з і т насправді, відповідно з цією програмою, тому що, як я створив т, це просто два окремих змінних вказуючи в той же шматка пам'яті. І ми не хвилює, де вони знаходяться. Таким чином, ми можемо абстрагуватися від цієї деталі. Так як я можу це виправити? Якщо я хочу, щоб написати версію копії програма, яка безпосередньо копіює рядок і капіталізує тільки копія, просто інтуїтивно, що отримав бути інгредієнт для нашого рішення? АУДИТОРІЯ: [нерозбірливо] Девід Дж Малан: Нам потрібно що? АУДИТОРІЯ: Шматок пам'яті. Девід Дж Малан: Ми повинні інший шматок пам'яті, вірно? Ми не знаємо, як зробити його ще, обов'язково. Але я начебто потрібно, щоб це відбулося, так що оригінальний мама в нижньому регістрі закінчується в той додаткової шматок пам'яті. А потім, коли я змінити копію, я не хочу, щоб змінити цю копію тут. Я замість цього хочете, щоб змінити тільки цей копія, так що оригінал залишається незмінним. Отже, давайте подивимося, як ми можемо це зробити. У копія-1, який вже був позбавлений коментар, але прокоментував онлайн. Замість цього ми зробити це following-- лінії ідентичні, дай мені рядок і називають це S. Але тепер давайте подивимося на один з наших найбільш складний, але останній через складність на деякий час, рядок 16 робить саме це. Так що, якщо ваш зручний з Картина, яку ми тільки що drew-- дати мені нову частину пам'яті, скопіювати всі в неї, давайте подивимося, як ми переводимо що код. Так лінії 16, на лівій стороні, символ * т дає мені цю коробку тут. Це все, що він робить. На правій стороні, м Alloc, або Танос, є виділення пам'яті, супер фантазії, загадкові спосіб просто говорю дати мені шматок пам'яті. Скільки пам'яті потрібно? Ну, це свого роду великий вираження. Але давайте подивимося, що він говорить тут. Так що це, звичайно, дати мені довжину рядка з с. Так, мама це має бути? Так що три, чи не так? мама трьох символів. Ви не порахувати Обернена коса риска нуля, коли ви говорити про довжині рядка це Насправді людини видимі літери. Так мама, так що це дає мені 3. Але зачекайте хвилину, я зараз, додавши 1. Чому я насправді хочу, щоб виділити 4 байта, а не тільки 3? Так? АУДИТОРІЯ: Для значення дозорного? Девід Дж Малан: Рівне, для цього значення дозорного. Для зворотної косої межі нульовий, Мені потрібно всього 4 байта. Тому мені потрібно довжину рядки плюс 1. А потім просто для гарного measure-- навіть якщо на цій системі, це завжди буде 1-- Я говорю помножити це розміром з гольця. Виявляється SizeOf це оператор в С, просто говорить вам, в кількість байт, що це потрібно для певного типу даних. Це не працює для масивів, Як правило, іноді він робить. Але в загальному випадку, немає. Але він скаже мені, скільки байтів, символ є, що виявляється завжди 1. Так що це, як множення на 1. Так супер загадкові дивлячись рядок коду. Але все це робить дає мені шматок пам'яті. Але це, здається, копіювання нічого в цій пам'яті? Ще ні. І так що я на лінії 22, а 23, 24, 25, ну, я просто це зробити. І це свого роду стара школа матеріал в даний час. Це як Pset 2, де Ви просто переміщення речі навколо в пам'яті, або, скоріше, у рядках. Так що я ітерації від 0 до довжина рядка с. І я копіювання я-й символ в с в я-го символу в т. І тому, що я, програміст, зробив Обов'язково виділити рівно стільки байтів як мені потрібно, це прекрасно один-до-одного. І я скопіювати маму нижній регістр на новий. А потім, нарешті, я цю лінію. І так що ефект тільки заробити цю т тут. Так багато, щоб поглинути, але якщо ви просто розглянути що насправді відбувається на під капотом просто рухається них Байти навколо, все, що Необхідно, щоб вирішити цю проблему просто щоб дати нам цей шматок пам'яті. Тепер на ризик Переважна, дозвольте мені показати один приклад, який майже ідентичні, за винятком одного цього рядок коду. Так що це хакер версія цієї програми, якщо ви будете. Але давайте просто переганяти це в те, що відбувається. Лінія 24 використовується, щоб бути в цьому т Кронштейн я отримує и кронштейн я. Тепер, я міняю це набагато більш загадковими зірка т плюс 1 дорівнює зірка з плюс 1. Так, що відбувається і чому у нас є зірки характер? Ми бачили зорю колись, і він використовується по-різному тут. Ми раніше бачили символ *, тепер я бачу зірка на початку, і це нормально. Тому що виявляється ми може укласти свого роду просто від тих, в першу чергу принципи, що відбувається. Так просто бути зрозуміло, що їй? Минулого тижня, це було рядок. Чого не вистачає більше. Що їй конкретно? АУДИТОРІЯ: [нерозбірливо] Девід Дж Малан: Це покажчик. Це адреса Перший символ ми набрали в. Добре, що це т? АУДИТОРІЯ: [нерозбірливо] Девід Дж Малан: The адресу першого байта в т, що частина пам'яті перерозподілені. Ось і виходить, що, коли ми ітерації від 0 до від рядка length-- в першу чергу, я починається з 0, тому що цієї старої школи петлі речі. Так що для простоти, давайте Припустимо, що перший рядок коду насправді просто це, право. Якщо я дорівнює нулю, додавши нуль до чогось, ймовірно, не матиме ефекту. Так що це висловлювання? Виявляється, зірки Оператор в даному контексті це разименовать Оператор, який знаходиться всього химерний спосіб сказати перейти за наступною адресою. Так що, якщо їй це адресу першого характер цього шматка пам'яті, * З засобом йти туди. І тому, що ми намалювали картина, таким чином, Ви можете прийняти наступна модель психічного. Якщо це їй, а ви говорите * S * S, ніби як жолобів і сходів, якщо ви пам'ятаєте гру з дитинства, це як слід, що стрілку і перейти за адресою. * Т те ж саме. Так що почніть тут, перейдіть до його шматок. Я не можу просто намалювати на Цей екран таким чином. * Т означає йти сюди. І потім, для циклу це просто кажучи перемістити цей символ тут, перемістити цей символ тут, перемістити цей символ тут. Але як я можу зробити це прирощення? Мені потрібно, щоб виправити те, що я тільки що видалили. Це те, що зазвичай називають арифметика покажчиків, які означає математику з адресами. Якщо в цей цикл, Я продовжую збільшуючи I, і з являє собою адресу і т є адресу, якщо я просто буду додавати 1, це просто означає, продовжувати рухатися вперед, і вперед, і вперед в пам'яті. Це як Оксфорд-стріт, Вулиця, що будівля КС на. У CS будівлі знаходиться в 33 Оксфорд-стріт. Так що, якщо ви повинні були зробити 33 Оксфорд-стріт плюс 1, що приносить вам 34 Оксфорд Вулиця, то 35 Оксфорд-стріт, потім 36 Оксфорд-стріт, всі ті, будівлі насправді - якщо вони існують. І так, що все, що ми робимо тут з арифметикою покажчика. Так що це супер таємницею спосіб вираження себе. Але все, що відбувається під капотом тільки наступні адреси, як після карти, якщо хочете, або після стрілки як ми намалювали на екрані. ОК, багато, щоб переварити. Будь-яке питання по синтаксису, концепції, покажчики, Танос, тощо. Так, тут в першу чергу. АУДИТОРІЯ: Так де, що говорить * т дорівнює ToUpper * т, є те, що збирається скористатися всі букви або просто-- Девід Дж Малан: Ах, дуже гарне питання. Таким чином, в цій лінії тут, 31, це збирається отримати вигоду перша буква або всі листи. Так давайте відповімо, що, перейшовши повернутися до перших принципам. І перші принципи тут я маю на увазі просто зайдіть на основних визначень що бере участь. Так ToUpper це функція що капіталізує напівкоксу. Це все. * Т означає йти до first-- перейти за адресою в т. Так, в картині, якщо це шматок пам'яті ми виділили з Танос, і це т, * т означає йти сюди. Тим часом, ви передаєте що значення, в нижньому регістрі м щоб ToUpper, ви отримуєте назад Столиця М, де ви покласти його? Ти ставиш його в тому ж місці. І так по цій логіці тих, основні визначення, що це тільки першої літери якщо ви не ітерації з I або а цикл або час циклу, він не збирається робити що-небудь більше, ніж ви запитаєте його. Гарне питання. Так? АУДИТОРІЯ: Чому ви використовуєте разименовать методу, а не масив? Девід Дж Малан: Ах, гарне питання. Чому б вам використовувати разименованія Метод замість методу масиву? Немає особливих причин, не бути чесним. І справді, для цього вигляд, наприклад, право, Я просто стверджуючи, що робить Програма складніше, більше очі скління над, люди перевіряючи тому що це виглядає супер таємницею, але навіть якщо він робить те ж саме. І так, чесно кажучи, це надмірно візуально комплексне рішення до проблеми. Він як і раніше хороший дизайн, п'ять з п'яти дизайну, будь то в кронштейні позначення або позначення покажчика. Но-- особливо, коли ми отримуємо пізніше в ході в Pset 5 коли ми реалізуємо цю словника, Я вже згадував пару times-- ми насправді піклуються про адреси низький рівень пам'яті що ми дійсно розуміємо, що відбувається. Але зараз, виявляється, що це рядок коду тут квадратні дужки насправді не існує. Вони, що називається синтаксичний цукор, який це просто дивно прохолодно спосіб сказати компілятор перетворює квадратні дужки, щоб бути що математичний вираз. Так що це людина конвенції щоб мати можливість просто написати ці дуже зручні кронштейни. Але те, що компілятор, брязкіт, насправді робить будь-який час Ви пишете що виділений відповідно 24, під капотом, це дійсно перетворюючи його на це. Це просто більш приємним, як людина читати і писати код, як лінії 24. Але врешті-решт тих, навчальні колеса занадто відірватися коли своє власне комфорт міцніє. Гаразд, так згадати те, що це був свого роду великою проблемою ми побігли в. І це те, що викликало це ціле млинець розмову про покажчиків, і адреси, і копіювання речі. Це тому, що ми спіткнувся це нерозумно, нерозумно питання, в результаті чого Я реалізував logically-- з Лорен тут, на демо і апельсинового соку в milk-- абсолютно алгоритмічно правильна функція для перекачування дві змінні " значення, але риса не має якого-небудь постійні або постійний, ефект на мій код. І чому? У двох словах, чому це Реалізація обміну логічно правильно, але не має ніякого впливу від змінних, які передаються йому, як х і у для основної? У чому ж суть питання? Так? АУДИТОРІЯ: Тому що змінна зробив копії змінної в проході через функцію. Девід Дж Малан: Рівне, коли ви проходите змінні в функції, чи аргументи у функції, вони прийнятий примірнику, який означає, що ви отримаєте ідентичний дивлячись зразок бітів для обох х і у, називається тут і б. І ви можете зробити що-небудь Ви хочете з цих копій, але вони збираються мати НЕ Вплив на зухвалу функцію. І справді, ми звернули, що зображення на екрані, нагадаємо Останній раз, в результаті чого, якщо вам дійсно думаю про те, що це відбувається під hood-- якщо це пам'ять комп'ютера, і тут є шматок пам'ять використовується для основної, це шматок пам'ять використовується для обміну, і тому, навіть якщо основна має дві змінні х і у, своп може мати ідентичні дивлячись Значення, обидва з яких є 1 і 2, але вони повністю різні ділянки пам'яті. Таким чином, ми повинні рішення цього. І, чесно кажучи, здається, що ми тепер є рішення цієї проблеми, правильно. Якщо зараз у нас є можливість для маніпулювати речами шляхом адрес і, начебто лотки і сходи стиль, виконайте такі стрілки і нікуди ми хочемо в пам'яті, ми не могли вирішити цю проблему переходячи від основної поміняти НЕ цінності, які ми хочемо, щоб своп, але тільки інтуїтивно те, що ми могли б пройти, щоб поміняти замість цього? [Реле ГОЛОСИ] Девід Дж Малан: Чому б нам просто не передати його адреси, вірно? Чому б нам не дати обміняти Карта скарбів, якщо хочете, що призводить до його фактичні значення х і у. Давайте підкачки, насправді змінити ці оригінальні біти, а не просто проходячи копії біт. І так, насправді, це те, що буде рішення. Ця версія тут ясно погано і недоліки. І тепер, на перший погляд, це просто виглядає як ми додали купу зірок випадковим і перетнув пальці що б зібрати. Але, в даний час компіляції буде. Але давайте подивимося, що означають ці речі. І, на жаль, автори З міг би вибрати інший символ щоб зробити це трохи ясніше, але зірка оператор має різне значення в два різних контекстах. І ми бачили, як, але давайте розрізняти. Так на вершині там, коли я змінив а і б від того, INT в в погано Версія для INT зірок, а, б, раніше, були цілі. Які а і Ь в даний час в хороший, зелений версія? Вони адрес. Адреси що, щоб бути ясно? Адреси чисел. Тому той факт, що я кажучи INT зірки кошти це адреса ціле число, зокрема. Так що тепер помітити в рядків коду, щось ще надто змінилася. TMP залишається незмінним, оскільки це просто тимчасове ціле, немає чарівної пам'яті там. Але в даний час потребує зірку. І, справді, кожен другий згадка а і Ь, зауважити, що все, що зміни від червоного до зеленого є те, що я, випереджаючи ці змінні із зірками. Тому що я не хочу, щоб скопіювати і б. Тому що, якщо я просто скопіювати А і В і обмін а і б, що я насправді обмін? Всього адреси, я хочу, щоб поміняти що в цих адрес. Я хочу, щоб піти туди. І так зірка оператор всередині моєї функції, не всередині списку параметрів, означає, що ви йдете за цими адресами а насправді змінити ці значення. Отже, що ж картину виглядати так, як замість. Ну, якщо замість цього я проходження в а і б НЕ 1 і 2-- Я насправді потрібно, щоб додати одна визначення тут. Отже, нехай цього блоку пам'яті знаходиться в місці 10. Це в місці розташування 11, але це це трохи спрощення, Тепер у мене є два варіанти я пройти х і у або мені пройти їх адреси? Якщо я проходжу їх адреси як це, я просто Тепер потрібно реалізувати своп за зеленою код так що, коли він бачить, і коли він бачить б, не просто скопіювати а і Ь і рухатися молоко і апельсиновий сік. Молоко і апельсиновий сік Метафора в даний час ламається, тому що ті чашки рідких і не карт. Замість цього ми повинні йти для вирішення 10 і ми потрібно йти до вирішення 11, і потім виконати, що перестановка логіку. Тому логіка та ж, але нам потрібен трохи інший спосіб доступу ці змінні. І так, зрештою, те, що Програма має виглядати ця. У swap.c буквально скопійовані і вставити зелений версії. Але мені потрібно, щоб зробити одна зміна. Це не досить просто змінити підкачки. Які інші рядки коду мені потрібно змінити? Так? АУДИТОРІЯ: Де він приймає аргументи. Девід Дж Малан: Де він приймає аргумент. Так що, якщо я прокрутки вгору на головну, я не може просто передати по х і у, і я обіцяю, останній шматок нового синтаксису сьогодні. Мені потрібно пройти в НЕ х і у, але також адреса хну. І виявляється, символ що автори вибрали C , Якщо ви використовуєте амперсанд тут, чи не плутати з побітового амперсанд, якщо ви використовуєте амперсанд тут і амперсанд тут, це з'ясовує для вас, що адреса X, може бути, це 10, то це адреса у, може бути, це 11, і передає ті, в замість. Так багато, щоб поглинути все відразу. Але давайте тепер подивимося швидко наші залишилися чотири хвилини де все може піти шкереберть. І, як у бік, насправді Я взяв цю картину, TF взяв цю картину в рік чи два тому. Так що це ще кут Еліота їдальні. Покажчики є, мабуть, найважча тема, що ми розглянемо в CS50. Так що, якщо ви турбуєтеся вид нахилу, як може бути, це більш хокейної ключки як це, розумію, ми начебто наближається пік Умови концептуальної складності. І я виховую це фото, бо я клянусь, богу, восени 1996 року, коли я взяв CS50 з моєї викладацької хлопець, Нішат Мехта, він посадив мене в кут Еліот Д. Хол за обідом, або вечерю, або щось, щоб спробувати щоб допомогти мені зрозуміти покажчики. І це, де я був тижнів після вона була введена в лекції коли це Я, нарешті, зрозумів покажчики. І я сподіваюся, що це натиснуть набагато раніше для вас. Але розумію, що це абсолютно серед більш складні теми ми дивилися на. Але це одним з найпотужніших. І коли ви отримаєте його, це дійсно все просто хочу, щоб, нарешті, прийти разом. Так будьте впевнені, це не потрібно всього раковиною у сьогоднішній день. Так от остання програма ми будемо дивитися на. І ми збираємося, щоб закінчити з швидкі три хвилини claymation зробив наш друг, Нік Parlante. Ось програма, що на двох верхніх Лінії оголошує змінну х і у. Обидва з яких є адреси цілих чисел, AKA покажчики. Ми тоді виділити достатньо пам'ять для зберігання Int і зберігати адреса цієї пам'яті в х. Таким чином, це ще простіше Наприклад, ніж раніше. Дайте мені чотири байти пам'яті, це розмір з Int, і поставити цю адресу в х. Ця лінія означає тут перейти за адресою в х і поставити значення життя, число 42 є. Але ця лінія мене турбує. Зірка у кошти йдуть на адресу в у, і поставити там нещасливе число 13. Чому це небезпечно, в цій точці в story-- хоча швидко сказав в наших слабшає хвилин here-- чому це погано для мене, щоб сказати, перейти за адресою у м? АУДИТОРІЯ: Ви не [нерозбірливо]. Девід Дж Малан: Я не покласти що-небудь в у. Так що значення у, на даний момент у цій історії? Ми не маємо ні найменшого поняття. Це деяке значення сміття і також не Бінки знаю. Якби ми могли закінчити на цій ноті. [ВІДТВОРЕННЯ ВІДЕО] Гей, Бінки, прокинутися. Це час для покажчика задоволення. -Що це? Дізнайтеся про покажчиків? О, позитивний герой. -Ну, Для початку, я думаю, ми знадобиться пару покажчиків. -ДОБРЕ. Цей код виділяє два покажчика які можуть вказувати на цілих чисел. -Добре, Добре, я бачу два покажчики, але вони чи не здається, вказуючи на що-небудь. -Це вірно. Спочатку покажчики не вказує ні на що. Речі, які вони вказують на це називається pointees і установка їх окремий крок. Ох, вірно, вірно. Я знаю це. У pointees окремо. Отже, як ви виділити pointee? -Добре, А цей код виділяє нова число pointee, і ця частина комплекту х, щоб вказати на нього. Гей, що виглядає краще. Так що це щось робити. -Добре, Я буду разименованія покажчика х до зберегти номер 42 в його pointee. Для цього трюку, мені потрібне моє Чарівна паличка разименованія. -Ваш Чарівна паличка разименованія? Е-е, що це здорово. -Це Те, що код виглядає. Я просто встановити кількість і-- [POP SOUND] Гей, подивіться там йде. Так, роблячи разименованія на х наступним стрілка, щоб отримати доступ до його pointee. У цьому випадку для зберігання 42 там. Гей, спробуйте використовувати його, щоб зберегти номер 13 через інший покажчик, у. -ДОБРЕ. Я просто піду сюди, щоб у, і отримати номер 13 Настройка. А потім взяти паличку разименованія і просто-- [Звуковий сигнал] Ох, гей, що не працює. Скажіть, ну, Бінки, я не думаю разименованія у це гарна ідея, тому що установка вгору по pointee окремий крок. І я не думаю, що ми коли-небудь робили це. -Hmm, Хороший момент. -Так, Ми виділили покажчик, у, але ми ніколи не ставили його, щоб вказати на pointee. -Hmm, Дуже спостережливі. Гей, ви шукаєте там добре, Бінки. Ви можете це виправити, так що у точки до того ж, як pointee х. -Звичайно, Я використовую свій чарівну паличку присвоєння покажчика. -Це Буде Проблема, як і раніше? Ні, це не стосується pointees. Це просто змінює одна покажчик щоб вказати на те ж саме thing-- [Бавовною] --as інший. -О Я бачу. Тепер у вказує на те ж місце, що і х. Так, почекайте, зараз у фіксоване. Він має pointee. Таким чином, ви можете спробувати паличку разименованія знову відправити 13 протягом. Ох, добре, тут йде. Гей, подивися на це. Тепер разименованія робіт з у. І тому, що покажчики діляться що однією pointee, вони обидва побачити 13. -Так, Обмін, е-е, що завгодно. Так, ми збираємося, щоб помінятися місцями зараз? -Ой, Дивіться, ми поза часом. -But-- -просто Пам'ятайте три правила покажчик. Кількість 1, базова структура є те, що у вас є вказівник, і вказує на більш pointee. Але покажчик і pointee окремо. І загальна помилка є створення покажчик але забудьте дати йому pointee. Номер 2, покажчик разименованія починається з покажчиком і слід його стрілку над щоб отримати доступ до його pointee. Як ми всі знаємо, це працює тільки, якщо є є pointee, який вид отримує назад правити номер 1. Номер 3, покажчик присвоювання одного покажчика і змінює його, щоб вказати на само, як pointee інший покажчик. Таким чином, після завдання, дві покажчики буде вказувати на той же pointee, іноді, що називається спільне. І це все, що є в ньому, насправді. До побачення в даний час. [КІНЕЦЬ ПЕРЕГЛЯДУ] Девід Дж Малан: Ось це для CS50. Завдяки професору Нік Parlante. Ми будемо бачити Вас на наступному тижні. [Електронний відтворення музики]