DAVID Малан: Добре. Так що це CS50, і це Тепер початок три тижні. Так до сих пір, ми не маю писав програми в C що виглядає трохи як то так вот. Отже, ми отримали пару Різке включає в верхній частині. У нас є Int, головна, недійсними, і потім те, щоб зробити в середині, деякі шматок коду всередині з цієї функції. Але ключ був той факт, що ми говорили недійсними тут. Так недійсними, весь цей час, вказує що ця програма, при запуску, може бути запущений тільки через його імені. Ви не можете ввести будь-які інші слова або Цифри після назви програми при запустити його. Так, наприклад, якщо програма була зібрані у файлі під назвою Привіт, ви могли б зробити ./hello, але що це таке. 

Єдиний спосіб, яким ви могли б внести свій вклад в цю програму є шляхом виклику функції. Наприклад, що функція були ми, використовуючи до сих пір для отримання даних від користувача? 

АУДИТОРІЯ: Отримати рядок. DAVID Малан: Щоб отримати рядок, або отримати Int, або ви бачили інших, навіть якщо ви не використовували їх ще, як отримати багато, багато тощо. Але припустимо, що ми насправді хочете, щоб почати написання програм, які трохи більше універсальний, і, чесно кажучи, трохи більше як команди, що ви отримував, як ми сподіваємося, трохи звикли. Як кд простору Dropbox. Це, звичайно, зміни ваш каталог, припускаючи ви знаходитесь в будинку Джона Гарварда каталог, в папку Dropbox. Між тим, команда, як це створює нову папку з ім'ям pset2, як ви, напевно, вже або скоро для завдання встановити два. Зробити Привіт, звичайно, є командою , Яка будує програму під назвою привіт з файлу під назвою Привіт точка с. І в кожному з них випадки, зараз, у нас було забезпечують аргумент на так званий командного рядка, блимає швидко, так що марка знає що будувати, і так що MkDir знає, що папка, щоб створити, і так, що CD знає де ви хочете піти. Але до цих пір, ми постійно говорять що головна ваша функція за замовчуванням, є вираз пустот всередині цих дужок, Це означає, що його не може прийняти ніяких аргументів. 

Так, починаючи з сьогоднішнього, те, що ми збираємося зробити Тобто, ми збираємося почати підтримки такі речі навіть. Насправді, в цьому випадку, який вам як правило, не вручну ввести, Зробити робив це для нас, тобто не один, а один, два, три додаткових рядка після програми по імені брязкіт. Так як же нам цього домогтися? 

Ну, починаючи з сьогоднішнього дня, в тих випадках, коли ми хочемо забезпечити введення через Так званий командного рядка, ми збираємося почати додавати тут те, що в yellow-- заміна порожнечу агдс коми Рядок агду відкриває дужка закриває дужка. Тепер це цікаво протягом кількох причин. Один, це буде запишемо програми, які трохи більш динамічним. Але, більш переконливо, він збирається відкрити Тепер розмова, щоб що масиви можуть дійсно використовуватися, для того, що рядки дійсно знаходиться під капотом, до наступного тижня, коли ми не почнемо з аквалангом У ще глибше щодо того, як машина робить всі ці речі роботи. Але зараз, давайте малювати, можливо, картина. 

Коли ви пишете програму з основним заявив В цьому випадку, таким чином, що основна приймає два аргументи, Int і-- який тип даних це другий аргумент? 

АУДИТОРІЯ: Array. DAVID Малан: Array. Так це виглядає на перший погляд, начебто це рядок, але зверніть увагу на квадратні дужки. Нагадаємо, в останній раз ми ввели Поняття масиву. І масиви використовують квадратні дужки через пару контекстах. Ви можете використовувати площу кронштейни йти в масив і отримати конкретний елемент, як Кронштейн 0 або кронштейн 1 або кронштейн 2. Але ми бачили, якщо коротко, минулого тижня, що ви також використовувати ці квадратні дужки в оголосити розмір масиву, якщо ви знаєте заздалегідь, скільки Інтс або скільки рядків або все, що ви насправді хочете. Ось і виходить, що є третій контекст тут що не має номера всередині з квадратних дужках. При вказівці, як у мене тут, назва-то вроде ARGV, , Який є просто химерний спосіб кажучи аргумент вектор, ще один химерний спосіб кажучи масив аргументів, відкриває дужка закриває дужка просто означає, що вам не обов'язково заздалегідь знати, як великий Масив буде, але ви знаєте, що це збирається бути масивом. Так що, якщо ви не знаєте, число, не ставте його там, для відкритої кронштейна закриває дужки означає, що агду не є рядком, але масив рядків. Так синтаксично, якщо вам думаю минулого тижня, це дуже схоже, що сказати щось на зразок десяткового віків дужки що, а потім то після цього. Отже, що ж це схоже? Давайте реально намалювати картину. Тому, коли ви запустите цю програму з основними Наявність двох аргументів визначається всередині з тих дужках, ви істотно, принаймні два шматки пам'яті передав вам під капотом. Один, як я буду малює як цього прямокутника, збирається назвати агдс. І так само, як швидкою повторення, що тип даних агдс? Так що це внутр. Так ряд збирається піти в argc-- поворотів , Що означає кількістю аргументів. Між тим, я намалював ARGV як масив. І я дійсно не знаю, як довго це буде, так для сьогоднішніх цілей точка точка точка. Це могло б стати деякої довжини. Але я на фото тут щонайменше, чотири прямокутників. Так агду шматок пам'яті, яка зберігає рядок рядок рядок точка точка точка, і агдс є лише одним шматок пам'яті для цілого числа. 

