>> Девід Дж Малан: Все Добре, так що це CS50.
І це явно п'ятницю.
І це кінець тижня один.
Таким чином, ви, напевно, пам'ятаєте, що ми зупинилися, минулого разу, з захоплюючим сортів.
Причому ми не піддавайте цю брехню, що ні Неважливо, що ви вчили зростає
до, 1 ділиться на 10, не в Те, 0,1 або 0,100 або 0,10000.
Справді, якщо ми складаємо цей Програма, як ми робили вчора, с,
зробити неточність, а потім зробити точку, слеш, неточність,
ми дізналися, що це те, що 1 ділиться на 10 насправді.
Так що насправді не зовсім так.
Але це робить натяк на деякі фундаментальне обмеження комп'ютерів.
І справді, серед речі, які ми збираємося зробити
сьогодні поглянути на те, чому це має сталося, що наслідки це має,
як людство не змогло щоб зрозуміти це в деяких дуже
серйозно situations-- Результатом встановлення який
була досить трагічна і expensive--, а також
поглянемо на те, як ми може насправді захищати
проти цих видів обмежень.
Так інтуїтивно, мабуть, чому 1 ділиться на 10,
відповідно до мого комп'ютера Тут, не тільки 1/10, 0,10?
Так.
Що ти думаєш?
>> Глядачка: основа системи числення відрізняється?
>> Девід Дж Малан: The що?
О, корінь відрізняється?
Так що не зовсім.
Це насправді більш основне значення для апаратного забезпечення.
Інші думки?
Так.
Глядачка: Вони представляти числа по-іншому?
Девід Дж Малан: Так they-- правою.
Вони являють собою число по-різному.
Неточно, мабуть.
Так що is-- Ну, інакше з чого?
Або від кого?
Від нас?
Глядачка: Так.
Вони не використовують десяткову система [нерозбірливо].
Девід Дж Малан: ОК.
Таким чином, в деякому розумінні, вони не використовувати десяткову систему.
Під капотом, все, дійсно, двійковий,
і це пов'язано, в дійсності.
Але це ще більш простий Пояснення, ніж це.
Так.
>> Глядачка: Вони тільки так багато бітів.
Вони можуть зберігати тільки до певного Ступінь, як з знаків після коми.
>> Девід Дж Малан: Так.
Це те, що дійсно стає на нього.
Виявляється, що комп'ютери як правило, завжди буде тільки
використовувати обмежену кількість інформації представляти щось.
Вірно?
Зрештою, у нас є тільки фіксований обсяг простору на жорсткому диску.
У нас є тільки фіксовану суму ОЗУ або комп'ютерної пам'яті.
І якщо у вас є тільки фіксована сума-то,
звичайно, ви не можете насправді підрахувати до нескінченності або будь-який номер, який ви хочете.
Ви, начебто, повинні вибрати те, що спектр
цінностей ви збираєтеся підтримувати.
>> І так, наприклад, за тиждень або два тому, коли ми говорили про ASCII,
і ми говорили про 8 біт, або байт, так би мовити,
Найбільша кількість ми могли представляють 8 біт був те, що?
255.
І ми можемо уявити 256 сумарні значення але якщо ми проводимо одну з них
на 0-- Ну, а якщо ми провести один з них на 0,
то найбільшу кількість Тобто, звичайно, 255.
>> Так що виходить, що це випадок теж, в цьому контексті.
Ми почали говорити, востаннє, про чисел з плаваючою точкою, які
відрізняються від цілих чисел, в що вони мають десяткову точку
і, сподіваюся, деякі номери після цього, але вони занадто.
Комп'ютер, як правило, тільки збираюся використовувати 32 біта, 64 біта, може бути,
представляти значення з плаваючою комою.
Так що, хоча ми виросли навчання математики і, знаючи,
що ви можете абсолютно є нескінченну кількість чисел
після десяткової крапки, а не якщо у вас є кінцеве пам'яті.
Ви, начебто, є, щоб закруглити, або вибрати, які
номера ви збираєтеся представляти.
І тому ви можете думати, в якомусь сенсі, цей є найближчим комп'ютер
наближення до значення 1/10, що він може отримати, тільки з 32 або близько того біт.
І це не просто 1/10.
>> Наприклад, якщо я змінити це 1/3, який ми думаємо, ще простіше.
Так 1 ділиться на 3.
Дозвольте мені зберегти файл.
Дозвольте мені йти вперед і перекомпілювати його.
І дозвольте мені знову запустити його.
Тут теж, мабуть, 1/3 НЕ 0,3 а потім нескінченне число 3-х
після цього.
Ви повинні це неточність у кінці.
Так ми, люди, правильно, і що Ви дізналися, насправді, правильно,
але ми натикаючись проти деяких обмежень.
>> І те, що я думав, ми робимо сьогодні, є почати
дивлячись на, відверто кажучи, Трагічні наслідки цього
іноді, коли людство не зовсім реалізувати
для цієї реальності, і ці обмеження.
І ми побачимо ряд віньєток від History Channel, який приймає
погляд на, як все пішло не так.
Це довго близько 8 хвилин, і ми повернемося після цього
і поглянути на точно що ще може піти не так.
Якби ми могли затемнити lights--
>> [ВІДТВОРЕННЯ ВІДЕО]
>> -Комп'ютери, Ми всі прийшли до розуміння в часто засмучує проблеми, які
йти з ними.
Помилки, віруси, і програмне забезпечення глюки невеликі ціни
платити за зручності.
Але у високотехнологічних і високошвидкісних військові та космічні програми, програми
найменша проблема бути збільшені у катастрофі.
4 червня 1996, вчені підготували запустити безпілотний Аріан 5 ракета.
На його борту науково Супутники призначені
встановити, як саме Взаємодіє магнітного поля Землі
з сонячними вітрами.
Ракета була побудована для Європейське космічне агентство
і відірвався від свого об'єкта на узбережжі Французької Гвіани.
>> -І Близько 30 секунд в політ, вони спочатку
помітив щось відбувається не так.
Що сопла були повороту таким чином, вони дійсно не повинні.
Близько 40 секунд в польоті, ясно автомобіль потрапив у біду,
і ось, коли вони зробили рішення знищити його.
Діапазон офіцер безпеки з Величезні кишки натиснув кнопку,
підірвали ракету, перш ніж він міг стати загрозою для громадської безпеки.
>> -Це Був дівоча вояж Ariane 5,
і його руйнування взяв розмістити через помилку
вбудовані в програмне забезпечення ракети.
-The Проблема на Аріан було те, що
був номер, який потрібно 64 біт, щоб висловити,
і він хотів, щоб перетворити це 16-бітове число.
Вони вважали, що число ніколи не буде дуже великий,
що більшість з цих цифр в 64 бітове число було 0 '.
Вони були неправі.
>> -The Неспроможність одного програма, щоб прийняти
вид номер генерується інший був в корені збою.
Розробка програмного забезпечення стала дуже витратна частина нової технології.
Аріан 4 ракети були дуже успішним, так програмного забезпечення
створене для того, був також використаний на Ariane 5.
>> -The Основна проблема в тому, що Аріан 5 був швидше, прискорюється швидше.
І програмне забезпечення було склали за це.
>> -The Знищення ракети був величезний фінансова катастрофа,
Все через помилки програмного забезпечення хвилин.
Але це був не перший час проблеми перетворення даних
мучило сучасні технології ракети.
>> -В 1 991 з початком війни в Перській затоці в перше,
ракета Patriot випробував подібного роду
проблеми перетворення номер.
У результаті 28 осіб, 28 американських солдатів
було вбито і близько 100 поранені,
коли Патріот, який повинен був для захисту від вхідних бокоплавов,
не вдалося звільнити ракету.
>> -Коли Ірак вторгся в Кувейт і Америку запустив Буря в пустелі на початку 1991 року,
Patriot ракетні батареї були розгорнуті щоб захистити Саудівську Аравію та Ізраїль
з іракських ракетних атак Скад.
Патріот це США, середньої дальності земля-повітря системи
виробництва компанії Raytheon в.
>> -Розмір Перехоплювача Patriot, Сам, о, довго приблизно 20 футів.
І він важить близько 2000 фунтів.
І це несе боєголовку about-- Я думаю, що це приблизно 150 фунтів.
І боєголовка, сам, це вибухова речовина,
яка має фрагменти навколо нього.
Кожух боєголовки призначений, щоб діяти як картеч.
>> Досліджено ракети здійснюється, 4 за контейнер,
і транспортуються напівпричепа.
>> -The Патріот проти ракетної системи сходить принаймні, 20 років.
Спочатку він був розроблений як зенітно-ракетного
збивати ворожі літаки.
Під час війни в Перській затоці в перше, коли що війна прийшли разом,
Армія хотів використовувати його для збити бокоплавов, а не літаки.
Іракська група не стільки проблеми,
але армія хвилювалася про бокоплавов.
І так вони намагалися оновити Patriot.
>> -Intercepting Ворога Ракета подорожі в Маха п`ять
збирався бути досить складним завданням.
Але коли Патріот був доставлений в експлуатацію,
Армія не відомо про Іракський модифікація, яка зробила
їх бокоплави майже неможливо потрапити.
>> -Що Трапилося, є бокоплави, що йшли в, були нестабільними,
вони були погойдуючись.
Причина цього, був іракців, для того,
щоб отримати 600 кілометрів з діапазон ракети 300 км,
взяв вагу з передньої боєголовки і зробив боєголовка легше.
Так що тепер, Патріот намагається прийти на вітрі, і більшу частину часу,
переважна більшість з Час, було б просто літати Скад.
>> -Після Системних операторів Patriot зрозумів Патріот повз ворота,
вони підірвали боєголовку патріота, в щоб уникнути можливих жертв, якщо він
був падати на землю.
>> -Це Було те, що бачив, більшість людей, ці великі вогняні кулі в небі,
і зрозуміли, як перехоплює Скад боєголовок.
Хоча в ніч небо, з'явилися патріоти
щоб бути успішно руйнуючи бокоплавов, в Дахрані,
не може бути ніякої помилки про його виконання.
Там, радар система Патріота втратив вхідного Скад,
і ніколи не запущений, через програмного забезпечення недолік.
Це був ізраїльтян, які вперше виявлений що більше система була на,
тим більше час розбіжності став, у зв'язку з годинником вбудованого
в комп'ютері системи.
>> -О За 2 тижні до Трагедія в Дахрані,
Ізраїльтяни повідомили Міністерство оборони,
що система гаючи часу, що після приблизно 8:00 роботи,
вони помітили, що система була стає помітно менш точними.
Міністерство оборони відповів кажу все батарейки Patriot
не залишати системи протягом тривалого часу.
Вони ніколи не говорили, що довгий час було.
8:00?
10:00?
1000 годин?
Ніхто не знав.
-The Батареї Patriot розміщені в казармах
в Дахрані, і його недоліки внутрішнього годинник, був на більш ніж 100 годин
в ніч на 25 лютого.
>> -Це Відстежується час з точністю приблизно 1/10 секунди.
Тепер 1/10 секунди знаходиться цікавий номер
тому що він не може бути виражається в двійковому, точно.
Що означає, що не може бути виражено, точно,
в будь-якому сучасному цифровому комп'ютері.
Важко повірити, але використовувати це як приклад.
Давайте число, 1/3.
1/3 не може бути виражена в десятковій, точно.
1/3 0.333 відбувається нескінченності.
Там немає ніякого способу, щоб зробити це, з абсолютна точність, в десятковій.
Це точно така ж Проблема, що відбулося в Patriot.
Чим довше система працювала, то гірше помилка часу став.
>> -Після 100 годин роботи, помилка У той час був тільки приблизно 1/3 секунди.
Але з точки зору орієнтація на Ракета подорожі в Маха 5,
це призвело до відстеження Помилка з більш ніж 600 метрів.
Це буде фатальна помилка для солдатів на Дахрані.
>> -Що Трапилося, є запуск Скад був виявлені за допомогою супутників раннього попередження,
і вони нові, що Скад був в найближчі їхні загальному напрямку.
Вони не знають, де він йшов.
>> -Це Був тепер до радара компонент системи Patriot,
захисту Дахрані, щоб знайти і зберегти трек наближається ракети супротивника.
>> -The Радар був дуже розумний.
Це буде насправді відстеження позиція за вітром
а потім передбачити, де він, ймовірно, буде,
наступного разу, то радар послав імпульс з.
Це називається ворота діапазон.
>> -Тоді, Коли Патріот вирішує достатньо часу має
передається повернутися і перевірити на наступний місце для цього виявленого об'єкту,
вона йде назад.
Так що, коли він повернувся до неправильних Місце, тоді не бачить об'єкт
і не вирішить, що не було Об'єкт, це була помилкова виявлення,
і падає трек.
Вхідний Скад зник з екрану радара,
і кілька секунд потому, його врізався в казарми.
Скад вбиті 28 і був останнім одним уявлень під час Першої війни в Перській затоці.
Трагічно, що оновлене програмне забезпечення прибув до Дахрані на наступний день.
Програмне забезпечення було недолік було зафіксовано, закриття
один розділ в проблемних Історія ракети Patriot.
>> [КІНЕЦЬ ПЕРЕГЛЯДУ]
>> Девід Дж Малан: Таким чином, ми будемо дивитися на деякі аналогічні обмеження в тільки трохи.
Але спочатку, давайте перехід до вашого відома кілька Ось.
Так одно-- цей уїк-енд, є буде супер розділи,
які призначені, щоб витіснити регулярно заплановані ділянки, які
пустять в тиждень по тому.
Погляньте на веб-сайті CS50 в для отримання додаткової інформації про них.
Вони також будуть зніматися і транслюватися жити для тих, хто не зміг бути присутнім.
Проблема встановити 1 на Сайт звичайно вже,
і ми поглянемо на що в тільки трохи.
І робочі години теж буде розмістити цей понеділок по четвер.
>> Так що це був самий канонічний Програма, яку ми дивилися на останній раз.
Це як простий Програма ви можете написати в C,
і навіть це трохи смілива заява.
Вірно?
Тому що дуже багато удавана складність цього.
Отже, давайте поглянемо на те, що деякі з цих елементів
були і потім спробувати забезпечити психічний модель, як
Ці найпростіші програми працювати, а потім ми почнемо
погляд на речі ще більш складним.
Так ця лінія тут, підкреслив зараз, в жовтий, те, що ми говорили, в останній раз,
що це робить для нас?
Яка мета він служить?
Будь-який з далі назад?
Так.
>> Глядачка: [нерозбірливо]
Девід Дж Малан: Добре.
Так що це дає вам доступ на команди, або давайте
називають їх функції, що хтось ще писав, що оголошені,
так би мовити, в якийсь інший файл.
Таким чином, ми будемо бачити саме те, що .h файл це проти файлу .c, зрештою.
Але зараз, просто знаю, що Printf, наприклад,
серед функцій, які були заявив в якийсь інший файл, десь
ще на жорсткому диску, що хмари дозволяє нам отримати доступ до Printf і використовувати його
без необхідності заново винаходити що колесо себе.
Тим часом, головний.
Що було аналогом основного, минулого тижня?
Так.
>> Глядачка: Зелений прапор кнопки.
>> Девід Дж Малан: Так.
Подряпини років, коли зелений прапор кнопки.
Це як паззл що штовхає речі с.
І так аналогічно, зробив світ вирішив кілька років тому, що в C,
і купа інших мовах, якщо ви хочете, щоб написати програму
Ваш перший функція вже називати, головний.
І він повинен виглядати наступним чином.
Але ми повернемося, іншим разом, до чого, INT,
і порожнеча, значить в цьому контексті.
В даний час, фігурні дужки є свого роду з, як шматок головоломки форми нуля в
який інкапсулює кілька рядків.
І серед на лініях тут, це одне тут.
Printf функція, мета якого в життя для друку отформатированную рядок.
І відформатувати, я маю на увазі вас можна підключити значень заповнювачів,
і ви можете вказати, скільки десяткової точки, скільки чисел для друку
після десяткової точки тощо.
І Printf, звичайно, займає одне або більше аргументів чи параметрів,
інакше відомий, більш просто, в якості вхідних даних.
>> Так Printf, як багато Функції, приймає входи.
І ці входи обійняв двома дужками тут.
А всередині тих один вхід.
Це рядок, як ми називали його, яка є просто послідовність символів,
як слово, або фразу, або в цілому есе, навіть у подвійні лапки.
І це те, що відбувається в впливати на Поведінка Printf тому що, звичайно,
це просто звичайна функція друку.
Це не буде знати, що для друку, якщо ви не скажете йому.
А потім, деякі дрібниці.
Що ми кажемо це дивно послідовність символів?
Так.
>> Глядачка: Нова лінія.
>> Девід Дж Малан: Нова лінія.
Так що виходить, ви не можете просто натиснути, введіть, коли ви пишете програму.
Як правило, компілятор буде отримати трохи спантеличені тим, що ви маєте на увазі.
Швидше за все, у вас є в буквальному сенсі кажуть, дай мені нову лінію тут.
І так / п те, що ми зазвичай викликати керуючий символ.
Так п, для нової лінії.
І компілятор знає що, коли він бачить, / п,
він повинен фактично викликають комп'ютер, У кінцевому рахунку, або Printf, в даному випадку,
роздрукувати фактичний нового лінія, як, потрапивши в, введіть,
на клавіатурі.
І, нарешті, те, що ми говорили цей шматок синтаксису для?
Що вона собою являє?
Так.
>> Глядачка: [нерозбірливо]
>> Девід Дж Малан: Це просто кінець лінії.
Це кінець заяви.
І розумію, що ми не покласти їх скрізь.
Ми, звичайно, не пишіть на кінцях кожного рядка.
Наприклад, немає ні на Перша лінія, немає ні на лінії
с, головним чином, немає ні після фігурних дужках,
але ви починаєте бачити і отримати знайомі з, де він закликав до.
І це майже завжди після функції зателефонувати або заяву, деякі дії
що ви насправді приймає.
>> І тепер знаємо, особливо якщо серед тих, хто менш комфортно,
ці види дурних речей що ви будете в кінцевому підсумку випадково стукати
Ваша голова до стіни над.
Тому що ви будете логічно впевнений, в якоїсь проблеми
Ви вирішили для задачі Набір і риса тільки
не збиратиме або навіть бігти.
І так часто, на ранній стадії, це буде бути тому, що ви пропустили дужки,
або ви пропустили крапку з комою.
І так просто бути уважними з цих видів речей,
і не намагатися отримати розчаровані їм, бо дуже швидко робить це
стати старий капелюх.
Але це дуже легко отримати розчарування на ранній стадії, в якості результату.
>> Так що тепер, давайте поглянемо на те, як ця лінія насправді працює
а потім подивіться на трохи більш складним.
Таким чином, ми маємо тут, то вміння малювати на екрані.
І давайте припустимо, що це мій екран комп'ютера,
але я пишу, привіт програму, і я не реалізований, Printf.
Хтось реалізував, Printf.
Хто хотів би претендувати на реалізували, Printf?
Якщо ми можемо?
Гаразд, що ваше ім'я?
>> СТУДЕНТ 1: [? Copal. ?]
>> Девід Дж Малан: Copal, давай до.
Давай до.
Добре.
Отже, ми маємо, ось, деякі теги ім'я, так як ми будемо робити в невелику гру це.
І ми зв'яжемося з Вами, Printf.
І якщо ви хочете, щоб приїхати сюди, те, що я тільки що намалювали на екрані,
це досить просто, є я, це.
>> Гаразд, так, привіт, мене звуть, Printf, якщо ви хочете, щоб покласти, що на.
Добре.
І якщо ви можете йти стенд на екрані комп'ютера
неначе ви знаходитеся функція, прийшов з цієї комп'ютерної системи.
І ваша мета у житті насправді щось надрукувати.
Але так само, як програми ми тільки що на екрані, тут,
ми збираємося мати, щоб насправді дати вам деякий внесок.
>> А так, якщо мій вхід, тут, мабуть, те, що передається PRINTF,
давайте вид знущатися його, як це.
Я збираюся написати на буквально папірець, "привіт, мир",
Обернена коса риска Н. І бути зрозуміло, що Я тільки що намалювали на цьому папірці,
виглядає як це.
Так що, коли я запускаю цю програму, і це жовта лінія коду запускається на виконання,
Це як якщо б я, програми привіт, я передавши частину вхід з з функцією
що хтось написав.
>> І якщо ви, з вашим пальцем, міг насправді, з пальцем,
малювати на екрані те, що це ви були передані,
ефект в кінцевому підсумку це точно дізнатися, що на екрані.
І маленький куточок випадок.
І добре, що ми не повинні бачити The, нова лінія, в цій точці.
Було б неправильно для вас явно намалювати символ нового рядка.
Але якщо ми продовжували писати слова на екраном, вони будуть в остаточному підсумку нижче.
>> Так що спасибі вам велике, але дотримуватися тут тільки для одного моменту.
Тепер нам потрібно одне інше Робота на громадських засадах, якби ми могли,
що збирається повинні грати роль of-- Це тільки люди, в оркестрі
зараз.
Як about-- ОК.
Саме тут.
Давай до.
Як вас звати?
>> СТУДЕНТ 2: [? Ivay. ?]
Девід Дж Малан: Вибачте?
СТУДЕНТ 2: [? Ivay. ?]
Девід Дж Малан: Ітан, давай до.
Немає?
Хіба я що неправильно, навіть після сказав, що це в два рази?
Давай до.
Важко почути тут.
ДОБРЕ.
І я дуже шкода, що ваше ім'я?
>> СТУДЕНТ 2: [? Ivay. ?]
>> [? Девід Дж Малан: Ivay. ?] ДОБРЕ.
Зараз, якщо ви не розум, ви GetString.
>> СТУДЕНТ 2: ОК.
Прохолодний.
Девід Дж Малан: Так що, якщо ви хочете стояти тут на мить,
давайте поглянемо на трохи більш складна програма, що
в даний час має три рядки коду.
Отже, ми маємо один, назвіть своє ім'я, використовуючи Printf; два, заклик до GetString,
супроводжується призначенням на Мінлива називається, рядок с, або називають років;
а потім ще виклик, Printf, але цього разу з двома входами.
>> Таким чином, ми вже зробили стан Ваше ім'я, вірніше, ми в
вже зробив дзвінок PRINTF.
Так що я збираюся написати, державних своє ім'я.
І так, що я збираюся пройти, Printf, в мить,
це досить просто, це.
Так що, якщо ви хочете, щоб йти вперед і робити це на екрані, це ваш внесок у даний час.
Добре.
І забудьте рядок, у нас тепер є наша власна рядок коду тут.
Таким чином, в, GetString, ми повинні насправді назвати, GetString.
Так ваша мета в житті, щоб просто ходити з в оркестр, якби ви могли,
і отримати чиєсь ім'я.
Але давайте дати вам те, щоб покласти його на.
Якщо ви хочете, йдіть вперед і отримати рядок,
отримати чиєсь ім'я на тому, що папірець, якби ви могли.
>> Добре.
І ми бачимо, в мить, чиє ім'я ми отримуємо.
Між тим, що я збираюся є готовий, це чистий аркуш
з паперу, в яких, я збираюся зберігати будь-яке значення його
є те, що GetString повертається до мене, Я, будучи змінна рядок називається, с.
Добре.
Так що ви тут?
Нік.
Добре.
Отже, ми маємо ім'я Nik тут.
Так що це те, що в буквальному сенсі був повернутий
для мене, так би мовити, по GetString.
>> Я, в даний час, я збираюся виконати лівій стороні
цього виразу, де я просто скопіювати вниз, для сьогоднішніх цілей, Нік.
Так що тепер, у мене є змінна називається, з, зберігання ім'я для Nik.
Я вже передав Printf, попередній аргумент.
Але в нашому третьому і остаточному лінії Код, я насправді потрібно руки Printf
щось трохи different-- "привіт,% s," зворотний слеш п.
>> І тому останній рядок я збираюся щоб send-- останнє, що я
збирається записати зараз, полягає в наступному.
Таким чином, два рядки коду, або а в останньому рядку коду,
заклики до двох inputs-- Один з них, це, і два, це.
Так що, якщо наша функція Printf Тепер можна приймати їх в якості вхідних даних,
дозвольте мені очистити екран для вас.
Насправді немає, ви можете піти вперед.
Ми залишимо його, оскільки він знаходиться на тій же самої програми.
Ми повинні побачити, привіт, Нік.
Добре.
Так що це було досить мало обручі, щоб стрибати через, просто
писати, вкажіть ваші ім'я, і, привіт, Нік.
Але ця проста ідея передачі повідомлень, вхідного і вихідного мимохідь отримання,
саме модель, яку ми матимемо навіть для самих складних функцій.
Так що спасибі вам велике вам обом.
У нас є прекрасний стрес М'яч тут для вас.
І спасибі нашій GetString і PRINTF добровольці, так.
Дякую.
Добре.
Спасибі вам обом.
>> Таким чином, ми говоримо про досі, в основному, про рядках.
І з'ясовується, що насправді С може зрозуміти кілька різних типів даних.
Справді, давайте Подивіться на ці тут.
Так C, і багато мов, розуміти речі, звані символи.
Напівкоксу, як правило, один байт, чи вісім біт.
І це являє собою один символ, як буква A, або капіталу
Лист, або мала літера А, або знак оклику,
або будь-який символ, ви можете друкувати на клавіатура, а іноді й більше.
Ми також трапиться побачити поплавці.
Поплавок, взагалі, А 32-бітове значення, або чотири байти
бо знову, один байт восьмій бітів.
>> Таким чином, поплавець значення з плаваючою точкою, щось з комою.
І справді, ось що фільм був розмову
про те, коли вони говорили про плаваючою Значення точок, деяке фіксоване число бітів
використовується для представлення дійсного числа.
Але є також речі, звані двійники.
Вони існують в Java, якщо ви взяли АСУ ТП,
і подвійний, як ім'я, на щастя, припускає, в два рази більше, як поплавок.
Це все ще дійсне число, він просто має більше бітів
з якою буде все більш точним, або для зберігання ще більшого числа.
INT легко.
Ми говорили про те, що в останній раз.
Це просто число.
І це взагалі 32 біт, або чотири байти.
>> І так, якщо у вас є, давайте тепер подивимося, 32 bits--, і ми зробили це в тиждень 0,
дуже briefly-- якщо у вас є 32 біта, те, що найбільша
Кількість можна представити як ціле?
Дайте або взяти?
Це як 4 млрд, і це тільки якщо ми
представляючи тільки позитивні числа.
Якщо у вас є 32 біта, і ви хочете, щоб представляти негативні числа, а також,
ваш діапазон, по суті, негативний 2 млрд на позитивний 2 млрд.
Але в цілому, ми почнемо при 0 піднятися на 4 млрд.
>> Ви не повинні знати, точно, але ми можемо переконатися в цьому, насправді, якщо я просто
відкрити невеликий калькулятор, тут.
Я можу зробити 2 32, і це точно, як великий,
скільки значень ви можете уявляють, з 32 бітами.
І це приблизно 4 млрд.
Таким чином, ми будемо тримати, бачачи, що число в декількох різних місцях.
Але якщо вам потрібно більше номери, ніж це,
Виявляється є те, що називається давним.
І довго довго як правило, 64 біта, які
означає, що це на порядок навіть більше, ніж в міжнар.
>> Тому я не можу навіть вимовити найбільшим номер, який ви можете уявляти,
але це помітно більше.
Тепер, як в сторону, історично, якщо INT 32 біт,
і довго довго 64 біта, як великий довгий, не довго довго?
Можна подумати, що це вже, ніж Int але, можливо, менш тривалий, ніж довгий довгий,
але це насправді залежить.
>> І так виходить одна розчарувань теж
з написання коду на деяких системах, є те, що не всі з цих типів даних
Тобто заздалегідь певні значення.
Іноді це це багато бітів.
Іноді це що багато бітів.
Таким чином, ви насправді потрібно знати, іноді, які апаратні
ви працюєте програмного забезпечення на.
На щастя, інші мови і інші типи даних, які в даний час існують,
дозволить вам бути більш точним.
Ну, ми бачили рядок, і ми бачили, логічний, теж
але, виявляється, ті, приходять Тільки з бібліотекою CS50.
Так що ті, які не побудували в С. Ті замість
прийти в цьому файлі, званому CS50.h, що ми в кінцевому підсумку
відігніть шарів.
Але зараз, вони просто додаткові типи даних.
Логічне значення є істинним чи хибним, і Рядок являє собою послідовність символів,
як слово.
Тепер Printf, ми бачили, має заповнювачі,% S є одним.
І ви могли б, щоб зараз, вивести з цих прикладів, інших, як
ви могли б заповнювач для різних типів даних.
Наприклад, зробити припущення, якщо ви хотів, щоб роздрукувати один символ за допомогою
Printf, заповнювач, ймовірно,% гр.
І якщо ви хочете, щоб роздрукувати число з заповнювачем,% I.
% LLD це давним десяткове значення, але довго довго, так що карти до цього.
І тоді% F для плавучих значення точки або для подвійного,
так що іноді вони повторно використовувати в різних контекстах.
Таким чином, ми будемо бачити і використовувати деякі з тих, хто протягом довгого часу.
І Printf та інші функції також Керуючі послідовності підтримку інших,
а іноді, вони необхідні.
Так зворотний слеш н нова лінія.
Обернена коса риска т, хто-небудь хочете прийняти удар?
Глядачка: Таб.
Девід Дж Малан: Таб.
Так що, якщо ви дійсно хочете роздрукувати вкладку, що не
фіксована кількість прогалин, але фактично Вкладка характер, ви не потрапляєте,
закладка, на клавіатурі, як правило ,, ви насправді зворотної косої т.
Обернена коса риска подвійної лапки, чому я завжди хочу, що?
Вірно?
Чому я не можу Просто введіть подвійні лапки на клавіатурі?
Глядачка: Тому що, в іншому випадку, це
буде думати, що це кінець з подобається ваш друку [? Текст. ?]
>> Девід Дж Малан: Точно.
Пам'ятаєте, з нашої PRINTF приклади, коли ми
проходили в PRINTF на вході, зліва від цієї рядка введення
і праворуч від цього входу Навесні, звичайно, був подвійної лапки.
Якщо ваш власний вхід має подвійне Цитата в середині, що
комп'ютер може потенційно заплутатися, щоб,
робить цю прямі подвійні лапки відносяться до середини?
Він належить з лівого?
Він належить з правого?
І так, якщо ви хочете, щоб зробити його супер ясно, у вас зворотна коса риса подвійної лапки,
так що це біг, так би мовити, і це не сплавлені щось інше.
І є декілька інших тут, Обернена коса риска г, одинарні лапки, 0,
що ми можемо побачити в протягом довгого часу, а також.
А тепер, як щодо функцій?
>> Так дій, які ми можемо зробити, таким чином, далеко на цій мові, С, добре, ми бачили,
Printf, звичайно, і все з інших на екрані,
ось, що ми будемо використовувати для Перший курс в кілька тижнів, тільки
приходять, коли бібліотека CS50.
І вони роблять це набагато простіше, в З фактично отримати користувальницький введення.
Виявляється, що в C, і відверто на декількох мовах,
це реальна біль в шиї, щоб зробити щось просте, як швидке користувача
для клавіатури, для його або її введення.
І тому ці функції роблять його легше.
>> І це також має помилку перевірки з усього,
так що, коли вам Нагадаємо, в середу, ми
побачив, повторіть спробу, попередження, коли я не співпрацювала,
і я набрав слово, а не номер?
Ми зробили важку рано на переконатися, що користувач взаємодіє.
Але це всього лише тренування Колеса, що ми в кінцевому підсумку,
і швидко, зняти.
>> Таким чином, щоб резюмувати, то, давайте поглянемо,
так само, як ми це робили з нуля, в деякі канонічні конструкції в С.
Це повинно, начебто з, бути побіжний тур,
просто так, що у вас є посилання і що ви бачили речі в першу чергу.
Але тоді ми будемо дивитися на фактичне кодування використовувати деякі з цих будівельних блоків.
Так само, як в порожньому, коли ми хотіли заяви,
сказати або почекайте, в C, у нас є функції, а, як Printf.
>> Якщо ми хочемо, щоб висловити стан в C, це схоже, у дусі,
до цього шматок головоломки, що подивився, як це в подряпина.
Але замість цього, ми буквально написати, якщо.
А потім, в дужках, ми поставили умову,
де ця умова, що ми будемо дзвоніть, знову ж таки, логічне вираження.
І знову ж, це свого роду псевдокод.
І, справді, // це коментар.
Це просто англійські слова до себе.
Але це загальна структура, якщо, стан.
Але ми побачимо, бетон приклади в хвилину.
>> Якщо ви хочете, щоб мати двостороння вилка в дорозі,
так само, як ми зробили з нашою добровольцем на Середа, ви можете мати, інакше, якщо.
І якщо ви хочете, щоб мати третій і кінцевий стан, або ситуація, за замовчуванням,
Ви можете мати просто ще блок, там.
І точно так само, з логічних виразах, Ви, може, і, їх разом.
І ми побачили у середу, що це не один амперсанд,
це два, з причин, більш низького рівня, які ми в кінцевому підсумку побачити і грати.
Або ющіе речі разом на 2 вертикальні смуги.
На клавіатурі США, це як правило, одним з ключових
з клавішею перемикання вище Ваш Введіть ключ або клавішу.
>> Тоді є ці речі, які ми будемо використовувати, може бути, один або два рази.
Вони функціонально еквівалентні те, що ви можете зробити з, якщо, інакше, якщо
інакше, якщо ще, побудувати, але вони називають перемикач.
Вони виглядають дуже різні, але ми бачити в деяких з нашого коду розподілу,
для майбутнього Поставлена ​​задача, швидше за все, що іноді просто гарніше
спосіб вираження ціле купа умов,
не маючи багато фігурних дужках і багато дужок і відступів.
Але вони не дають нам більше не енергії, ніж ми вже.
А тепер петлі.
А це, ми будемо дивитися на трохи більш повільно.
Але тоді, ми почнемо їх використовувати, особливо для тих, хто вже знайомий.
Це канонічне чином, якщо неймовірно аркан чином, щоб написати цикл в С
>> Тепер петля в порожньому було досить проста.
У вас є, назавжди, блок.
У вас є, Повтор, блок з просто номер, який ви повинні ввести в.
І с, для петлі, ви можете реалізувати обидва цих ідей,
але це трохи більш технічний характер.
Але, відверто кажучи, це також відносно простий.
Після того, як ви знаєте, порядок операції, ви в буквальному сенсі
тільки збираєтеся підключити значень і сказати комп'ютер, що робити.
Так ось приклад.
Це цикл, який, цілком просто, вважає від одного до числа
через іншу.
І тільки глянувши у нього, навіть якщо у вас є
немає попереднього досвіду з ця мова, який номер
це, ймовірно, почати відлік з?
ОК, 0.
І я припускаю, що це тому, що ви бачити, що є більш INT і я,
який є змінною.
Це инициализируется в 0.
>> А потім, схоже, ми передаємо Printf, значення.
І справді, я зробив трохи опечатку тут.
Але це легко виправити.
Дозвольте мені додати, я тут.
Тепер у нас є PRINTF істота Минув той значення заповнювача.
І те, що відбувається розраховувати через?
АУДИТОРІЯ: 50.
50.
49.
Девід Дж Малан: 49.
Так 50, на перший погляд, здається, правильно.
Але, виявляється, буде наш стан, що ми тримаємо перевірки.
І ми збираємося зупинитися, як тільки Не я більше не менше, ніж 50.
Так що це петля, навпаки, повинні виконати, так довго, як я менше 50.
Але як тільки вона стає 50, або 51, або ще гірше, він повинен зупиниться автоматично.
Добре.
>> Так що насправді тут відбувається?
Так що це порядок операції по петлі.
Один з них, у вас є Так званий ініціалізації.
Цей жовтий виділений фрагмент коду виконується першим,
і це має ефект, що, за Середа, ви, ймовірно, собі уявити.
Це створює змінну I і його магазини в цій змінній значення 0.
Так я це 0 в цій точці в історії.
>> Наступне, що відбувається в цій конструкції,
тому, що умова отримує перевірені.
Так що я перевірити відразу, це я менше 50?
І, звичайно, відповідь на даний момент є, звичайно ж, так.
Та тому, що я = 0, і це, безумовно, менше, ніж 50.
Тоді те, що відбувається, є те, що це рядок коду, виконуються.
І справді, якщо є кілька рядків коду в цих фігурних дужках,
Всі вони отримують виконаний один за іншим.
>> І в силу тут, мабуть, щоб роздрукувати
число я, що буде бути 0, а потім 1, а потім 2.
Але чому?
Чому це отримати збільшується?
Ну, четвертий річ, яка відбувається те, що цей синтаксис
запускається на виконання після коми.
я ++ є скорочений спосіб говорити; взяти значення I, і додати до нього 1;
і потім наступного разу, додати 1 до нього; і наступного разу,
додати до нього 1.
>> Так що, якщо ми продовжувати йти, що станеться
Далі йде Я не збираюся ініціалізувати я коли-небудь знову.
Якщо я все ініціалізації я до 0, цей приклад
ніколи не скінчиться, бо я б застряг на 0.
Але те, що відбувається, так це що умова буде перевірятися,
рядок коду будуть виконані, я буде збільшуватися,
стан буде перевірятися, Код будуть виконані.
І він продовжував на велосипеді знову, і знову, і знову,
Поки я не індукує ++ значення 50.
>> Стан потім каже, 50 менше 50?
Відповідь, звичайно, немає, і так що весь код припиняє виконання.
І якщо у вас є більше коду на екрані внизу, це те, що відбудеться далі.
Це вискакує з цих фігурних дужках і продовжує друкувати більше після цього.
>> Таким чином, в даний час жарт, з фокстроту, що Ви, можливо, тепер розумію.
Це завжди забавно.
Це як хихикає вид просочуються,
а потім розумієш, ви не повинні сміятися над гумору, як це.
Але є деякі винос тут, педагогічно, теж.
Так що виходить, що я відсутня шматок синтаксису,
або Фокстрот-х пропускаючи шматок синтаксису тут.
Чого не вистачає, що ми мали і в будь-який інший, наприклад, досі?
Повернутися, є, так щось ще,
що ми повернемося до незабаром.
Чого не вистачає, правда?
Так.
>> Глядачка: The ініціалізація [нерозбірливо].
>> Девід Дж Малан: ОК.
Так що, так.
Так насправді, це is-- Ну, і кількість инициализируется
нагорі, або, скоріше, заявив нагорі.
Так що це ще один спосіб зробити це.
Але не в одному рядку вона діє, хоча.
Як тут?
>> Глядачка: Це фігурні дужки?
>> Девід Дж Малан: Так.
Так фігурні дужки відсутні.
Але цей код, я маю на увазі, до їх честі, насправді, синтаксично правильним.
Виявляється, ви не потрібні фігурні дужки
якщо у вас є тільки один рядок коду, Ви хочете, щоб виконати всередині циклу.
Тепер ми завжди, в класі, і в весь наш код розподілу,
включають фігурні дужки в будь-якому випадку, просто для ясності.
Але розумію, що в підручниках і онлайн-приклади,
Ви можете дуже добре бачити кучеряве підтяжки вистачає небудь.
І це нормально, якщо те, що ви вже з відступом і призначена
це просто одна рядок коду, а не кілька рядків коду, потенційно.
Добре.
Так пов'язаної з питанням неточність, це питання переповнення,
в тому сенсі, що, як, у цілих мають обмеження на них
так само, як з плаваючою комою?
У світі плаваючою точкою значення, ми можемо бути тільки так точні,
після чого, іноді погані речі можуть трапитися,
і наші програми можуть бути баггі і помилки.
Тепер навіть з цілими числами, Ви можете зіткнутися з проблемами.
Тепер ціле не має десяткової точки або числа, наступні після нього.
Це просто натуральне число, як правило ,.
Так що може піти не так з Int?
Якщо я використовую Int до Граф, що може піти не так?
Здається, набагато простіше.
Так.
>> Глядачка: Якщо Кількість потрапляє [нерозбірливо]
>> Девід Дж Малан: Так.
Що робити, якщо ви вважаєте так високо, що ви Не можу висловити, що насправді велика кількість.
Вірно?
У якийсь момент, ви йдете перевищувати кордону
з 32-бітного значення або 64-бітове значення.
Тепер знову, я не впевнений, як вимовляється 64-бітове значення,
але я знаю, з 32-розрядного цілого числа, найбільша цінність це може бути,
якщо це тільки позитивно значення, приблизно 4 млрд.
Так що, якщо я намагаюся рахувати до 5 млрд, щось трапиться.
Але давайте подивимося, що насправді, може трапитися.
У світі цілого Переповнення, де ви, в деякому розумінні,
переповнення Ємність число, що може трапитися?
>> Так от двійкове число, це повернення до 0.
Це все 1, і заповнювачі там, є ступенями 2,
так що це двійковий файл.
Таким чином, ці 8, 1 біт на екрані.
І якщо ви пам'ятаєте або Ви швидко зробити математику,
яке значення представлені тут з цих восьми бітів 1?
255.
І навіть якщо ви не були впевнені, в математиці, ви могли б зробити це.
Або ви могли б просто вид розуму через нього,
зачекайте хвилину, якщо я представляють 8 бітове значення,
і я отримав 256 можливих значень, але перший з яких є 0,
Я просто знаю, що великою буде 255,
і це те, що цей міг би бути.
>> Отже, нехай я намагаюся додати 1 до цього значення.
Що б ви зробили в класі Школа при додаванні 1, і це
не дуже підходить, бо Ви повинні нести 1?
Що це число збирається щоб стати, коли ви додаєте 1?
Це стане 0.
Вірно?
Тому що, якби у вас була більш bits-- і я спробуйте, начебто, введіть його here--
якщо у нас було більше бітів, те, що ми могли б зробити тут додати 1,
і тоді ми б отримати це.
Упс.
Ми б 1 біт всю дорогу сюди.
>> Але якщо це кінцеве значення, це тільки 8 біт,
і це зумовлено за допомогою комп'ютера,
що 1 ефективно немає.
Це просто якась падає з обриву.
І так, якщо ви додасте 1 до 255, те, що значення ви, мабуть отримати?
0.
І так випадково чисел, і, можливо, ненавмисно,
в кінцевому підсумку упаковка навколо, як це.
Так що може бути наслідком цього?
Ну, є дещо різні речі.
Таким чином, одна, вона в кінцевому підсумку дивлячись як 0, ненавмисно,
але ви можете бачити роду, навіть в реальному світі,
на краще чи на гірше, прояви цієї ідеї межі.
Наприклад, будь-який з вас, хто коли-небудь грав Lego Star Wars,
Хто-небудь випадково не знаєте, максимальне число монет
Ви можете зібрати в Lego Star Wars?
Візьміть здогад, засновану на сьогодні навідні запитання.
Це більше, ніж 256 або 255.
Це 4 млрд.
Так що виходить, а є деякі people--
деякі вдаючись до допомоги підтвердив останній night-- отримали 4 млрд золотих монет,
або ще багато чого, в Lego Star Wars.
Хоча, мабуть, є спосіб обдурити гру,
є помилка або особливість, яка дозволяє вам тільки наростати багато-багато точок.
Але як можна більшу Значення, по
в цьому скріншоті з кого я знайти в Інтернеті, насправді, 4 млрд.
>> Тепер, чому це?
Це точно 4 млрд, ймовірно, тому що хтось вирішив,
хто писав в цю гру, що вони могли б зробити 4 млрд,
то, щось, щось, як значення я піднімав
з калькулятором і раніше, але це просто трохи чистішим для людей
сказати максимальну кількість з coins-- або шпильки,
як вони називають, що ви them-- може збирати це 4 млрд.
І так, чому це?
Як це LEGO гри реалізації лічильника
який відстежує з Кількість монет у вас є?
Вони використовують те, що?
Глядачка: Він зупиняється вважаючи після 4 млрд.
Девід Дж Малан: Він зупиняється вважаючи після 4 млрд,
значить, ви можете висновок, як програміст,
що вони, ймовірно, з використанням 32 розрядне ціле число.
Як програміст буквально типізованих, INT, в його або її код,
і це тип змінної, вони використовують для зберігання чиюсь код.
Так що інші прояви з цих видів межах.
>> Так що я не грав у цю game-- і я читав на історії
щоб підтвердити, як much-- але в Оригінальна версія Civilization, де
Ви, мабуть, взаємодіють один з одного і можуть вести війну чи світ є,
Ганді мав бути одним з самі мирні персонажі, як я
розумію, в першому Версія цивілізації.
І справді, за шкалою від 1 до 10, його агресивність була просто 1.
Так так, м'яко-небудь агресивний, мабуть.
>> Але в якийсь момент, ви можете по-видимому, встановити демократію у вашому регіоні.
І, якщо ви встановите демократію у вашій версії гри,
то ваш рівень агресії знижується.
Це гарна річ.
Люди більш спокійний мабуть, в цій ситуації.
Але, мабуть, хтось зробив ні, якщо, стан
в оригінальній версії коду.
>> Так рівень агресії Ганді вирушив із Позитивний 1, мінус 2, щоб негативний 1,
але гра не зрозуміти негативні числа.
Так що трапилося агресія Ганді Рівень пішов від 1, 0, 1 до негативного,
який мав ефект обтікання до того,
найбільш агресивний характер в грі, при значенні 255,
за шкалою від 1 до 10.
І з тих пір, там було більше втілення цій грі,
і вони зберегли його в якості свого роду пасхальне яйце,
що Ганді мабуть, жахливо агресивним.
Але це було результатом дуже проста помилка програмування
в цьому дуже ранньої версії гри.
>> Зараз більш тривожно, більш Останнім часом Boeing 787
було зафіксовано як мають помилка, не вид пристрою
Вам особливо хочете, щоб помилка.
І симптоми, які я буду читати тут, зі статті в Інтернеті,
це було, модель 787 літак що був включений постійно
для 248 днів, можуть втратити все змінного струму, змінного струму,
Електрична потужність, в результаті блоки управління генератором,
ГПА, одночасно вдаючись у Безпечний режим.
Так що це було попередження видається коли була виявлена ​​ця проблема.
Ця умова викликано за допомогою програмних лічильника,
внутрішніми по відношенню до ГПА, так ціле число або змінна,
що переповнення після 248 днів безперервної потужності.
Боїнг в процесі розробляє оновлення програмного забезпечення, що ГПА
буде виправити небезпечний стан.
>> Так само, як ракети сценарій, в якому
вони були якісь змінної що розраховує, і підрахунок,
та підрахунку, але поступово переповнені межі його можливостей,
Аналогічно зробив клятий літак мають змінну переповнення
після достатньо часу бігу.
І так як мова-в-щоку роботи навколо цього питання
це по-справжньому, перезавантаження, ваш літак кожен 247 днів, так що пам'ять отримує знищені
і змінна повертається 0.
Але розуміють, що це дуже великий втілення програмного забезпечення,
але особливо коли ми чуємо про Apple, операційних систем відбувається в автомобілях,
і самостійного водіння автомобілів з Google, і будь-яку кількість втілень програмного забезпечення
У нашому повсякденному житті, телевізорів і годинник, і більше,
реалізувати були оточені програмного забезпечення, всі з яких написана нас, людей.
>> І, як ми всі скоро побачите, це дуже легко і дуже типово
помилятися при написанні програмного забезпечення.
І якщо ви не зловити їх, деякі погані речі можуть трапитися.
Тепер іноді, деякі смішні речі можуть трапитися,
або принаймні іноді ми знати, щоб очікувати деякого непридатність.
Так 0 ділиться на 0, з класу школа, як правило, погано.
Це визначено.
І виходить out-- і давайте подивимося, якщо мій мікрофон може підняти це up-- що Apple
було повеселитися з цим останнім часом.
Так у мене є iPhone тут.
Я збираюся поговорити з Siri і попросити її щоб дати мені відповідь на 0, розділений на 0.
Що 0, розділений на 0?
>> Сірі: Уявіть собі, що у вас є 0 печиво, і ви розділити їх рівномірно
серед 0 друзів.
Скільки печиво має кожна людина отримати?
Побачити?
Це не має сенсу.
І Cookie Monster сумно що немає печива.
І ви сумно, що у вас немає друзів.
Девід Дж Малан: Це свого роду неприємний.
Так що це те, що якраз там сказав.
Це невизначеним, це не визначено, І дійсно, багато мов програмування
або, дійсно, компілятори визначити, коли ви, в програмі,
спробувати розділити 0 на 0.
Більше задоволення, ніж це, хоча, це що, мабуть, Cookie Monster
на Twitter в ці дні.
І він відповів на це, з цим, що абсолютно чарівні.
Але давайте швидкий погляд на кілька інших конструкцій,
а потім покласти деякі з цих Код для використання, в хороших відносинах.
Так що виходить, крім для петель, є
те, що називається в той час як цикл, в якому виглядає по-іншому, і реалізується
трохи differently-- і ми в кінцевому рахунку бачити examples--
але в певному сенсі, це простіше, тому що це
не дозволяють ініціалізувати і оновити межах кордону циклу.
Ви все ще можете реалізувати його.
Таким чином, ви можете зробити ті ж самі речі, з час циклу, як і для циклу,
але ваш синтаксис, ultimately-- як ми в кінцевому рахунку
see-- буде відрізнятися.
Там навіть робити той час як цикл, який насправді мало чим відрізняється,
в цьому у той час як для циклу і в той час як цикл завжди
перевірити їх стан по-перше, якщо Ви читаєте цю річ зверху вниз,
це начебто схоже, що це збирається перевірити це умова в минулому, бо це
дійсно останній рядок коду.
І справді, що буде корисно в деяких програмах, які ми пишемо,
якщо ви хочете, щоб просто сліпо зробити щось і в кінцевому підсумку перевіряти стан.
Це не обов'язково погано.
Якщо ми хочемо змінні, ми можемо зробити це в кілька різних способів.
І ми побачили в Фокстрот мультфільм, один зі способів зробити це,
де ви оголошуєте змінну, як INT лічильник коми,
а потім, можливо, later-- наступний лінія, може бути, 10 ліній later--
ви насправді його ініціалізації.
Таким чином, ці 2 рядки коду оголосити змінну типу Int
і назвати його лічильник, так що це дає мені достатньо біти провести Int.
А потім в кінці кінців, він ставить значення 0 в цій змінній.
Це упорядковує розташування 0 і 1 візерунок, що ми знаємо з минулого тижня,
являє собою число, ми знаємо, як 0.
Або, чесно кажучи, ви можете зробити це набагато більш коротко, просто це подобається.
>> Тепер ми також маємо Можливість виклику функцій.
І справді, ось 2 лінія програми чи уривок з нього
що дозволяє нам насправді написати код, який
отримує рядок з user-- багато як наш волонтер на мить ago--
збереження результату в змінна називається ім'я,
і then-- так само, як з нашим волонтером з printf-- друкує ці значення
передавши два аргументи, то Рядок, а потім змінної
називається, ім'я, себе.
Отже, давайте поглянемо, перш, ніж ми повертаємося до Маріо є,
на пару зараз, прикладів.
>> Я збираюся йти вперед і відкрити до, скажімо, функція-0.c.
І, як завжди, цей код доступні на веб-сайті Курсу,
так що ви можете грати разом на додому і подивитися на нього пізніше.
Але ось програма в це Суть, по лінії 17, 22.
Основна програма, де Програма завжди збирається почати.
Ця програма, мабуть, збирається роздрукувати ваше ім'я, двокрапка.
Це те буду називати GetString, так само, як ми зробили з нашими волонтерами.
А потім, це цікаво, він збирається назвати PrintName.
Виявляється, весь цей час, є здається, функція називається PrintName.
Це друкує чиєсь ім'я.
Ми не повинні використовувати Printf від минулих років, є PrintName.
>> Але це омана тому PrintName НЕ
оснащені С. Люди не зробив винайти близько 40 або 50 років тому,
Я зробив, замість цього.
І справді, якщо я прокрутки далі вниз, повідомлення
як я можу написати мій власний функції в С. Ми в кінцевому рахунку
пояснити, чому ми продовжуємо говорити, порожнеча, в декількох місцях,
але на сьогоднішній день, давайте просто подивіться на назву.
>> У рядку 24, якщо ви хочете, щоб створити свою власну функцію,
ви в буквальному сенсі написати найменування функції.
Я вибрав PrintName.
У дужках, ви вкажіть, які види
входів і скільки ви хочу цю функцію, щоб взяти.
У цьому випадку, я хочу, щоб прийняти 1 змінна називається, ім'я,
і він збирається бути тип, рядок, так що це
щоб деяка послідовність символів.
А потім, це program-- так само, як в порожньому,
Ви можете мати користувальницький головоломки pieces-- матиме цей звичай поведінку.
Це збирається подзвонити Printf проходячи, привіт, заповнювач,
а потім він збирається підключити в будь-який користувач називається.
>> Таким чином, це приклад того, що вчений-комп'ютерник буде
Виклик абстракція або функціональний Розкладання, які є просто
химерні способи з saying--, якщо Вам подобається цей високий рівень ідея,
як я хочу, функціональність, друкує чиєсь ім'я, абсолютно ви
може в буквальному сенсі написати Printf, а потім пройти в аргументах, які ви хочете,
і програма буде працювати, як це має, так як в середу.
Але ви можете почати абстрагуватися від поняття друку ім'я.
Ви можете дати йому ім'я, як PrintName, і це
ця ідея шарів від тижня 0.
>> Відтепер я, і ви не повинні знати, або все одно, як PrintName реалізується.
Так, це використовує Printf, може бути, це ні, хто знає, що використовує?
Кого це хвилює?
Тепер я кажу тут, а тут.
І дійсно, як наші програми отримують більш просунуті і складні,
ми збираємося продовжувати приймати як належне що існують більш низькі частини головоломки рівень.
Тому що ми писали їх або хтось інший, так
що ми можемо потім побудувати на них.
Давайте поглянемо на це варіант, для однієї функції.
>> Так що це одне трохи більше розширений, але, виявляється,
що в бібліотеці CS50, в є тільки функція GetInt.
Ми не думаю, що років тому, щоб реалізувати функцію GetPositiveInt.
І це трохи дратує, бо якщо ви, хлопці, пишете програму, де
Ви хочете, щоб отримати позитивний ціле число від користувача,
Ви можете використовувати абсолютно GetInt.
І ви можете перевірити за абсолютно стан і, можливо, петля
якщо INT більше ніж 0 і кричати на користувача
якщо він або вона не дає Ви позитивне число.
Але давайте будувати цей Будівля блокувати себе, а,
користувальницьких подряпин частина, якщо ви будете.
Я збираюся мати програму тут, в кінцевому рахунку, що я
хочу бути в змозі назвати GetPositiveInt, і я хочу бути
можливість роздрукувати все, що ІНТ.
Але це абстрагується далеко зараз.
Це просто дали високий рівень Ім'я, яке говорить, що він робить,
що чудово, тому що це дуже інтуїтивним зараз читати.
А якщо я все одно те, що під капот, дозвольте мені перейдіть вниз.
І це трохи лякає По-перше, в особливості
якщо це ваш перший Програма, але давайте поглянемо.
>> Я більше не кажучи, недійсним, бо це виявляється функції,
так само, як GetString, може повертає значення для мене.
Вони не просто для друку на екрані,
вони можуть насправді передати мені щось ще.
І якщо раніше PrintName, Я нічого не треба назад.
Мені потрібно побічний ефект то з'являється на екрані,
але мені не потрібно людину передати мені що-небудь.
Тут, з GetPositiveInt, як з GetInt,
Я хочу, щоб щось бути передані назад.
Так що я кажу ні, порожнеча, на лінії 23, але INT,
в якому говориться, ця функція що я пишу,
називається GetPositiveInt збирається передати мене ціле, а не нічого,
Не порожнечі.
>> Між тим, він не збирається приймати ніяких Входи, так що я, начебто, його назад.
Я не даю GetPositiveInt будь вхід, я хочу, щоб дати мені свій вихід.
І тоді те, що відбувається зараз?
Так от, як я можу оголосити змінну.
Я зробив це за межами циклу, з причин, ми в кінцевому підсумку бачимо,
але це просто дає мені 32 біт називається, п,
а у мене до визначення їм зберігати ціле.
І ось, що робити, поки конструкції, і це, чому це корисно.
Буквально це зробити, в той час як п менше 1.
Отже, давайте подивимося, що станеться.
Я роздрукувати, будь ласка, дати мені позитивну Int.
Потім я отримати Int, використовуючи CS50-х функціонувати і зберігати в п.
>> І потім, що рядок коду, ймовірно, запускається на виконання наступний логічно?
Який номер рядки?
Так, так 31.
Ви не знаєте це, поки у Вас немає сказали або роду умовиводах,
але це правда.
Само зверху вниз а потім повторює.
Так що, якщо я набрала, скажімо, в число негативний 1, є п менше, ніж негативний 1?
Так.
Тому що негативний 1 менше, ніж 1.
Так що ж сталося?
Я збираюся зробити це в той час як п менше 1,
так що я збираюся повернутися до лінії 28.
>> І кожен time-- і давайте працювати this-- зробити функція 1 скомпілювати його,
і в даний час точка слеш функцію 1.
Якщо я друкую негативний 1, це триматиме на мене кричати
поки я не співпрацювати, бо кожен з моїх входів становить менше 1
а якщо під час менш 1, Я збираюся продовжувати робити це.
Якщо я, нарешті, дати йому номер, як 50, На щастя, він говорить, спасибі за 50.
Чому?
Тому що як тільки п не менше 1, я перестану застрягти в цьому циклі,
і це нове ключове слово сьогодні, повернення, в буквальному сенсі робить.
Так що я просто реалізується, в почуття, що еквівалентно GetString,
де я повертаючи до хто використовує мене, деяке значення.
Це не повинні бути рядок, що це Int.
Таким чином, простий, швидкий приклад, але ми скоро
побачити деякі більш складні версії ще.
Справді, давайте подивимося на цифрова однієї, яка називається return.c.
А це насправді трохи простіше.
Так Мета цієї програми в life-- давайте скомпілювати і запустити його,
тому переконайтеся, повернення, точка слеш, return-- повідомлення
програма просто кубики значення 2.
Це досить нерозумно, важко Код, не приймати будь-які матеріали,
але демонструє інший функція, я написав сам.
Так от, я оголошений Мінлива, називається х, типу Int,
дорівнює числу 2, абсолютно довільно.
Це лише деякі пухнасті друку.
Це говорить х зараз, наприклад, і наприклад, зведення в куб точка точка точка.
І магія, мабуть, у рядку 21.
Я дзвоню функцію під назвою, куб, Я вручаючи йому аркуш паперу
з номером 2, написані на ній, і те, що вартість, математично,
я хочу, щоб вийти з нього?
Так само, як для перевірки відсутності помилок?
8.
Вірно?
Я хочу 2 кубі тому, 2 сила 3, так 8 тому.
>> То де ж куб реалізовані?
Ну, помітили, що це реалізується тут.
І, як і раніше, за логікою, незважаючи на те, що синтаксис, ймовірно,
дуже нової для багатьох з вас, Я хочу цю функцію
передати мене лист папір з міжнар на ньому.
Так у мене є Int, в Назва довільно,
але зручно назвати куб.
Вхідний до нього, це п введіть число, так що
як я можу пройти в номер 2 на аркуші паперу.
А потім з'ясовується, С підтримує математика, так що ви не повинні х для часів,
ви просто використовувати зірочку для множення.
І це повертає п раз п раз п, який є просто значення в кубі.
>> Так куди ми йдемо з усім цим?
Це, безумовно, побіжний тур, будьте впевнені,
що в супер розділах і в задачі набір 1,
Ви будете пройшов через все це ще більше.
І в проблему встановити 1, ми перехід із графічного світі нуля
до чогось більш командного рядка в C. Але ми черпаємо натхнення
з цього тут ігри від минулого, в якому
за допомогою C і стандартна редакція р комплект ви реалізуєте піраміду Маріо.
І в хакерської видання р комплект, якщо ви так вирішите обрати,
Ви реалізувати трохи більше виклик піраміду з двома піками.
Ви також реалізувати Алгоритм, жадібний алгоритм.
Виявляється є деякі цікава логіка
за процесом працює станції касовий
а насправді передачі хто ще зміна.
Існує алгоритм, який досить просто, що ви, можливо, навіть
схопити інтуїтивно, коли ви вперше прочитав it-- розуміючи, що те, що я завжди
зроблено в будь-який час я дав комусь деякі гроші back--, що дозволяє завжди
звести до мінімуму кількість паперові купюри або металеві монети
що ви повертаючи користувачеві.
І це, звичайно, є переконливим тому що, якщо ви йдете в CVS або ще багато чого,
Ви не хочете, щоб бути передані ціла купа одиниць
або ціла купа копійки.
Ви хочете найменше монети, напевно, можна.
>> Нарешті, ви також будете бути оскаржені плескатися в світ води
а насправді отримати оцінку для відображення між темпами течії,
як, вода в душі, тільки, скільки води використовується.
І натяк в ній, буде цей кліп тут,
який ми в кінцевому протягом всього в 60 секунд, що
малює картину душові головки низького потоку.
>> [ВІДТВОРЕННЯ ВІДЕО]
-Добре.
Я отримав всі тут.
Я отримав Cyclone серії F, Гідра, Jetflow, Стокгольм
Supersteam, ви називаєте його.
>> -А Що ви рекомендуєте?
>> -Що ти шукаєш?
>> -Power Людина.
Потужність.
-Як Silkwood.
-Це Для випромінювання.
-Це вірно.
-Тепер Що це?
-Це Commando 450.
Я не продаю що один.
>> -Але Це те, що ми хочемо.
Це коммандос 450.
>> -Ні, Повірте мені.
Це використовується тільки в цирку.
Це для слонів.
>> -Я Нічого платити.
>> -Що Про Джеррі?
>> -Він Не міг впоратися з цим.
Він ніжний.
О так.
[КІНЕЦЬ ПЕРЕГЛЯДУ]
Девід Дж Малан: Гаразд.
От якщо для CS50.
Ми будемо бачити Вас на наступному тижні.
>> СПІКЕР 1: [? Скаллі?], [? Ян ,?] оскільки цей завершальний проект,
що б ви, хлопці, придумали?
>> СПІКЕР 2: Ну, ми дали це розмаїття думки,
і ми думаємо, що кращий спосіб, метою яких
>> СПІКЕР 3: Чи можу я?
>> СПІКЕР 2: Так.
Всіма засобами, насправді.
>> СПІКЕР 3: Так що я думаю ми можемо підвести нашу ідею
для OUTROS з одного word-- нічого.
>> Девід Дж Малан: Нічого?
СПІКЕР 3: Нічого.
Девід Дж Малан: Що це означає?
СПІКЕР 3: Outros є ні про що.
СПІКЕР 2: Ну, я маю на увазі, у філософії, Я маю на увазі, нічого не завжди щось.
СПІКЕР 1: Так what's-- що приміщення?
СПІКЕР 3: Так що це, як життя.
ДОБРЕ.
Що ти робив сьогодні?
>> Девід Дж Малан: Я встав, було сніданок, і прийшов на роботу.
>> СПІКЕР 3: Це Outro.
СПІКЕР 2: Але, я маю на увазі, не повинен щось трапиться з ним на the--
СПІКЕР 3: Ні, ні, ні, ні.
Нічого не відбувається.
>> СПІКЕР 1: Так чому ми дивимося?
>> СПІКЕР 3: Тому що що це Outro для CS50.
>> Девід Дж Малан: Поки немає.