[Powered by Google Translate] [Тиждень 2, продовження]
[David J. Малан, Гарвардський університет]
[Це CS50. - CS50.TV]
Добре. Це CS50, і це в кінці тижня 2.
Якщо ви плануєте бути голодним в цей час завтра,
знати, що ми збираємося провести як невеликою групою завтра, четвер, 1:15 вечора.
Там є URL тут, якщо ви хочете, щоб RSVP.
Місця обмежені, так що вибачте, якщо форма заповнена до того часу ви заповните це.
Інший URL, однак, що може бути цікаво це.
У майже через місяць, курс буде доступна
Все більш широко через EDX, через які люди в Інтернеті буде мати можливість стежити разом,
брати участь у процесі досить активно, насправді.
Вони буду використовувати CS50 і CS50 Appliance Обговорити
і самі різні програмні засоби, які ми вже використали в цьому семестрі.
І одна з ініціатив, які ми хотіли б взяти в якості експерименту в цьому році
, Щоб побачити, як багато змісту, який ми можемо перевести
в інших усних і письмових мов.
Так що, якщо ви могли б мати зацікавленість в участі в цьому проекті
яким ми будемо надавати англійською стенограми і субтитри для лекцій курсу
і шортах і семінарах та секціях і т.п.,
якщо ви вільно говорити і писати вільно якусь іншу мову,
ми хотіли б звернутися до вас в цей проект, в якому ви взяти на себе одну або кілька відео,
переводячи їх на мову, ви знаєте досить добре.
>> Щоб дати вам уявлення про інтерфейсі, там даному веб-інтерфейс
, Які ми будемо використовувати, що створить істотно користувальницького інтерфейсу, як це.
Це було мені викладанні деяких Хеллоуїн назад,
і на правій стороні в чорному поруч з цими мітками часу,
Ви побачите різні речі, які вийшли з моїх вуст того дня,
, А потім під ним ви зможете перекласти іншою мовою
саме те, що відображення між ними, в даному випадку, англійського і, скажімо, іспанської мови.
Так що це насправді дуже зручний інструмент.
Ви можете перемотування назад і вперед дуже легко за допомогою сполучень клавіш.
Так що, якщо ви хочете взяти участь в цьому експерименті, і ваші слова бачив і читав
на потенційно тисячі людей там, будь ласка, не соромтеся брати участь.
Одне слово про кошеня з понеділка.
Щоб ми відправили занадто страшно повідомлення, розуміємо, що, як робочий час пропонують
а також розділи пропонують, дизайн, звичайно, дуже багато
, Що студенти співпрацюють і говорити, щоб працювати через проблеми набори
і проблеми разом, і дійсно лінії просто зводиться до того,
знову, робота, яку ви в кінцевому підсумку уявити, повинні бути вашої власної.
І, чесно кажучи, в робочий час це абсолютно нормально,
це повністю можна очікувати навіть поговорити з деякими один поруч з вами.
>> Якщо він чи вона бореться з деякими тему і ви, як:
"Ну, що ж, дозвольте мені дати вам уявлення про деякою рядки коду, який я написав," це нормально,
що відбувається, і це дуже сприяє, я думаю, з процесом навчання.
Там, де лінія перетнула отримує, коли голова нахилена роду тут для занадто багатьох секунд
або хвилин для того, щоб дійсно тільки що були можливості для розблокування вашого друга,
і, звичайно, коли все стає обмін електронною поштою і Dropbox і т.п.,
там теж є лінії.
Таким чином, всі кошти відчувати себе комфортно і надихає спілкуватися з друзями
і однокласникам про psets і більше і просто розумію, що те, що ви в кінцевому підсумку представити
повинно бути дійсно продукт вашої творчості, а не хтось інший.
І ось одна з предметно-орієнтованих завдань для pset2,
який вийде пізно ввечері завтра, поринути у світ криптографії,
, Яка є мистецтвом шифрування або скремблювання інформації,
і це в кінцевому рахунку належить до світу безпеці.
Тепер, безпека для більшості з нас приходить у вигляді досить мирської механізмів.
У всіх нас є імена користувачів і паролі,
і у всіх нас є дуже погані імена користувачів і паролі, швидше за все.
>> Якщо ваш пароль так само на декількох веб-сайтах, що, ймовірно, не найкраща ідея,
як ми обговоримо ближче до кінця семестру.
Якщо ваш пароль записується на записки - не жарт - на вашому моніторі,
це теж не обов'язково кращий дизайн, але досить поширене явище.
І якщо ви не використовуєте криптографію для шифрування паролів,
вони особливо вразливі.
Так що якщо ви думаєте, що бути супер розумний, маючи прихований документ Word
десь на вашому жорсткому диску, який має всі ваші паролі
але це в папці, що ніхто не збирається заглянути, що теж не дуже надійний механізм.
І те, що pset2 представить це мистецтво криптографії
і скремблювання інформації, так що такі речі, як паролі все більш безпечною.
Контекст тут є те, що з небезпечною даних
приходить можливість зашифрувати його і, щоб засекретити його.
І ось цей, наприклад, є прикладом зашифроване повідомлення.
Це насправді щось говорить англійською мовою, але це явно не цілком очевидна.
І ми пройшли повне коло сьогодні, щоб дратувати один від одного, що це секретне повідомлення тут.
Але в реальному світі комп'ютерів, речі, навіть не схоже, що вони можуть бути англійські фрази.
Наприклад, це те, що ви можете знайти на стандартній Linux або Mac або UNIX комп'ютер
у файл, який був колись називали файлу паролів.
>> В даний час це були переміщені в інші місця.
Але якщо ви подивитеся в потрібному місці в системі, ви побачите не тільки ваше ім'я користувача
або інших людей в системі, але ви побачите, зашифровану версію пароля.
Дійсно, слово склеп там припускає, що наступні речі в зашифрованому вигляді,
і цей ряд, здавалося б, випадкових літер та символів і цифр і т.д.
можуть бути розшифровані тільки в цілому знаючи деякі таємниці -
секретне слово, секретний номер -
і так насправді, мистецтво криптографії в кінцевому рахунку, зводиться до того, довіряти якійсь
і знаючи те, що хтось не робить.
Таким чином, ми розглянемо це в трохи більш докладно сьогодні і в PSET в майбутньому.
А тепер кілька слів про Pass / Fail.
Тим більше, що деякі з вас пірнув у pset1, техніка,
і зовсім новий світ для себе, розумієш, що розчарування і розгубленість
і тільки технічні труднощі, цілком можна чекати,
Особливо з першим PSET, де є так багато всього нового,
тільки знайомиться з Л. та компакт-диск, і всі ці таємні команди
і нове середовище, і це окремо від фактичного матеріалу та програмування себе.
Так розумію також, що є, звичайно, робочі години, які існують в якості опорної конструкції.
>> Розділи почати в найближчу неділю.
Але найголовніше, якщо ви відчуваєте себе просто, що це не світ для вас,
розумієш, що це дійсно просто потрібен час.
І якби не ця можливість років тому для мене взяти клас придатний / не придатний,
Чесно кажучи, я ніколи б навіть ступити в класі.
І ви можете змінити це до, скажімо, п'ятий понеділок звичайно,
так що якщо ви на краю тепер, розумієш, що замість голови в деяких інших вод в цілому,
цього, звичайно, розглядати тільки зміни в залік / незалік.
Знову ж таки, це не зовсім цю культуру тут, в Гарварді приймати речі залік / незалік
так як все насправді хоче досягти або overachieve,
але, чесно кажучи, це прекрасний спосіб спробувати щось з
які не можуть бути вам знайомі, і ви будете в кінцевому підсумку роблять, в більшості випадків, цілком нормально,
можливо, багато чого до вашого подив.
І більш конкретно, то, що я думаю, що придатний / не придатний взагалі робить,
Особливо, як ви, можливо, випробували з pset0,
якщо ви покладете в 10 годин, 15 годин, 25 годин в деяких PSET
і ви просто битися головою об стіну, і вона стає супер пізно вночі
але ви зробили PSET 90% шляху, і ви просто не можу зрозуміти одну річ,
придатний / не придатний дійсно знімає гостроту класу, як це,
де ви можете сортувати радісно кажуть: "Добре, я знаю, що це не ідеальний,
Але я працював від своєї дупи на це, я дуже щаслива з тим, де це закінчилося »,
і що буде відповідати очікуванням за залік / незалік.
Так що майте це на увазі. Добре.
>> Так що ті з вас, хто намагався використовувати Гарвардського університету Wi-Fi,
знаю, що є CS50 SSID, Wi-Fi з'єднання, плаваючі навколо
що ви могли б краще удачі.
Це трохи парадоксально, що пароль для цього, якщо ви хотіли б спробувати підключенні до цього
для кращої швидкості - і дайте нам знати, якщо це не краще - 12345, на всьому шляху до 8
тому що 8 є більш безпечною, ніж 5.
Так що якщо вам потрібен Wi-Fi пароль, підключитися до бездротового CS50 тут, 12345678,
і повідомлення про CS50 Обговорити якщо ви досі періодично виникаючих проблем підключення,
і ми дамо повноваження, які будуть знати цей простір. Добре.
Так швидко тизер, особливо для тих з вас, хто вентилятора хлопчиків і дівчаток усіх Яблуко речі.
Те, що я викопав з кілька років тому був цей файл тут, iUnlock.c,
тільки вигляд роблять більш конкретні і більш складні
деякі з найбільш основних програм C ми вже писали.
Так я відкрив цей файл, iUnlock.c. Він доступний на сторінці Лекції на сьогоднішній день.
На лівій стороні ви побачите довгий список функцій.
Таким чином, чоловік, який написав це написав багато функцій, більше, ніж просто основний.
Він використовував цілу купу бібліотек тут, і якщо ми почнемо прокрутки,
що це насправді найперший, я вважаю, крек для оригінального iPhone.
>> Коли б Ви хотіли зробити джейлбрейк оригінальний iPhone, а це значить неприв'язаних джейлбрейк від AT & T
і фактично встановити спеціальне програмне забезпечення на ньому і робити те, що Яблуко не хочу, щоб люди роблять,
хтось взяв час, щоб з'ясувати, як саме вони можуть використовувати програмні помилки,
помилки, помилки, в програмному забезпеченні Apple, і таким чином народився iUnlock.c--
що якщо ви зібрали його на свій комп'ютер і встановити його на iPhone
, Який був підключений до комп'ютера за допомогою, скажімо, кабель USB,
це дасть вам адміністративної або привілеї на вашому iPhone
і дозволяють зробити дуже багато, що ви хочете.
І ось там був цей захоплюючий кішки-мишки
між Яблуком і решти світу, зокрема, так як вони, як і багато компаній,
намагаються заблокувати свої речі вниз, так що ви можете зробити тільки з ним, що вони мають намір.
Але завдяки таким людям, як це і розуміння низького рівня деталей -
і в цьому випадку C програмування - і багато знайомих конструкцій
що ми почали грати, ви зможете по-справжньому використовують апаратну
таким чином, ви вважаєте за потрібне, і не обов'язково деяким юридичною особою.
Так, наприклад, я поняття не маю, що все це роблять,
але GetVersion звучить досить просто,
і, схоже, це функція, що ця людина написала.
Це займе деякий ціле число в якості аргументу, нічого не повертає,
але, здається, петлі з циклу тут і, якщо умова, якщо умова перерви,
і так чи інакше пов'язана з номерами версій, якщо прокрутити вниз,
хоча багато з цих ключових слів буде новий.
І є багато функцій тут ми ніколи не бачили і не могли б ніколи не побачить
протягом семестру.
>> Зрештою, це слід тим же правилам і логіці, що ми грали з досі.
Так що це занадто старий, щоб зламати ваш iPhone або 3s 4s 5s або незабаром ці дні,
але знаю, що все це дуже отримані з цього світу, що ми пірнули.
Давайте поглянемо на декілька більш простий приклад:
це, просто зігрітися з деякими синтаксису, а також деякі інші типи даних
що ми говорили, але дійсно не бачив в C.
Цей файл називається positive1.c, і в коментарях на вершині,
це просто вимагає, щоб користувач забезпечити позитивне число.
Так що це приклад зроби той час як цикл, який хороший для користувачів інтерактивних програм
де ви повинні сказати користувачеві, щоб щось зробити,
і якщо вони не співпрацюють ви кричати на них або відхилити їх введення.
Справа в точку: я збираюся робити рядках 19 до 24
тих пір, поки користувач не дав мені позитивне число.
Ця деталь тут, на лінії 18, чому я заявляю, п вище всього цього циклу побудувати
на відміну від прямо поруч з лінією 22, де я насправді піклуються, щоб отримати п? Так.
[Студент] Scope. >> Да, так що це питання з області видимості.
І з точки зору непрофесіонала, що робить область відноситься?
Так. >> [Нерозбірливо відповідь студента] >> Чи можете ви говорити голосніше?
[Студент] Де можна отримати доступ до цієї змінної. >> Perfect.
Де Ви можете отримати доступ до конкретної змінної.
І взагалі, правило досі було, що сфера деякі змінні
визначається самою останньою фігурні дужки, що ви бачили.
>> І тому в даному випадку, якщо я зробив помилку, оголосивши п на лінії 22, що лінія буде працювати.
Я хотів би отримати ціле число, і я б поставив його в цій змінній п у рядку 22,
але який рядок коду тепер не знаю, що я говорю? >> [Студент] 25.
[Малан] 25, і виявляється, що 24, а тому, що в цьому випадку він виходить за межі фігурні дужки.
Так що просто трохи неприємність, але дуже легко вирішується просто оголосити змінну
за межами самої функції.
Пізніше ми побачимо, сьогодні ви можете зробити ще один крок
і ви навіть можете отримати трохи лінивий.
І це не рекомендується взагалі, але ви можете навіть отримати ледачого
і покласти змінну в глобальному масштабі, так би мовити, не всередині функції, а не всередині циклу,
але в самому файлі, за межами всіх функцій ви написали, як я зробив тут, на лінії 15.
Це, як правило, з несхваленням, але розумію, що це рішення іноді до інших проблем,
як ми в кінцевому рахунку бачити.
Так що зараз ми залишимо це так, але давайте подивимося, якщо ми можемо переписати це
тільки, щоб почати виразити себе трохи по-іншому.
Ця програма, просто щоб бути ясно, є positive1.
Дозвольте мені йти вперед тут і в моєму вікні терміналу зробити positive1, Enter.
Компілює порядку. Я збираюся запустити positive1, натисніть Enter.
Я вимагаю, щоб ви дати мені ціле позитивне число. Я скажу -1. Це не працює.
0, 99. Це схоже на роботу.
Може бути, не найсуворіший тест, але принаймні це гарна перевірка осудності
що ми знаходимося на правильному шляху.
>> Так що тепер дозвольте мені йти вперед і відкрити версію 2 цієї,
і чим відрізняється вже?
Він реалізує ту ж саму річ, але те, що стрибає, як чітко в цей раз?
Це BOOL в зелений колір. Він буде виділено зеленим кольором, це ключове слово відоме як логічний, який є типом даних.
Вона не приходить побудований в для всіх версій C.
Вам необхідно включити конкретну бібліотеку.
У нашому випадку, я включив CS50 бібліотеку, так що у нас є доступ до BOOL.
Але в рядку 18, ми, здається, є логічне значення тут називають вдячні.
Я міг би назвати це що завгодно, але я назвав його вдячна
просто вид передають смислове значення.
Таким чином, спочатку на лінії 18, я, мабуть, не вдячний
тому що логічне значення вдячні ініціалізується помилковим у рядку 18.
І тоді здається, що я зробив тут в рядках з 21 по 23
це я тільки частково переписати мою логіку.
Так що не функціонально різні, але в рядку 22 тепер я можу перевірити, якщо Int користувач надав
більше 0, то я просто змінити значення вдячні правда.
А навіщо мені це робити? Тому що в рядку 25, мабуть, я збираюся перевірити стан.
У цього циклу в той час як вдячний є хибним.
Так що я запропонував це в якості альтернативи версія 1
тому що це принаймні трохи більш інтуїтивним, можливо, це трохи більш обгрунтованою на англійській мові.
Таким чином, виконайте такі дії, поки ви не вдячні або при вдячні є хибним.
І на цей раз я теж, мабуть, не люблю згадувати те, що користувач набрав в
тому що повідомлення немає змінної п, так насправді, маленька біла брехня там.
>> Функціонально програма трохи відрізняється, як тільки ми перейдемо до нижньої його
тому що я не пам'ятав, що п.
Але я хотів показати тут, що, хоча ми бачили GetInt
і GetString використовується на праву сторону знаку рівності досі
так що ми пам'ятаємо значення, технічно, це не строго обов'язково.
Якщо з якихось причин ви просто не піклуються, щоб зберегти значення,
Ви просто хочете перевірити значення, помітили, що ми можемо просто написати це як GetInt,
відкрита дужка, поруч хлопець.
Ця функція буде повертати значення, як ми вже говорили.
Це буде повернути вам Int.
І тому, якщо ви подумки думаю, що це відбудеться,
при введенні в 99, GetInt повертає число 99,
і так концептуально, це як би мій код був насправді цього.
Так, якщо 99 дійсно більше 0, то вдячний стає істинним,
Потім лінія 25 реалізує ох, ми зробили, тому що я зараз вдячний,
і в рядку 26, ми просто говоримо: "Спасибі за натуральне!"
Як би там не трапилося бути.
Тепер давайте зробимо невеликий синтаксичний цукор тут, так би мовити.
Давайте подивимося, якщо ми можемо прибирати цю лінію 25 з цим третій і останній варіант, в positive3.
>> Зверніть увагу, з тією лише різницею, що тепер це рядок коду? >> [Студент] 25. >> [Малан] Так, 25.
І ми дійсно не бачив цей трюк, але його ми бачили знак оклику в понеділок,
, Який позначає, що? >> [Студент] Не. >> Не чи заперечення.
Так що беріть логічне значення і перевернути його значення.
Правда, стає помилковим, помилкове стає істинним.
Так що це, я хотів би запропонувати, навіть трохи більш інтуїтивним способом написання коду
тому що я досі вдячний ініціалізації помилковим, я все ще роблю таке,
Я поставив вдячні вірно, коли прийде час,
але тепер ви дійсно можете просто перевести цей код усно зліва направо,
а (благодарни!), тому що вибуху або знак оклику позначає поняття не
так що поки не вдячні.
Отже, ще раз, ми не введені нові поняття як такого.
Ми говорили про логічних тому, коли ми грали з нуля,
але розумію, тепер ми можемо просто почати писати наш код по-різному.
Таким чином, особливо в pset1 якщо ви начебто намагається з'ясувати спосіб, щоб написати кілька програм,
Шанси Вам пощастило, тому що там може бути будь-яке число рішень
що ви можете випадково зустріти.
Наприклад, це знаходиться всього в 3 навіть для найпростіших програм. Добре.
А тепер згадаємо в понеділок ми вийшли на цю записку з поверненням значення.
Таким чином, в перший раз, коли ми написали програму, яка не просто основний;
вона також має свою власну функцію, яку я написав тут.
Таким чином, у рядку 31 по 34 я реалізував функцію куб.
Це не комплекс. Це просто * а * а в цьому випадку.
Але, що важливо про нього, що я беру вхід у вигляді
і я повертаюся вихід у вигляді * а *.
Так що тепер у мене є можливість, так само, як я раніше з prinf один,
для виклику цієї функції, викликавши функцію куб.
>> І куб функція приймає деякі вхід, і куб функція повертає деякий вихід.
На відміну від Printf просто щось зробив.
Вона не повертає нічого, що ми дбали про, хоча, як в сторону воно повертає значення;
Ви просто взагалі ігнорують його.
Printf просто щось зробив. Це був побічний ефект друку на екрані.
На відміну від тут, у нас є куб функції, які насправді повертає щось.
Так що для тих, хто знайомий з цим, це досить проста ідея.
Але для тих, хто менш знайомий з цією ідеєю проходять в входи і виходи повертаються,
Давайте спробуємо просто щось супер просто.
Хто-небудь зручні підійшовши на етапі коротко?
Ви повинні бути знайомі з камерою на вас. Так? Добре.
Як тебе звуть? >> [Студент] Кен. >> Кен. Добре. Кен, давай вгору.
Кен буде функція виду тут.
Давайте підемо далі і зробити це. Давайте трохи фантазії.
Дуже приємно. Ласкаво просимо в центрі сцени. Добре.
Давайте хіт цієї кнопки тут. Добре.
Так що тут у вас є сучасний дошці,
і що я є основною функцією, наприклад,
і у мене немає IPad в руках.
>> Я дійсно не пам'ятаю, як - Ну, я не можу сказати.
Я дійсно не мають хороший почерк,
і т.д. Тому я хочу, щоб щось надрукувати на екрані для мене.
Я є основною програмою, і я буду у вас кажуть, що це
записавши її в моїй курячої нуля, а потім повз вас вхід.
Так нерозумно, хоча це вправа, поняття функції і виклику функції
і повернення функцією дійсно зводиться до цього.
Я головний, я тільки що написав Printf, цитата-кінець цитати щось на екрані,
Я йду в цю програму, і як тільки Printf викликається,
він приймає один аргумент або один параметр іноді в подвійні лапки.
Ось це аргумент. Я передаю його Кен.
Він являє собою чорний ящик, написав деяку кількість років тому
які, очевидно, знає тільки як друкувати речі на екрані.
Таким чином виконати.
Це не погано. Дуже добре.
Так що тепер Кен робиться виконання. Йому потрібно, щоб передати мені нічого взамін?
Не те, що ми бачили досі.
Знову ж таки, Printf Чи насправді повертає число, але ми збираємося ігнорувати, що на даний момент
тому що ми ніколи не використовували його. Так ось воно що для Кена.
І ось тепер основні бере на себе контроль над програмою ще раз
тому що рядки коду, Printf, здійснюється виконання.
І ми рухаємося до нашої чином, виконання будь-яких інших ліній є.
Отже, тепер давайте спробуємо трохи інший приклад.
На цей раз тут, давайте спочатку очистити екран, і на цей раз ми будемо робити виміри кубатури функції,
але на цей раз, я думаю, вихідне значення.
>> Так що давайте йти вперед і робити це.
Тепер у мене є рядок коду, яка говорить х одержує куб х.
Рядок коду, нагадаємо, виглядає таким чином: х = куба (х);
Так як це буде працювати? Давайте підемо далі і дати вам білий екран.
Я збираюся записати тепер значення х,
які в даний момент часу, трапляється, скажімо, 2, щоб тримати його проста.
Я написав на листку паперу значення 2, який є моїм значення х.
Я передаю його Кен. >> А я просто пишу відповідь? >> Да, давайте просто написати відповідь.
Добре. І тепер він повинен повернути мені що-небудь. Perfect. Приємно перехід.
Так що тепер він простягає мені назад значення 8 в даному випадку, і що мені з ним робити?
Насправді - подивимося, отримати це право. Що я буду з нею робити?
Тепер я збираюся взяти це значення і насправді зберігати його в ті ж біти в пам'яті.
Але зауважте, я трохи борються тут.
Я трохи збентежений, бо де ж я насправді записати значення х,
тому що я тільки що зробив фізично руку Кен листок паперу, який був значення 2,
який був х, і, дійсно, це саме те, що сталося.
Ось і виходить, що при виклику функції, і ви передаєте в якості аргументу
наприклад, привіт, світ, або ви передаєте в якості аргументу як 2,
Як правило, ви передаєте копію цього аргументу.
І так само, як я записав номер 2 тут і передав його Кен,
, Що має означати, що в мене ще є копія значення 2 десь
тому що дійсно, тепер, коли я отримав назад значення 8, мені потрібно повернутися в оперативній пам'яті
і фактично записати 8, де я колись був номер 2.
Таким чином, візуально, пам'ятайте про це поняття проходить в буквальному сенсі, копію значення.
>> Кен робить свою справу, простягає мені у відповідь щось - у цьому випадку значення, наприклад, 8 -
а то в мене щось зробити з цим значенням, якщо я хочу зберегти його околицях.
Так що все це повернеться, щоб бути дуже добре знайомі незабаром.
Спасибі вам велике за це демо тут, Кен. [Оплески]
Дуже добре зроблено.
Давайте подивимося, як це в кінцевому підсумку пов'язане з деякими з виклику функції, що ми робимо тут.
Дозвольте мені йти вперед і повернути нас до вимірювання кубатури приклад.
Зверніть увагу, що якщо ми дійсно хочемо почати приймати це далі,
ми збираємося повинні пам'ятати про те, що число х, що це передається тут
відрізняється від того, що насправді передається в функцію.
Отже, ще раз, це проходить повз копії стане вельми доречні в одну хвилину.
Давайте поглянемо на те, що не зовсім правильно працювати ще.
Я збираюся йти вперед і відкрити третій приклад помилки, яка є збитковою за своєю природою,
і це називається buggy3 і реалізує заміни.
Тут у нас є основні функції, які х і у довільно встановлюється в 1 і 2, відповідно.
Ми могли б використовувати GetInt, але нам просто потрібно проста вправа,
таким чином, це жорстко, як 1 і 2.
У рядках 21 і 22, ми, мабуть, роздрукуйте х і у, 1 на лінію.
Потім у рядку 23, я стверджую, я обмін цими значеннями, крапка, крапка, крапка.
Я мабуть виклику функції в рядку 24 званими своп, який приймає 2 аргументів.
Це повністю законно для функцій взяти 2 аргументи. Ми бачили Printf це зробити вже.
>> Таким чином, своп-видимому, має х і у, і, як припускає його назва,
Я сподіваюся, що він збирається змінити ці 2 значення.
Так от я стверджую, у рядку 25 "перестановки"! і я передрукувати х і у
за умови, що вони дійсно були поміняні місцями.
Але якщо я дійсно запустити цю програму - дозвольте мені відкрити вікно терміналу,
дозвольте мені зробити buggy3 - як випливає з назви, це не закінчиться добре
тому що, коли я вдарив Enter, помітили, що х = 1, у = 2,
і все ж в кінці програми, вони все ще, по суті, те ж саме.
Таким чином, на основі демонстрації тільки зараз з Кеном, те, що відбувається насправді?
Давайте поринемо в цю своп функції. Це супер короткі. Це всього лише кілька рядків коду довго.
Але те, що основна проблема заснована на простій історії, розказаної тут з Кеном?
Чому підкачки не працює?
[Студент] ви зберігаєте на копію, а не змінна.
Саме так. Ми зберіганні на копію, а не саму змінну.
Іншими словами, своп-видимому, має 2 аргументи, INT,
і це умовно називати а і б,
і тут я пройшов по х і у, які є відповідно 1 і 2,
але я не в буквальному сенсі проходить в х, я не в буквальному сенсі проходить в у,
Я передаю копії х і копію у.
Це майже як якби ви скопіювали і вставили в своп
значення, які ви хочете, щоб він насправді маніпулювати.
Так що, якщо це так, коли я почала програми виконання рядки 35, то 36,
коли я добираюся до лінії 37, на даний момент в цій історії, що значення?
У цей момент в історії, рядок 37, що є значення в цій точці? >> [Студент] 1.
[Малан] Вона просто повинна бути 1, праві, тому що х був прийнятий в якості першого аргументу,
і ця функція просто довільно називає свій перший аргумент.
Точно так само є у другого аргументу, і це просто довільно виклик другого б аргумент.
>> Ця дихотомія насправді досить просто пояснити. Подумайте про це.
Ніхто з нас не зустрічав людину, яка написала Printf,
тому, звичайно, він або вона не знає, що наші змінні через 30 років будуть називати.
Так що має бути різниця між, що ви називаєте змінні у функціях ви пишете
і що ви називаєте змінні у функціях ви дзвоните або використання.
Отже, іншими словами, я написав мої змінні х і у,
Але якщо хтось інший написав своп функції, він або вона, звичайно, не знав би,
що мої змінних буде називатися,
так розумію, що це, чому у вас є ця двоїстість імен.
Технічно, я міг би зробити це, збіг,
але вони будуть як і раніше передається в якості копії.
Було б просто чистий збіг естетично, якщо це чоловік, який написав своп
були використані ті ж імена.
Таким чином, на даний момент в цій історії, рядок 37, 1, B 2, а тепер я переходжу до поміняти їх місцями.
Перш за все, дозвольте мені насправді зробити це набагато простіше.
Я не знаю, що ті 3 рядки коду робили.
Дозвольте мені зробити це: B = A, A = B; зроблено.
Чому це зламаний, логічно?
Це свого роду інтуїтивні речі, чи не так?
Так а стає виданню і виданню стає,
але проблема в тому, що як тільки лінія 37 виконує, що значення А і В?
Те ж саме, 1, тому що ви відразу, так би мовити, ви змінили б рівним.
Тому, як тільки лінія 37 була виконана, це здорово, тепер у вас є 2 примірники № 1
Усередині цієї функції, так що потім, коли ви говорите в рядку 38 = B,
Ви видів різьбових тому що ви просто присвоєння 1 до 1.
Ти начебто втратив значення, яке ви дбали про.
Таким чином, в оригінальну версію цієї, зверніть увагу, що я зробив.
Замість цього я була третя рядок коду, яка виглядала наступним чином.
Я заявляю, тимчасових змінних.
>> Tmp це дуже поширене ім'я для тимчасової змінної, і це Int
тому що він повинен відповідати тому, що я хочу зробити копію.
Я зберігаю копії всередині TMP, тому, як тільки лінія 37 була виконана,
Значення це - швидка перевірка осудності - 1, значення Ь 2,
і значення TMP також 1.
Так що тепер я виконаю лінії 38.
Як тільки лінія 38 виконується, приймає значення б. І В 2, так що тепер 2.
Таким чином, на даний момент в цій історії, дорівнює 2, B 2, а TMP 1,
так що тепер логічно, ми можемо значення просто грюкнути TMP в в б і ми зробили.
Отже, ми вирішили цю проблему.
На жаль, коли я запускаю цю програму в такому вигляді, це насправді не поміняти будь-які значення.
Але щоб бути зрозумілим, чому?
Я встановив логічні задачі з усього хвилину тому,
але знову ж таки, якщо я запускаю цю програму, х і у, залишаються незмінними
До кінця виконання програми.
[Нерозбірливо коментар студент] >> Ми не повернулися нічого, так що це правда.
Але, виявляється, є невелика проблема тут, тому що до цих пір,
Єдине, що ми змогли повернути це одне, і це обмеження C.
Ви можете повернути тільки дійсно одне значення, і в цьому випадку я трохи застряг тут
тому що я міг повернути нове значення х, або я міг би повернути нове значення у,
але я хочу і назад.
Таким чином, повернення не просте рішення тут.
Але проблема в корені чому? Що ми насправді помінялися місцями?
[Студент] а і б. >> А і б.
Але і б є копіями х і у, яка означає, що ми тільки що зробили всі ці роботи,
Ми тільки що провели 3 хвилини говоримо про функції підкачки і всі 3 з цих змінних,
і це здорово, абсолютно правильно в ізоляції,
але і сферу б лише в цих рядках.
>> Так як цикл, якщо ви оголосите ціле я всередині циклу,
Аналогічно, якщо ви оголошенням і б всередині функції, які ви написали,
вони дійсні тільки всередині цієї функції, а значить, як тільки своп зробити виконання
і ми переходимо від лінії 24 в лінію 25, х і у не змінилося.
Ви просто даремно багато часу, обмін копіями змінних.
Ось і виходить, що рішення це насправді, не очевидно.
Це не цілком достатньо, щоб повертати значення, тому що ми можемо тільки повернути значення 1,
і я дійсно хочу поміняти х і у в той же час,
так що ми збираємося мати, щоб повернутися до цього.
Але зараз розумію, що питання принципово випливає з того факту, що А і В є копіями
і вони знаходяться у своїй власній області.
Давайте спробуємо вирішити це в деякому роді.
Дозвольте мені насправді прокрутити назад тут і відкрити, скажімо, четвертий варіант цього, buggy4.
Що з цього приводу?
Це схожі, але більш просту задачу, щоб дивитися на, перш ніж прийняти удар на її рішення.
Ця програма називається приростом, і він, очевидно, ініціалізує ціле число х 1 у рядку 18.
Я тоді стверджувати, х = 1, тоді я претендувати "інкремента ..."
Потім я викликаю приріст, але потім в лініях 22 і 23, я стверджую, що це було збільшується,
Я стверджую х зараз би це не було - 2, по-видимому, - але ця програма глючить.
У чому проблема?
Так. >> [Нерозбірливо відповідь студента] >> Саме так.
Таким х було оголошено, очевидно, у рядку 18.
Тобто в фігурних дужках основного автора.
Так що однозначної відповіді тут є те, що в той час як х існує тут,
вона не існує в рядку 32, так що ця програма насправді навіть не буде компілюватися.
Компілятора, коли я намагаюся компіляції даного коду буде кричати на мене
Про деякі неоголошений ідентифікатор або щось в цьому роді. У самому справі, давайте спробуємо.
Це робить buggy4. Там вона є.
Використання 'X' неоголошений ідентифікатор в рядку 32.
А насправді, давайте будемо більш чітко тут сьогодні, так що це корисно
в робочий час і вдома.
>> Зверніть увагу, що це трохи загадково написано.
Але те, що Clang має кричав на нас, сказавши buggy4.c: 32:5, насправді корисно.
Це означає, що помилка в рядку 32 на позицію символу 5.
Таким чином, 1, 2, 3, 4, 5. Це, справді, де проблема.
А також, теж майте на увазі, в робочий час і на дому, мені пощастило тут.
У мене є одна помилка. Це збирається бути відносно легко виправити.
Але якщо ви отримаєте весь екран повний переважна повідомлення про помилки,
ще раз усвідомити, що нижній можна просто бути симптомом самих верхніх один.
Так завжди ганятися за ваші помилки зверху вниз
тому що там може бути просто ефект ланцюжку
, Який пропоную вам мати набагато більше проблем, ніж ви насправді.
Отже, як ми можемо це виправити, якщо моєю метою є, щоб збільшити х? >> [Студент] Зробити х глобальної.
Отже, ми можемо зробити глобальне х.
Давайте ярлик, який я попереджав про більш ранні, але чорт візьми, нам просто потрібно швидко виправити,
так що давайте просто скажемо, Int х тут. Це робить х глобальної.
Так що тепер основним має до них доступ і прирощення має до них доступ,
і тому дозвольте мені йти далі і зібрати це зараз.
Зробити buggy4, Enter. Здається, для компіляції зараз.
Давайте запустимо buggy4. І, здається, насправді працює.
Це одна з цих речей, які робити, як я кажу, а не як я роблю,
як я тільки що зробив тут, тому що в цілому,
наші програми збираються отримати набагато цікавіше і набагато довше, ніж це,
і якщо ваше рішення життєвих проблем просто покласти всі змінні в початок файлу,
Дуже швидко у програми отримують жахливо важко керувати.
Це стає все важче вигадувати нові імена змінних,
стає все важче зрозуміти, що змінна робити те, що,
і т.д. Загалом, це не дуже гарне рішення.
Так давайте зробимо це краще.
Ми не хочемо використовувати глобальну змінну тут.
>> Я хочу, щоб збільшити х, так що я міг би, очевидно -
Зрештою, це начебто дурної історії, тому що ми просто робимо це -
але якщо б я не знав про те, що оператор або я не зміг змінити його в основний собі,
Як ще я міг здійснювати Кен сюди на цей раз не у кубі, але для збільшення?
Як змінити цю річ тут? Так.
[Студент] Pass х, а потім повернутися [нерозбірливо] >> Гаразд, добре.
Так чому б мені не пройти в х, а потім, а не повертати його,
чому я не просто повернути х + 1.
Ще пара речей потрібно міняти тут. Я перебуваю на правильному шляху.
Що ще потрібно налаштувати? Хтось інший. Так.
[Нерозбірливо відповідь студента]
Мені потрібно, щоб змінити тип повернення збільшення бо це не анулювати.
Порожнеча нічого не засіб повертається, але ясно, тепер це,
так що це треба змінити, щоб - >> [студент] Int.
INT у відповідність з тим, що я насправді повернення.
Зараз щось ще, як і раніше баггі тут. Так.
[Нерозбірливо відповідь студента] >> [Малан] Так що мені потрібно збільшувати х?
[Нерозбірливо відповідь студента] >> [Малан] Ах, так мені потрібно передати х.
Так що мені потрібно зробити це тут. >> [Нерозбірливо коментар студент]
[Малан] Таким чином, прототип, я повинен змінити це тут.
Таким чином, це має стати INT, це повинно стати -
хм, я насправді є помилка тут. Давайте виправимо це в першу чергу.
Що це насправді бути? Це має бути щось Int.
Це може бути х, але, чесно кажучи, якщо почати називати всіх ваших змінних х,
це буде все менше і менше ясно, що є що.
>> Так що давайте просто довільно вибрати різні іменування для мого допоміжні функції,
Функції я пишу. Ми будемо називати його, або ми могли б назвати це -
Давайте назвемо це число буде ще більш явним.
І тоді я повинен повернути все, що номер плюс 1,
і тепер я повинен змінити 1 річ, тут і ще одна річ тут.
Що я повинен змінити в рядку 21 в першу чергу? >> [Нерозбірливо відповідь студента]
[Малан] Я повинен призначити його на х. Я не можу просто зателефонувати прирощення (х).
Мені потрібно пам'ятати відповідь на зміну значення х на лівій стороні.
І хоча х зараз знаходиться на лівій і правій, це абсолютно нормально
тому що права частина запускається на виконання першого потім отримує гепнувся в лівій річ -
х в цьому випадку.
І тоді, нарешті, це легко виправити зараз.
Це повинно просто відповідати тому, що ось внизу, внутр номер.
Таким чином, цілий букет змін дійсно нерозумно функції
але представник речей, які ми більше хочемо зробити.
Так що buggy4. Я десь напартачили.
О, мій Бог. П'ять помилок в 6-рядковим програми.
Так що ж трапилося на лінії 18, символ 5?
Так що я повинен заявити про це, внутр.
Давайте подивимося. Є ціла купа інших помилок.
О, Боже мій - 19, 18, 21 - але, знову ж таки, давайте просто очистити екран, управління L тут,
і перезапустити Clang.
Таким чином, 5 завдань на самом деле просто, що 1.
Отже, тепер давайте запустимо buggy4, Enter. Ось так, х був збільшений правильно.
Добре. Будь-які питання про те, як збільшити число? Так.
[Нерозбірливо запитання студента] >> Хороше питання.
Як це, що я можу просто змінити х на номер, і програма буде знати відразу ж?
>> Знову ж таки, думаю про нього, як це абстракція.
Так що, якщо я головний і Кен приріст, чесно кажучи, я не хвилює, що Кен називає свій iPad.
Мене не хвилює, що він називає все, що має відношення до його реалізації цієї функціональності.
Це деталі реалізації, які я, головне, не потрібно піклуватися про.
І так просто змінивши його послідовно всередині функції - тут номер і номер тут -
Все це займає так багато часу, як я перекомпілювати.
Це ніби як якщо ви думаєте про багатьох з нас, тих, у кого водійські права
які в'їхали або якщо ви навіть в'їхав в автомобіль,
Більшість з нас не знають, як машина працює під капотом.
І буквально, якщо ви відкриваєте капот, більшість з нас - я в тому числі -
не збирається знаю, що ми дивимося на,
ніби як ви можете відчувати себе в такі речі, як це прямо зараз.
Але ми дійсно не маємо дбати, як машина працює,
ми не повинні піклуватися, що всі стержні і поршнів і кабелів усередині автомобіля
насправді робить.
Так щось подібне, що ви називаєте поршень тут не має значення в даному випадку. Та ж сама ідея.
Так. >> [Нерозбірливо запитання студента]
Якщо є кілька видів змінна момент ха назад,
Ви, програміст, доведеться міняти їх всюди.
Або ви могли б зробити буквально файлів, меню, а потім Знайти, Замінити - щось в цьому роді -
але ви будете мати, щоб зробити ці зміни самостійно.
Ви повинні бути послідовні. >> [Студент] За наявності декількох змінних [нерозбірливо]
Певному порядку, як тут, якби це було Int інший номер? >> [Студент] Правильно.
[Малан] Так. Замовити має значення, коли ви викликаєте функцію.
>> Так що якщо я дзвонили приріст тут щось в цьому коми,
є пряме відображення.
Перша змінна, як там це називається, зробив копію першого аргументу тут.
Вибачте. Це не повинно бути круглих дужках.
Другий аргумент лінії з другим. Так порядку, так, питань. Добре.
Вибачте. Я взяв довгий шлях, щоб дістатися там. Інші питання? Добре.
Отже, давайте подивимося, якщо ми не можемо намалювати картину того, що відбувається насправді тут
під капотом, так би мовити.
Це прямокутник, який може представляти пам'яті комп'ютера.
Навіть якщо ви не уявляєте, як пам'ять працює або як RAM робіт,
принаймні, припустити, що у вас є пучки вона в ці дні.
У вас є мегабайт це, у вас є гігабайти це,
і ми знаємо, від тижня 0 байт, що саме те, що? >> [Студент] 8 біт.
8 біт, чи не так? Таким чином, 8 нулів і 1.
Отже, якщо ваш комп'ютер має гігабайт оперативної пам'яті, 2 гігабайтами оперативної пам'яті в ці дні,
у вас є мільярд або 2 млрд. байт пам'яті, або приблизно 8000000000 або 16 мільярдів біт
всередині комп'ютера.
На відміну від невеликої приклад Wooly Віллі, це не магнітні частинки звичайно більше.
Все частіше - в ноутбуках, принаймні, - це твердотільні накопичувачі SSD,
що просто не мають рухомих частин. Це всі електронні. Це все електрику основі.
Так що думайте цього прямокутника, як тільки представляє 1 або 2 гігабайтами пам'яті, що у вас є.
>> Так що це шматок пам'яті.
Світ інформатики роду відгороджена
ділянки пам'яті, щоб зробити різні речі.
Наприклад, якщо це оперативної пам'яті комп'ютера, як це було запропоновано прямокутник там,
Виявляється, що за угодою, у верхній частині вашої пам'яті, так би мовити,
, Як правило, те, що називається текстовий сегмент.
Такі 0 і 1, що ви зібрали.
Тому, коли ми дивилися під капотом на те, що a.out є,
Всі ці 0 і 1, коли ви запускаєте програму,
тих, 0 і 1 завантажується з жорсткого диска в те, що називається RAM,
і в оперативній пам'яті, вони містяться у верхній частині.
У той же час, у вас є інші речі: ініціалізація даних, ініціалізацію даних.
Ці 2 валка пам'яті, звертайтеся до глобальні змінні, які ви не часто використовуєте
але іноді, якщо ви це зробите, вони в кінцевому підсумку там також.
Тоді є деякі інші речі: змінні оточення, які ми не будемо витрачати багато часу на,
але потім 2 важливі речі, які будуть повертатися протягом семестру,
стека і купи.
Тому більшість з пам'яті комп'ютера зберігається при запуску програми
за те, що називається стеком і те, що називається купою.
Ми не збираємося говорити про купу сьогодні, але ми будемо говорити про стек.
Стек означало викликати в уяві візуальні від їдальні лотки зал їжі в будинку Mather
або там, де ви будете де персонал їдальні чистити їх кожен день,
вони складають їх від підлоги на вгору,
і, аналогічно, в пам'яті, є така ідея поставити щось на стеку,
покласти щось на стеку, покласти щось у стеці.
І що ж ми маємо на увазі під цим?
>> Давайте збільшити тільки на нижню половину цій картині, оперативної пам'яті комп'ютера,
запропонувати наступне.
Виявляється, що коли ви запускаєте програму, як a.out або привіт -
незалежно від програми є те, що ви написали -
Знову ж таки, ті 0 і 1 завантажується з жорсткого диска, який тривале зберігання,
залишається там, навіть коли ви вилку, завантажується в оперативну пам'ять.
RAM швидше, ніж жорсткі диски - це менше, ніж жорсткі диски -
але це там, де програми жити, поки ви працюєте них.
Таким чином, ви двічі клацніть програму на Mac або PC, вона завантажується з жорсткого диска в оперативну пам'ять.
Як тільки він буде завантажений в оперативну пам'ять, 0 і 1 піти на шлях зверху,
так званих текстових сегментів, але потім, як тільки ваша програма фактично починає працювати,
Основна функція називається, а головне, як ми бачили, часто має локальні змінні,
і вона має цілих і рядків і символів тощо.
Так що якщо ваші програми, які ви написали або програми, які ви подвійному клацанні
використовувати деякі змінні усередині основного,
вони в кінцевому підсумку в нижній частині вашого стека пам'яті, так би мовити.
Більш конкретно, що ж це насправді означає?
Це просто означає, що якщо ми збираємося число байт оперативної пам'яті на вашому комп'ютері,
зауважити, що це може бути номер байта 0, це може бути номер байта 1, 2, 3, 4, 5, 6,
все, аж до 2 млрд. буде всю дорогу там на самому верху.
Отже, іншими словами, коли ми говоримо про оперативну пам'ять або пам'яті в байтах,
це просто означає, що хтось вирішив, що нумерувати кожну з цих ділянок пам'яті.
Тому, коли вам потрібно 32 біта для Int або вам потрібно 8 біт на символ,
де вони в кінцевому підсумку в пам'яті?
>> Концептуально, вони просто в кінцевому підсумку в нижній частині цієї речі, званої стеком.
Але що цікаво тепер, коли основні викликає функцію -
припустимо, що функція називається Фу, просто довільне назву -
що відбувається, є основним знаходиться в нижній частині цього стека пам'яті;
Foo тепер поміщається у верхній частині головного в пам'яті.
Таким чином, будь-які локальні змінні, Foo була в кінцевому підсумку роду концептуально вище, ніж в основній.
Якщо Foo викликає іншу функцію під назвою бару, ці змінні в кінцевому підсумку тут.
Якщо барі називає щось ще, тут, тут, тут.
Так що ж цікавого про запуск програми є те, що, як ви викликаєте функції
і як ці функції викликати функції і як ці функції називають функціями,
Ви створюєте цей стек функцій в пам'яті.
І тільки один раз функція повертає ви почнете одержувати цю пам'ять назад.
Таким чином, одним з найпростіших способів запустити з пам'яті в комп'ютерній програмі
, Щоб написати функції, які ніколи не повернуться.
Так, наприклад, давайте продемонструвати, як багато з навмисно баггі програми.
Дозвольте мені йти вперед і робити # включити ,
Int основних (недійсними),
і я збираюся робити, а (2> 1), який, імовірно, ніколи не буде змінюватися на нас,
і дозвольте мені тепер іти вперед і робити Printf.
Насправді, це буде менш візуально цікавим. Давайте зробимо це.
Для Int = 0;> 0 - давайте робити цю помилку - я + +.
І давайте не Printf тут. Давайте практикувати те, що я проповідував.
Давайте тут метод, недійсними хор, і ми будемо говорити Int я,
і тоді я буду говорити Printf - ні, давайте зробимо це більш цікаво.
Давайте насправді не друкує взагалі нічого. Давайте просто це зробити: хор (I).
Добре. Так що це баггі, бо навіщо?
Я придумую, як я йду, тому що програма насправді не роблять нічого цікавого.
>> Але це не мета.
Мета полягає в тому, щоб написати програму, основною функцією якого робить те, що, мабуть?
Зателефонуйте себе. А насправді, ми не потребуємо петлю.
Давайте навіть спростити цей раз, щоб не випустити з уваги дійсно фундаментальна помилка.
Головні виклики хором співати хором,
Потім я зробив щось дурне і я повинен був хор хор виклику
тому що я припускав, хтось ще збирається здійснити це, може бути,
і тепер це не буде зібрати ще. Мені потрібно зробити що?
Мені потрібно прототип, пам'ятаю.
Тому мені потрібно, щоб тут порожнеча хору (INT я);
Так що тепер, якщо я йду сюди - насправді, давайте використовувати великі вікна.
Давайте підемо далі і зробити хором.
Використання неоголошений ідентифікатор я.
О, це було нерозумно. Нам не потрібні аргументи. Давайте просто це зробити.
Шкода, що ми розпочали цей шлях. Було б набагато простіше написати програму.
Там же. Тепер давайте перейдемо до моїх вікно терміналу, повторно Clang, і тут ми йдемо.
Це було дійсно швидко.
Що насправді тільки що сталося, правда?
Ну, тепер я додам друку лінії, тому ми можемо бачити.
Дозвольте мені сказати, Е ("я тут") - не змінні. Ми залишимо це так.
Дозвольте мені зробити повторно. Дозвольте мені повторно хор.
І ... давай. Продовжуйте.
Як осторонь, чому вона не зазнала краху?
Помилки сегментації відбулося супер швидкий раніше.
[Нерозбірливо відповідь студента] >> Саме так. Так що це займає час, щоб надрукувати, чи не так?
Це займе більше роботи з боку комп'ютера.
І ось це: помилки сегментації.
>> Так помітите, як швидко запускати програми.
Якщо ви не друкує нічого, супер швидко.
Але ми все ж отримали цю помилку сегментації, тому що те, що відбувається?
Якщо ви думаєте про те, як пам'ять комп'ютера викладається,
У цьому випадку, щоб бути основним, але от давайте просто називати цей хор, і давайте називати це хор.
І тепер, якщо я роблю свою естетику права, це просто буде сказати, хор, хор, хор,
хор, хор, хор, хор, до нудоти, і врешті-решт, те, що станеться?
Якщо велика картина, в буквальному сенсі, це те, що просто відбувається концептуально?
Стек перевитрата купи.
Або, що ще гірше, ви просто захоплені всі, включаючи текст сегмента,
яка є 0 і 1, які представляють вашу програму.
Коротше кажучи, це просто супер, супер поганого.
Ваша програма вийшла з-під контролю.
Ви використовуєте спосіб більше пам'яті, ніж передбачалося
все через дурної помилки в даному випадку,
або в даному випадку абсолютно свідомо зробили функцію, що називає себе.
Так от, це не так уже й погано.
Функції, які називають себе дійсно має велику силу, коли ви використовуєте його правильно.
Я не використовував його правильно тут.
Так що не все так погано, але те, що я ніколи не перестануть називати себе
є фундаментальною слабкістю тут цієї програми.
Так куди ми йдемо з усім цим? Що насправді відбувається?
Коли я називаю приріст функції, як ми робили в тих прикладах,
У мене є значення, як 1, що я проходжу дюйма
Я проходжу в копії номер 1, так відбувається наступне.
Підемо в прирощення, наприклад, цей хлопець прямо тут.
Ось що насправді відбувається.
Коли я називаю приріст і я проходжу по х, графічно, що відбувається ось це.
>> Якщо у мене є вартість 1 зберігається тут, і я насправді звуть приріст,
яка тепер називається хор - Ipad кидає мене тут.
Давайте назвемо це прирощення, і ми не знаємо, що це наступна функція буде.
Так що ж насправді відбувається десь тут в основному у мене є шматок пам'яті
, Який зберігається номер 1.
Коли я називаю приріст, я використовую іншу частину пам'яті,
але тепер у мене є копія 1.
Коли я збільшити це значення, це стає 2,
але що відбувається потім, як тільки приріст прибутку?
Ця пам'ять просто отримує повернув до операційної системи,
яке означає, що все, що ви зробили нічого корисного.
1, який був спочатку містилися в основному, як і раніше насправді.
Так куди ми йдемо з цим?
Виявляється, що в пам'яті у вас є ця спина до спини послідовність байтів
що ви можете покласти речі в, і виявляється, що ми вже бачили щось
який включає в себе наведення спиною до спини, щоб спина до спини.
Що являє собою рядок, грунтуючись на тижні 1, і тепер тиждень 2?
Це просто набір символів.
Ось і виходить, як ви можете поставити номери в пам'яті,
Точно так само ви можете покласти символів у пам'яті.
І як тільки ми починаємо покласти символів у пам'яті спиною до спини, щоб спина до спини,
Виявляється, що за допомогою найпростіших речей, як для циклу або час циклу,
ми можемо повторювати зліва направо по символів в рядку
і почати масажуючи їх у різні персонажі в цілому -
може стати B, B міг би стати C -
так що в кінцевому рахунку, ми можемо прийняти англійське пропозицію, що насправді має сенс
і конвертувати кожну з цих листів по одному
пішки через нашу пам'ять комп'ютера зліва направо насправді шифрування.
Отже, давайте зробимо наш п'ятихвилинну перерву тут,
і коли ми повернемося, ми почнемо цей процес скремблювання інформації.
>> Добре.
Перш ніж ми заглибимося в деякі шифрування і ці речі називаються масивами,
Дозвольте мені паузу на будь-які питання, тому що я відчуваю, що я дійсно добрий сп'янів
деякі з цих питань. Так що давайте зафіксуємо тепер, якщо ми можемо.
Ми тільки що говорили про повернення цінностей, про які ми говорили аргументи,
і ми говорили про це поняття, яке ми повернемося в найближчі тижні,
перегляду пам'яті цілу купу цих складених лотках, так би мовити,
знизу на вгору, так, що кожен лоток, який отримує покласти в стек
являє собою функцію, яка в даний час називається.
Є питання?
Дозвольте мені задати питання тут.
Дозвольте мені спростити це до того, що було до деяких з наших ранніх Q & A.
Той факт, що приріст має відкриту дужку, внутр номер, закритий дужках -
Що ж Int числа представляють?
[Студент] аргумент. >> Аргумент. Добре. Але те, що аргумент?
[Нерозбірливо відповідь студента] >> Що це таке? >> [Студент] Те, що ви передаєте дюйма
Отже, те, що ви передаєте дюйма І взагалі, це просто вхід.
Якби ви писали функції та цілі, які функціонують в житті
повинен зробити щось трохи інше кожного разу, коли ви використовуєте його,
, То єдиний спосіб, щоб це відбулося насправді, здавалося б надати йому вхід
так що він може зробити щось інше за допомогою цього вкладу кожного разу.
>> Таким чином, ви повинні визначити дві речі, коли функція приймає вхід.
Ви повинні вказати ім'я, яке ви хочете дати, що вхідний
виключно для вашої зручності, щоб ви могли звернутися до нього
У функції, які ви самі пишете, як я зробив тут, в рядку 32.
Але ви також повинні вказати його тип, тому що C є мовою програмування
що саме потрібно, якщо ви хочете змінної, ви повинні повідомити комп'ютера, який тип даних вона є,
У більшій частині так, щоб він не знає, скільки бітів виділити для цієї змінної
тому що це може бути 6 - вибачте, це не буде 6.
Це може бути 16, може бути 8, це може бути 32, навіть 64,
але комп'ютер повинен знати.
Тепер, внутр на лівій стороні представляє те, що, на відміну від?
[Нерозбірливо відповідь студента] >> Що це таке? >> [Студент] Тип функції.
Тип функції і, більш конкретно, типу своєї продукції. Право.
Таким чином, у той час як річ в дужках представляє свій вхід, якщо такі є,
річ, щоб ліва представляє свою продукцію.
І в цьому випадку, мабуть приріст повертає ціле,
і так Int є типом возвращаемого цією функцією.
Що це значить повернути?
Буквально, ви використовуєте ключове слово повернення і то, якщо те, що ви повертаєте
праворуч від ключового слова є цілим числом,
те, що дійсно відповідає тому, що ми обіцяли.
Ви не могли б зробити щось на зразок цього - Здрастуй, світ - тому що це рядок.
>> Очевидно, це не є цілим числом.
Коротше кажучи, тягар насправді на нас, програмістів, для визначеності
про те, що ми повертаємося, і тоді насправді йти про повернення його.
Контекст тут, зараз, в тому, що пам'ять комп'ютера становить один гігабайт, 2 гігабайти -
що завгодно, - може бути, це більше, може бути, це менше,
але комп'ютер розглядає її як мають різні розділи.
Щось іде туди, щось ще відбувається там, нагорі,
різні речі йде в середині, і сьогодні ми тільки починаємо розповідати історію,
але ми повернемося до цього з часом.
В даний час, тільки шматок пам'яті ми дійсно дбаємо про те, текстовий сегмент
тому що тільки що представляє 0 і 1, що Clang був сигнал.
Отже, коли ви запустите команду на клавіатурі, як a.out
або ви двічі клацніть значок на Mac OS або Windows,
Ваша програма завантажується з жорсткого диска в оперативну пам'ять
і він гепнувся у верхній частині оперативної пам'яті комп'ютера, так би мовити.
Між тим, як ваша програма починає працювати і основні викликається
У програмі ви писали або програми Microsoft або Apple, пише,
будь-якого з її локальні змінні в кінцевому підсумку там на дні пам'яті комп'ютера.
Але якщо основні виклики іншу функцію, яка сама по собі має змінні чи аргументи, вони в кінцевому підсумку над ним.
І якщо ця функція викликає те, що вони в остаточному підсумку над ним, над ним, над ним.
>> І тільки один раз в функції здійснюється виконанням Чи стек лотків, так би мовити,
починають отримувати все нижче і нижче.
І це те, що тоді, в двох словах, пояснює, чому, коли ви дзвоните кубі
або ви дзвоните приріст, ви передаєте копію значення.
А що це означає, що наочно це те, що ви буквально написання номер 1
В іншій частині пам'яті, зміни, що з 1 по 2 у разі збільшення
або 8 у разі куба, а потім кидали, що пам'ять далеко
як тільки збільшення або повернення куб функції. Питання.
[Студент] Де глобальні змінні зберігаються?
Глобальні змінні зберігаються в те, що в даний час називається инициализируются дані або неініціалізованих даних,
різниця в тому, якщо у вас є глобальна змінна і ви призначаєте його відразу ж значення
з знак рівності, вона закінчується на вершині,
і якщо ви просто говорите Int х, без значення, це закінчується трохи нижче, в оперативній пам'яті
Просто за угодою.
Інші питання? Добре.
Таким чином, ця картина буде повертатися, як ми отримаємо більш потужний
з тим, що ми можемо зробити з комп'ютером,
але зараз, давайте короткий вступ в криптографію,
певний тип шифрування, не вирішує всіх проблем у світі
але вирішити деякі з них.
У цьому випадку тут, у нас є те, що називається секретним ключем.
Секретним ключем, як випливає з назви, відбувається її безпеки від таємницею.
>> Наприклад, якщо ви були ще в початковій школі, і ви проходили трохи любовний лист таємного
до хлопчику чи дівчинці ви тиснули на, якщо ви хотіли передати цю записку по аудиторії,
Ви, ймовірно, не буде писати таку записку на англійській мові або що ваша рідна мова.
Замість цього, ви можете зашифрувати або ви можете просто відправити їм текстове повідомлення в ці дні.
Але ви могли б насправді передають їх до відома всьому класі.
І зробити це надійно таким чином, що ваші друзі і вчителі
Не знаю, що ви пишете, ви можете придумати досить простий алгоритм,
Молодий хоча ви могли б бути, просто дертися слова.
Таким чином, замість того, щоб писати ви можете написати б,
замість б ви могли б написати с,
замість того, щоб з вами могли б написати D, і так далі.
Або ви могли б придумати більш складний переклад
листів у різні літери.
Але заковика в тому, хлопчик чи дівчинка, яким ви відправляєте цю замітку
потрібно знати щось, що і, очевидно? >> [Студент] Що ви відправляєте.
Який ваш секрет, як і те, що в тому, що відповідність між а і Ь і с і д и.
Це тільки додавання 1 до кожної з букв, щоб перейти від А до Б, В до С?
Це більш складний, ніж це?
>> Таким чином, ви і ваш розчавити повинні мати цю секретну інформацію,
але є види Catch-22 тут.
Якщо це в перший раз ви відправляєте цю любов листа через клас,
Як це хлопчик чи дівчинка буде знати, в чому секрет навіть є?
Так що секретний ключ шифрування не вирішує всіх проблем у світі,
і є насправді зв'язок тут, що ми повернемося до до кінця семестру.
Точно так само більшість з нас не знає, що хтось працює, наприклад, на Amazon.com,
і все ж багато хто з нас, напевно, купив матеріал в Amazon.com,
і нас вчили вважати, що ці транзакції електронної торгівлі знаходяться в безпеці.
URL, ймовірно, говорить HTTPS, є, може бути, дурний маленький значок замку десь,
є якась криптографії забезпеченні інформації про кредитну карту
між вами і Amazon.com.
І все ж, якщо криптографія містить у собі знання якийсь секрет
І все ж я не знаю нікого, на Амазонці, і я, звичайно, не влаштував будь секрет
з кимось на Amazon, як мій комп'ютер або мій браузер це робить?
Виявляється, є інші види криптографії взагалі, що вирішити цю проблему.
Але на сьогоднішній день, ми зосередимося на простий
, Де можна організувати заздалегідь знати деякі таємні
+1 Або як деяке відображення між а і б о.
І процес криптографії звичайно включає в себе це.
У вас є звичайний текст, зображений тут, на лівому,
ви запускаєте його через якийсь алгоритм або процедура шифрування -
Може бути, це просто стає B, B стає з -
і тоді ви в кінцевому підсумку з зашифрованого тексту.
Тим часом, як тільки ваш розчавити отримує цю таємницю, зверніть увагу,
Він або вона повинен розшифрувати його, як правило заднім ходом, що алгоритм
таким чином, щоб повернути звичайний текст.
Є фізичні втілення цього.
>> Наприклад, це колечко декодер секрет,
і це кільце в тому сенсі, що є два набори тут.
На зовнішній периферії цією річчю, тобто букви від А до Z,
хоча вони у випадковому порядку,
і з внутрішньої сторони, там насправді деякі цифри
такі, що з цим кільцем Ви можете включити вигляд зовні, але не всередині
для того, щоб вибудувати номери з літерами.
З фільму під назвою Різдвяна історія, ви побачите, що мало Ральфі
так не терпілося з'ясувати, що секретне повідомлення Little Orphan Annie була для нього
що було повідомлено, я думаю, у вигляді числових повідомлення на коробки від пластівців
і потрібно було зібрати всі маленькі карти, які прийшли в зернових вікна,
Ви повинні були відправити їм поштою, ви повинні були повернутися таємницю кільця декодер
так що ви можете, нарешті, з'ясувати, що відображення між буквами і цифрами
або букв і букв.
Як в комп'ютері ми можемо йти про реалізацію або представляють такі речі?
Нам потрібно знайти спосіб виразити себе трохи більш гнучко
ніж наші змінні досі дозволив.
У нас були цілими, у нас були символи, які ми мали поплавці й двомісні і деякі інші,
але ці окремі частини пам'яті, яка насправді не дозволяють виразити речі
як слова і пропозиції і фрази.
У самому справі, ми називали такі рядки речі,
але ми обіцяємо, що це дійсно просто спрощення CS50 бібліотеки
що ми маємо намір відігніть.
І так, давайте почнемо робити це тут.
Дозвольте мені йти вперед і відкривати файл -
Всі ці файли доступні, як зазвичай, онлайн - звані array.c
вирішити проблему, не пов'язаних з рядками, але це малює картину тут
про те, як ми могли б використовувати те, що називається масивом.
>> Масив являє собою тип даних.
Це тип змінної роду, який має дещо менші типи даних усередині нього
спиною до спини, щоб спина до спини.
Так, наприклад, якщо ми хочемо написати невелику програму, яка дає вам ваш тест середнього
на курс, як 50, яка має 2 вікторини,
Ви можете дуже легко написати цю програму, засновану навіть на деяких з матеріалу минулого тижня
за допомогою GetInt і кілька змінних: Int quiz1, внутр quiz2.
І це досить просто.
Це може бути 10, 20 рядків коду, максимальна реалізація програми
, Який просить користувача протягом 2 балів вікторини і потім обчислює їх середнє
, Складаючи їх разом, ділячи на 2, а потім друку результатів.
Ми могли б зробити це досить легко зараз, після деякої кількості хвилин.
Але проблема в тому, що припустимо, що 50 було 3 або 4 вікторини.
Припустимо, що ви хотіли використовувати ту ж програму для класу, який був щотижневі вікторини.
Подумайте про клас, який щотижневі вікторини.
Якщо є 16 або так тижнів в семестр, тепер у вас є 16 змінних:
quiz1 Int, Int quiz2, внутр quiz3, внутр quiz4.
Як тільки ви починаєте бачити цю надмірність, це скопіювати і вставити код,
він повинен почати робити ви хочете там було краще.
І на щастя, тому що масиви є. Так давайте зробимо це.
По-перше, дозвольте мені представити дуже просту річ, що ми не використали досі,
але ви побачите, що іноді в коді.
>> Це те, що зазвичай називається постійною.
Так що це постійна в тому сенсі, що це значення ніколи не змінюється.
Людські конвенції при створенні постійної
є використання всіх заголовних букв просто так, що він дійсно виділяється в коді,
і спеціальні ключові слова, які ви використовуєте в С # визначити.
Тому ми говоримо, # визначити, то простір, то слово, яке ви хочете використовувати для назви константи
, А потім значення константи.
Зверніть увагу, що це відрізняється від присвоєння щось змінна.
Там немає знаку рівності, немає коми.
Це те, що відомо як директива препроцесора,
але про це іншим разом.
На даний момент, це створює незмінне значення, зване вікторини
, Фактичне числове значення 2.
Таким чином, скрізь, де є тести, вікторини, тести на протязі всього цього файлу,
от тільки номер 2.
Якщо я дивлюся на основні Тепер, давайте подивимося, як це працює.
Спочатку це виглядає трохи загадково, але це все речі з тижня 1.
Запитайте у користувача класах. Як ми це робимо?
У рядку 22 - це дійсно соковиті частини - я заявляю, поплавок
але не тільки одним поплавком. Я оголосивши, швидше, масив значень з плаваючою точкою.
Це змінна буде називатися класах, як це мається на увазі тут,
але тільки частина нового синтаксису, то ці квадратні дужки.
Той факт, що я сказав поплавок класах, а потім відкрити дужку, а потім номер -
помітить, якщо це постійна це так само, як ми зробили це -
це означає: "Ей, комп'ютер, дайте мені 2 поплавця і давайте колективно називають їх оцінки."
>> Це на відміну від набагато більш трудомісткий процес таким чином: поплавець Grade1;
grade2 плавати, і так далі.
Таким чином, масив дозволяє нам реалізувати цю ідею, але набагато менш неохайно,
таким чином, що ми можемо написати 1 рядок коду, а не, скажімо, 16 на 16-тижневий семестр.
Я не хочу, щоб закодувати 2, тому що, якщо ви думаєте про це тепер логічно,
Припустимо, у наступному році CS50 змін до 3 вікторини замість
і у мене був номер 2 тут, у мене був номер 2 тут,
У мене був номер 2 тут, номер 2 тут.
Вона стає дуже виснажливим і дуже легко зіпсувати
і випадково змінити значення 1 до 3 і пропустити деякі інші значення 2.
Так що я збираюся замість абстрактного це відстань і використати цю константу, яка,
як припускає його назву, ніколи не змінюється.
І тепер незалежно від того, чи є у нас різні вікторини цьому або наступному році,
Я просто змінити його в одному місці, тут на вершині.
Так що всі константи.
Тим часом, нова концептуальна особливість полягає в тому масиву.
Таким чином, у квадратних дужках дати мені це багато плаває і дозволяє мені колективно називають їх класах тут.
Отже, тепер давайте подивимося, що я збираюся робити.
Тут, у рядку 24 є початком циклу.
>> Це дійсно нічого особливого. Це тільки за допомогою вікторин, а не жорстко числа.
Але немає нічого інтелектуально різних там з минулого тижня.
Це просто Printf, тому Е ("Вікторина #% сут% D:")
тому що я просто хочу, щоб роздрукувати дати мені вікторини № 1 з 2, а потім 2 із 2.
Так що це чисто естетична річ.
Але найцікавіше зараз знаходиться в рядку 27.
Для того, щоб заповнити одну з двох заповнювачів з плаваючою точкою,
Ви знову використовувати квадратні дужки.
У цьому випадку, я використовую я, тому що це цикл почався з я, яке значення рівне, мабуть?
[Студент] 0. >> [Малан] 0.
Таким чином, на першій ітерації цього циклу, це як якби я написав це в коді,
але на другий ітерації цього циклу, це як якби я написав це в своєму коді.
Але те, що я використовую змінну чудово, тому що, як випливає з назви,
це зміна його значення на кожній ітерації,
так що я заповнення цього масиву одному місці за один раз.
Що це масив виглядає?
Тому я звернув супер простий прямокутник на екрані тут раніше була для цього причина.
Масив це просто шматок пам'яті послідував ще один шматок пам'яті
пішов ще один шматок пам'яті і так далі.
Так що, якщо мій масив розміром 2 в цьому випадку тут, все, що я буду робити
, Ввівши в моєї оцінки вікторини подобається тут, - я отримав 100 на один, а потім я отримав 99 на цьому -
Потім ця пам'ять не може навіть бути використаний, тому що я тільки запитав комп'ютера
для масиву розміром 2.
Ці квадрати все ще там, чи не так?
У вас ще є 2 гігабайти оперативної пам'яті, навіть якщо ви тільки просять 2 поплавка.
Таким чином, ідея масивів є те, що комп'ютер просто бере шматок пам'яті
, А потім розподіляє дрібні шматки спина до спини, щоб спина до спини.
І це все, що масив.
>> Це безперервний шматок пам'яті, всередині якої ви можете покласти речі.
Це відбувається, щоб потім зробити лише кілька нудно арифметика.
Якщо я прокрутіть вниз тут, це де я тоді ітерації по масиву.
Я придумав підсумовування всіх значень у масиві,
а потім використовувати круглий функцію тут насправді робити сума ділиться на вікторини.
Але дозвольте мені махнути рукою на що як свого роду досить арифметичних зараз.
Але все, що робить для мене, в кінцевому рахунку, обчислення середнього.
Отже, спочатку тест, плюс другий тест ділиться на 2, а потім роздрукувати його, як Int.
Але давайте тепер перехід до іншої приклад називається string1,
який малює аналогічну картину, але з використанням рядків.
Дозвольте мені йти вперед і спростити цей на мить.
Вибачте відступ на даний момент.
Зверніть увагу на лінію 19 з цього прикладу, я отримую рядок від користувача.
Але зверніть увагу на те, що я роблю в наступному ліній 22 і далі.
Насправді я ітерація від Я до - і це новий трюк - StrLen, довжина рядка.
Це функція, яка поставляється з C, що якщо ви передаєте його рядки,
він говорить вам, скільки символів в цьому рядку. Ось і все.
А те, що це StrLen замість того, щоб довжина рядка просто тому, що це більш коротким.
Тридцять років тому, людям подобалося писати речі, як лаконічно наскільки це можливо,
тому ми зберегли цю конвенцію тут.
я + + означає лише те збільшуємо я в кожній ітерації.
А тепер помічаю це, що дійсно цікаво.
У рядку 24, я кажу: "Комп'ютер, дай мені характером, 8 біт, і називаємо його з".
Але що це на правій стороні говорите?
В англійській мові, що це уявляєте?
[Студент] Перший символ в масиві.
Саме так. Дайте мені перший символ в масиві.
Або, в більш загальному, дай мені-й символ в масиві.
І розумію, що це важливо зараз, як комп'ютерні науки,
ми насправді починаючи з 0.
>> Ви не повинні розсуд зараз, щоб почати це робити.
Тепер ви повинні вести себе відповідно до очікувань комп'ютер і вважати від 0
тому що [0] буде перший символ в рядку,
[1] буде другий, [2] буде третім, і так далі.
Таким чином, ця програма, якщо я скомпілювати його, це знову string1, так що string1,
і тепер я зіткнувся string1 в моєму вікні терміналу.
Він очікує введення, так що я збираюся ввести Давида, Enter
і тепер вона друкує Девід все на різних лініях, тому що повідомлення, що я роблю.
Я друк одного символу за один раз.
Ми не будемо вдаватися в подробиці сьогодні на цьому, але я видалив цю хвилину тому тут галочку.
Виявляється, що якщо користувач неправильно, змагальності, або просто плутають,
Ви можете фактично не дають рядки деякої довжини.
Якщо ви натиснете не ту клавішу на клавіатурі, ви можете не дають рядок на всіх,
або якщо ви злий, ви можете спробувати, щоб вставити у вартість гігабайта про есе
щоб заповнити цей рядок, і якщо комп'ютер працює з пам'яті,
Виявляється, що ми збираємося повернути це спеціальне значення, зване NULL.
Таким чином, на даний момент, просто знаю, що є це спеціальне значення, зване NULL
, Що дозволить нам перевірити, коли ми з пам'яті, між іншим.
Але якщо я відкриваю зараз string2, зверніть увагу на одна відмінність тут.
Зверніть увагу на одна відмінність тут з string2.
З string2, цей цикл трохи відрізняється.
>> Дозвольте мені видалити нулі, так що ми можемо говорити про тих, хто в інший раз.
Чим відрізняється цикл на цей раз?
Я можу повернутися до попереднього прикладу.
Так от версія 2, це версія 1. 1, 2.
1, 2.
StrLen виклик де?
Це в першій частині циклу.
Будь-які думки про те, чому я це роблю? Так.
[Студент] Таким чином, ви не викликаєте функцію кожного разу.
[Малан] Таким чином, ми не викликаємо функцію кожного разу. Саме так.
Нагадаємо, з петлями на те, що вони супер просто
Як тільки ви начебто розумію, що це ініціалізація, умова і оновлення.
Проблема в тому, що умова відбувається на кожній ітерації циклу.
І тому в даному прикладі, що таке погано про те, що це мій стан?
[Студент] Ви телефонуєте StrLen.
[Малан] Ви телефонуєте StrLen знову і знову, і знову.
Але як тільки я набрав у Девіда, довжина цього рядка дорівнює 5,
і він не збирається змінювати на кожній ітерації
тому що рядок як і раніше D - V-я-д.
Так що це натяк на те, що збирається ставати все більш важливою ідеєю
відомий як дизайнерське рішення, де тільки не роблять комп'ютер робити непотрібну роботу.
>> Так само, як попередній перегляд pset2, pset2 в стандартному виданні
збирається кинути вам виклик насправді реалізації деякого числа шифрів,
деяка кількість алгоритмів шифрування, так що ви можете не тільки зашифрувати
і дешифрування секретних повідомлень так само, як однієї Ральфі там декодувати.
У хакером видання pset2, ми збираємося піти трохи далі.
Ми збираємося передати вам файл з фактичними комп'ютерної системи
, Який містить цілу купу імен та фактичної зашифровані паролі,
і завдання для хакера видання буде зламувати ці паролі
і з'ясувати, що криптографія і таємні, що був використаний для створення Насправді ці паролі.
І ми збираємося зробити це за допомогою нової функції тут C
що я дам вам тільки демо відомий як аргументи командного рядка.
Виявляється, як деякі з вас, можливо, бачили в розділі або в підручниках,
Основним не завжди повинна бути порожнеча в дужках.
Виявляється, що основна можна також записати як це, з двома аргументами,
ARGC і ARGV, де ARGC число слів
що ви вводите після назви програми на вашому командного рядка
і ARGV є фактичним слів.
І, як квадратні дужки там пропонують, ARGV мабуть масиву.
Це збирається бути рядком після рядка після рядка в пам'яті.
>> Так що ми збираємося бути в змозі зробити, починаючи з PSET 2, щось на зразок цього.
Якщо я роблю argv1, який є прикладом ми повернемося до в понеділок, і запустити його,
зауважити, що це не схоже, щоб зробити що-небудь ще.
Він просто виводить своє ім'я.
Але якщо я прощаюся класу, зверніть увагу, що ця програма мабуть ітерації
над кожним зі слів, які були надруковані в командному рядку.
І засоби, за допомогою яких ми зможемо отримати доступ до слів, які користувач ввів у командному рядку
є зміна основною відправною цей уїк-енд від Int основних (недійсними) на Int основних (агдс, ARGV)
і, отже, народиться аргументи командного рядка.
І як тільки ви отримаєте дійсно складна в цьому, ви зможете написати дійсно тріп програм
таких, як цей ось, який йде вище і поза
деякі функції, які ми зробили до сих пір, але все досить потужний.
>> Таким чином, ми залишимо це з цим на екрані, і ми будемо бачити Вас в понеділок.
>> [CS50.TV]