Так що тепер, давайте бути трохи точнішим. Якщо, коли у мене є рядки в цьому масиві, називається агду, я хочу отримати на них індивідуально, так само, як минулого тижня, ми збираємося використовувати позначення як агду кронштейна 0 щоб отримати перше, що масив. Агду кронштейн 1, щоб отримати Друга річ, і так далі. Ключовим моментом тут є, що ми як і раніше 0 indexed-- ми все ще вважаючи від 0. Так що тепер давайте насправді покласти щось в цьому. Якби мені довелося скласти програму під назвою Привіт з файлу під назвою Привіт точка с, а потім я запускаю цю програму з точки слеш привіт, що робить мій комп'ютер, мій ноутбук, виглядати під капотом момент я біжу точка слеш привіт і натисніть Введення? Ну, це, мабуть, те, що ми могли б описати як зміст вашого комп'ютера пам'яті, або пам'яті RAM-- Random Access. Іншими словами, комп'ютер, так чи інакше для вас чарівним, ставить цифру 1 в агдс, AKA ARGCOUNT, і це ставить буквально рядок ./hello в ARGV кронштейна 0. Я поняття не маю ,, чесно кажучи, те, що немає в ARGV кронштейном 1 або 2 або 3, бо, якщо користувач не має набрали нічого, крім ./hello, ми будемо вважати, що ці є найбільш вірогідними значеннями сміття, так сказати. Ці шматки пам'яті існує, але це не до нас дивитися на них, тому що ARGCOUNT тільки один. 

Тепер, між тим, якщо I написати запустити іншу програму, кд, що більш правильно команда, у вашому миготливим prompt-- простору кд Dropbox-- коли я запускаю, що, по суті, коли програма кд запускається, агдс, всередині пам'яті мого комп'ютера, для найбільш частку секунди число 2. А потім агду кронштейн про має кд, агду кронштейн 1 має Dropbox, і тоді, звичайно, команда завершує, так вся ця пам'ять істотно йде і використовується для іншого. І ось чому я говорю тільки на частку секунди. 

Між тим, якщо ми робимо MKDIR pset2, картина виглядає майже так само, але з різними рядками усередині ARGV. Якщо я роблю брязкіт тире привіт Привіт точка с, та ж ідея. Більше матеріалу заповнюється для агду, і агдс, звичайно, 4. Таким чином, іншими словами, хоча цього масиву може бути точка точка точка, з деяких змінної довжини, так сказати, Ви завжди знаєте, де його кінець є, тому агдс збирається сказати вам в який момент ви повинні зупинити дивлячись на елементів в ARGV. Ви можете дивитися тільки на чотирьох в цілому в цьому випадку. 

Отже, давайте поглянемо на, можливо, проста програма. Той, який просто говорить привіт кому то подобається Zamyla. Так я стверджую, що я збираюся написати програму через хвилину, через який я міг зробити ./hello простір Zamyla, а потім я хочу моя програма роздрукувати то супер-просто, як "Привіт, Zamyla." Тепер в минулому ми використовували GetString. Так в минулому, навіть якщо Ви новачок в програмуванні, напевно ви могли на швидку руку програма, яка використовує GetString а потім використовує Printf щоб сказати привіт Zamyla. Але давайте не будемо використовувати GetString цього разу. Дозвольте мені замість цього піти в Appliant і не включають в себе стандартні Я O точка годину. Дозвольте мені також включають CS50 точка годину. Тепер тап_п, і тепер я не збирається робити недійсними сьогодні. Замість цього, я збираюся зробити агдс Рядок агду відкриває дужка закриває дужка, не вказали номер. А тепер ось моя так звана зробити. Те, що я збираюся зробити зараз, це, я збирається зробити трохи стрибку віри, Я буду вважати, що користувача збирається правильно використовувати цю програму, і я просто збираюся зробити Е привіт,% Sn. Так що нічого нового там. Але я хочу, щоб тепер покласти все, що слово користувач після імені програми. Так що, якщо я роблю ./hello простір Zamyla, я хочете щось програмно доступ цитувати кінець цитати "Zamyla." тому я може піти в мою аргументу вектора, мій масив рядків, і якщо команди, знову, був ./hello простір Zamyla, який номер я хочу покласти в ARGV тут? АУДИТОРІЯ: 1. DAVID мала: 1, тому що Кронштейн 0 виявляється буде Назва програми, як ми бачили. Так кронштейн 1 це перше слово що я, користувач, набрали. Я збираюся йти вперед і зберегти це. Я збираюся піти в мою папку де я розмістив цей файл. Я збираюся зробити зробити привіт 3. ОК Comp НЛ. ./hello Zamyla Enter. Що я зробив не так? Я був захоплений зненацька я на мить там. Що я зробив не так? 

АУДИТОРІЯ: Ім'я. 

DAVID Малан: файлу насправді називається hello3.c. І я зробив це тільки для консистенція, тому що ми була hello.c знаходиться в мимо в онлайн коду. Так давайте виправимо цю ./hello Кронштейн тире 3 Zamyla. Enter. І тепер у нас є привіт, Zamyla. Між тим, я можу змінити це бути Роб, або дійсно будь-яке інше слово. 

Але давайте розглянемо кутовий випадок. Те, що ви могли б очікувати станеться, якщо Я не ввести ім'я чию взагалі? 

АУДИТОРІЯ: Помилка. 

DAVID Малан: помилка якийсь, можливо. Подивимося. Enter. Null. Так Е фактично бути трохи захищає нас тут, і буквально друку відкриті Хлопець нуль, але навіть гірші речі можуть трапитися. І тільки продемонструвати то, що ви абсолютно не слід робити, підемо в тут і почати колупатися. Вірно? Якщо я знаю, що картина в пам'яті, по суті, це, агду кронштейн 1 має Zamyla, ARGV Кронштейн 0 має ./hello або ./hello-3. Що в кронштейні 2? Так що я можу відповісти, що задаю собі питання, чи не так? Я можу просто змінити 1 до 2. Тепер я можу перекомпілювати привіт 3, ./hello3 Давайте збільшувати та натисніть Enter. Упс. Ні лапки. Цікаво. Так що начебто здорово подивитися, що ще тут. 

Так що ще знаходиться всередині мого ноутбука? Давайте збережемо його з кронштейна 3. Зробити hello3, ./hello-3. Цікавий. А тепер давайте дійсно bold-- 50. Так що насправді пірнаючи глибоко в пам'ять мого комп'ютера. 50 Індекси в. Так що привіт 3 ./hello-3. Цікавий. Гаразд, зараз я просто збирається отримати безрозсудним. Підемо в 5000. Добре. Отже, дозвольте мені перекомпілювати. Зробити hello3, ./hello-3. Добре. Зараз деякі з вас, може бути лампочка йдуть. Як багато з вас є бачили це повідомлення раніше? Добре. Отже, чому? 

