[За възпроизвеждане на музика] DAVID J. Malan: Добре. Това е CS50, и този е началото на две седмици. Така че нека да започнем днес с бъг. A Bug, разбира се, е грешка в програма, и вие ще получите много запознати с тази концепция Ако никога не сте програмирали преди. pset0 и сега pset1. Но нека да разгледаме нещо малко просто на първо време. Тази програма тук, че аз хвърли заедно в аванс, и аз твърдя, че това трябва да отпечатате 10 звезди на екрана с помощта на ФОРМАТ, но това е очевидно бъги по някакъв начин. Като се има предвид, че техническите спецификации, тя трябва да отпечата 10 звезди, но това не е така очевидно, какво бихте твърдение е бъг? Да? Така че е почти от една грешка, и какво искаш да кажеш с това? OK. Отлично. Така че ние сме указали начало Нулева стойност на I, и ние сме определено п стойност от 10, но ние сме използвали по-малка или равна на. И поради това, че това е два символи, а не само един символ, като в математиката книга, е, че не е нужно начин на изразяване на един символ еквивалент. Така че това означава по-малко, отколкото, но ако започнете да брои до нула, но вие разчитате целия път нагоре през и равно на 10, вие сте на курс ще брои 11 неща общо. И така, ти започваш да отпечатате 11 звезди. Така че това, което може да бъде решение за това? Да? Така че просто се коригира по-малко от или равно на само по-малко от, и там е, аз твърдя, може би друго решение, също. Какво може друго да направиш? Да? Така че започнете да го равняващо се на 1, и оставя по-малко от или равно на. И честно казано аз бих твърдял че за типичен човешки, това е може би по-лесно. Започнете преброяване към 1 и брои до 10. По същество направи това, което искаш да кажеш. Но реалността е, в програмиране, както сме виждали, компютърни специалисти и програмисти обикновено започват преброяване на нула. И така, това е добре веднъж свикнете с него. Състоянието ви ще обикновено да бъде нещо като по-малко от. Така просто логично грешка, която бихме могли сега фиксира и в крайна сметка прекомпилирате това и да получите само 10. Ами какво ще кажете за този бъг тук? Тук, отново, аз твърдя, че имам цел на печат 10 stars-- по един на ред този път, но това не го прави. Преди да предложи това, което уговорката е, какво прави това отпечатате визуално, ако аз трябваше да съставят и стартирате тази програма мислиш? Да? Star. Така че всички звезди на една и съща линия е това, което чух, и след това новата линия характер. Така че нека се опитаме това. Така че се бъги-1, влиза, и виждам командата трясък че ние говорихме за последен път. ./buggy-1, а всъщност виждам всички 10 звезди на същата линия, въпреки че аз твърдя, в моята спецификация просто коментар на върха кода, който възнамерявах да направя една на линия. Но това изглежда добре. Сега ред 15 тя изглежда сякаш съм отпечатване на една звезда, а след това линия 16 тя изглежда като аз съм печат нова линия характер, и те двамата с отстъп така Аз съм вътре в контура ясно. Така че не трябва да се прави звезда, нова линия, звезда, нова линия, звезда, нова линия? Да? Да, за разлика от един език като Python, ако сте запознати, отстъп не значение за компютъра. Това само има значение за човека. Така че тук съм изобретил линии 15 и 16-- че изглежда красива, но компютърът не го е грижа. Компютърът се грижи за всъщност като фигурни скоби около тези редове код. Така че това е clear-- точно като в Scratch--, че тези два реда код трябва да бъде изпълнена. Като един от тези, жълт Scratch пъзел парчета отново и отново, и отново. Така че сега, ако аз отново стартирате тази program-- ./buggy-2-- Hm. Имам една грешка сега. Какво съм забравяйте да го направите? Да, така че аз не го компилирате. Така че се бъги-2. Няма такъв файл, защото аз не всъщност съставят втората версия. Така че сега интересно недекларирания не променлива-- 2. Правим една. Уверете се, бъги-1-- ./buggy-1-- и сега всеки от тях е на една и съща линия. Сега там е изключение това предполага, че твърдението на мина че имате нужда от тези фигурни скоби. Когато това е всъщност OK-- Ако сте забелязал в раздел или textbooks-- да пропусне фигурните скоби? Да? Точно така. Когато има само един линия на код, който искат да бъдат свързани с контур, както в първия ни пример. Тя е напълно законен да пропусне фигурните скоби просто като вид удобство от компилатора за вас. Да? Добър въпрос. Искате ли да се счита за грешка стил? Бихме promote-- като в CS50 стил ръководство, на URL адреса, за които е в pset1-- че винаги използвате фигурните скоби. Разбира се, ако сте нов в програмирането. Реалността е, че ние не сме няма да ви се забрани от извършване на тези удобства. Но ако сте само за да се в люлка на нещата, абсолютно просто винаги използвайте къдрава скоби, докато не получите цаката. Добър въпрос. Добре. Така че след това е бъг. Поне в нещо доста просто. И все пак може би си мислите това е доста елементарен, нали? Това е вид на първата седмица гледа на езика като, видите вашите грешки в него. Но реалността те са всъщност представител на някои доста плашещи проблеми които могат да възникнат в реалния свят. Така че някои от вас може да се припомни, ако следвате технологични новини, или може би дори хвана вятър от тази през февруари на изминалата година, че Apple е имал направи малко от грешка в двете IOS, операционната система на телефоните си, а също и Mac OS, операционната система на своите настолни компютри и лаптопи. А ти видя такива заглавия като това. И след това, Apple обеща да оправи този бъг, и много бързо направих го оправя в IOS, но след това в крайна сметка го поправя в Mac OS както и. Сега никой от тези заглавия сам наистина разкрие какъв е основния проблем, но грешката е в крайна сметка намалява до бъг в SSL, Secure Sockets Layer. И дълга история кратко, това е софтуер че нашите браузъри и други софтуер, използван за какво? Ако бях казал, че SSL е участва, когато посещение на URL, който започва с HTTPS, Какво тогава може да бъде свързана с SSL? Encryption. Така че ние ще говорим за това през следващите дни. Encryption, изкуството на кодиране на информация. Но дълга история кратко, Apple по някое време преди е направил грешка при тяхното изпълнение на SSL, на софтуер, който в крайна сметка изпълнява URLs като HTTPS или макс връзки там. Резултатът от които е, че вашият връзки може потенциално да бъдат засечени. И вашите връзки са не непременно криптирана ако сте имали някои лош човек в между вас и сайта на местоназначение, което знаеше как да се възползва от това. Сега Apple в крайна сметка е публикувал а оправи за това най-накрая, и описанието на тяхната корекция е това. Secure транспорт не успя да се утвърди автентичността на връзката. Въпросът беше разгледан от възстановяване на липсващите стъпки за валидиране. Така че това е един много ръка вълниста обяснение за просто казваме, че прецаках. Има буквално една линия на код, който е бъгав при тяхното изпълнение на SSL, и Ако отидете онлайн и търсене на тази всъщност можете да намерите оригиналния код. Например, това е снимка на екрана само част от един доста голям файл, но това е функция очевидно нарича SSL провери знак сървъра обмен на ключове. И това отнема куп аргументи и входове. И ние няма да се съсредоточи твърде много върху дреболии там, но ако се съсредоточи върху кода вътре на този най-горен function-- нека фокусирам върху това. Вие може би вече подозирате какво грешката може да бъде дори ако вие нямате представа в крайна сметка това, което търсите в. Има вид аномалия тук, което е това? Да, аз наистина не харесвам външния вид на два Гото провали. Честно казано, аз наистина не знам какво Гото провали средства, но като две от тях назад към гърба. Това просто вид ме трие интелектуално по грешен начин, и наистина, ако ние увеличите само тези линии, това е C. Така че много код на Apple сама по себе си, написани на C, и това очевидно е наистина equivalent-- не, че доста отстъп версия, но ако можете да разпознаете факта, че няма фигурни скоби, какво Apple наистина е написал е код, който изглежда по този начин. Така че аз съм в голям мащаб и аз просто фиксиран вдлъбнатината, в смисъл че ако няма фигурни скоби, че второ Иди провалят, че е в жълто ще се изпълни, без значение какво. Това не е свързано с , ако състоянието горе. Така че дори и отново, не, ако го направите доста разберем какво би могло да да се прави, да знаете, че всеки един от тях conditions-- всяка от тези линии е много важна стъпка в процес на проверка ако данните ви е в действителност кодирано. Така прескочите един от тях стъпки, а не най-добрата идея. Но тъй като ние имаме това второ Иди провали в жълто, и защото след като ние вид на естетически да го преместите в ляво, където логично е в момента, това, което означава това за линията на кода по-долу, че вторият Гото се провали ще си помислите? Тя винаги ще бъде пропуснат. Така gotos обикновено се гледат накриво по причини, ние не наистина ще отидат в, и наистина в CS50 ние не са склонни да преподават това изявление Гото, но можеш да се сетиш на Гото се провали в смисъл Go скок някаква друга част от кода. С други думи прескачат този последен ред изобщо, и по този начин резултатът от тази глупава просто грешка, която е само В резултат на вероятно някой копиране и вмъкване на един твърде много пъти е, че цялата сигурността на IOS и Mac OS е уязвима за подслушване от лошите момчета за доста дълго време. Докато Apple най-накрая определи това. Сега, ако някои от вас са всъщност използвате стари версии на IOS или Mac OS, можете да отидете на gotofail.com които е уебсайт, че някой създаде по същество определя програмно Ако компютърът ви е все още уязвимо. И честно казано, ако е така, това е може би е добра идея да актуализирате вашия телефон или Вашия Mac в този момент. Но там, просто доказателство за това колко оценка на тези по-ниско ниво детайли и справедливо прости идеи наистина може да се трансформира в решения и проблеми, които affected-- в тази case-- милиони хора. Сега няколко думи за администриране. Раздел ще започне идната неделя. Вие ще получите имейл от уикенд за точка, при която точка процеса на resectioning ще започне, ако сте Осъзнах, че сега имаме някои нови конфликти. Така че това се случва всяка година, а ние ще се настанят в идните дни. Office hours-- направя държи под око на този график тук. Променя малко тази седмица, особено времето за стартиране и мястото, така че да се консултира че преди да замине за работно време всяко от следващите четири нощи. А сега няколко думи за оценка, особено като се потопите в проблем задава един и извън нея. Така на спецификацията, по принцип тези картинки са осите, по който ние оценяваме вашата работа. Обхват се отнася до това, степен кодовите си сечива необходими функции от нашата спецификация. С други думи, колко от парче набор нали отхапе. Ти ли направи една трета от него, половината от него, 100% от него. Дори ако това не е правилно, колко ли се опитват? Така че, който улавя нивото на усилията и количеството към който отхапа проблеми проблем поставените му. Correctness-- този един, за да каква степен е вашият код в съответствие с нашата спецификации и без грешки. Така работи той правилно? Ако ние го дам някои вход, той прави ни даде резултат, който ние очакваме? Design-- сега това е първият от на особено качествени такива, или тези, които се нуждаят от човешката преценка. И наистина, това е защо ние имаме персонал на толкова много учебни сътрудници и разбира се асистенти. До каква степен е вашият код, написан добре? И отново това е много качествена оценка които ще работят с вас на двупосочно в идните седмици. Така че, когато не се само числови резултати, но също така на писмените резултати, или написали обратна връзка, или писмено обратна връзка в английските думи. Това е, което ние ще използваме, за да шофирате към пишейки по-добре код. И в лекция и раздел, ние ще се опитаме да посоча out-- толкова често, колкото ние can-- това, което прави една програма не само правилното и функционално добре, но също така и добре организиран. Най-ефективните тя може да бъде, или дори и най-красивите тя може да бъде. Което ни води до стил. Стил в крайна сметка е естетическо решение. Избрахте ли добър имена на променливи? Били ли сте с отстъп вашия код правилно? Има ли изглежда добре, и следователно, е лесен за друго човешко същество да четете съответната на неговата правилност. Сега обикновено на учебната програма, ние отбележи тези неща, по скала от пет точка. И нека ме чука дома точката че три е наистина добре. Много бързо направи хора започнете да правите аритметика. Когато те ще получат три от пет за вярност, за някои pset и те мислят по дяволите, отивам до 60% който е по същество D или Е. Това не е начинът, по който мисля, че на тези номера. A три е наистина добро, и това, което ние обикновено се очаква в началото на срока е, че ако сте се куп three's-- може би няколко на панаири, няколко fours-- или няколко двойки, няколко fours-- това е едно добро място да започнете. И така, докато ние виждаме нагоре траектория с течение на времето, вие сте в особено добро място. Формулата ние използваме, за да тегло неща е по същество тази на учебната програма, което просто означава, че ние придадат повече тежест на коректност. Защото това е много често коректност че отнема най-много време. Повярвай ми сега. Ще find-- най-малко в един pset-- че прекарват 90% от времето си работи на 10% от проблема. И всичко някак работи с изключение на една или две грешки, и тези, които са буболечки, че ви държи до късно през нощта. Това са тези, които нещо ви избяга. Но след спи върху него, или посещаване работно време или задаване на въпроси онлайн, се когато стигнем до тази цел 100%, и това е защо ние тегло коректност най-много. Проектиране на малко по-малко, и оформите по-малко от това. Но имайте mind-- стил е може би най-лесният от тях да отхапе според ръководството за стил. И сега, по-сериозна обърнете внимание на академична честност. CS50 има жалко разграничение на е най-големият производител на Ad Board случаи почти всяка година исторически. Това не е така, защото студентите мамят в CS50 повече, отколкото всеки друг клас, но тъй като по природа на работата, на факта, че е електронен, на факта, че ние го търсим, и факта, че са компютърни специалисти, Мога да кажа, ние сме за съжаление много добър в това откриване. И така, какво означава това в реални условия? Така че, на учебната програма, философия на курса наистина се свежда да бъдат разумни. Налице е тази линия между прави едно дело на собствения си и получаване на малко разумна помощ от приятел, и категорично прави тази работа за вашия приятел, или него или нея кода изпращане така че той или тя може просто да вземе или да го взема назаем от полето. И това пресича линията че изготвен в класа. Виж, учебната програма в крайна сметка за линиите че ние привличаме като разумен и неразумно поведение, но това наистина се свежда до същността Вашата работа е необходимо да се бъдете собствения си в края. Сега с това каза, има евристичен. Тъй като може да imagine-- от работното време и графика и видеоклипове, с които сме се показано по този начин far-- CS50 наистина трябвало да бъде като съвместно и като кооперация и като социална възможно. Както сътрудничество, тъй като е строг. Но с това заяви, евристичните, както ще видите в учебната програма, е, че когато имате някакъв проблем. Имате някакъв бъг в кода си, че сте не може да реши, че е разумно за вас да се покаже вашия код на някой друг. Един приятел, дори и в класа, приятел който седи до вас в работно време, или член на персонала. Но те не могат да покажат своя код за вас. С други думи, една отговори на вашето въпрос- Имам нужда help-- не е о, тук е моят код. Обърнете внимание на това и извлече от него каквото искате. Сега, разбира се, има начин ясно да игра тази система, в която аз ще ви покажа моя код преди като въпрос. Вие ми покажете ми кода си преди като въпрос. Но виж учебната програма отново за фини подробности относно това къде тази линия е. Просто сега рисува картината и акции като прозрачно, колкото е възможно къде сме ние в през последните години, Това е броят на случаите Ad съвет че CS50 е имал над През последните седем години. В 14 от случаите това най-скорошно падане. По отношение на участващите студенти, това е 20 някои странни студенти през изминалата есен. Имаше пик от 33 студенти, преди няколко години. Много от тях са за съжаление вече не е тук, на територията на колежа. Учениците участват като процент от клас е исторически варира от 0% до 5,3%, което е само за да се каже, това е ежегодно предизвикателство. И към тази цел, това, което ние искаме да направим, е предам едно че ние dd-- просто FYI-- сравнявате най- на справедливост за тези студенти, които са следвайки линията съответно. Ние правим сравнение всички настоящи изявления срещу всички минали мисии от последните много години. Ние знаем също как да Гугъл около и да намерят код хранилища онлайн дискусионни форуми онлайн, сайтове за работа онлайн. Ако един ученик може да го намерите, ние със сигурност може да Определят го като толкова, колкото ние за съжаление направи. Така че това, което ще видите в учебната програма обаче, е тази клауза съжаление. Аз мога със сигурност оценявам, и всички ние трябва персонал е направил хода като това, или това се едно течение на времето, Със сигурност знам какво е, когато животът стане по начина, когато имате някои късно вечер deadline-- не само в този клас, но another-- когато сте напълно изтощени, стресирани, има прекалено много на други неща за вършене. Вие ще направи в някакъв момент в живот със сигурност е лошо, може би в края нощ решение. Така на учебната програма, има тази клауза, такива, че ако в рамките на 72 часа след вземане на някои лошо решение, което притежавате, за да го и да достигне до мен и една от главите на курса и ние ще имаме разговор. Ние ще се справят с неща, вътрешно в надежди той да се превърне по-скоро преподаване момент или житейски урок, а не нещо, с особено драстични последици както можете да видите на тези графики тук. Така че това е един много сериозен тон. Нека спрем за само няколко секунди, за да се прекъсне напрежението. [За възпроизвеждане на музика] DAVID J. Malan: Добре, И така, как беше, че за Segue? За днешните първични теми. Първият от които е абстракция. Друг от които ще бъде представяне на данни, което честно казано е наистина сух начин да се каже как можем да отида за разрешаване на проблеми и мислене за решаване на проблеми? Значи вие сте виждали в Scratch и сте виждал може би вече в pset1 с C че не само може да се използва функции, като ФОРМАТ, че други хора в последните години пише за вас. Можете също така да пишете свои собствени функции. И въпреки че не може да има направи това в C, и честно казано в pset1 вие наистина не трябва да напишете вашето собствена функция, защото problem-- а може би и най-трудна първо glance-- ще видите в крайна сметка може да бъде решен с Не всички, че много редове код. Но с това каза, по отношение на писане на вашата собствена функция, осъзнават, че C не дава вие тази възможност. Отивам да отидат в днешния изходния код, който е на разположение вече онлайн, и аз отивам да вървим напред и отворен създаване на програма, наречена функция 0.C, и в зависимост нула ще видим няколко неща. В първите линии 18 чрез 23 е моята основна функция. И сега, че ние започваме да се чете код, който ние не пишеш в движение, но вместо това съм написал по-рано или че сте в проблем зададете може да получите като е написано предварително. Един добър начин да започнете четене код на някой друг е основната функция изглежда. Разбера, където този запис точка е за изпълнението на програмата, и след това да го следват логично от там. Щом тази схема очевидно отпечатъци си име, последвано от двоеточие. Ние след това използвайте GetString от библиотеката CS50 за да получите низ, или една дума или фраза от потребителя на клавиатурата. И тогава там е това нещо тук-- PrintName. Сега PrintName не е функция, която идва с C. Това не е в стандартен io.h. Това не е в CS50.h. Това е по-скоро в един и същи файл. Забележете, ако превъртете надолу а bit-- линии 25 до 27-- това е просто едно красиво начин на коментиране вашия код с помощта на звездите и наклонените черти. Това е мулти-лайн коментар, а това е просто описание ми в синьо на какво прави тази функция. Защото в редове от 28 до 31, Писал съм супер проста функция чието име е PrintName. Това отнема колко аргументи бихте казали? Така че един argument-- защото има един аргумент, изброени в скобите. В зависимост от типа на които е String. Което ще рече, PrintName е като тази черна кутия или функция, която се като вход низ. А името на тази String удобно ще бъде Name. Не е S, а не N, но име. Е, какво значи PrintName направя? Хубаво е проста. Точно както една линия на код за на ФОРМАТ, но очевидно го отпечатва "Hello", така и така. Когато така и така идва от аргумента. Сега това не е огромен иновациите тук. Наистина, аз съм взел програма, която би могла са написани с един ред код от въвеждането на този тук, и го променя на нещо , който включва някои шест или седем, или така реда код чак тук. Но това е упражняването на принцип, известен като абстракция. Вид на капсулиране вътрешността на нова функция, която има име, и по-добре Все още това име буквално казва това, което прави. Искам да кажа, че не е printf-- особено описателно. Ако искате да създадете пъзел парче, или ако искате да създадете функция който отпечатва нечие име, красотата на този начин е, че всъщност мога да даде тази функция име , който описва какво прави той. Сега е необходимо в един вход, че Аз съм произволно нарече, но това също е чудесно описателен вместо да бъде малко по- родово като S. и нищожен, за сега, просто означава, че тази функция не ми върне нищо. Това не е като GetString че буквално ми подава обратно низ както направихме с листчетата със съучениците си миналата седмица, а просто има страничен ефект. Той отпечатва нещо на екрана. Така че в края на деня, ако съм правят функция-0, ./function-0, ще видим, че тя пита за името ми. I тип Давид и го типове името ми. Ако аз го направя отново с Роб, тя ще каже: "Здравейте, Роб." Така че една проста идея, но може би екстраполира от този психически че като вашите програми получават малко по-сложно, и искате да напишете парче код и призив, че code-- Invoke че code-- от някои описателен име като PrintName, C прави позволят ни тази способност. Ето още един прост пример. Например, ако аз отворим файл от днес се нарича return.c, забележите това, което съм направил тук. Повечето от тази основна функция е ФОРМАТ. За първи път произволно инициализира променлива, наречена X до номер 2. Тогава аз разпечатате "х сега е % I "преминаване на стойността на х. Така че аз просто казвам какво е то. Сега съм просто смело твърдейки, с ФОРМАТ. Аз съм джуркате тази стойност х, и аз съм това, като се обадите функция наречена куб преминаване в х като аргумент, и след това го запишете на изхода в самата променлива, х. Така че аз съм докара пред стойността на х. Аз съм по-висш от стойност на X с каквото в резултат на обадите Кубът функция е. И тогава аз просто разпечатате някои пухкави неща тук казвайки това, което направих. Така че това, което след това е куб? Забележете, това, което е фундаментално различно тук. Дадох функцията име, както и преди. Аз определено име за аргумент. Този път тя се нарича п вместо име, но можех да го наричаме нещо, което искам. Но това е различно. Това нещо в ляво. Преди това е това, което ключовата дума? Boys. Сега е очевидно вътр. Така че това, което е може би най отнеме? Като има предвид, невалидни означава вид нищото, и че е било така. PrintName връща нищо. Тя направи нещо, но това не ме върне нещо, което бих могъл да постави на лявата страна на знака за равенство като съм направил тук, на ред 22. Така че, ако кажа в по линия 30, какво е това вероятно предполага за това, което куб прави за мен? Да? Тя връща цяло число. Така че това ми подава обратно, за Например, парче хартия , на която е написан отговора. 2 кубчета или три кубчета или 4 cubed-- каквото минах в, и как съм приложи това? Ами, просто п пъти п пъти п как мога да Cube стойност. Така че отново, супер проста идея, но демонстративна сега как можем да напишем функции че всъщност ни беше с гръб ценности, които могат да бъдат от интерес. Нека разгледаме един последен пример тук се нарича една функция. В този пример, той започва за да получите по-наложителна. Така че в една функция, този program-- известие в крайна сметка призовава функция, наречена GetPositiveInt. GetPositiveInt не е функция в библиотеката CS50, но ние решихме бихме искали да съществуват. Така че, ако ние превъртете надолу, по-късно във файла, забележите как отидох за прилагане получите положителен INT, и аз Казват, че е по-убедителен защото това е един приличен брой редове код. Това не е просто една глупава малка програма играчка. Това е всъщност имам някои проверка за грешки и прави нещо по-полезно. Така че, ако не сте виждали помагалото видеоклипове, които сме вградени в pset1, Знам, че това е вид цикъл в C, подобно на дух за вида на неща Scratch да направя. И не казва да направите това. Печат това. След това отидете напред и да получите n-- получите INT и да го съхранява в N, и продължавате да правите това отново и отново, и отново доколкото п е по-малко от едно. Така че п ще бъде по-малко от една само ако човек не е оказал съдействие. Ако той или тя пише в 0 или -1 или -50, този цикъл ще се запази Изпълняващият отново и отново. И в крайна сметка забележите, аз просто върне стойност. Така че сега ние имаме функция че щеше да е хубаво ако CS50 ще въведе в CS50.h и CS50.c за вас, но тук можем да се приложи това себе си. Но две забележки относно някои ключови подробности. Едно-- защо Декларирам, вътр N, мислиш ли, че, по линия 29 вместо просто да правиш този тук, който е по-последователно с това, което направихме миналата седмица? Да? Една добра мисъл. Така че, ако бяхме да го сложи тук, това е като че ли да го декларира отново и отново. Това само по себе си е не са проблематични, сами по себе си, защото ние само трябва стойността веднъж и след това ние отиваме, за да получите нова или иначе. Но една добра мисъл. Да? Close. Така че, тъй като съм обявен за п Онлайн 29 извън контура, това е достъпно през цялата тази функция. Не другите функции, защото п е все още вътре в тези къдрава скоби тук. Че-- сигурен. Точно така. Така че това е още по-важно. Ако вместо обявена п точно тук на ред 32, това е проблематично, защото предполагам къде другаде трябва да го отворите? На линия 34, както и на просто правило на палеца е , които можете да използвате променлива само вътрешната страна на най-новите фигурни скоби в която го декларира. За съжаление, линия 34 е една линия, твърде късно, защото аз вече съм затворен на фигурна скоба на ред 33 , която съответства на фигурна скоба на ред 30. И така, това е начин да се каже че тази променлива INT е с обхват, така да се каже, само вътре на тези фигурни скоби. Тя просто не съществува извън тях. Така че наистина, ако направя това грешна, нека ме спаси кода тъй като тя е-- неправилно написани. Нека да вървим напред и да се направи функция-1, и notice-- грешка. Използване на недекларирания идентификатор п по линия 35, което е точно тук. И ако ние се придвижите нагоре Освен това, още една. Използване на недекларирания идентификатор N по линия 34. Така компилатора, звъня, се забележи, че тя просто не съществува макар ясно, че е там визуално. Така че просто корекция е обявяването му там. Сега нека да преминете към в горната част на файла. Какво скача към теб като е малко по-различно от нещата, които погледна миналата седмица? Не само, че имам име, не само ги вършат Имам някакъв остър включва до върха, Имам нещо, което аз съм наричайки прототип. Сега, изглежда ужасно, подобен на това, което току-що видяхме преди малко по линия 27. Така че нека да се направи извод от различен съобщение за грешка, защо съм направил това. Нека да вървим напред и да изтриете тези линии там. И така, ние не знаем нищо за прототип. Римейк този файл. Направете една функция. И сега, по дяволите, четири грешки. Нека превъртете до първия милион. Скритият декларация на функция получите положителен INT е невалиден в C99. C99 просто означава 1999 версия на езика C, което е това, което ние наистина използвате. И така, какво означава това? Е C-- и по-специално C compilers-- са доста тъпи програми. Те знаят само това, което сте им казах, и това е всъщност тематична от миналата седмица. Проблемът е, че ако отида за прилагане на име тук, и аз призовавам функция, наречена GetPositiveInt тук по линия 20, тази функция технически не прави съществува, докато компилаторът вижда ред 27. За съжаление, компилаторът е правене на нещата отгоре, надолу, наляво, надясно, така, защото не е видял изпълнение на GetPositiveInt, но го вижда опитваш да го използвате до тук, това е просто ще bail-- крещиш ти с една грешка message-- може би загадъчен, а не действително компилира файла. Така че т.нар прототип нагоре тук е наистина излишно. Буквално, слязох тук и аз копирани и поставили това, и аз го слагам тук. Void би било по-правилно, така че ние ще буквално го копирайте и поставете този път. Аз буквално копирани и го поставили. Наистина, точно както като хляб троха. Малко ключ към компилатора. Аз не знам какво прави това все още, но аз обещавам да ви че в крайна сметка ще съществуват. И това е защо това line-- в Онлайн 16-- завършва с точка и запетая. Това е излишно, като дизайн. Да? Ако не сте се свърже вашата библиотека да по-- О, добър въпрос. Sharp включва заглавния файл включвания. Необходимо е да се е-- трябва почти винаги да бъде на върха на файла за similar-- за точно по същата причина, да. Защото в стандарт io.h е буквално линия по този начин, но с думата ФОРМАТ, и със своите аргументи и неговия вид замяна. И така, като направите остър включва до тук, това, което вие сте буквално прави е копирането и поставянето на съдържанието на някой друг е написал до върха. По този начин cluing кода си в до факт е, че не съществуват тези функции. Да? Абсолютно. Така че е много умен и правилен решение би било, знаеш ли какво? Аз не знам какво е прототип е, но знам, ако аз разбирам, че C е само тъп и преосмисля горе до долу. Ами нека да го даде това, което иска. Да се ​​намали този код, да го поставите до върха, а сега настоява основната по-долу. Това също би могла да разреши проблема. Но бихте могли много лесно да излезе с сценарий, при който е необходимо да се обадите B, а може би и B призовава обратно към А. Това е нещо, което се нарича рекурсия, и ние ще се върнем към това. И може или не може да бъде добър нещо, но определено може да се прекъсне този разтвор. И нещо повече, аз ще твърдят, стилистично, особено когато вашите програми стане това дълго и толкова дълго, това е просто супер удобно да постави основен в горната защото това е нещо, което най- програмисти, които ще се грижат за. И така, това е малко по-чисти, може би, за да го направим по начина, по който Аз първоначално го е направил с прототип дори въпреки че изглежда малко излишни на пръв поглед. Да? За съжаление, мога да ви го кажа по-силен? Ако включите местоположенията на изпълнение и прототип? Така че това е добър въпрос. Ако отново декларира това надолу тук, нека да видим какво ще стане. Така че, ако го сложа надолу тук, което казваш. О, съжалявам. Louder? Дори и по-силно. О, добър въпрос. Бихте го обезсили функцията? Знаеш ли, след всички тези години, аз никога не сложи прототип след това. Така че нека да направим направи функция-1 след като направим това. [Мърмори] DAVID J. Malan: О, чакай. Ние все още трябва да сложите всичко отгоре. Така че нека да направим това тук, ако съм разбиране на въпроса ви правилно. Слагам всичко, включително и прототипът над основната, но аз съм пускането на прототипа долу изпълнението. Така че, ако се направи една, аз съм се грубо error-- неизползван променлива п. О, има. Благодаря ви. Да видим, ще се отървем от това. Това е друг бъг, така че нека да се игнорира това. Нека наистина бързо римейк това. ОК, така че не аргумент данни използва от формат String n-- О, това е така, защото Смених с тези тук. Добре, ние знаем какво отговора ще да-- Добре, ето ни и нас. Ах, благодаря за положителното. Добре, аз ще се оправя този код after-- игнорира този бъг тъй като това беше-- тя работи е отговорът. Така че няма да презапише това, което току-що сте направили. Подозирам, че компилаторът е написана по такъв начин, че тя се игнорира си прототип защото тялото, така да се каже, на функцията вече са изпълнени по-нагоре. Аз ще трябва да всъщност се консултира ръководството на компилатора да се разбере дали има някаква друга Отражение, но на пръв поглед просто като се опитва и да експериментират, изглежда има никакво влияние. Добър въпрос. Така че нека да продължат напред сега, движещи далеч от нежелани реакции, които са функции, които правят нещо подобно визуално на екрана с ФОРМАТ, но не връщат стойност. И функции, които имат възвръщаемост ценности като току-що видяхме няколко от. Вече видяхме това понятие на обхват, и ще видим това отново и отново. Но за сега, отново, използвате правилото на палеца че променлива може да се използва само от вътрешната страна на най-наскоро отвори и затворени фигурни скоби, тъй като ние видях в този конкретен пример. И както ти посочи, има ability-- бихте могли да решим някои от тези проблеми чрез въвеждане на променлива в световен мащаб на самия връх на даден файл. Но в почти всички случаи, ние ще се мръщят на това, и наистина не дори да отидете в това решение за сега. Така че за сега, на храна за вкъщи е, че променливи имат тази идея за обхват. Но сега нека погледнем в друга сух начин всъщност търсите при някои доста интересно детайли за изпълнение. Как бихме могли да представляват информация. И ние вече разглеждали този в първата седмица на класа. С поглед към изпълними файлове, и да си припомним знак. Но спомням си от миналата седмица, че C е различни типове данни и букети повече, Но най-полезни тези за сега може да са тези. A Чар, или символ, което се случва, е един байт, или осем бита общо. И това е да се каже, че размерът на знак е само един байт. A байт е осем бита, така че това означава, че ние може да представлява колко символи. Колко писма или символи на клавиатурата ако имаме един байт или осем бита. Помислете обратно към нулево седмица. Ако имате осем бита, колко общите ценности може да ви представляват, с модели на нули и единици? Едно-- повече от това. Така 256 общо, ако започне броенето от нула. Така че, ако имате осем bits-- така че, ако ние Трябваше ни двоични крушки тук отново, ние може да се превърне тези крушки на и изключване във всяка от 256 уникални модели. Сега това е малко проблематично. Не толкова за английски и романски езици, но със сигурност когато се въведе, за Например, азиатски езици, които има много повече символи, отколкото като 26 букви от азбуката. Ние всъщност може да се наложи повече от един байт. И за щастие в последните години обществото приети други стандарти, които използват повече от един байт с едно зареждане. Но за сега в C, по подразбиране е само един байт или осем бита. Едно цяло число, междувременно, е четири байта, иначе известни като 32 бита. Което означава, че това, което е възможно най-голям брой можем да представим с вътр очевидно? С един милиард. Така че това е четири милиарда или да се даде. 2 към 32th власт, ако ние не поемат отрицателни числа и просто да използвате всички положителни номера, това е четири милиарда или да се даде възможности. A плувка, междувременно, е различен тип на тип данни в C. Това е още един номер, но това е реално число. Нещо, с десетична запетая. И се оказва, че C също така използва четири байта да представляват числа с плаваща запетая. За съжаление колко плаващ точкови стойности има в света? Колко реални числа са там? Има един безкраен номер, и за този въпрос има безкраен брой числа. Така че ние вече сме вид се копае дупка тук. Чрез която очевидно в computers-- в най-програми, написани на C на them-- могат само да разчитат толкова висока, колкото четири милиарда или да се даде, и стойности с плаваща запетая може само привидно има някои ограничен размер на точност. Само толкова много цифри след им десетична запетая. Защото, разбира се, ако имате само 32 бита, Аз не знам как ще да отида за представляваща недвижими numbers-- вероятно с различни видове модели. Но има със сигурност един краен брой на такива модели, така че тук, също, това е проблематично. Сега можем да се избегне проблемът съвсем леко. Ако не се използва поплавък, бихте могли да използвате двойно в C, която ви дава осем байта, които е начин повече възможни модели на нули и единици. Но тя все още е ограничен, което се случва да бъде проблематично, ако пишете софтуер за графика или за фантазия математическите формули. Така че може би наистина искате да брои до по-голямо от това. А дълго long-- глупаво named-- е осем байта, или 64 бита, и това е два пъти по-дълго като междинно съединение, и това е за дълго цяло число. Fun fact-- ако пад е четири байта, колко дълго е дълго в C обикновено? Също четири байта, но дълго време е осем байта, и това е по исторически причини. Но храна за вкъщи сега е само, че има данни които трябва да бъдат представени в computer-- това е физическо устройство с електричество, това е обикновено шофиране тези нули и ones-- с ограничени количества прецизност. Така че, какъв е проблемът тогава? Ами там е проблем на число преливник. Не само в C, но в компютри като цяло. Например, ако този е един байт струва bit-- Така че, ако това е осем bit-- всички от които са номер едно. Какъв номер е това представляваща ако приемем, това е всички положителни ценности в двоичен? 255, и това не е 256, защото нула е най-малък брой. Така че 255 е най-високата един, но проблемът е предполагам, че аз исках да увеличите тази променлива, която използва осем бита общо ако искам да я увеличите. Е, веднага след като добавите един на всички тези хора, Може би можете да си представите visually-- просто като носещ един използване decimals-- Нещо ще се влеят в ляво. И наистина, ако добавите номера едно с това, което се случва в двоичен е, че прелива обратно до нула. Така че, ако вие не само Използвай, едно цяло число, но един байт да брои числа в програма, от default-- веднага след като можете да получите до 250, 251, 252, 253, 254, 255-- 0 идва след 255, които вероятно не това, което е потребител се случва да се очаква. Сега междувременно в плаваща запетая свят, и вие имате подобен проблем. Не е толкова много, с най-голям номера му въпреки че все още е проблем. Но с размера на точност , които можете да представляват. Така че нека да разгледаме този пример тук също така и от днешния източник code-- плаваш-0.c. И забележи, че е супер проста програма, която трябва очевидно разпечатате каква стойност? Какво искаш да се обзаложа, че това ще да отпечатате въпреки че там е малко на нов синтаксис тук? Така че се надяваме 0.1. Така че еквивалентът на една десета защото аз правя един разделен на 10. Аз съм съхраняване на отговора в променлива, наречена F. Тази променлива е от тип поплавък, който е ключова дума, аз просто предложен съществувала. Ние не сме виждали това и преди, но това е вид чист начин в ФОРМАТ за да определите колко много цифри ви Искам да видя след десетичната запетая. Така че това просто означава, нотация че тук е запазено. Това е за плаваща запетая стойност, и о, между другото, го покаже с десетичната точка с един номер след десетичната точка. Така че това е броя на значещи цифри, така да се каже, че може да искате. Така че нека да вървим напред и да направим направи плувка-0, ./float-0, и очевидно 1 разделен от 10 е 0.0. А защо е това? Е отново, компютърът е като ми буквално, и съм написал една и писах 10, и да предположите какво е предполагаемата тип данни за тези две ценности? An INT, това е технически нещо малко по-различно. Това е обикновено дълго, но това е крайна сметка неразделна стойност. Не е на стойност с плаваща запетая. Което ще рече, че ако това е едно цяло число, а това е едно цяло число, проблемът е, че компютърът не са в състояние дори да се съхранява, че десетичната точка. Така че, когато правиш една разделена от 10, използвайки числа За двата числителя и знаменател, отговорът трябва да бъде 0,1. Но computer-- защото тези, които са integers-- не знам какво да правя с 0.1. Така че това, което е ясно правиш? Това е просто да го изхвърлите, и това, което аз виждам в крайна сметка е 0.0, само защото аз настоявах, че ФОРМАТ ми покаже един знак след десетичната точка. Но проблемът е, че ако разделят цяло число от цяло число, ще get-- по дефиниция C-- на цяло число. И това няма да правя нещо хубаво и удобно като около него до близката една нагоре или надолу. Това ще съкрати всичко след десетичната. Така че просто интуитивно, това, което най-вероятно е корекция? Какво е най-лесният начин тук? Да? Точно така. Защо просто не се лекуват тези като ефективно стойности с плаваща запетая превръщането им в поплавъци или двойки. И сега, ако го направя да плувки-0, или ако компилирате плувки-1, която е идентична това, което е просто предложи. И сега аз правя плувки-0, сега аз да си взема 0.1. Сега това е невероятно. Но сега аз отивам да правя нещо малко по-различно. Любопитен съм да видя какво е наистина става под капака, и аз отивам да отпечатате тази до 28 знака след десетичната запетая. Искам наистина да видим 0.1000-- на infinite-- [Недоловим] 27 нули след това 0.1. Ами нека да видим дали това е това, което аз наистина се получи. Направете плувки-0 същия файл. ./floats-0. Нека да се фокусирам върху драматичната отговор. През цялото това време, вие сте били мислене 1 разделен от 10 е 10%, или 0.1. Това не е така. Поне доколкото компютър загрижен. Сега защо-- OK, това е пълна лъжа 1 разделен от 10 е 0.1. Но Защо-- че не е днес на храна за вкъщи. Така че, защо компютъра мисля, за разлика от всички нас в стаята, че един разделен от 10 е всъщност, че луд стойност? Какво е компютърът прави очевидно? Какво е това? Това не е прелее, само по себе си. Overflow е обикновено, когато ви обгърне стойност. Това е този въпрос на неточности в стойност с плаваща запетая където имате само 32 или може би дори 64 битов. Но ако има един безкраен номер на недвижими numbers-- числа с десетични точки и номера thereafter-- сигурност вие не може да представлява всички от тях. Така че компютърът е дал ни най-близкото съвпадение до стойност, която може да представлява използване на тази много бита на стойност Аз всъщност искам, което е 0.1. За съжаление, ако сте започнете да правите математика, или започнете с участието на тези видове плаващ точкови стойности във важни programs-- финансов софтуер, военна software-- нищо където възприятие е вероятно доста важно. И започнете да добавяте номера по този начин, и да започне използвате този софтуер с наистина големи входове или за много часове или много на ден или на много години, тези мънички грешки със сигурност може да добавите до течение на времето. Сега като настрана, ако някога сте виждал Супермен 3 или Office Space и може да се припомни, как тези момчета са откраднали много пари от компютъра си с помощта на числа с плаваща запетая и добавяне на малкото остатъци, да се надяваме, че филм Сега има повече смисъл. Това е, което те са били намеквайки в този филм. Фактът, че най- дружества, които не биха изглеждали след определен брой на знака след десетичната запетая, но тези, които са части от цента. Така че да започнете да ги добавяте нагоре, започнете да се правят много пари в банковата си сметка. Така че това е Office Space обясни. Сега за съжаление извън Office Space, има са някои законно тревожна и значителни въздействия на тези видове основните дизайнерски решения, и всъщност една от причините, ние използваме C в хода е, така че наистина трябва на това основание до разбиране за това как работят компютрите, как софтуер работи, и не приемайте нищо за даденост. И наистина, за съжаление, дори с това основно разбиране, ние, хората правят грешки. И това, което мислех, че ще споделя е това осем минути видео тук взето от епизод модерна чудеса, които е образователно шоу за това как работят нещата че рисува две картини кога неправилна употреба и разбиране на стойности с плаваща запетая довел до значително злощастни резултати. Нека хвърлим един поглед. [VIDEO PLAYBACK] -Ние Сега се върнем към "Engineering Бедствия "на съвременни чудеса. Компютри. Всички Дойдохме да приеме често разочароващ проблеми, които имам с them-- бъгове, вируси, и софтуер glitches-- за малки цени да плащат за удобство. Но във високи технологии и висока скорост военни и космическата програма на приложения, най-малкият проблем може да се възвеличи в бедствие. На 4 юни 1996 г., подготвени учени да започне безпилотен Ariane 5 ракета. Той е превозвал научна спътници, предназначени за да се установи как точно Магнитно поле взаимодейства Земята със слънчеви ветрове. Ракетата е била построена за Европейската космическа агенция, и излетя от неговото съоръжение на брега на Френска Гвиана. -При Около 37 секунди след на полета, те първа Забелязах, че нещо не е наред. Това, че дюзите са въртящи по начин, те наистина не трябва. Около 40 секунди след началото на полета, ясно на превозното средство е бил в беда, и това е, когато те направиха решението да го унищожи. Служителят по безопасността гама, с огромни вътрешности, натисна бутона и взриви ракетата, преди да може да се превърне в опасност за обществената безопасност. -Това Беше девойката Плаването на Ariane 5, и разрушаването му отне място, защото на пукнатината вградени в софтуера на ракетата. -Таблицата Проблем на Ariane е, че има е номер, който изисква 64 бита за да изразят, и те искаха да конвертирате да 16-битово число. Те Предполага се, че броят никога няма да бъде много голям. Че повечето от тези цифри в броя на 64-битов са нули. Те са били погрешно. -Таблицата Невъзможност на една софтуерна програма, за да приемете вида на номер, генериран от друг е бил в основата на провала. Разработка на софтуер се е превърнала в много скъпа част от новата технология. Ariane 4 ракета имаше бил много успешен. Така че голяма част от софтуера, създаден за Той също така е бил използван в Ariane 5. -Таблицата Основен проблем беше, че Ариана 5. Беше faster-- ускори по-бързо и софтуерът не е отчело тази. -Таблицата Унищожаване на ракетата Беше огромна финансова катастрофа. Всичко се дължи на грешка в минута софтуер. Но това не е първият, време проблеми данни за реализациите преследвало модерна ракета технология. -В 1991 г. с началото на първата война в Персийския залив, ракетата Patriot преживя подобен вид проблем номер преобразуване. И като резултат 28 people-- 28 Американските soldiers-- са били убити, и около сто ранени. Когато Patriot, които е трябвало за защита срещу входящи ракети Скъд, не успя да изстреля ракета. Кога Ирак нахлу в Кувейт, и Америка стартира Пустинна буря в началото на 1991 г. Бяха разгърнати ракетни батареи Пейтриът за защита на Саудитска Арабия и Израел от иракски ракети Скъд атаки. Патриотът е среден обсег на САЩ повърхност-въздух система произведен от компанията Raytheon. -Таблицата Размер на Patriot прехващачи itself-- това е дълга около приблизително 20 фута, и тежи около 2000 паунда. И носи бойна глава от около, Мисля, че е около £ 150. И самата бойна глава е високо експлозивни, които има фрагменти около него. Така че в обвивката на бойната глава е проектирана да действа като едри сачми. -Таблицата Ракети са проведени четири на контейнер, и се транспортират с полуремарке. Система -Таблицата Patriot противоракетна датира най-малко 20 години. Тя е била първоначално проектирана като ракета въздушна отбрана да свалят вражески самолети. В първата война в Персийския залив когато тази война дойде, Армията искаше да го използвате, за да свалят ракети Скъд не, самолети. Иракското ВВС беше не е толкова голям проблем, но армията е притеснен за Скъд. И така, те се опитаха да ъпгрейд на Patriot. -Intercepting Враг ракета пътуване в Mach 5 щеше да бъде достатъчно голямо предизвикателство. Но когато Patriot се втурна в експлоатация, Армията не е бил наясно с иракски модификация, която направи си Скъд почти невъзможно да се. Какво се е случило е, че Скъд идваха бяха нестабилни. Те бяха колеблив. Причината за това е Iraqis-- За да получите 600 километра от на 300 км обхват missile-- взе тегло от предната бойна глава, и е направил бомбата запалка. Така че сега Patriot се опитва да дойде в Скъд, и повечето от time-- преобладаващото мнозинство от time-- тя просто ще лети от Скъд. -След Оператори Пейтриът система осъзнал Патриотът пропусна целта си, те взривена бойна глава на Патриотичния за да се избегнат евентуални жертви, ако се оставя да падне на земята. Това беше това, което видяха, повечето хора като големи огнени топки в небето, колкото и неразбрани подслушване на Скъд бойни глави. -Although В нощното небе, патриотите изглежда се успешно унищожаване Скъд, в Dhahran може да има Не се заблуждавайте за нейната ефективност. Има радарна система на Патриотичния Загубих представа за входящо Scud и никога не стартира поради до софтуерен недостатък. Беше израелците, които първи открили че вече системата е било включено, толкова по-голямо разминаването време стана. Поради часовник вграден в компютъра на системата. -За Две седмици преди трагедията в Dhahran, израелците докладвани Министерството на отбраната че системата е загуба на време. След около осем часа на работа, те забелязали, че системата да стане забележимо по-малко точна. Министерството на отбраната отговори, като казвам на всички батериите Пейтриът да не напускат системите за дълго време. Те никога не каза какво е било дълго време. 8 часа, 10 часа, хиляда часа. Никой не знаеше. -Таблицата Patriot батерия разположени в казармата в Dhahran и неговата погрешна вътрешна часовник беше на повече от 100 часа в нощта на 25-ти Февруари. -Това Проследяват време с точност на около една десета от секундата. Сега една десета от секундата е интересен номер тъй като не може да се изрази в двоичен точно, което означава, че не може да се изрази точно във всеки модерен цифров компютър. Трудно е да се повярва, но използвате това като пример. Да вземем брой една трета. Една трета не може да бъде изразена в десетични точно. Една трета е 0.333 става за безкрайност. Няма начин да се направи това с абсолютна точност в десетична. Това е точно вида на проблема , което се случи в Patriot. Колкото по-дълго на системата се затича, за лошо грешката време стана. -След 100 часа работа, грешка във времето е само около една трета от секундата. Но по отношение на насочването на ракета пътуване в Mach 5, тя се превърна в проследяване грешка от над 600 метра. Би било фатална грешка за войниците в Dhahran. Какво се случи, е лансирането Scud е открити от спътници за ранно предупреждение, и те са знаели, Скъд идваше в общата им посока. Те не знаеха къде идва. Това беше вече до радара компонент на системата Patriot защитавайки Dhahran да се локализира и запази следите на входящи вражески ракети. -Таблицата Радар беше много умен. Това всъщност ще проследят позицията на Скъд и след това се предскаже където то вероятно ще бъде следващия път, когато радар изпрати импулс навън. Това се нарича порта диапазон. -Тогава Веднъж патриотът реши достатъчно време има преминал да се върна и да се провери на следващия място за това открива обект той се връща. Така че, когато той се върна на неправилния място, то тогава не вижда обект. И тя реши, че не е имало обект. Това не е фалшиво откриване и тя пада на пистата. -Таблицата Входящо Scud изчезна от екрана на радара, и секунди по-късно, той блъсна в казармата. Скъд убити 28. Той бе уволнен последния един по време на първата война в Персийския залив. Трагично е, че актуализирания софтуер пристигна призори на следващия ден. Недостатък на софтуера е имал е фиксирана, затваряне една глава в разтревожените история на ракети Patriot. [END възпроизвеждане на видео] DAVID J. Malan: Това е за CS50. Ние ще се видим в сряда. [За възпроизвеждане на музика]