[Музички] Дејвид Џ MALAN: Во ред. Ова е CS50, и тоа е почеток на две недела. Па нека започне денес со грешка. А бубачка, се разбира, е грешка во програмата, и ќе добиете многу запознаени со овој концепт ако никогаш не сум програмиран пред. pset0 и сега pset1. Но, ајде да се разгледа нешто малку едноставна на прв. Оваа програма тука дека јас фрли заедно во однапред, и тврдам дека ова треба да се печати 10 ѕвезди на екран со користење printf, но тоа е очигледно кабриолет на некој начин. Со оглед на тоа дека спецификација тоа треба да печати 10 ѕвезди, но тоа не е очигледно, она што ќе тврдат дека е грешка? Да? Па тоа е надвор за една грешка, и она што сакаш да кажеш со тоа? Во ред. Одличен. Значи ние сме наведени на започне вредноста на нула за i, и ние сме наведени на n вредност од 10, но ние сме се користи помалку од или еднакво на. И од причина што ова е две карактери и не само еден симбол, како во математика книга, е тоа што вие не мора начин на изразување на еден карактер еквивалентни. Па тоа значи дека помалку од, но ако почнат да бројат на нула, но смета на сите начин до преку и еднакви на 10, ти си секако ќе брои 11 работи во вкупно. И така си оди за да се печати 11 ѕвезди. Значи она што може да биде лек за ова? Да? Па само се прилагоди на помалку од или еднаква на само да биде помала од, и таму е, тврдам, можеби друго решение, исто така. Што друго може да ви направам? Да? Така на проектот изедначен до 1, а напушти помалку од или еднакво на. И искрено јас ќе тврдат дека, за еден типичен човечки, ова е веројатно повеќе јасна. Почнат да бројат од 1 и брои до до 10. Во суштина прават тоа што мислиш. Но, реалноста е во програмирање, како што видовме, компјутерски научници и програмери генерално почнат да бројат на нула. И така тоа е во ред еднаш ќе се навикнеш на него. Вашата состојба ќе генерално да биде нешто како помалку од. Толку едноставно, логично грешка што би можеле сега поправат и на крајот повторно компајлирајте ова и се само 10. Па како за овој баг тука? Тука, повторно, тврдам дека имам цел на печатење 10 stars-- по еден на линија тоа време, но тоа не го прави. Пред да се предложи што фикс е, она што го прави ова печати визуелно ако јас се да ги собере и извршите оваа програма мислите? Да? Ѕвезда. Па сите ѕвезди на иста линија е она што го слушнав, а потоа и нова линија карактер. Па ајде да се обидеме тоа. Така бидете кабриолет-1, влезе, и гледам ѕвекот команда кои ние разговаравме за последен пат. ./buggy-1, и навистина гледам сите 10 ѕвезди на иста линија иако тврдам во мојот спецификација само коментар на врвот кодот кој имав намера да се направи една на линија. Но, тоа изгледа добро. Сега линија 15 изгледа како да сум печатење ѕвезда, а потоа линија 16 тоа изгледа како јас сум за печатење нова линија карактер, и тие се двете наменети така Јас сум внатрешноста на јамка јасно. Затоа, не треба да се прави ѕвезда, нови линија, ѕвезда, нова линија, ѕвезда, нова линија? Да? Да, за разлика од еден јазик како Пајтон, ако сте запознаени, вовлекување не важно за компјутер. Тоа само е важно на човекот. Па додека тука сум измислил линии 15 и 16-- дека изгледа убаво, но компјутерот не се грижи. Компјутерот се грижи за всушност да има големи загради околу овие линии на код. Така што тоа е clear-- исто како и во Scratch-- дека овие две линии на код треба да се изврши. Како еден од оние жолта гребење загатка парчиња повторно и повторно и повторно. Па сега ако јас повторно ја извршите оваа program-- ./buggy-2-- Хм. Имам грешка сега. Што заборавам да направам? Да, па јас не го компајлирате. Така бидете кабриолет-2. Нема таква датотека, бидејќи јас не всушност ги собере на втората верзија. Па сега интересен непријавени не variable-- 2. Ние сме прави 1. Направи кабриолет-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 може да биде поврзана со? Енкрипција. Па ние ќе зборуваме за ова во наредните денови. Енкрипција, уметноста на scrambling информации. Но скратам приказната, Епл Пред некое време беше направил грешка во нивната имплементација на SSL, софтвер кој на крајот ја спроведува Адреси како HTTPS или макс врски таму. Резултатот од тоа е дека вашиот врски би можеле потенцијално да бидат пресретнати. И вашите врски се не мора да се шифрираат ако сте имале некои лошо момче помеѓу вие и на веб-сајтот дестинација кои знаеше како да ги искористат предностите на тоа. Сега Apple конечно испратени фикс за овој крај, и опис на нивните фикс е ова. Безбеден транспорт не успеа да се провери автентичноста на врската. Прашањето беше упатено од страна враќање недостасува валидација чекори. Значи ова е многу рака брановидни објаснување за едноставно велејќи дека ние ја зезнав. Постои буквално еден линија на кодот кој беше грешка во нивната имплементација на SSL, и Ако одите на интернет и пребарувањето за ова што всушност може да се најде оригиналниот изворен код. На пример, ова е екранот на само дел од прилично голема датотека, но ова е очигледно функција наречена SSL потврди знак серверот размена на клучеви. И тоа трае еден куп на аргументи и влезови. И ние нема да се фокусира премногу на minutia таму, но ако се фокусираат на кодот во на тој врвниот function-- ајде зумирате на тоа. Вие веќе може да се сомневаат што грешка може да да биде дури и ако немате идеја на крајот она што го гледа. Таму е вид на аномалија тука, што е она? Да, јас не навистина ми се допаѓа изгледот на две Отиди не успее. Искрено, јас навистина не знам што Отиди не успеваат средства, но има две од нив назад да се врати. Тоа само вид на ме трие интелектуално на погрешен начин, и навистина, ако ние зумирате на само оние линии, ова е В. Толку многу на Apple код самата е напишан во C, и ова очигледно е навистина equivalent-- не на тоа прилично вовлекување верзија, но ако признае фактот дека нема големи загради, што Јаболко навистина напишал беше кодот што изгледа вака. Па јас zoomed надвор и јас само фиксна вовлекувањето во смисла дека ако нема големи загради, дека Вториот Отиди успее тоа е во жолта ќе се изврши без разлика што. Тоа не е поврзано со на состојба ако над неа. Па дури и повторно, не, ако го направите доста се разбере она што ова може да можеби да се прави, знам дека секој од овие conditions-- секоја од овие линии е многу важен чекор во процесот на проверка ако вашите податоци е всушност шифрирана. Па скокнеш еден од овие чекори, не најдобрата идеја. Но, бидејќи имаме оваа Вториот Отиди успее во жолта, и затоа што еднаш ние вид на естетски преместете ја на лево каде што логично е во моментот, што значи ова за линијата на кодот подолу дека вториот Отиди не успеваат ќе помислите? Тоа секогаш ќе биде прескокнат. Па gotos обично се намуртен врз од причини што навистина не ќе одат во, и навистина во CS50 ние не имаат тенденција да ги учат оваа изјава Отиди, но може да се мисли на Отиди не како значење скокаме да некој друг дел од кодот. Со други зборови скокаат над оваа последната линија целосно, и така и резултат од оваа глупава Едноставна грешка тоа беше само резултат на веројатно некој копирање и вметнување еден премногу многу пати беше дека целиот безбедноста на iOS и Mac OS беше подложен на пресретнувањето од страна на лошите момци за сосема извесно време. Додека Apple конечно фиксна ова. Сега, ако некој од вас се всушност водење стари верзии на iOS или Mac OS, можете да одат на gotofail.com кои е веб-сајт кој некој постави да суштина се утврди програмски ако компјутерот се уште е ранлив. И искрено, ако е така, тоа е веројатно добра идеја да го обновите вашиот телефон или вашиот Mac во овој момент. Но таму, само доказ за тоа колку разбирање на овие пониско ниво детали и прилично едноставни идеи навистина може да претвориме во одлуките и проблемите со кои се affected-- во оваа case-- милиони луѓе. Сега еден збор на администрацијата. Дел ќе започне оваа недела доаѓаат. Ќе добиете е-маил од страна на викенд за делот, на која точка процесот на resectioning ќе започне ако сте реализира сега го имате некои нови конфликти. Значи ова се случува секоја година, а ние Сместување во деновите што доаѓаат. Канцеларија hours-- направите задржи внимава на овој распоред тука. Менува малку оваа недела, особено на проектот време и локацијата, па се консултирате дека пред да замине за работното време некоја од наредните четири ноќи. А сега еден збор на оценување, особено како што се нурне во проблемот поставува еден и пошироко. Така на спецификацијата, Тие обично се оските по кој ние се оцени вашата работа. Обемот однесува на она што степенот вашиот код спроведува карактеристики потребни од страна на нашите спецификација. Со други зборови, колку парче сет нели отхапвам. Дали и да правите една третина од него, половина од тоа, 100% од тоа. Дури и ако тоа не е точно, Колку ќе се обиде? Така што ја доловува ниво напор и износот на кои сте малку надвор од проблеми проблем множество е. Correctness-- овој еден, за да се Колку е вашиот код во согласност со нашите спецификации и без грешки. Значи не се работи правилно? Ако ние го даде некои влез, тоа го прави ни даде излез што можеме да очекуваме? Design-- сега ова е првиот од особено квалитетни оние, или оние кои имаат потреба на човечкото расудување. И навистина, тоа е причината зошто имаме кадар на толку многу наставата соработници и се разбира асистенти. До кој степен е вашата код напишан добро? И повторно, ова е многу квалитативна проценка кои ќе работат со вас на БИ-директно во неделите што доаѓаат. Така што кога ќе го добиете само нумерички резултати, но, исто така, писмена резултати, или внесе повратни информации, или писмени повратни информации на англиски зборови. Тоа е она што ќе се користи за да се вози кон всушност пишување подобро код. И во предавање и дел, ние ќе се обидеме да се истакне out-- толку често колку што can-- она што го прави програма не само што точни и функционално добро, но, исто така, добро дизајниран. Најефикасен тоа би можело да биде, или Дури и од најубавите тоа може да биде. Што упатува на стил. Стил на крајот е естетски пресуда. Дали ќе изберете добар имињата за вашите променливи? Дали сте вовлечени вашиот код правилно? Дали тоа изгледа добро, и затоа, тоа е лесно за друго човечко суштество да читаат вашиот соодветните на неговата коректност. Сега генерално на наставната програма, ние резултат овие работи на пет точка скала. И дозволете ми да ги нападне дома точка дека три е навистина добро. Многу брзо направи луѓе да започне да го аритметика. Кога ќе добие три од пет на точноста на некои pset и мислат по ѓаволите, јас ќе 60% која е во суштина D или E. Тоа не е начинот на кој ние мислам на овие броеви. А три е навистина добро, а она што ние генерално очекуваат на почетокот на терминот е дека ако сте добивање еден куп на three's-- можеби неколку на саеми, неколку fours-- или неколку twos, неколку fours-- тоа е добро место за почеток. И толку долго како што можеме да видиме на нагорна траекторија со текот на времето, ќе бидете во особено добро место. Формула се користи за да се тежина работи во суштина е ова на наставната програма, што само значи дека ние даде поголема тежина на коректност. Бидејќи тоа е многу често точноста кој што се најмногу време. Верувај ми сега. Ќе find-- најмалку во една pset-- дека потроши 90% од вашето време работи на 10% од проблемот. И сè вид на работи освен за една или две грешки, а тоа се грешки кои ви до доцна во ноќта. Тие се оние кои вид ќе избега. Но, откако спијат на тоа, или посета на работното време или поставување на прашања на интернет, е кога ќе стигнете до 100% цел, и тоа е причината зошто ние тежина точноста најмногу. Дизајн малку помалку, и стил А малку помалку од тоа. Но, имајте на mind-- стил е можеби најлесниот на овие да отхапвам како за на стил водич. И сега, повеќе сериозни белешка за академски искреност. CS50 има несреќна разлика на е најголем производител на рекламирање одбор случаи речиси секоја година историски. Ова не е затоа што студентите измамник во CS50 повеќе од која било друга класа, туку затоа што на природата на работата, фактот дека тоа е електронски, фактот дека ние се погледне за неа, и фактот што се компјутерски научници, Можам да кажам ние сме за жал многу добри во откривањето на тоа. Па што значи ова во реални услови? Така што, по наставната програма, филозофијата на курсот навистина се сведуваат да бидат разумни. Постои оваа линија меѓу прави една работа на свој и добивање малку разумна помош од пријател, и целосно го прават тоа работа за вашиот пријател, или испраќање на него или неа кодот така што тој или таа може едноставно земе или позајмуваат го ова право. И дека преминува линијата дека ние подготвени во класата. Види, наставната програма на крајот за линиите дека цртаме, како да бидат разумни и неразумно однесување, но тоа навистина не зоврие до суштината на вашата работа да има потреба да да биде свој на крајот. Сега со тоа, рече, постои хеуристичка. Бидејќи како што може да imagine-- од работното време и визуелни и видеа ние сме прикажан на тој начин far-- CS50 навистина е замислена да биде како заеднички и како кооперативни и како социјална што е можно повеќе. Како заеднички, како што е ригорозен. Но, со ова, рече, хеуристична, како што ќе видите во наставната програма, е тоа што кога имаш некој проблем. Имате некои грешки во кодот кои не може да се реши, што е разумно за вас да се покаже вашиот код на некој друг. Еден пријател, дури и во класа, пријател седи до вас на работното време, или член на персоналот. Но, тие не можат да ја покажат својата код за вас. Со други зборови, одговориме на вашата question-- Ми треба help-- не е ох, тука е мојот код. Фрлите поглед на ова и заклучи од тоа што сакате. Сега, се разбира, има начин јасно да се игра овој систем со кој ќе ви покажам мојот код пред да имаат прашање. Вие ми го покаже моите вашиот код пред да имаат прашање. Но види наставната програма повторно за пофини детали за тоа каде оваа линија е. Само за да сега се наслика слика и сподели како транспарентно што е можно каде што ние сме во последниве години, ова е бројот на рекламирање одбор случаи дека CS50 има над во изминатите седум години. Со 14 случаи оваа најновата есен. Во однос на учениците кои се вклучени, тоа беше 20 некои чудни студенти минатата есен. Имаше врвот на 33 студентите пред неколку години. Многу од нив, за жал, веќе тука на кампусот. Студенти кои се вклучени, како процент од класа историски движи од 0% на 5,3%, што е само да се каже ова е годишно предизвик. И кон таа цел, што ние сакаме да направите е да се пренесе еден дека ние dd-- само FYI-- споредуваат на на праведност на оние студенти кои се по линија соодветно. Ние го правиме споредба на сите тековни поднесоци против сите минати мисии од минатото многу години. Знаеме како да се премногу Google околу и да се најде код складишта интернет, форуми за дискусија интернет, сајтови работа на интернет. Доколку студентот да го најдете, можеме со сигурност најдете колку што за жал се направи. Па што ќе видите во наставната програма иако е ова жалење клаузула. Можам сигурно цениме, и сите ние има вработените имаат направено текот како ова или ова се еден со текот на времето, сигурно знае што тоа е како кога животот добива во начинот на кој кога ќе имаат некои доцна во ноќта deadline-- не само во оваа класа, но another-- кога сте целосно исцрпена, стрес, имаат нередовен број други работи да се направи. Ќе се направи во одреден момент во живот сигурно лошо, можеби доцна ноќ одлука. Така на наставната програма, постои оваа клаузула, така што ако во рок од 72 часа за изработка на некои сиромашни одлука, што го поседувате е до тоа и да посегнеш кон мене и еден од шефовите на курсот и ќе имаме разговор. Ние ќе се справи со работите внатрешно во надеж тоа станува се повеќе од настава момент или живот лекција, а не нешто со особено драстични последици како што може да се види на овие листи овде. Па тоа е многу сериозен тон. Нека пауза за само неколку секунди за да се скрши напнатоста. [Музички] Дејвид Џ MALAN: Добро, Па, како беше тоа за segue? До примарна теми денес. Од кои првата е апстракција. Уште еден од кој ќе биде застапеност на податоци, кои искрено е навистина сува начин да се каже како можеме да одат за решавање на проблемите и размислување за решавање на проблемите? Значи сте виделе во нула, и сте види можеби веќе во pset1 со C дека вие не само што може да се користи функции, како printf, дека другите луѓе во изминатите години, пишува за вас. Исто така можете да напишете своја сопствена функции. Па дури и покрај тоа што не може да има направи тоа во C, и искрено во pset1 Вие навистина не треба да напишете сопствени функција бидејќи problem-- а можеби и застрашувачка на Првиот glance-- ќе видите во крајна линија може да се реши со не се сите дека многу линии на код. Но со тоа, рече, во смисла на пишување на свој функција, сфатат дека С дава можете оваа способност. Одам да одат во денешниот изворниот код, кој е достапен веќе на интернет, и јас одам да се оди напред и отворен до програма наречена функција 0.C, и во функција нула ќе видиме неколку работи. Во првите редови од 18 до 23 е мојата главна функција. И сега, дека ние сме почнуваат да се прочита кодот кој ние не сте пишување на мува, но наместо тоа сум напишал однапред или дека сте во проблем постави може да добие се има се напишани во однапред. А добар начин да се започне читање код на некој друг е да се погледне за главната функција. Дознаам каде што влез Поентата е да се работи на програмата, а потоа го следат логично од таму. Значи оваа програма очигледно отпечатоци Вашето име проследено со запирка. Ние потоа користете GetString од библиотеката CS50 да се добие стринг, или збор или фраза од страна на корисникот на тастатурата. А потоа, тука е тоа нешто here-- PrintName. Сега PrintName не е функција која доаѓа со C. Тоа не е во стандардни io.h. Тоа не е во CS50.h. Тоа е прилично во иста датотека. Известување, ако јас се движите надолу на bit-- линии 25 до 27-- тоа е само прилично начин на коментирање Вашиот код со ѕвездите и засеци. Ова е мулти-линија коментира, и ова е само мојот опис во сино на она што оваа функција го прави. Бидејќи во линии 28 преку 31, Јас сум напишал супер едноставна функција чие име е PrintName. Тоа трае колку аргументи би рекол? Па еден argument-- бидејќи има еден аргумент наведени во заградите. Видот на која е стринг. Кој е да се каже PrintName е вака црна кутија или функција која ги зема како влез стринг. И името на таа Стринг погодно ќе биде име. Не е, не N, но Име. Значи она што не PrintName направам? Убаво е едноставна. Само како една линија на кодот за на printf, но очигледно тоа печати "Здраво", така и така. Каде што толку и толку доаѓа од аргумент. Сега тоа не е голема иновација тука. Навистина, јас сум преземат програма која би можела се напишани со една линија код со ставање на овој тука, и тоа е изменета на нешто која вклучува околу шест или седум или така линии на код на целиот пат тука. Но, тоа е практикувањето на принцип познат како апстракција. Вид на концизирајќи внатрешноста на новиот функција која има име, и подобро сепак тоа име буквално вели дека она што го прави тоа. Мислам printf-- тоа не е особено описни. Ако сакате да се создаде загатка парче, или ако јас сакате да се создаде функција кој печати нечие име, убавината на тоа е тоа што всушност може да даде таа функција име кој го опишува она што го прави. Сега што е потребно во влез што Сум произволно наречен име, но и тоа е прекрасно описни наместо да биде малку повеќе генерички како С. А празнина, за сега, само значи дека оваа функција не рака ми врати ништо. Тоа не е како што GetString буквално ми подава назад низа како што правевме со парчиња хартија со соучениците минатата недела, туку тоа само има ефект. Тоа отпечатоци нешто на екранот. Па на крајот на денот, ако јас го прават функција-0, ./function-0, ќе видиме дека тоа бара моето име. Јас тип Давид, и видови на моето име. Ако јас го направи тоа повторно со Роб, тоа се случува да се каже "Здраво, Роб." Така едноставна идеја, но можеби екстраполираме од оваа ментално дека вашите програми се малку повеќе комплицирано, и сакате да се напише еден дел од код и повик дека code-- повика дека code-- со некој описен именува како PrintName, Ц не си ни оваа способност. Еве уште еден едноставен пример. На пример, ако јас се отвори датотека од денес се нарекува return.c, забележи она што го направив тука. Поголемиот дел од оваа главна функција е printf. Јас прв произволно иницијализира променлива наречена x на бројот 2. Јас тогаш се печати "x е сега % I "преминува во вредност од x. Па јас сум само велејќи дека тоа што е. Сега сум само храбро тврдејќи со printf. Јас сум во местење Рубикова коцка таа вредност X, и јас сум Притоа со повик на функција наречен коцка полагање во X како аргумент, и потоа заштеда на излез во променлива себе, x. Па јас сум clobbering вредноста на x. Јас сум највисок вредност на x со она што резултат на повикување оваа коцка функција е. А потоа јас само печати од некои меки работи тука велејќи дека она што го направив. Па што е тогаш коцка? Забележи она што е фундаментално менува. Јас сум со оглед на функцијата име како порано. Сум наведени име за аргумент. Овој пат тоа се нарекува n наместо име, но можев да го наречеме нешто што сакам. Но ова е различно. Ова нешто на левата страна. Претходно тоа беше она што клучни зборови? Момци. Сега тоа е очигледно int. Значи она што е можеби потрае? Додека празнина означува вид на ништожност, а тој беше случај. PrintName врати ништо. Тоа го правеше нешто, но тоа не ми го предаде назад нешто што јас може да ги стави на левата страна на знак за еднаквост како што го направив тука на линија 22. Значи, ако јас се каже во on-line 30, што е тоа веројатно значи за тоа што го прави коцка за мене? Да? Се враќа цел број. Па тоа ми подава врати, за На пример, на парче хартија на кој има напишано одговорот. 2 cubed, или 3 коцки, или 4 cubed-- она ​​што го донесе во, и како можам спроведе ова? Па, само е n пати n пати n е како би можел коцка вредност. Значи, повторно, супер едноставен идеја, но демонстративен сега како можеме да се напише функции кои, всушност, ни имале назад вредности кои би можеле да бидат од интерес. Ајде да погледнеме во еден последен пример тука се нарекува функција еден. Во овој пример, ќе почне за да добиете повеќе релевантни. Значи во функција една, овој program-- најава на крајот повикува функција наречена GetPositiveInt. GetPositiveInt не е функција во библиотеката CS50, но ние решивме би сакал да постои. Значи, ако ние се движите надолу подоцна во датотеката, информации како отидов за спроведување добие позитивни int, и јас велат дека тоа е повеќе привлечна бидејќи ова е пристојно бројот на линии на код. Тоа не е само глупо малку програма играчка. Тоа е всушност доби некои грешка проверка и прави нешто покорисно. Па ако не сум видел можи видеа кои имаме вградени во pset1, знам дека ова е еден вид на јамка во C, слични во духот на видови на нештата нула може да се направи. И направи вели направите тоа. Печати ја оваа надвор. Па ќе одиме напред и да добијат n-- добие int и чувајте го во N, и да ја задржите тоа повторно и повторно и повторно се додека n е помалку од една. Па n се случува да биде помалку од една само ако човекот не е соработува. Ако тој или таа е пишување во 0 или -1 или -50, овој циклус се случува да извршување повторно и повторно. И на крајот се забележи, јас едноставно се врати на вредност. Така, сега имаме функција дека ќе ми беше убаво ако CS50 ќе се спроведе во CS50.h и CS50.c за вас, но тука можеме сега спроведување на оваа себе. Но, два коментари на некои клучни детали. One-- зошто Изјавувам int n, мислите, на линија 29 наместо само прави ова тука, што е повеќе во согласност со она што го правевме минатата недела? Да? А добра мисла. Значи, ако ние требаше да го стави тука, тоа е како да сме задржи прогласување повторно и повторно. Дека во себе и за себе е не се проблематични, само по себе, бидејќи ние само треба вредноста еднаш, а потоа ние ќе добие нов во секој случај. Но и добра мисла. Да? Блиску. Така, бидејќи јас сум прогласена n на линија 29 надвор од јамка, тоа е достапна во текот на целата оваа функција. Не други функции, бидејќи n е сеуште во внатрешноста на овие кадрава протези тука. So-- сигурни. Токму така. Значи ова е уште повеќе до точка. Ако ние наместо да прогласи N токму тука на линија 32, тоа е проблематично, бидејќи се погоди каде на друго место треба да имате пристап до него? На линија 34, и едноставна правило е што само може да се користи променлива во внатрешноста на најновите големи загради во која го прогласи. За жал, линија 34 е една линија е премногу доцна, бидејќи јас сум веќе затворена кадрава голема заграда на линија 33 кој одговара на кадрава голема заграда на линија 30. И така ова е начин да се каже дека оваа варијабла int е scoped, така да се каже, само во од оние големи загради. Тоа едноставно не постои надвор од нив. Значи, навистина, ако го направам тоа ред, нека ме спаси кодот како што погрешно is-- напишано. Дозволете ми да оди напред и да прават функција-1, и notice-- грешка. Употреба на непријавена идентификатор n на линијата 35, кој е во право тука. И ако дојдете до понатаму, уште еден. Употреба на непријавена идентификатор n на линија 34. Па компајлерот, ѕвекот, е забележи дека тоа само не постои, иако јасно е дека визуелно. Така едноставен фикс е тоа прогласување таму. Сега дозволете ми да дојдете до на врвот на датотека. Што скокови на тебе како да се биде малку различна од работите ние погледна минатата недела? Не само што имам име, не само што Имам некои остри вклучува до врвот, Имам нешто јас сум повикувајќи прототип. Сега дека изгледа ужасно слично на она што ние само видов пред една момент на линија 27. Значи, да заклучиме од различни порака за грешка зошто јас го направив тоа. Дозволете ми да оди напред и да избришете овие линии таму. И така не знаеме ништо за прототип. Римејк оваа датотека. Направи функција еден. И сега, по ѓаволите, четири грешки. Ајде да дојдете до првиот. Имплицитна изјава на функцијата добие позитивни int е валиден во C99. C99 само значи во 1999 година верзија на јазикот Ц, што е она што ние сме навистина го користите. Па што значи тоа? Па C-- и поконкретно C compilers-- се прилично глупава програми. Тие само знаат она што сте им рече, и тоа е всушност тематски од минатата недела. Проблемот е во тоа што ако јас одам за спроведување име тука, и јас го нарекувам функција наречена GetPositiveInt тука на линија 20, таа функција технички не постои се додека компајлерот гледа линија 27. За жал, компајлерот е вршење на работите врвот, долу, лево, десно, поради тоа што не го видел имплементација на GetPositiveInt, но те гледа обидува да го користи тука, тоа е само случува да bail-- развикам ви со грешка message-- можеби криптичната, и не, всушност, компајлирате датотеката. Па т.н. прототип до тука е значително технолошки вишок. Буквално, отидов долу тука и јас копирани и атипичен ова, и го ставив тука. Празнина ќе биде повеќе правилно, па ќе буквално копирајте го и ставете го ова време. Јас буквално копирани и атипичен неа. Навистина само како како леб трошка. А малку поим на компајлерот. Не знам што тоа не уште, но јас сум ветувајќи дека ќе ви дека тоа ќе постои на крајот. И тоа е причината зошто оваа line-- во линија 16-- завршува со точка-запирка. Тоа е излишна од страна на дизајнот. Да? Ако не водат вашата библиотека да the-- ох, добро прашање. Остри вклучува хедер датотека подмножества. Треба да be-- треба речиси секогаш да биде во самиот врв на датотеката за similar-- за иста причина, да. Бидејќи во стандард io.h е буквално линија вака, но со зборот printf, и со своите аргументи и нејзиното враќање тип. И така со правење остар вклучуваат до тука, она што сте буквално прави е кој копирање и вметнување на содржини на некој друг напишал до врвот. Притоа cluing вашиот код во на Фактот дека тие функции постојат. Да? Апсолутно. Па многу умен и точни решение ќе биде, знаеш што? Не знам што е прототип е, но знам ако јас се разбере дека C е само неми и rethinks врвот до дното. Па ајде да се даде она што го сака. Ајде да го намали тој код, ставете го до врвот, а сега им помогнам на главниот долу. Тоа исто така ќе го реши проблемот. Но можете многу лесно може да излезе со сценарио во кое има потреба да се јавам Б, а можеби Б повикува назад А. ја е нешто што се нарекува рекурзија, а ние ќе се вратам на тоа. И тоа може или не може да биде добра работа, но дефинитивно може да се се скрши ова решение. И згора на тоа, јас би тврдат стилски, особено кога вашите програми стане овој долг и овој долг, тоа е само супер удобен да се стави главниот на врвот затоа што тоа е нешто што повеќето програмери се случува да се грижи за него. И така тоа е малку почиста, веројатно, да го направи тоа на начин Јас првично го направи тоа со прототип дури иако тоа изгледа малку излишни на прв поглед. Да? Жал ми е, може да ви го кажам погласно? Ако ја вклучите локациите на имплементација и прототип? Па тоа е добро прашање. Ако повторно пријават тоа долу тука, ајде да видиме што се случува. Значи, ако јас се стави крај на ова тука, си ти што зборуваш. Ох, извинете. Погласни? Уште погласно. О, добро прашање. Тоа ќе ја поништи функција? Што знаете, по сите овие години, јас никогаш не стави прототип потоа. Значи, да го прават функција-1 откако ќе го направите тоа. [Мрмори] Дејвид Џ MALAN: О, чекај. Ние се уште треба да се стави се што е горе. Значи, да го направите тоа тука, ако сум разбирање на прашањето правилно. Јас сум ставање сè, вклучувајќи прототип над главните, но јас сум ставање прототип под имплементација. Значи, ако јас се направи еден, јас сум добивање на назад на error-- неискористени променлива n. Ох, таму. Ви благодарам. Ајде да видиме, ние се ослободи од ова. Тоа е друга грешка, па ајде да го игнорираат тоа. Ајде навистина брзо римејк ова. Добро, така што податоците аргумент не се користи од страна формат стринг n-- ох, тоа е затоа што Ја променив на овие овде. Добро, знаеме што одговорот ќе to-- ред, одиме. Ах, благодарение на позитивните. Добро, јас ќе го надминете овој код after-- игнорира овој особено бубачки бидејќи ова was-- таа работи е одговорот. Па тоа не ги пребрише она што сте само направено. Се сомневам компајлерот е напишан на таков начин дека тоа е игнорирање на вашиот прототип бидејќи телото, така да се каже, на функцијата веќе се спроведува повисоко. Јас ќе мора да всушност се консултираат во упатството на компајлерот да се разбере ако има било кој друг импликација, но на прв поглед само со обидот и експериментирање, таму се чини дека нема влијание. Добро прашање. Значи, да се движам сега, движејќи се далеку од несакани ефекти кои се функции кои го прават нешто како визуелно на екранот со printf, но не се врати на вредност. И функции кои имаат поврат вредности како што само видов неколку од. Ние веќе видовме овој поим на опфатот, и ќе видиме ова повторно и повторно. Но, за сега, повторно, користење на владеењето на палецот дека променлива може да се користи само внатрешноста на неодамна отвори и затворени големи загради, како што видов во тој одреден пример. И како што посочи, постои ability-- може да се решат некои од овие проблеми со прекрасен променлива на глобално ниво во самиот врв на датотеката. Но, во речиси сите случаи ќе разбеснувам на тоа, и навистина дури и не одат во таа решение за сега. Па сега за сега, на готова брза е дека променливите имаат овој поим на обем. Но сега да ги погледнеме во друга сув начин на всушност барате на некои прилично интересни имплементација детали. Како да претставуваат информации. А ние веќе погледна на овој во првата недела на класа. Гледа во бинарни датотеки, и потсетувајќи се на децимална. Но се сети од минатата недела дека C има различни типови на податоци и гроздовете повеќе, но повеќето полезни за сега може да биде овие. А знак, или карактер, што се случува да биде еден бајт, или осум вкупно битови. И тоа е да се каже дека големината на знак е само еден бајт. А бајт е осум битови, па тоа значи дека ние може да претставува колку знаци. Колку букви или симболи на тастатурата ако имаме еден бајт или осум бита. Сетам недела нула. Ако имате осум битови, колку вкупната вредност може да ви го претставуваме шеми на нули и единици? One-- повеќе од тоа. Значи вкупно 256, ако почнат да бројат од нула. Значи, ако имате осум bits-- па ако имаа нашите бинарни светилки тука повторно, ние би можеле да се претворат оние светилки на и исклучување на било кој од 256 уникатни модели. Сега ова е малку проблематично. Не толку многу за англиски јазик и романски јазици, но, секако, кога ќе се воведе, за пример, азиски јазици, кои имаат далеку повеќе симболи, отколку како 26 букви од азбуката. Ние всушност би можеле да треба повеќе од еден бајт. И за среќа во последниве години има општество усвоени други стандарди кои ги користат повеќе од еден бајт на плаќање. Но, за сега во C, стандардно е само еден бајт или осум бита. Цел број, во меѓувреме, е четири бајти, инаку позната како 32 бита. Што значи она што е најголем можен број може да се претставуваат со int очигледно? Со милијарди долари. Така што е четири милијарди дава или зема. 2 до 32th моќ, ако се не преземаат никаква негативни броеви и само ги користат сите позитивни броеви, тоа е четири милијарди дава или зема можности. А плови, пак, е различен тип на податочен тип во C. Тоа е уште еден број, но тоа е вистинскиот број. Нешто со децимална точка. И излегува дека Ц, исто така, користи четири бајти да претставува подвижна запирка вредности. За жал колку лебдечки точка вредности се има во светот? Колку реални броеви постојат? Има бесконечен број и за таа материја има бесконечен број на цели броеви. Па ние сме веќе вид на копање дупка се тука. При што, наводно, во computers-- на Најмалку програми напишани во C на them-- само што може да се смета како високо како четири милијарди дава или зема, и подвижна запирка вредности само што може очигледно имаат некои ограничен износ на прецизност. Само толку многу бројки по нивните децимална точка. Затоа што, се разбира, ако имате само 32 бита, Не знам како ќе одиш да се обратите за што претставува вистинска numbers-- веројатно со различни видови на модели. Но, има сигурно конечни Бројот на таквите шеми, па тука, исто така, ова е проблематично. Сега можеме да се избегне проблемот малку. Ако не се користи плови, можете да го користите двојно во C, кој ви дава осум бајти, кој е начинот на кој повеќе можни модели на нули и оние. Но тоа е сепак конечни, кој ќе да биде проблематична ако напишете софтвер за графика или фенси математички формули. Така што всушност може да сакате да брои до поголеми од тоа. А долго long-- глупаво named-- Исто така е осум бајти, или 64 бита, и ова е два пати толку долго како int, и тоа е за долго целобројна вредност. Забава fact-- ако int е четири бајти, колку долго е долг во C обично? Исто така, четири бајти, но долго долго е осум бајти, и тоа е од историски причини. Но готова брза сега е само дека податоците има да бидат претставени во computer-- тоа е физички уред со електрична енергија, тоа е обично возење оние нули и ones-- со конечни количини на прецизност. Па што е проблемот тогаш? Па има проблем на цел број претекување. Не само во C, но во компјутери во целина. На пример, ако овој е бајт вредност од bit-- така да ако ова е осум bit-- сите од кои се број еден. Кој број е ова претставувајќи ако претпоставиме тоа е сите позитивни вредности во бинарна? 255, и тоа не е 256, бидејќи нула е најмал број. Па 255 е највисок еден, но проблемот е претпоставувам дека сакав да подигање на оваа променлива дека е користење на вкупно осум битови ако сакам да го прираст. И штом ќе додадете еден за сите овие оние, можеби може да се замисли visually-- само како носење на еден користење decimals-- нешто се случува да тече од левата страна. И, навистина, ако јас го додадете бројот еден за ова, она што се случува во бинарен е тоа што надминува назад до нула. Значи, ако сте само што не use-- еден int, но еден бајт да се избројат броеви во програмата, со default-- штом можеш да 250, 251, 252, 253, 254, 255-- 0 доаѓа по 255, што е веројатно не е она што корисникот е случува да се очекува. Сега меѓувреме во подвижна запирка светот, можете исто така имаат сличен проблем. Не толку со најголем number-- иако тоа е се уште проблем. Но со износот на прецизност што може да се претставуваат. Па ајде да ги разгледаме во овој пример тука, исто така, од изворот денес code-- плови-0.c. И ќе забележите дека тоа е супер едноставна програма која очигледно треба да се печати она што вредност? Што облог тоа се случува да се печати иако има малку нови синтакса тука? Па се надевам 0.1. Така што е еквивалентно на една десетина затоа што јас го правам 1 поделено со 10. Јас сум чување на одговор во променлива наречена f. Таа променлива е од тип float, кои е клучен збор јас само предложени постоел. Не сум го видел пред, но ова е вид на уредни начин на printf да се определи колку сте бројки сакаат да се види по децимална точка. Значи ова нотација само значи дека тука е случаеви. Тоа е за подвижна запирка вредност, и ох, патем, покаже дека со децимална точка со еден број по децимална точка. Па тоа е број на значајни цифри, така да се каже, дека можеби ќе сакате. Значи, дозволете ми да оди напред и да прават направи плови-0, ./float-0, и очигледно 1 поделено со 10 е 0,0. Сега, зошто е ова? И повторно, компјутерот е преземање мене буквално, и имам напишано 1 и јас напишано 10, и се погоди она што е претпоставува тип на податоци за овие два вредности? На int, тоа е технички нешто малку различен. Тоа е обично долг, но тоа е на крајот составен вредност. Не е децимален број. Кој е да се каже дека ако оваа е int и ова е int, проблемот е дека компјутерот не ја имаат способноста дури и да ги чувате дека децимална точка. Па кога ќе се направи 1 поделени 10 користење броеви за двете броителот и именител, одговорот треба да биде 0,1. Но бидејќи computer-- тие се integers-- не знаат што да прават со 0,1. Па што е тоа јасно го прават? Тоа е само тоа фрлање, и она што го гледам на крајот е 0,0 само затоа што инсистираше на тоа дека printf покажи ми еден децимална точка. Но, проблемот е во тоа што ако подели цел број со цел број, ќе get-- по дефиниција на C-- цел број. И тоа не се случува да се направи нешто убаво и удобно како круг тоа до најблискиот нагоре или надолу. Тоа се случува да се скрати што по децималната. Па само интуитивно, она што е веројатно фикс? Што е наједноставниот поправам тука? Да? Токму така. Зошто не ние само се третираат овие како подвижна запирка вредности ефикасно претворајќи ги во плови или двојки. И сега ако не ми прават плови-0, или ако јас ги собере плови-1, кој е идентичен со она што е само предлог. И сега јас плови-0, сега можам да добијам мојот 0.1. Сега ова е неверојатно. Но сега јас ќе одам да направите нешто малку различен. Јас сум љубопитен да видам што е навистина случува под хауба, и јас одам да се печати ја оваа до 28 децимални места. Сакам да навистина да се види 0.1000-- на infinite-- [Беззвучен] 27 нули после тоа 0.1. Па ајде да видиме, ако тоа е она што навистина се. Направи плови-0 иста датотека. ./floats-0. Ајде да зумирате на драматичен одговор. За сето тоа време, сте биле размислување 1 поделено со 10 е 10%, или 0.1. Тоа не е. Барем што се однесува до компјутер загрижен. Сега why-- во ред, тоа е целосна лага 1 поделено со 10 е 0,1. Но why-- тоа не е денес на готова брза. Па зошто компјутерот мислам, за разлика од сите нас во собата, дека 1 поделено со 10 е всушност луд вредност? Што е тоа очигледно компјутерот? Што е тоа? Тоа не е преливник, сама по себе. Overflow е обично кога ќе заврши околу вредност. Тоа е ова прашање на непрецизност во подвижна запирка вредност каде што треба само 32 или можеби дури и 64 битна. Но, ако има бесконечен бројот на вистински numbers-- броеви со децимален поени и броеви thereafter-- сигурно не можете да ги претставуваат сите од нив. Така што компјутер има дадено ни најблиските натпревар на вредноста може да претставува користење на тоа многу делови на вредноста јас всушност сакаат, што е 0,1. За жал, ако почнете да правите по математика, или почне со овие видови на подвижна точка вредности во важни programs-- финансиски софтвер, воена software-- ништо каде што перцепцијата е веројатно е многу важно. И ќе почнете додавање броеви, како таков, и почеток работи дека софтверот со навистина големи влезови или за многу часа или многу на денови или многу години, овие малечки грешки сигурно може да се додаде со текот на времето. Сега како настрана, ако некогаш сте види Супермен 3 или деловен простор и може да се потсетиме како овие момци украл многу пари од нивниот компјутер со користење на подвижна запирка вредности и собирање на малку остатоци, се надевам дека филмот сега го прави повеќе смисла. Тоа е она што тие беа алудирајќи на тој филм. Фактот дека повеќето компании не ќе изгледа по одреден број на децимални места, но тие се делови од центи. Значи кога ќе почнете додавање на нив, ќе почнете да се направи многу пари во вашата банкарска сметка. Па тоа е Канцелариски простор објасни. Сега за жал надвор Канцелариски простор, има некои легитимно вознемирувачки и значителни влијанија на овие видови на основниот дизајн одлуки, и навистина една од причините ние ги користиме C во текот е, така што навистина имаат оваа земја до разбирање на тоа како компјутери работа, како софтверот работи, и не земе здраво за готово. И навистина, за жал, дури и со дека основните разбирање, ние, луѓето прават грешки. И она што мислев дека сум ги споделат е ова осум минути видео е направена од Модерни Чудата епизода, која е образовна шоу на тоа како работите работа дека стравува две слики на несоодветна употреба и разбирање на подвижна запирка вредности доведоа до некои значајни жално резултати. Ајде да ги разгледаме. [Видео репродукција] -Ние Сега се врати на "Инжинерство Катастрофи "на Модерни чуда. Компјутери. Сме сите доаѓаат да го прифати честопати фрустрирачки проблеми со кои се добивте со them-- грешки, вируси, и софтвер glitches-- за мали цени да платат за погодност. Но во висока технологија и со голема брзина воена и вселенска програма апликации, најмалиот проблем може да се зголемува во катастрофа. На 4 јуни 1996 година, научниците подготвени да започне беспилотно Аријана 5 ракета. Тоа беше спроведувањето научни сателити дизајниран прецизно да се утврди како Земјиното магнетно поле се поврзува со соларни ветрови. Ракетата била изградена за Европската вселенска агенција, и крена надвор од својот објект на брегот на Француска Гвајана. -На Околу 37 секунди во летот, тие прво забележав нешто се случува не е во ред. Дека додатоците беа вртење во начинот на кој тие навистина не треба. Околу 40 секунди во лет, јасно возилото е во неволја, а тоа е кога тие го направија одлуката да го уништат. Опсегот безбедност офицер, со огромна храброст, притиснато копчето и го разнесе ракета пред да стане опасност за јавната безбедност. 'Ова е девица патување на Ariane 5, и неговото уништување се место поради пропустот вграден во софтвер на ракетата. -На Проблем на Аријана беше тоа што таму беше број кој бара 64 битови да го изразуваат, и тие сакаа да го конвертирате до 16-битен број. Тие претпоставуваат дека бројот Никогаш не требаше да биде голем. Дека повеќето од оние бројки во 64-битен број се нули. Тие беа во право. -На Неспособноста на еден софтверска програма да го прифати вид на број генериран од уште се во коренот на неуспех. Развој на софтвер стана многу скап дел од новата технологија. На Ariane 4 ракета имаше биле многу успешни. Толку многу на софтвер создадена за тоа е исто така се користи во Ariane 5. -На Основниот проблем беше дека Ariane 5. Беше faster-- забрза побрзо, и софтверот не придонеле за тоа. -На Уништување на ракетата беше огромна финансиска катастрофа. Сите се должи на една минута софтверска грешка. Но, ова не е прв Времето податоци конверзија проблеми во учењето на современи ракетни технологија. -Во 1991 година со почеток на првата Заливска војна, Патриот проектили доживеа сличен вид на голем број конверзија проблем. И како резултат на 28 people-- 28 Американски soldiers-- беа убиени, и стотина други беа ранети. Кога патриот, кој требаше за заштита од влезните Scuds, не успеа да оган проектил. -Кога Ирак го нападна Кувајт, а Америка започна Пустинска бура во почетокот на 1991 година, Патриот проектили батерии беа распоредени за заштита на Саудиска Арабија и Израел од ирачките Скад ракетни напади. Патриот е американска среден дострел земја-воздух систем произведени од страна на Raytheon компанија. -На Големината на Патриот пресретнувачи itself-- тоа е за околу 20 метри долга, и тежи околу 2.000 фунти. И таа носи боева глава од околу, Мислам дека тоа е околу 150 фунти. И боева глава сам по себе е висок експлозив, кој има фрагменти околу него. Па обвивка на боева глава е дизајниран да се однесува како buckshot. -На Проектили се врши четири од контејнер, и се транспортираат со полу приколка. -На Патриот анти-ракетен систем навраќа најмалку 20 години. Првобитно таа беше наменета како воздушна одбрана ракетен да ги соборат непријател авиони. Во првата Заливска војна кога таа војна дојде, Армијата сакаше да го користат за да соборат Scuds, не авиони. Ирачката воздухопловната беше не толку голем дел од проблемот, Меѓутоа, армијата се загрижени за Scuds. И така тие се обиделе да надградба на Патриотскиот. -Intercepting Непријател проектили патуваат со Мах 5 требаше да биде предизвик доволно. Но кога Патриот бил пренесен во употреба, Армијата не бил свесен за ирачки модификација дека заземаа своите scuds речиси невозможно за него. Што се случи е дека Scuds кои доаѓаат во се нестабилни. Тие беа разнишани. Причината за ова беше Iraqis-- со цел да се добие 600 километри од на 300 километри опсег missile-- ја тежината од пред боева глава, и го направија боева глава полесни. Па сега Патриот се обидува да дојде на Скад, и поголемиот дел од time-- огромното мнозинство на time-- тоа само ќе лета од Скад. -Откако Систем оператори Патриот реализира Патриот очајна, тие активирал боева глава Патриотскиот на да се избегнат можните жртви, ако тоа беше дозволено да падне на земјата. -Тоа Е она што повеќето луѓе го виде големи огнени топки на небото, и погрешно како оската на Скад боеви глави. -Although Во ноќта небо, патриоти се појави за да биде успешно уништување Scuds, во Дахран може да има Не прават грешка за неговата ефикасност. Таму Патриот на радарски систем губеше на дојдовен Скад и никогаш не започна поради на софтвер мааната. Тоа беше Израелци кои за првпат се откриени дека на подолг систем беше, толку е поголема временска неусогласеност стана. Како резултат на часовникот вградени во компјутерот на системот. -За Две недели пред трагедијата во Дахран, Израелците се изјасниле дека Министерството за одбрана дека системот е губење на време. По околу осум часа за трчање, тие забележале дека системот станува значително помалку точни. Министерството за одбрана одговорија со кажува на сите Патриот батерии да не ја напушти системи за долго време. Тие никогаш не рече она што долго време беше. 8 часа, 10 часа, на илјади часа. Никој не знаеше. -На Патриот батерии стационирани во касарните на Дахран и нејзините недостатоци внатрешна часовникот бил на повеќе од 100 часа Во ноќта на 25 февруари. -Тоа следи време со точност од околу една десетина од секунда. Сега една десетина од секунда е интересен број поради тоа што не може да се изрази во бинарен точно, кои значи дека не може да се изрази точно во секој модерен дигитален компјутер. Тоа е тешко да се поверува, но користете го ова како пример. Да го земеме на број една третина. Една третина не може да биде изразени во децимална точно. Една третина е 0,333 случува за бесконечност. Не постои начин да го направите тоа со апсолутна точност на децимална. Тоа е токму оној вид на проблем што се случи во патриот. Колку подолго системот трчаше, на полошо време грешка стана. -По 100 часа на работа, грешка во тоа време беше само околу една третина на вториот. Но во однос на таргетирање на проектили патуваат со Мах 5, тоа резултираше со следење на грешка од над 600 метри. Тоа ќе биде фатална грешка за војниците во Дахран. Што се случи е лансирањето Скад беше откриени од страна на сателити за рано предупредување, и тие знаеја на Скад доаѓа во нивната општа насока. Тие не знаат каде доаѓа. Сега тоа е до радарот компонента на системот Патриот одбрана Дахран да се лоцираат и да ја задржите пратите на влезните непријател проектили. -На Радар беше многу паметен. Тоа всушност ќе следи позицијата на Скад а потоа се предвиди каде тоа најверојатно ќе биде следниот пат радарска испрати пулсот надвор. Тоа беше наречен спектар портата. -Тогаш Откако Патриот одлучува доволно време има донесе да се врати и да се провери следниот локација за оваа откриен објект се враќа назад. Па кога се вратил во ред место, тогаш не гледа објект. И одлучи дека немало објект. Дека имало лажни детекција и капки на патеката. -На Дојдовни Скад исчезна од радарот екран, и секунди подоцна, удри во касарната. На Скад загинаа 28. Тоа беше последниот отпуштен за време на Првата заливска војна. За жал, ажурирани софтвер пристигна во раните утрински часови следниот ден. На софтвер мааната имаше е утврдена, затворање едно поглавје во проблематичниот историјата на Патриот проектили. [END видео репродукција] Дејвид Џ MALAN: Тоа е тоа за CS50. Ние ќе се видиме во средата. [Музички]