Коефіцієнти are-- і є різні речі, які можуть призвести до цього, і ясно, що ти в хорошій company-- у нас є чітко викликало те, що називається Сегментація вина. І коротше кажучи на сьогоднішній день, я торкнулися сегмента пам'яті що я не повинен мати. Де сегмент просто означає шматок пам'яті, що я не повинен мати. Тепер комп'ютер гарантує, що, якщо я запустити ./helloZamyla що я можу торкнутися ARGV бути кронштейн 0 і агду кронштейн 1. Але агдс є значення 2, що означає, що я тільки allowed-- це свого роду честь сістема-- доторкнутися Кронштейн 0 і кронштейн 1. Якщо я йду далі, є абсолютно буде пам'ять є. Мій RAM існує фізично в комп'ютері. Але хто знає, що там? Справді, я біжу кратне програми в один час. Я міг би seen-- якби я не був робити це на Appliant але на моєму Mac або PC-- я міг би бачив вміст електронній пошті. Я, можливо, бачили мить повідомлення Я недавно послав. Все, що може бути що зберігаються навколо в пам'яті можна було б отримати за способом це довільна квадратна нотація кронштейн. Або, що ще гірше, ви, можливо, знайшов одного з моїх паролів що я останнім часом набрали в, що Програма була зберігатися в пам'яті, так як для аутентифікації мене, і то тільки почасти залишив його в пам'яті, поки я не пішов цю програму. 

І справді, це один з небезпеку і одна повноваження використання мови як С. У вас є вільний доступ на весь зміст пам'яті програми, і які погані хлопці можуть навіть зробити в тих cases-- Особливо, коли ми отримати на веб-програмування до кінця семестру, ми будемо повернутися до цього topic-- буде копатися, потенційно, хто це комп'ютера пам'яті і знайти такі цікаві речі як ми бачили там. Або навіть ще гірше, паролі, що він або вона може використовувати, щоб робити погані речі. 

Отже, ясно, я не повинен був робити цього, тому дивні речі починають відбуватися. Справді, це програма гуркіт. Це було б рівносильно з Mac OS або в ОС Windows Вікно програми просто зникають. Непередбачена помилка. У середовищі командного рядка ми бачимо щось подібне. Але саме тому, як я, просто доторкаючись пам'яті, що не належить мені. 

Так що давайте захищатися від цього а Трохи по-іншому дивлячись на цій програмі. Таким чином, знову ж таки, скелет що ми бачили earlier-- і я виділив цей раз Int. І весь цей час головним має Справді повертається значення. Навіть при тому, що в більшості наших лекції приклади ми жодного разу не використали нічого повертати в основний. Ми просто написати PRINTF близько фігурна дужка і ось воно. Але безкоштовно, що компілятор робив для вас, ефективно, повертається 0 для вас. Виявляється out-- і це трохи counterintuitive-- що 0 це добре. Це не означає, брехня сама по собі. 0 добре, і будь-який не-0 Значення, що світ вирішив, може означати помилку. Так що якщо ви ще не зіпсував то на вашому комп'ютері, або програма щойно помер від вас і Ви отримали деякі помилкові вікно на екрані, кажучи про помилку негативне 49 або помилка 23-- деякі, здавалося б, довільне value-- ось тому програміст жорстко Значення як негативний 49 або позитивне 23 для подання будь-якого числа, насмілюся сказати, з 4000000000 можливих речей що може піти не так в програмі. 

Так як я міг би взяти Перевага цього я? Ну, дозвольте мені відкрити програму що я написав заздалегідь, і копатися онлайн називається привіт 4. І це майже ідентичні, за винятком того, її отримали трохи перевірки помилок. В цьому випадку, я знову заявив Основний, як приймаюча два аргументи, але на цей раз, в рядку 17, повідомлення Я роблю трохи для перевірки відсутності помилок. Я переконавшись, що агдс дорівнює дорівнює 2. Бо якщо це так, що означає, що я можу безпечно торкнутися не тільки кронштейн 0, але кронштейн 1. І я йду вперед і роздрукувати, В цьому випадку, Zamyla або Rob або що слово, яке я надрукував. І тепер тільки, щоб отримати трохи більш правильним, Я збираюся явно повернутися 0 для позначення все добре. Нічого поганого не трапилося. 

Але за угодою, я збираюся повернутися 1, або відверто будь-який не-0 значення, якщо що пішло не так. Тепер користувач не збирається помічаєте, що відбувається. Дійсно, якщо я йду в цей каталог, ми збільшення і роблять привіт 4, ./hello-4 Zamyla поводиться, як я очікую. Але якщо я, замість не вводьте нічого, нічого, здається, відбудеться, але це не катастрофа. І якщо я, замість щось робити як Роб є супроводжуючий в Thayer-- обміну довільна інформація. Але зауважте, агду 1, 2, 3, 4, і Тепер 5 повинен існувати в пам'яті. Це теж не те, що моя програма очікує, бо я перевірив чи агдс дорівнює дорівнює 2 чи ні. Так що я тепер захищає проти цього. 

Тепер, як в сторону, ми programmer-- або скоріше ми users-- ніколи не бачити, що 0 або 1, але з використанням Інструмент під назвою відладчик або інших інструментів, як ми побачимо перед довго, ви програміст може побачити, що може бути відбувається не так всередині вашої програми. 

Таким чином, будь-які питання по агдс? Так. 

АУДИТОРІЯ: я бачив, де вони не мали характер, [нерозбірливо] просто сказав рядок зірки д, як характер зірочка кома. Чи є вони еквівалентні тут? 

DAVID Малан: Вони. Таким чином, питання, у вас є іноді бачив програми як це, що ні кажуть рядок агду кронштейн але замість цього щось сказати як сЬаг зірка агду кронштейна. І є навіть друга варіанти, які ви можете бачити. Вони дійсно еквівалентні. В даний час, у нас є ці роду підготовки коліс на у вигляді рядка в CS50 бібліотека, але в трохи більше тижня або таким чином ми збираємося видалити, що обструкція в цілому і насправді Подивіться, що вугілля і зірки , І як ті, ставляться до пам'яті уявлення в цілому. Таким чином, ми повернемося до цього. 

