[MUSIK SPELA] DAVID J. MALAN: Okej. Detta är CS50, och detta är början på vecka två. Så låt oss börja idag med en bugg. Ett fel, naturligtvis, är en fel i ett program, och du får mycket bekant med detta begrepp om du aldrig har programmerat tidigare. pset0 och nu pset1. Men låt oss betrakta något lite enkelt i början. Detta program här som jag kastade samman i förväg, och jag hävdar att detta ska skrivas ut 10 stjärnor på skärmen med hjälp av printf, men det är tydligen buggy på något sätt. Med tanke på den specifikation som den bör skriva ut 10 stjärnor, men det gör inte uppenbarligen, vad skulle du påstår är felet? Yeah? Så det är en av av ett fel, och vad menar du med det? OK. Utmärkt. Så vi har angett en startvärde om noll för i, och vi har angett ett n-värde på 10, men vi har använt mindre än eller lika med. Och anledningen till att det är två tecken och inte bara en symbol, som i en mattebok, är att du inte har ett sätt att uttrycka ett tecken motsvarande. Så det innebär att mindre än, men om du börjar räkna på noll, men man räknar hela vägen upp genom och lika med 10, du är naturligtvis att gå till räkna 11 saker totalt. Och så ska du skriva ut 11 stjärnor. Så vad kan vara en fix för detta? Yeah? Så bara justera mindre än eller lika med bara vara mindre än, och det finns, jag påstår, kanske en annan lösning också. Vad kan annat du gör? Yeah? Så börja lika den till 1, och lämnar mindre än eller lika med. Och ärligt talat skulle jag påstå att för en typisk människa, detta är förmodligen enklare. Börja räkna på 1 och räkna upp genom 10. I huvudsak gör vad du menar. Men verkligheten är i programmering, som vi har sett, datavetare och programmerare allmänhet inte börja räkna på noll. Och så det är bra när du vänjer det. Ditt tillstånd kommer i allmänhet vara något i stil under. Så helt enkelt en logisk fel som vi kunde nu fixa och slutligen kompilera detta och få precis 10. Tja vad sägs om detta fel här? Här, igen, jag hävdar att jag har ett mål att skriva ut 10 stars-- ett per rad den här gången, men det gör det inte. Innan vi föreslår vad fix är, vad innebär det skriva ut visuellt om jag skulle sammanställa och kör detta program tycker du? Yeah? Star. Så alla stjärnorna på samma linje är vad jag hört, och sedan den nya linjen karaktär. Så låt oss prova det. Så gör buggy-1, anger, och jag ser kommandot klang som vi talade om förra gången. ./buggy-1, och faktiskt ser jag alla 10 stjärnor på samma linje även om jag påstår i min specifikation bara en kommentar på toppen den kod som jag tänkte göra en per linje. Men det ser rätt. Nu line 15 det ser ut som jag är skriva ut en stjärna, och sedan linje 16 det ser ut som jag är utskrift ett nyradstecken, och de är båda indragna så Jag är insidan av slingan tydligt. Så ska inte jag göra stjärna, nytt linje, stjärna, ny rad, stjärna, ny rad? Ja? Ja, till skillnad från ett språk som Python, om du är bekant, indrag inte roll till datorn. Det spelar bara för människan. Så medan här har jag hittat på linjer 15 och 16-- som är vacker, men datorn inte bryr sig. Datorn bryr sig om faktiskt ha klammerparenteser kring dessa rader kod. Så att det är clear-- precis som i Scratch-- att dessa två rader kod bör verkställas. Som en av de gula Scratch pussel stycken igen och igen och igen. Så nu om jag åter köra program-- ./buggy-2-- Hm. Jag har ett fel nu. Vad har jag glömt att göra? Ja, så jag inte kompilera den. Så gör buggy-2. Ingen sådan fil eftersom jag inte faktiskt kompilera den andra versionen. Så nu intressant odeklarerat variable-- inte 2. Vi gör 1. Gör barnvagn-1-- ./buggy-1-- och nu var och en av dem är på samma linje. Nu finns det ett undantag denna påstådda fordran till mig att du behöver dessa klammerparenteser. När är det egentligen OK-- om du har märkt i sektion eller textbooks-- att utelämna klammerparentes? Yeah? Exakt. När det bara finns en kodrad som du vill förknippas med den slinga som i vårt första exemplet. Det är helt legitimt att utelämna klammerparentes precis som en slags bekvämlighet från kompilatorn till dig. Yeah? Bra fråga. Skulle det anses vara en stil fel? Vi skulle promote-- såsom i CS50 stilguide, URL som är i pset1-- att alltid Använd klammerparentes. Visst, om du är ny till programmering. Verkligheten är att vi inte är kommer att förbjuda dig från att göra dessa bekvämligheter. Men om du bara får in i rytmen saker, absolut bara alltid använda lockigt hängslen tills du får kläm på det. Bra fråga. Okej. Så att då var en bugg. Åtminstone i något ganska enkelt. Och ändå du kanske tror att detta är ganska rudimentär, eller hur? Detta är en slags första veckan att se på språk ut, se dina fel däri. Men verkligheten dessa är faktiskt representativ av några ganska skrämmande problem som kan uppstå i den verkliga världen. Så några av er kanske kommer ihåg om du följer tech news, eller kanske till och med fångats vind av detta i februari för det gångna året som Apple hade gjorde lite av ett misstag i både iOS, operativsystemet på sina telefoner, och även Mac OS, operativsystemet på sina stationära och bärbara datorer. Och du såg sådana rubriker som denna. Och därefter, Apple lovade att fixa detta fel, och mycket snabbt fick fixa det i iOS, men sedan slutligen fast den i Mac OS också. Nu ingen av dessa rubriker ensam verkligen avslöja vad det underliggande problemet var, men buggen slutligen reduceras till en bugg i SSL, Secure Sockets Layer. Och lång historia kort, Detta är den programvara att våra webbläsare och annat programvara som används för att göra vad? Om jag sa att SSL är inblandade, när du besöka en URL som börjar med HTTPS, Vad då kanske SSL relateras till? Kryptering. Så vi pratar om detta under de kommande dagarna. Kryptering, konsten att förvrängningsinformation. Men lång historia kort, Apple någon gång sedan hade gjort ett misstag i genomförandet av SSL, den mjukvara som slutligen genomför Webbadresser som HTTPS eller max anslutningar där också. Resultatet av det är att din anslutningar skulle potentiellt avlyssnas. Och dina kontakter var inte nödvändigtvis krypterad om du hade en dålig kille mellan du och destinations webbplats som visste hur man dra nytta av detta. Nu Apple slutligen posted en fix för detta slutligen och beskrivningen sin fix var här. Säker transport misslyckades med att validera äktheten av anslutningen. Frågan togs upp av återställa saknade valideringssteg. Så det här är en väldigt handen vågig förklaring för att helt enkelt säga att vi klantade. Det är bokstavligen en kodrad som var buggy i genomförandet av SSL, och om du går på nätet och söka efter denna du kan faktiskt hitta den ursprungliga källkoden. Till exempel är det en skärmdump av bara en del av en ganska stor fil, men detta är en funktion tydligen kallas SSL verifiera sign server nyckelutbyte. Och det tar en massa argument och ingångar. Och vi kommer inte att fokusera för mycket på minutians där, men om du fokuserar på koden inuti av det översta function-- låt oss zooma in på det. Du kanske redan misstänker vad felet kanske vara även om du har ingen aning i slutändan vad du tittar på. Det är typ av en anomali här, vilket är vad? Ja, jag vet inte riktigt gillar utseendet på två goto misslyckas. Ärligt talat vet jag inte riktigt vad goto misslyckas sätt, men med två av dem rygg mot rygg. Det bara typ av gnuggar mig intellektuellt på fel sätt, och faktiskt om vi zoomar in på just dessa rader, är det C. Så en hel del av Apples kod är själv skriven i C, och detta synes är verkligen equivalent-- inte det ganska indrag versionen, men om du känner igen det faktum att det inte finns några klammerparentes, vad Apple verkligen skrev var kod som ser ut så här. Så jag har zoomat ut och jag bara fast indraget i den meningen att om det finns några klammerparentes, att andra goto misslyckas det är i gult kommer att köra oavsett vad. Det är inte förknippat med den om villkoret ovanför. Så även igen, inte om du gör helt förstå vad detta kan möjligen att göra, vet att var och en av dessa conditions-- vardera av dessa linjer är ett mycket viktigt steg i processen för kontroll Om dina data är faktiskt krypterad. Så hoppa över ett av dessa åtgärder, inte den bästa idén. Men eftersom vi har här andra goto misslyckas i gult, och eftersom när vi slags estetiskt flytta den till vänster där det logiskt är just nu, vad betyder det för linjen av koden nedan det andra goto misslyckas skulle du tänka? Det kommer alltid att hoppas över. Så GOTO allmänt ogillande av skäl som vi inte riktigt gå in, och även i CS50 vi brukar inte att undervisa detta uttalande goto, men du kan tänka på goto misslyckas på så sätt gå hoppa till någon annan del av koden. Med andra ord hoppar över denna sista raden helt och hållet, och så att resultatet av denna dumma enkla misstag som var precis ett resultat av förmodligen någon kopiera och klistra in en också många gånger var att hela säkerheten för iOS och Mac OS var utsatta för avlyssning av dåliga killar för ganska länge. Tills Apple äntligen fast detta. Nu om några av er är faktiskt kör gamla versioner av iOS eller Mac OS, du kan gå till gotofail.com som är en webbplats som någon satt upp att väsentligen bestämma prog Om datorn fortfarande är sårbar. Och ärligt talat, om det är, det är nog en bra idé att uppdatera telefonen eller din Mac på denna punkt. Men där, bara bevis på hur en uppskattning av dessa lägre nivå detaljer och ganska enkla idéer kan verkligen översätta till beslut och problem som affected-- i detta case-- miljontals människor. Nu några ord om administration. Avsnitt startar nu på söndag. Du kommer att få ett mail från helg om avdelning, vid vilken punkt den resektion processen börjar om du har insåg att du nu har några nya konflikter. Så det här händer varje år, och vi kommer att rymma i dagarna framöver. Office hours-- gör hålla ett öga på detta schema här. Ändrar lite den här veckan, särskilt starttiden och platsen, så konsultera att innan du går till kontorstid någon av de nästa fyra nätter. Och nu ett ord om bedömning, särskilt som du dyka in i problem ställer en och därefter. Så per specifikationen, dessa är i allmänhet axlarna längs vilka Vi utvärderar ditt arbete. Scope hänvisar till vad utsträckning din code redskap de funktioner som krävs genom vår specifikation. Med andra ord, hur mycket av en bit set gjorde du bita av. Har du gjort en tredjedel av den, en halv av den, 100% av den. Även om det inte är korrekt, Hur mycket har du försöker? Så som fångar den nivå ansträngning och det belopp som du bet av den Problemet set problem. Correctness-- detta en, till vilken omfattning, är din kod i linje med vår specifikationer och felfria. Så fungerar det på rätt sätt? Om vi ​​ger det en ingång, det gör det ge oss utgång som vi förväntar oss? Design-- nu detta är den första av de särskilt kvalitativa sådana, eller de som kräver mänsklig bedömning. Och faktiskt, det är därför vi har en personal så många undervisnings stipendiater och kursen assistenter. I vilken utsträckning är din kod skriven väl? Och även detta är en mycket kvalitativ bedömning som kommer att arbeta med dig på båda riktningarna i de kommande veckorna. Så att när du får inte endast numeriska poäng, men också en skriftlig poäng eller skrivit återkoppling, eller skriftlig återkoppling på engelska ord. Det är vad vi ska använda för att köra dig mot faktiskt skriver bättre kod. Och i föreläsning och avsnitt kommer vi att försöka peka out-- så ofta som vi can-- vad som gör ett program inte bara korrekt och funktionellt bra, men också väl utformade. Den mest effektiva det kan vara, eller även den vackert det kan vara. Vilket leder oss till stil. Stil slutligen är en estetisk bedömning. Visste du väljer bra namn på dina variabler? Har du indragen din kod ordentligt? Ser det bra ut, och därför, är det lätt för en annan människa att läsa era respektive om dess riktighet. Nu allmänhet per kursplanen, vi gör mål dessa saker på en fem-gradig skala. Och låt mig slå fast punkt att en tre är verkligen bra. Mycket snabbt gör folks börja göra aritmetik. När de får en tre av fem på korrekthet för lite pset och de tycker fan, jag går till 60% som huvudsakligen är en D eller E. Det är inte vårt sätt att tänka på dessa siffror. En tre är verkligen bra, och vad vi allmänhet förväntar i början av begreppet är att om du får ett gäng three's-- kanske ett par av mässor, ett par fours-- eller ett par tvåor, ett par fours-- det är ett bra ställe att börja. Och så länge vi ser en uppåtgående bana över tiden, du är i en särskilt bra plats. Formeln vi använder för att vikt saker är väsentligen detta per kursplanen, vilket bara innebär att vi ge mer tyngd åt riktighet. Eftersom det är väldigt ofta korrekthet som tar mest tid. Lita på mig nu. Du kommer find-- minst i en pset-- att du spenderar 90% av din tid arbetar på 10% av problemet. Och allt slags fungerar med undantag för en eller två buggar, och det är de buggar som hålla dig uppe sent på natten. De är de som slags fly dig. Men efter att ha sovit på den, eller deltar kontorstid eller ställa frågor på nätet, är när du kommer till att 100% mål, och det är därför vi vikt riktighet mest. Designa en lite mindre, och styla lite mindre än det. Men kom mind-- stil är kanske det enklaste av dessa för att bita av enligt den stilguide. Och nu, en mer allvarlig notera på akademisk hederlighet. CS50 har den olyckliga skillnaden av är den största tillverkaren av Ad Board fall nästan varje år historiskt. Detta beror inte på att eleverna fuska CS50 något mer så än någon annan klass, men på grund av arbetets art, det faktum att det är elektroniskt, det faktum att vi letar efter den, och det faktum att vi är datavetare, Jag kan säga att vi är tyvärr väldigt bra på att upptäcka det. Så vad innebär det i reala termer? Så det, per kursplanen, kursens filosofi verkligen kokar ner till att vara rimligt. Det finns denna linje mellan att göra något arbete på egen hand och att få en liten bit av rimlig hjälp från en vän, och hållet att göra det arbete för vän, eller skicka honom eller henne din kod så att han eller hon kan helt enkelt ta eller låna ut den till höger. Och det går över gränsen att vi dras i klassen. Se kursplanen i slutändan för linjerna att vi drar som rimliga och orimligt beteende, men det verkligen kokar ned till kärnan av ditt arbete att behöva vara din egen i slutändan. Nu med det sagt, det finns en heuristisk. För som du kanske imagine-- från kontorstid och det visuella och filmerna vi har visas således far-- CS50 verkligen är tänkt att vara som en kollaborativ och så samarbetsvillig och social som möjligt. Som samarbetsprojekt som det är rigorös. Men med detta sagt, den heuristiska, som du ser i kursplanen, är att när man har något problem. Du har lite fel i din kod som du inte kan lösa, är det rimligt för dig att visa din kod till någon annan. En vän till och med i klassen, en vän sitter bredvid dig på kontorstid, eller en medlem av personalen. Men de kanske inte visar sin kod till dig. Med andra ord, en svaret på din question-- Jag behöver help-- inte oh, här är min kod. Ta en titt på detta och härleda från det vad du vill. Nu, naturligtvis, det finns ett sätt tydligt till spel detta system där jag ska visa dig min kod innan en fråga. Du visar mig mitt koden innan en fråga. Men se kursplanen igen för finare uppgifter om var denna linje är. Bara för att nu måla bilden och delar så öppet som möjligt var vi är på de senaste åren, detta är antalet Ad Board fall som CS50 har haft över de senaste sju åren. Med 14 fall denna senaste höst. När det gäller de elever som berörs, det var 20 några udda elever i höstas. Det fanns en topp på 33 elever för några år sedan. Många av dem är tyvärr inte längre här på campus. Studenter som deltar i procent av den klass har historiskt varierade mellan 0% till 5,3%, vilket bara är att säga det är varje år en utmaning. Och mot detta syfte, vad vi vill göra är att förmedla en att vi dd-- just FYI-- jämföra på en rättvisa för de studenter som följer linjen i enlighet därmed. Vi jämför alla aktuella inlagor mot alla tidigare uppdrag från de senaste många år. Vi vet också hur man Googla runt och finna kodförråd nätet, diskussionsforum nätet, jobbsajter på nätet. Om en elev kan hitta den, kan vi säkert tycker att det är så mycket som vi tyvärr gör. Så vad du ser i kursplanen dock är denna ånger klausul. Jag kan säkert uppskattar, och vi alla har Personalen har gjort kursen som detta, eller den här med tiden, verkligen vet hur det är när livet kommer i vägen när man har några sena deadline-- inte bara i den här klassen, men another-- när du är helt utmattad, stressad, har ett omåttligt antal andra saker att göra. Du kommer att göra någon gång i livet verkligen en dålig, kanske sent night beslut. Så per kursplanen, det är denna klausul, så att om inom 72 timmar från något dåligt beslut, du äger upp till den och nå ut till mig och en av kursens huvuden och vi kommer att ha en konversation. Vi kommer att hantera saker internt i hopp det blir mer av en undervisningstillfälle eller livslektion, och inte något med särskilt drastiska konsekvenser som ni kanske ser på dessa diagram här. Så det är en mycket allvarlig ton. Låt oss stanna upp bara några sekunder för att bryta spänningen. [MUSIK SPELA] DAVID J. MALAN: Okej, så hur var det för ett segue? Till dagens primära ämnen. Den första är abstraktion. En annan som kommer att bli det representation av data, som sagt är en riktigt torrt sätt att säga hur kan vi gå om att lösa problem och tänka om att lösa problem? Så du har sett i Scratch, och du har kanske redan sett i pset1 med C att du inte bara kan använda funktioner, som printf, att andra människor i år tidigare skrev för dig. Du kan också skriva egna funktioner. Och även om du kanske inte har gjort detta i C, och uppriktigt sagt i pset1 Du behöver egentligen inte att skriva din egen funktion eftersom problem-- medan kanske skrämmande i först glance-- du ser kan slutligen lösas med Inte så många rader kod. Men med det sagt, när det gäller att skriva en egen funktion, inse att C ger du denna förmåga. Jag kommer att gå i dagens källkod, som finns redan på nätet, och jag ska gå vidare och öppna ett program som kallas funktions 0.C, och funktion noll vi får se ett par saker. I första raderna 18 genom 23 är mitt huvudsakliga funktion. Och nu när vi börjar läsa kod som vi inte skriver i farten, men i stället har jag skrivit i förväg eller att du på ett problem set skulle få ha skrivits i förväg. Ett bra sätt att börja läsa någon annans kod är att leta efter den viktigaste funktionen. Räkna ut var den posten Poängen är att köra programmet, och sedan följa logiskt av det. Så det här programmet tydligen utskrifter ditt namn följt av ett kolon. Vi använder sedan GetString från CS50 biblioteket för att få en sträng, eller ett ord eller en fras från användaren vid tangentbordet. Och så finns det här sak här-- PrintName. Nu PrintName är inte en funktion som kommer med C. Det är inte i standard io.h. Det är inte i CS50.h. Det är snarare i samma fil. Lägg märke till om jag bläddra ner en bit-- linjerna 25 till 27-- det är bara en söt sätt att kommentera din kod med hjälp av stjärnor och snedstreck. Detta är en multi-line kommentera, och detta är bara min beskrivning i blått på Vad den här funktionen gör. För i raderna 28 till 31, Jag har skrivit en super enkel funktion vars namn är PrintName. Det tar hur många argument skulle du säga? Så en argument-- eftersom det finns en argument listas i parentesen. Den typ av som String. Vilket betyder att PrintName är så här svarta lådan eller funktion som tar som indata en sträng. Och namnet på den String lämpligen blir Namn. Inte S, inte N, men namn. Så vad gör PrintName göra? Det är trevligt enkelt. Precis som en rad kod för printf, men tydligen det skriver ut "Hej" så och så. Om så och så kommer från argumentet. Nu är detta inte en stor innovation här. Egentligen har jag tagit ett program som kunde har skrivits med en rad kod genom att sätta upp detta här, och ändrade det till något som innebär vissa sex eller sju eller så kodrader ända ner hit. Men det är som utövar en Principen kallas abstraktion. Sort av inkapslande insidan av en ny funktion som har ett namn, och bättre men det namnet bokstav säger vad den gör. Jag menar printf-- det är inte särskilt beskrivande. Om jag vill skapa en pusselbit, eller om jag vill skapa en funktion som skriver ut någons namn, skönheten i att göra detta är att jag faktiskt kan ger denna funktion ett namn som beskriver vad den gör. Nu tar det i en ingång som Jag har godtyckligt kallas namn, men även det är underbart beskrivande istället för att vara lite mer generisk som S. Och tomrum, för nu, betyder bara att denna funktion inte lämna mig tillbaka något. Det är inte som GetString som bokstavligen händer mig tillbaka en sträng som vi gjorde med pappersbitarna med dina klasskamrater förra veckan, utan snarare att det bara har en sidoeffekt. Den skriver ut något på skärmen. Så i slutet av dagen, om jag gör funktions 0, ./function-0, Vi ser att den frågar efter mitt namn. Jag skriver David, och det slags ut mitt namn. Om jag gör det igen med Rob, det kommer att säga "Hej, Rob." Så en enkel idé, men kanske extrapolera från det mentalt att när dina program får lite mer komplicerat, och du vill skriva en bit av kod och samtal som code-- invoke att code-- av några beskrivande namn som PrintName, C gör ger oss denna möjlighet. Här är ett annat enkelt exempel. Till exempel, om jag öppnar upp en fil från dag kallas return.c, märke till vad jag har gjort här. Det mesta av denna huvudsakliga funktion är printf. Jag först godtyckligt initiera en variabel som heter x till antalet 2. Jag sedan skriva ut "x är nu % I "passerar i värdet av x. Så jag säger bara vad det är. Nu är jag bara djärvt hävdar med printf. Jag cubing detta värde x, och jag är att göra så genom att anropa en funktion kallad kub passerande i x som argument, och sedan spara utmatningen i variabeln själv, x. Så jag dunkar värdet av x. Jag åsidosätta värde på x med vad resultatet av att ringa denna kub funktion är. Och då jag bara skriva ut en del fluffiga saker här som säger vad jag gjorde. Så vad är då kub? Lägg märke till vad som är fundamentalt annorlunda här. Jag har fått uppgiften ett namn som tidigare. Jag har angett ett namn för ett argument. Den här gången kallas n istället för namn, men jag kan kalla det vad jag vill. Men det här är annorlunda. Denna sak till vänster. Tidigare var det som sökord? Boys. Nu är det tydligen int. Så vad är den kanske ta bort? Av följande skäl: void betecknar slags intighet, och så var fallet. PrintName tillbaka någonting. Det gjorde något, men det inte ge mig tillbaka något som jag kunde sätta på vänstra sidan av ett likhetstecken som jag har gjort här på rad 22. Så om jag säger till på rad 30, vad är det antagligen innebär om vad kub gör för mig? Yeah? Den returnerar ett heltal. Så det händer mig tillbaka, för Exempelvis, en bit papper som den har skrivit svaret. 2 kubik, eller 3 kubik, eller 4 cubed-- vad jag gick in, och hur har jag genomföra detta? Jo, just n gånger n gånger n är hur jag skulle kunna kub ett värde. Så återigen, super enkelt idé, men demonstra nu hur vi kan skriva funktioner som faktiskt hade oss tillbaka värden som kan vara av intresse. Låt oss titta på en sista exemplet här kallat funktion en. I detta exempel, börjar det att få mer övertygande. Så i funktion ett, detta program-- Grafiska ultimately anropar en funktion som heter GetPositiveInt. GetPositiveInt är inte en funktion i CS50 biblioteket men vi bestämde oss vill att det ska existera. Så om vi bläddra ner senare i filen, märker hur jag gick omkring och genomföra få positiva int, och jag säger att det är mer spännande eftersom detta är en anständig antal rader kod. Det är inte bara en dum lilla leksaksprogram. Det har faktiskt fått lite felkontroll och göra något mer användbart. Så om du inte har sett walkthrough videor som vi har inbäddade i pset1, vet att detta är en typ av loop i C, i samma anda till den typen av saker Scratch kan göra. Och gör säger gör detta. Skriv ut det här. Sedan gå vidare och få N-- få en int och förvara det på n, och fortsätter att göra det igen och igen och igen så länge som n är mindre än ett. Så n kommer att vara mindre än en endast om människan är inte samarbetsvilliga. Om han eller hon är att skriva i 0 eller -1 eller -50, denna slinga kommer att hålla exekvera igen och igen. Och i slutändan märker jag helt enkelt returnera värdet. Så nu har vi en funktion som skulle har varit trevligt Om CS50 skulle genomföra i CS50.h och CS50.c för dig, men här kan vi nu genomföra detta själva. Men två kommentarer på några viktiga detaljer. En-- varför jag förklarar int n, tror du, på linje 29 istället för att bara göra detta här, vilket är mer i linje med vad vi gjorde förra veckan? Yeah? En bra tanke. Så om vi skulle lägga den här, det är som om vi hålla att förklara det igen och igen. Som i och för sig är inte problematisk, per se, eftersom vi bara behöver värdet en gång och sedan vi kommer att få en ny i alla fall. Men en bra tanke. Yeah? Close. Så eftersom jag har förklarat n på linje 29 utsidan av slingan, Det är tillgängligt i hela Hela denna funktion. Inte de andra funktioner eftersom n är fortfarande inne i dessa lockigt hängslen här. Så-- säker. Exakt. Så det här är ännu mer rakt på sak. Om vi ​​istället deklareras n här på linje 32, Det är problematiskt eftersom gissning var annars jag behöver komma åt den? På rad 34, och den enkel tumregel är att du bara kan använda en variabel inne i de senaste klammerparenteser där du förklarade det. Olyckligtvis linje 34 är en linje för sent, för jag har redan stängt den lockiga stag på rad 33 som motsvarar den klammerparentes på rad 30. Och så det här är ett sätt att säga att denna variabel int är scoped, så att säga, bara inne av dessa klammerparenteser. Det bara inte existerar utanför dem. Så ja, om jag gör det här fel, låt mig spara koden som det är-- felaktigt skrivet. Låt mig gå vidare och gör funktion-1, och notice-- fel. Användning av odeklarerat identifierare n på rad 35, vilket är rätt här. Och om vi rulla upp ytterligare, en annan en. Användning av odeklarerat identifierare n på rad 34. Så kompilatorn, klang, är märker att det bara finns inte, även om klart det är där visuellt. Så en enkel fix är att förklara det där. Låt mig nu bläddra till början av filen. Vad hoppar ut på dig som att vara lite annorlunda från det vi såg förra veckan? Inte nog med att jag har känt, inte bara Jag har några vassa ingår upp toppen, Jag har något jag är kallar en prototyp. Nu som ser väldigt lik vad Vi såg bara en stund sedan på rad 27. Så låt oss dra slutsatsen från en annan felmeddelande varför jag har gjort detta. Låt mig gå vidare och radera dessa rader där. Och så vi vet ingenting om prototypen. Remake denna fil. Gör funktionen ett. Och nu, för fan, fyra fel. Låt oss bläddra fram till den första. Implicit deklaration av funktionen få positiva int är ogiltigt i C99. C99 betyder bara 1999 version av språket C, vilket är vad vi faktiskt använder. Så vad betyder det? Väl C-- och mer specifikt C compilers-- är ganska dumma program. De vet bara vad du har berättade för dem, och det är faktiskt tematiska från förra veckan. Problemet är att om jag går om att genomföra namn här uppe, och jag kallar en funktion som kallas GetPositiveInt här på linje 20, funktionen gör tekniskt existerar tills kompilatorn ser linjen 27. Olyckligtvis är kompilatorn göra saker top, ner, vänster, höger, så att den inte har sett genomförande av GetPositiveInt, men det ser du försöker att använda upp det här, det bara kommer att bail-- skrika på dig med ett fel Message-- kanske kryptiskt, och inte faktiskt kompilera filen. Så en så kallad prototyp upp här är visserligen överflödigt. Bokstavligen, jag gick ner här och jag kopierade och klistras det, och jag satte upp den här. Void skulle vara mer korrekt, så vi ska bokstavligen kopiera och klistra in den här gången. Jag bokstavligen kopierat och klistrat den. Egentligen precis som som en brödsmula. En liten ledtråd till kompilatorn. Jag vet inte vad detta innebär ännu, men jag lovar att du att det kommer att finnas så småningom. Och det är därför det line-- in line 16-- avslutas med ett semikolon. Det är överflödigt med design. Ja? Om du inte länka ditt bibliotek att i-- oh, bra fråga. Sharp innehåller header fil inneslutningar. Behöver vara-- bör nästan alltid högst upp av filen till en similar-- för exakt samma anledning, ja. För i standard io.h är bokstavligen en linje som denna, men med ordet printf, och med sina argument och returtyp. Och så genom att göra skarpa omfatta upp här, vad du är bokstavligen göra är att kopiera och klistra innehållet av någon annan skrev där uppe. Därmed cluing din kod i den Att det också finns dessa funktioner. Yeah? Absolut. Så en mycket smart och korrekt lösning skulle vara, vet du vad? Jag vet inte vad en prototyp är, men jag vet om jag förstår att C är bara dum och rethinks topp till botten. Nåväl låt oss ge den vad den vill. Låt oss klippa den koden, klistra upp den topp, och nu driva huvud ner nedan. Detta skulle också lösa problemet. Men du kan mycket enkelt komma med ett scenario där A behöver ringa B, och kanske B ringer tillbaka till A. Detta är något som kallas rekursion, och vi ska återkomma till det. Och det kan eller inte kan vara en bra sak, men du kan definitivt bryta denna lösning. Och dessutom skulle jag hävdar stilist, speciellt när dina program blir denna långa och denna långa, det är bara super bekvämt att sätta huvud på toppen eftersom det är den sak de flesta programmerare kommer att bry sig om. Och så det är lite renare, vågar jag påstå, att göra det på det sätt Jag ursprungligen gjorde det med en prototyp även även om det ser lite överflödiga vid första anblicken. Yeah? Tyvärr, du kan säga det högre? Om du växlar platserna för genomförande och prototypen? Så det är en bra fråga. Om du åter deklarera detta ner Här, låt oss se vad som händer. Så om jag lägger ner det här Här, du säger. Åh, förlåt. Louder? Ännu högre. Åh, bra fråga. Skulle det ogiltig funktionen? Du vet, efter alla dessa år, jag har aldrig lagt en prototyp efteråt. Så låt oss göra göra funktions 1 efter att ha gjort det. [Muttrade] DAVID J. MALAN: Åh, vänta. Vi måste fortfarande ställa allt upp överst. Så låt oss göra det här, om jag är förstå din fråga rätt. Jag sätter allt, inklusive prototypen ovanför huvud, men jag sätter prototypen nedan genomförandet. Så om jag gör något, jag får tillbaka en error-- oanvänd variabel n. Åh, där. Tack. Låt oss se, blir vi av med det här. Det är en annan bugg, så låt oss bortse från det. Låt oss verkligen snabbt remake här. OK, så informationen inte argument används av format String N-- åh, det är därför Jag bytte till dessa här. Okej, vi vet vad svaret går att-- okej, nu kör vi. Ah, tack för det positiva. Okej, jag kommer att fixa den här koden after-- ignorera denna bugg eftersom detta var-- det fungerar är svaret. Så det inte att skriva över vad du just gjort. Jag misstänker kompilatorn är skriven på ett sådant sätt att den ignorerar din prototyp eftersom kroppen, så att säga, av funktionen redan har genomförts högre upp. Jag måste faktiskt konsul handboken för kompilatorn för att förstå om det finns någon annan förstått, men vid första anblicken bara genom att försöka och experimentera, det verkar inte finnas någon effekt. Bra fråga. Så låt oss gå framåt nu, flyttar bort från biverkningar som är funktioner som gör något liknande visuellt på skärmen med printf, men inte returnera ett värde. Och funktioner som har retur värden som vi såg bara några av. Vi såg redan denna föreställning om utrymme, och vi får se det här om och om igen. Men för nu, återigen, använd tumregel att en variabel endast kan användas inne i den senast öppnade och slutna klamrar som vi såg i just exemplet. Och som du påpekade, det finns en ability-- du kan lösa en del av dessa problem genom att sätta en variabel globalt högst upp på en fil. Men i nästan alla fall Vi skulle rynka pannan på detta, och faktiskt inte ens gå in i den lösning för nu. Så nu är takeaway att variabler har denna föreställning om utrymme. Men nu ska vi titta på en annan torrt sätt att faktiskt se vid något ganska intressant genomförandet detaljer. Hur vi kan representera information. Och vi har redan tittat på det här i den första veckan i klassen. Om man tittar på binärer, och att påminna oss själva om decimal. Men minns från förra veckan att C har olika datatyper och klasar mer, men de mest användbara sådana för nu kan vara dessa. En röding, eller karaktär, vilket händer att vara en byte, eller åtta bitar totalt. Och det är att säga att storleken en röding är bara ett byte. En byte är åtta bitar, så det innebär att Vi kan representera hur många tecken. Hur många bokstäver eller symboler på tangentbordet om vi har en byte eller åtta bitar. Tänk tillbaka till vecka noll. Om du har åtta bitar, hur många totalvärden kan du representerar med mönster av ettor och nollor? En-- mer än så. Så 256 totalt om du börja räkna från noll. Så om du har åtta bits-- så om vi hade våra binära lökar upp här igen, vi kunde vända dessa lampor på och av i någon av 256 unika mönster. Nu är det är lite problematiskt. Inte så mycket för engelska och romanska språk, men absolut när du introducerar, för instans, asiatiska språk, vilket har betydligt fler symboler än som 26 bokstäver i alfabetet. Vi faktiskt kanske behöver mer än en bitgrupp. Och tack och lov i senare år har samhället antagna andra standarder som använder mer än en bitgrupp per laddning. Men för nu i C, standard är bara ett byte eller åtta bitar. Ett heltal, under tiden, är fyra bytes, annars känd som 32 bitar. Vilket betyder vad är den största möjliga nummer som vi kan representera med en int tydligen? Med en miljard. Så det är fyra miljarder ge eller ta. 2 till 32th makten, om vi ta några negativa tal och bara använda alla positiva siffror, det är fyra miljarder ge och ta möjligheter. En flottör, under tiden, är en annan typ av datatyp i C. Det är fortfarande ett nummer, men det är ett reellt tal. Något med en decimal. Och det visar sig att C använder också fyra bitgrupper att representera flyttalsvärden. Olyckligtvis hur många flytande punktvärdena finns det i världen? Hur många reella tal finns det? Det finns en oändlig nummer, och för den delen Det finns ett oändligt antal heltal. Så vi är redan typ av gräva oss ett hål här. Varvid tydligen i computers-- vid minst program skrivna i C på dem-- får endast räknas som högt som fyra miljarder ge eller ta, och flyttalsvärden kan bara skenbart ha någon ändlig mängd av precision. Endast så många siffror efter deras decimalkomma. Jo, naturligtvis, om du har bara 32 bitar, Jag vet inte hur vi ska gå tillväga representerar verklig numbers-- förmodligen med olika typer av mönster. Men det finns säkert en ändlig Antalet sådana mönster, så även här, det här är problematiskt. Nu kan vi undvika problemet något. Om du inte använder en flottör, du kan använda en dubbel i C, vilket ger dig åtta byte, vilket är långt fler möjliga mönster av nollor och ettor. Men det är fortfarande begränsad, vilket går vara problematiskt om du skriver programvara för grafik eller efter fancy matematiska formler. Så du kanske egentligen vill att räkna upp större än så. En lång long-- enfaldigt named-- är också åtta byte, eller 64 bitar, och detta är dubbelt så lång som en int, och det är en lång heltal. Kul fact-- om en int är fyra byte, Hur lång är en lång i C normalt? Också fyra byte, men en lång lång är åtta byte, och det är av historiska skäl. Men takeaway nu är bara det att uppgifterna har att vara representerade i ett computer-- som är en fysisk enhet med el, det är allmänt drivande dessa nollor och ones-- med ändliga mängder precision. Så vad är problemet då? Jo det finns ett problem av heltalsspill. Inte bara i C, men i datorer i allmänhet. Till exempel, om denna är ett byte värt en bit-- så om det är åtta bit-- alla av som är nummer ett. Vilket nummer är det representerar om vi antar det är alla positiva värden i binär? 255, och det är inte 256, eftersom noll är det lägsta numret. Så 255 är den högsta en, men problemet är tänkt att jag ville öka denna variabel som använder åtta bitar totalt om jag vill öka den. Väl så fort jag lägger till en en till alla dessa sådana, kan du kanske tänka dig visually-- bara som att bära den med hjälp decimals-- något som kommer att strömma till vänster. Och faktiskt, om jag lägger till det antal en till detta, vad som händer i binärt är att det flödar tillbaka till noll. Så om du bara use-- inte en int, men ett enda byte räkna heltal i ett program, genom default-- snarast du får 250, 251, 252, 253, 254, 255-- 0 kommer efter 255, vilket förmodligen inte är vad en användare kommer att förvänta sig. Nu under tiden i flyttal värld, du har också ett liknande problem. Inte så mycket med den största number-- även om det är fortfarande ett problem. Men med mängden precision att du kan representera. Så låt oss ta en titt på det här exemplet här även från dagens käll code-- float-0.c. Och märker att det är en super enkelt program som ska tydligen skriva ut vilket värde? Vad tror du satsa det kommer att skriva ut även om det är lite av ny syntax här? Så förhoppningsvis 0.1. Så motsvarande en tiondel eftersom jag gör 1 dividerat med 10. Jag lagra svaret i en variabel som heter f. Denna variabel är av typen float, vilket är ett nyckelord jag just föreslagit existerade. Vi har inte sett det här förut, men Detta är typ av ett snyggt sätt i printf för att ange hur många siffror du vill se efter en decimalpunkt. Så denna notation betyder bara det här är en platshållare. Det är till ett flyttal värde, och oh, förresten, visa den med decimalkommat med ett nummer efter decimalkommat. Så det är antalet signifikanta siffror, så att säga, som du kanske vill. Så låt mig gå vidare och göra gör float-0, ./float-0, och tydligen 1 delat med 10 är 0,0. Nu varför är detta? Väl åter är datorn tar mig bokstavligen, och jag har skrivit en och jag skrivit 10, och ta en gissning vad är den antagna datatyp för dessa två värden? En int, det är tekniskt något lite annorlunda. Det är oftast en lång, men det är slutligen en integrerad värde. Inte ett flyttal. Vilket är att säga att om det är en int och det är en int, problemet är att datorn inte har förmåga att även lagra den decimalkomma. Så när du gör en uppdelad med 10 använder heltal för både täljare och nämnare, bör svaret bli 0,1. Men computer-- eftersom de är integers-- vet inte vad jag ska göra med 0,1. Så vad är det tydligt gör? Det är bara att kasta bort den, och vad jag ser i slutändan är 0.0 bara för att jag insisterade på att printf visa mig en decimal. Men problemet är att om du dela ett heltal med ett heltal, hittar get-- definitions av C-- ett heltal. Och det kommer inte att göra något trevligt och bekvämt gillar runda det upp till närmaste en uppåt eller nedåt. Det kommer att korta av allt efter decimalkommat. Så bara intuitivt, vad är nog en fix? Vad är det enklaste fix här? Yeah? Exakt. Varför inte vi bara behandla dessa som flyttalsvärden effektivt göra dem till flöten eller dubbel. Och nu om jag gör flottar-0, eller om jag sammanställa flottar-1, som är identisk med det som just föreslagits. Och nu gör jag flottar-0, nu får jag min 0.1. Nu är det här fantastiskt. Men nu ska jag göra något lite annorlunda. Jag är nyfiken på att se vad som verkligen händer under huven, och jag kommer att skriva ut detta ut till 28 decimaler. Jag vill verkligen se 0.1000-- en infinite-- [Ohörbart] 27 nollor efter att 0,1. Nåväl låt oss se om det är vad jag verkligen får. Gör flottar-0 samma fil. ./floats-0. Låt oss zooma in på den dramatiska svaret. Hela tiden har du varit tänkande 1 delat med 10 är 10%, eller 0,1. Det är inte. Minst mån dators berörs. Nu why-- OK, det är komplett lögn 1 delat med 10 är 0,1. Men why-- som inte är takeaway idag. Så varför datorn tänker, till skillnad från oss alla i rummet, att 1 delat med 10 är faktiskt att galna värde? Vad datorn gör tydligen? Vad är det? Det är inte svämma över, per se. Overflow är vanligtvis när du linda runt ett värde. Det är här frågan om vaghet i en flyttalsvärde där du bara har 32 eller kanske till och med 64 bit. Men om det finns en oändlig antal verkliga numbers-- tal med decimaler och siffror thereafter-- säkert du kan inte representera dem alla. Så datorn har gett oss den närmaste träffen till det värde den kan representera med hjälp av att många bitar till det värde som jag egentligen vill, vilket är 0,1. Tyvärr, om du börja göra matte, eller om du börja engagera dessa typer av flytande punktvärden i viktiga programs-- finansiella programvara, militär software-- något där uppfattningen är förmodligen ganska viktigt. Och du börjar lägga siffror som denna, och start kör den programvaran med riktigt stora ingångar eller för massor av timmar eller partier av dagar eller massor av år, Dessa små små misstag säkert kan lägga upp över tid. Nu som en sidoreplik, om du någonsin sett Superman 3 eller Office Space och du kanske kommer ihåg hur dessa killar stal mycket pengar från sin dator genom användning av flyttalsvärden och lägga upp den lilla rester, förhoppningsvis den filmen Nu är mer förnuftigt. Detta är vad de var anspelning på i den filmen. Det faktum att de flesta företag skulle inte se efter ett visst antal decimaler, men de är bråkdelar av cent. Så du börjar att lägga upp dem, du börjar göra en massa pengar på ditt bankkonto. Så det är Office Space förklaras. Nu tyvärr bortom Kontor finns är några legitimt oroande och betydande konsekvenser av dessa typer av underliggande designbeslut, och faktiskt en av anledningarna vi använder C under loppet är så att du verkligen har denna grund upp förståelse för hur datorer fungerar, hur programmet fungerar, och inte ta något för givet. Och faktiskt tyvärr även med denna grundläggande förståelse, vi människor gör misstag. Och vad jag trodde jag skulle dela är här åtta minuters video här tagit från en Modern Marvels episod, som är en pedagogisk utställning om hur saker fungerar som målar två bilder om när en felaktig användning och förståelse för flyttalsvärden lett till några betydande olyckliga resultat. Låt oss ta en titt. [VIDEOAVSPELNING] -Vi Nu återgå till "Engineering Katastrofer "på Moderna Marvels. Datorer. Vi har alla kommit att acceptera ofta frustrerande problem som kom med dem-- buggar, virus och programvara glitches-- för små priser att betala för bekvämlighet. Men i högteknologiska och hög hastighet militär och rymdprogramansökningar, det minsta problemet kan förstoras till katastrof. Den 4 juni 1996 vetenskapsmän beredda att lansera en obemannad Ariane 5-raketen. Det bar vetenskapliga satelliter utformad att fastställa exakt hur den Jordens magnetfält samverkar med solvinden. Raketen byggdes för Europeiska rymdorganisationen, och lyfte från sin anläggning vid kusten i Franska Guyana. -at Ungefär 37 sekunder in flygningen, de först märkte något var fel. Att munstyckena var svängbara på ett sätt som de borde verkligen inte. Cirka 40 sekunder in i flygningen, tydligt att fordonet var i trubbel, och det är när de gjorde beslutet om att förstöra den. Utbudet skyddsombud, med enorma tarmar, tryckte på knappen och sprängde raketen innan den kunde blivit en fara för den allmänna säkerheten. -Detta Var jungfrun resan av Ariane 5, och dess förstörelse tog Placera på grund av fel inbäddad i raketens programvara. -The Problem på Ariane var att det var ett antal som krävs 64 bitar för att uttrycka, och de ville omvandla den till ett 16-bitars nummer. De antas att antalet aldrig kommer att bli mycket stora. Att de flesta av dessa siffror 64-bitars numret var nollor. De hade fel. -The Oförmåga av en mjukvaruprogram för att acceptera den typ av tal som genereras av en annan var roten till misslyckande. Mjukvaruutveckling hade blivit en mycket kostsam del av ny teknik. Den Ariane 4 raketen hade varit mycket framgångsrikt. Så mycket av den programvara som skapats för Det användes också i Ariane 5. -The Grundläggande problemet var att Ariane 5. Blev faster-- accelereras snabbare, och programmet hade inte stod för det. -The Förstörelse av raketen var en enorm ekonomisk katastrof. Allt på grund av en minut programvarufel. Men detta var inte den första tidsproblem data konvertering hade plågat modern raketteknik. -I 1991 med starten av det första Gulfkriget, Patriot missil upplevt liknande slag av ett antal konverteringsproblem. Och som ett resultat 28 people-- 28 Amerikanska soldiers-- dödades, och ett hundratal andra skadades. När Patriot, som var tänkt för att skydda mot inkommande Scuds, misslyckades med att avfyra en missil. -När Irak invaderade Kuwait, och Amerika lanserade Desert Storm i början av 1991, Patriot missil batterier utplacerades att skydda Saudiarabien och Israel från irakiska Scud missiler. Patriot är ett amerikanskt medium-range surface-to-air-systemet tillverkas av Raytheon företaget. -The Storlek av Patriot interceptor itself-- det är ungefär ungefär 20 meter lång, och den väger ca 2000 pounds. Och det bär en stridsspets av ca, Jag tycker det är runt 150 pounds. Och stridsspetsen själv är ett sprängämne, som har fragment omkring honom. Så höljet hos stridsspetsen är utformats för att fungera som en hagel. -The Missiler genom fyra per container, och transporteras av en påhängsvagn. -The Patriot anti-missilsystem går tillbaka minst 20 år nu. Den var ursprungligen avsedd som ett luftvärnsrobot att skjuta ner fientliga flygplan. I det första Gulfkriget när det kriget kom, armén ville använda den för att skjuta ner Scuds, inte flygplan. Den irakiska flygvapnet var inte så mycket av ett problem, men armén var orolig Scuds. Och så försökte de att uppgradera Patriot. -Intercepting En fiende missil färdas i Mach 5 skulle bli utmanande nog. Men när Patriot var rusade i bruk, armén var inte medveten om en irakisk ändring som gjorde sina Scuds nästan omöjligt att den. Vad hände är Scuds som kom in var instabila. De var vinglig. Anledningen till detta var att Iraqis-- för att få 600 kilometer ut av en 300 kilometer lång rad missile-- tog vikt ur den främre stridsspetsen, och gjorde stridsspets ljusare. Så nu Patriot försöker komma vid Scud, och de flesta av time-- den överväldigande majoriteten av time-- det skulle bara flyga av Scud. -När Patriotsystemansvariga insåg Patriot missade sitt mål, De detonerade Patriot stridsspets att undvika eventuella förluster om det tilläts falla till marken. -Det Var vad de flesta människor såg som stora eldklot på himlen, och missförstås som avlyssningar av Scud stridsspetsar. -Även I natthimlen, patrioter verkade med framgång förstör Scuds åtmin Dhahran det kan finnas Ingen tvekan om dess prestanda. Där Patriot radarsystem förlorat kontakten med en inkommande Scud och aldrig lanserats på grund till en programvara fel. Det var israelerna som först upptäcktes att ju längre systemet var på, desto större tidsavvikelse blev. På grund av en klocka inbäddad i systemets dator. -Omkring Två veckor före tragedin i Dhahran, israel rapporteras till Försvarsdepartementet att systemet var att förlora tid. Efter ca åtta timmar av löpning, märkte de att systemets bli märkbart mindre exakt. Försvarsdepartementet svarade med träffande alla Patriot batterier att inte lämna de system på under en längre tid. De sa aldrig vad en lång tid var. 8 timmar, 10 timmar, tusen timmar. Ingen visste. -The Patriot batteri stationerad vid barackerna vid Dhahran och dess bristfälliga inre Klockan hade varit på över 100 timmar på kvällen den 25 februari. -Det Band tid med en noggrannhet för ungefär en tiondels sekund. Nu har en tiondels sekund är ett intressant eftersom det inte kan uttryckas i binär exakt, vilket innebär det inte kan uttryckas exakt i alla moderna digitala datorn. Det är svårt att tro, men använda detta som ett exempel. Låt oss ta nummer en tredjedel. En tredjedel kan inte vara uttryckt i decimal exakt. En tredjedel är 0,333 pågått i oändlighet. Det finns inget sätt att göra det med absolut noggrannhet i en decimal. Det är precis den typ av problem som hände i Patriot. Ju längre systemet sprang, den värre tidsfelet blev. -Efter 100 timmars drift fel i tiden var endast omkring en tredjedel av en sekund. Men när det gäller att rikta ett missil som färdas i Mach 5, Det resulterade i en spårning fel på över 600 meter. Det skulle vara ett allvarligt fel för soldaterna vid Dhahran. Vad hände är en Scud lansering var detekteras av satelliter för tidig varning, och de visste en Scud skulle komma i sin allmänna riktning. De visste inte var det skulle komma. Det var nu upp till radarn komponent i Patriot-systemet försvara Dhahran att hitta och behålla koll på inkommande fientliga missiler. -Den Radar var väldigt smart. Det skulle faktiskt spåra positionen av Scud och sedan förutsäga var det förmodligen skulle vara nästa gång radar skickade en puls ut. Det kallades området grinden. -Då Gång Patriot beslutar tillräckligt med tid har gått att gå tillbaka och kontrollera nästa plats för detta detekterade objektet den går tillbaka. Så när det gick tillbaka till fel plats, då ser det inget objekt. Och den beslutar att det inte fanns något föremål. Att det fanns en falsk detektering och det sjunker spåret. -The Inkommande Scud försvann från radarskärmen, och sekunder senare, det smällde in i kasernerna. Den Scud dödade 28. Det var den sista sparken under det första Gulfkriget. Tragiskt nog, den uppdaterade programvaran anlände i gryningen följande dag. Programvaran fel hade varit fast, stängning ett kapitel i den oroliga historia Patriot missil. [END VIDEOAVSPELNING] DAVID J. MALAN: Det är det för CS50. Vi kommer att se dig på onsdag. [MUSIK SPELA]