[Powered by Google Translate] David J. Малан: Все правильно.
Це CS50, і це в кінці другого тижня.
Якщо ви плануєте бути голодним навколо цього завтра час, знають, що ми збираємося
провести як невеликою групою завтра, четвер, 1:15 PM.
Там є URL тут, якщо ви хочете, щоб RSVP.
Місця обмежені, так що вибачте, якщо форма заповнена до того часу ви
заповнити цю анкету.
Інший URL, хоча це може бути цікаво це.
>> Так що майже протягом місяця, курс буде доступна
Все більш широко через EDX, через які люди в інтернеті буде
можливість стежити разом, брати участь у процесі досить активно, насправді.
Вони буду використовувати CS50 і CS50 Appliance Обговорити і більшість
різні програмні засоби, які ми вже використали в цьому семестрі.
І одна з ініціатив, які ми хотіли б взяти в якості експерименту в цьому році
, Щоб побачити, як багато змісту, який ми можемо перевести в інші говорять і
письмових мов.
Так що, якщо ви могли б мати зацікавленість в участі в цьому проекті, в результаті чого
ми надамо англійською стенограми і субтитри для курсу
Лекції та шорти та семінарів, секцій тощо -
якщо ви вільно говорити і писати вільно на іншій мові, ми б
любите займатися ви в цьому проекті, в якому ви взяти на себе одну або кілька
Відео, переводячи їх на мову, ви знаєте досить добре.
Щоб дати вам уявлення про інтерфейсі, там даному веб-інтерфейс
, Які ми будемо використовувати, що створить істотно користувальницького інтерфейсу, як це.
Це було мені викладанні деяких Хеллоуїн назад.
А на правій стороні там в чорному поруч з цими мітками часу,
Ви побачите різні речі, які вийшли з моїх уст в той день.
І тоді під ним, ви зможете перекласти іншою мовою.
Саме те, що відображення між ними, в даному випадку, англійської
і, скажімо, іспанської мови.
Так що це насправді дуже зручний інструмент.
Ви можете перемотування назад і вперед дуже легко за допомогою сполучень клавіш.
Так що, якщо ви хочете взяти участь в цьому експерименті, і ваші слова
бачив і читав, потенційно тисячі людей там, будь ласка відчувають
безкоштовну участь.
>> Тепер кілька слів про кошеня з понеділка, щоб ми відправили надмірно
страшно повідомленні.
Розумію, що як офісні годинники запропонувати і як розділи припустити,
Дизайн, звичайно, дуже багато зробити, щоб студенти співпрацюють і
кажуть, щоб працювати через проблеми множин і проблеми разом.
І дійсно лінії просто зводиться до, знову ж таки, робота, яку ви в кінцевому підсумку
повинні представити повинно бути вашої власної.
І так буде, чесно кажучи - в робочий час, це абсолютно нормально -
це повністю і слід було очікувати, навіть - побалакати з деякими
друзі поруч з Вами.
Якщо він чи вона бореться з деякою темі, і ви, як: ой, ну нехай
мені дати вам поглянути на деякі рядки коду, який я написав.
Це нормально.
Це буває.
І це дуже сприятливий, я думаю, з процесом навчання.
Там, де лінія, знову ж таки, отримує перейшли, коли голова нахилена роду більш
тут занадто багато секунд або хвилин, які дійсно мати тільки
була можливість розблокування для вашого друга.
І, звичайно, коли все стає обмін електронною поштою і Dropbox і
як, там теж є лінії.
Таким чином, всі кошти, відчувати себе комфортно і відчувати рекомендується спілкуватися з друзями
і однокласникам про psets і багато іншого.
І так само, розумію, що те, що ви в кінцевому підсумку уявити, повинні бути дійсно
продукт вашої творчості, а не хтось інший.
>> Так, в тому ж ключі з приємні істоти, ви можете
знаю цього хлопця тут.
Так що це жахливо паскудної фільм з років тому.
Хто тут бачив Космічні яйця?
Добре.
Так що хороший номер тут.
Таким чином, це наші чудові академічні спосіб введення Сьогодні в кінцевому рахунку,
Поняття криптографії.
І тому одним з області конкретних завдань для PSET 2, який прийде
пізно вночі завтра, поринути у світ криптографії, яка
це мистецтво шифрування або скремблювання інформації.
І це в кінцевому підсумку пов'язане зі світом безпеки.
>> Тепер безпеку для більшості нас приходить у вигляді досить мирської механізмів.
У всіх нас є імена користувачів і паролі.
І у всіх нас є дуже погані імена користувачів і паролі, швидше за все.
Якщо ваш пароль так само на декількох веб-сайтах, що, ймовірно, не
краща ідея, так як ми обговоримо ближче до кінця семестру.
Якщо ваш пароль записується на записки - не жарт - на
моніторі, то це теж не обов'язково кращий дизайн, але досить поширене
явищу.
І якщо ви не використовуєте криптографію для шифрування паролів, вони
Особливо вразливі.
Так що якщо ви думаєте, що бути супер розумний, маючи приховані слова
документ десь на вашому жорсткому диску, який має всі ваші паролі, але
він знаходиться в папці, що ніхто не збирається заглянути, що теж не дуже
безпечний механізм.
І те, що PSET 2 буде ввести це мистецтво криптографії та
скремблювання інформації, так що такі речі, як паролі
Тим більш безпечним.
Таким чином, щоб мотивувати це дуже реальні проблеми з дуже не в реальному світі
Сценарій, дозвольте мені познайомити вас з одним з наших улюблених кліпів ось з цього
Фільм, Космічні яйця.
>> [ВІДТВОРЕННЯ ВІДЕО]
-Шолом, ви лиходій, що відбувається?
Що ви робите з моєю дочкою?
-Дозвольте мені представити блискучий молодий пластичний хірург, д-р Філіп
Schlotkin, найбільшим людиною носа у всьому
Всесвіт і Беверлі-Хіллз.
-Ваше Високість.
Ніс роботу?
Не розумію.
Вона вже була носа.
Це був солодкий 16 цього.
-Ні, це не те, що ви думаєте.
Це набагато, набагато гірше.
Якщо ви не дасте мені поєднанні з щитом повітря, д-р Schlotkin буде
дати вашої дочки назад її старий ніс.
-Ні!
Де ти це взяв?
-Все в порядку.
Я розповім.
-Ні, тато, немає.
Ви не повинні.
-Ти права, моя дорога.
Я буду сумувати за вашим новим носом.
Але я не буду говорити їм комбінації ні на що.
-Дуже добре.
Доктор Schlotkin, справа ваша.
-З задоволенням.
-Ні!
Зачекайте, зачекайте.
Я розповім.
-Я знав, що він буде працювати.
Добре, дайте його мені.
-Поєднання є одним.
-One.
-Два.
Три
-Три.
Чотири.
П'ять
-П'ять.
-Таким чином, комбінація один, два, три, чотири, п'ять.
Це найдурніше поєднання я коли-небудь чув у своєму житті.
Це така річ, ідіот буде мати на своєму багажі.
-Дякую вам, ваша високість.
-Що ти зробив?
-Я вимкнув стіну.
-Ні, ти цього не зробив.
Ви вимкнули весь фільм.
-Мабуть, я натиснув не на ту кнопку.
-Ну, поклав його назад.
Покласти фільм назад.
-Так, сер.
Так, сер.
-Ходімо, Ерна.
Ну, Гретхен.
Звичайно, ви знаєте, я все одно доведеться виставити рахунок за це.
-Ну, це спрацювало?
Де ворота?
-Це спрацювало, сер.
Ми маємо комбінацію.
-Дуже добре.
Тепер ми можемо взяти кожен останній ковток свіжого повітря з планети Druidia.
Яка комбінація?
-Один, два, три, чотири, п'ять.
-Один, два, три, чотири, п'ять?
-Так.
-Це дивно.
У мене та ж комбінація на мій багаж.
Підготовка Spaceball 1 для негайного від'їзду.
-Так, сер.
-І змінити комбінацію на мій багаж.
-Ой!
[END ВІДТВОРЕННЯ ВІДЕО]
>> David J. Малан: дивовижний фільм, який ви повинні тепер всі бачать.
Таким чином, контекст тут є те, що з небезпечною дані надходять можливість
зашифрувати його і, щоб засекретити його.
І ось цей, наприклад, є прикладом зашифроване повідомлення.
Це насправді щось говорить англійською мовою.
Але це явно не цілком очевидна.
І ми пройшли повне коло сьогодні, щоб дратувати один від одного, що це секрет
повідомлення тут.
Але в реальному світі комп'ютерів, речі, навіть не схоже, що вони можуть
бути англійські фрази.
Наприклад, це те, що ви можете знайти на стандартній Linux або Mac або
Unix комп'ютері в файл, який був колись називали файлу паролів.
В даний час, це були переміщені в інші місця.
Але якщо ви подивитеся в потрібному місці в системі, ви побачите не тільки ваші
Ім'я користувача або інших людей в системі, але ви побачите,
зашифровану версію пароля.
Дійсно, слово склеп там припускає, що наступні речі в зашифрованому вигляді.
І цей ряд, здавалося б, випадкових літер та символів і цифр
т.д. можуть бути розшифровані тільки в цілому знаючи деякі таємниці -
секретне слово, секретний номер.
І дійсно, мистецтво криптографії в кінцевому рахунку, зводиться до того, довіряю деяких
роду і, знаючи те, що хтось не робить.
Ми розглянемо це в трохи більш докладно сьогодні і в PSET в майбутньому.
>> А тепер кілька слів про Pass / Fail.
Таким чином, зокрема, як деякі з вас пірнув у PSET 1, пристрій і
Дуже новий світ для себе, зрозумів, що розчарування і
плутанину і просто технічних труднощів слід очікувати.
Особливо з першим PSET, де є так багато всього нового, просто отримую
знайомий з Ls і компакт-диск, і всі ці таємні команди в нових умовах.
І це окремо від фактичного матеріалу та програмування себе.
Так розумію і те, що є, звичайно, робочі години, які існують як
Підтримка структури.
Розділи почати в найближчу неділю.
Але найголовніше, якщо ви відчуваєте себе просто, що це не
світ для тебе, розумієш, що це дійсно просто потрібен час.
І якби не ця можливість років тому для мене взяти клас
придатний / не придатний, якщо чесно, я ніколи б навіть ступити в класі.
І ви можете змінити це до, скажімо, п'ятий понеділок курс.
Так що якщо ви на краю тепер, розумієш, що замість голови в деяких інших
вод в цілому, не тільки, звичайно, розглянути зміни в залік / незалік.
Знову ж таки, це не зовсім цю культуру тут, в Гарварді приймати речі
придатний / не придатний, так як все насправді хоче досягти або overachieve.
Але, відверто кажучи, це прекрасний спосіб спробувати щось, що, можливо, не
бути вам знайомі.
І ви будете в кінцевому підсумку роблять в більшості випадків досить добре, може бути,
багато до вашого подив.
І більш конкретно, то, що я думаю, що придатний / не придатний взагалі робить,
Особливо, як ви, можливо, випробували з PSET 0, якщо ви розмістили
В 10 годин, 15 годин, 25 годин в деяких PSET - і ви просто стукати
головою об стіну,
і вона стає супер пізно вночі,
але ви зробили PSET як 90% шляху,
Ви знаєте, ви просто не можете зрозуміти одну річ -
придатний / не придатний дійсно знімає гостроту класу, як це, де ви можете сортувати
з радісно сказав добре, я знаю, що це не ідеально.
Але я працював свою дупу на цей рахунок.
Я дуже задоволений, де все це закінчилося.
І це буде відповідати очікуванням для годен / не придатний.
Так що майте це на увазі.
>> Добре.
Так що ті з вас, хто намагався використовувати Гарвардського університету Wi-Fi знати
що є CS50 SSID, Wi-Fi з'єднання плаваючі навколо, що ви
можливо, пощастить більше для.
Це трохи парадоксально, що пароль для цього - якщо ви хотіли б спробувати
підключення до цього для кращої швидкості і дайте нам знати, якщо це не краще -
один, два, три, чотири, п'ять, аж до восьми, тому що вісім є
більш безпечним, ніж п'ять років.
Так що якщо вам потрібен Wi-Fi пароль, підключитися до бездротового CS50 тут.
Один, два, три, чотири, п'ять, шість, сім, вісім.
І повідомленням CS50 Обговорити якщо ви досі періодично виникаючих проблем підключення,
і ми дамо повноваження, які будуть знати цей простір.
>> Добре.
Так швидко тизер, особливо для тих з вас, хто вентилятора хлопчиків або дівчаток
всіх Яблуко речі.
Те, що я викопав з кілька років тому був цей файл тут, ilock.c, просто щоб
вид зробити більш конкретними і більш складні деяких з більш фундаментальних C
програми ми писали.
Так я відкрив цей файл, ilock.c.
Він доступний на сторінці лекції на сьогоднішній день.
З лівого боку, ви побачите довгий список функцій.
Таким чином, чоловік, який написав це написав багато функцій,
більше, ніж просто основний.
Він використовував цілу купу бібліотек тут.
І якщо ми почнемо прокрутки, що це насправді є дуже
По-перше, я вважаю, русифікатор для оригінального iPhone.
Коли б Ви хотіли зробити джейлбрейк оригінальний iPhone, а це значить неприв'язаних джейлбрейк
від AT & T і фактично встановити спеціальне програмне забезпечення на ньому і робити речі
, Що Яблуко не хочу, щоб люди роблять -
Ну, хтось знайшов час, щоб з'ясувати, як саме вони можуть використовувати
програмні помилки, помилки, помилки, програмного забезпечення Apple.
І таким чином народилася ilock.c.
От якби він був скомпільований на комп'ютері і встановити його на iPhone, що
був підключений до комп'ютера за допомогою, скажімо, кабель USB, це дасть вам
адміністративні або привілеї на вашому iPhone і дозволяє зробити дуже багато,
що ви хочете.
>> І ось там був цей захоплюючий кішки-мишки між Apple, і
решти світу, зокрема, так як вони, як і багато компаній, намагаються заблокувати
свої речі вниз, так що ви можете робити з ним, що вони мають намір.
Але завдяки таким людям, як це і свого розуміння низького рівня
деталі і, в даному випадку, C програмування і багато знайомих конструкцій
що ми почали грати, ви зможете по-справжньому важелі
апаратного таким чином, ви вважаєте за потрібне, і не обов'язково деяким юридичною особою.
Так, наприклад, я поняття не маю, що все це роблять.
Але GetVersion звучить досить просто.
І, схоже, це функція, що ця людина написала.
Візьми свого роду ціле в якості аргументу, нічого не повертає, але
здається, петлі з циклу тут і, якщо умова, якщо умова,
розірвати, і якось відноситься до номера версії.
Якщо ми прокрутити вниз -
хоча багато з цих ключових слів буде нова, і є
багато функцій тут ми ніколи не бачили і не могли б коли-небудь побачити більше
семестру -
Зрештою, це слід тим же правилам і логіці, що ми були
грати з досі.
Так що це занадто старий, щоб зламати ваш iPhone або 3s 4s 5s або незабаром, у наші дні,
але знаю, що все це дуже отримані з цього світу, який ми
пірнув.
>> Отже, давайте поглянемо на декілька більш простий приклад.
Це одна, просто щоб зігрітися з деякими синтаксису, а також деякі інші дані
Тип, що ми говорили, але дійсно не бачив в С. Таким чином, це
Файл називається positive1.c.
І в коментарях на вершині, це просто вимагає, щоб користувач надавав
позитивне число.
Так що це приклад зроби той час як цикл, який хороший для користувачів інтерактивного
програм, де ви повинні сказати користувачеві, щоб щось зробити.
І якщо вони не співпрацюють, ви кричати на них або відхилити їх введення.
Справа в точку, я збираюся зробити лінії від 19 до 24 так довго, як користувач
не дав мені позитивне число.
Тепер ця деталь тут, на лінії 18, чому я заявляю, п вище всього цього
цикл конструкція, на відміну від прямо поруч з лінією 22, де я
насправді піклуються, щоб отримати п?
Так?
[Нерозбірливо]
>> David J. Малан: Так, так що це питання з області видимості.
І в термін непрофесіонала, що робить область відноситься?
Так?
[Нерозбірливо]
David J. Малан: Чи можете ви говорити голосніше?
Виступаючий 1: Де можна отримати доступ до конкретної змінної.
David J. Малан: Perfect.
Де Ви можете отримати доступ до конкретної змінної.
І взагалі, правило досі було, що сфера застосування деяких
Змінна визначається самою останньою фігурні дужки, що ви бачили.
І тому в даному випадку, якщо я зробив помилку, оголосивши п на лінії 22,
, Що лінія буде працювати.
Я хотів би отримати ціле число, і я б поставив його в цій змінній п у рядку 22.
Але які рядки коду, тепер поняття не маю, про що я кажу?
Таким чином, 25, і виявляється, що 24, а також, тому що в цьому випадку він виходить за межі
у фігурні дужки.
Так що просто трохи неприємність, але дуже легко вирішується просто оголосивши
змінну за межами самої функції.
>> Зараз ми побачимо пізніше сьогодні, ви можете зробити ще один крок.
І ви можете навіть отримати трохи лінивий -
і це не рекомендується, загалом -
але ви можете навіть отримати ледачого і покласти змінну в глобальному масштабі, так би мовити, не
всередині функції, а не всередині циклу, але в самому файлі, поза
всіх функцій ви написали, як я зробив тут, на лінії 15.
Але це, як правило, з несхваленням.
Але розумію, що це рішення іноді до інших проблем, як ми
в кінцевому рахунку бачити.
Таким чином, на даний момент, ми залишимо це так.
Але давайте подивимося, якщо ми можемо переписати це тільки початок виразити себе
трохи по-іншому.
>> Таким чином, ця програма, просто щоб бути ясно, є positive1.
Дозвольте мені йти вперед тут і в моєму вікні терміналу зробити positive1, Enter.
Компіляція, добре.
Я збираюся запустити positive1, натисніть Enter.
Я вимагаю, щоб ви дати мені ціле позитивне число.
Я скажу -1.
Це не працює.
0, 99, що, здається, працює.
Може бути, не найсуворіший тест.
Але принаймні це гарна перевірка осудності, що ми знаходимося на правильному шляху.
Так що тепер дозвольте мені йти вперед і відкрити другий варіант цього.
І чим відрізняється вже?
Він реалізує те ж саме.
Але те, що стрибає, як чітко в цей раз?
Так, так це BOOL в зелений колір.
Gedit був виділений зеленим кольором це ключове слово відоме як логічний,
, Який є типом даних.
Вона не приходить побудований в для всіх версій C. Необхідно включити
конкретної бібліотеки.
У нашому випадку, я включив CS50 бібліотеки, так що ми
мати доступ до BOOL.
Але в рядку 18, ми, здається, є логічне значення тут називають вдячні.
Так що я міг би назвати це нічого.
Але я назвав це вдячна просто вид передають смислове значення.
Таким чином, спочатку на лінії 18, я, мабуть, не вдячний, тому що
Логічне значення вдячні ініціалізується помилковим у рядку 18.
І тоді здається, що я зробив тут в рядках з 21 по 23 це я тільки що
вид переписати мою логіку.
Так що не функціонально різні.
Але в рядку 22 зараз, я можу перевірити, якщо Int користувач надав більше
0, то я просто змінити значення вдячні правда.
А навіщо мені це робити?
Тому що в рядку 25, мабуть, я збираюся перевірити стан.
У цього циклу в той час як вдячний є хибним.
>> Так що я пропоную це в якості альтернативи версію, тому що вона, принаймні
трохи більше інтуїтивно, може бути.
Це трохи більш обгрунтованою на англійській мові.
Таким чином, виконайте такі дії, поки ви не вдячні або при вдячні є хибним.
І на цей раз я теж, мабуть, не люблю згадувати те, що користувач набрав
У повідомленні, тому що немає змінної п.
Таким чином, на самом деле, я -
маленька біла брехня там.
Функціонально програма трохи відрізняється, як тільки ми отримаємо на дно
це тому що я не пам'ятав, що п.
Але я хотів показати тут, що, хоча ми бачили і GetInt
GetString використовується на праву сторону знаку рівності досі, так що
Ми пам'ятаємо значення, технічно, це не строго обов'язково.
Якщо з якихось причин ви просто не піклуються, щоб зберегти значення, ви просто хочете
для перевірки значення, помітили, що ми можемо просто написати це як GetInt відкритим
хлопець, поруч хлопець.
Ця функція буде повертати значення, як ми вже говорили.
Це буде повернути вам Int.
І тому, якщо ви подумки думаю, що це станеться, коли я друкую в 99, GetInt
повертає число 99.
І так концептуально, це як би мій код був насправді цього.
Так, якщо 99 дійсно більше 0, то вдячний стає істинним.
Тоді лінія 25 реалізує ох, ми зробили, бо я тепер вдячна.
А в рядку 26, ми просто говоримо, спасибі за натуральне, якою б вона
трапилося бути.
>> Тепер давайте зробимо невеликий синтаксичний цукор тут, так би мовити.
Давайте подивимося, якщо ми можемо прибирати цю лінію 25 з цієї третьої й останньої дисперсії
У positive3.
Так помітити тією лише різницею, що тепер рядки коду?
Так, так 25.
І ми дійсно не бачив цей трюк тільки поки.
Але ми бачили знак оклику в понеділок, який означає, що?
Так ні, або заперечення.
Так що беріть логічне значення і перевернути його значення.
Правда, стає помилковим.
Помилкові стає істинним.
Так що це, я хотів би запропонувати, навіть трохи більш інтуїтивним способом
написання коду, тому що я до сих пір вдячний ініціалізації помилковим.
Я все ще роблю таке.
Я поставив вдячні вірно, коли прийде час.
Але тепер ви дійсно можете просто перевести цей код усно зліва направо,
хоча і не вдячні.
Через вибух, або знак оклику, позначає поняття немає, так що поки
Не вдячні.
>> Отже, ще раз, ми не введені нові поняття як такого.
Ми говорили про логічних тому, коли ми грали з нуля.
Але розумію, тепер ми можемо просто почати писати наш код у
по-різному.
Таким чином, особливо в pset1, якщо ви начебто намагається з'ясувати спосіб
написати програму, напевно вам пощастило, тому що це буде будь-яка
ряд рішень, які ви можете випадково зустріти.
Наприклад, це всього лише три навіть для найпростіших програм.
Добре.
А тепер згадаємо в понеділок, ми вийшли на цю записку з поверненням значення.
Так, в перший раз, ми написали програму, яка не просто головною,
вона також має свою власну функцію, яку я написав тут.
Таким чином, у відповідності з 31 по 34, я реалізував функцію куб.
Це не комплекс.
Це всього лише разу в раз, і в цьому випадку.
Але, що важливо про нього, що я беру входу в формі і
Я повертаюся вихід у формі разу в раз.
>> Так що тепер у мене є можливість, так само, як я раніше з Printf один, дзвонити
цю функцію, викликавши функцію куб.
І куб функція приймає деякі вхід.
І куб функція повертає кілька вихідних.
І навпаки, Printf просто щось зробив.
Вона не повертає нічого, що ми дбали про - хоча, як
в сторону, вона повертає значення.
Ви просто взагалі ігнорують його.
Printf просто щось зробив.
Це був побічний ефект друку на екрані.
На відміну від тут, у нас є куб функції, які
насправді повертає щось.
>> Так що це взагалі -
для тих, хто знайомий з цим, це досить проста ідея.
Але для тих, хто менш знайомий з цією ідеєю проходять в входи і отримання
назад виходів, давайте спробуємо просто щось супер просто.
Хто-небудь зручні підійшовши на етапі коротко?
Ви повинні бути знайомі з камерою на вас, як добре.
Так.
Добре, що вас звуть?
KEN: Кен.
David J. Малан: Кен.
Гаразд, Кен.
Піднімайся.
Так що Кен буде функція виду тут.
І давайте йти вперед і робити це.
Давайте трохи фантазії.
Дуже приємно.
Ласкаво просимо в центрі сцени.
Добре.
Давайте хіт цієї кнопки тут.
Добре.
Так що тут у вас є сучасний дошці.
І те, що я є основною функцією, наприклад.
І я не маю IPad в руках.
Я дійсно не пам'ятаю, як - ну, насправді, не можу сказати.
Я дійсно не мають гарний почерк.
І тому я хочу, щоб ви щось надрукувати на екрані для мене.
>> Так що я будучи основної програми.
І я хочу, щоб ти сказав це, написавши його в моїй курячої нуля і
Потім повз вас вхід.
Так само безглуздо, хоча це вправа, поняття функцій і виклику
Функція та повернення функцією дійсно зводиться до цього.
Я на-Майні.
Я тільки що написав Е ("щось") на екрані.
Я біжу цієї програми.
І як тільки Printf викликається, вона приймає один аргумент - або один параметр,
іноді -
в подвійні лапки.
Ось це аргумент.
Я передаю його Кен.
Тепер він є чорним ящиком написав деяку кількість років тому, по-видимому
знає тільки як друкувати речі на екрані.
>> Таким чином, виконання.
Це не погано.
Так, дуже добре.
Так що тепер Кен робиться виконання.
Йому потрібно, щоб передати мені нічого взамін?
Таким чином, не те, що ми бачили досі.
Знову ж таки, Printf Чи насправді повертає число.
Але ми збираємося ігнорувати, що на даний момент, тому що ми ніколи не використовували його.
Так ось воно що для Кена.
І ось тепер основні повертається виконати -
Основними бере на себе управління програмою знову, тому що рядки коду,
Printf, здійснюється виконання.
І ми йдемо про наш шлях виконання будь-яких інших ліній є.
>> Добре.
Отже, тепер давайте спробуємо трохи інший приклад.
І на цей раз тут, давайте спочатку очистити екран тут.
І на цей раз ми будемо робити виміри кубатури функції.
Але на цей раз, я думаю, вихідне значення.
Так що давайте йти вперед і робити це.
Так що тепер у мене є рядок коду, яка говорить, х = куба (х).
Так що насправді let's -
рядок коду, нагадаємо, виглядає наступним чином.
х = куба (х).
Так як це буде працювати?
Так що давайте йти вперед і дати вам білий екран.
І я збираюся писати тепер до значення х, які в даний момент
Час трапляється, скажімо, 2, зберегти його простим.
Так що я записав на папірці значення 2,
, Який є моїм значення х.
Я передаю його Кен.
KEN: А я просто пишу відповідь?
David J. Малан: Так, давайте просто написати відповідь.
Добре.
І тепер він повинен повернути мені що-небудь.
Так що -
досконалою.
Приємно перехід.
>> Так що тепер він простягає мені назад значення 8, у даному випадку.
І що мені робити з ним?
Ну, насправді, давайте подивимося.
Отримати це право.
Що я буду з нею робити?
Тепер я збираюся взяти це значення і насправді зберігати його в тих
ті ж біти в пам'яті.
Але зауважте, я трохи борються тут.
Я трохи збентежений, бо де я насправді писати значення х?
Тому що я тільки що зробив фізично руку Кен папері
, Які мали значення 2, яке було х.
І дійсно, це саме те, що відбувається.
Ось і виходить, що при виклику функції, і ви передаєте в якості аргументу
як "привіт світ" або ви передаєте в якості аргументу, як 2, як правило, ви
проходить в копії цього аргументу.
І так само, як я записав номер 2 тут і передав його Кена, які повинні
означає, що в мене ще є копія значення 2 десь.
Бо дійсно, тепер, коли я отримав назад значення 8, мені потрібно, щоб повернутися в
RAM і фактично записати 8, де я колись був номер 2.
>> Таким чином, візуально пам'ятаю це поняття проходить в буквальному
копію значення.
Кен робить свою справу, простягає мені у відповідь щось - в даному випадку,
значення, як 8.
А то у мене щось зробити з цим значенням, якщо я
хочете зберегти його навколо.
Так що все це буде дуже добре знайомі незабаром.
Спасибі вам велике за це демо тут, Кен.
Добре.
Дуже добре зроблено.
Отже, давайте подивимося, як це в кінцевому підсумку пов'язане з деякими з функцій
виклику, що ми робимо тут.
Отже, дозвольте мені йти вперед і повернути нас до вимірювання кубатури приклад.
І зверніть увагу, що якщо ми дійсно хочемо почати приймати це далі, ми збираємося
мати, щоб пам'ятати про те, що число х який передається в
тут відрізняється від того, що насправді передається в функцію.
Отже, ще раз, це прийнятий копія стане зовсім
доречні в одну хвилину.
>> Отже, давайте поглянемо на те, що не зовсім правильно працювати ще.
Я збираюся йти вперед і відкрити третій приклад помилки, яка
недосконала за своєю природою.
І це називається buggy3, і реалізує заміни.
Таким чином, тут ми маємо основні функції, які х і у довільно ініціалізується
1 і 2, відповідно.
Ми могли б використовувати GetInt, але нам просто потрібно проста вправа.
Таким чином, це жорстко, як 1 і 2.
У рядках 21 і 22, ми, мабуть, роздрукуйте х і у, по одному на рядок.
Потім у рядку 23, я стверджую, я обмін цими значеннями, крапка, крапка, крапка.
Я мабуть виклику функції в рядку 24 називається своп
, Яка приймає два аргументи.
Це абсолютно законно для функції приймають два аргументи.
Ми бачили Printf це зробити вже.
Таким чином, своп-видимому, має х і у.
І, як припускає його назва, я сподіваюся, що це буде
поміняти ці два значення.
Тоді я претендувати на лінії 25, помінялися місцями.
І я передрукувати х і у в припущенні, що
вони дійсно були поміняні місцями.
Але якщо я дійсно запустити цю програму -
Дозвольте мені відкрити вікно терміналу.
Дозвольте мені зробити buggy3.
Як випливає з назви, це не скінчиться добре.
Тому що, коли я вдарив Enter, зауважив, що х 1.
у-2.
І все ж в кінці програми, вони все ще, по суті, те ж саме.
>> Таким чином, на основі демонстрації тільки зараз з Кеном, те, що відбувається насправді?
Ну, давайте зануритися в цю своп функції.
Це супер короткі.
Це всього лише кілька рядків коду довго.
Але те, що фундаментальні проблеми на основі просту історію розповів
тут з Кеном?
Чому підкачки не працює?
[Нерозбірливо]
Саме так.
Таким чином, ми зберіганні на копію, а не саму змінну.
Іншими словами, своп-видимому, має два аргументи, Int.
І це умовно назвати і б.
І тут, я пройшла по х і у, які є відповідно 1 і 2.
Але я не в буквальному сенсі проходить в х.
Я не буквально проходить в рік.
Я передаю копії х і копію у.
Це все одно, майже як якби ви скопіювали і вставили в поміняйте значення,
Ви хочете, щоб насправді маніпулювати.
Так що, якщо це так, коли я, програму, розпочати виконання
рядок 35, то 36 -
коли я добираюся до лінії 37, на даний момент в цій історії, що значення?
У цей момент в історії, рядок 37, що є значення в цій точці?
Так воно і повинно бути просто 1.
Вірно?
Оскільки х був прийнятий в якості першого аргументу.
І ця функція просто довільно називає свій перший аргумент,.
Точно так само це у, другий аргумент.
І це просто довільно виклик другого б аргумент.
>> Тепер ця дихотомія насправді досить просто пояснити.
Подумайте про це.
Ніхто з нас не зустрічав людину, яка написала Printf.
Так що, звичайно, він або вона не знає, що наші змінні через 30 років збираються
називається.
Так що має бути різниця між, що ви називаєте змінні в
Функції ви пишете і що ви називаєте змінні у функціях ви
зателефонувавши або використання.
Отже, іншими словами, я написав мої змінних х і у.
Але якщо хтось інший написав своп функції, він або вона, звичайно,
не знаю, що моє змінних буде називатися.
Так розумію, що це, чому у вас є ця двоїстість імен.
Технічно я міг зробити це випадково.
Але вони все одно передається в якості копії.
Було б просто чистий збіг естетично, якщо це чоловік, який написав
підкачки використовували ті ж імена.
>> Добре.
Таким чином, на даний момент в цій історії, рядок 37, 1.
Ь 2.
А тепер я переходжу до поміняти їх місцями.
Ну, по-перше, дозвольте мені насправді зробити це набагато простіше.
Я не знаю, що ці три рядки коду робили.
Дозвольте мені зробити це.
б отримує.
отримує б.
Готово.
Чому це зламаний, логічно?
Це свого роду інтуїтивні речі, чи не так?
Таким чином, стає б.
І б стає.
Але проблема в тому, що як тільки рядку 37 виконується, те, що
Значення і б?
Те ж саме, 1.
Тому що ви відразу, так би мовити, ви змінили б рівним.
Тому, як тільки лінія 37 виконана, це здорово.
Тепер у вас є дві копії номером 1 всередині цієї функції.
Отже, коли ви говорите в рядку 38, б отримує, ну, ти ніби на болтах.
Тому що ви просто присвоєння 1 до 1.
Ти начебто втратив значення, яке ви дбали про.
>> Таким чином, в оригінальну версію цієї, зверніть увагу, що я зробив.
Замість цього я була третя рядок коду, яка виглядала наступним чином.
Я заявляю, тимчасова змінна - TMP є дуже поширеним назвою
для тимчасових змінних.
Це Int тому що він повинен відповідати тому, що я хочу зробити копію.
Я зберігаю копії всередині TMP. Тому, як тільки лінія 37 була виконана,
Значення це -
швидка перевірка справності -
1.
Значення Ь 2.
І цінність TMP також 1.
Так що тепер я виконаю лінії 38.
Тому, як тільки лінія 38 виконується, приймає значення б.
І В 2.
Таким чином, в даний час 2.
Таким чином, на даний момент в цій історії, дорівнює 2, б = 2,
і TMP 1.
Так що тепер логічно, ми можемо значення просто грюкнути TMP в в б.
І ми зробили.
>> Отже, ми вирішили цю проблему.
На жаль, коли я запускаю цю програму в такому вигляді, це насправді не поміняти
будь-які значення.
Але щоб бути зрозумілим, чому?
Я встановив логічні задачі з усього хвилину тому.
Але знову ж, якщо я запускаю цю програму, х і у, залишаються незмінними до кінця
програми виконання.
[Нерозбірливо]
David J. Малан: Таким чином, ми не повернули нічого.
Так що це правда.
Але, виявляється, є невелика проблема тут, тому що до цих пір,
Єдине, що ми змогли повернути це одне.
І це обмеження C. Ви можете повернути тільки дійсно одне значення,
У цьому випадку, я трохи застряг тут
тому що я міг повернути нове значення х, або я міг би повернутися
Нове значення у.
Але я хочу, і назад.
Таким чином, повернення не просте рішення тут.
Але проблема в корені чому?
Що ми насправді помінялися місцями?
а і б.
Але і б є копіями х і у, яка означає, що ми тільки що зробили все це
працювати - ми тільки що провели, як три хвилини говорити про своп
функцію, і всі три з цих змінних.
І це чудово, абсолютно правильно в ізоляції.
Але і сфери B, тільки в цих рядках тут.
Так як цикл, якщо ви оголосите ціле я всередину для
петлю - так само, якщо ви оголошенні і б всередині функції, що
Ви написали, що вони дійсні тільки всередині цієї функції.
Це означає, як тільки своп зробити виконання, і ми йдемо від лінії 24 до
рядок 25, х і у не змінилося.
Ви просто даремно багато часу, обмін копіями змінних.
>> Ось і виходить, що рішення це насправді, не очевидно.
Це не цілком достатньо, щоб повертати значення, тому що ми можемо
повертати тільки одне значення.
І я дійсно хочу, щоб обміняти х і у в той же час.
Так що ми збираємося повернутися до цього.
Але зараз розумію, що питання принципово пов'язане з тим,
що А і В є копіями.
А вони в свою сферу.
Ну, давайте спробуємо вирішити це в деякому роді.
Дозвольте мені насправді прокрутити назад тут і відкрити, скажімо, четвертий варіант
це, buggy4.
А що з цього приводу?
Це схожі, але більш просту задачу, щоб дивитися на, перш ніж прийняти удар на
її вирішення.
Ця програма називається приростом.
І він, очевидно, ініціалізує ціле число х 1 у рядку 18.
Я тоді стверджувати, х 1.
Я тоді претензії прирощення, крапка, крапка, крапка.
Потім я викликаю приріст.
Але тоді в рядках 22 і 23, я стверджую, що це було збільшується.
Я стверджую х зараз би це не було, 2 імовірно.
>> Але ця програма глючить.
У чому проблема?
Так?
[Нерозбірливо]
David J. Малан: Абсолютно вірно.
Таким х була оголошена явно в рядку 18.
Тобто в фігурних дужках основного автора.
Таким чином, проста відповідь у тому, що, ну, х існує тут.
Вона не існує в рядку 32.
Таким чином, ця програма насправді навіть не буде компілюватися.
Компілятора, коли я намагаюся компіляції цього коду, буде кричати на мене
Про деякі неоголошений ідентифікатор або щось в цьому роді.
У самому справі, давайте спробуємо.
Це робить buggy4.
Там вона є.
Використання неоголошених х ідентифікатор в рядку 32.
А насправді, давайте будемо більш чітко тут сьогодні, так що це корисно
робочий час і вдома.
Зверніть увагу, що це трохи загадково написано.
Але те, що Clang має кричав на нас, сказавши:
buggy4.c: 32:5, насправді корисно.
Це означає, що помилка в рядку 32 на позицію символу п'ять.
Таким чином, один, два, три, чотири, п'ять.
Це, справді, де проблема.
А також мати на увазі, в робочий час і вдома, мені пощастило тут.
У мене є одна помилка.
Це збирається бути відносно легко виправити.
Але якщо ви отримаєте весь екран повний переважна повідомлення про помилки, знову ж таки,
розуміють, що самий нижній можна просто бути симптомом
самий верхній з них.
Так завжди ганятися за ваші помилки зверху вниз.
Тому що там може бути просто ланцюжком ефект, пропоную вам
є набагато більше проблем, ніж ви насправді.
>> Отже, як ми можемо це виправити, якщо моєю метою є, щоб збільшити х?
Що це?
Добре.
Таким чином, ми можемо зробити глобальне х.
Давайте ярлик, який я попереджав раніше.
Але чорт візьми, нам просто потрібно швидко виправити.
Так що давайте просто скажемо, Int х тут.
Це робить х глобальної.
Так що тепер основним має до нього доступ.
І приріст має до нього доступ.
І тому дозвольте мені йти далі і зібрати це зараз.
Зробити buggy4, Enter.
Здається, для компіляції зараз.
Давайте запустимо buggy4, і здається, насправді працює.
Тепер це одна з цих речей -
Роби, як я кажу, а не як я роблю, як я тільки що зробив тут.
Тому що в цілому наші програми збираються отримати набагато більш цікавим і
набагато довше, ніж це.
І якщо ваше рішення життєвих проблем є просто ах, покласти все
змінних в початок файлу, дуже швидко роблять програми отримати
жахливо важко керувати.
Це стає все важче вигадувати нові імена змінних.
Це стає все важче зрозуміти, що змінна робить.
>> А так в загальному, це не дуже гарне рішення.
Так давайте зробимо це краще.
Ми не хочемо використовувати глобальну змінну тут.
Я хочу, щоб збільшити х.
Так що я міг би, очевидно -
Зрештою, це свого роду дурні історії, тому що ми просто робимо це.
Але якби я не знав про те, що оператор, або я не дозволили
змінити його в основний собі, як ще я міг здійснювати Кен тут, це
Час не куба, але для збільшення?
Як змінити цю річ тут?
Так.
[Нерозбірливо]
David J. Малан: Гаразд, добре.
Так чому б мені не пройти в X?
І тоді, а не повертати його, чому б мені не зробити повернення х + 1?
Тепер, кілька речей повинні змінити тут.
Я перебуваю на правильному шляху.
Що ще потрібно налаштувати?
Хтось інший.
Так?
[Нерозбірливо]
David J. Малан: Мені потрібно змінити тип повернення збільшення
тому що це не анулювати.
Порожнеча означає, що нічого не повертається.
Але, очевидно, тепер він є.
Так що потрібно змінити в ціле, щоб бути послідовним з тим, що
Я насправді повернення.
>> Зараз щось ще, як і раніше баггі тут.
Так?
[Нерозбірливо]
David J. Малан: Так що мені потрібно збільшувати х?
[Нерозбірливо]
David J. Малан: Ах, так що мені потрібно пройти х.
Так що мені потрібно зробити це тут.
Таким чином, прототип, я повинен змінити це тут.
Таким чином, це має стати Int.
Це повинно стати -
хм.
Я насправді є помилка тут.
Давайте виправимо це в першу чергу.
Що це насправді бути?
Так що це має бути щось Int.
Це може бути х.
Але, відверто кажучи, якщо ви починаєте закликаючи всіх ваших змінних х, він збирається отримати
все менш і менш ясно, що є що.
Так що давайте просто довільно вибрати різні іменування для мого
допоміжні функції, функції я пишу.
Ми будемо називати його.
Або ми могли б назвати його - давайте назвемо це even_number бути ще більш явною.
І тоді я повинен повернути все, що номер плюс 1.
А тепер я повинен змінити одну річ тут і одне
Інша річ, яку тут.
Що я повинен змінити в рядку 21 в першу чергу?
Я повинен призначити його на х.
Тому я не можу просто зателефонувати прирощення х.
Мені потрібно пам'ятати відповідь на зміну значення х на
з лівого боку.
І хоча х зараз знаходиться на лівій і правій, це абсолютно нормально, тому що
права частина запускається на виконання першого потім отримує гепнувся в ліву
руки річ, х в цьому випадку.
І тоді, нарешті, це легко виправити зараз.
Це повинно просто відповідати тому, що це внизу.
Int номер.
>> Добре.
Таким чином, цілий букет змін дійсно нерозумно функції.
Але представник речей, які ми більше хочемо зробити.
Так що buggy4.
Я десь напартачили.
О, мій Бог.
П'ять помилок у, начебто, шість рядки.
Так що ж трапилося на лінії 18, символ 5?
Добре.
Так що я повинен заявити про це Int.
Добре.
Отже, давайте подивимося, ціла купа інших помилок.
О, мій бог.
19, 18, 21.
Але, знову ж таки, давайте просто очистити екран -
Управління L тут - і повторні Clang.
Таким чином, п'ять проблем насправді тільки це.
Отже, тепер давайте запустимо buggy4, Enter.
Ось так.
х був збільшений правильно.
>> Добре.
Будь-які питання про те, як збільшити число?
Так?
SPEAKER 2: Чому це, що ви можете просто змінити X на номер в змінну
ім'я, і ​​він буде знати, що ви маєте на увазі?
David J. Малан: Хороше питання.
Як це, що я можу просто змінити х на номер і програма буде знати,
відразу?
Отже, ще раз, думати про нього, як це абстракція.
Так що, якщо я головний і Кен додаткових, чесно кажучи, мені все одно
що Кен називає свою Ipad.
Мене не хвилює, що він називає все, що має відношення до його здійснення
з цієї функції.
Так що це деталь реалізації, що я, головне, не
повинні піклуватися про.
І так просто змінивши його послідовно всередині функції, кількість тут
і номер тут, це все, що займає так багато часу, як я перекомпілювати.
Це ніби як якщо ви думаєте про - багато хто з нас, тих, у кого водія
Ліцензії хто їздив, або якщо ви навіть в'їхав в автомобіль -
Більшість з нас не знають, як машина працює під капотом.
І буквально, якщо ви відкриваєте капот, більшість з нас - я в тому числі -
не збирається знаю, що ми дивимося.
Ніби як ви можете відчувати себе в такі речі, як це прямо зараз.
Але ми дійсно не маємо дбати, як машина працює.
Ми не повинні піклуватися, що всі стержні і поршнів і кабелів усередині
машина насправді робить.
>> Так щось подібне, що ви називаєте поршень не має значення
Тут в цьому випадку.
Та ж сама ідея.
Так?
[Нерозбірливо]
David J. Малан: Якби було більше використанні змінного моменту ха назад,
Ви, програміст, доведеться міняти їх всюди.
Або ви могли б зробити буквально файлів, меню, а потім Знайти / Замінити,
щось на зразок цього.
Але ви будете мати, щоб зробити ці зміни самостійно.
Ви повинні бути послідовні.
[Нерозбірливо]
David J. Малан: визначеному порядку, як тут?
Якби це було Int інший номер?
Так.
Таким чином, порядок має значення, коли ви викликаєте функцію.
Так що якщо я дзвонили приріст тут щось в цьому коми,
є пряме відображення.
Перша змінна, як там це називається, зроблена копія першої
Аргумент тут.
На жаль, цього не повинно бути круглих дужках.
Другий аргумент лінії з другим.
>> Так порядку, так, питань.
Добре.
Вибачте, що я взяв довгий шлях, щоб дістатися там.
Інші питання?
Добре.
Отже, давайте подивимося, якщо ми не можемо намалювати картину того, що відбувається насправді
Тут під капотом, так би мовити.
Так що це прямокутник, який може представляти пам'яті комп'ютера.
Так що навіть якщо ви не знаєте, як працює пам'ять або як RAM роботи, принаймні,
Припустимо, що у вас є пучки вона в ці дні.
У вас є мегабайти його.
У вас є гігабайти його.
І ми знаємо, від тижня нулю, що байт саме те, що?
8 біт.
Право, таким чином, 8 нулів і одиниць.
Отже, якщо ваш комп'ютер має гігабайт оперативної пам'яті, два гігабайти оперативної пам'яті в ці дні, у вас є
млрд. або 2 млрд. байт пам'яті, або приблизно 8 млрд., або 16 млрд
бітів, всередині комп'ютера.
Тепер, на відміну від маленьких Woolly наприклад Віллі, це не магнітні частинки
Зазвичай більше.
Все частіше в ноутбуках принаймні, це твердотільні накопичувачі SSD, що
просто не мають рухомих частин.
Це всі електронні.
Це все електрику основі.
Так що думаю, хоча, це просто прямокутник, як представляють одну або дві
гігабайтами пам'яті, яка у вас є.
>> Так що це шматок пам'яті.
Зараз у світі комп'ютерних наук має вигляд відгороджена шматки
пам'яті, щоб зробити різні речі.
Так, наприклад, якщо це оперативної пам'яті комп'ютера - як це було запропоновано
Прямокутник там - Виходить, що за угодою, у верхній частині вашої пам'яті, тому
говорити, як правило, те, що називається текстовий сегмент.
Ті нулів і одиниць, що ви зібрали.
Тому, коли ми дивилися під капотом на те, що a.out є всі
нулів і одиниць -
При запуску програми, ці нулі і одиниці завантажується з жорсткого
диск в те, що називається оперативної пам'яті.
І в пам'яті, вони містяться у верхній частині.
Тепер Тим часом, у вас є інші речі.
Ініціалізований даних, неініціалізованих даних.
Ці два валки пам'яті, звертайтеся до глобальні змінні, які
ви не часто використовуєте.
Але іноді, якщо ви це зробите, вони в кінцевому підсумку там також.
Тоді є деякі інші речі.
Змінні середовища, які ми не будемо витрачати багато часу на.
Але потім дві важливі речі, які будуть повертатися протягом усього цього
семестру, стека і купи.
>> Тому більшість з пам'яті комп'ютера зберігається при запуску програми
те, що називається стеком і те, що називається купою.
І ми не збираємося говорити про купу сьогодні, але ми будемо
говорити про стек.
І стека призначена викликати в уяві візуальні подібних їдальнею
їду в лотках Mather будинок, або там, де ви будете, де
Персонал їдальнею чистити їх кожен день.
Вони складаються їх від підлоги вгору.
І точно так само в пам'яті, є така ідея поставити щось на
стек, поставивши щось на стеку, покласти щось у стеці.
І що ж ми маємо на увазі під цим?
Ну, давайте збільшити тільки на нижню половину цієї картини, вашого комп'ютера
RAM, запропонувати наступне.
Виявляється, що коли ви запускаєте програму, як a.out або привіт, незалежно від
Програма є те, що ви написали,
Знову ж таки, ті нулів і одиниць завантажується з жорсткого диска - який є
тривалого зберігання, залишається там, навіть коли ви вилку -
завантажуються в оперативну пам'ять.
RAM швидше, ніж жорсткі диски.
Це менше, ніж жорсткі диски.
Але це там, де програми жити, поки ви працюєте них.
>> Таким чином, ви двічі клацніть програму на Mac або ПК - вона завантажується з
жорсткого диска в оперативну пам'ять.
Як тільки він буде завантажений в оперативну пам'ять, нулів і одиниць піти на те, як зверху,
так званий текстовий сегмент.
Але тоді, як тільки ваша програма фактично починає працювати, основна
Функція називається.
А головне, як ми бачили, часто має локальні змінні.
І вона має цілих і рядків і символів тощо.
Так що якщо ваші програми, які ви написали або програми, які у вас є
подвійному клацанні використовувати деякі змінні усередині основного, вони в кінцевому підсумку на
нижній частині стека пам'яті, так би мовити.
Тепер більш конкретно, що ж це насправді означає?
Це просто означає, що якщо ми будемо нумерувати речі -
якщо ми збираємося число байт оперативної пам'яті на комп'ютері, відмітили, що
це може бути нульовим байтом числа.
Це може бути байтом номер один, два, три, чотири, п'ять, шість, усі
аж до подобається -
2 млрд буде всю дорогу там на самому верху.
Отже, іншими словами, коли ми говоримо про оперативну пам'ять або пам'яті в байтах, він
просто означає, що хтось вирішив, що номер кожного з
ці шматки пам'яті.
>> Тому, коли вам потрібно 32 біта для Int, або вам потрібно 8 біт на символ, де
вони в кінцевому підсумку в пам'яті?
Ну концептуально, вони просто в кінцевому підсумку в нижній частині цього
те, що називається стек.
Але що цікаво тепер, коли основні викликає функцію.
Нехай функція називається Фу, просто довільне ім'я.
Що відбувається, є основним знаходиться в нижній частині цього стека пам'яті.
Foo тепер поміщається у верхній частині головного в пам'яті.
Таким чином, будь-які локальні змінні, Foo була в кінцевому підсумку роду концептуально вище
ті, в основному.
Якщо Foo викликає іншу функцію під назвою бару, ці змінні в кінцевому підсумку тут.
Якщо барі називає щось ще, тут, тут, тут.
Так що ж цікавого про запуск програми є те, що ви називаєте функцій,
і як ці функції викликати функції, а також функції, які викликають функції,
Ви створюєте цей стек функцій в пам'яті.
І тільки один раз функція повертає ви почнете одержувати цю пам'ять назад.
Таким чином, одним з найпростіших способів запустити з пам'яті в комп'ютері програми є
написати функції, які ніколи не повернуться.
>> Так, наприклад, давайте продемонструвати, як багато з
навмисне помилки програми.
Дозвольте мені йти вперед і робити # включити , Int основних (недійсними).
І я збираюся робити, а (2> 1), який, імовірно, ніколи не буде
зміниться на нас.
І дозвольте мені тепер іти вперед і робити Printf.
Насправді, це буде менш візуально цікавим.
Давайте зробимо це.
Для Int (я = 0; I> 0).
Давайте зробимо цю помилку, я + +.
І давайте не Printf тут.
Давайте практикувати те, що я проповідував.
Давайте метод тут.
Порожнеча хор, і ми будемо говорити Int я.
А потім я збираюся сказати, Printf -
ой, давайте зробимо це більш цікаво.
Давайте насправді не друкує взагалі нічого.
Давайте просто це зробити.
Хор (I).
>> Добре.
Так що це баггі, бо навіщо?
Я придумую, як я йду, тому що програма не робить нічого
інтерес.
Але це не мета.
Мета полягає в тому, щоб написати програму, основною функцією якого робить те, що, мабуть?
Зателефонуйте себе.
А насправді, ми не потребуємо петлю.
Давайте навіть спростити цей раз, щоб не втрачати з уваги насправді
фундаментальну помилку.
Головні виклики хором співати хором.
Тоді я зробив дурість, і я повинен був хор хор виклик, тому що я припускав,
хтось ще збирається реалізувати це можливо.
І тепер це не буде зібрати ще.
Мені потрібно зробити що?
Мені потрібно прототип, пам'ятаю.
Тому мені потрібно, щоб тут порожнеча хору (INT я);.
>> Так що тепер, якщо я йду сюди -
насправді, давайте використовувати великі вікна.
Давайте підемо далі і зробити хором.
Використання невідомі розігруючий я.
О, це було нерозумно.
Нам не потрібні аргументи.
Давайте просто це зробити.
Шкода, що ми розпочали цей шлях.
Було б набагато простіше написати програму.
Так і тут.
Тепер давайте перейдемо до моїх вікно терміналу, повторні Clang.
І тут ми йдемо.
Це було дійсно швидко.
Що насправді тільки що сталося, правда?
Ну, тепер я додам друку лінії, так що ми можемо бачити.
Отже, дозвольте мені сказати Printf, скажімо так, я тут.
Гаразд, не змінні, ми залишимо це так.
Дозвольте мені знову запустити зробити.
Дозвольте мені повтор приспіву.
І давай.
Продовжуйте.
Як осторонь, чому вона не зазнала краху?
Помилки сегментації відбулося супер швидкий раніше.
[Нерозбірливо]
David J. Малан: Абсолютно вірно.
Так що це займає час, щоб надрукувати.
Це займе більше роботи з боку комп'ютера.
І це так.
Сегментація вина.
>> Так помітите, як швидко запускати програми.
Якщо ви не друкує нічого, супер швидко.
Але ми все ж отримали цю помилку сегментації, тому що те, що відбувається?
Ну, якщо ви думаєте про те, як пам'ять комп'ютера викладено, це
буває основним.
Але тут -
Давайте просто називати цей хор, і назвемо цей хор.
І тепер, якщо я роблю свою естетику права, це як раз збирався сказати хором,
хор, хор, хор, хор, хор, хор, до нудоти.
І в кінці кінців, що ж буде далі?
Якщо картина буквально це те, що просто відбувається концептуально?
Стек перевитрата купи.
Або, того гірше, ви просто захоплені всі, включаючи текстовий сегмент, який є
нулів і одиниць, які представляють вашу програму.
Коротше кажучи, це просто супер, супер поганого.
Вірно?
Ваша програма вийшла з-під контролю.
Ви використовуєте спосіб більше пам'яті, ніж ви розраховували все через дурної
помилка, в цьому випадку.
Або в даному випадку, абсолютно свідомо зробили функцію, що називає себе.
Тепер це не так уже й погано.
Функції, які називають себе дійсно має велику силу
коли ви використовуєте його правильно.
Я не використовував його правильно тут.
>> Так що не все так погано.
Але те, що я ніколи не перестануть називати себе є фундаментальним
Слабкість тут цієї програми.
Так куди ми йдемо з усім цим?
Ну, а що відбувається насправді?
Коли я називаю приріст функції, як ми робили в тих прикладах,
У мене є значення, як 1, що я проходжу дюйма
Я проходжу в копію номер один.
Таким чином, відбувається наступне.
Так що давайте йти в крок приклад.
І цей хлопець прямо тут.
Отже, ось що насправді відбувається.
Коли я подзвонив приріст, і я проходжу по х, наочно те, що
відбувається тут, це -
якщо у мене є вартість 1 зберігається тут, і я насправді звуть приріст, який
тепер називається хор -
Так, кинувши мене тут.
Отже, давайте називати це прирощення.
І ми не знаємо, що це наступна функція збирається бути.
Так що ж насправді відбувається десь тут в основному, у мене є шматок
пам'яті, яка зберігає номер 1.
Коли я називаю приріст, я використовую іншу частину пам'яті, але тепер я
є копія 1.
Коли я збільшити це значення, це стає 2 - жахливо написаних на
Екран тут.
Але те, що відбувається, як тільки приріст прибутку?
Ця пам'ять просто отримує повернув до операційної системи, яка означає, що всі
Ви зробили нічого корисного.
Той, який був спочатку міститься в основній і раніше насправді.
>> Так куди ми йдемо з цим?
Ну, виходить, що в пам'яті у вас є ця спина до спини послідовність
байтів, які Ви можете покласти речі дюйма
І виходить, що ми вже бачили щось, що включає в себе поклавши
речей спина до спини, щоб спина до спини.
Що являє собою рядок, засновані на тиждень одну, то тижнів зо два?
Так що це просто набір символів.
Ось і виходить, як ви можете покласти номерів в пам'яті, так само ви можете
покласти символів у пам'яті.
І як тільки ми починаємо покласти символів у пам'яті спиною до спини, щоб повернутися до
назад, то виходить, що за допомогою найпростіших речах, як цикл або
час циклу, ми можемо повторювати -
зліва направо по символів в рядку -
і почати масажуючи їх у різні персонажі в цілому.
Може стати B. B може стати C. Так що в кінцевому підсумку, ми можемо взяти
Англійська пропозицію, яка дійсно має сенс і перетворює кожен з цих
літери по одній за раз, йдучи через нашу пам'ять комп'ютера залишається
Право насправді шифрування.
>> Отже, давайте зробимо наш п'ятихвилинну перерву тут, і коли ми повернемося, ми будемо
почати цей процес скремблювання інформації.
>> Добре.
Тому, перш ніж поринути в деяких крипто і ці речі називаються масивами, дозвольте мені
Пауза на будь-які питання, тому що я відчуваю, що я дійсно почасти заплутаною деякі з
ці теми.
Так що давайте зафіксуємо тепер, якщо ми можемо.
Таким чином, ми тільки що говорили про повернення цінностей.
Ми говорили про аргументів.
І ми говорили про це поняття, яке ми повернемося в найближчі тижні
прийшов, перегляду пам'яті цілу купу цих стеками
Лотки, так би мовити.
Знизу на вгору, так, що кожен лоток, який отримує покласти в стек являє
функція, яка в даний час називається.
Є питання?
Так як про - дайте мені спробувати поставити запитання.
Я все псує, але тепер it's - you've всі бачили обличчя хлопчика.
Таким чином, ми повернемося до цього.
>> Отже, дозвольте мені поставити запитання тут.
Дозвольте мені спростити це до того, що було до деяких з наших ранніх Q & A.
І той факт, що приріст має відкриту дужку, внутр номер, закритий
дужках.
Що Int числа представляють?
[Нерозбірливо]
David J. Малан: аргумент.
Добре, але що це аргумент?
[Нерозбірливо]
David J. Малан: Вибачте, що це таке?
Виступаючий 3: Щось ви передаєте дюйма
David J. Малан: Добре.
Таким чином, те, що ви передаєте дюйма
І взагалі, це просто вхід.
Якщо ви пишете функції та цілі, функції в житті, щоб зробити
щось трохи інакше кожен раз, коли ви використовуєте його, то єдиним способом для
Щоб це відбулося насправді, здавалося б надати йому вхід так, щоб вона
може зробити щось інше за допомогою цього вкладу кожного разу.
>> Таким чином, ви повинні визначити дві речі, коли функція приймає входи.
Ви повинні вказати ім'я, яке ви хочете дати, що вхід тільки для
вашої зручності, щоб ви могли посилатися на нього в функцію, яку
самі пишете, як я зробив тут, в рядку 32.
Але ви також повинні вказати його тип, тому що C є мовою програмування
що саме потрібно
що якщо ви хочете змінної, ви повинні повідомити комп'ютера, що
тип даних, це,
У більшій частині так, щоб він не знає, скільки біт
виділити для цієї змінної.
Тому що це може бути шість -
Вибачте, це не буде шість.
Це може бути 16.
Це може бути 8.
Це може бути 32, навіть 64.
Але комп'ютер повинен знати.
Тепер Int на ліву сторону представляє те, що, на відміну від?
[Нерозбірливо]
David J. Малан: Що це?
[Нерозбірливо]
David J. Малан: тип функції і, більш конкретно,
Тип продукції.
Право.
Таким чином, у той час як річ в дужках представляє свій вхід, якщо такі є,
річ, щоб ліва представляє свою продукцію.
І в цьому випадку, мабуть приріст повертає ціле.
І так Int є тип повертається цією функцією.
>> Що це значить повернути?
Буквально, ви використовуєте ключове слово повернення.
І потім, якщо те, що ви повертаєтеся в правому ключове слово
число, те, що дійсно відповідає тому, що ми обіцяли.
Ви не могли б зробити щось на зразок цього -
Привіт, світ -
тому що це рядок.
Очевидно, це не є цілим числом.
Коротше кажучи, тягар насправді на нас, програмістів, щоб бути конкретним, як
до того, що ми повертаємося, і тоді насправді йти про повернення його.
І тоді, щоб зробити трохи більш чіткі контексті -
Ось він знову.
Контексту -
Великим сюрпризом у найближчі одну хвилину.
Контекст тут, зараз, в тому, що пам'ять комп'ютера, знову ж таки,
гігабайт, два гігабайти, що завгодно.
Може бути, це інше.
Може бути, це менше.
Але комп'ютер розглядає її як мають різні розділи.
Щось іде туди.
Щось ще відбувається там.
Різні речі йде в середині.
І сьогодні, ми просто починаємо розповідаю цю історію.
>> Але ми повернемося до цього з часом.
В даний час, тільки шматок пам'яті ми дійсно дбаємо про те, текстовий сегмент
тому що тільки що представляє нулів і одиниць
Clang, що був сигнал.
Отже, коли ви запустите команду на клавіатурі, як a.out, або ви двічі
клацніть по значку на Mac OS або Windows, ваші програми завантажується з жорсткого
диска в оперативну пам'ять.
І вона шубовснула у верхній частині оперативної пам'яті комп'ютера, так би мовити.
Тепер Між тим, як ваша програма починає працювати і основні викликається в
Ви писали програми або програми Microsoft або Apple, пише, будь-якого з її
локальні змінні в кінцевому підсумку там на дні пам'яті комп'ютера.
Але якщо основна викликає іншу функцію, яка сама по собі має змінні або
аргументами, вони в кінцевому підсумку над ним.
І якщо ця функція викликає те, що вони в остаточному підсумку над ним,
над ним, над ним.
І тільки один раз в функції здійснюється виконання робить стопки лотків, так
говорити, починають отримувати все нижче і нижче.
І це те, що тоді, в двох словах, пояснює, чому, коли ви дзвоните куба -
або ви дзвоните приріст -
ви передаєте копію значення.
А що це означає, що наочно це те, що ви буквально написання
номер 1 в іншу частину пам'яті, яка змінюється від 1 до 2, у випадку
приріст -
або 8, в разі куба -
, А потім кидали, що пам'ять далеко, як тільки збільшення або кубі
Функція повертає.
>> Питання.
[Нерозбірливо]
David J. Малан: де - глобальні змінні зберігаються в те, що
в даний час називається инициализируются дані або неініціалізованих даних.
Різниця в тому, якщо у вас є глобальна змінна, і ви призначаєте його
відразу ж значення з знака рівності, вона закінчується на вершині.
А якщо просто сказати Int х коми без значення, це закінчується трохи
нижче в пам'яті просто конвенції.
Інші питання.
Добре.
>> Таким чином, ця картина буде повертатися, як ми отримаємо більш потужний з тим, що ми можемо зробити
з комп'ютером.
Але зараз, давайте короткий вступ в криптографію, специфічний тип
криптографії, що не вирішує всіх проблем у світі, але ніяк вирішити
деякі з них.
У цьому випадку тут, у нас є те, що називається секретним ключем шифрування.
І секрет криптографії ключ, як випливає з назви, відбувається її безпеки
від таємницею.
Так, наприклад, якщо ви ще в початковій школі, і ви передаєте
Маленький секрет любовний лист до хлопчику чи дівчинці ви дроблення на - якщо ви
хотів передати, що через аудиторією, ви, ймовірно, не буде писати
така записка на англійській мові або що ваша рідна мова, а, швидше, ви
може зашифрувати його.
Або ви можете просто відправити їм текстове повідомлення в ці дні.
Але ви могли б насправді передають їх до відома всьому класі.
І зробити це безпечно, так що ваші друзі і вчителі
Не знаю, що ви пишете, ви можете придумати досить простий
Алгоритм -
Молодий хоча ви могли б бути -
просто дертися слова.
Таким чином, замість того щоб писати, ви можете написати B. Замість B, ви можете написати
C. Замість C, ви можете написати D, і так далі.
Або ви могли б придумати більш складний переклад листів
різних букв.
Але заковика в тому, хлопчик чи дівчинка, яким ви відправляєте цю записку необхідно
щось знати.
Які це те, що, очевидно?
Як і те, що ваш секрет.
Мовляв, що це таке зіставлення Як і сніданок і Cs і Ds?
Це тільки додавши до нього один, так би мовити, до кожної з букв, щоб перейти від
А в B, B в C?
Це більш складний, ніж це?
Таким чином, ви і ваш розчавити потрібно, щоб у цій секретної інформації.
Але є свого роду виверти-22 тут.
Якщо це в перший раз ви відправляєте цю любов через листи
класу, як те, що хлопчик чи дівчинка буде знати, в чому секрет навіть є?
Так що секретний ключ шифрування не вирішує всіх проблем у світі.
І там насправді стосунки, які ми повернемося до до
семестру кінця.
>> Крім того, є жоден з нас, ймовірно, ніколи не послав -
Аналогічно, більшість з нас не знає, що хтось працює, наприклад, на
Amazon.com.
І тим не менш, багато хто з нас, напевно, купив матеріал на Amazon.com.
І нас вчили вважати, що ці електронної комерції
безпеку транзакцій.
Вірно?
URL, ймовірно, говорить HTTPS.
Там в, може бути, дурний маленький значок замку десь.
Там якась криптографії забезпечення вашої кредитної картки
між вами і Amazon.com.
І ще, якщо криптографія включає в себе знаючи деякі таємниці, і все ж я не
знаю нікого, на Амазонці, і я, звичайно, не влаштував будь
таємницю з кимось на Amazon, як мій комп'ютер або мій браузер це робить?
Що ж, виявляється, є інші види криптографії в цілому, які вирішують
цій проблемі.
Але на сьогоднішній день, ми зосередимося на простій, де ви можете влаштувати в
просування знати деякі таємниці, як плюс 1 або деяке відображення між Як і сніданок.
>> І процес криптографії звичайно включає в себе це.
У вас є звичайний текст, зображений тут, на лівому.
Ви запускаєте його через якийсь алгоритм або процедура
для шифрування.
Може бути, це просто стає B, B стає C. І тоді ви в кінцевому підсумку з
зашифрований текст.
Тим часом, як тільки ваш розчавити отримує таємні записки, він або вона повинні потім
розшифрувати його, як правило заднім ходом, що алгоритм так, щоб отримати
Резервне простий текст.
Тепер є фізичне втілення цього.
Наприклад, це маленький секрет кільця декодер.
І це кільце в тому сенсі, що є два набори тут.
На зовнішній периферії цією річчю, тобто букви від А до Z,
хоча вони у випадковому порядку.
І з внутрішньої сторони, там насправді деякі числа, такі, що з цієї
Кільце, ви можете включити вигляд зовні, але не всередині для того, щоб вишикуватися
Номери з буквами.
І в кліпі ви збираєтеся подивитися - деякі з яких ви, можливо, бачили 24/7
навколо різдвяного сезону з фільму під назвою Різдвяна історія.
Ви побачите, що мало Ральфі так не терпілося з'ясувати, що сирітка
Секретне повідомлення Енні була для нього, що було повідомлено, я думаю, в
вигляді цифрових повідомлень на серійний вікно.
І треба було акумулювати всі маленькі карти, які прийшли
в коробки від пластівців.
Потрібно було, щоб відправити їх сюди
Ви повинні були отримати назад таємницю кільця декодер, так що ви можете, нарешті, зрозуміти
, Що відображення між буквами і цифрами,
або букв і букв.
Таким чином, я даю вам цей короткий кліп з Різдвяна історія мотивувати PSET 2 і
наша дискусія, в момент, масивів.
Таким чином, тут ми маємо Ральфі.
>> [ВІДТВОРЕННЯ ВІДЕО]
-Да буде відомо всім і кожному, що Ральф Паркер справжнім призначений
член маленький коло сиріт Енні секретно і має право на всі
почесті і переваги, що відбуваються з ними.
-Підпис, Little Orphan Annie.
Контрассигнуются, П'єр Андре!
В чорнила!
Досягнення і переваги, вже у віці дев'яти років.
Давай, давай покінчимо з цим.
Мені не потрібні все таке інше про контрабандистів і піратів.
-Слухай завтра вночі для заключних пригод The ​​Black
Піратський корабель.
Тепер прийшов час для таємного повідомлення Енні для вас членами
Таємного Круга.
Пам'ятайте, що діти, тільки члени таємний гурток Енні може декодувати
Секрет Енні повідомленні.
Пам'ятайте, Енні залежить від вас.
Встановити контакти з B2.
Ось повідомлення.
12, 11 -
-Я в першому засіданні таємним.
-14, 11, 18, 16 -
-П'єр був у відмінній сьогодні голос.
Я можу сказати, що сьогодні повідомлення було дійсно важливо.
-3, 25.
Ось повідомлення від Annie себе.
Пам'ятайте, нікому не кажіть.
-90 Секунд через, я в єдину кімнату в будинку, де дев'ятирічний хлопчик
міг сидіти на самоті і декодування.
Ага, Б. Я пішов до іншого.
E. Перше слово буде.
S. Він йшов легше.
U.
-Ой, да ладно, Ральфі.
Я повинен йти.
-Я спущуся, штат Массачусетс.
-Ось здорово.
-T, О. Обов'язково.
Будьте впевнені, до чого?
Що Little Orphan Annie намагаюся сказати?
Будьте впевнені, до чого?
-Ральфі!
Ренді повинен йти.
Не могли б ви вийти?
-Все в порядку, мама.
Я зараз вийду.
-Я отримую ближче.
Напруга було жахливим.
Що це було?
Доля планети може повиснути на волосинці.
-Ральфі!
Ренді повинен піти.
-Я б одразу, з глузду з'їхати.
-Ну і справи, майже немає.
Мої пальці літали.
Мій розум був сталевий капкан.
Кожен пір вібрації.
Це було майже ясно.
Так, так, так, так.
-Будьте впевнені, щоб пити Ovaltine.
Ovaltine?
Вошивої комерційної?
Син сука.
[END ВІДТВОРЕННЯ ВІДЕО]
>> David J. Малан: Тобто у нас є криптографії.
Так як в комп'ютері, ми можемо йти про реалізацію або
представляють такі речі?
Що ж, нам потрібен спосіб виразити себе трохи більш гнучко, ніж
наші змінні досі дозволив.
У нас були цілі.
У нас були символи.
У нас були поплавці й двомісні та деякі інші.
Але ці окремі частини пам'яті, яка насправді не дозволяють нам
висловити речі, як слова і пропозиції і фрази.
У самому справі, ми називали такі рядки речі.
Але ми обіцяли, що це дійсно просто спрощення CS50
бібліотеки, які ми маємо намір відігніть.
>> І так, давайте почнемо робити це тут.
Дозвольте мені йти вперед і відкривати файл -
Всі ці файли доступні як звичайні онлайн -
називається array.c вирішити проблему не пов'язаних з рядка, але що малює
Картина тут про те, як ми могли б використовувати те, що називається масивом.
Масив являє собою тип даних.
Це тип змінної, свого роду, який має дещо менші типи даних
всередині нього спина до спини, щоб спина до спини.
Так, наприклад, якщо ми хочемо написати невелику програму, яка дає Вам
Тест середньому на курс, як 50, який має два вікторини, ви можете дуже легко
написати цю програму - на основі навіть на деяких з матеріалу минулого тижня -
за допомогою GetInt і кілька змінних.
Quiz1 Int, Int quiz2, і це досить просто.
Це може бути 10, 20 рядків коду, не більше, реалізувати програму, яка запитує
Користувач протягом двох балів вікторини і потім обчислює їх середнє, додавши їх
разом, розділивши на два, а потім друку результатів.
Ми могли б зробити це досить легко тепер, після
деяка кількість хвилин.
>> Але проблема в тому, що припустимо, що 50 було три чи чотири вікторини.
Припустимо, що ви хотіли використовувати ту ж програму для класу, який був
щотижневі вікторини.
Подумайте про клас, який щотижневі вікторини.
Якщо є зразок 16 або близько того тижнів в семестр, тепер у вас є 16 змінних -
quiz1 Int, Int quiz2, внутр quiz3, внутр quiz4.
Як тільки ви починаєте бачити цю надмірність, це копіювання і вставка
коду, він повинен почати робити ви хочете там було краще.
І на щастя, тому що масиви, є.
Так давайте зробимо це.
По-перше, дозвольте мені представити дуже просту річ, що ми не використали досі,
але ви побачите, що іноді в коді.
Це те, що зазвичай називається постійною.
Так що це постійна в тому сенсі, що це значення ніколи не змінюється.
Людські конвенції при створенні постійної полягає у використанні всіх капітальних
букви, просто так, що він дійсно виділяється в коді.
А спеціальні ключові слова, які ви використовуєте в С # визначити.
Так що, якщо ви говорите # визначити, то простір, то слово, яке ви хочете використовувати для
постійне назву, а потім значення константи.
Таким чином, повідомлення, це відрізняється від присвоєння щось змінна.
Там немає знаку рівності.
Там немає коми.
Це те, що відомо як директива препроцесора, але більше на
в інший раз.
>> На даний момент, це створює незмінне значення, зване вікторини, фактичні
числове значення 2.
Таким чином, скрізь, де є тести, вікторини, тести на протязі всього цього файлу, це
тільки номер 2.
Тепер, якщо я дивлюся на основні Тепер, давайте подивимося, як це працює.
По-перше, це виглядає трохи загадково.
Але це все речі з тижня один.
Запитайте у користувача класах.
Як ми це робимо?
Ну, а в рядку 22 -
це дійсно соковиті частини -
Я заявляю з плаваючою точкою, а не просто одним поплавком.
Я оголосивши, швидше, масив значень з плаваючою точкою.
Це змінна буде називатися класах, як це мається на увазі тут.
Але тільки частина нового синтаксису, то ці квадратні дужки, той факт,
що я сказав поплавок класах, а потім відкрити дужку, а потім число.
Зверніть увагу, якщо це постійно, це так само, як ми зробили це.
Це означає, агов комп'ютер, дайте мені два поплавця, і давайте колективно називають
їх оцінки.
Це на відміну від набагато більш трудомісткий процес, як це.
Поплавок Grade1, плавати grade2, і так далі.
Таким чином, масив дозволяє нам реалізувати цю ідею, але набагато менш неохайно, в
таким чином, що ми можемо написати один рядок коду, а не, скажімо, 16 на 16
тиждень семестру.
Так що я не хочу жорсткий код 2, тому що якщо ви думаєте про це зараз
логічно - припустимо, в наступному році CS50 змін до 3 вікторини замість цього.
І в мене був номер 2 тут.
У мене був номер 2 тут.
Вона стає дуже виснажливим і дуже легко зіпсувати і випадково змінити
одне значення на 3 і пропустити деякі інші значення 2.
Так що я збираюся замість абстрактного це відстань і використати цю константу, яка, як і її
назву, ніколи не змінюється.
І тепер, незалежно від того, чи будемо ми мати різні вікторини цьому або наступному році, я
просто змінити його в одному місці, тут на вершині.
>> Так що всі константи.
Тим часом, нова концептуальна особливість полягає в тому масиву.
Таким чином, у квадратних дужках дати мені це багато плаває і дозволяє мені колективно
називати їх класах тут.
Отже, тепер давайте подивимося, що я збираюся робити.
Тут, у рядку 24 є початком циклу.
Це дійсно нічого особливого.
Це тільки за допомогою тестів, а не жорстко числа.
Але немає нічого інтелектуально різних там з минулого тижня.
Це просто Printf.
Таким чином, Е ("тест номер% сут% D"), тому що я просто хочу, щоб роздрукувати дати мені вікторини
номер одного з двох, а потім два з двох.
Так що це чисто естетична річ.
Але найцікавіше зараз знаходиться в рядку 27.
Для того, щоб заповнити одну з двох заповнювачів з плаваючою точкою
значення, ви знову використовувати квадратні дужки.
У цьому випадку, я використовую я, тому що це цикл почався з рівною я
Яке значення, мабуть?
0.
>> Таким чином, на першій ітерації цього циклу, це, як ніби я
написав це в коді.
Але на другий ітерації цього циклу, це, як ніби я
написав це в своєму коді.
Але те, що я використовую змінну чудово, тому що, як випливає з назви
припускає, що це зміна його значення на кожній ітерації.
Так що я заповнення цього масиву одному місці за один раз.
Що це масив виглядає?
Ну, чому я намалював це супер простий прямокутник на екрані тут
Перед саме з цієї причини.
Масив це просто шматок пам'яті послідував ще один шматок пам'яті,
пішов ще один шматок пам'яті, і так далі.
Так що, якщо мій масив розміром 2, в даному випадку тут, все, що я зробив би по
введення в моєї оцінки вікторини, як тут.
Я отримав 100 на цьому.
А потім я отримав 99 на цьому.
Тоді ця пам'ять не може навіть бути використаний, тому що я тільки запитав
комп'ютер масив розміром 2.
Ці квадрати все ще там.
Вірно?
У вас ще є два гігабайти оперативної пам'яті, навіть якщо ви тільки
просить двома поплавками.
Таким чином, ідея масивів є те, що комп'ютер просто бере шматок пам'яті
, А потім розподіляє дрібні шматки спина до спини, щоб спина до спини.
І це все, що масив.
Це безперервний шматок пам'яті, всередині якої ви можете покласти речі.
>> Тепер це відбувається тоді робити лише деякі нудно арифметика.
Якщо я прокрутіть вниз тут, це де я тоді ітерації по масиву.
Я придумав підсумовування всіх значень у масиві.
І тоді я використовувати круглі функцію тут насправді робити
сума ділиться на вікторини.
Але дозвольте мені махнути рукою на що як свого роду досить арифметичних зараз.
Але все, що робить для мене, в кінцевому рахунку, обчислення середнього.
Отже, спочатку тест Плюс другий вікторина, розділена на 2, а потім друку
його, як Int.
>> Але давайте тепер перехід до іншої приклад називається string1,
який малює аналогічну картину, але з використанням рядків.
Дозвольте мені йти вперед і спростити цей на мить.
І прости відступ на даний момент.
Зверніть увагу на лінію 19 з цього прикладу, я отримую рядок від користувача.
Але зверніть увагу на те, що я роблю в наступному ліній 22 і далі.
Насправді я ітерація від Я до - і це новий трюк -
StrLen, довжина рядка.
Це функція, яка поставляється з C, що якщо ви передаєте його рядки, він говорить
Вам, скільки символів в цьому рядку.
Ось і все.
Той факт, що це StrLen, а довжина рядка просто тому, що це
більш коротким.
30 років тому, людям подобалося писати речі, як лаконічно, наскільки можливо.
Таким чином, ми зберегли цю конвенцію тут.
я + + означає лише те збільшуємо я в кожній ітерації.
А тепер помічаю це, що дійсно цікаво.
Таким чином, у рядку 24, я кажу комп'ютер, дайте мені характер, вісім
бітів, і називають це в.
Але що це на правій стороні говорите?
В англійській мові, що це уявляєте?
[Нерозбірливо]
David J. Малан: Абсолютно вірно.
Дайте мені перший символ в масиві.
Або, в більш загальному, дай мені I-ий символ в масиві.
І розумію, що це важливо зараз, як комп'ютерні науки, ми насправді
починаючи з 0.
Ви не повинні розсуд зараз, щоб почати це робити.
Тепер ви повинні вести себе відповідно до очікувань комп'ютера і
рахувати з нуля, тому що [0] буде першим
символів в рядку.
[1] буде другий.
[2] буде третім, і так далі.
Таким чином, ця програма, якщо я скомпілювати його - це, знову ж таки, string1.
>> Так що string1.
А тепер я біжу string1 в моєму вікні терміналу.
Він очікує введення, так що я збираюся ввести, скажімо, Давида.
Enter.
І тепер він друкує DAVID все на різних лініях, тому що
помітить, що я роблю.
Я друк одного символу за один раз.
Зараз ми не будемо вдаватися в подробиці сьогодні на цьому.
Але я видалив цю хвилину тому тут галочку.
Виявляється, що якщо користувач неправильно, змагальності, або просто
замішанні, ви можете фактично не дають рядки деякої довжини.
Якщо ви натиснете не ту клавішу на клавіатурі, ви могли б дати
Рядок не на всіх.
Або, якщо ви злий, ви можете спробувати, щоб вставити у вартість гігабайта про
есе для заповнення цього рядка.
І якщо на комп'ютері не вистачає пам'яті, то виходить, що ми збираємося
повернути це спеціальне значення, зване нульове.
Таким чином, на даний момент, просто знаю, що є це спеціальне значення, зване нульове, що
дозволить нам перевірити, коли ми з пам'яті, між іншим.
>> Але якщо я відкриваю зараз string2, зверніть увагу на одна відмінність тут.
Зверніть увагу на одна відмінність тут з string2.
З string2, цей цикл трохи відрізняється.
Дозвольте мені видалити нулі, так що ми можемо говорити про тих, хто в інший раз.
Але чим же відрізняється циклу на цей раз?
І я можу повернутися до попереднього прикладу.
Так що це другий варіант.
Це версія одного.
Один, два, раз-два.
Так StrLen виклик де?
Це в першій частині циклу.
Будь-які думки про те, чому я це роблю?
Так.
[Нерозбірливо]
David J. Малан: Так що ми не викликаємо функцію кожного разу.
Саме так.
Нагадаємо, з петлями на те, що вони супер просто, як тільки ви роду
розумію, що це ініціалізації
стані, і оновлення.
Проблема в тому, що умова відбувається на кожному
ітерації циклу.
І тому в даному прикладі, що таке погано про те,
що це мій стан?
Ви телефонуєте StrLen знову і знову, і знову.
Але як тільки я набрав в DAVID, довжина цього рядка дорівнює п'яти.
І він не збирається міняти на кожній ітерації циклу, оскільки
Рядок як і раніше D - V-I-D. Так що це натяк на те, що збирається стати
більш важлива ідея відома як дизайнерське рішення, де - просто не
змусити комп'ютер робити непотрібну роботу.
>> Тепер же, як попередній перегляд PSET 2, PSET 2 в стандартному виданні
збираюся кинути вам виклик насправді реалізації деякого числа шифрів, деякі
кількість алгоритмів шифрування, так що ви можете як шифрування і дешифрування
секретні повідомлення, схожу на ту, Ральфі там декодувати.
У хакером видання PSET 2, ми збираємося піти трохи далі.
Ми збираємося передати вам файл з фактичними комп'ютерну систему, яка містить
цілу купу імен та фактичної зашифровані паролі, і завдання
для хакера видання буде зламувати ці паролі і фігури
, Що криптографія і таємні, що була використана насправді
генерувати ці паролі.
І ми збираємося зробити це за допомогою нової функції тут C, що я дам
Ви тільки демо-версія, відома як аргументи командного рядка.
>> Ось і виходить, як деякі з вас, можливо, бачили в розділі або в підручниках,
Основним не завжди повинна бути порожнеча в дужках.
Виявляється, що основна можна також записати як це, з двома аргументами,
ARGC і ARGV, де ARGC число слів, які ви вводите після
Програми ім'я в командному рядку.
І ARGV є фактичним слів.
І, як квадратні дужки там пропонують, ARGV мабуть масиву.
Це збирається бути рядком після рядка після рядка в пам'яті.
Так що ми збираємося бути в змозі зробити, починаючи з PSET 2,
щось на зразок цього.
Якщо я роблю argv1, який є прикладом ми повернемося до в понеділок, і запустіть
це, зауважте, що це не схоже, щоб зробити що-небудь ще.
Він просто виводить своє ім'я.
Але якщо я прощаюся класу, зверніть увагу, що ця програма мабуть ітерації
над кожним зі слів, які були надруковані в командному рядку.
І засоби, за допомогою яких ми зможемо отримати доступ до слів, які користувач має
друкується в рядку є зміна основного, починаючи цей уїк-енд, від Int
основних (недійсними) в ціле основні (агдс, ARGV).
І, таким чином народиться аргументи командного рядка.
І як тільки ви отримаєте дійсно складна в цьому, ви будете мати можливість писати
дійсно тріп програм, таких, як цей ось, який йде вище і поза
деякі функції, які ми зробили до сих пір, але все досить потужний.
>> Таким чином, ми залишимо це з цим на екрані.
І ми будемо бачити Вас в понеділок.