Інші питання по нашій ARGV або агдс? Так. АУДИТОРІЯ: Чому це повернутися Помилка [нерозбірливо]? DAVID Малан: Чому зробив це повертає помилку only-- о! В попередньому випадку, коли ми були возитися навколо з пам'яттю, чому це тільки повертає помилку коли я дійсно набрали велику кількість? Коротка відповідь, ми просто пощастило. Взагалі кажучи, комп'ютер виділяє пам'ять в шматках, і він дав мені достатньо великий шматок, що Я пішов, не будучи поміченим, зворушливою кронштейна 2, кронштейна 3, Кронштейн 50, але як тільки я натиснув моя удача, я пішов за Кордони шматок пам'яті операційна система дала мені. І ось, коли його притискаються і сказав, немає. Помилка сегментації. Так. 

АУДИТОРІЯ: Як комп'ютер знати значення агдс? 

DAVID Малан: Як комп'ютер знати значення агдс? Коли ви запускаєте програму, що програма, за характером миготливою рядку передається масив Слова, які були введені в командному рядку, що було друкується в підказці. І так це ваша операційна система, яка по суті заповнює аргументи головних для вас. Так ось одна з послуг що ви отримаєте, свого роду таємно під капотом операційної системи. Інші питання? Так. 

АУДИТОРІЯ: Що це означає дамп? DAVID Малан: Що це означає дамп? Так що це хороше запитання. І дозвольте мені повернутися в цей каталог тут. І ви помітите, що У мене є новий файл там. Це дійсно називається ядро, і це насправді, як правило, пристойного розміру файлу. Тобто по суті знімок вміст пам'яті моєї програми або ОЗУ, коли він розбився. І це буде корисно, потенційно, діагностично, як тільки ми говоримо в майбутній лекції і розділ про налагодження, тому що ви можете насправді робити еквівалент цифрової розтину на цьому файлі, щоб допомогти з'ясувати те, що ви зробили не так у вашій програмі. Так. 

Зали: агдс команди в Сам, або ви можете назвати це нічого? 

DAVID Малан: Хороше питання. Є агдс команди в собі, або ви можете назвати це нічого? Це безумовно не є командою. Це просто змінної ім'я або ім'я аргументу в, і так абсолютно Можна назвати це Foo, ми могли б назвати цей бар, які мають тенденцію бути виходу на словах, що комп'ютерні вчений йде в. Але за угодою, ми використовуємо ARGC і ARGV. Але це всього лише людина Конвенція, не більше того. Добре. Так виходить, я був говорю трохи білого lie-- і, чесно кажучи, в майбутньому, ви побачите ми говорили інші білі брехня. Але зараз, ми збираємося відігніть один з них. В цьому випадку тут, коли я раніше побіг програму як ./hello або ./hello-3 Zamyla, ми повинні були вміст мого пам'яті комп'ютера, дивлячись приблизно як це. Але згадаємо, що рядок є. Що ми говоримо, тиждень тому, що рядок насправді під капотом? АУДИТОРІЯ: Масив символів. DAVID Малан: Це масив символів, чи не так? Таким чином, ми, можливо, є масив рядка, але, в свою чергу, рядок це масив символів. Так що, якщо я дійсно хочу бути анал, коли я малюю цю картину, Я повинен дійсно бути малюнок це трохи більше, як це, причому в кожній з них Індекси моєї агду масиву, існує сама по собі весь рядок , Що само по собі в масиві. А тепер брехня ми говоримо сьогодні є те, що картина не виглядають цілком так. Справді, невеликі квадрати зазвичай за межами великих прямокутників є. Але ми повернемося до того, що незабаром. Але це ./hello зворотний слеш 0, що бути спеціальний символ, який розмежовує кінець рядка, і у нас є ще один за Ім'я Zamyla в. Так що ж це означає? 

Ну, дозвольте мені йти вперед і відкрити дві інші приклади , Які доступні в Інтернеті. Одна з них називається argv1.c , А інший argv2. Це супер-проста програма, яка відрізняється від минулих програм в тому, що тепер я використовую агдс і ARGV тут. І тепер я інтеграції з цикл в рядку 18, від г = 0 на до ARGC. І що ж я буду робити з цього рядка коду тут? Англійською. Це, очевидно, демонструє використання агдс. Але в англійській мові, що робить це зробити, якщо я запустити цю програму? Да? 

АУДИТОРІЯ: Це буде друкувати ваші екран стільки разів, скільки ви хочете. DAVID Малан: Точно. Тому, що б слова введення введіть в командному рядку, це збирається вивергнути їм на мене по одному в рядку. Так що давайте йти вперед і робити це. Відпусти мене в моєму каталозі і роблять argv1 ./argv1. А тепер, давайте тримати його просто. Давайте нічого не робити в першу чергу. Це зробив роздрукувати одну річ, і ось дійсно назва програми, тому що це в кронштейні 0. Якщо я зараз сказати Фу, він збирається зробити ці двоє, і якщо я говорю Foo бар, він збирається сказати ці три речі. Тепер ось кілька цікаво, може бути. Але нагадаємо, що ARGV є масив рядків, але рядок це масив символів, так що ми можемо взяти речі на сходинку вище і застосувати, що основна Логіка і зробити код, який виглядає трохи більш загадковим, за загальним визнанням. Але, маючи вкладений цикл, то те саме що до того, що ви, можливо, пам'ятаєте з Маріо, наприклад, якщо ви зробили це таким чином. 

Так що тепер помітити в рядку 19, я знову перебору моїх аргументів, від 0 на до ARGC. І тепер відповідно 21-- Я запозичення трюк з останнього week-- Я перевіряю, що є Довжина агду кронштейна I. Я зберігаю цю відповідь у п. А потім я інтегруючи від J на до п, де J встановлюється на 0. Так, Конвенція для підрахунку. Якщо ви вже використовували I, якщо у вас є вкладений цикл, ви не можете використовувати я знову, в іншому випадку ви будете колошматити, потенційно, значення за межами внутрішнього циклу. Тому я використовую J за угодою. Ми могли б використовувати к. Якщо у вас є більше, ніж до, ви, ймовірно, занадто багато вкладеності, звичайно. Але тепер, зауважив мого Printf лінія трохи відрізняється. Я не друкує% S, я друк% С, що, звичайно, є заповнювачем для гольця. 

