>> [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]