[Powered by Google Translate] David J. Малан: Все правильно, це CS50, і це початку тижня дві. Спасибі. Давайте почнемо ось з телефонного дзвінка. Я збираюся набрати 617-BUG-CS50. CS50: Це CS50. Для Shuttle Boy, натисніть 1. Щоб почати спочатку, натисніть кнопку 9. David J. Малан: Так він сказав на Shuttle Boy, натисніть 1. Таким чином, ми збираємося натисніть 1. CS50: Яке ваше походження? Для чотирьох, натисніть 1. Mather, натисніть 2. Boylston, натисніть 3. Ламонт, натисніть кнопку 4. Сувеніри зал, прес 5. Щоб почати спочатку, натисніть 0. David J. Малан: Ми будемо натисніть 1 для чотирьох. CS50: Наступний шаттл йде в цю саму хвилину в PM 1:10 і Потім в 1:20 вечора, 1:30, 1:40 вечора. Це CS50. David J. Малан: Так що це голос CS50 в. І це приклад виду остаточного проектів, Наприклад, ви можете відкусити до До кінця семестру. Наприклад, що shuttleboy.cs50.net існує - насправді проект, який я вперше написав після того, CS51 тому, коли я був студентом. І натхнення тут було тоді, все, що вони мали, було друковані автобус розклад, і не було Поняття шукає речі в Інтернеті. А так я начебто голуба в один уїк-енд, налив через друкованої графіку, і переніс його в комп'ютерній програмі. У той час, комп'ютерна програма трапилося бути написано в C. І ви насправді втік, ввівши Shuttle Хлопчик на блимати підкажуть, як ми робили досі. Але за ці роки, вона перетворилася на мить повідомленнями бот. Вона перетворилася останнім часом в цьому веб-сайті, в SMS-інструменту, а також в цей голос-інструмент. І це натякнути на види речей, які ви можете зробити для себе до кінця семестру. Наприклад, там, версія СМС Shuttle Boy відбувається працювати як слід. Якщо, на ваш мобільний телефон, відправити текстове повідомлення на 41411 і потім відправити спеціальну sboy символ, для Shuttle Boy, слід А і В, де А і B походження є пункт призначення - Наприклад, Boylston космічної Quad - те, що ви повинні повернутися протягом декількох секунд текст Повідомлення від Shuttle Boy кажу вам точно, коли Наступні кілька шаттли, з цієї точки збираюся, що точці В. І це більш загальний приклад того, що відомо як використанням API. Так, наприклад, це тут просто shuttleboy.cs50.net, фактичний веб-втілення цього. Але дані, які підкреслюють цю та інші програми, які CS50 розроблені всі піддані всім тут у вигляді з API-інтерфейси, інтерфейси прикладного програмування. І це тільки химерний спосіб сказати, що люди, як ми на Інтернет та інші провели деякий час на створення Програмне забезпечення, яке можна використовувати для того, щоб отримати дані від нас і потім побудувати програми поверх цього набору даних. Так, наприклад, цей API Shuttle Boy сторінці тут, які виявляється в CS50 керівництва, по суті документів як ви можете йти про з'ясування CS50 сервери для зберігання даних. Наприклад, якщо ви знайомі з CSV файлами, кома значення, розділені, це просто як би швидко і брудно Excel-подібні файли. Таким чином, ви можете попросити Shuttle Boy для всіх даних на всіх будинків і їх GPS координати, і ви отримаєте тому, по суті, електронними таблицями так, що Ви можете читати в програму власних, а потім отримання результатів, як Shuttle Хлопчик сам , Трапляється, роблять. Для тих, хто більш знайомі, більш сучасні уявлення даних включають JSON, JavaScript Object Notation. Щось прийде до вас на До кінця семестру. Але знову ж, це всього лише одна з кількох власних API, CS50 в. І захоплююча річ зараз, у ці дні, Facebook і Twitter і Google, і майже кожен з популярного веб-сайту там є якась API, який означає, що якщо ви читаєте Документація на їх сайті, ви підпишіться на облікового запису, ви можете почати писати програми на вершині всі інструменти і дані, які надає компанія існує. І ось один з наших хлопців викладання пару років тому написав версію Mac про це. Таким чином, по посиланню під назвою Mac тут, в лівому верхньому куті, ви можете насправді скачати віджети Mac OS, яка працює на власній Mac, щоб зробити такі ж речі. Так що це все про будівництво у верхній частині набору даних, як ці. Але про це в кінці семестру. Так давайте поринемо в реальному швидко помилка, просто щоб отримати вид речі розігрівається сьогодні, і згадати про деякі речі, які ми подивилися на минулому тижні. Зокрема, дозвольте мені йти вперед і виривати, скажімо, цей приклад тут. Buggy1.c, це доступно на веб-сайті Звичайно, якщо ви хочете хотілося, щоб завантажити його і тикати навколо себе. Але давайте збільшити тут, на цьому досить коротку програму, а просто Супер-швидке повторення деяких з основних будівельних блоків, які ми дійсно збираємося просто почати приймати як належне. Таким чином, сині речі, в рядках з 1 по 9, всього лише софтбол питання. Так що це просто коментар. Вони не мають ніякого функціонального сенсу. Але вони коментар в тому сенсі, що вони зазначається, що Я, людина, зробив собі так, що в лекції і після лекції, я можу фактично пам'ятати, що ця програма не обходиться без того, щоб прочитати його рядок за рядком і відтворення історії, на мій погляд. Більш того, якщо я вручаю цю програму, щоб хтось інший, як Вас, це набагато ясніше для вас, тому що коментарі, як це, те, що програма насправді роблять, або, принаймні те, що Програми повинні робити. Чи ні, це правильно, це зовсім інша справа. Тепер, С, багаторядкові коментарі, згадаємо, що на лінії один тут є магічним символом, / *. Це означає, що ось іде початок коментаря. І ніщо інше не має значення, поки ви не дійдете до кінця термінатор, який * /, навпаки. Тому той факт, що у мене є 80-дивні зірки тут з Зліва направо насправді просто естетична деталь. Він не має функціональне значення. Тепер, як про лінії 11? Що це робити з точки зору непрофесіонала? Що це? АУДИТОРІЯ: Включає в себе стандартний. David J. Малан: Добре, добре. Таким чином, вона включає в себе бібліотеку stdio.h. Так що ж це значить? Ну, всередині цього файлу, stdio.h, які цілий букет Функція декларації - тобто код, який написав хтось інший. І прекрасний приклад функції, яка оголошена в stdio.h це - яка коханий зараз? Так Printf, одним з найбільш поширених з них використовувати, звичайно, на ранній стадії, з цієї бібліотеки є. Якщо я виключаю, що рядки коду, Clang буде кричати у мене щось про використання неоголошених символ. Щось неоголошеної, напевно, ключове слово, тому що Ми не повідомив компілятору, що виглядає Printf подобається, якщо ми включимо цю лінію. І ще на Землю, насправді, те, що ця лінія кажу, відкрити цей файл, stdio.h, де він знаходиться на сервері жорсткий диск або жорсткий диск приладу, і скопіювати його тут же в моєму файлі, без мого того, щоб зробити це вручну. Тепер, коли ми приступимо тут до основної, незабаром ми розпочнемо дражнять один від одного, що Int і те, що порожнеча. Але зараз, давайте подивимося на три лінії в межах від 15 до 17. Такий ось я стверджую, як баггі. Лінія 7 в своєму коментарі говорить: "Повинна друку 10 зірочками, але не ". Чому це не друк, насправді, 10 таких зірок? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Абсолютно вірно. Таким чином, помітили, що ми починаємо вважати від 0. І це насправді конвенції в галузі програмування і комп'ютерні науки в цілому, починаючи розраховувати від 0 замість 1. І це дійсно просто випливає з того факту, що для Наприклад, коли у нас було вісім чоловік на сцені, коли ніхто не піднімав свої руки, вони були Всі ефективного нулі. А так це просто вид комп'ютера конвенції, з тим, Таким чином, щоб почати відлік з 0. Якщо це найменше число можна представити у двійковому вигляді. Так от ми почали ініціалізації я до 0. Ми встановили я дорівнює 0. Але потім я зробив цю помилку тут, кажучи, що я менше або дорівнює 10. Але якщо ви думаєте, що за допомогою, якщо у мене починаються з 0, а потім я йду до 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, на самом деле я збираюся роздрукуйте 11 зірок на екран, тому що я виросла до і дорівнює 10. Так легко виправити, от тоді це що? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: просто змініть його менше. Якщо ви дійсно хочете, ви можете зробити це. Але в цілому, це осудливо. І так починаємо рахувати від 0 лише то ви повинні Зазвичай звикнути. Тепер, що вся ця конструкція сама по собі? Ця лінія 15 demarks циклу. Так, не є функцією. Це просто заява. Це циклічної конструкцією, як ми бачили в Scratch. І вона складається з трьох частин. Зверніть увагу, що це перша частина, щоб Зліва від крапки з комою. Там в середній частині між двома точками з комою. А тут ще права частина праворуч друга коми. Тепер, перша з цих що робить? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Back туди? Так? АУДИТОРІЯ: ініціалізація. David J. Малан: ініціалізація. Так що ж це значить? Ми оголосили змінну я. Це типу INT, тому що я вказав Int я. І я ініціалізації я зі значенням 0. Так що ж це насправді говорив? Це фактично говорить на комп'ютер Гей, дай мені достатньо пам'яті, достатній об'єм оперативної пам'яті, щоб відповідати ряду, а потім покласти номер 0 в тому, що шматок пам'яті. І як в сторону, наскільки велика Int зазвичай, принаймні всередині з приладу? АУДИТОРІЯ: 32 біт. David J. Малан: 32 біт. Значить, мені 32 біт, інакше відомий як 4 байти, і помістити значення 0 в ньому, що досить легко, тому що Це просто означає, встановити всі біти в 0. Так от, друга частина тут є стан. І стан, як випливає з назви, є те, що перевірено знову і знову, і знову, чи буде це правда чи брехня. Так що це просто кажу, виконайте такі рядки коду - а саме рядок 16, тому що це єдиний відступом внизу - Поки я менше 10. І після кожної ітерації цього циклу, зробіть прирощення, яке в даному випадку я + +. Тепер, вона не повинна бути я + +. Це може бути я -. Але якщо б я зробив це, то, що поведінка збирається щоб бути ця програма? АУДИТОРІЯ: Це буде нескінченний цикл. David J. Малан: Це буде свого роду нескінченний цикл, якщо нам пощастить після негативного 2 млрд чи близько того. Може бути, все буде обернути навколо, просто за своєю природою кінцевої число бітів, які ми виділили для внутр. Але це, звичайно, збираюся повторювати набагато більше, ніж 10 і звичайно, більш ніж в 11 разів тут. А тепер, як і в бік, розумієш, що я + +, і я - насправді просто синтаксичний цукор. Це просто скорочений запис для того, що трохи більше явно записати наступним чином: I = I + 1. Тобто ідентичні я + +. Це просто якась виглядає гарніше сказати, що я + +. Це більш лаконічним, більш читабельним. І тому більшість людей роблять це замість цього. Але це ідентичних функціонально те, що ми тільки що бачили. Коротше кажучи, швидких рішень тут просто сказати, я ітерація від 0 до менш ніж 10. І тоді ми дійсно отримаємо 10 зірок. Так давайте спробуємо це. Дозвольте мені відкрити термінал в нижній частині. Дозвольте мені перейти до каталогу, що це дюйма І я збираюся зібрати його вручну за допомогою Clang на даний момент. І я збираюся зібрати це як buggy1.c, Enter. А тепер buggy1, чому немає такого файлу або каталогу buggy1 називається? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Так. Так що це насправді називається a.out. Так Нагадаємо якщо ви просто запустіть Clang, де Clang є компілятор, а не вказати ім'я, яке ви хочете дати вашої програми, це буде за замовчуванням a.out. Так адже якщо я Ls - упс. І я didn't - чорно-білий питання деякі з Ви стикалися була виправлена. Але дозвольте мені зробити це. Там у нас є a.out на лівій стороні. Тому ми повинні працювати a.out замість buggy1. Отже, дозвольте мені йти вперед і робити це. . / A.out, Enter. І я, мабуть, не робити? АУДИТОРІЯ: Зберегти. David J. Малан: Врятуйте мою файл. Так що легко вирішується, натиснувши Control S, або збирається Файл, Зберегти як і в більшості програм. Відпусти мене сюди, очистити екран, запустіть його знову. І є ще помилка. Так що ж відбувається - АУДИТОРІЯ: Ви не компілювати. David J. Малан: А, добре. Я не компіляції. Як ідіот, я дивлюся на код, щоб подивитися, що трапилося. Таким чином, брязкіт buggy1.c, тепер a.out. І уф, збережені. Так це виглядає трохи потворно, тому що немає нової лінії в якому місці програми. Але знову ж, це тільки естетична деталь. І принаймні, якщо вважати ті, ми повинні тепер бачимо 10 таких зірок. Ну, що ця друга розминка, наприклад? Таким чином, в buggy2, я стверджую, що ця версія теж буде друкувати 10 зірок, по одному на рядок. Тому цього разу, у мене є символ нового рядка, просто щоб переконатися, речі трохи красивішим. Але замість того, що я отримую це. Отже, дозвольте мені зробити брязкіт buggy2.c, Enter. Тепер він знову закликав a.out. Enter. Я бачу тільки одну нову лінію, тільки сама остання нова лінія, яка переміщує моє запрошення на наступний рядок. І все ж ясно я печаткою *, то нова лінія, *, Те новий рядок. Але те, що помилка тут? Так? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Абсолютно вірно. Таким чином, на відміну від деяких мов, як Python, де відступи насправді має функціональне значення, в мову, як C - Як ми побачимо, PHP, JavaScript - відступ насправді просто для користі людей. Тому той факт, що я червоний рядок 16 і 17 відмінно виглядає, але він не має функціональне значення тут. Якщо я хочу обидві лінії для виконання як частина для петля, то я повинен вкласти їх у фігурні дужки, роблячи це. Ви можете тільки скоротити цей кут і опустити фігурні дужки, якщо в чому справа? АУДИТОРІЯ: Тільки один рядок. David J. Малан: Тільки один рядок. Ось тільки вигляд гарний вид синтаксису докладно, щоб Ви не витрачаєте час на написання три лінії, дві з яких є фігурні дужки, лише б написати жодного рядка коду. Але якщо у вас дві або більше ліній, ми дійсно потрібно це зробити. Так що тепер дозвольте мені зберегти це. Дозвольте мені йти вперед і повторно запустити Clang. Тоді дозвольте мені повторно a.out, і тепер я отримую їх по одному на рядок. Тепер, a.out знову це свого роду німий ім'я для програми. Як я можу сказати Clang насправді дати мені ім'я файлу , Що більш зручно, як buggy2 себе? Ще трохи ясніше? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: ОК, так що я можу насправді взяти дуже зручний ярлик і просто написати зробити buggy2. Я не уточнюють. C в цьому випадку, і натисніть Enter. І те, що робить робить, він компілює buggy2.c для мене Clang просять це зробити. Зокрема, він називає Clang, він працює Clang використанні набагато більше, Аргументи командного рядка або перемикачі, ніж я насправді потрібно. У свій час ми повернемося до того, що всі ці різні загадкові вираження через дефіс означає. Але зараз, ось тільки що врятував мене від праці того, щоб пам'ятати і того, щоб вводити всі ці різні дефіс виразів. І верх в кінцевому підсумку і є що тепер у мене є buggy2. Якщо я хочу зробити це вручну, хоча, я може замість цього - брязкіт-про buggy2, а потім buggy2.c. І це буде так само дати мені файл з ім'ям buggy2. Коротше кажучи, Clang це компілятор. Зробити це просто зручний інструмент, який ми будемо використовувати більш і більше, тому що вона тільки починає спростити речі для нас. І ми повертаємо 0, нарешті. На даний момент, тільки тому, що, але ми почнемо дражнять, що частина Сьогодні і в середу. Будь-які питання по будь-якій з цього? Так? АУДИТОРІЯ: [нерозбірливо] Ls в лапках там? David J. Малан: OK. Коли я набрав Ls в лапки, що було мені робити деякі магії за лаштунками, щоб виправити помилку. Я забув, як ми говорили багато хто з вас на дошки обговорень робити - Ми зробимо це зараз - Суду ням-у оновлення appliance50. Ой, що це пишеться справа. Таким чином, прилад, як операційна система. Це працює ця операційна система під назвою Fedora. А тепер через мою повільне підключення до Інтернету, у мене дійсно обливали його. Так працює Суду оновлення ням, як ми говоримо вам, щоб зробити в Проблема набору, по суті, як працює автоматичне оновлення У Mac OS або Windows. І причина для виконання цього на самому початку Проблема набору тому що, коли ми створили прилад, я переплуталися, і я випадково зробив всі Ваші програми виглядають чорне на чорному екрані, який є, чому ви не бачите їх за замовчуванням. Але остання версія приладу фіксує це. І я полагоджу, що під час перерви, коли я в Інтернет підключення. Таким чином, котирування просто приховує свою помилку, дуже обережно, по-видимому. Інші питання? Так? АУДИТОРІЯ: Де зробити взялося? [Нерозбірливо] David J. Малан: Хороше питання. Де зробити взялося? Це Linux програма, яка існує вже багато років, задовго Перед CS50. І він приходить з операційної системи, як Fedora. Він не приходить з CS50 бібліотеки. Насправді, єдине, що від CS50 бібліотеки до цих пір, що ми бачили, є GetString, GetInt, всі Отримати ці функції, і слово рядка, і деякі ступеня, слово BOOL. Але ми будемо дражнити, що, крім, коли ми зануримося в CS50 сам прилад. Так що, так, ще одне питання. АУДИТОРІЯ: Коли ви сказали зробити, а потім баггі, яким чином комп'ютер знаю [нерозбірливо]? David J. Малан: Хороше питання. Отже, коли ви просто запустіть зробити buggy1 або зробити buggy2, як робить знаєте? Таким чином, за замовчуванням, якщо ви введете зробити buggy1, зробити вигляд для Файл називається buggy1.c. І тоді вона виконує відповідні команди Clang, тим самим перекриваючи файл за замовчуванням, вихідний файл з ім'ям a.out. У самому справі, якщо ми подивимося на те, що зробити, що - Давайте вийти з цього. Якщо ми подивимося на те, що робить насправді роблять, роблять buggy2, він вже в курсі. Отже, дозвольте мені видалити RM команди, програми я написав раніше. Введення Y-E-S, щоб підтвердити, що я хочу, щоб видалити його. Якщо я зараз робимо, зверніть увагу, що в цій дуже довгої лінії, Тобто це остання річ тут,-про buggy2. Всі роблять це робить, до речі, що аргумент, так би мовити, Clang, так що я не доведеться вводити його собі. Гаразд, пару швидких адміністративних оголошеннях. Таким чином, для розділів, які офіційно почалися майбутній Неділя, ви завжди хочете принести, якщо у вас є, ноутбук. Якщо у вас немає ноутбука, не дотягнутися до мене падіння мені листа. І ми будемо з'ясувати робочого процесу. Що взагалі ви знайдете в розділі є те, що вони є частиною концептуальних, частина практичний. Ми спеціально використати частину питань, частина з Проблема тижня набору, щоб пройти через деякі з концептуального матеріалу лекції. І це все, що в поточному наборі проблеми. І ми також зануритися в деяких практичних діях, іноді які повинні будуть бути представлені, іноді яка не буде. Наприклад, це перша тиждень, вони призначені як розминку вправи. І ви побачите, що ці проблеми дійсно так. Вони призначені, щоб бути досить маленьким, але не обов'язково тривіальних програм, щоб написати, що не обов'язково захоплюючих і самі по собі, але хороші можливості для практикуватися з синтаксисом, з новими функціями, в комфорті розділ, де у вас є кілька своїх однокласників представити у вигляді а також ваші TF. І що ми будемо робити протягом довгого часу, це використовувати інструмент під назвою CS50 простору, якої замість простого використання CS50 Appliance, ви Замість переходу на веб-сторінку в браузері, де ви зможете писати код, у вікні браузера при розділі. І потім, якщо ви виберете, ваш хлопець навчання можна показати, те, що це ви друкуєте на екрані у Вашому браузері вікна на фронті класу, будь то анонімно або публічно, так, щоб він або вона може пройти через с однокласниками, що ти зробив добре, що ви не дуже добре. І ще, будьте впевнені, все це може бути красиво видається. Але це буде хороша можливість для набагато більш інтерактивності, ніж щось подібне лекції дозволяє. У той же час, ми будемо мати ці речі називають супер розділам, які не є обов'язковими, але відкриті для всіх в клас, так що ви можете зробити це в сукупності для більш Проблема встановити один. Ось графік. Це також розміщена на домашній сторінці cs50.net. Зверніть увагу, що там буде хакера конкретних завтрашній день. І ми будемо знімати до сьогоднішнього дня і одну завтра, і опублікувати ці Інтернет протягом 24 годин. Так що, якщо ви не можете зробити будь-який з цих часів, аби не хвилюватися. І знову, розклад на форумі в cs50.net. З точки зору секціонування себе, ви повинні були отримати по електронній пошті з інструкціями по перейдіть на головну сторінку курсу, щоб знайти Ваші розділі. Якщо життя змінилося, і ви повинні змінити свій розділ, не проблема. Поверніться в той же URL, cs50.net/section, єдине, і ви будете заповнити подібну форму, так що ви можете Потім дайте нам ваші уподобання. І ми будемо слідувати до до кінця тижня про те, що ми можемо розмістити. Минулого тижня, нагадаємо, що ми запропонували використовувати Обговорити CS50, обговорення курсу інструменту, в лекції. Так що ми були на 40 запитань, які були задані і відповів під час лекції. Так що, здавалося, працювало добре, тому ми продовжуватимемо намагається це зробити. Якщо під час лекції, ви не просто відчувати себе комфортно підвищення Вашу руку, не проблема. До cs50.net/discuss, розміщувати там, і один з наших навчання стипендіати будуть або відповісти на нього в електронному вигляді або підвищити їх руки від вашого імені анонімно, щоб запитати, в залежності від характеру питання. І з точки зору зворотного зв'язку, як правило, psets буде повернуті протягом тижня. Тому що це займає деякий час для секцій для досягнення рівновазі, перші PSET, 0 і 1, буде трохи відкладено, оскільки речі заспокоїтися. Але слідкуйте за оновленнями, що в найближчі тижні. Гаразд, так що дозвольте мені поставити на мій серйозний Голос на мить. Так що це насправді цікавий клімат, щоб бути мають цю дискусію, що з усіма іншими речами відбувається на території кампусу, що відносяться до них. Але CS50, безумовно, були свої історії даного теми, в тій мірі, кожен рік, це, звичайно, для багатьох років, Ad-плати приблизно на 3% в класі. Це самий останній рік, 2011, CS50 Ad-сіли 35 студентів. Це не так, я думаю, через відсутність ясності. Зрозумійте, що в програмі курсу, є сторінки заяву, що пояснює, де лінії. У тій же заяві повторюється на кожному з Проблема задає на першій сторінці. Тому я говорю про це сьогодні на самом деле просто зробити Люди пам'ятати про це. І ми спробували різні речі. І те, що я думав, що ми робимо сьогодні просто скористатися моментом, щоб реально поглянути на деякі з минулих справ, які придумали. Замість того, щоб тримати їх як брудні маленькі секрети, насправді Відзначимо, що студенти зробили і як ми виявили він і справді, що всеохоплююча мотивації для навіть ця розмова. Таким чином, з урахуванням сказаного, лінії по суті це - Згідно з програмою, ви вітається, рекомендується, щоб поговорити з однокласниками. Ось і весь сенс наявності цих спільних Прийомні години в Annenberg і заохочення людей до Остаточний проект для спільної роботи. Але лінія, коли приходить час, щоб дійсно написати ваше остаточне рішення. Говорячи англійською, абсолютно нормально, виступаючи в псевдо-код, абсолютно нормально. Відправка вашого однокласника PSET, дозволяючи їм виглядати більш Екран, як руки продовжують друкувати, на лінії, а також. Ви подивіться на програму для конкретної лінії. Але тільки, щоб намалювати картину того, як це, на жаль, реальність, розуміють, що є сайти, які там мають рішення цього класу і багато інших класів. Справа в тому, що ви або близько 3% з вас знають, що це таке означає, що ми знаємо, що це існує. Справа в тому, що є сайти, як ця, де ви може платити комусь, щоб насправді зробити ваш безлічі проблем - це було реальний випадок, який придумав в минулому році. Це веб-сайт під odesk.com. І Тіму було ім'я людини, хто був на оголошення по цьому сайту і запитав когось, щоб зробити його PSET 7 в даному конкретному випадку. Ну, odesk.com дуже Google-можливості, і ми теж дуже добре на пошук в Google. Тут теж є сайти - і це одна досить звірячий, чесно кажучи. [Сміх] David J. Малан: Найсмішніше про цей сайт, якщо Ви читали про сторінку, вони говорять про свої корпоративні культура і як обслуговування клієнтів є їх номер один пріоритет, щоб переконатися, що ваші завдання отримаєте Виявилося вчасно. Але з усією серйозністю, знову ж таки, той факт, що ці сайти існує, розумієте, ми теж обізнані про ці види сайтів. І щоб дати вам відчуття того, що це в цілому утворює бере, ми взагалі не мають великої скандалів, де люди співпрацюють в будь масовий, а швидше саме ці нічні хвилини слабкості, коли у вас так багато належить зробити, це 4:00 ранку, ви вичерпані, і ви думати про себе, ну, дозвольте мені глянути на моє сусіда або код мого друга або тому подібне. І прояви цього, на жаль включати Студентська Поданні щось подібне до цього й уявлення студентських B щось на зразок цього, що, безумовно, в комп'ютері наука класу, дивно легко для комп'ютерних вчених виявити за допомогою програмного забезпечення. Це ще одна спільна парадигма, де ви роду працював поруч з кимось, може бути, кажуть у Англійська, просто відмінно, псевдокод. Але потім приходить час, щоб дійсно уявити, і psets просто отримати обмінялися по електронній пошті або Dropbox або тому подібне. Але в спробі зробити його менш очевидно, що це що сталося, то це те, що представлено. Це теж не спрацював до добре написані шматки програмне забезпечення, як ми є насправді виявлення такі речі. І справді, що ми робимо, це запустити програмне забезпечення, яке порівнює всі У цьому році в уявленнях проти всіх минулому році уявлень, проти всього, ми знайшли на Інтернет, проти кожної роботи сайту там. Це все дуже автоматизовано. І так ми робимо це дійсно велика справедливості по відношенню до 97%, які дійсно працюють їх дуп в цій та в інших Класи і покласти у всіх цих зусиль, так що робота в кінцевому рахунку вони представляють, є їх власними. І я можу піти на цілу вічність. Це всього лише кілька випадків у минулому році. Кілька студентів представили ці файли однаково для PSET 2, PSET 3, PSET 4, PSET 5, PSET 6, PSET 9. У цьому випадку, це був тест 0 і в минулому році, коли два Студенти представили однаково це пропозиція серед багатьох інші ", запит типу -" точка, точка, точка. Таким чином, навіть у класі з 600 чи ми виявити цю на представлених вікторини. Коротше кажучи, це - чесно кажучи, я дуже не хочу мати таку розмова - але це дійсно цілеспрямовані зусилля У цьому році, щоб спробувати знизити цю цифру. Тому що навіть якщо ми говоримо такі речі кожен рік, я думаю, що реальність в тому, зупинився на ньому протягом декількох Ще секунд ніж зазвичай, і насправді просто вказуючи що те, що може здатися, що ль, не така велика проблема, принаймні, згадую цей момент, як в справедливості по відношенню до себе і своїх однокласників тут. Так що якщо ви коли-небудь у вас виникли запитання про те, де лінія це, будь ласка, просто вийти на мене особисто. Але відповідь завжди, повністю підкреслили в останню хвилину, грошові кошти в кінці дня. Або, якщо це справа не маючи ніякого кінця днів, чесно кажучи, напишіть мені особисто. Ми що-небудь придумаємо. Будь ласка, не ставте свій час тут, в Гарварді в небезпеці. Тепер, я думав, що ми повинні підняти настрій, тому я включити це як наступний слайд. [Сміх] David J. Малан: Цей сайт був великим. Я насправді стало трохи відволікся. Там в це. А потім цей був дивовижним. Гаразд, думаю, що Кошеня пізно ввечері, коли робити ці рішення. Гаразд, повернутися до більш приємним і менш серйозні речі, як умовах. Добре, таким чином, ми коротко говорили про це. Це те, що, напевно, добре знайомі з Світ Scratch. І в світі Scratch, у нас є ця потреба іноді піти зробити розвилки. Або зробити те або це, або це інша річ тут. І коли ми хочемо це зробити, ми можемо використовувати в C зараз, це, якщо ще побудувати. А то ось у нас є логічні вирази. Наприклад, логічні вирази тут, ми можемо або їх разом, в тому сенсі, що у нас є ця умова або це умова. Ми можемо і їх разом, в тому сенсі, що ми хочемо перевірити цей стан і ця умова. І тут у нас є перемикач заяву зараз, що це не так синтаксично схожі на ті види умов, але дозволяє нам робити еквівалент, якщо, інакше, якщо, інакше, якщо ще якщо тощо просто перераховуючи їх індивідуальної від випадку до випадку. Таким чином, ми побачили тих, хто минулого разу. І тоді ми почали торкаючись речей, як петлі. Ми бачили одну з цих мить назад. Але є ці інші циклічні конструкції. Наприклад, це тут. Так що поки (умова), зробити цю річ знову і знову. Таким чином, принципово, що, здається, різних між цим цикл, і це в той час як петля тут? Цей цикл, і це в той час як петля. Так? Що це? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Добре. Таким чином, у той час як у циклі умова, там чітко більше синтаксису. Там ця ініціалізації, там це оновлення. У той час як цикл, там просто це умова. Тому здається, що це трохи урізаний в порівнянні з для цикл, який означає, що якщо ми хочемо мати змінні, і ми хочемо мати прирощення, ми насправді потрібно цього зробити самі. Отже, дозвольте мені йти вперед і відкривати Gedit. Дозвольте мені перейти на прилад. І давайте просто зробити швидкий маленький приклад, що відрізняє одне з них від іншого. А в глибині моєї свідомості тут, я повинен сказати одну річ. Я спеціально згадав ім'я Тіма. Тім був насправді хтось, що студент намагався знайти, щоб зробити домашнє завдання для них. У нас не було Тіму в даному розділі. Так розумію, щоб мені не розкрито студентом, це був не студент. Це був випадковою людиною в інтернеті робити речі за дорученням у минулому році. Таким чином, ми бачимо, що, теж. Тому в даному випадку тут, дозвольте мені йти вперед і відкриває новий файл. File, New. Це дає мені вкладці тут. Дозвольте мені йти вперед і зберегти його як loop.c. Дозвольте мені піти і натисніть кнопку Зберегти. А потім сюди, давайте йти вперед і почати писати # Включити . Дозвольте мені змінити масштаб зображення Тепер ми будемо робити Int основних (недійсними). Тепер дозвольте мені йти вперед і робити для (INT = 0; I < ой, 10; я + +). А зараз я збираюся йти вперед і не друкувати зірки, що я робили раніше. І тоді в кінці цій програмі, ми просто збираємося Друк на новий рядок, просто так, що мої рядки не виглядає брудним. повертати 0. Здавалося синтаксично правильні? До цих пір. Отже, давайте подивимося. Отже, дозвольте мені масштаб, перейдіть в моєму вікні терміналу. І дозвольте мені йти вперед і запустити цикл, тому що я назвав цю річ loop.c. Так що зробіть петлю. Здається, для компіляції OK. Дозвольте мені запустити цикл, і тепер Enter. І це, здається, надрукований 10 зірок. Так що давайте просто перетворити це в той час як цикл і подивитися, що види питань, які ми спіткнутися. Таким чином, замість цього, відпусти мене сюди і сказав, поки я є менше ніж 10 - Дозвольте мені позбавитися від циклу. Отже, у нас є кілька проблем вже. Таким чином, умови ті ж, але я явно не вистачає ініціалізації. Мені не вистачає прирощення. Так що ж компілятор ймовірно, скажи мені, коли я намагаюся скомпілювати цю програму? Так? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Добре. Таким чином, він збирається сказати щось на зразок неоголошеної - в цьому випадку, змінна я. І дійсно, використання неоголошений ідентифікатор я. І це на відміну від мов, таких як PHP і Python і Ruby, з якої деякі з вас можуть бути знайомі, де ви можете просто якась початку використання змінних волею-неволею, а не доведеться турбуватися про оголошення їх явному завжди. У C і в мовах, як Java і C + +, ви повинні бути Супер явним. І якщо ви хочете змінної я, ви повинні сказати мені, які змінні він. Таким чином, ми будемо мати, щоб виправити це таким чином. Я збираюся піти вгору тут і введіть Int я, отже, Я оголосив змінну я. Тепер, я пропустив один крок. Я, очевидно, не ініціалізувалися, але давайте подивимося, що в мірою робить Clang припинити скаржитися. Отже, дозвольте мені переробити цю програму. Гаразд, зараз це просто скаржитися з іншої причини. "Змінна 'я' не ініціалізований при використанні тут". Ладно, це досить явно. Initialized просто означає, поклавши її рівної цінності. І ми не зробили цього, тому дозвольте мені спробувати дорівнює 0. Тепер давайте спробуємо це знову і знову запустити Clang. Укладач цього часу. І я збираюся запустити його. Але великий старий нескінченний цикл, тому що я зробив ініціалізації, я зробив стан, але я ніколи не робив будь приріст. Так як же я можу зробити прирощення? Ну, в той час як цикл, він відчуває, як я буду мати зробити це всередині циклу, тому що так само, як перший тиждень прикладів роблять циклічних конструкцій, як з шкарпетках і з власним рахунку, ми повинні були зробити щось в самому кінці, хотілося повернутися до наступного рядка. Що робити, якщо я йду вперед і роблю це я + + тут? Давайте навіть не компіляції цього. Злови мене вже. Що тут не так? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Так що це безумовно не Int. Це я. І фігурні дужки, як і колись, відступ не достатньо. Так що тепер я цю конструкцію. Так що, хоча я менше 10, роздрукувати зірки, Потім збільшуємо я. І те, як час циклу робіт є те, що, як тільки ви натиснете Наприкінці циклу, який в даному випадку виглядає як лінія 10, він збирається повернутися в рядку 6, в який момент Умова буде ще раз перевірено. І якщо я все ще менше 10, ми зробимо лінії 8 і то 9, то ми вдаримо 10, і поверніться до 6, знову і знову і знову, і знову, поки я менше 10. Так що давайте повторно запустити зробити тут. Гаразд, ми зібрали все гаразд. Дозвольте мені повтор циклу. І тепер він насправді, здається, працює. Таким чином, плюси і мінуси тут? Ну, до цих пір там насправді не все ООП - так мило. Гаразд, що було - Ах, це був нещасний випадок. Гаразд, давайте повернемося до цикл. Таким чином, для петлі гарні, тому що вони дуже чітко. І хоча вони трохи незграбним, щоб написати, що це дуже потужний, і це дозволяє зробити кілька речей відразу. У той час як петлі, здається, не мають величезну суму вартості всього Поки, тому що вона відчуває, що ми просто повинні робити більше роботи. Ми повинні поставити ініціалізації тут, оновлювати сюди, і ми повинні пам'ятати, щоб робити все це. Таким чином, ми побачимо в часі, в той час як насправді петлі надають себе просто різні контексти, різних даних структур, як списки і хеш-таблиці, то, що ми доберемося до середині семестру. Але зараз, знаю, що є цей третій тип, відомий як DO- час циклу. І ми бачили це ненадовго. І це може бути дуже корисним з PSET 1. Кожен раз, коли ви хочете щось зробити, а потім перевірити, якщо Користувач співпрацювали, і якщо вони цього не зробили, зробити це знову, робити- час циклу піддається такій логіці. Тому що, як замовлення згори вниз тут припускає, зробити буквально означає це зробити. І робити це знову і знову, що це може бути? Може бути, це означає виклик GetInt або GetString, а потім перевіривши значення GetInt або GetString, а потім кричати на користувачів, якщо вони не співпрацювали, попросивши їх знову і знову, і знову. Якщо ви хочете зробити щось один раз, Потім перевірити деякі умови. Так давайте спробуємо це. Дозвольте мені насправді змінити цю ситуацію на DO-циклу. І я збираюся піти далі і зробити наступне. Таким чином, виконайте такі дії. Давайте зробимо Int я = GetInt (), але давайте спочатку повідомити користувачеві що робити. Так мало чим відрізняється цей раз. "Дайте мені Int". Так що я буду використовувати Printf для цього. А тепер я піду сюди, і я збираюся це зробити в той час як я є, скажімо, більше - Давайте подивимося, у мене є, скажімо так, менш ніж 0, або я це більше 10. Іншими словами, я хочу число від 1 до 9, всього довільно. Так що я за допомогою комбінованого логічне вираження для переконатися, що я менше 0 або більше 10, в якій випадку я буду робити цього циклу тут знову. Отже, ще раз, зробити це - а я менше 0 або я більше 10. А тепер давайте йти вперед і зробити це один раз ми зробили це. Давайте просто зробити швидку перевірку осудності. Е ("Спасибі, я це% D", I). Так що це проста програма запитує у користувача Int, робить впевнений, що це в деякому діапазоні від 1 до 9 включно, , А потім дякує користувачів, нагадуючи їм, що вони просто набрали, так само, як невеликий перевірки осудності. Але давайте подивимося, якщо це працює, як передбачалося. Відпусти мене головою вниз тут і повторно запустити зробити петлю. Хм. "Використання неоголошений ідентифікатор" я "". Це дивно. Я думав, ми вирішили, що. Те ж симптом, але інший код. Так? АУДИТОРІЯ: [нерозбірливо] в два, ми повинні [Нерозбірливо]. David J. Малан: Абсолютно вірно. Так що це насправді приводить нас до теми відомі як сфера. Виявляється, C, знову ж, це дійсно бере вас в буквальному сенсі. І якщо ви робите щось на зразок цього, де ви оголошуєте Int , А потім присвоїти йому якесь значення, але ви, що всередині пара фігурних дужок, що C робить це припускає, що ви Тільки хочу, щоб ці 32 біта відомого як я існувати в контексті цих фігурних дужок, у рамках лінії З 6 по 9. Так що я оголошений, і йому присвоюється Значення в рядку 8, але як тільки ви отримуєте за межами рядок 9 нижче фігурною дужкою, я вже не в сфери, так би мовити. S-C-O-P-E. Це вже не в правильному контексті. Так що тепер немає я, так що це як би у нас не було навіть заявив на всіх. Так що виправлення то щось подібне до цього, якщо Причина в тому, що я оголошений у фігурні дужки, які мабуть погано? Тут? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Так. Отже, ми можемо ініціалізувати її межами. Отже, дозвольте мені йти вперед і видалити оголошення частин якої Я вказати тип, і дозвольте мені зробити це тут. Таким чином, у рядку 5, тепер він говорить: "Дайте мені Int." Назвіть це я. Зверніть увагу, в рядку 9, я не хочу цього робити, тому що я вже є 32 біт. Я не хочу попросити комп'ютер різними 32 біт. Я хочу використовувати ті ж 32 біт. І зараз, тому що я оголошений в рядку 5, вона як і раніше законно використовувати його в рядку 11 і рядку 12. Отже, дозвольте мені спробувати перекомпілювати і подивимося, якщо Clang припиняє кричати. зробити петлю. Так що тепер це "неявне оголошення функції "GetInt" неприпустимий у C99. "Що це таке? Так? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Так. Так що тепер я насправді використання GetInt, це не те, що просто приходить з C. Це відбувається від CS50. Так що ми повинні це тут. І дозвольте мені повернутися в рядок вниз Тут і повторно запустити зробити. Гаразд, в кінці кінців. Тепер ми вирішили, що й інші помилки. Дозвольте мені тепер запустити цикл і подивитися, що відбувається. "Дайте мені Int." Я дам йому 11. Я дам йому -1. Я дам йому Foo. Я дам йому 5. І тепер це дійсно працює. Але рядку змінився по причині тут. Чому він сказав повторити один з цих разів, але дайте мені Int інші три рази? Чому це поведінка відрізняється? АУДИТОРІЯ: Кинув в нього рядок. David J. Малан: Пробачте? Залу: Ви дали йому рядок. David J. Малан: Так. Таким чином, ми дали йому рядок в цій третьої спроби, коли я набрав Foo. Foo є рядком. Очевидно, що це не Int. І те, як CS50 реалізований GetInt тому, що ми не перевіряти, якщо щось не менше 0 або більше 10 для вас, тому що, як ми знаємо заздалегідь, який вид Int ви хочете? Але ми можемо мінімально перевірити тебе, не користувач принаймні, Введіть число? А якщо вони цього не зробили, ми кричати на користувачів, набравши "повторити" на екран. Так що тепер у нас є програма, яка циклів. Добре. Тепер, який з них є свого роду краще побудувати? Так ось де все стає трохи брудним, Те, що ви повинні пам'ятати, щоб оголосити змінну тут якщо ви хочете використовувати його всередині деяких фігурні дужки і за її межами. Але навіть якщо це виглядає трохи загадковий на перший погляд, просто ще раз, пам'ятайте, проста логіка. Для того, щоб використовувати все, що в C, чи є це функція або це змінна, ви повинні включити його, якщо це функція У деяких бібліотек, або вам потрібно оголосити. Але тепер ви повинні бути дуже пам'ятаючи про те, що Ви оголосивши його в потрібному обсязі. Ви не поставивши його занадто сильно всередині дужок. Тому дозвольте мені насправді відкат. Якщо ми повернемося до нашого наприклад, від раніше, і я йду Повернутися до для Int, Int = 0; I <10; + + я, і я зробити Printf зірок, як це, і потім закрийте хлопець, і тепер Printf я зараз - відповідно до тієї ж логікою, що станеться, коли я намагаюся скомпілювати цю програму? АУДИТОРІЯ: Невірний ідентифікатор. David J. Малан: Так що це ще один невірний ідентифікатор, неоголошений ідентифікатор. Тепер, причина трохи інша. Там, очевидно не фігурні дужки тут, але те ж саме Ідея та ж історія сфера належить. Якщо ви оголосили змінну, як я всередині цикл, навіть якщо ви не написаний фігурні дужки, думати про них подумки все ще знаходиться там, в яких випадку, якщо я дійсно тільки всередині циклу. Це не дійсні, як тільки ви отримаєте на наступному рядку, яка в цьому випадку в даний час 10. Таким чином, всього за кілька запитань сфери тощо. Гаразд, є питання? Гаразд, це начебто тривіальна невелику програму, друк тільки трохи зірок. Але давайте подивимося, якщо ви пам'ятаєте цю пісню тут. Це неймовірно дратує пісню діти співатимуть на Шкільний автобус тощо. Але те, що добре про нього, що він має цю циклічність, якому це "99 пляшок пива на стіні, 99 пляшок пива. Візьміть одну вниз, передати його навколо, 98 пляшок пива на стіни ". І тоді пісня повторюється 97, то 96, то 95, потім 94, все, аж до 0, якщо ви дійсно отримали, що далеко на автобусі. Так що це гарна програма для сортування зі знаряддя, тому що моя Бог, якщо можна просто реалізувати це за допомогою декількох рядків коду, ви могли б виплюнути всю лірику до цієї Пісня досить швидко. Але на цьому шляху, ми можемо почати зараз дражнять один від одного деякими з цих основних конструкцій циклів, а тепер і Введемо функції, що ми пишемо самі, повертати значення що ми обійти. Але, по-перше, чому б нам не піти далі і прийняти наші п'ять хвилин розбити тут? А коли ми повернемося, ми будемо співати цю пісню. Добре, таким чином, ми повернулися. І коли я кажу, що ми тепер буде співати цю пісню, я маю на увазі програмно, а не в усній формі. Таким чином, тут ми маємо beer1.c, який є одним здійснення цього конкретної пісні. І щоб було ясно, для тих, хто незнайомий з тим, що ця річ виглядає, дозвольте мені йти вперед і зробити beer1, Enter. Тепер дозвольте мені виконати beer1, і що ми побачимо - скільки пляшок пиво буде? Я буду вводити в 99, як співається в пісні. Enter. І тепер, якщо ми прокрутки - упс - якщо ми прокручуємо через все це, ми побачимо, що це дійсно співати всю пісню. Зачекайте хвилину. Мій прокрутки трохи переплуталися. Давайте використаємо великі вікна. Так beer1, 99, там ми йдемо. Так що тут у нас є ціла пісня, заспівана набагато швидше, комп'ютер, ніж це могло б бути нами. Так зауважити, однак, циклічність тут. Це говорить 99, а потім 99, потім "взяти одну з них, передати його навколо ", то 98. І тепер вона повторюється знову і знову. Так що насправді це прекрасна можливість для якоїсь Побудуємо цикл. Зверніть увагу, що я трохи різка кута тут. Зверніть увагу, що я говорю "98 пляшок пива на стіні, 97 пляшок пива на стіні ", і це було просто так що, коли ми дістатися до однієї пляшки пива, у мене немає турбуватися про граматику англійської мови. Але ми також можемо виправити це з трохи, якщо Умова, можливо. Якщо це число особливих, йти вперед і сказати: "Пляшка", в іншому випадку, якщо це множина, скажімо, "пляшки". Але зараз я повністю різання цьому кутку. Отже, давайте подивимося, що ми маємо тут. Таким чином, у нас є деякі коментарі у верхній частині. Я в тому числі ці дві бібліотеки, а Ми часто були. А тепер дозвольте мені прокрутіть вниз до першого фактичні рядки коду. Рядок 17 стартує основний. Line 21 і 20 має, скільки пляшок пива буде? І тоді я називаю GetInt. І тепер у мене є трохи розсудливості перевірки. Таким чином, це угода, за якою ми будемо починати з прийняття більш ретельно перевірити введені користувачем дані. Іноді ви просто не хочете, щоб спонукати їх знову і знову і знову. Якщо користувач гвинти і не співпрацює, добре. Вийти і просто не мати з ними справу. І ось що я тут роблю. Якщо п менше 1, то я просто буду кричати на користувача, "Вибачте, що не має сенсу". А потім я збираюся довільно повертає 1. Таким чином, знову ж таки, це всього лише умовність, щоб звикнути. На даний момент, прийняти його на віру. Але до цих пір, ми завжди поверталися 0, так як Ми вже говорили повертається 0 означає що? АУДИТОРІЯ: Успіх. David J. Малан: успіх, ось і все. Так що тепер ми, нарешті, починаємо думати про без успіхів - Іншими словами, кут випадки, помилки умовах - Тепер у мене є нескінченний запас, або принаймні чотири мільярди можливих речей, які можуть піти не так в моїй програми. І я можу почати присвоєння їм індивідуальних номерів. Зараз, як правило, досить просто повернутися щось інше, ніж 0. Отже, ми збираємося, щоб просто повернути 1 на даний момент. Але причина для повернення 1, що, як тільки ви повернетеся 1, вгадайте, що відбувається з іншою частиною програми? Він зупиняється. Ось і все. Таким чином, той факт, що я повертаюся 1 є ефективним коротке замикання виконання цієї програми таким чином, щоб нічого нижче лінії 27 буде продовжувати виконання. Як тільки основна повертається, що це таке. Гаразд, якщо користувач робить співпрацювати і ми досягнемо лінії 30 тому що вони ввели в законну номер, ось мій здійснення цієї пісні. Так я вперше роздрукувати символ нового рядка, тільки для естетику. Тепер у мене є цикл. І зверніть увагу, що я роблю речі трохи в іншому напрямку. Я не повинен робити менше, я не повинен робити + +. Я можу сказати замість ініціалізації змінної я, встановіть його рівним п, число користувачів набрали, виконайте такі дії, щоб Поки я більше 0, то я - як тільки ви закінчили одну ітерацію цього циклу. Таким чином, ми можемо розраховувати вниз за допомогою циклу, а також. Тепер, це в значній мірі тижня один матеріал тепер, з Printf. Таким друку "% D пляшок пива на стіні". Друк "% D пляшок пива. "" Візьміть одну вниз, передавати його ". для друку "% D пляшок пива на стіні". Так що це ще% D, але зауважити, що аргумент Printf змінюється. Після коми, у мене є я, тому що я хочу сказати 99. Після цього коми, в мене є я, тому що я хочу сказати 99. Після цього коми, в мене є я - 1, тому що я хочу сказати, 98 в це перша ітерація, і так далі. І тепер тут, я просто дурні маленькі зауваження. І тоді лінія 42, я повертати 0 у відповідності з угодою, показуючи, що все в порядку. Так що, якщо я goofed? Що може поширена помилка тут може бути? Ну, а якщо я випадково сказав добре, я хочу, щоб підрахувати до 0, я хочу, 0 пляшок пива на стіні? Тому я кажу, я більше або дорівнює 0. Що це буде ознакою того, що я тепер бачу, якщо я перекомпілювати beer1 і запустити його? АУДИТОРІЯ: Негативно. David J. Малан: Так, це підемо негативним. Це не зовсім по одній помилку, неймовірно Поширеною помилкою зробити. Давайте насправді повернутися у вікно терміналу і зробити це Тут, таким чином, ми можемо побачити в більшому часу. Введіть, 99 пляшок пива. Близько, але ми пішли трохи занадто далеко. Ми співали пісні занадто далеко, так, що ми зараз потрапили в негативне число. Так що не зовсім працює. Гаразд, так що ми можемо легко виправити, що, повертаючись до як це було раніше. Але те, що деякі можливості зараз поліпшення? Добре, дозвольте мені відкрити beer2.c та прокрутіть униз, тут і прийняти подивіться на цю версію. Що перше, що впадає в очі вам, як різні У цій версії тут? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Так, так не я, тому що прийшло в голову, Мені знаєте що, я питаю у користувача п, і тоді я вважаючи в рівній п, а потім я міняю я, але я ніколи не торкаючись п раз. Так якого біса була точка Ви виділення ще 32 бітів називається просто мені так, що я можу мати різні змінні? Таким чином, в даному випадку, я, звичайно, визнати, що непотрібне Особливістю конструкції. І я зараз збираюся сказати в той час як п більше, ніж 0, перейдіть вперед і роздрукувати ту ж пісню, проходячи п до Printf як Другий аргумент, і п - 1 в якості другого аргументу тут. І тоді на кожній ітерації цього циклу, йти вперед і тільки зменшення п собі. Тепер, функціонально, ця програма буде однаковим. Якщо я друкую в 99, п починається на 99. Я зниження, зменшення, зниження, зменшення. Я збираюся пройти весь шлях до "Одна пляшка пива стіни, одна пляшка пива. Візьміть одну вниз, передавати його. 0 пляшок пива на стіні ". Кінця, тому що я і зробив отримаємо умову правильної. Це більше 0. Я не робіть цю помилку. Так що ж краще, версія однієї або другий варіант? Я чув купу ремство на двох. Чому два? Що це? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: О, все в порядку. Таким чином, він не буде опускатися нижче 0, але пам'ятайте, у першій версії, Оригінальний правильна версія не опускалася нижче 0 або. Тому пам'ятайте, що це правильна версія. Так давайте хоча б порівняємо два правильних версій. Що аргумент на користь версії два з яких, ммм, краще? Так? АУДИТОРІЯ: Він використовує менше простору. David J. Малан: Так, це займає менше місця, вірно? У той час як версія, яка використовується 32 біт для п, а потім ще 32 біта для мене. Версія друга використовує тільки 32 біта для п, так що здається, це плюс. Інші думки? Хто-небудь хоче сперечатися на користь одного? Так? АУДИТОРІЯ: Ви повинні використовувати додаткові рядки коду при п -. David J. Малан: Добре, звичайно. Так що це справедливо. Так що це просто, принаймні для мене - Я маю на увазі, це насправді відчуває себе трохи брудніше, тим, що Я не можу сортувати інкапсулювати всі мої логіки в одному красиві лінії, петлі для, так як цикл може. Ось, я як би повинні лавірувати на цьому п - В кінці циклу, тому що це логічно необхідно. Але це начебто треться мене неправильно, просто тому, що Здається, окрема від логіки тут, хоча, знову ж таки, це необхідно. Інші думки? Так? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Так. Так що, якщо ви замість цього, в кінці пісні, хотів роздрукувати ще раз назву пісні? Як "Спасибі за гру 99 пляшок пива", або щось нерозумно, як це? Але справа в тому, що ви хотіли доступ до вихідного значення. Той факт, що ви мутував або змінився п на кожному ітерації і, отже, знищити своє первинне значення означає, що ви просто не можете зробити це в кінці. Тепер, мабуть, ми, очевидно, не хочуть робити , Що в цій програмі. Так кого це хвилює? Але це дуже правильний момент. І, чесно кажучи, там дійсно ніхто не Право відповіді тут. Вони обидва однаково правильні. Я міг переконатися в будь-якому випадку. Я скажу, що, загалом, це хороший принцип, якщо Ви запитав у користувача деяку цінність, і ви зберігається у змінній як і я, тільки вид в принципі, це, напевно, хороший зберегти, що навколо. І будь-які дані, які ви хочете мутувати знову і знову, тільки дати собі копію цієї змінної, просто так, що ви мати доступ до оригіналу. Ви витрачаєте ще 32 біта, але насправді це Комп'ютер, як, двома гігабайтами оперативної пам'яті в ці дні, і ми суперечка з приводу 32 біт? Дійсно не таке вже велике діло. І навіть на цьому пристрої тут, з половини концерту або гігабайтом оперативної пам'яті, 32 біт і 64 біт, Не таке вже велика справа. Звичайно, сьогодні, це буде шлях вражені розміром самої програми, яка буде кілька сотень кілобайт, якби не кілька мегабайт, в ці дні. Таким чином, розумна заклопотаність, ні одна правильна відповідь. Але принаймні ті думки, які повинні почати пройти через ваш розум? Тому що в PSET 0, хоча ми дійсно тільки очікується Правильність або, принаймні знімає з різними помилками, що Ви, можливо, стикалися, як ми просуваємося вперед, дизайн буде ще один ключовий аспект, обидва написання коду а також наші оцінки коду. І так по крайней мере дати думав щось подібне до цього. І тільки тому, що щось працює не означає, що це добре, не означає, що це добре розроблений. І це одна з речей, навчання стажерів і Проблема набору допоможе нам дражнити частина з плином часу. Ну, що, скажімо, ця версія тут? Дозвольте мені зробити що-небудь сексуальне тут в даний момент. Перш за все дозвольте мені позбавитися від цього. А тепер давайте виправимо цю граматичну питання. Таким чином, у цій версії, я хочу, щоб виправити граматику, так що, , А не просто сказати дужках з, як "пляшка" або "пляшки", - Я не хочу, щоб скоротити цей кут - Я також хочу, щоб динамічно роздрукувати слово "пляшки" або "пляшку", тим самим використовуючи ці заповнювачі% сьогоднішніх. Так що мені потрібно умовно перевірити, що це значення я. І якщо це 1, я хочу сказати "пляшка", і якщо це нічого, ще, я хочу сказати "пляшки". Так давайте спробуємо це зробити. Так що, якщо я == 1, то дозвольте мені піти далі і оголосити - Мені потрібна рядок, тому дозвольте мені зробити рядок s1, тому що це Перший рядок мене хвилює прямо зараз. Я збираюся сказати: "Пляшка". І потім, давайте подивимося, струнний s2 - і я поясню, куди я йду в даний момент - "Пляшки". Так Нагадаємо, що в цій пісні, ми повинні бути в змозі друкувати речі, два різних слова потенційно. Таким чином, якщо ми оглянемося назад тут, помітили, що коли ми доберемося до цей приклад тут ", дві пляшки пива на стіні, дві пляшки пива, візьміть одну вниз, передавати його ", я хочу ця четверта лінія тепер кажуть, "одна пляшка пива на стіна ". Таким чином, я повинен вирішити, я хочу сказати" пляшки "або "Пляшки"? Так що я збираюся як завгодно говорити, все в порядку, Я збираюся зараз оголосити змінну s1, рядок одне, що збирається отримати підключені тут, а також тут, тому що ці слова завжди однакові, тільки тому, що характер пісні. І я буду називати s2 всі слова я хочу в кінці кінців з'явиться тут. Зараз, буквально, в 99 випадках з 100, то це буде в обох цих випадках, так як 3 множина, 2, множині, 4, множина. Але в цьому кутку випадок, коли ми доберемося до 2, а потім 1, або навіть 1 і 0, мені потрібна ця логіка. Так що я повинен провести якийсь час в моєму коді отримання цього права. Так що, якщо я це зроблю, якщо я == 1, то безліч S1 одно "пляшка" і s2 рівні "пляшки", тому що це буде протягом 1 пляшки, і це буде для 0 пляшки. І це тут, що це уявляєте? Просто щоб бути ясно. Це просто коментар. Тому той факт, що ви можете мати однорядкові коментарі означає, що ви Коментувати можуть коді, як це, але іншого загального парадигми, теж є те, що якщо у вас є супер-короткі фрази, Ви хочете поставити себе, і це просто більш зручним для читання, щоб покласти це право в кінці рядка коду, ви можете Абсолютно зробити щось на зразок цього. Так що тепер, якщо я зроблю це? Інакше, якщо я не дорівнює 1. Так вибуху дорівнює - Знак оклику відомий як "вибух". Таким чином, вибух = 1. Так що, якщо я не дорівнює 1, що я замість того, хочете зробити? Ну, перше слово, яке я хочу бути що? Таким чином, рядок 1 повинна бути "пляшки" для множинного пляшки, і тоді це буде множина "пляшки", а також, на даний момент. І ми побачимо, якщо це насправді змушує нас куди ми хочемо йти. Так що тепер, якщо я прокрутіть вниз тут, помітили, що я підключенням Не тільки я, але s1. Я підключенням я і s1. А потім сюди, я мінус 1, який так само, як раніше, але s2. Іншими словами, я хочу, щоб англійське слово, щоб змінити основі На цій логіки. Тепер, вже є деякі проблеми в цьому коді. Що розбите вже з воріт тут? Так? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Абсолютно вірно. Так що я вже порушив урок з області видимості. Таким чином, я заявив S1 та S2, але я зробив це всередині фігурні дужки, що означає, що так, цей код буде працювати до до лінії 42, але як тільки я потрапив лінії 43, думаю, що немає більше не існує? Ну, думаю, що це більше не за масштабом - ні S1 та S2. Тому ми повинні це виправити. Отже, дозвольте мені видалити декларацій. І я залишу імена змінних і видалення цього тут і видаліть це тут. І в якому напрямку я повинен дійсно оголосити ці речі? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Так, так, ймовірно, прямо тут, 33-іш. Таким чином, рядки s1 і рядки s2. І виявляється, я можу це зробити. Якщо ви оголошення двох змінних такого ж типу, ви можете просто використовувати кому і зробити це в С. Все Право, так що тепер у мене є дві змінні - S1 та S2. Я присвоєння їм значень в цих Умови тут, або тут. І тоді я використовую їх вниз. Як вона тепер працюватиме? Ну, це ще небагато глючить, але давайте хоча б побачити як далеко ми отримали. Отже, дозвольте мені піти далі і зробити beer3. Це beer3? Так, це beer3. А тепер дозвольте мені йти вперед і працювати beer3. 399 99. Ми, ймовірно, може пропустити більшість з них. І сюди, подивись на це. "Одна пляшка пива на стіні, одна пляшка пива, прийняти один вниз, передавати його, 0 пляшок пива на стіні ". Але я звертаю вашу увагу лише половина рішення. Вид облажався тут. Так що, схоже, що кут випадки виникають, коли я одно, що два значення? АУДИТОРІЯ: 2, 1. David J. Малан: 2 і 1. Це не 1, а не 1. Це дійсно просто ці останні дві строфи цієї пісні. Отже, що я замість цього хочете зробити? Так що я, здається, піймав випадок, коли, якщо р == 1, то перше слово "пляшка", а друге слово є "пляшки". Але тут, я хочу змінити це, щоб бути == 2. І якщо це так, то, що я хочу Перше слово бути? АУДИТОРІЯ: "Пляшки". David J. Малан: "Пляшки", так і для двох пляшок. І тоді це слово тут має бути - АУДИТОРІЯ: "Пляшка". David J. Малан: "Пляшка", особлива. Гаразд, давайте масштаб, повернутися сюди, повторні зробити, повторні beer3, Тип 99 разів. Гаразд, "Помилка сегментації (ядро скидали)". Що я зробив не так? АУДИТОРІЯ: Ви не мають значення [нерозбірливо]. David J. Малан: Ах, відмінна точка. Гаразд, так що тут не так? Таким чином, сегментація вина, і ми фактично побачимо це досить багато разів у майбутньому, свідомо. Але зараз, що це насправді означає? Сегментація вина майже завжди означає, що у вас є якось намагався отримати доступ до пам'яті, оперативної пам'яті в комп'ютері, що у вас немає, що ви, власне, не просив операційна система для. Таким чином, в цьому випадку, зверніть увагу, що я зробив, що недоліки в моїй логіці. Я призначений S1 та S2 значення, якщо я дорівнює 1. Я також зробив, що якщо я рівна 2. Але я не зробив це в нескінченне число інших Можливості - Зокрема, 3 або 4 або точка, точка, точка, 99. Так що виправити це може бути просто давайте є інший стан. І відпустив мене сюди і сказав s1 одно - якою вона має бути тут? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: "Пляшки", тому що в загальному випадку, це просто те ж саме. Так дорівнює цитата, кінець цитати ", пляшки". Так що для множинного пляшки, а потім тут, на множину пляшок. Отже, тепер дозвольте мені повернутися до моєї вікно терміналу, перекомпиляция, знову запустити його. 99. Ось так. І давайте зробимо швидку перевірку осудності. Технічно, ми хотіли б, щоб прочитати всі з них, щоб переконатися, що вони мають рацію, але давайте подивимося на найменш відомих злочинців. 3 пляшки, 2 пляшки, 2 пляшки, 1 Пляшка, 1 пляшка, 0 пляшки. Ми, здається, принаймні, встановив його на даний момент. Але заковика в тому, що те, що Бог жахливий безлад, це просто вирішити нерозумно один символ граматичних деталей. Так що частково причиною того, що я вирізав цей куточок Раніше, тому що вона просто повністю дратує необхідність написати стільки коду. Але виявляється, що є трохи більш елегантним способами виражають одне і те ж. І ми можемо зробити це таким чином. Дозвольте мені залишити це на екрані на мить і ввести щось, відоме як потрійний оператор. Це свого роду один рядок, що просто хотів зробити нашу Живе трохи сексуальніше, як і обіцяв. І я збираюся зробити це таким чином. Дайте мені рядка називається s1, і дозвольте мені призначити його таким чином. (Я == 1)? "Пляшка", інакше "пляшки". String s2 отримує (я == 2)? "Пляшка", інакше "пляшки". Отже, що ж тоді різниця? Ці два рядки коду, я вважаю, може замінити весь цей бардак. Так я називаю це безлад, тільки тому, що вона як би треться мене неправильним чином, що він так багато рядків коду. Чи не неправильно. Це не поганий дизайн. Мовляв, це абсолютно правильний і прекрасно. Але кодування стає стомлюючим, якщо у вас є, щоб виразити себе так, Чорт спеціально знову і знову, і знову з простим Сценарій, як це. Так що C має деякі ярлики, як це. Так що це по суті говорить оголосити рядок називається S1 і призначити його або це значення чи це значення, якщо р == - Вибачте, я повинен сказати, що це більш чітко. Оголошення змінної s1, присвоїти йому це значення, якщо це правда. В іншому випадку, присвоїти йому це значення. Отже, іншими словами, це свого роду одна лінія способом кажуть, якщо інше робити поступки по шляху. Так що, якщо я дорівнює 1, а потім піти далі і називають це "пляшки". І то це інше, називають його "пляшки". Між тим, s2, Друге слово, що ми повинні визначити, якщо я дорівнює 2, ми будемо встановіть перемикач S2 в "пляшці". В іншому випадку, встановіть його в "пляшки". І те, що це означає, що тепер я можу пройти через це і видалити всі ці рядки коду. І коли я кажу, трохи смішно, що це зараз сексуальніше, це сексуальніше в свого роду стилістичні сенсі. Той факт, що функціонально цей код насправді відбувається в зробити точно таку ж річ. І хоча це може виглядати трохи загадкові на перший погляд, тому що ми не бачили цю конструкцію раніше, я б стверджують, що це в кінцевому рахунку буде набагато більше читання і набагато простіше для людей, щоб ми начебто зрозуміти, тому що тепер ви можете просто прочитати Код всі на одній лінії. Він як і раніше близькі по духу, якщо там, де це стан і тоді, це те, що всередині, якщо і це це те, що знаходиться всередині іншого. Але ми можемо зробити це, тільки набагато більш елегантно. І якщо я тепер повернутися до моїх термінал, видаливши всі з цих ліній і замінили їх лише ті два, перекомпіляції, повторні пляшки пива з 99 Зверніть увагу, що моя граматики є, по суті, як і раніше вірні. Отже, ще раз, щось почати. 2 пляшки пива, 1 пляшку пива. Виглядає права. Так. Так що у нас є набагато більш ємкі рішення. Так що це теж, як ви отримаєте більш комфортно з C, не обов'язково з першого PSET або навіть секунди, але розумію, що ці конструкції може дозволити нам робити речі, коли-небудь більш елегантно. Тепер давайте зробимо ще одну річ тут. Дозвольте мені йти вперед і відкривати return1.c. Тепер давайте почнемо вирішити ще одну проблему таким чином, що дозволяє написати більш складний код. Отже, ось проста маленька програма, мета якої в житті це для збільшення значення. А насправді, давайте зробимо крок назад. Дозвольте мені зробити це вручну. Дозвольте мені зробити включати і Int основних (недійсними). І дозвольте мені називати це increment.c. І те, що я хочу робити? Я збираюся йти вперед і сказати щось на кшталт - ми будемо називати числа ж - Int х. Так Int х одержує 2; Printf х% й, нова лінія, х. Так що я друкую швидко, але начебто знайомі речі зараз. Тоді я буду робити X + +. Тоді я йду до друку в тому ж пропозицію ще раз. А потім я збираюся повертати 0 тільки для виходу з програми. Гаразд, так це програми, які прирощення числа. Це перший вихід для ініціалізації щось 2, а потім це збирається збільшувати його та роздрукувати його знову. Так що давайте працювати приріст, неймовірно простий програми. Але припустимо тепер, що я хочу куб значення, так що щось кілька довільно. І я насправді хочу робити х одержує куб її. Так що я міг би використовувати те, що називається функцією військовополонених, але я не дійсно знаю, де це поки. Так що я збираюся зробити це старомодним способом. х разів у цьому рівних х разів х разів х. Так що я кубатури значення, помноживши її на себе знову і знову і знову, так що ми отримуємо владу 3-в цьому випадку. Так що тепер числа я повинен роздрукувати і повинно бути, як ми побачимо тут - зробити крок, так що це насправді не зовсім збільшити більше, але ми залишимо тільки назва - 2, а потім 8. Тепер у нас є зачатки можливість для уточнення Тут, в якій ця річ вимірювання кубатури множення числа сама по собі сама по собі сама по собі відчуває, як це може бути просто Корисно мати як функція, так само, як хтось вирішив, років тому - Ви знаєте, на зразок корисно, якщо один з нас сідає і пише Printf, так що інший світ може його використовувати, Чому б нам не сісти і написати функцію, називається кубом , Що робить це вимірювання кубатури для нас, тому ми не повинні вручну здійснення поняття кубатури значення тут? Таким чином, простий приклад, але давайте йти вперед і використовувати це в якості можливість написати свою функцію. Таким чином, до цих пір ми використовували тільки основні, і ми використовували інші Народний функції, але ми ще не написали наш власний. Таким чином, тут ми йдемо. Я збираюся піти далі і написати функцію, називається кубом. І я буду мати це займе вхід. Таким чином, її вхід буде ціле число. І те, що він збирається робити? Це збирається оголосити Int вихід = вхід рази вхід раз вхід. А потім він збирається повернутися, що вихід. І тоді я повинен бути конкретним зараз. Ця функція буде повертати Int. Так от те, як Ви б написати свої власні функції. Спочатку вирішите, що ім'я Функція буде. І взагалі, щось пояснювальній добре, так що я називають його куб. Потім ви повинні вказати, що він збирається повернутися, що його вихід буде. І ми не так вже багато варіантів поки немає. Int, Char, дробовий, логічний, рядок. А зараз я збираюся дотримуватися Int, тому що я хочу, для повернення цілого числа. Тоді ви повинні вказати, що його входів, якщо такі є. І якщо куб приймає аргумент, бере щось між дужки, ви повинні дати аргумент, що ім'я, щоб Ви можете назвати це те, як ви реалізуєте або записи цю функцію, і ви повинні дати йому типом, який в цьому випадку буде Int. Коротше кажучи, куба це функція, яка приймає ціле якості вхідних даних і повертає ціле число в якості висновку. Так що ж робити з цим входом? Ну, а в рядку 14, я оголошую змінну вихідні, і я присвоїти йому значення, вхід разів вхідні раз вхід. А потім я повернуся вихід. Так як я можу використовувати це тоді? Що я можу змінити ці наголосив символів в рядку 7 повинні бути, як ви думаєте? АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Так, так кубі х. Так що х є змінною, яка означає, що вона має деяке значення. На щастя, це тип цілого числа. І тому х INT, це означає, що я можу передати його в куб. І хоча я перевизначення значення х із значенням куба х, як це було у випадку до цих пір, в будь-який час мають знак рівності і рядки коду, матеріал на право запускається на виконання, а потім отримує призначення в Значення зліва. Таким чином, порядок операцій так, як ми хотіли б сподіватися. Так це працює? Ну, відпусти мене сюди. Дозвольте мені відкрити моє вікно терміналу. Дозволь мені зробити крок, Enter. "Неявне оголошення" куб "функція не працює в C99. «Як осторонь, C99 відноситься до мови C, як це було визначений в 1999 році, яке було оновлення на версію з 1989 року, який є оновленням в порівнянні з початковою. Так що все це значить. Так що ж це значить, що "неявне оголошення "Куб" функція не працює? "Це прямо тут. Це прямо там, у рядку 12. АУДИТОРІЯ: [нерозбірливо]. David J. Малан: Що це? АУДИТОРІЯ: Це не раніше. David J. Малан: Це не раніше. Так ось у чому справа. З видом дурний, або компіляторів є свого роду дурним. Вони дійсно тільки те, що ви говорите їм зробити. А вони, зокрема, тільки читати ваш код зверху вниз, зліва направо. Так що, якщо компілятор, Clang, читає ваш код, лінія 1, з'ясовує, як це зробити. Ах, ось іде основний. Добре, дозвольте мені піти далі і оголосити змінну х. Дозвольте мені надрукувати що-небудь. Лінія 7, що ж таке куб? Це не оголошена в stdio.h. Він не приходить з С. Я поняття не маю, що робити. І так Clang просто зупиняється і виходить з повідомленням про помилку. Таким чином ми можемо виправити це в кілька способів. Ми можемо навчити Clang, що куб є просто переміщення яких декларація. Так що я вирізав і вставив її поверх основного. Тепер розумію, що тільки тому, що головне, вже не перший, це як і раніше виконується за замовчуванням. Головні є основною. Це ім'я за замовчуванням функція. Не має значення, де він знаходиться в файлі. Але принаймні тепер Clang бачив куба, перш ніж використовувати його. Отже, давайте подивимося, якщо Clang є щасливим зараз. Зробіть крок, вона компіляції цього часу. Дозвольте мені виконати приріст. І справді, здається, працює. Тепер ви можете придумати сценарії, де в кінцевому підсумку це не можливо поставити будь-якої функції вище всіх інших функцій. Ви застрягли в цьому нескінченному циклі в дійсності, де цей хлопець хоче бути тут, але це хлопець повинен бути там. Так що не завжди працює. Так що, на щастя, C має більш елегантне рішення. Я збираюся поставити це туди, де вона була, просто тому, що воліють, як в принципі, що головне завжди бути у верхній частині, тому що це просто приємно бачити, що ця програма робить за замовчуванням. І те, що я збираюся зробити тут це оголосити, що називається прототип. Я збираюся повторно заявляю про свій кубі функції, буквально копіювання і вставки. Насправді, це не в буквальному сенсі. Таким чином, буквально копіюючи і вставляючи лінії 15 до вище лінії 6. Це не має значення, якої лінії це закінчується на. Це трапляється, у рядку 4. Але це мають бути, перш ніж основна. Але помітите різницю. 4 лінія закінчується крапкою з комою, що означає, гей, Clang, повірте мені на слово, що існує функція називається кубом, який приймає і повертає Int Int. Але я не скажу тобі, що це таке. Просто знаю, що я обіцяю розповісти вам в кінці кінців. І дійсно, зараз це нормально, що це внизу. Так що це, як правило, краще, тому що тоді у верхній частині Ваш файл, ви можете просто відбарабанив, швидкого вогню, одним рядком кожна, що імена ваші функції, які їхні Входи, що їх виходи. А якщо бути більш ясним, як правило, означає введення аргументів або Параметр, синонімами. Вихідний означає повернення вартості, що робить це руки до мене спиною. Тому в даному випадку тут, куб був оголошений у верхній частині, але визначено, інакше відомий як реалізовані, в нижній частині. Отже, тепер давайте повернемося сюди і знову запустити цей. Так що тепер дозвольте мені йти вперед і повторно запустити зробити, повторно запустити приріст. І тепер, здається, працює просто відмінно. Отже, тепер ми можемо йти вперед і враховувати щось подібне Пиво приклад у цій четвертій версії. Отже, дозвольте мені прокрутити вниз тут. І зауважив, що я як би прийняв цей урок близько до серця тільки зараз. Той факт, що я співав той же строфі знову і знову і знову, в тому ж рядку хору в пісні, відчував себе Наприклад, чому не я чинника, що з в функцію? І дійсно, це має бути одним із мотивів. Крім того, що хтось ще у світі може знадобитися використовувати куб функцію - це хороший привід, щоб розкласти щось і написати власні функції - якщо є шматок коду у вашій програмі, яка просто робить концептуальному сенсі, що ви начебто хочете, щоб дати йому ім'я - як в даному випадку, хору - Ви можете так само написати, що в якості окремої функції. Ви не повинні написати все, в основному, якщо він тільки почуває себе чистою, щоб відокремити його і дати йому ім'я. Тому в даному випадку тут, помітили, що в мене є коментар на вершині це функція, яка просто співає про зазначено кількість пляшок. Зауважте, що тут мені не потрібно називати ці речі вхід і вихід. У самому справі, на цей раз я просто зателефонував мій вклад б за пляшку. І зверніть увагу, тут, порожнеча пропонує те, що? Це хор - АУДИТОРІЯ: Не повернути його. David J. Малан: не повертає значення. І справді, функції не повинні повертати значення. Вони просто можуть щось зробити. Вони можуть мати так звані побічні ефекти, які в цьому випадку це просто ціла купа друку на екрані. Так зауважити, що цей код тут, я буквально тільки що вкрали у в попередньому прикладі. Різниця лише в тому, замість використання я, як моя змінних, я зараз, використовуючи б, як мій змінної. Так що я б сюди, я б сюди, я б мінус 1 тут. Але код точно так само. Але тільки, щоб показати вам, як ми можемо використовувати це, відпусти мене вперед і фактично змінити це буде цикл. для (INT я = п;> п, I -). Так що я вкрав, що з нашого попереднього прикладу. Раніше він знаходиться в рядку 37, що я б почав співати цю пісню дратує. Але замість цього, я просто хочу, щоб тепер називають хором я. Готово. Так що тепер у кожній ітерації цього циклу, я називаю це іншим Функція, хор, який мені довелося писати. Вона не була написана кимось ще рік тому. Але хор, тим часом, використовує Printf для друку з цих чотирьох ліній. Але те, що я дзвоню хор знову і знову петля означає, що я збираюся отримати, в самому кінці, точно таку ж пісню, як у мене до цих пір. Коротше кажучи, тепер, якщо я оглядаюся на свій код, навіть якщо функціонально це рівносильно, зверніть увагу, що це починають отримувати ще більше читаються. Я точно не знаю, як GetInt реалізований. Чесно кажучи, я не знаю, як хор реалізований. Але це не має значення для мене. Мене не хвилює, тому що тепер я можу сортувати, як людина, читати це від верху до низу. І тому, що функції називаються по тому, що вони робити, мій код більш читабельним. А так як наші програми отримати набагато більш складною - До кінця семестру, ви будете писати сотні рядків коду в мовах, як PHP і JavaScript і т.п. - Ви побачите, що це набагато простіше, ніж стежити за що ви зробили. І коли ви починаєте співпрацю з друзями або партнерам чи колегам, ви будете мати можливість писати набагато більше масивних програм, починаючи здійснювати ці основні будівельні блоки. Таким чином, з урахуванням сказаного, чому ми не називаємо це день? І ми будемо бачити вас в середу. [Оплески]