А тепер зверніть увагу цей синтаксис. Новий. Ми не бачили його раніше. Але логічно, це просто означає, отримати-й рядок в ARGV і отримати JTH який? АУДИТОРІЯ: Характер. DAVID Малан: Характер у цьому рядку. Так за допомогою квадратних дужок потім квадратних дужках, це дайвінг перший в рядки ARGV в, , А потім другий квадратні дужки з J дайвінг в характерах що певна рядок в ARGV. А потім, для рівного рахунку, Я друкую нову лінію тут. Так що тепер дозвольте мені йти вперед і відкрити до трохи більшого вікні так що ми можемо побачити це в дії. Відпусти мене в цій папці. А тепер роблять агду-2-- whoops-- зробити ARGV-2, ./argv 2. Enter. І це трохи важко читати вертикально, але це дійсно ім'я Програма, після чого порожній рядку. Тепер дозвольте мені йти вперед і робити щось. Аналогічно важко читати, але це дійсно друку одного символу в рядку. А якщо я бар, то тепер друк ті построчно. Так винос тут не стільки що, нічого собі, дивитися на цій акуратній новий трюк де ви можете отримати на вміст специфічних букв масив в, а те, як ми приймаємо це основна ідеї, як індексування в масив, а потім індексації в Масив, який був у цьому масиві, і просто застосовуючи ті ж ідеї трохи складніші приклади. Але основи справді не змінилося, навіть з минулого тижня. 

Тепер це свого роду своєчасно, в тому, що, нагадаємо, в нульовій тижня ми грали з телефонною книгою, як це. І хоча це, очевидно, фізичні шматочки паперу, Ви можете роду думати Телефонна книга у вигляді масиву. Звичайно, якщо б ви були повторно реалізувати це шматочки ці папірці в комп'ютері, можливо ви повинні використовувати те як масив для зберігання всіх тих, імена та номери з усіх шляху до Z. Так що це добре, бо це дозволяє нам можливість, можливо, розглянути, як ви могли б насправді реалізувати щось подібне. Як і в серії дверей тут. Так що, якщо я could-- нам потрібно один добровільно прийти на до. Подивимося. Незнайоме обличчя, можливо, незнайоме обличчя, можливо. Як щодо помаранчевим кольором? Ось. Оранжевий сорочка, давай до. 

Давайте підемо далі тепер і хід ці двері на сторону, рухатися їх з колії на мить. Як тебе звуть? 

AJAY: 

DAVID Малан: Аджай. Девід. Приємно познайомитися. Добре. Отже, ми маємо за ці шість Двері в цифровому вигляді screen-- або, скоріше, сім дверей на screen-- цілу купу цифр. І я не сказав вам нічого в advance-- погодився? AJAY: Нічого заздалегідь. DAVID Малан: Все, що я хочу, щоб ти Тепер, щоб знайти для мене, і для нас, дійсно, число 50, один крок за один раз. 

AJAY: Номер 50? 

DAVID мала: 50 Число. І ви можете показати те, що це За кожним з цих дверей просто торкаючись до нього пальцем. Чорт візьми. [Сміх] 

[Оплески] 

Дуже добре зроблено. Добре. У нас є прекрасний подарунок Приз для вас тут. Ваш вибір фільмів ми обговорили минулого тижня. 

AJAY: О, Боже. О, я ніколи не бачив SpaceBalls. 

DAVID Малан: Космічні яйця. Добре. Так тримати тільки на один момент. How-- давайте зробимо це здатні навчатися moment-- як ви йти про знаходження кількості 50? AJAY: Я вибрав випадково. DAVID Малан: Таким чином, ви вибрали випадково і пощастило. AJAY: Так. DAVID Малан: ОК. Відмінно. Так що тепер, було вам не стали щасливими, що ще могло б відбутися за цими дверима? Так що, якщо я йду вперед і виявити ці цифри тут, вони насправді у випадковому порядку. І найкраще, що ви могли б мати зроблено, чесно кажучи, по, в кінцевому рахунку ,, в гіршому випадку, перевірка їх усіх. Таким чином, ви отримали супер-повезло, що не те, що ми назвали б алгоритм. Так, вітаю. Але тепер let's-- гумору мене, якби ви могли. Підемо в цій вкладці тут. А ось цифри в чітко що, здається, випадковий порядок, , І вони були. Але тепер, якщо я замість претензії що за цими дверима це числа, які сортуються. Зараз метою є також знайти нам номер 50. Але зробити це алгоритмічно, і розкажіть, як ви збираєтеся про це. І якщо ви знайдете його, ви тримаєте фільм. Ви не знаходите це, ви даєте його назад. AJAY: Так що я збираюся перевірити кінці по-перше, щоб визначити, there's-- [Сміх та оплески] DAVID Малан: Тут ви йдете. Давайте поглянемо на один попередників Аджая, Шон, який був не настільки щасливий. Отже, ваша задача тут, Шон, полягає в наступному. Я ховається за них Двері число сім, але прибраний в деяких з цих дверей а інші невід'ємні числа. І ваша мета думати про це Верхній ряд чисел, як тільки масив. Ми просто послідовність частин паперу з номерами за ними. І ваша мета, тільки за допомогою верхньої Масив тут, знайти мені номер сім. І ми тоді будемо критикувати як ви ходите робити це. Знайти нам номер сім, будь ласка. Кількість 5, 19, 13. Це не питання з підступом. 1. В цей момент ваш приводу не дуже добре, так що ви могли б також продовжувати йти. 3. Продовжуй. Чесно кажучи, я не можу не поцікавитися, то, що ви навіть думати о. 

ШОН: Я можу взяти тільки з верхнього ряду. DAVID мала: тільки верхній ряд. Отже, ви отримали три залишилося. Так знайдіть мені 7. 

