DAVID J Malan: All Добре, така че това е CS50. И това е ясно в петък. И това е краят на една седмица. Така че може би си спомняте, че бяхме стигнали, Последния път, с Катерачът неразположен. Чрез което да изложи тази лъжа, че не Независимо какво сте били научени расте до 1 разделена на 10, не е в Всъщност, 0.1 или 0.100 или 0,10000. В действителност, ако ние събиране на тази програма, както направихме вчера, с, направи неточност и след това направя точка, наклонена черта, неточност, ние научихме, че това е това, което е 1 делено на 10 в действителност. Така че това всъщност не е точно така. Но това прави намек за някаква фундаментално ограничение на компютри. И наистина, сред неща, които ние ще направим днес е да разгледаме защо това има случило, какво отражение има това, как човечеството е успяла да се разбере това в някои много сериозна situations-- резултатът от кои е доста трагично и expensive-- и да разгледаме как можем всъщност може да защити срещу тези видове ограничения. Така интуитивно, може би, Затова е 1 делено на 10, според моя компютър тук, а не само 1/10, 0,10? Да. Какво мислиш? АУДИТОРИЯ ДЪРЖАВА: The корен е по-различно? DAVID J Malan: The какво е? О, корен е по-различно? Така че не е съвсем. Това е всъщност по- от основно значение за хардуера. Други мисли? Да. АУДИТОРИЯ ДЪРЖАВА: Те представляват номера по различен начин? DAVID J Malan: Така they-- Right. Те представляват номера по различен начин. Неточно, както изглежда. Така че is-- Е, различно от това, което? Или от кого? От нас? АУДИТОРИЯ ДЪРЖАВА: Да. Те не използват десетичната система, за да [недоловим]. DAVID J Malan: OK. Така че в известен смисъл, те не го правят използвате десетичната система. Под предния капак, всичко е, наистина, двоичен, и това е, отнасящ се, в действителност. Но това е още по-проста обяснение от това. Да. АУДИТОРИЯ ДЪРЖАВА: Те само има толкова много бита. Те могат само да съхрани до известна степен, като с десетичните. DAVID J Malan: Да. Това е това, което наистина се в нея. Оказва се, че компютрите обикновено, винаги само ще използвате ограничен обем информация да представлява нещо. Нали така? В края на краищата, ние имаме само една фиксирана размер на дисково пространство. Ние имаме само една фиксирана сума на RAM, или компютърна памет. И ако имате само един фиксирана сума за нещо, със сигурност няма да може действително брои до до безкрайност или всеки номер, който желаете. Вие, вид, трябва да избирате какъв диапазон на стойности ти започваш да се подкрепят. И така, например, една или две седмици Преди, когато говорихме за ASCII, и ние говорихме около 8 бита, или един байт, така да се каже, най-голям брой можехме означават с 8 бита е какво? 255. И ние можем да представляват 256 общо стойности но не и ако ние прекарваме една от тях на 0-- Добре, но ако ние прекарат един от тях на 0, След това най-голям брой е, разбира се, 255. Така се оказва, че това е случай също в този контекст. Ние започнахме да говорим, за последен път, за плаваща запетая числа, които са различни от числа, в че те имат десетична запетая и, надявам се, някои цифри след това, но те са твърде. Компютър е само обикновено става да използват 32 бита, може би 64 бита да представлява стойност с плаваща запетая. Така че, въпреки че сме израснали изучаването на математиката и знаейки че можете да имате абсолютно безкраен брой числа след десетичната запетая, а не ако имате ограничен памет. Вие, вид, трябва да се закръглят, или избирате кои номера ти започваш да представляват. И така можеш да се сетиш, в известен смисъл, като това е най-близо на компютъра сближаване на стойността 1/10, че той може да получи, само с 32-те бита. И това не е само 1/10. Така например, ако променя това да 1/3, което ние мислим, е още по-лесно. Така че един разделен на три. Позволете ми да запишете файла. Нека да вървим напред и да го компилирате. И нека да я пуснете отново. Тук също, както изглежда, не е 1/3 0.3 и след това безкраен брой 3 на след това. Можете да получите този неточност в края. Така че ние, хората са правилни, и това, което научихте е, всъщност, нали, но ние удрях срещу някои ограничения. И аз така си помислих щяхме да правим днес, е да започне като погледнете в, честно казано, на трагични последици от това Понякога, когато човечеството не съвсем приложат за тази реалност и тези ограничения. И ние ще видим поредица от винетки от History Channel, който взема разгледаме как нещата да се обърка. Това е дълъг около 8 минути, и ние ще се върнем след това и да разгледаме най-точно какво друго може да се обърка. Ако можехме да затъмни lights-- [Възпроизвеждане на видео] -Computers, Ние всички идват да приеме най-често разочароващ проблемите, които отида с тях. Bugs, вируси и софтуер бъговете са малки цени да плащат за удобство. Но в хай-тек и високоскоростен военни и космически програмни приложения, най-малкия проблем може да Да се ​​величае в бедствие. На 4 юни 1996 г., изготвени учени да пусне безпилотен Ariane 5 ракета. Той е превозвал научна спътници проектирани за да се установи как точно Магнитното поле на Земята взаимодейства със слънчеви ветрове. Ракетата е била построена за Европейската космическа агенция и излетя от неговото съоръжение на брега на Френска Гвиана. -И Около 30 секунди от началото полета, те за първи път Забелязах, че нещо не е наред. Това дюзите се въртяха по начин, те наистина не трябва. Около 40 секунди след началото на полета, ясно на превозното средство е в беда, и това е, когато те направиха решението да го унищожи. A Range Officer безопасност с огромни кураж натисна бутона, взриви ракетата, преди той би могъл се превърне в опасност за обществената безопасност. -Това Беше девойката плаване на Ариана 5, и разрушаването му отне поставите заради дефект вградена в софтуера на ракетата. -В Проблем относно Ariane е, че има е номер, който изисква 64 бита, за да изразят, и той искаше да конвертирате то до 16 битово число. Те Предполага се, че броят никога не щеше да бъде много голям, че повечето от тези цифри в Броят на малко 64 са 0 на. Те сгрешиха. -В Неспособността на една софтуерна програма, за да приемете вида на номер, генериран от друг е в основата на провала. Разработка на софтуер се е превърнала в много скъпо част от нова технология. Ариана 4 Ракетата е била много успешно, така че голяма част от софтуера създаден е също използвана на Ariane 5. -В Основния проблем е, че Ариана 5 е по-бързо, по-бързо се ускори. И софтуерът не е имал отчита, че. -В Унищожаване на ракетата е огромна финансова катастрофа, всичко се дължи на грешка на минута софтуер. Но това не е първият, времеви проблеми за преобразуване на данни бе измъчван модерна ракета технология. -В 1991 г., с началото на войната в Персийския залив Първо, ракетата Patriot преживява подобен вид на проблем номер реализация. В резултат на това 28 души, 28 американски войници бяха убити и около 100 ранени, когато Patriot, който трябваше за защита срещу входящите ракети Скъд, не успя да изстреля ракета. -Когато Ирак нападна Кувейт и Америка стартира Пустинна буря в началото на 1991 г. Бяха разположени ракетни батареи Пейтриът за защита на Саудитска Арабия и Израел от иракски ракети Скъд атаки. Патриотът е US, среден обсег земя-въздух система произведен от компанията Raytheon. -В Размер на прехващача Patriot, себе си, е на път, дълъг около 20 фут. И тя тежи около 2000 паунда. И носи бойна глава на about-- Мисля, че е приблизително 150 паунда. И бойната глава, себе си, е високо експлозивни, което има фрагменти около него. Корпусът на бойна част е проектирана да действа като едри сачми. -В Ракети са извършва, 4 на контейнера, и са транспортирани с полуремарке. -В Patriot анти система за противоракетна датира най-малко 20 години. Той първоначално е бил проектиран като противоракетната отбрана на въздуха да свалят вражески самолети. По време на войната в Персийския залив Първото, когато тази война се появи, Армията иска да го използва, за да свалят Скъд не, самолети. Иракското сили не беше толкова голям проблем, но армията е притеснен за Скъд. И така, те се опитаха да ъпгрейд на Patriot. -Intercepting Враг противоракетна движи Мах пет щеше да бъде достатъчно голямо предизвикателство. Но когато Patriot бил откаран в експлоатация, Армията не е бил наясно с едно Иракският модификация, която прави техните Скъд почти невъзможно да се удари. -Какво Се е случило, е, че на Скъд идваха, бяха нестабилни, те се клати. Причината за това, беше иракчаните, с цел за да получите 600 км от на 300 км обсег, взе тегло от предната бойна глава и направи бойна запалка. Така че сега, на Патриотичния опитва да излезе в плавно движение, и в повечето случаи, преобладаващото мнозинство от време, той просто ще лети от Скъд. -След Като операторите на системи Пейтриът осъзнал Patriot пропусна целта си, те взриви бойна глава на Патриотичния, избягване на евентуални жертви, ако се оставя да падне на земята. -Това Беше това, което видяха повечето хора, тези големи огнени топки в небето, колкото и неразбрани прихваща от Скъд бойни глави. Въпреки че през нощта небе, появили Patriots да бъде успешно унищожаване на ракети Скъд, в Dhahran, не може да има грешка за неговото изпълнение. Там, радарна система на Патриотичния изгубили следите на входящо Скъд, и никога не стартира, поради софтуерен недостатък. Беше израелците, които първи са открили че вече системата е било включено, по-голямата несъответствието време става поради часовник вграден в компютъра на системата. -За 2 седмици преди трагедията в Dhahran, израелците докладвани Министерството на отбраната, че системата е започнала да губи време, че след около 8 часа в режим на движение, те забелязали, че системата е стане забележимо по-малко точни. Министерството на отбраната отговори, като казвам всички батериите Пейтриът да не напускат системите за дълго време. Те никога не каза какъв беше дълго време. 8 часа? 10 часа? 1000 часа? Никой не знаеше. -В Patriot батерията разположени в казармите в Dhahran, и неговата погрешна вътрешния часовник, е бил на повече от 100 часа в нощта на 25 февруари. -Това Карането време с точност от около 1/10 от секундата. Сега 1/10 от секундата е интересен номер защото тя не може да бъде изразена в двоичен, точно. Което означава, че не може да се изрази, точно, във всеки модерен цифров компютър. Трудно е да се повярва, но използвате това като пример. Нека да броят, 1/3. 1/3 не може да се изрази в десетичен, точно. 1/3 е 0.333 случва за безкрайност. Няма начин да се направи това, с абсолютна точност, в десетична. Това е точно същия вид проблем, който се случи в Patriot. Колкото по-дълго системата изтича г. -лошо грешката време стана. -След 100 часа работа, грешката във времето е само около 1/3 от секундата. Но от гледна точка на насочване на противоракетна движи Мах 5, тя се превърна в проследяването грешка при прилагане на повече от 600 метра. Би било фатална грешка за войниците в Dhahran. -Какво Се е случило, е стартирането Скъд беше открива чрез ранно предупреждение сателити, и те Появилият че Скъд беше идва в тяхната обща посока. Те не знаеха къде идва. -Това Беше сега до радара компонент на системата Patriot, защитавайки Dhahran, за да намерите и запази следите на входящо вражески ракети. -В Радара беше много умен. Това всъщност ще проследи позицията на Скъд и след това, когато се предскаже тя вероятно ще бъде, следващия път, на радар изпрати импулс вън. Това се нарича портата диапазон. -Then, След като Patriot реши има достатъчно време преминал да се върна и да се провери на следващия място за това открива обект, той се връща. Така че, когато той се върна в грешното място, то тогава не вижда обект и тя реши, че не е имало обект, той е фалшив откриване, и капки пистата. Входящият Скъд изчезна от екрана на радара, и секунди по-късно, тя блъсна в казармата. The Скъд убити 28 и беше последният един изстрел по време на Първата война в Залива. Трагично е, актуализирания софтуер пристигна в Dhahran на следващия ден. Недостатък на софтуера трябваше бил фиксиран, затваряне една глава в разтревожените История на ракетата Patriot. [END PLAYBACK] DAVID J Malan: Така че ние ще разгледаме най- някои подобни ограничения в малко. Но първо, нека преход към няколко FYI е. Така one-- този уикенд, има ще бъде супер секции, които са предназначени да изместят редовните секции, които ще стартира седмица по този начин. Обърнете внимание на уебсайта на CS50 е за повече информация за тях. Те също така ще бъде заснет и поточно живея за хората които не могат да присъстват. Проблем определи 1 е на уебсайт разбира вече, а ние ще се погледнете в че в съвсем малко. И работно време също ще вземат поставите този понеделник до четвъртък. Така че това е най-каноническа програма ще погледна за последен път. Това е като най-простите програма можете да пишете в C, и дори, че е малко на една смела претенция. Нали така? Защото има много привидната сложност на това. Така че нека да хвърлим един бърз поглед към това, което някои от тези елементи са били и след това се опитайте да се осигури умствено модел за това как те простият на програми работи, а след това ние ще започнем гледане на нещата все по-сложна. Така че тази линия тук, подчерта сега, в жълто, какво да кажем, за последен път, че това прави за нас? Каква е целта тя служи? Всеки от по-назад? Да. АУДИТОРИЯ ДЪРЖАВА: [недоловим] DAVID J Malan: Добро. Така че това дава достъп до команди, или нека ги наричат ​​функции, че някой друг е написал, че са декларирани, така да се каже, по някакъв друг файл. Така че ние ще видим какво точно .h файл е срещу файл .c, в крайна сметка. Но за сега, просто знам, че ФОРМАТ, например, е между функциите, които са били декларирани в друг файл, някъде останало на твърдия диск на облака, че ни позволява да получите достъп ФОРМАТ и да го използвате без да се налага да се преосмисли че колелото си. Междувременно главната. Каква беше аналог на главната, миналата седмица? Да. АУДИТОРИЯ ДЪРЖАВА: Green флаг е кликнал. DAVID J Malan: Да. Scratch е, когато зелен флаг щракнали. Това е като парче пъзел че започва неща, на разстояние. И така, по същия начин, направил света реши преди няколко години, че в C, и куп други езици, ако искате да се напише програма, първата си функция е да се нарича, главната. И тя трябва да изглежда по този начин. Но ние ще се върнем, друг път, на това, което, вътр, и, за невалидни, да кажа в този контекст. За сега, фигурните скоби са вид на подобно пъзел парче форма на Scratch че някои капсулира брой редове. И сред по линиите тук, е този тук. ФОРМАТ е функция, чиято цел в живота е да отпечатате форматиран низ. И от форматиран, аз ви кажа можете да включите в заместващи стойности, и можете да посочите колко десетични точки, колко числа, за да отпечатате след десетичната запетая и други подобни. И ФОРМАТ, разбира се, има една или повече аргументи и параметри, иначе известно, по-просто, като суровини. Така ФОРМАТ, като много от функции, отнема входове. И тези суровини се прегърнаха от двете скоби тук. А вътре от тях е един вход. Това е низ, както сме го нарича, който е само поредица от символи, като една дума, или фраза, или цяло есе дори, между двойни кавички. И това е, което се случва, за да повлияе на поведението на ФОРМАТ, защото, разбира се, това е просто един генеричен функция за печат. Това няма да се знае какво за печат, освен ако не го кажа. И след това, някои дреболии. Какво да кажем този странен последователност от символи е? Да. АУДИТОРИЯ ДЪРЖАВА: New линия. DAVID J Malan: New линия. Така се оказва, че не може просто да се удари, въведете, когато пишете на програмата. Като цяло, компилаторът ще се получи, малко объркан за това какво искаш да кажеш. Напротив, трябва да имате буквално казват, дай ми нов ред тук. И така, / п е това, което ние обикновено обадете бягство характер. Така че п, за нов ред. И компилаторът знае че когато го вижда / п, тя трябва действително индуцира компютъра, в крайна сметка, или ФОРМАТ, в този случай, да разпечатате действително ново линия, като топката се удари, влиза, на клавиатурата. И на последно място, това, което направихме ние казваме тази част от синтаксиса е за? Какво представлява тя? Да. АУДИТОРИЯ ДЪРЖАВА: [недоловим] DAVID J Malan: Това е просто на края на линията. Това е краят на изявлението. И осъзнавам, че не го правим сложете ги навсякъде. Ние със сигурност не ги изхвърляйте в краищата на всяка линия. Например, има нито относно първа линия, има никой на линията с, основна, има нито един след фигурните скоби, но вие ще започнете да виждате и да получите запознат с, където тя се нарича за. И това е почти винаги след функция обадите или изявление, някои действия че вие ​​всъщност приемате. И знам сега, особено ако сред тези, по-малко удобни, това са видовете глупави неща че ще свърши случайно чука главата си в стената над. Защото ще бъде логически уверени в някакъв проблем сте решени за проблем сет и проклетото нещо просто няма да се компилира или дори тичам. И така често, в началото на деня, то се случва да да бъде, защото сте пропуснали скоби, или сте пропуснали точка и запетая. И така просто да се забравя на неща от този род, и се опитайте да не се разочароват от тях, защото много бързо прави това стане стара шапка. Но това е много лесно да се получи разочарован в началото на деня, като резултат. Така че сега, нека да разгледаме как тази линия е всъщност работи и след това погледнете малко по- по-сложно един. Така че ние имаме тук, на способността да се направи на този екран. И нека да предположим, че това е екрана на компютъра ми, но аз съм писмено, здравей програмата, и аз не са приложили, ФОРМАТ. Някой друг е изпълнила, ФОРМАТ. Кой би искал да претендират, че са изпълнени, ФОРМАТ? Ако ние може? Добре, какво е вашето име? STUDENT 1: [? Copal. ?] DAVID J Malan: Copal, хайде нагоре. Хайде нагоре. Всичко е наред. Така че ние имаме, тук, някои табелки с имена, тъй като ние ще направим малка игра на този. И ние ще ти се обадя, ФОРМАТ. А ако искате да дойда тук, това, което съм просто прави на екрана, това е доста просто, там съм аз, това. Добре, така че, здравей името ми е, ФОРМАТ, ако искате да се сложи това на. Всичко е наред. И ако можете да отидете стойка от екрана на компютъра като че ли са функцията, която дойде с тази компютърна система. И вашата цел в живота е действително да отпечатате нещо. Но много прилича на програмата ние Просто трябваше на екрана, тук, ние ще трябва да всъщност ви даде някакъв принос. И така, ако моят принос, тук, е Очевидно, това, което се предава на ФОРМАТ, нека вид тя се подиграват по този начин. Отивам да буквално пише по парче хартия, "Здравей, свят" наклонена черта N. И да е ясно, какво Току-що се построява въз основа на това парче хартия, изглежда по този начин. Така че, когато стартирате тази програма, и това жълто ред код бива изпълнен, това е като че ли, програмата здравей, съм подаде някакъв вход на разстояние до функция че някой друг е написал. И ако, с пръст, в действителност може, с пръст, изготвят на екрана, независимо това е като сте били предадени, ефекта, в крайна сметка, е виж точно това, на екрана. И Little случай корнер тук. И добре, ние не трябва да видите на, новата линия, в този момент. Би било неправилно за вас изрично да се привлече нов ред. Но ако ние продължавахме написването думи на екран, те ще се окажете под това. Така че много ви благодаря, но се придържаме тук само за един миг. В момента се нуждаем един друг доброволец, ако можехме, че ще трябва да играе ролята of-- Това е само хора в оркестъра точно сега. Как about-- OK. Точно тук. Хайде нагоре. Как се казваш? STUDENT 2: [? Ivay. ?] DAVID J Malan: Съжаляваме? STUDENT 2: [? Ivay. ?] DAVID J Malan: Итън, хайде нагоре. Не? Знаете, че аз се обърка, дори след като го каза два пъти? Хайде нагоре. Трудно е да се чуе тук. ДОБРЕ. И аз съжалявам, какво е вашето име? STUDENT 2: [? Ivay. ?] [? DAVID J Malan: Ivay. ?] ДОБРЕ. За сега, ако не ум, вие сте GetString. STUDENT 2: OK. Готино. DAVID J Malan: Така че, ако искате да стоя тук само за миг, нека да разгледаме малко по- по-сложна програма, че Сега има три реда код. Така че ние имаме един, името си, използвайки ФОРМАТ; две, призив към GetString, последвано от една задача към променлива, наречена, низ ите, или наречена ите; и след това друг разговор да, ФОРМАТ, но този път с два входа. Така че ние вече сме направили състояние Вашето име, или по-скоро, ние сме вече свършили ФОРМАТ повикване. Така че аз отивам да пиша, държавните вашето име. И така, това, което аз отивам да мине, ФОРМАТ, в един момент, е съвсем просто, това. Така че, ако искате да отидете напред и да направи това на екрана, това е вашият принос сега. Всичко е наред. И забравяме, стринг, сега ние имаме нашата собствена ред код тук. Така че в, GetString, ние се нуждаем действително да се обадя, GetString. Така че вашата цел в живота е да си върви навън в оркестъра, ако можех, и да получите името на някого. Но нека да ви дам нещо, за да го поставите. Ако искате да отидете напред и да получите низ, получите нечие име на това лист хартия, ако могат. Всичко е наред. И ние ще видим, в един момент, чието име ние получаваме. В същото време, това, което аз отивам да има готови, е празен лист от хартия, в който, аз отивам за съхранение на каквото и да стойност е, че GetString се връща към мен, Аз, като низ променлива, наречена, с. Всичко е наред. Така че това, което имаш тук? Nik. Всичко е наред. Така че ние имаме името Nik тук. Така че това е, което буквално е бил върнат за мен, така да се каже, от GetString. Аз, сега, отивам да изпълни лявата ръка на този израз, когато аз просто копирате, за днешните цели, Nik. Така че сега, аз имам една променлива нарича, е, съхраняване име Nik му. Аз вече предадена на ФОРМАТ, предишен аргумент. Но в нашия третата и последна линия на код, аз всъщност трябва да ръката ФОРМАТ нещо малко different-- "Здравей,% ите", наклонена черта п. И така, на последния ред Отивам да send-- последното нещо, което съм Ще напиша сега, е това. Така двете линии на код, или а последната линия на код, покани за двама inputs-- един това, и две, това. Така че, ако нашата ФОРМАТ функция сега може да вземе това като вход, нека да изчистите екрана за вас. Всъщност не, можете да отидете напред. Ще го оставим, тъй като това е на една и съща програма. Ние трябва да видим, здравей, Nik. Всичко е наред. Така че това е доста малко обръчите, за да скочи през, просто да пише, да посочвате Име и, здравей, Nik. Но тази проста идея за пропускане на съобщения, на входа и на изхода къса получаване, е точно модела ние ще имаме за дори най-сложните функции. Така че ви благодаря толкова много за вас двамата. Имаме прекрасна стреса топка тук за вас. И ви благодаря за нашия GetString и ФОРМАТ доброволци, така. Благодаря. Всичко е наред. Благодаря на двама ви. Така че ние сме били говорим за до този момент, най-вече за струни. И се оказва, че всъщност може да C разбере няколко различни типове данни. Всъщност, нека да Разгледайте тези тук. Така C, и много езици, разбира нещата, наречени символа. A Чар е обикновено един байт, или осем бита. И тя представлява един символ, като буквата А, или в столицата буква А, или малката буква A, или удивителен знак, или който и да е характер, че да можете да пишете на клавиатурата, а понякога дори и повече. Ние също така се случи, за да видите поплавъци. A плувка е, общо взето, по- 32-битова стойност, или четири байта защото отново, един байт е осем бита. Така поплавък е стойност с плаваща запетая, нещо с десетична запетая. И наистина, това е, което филма говорех за това, кога те говори за плаващи точка стойности, някои фиксиран брой битове се използва за представяне на реално число. Но има и неща, наречени двойки. Те съществуват в Java, ако сте взели АРС, и двойна, тъй като името щастие подсказва, е два пъти по-голям, колкото плувка. Тя все още е реално число, тя просто има повече битове с които да бъдат все по-точни, или за съхраняване на още по-големи числа. инт е лесно. Ние говорихме за това последно време. Това е просто число. И това е обикновено 32 бита, или четири байта. И така, ако имате, да видим сега, 32 bits-- и ние направихме това през седмица 0, все така briefly-- ако имате 32 бита, което е най-големият номера, който може да представлява като цяло число? Или дайте? Това е като 4 милиарда, и това е само ако сме представляващи само положителни числа. Ако имаш 32 бита, а вие искате да представляват отрицателните числа, както и, обхвата си е по същество отрицателно 2 милиарда до положителна 2 млрд. Но като цяло, ние ще започнем при 0 отидете до 4 милиарда. Не е нужно да се знае точно, но можем да видим това, в действителност, ако просто отворят малко калкулатор, тук. Мога да направя 2 на 32, и това е как точно голям, колко стойности можете представляват, с 32 бита. И това е грубо 4 милиарда. Така че ние ще продължаваме да виждаме, че редица в няколко различни места. Но ако имате нужда от по-дълго номера от тази, Оказва се, че има нещо, наречено дълго дълго. И дълго време е общо 64 бита, които означава, че е един порядък дори по-голям от инт. Така че аз дори не може да се произнесе най-големите номер, който може да представлява, но това е значително по-голяма. Сега като настрана, исторически, ако пад е 32 бита, и дълго време е 64 бита, как голяма е дълъг, не дълго време? Човек би си помислил, че е по-дълъг от една инт но може би по-малко, отколкото дълго дълго дълго, но всъщност зависи. И така се оказва, една на отчаянието също, с написването код на някои системи, е, че не всички от тези типове данни има предварително определени стойности. Понякога е толкова много бита. Понякога това е, че много бита. Така че всъщност трябва да се знае, Понякога, какъв хардуер сте с вашия софтуер на. За щастие, други езици и други типове данни, които сега съществуват, ви позволи да бъдем по-точни. Е, видяхме низ, и видяхме булев, също, но се оказва, тези, които идват само с CS50 библиотеката. Така че тези, които не са построени в В. Тези вместо дойде в този файл, наречен CS50.h, че в крайна сметка ние ще отстранете пластовете. Но за сега, те са просто допълнителни типове данни. A булев е вярно или невярно, и низ е последователност от символи, като една дума. Сега ФОРМАТ, които сме виждали, има контейнери,% и е един. И вие може да бъде в състояние, до момента, заключим от тези и други примери, как бихте могли да имат запазено място за различни типове данни. Например, да вземе предполагам, ако Исках да разпечатате един единствен знак, използвайки ФОРМАТ, на контейнера е вероятно% гр. А ако искате да отпечатате на число със запазено място,% I на. % LLD е дълъг дълъг десетична стойност, но дълго, дълго, така че картите за това. И тогава% е за плаващи Точка на стойност или за двойна, така че понякога те използват повторно в различни контексти. Така че ние ще видим и да използвате някои от тези, които с течение на времето. И ФОРМАТ и на други функции също екраниращи последователности за подпомагане на другите, и понякога, те са необходими. Така че наклонена черта п е на нов ред. Обратно наклонена черта тона, има ли някой искате да вземе хладно оръжие? АУДИТОРИЯ ДЪРЖАВА: Tab. DAVID J Malan: Tab. Така че, ако наистина искате да разпечатате раздел, не фиксиран брой места, но действително символ за табулация, не удари си, таб, клавиш от клавиатурата, като цяло, вие всъщност правите наклонена черта тон. Обратно наклонена черта двойни кавички, Затова би някога съм искал това? Нали така? Защо не мога да просто да напишете двойни кавички на моята клавиатура? АУДИТОРИЯ ДЪРЖАВА: Защото, в противен случай, това е ще мисля, че е до края от искал печат вашия [? текст. ?] DAVID J Malan: Точно така. Не забравяйте, че с нашата ФОРМАТ примери, когато ние Минавахме да ФОРМАТ на входа, в ляво на този вход низ и относно правото на този вход пролетта, разбира се, е двойно цитат. Ако вашият собствен вход е с двойно цитат в средата на който, компютърът може потенциално се объркате, че да, прави това двойни кавички принадлежат в средата? Има ли принадлежат с левия? Има ли принадлежат с най-подходящия? И така, ако искате да го направите супер ясно, нали обратно наклонена черта двойни кавички, така че това е избягал, така да се каже, и това не е смесил за нещо друго. А има и няколко други тук, наклонена черта г, единични кавички, 0, за да видим с течение на времето, както добре. И сега, какво да кажем за функции? Така че действия, които можем да предприемем този момент на този език, C, както и, които сме виждали, ФОРМАТ, разбира се, и всичко на другите на екрана, тук, че ние ще използваме за курса на първите няколко седмици, само дойде, когато библиотеката CS50. И те правят много по-лесно, по- C, за да се получи в действителност приноса на потребителите. Оказва се, че в C, и честно казано в рамките на няколко езика, това е истинска болка в областта на шията, за да се направи нещо по-просто, като своевременно на потребителя за клавиатура, за неговото въвеждане. И така, тези функции го правят по-лесно. И той също има грешка проверка на целия, така че, когато припомни в сряда, ние Видях, опитайте отново, предупреждението, когато не е оказал съдействие, и аз напечатани една дума, вместо номер? Ние сме направили най-тежката работа ранно за да се уверите, потребителят сътрудничи. Но това са само за обучение колела, че ще в крайна сметка, и бързо да се съблече. Така че да обобщим, тогава, нека хвърлим един бърз поглед, много като направихме с Scratch, най- някои канонични структури в В. Това има за цел да, сортиране на, да вихрушка турне, Просто така, че имате препратка и че сте виждали неща на първо време. Но тогава ние ще разгледаме реалното кодиране използвате някои от тези градивни елементи. Толкова много, като в Scratch, когато бяхме изявления обичат, казват или, чакай, в C, ние нямаме функции, както и, като ФОРМАТ. Ако искаме да изразим състояние в C, това е подобно, по дух, към този пъзел парче, че изглеждаше така в Scratch. Но вместо това, ние буквално просто напишете това, ако. И тогава, в скоби, ще се постави условие, когато това условие е това, което ние ще обадя, отново, булев израз. И отново, това е нещо като Псевдокод. И, всъщност, // е коментар. Това е само на английски думи за себе си. Но това е генералът структура на, ако състояние. Но ще видим бетон примери в един момент. Ако искате да имате двупосочно разклонение на пътя, много като направихме с нашия доброволец на Сряда, можете да имате, иначе ако. И ако искате да имате една трета и крайното състояние или ситуация подразбиране можете да имате само един друг блок, има. И по същия начин, с булеви изрази, можете, и, като ги заедно. И видяхме в сряда, че това не е единичен амперсанд, това е две, от съображения за по-ниско ниво, че ние накрая ще видим и играе с тях. Или-ING неща заедно е 2 вертикални ленти. На клавиатурата на САЩ, това като цяло е ключов с клавиша Shift-горе Въведете вашия ключ или Назад ключ. Тогава там е, че тези неща ще използваме може би веднъж или два пъти. Те са функционално еквивалентни какво можете да правите с това, ако, иначе, ако, иначе, ако друго, конструиране, но те се наричат ​​превключвател. Те изглеждат много по-различно, но ние ще виж в някои от дистрибуторската ни код, за бъдещ проблем набор, най-вероятно, че понякога е просто по-хубава начин за изразяване цяло куп условия, без да се налага много фигурни скоби и много скоби и отстъп. Но те ни дават не повече мощност, отколкото ние вече имаме. И сега контури. И този път, ние ще разгледаме при малко по-бавно. Но след това, ние ще започнем да ги използват, особено за тези, които вече познато. Това е каноничен начин, ако невероятно тайнствена начин, за да напишете една линия в C. Сега една линия в Scratch е доста ясен. Вие имате, завинаги, да го блокира. Вие имате, повторете, блок с просто номер, който трябва да въведете инча И с, за линия, можете да приложат и двете от тези идеи, но това е малко по-технически. Но честно казано, това е също сравнително проста. След като знаете реда на операции, вие буквално просто ще включете стойности и кажи на компютъра какво да прави. Така че ето един пример. Това е една линия, че доста просто, се брои от един номер нагоре чрез друг. И само от фланга в това, дори и ако имате Без предварителни опит с този език, какъв номер пък най-вероятно да започне броенето при? OK, 0. И аз съм се познае, че е така, защото вие се види, че има пад и аз, което е променлива. Той е инициализира с 0. И след това по-късно, тя изглежда като ние сме минаваща ФОРМАТ стойност. И, всъщност, аз направих малко правописна грешка тук. Но това е лесно поправими. Нека добавя в, аз тук. Сега имаме ФОРМАТ същество преминал тази стойност контейнер. И какво ще се брои през нея? АУДИТОРИЯ: 50. 50. 49. DAVID J Malan: 49. Така 50, на пръв поглед, изглежда правилно. Но това, оказва се, ще бъде нашето състояние да пазим проверка. И ние ще се спре веднъж аз вече не е по-малко от 50. Така че този цикъл, обратно, трябва да изпълнява, доколкото аз е по-малко от 50. Но веднага след като тя става 50, или 51, или по-лошо, той трябва да спре автоматично. Всичко е наред. И така, какво всъщност се случва тук? Така че това е от порядъка на операции за една линия. One, имате така наречените инициализация. Това жълто подчерта парче на код се изпълнява от една страна, и тя има смисъл, че, за Сряда, най-вероятно да си представите. Той създава променлива, наречена аз и го магазини в тази променлива стойността 0. Така че аз е 0 в този момент в историята. Следващото нещо, което случва в този конструкт, е, че състоянието получава проверява. Така че аз се провери веднага, е аз по-малко от 50? И разбира се, отговорът за сега е, разбира се, да. Да, защото аз е 0, и това е със сигурност по-малко от 50. След това, което се случва, е, че това ред код бива екзекутиран. И всъщност, ако има множествена реда код в тези фигурни скоби, всички те се изпълнява една след друга. И в ефекта тук, е Очевидно, за да разпечатате на брой и, която ще се е 0, и след 1, 2 и след това. Но защо? Защо това се увеличава? Е, четвъртото, което се случва, е, че този синтаксис получава изпълнен, след запетаята. аз ++ е краткият начин да се каже; вземе стойността на I, и се добавя 1 към него; и след това следващия път, добавете 1 до нея; и следващия път, се добавя 1 към него. Така че, ако ние продължаваме да става, какво ще се случи Следващата е аз няма да инициализира аз все пак. Ако аз продължавах инициализиране аз до 0, този пример никога няма да свърши, защото аз ще се залепи при 0. Но какво ще се случи, е че условието ще бъдат проверени, линията на код ще се изпълни, на Аз ще се увеличава, състояние, ще бъдат проверени, код ще се изпълни. И го държат колоездене отново, и отново и отново, докато аз ++ индуцира стойност 50. Условието след това казва, 50 е по-малко от 50? Отговорът, разбира се, не е, и така че целият код спира изпълняващата. И ако имате повече код на екрана по-долу, това е, което се случва след това. Тя изскача от тези фигурни скоби и продължава да отпечатате повече след това. Така на шега сега, от Фокстрот, че вие може би ще разберем сега. Той винаги е смешно. Това е като хихиканията вид прецеждам, и след това разбираш, че не трябва да да се смееш на хумор като този. Но има някои храна за вкъщи тук, педагогически, също. Така се оказва, че аз съм липсва парче синтаксис, или Фокстрот за изчезнали парче синтаксис тук. Какво липсва, че сме имали във всеки друг пример, до този момент? Върни се, е там, така че това е нещо друго, че ще се върнем да не след дълго. Какво липсва, все пак? Да. АУДИТОРИЯ ДЪРЖАВА: The инициализация на [недоловим]. DAVID J Malan: OK. Така че, да. Така че всъщност, това is-- Е, и брой се инициализира до по-горе, или по-скоро, обявена до горе. Така че това е още един начин да го направите. Но не и в един ред, че е валидно все пак. Какво ще кажете за тук? АУДИТОРИЯ ДЪРЖАВА: Това е най-къдравите скоби? DAVID J Malan: Да. Така фигурните скоби са изчезнали. Но този код, искам да кажа, да им кредити, всъщност, синтактично валидна. Оказва се, че не правим нуждаят фигурните скоби ако имате само един ред код, който искате да се изпълни в рамките на цикъла. Сега ние винаги, в клас и по- всички от нашия код, включва фигурните скоби така или иначе, просто заради яснотата е. Но осъзнавам, че в учебниците и онлайн примери, вие може много добре да видите къдрава скоби изчезнали някъде. И това е ОК, ако това, което са разчленена и предназначени е само на един ред код, а не няколко реда код, потенциално. Всичко е наред. Така че, свързани с издаването на неточност, е въпрос от преливане, в смисъл, че подобно, се цели числа имат ограничения за тях точно като стойности с плаваща запетая? В света плаваща точка ценности, ние може да бъде толкова точни, само, след което понякога лоши неща могат да се случат, и нашите програми могат да бъдат бъги и грешка. Сега дори и с цели числа, можете да се сблъскате с проблеми. Сега цяло число не разполага с десетична точка или номера след него. Това е просто естествено число, обикновено. Така че това, което може да се обърка с едно цяло число? Ако аз съм с едно цяло число, за да брои, какво би могло да се обърка? Изглежда много по-просто. Да. АУДИТОРИЯ ДЪРЖАВА: Ако номер получава [недоловим] DAVID J Malan: Да. Какво ако броим толкова високо, че сте Не мога да изразя, че наистина голям номер. Нали така? В един момент, ти започваш да надвишава границите на 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-- някои Googling потвърди миналата night-- са придобили 4 милиарда златни монети, или какво ли не, в Lego Star Wars. Въпреки че изглежда, че има начин да подвежда играта, там е бъг или функция, която ви позволява да просто се натрупват много и много точки. Но възможно най-голям стойност, съгласно към тази снимка на екрана на някой I намерено онлайн, е наистина, 4000000000. А защо е така? Това е точно 4000000000, Вероятно защото някой реши, който е писал тази игра, които биха могли да направят 4 милиарда, нещо, нещо, нещо, като стойността сложих с калкулатора по-рано, но това е само малко по-чист за хората да се каже, максималният брой на coins-- или шипове, както те наричат ​​them-- че сте може да събере е 4 милиарда. И така, защо е това? Как е LEGO играта прилагане на тезгяха това е следенето на брой монети имате? Те използвате какво? АУДИТОРИЯ ДЪРЖАВА: Той спира Разчитам след 4 милиарда. DAVID J Malan: Той спира Разчитам след 4 милиарда, което означава, че вие ​​може да заключим, като програмист, че те са най-вероятно като се използва 32 битово цяло число. Като програмист буквално напечатан, инт, в неговия или нейния код, и това е от типа на променлива, която те използват за съхраняване на някого код. Така че има други прояви на тези видове ограничения. Така че аз не съм играл тази game-- и аз бях четене на историята за да се потвърди като much-- но в оригиналната версия на Civilization, където ти явно си взаимодействат един с друго и могат да водят война или мир, Ганди е трябвало да бъде един от най-спокойните героите, както аз го разбирам, в първия версия на Civilization. И в действителност, по скала от 1 до 10, неговата агресивност е просто един. Така че все така леко агресивно, както изглежда. Но в един момент, можете очевидно инсталиране на демокрацията в географията. И ако инсталирате демокрацията във вашата версия на играта, След вашето ниво агресията отива надолу. Това е нещо добро. Хората са по-спокойни както изглежда, в тази ситуация. Но очевидно, някой е направил не да има, ако, състояние в оригиналната версия на кода. Така нивото на агресия Ганди премина от положително 1, минус 2, на отрицателна 1, но играта не разбере отрицателни числа. Така че това, което се случи, е агресията на Ганди ниво отиде от 1, 0, 1 до отрицателна, която имаше за последица обвивка около да бъде най-агресивния характер в играта, на стойност 255, по десетобалната система от 1 до 10. И тъй като след това, че е станала повече въплъщения на тази игра, и те го държат като нещо като великденско яйце, че Ганди е очевидно Ужасно агресивно. Но това е в резултат на по- много проста грешка програмиране с това, че много ранна версия на играта. Сега по-смущаващо, по- Наскоро, Боинг 787 е документирано като имащи бъг, не от вида на устройството сте особено искам да имам бъг. И симптомите, че аз ще четат тук, от една статия в сайта, е този, модел 787 самолета че се захранва непрекъснато за 248 дни може да загуби всичко променлив ток, AC, електрическа енергия, поради контрол Генератор единици, GCUs, едновременно навлиза в безотказен режим. Така че това беше предупреждение, издадено когато е открит този проблем. Това състояние е причинено от софтуер брояч, вътрешни за GCUs, така цяло число или променлива, че ще прелее след 248 дни непрекъсната мощност. Boeing е в процес на разработване на софтуер, който ъпгрейд GCU ще отстрани опасно състояние. Така че много прилича на ракета сценарий, където те са имали някаква променлива че се брои, и броене, и броене, но постепенно прелива границите на своите възможности, по подобен начин направих проклетото самолета има променлива преливник след достатъчно време на движение. И така, начинът на езика в бузата на работното около този въпрос е наистина, рестартиране, самолета си всеки 247 дни, така че паметта получава избърсват и променливата се връща 0. Но осъзнаваш, че това е много голяма въплъщение на софтуер, но най-вече като чуваме за Apple, операционни системи навлиза в автомобили, и самостоятелно шофиране на коли от Google, и произволен брой въплъщения на софтуер в нашите ежедневието, телевизори и часовници, както и повече, осъзнае бяха заобиколени от софтуер, всички от които е написана от нас, хората. И тъй като всички ние скоро ще откриете, това е много лесно и много типично да се правят грешки при писане на софтуер. И ако не ги хване, някои лоши неща могат да се случат. Сега понякога някои смешни неща могат да се случат, или поне понякога ние знаете да очаквате някои грозота. Така 0, разделен на 0, от степен училище, като цяло е нещо лошо. Това е неопределено. И се оказва out-- и нека видим дали моя микрофон може да вземете това, че Apple up-- имаше някои се забавляват с тази наскоро. Така че имам iPhone тук. Отивам да говоря с Siri и я попитай да ми даде отговор на 0, разделен 0. Какво е 0 разделен от 0? SIRI: Представете си, че имате 0 бисквитки и да ги разделят поравно между 0 приятели. Колко бисквитки се всеки човек да се зарази? Виждаш ли? Това няма смисъл. И Cookie Monster е тъжно че няма бисквитките. И сте тъжни, че вие нямате приятели. DAVID J Malan: Това е нещо неприятно. Така че това е, което е просто каза, че има. Това е неопределен, той не е определено, И наистина, много езици за програмиране или, наистина, компилатори ще откриване, когато, в една програма, опитайте да разделите 0 от 0. По-забавно от това обаче, е, която очевидно, Cookie Monster е на Twitter тези дни. А той отговори на това, с този, което е абсолютно очарователни. Но нека хвърлим един бърз поглед към Няколко други конструкции, и след това пуснати някои от настоящия код за използване, в добри начини. Така се оказва, освен за електрически вериги, има нещо, наречено линия, докато, че изглежда по различен начин и се изпълнява малко differently-- и ние в крайна сметка ще видите examples-- но в известен смисъл, е по-лесно, тъй като тя не позволява да се инициализира и актуализира в границите на контура. Вие все още може да го приложи. Така че можете да направите точно същите неща с време на цикъл, като с по линия, но си синтаксис, ultimately-- Както ще в крайна сметка see-- ще бъде различно. Има дори направи линия, докато, които всъщност е малко по-различна, с това, че има предвид, че за контур и линия, докато винаги проверите състоянието им на първо място, ако можете да прочетете това нещо горе до долу, тя вид изглежда като това ще проверите състоянието го миналата, защото това е наистина последния ред на код. И наистина, че ще бъде полезно в някои програми, които пишем, ако искате да направите нещо просто сляпо и в крайна сметка се провери състоянието. Това не е непременно нещо лошо. Ако искаме променливи, можем да направим то в няколко различни начина. И видяхме в Фокстрот карикатура, един начин да го направите, където можете да декларира променлива, като INT брояч и запетая, и след това може би следващия later-- линия, може би 10 реда later-- вие всъщност го инициализира. Така че тези 2 реда код декларира променлива от тип INT и го наричат ​​брояч, така че дава ми достатъчно бита за провеждане на инт. И след това евентуално, го слага стойност 0 в тази променлива. Тя подрежда в една 0 и 1 модел, който ние знаем от миналата седмица, представлява броят ние знаем като 0. Или казано, можете да направите това много по- по-кратко и ясно, точно като тази. Сега имаме и способността да се обадя функции. И в действителност, тук е 2 линия програма, или извлечение от него, че ни позволява да всъщност пиша някакъв код, който получава низ от user-- много като нашия доброволец миг ago-- съхраняване на резултата променлива, наречена на името, и then-- много прилича с нашия доброволец с printf-- отпечатва тези ценности чрез преминаване през два аргумента, на низ, последвано от променливата нарича, име, самата. Така че нека да погледнем, преди ние се върнем към Mario там, най Няколко сега, примери за това. Отивам да вървим напред и отворена нагоре, да кажем, функция-0.c. И както винаги, този код е разположение на интернет страницата на курса, така че може да играят заедно в вкъщи и гледам на него по-късно. Но тук е програмата в това е същество, от линия 17 и 22. Основната програма е мястото, където програма винаги ще започне. Тази програма, както изглежда, се случва да отпечатате името ви, на дебелото черво. Това е след това ще се обадя GetString, точно както направихме с нашите доброволци. И тогава, това е интересно, то се случва да се обадя PrintName. Оказва се, през цялото това време, има изглежда е функция, наречена PrintName. Това отпечатва името на някого. Ние не трябва да се използва от ФОРМАТ недалечното минало, има PrintName. Но това е подвеждащо защото PrintName не идват с C. Хората не го направи го измисли преди около 40 или 50 години, Направих, вместо. И всъщност, ако превъртите определяне на допълнителни, известие как мога да напиша моя собствена функции в C. Ще крайна сметка обясни защо ние продължаваме да кажат: нищожен, на няколко места, но за днес, нека просто погледнете името. На линия 24, ако искате да създадете свой собствен функция, буквално напише Име на функцията. Избрах PrintName. В скоби, вие След това уточни какъв вид на входа, и колко ви Искам тази функция, за да се вземат. В този случай, аз искам да се вземат 1 променлива, наречена, име, и това ще бъде от тип, стринг, така че ще да има някаква последователност от символи. И тогава, това program-- много прилича на Scratch, можете да имате персонализиран пъзел pieces-- ще има този обичай поведение. Това ще се обадя ФОРМАТ минаваща през, здравей, контейнер, и след това ще включите в каквото наречен потребителя. Така че това е един пример за това, което компютърен учен би повикване абстракция или функционална разлагане, които са само фантазия начини на saying-- е, ако ви харесва тази идея високо ниво, като искам функционалност, която отпечатва името на някого, абсолютно сте може буквално да напишете ФОРМАТ и след това премине в аргументите, които искате, и програмата ще работи, тъй като той има от сряда. Но можете да започнете да абстрактна далеч понятието за отпечатване на име. Можете да го дадете име, като PrintName, и това е тази идея за наслояване от седмица 0. Отсега нататък, аз и не е нужно да знаете или интересува колко PrintName се изпълнява. Да го използва ФОРМАТ, може би това не го прави, кой знае какво използва? На кого му пука? Сега аз говоря тук, вместо тук. И наистина, тъй като нашите програми се по-напреднали и сложни, ние ще продължим да приемате за даденост които съществуват по-ниски ниво парчета от пъзел. Защото ние ги написал или някой друг е направил, така че че тогава можем да се изгради върху тях. Нека да погледнем на този вариант, функционира една. Така че това е малко по- напреднали, но се оказва, че в библиотеката CS50 е, има само една функция GetInt. Ние не мислим, преди години, за да приложи функция GetPositiveInt. И това е малко досадно, защото, ако вие, момчета, които пишат програма, където Искате ли да получите положителен цяло число от потребителя, абсолютно можете да използвате GetInt. И вие можете да се консултирате с абсолютно състоянието и може би една линия ако това междинно съединение е по-голяма от 0 и крещи на потребителя ако той или тя не дава вие положително число. Но нека да се изгради тази сграда блокира себе си, а, обичай Scratch парче, ако щете. Отивам да имат програма тук, че в крайна сметка, аз Искам да мога да се обадя GetPositiveInt, и аз искам да бъда можете да отпечатате каквото и да е инт. Но това се абстрахира сега. Това е просто били дадени на високо ниво име, което казва какво прави, което е прекрасно, защото това е много интуитивен сега, за да се чете. И ако аз направя това, което е под грижа качулката, позволете ми да превъртите надолу. И това е малко плашещо На първо място, особено ако това е първата програма, но нека да разгледаме. Аз вече не казва, нищожен, защото се оказва, функции, много прилича GetString, може връща стойност за мен. Те не просто трябва за отпечатване на екрана, те действително могат да предадат ми нещо обратно. И докато преди PrintName, Аз не се нуждаят от нещо обратно. Имах нужда от страничен ефект от нещо се появяват на екрана, но аз не се нуждаят от човешка да ми предаде нещо обратно. Тук, с GetPositiveInt, като с GetInt, Искам да се подаде нещо обратно. Така че аз казвам не, нищожен, на ред 23, но инт, в която се казва, тази функция че пиша, наречено GetPositiveInt ще ми върне цяло число, а не нищо, Не невалидни. В същото време, това ще отнеме не входове, така че съм, вид, обърнати него. Аз не съм като някоя GetPositiveInt вход, аз искам тя да ми даде своята продукция. И след това, което се случва сега? Така че тук е как мога да декларира променлива. Правил съм го извън контура, по причини, ние в крайна сметка ще видите, но това само дава ми 32 бита нарича, п, и аз съм предварително определяне тях да съхранявате число. И тук е, че правя, докато конструкт, и това е причината, че е полезно. Буквално да направите това, а п е по-малко от 1. Така че нека да видим какво ще стане. I разпечатате, моля дайте ми положително инт. След това да получа едно цяло число, с помощта на CS50 функционира и се съхранява в п. И тогава, какво ред код вероятно получава изпълнен следващата, логично? Коя линия номер? Да, така 31. Може би не знаете това, докато сте е казал, или нещо го направи извод, но това е вярно. Той отива горе до долу и след това продължава да се повтарят. Така че, ако сте написали в речем, на броя отрицателна 1, п е по-малко от 1 отрицателна? Да. Тъй като отрицателен 1 е по-малко от 1. И така, какво трябва да се случи? Отивам да направите това а п е по-малко от 1, така че аз отивам да се върнем към линия 28. И всеки time-- и нека си тече this-- направи функция 1, за да го съставят, и сега Дот наклонена черта функция 1. Ако изпишете отрицателна 1, това е ще продължим да крещи по мен докато не си сътрудничат, защото всеки от моите входа е по-малко от 1 и ако това е, докато по-малко от 1, Отивам да продължаваш да правиш това. Ако най-накрая го даде редица като 50, за щастие, той казва, благодаря за 50. Защо? Защото веднага след като п не е по-малко от 1, спра да остана в този цикъл, и тази нова дума днес, възвръщаемост, буквално прави това. Така че аз съм просто изпълнява, в чувство, което е равно на GetString, къде съм подаде обратно всеки, който е с помощта ми, някаква стойност. То не трябва да бъде низ, това е инт. Така че просто, бързо Например, но ние скоро ще видите някои по-сложни версии на едно място. Всъщност, нека да разгледаме по- числов един, който се нарича return.c. И това всъщност е малко по-лесно. Така че целта на тази програма в life-- нека да се съберат и да го ползвате, така че се възвръщаемост, Дот наклонена черта, return-- известие програмата просто кубчета стойност 2. Това е доста глупаво, това е трудно код, той не взема никакви входове, но тя не демонстрира друг функция, която съм си написал. Така че тук, аз съм обявен за променлива, наречена х, от тип INT, равен на броя 2, напълно произволно. Това е само част пухкави печат. Той казва, че х е сега, като и такива, cubing точка точка точка. И магията е очевидно в ред 21. Обаждам функция, наречена, куб, Аз съм го подаде лист хартия с номер 2, изписана върху него, и каква стойност, математически, искам да се измъкнем от него? Просто като проверка здрав разум? 8. Нали така? Аз искам 2 кубчета обратно, от 2 до Силата на 3, така че 8 гърба. Така че, когато се изпълнява куб? Е, забележи, че е приложена тук. И точно като преди, логично, въпреки че синтаксис е вероятно много нови за много от вас, Искам тази функция да ме върне лист хартия с пад върху него. Така че аз имам едно цяло число, на Името е произволно, но обикновено нарича куб. Входът към него, е п от въведете число, така че това е как мога да премине в броя 2 на лист хартия. И после се оказва, C опори математика, така че не е нужно х е за време, можете просто да използвате звездичката за умножение. И това се връща н пъти п пъти п, която е просто една стойност на кубчета. Така че къде отиваме с всичко това? Това определено е вихрушка турне, бъдете сигурни, че в супер секции и в проблем определи 1, ще се ходи през всичко това още повече. И в определен проблем 1, ние ще прехвърлим от графичен света на Scratch към нещо по команден ред в C. Но ние ще почерпим вдъхновение от този тук игра от недалечното минало, където използване на C, а стандартната издание на р набор ще приложат пирамида на Марио. И в хакер издание на р набор, ако така решите да избира, ще приложи малко по- оспорване пирамида с два пика. Вие също така ще приложи алгоритъм, алчен алгоритъм. Оказва се, че има някои интересни логика зад процеса на използвате станция на касата и действително подавайки някого промяна. Налице е алгоритъм, който е доста ясно, че може дори да хванете интуитивно когато за първи път прочетох it-- осъзнавайки, че е това, което винаги съм направено по всяко време съм дал на някого някаква пари back-- която ви позволява да винаги намали броят на хартиени банкноти или монети, метални че сте подаде обратно към потребителя. И това, разбира се, е наложителна защото, ако отидете на CVS или какво ли не, вие не искате да бъде предаден цял куп такива или цял куп жълти стотинки. Вие искате най-малочислени монети, вероятно, е възможно. И накрая, вие също така ще бъдат оспорвани да се бъркам в света на водата и всъщност става поскъпване за картографиране между темповете на потока, от искал, вода в душ, точно колко вода се използва. И загатването в него, ще бъде този клип тук, която ще приключи на за само 60 секунди, през което рисува картината на нисък дебит душове. [Възпроизвеждане на видео] -Всичко е наред. Имам всичко тук. Имам Cyclone F Series, Hydra, Jetflow, Стокхолм Supersteam, каквото се сетите. -И Какво ще препоръчате? -Какво търсиш? -Power Мъж. Сила. ПОДОБЕН Silkwood. -Това Е за радиация. -Това е вярно. -Сега Какво е това? -Това Е Commando 450. Аз не се продават, че един. -Но Това е, което искаме. Това е един командос 450. -Не Ми повярва. Той е използван само в цирка. Това е за слонове. -Ще Плащате нищо. -Какво За Джери? -Той Не може да се справиш с това. Той е деликатен. О да. [END PLAYBACK] DAVID J Malan: Добре. Това е, ако за CS50. Ще се видим следващата седмица. SPEAKER 1: [? Скъли?], [? Ian,?] доколкото това аутро проект, какво сте момчета излезе с? SPEAKER 2: Е, ние дадохме това разнообразие на мисълта, и смятаме, че най-добрият начин to-- SPEAKER 3: May I? SPEAKER 2: Да. С всички средства, всъщност. SPEAKER 3: Така че аз мисля, можем да обобщим нашата идея за outros с една word-- нищо. DAVID J Malan: Нищо? SPEAKER 3: Нищо. DAVID J Malan: Какво означава това? SPEAKER 3: outros са за нищо. SPEAKER 2: Ами, искам да кажа, във философията, Искам да кажа, нищо не е винаги нещо. SPEAKER 1: Така what's-- това, което е предпоставката? SPEAKER 3: Така че това е като живота. ДОБРЕ. Какво прави днес? DAVID J Malan: Станах, имаше закуска, и дойде да работи. SPEAKER 3: Това е аутро. SPEAKER 2: Но, искам да кажа, не би трябвало да нещо се случи с него по the-- SPEAKER 3: Не, не, не, не. Нищо не се случва. SPEAKER 1: Така че, защо са ни гледат? SPEAKER 3: Понеже това е една аутро за CS50. DAVID J Malan: Не още.