[Speel van musiek] David J. Malan Alle regte. Dit is CS50, en dit is die begin van die week twee. So laat ons begin vandag met 'n fout. 'N fout, natuurlik, is 'n fout in 'n program, en jy sal baie kry vertroud is met die konsep As jy nog nooit geprogrammeer voor. pset0 en nou pset1. Maar laat ons kyk na iets 'n bietjie eenvoudig op die eerste. Hierdie program hier dat ek gooi saam in advance, en ek beweer dat dit moet druk 10 sterre op die skerm met printf, maar dit is blykbaar karretjie in een of ander manier. Gegewe dat spesifikasie wat dit moet druk 10 sterre, Maar dit beteken nie glo, wat sou jy sê is die fout? Ja? So dit is 'n af deur een fout, en wat bedoel jy daarmee? OK. Uitstekend. Dus het ons 'n gespesifiseerde begin waarde van nul vir i, en ons het 'n gespesifiseerde n waarde van 10, maar ons het minder as of gelyk aan gebruik. En die rede dat dit twee karakters en nie net een simbool, soos in 'n wiskunde boek, is dat jy nie het nie 'n manier om die een karakter ekwivalent. So dit beteken dat minder as, maar As jy begin tel op nul, maar jy al die pad tel om deur middel van en gelyk aan 10, jy natuurlik gaan tel 11 dinge in totaal. En so gaan jy 11 sterre te druk. So, wat dalk 'n oplossing hiervoor wees? Ja? Dus net pas die minder as of gelyk aan net minder as wees, en daar is, ek eis, miskien 'n ander oplossing, ook. Wat kan jy nog doen? Ja? So begin gelykstaande dit tot 1, en laat die minder as of gelyk aan. En eerlik ek sou beweer dat, vir 'n tipiese menslike, hierdie is waarskynlik meer eenvoudig. Begin tel op 1 en tel deur 10. In wese doen wat jy bedoel. Maar die werklikheid is in ontwikkeling, soos ons gesien het, rekenaar wetenskaplikes en programmeerders algemeen nie begin tel by nul. En so is dit goed een keer jy gebruik om dit te. Jou toestand sal oor die algemeen wees iets soos minder as. So eenvoudig 'n logiese fout wat ons kon nou los en uiteindelik heropstel hierdie en net 10 kry. Wel hoe oor hierdie fout hier? Hier, weer, ek beweer dat ek 'n doel van die druk van 10 stars-- een per lyn hierdie keer, maar dit nie doen nie. Voordat ons voor wat Die oplossing is, wat beteken dit druk visueel as ek op te stel en die uitvoering van hierdie program dink jy? Ja? Star. So al die sterre op die dieselfde lyn is wat ek gehoor het, en dan die nuwe lyn karakter. So laat ons probeer dit. So maak karretjie-1, betree, en ek sien die klang opdrag dat ons het gepraat oor die laaste keer. ./buggy-1, en ja, ek sien al 10 sterre op dieselfde lyn, selfs al het ek beweer in my spesifikasie net 'n opmerking bo die kode wat ek bedoel een per te doen lyn. Maar dit lyk reg. Nou lyn 15 lyk dit asof ek druk van 'n ster, en dan reël 16 dit lyk asof ek druk 'n nuwe lyn karakter, en hulle is albei ingekeep so Ek is binnekant van die loop duidelik. So moet ek nie doen ster, nuwe lyn, ster, nuwe lyn, ster, nuwe lyn? Ja? Ja, in teenstelling met 'n taal soos Python, as jy vertroud is, inkeping nie saak na die rekenaar. Dit is belangrik om eers die mens. So, terwyl hier Ek het uitgevind lyne 15 en 16-- daardie pragtige lyk, Maar die rekenaar nie omgee nie. Die rekenaar omgee eintlik met krulhakies rondom hierdie reëls van die kode. Sodat dit clear-- net soos in Scratch-- dat die twee reëls van die kode uitgevoer moet word. Soos een van daardie geel Scratch legkaart stukke weer en weer en weer. So as ek nou weer uit te voer hierdie program-- ./buggy-2-- Hm. Ek het 'n fout nou. Wat het ek vergeet om te doen? Ja, so ek het nie stel nie. So maak karretjie-2. Geen sodanige lêer want ek het nie eintlik stel die tweede weergawe. So nou interessant swart variable-- nie 2. Ons doen 1. Maak karretjie-1-- ./buggy-1-- en nou elkeen van hulle is op dieselfde lyn. Nou is daar 'n uitsondering op hierdie sogenaamde eis van my wat jy nodig het om hierdie krulhakies. Wanneer is dit eintlik OK-- as jy het opgemerk in artikel of textbooks-- die krulhakies te laat? Ja? Presies. Wanneer daar is net een reël van die kode wat jy geassosieer wil word met die lus as in ons eerste voorbeeld. Dit is heeltemal wettig die krulhakies te laat net as 'n soort van 'n gerief van die vertaler te jou. Ja? Goeie vraag. Sou dit oorweeg word om 'n styl fout? Ons wil promote-- as in CS50 styl gids, die URL waarvoor is in pset1-- wat altyd gebruik die krulhakies. Seker as jy nuut is tot ontwikkeling. Die werklikheid is dat ons nie gaan jy te verbied te doen om hierdie geriewe. Maar as jy net om in die gang van dinge, absoluut net altyd die krullerige draadjies totdat jy die hang van dit. Goeie vraag. Alle regte. So wat was 'n fout. Ten minste in iets redelik eenvoudig. En tog is jy dalk dink hierdie is redelik basiese, reg? Dit is 'n soort van die eerste week om te kyk na die taal soos, sien jou foute daarin. Maar die werklikheid is hierdie eintlik verteenwoordiger van 'n paar mooi skrikwekkende probleme wat kan ontstaan ​​in die werklike wêreld. So 'n paar van julle kan onthou as jy tegnologie nuus volg, of miskien selfs gevang wind van hierdie in Februarie van die afgelope jaar dat Apple het het 'n bietjie van 'n fout in beide IOS, die bedryfstelsel op hul selfone, en ook Mac OS, die bedryfstelsel op hul rekenaars en skootrekenaars. En jy het so nuus soos hierdie. En daarna, Apple belowe dat hierdie fout reg te stel, en baie vinnig het dit reg in IOS, maar dan uiteindelik het dit in Mac OS sowel. Nou een van hierdie nuus alleen werklik openbaar wat die onderliggende probleem is, maar die fout is uiteindelik verminder tot 'n fout in SSL, veilige voetstukke laag. En 'n lang storie kort, dit is die sagteware dat ons blaaier en ander sagteware wat gebruik word om te doen wat? As ek sê dat SSL betrokke is, wanneer jy besoek 'n URL wat met HTTPS begin, wat dan kan SSL verband hou? Enkripsie. So ons sal praat oor dit in die komende dae. Kodering, die kuns van skommeling inligting. Maar lang storie kort, Apple tyd gelede het 'n fout gemaak in die uitvoering van die SSL, die sagteware wat uiteindelik implemente URLs soos HTTPS of maksimum verbindings ook daar. Die gevolg hiervan is dat jou verbindings kan potensieel onderskep word. En jou verskaffers was nie noodwendig geïnkripteer As jy het 'n paar slegte man in tussen jy en die bestemming webwerf wat geweet hoe om voordeel te trek uit hierdie. Nou Apple uiteindelik gepos 'n oplossing vir hierdie uiteindelik, en die beskrywing van hul fix was nie. Veilige vervoer versuim het om te bekragtig die egtheid van die verbinding. Die kwessie is aangespreek deur herstel ontbreek validering stappe. So, dit is 'n baie hand golwende verduideliking vir net sê dat ons geskroef. Daar is letterlik 'n reël van die kode wat karretjie in die uitvoering van die SSL, en As jy aanlyn gaan en soek vir hierdie jy eintlik kan vind die oorspronklike bron-kode. Byvoorbeeld, dit is 'n screen shot van net 'n gedeelte van 'n redelik groot lêer, maar dit is 'n funksie blykbaar genoem SSL verifieer teken bediener sleutel ruil. En dit neem om 'n klomp van die argumente en insette. En ons is nie van plan om te fokus te veel op die minutia daar, Maar as jy fokus op die kode binne-in van daardie boonste function-- laat zoom in op dit. Jy kan reeds vermoed wat die fout mag wees, selfs as jy het geen idee uiteindelik wat jy is op soek na. Daar is soort van 'n anomalie hier, en dit is wat? Ja, ek het regtig nie hou nie die voorkoms van twee goto versuim. Om eerlik te wees, ek weet nie regtig wat goto misluk beteken nie, maar dat twee van hulle rug aan rug. Dit is net soort vryf my intellektueel op die verkeerde manier, en inderdaad as ons zoom in op net diegene lyne, dit is C. So 'n baie van Apple se kode is self geskryf in C, en dit glo is regtig equivalent-- nie op daardie mooi inkeping weergawe, maar as jy die feit dat daar geen krulhakies, wat Apple eintlik geskryf het, was kode wat lyk soos hierdie. So ek hou zoomde uit en ek het net die inkeping in die sin vaste dat indien daar geen krulhakies, wat tweede goto versuim wat in geel gaan maak nie saak wat uit te voer. Dit is nie verband hou met die indien toestand bo dit. So selfs weer, as jy nie heeltemal verstaan ​​wat dit kon moontlik wees doen, weet dat elkeen van hierdie conditions-- elk van hierdie lyne is 'n baie belangrike stap in die proses van kontrole As jou data is in werklikheid geïnkripteer. So draai een van hierdie stappe, en nie die beste idee. Maar omdat ons hierdie tweede goto misluk in geel, en omdat wanneer ons soort estetiese skuif dit na die links waar dit logies is op die oomblik, wat beteken dit vir die lyn beteken van die kode hieronder wat tweede goto versuim sou jy dink? Dit is altyd gaan oorgeslaan word. So gotos is oor die algemeen afgekeur om redes wat ons nie regtig in te gaan, en inderdaad in CS50 ons geneig is om nie hierdie stelling gaan na om te leer, maar jy kan dink goto versuim om betekenis gaan spring aan 'n ander deel van die kode. Met ander woorde spring oor hierdie laaste reël heeltemal, en so die gevolg van hierdie stupid eenvoudige fout dit was net gevolg van waarskynlik iemand kopieer en plak een te baie keer was dat die hele veiligheid van IOS en Mac OS was kwesbaar vir onderskepping deur slegte ouens vir 'n geruime tyd. Tot Apple uiteindelik vaste hierdie. En as sommige van julle is eintlik hardloop ou weergawes van IOS of Mac OS, jy kan gaan na gotofail.com wat is 'n webwerf dat iemand opgestel wesenlik bepaal programmaties As jou rekenaar is steeds kwesbaar. En eerlik, as dit is, dit is waarskynlik 'n goeie idee jou selfoon te werk of Mac op hierdie punt. Maar daar, net getuig van hoe 'n waardering vir hierdie laer vlak besonderhede en redelik eenvoudige idees kan regtig vertaal in besluite en probleme wat affected-- in hierdie case-- miljoene mense. Nou is 'n woord op administrasie. Afdeling sal eerskomende Sondag begin. Jy sal 'n e-pos ontvang wat deur die naweek oor artikel, op watter punt die resectioning proses sal begin as jy het besef jy nou 'n paar nuwe konflikte. So dit gebeur elke jaar, en ons sal akkommodeer in die dae wat kom. Kantoor hours-- doen hou 'n oog op die skedule hier. Verander 'n bietjie hierdie week, veral die aanvang van die tyd en die plek, so moenie te raadpleeg wat voor die opskrif na kantoorure enige van die volgende vier nagte. En nou 'n woord oor assessering, veral as jy duik in die probleem stel een en daarna. So per die spesifikasie, Dit is oor die algemeen die asse waarlangs ons evalueer jou werk. Omvang verwys na wat mate jou kode implemente die elemente wat nodig is deur ons spesifikasie. Met ander woorde, hoeveel van 'n stuk stel het jy byt. Het jy 'n derde van dit, 'n helfte van dit, 100% van dit. Selfs al is dit nie korrek nie, Hoeveel het jy probeer? So wat vang die vlak moeite en die bedrag wat jy afgebyt die probleem stel se probleme. Correctness-- hierdie een, te watter mate is jou kode ooreenstemming met ons spesifikasies en vry van foute. So is dit korrek te werk? As ons dit gee 'n paar insette, doen dit gee ons die produksie wat ons verwag? Vormgeving dit is nou die eerste die besonder kwalitatiewe kinders, of die mense wat die menslike oordeel vereis. En inderdaad, dit is hoekom ons 'n personeel van soveel onderrig genote en natuurlik assistente. Tot watter mate is u kode goed geskryf? En weer is dit 'n baie kwalitatiewe assessering wat sal werk met jou op bidirectioneel in die komende weke. Sodat wanneer jy nie slegs numeriese tellings nie, maar ook 'n skriftelike tellings, of getik terugvoer of skriftelike terugvoering in Engels woorde. Dit is wat ons sal gebruik om jou te ry teenoor eintlik skryf beter code. En in lesing en artikel sal ons probeer wys out-- so dikwels as ons can-- Wat maak 'n program nie net korrekte en funksioneel goed, maar ook goed ontwerp. Die mees doeltreffende dit kan wees, of selfs die mooiste wat dit kan wees. Wat lei tot die styl. Styl uiteindelik is 'n estetiese oordeel. Het jy kies 'n goeie name vir jou veranderlikes? Het jy jou kode behoorlik ingekeep? Is dit goed lyk, en dus is dit maklik vir 'n ander mens jou eie te lees van die korrektheid. Nou algemeen per die leerplan, ons score hierdie dinge op 'n vyf punt skaal. En laat my huis hamer die punt dat 'n drie is inderdaad 'n goeie. Baie vinnig doen mense begin doen rekenkundige. Toe hulle 'n drie uit vyf korrektheid vir 'n paar pset en hulle dink damn, ek gaan 60% wat is in wese 'n D of E. Dit is nie die manier waarop ons dink van hierdie getalle. 'N drie is inderdaad 'n goeie, en wat ons algemeen verwag aan die begin van die term is dat as jy kry 'n klomp van three's-- miskien 'n paar van die feeste, 'n paar van die fours-- of 'n paar tweë, 'n paar van die fours-- dit is 'n goeie plek om te begin. En so lank as wat ons sien 'n opwaartse trajek oor tyd, jy is in 'n besonder goeie plek. Die formule gebruik ons gewig dinge is in wese hierdie per die leerplan, wat beteken net dat ons gee meer gewig te korrektheid. Want dit is baie dikwels korrektheid wat neem die meeste tyd. Glo my nou. Jy sal find-- ten minste in een pset-- dat jy spandeer 90% van jou tyd werk op 10% van die probleem. En alles soort van werk behalwe vir een of twee foute, en dit is die foute wat hou jou tot laat in die nag. Dit is die mense wat soort van ontsnap nie. Maar na die slaap op dit, of die bywoning kantoorure of om vrae te vra online, is wanneer jy na dat 100% doelwit en dit is hoekom ons gewig korrektheid van die meeste. Ontwerp 'n bietjie minder, en styl 'n bietjie minder as dit. Maar hou in mind-- styl is dalk die maklikste van hierdie af te byt soos per die styl gids. En nou, 'n meer ernstige daarop op akademiese eerlikheid. CS50 het die ongelukkige onderskeiding synde die grootste produsent van Ad Board gevalle byna elke jaar histories. Dit is nie omdat die studente te kul in CS50 meer as enige ander klas, maar omdat uit die aard van die werk, die feit dat dit 'n elektroniese, die feit dat ons kyk vir dit, en die feit dat ons die rekenaar wetenskaplikes, Ek kan sê ons is ongelukkig baie goed in die opsporing van dit. So wat beteken dit in reële terme? So dit, volgens die leerplan, die kursus se filosofie regtig nie neer op redelik wees. Daar is hierdie lyn tussen doen 'n mens se werk op jou eie en om 'n bietjie van redelike hulp van 'n vriend, en blatante doen dat die werk vir jou vriend, of stuur hom of haar jou kode sodat hy of sy kan eenvoudig neem of leen dit reg. En dit gaan oor die lyn dat ons getrek in die klas. Sien, die leerplan uiteindelik vir die lyne wat ons trek as redelike en onredelike gedrag, maar dit regtig nie kook af na die essensie van jou werk hoef te wees om jou eie in die einde. Nou met wat gesê het, daar is 'n heuristiese. Want soos jy dalk imagine-- vanaf kantoorure en die visuele en die video's wat ons het getoon dus far-- CS50 is inderdaad bedoel om te wees as gesamentlike en as koöperatiewe en sosiale as moontlik. As gesamentlike soos dit is streng. Maar met hierdie gesê, die heuristiese, as jy sien in die leerplan, is dat wanneer jy met 'n probleem. Jy het 'n paar fout in die kode wat jy kan nie los nie, is dit redelik vir jou jou kode aan iemand anders te wys. 'N Vriend, selfs in die klas, 'n vriend wat langs jou sit op kantoorure, of 'n lid van die personeel. Maar hulle kan nie hul kode wys. Met ander woorde, 'n beantwoord aan jou question-- Ek moet help-- is nie O, hier is my kode. Neem 'n blik op hierdie en aflei uit dit wat jy wil. Nou, natuurlik, daar is 'n manier duidelik te spel hierdie stelsel waardeur ek jy sal wys my kode voordat hy 'n vraag. Jy wys my jou kode voordat hy 'n vraag. Maar kyk leerplan weer vir die fyner besonderhede van waar die lyn is. Net nou verf die prentjie en deel as deursigtig as moontlik waar ons is in die afgelope jaar, dit is die getal van die Ad Board gevalle dat CS50 het oor Die afgelope sewe jaar. Met 14 gevalle mees onlangse val. In terme van die studente wat betrokke is, dit was 20 sommige vreemd studente afgelope val. Daar was 'n hoogtepunt van 33 studente 'n paar jaar gelede. Baie van hulle is ongelukkig nie meer hier op die kampus. Studente wat betrokke is as 'n persentasie van die klas het histories gewissel van 0% tot 5.3%, wat net om te sê Dit is jaarliks ​​'n uitdaging. En in die rigting van die einde, wat ons wil doen, is dra een dat ons dd-- net FYI-- vergelyk ten 'n regverdigheid studente wat is as gevolg van die lyn daarvolgens. Ons doen alle huidige vergelyk voorleggings teen al die afgelope missies uit die verlede baie jare. Ons weet ook hoe om tot Google en vind kode repositories aanlyn gespreksforums aanlyn, werk webwerwe aanlyn. Indien 'n student dit kan kry, kan ons seker vind dit soveel as wat ons ongelukkig nie. So, wat jy sal sien in die leerplan al is dit jammer klousule. Ek kan beslis waardeer, en ons almal het personeel wat die kursus soos gedoen hierdie, of hierdie een self oor tyd, beslis weet wat dit is soos wanneer lewe kry in die pad wanneer jy sommige laat nag deadline-- nie net in hierdie klas, maar another-- wanneer jy heeltemal uitgeput, beklemtoon uit, het 'n buitensporige aantal ander dinge te doen. Jy sal op 'n stadium in lewe beslis 'n slegte, miskien laat nag besluit. So volgens die leerplan, daar is hierdie klousule, sodanig dat indien binne 72 uur van die maak van sommige swak besluit, jy besit tot dit en uit te reik na my en een van die kursus se koppe en ons sal 'n gesprek. Ons sal dinge hanteer intern in die hoop dit meer van 'n onderrig oomblik of lewe les, en nie iets met veral drastiese gevolge as jy kan sien op hierdie kaarte hier. So dit is 'n baie ernstige toon. Kom ons breek vir net 'n paar sekondes om die spanning te breek. [Speel van musiek] David J. MALAN: Alle reg, so hoe was dat 'n segue? Vandag se primêre onderwerpe. Die eerste is die onttrekking. Nog een van wat gaan aan die wees voorstelling van data, wat eerlik is 'n baie droë manier om te sê hoe kan ons gaan om probleme en dink oor die oplossing van probleme? So jy gesien het in Scratch, en jy het gesien dalk reeds in pset1 met C dat jy nie net kan gebruik funksies, soos printf, dat ander mense in die afgelope jare het vir jou. Jy kan ook skryf jou eie funksies. En selfs al het jy dalk nie ' gedoen in C, en eerlik in pset1 jy nie regtig nodig het om te skryf jou eie funksie omdat die problem-- terwyl dalk skrikwekkend by eerste glance-- jy sal sien uiteindelik met opgelos moet word nie al dat baie reëls van die kode. Maar met wat gesê het, in terme skryf jou eie funksie, besef dat C nie gee jy hierdie vermoë. Ek gaan om te gaan in vandag se bron-kode, wat beskikbaar is reeds aanlyn is, en ek gaan om voort te gaan en 'n oop 'n program genaamd funksie 0.C, en in die funksie nul ons sal sien 'n paar dinge. In die eerste lyne 18 deur 23 is my belangrikste funksie. En nou dat ons begin om te lees kode wat ons nie op die vlieg skryf, maar Ek het vooraf skriftelike of dat jy in 'n probleem stel kan ontvang wat is vooraf geskryf. 'N goeie manier om te begin lees iemand anders se kode is op soek na die belangrikste funksie. Uit te vind waar daardie inskrywing punt is om die bestuur van die program, en dan volg dit logies van daar af. So hierdie program glo afdrukke jou naam, gevolg deur 'n dubbelpunt. Ons gebruik dan GetString van die CS50 biblioteek 'n string, of 'n woord of frase te kry van die gebruiker op die sleutelbord. En dan is daar hierdie ding here-- PrintName. Nou PrintName is nie 'n funksie wat kom met C. Dit is nie in die standaard io.h. Dit is nie in CS50.h. Dit is eerder in dieselfde lêer. Agterkom as ek rol af 'n bit-- lyne 25 tot 27-- dit is net 'n mooi manier om kommentaar te lewer jou kode met behulp van die sterre en houe. Dit is 'n multi-line kommentaar te lewer, en dit is net my beskrywing in blou wat hierdie funksie doen. Want in lyne 28 deur 31 Ek het 'n super eenvoudige funksie geskryf wie se naam is PrintName. Dit neem hoeveel argumente, sou jy sê? So een argument--, want daar is 'n argument gelys in die hakies. Die tipe wat String. Wat om te sê PrintName is soos hierdie swart boks of funksie wat ' as toevoer 'n string. En die naam van die String gerieflik sal wees Naam. Nie S, nie N, maar Naam. So wat beteken PrintName doen? Dit is lekker eenvoudig. Net soos 'n reël van die kode vir die printf, maar glo dit druk uit "Hallo," so en so. Waar die so en so kom van die argument. En dit is nie 'n groot innovasie hier. Regtig, het ek 'n program wat geneem kan is met 'n lyn van die kode wat geskryf deur om dit op hier, en verander dit na iets wat wat behels sowat ses of sewe of so reëls van die kode al die pad af hier. Maar dit is die beoefening van 'n beginsel bekend as die onttrekking. Soort vat binnekant van 'n nuwe funksie wat 'n naam het, en 'n beter nog die naam letterlik sê wat dit doen. Ek bedoel printf-- dit is nie veral beskrywende. As ek wil 'n te skep legkaart stuk, of as ek wil 'n funksie te skep dat druk iemand se naam, die skoonheid van om dit te doen is dat ek kan eintlik gee die funksie 'n naam wat beskryf wat hy doen nie. Nou neem dit in 'n bydrae wat Ek het arbitrêr genoem naam, maar ook dit is 'n wonderlike beskrywende in plaas van om 'n bietjie meer generiese soos S. En leemte, vir nou, beteken net dat hierdie funksie nie oorhandig my terug nie. Dit is nie soos GetString wat letterlik my hande terug 'n string soos ons gedoen het met die stukkies papier met jou klasmaats verlede week, maar eerder dit net 'n newe-effek. Hy druk iets aan die skerm. So aan die einde van die dag, as ek maak funksie-0, ./function-0, ons sal sien wat dit vra vir my naam. Ek tik Dawid, en dit tipes my naam. As ek dit weer doen met Rob, dit gaan om te sê "Hallo, Rob." So 'n eenvoudige idee, maar miskien ekstrapoleer uit hierdie geestelik dat as jou programme te kry 'n bietjie meer ingewikkeld, en jy wil 'n deel van te skryf kode en oproep wat code-- Roep dat code-- deur sommige beskrywende noem soos PrintName, C nie bekostig om ons hierdie vermoë. Hier is nog 'n eenvoudige voorbeeld. Byvoorbeeld, as ek maak 'n lêer van vandag genoem return.c, kennis wat ek hier gedoen het. Die meeste van hierdie belangrikste funksie is printf. Ek het die eerste arbitrêr inisialiseer 'n veranderlike genoem x tot die nommer 2. Ek druk dan "x is nou % I "verby in die waarde van x. So is ek net sê wat dit is. Nou is ek net vrymoedigheid beweer met printf. Ek derdemagte wat waarde x, en ek is doen deur te bel 'n funksie genoem kubus afsterwe in x as die argument, en dan die redding van die uitset in die veranderlike self, x. So ek beuken die waarde van x. Ek oorheersende die waarde van x met alles wat die gevolg van die roeping hierdie kubus funksie is. En dan het ek net die druk van 'n paar sagte dinge hier te sê wat ek gedoen het. So wat is dan kubus? Let op wat is fundamenteel anders hier. Ek het die funksie gegee 'n naam soos tevore. Ek het gespesifiseerde 'n naam vir 'n argument. Hierdie keer is dit genoem N in plaas van die naam, maar ek kon dit noem iets wat ek wil hê. Maar dit is anders. Hierdie ding aan die linkerkant. Voorheen was dit wat navraag? Boys. Nou is dit natuurlik int. So, wat is dalk die weg te neem? Terwyl leemte te kenne soort nietigheid, en dat dit die geval was. PrintName teruggekeer niks. Dit het iets te doen, maar dit het nie oorhandig my terug iets wat ek kon op die linkerkant van 'n gelyke teken soos ek hier gedoen op die lyn 22. So as ek sê in op die lyn 30, wat is dit waarskynlik beteken oor wat kubus vir my doen? Ja? Dit gee 'n heelgetal. So dit hande my terug, vir Byvoorbeeld, 'n stukkie van die papier waarop dit die antwoord geskryf. 2 blokkies, of 3 blokkies, of 4 cubed-- wat ek geslaag in, en hoe het ek die uitvoering van hierdie? Wel, net n keer n keer n is hoe ek dalk 'n waarde kubus. So weer, super eenvoudige idee, maar demonstratiewe nou hoe ons funksies kan skryf wat ons eintlik moes terug waardes wat van belang kan wees. Kom ons kyk na 'n laaste voorbeeld hier genoem funksie een. In hierdie voorbeeld, dit begin om meer aantreklik. So in die funksie, in hierdie program-- kennisgewing uiteindelik noem 'n funksie genoem GetPositiveInt. GetPositiveInt is nie 'n funksie in die CS50 biblioteek, maar ons het besluit ons wil dit voorkom. So as ons scroll down later in die lêer, sien hoe ek gaan oor die implementering kry positiewe int, en ek sê dit is meer oortuigend want dit is 'n ordentlike aantal reëls van die kode. Dit is nie net 'n dom klein speelgoed program. Dit is eintlik 'n paar foutopsporing en doen iets meer nuttig. So as jy nie gesien het nie die instruksies video's wat ons in pset1 ingesluit het, weet dat dit 'n tipe lus in C, soortgelyk in die gees om die soort dinge Scratch kan doen. En doen, sê dit doen. Druk dit uit. Dan voort te gaan en kry n-- kry 'n int en stoor dit in n, en hou om dit te doen weer en weer en weer so lank as wat n is minder as een. So n gaan wees minder as een slegs indien die Human se nie saamwerk nie. As hy of sy tik in 0 of -1 of -50, hierdie lus is die gang te hou uitvoering van weer en weer. En uiteindelik sien, het ek eenvoudig die standaard van die waarde. So nou het ons 'n funksie wat sou lekker gewees het As CS50 sal implementeer in CS50.h en CS50.c vir jou, maar hier kan ons nou implementeer onsself. Maar twee kommentaar op 'n paar belangrike inligting. One-- hoekom het ek verklaar int n, dink jy, op die lyn 29 in plaas van net te doen Dit is hier, wat meer in ooreenstemming met wat ons gedoen het die afgelope week? Ja? 'N goeie gedagte. So as ons dit te sit hier, dis asof ons hou dit weer en weer te verklaar. Dit op sigself is nie problematies, per se, omdat ons net nodig die waarde een keer en dan ons gaan 'n nuwe een in elk geval kry. Maar 'n goeie gedagte. Ja? Close. So, want ek het n op verklaar lyn 29 buite die lus, dit is toeganklik dwarsdeur hierdie hele funksie. Nie die ander funksies, want N is nog in hierdie krullerige draadjies hier. So-- seker. Presies. So dit is selfs meer tot die punt. As ons plaas verklaar N reg hier op die lyn 32, dit is problematies omdat raaiskoot waar anders wat ek nodig het om dit te bekom? On line 34, en die eenvoudige reël is dat jy net kan gebruik om 'n veranderlike binnekant van die mees onlangse krulhakies waarin jy dit verklaar. Ongelukkig, lyn 34 is een lyn te laat, want ek het reeds gesluit die krullerige stut op die lyn 33 wat ooreenstem met die krullerige stut op die lyn 30. En so is dit 'n manier om te sê dat hierdie veranderlike int is scoped, om so te praat, net binnekant van daardie krulhakies. Dit is net nie buite hulle bestaan ​​nie. So inderdaad, as ek dit doen verkeerd is, laat my die kode red as dit is-- verkeerd geskryf. Laat my gaan voort en maak funksie-1, en notice-- fout. Gebruik van swart identifiseerder n op die lyn 35, wat is reg hier. En as ons te blaai verder, 'n ander een. Gebruik van swart identifikasie N op die lyn 34. So het die samesteller, klang, is te merk dat dit net nie, selfs al bestaan duidelik dit is daar visueel. So 'n eenvoudige oplossing is verklaar dat dit daar. Nou kan ek gaan na die top van die lêer. Wat spring uit by jou as 'n bietjie anders van die dinge wat ons gekyk na die afgelope week? Nie net het ek die naam, nie net Ek het 'n paar skerp sluit tot bo, Ek het iets wat ek roep 'n prototipe. Nou wat lyk vreeslik soortgelyk aan wat sien ons net 'n oomblik gelede op die lyn 27. So laat ons aflei uit 'n ander fout boodskap waarom ek dit gedoen het. Laat my voort te gaan en verwyder hierdie lyne is daar. En so het ons niks weet nie prototipe. Remake hierdie lêer. Maak funksie een. En nou, damn, vier foute. Kom ons blaai tot by die eerste een. Implisiete verklaring van funksie kry positiewe int is ongeldig in C99. C99 beteken net die 1999 weergawe van die taal C, en dit is wat ons wel is met behulp van. So, wat beteken dit? Wel C-- en meer spesifiek C compilers-- is redelik dom programme. Hulle weet net wat jy het vir hulle gesê, en dit is eintlik tematiese van verlede week. Die probleem is dat as ek gaan oor die implementering van die naam hier, en ek noem 'n funksie genoem GetPositiveInt hier op die lyn 20, daardie funksie nie tegnies nie bestaan ​​totdat die samesteller sien reël 27. Ongelukkig is die samesteller is om dinge te doen top, af, links, regs, omdat dit nie gesien het nie die implementering van GetPositiveInt, maar dit sien jy probeer om dit te gebruik tot hier, dit is net gaan om te bail-- skree jy met 'n fout message-- miskien kriptiese, en nie eintlik stel die lêer. So 'n sogenaamde prototipe up hier is weliswaar oorbodig. Letterlik, het ek hier sit en ek kopieer en geplak het, en ek het dit hier. Nietig sou wees meer behoorlike, so ons sal letterlik kopieer en plak dit op hierdie tyd. Ek het letterlik gekopieer en geplak het. Eintlik net as soos 'n brood krummel. 'N Klein idee om die samesteller. Ek weet nie wat dit beteken nie, maar ek belowe om jou dat dit uiteindelik sal bestaan. En dit is die rede waarom hierdie line-- in lyn 16-- eindig met 'n kommapunt. Dit is oorbodig deur ontwerp. Ja? As jy nie jou biblioteek skakel te the-- O, goeie vraag. Skerp sluit kop lêer insluitings. Nodig het om te behoort amper be-- altyd op die top van die lêer vir 'n similar-- vir presies dieselfde rede, ja. Omdat in die standaard io.h is letterlik 'n lyn soos hierdie, maar met die woord printf, en met sy argumente en sy terugkeer tipe. En so deur te doen skerp sluit op hier, wat jy letterlik doen kopieer en plak die inhoud van iemand anders geskryf het tot bo-op. Daardeur cluing jou kode in die feit dat die funksies nie bestaan ​​nie. Ja? Absoluut. So 'n baie slim en korrekte oplossing sou wees, weet jy wat? Ek weet nie wat 'n prototipe is, maar ek weet as ek verstaan ​​dat C is net stom en rethinks bo tot onder. Wel, laat ons gee dit wat hulle wil. Kom ons sny dat kode, plak dit top, en nou druk hoof hier neer. Dit sou ook die probleem op te los. Maar jy kan baie maklik kom met 'n scenario waarin 'n behoefte B te roep, en miskien B oproepe terug na A. Dit is iets genoem rekursie, en ons sal terug kom. En dit mag of nie mag wees om 'n goeie ding, maar jy kan beslis breek hierdie oplossing. En ook, sou ek eis stilisties, veral wanneer jou programme hierdie lang en hierdie lang geword, dit is net super gerieflik hoof aan die bokant te sit want dit is die ding wat die meeste programmeerders gaan omgee. En so het dit is 'n bietjie skoner, waarskynlik, om dit te doen om die manier Ek het aanvanklik het dit met 'n prototipe selfs al is dit lyk 'n bietjie oorbodig met die eerste oogopslag. Ja? Jammer, jy kan sê dat dit harder? As jy skakel die plekke van die implementering en die prototipe? So dit is 'n goeie vraag. As jy weer verklaar dit neer hier, laat ons sien wat gebeur. So as ek dit neer hier, jy sê. Ag, jammer. Harder? Selfs harder. O ja, goeie vraag. Sou dit ongeldig die funksie? Jy weet, na al die jare, het ek het nog nooit 'n prototipe sit daarna. So kom ons doen maak funksie-1 nadat dit te doen. [Gemompel] David J. Malan O, wag. Ons het nog alles te sit bo-op. So laat ons doen dit hier, as ek jou vraag verstaan ​​korrek. Ek is om alles, insluitende die prototipe bogenoemde hoof, maar ek is besig om die prototipe onder die implementering. So as ek een kry ek terug 'n error-- ongebruikte veranderlike n. O, daar. Dankie. Kom ons kyk, raak ons ​​ontslae van hierdie. Dit is 'n ander fout, so laat ons ignoreer dit. Kom ons regtig vinnig remake hierdie. OK, so data argument nie gebruik word deur formaat String n-- O, dit is omdat Ek verander na hierdie hier. Alle reg, ons weet wat die antwoord gaan aan- alles reg, hier gaan ons. Ag, dankie vir die positiewe. Alle reg, sal ek hierdie kode te los after-- ignoreer hierdie spesifieke fout aangesien dit was-- dit werk, is die antwoord. Daarom is dit nie oorskryf wat jy nou net gedoen het. Ek vermoed dat die opsteller is in so 'n manier geskryf dat dit jou prototipe ignoreer omdat die liggaam, so te sê, van die funksie het reeds geïmplementeer hoër op. Ek sou hê om werklik te raadpleeg die handleiding van die samesteller om te verstaan ​​as daar enige ander implikasie nie, maar met die eerste oogopslag net deur te probeer en te eksperimenteer, dit lyk asof daar geen impak te wees. Goeie vraag. So laat ons voor uitkom nou, beweeg weg van die newe-effekte wat funksies is dat so iets visueel op die skerm met printf, maar nie terugkeer nie 'n waarde. En funksies wat terugkeer waardes soos ons nou net gesien het 'n paar van. Ons het reeds gesien hierdie idee van die omvang, en ons sal weer en weer hierdie sien. Maar vir nou, weer, gebruik om die oppergesag van die duim dat 'n veranderlike kan slegs gebruik word binnekant van die mees onlangs geopen en geslote krulhakies as ons sien in daardie spesifieke voorbeeld. En as jy sê, daar is 'n ability-- jy 'n paar van die probleme kan oplos deur 'n veranderlike wêreldwyd op die top van 'n lêer. Maar in byna alle gevalle ons sal frons op dat, en inderdaad selfs nie in daardie oplossing vir nou. So vir nou, die afhaal is dat veranderlikes het hierdie idee van die omvang. Maar laat ons nou kyk na 'n ander droë manier eintlik soek op 'n paar mooi interessante implementering besonderhede. Hoe ons kan inligting verteenwoordig. En ons het reeds gekyk na die in die eerste week van die klas. Kyk na binaries en onsself herinner aan desimaal. Maar onthou van verlede week wat C verskillende data tipes en trosse meer maar die mees bruikbare kinders nou mag wees om hierdie. 'N kar, of karakter, wat gebeur een greep, of agt stukkies totale te wees. En dit is om te sê dat die grootte van 'n kar is net een byte. 'N greep is agt stukkies, so dit beteken dat ons kan verteenwoordig hoeveel karakters. Hoeveel briewe of simbole op die sleutelbord As ons een byte of agt stukkies. Dink terug aan week nul. As jy agt stukkies, hoeveel totale waardes kan jy verteenwoordig met patrone van nulle en ene? One-- meer as dit. So totale 256 as jy begin tel vanaf nul. So as jy het agt bits-- so as ons het ons binêre bolle hier weer ons kon die gloeilampe draai op en af ​​in enige van 256 unieke patrone. Nou is dit 'n bietjie problematies. Nie soseer vir Engels en romanse tale, maar beslis wanneer jy stel vir Byvoorbeeld, Asiatiese tale, wat veel meer as simbole soos 26 letters van die alfabet. Ons is eintlik dalk nodig meer as een greep. En gelukkig in die afgelope jaar het die gemeenskap aangeneem ander standaarde wat gebruik meer as een greep per lading. Maar vir nou in C, die standaard is net een byte of agt stukkies. 'N heelgetal is, intussen, is vier grepe, andersins bekend as 32 stukkies. Wat beteken, wat is die grootste moontlike getal wat ons kan voorstel met 'n int glo? Met 'n miljard. So dit is 4000000000 gee of neem. 2 by die 32th krag, as ons aanvaar geen negatiewe getalle en net gebruik om alle positiewe getalle, dit is 4000000000 gee of neem moontlikhede. 'N float, intussen, is 'n ander soort van data tipe in C. Dit is nog steeds 'n aantal, maar dit is 'n reële getal is. Iets met 'n desimale punt. En dit blyk dat C maak ook gebruik van vier grepe drywende punt waardes te verteenwoordig. Ongelukkig hoeveel swaai punt waardes is daar in die wêreld? Hoeveel reële getalle is daar? Daar is 'n oneindige nommer, en vir die saak daar is 'n oneindige aantal van heelgetalle. So ons is reeds soort grawe onsself 'n gat hier. Waardeur glo in computers-- by minste programme geskryf in C op them-- kan net so hoog soos tel 4000000000 gee of te neem, en swaai punt waardes kan net glo het 'n paar beperkte bedrag van akkuraatheid. Slegs so baie syfers na hul desimale punt. Omdat, natuurlik, indien jy het net 32 ​​stukkies, Ek weet nie hoe ons dit gaan om verteenwoordig real numbers-- waarskynlik met verskillende tipes patrone. Maar daar is sekerlik 'n beperkte aantal van sulke patrone, so ook hier is dit problematies. Nou kan ons die probleem effens vermy. As jy nie 'n float gebruik nie, jy kan gebruik om 'n dubbele in C, wat gee jou agt grepe, wat is manier om meer moontlike patrone van nulle en kinders. Maar dit is nog steeds eindig, wat gaan problematies wees as jy skryf sagteware vir grafiese of fancy wiskundige formules. So kan jy eintlik wil tel tot groter as dit. 'N Lang long-- dom named-- is ook agt grepe of 64 stukkies, en dit is twee keer so lank as wat 'n int, en dit is vir 'n lang heelgetal waarde. Fun fact-- as 'n int is vier grepe, hoe lank is 'n lang in C tipies? Ook vier grepe, maar 'n lank lank is agt grepe, en dit is vir historiese redes. Maar die afhaal nou is net dat data het om in 'n computer-- wat verteenwoordig word 'n fisiese toestel met elektrisiteit, Dit is algemeen ry diegene nulle en ones-- met 'n beperkte hoeveelheid van presisie. So wat is die probleem dan? Wel, daar is 'n probleem van heelgetal oorloop. Nie net in C nie, maar in rekenaars in die algemeen. Byvoorbeeld, indien dit is 'n byte moeite werd 'n bit-- so as dit is agt bit-- al waarvan die nommer een. Watter getal is hierdie verteenwoordig as ons aanvaar dit is alles positiewe waardes in binêre? 255, en dit is nie 256 nie, want zero is die laagste getal. So 255 is die hoogste een nie, maar die probleem word veronderstel dat ek wou inkrementeer hierdie veranderlike wat is agt stukkies totaal gebruik as ek wil om dit te inkrementeer. Wel so gou as ek 'n een vir al hierdie mense, jy kan dalk dink visually-- net soos wat die een gebruik decimals-- iets gaan vloei na links. En inderdaad, as ek die nommer een van hierdie, wat gebeur in binêre is dat dit oorloop terug na nul. So as jy net use-- nie 'n int, maar 'n enkele byte heelgetalle te tel in 'n program, deur default-- so gou as jy tot 250, 251, 252, 253, 254, 255-- 0 kom nadat 255, wat waarskynlik nie wat 'n gebruiker gaan om te verwag. Nou intussen in drywende punt wêreld, jy het ook 'n soortgelyke probleem. Nie so baie met die grootste number-- Hoewel dit is nog steeds 'n probleem. Maar met die bedrag van akkuraatheid dat jy kan verteenwoordig. So laat ons neem 'n blik op hierdie voorbeeld hier ook van vandag se bron code-- dryf-0.C. En sien dit is 'n super eenvoudige program wat moet glo druk watter waarde? Wat wed jy nie dit gaan druk selfs al is daar 'n bietjie van 'n nuwe sintaksis hier? So hopelik 0.1. So het die ekwivalent van een tiende want ek doen 1 gedeel deur 10. Ek stoor die antwoord in 'n veranderlike genoem f. Dit veranderlike van tipe float, wat is 'n navraag het ek net voorgestel bestaan. Ons het dit nie gesien het nie, maar hierdie is 'n soort van 'n netjiese manier printf spesifiseer hoeveel syfers jy wil sien na 'n desimale punt. So hierdie notasie beteken net dat hier is 'n tydelike. Dit is vir 'n drywende punt waarde, en oh, op die pad, wys dit met die desimale punt met een nommer na die desimale punt. So dit is die getal van beduidende syfers, om so te praat, wat jy dalk wil. So laat my gaan voort en doen maak float-0, ./float-0, en blykbaar 1 gedeel deur 10 is 0.0. Nou hoekom is dit? Weer goed is, word die rekenaar neem my letterlik, en ek het geskryf 1 en ek geskryf 10, en 'n raaiskoot wat is die veronderstelde data tipe vir die twee waardes? 'N int, dit is tegnies iets wat 'n bietjie anders. Dit is gewoonlik 'n lang, maar dit is uiteindelik 'n integrale waarde. Nie 'n drywende punt waarde. Wat is dat as dit te sê is 'n int, en dit is 'n int, Die probleem is dat die rekenaar het nie die vermoë om om selfs die stoor desimale punt. So wanneer jy 1 gedeel 10 gebruik heelgetalle vir beide die teller en die deler, moet die antwoord wees 0.1. Maar die computer-- omdat dit is integers-- weet nie wat om te doen met die 0.1. So, wat is dit duidelik doen? Dit is net gooi dit weg, en wat ek uiteindelik sien is 0.0 net omdat ek daarop aangedring dat printf wys my een desimale punt. Maar die probleem is dat as jy deel 'n heelgetal deur 'n heelgetal is, jy sal get-- per definisie van C-- 'n heelgetal. En dit is nie van plan om te doen iets mooi en gerieflik soos ronde dit tot die naaste aan of af. Dit gaan afkap alles na die desimaal. Dus net intuïtief, wat waarskynlik 'n fix? Wat is die eenvoudigste oplossing hier? Ja? Presies. Hoekom het ons nie net behandel soos drywende punt waardes effektief draai hulle in dryf of dubbelspel. En as ek nou doen maak dryf-0, of as Ek stel dryf-1, wat identies is aan wat was net voorgestel. En nou doen ek dit dryf-0, nou kry ek my 0.1. En dit is ongelooflik. Maar nou is ek gaan doen iets wat 'n bietjie anders. Ek is nuuskierig om te sien wat regtig gaan op onder die enjinkap, en ek gaan om dit te druk uit tot 28 desimale plekke. Ek wil nie regtig sien 0.1000-- n infinite-- [Onhoorbaar] 27 nulle daarna 0.1. Wel, laat ons sien of dit is wat ek wel kry. Maak dryf-0 dieselfde lêer. ./floats-0. Kom ons zoom in op die dramatiese antwoord. Al hierdie tyd, het jy al gedink 1 gedeel deur 10 is 10%, of 0.1. Dit is nie. Ten minste so ver as die rekenaar betref. Nou why-- OK, dit is volledige leuen 1 gedeel deur 10 is 0.1. Maar why-- wat nie die afhaal vandag. So waarom nie die rekenaar dink, Anders as ons almal in die kamer, dat 1 gedeel deur 10 is eintlik dat gek waarde? Wat is die rekenaar doen glo? Wat is dit? Dit is nie oorstroom, per se. Oorloop is tipies wanneer jy draai om 'n waarde. Dit is hierdie uitgawe van onakkuraatheid in 'n drywende punt waarde waar jy net 32 of miskien selfs 64 bit. Maar as daar 'n oneindige aantal werklike numbers-- getalle met desimale punte en getalle thereafter-- sekerlik jy kan nie almal van hulle verteenwoordig. So het die rekenaar gegee ons die naaste wedstryd ter waarde kan dit stel die gebruik van daardie baie stukkies van die waarde wat ek eintlik wil hê nie, wat is 0,1. Ongelukkig, as jy begin doen wiskunde, of jy begin met hierdie soort van drywende punt waardes in belangrike programs-- finansiële sagteware, militêre software-- enigiets waar persepsie is waarskynlik redelik belangrik. En jy begin met die toevoeging getalle soos hierdie, en begin loop dat sagteware met 'n baie groot insette of vir baie ure of baie dae of baie van die jaar, hierdie klein bietjie foute sekerlik kan optel met verloop van tyd. Nou as 'n eenkant, as jy al ooit gesien Superman 3 of Office Space en jy kan onthou hoe die ouens gesteel 'n klomp geld uit hul rekenaar deur die gebruik van drywende punt waardes en die toevoeging tot die klein reste, hopelik dat die film maak nou meer sin. Dit is wat hulle verwys na in die fliek. Die feit dat die meeste maatskappye sal kyk nie na 'n sekere aantal desimale plekke, maar dit is breuke sent. So jy begin dit toe te voeg tot, jy begin 'n klomp geld te maak in jou bankrekening. So dit is Office Space verduidelik. Nou ongelukkig buite Office Space, is daar is 'n paar wettig kommerwekkende en beduidende impak van hierdie soort onderliggende ontwerp besluite te neem, en inderdaad een van die redes Ons gebruik C in die kursus word sodat jy regtig hierdie grond tot begrip van hoe rekenaars werk, hoe sagteware werk, en dit nie doen nie niks as vanselfsprekend aanvaar. En inderdaad ongelukkig, selfs met dat die fundamentele begrip, ons mense maak foute. En wat ek gedink ek wil deel is hierdie agt minute video hier geneem van 'n moderne Marvels episode, wat 'n opvoedkundige program op hoe dinge werk wat verf twee foto's wanneer 'n onbehoorlike gebruik en begrip van drywende punt waardes gelei tot 'n beduidende ongelukkige resultate. Kom ons neem 'n blik. [Video speel] -Ons Nou terug te keer na "Engineering Rampe "op moderne Marvels. Rekenaars. Ons het almal kom om te aanvaar dikwels frustrerende probleme wat het met them-- foute, virusse, en sagteware glitches-- vir klein pryse om te betaal vir die gerief. Maar in 'n hoë-tegnologie en 'n hoë spoed militêre en ruimte program aansoeke, die kleinste probleem kan word in 'n ramp vergroot. Op 4 Junie 1996, wetenskaplikes voorberei 'n onbemande Ariane 5-vuurpyl te loods. Dit was die uitvoering van wetenskaplike satelliete ontwerp presies hoe die stel Aarde se magneetveld interaksie met sonkrag winde. Die vuurpyl is gebou vir die Europese Ruimte-agentskap, en gelig van sy fasiliteit aan die kus van Frans-Guyana. -Ten Sowat 37 sekondes in die vlug, het hulle eerste opgemerk iets verkeerd loop. Dat die spuitpunte is draaibare in 'n manier waarop hulle moet regtig nie. Sowat 40 sekondes in die vlug, duidelik die voertuig was in die moeilikheid, en dit is toe hulle die besluit om dit te vernietig. Die reeks veiligheid beampte, met geweldige guts, die knoppie gedruk en blaas die vuurpyl voordat dit kon 'n gevaar vir die openbare veiligheid. -Hierdie Was die eerste reis van die Ariane 5, en die vernietiging het plaas as gevolg van die fout ingesluit in die vuurpyl se sagteware. -Die probleem op die Ariane was dat daar 'n getal wat nodig is 64 stukkies uit te druk, en hulle wou omskep dit na 'n 16-bit nommer. Hulle het aanvaar dat die aantal nooit gaan baie groot. Dat die meeste van die syfers in die 64-bis getal was nulle. Hulle was verkeerd. -Die onvermoë van een sagteware program te aanvaar die aard van die getal wat deur ander was aan die wortel van die versuim. Sagteware-ontwikkeling het 'n baie duur deel van die nuwe tegnologie. Die Ariane 4-vuurpyl het was baie suksesvol. So baie van die sagteware geskep vir dit is ook gebruik in die Ariane 5. -Die basiese probleem was dat die Ariane 5. Was faster-- vinniger versnel, en die sagteware nie verantwoordelik vir dit. -Die vernietiging van die vuurpyl was 'n groot finansiële ramp. Alles te danke aan 'n minuut sagteware fout. Maar dit was nie die eerste time data omskakeling probleme het geteister moderne vuurpyl tegnologie. -In 1991 met die begin van die eerste Golf-oorlog, die Patriot raket ervaar 'n soortgelyke van 'n aantal sukses probleem. En as 'n gevolg 28 people-- 28 Amerikaanse soldiers-- is dood, en oor 'n honderd ander is gewond. Wanneer die Patriot, wat veronderstel was om te beskerm teen die inkomende Scuds, nie 'n missiel te vuur. -Wanneer Irak Koeweit, en Amerika geloods Desert Storm in die vroeë 1991, Patriot missiel batterye ontplooi Saoedi-Arabië en Israel te beskerm uit die Irakse Scud missiel aanvalle. Die Patriot is 'n Amerikaanse medium-reeks oppervlak-tot-lug-stelsel vervaardig deur die Raytheon maatskappy. -Die grootte van die Patriot Interceptor itself-- dit is oor ongeveer 20 meter lank, en dit weeg ongeveer £ 2000. En dit dra 'n plofkop van ongeveer, Ek dink dit is ongeveer £ 150. En die Warhead self is 'n hoë plofstof, wat het fragmente rondom hom. So het die omhulsel van die Warhead is ontwerp om op te tree soos 'n Buck. -Die missiele is uitgevoer vier per houer, en is deur 'n semi sleepwa vervoer word. -Die Patriot anti-missiel-stelsel gaan terug ten minste 20 jaar nou. Dit is oorspronklik ontwerp as 'n lug verdediging missiel te skiet vyand vliegtuie. In die eerste Golf-oorlog toe dat die oorlog het op, die weermag wou dit te gebruik om te skiet Scuds, nie vliegtuie. Die Irakse Air Force was nie so veel van 'n probleem, Maar die leër is bekommerd oor Scuds. En so het hulle probeer om te die opgradering van die pad. -Intercepting 'N vyand missiel wat teen Mach 5 gaan word genoeg uitdagend. Maar toe die Patriot was in diens gehaas, die weermag was nie bewus van 'n Irakse verandering wat het hul scuds byna onmoontlik om dit te. -Wat Gebeur het, is die Scuds wat is in die komende was onstabiel. Hulle was wankelrig. Die rede hiervoor was die Iraqis-- ten einde tot 600 kilometer uit te kry van 'n 300-kilometer missile-- het gewig uit die voorkant Warhead, en hy het die Warhead ligter. So het die Patriot se probeer om te kom by die Scud, en die meeste van die time-- die oorgrote meerderheid van die time-- dit sou net vlieg deur die Scud. -Wanneer Die Patriot-stelsel operateurs besef die Patriot sy teiken gemis het, hulle ontplof die Patriot se Warhead moontlike slagoffers as dit te vermy is toegelaat om op die grond val. -Dat is wat die meeste mense sien so groot vuurballe in die lug, en misverstaan ​​as afsnitte van Scud hoofde. -Although In die nag lug, Patriotte blyk te wees suksesvol vernietig Scuds op Dhahran daar kan geen fout van sy prestasie. Daar het die Patriot se radarstelsel verloor die spoor van 'n inkomende Scud en nooit van stapel gestuur weens 'n sagteware fout. Dit was die Israeli's wat die eerste keer ontdek dat hoe langer die stelsel was, hoe groter is die tyd verskil het. As gevolg van 'n klok ingesluit in die stelsel se rekenaar. -About Twee weke voor die tragedie in Dhahran, die Israeli berig die Departement van Verdediging dat die stelsel verloor tyd. Na ongeveer agt uur hardloop, het hulle opgemerk dat die stelsel se wording merkbaar minder akkuraat. Die Departement van Verdediging het gereageer deur vertel al die Patriot batterye om nie die stelsels verlaat vir 'n lang tyd. Hulle het nooit gesê wat 'n lang tyd was. 8 uur, 10 uur, 'n duisend uur. Niemand het geweet. -Die Patriot battery gestasioneer by die kamp by Dhahran en sy gebrekkige interne klok was vir meer as 100 uur op die aand van 25 Februarie. -Dit Nagespoor tyd tot 'n akkuraatheid van ongeveer 'n tiende van 'n sekonde. Nou 'n tiende van 'n sekonde is 'n interessante aantal omdat dit nie uitgedruk kan word in binêre presies wat beteken dit kan nie presies uitgedruk word in 'n moderne digitale rekenaar. Dit is moeilik om te glo, maar gebruik dit as 'n voorbeeld. Kom ons neem die nommer een derde plek. Een derde kan nie uitgedruk in desimale presies. Een derde is 0,333 gaan vir oneindig. Daar is geen manier om dit te doen met absolute akkuraatheid in 'n desimaal. Dit is presies die soort van probleem wat gebeur het in die pad. Hoe langer die stelsel het, die erger die tyd fout is. -na 100 ure van die operasie, die fout in die tyd was net ongeveer een derde van 'n sekonde. Maar in terme van die fokus op 'n missiel wat teen Mach 5, dit het gelei tot 'n dop fout van meer as 600 meter. Dit sou 'n fatale fout wees vir die soldate by Dhahran. -Wat Gebeur het, is 'n Scud bekendstelling was waargeneem deur vroeë waarskuwing satelliete, en hulle het geweet dat 'n Scud kom in hul rigting. Hulle het nie geweet waar dit vandaan kom. Dit was nou tot die radar komponent van die Patriot-stelsel verdedig Dhahran op te spoor en te hou spoor van die inkomende vyand raket. -Die radar was baie slim. Dit sou eintlik spoor die posisie van die Scud en voorspel dan waar dit sal waarskynlik die volgende keer die radar het 'n pols uit. Dit was bekend as die reeks hek. -Dan Sodra die Patriot besluit genoeg tyd het geslaag om terug te gaan en kyk of die volgende plek vir hierdie bespeur voorwerp dit gaan terug. So wanneer dit gaan terug na die verkeerde plek, dit sien dan geen voorwerp. En dit besluit dat daar geen voorwerp. Dat daar 'n valse opsporing en dit val van die baan. -Die inkomende Scud verdwyn van die radar skerm, en sekondes later, is dit klap in die kamp. Die Scud vermoor 28. Dit is die laaste een geskiet tydens die eerste Golfoorlog. Dit is tragies dat die updated sagteware aangekom teen dagbreek die volgende dag. Die sagteware fout het vasgestel is, sluit een hoofstuk in die onstuimige geskiedenis van die Patriot raket. [Einde video speel] David J. Malan Dit is dit vir CS50. Ons sal jy sien op Woensdag. [Speel van musiek]