[Аудиторія кричить ПРОПОЗИЦІЇ] Так як з них були напрочуд з дуже різних причин. Так що це, де ми зупинилися хвилину назад, та ключових ідей тут було ці двері були номери за ними, які були відсортовані, ідеальним винос, для яких є те, що ви могли б зробити принципово краще в цей другий example-- і, дійсно, це було Шона Перша спроба з випадкових чисел так само, як before--, але як тільки як ці цифри сортуються, так само, як в телефонній книзі, що ви можете, очевидно, робити? Або, як можна використовувати ці знання? Так. 

АУДИТОРІЯ: Ви йдете на півдорозі [нерозбірливо]. DAVID Малан: Так. Точно. Так початкова інстинкт Аджая було перевірити кінці, наскільки я пам'ятаю, а потім ми начебто обробкою Приклад швидко. Але якщо ми почали робити це більш методично уздовж цих ліній, але починаючи, можливо, в середній, тому що вони сортуються, як тільки ми відкриваємо номер 16, тому ми знаю-- і давайте робити те, that-- ми Тому знаю, що 50, в сьогоднішньому випадку, треба бути справа. Так само, як в нульовому, коли тиждень ми розірвали телефонну книгу навпіл і кинув половину Проблема ж, та ж ідея тут. Ми можемо кинути цю половину проблеми далеко. І, напевно, те, що вас може зробити алгоритмічно, як тільки ви знаєте, що 50 повинно бути вправо, якщо це в будь-якому місці, це спробувати там, в середині з решти дверей. Звичайно, 50 вище ніж 42, тому ми можемо кинути це інші чверть проблеми в сторону, і, нарешті, визначити щось на зразок 50. Але так само, як з Телефонна книга, ці цифри були дані нам вже в відсортований порядок, який залишає нас з питанням, як вам отримати речі в певному порядку? І, чесно кажучи, за якою вартістю? Це одна річ, щоб бути передав телефонну книгу а потім справити враження на своїх друзів, знаходячи номер телефону дійсно швидко, чи не так? Розриваючи 32 сторінок, щоб знайти чоловік з 4 мільярдів сторінок, ми сказали був одним яскравим прикладом. Але скільки часу це займе Verizon для сортування телефонної книги? Скільки часу це займе нас сортувати ці сім цифр? Це питання, яке ми до сих пір повністю ігноруються. 

Так що давайте відповісти на це питання зараз. І ми всі з фільмів зараз, але у нас є деякі стрес кулі. Якщо, скажімо, вісім добровольців Не заперечував би приєднатися до нас тут? Давайте йти вперед і робити, як про ви четверо, троє з вас тут? Отримати нові обличчя. І чотири з вас є? І now-- давайте не усунуте здесь-- і номер вісім сюди на кінці. Піднімайтеся. Добре. Отже, що ми маємо тут для кожен з вас є число. Якщо ви хотіли б піти вперед, взяти цей номер. Як тебе звуть? 

Арті: Арті. 

DAVID Малан: Арті, ладно. Ти число 1. 

AMIN: Амін. DAVID Малан: Амін. Девід. Ти число 2. І йти вперед, а я передаю Ви аркуші паперу, вибудовуються себе в передній частині музики виступає в тому ж порядку, що і там. 

ANDY: Привіт, Енді. 

DAVID Малан: Енді, це приємно бачити вас. Номер 3. 

JACOB: Яків. 

DAVID Малан: Яків, число 4. Ласкаво просимо на борт. ГРАНТ: Грант. DAVID Малан: Грант. Номер 5. 

Аланна: Аланна. 

DAVID Малан: Аланна, число 6. 

ФРАНЧЕСКА: Френсіс. DAVID Малан: Френсіс, число 7. І? 

Рейчел: Рейчел. 

DAVID Малан: Рейчел, число 8. Добре. Йдемо далі і отримати собі в цьому порядку. Дозвольте мені сказати одну решта музика стоїть на місці. Де вам потрібен стенд? Добре. Йдемо далі і просто поставити свої номери де глядачі можуть побачити їх на, пюпітр назовні. І, сподіваюся, наша перша перевірка справності здесь-- 4, 2, 6. Ой-ой. Почекай хвилину. Ми не маємо 8. Мені потрібно виселити вас з Приклад-то. Кількість Ні, це нормально. Подивимося. Ми можемо зробити це. Очікування. Там ми йдемо. Правильно. Добре. Отже, тепер у нас є 8, 1, 3 7, 5. Добре. Відмінно. 

Отже питання в руці, в якою ціною, і через те, що метод, ми можемо насправді розібратися ці цифри тут так що ми можемо почасти працювати у зворотному напрямку, в кінцевому рахунку, і decide-- це дійсно вражає, це дійсно ефективним, що я можу розділити і завоювати телефонну книгу? Це дійсно ефективно, що Я можу розділяй і володарюй ці цифрові штук папери на борту, якщо можливо, це буде коштувати нам стан в часі або енергії або цикли процесора насправді отримати наші дані в якій певному порядку? Так що давайте поставити це питання. 

Так перш за все, ці цифри в значній мірі випадковому порядку, і я збираюся запропонувати один алгоритм, або процес , За допомогою якого ми можемо розібратися цих людей. Я збираюся підійти це досить наївно. І я збираюся визнавати що це начебто багато для мене обернути свій розум навколо встановити цілі дані відразу. Але ви знаєте, що? Я збираюся зробити деякі дуже прості граничні виправлення. 4 і 2 вийшли з ладу, якщо мета полягає в тому, щоб перейти від 1 до від 8. Таким чином, ви знаєте, що? Я буду мати вас хлопці поміняти, якщо ви перейдіть фізично позиції і Ваші шматочки паперу. Тепер 4 і 6, це в порядку. Я збираюся залишити ті бути. 6 і 8, ті, в порядку. Going, щоб залишити їх у спокої. 8 and1, не в порядку. Якщо ви два не заперечував би заміни. Тепер 8 і 3, якщо ви, хлопці, могли обміняти. 8 і 7, якщо ви, хлопці, могли обміняти. І 8 і 5, якщо ви, хлопці, могли обміняти. 

Тепер, я зробив? Ні, очевидно, немає. Але я зробив Ситуація краще, чи не так? Як там ваше ім'я, номер 8? 

Рейчел: Рейчел. DAVID Малан: Так Рейчел ефективно пузирилися досить далеко, весь шлях до кінця мій масив чисел тут. І так, що проблема частково вирішена. Тепер, очевидно, 2 все ще потребує рухатися небагато, і 4 і 6 і 1. Але я, здається, отримали трохи ближче до рішення. Так давайте застосуємо цей же наївно евристичний знову. 2 і 4, ОК. 4 і 6, ОК. 6 та 1, мм мм. Давайте своп. 6 і 3, мм мм. Давайте своп. 6 та 7 в порядку. 7 і 5, Ні. Давайте своп. А тепер 7 і 8. І те, що тебе звуть? ФРАНЧЕСКА: Френсіс. DAVID Малан: Френсіс. Так що тепер Френсіс перебуває в ще краще Положення, тому що тепер 7 і 8 правильно пропускають до вершини. Так 2 і 4, ОК. 4 і 1, своп давай. 4 і 3, своп давай. 4 і 6, що ти в порядку. 6 і 5, своп давай. І тепер ці хлопці хороші. Ми майже на місці. 2 і 1, з того, так поміняти. А тепер зробимо простий тест. 2 і 3, 3 і 4, 4 і 5, 5 і 6, 6 і 7, 8. Отже, ми закінчили. 

Але якою ціною я теж сортувати тут ці цифри? Ну, скільки кроків я теж потенційно прийняти при сортуванні цих людей? Ну, ми ще повернемося до цього питання. Але, чесно кажучи, якщо ви отримали трохи нудно, от і вид виявлення в тому, що це не було може бути, самий ефективний алгоритм. І справді, якщо чесно, я потію тим більше йти назад і вперед. Це не відчував себе особливо ефективним. Так давайте спробуємо щось ще. Якщо ви, хлопці, могли скинути самі в цих восьми значень. Відмінна робота. 

Давайте поглянемо в цифровому вигляді, для всього Секунду тому ми спробувати щось ще, на те, що тільки що відбулося. Тут, нагорі, ви зараз побачите візуалізація цих восьми людей в результаті чого синій і червоний бари представляти числа. Чим вища смужка, Чим більше число. Чим коротше бар, чим менше число. І те, що ви будете бачити в випадковому порядку більш восьми з них. Ви будете бачити ці бари отримувати відсортований за цим же алгоритмом, або набір інструкцій, які ми будемо називати надалі бульбашкового сортування. Так помітити, кожну секунду або близько того, два бари висвітлюючи червоним, порівнюються комп'ютером. І потім, якщо великий бар і невеликий бар вийшли з ладу, вони могли бути обмінені для мене. 

Тепер це неймовірно утомливо дивитися це, звичайно, дуже довго, але зверніть увагу, takeaway-- великі бари, рухомих вправо, невеликі бари рухомі вліво. Давайте зупинити цей процес і прискорити цей процес щоб бути набагато швидше, тому ми можемо отримати високого рівня почуття що, дійсно, бульбашкового сортування робить. Справді, це б'ється, щоб Права частина списку, або масив, тим більше барів. І навпаки, маленькі бари пузириться свій шлях вниз вліво, хоча в більш швидкому темпі ніж ми раніше зробили. Так, складніше побачити з людьми, але візуально це дійсно те, що відбувалося. 

Але давайте спробуємо принципово Інший підхід зараз. Давайте спробуємо інший Алгоритм, яким ми повинні вас хлопці починають в них оригінальний позиції, яка була такою порядок тут. І давайте йти вперед зараз. І я збираюся зробити те ще простіше, чи не так? В ретроспективі, обмін попарно раз і знову, майже трохи розумний. Давайте робити речі ще більш наївно, де, якщо я хочу, щоб впорядкувати ці люди, дозвольте мені продовжувати дивитися для найменшого елемента. Так прямо зараз, 4 є найменше число я бачив. Я буду пам'ятати це. Ні, 2 краще, і пам'ятайте, що. 1 ще менше. 3, 7, 5. Добре. Одно-- як тебе звуть знову? 

Арті: Арті. 

DAVID Малан: Арті. Так, Арті, йти вперед. Я збираюся витягти вас з лінії. Якби ви могли повернутися сюди. І мені потрібно, щоб звільнити місце для нього. У нас є точки прийняття рішення тут. Як ми могли б звільнити місце для Арті тут На початку, коли число 1 належить? 

АУДИТОРІЯ: Shift. 

DAVID Малан: Добре, ми може змістити всіх. Але запропонувати оптимізацію. Це відчуває себе трохи дратує для мене, щоб запитати чотири людини рухатися весь шлях вниз. Що ще я міг зробити? 

АУДИТОРІЯ: Перемикач їх. 

DAVID Малан: Перемикач їх. І те, що тебе звуть? 

JACOB: Яків. DAVID Малан: Яків, рухатися. Набагато більш ефективним тільки, щоб мати Місця своп Яків з Арті, на відміну від вимушує всі чотири з цих людей, велике спасибі, щоб їх правильне положення. Що приємно про Арті зараз, він у своїй правильній позиції. Давайте зробимо це знову. 2, це найменше число, що я бачив. 3, 7, 5. Добре. 2, безумовно, самий маленький. Не потрібно робити будь-яку роботу. Давайте зробимо це знову. 6. Найменший? 8. Нє-а. 4? Ох. Дозвольте мені згадати 4. 3. Дозвольте мені згадати 3. 7, 5. Саме маленьке число У мене бачив на цьому проході є 3. Якщо ви хочете виходь. Куди ми йдемо, щоб поставити вас? І як тебе звуть? 

Аланна: Аланна. 

DAVID Малан: Аланна, ми доведеться виселити вас. Але що є більш ефективним, щоб просто поміняти двох осіб, ніж мати кілька людей насправді обійти більш. Тепер давайте зробимо це знову. Я збираюся вибрати 4, так виходь. А хто буде рухатися? Номер 8, звичайно. Якщо я зараз знайти номер 5, виходь. Номер 8 збирається отримати знову виселяють. Тепер я збираюся знайти номер 6 на місці. 7 на місці. 8 на місці. 

Те, що ми тільки що зробили зараз те, що називається вибір роду, і якщо ми собі це, це будете почувати себе трохи по-іншому. Давайте підемо далі і від цього Меню тут, це visualization-- давайте змінимо цей to-- давай, Firefox. Давайте змінимо це в мій вибір роду. І давайте прискорити його, як і колись, і почати візуалізацію зараз. І цей алгоритм має інше почуття до нього. На кожній ітерації, чесно кажучи, це ще більш простим. Я просто вибравши найменший елемент. Тепер, чесно кажучи, я трохи пощастило, що Час, в тому, що він упорядковано дуже швидко. Елементи були випадковими. Це не так, як ми будемо в кінцевому підсумку см, принципово швидше. Але давайте подивимося, третій і останній підходити тут відносно того, що відбувається. Так що давайте йти вперед і скинути вас, хлопці востаннє, щоб бути в цьому порядку тут. 

А тепер, я збираюся бути трохи більш розумним, просто щоб закруглити наші алгоритми. Я збираюся зробити це. Я збираюся не йти назад і вперед так багато. Чесно кажучи, я втомився від все це переміщення. Я просто хочу, щоб прийняти те, що я дано на початку списку, і я збираюся розібратися що тоді і там. І ось ми. Номер 4. Я збираюся вставити номер 4 у відсортований список. Готово. Я стверджую, зараз, і просто зробити це більш ясно, ця частина мого списку сортується. Це свого роду дурною претензії, але насправді 4 сортується в список розмірі однієї. Тепер, я збираюся взяти на числа 2. Номер 2 я тепер збираюся вставити в потрібному місці. Так де ж 2 належать? Очевидно, тут. Так що вперед і повернутися, якби міг. І чому ви, хлопці просто взяти Ваша музика стоїть з вами на цей раз. А давайте насильно вставити вам на початку списку. Так трохи більше роботи. Я повинен був перемістити Якова навколо, і як тебе звуть? 

AMIN: Амін. 

DAVID Малан: Амін. Але принаймні я не йти вперед і назад. Я просто приймати речі, як я йду. Я просто вставляючи їх в потрібному місці. 6, це насправді досить легко. Давайте вставити вам там, якщо ви просто хотів відсунутися трохи. Номер 8, також досить легко. Право там. Чорт візьми. Номер 1 ми не можемо просто поміняти з Аміном тут, тому що це буде зіпсувати замовлення. Тому ми повинні бути трохи розумніші. Так, Арті, якби ви могли резервне копіювання на мить. Давайте підемо далі і перекласти зараз, на відміну від наших попередніх алгоритмів, щоб звільнити місце для Арті прямо тут на початку. Так, в кінці кінців, я почасти робити те, що я хотів уникнути колись. І так мій алгоритм є свого роду з назад, інтелектуально, від того, що він спочатку був. Я просто роблю переміну в іншій точці. Тепер я на 3. О, чорт. Ми повинні робити більше роботи знову. Так що давайте штовхати вас. Давайте перейдемо 8, 6, 4-- про oh-- і 3 йтиме прямо там. Так принаймні невеликі заощадження на цей раз. 7, не надто багато роботи належить зробити. Так що якщо ви хочете, щоб пхати назад, давайте вставимо вас. І, нарешті, 5, якщо вам хочете тріщати назад, ми необхідно перенести вас, вас, Ви, до п'яти на місці. 

Так що тепер, щоб побачити це в Високий рівень графічно, давайте зробимо цей алгоритм візуалізації одного додаткового часу. Так що це ми будемо називати вставки роду. Ми будемо запускати його як швидко, і почати його тут. І це теж має різні почуття. Це свого роду стає все краще і краще, але це ніколи не ідеально поки я не піти і гладкою в цих прогалин. Тому що, знову ж таки, я тільки брати те, що Я приділяється зліва направо. Так що я не так пощастило що все було ідеально. Ось чому ми повинні були це трохи mispositions що ми фіксовані в часі. 

Таким чином, всі ці алгоритми, здається, працювати на злегка різними темпами. Насправді, що б ви сказати, кращий або найшвидший на даний момент? Bubble роду, в першу чергу? Сортувати Вибір, другий? Внесені роду, третій? Я чув, деякі вибору сорту. Інші думки? 

Ось і виходить, що всі ці алгоритми принципово так само, як ефективно, як кожен other-- або, навпаки, як неефективною, так як один з одним, тому що ми можемо зробити принципово краще, ніж всі три з цих алгоритмів. І це трохи білого лежать теж. коли я говорю, як ефективно або неефективною, що, принаймні для супер-великі значення п. Коли у нас є всього вісім чоловік тут, або, може бути, 50 або близько того барів на екрані, ви абсолютно помітити відмінності Серед цих трьох алгоритмів. Але, як п, число людей, або кількість цифр, або число людей в телефоні Книга, або кількість веб-сторінок в базі даних компанії Google стає більше і більше, ми побачимо, що всі три з них алгоритми насправді дуже погано. І ми можемо зробити принципово краще, ніж це. 

Давайте поглянемо, нарешті, на те, що ці алгоритми можуть походити в контекст кількох інших а також шляхом цьому візуалізація тут що представлятиме нас кількість алгоритмів. Давайте підемо далі і привітати наші учасники тут, всі з яких упорядковано себе дуже добре. Якщо ви хотіли б взяти прощальний подарунок. Ви можете зберігати ваші номера, а також. І те, що ви побачите, або, вірніше, чути, тепер, є те, що, як ми ставимо звуки в кожному з цих стрижнів і пов'язати його з програмним забезпеченням, відрізняється частота звуку, Ви можете обернути свій розум більше audioly навколо того, що кожна з цих речей Виглядає як. Перший з яких є сортування вставками 

[TONES] 

Це бульбашкового сортування. 

[TONES] 

Сортувати Вибір. 

[TONES] 

Те, що називається сортування злиттям. 

[TONES] 

Гном роду. 

[TONES] 

Ось саме для CS50. Ми будемо бачити Вас в середу. 

Оповідач: І тепер, "Deep Думки ", по Daven Фарнем. Чому це для петлі? Чому б не зробити його краще? Я б зробити п'ять петлю. 

[Сміх]