DAVID J MALAN: All reg, so dit is CS50. En dit is duidelik 'n Vrydag. En dit is die einde van die week een. So jy kan onthou dat ons opgehou het, laaste tyd, met 'n fotonische lewe van spesies. Waardeur ons hierdie leuen ontbloot, dat geen saak wat jy geleer is groeiende up, 1 gedeel deur 10 is nie, in Trouens, 0,1 of 0,100 of 0,10000. In werklikheid, as ons dit saam te stel program, soos ons gister gedoen het, met, maak onakkuraatheid, en dan doen dot, streep, onakkuraatheid, ons geleer dat dit is wat is 1 gedeel deur 10 eintlik is. So dit is nie regtig baie die geval is. Maar dit beteken wenk op 'n sekere fundamentele beperking van rekenaars. En inderdaad, onder die dinge wat ons gaan doen vandag is 'n blik op waarom dit gebeur het, wat implikasies het, hoe die mensdom nagelaat het hierdie verstaan ​​in 'n paar baie ernstige situations-- die gevolg van die wat het nogal tragies was en expensive-- en ook 'n blik op hoe ons kan eintlik verdedig teen hierdie soort van beperkings. So intuïtief, miskien, Hoekom is 1 gedeel deur 10, volgens my rekenaar hier, nie net 1/10, 0,10? Ja. Wat dink jy? Lid van die gehoor: Die radix is ​​anders? DAVID J MALAN: Die wat? O, die radix is ​​anders? So nie heeltemal. Dit is eintlik meer fundamenteel tot die hardeware. Ander gedagtes? Ja. Lid van die gehoor: Hulle verteenwoordig getalle anders? DAVID J MALAN: So they-- Right. Hulle verteenwoordig getalle anders. Verkeerd, blykbaar. Sodat is-- Wel, anders wat? Of van wie? Van ons af? Lid van die gehoor: Ja. Hulle het nie die desimale gebruik stelsel [onhoorbaar]. DAVID J MALAN: OK. So in 'n sin, hulle doen nie gebruik die desimale stelsel. Onder die enjinkap, alles is, inderdaad, binêre, en dit is verwant is, in werklikheid. Maar dit is selfs 'n eenvoudiger verduideliking as dit. Ja. Lid van die gehoor: Hulle net so baie stukkies. Hulle kan net stoor tot 'n sekere mate, soos met die desimale. DAVID J MALAN: Ja. Dit is wat regtig kry op dit. Dit blyk dat die rekenaars Tipies, sal altyd net gebruik 'n beperkte hoeveelheid inligting om iets te verteenwoordig. Reg? Na alles, ons het net 'n vaste bedrag van spasie op die hardeskyf. Ons het net 'n vaste bedrag RAM, of rekenaar geheue. En as jy net 'n vaste bedrag van iets, Jy kan tog nie eintlik tel tot tot oneindigheid of enige nommer wat jy wil. Jy, soort, moet kies watter reeks waardes wat jy gaan om te ondersteun. En so byvoorbeeld, 'n week of twee gelede, toe ons gepraat oor ASCII, en ons het gepraat oor 8 stukkies, of 'n greep, om so te praat, die grootste aantal ons kon verteenwoordig met 8 stukkies was wat? 255. En ons kan 256 totale waardes verteenwoordig maar nie as ons spandeer een van hulle op 0-- Wel, maar as ons spandeer een van hulle op 0, dan is die grootste getal is, natuurlik, 255. Dit blyk so uit, dat dit die geval ook in hierdie konteks. Ons het begin praat, laaste keer, oor swaai-punt getalle, wat verskil van heelgetalle, in dat hulle 'n desimale punt en hopelik 'n paar nommers daarna, maar hulle is ook. 'N Rekenaar is net tipies gaan 32 stukkies, miskien 64 stukkies gebruik om 'n drywende punt waarde verteenwoordig. So selfs al het ons grootgeword leer van wiskunde en die wete dat jy absoluut kan hê 'n oneindige aantal getalle na die desimale punt nie as jy het beperkte geheue. Jy, soort, moet rond, of kies watter nommers wat jy gaan verteenwoordig. En sodat jy kan dink, in 'n sin, hierdie synde die rekenaar se naaste benadering tot die waarde wat 1/10 dit kan kry, met net 32 ​​of so stukkies. En dit is nie net 1/10. Byvoorbeeld, as ek dit verander na 03/01, wat ons dink is nog makliker. So 1 gedeel deur 3. Laat my die lêer te stoor. Laat my gaan voort en heropstel dit. En laat my weer uit te voer nie. Ook hier, blykbaar, 1/3 is nie 0,3 en dan 'n oneindige aantal 3 se daarna. Jy het hierdie onakkuraatheid aan die einde. Sodat ons mense is korrek, en wat jy geleer, in werklikheid, korrek is, maar ons stamp up teen 'n paar beperkinge. En wat ek gedink het wat ons vandag wil doen, is begin deur te kyk na, eerlik, die tragiese gevolge van hierdie soms, wanneer die mensdom nie heeltemal implementeer vir hierdie werklikheid en hierdie beperkings. En ons sal 'n reeks van vignetten sien uit die History Channel wat neem 'n blik op hoe dinge verkeerd geloop het. Dit is sowat 8 minute lank, en ons sal terug te kom na dié en neem 'n blik op presies Wat anders kan verkeerd gaan. As ons die lights-- kan verdof [Video speel] -Computers, Ons het almal kom om te aanvaar die dikwels frustrerende probleme wat gaan saam met hulle. Foute, virusse, en sagteware glitches is klein pryse om te betaal vir die gerief. Maar in 'n hoë-tegnologie en 'n hoë spoed militêre en ruimte program programme, die kleinste probleem Groot in die ongeluk. Op 4 Junie, 1996, wetenskaplikes bereid om 'n onbemande Ariane 5-vuurpyl te loods. Dit was die uitvoering van wetenskaplike satelliete ontwerp presies hoe die vestig Aarde se magneetveld wisselwerking met son winde. Die vuurpyl is gebou vir die European Space Agency en gelig van sy fasiliteit aan die kus van die Franse Guiana. -en Sowat 30 sekondes in die vlug, het hulle eerste opgemerk iets verkeerd gaan. Dat die spuitpunte is draaibare op 'n manier wat hulle werklik moet nie. Rondom 40 sekondes in die vlug, duidelik die voertuig was in die moeilikheid, en dit is wanneer hulle ' die besluit om dit te vernietig. 'N reeks Veiligheid Beampte geweldige guts druk die knoppie, blaas die vuurpyl voordat dit kon 'n gevaar vir die openbare veiligheid. -Dit Was die eerste reis van die Ariane 5, en die vernietiging het plaas weens 'n fout ingebed in sagteware die vuurpyl se. -Die Probleem op die Ariane was dat daar was 'n getal wat nodig is 64 stukkies uit te druk, en hy wou omskep dat dit 'n 16 bit nommer. Hulle het aanvaar dat die aantal is nooit gaan baie groot wees, dat die meeste van dié syfers in die 64 bis getal was 0 se. Hulle was verkeerd. -Die Onvermoë van een sagteware program is om te aanvaar die aard van die aantal gegenereer deur 'n ander was aan die wortel van die versuim. Sagteware-ontwikkeling het 'n baie duur deel van die nuwe tegnologie. Die Ariane 4 vuurpyl was baie gewees suksesvolle, so baie van die sagteware geskep, want dit was ook gebruik van die Ariane 5. -Die Basiese probleem was dat die Ariane 5 was vinniger, vinniger vinniger. En die sagteware nie gehad verantwoordelik vir wat. -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 moderne tegnologie vuurpyl geteister. -In 1991, met die begin van die Eerste Golfoorlog, die Patriot raket ervaar 'n soortgelyke soort die aantal omskakeling probleem. As 'n resultaat, 28 mense, 28 Amerikaanse soldate gedood en ongeveer 100 ander gewond, toe die Patriot, wat veronderstel was te beskerm teen die inkomende scuds, versuim het om 'n missiel te vuur. -Wanneer Irak Koeweit en Amerika stapel gestuur Desert Storm in die vroeë 1991, Patriot missiel batterye ontplooi te beskerm Saoedi-Arabië en Israel 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, self, oor is, rofweg 20 voet lank. En dit weeg ongeveer 2000 pond. En dit dra 'n plofkop van about-- Ek dink dit is ongeveer £ 150. En die Warhead, self, is 'n hoë plofstof, wat het fragmente rondom dit. Die omhulsel van die Warhead is ontwerp om op te tree soos bokhael. -Die Missiele is gedra, 4 per houer, en word deur 'n semi-sleepwa. -Die Patriot anti-missiel-stelsel gaan nou terug ten minste 20 jaar. Dit is oorspronklik ontwerp as 'n lug verdediging missiel om te skiet die vyand vliegtuie. In die Eerste Golfoorlog, wanneer die oorlog gekom het, die weermag wou dit gebruik om skiet scuds, nie vliegtuie. Die Irakse Force was nie so veel van 'n probleem nie, Maar die leër is bekommerd oor scuds. En so het hulle probeer om die opgradering van die Patriot. -Intercepting 'N vyand missiel wat teen mach vyf gaan genoeg uitdagend. Maar toe die Patriot is inderhaas na die diens, die weermag was nie bewus van 'n Irakse verandering wat gemaak hul scuds byna onmoontlik om te tref. -Wat Gebeur het, is die scuds dat is in die komende was onstabiel, hulle waggel. Die rede vir hierdie, was die Iraki, ten einde 600 kilometer uit 'n 300 kilometer afstand missiel, het gewig uit die voorkant Warhead en hy het die Warhead ligter. So nou, die Patriot se probeer om te kom by die Scud, en die meeste van die tyd, die oorgrote meerderheid van die tyd, sou dit net vlieg deur die Scud. -As Die Patriot stelsel operateurs besef die Patriot gemis sy teiken, hulle ontplof die Patriot se Warhead, om moontlike slagoffers as dit te vermy toegelaat is om die grond te val. -dat Was wat die meeste mense sien, die groot vuurballe in die lug, en misverstaan ​​as afsnitte van Scud hoofde. Hoewel in die nag skies, Patriotte verskyn om suksesvol te wees vernietig scuds op Dhahran, daar kan geen fout wees oor sy prestasie. Daar het die Patriot se radarstelsel verlore spoor van 'n inkomende Scud, en nooit van stapel gestuur, weens 'n sagteware fout. Dit was die eerste keer ontdek Israeli's wat dat hoe langer die stelsel was, hoe groter is die tyd verskil geword, as gevolg van 'n horlosie ingesluit in die rekenaar se stelsel. -About 2 weke voor die tragedie in Dhahran, die Israeli berig die verdediging departement, dat die stelsel tyd verloor, dat na ongeveer 8 uur hardloop, hulle het opgemerk dat die stelsel was besig merkbaar minder akkuraat. Die departement van verdediging het gereageer deur vertel almal van die Patriot batterye om nie laat die stelsels vir 'n lang tyd. Hulle het nooit gesê wat 'n lang tyd was. 8 ure? 10 uur? 1000 ure? Niemand het geweet. -Die Patriot battery gestasioneer by die kamp op Dhahran, en sy gebrekkige interne klok, was op meer as 100 uur op die aand van 25 Februarie. -Dit Nagespoor tyd om 'n akkuraatheid van ongeveer 1/10 van 'n sekonde. Nou 10/01 van 'n tweede is 'n interessante getal want dit kan nie wees uitgedruk in binêre, presies. Wat beteken, dit kan nie uitgedruk, presies, in enige moderne digitale rekenaar. Dit is moeilik om te glo, maar gebruik dit as 'n voorbeeld. Kom ons neem die getal, 1/3. 03/01 kan nie uitgedruk in desimale, presies. 03/01 is 0,333 gaan vir oneindigheid. Daar is geen manier om dit te doen, met absolute akkuraatheid, in desimale. Dit is presies dieselfde soort probleem wat gebeur het in die Patriot. Hoe langer die stelsel gehardloop, die erger die tyd fout geword. -na 100 ure van die operasie, die fout in die tyd was slegs sowat 1/3 van 'n sekonde. Maar in terme van fokus op 'n missiel wat teen mach 5, dit gelei tot 'n dop fout van meer as 600 meter. Dit sou 'n fatale fout wees vir die soldate op Dhahran. -Wat Gebeur het, is 'n Scud bekendstelling was waargeneem deur vroeë waarskuwingstelsels satelliete, en hulle nuut dat die Scud was kom in hul algemene rigting. Hulle het nie geweet waar dit vandaan kom. -Dit Was nou aan die radar komponent van die Patriot-stelsel, verdedig Dhahran, op te spoor en te hou spoor van die inkomende vyand missiel. -Die Radar was baie slim. Dit sou eintlik spoor die posisie van die Scud en dan voorspel waar is dit waarskynlik sou wees, die volgende keer, die radar gestuur pols uit. Dit is die reeks hek genoem. -Then, Sodra die Patriot besluit genoeg tyd het geslaag om terug te gaan en kyk die volgende plek vir hierdie bespeur voorwerp, dit gaan terug. So wanneer dit gaan terug na die verkeerde plek, dan is dit sien geen voorwerp en hy besluit dat daar geen voorwerp, dit was 'n valse opsporing, en druppels die baan. Die inkomende Scud verdwyn uit die radar skerm, en sekondes later, is dit klap in die kamp. Die Scud vermoor 28 en was die laaste een afgedank tydens die Eerste Golfoorlog. Tragies, die sagteware opgedateer aangekom by Dhahran die volgende dag. Die sagteware fout het vasgestel, sluitingsdatum een hoofstuk in die ontsteld geskiedenis van die Patriot raket. [Einde afspeel] DAVID J MALAN: So sal ons 'n blik op te neem 'n soortgelyke beperkings in net 'n bietjie. Maar eers, laat se oorgang na 'n paar FYI is. So one-- hierdie naweek, is daar sal wees super afdelings, wat bedoel is om 'n onderkruiper gereeld geskeduleer dele, wat sal dus begin 'n week. Neem 'n blik op die webwerf die CS50 se Vir meer inligting oor hulle. Hulle sal ook verfilm en gestroom lewe vir diegene in staat is om by te woon. Probleem stel 1 op die webwerf natuurlik se reeds en ons sal 'n blik op te neem wat in net 'n bietjie. En kantoorure ook sal neem plaas dit Maandag tot Donderdag. So dit was die mees kanonieke program het ons gekyk na die laaste keer. Dit is soos die eenvoudigste program kan jy skryf in C, en selfs dit is 'n bietjie van 'n vet eis. Reg? Want daar is 'n baie oënskynlike kompleksiteit om hierdie. So laat ons neem 'n vinnige blik op wat sommige van hierdie elemente was en probeer dan om voorsiening te maak 'n geestelike model vir hoe hierdie eenvoudigste programme werk, en dan sal ons begin kyk na dinge al hoe meer kompleks. So hierdie lyn hier, uitgelig nou, in geel, wat het ons sê, die afgelope tyd, dat dit vir ons doen? Wat is die doel wat dit dien? Enigeen van verder terug? Ja. Lid van die gehoor: [onhoorbaar] DAVID J MALAN: Goed. So dit gee jou toegang om bevele, of laat noem hulle funksies, dat iemand anders geskryf het, wat verklaar is, om so te praat, in 'n ander lêer. So ons sal sien presies wat 'n .H lêer is teenoor 'n .c lêer, uiteindelik. Maar vir nou, weet net wat printf, byvoorbeeld, is een van die funksies wat gewees verklaar in 'n ander lêer, iewers anders op hardeskyf die wolk se ons toelaat om toegang te verkry tot printf en gebruik dit sonder om te herontwerp dat onsself wiel. Intussen belangrikste. Wat was die analoog van die belangrikste, het verlede week? Ja. Lid van die gehoor: Groen vlag word gebruik. DAVID J MALAN: Ja. Kras se, toe groen vlag gebruik. Dit is soos die legkaart stuk wat skop dinge af. En so op soortgelyke wyse, het die wêreld besluit 'n paar jaar gelede dat in C, en 'n klomp van die ander tale, As jy wil 'n program skryf, jou eerste funksie het genoem te word, die vernaamste. En dit het om te kyk soos hierdie. Maar ons sal terug te kom, 'n ander tyd, wat, int, en, nietig, beteken in daardie konteks. Vir nou, die krulhakies is soort van soos legkaart stuk vorm Scratch se dat saamvat paar aantal lyne. En onder op die lyne hier, is hierdie een hier. printf is 'n funksie waarvan die doel in die lewe is om 'n geformatteerde string druk. En deur geformatteerde, ek bedoel jy kan aansluit in plekhouer waardes, en jy kan hoeveel desimale spesifiseer punte, hoeveel nommers te druk na 'n desimale punt en dies meer. En printf, natuurlik, neem een of meer argumente of parameters, andersins bekend, meer eenvoudig, as insette. So printf, soos 'n baie funksies, neem insette. En diegene insette omhels deur die twee hakies hier. En binnekant van die een insette. Dit is 'n string, soos ons dit genoem het, wat net 'n reeks van die karakters, soos 'n woord of 'n frase, of 'n hele opstel, selfs, tussen dubbele aanhalingstekens. En dit is wat gaan die invloed gedrag van printf omdat, natuurlik, dit is net 'n generiese druk funksioneer. Dit gaan nie om te weet wat te druk, tensy jy dit te vertel. En dan, 'n paar kleinigheden. Wat het ons sê die vreemde volgorde van simbole is? Ja. Lid van die gehoor: Nuwe lyn. DAVID J MALAN: Nuwe lyn. So dit blyk, kan jy nie net getref het, betree, wanneer jy die skryf van die program. Oor die algemeen, is die samesteller gaan kry 'n bietjie verward oor wat jy bedoel. Inteendeel, jy het om letterlik sê, gee my 'n nuwe lyn hier. En so / n is wat ons in die algemeen roep 'n ontsnapping karakter. So n, vir 'n nuwe lyn. En die samesteller weet dat wanneer dit sien / n, dit moet eintlik die rekenaar veroorsaak, uiteindelik of printf, in hierdie geval, om uit te druk 'n werklike nuwe lyn, soos slaan die, betree, sleutel op u sleutelbord. En laastens, wat het ons sê hierdie stuk van sintaksis is vir? Wat beteken dit verteenwoordig? Ja. Lid van die gehoor: [onhoorbaar] DAVID J MALAN: Dis net die einde van die lyn. Dit is die einde van die verklaring. En besef dat ons dit nie doen nie sit hulle oral. Ons het beslis nie hulle sit aan die einde van elke lyn. Byvoorbeeld, daar is nie op die eerste reël, daar is geen op die lyn met, hoof, is daar geen na die krulhakies, maar jy sal begin om te sien en kry vertroud is met waar dit gevra. En dit is byna altyd na 'n funksie bel of 'n verklaring, 'n aksie wat jy eintlik neem. En weet nou nie, veral as onder diegene wat minder gemaklike, Dit is die soort van dom dinge dat jy beland per ongeluk gebons jou kop teen die muur verby. Omdat jy logies sal wees vertroue in 'n probleem jy 'n probleem opgelos stel, en die damn ding net sal nie saam te stel of selfs hardloop. En so dikwels, vroeg op, dit gaan wees omdat jy 'n parentese gemis het, of jy 'n kommapunt gemis. En so net bedag wees van hierdie soort van dinge, en probeer om nie te raak gefrustreerd deur hulle, want hierdie baie vinnig doen geword ou hoed. Maar dit is baie maklik om te kry gefrustreerd vroeg op, as 'n gevolg. So nou, laat ons 'n blik op hoe hierdie lyn is eintlik werk en dan kyk na 'n effens meer ingewikkeld een. Dus het ons hier, die vermoë om te teken op die skerm. En laat ons veronderstel dat dit is my rekenaar skerm, maar Ek skryf die, hello program, en ek het nie geïmplementeer word, printf. Iemand anders het geïmplementeer word, printf. Wie wil eis om geïmplementeer, printf? As ons kan? Alle reg, wat is jou naam? STUDENT 1: [? Kopal. ?] DAVID J MALAN: Copal, kom op op. Kom up. Alle regte. Dus het ons hier, 'n paar naam tags, aangesien ons 'n bietjie spel van hierdie sal maak. En ons sal jou bel, printf. En as jy wil hier oor te kom, wat ek het net getrek op die skerm, dit is eenvoudig, daar is vir my, hierdie. Alle reg, sodat, hello my naam is, printf, as jy wil om aan te trek nie. Alle regte. En as jy kan gaan staan deur die rekenaar skerm asof jy die funksie wat gekom met hierdie rekenaarstelsel. En jou doel in die lewe is om werklik iets te druk. Maar net soos die program wat ons moes net op die skerm, hier, ons gaan hê om eintlik gee jou 'n paar insette. En so, as my insette, hier, is blykbaar, wat geslaag om printf, laat se soort spot dit soos hierdie. Ek gaan letterlik skryf 'n stuk papier, "hallo, wêreld," backslash N. En duidelik te wees, wat Ek het net getrek oor hierdie stuk papier, lyk. So wanneer ek hardloop hierdie program, en dit geel lyn van die kode sal uitgevoer word, dit is asof ek die hallo program, is oorhandig 'n paar insette af om 'n funksie dat iemand anders geskryf het. En as jy met jou vinger, kon eintlik met jou vinger, teken op die skerm wat ook al dit is wat jy is oorhandig, die effek, uiteindelik, is om sien presies wat op die skerm. En 'n bietjie hoek geval hier. En 'n goeie, moet ons nie sien nie die nuwe lyn, op hierdie punt. Dit sou verkeerd wees vir jou uitdruklik teken die newline. Maar as ons gehou skryf woorde op die skerm, sou hulle uiteindelik onder dit. So baie dankie, maar hou hier rond vir net een oomblik. Ons moet nou een ander vrywilliger, as ons kon, wat gaan nodig het om die rol te speel of-- Dit is net mense in die orkes nou. Hoe about-- OK. Reg hier. Kom up. Wat is jou naam? STUDENT 2: [? Ivay. ?] DAVID J MALAN: Jammer? STUDENT 2: [? Ivay. ?] DAVID J MALAN: Ethan, kom op op. Nee? Het ek wat verkeerd, selfs nadat jy dit gesê twee keer? Kom up. Dit is moeilik om hier te hoor up. OK. En ek is jammer, wat is jou naam? STUDENT 2: [? Ivay. ?] [? DAVID J MALAN: Ivay. ?] OK. Vir nou, as jy dit nie doen nie gedagte, is jy GetString. STUDENT 2: OK. Cool. DAVID J MALAN: So as jy wil hier staan ​​net vir 'n oomblik, Kom ons neem 'n blik op 'n effens meer komplekse program, wat het nou drie reëls van die kode. So het ons, een, meld u naam deur printf; twee, 'n oproep om GetString, gevolg deur 'n opdrag om 'n veranderlike genoem, string s, of genoem s; en dan nog 'n oproep om, printf, maar hierdie keer met twee insette. So het ons reeds gedoen staat jou naam, of liewer, ons het reeds 'n oproep gedoen printf. So ek gaan skryf, meld u naam. En so, wat ek gaan slaag, printf, in net 'n oomblik, is eenvoudig, hierdie. So as jy wil om voort te gaan, en teken dit op die skerm, dit is nou jou insette. Alle regte. En vergeet string, wat ons nou het ons eie lyn van die kode hier. So in, GetString, moet ons om werklik te roep, GetString. Sodat jou doel in die lewe is om net loop uit in die orkes, as jy kan, en kry iemand se naam. Maar laat ons gee jou iets om dit op te sit. As jy wil, gaan voort en kry 'n string, kry iemand se naam op die stuk papier, as jy kan. Alle regte. En ons sal sien, in net 'n oomblik, wie se naam ons kry. Intussen wat ek gaan gereed, is 'n leë stuk papier, waarin, ek gaan te slaan watter waarde dit is dat GetString terugkeer na my, Ek, as 'n string veranderlike genoem, s. Alle regte. So wat doen jy hier? Nik. Alle regte. Dus het ons hier die naam Nik se. So dit is wat letterlik terugbesorg vir my om so te praat, deur GetString. Ek, nou, ek gaan voer die linkerkant van daardie uitdrukking, waar ek net afskryf, vir vandag se doeleindes, Nik. So nou, ek het 'n veranderlike genoem, s, stoor naam Nik se. Ek het reeds oorhandig aan printf, 'n vorige argument. Maar in ons derde en laaste lyn van kode, ek het eintlik hand printf iets 'n bietjie different-- "hello,% s," backslash n. En so het die laaste reël ek gaan om die laaste ding wat ek send-- nou gaan skryf, is dit. So het die twee lyne van kode of eerder die laaste reël van die kode, oproepe vir twee inputs-- een, hierdie en twee, hierdie. So as ons printf funksie kan nou hierdie as insette, laat my duidelik op die skerm vir jou. Eintlik nie, kan jy voortgaan. Ons sal dit laat word, het sedert dit is op dieselfde program. Ons moet kyk, hello, Nik. Alle regte. So dit was nogal 'n paar hoepels om deur te spring, net om te skryf, meld u noem, en hello, Nik. Maar hierdie eenvoudige idee van die boodskap verbygaan, insette verbygaan en uitset te ontvang, is presies die model wat ons gaan hê vir selfs die mees komplekse funksies. So baie dankie vir julle albei. Ons het 'n pragtige stres bal hier vir jou. En dankie aan ons GetString en printf vrywilligers gelyk. Dankie. Alle regte. Baie dankie aan julle albei. So ons het gepraat oor tot dusver, meestal oor snare. En dit blyk dat C kan eintlik verstaan ​​'n paar verskillende tipes data. In werklikheid, laat ons 'n blik op hierdie hier. So C, en 'n baie tale, verstaan ​​dinge genoem karakters. A char is oor die algemeen 'n enkele byte, of agt stukkies. En dit verteenwoordig 'n enkele karakter, soos die letter A, of die hoofstad letter A, of die kleinletter A, of 'n uitroepteken, of enige karakter wat jy kan tik op jou sleutelbord, en soms selfs meer. Ons het ook gebeur dryf te sien. A float is, oor die algemeen, 'n 32-bit waarde of vier grepe want weer een byte is agt stukkies. So 'n float is 'n drywende punt waarde, iets met 'n desimale punt. En inderdaad, dit is wat die film praat oor wanneer hulle gepraat oor drywende punt waardes, sommige vaste aantal bisse gebruik word om 'n reële getal verteenwoordig. Maar daar is ook dinge genoem dubbelspel. Hierdie bestaan ​​in Java, as jy APCs geneem het, en 'n dubbel, soos die naam gelukkig suggereer, is twee keer so groot soos 'n float. Dit is nog steeds 'n reële getal, dit het net meer stukkies waarmee al hoe meer presies te wees, of om selfs groter getalle te stoor. int is maklik. Ons het gepraat oor die laaste tyd. Dis net 'n heelgetal. En dit is oor die algemeen 32 stukkies, of vier grepe. En so, as jy het, laat ons sien nou, 32 bits-- en ons het dit gedoen in week 0, ooit so briefly-- as jy 32 stukkies, wat is die grootste nommer wat jy kan verteenwoordig as 'n heelgetal? Gee of neem? Dit is soos 4000000000, en dit is net as ons wat slegs positiewe getalle. As jy 32 stukkies, en jy wil verteenwoordig negatiewe getalle so goed, jou reeks is, in wese, negatiewe 2000000000 positiewe 2000000000. Maar oor die algemeen, sal ons begin by 0 optrek na 4000000000. Jy hoef nie te presies weet nie, maar ons kan dit sien, in werklikheid, as ek net maak 'n bietjie sakrekenaar, hier. Ek kan doen 2 die 32, en dit is presies hoe groot, hoeveel waardes wat jy kan verteenwoordig, met 32 ​​stukkies. En dit is ongeveer 4 miljard. So ons sal hou sien dat die getal in 'n paar verskillende plekke. Maar as jy meer nodig getalle as dit, dit blyk daar is iets genoem 'n lang lang. En 'n lang lang is algemeen 64 stukkies, wat beteken dit is 'n orde van grootte selfs groter as 'n int. So ek kan nie eens die grootste uitspreek nommer wat jy kan verteenwoordig, maar dit is aansienlik groter. Nou as 'n eenkant, histories, As 'n int is 32 stukkies, en 'n lang lang is 64 stukkies, hoe groot is 'n lang, nie 'n lang lang? Jy sou dink dit is langer as 'n int maar miskien minder lank as 'n lang lang, maar dit hang eintlik. En so dit blyk een van die frustrasies ook met kode skryf oor sekere stelsels, is dat nie al hierdie data tipes het vooraf bepaal waardes. Soms is dit hierdie baie stukkies. Soms is dit dat baie stukkies. So wat jy eintlik moet weet, soms, wat hardeware jy loop jou sagteware op. Gelukkig, ander tale en ander tipes data wat nou bestaan, toelaat om presies te wees. Wel, ons het string, en ons sien Bool ook maar dit blyk die kom slegs met die CS50 biblioteek. So dit is nie gebou in C. Diegene plaas, kom in die lêer genaamd CS50.h, dat ons sal uiteindelik skil terug die lae van. Maar vir nou, hulle is net addisionele tipes data. A Bool is 'n ware of vals, en 'n string is 'n reeks van die karakters, soos 'n woord. Nou printf, ons gesien het, het plekhouers,% s is een. En jy kan in staat wees om nou, aflei uit hierdie ander voorbeelde, hoe jy kan 'n plekhouer het vir verskillende tipes data. Byvoorbeeld, neem 'n raaiskoot, as jy wou om uit te druk met behulp van 'n enkele char printf, die plekhouer is waarskynlik% c. En as jy wil om uit te druk 'n heelgetal met die plekhouer,% i. % LLD is 'n lang lang desimale waarde maar lang lang, sodat kaarte om dit. En dan% f vir drywende punt waarde of vir 'n dubbel, so soms is hulle weer gebruik- in verskillende kontekste. So ons sal sien en gebruik sommige van daardie tyd. En printf en ander funksies ook ontsnapping rye ondersteuning van ander, en soms, dit is nodig. So backslash N is 'n nuwe lyn. Agteroorskuinsstreep t, nie almal wil 'n steek te neem? Lid van die gehoor: Tab. DAVID J MALAN: Tab. So as jy wil eintlik om uit te druk 'n blad, nie 'n vaste aantal ruimtes, maar 'n werklike blad karakter, het jy nie getref jou, blad, sleutel op die sleutelbord, oor die algemeen, jy eintlik doen backslash t. Agteroorskuinsstreep dubbel kwotasie, hoekom sou ek ooit wil hê dat? Reg? Hoekom kan ek nie net 'n tik dubbel kwotasie op my sleutelbord? Lid van die gehoor: Want anders is dit gaan dink dit is die einde van hou jou druk [? teks. ?] DAVID J MALAN: Presies. Onthou, met ons printf voorbeelde, wanneer ons is verby om printf in insette, aan die linkerkant van die insette string en op die regte van die insette lente, natuurlik, was 'n dubbel kwotasie. As jou eie insette het 'n dubbel aanhaling in die middel van dat, die rekenaar mag potensieel deurmekaar, soos om, doen dit dubbel kwotasie hoort in die middel? Is dit hoort met die linker een? Is dit hoort by die regte een? En so, as jy wil om dit te maak super duidelik, jy doen agteroorskuinsstreep dubbel kwotasie, sodat dit ontsnap, om so te praat, en dit is nie conflated vir iets anders. En daar is 'n paar ander hier, backslash r, aanhalingstekens, 0, sodat ons kan sien met verloop van tyd, as well. En nou, wat oor funksies? So aksies wat ons tot dusver kan neem in hierdie taal, C, wel, ons gesien het, printf, natuurlik, en al van die ander op die skerm, hier, dat ons sal gebruik vir die net in die eerste paar weke verloop se kom wanneer die CS50 biblioteek. En hulle maak dit baie makliker in C, om werklik die gebruiker se toevoer. Dit blyk dat in C en eerlik in 'n paar tale, dit is 'n ware pyn in die nek om te doen iets eenvoudig soos die gebruiker vinnige vir sleutelbord, vir sy of haar insette. En so hierdie funksies maak dit makliker. En dit het ook die fout regdeur nagaan, sodat, wanneer jy onthou op Woensdag, het ons het die, weer probeer, waarskuwing, wanneer ek nie saamwerk nie, en ek getik 'n woord, in plaas van 'n nommer? Ons het die swaar werk gedoen vroeë op om seker te maak die gebruiker saam. Maar dit is net opleiding wiele dat ons sal uiteindelik, en vinnig, af te neem. So om herhaling, dan, Kom ons neem 'n vinnige blik, baie soos ons gedoen het met Scratch op sommige kanonieke konstrukte in C. Dit is bedoel om, sorteer van, 'n warrelwind toer, net so dat jy 'n verwysing en dat jy dinge gesien by die eerste. Maar dan sal ons kyk na die werklike kodering gebruik 'n paar van hierdie boustene. So baie soos in Scratch, toe ons stellings soos, sê of, wag, in C, het ons funksies ook, soos printf. As ons wil hê om 'n toestand te druk in C, dit is soortgelyk, in gees, dat die legkaart stuk wat lyk soos dit in Scratch. Maar in plaas daarvan, het ons letterlik net skryf, as. En dan, in hakies, Ons het 'n toestand, waar daardie toestand is wat ons sal noem, weer, 'n Boole-uitdrukking. En weer, hierdie is 'n soort van pseudokode. En, in werklikheid, die // is 'n kommentaar. Dis net Engelse woorde om myself. Maar dit is die algemene struktuur van 'n, indien toestand. Maar ons sal sien beton voorbeelde in net 'n oomblik. As jy wil 'n te hê tweerigting-vurk in die pad, baie soos ons gedoen het met ons vrywilligers op Woensdag, kan jy 'n te hê, anders as. En as jy wil om 'n derde het en finale toestand, of versuim situasie jy kan net 'n ander blok het, is daar. En insgelyks met Boolse uitdrukkings, wat jy kan, en hulle saam. En ons het op Woensdag, wat dit is nie 'n enkele ampersand, dit is twee vir laer-vlak redes wat ons sal uiteindelik sien en te speel. Of-ing dinge saam 2 vertikale bars. Op 'n Amerikaanse sleutelbord, hierdie is oor die algemeen 'n belangrike met die Shift-sleutel hierbo jou Enter-sleutel of Return-sleutel. Dan is daar die dinge wat ons sal dalk een of twee keer gebruik. Hulle is funksioneel ekwivalent aan wat jy kan doen met 'n, indien anders as, anders as die ander, bou, maar hulle is 'n skakelaar genoem. Hulle lyk baie anders, maar ons sal sien in 'n paar van ons verspreiding kode, vir 'n toekomstige probleem stel, waarskynlik, dat dit soms net 'n mooier manier om 'n hele n klomp van die voorwaardes, sonder 'n baie krullerige draadjies en 'n baie hakies en inkeping. Maar hulle gee ons nie meer krag as wat ons reeds. En nou lusse. En hierdie een, sal ons kyk 'n bietjie stadiger. Maar dan, sal ons begin om dit te gebruik, veral vir diegene wat reeds bekend is. Dit is die kanonieke manier, as ongelooflik arcane manier om 'n lus in C. skryf Nou 'n lus in Scratch was redelik eenvoudig. Jy het 'n, vir ewig, blok. Jy het 'n, herhaal, blok met net 'n nommer wat jy het om te tik in. En met die, vir lus, jy kan implementeer beide van die idees, maar dit is 'n bietjie meer tegnies. Maar eerlik, dit is ook relatief eenvoudig. Sodra jy weet wat die orde van bedrywighede, jy letterlik net gaan om te prop in waardes en vertel die rekenaar wat om te doen. So hier is 'n voorbeeld. Dit is 'n lus wat heel eenvoudig, tel van een getal tot deur 'n ander. En net deur skrams dit, selfs al het jy geen vorige ervaring met hierdie taal, watter getal beteken dit waarskynlik begin tel by? OK, 0. En ek vermoed dit is omdat jy sien dat daar 'n int en 'n i, wat is 'n veranderlike. Dit is geïnisialiseer tot 0. En dan later, dit lyk soos ons verby printf, 'n waarde. En, in werklikheid, het ek hier 'n bietjie tikfout. Maar dit is maklik vasgestel. Laat my toe te voeg in, i hier. Ons het nou printf wese geslaag dat plekhouer waarde. En wat gaan tel tot deur? GEHOOR: 50. 50. 49. DAVID J MALAN: 49. So 50, met die eerste oogopslag, reg lyk. Maar dat dit blyk, gaan wees ons toestand dat ons hou keur. En ons gaan een keer te stop i is nie meer minder as 50. So hierdie lus, omgekeerd, moet voer, so lank as wat ek is minder as 50. Maar so gou as dit 50 of 51, of nog erger, moet dit outomaties te stop. Alle regte. So wat werklik gebeur hier? So, dit is aan die orde van bedrywighede vir 'n lus. Een, jy het die sogenaamde inisialisering. Dit geel uitgelig stuk van die kode is die eerste uitgevoer word, en dit het die effek dat, per Woensdag, het jy waarskynlik dink. Dit skep 'n veranderlike i en dit genoem winkels in daardie veranderlike die waarde 0. So ek is 0 op hierdie punt in die verhaal. Die volgende ding wat gebeur in hierdie konstruk, is dat die toestand kry nagegaan. So Ek is so onmiddellik, is i minder as 50? En natuurlik, die antwoord vir nou is, sekerlik, ja. Ja, want ek is 0, en dit is sekerlik minder as 50. Dan wat gebeur, is dat dit reël van die kode sal uitgevoer word. En in die feit, daar is verskeie as reëls van die kode in die krulhakies, hulle almal ontslae uitgevoer een na die ander. En in die effek hier, is blykbaar, uit te druk die aantal i, wat gaan 0, en dan 1, en dan 2. Maar hoekom? Hoekom is dit raak geïnkrementeer? Wel, die vierde ding wat gebeur, is dat hierdie sintaksis sal uitgevoer word nadat die kommapunt. i ++ is 'n snelskrif manier om te sê; neem die waarde van i, en voeg 1 om dit; en dan die volgende keer, voeg 1 om dit; en die volgende keer, voeg 1 om dit te. So as ons hou, wat gaan gebeur volgende is ek nie van plan om inisialiseer ek ooit weer. As ek gehou initializing i tot 0, hierdie voorbeeld sou nooit 'n einde, want ek sou vas op 0. Maar wat gaan gebeur is dat die toestand sal nagegaan word, die reël van die kode sal kry uitgevoer word, die i sal geïnkrementeer, voorwaarde sal nagegaan word, kode sal kry uitgevoer. En dit het die fiets weer en weer, en weer, totdat ek ++ veroorsaak 'n waarde van 50. Die toestand dan sê, is 50 minder as 50? Die antwoord, natuurlik, is geen, en so die hele kode stop uitvoering. En as jy meer op die skerm kode hieronder af, dit is wat gebeur volgende. Dit verskyn uit hierdie krulhakies en steeds meer daarna te druk. So 'n grap nou, uit Foxtrot, wat jy dalk nou verstaan. Dit is altyd snaaks. Dit is soos die chuckles soort perkoleer, en dan moet jy besef jy moet nie wees lag humor soos hierdie. Maar daar is 'n paar afhaal hier, pedagogies, ook. So dit blyk dat ek ontbreek 'n stuk van sintaksis, of Foxtrot se vermiste 'n stuk sintaksis hier. Wat ontbreek, dit wat ons gehad het in elke ander byvoorbeeld tot dusver? Terugkeer, is daar, so dit is iets anders, dat ons sal terug te kort voor lank kom. Wat ontbreek, alhoewel? Ja. Lid van die gehoor: Die inisialisering van [onhoorbaar]. DAVID J MALAN: OK. So ja. So eintlik is dit is-- Wel, en telling geïnisialiseer bo, of liewer, verklaar bo. So, dit is 'n ander manier om dit te doen. Maar nie in een lyn dis al geldig. Hoe gaan hier? Lid van die gehoor: Is dit die krulhakies? DAVID J MALAN: Ja. So die krulhakies word vermis. Maar hierdie kode, ek bedoel, om hul krediet, is eintlik, sintakties geldig. Dit blyk uit, jy doen nie moet die krulhakies As jy net een lyn van kode wat jy wil om uit te voer binnekant van die lus. Nou ons altyd, in die klas en in almal van ons verspreiding kode, sluit die krulhakies in elk geval, net ter wille van duidelikheid se. Maar besef dat in handboeke en aanlyn voorbeelde, jy kan baie goed sien krullerige draadjies ontbreek iewers. En dit is OK, as wat jy het ingekeep en bedoel is net 'n enkele lyn van die kode, en nie verskeie reëls van die kode, potensieel. Alle regte. So verwant aan die kwessie van onakkuraatheid, is 'n kwessie van oorloop, in die sin dat, op soortgelyke wyse, moenie heelgetalle perke aan hulle net soos drywende punt waardes? In die wêreld 'n drywende punt waardes, kan ons net so presies, waarna soms slegte dinge kan gebeur, en ons programme kan karretjie en fout. Nou selfs met heelgetalle, jy kan hardloop in die moeilikheid. Nou 'n heelgetal nie 'n het desimale punt of getalle nadat dit. Dit is net 'n natuurlike getal, tipies. So, wat kan verkeerd met 'n int gaan? As ek met 'n int om tel, wat kan verkeerd gaan? Lyk 'n baie eenvoudiger. Ja. Lid van die gehoor: As die getal kry [onhoorbaar] DAVID J MALAN: Ja. Wat as jy reken so hoog is, dat jy kan nie uit te druk wat werklik groot aantal. Reg? Op 'n sekere punt, jy gaan om die grense te oorskry van 'n 32-bit waarde of 'n 64-bit waarde. Nou weer, ek is nie seker hoe 'n 64-bit waarde uit te spreek, maar ek weet met 'n 32-bis integriteit, die grootste waarde wat dit kan wees nie, al is dit net positiewe waardes, is ongeveer 4 miljard. So as ek probeer om te tel tot 5 miljard, iets gaan gebeur. Maar laat ons sien wat, in werklikheid, kan gebeur. In die wêreld van die heelgetal oorloop, waar jy in 'n sin, oorloop van die kapasiteit van 'n heelgetal, wat kan gebeur? So hier is 'n binêre getal, dit is 'n throwback aan 0. Dit is alles 1 se en die plekhouers daar is magte van 2, so dit is binêre. So dit is 8, 1 stukkies op die skerm. En as jy onthou of jy vinnig doen die wiskunde, watter waarde word verteenwoordig hier met hierdie agt 1 stukkies? 255. En selfs as jy nie heeltemal seker van die wiskunde, kan jy dit doen nie. Of jy kan net soort van die rede deur dit, wag 'n minuut, as ek verteenwoordig 'n 8 bit waarde en Ek het 256 moontlike waardes, maar die eerste van wat is 0, Ek weet net dat die grootste gaan wees 255, en dit is wat hierdie een kan wees. So dink ek probeer om 1 te voeg tot hierdie waarde. Wat sou jy doen in graad skool toe te voeg 'n 1, en dit nie regtig pas omdat jy het om te dra die 1? Wat is hierdie getal gaan raak wanneer jy 1 byvoeg? Dit gaan 'geword 0. Reg? Want as jy het meer bits-- en ek sal probeer om, soort, tik dit uit here-- as ons meer stukkies, wat ons kon hier doen is voeg die 1, en dan sal ons dit kry. Oeps. Ons wil 'n 1 bietjie het al die pad hier. Maar as dit 'n eindige waarde, is dit net 8 stukkies, en dit is pre-bepaal deur die rekenaar, wat 1 is effektief nie daar nie. Dit val net soort van 'n krans af. En so as jy 1 te voeg tot 255, wat waarde het jy glo nie? 0. En so getalle per ongeluk, en miskien onbewustelik, beland wikkel rond soos hierdie. So wat kan die implikasie hiervan wees? Wel, daar is 'n paar verskillende dinge. So een, beteken dit eindig op soek soos 0, onbewustelik, maar jy kan soort van sien nie, selfs in die werklike wêreld, vir 'n beter of vir slegter, manifestasies van hierdie idee van 'n beperking. Byvoorbeeld, enige van julle wat ooit gespeel Lego Star Wars, Is daar iemand weet toevallig die maksimum aantal van die muntstukke jy kan versamel in Lego Star Wars? Neem 'n raaiskoot gebaseer op vandag se voorste vrae. Dit is groter as 256 of 255. Dit is 4000000000. So dit blyk, en daar is 'n paar people-- sommige googlen bevestig laaste night-- het 4 miljard goue munte gekry, of iets anders, in Lego Star Wars. Hoewel glo, is daar 'n manier om die spel te mislei, daar is 'n fout of funksie, waarmee jy net toeval baie en baie van die punte. Maar die grootste moontlike waarde, volgens om hierdie kiekie van iemand wat ek aanlyn gevind, is inderdaad, 4 miljard. Nou hoekom is dit? Dis juis 4000000000, waarskynlik omdat iemand besluit, wat die skryf van hierdie spel, dat hulle kan doen 4000000000, iets, iets wat iets, soos die waarde wat ek opgesit met die sakrekenaar vroeër, maar dit is net 'n bietjie skoner vir die mens om die maksimum aantal sê van coins-- of studs, soos hulle dit noem them-- dat jy kan versamel is 4000000000. En so is, hoekom is dit? Hoe is die LEGO spel die implementering van die toonbank dit is die dop van die aantal muntstukke wat jy het? Hulle gebruik wat? Lid van die gehoor: Dit stop tel ná 4000000000. DAVID J MALAN: Dit stop tel ná 4000000000, wat beteken dat jy kan aflei, as 'n programmeerder, dat hulle waarskynlik met behulp van 'n 32 bit heelgetal. Soos die programmeerder letterlik net getikte, int, in sy of haar code, en dit is die tipe veranderlike wat hulle gebruik om iemand se kode op te slaan. So is daar ander manifestasies van hierdie vorme van grense. So ek het nie hierdie game-- gespeel en ek was te lees oor die geskiedenis om te bevestig as much-- maar in die oorspronklike weergawe van die beskawing, waar jy glo met mekaar ander en kan oorlog of vrede, Gandhi was veronderstel om een ​​van die mees vreedsame karakters, soos ek dit verstaan, in die eerste weergawe van die beskawing. En in die feit, op 'n skaal van 1 tot 10, sy aggressie was net 'n 1. So ooit so effens aggressiewe, blykbaar. Maar op 'n sekere punt, jy kan glo installeer demokrasie in jou geografie. En as jy die demokrasie te installeer in jou weergawe van die spel, dan is jou aggressie vlak gaan. Dit is 'n goeie ding. Mense is meer rustige blykbaar, in daardie situasie. Maar blykbaar, iemand het nie 'n as, toestand in die oorspronklike weergawe van die kode. So Gandhi se aggressie vlak het van positiewe 1, minus 2, negatiewe 1, maar die spel nie verstaan ​​negatiewe getalle. So, wat gebeur het, was aggressie Gandhi se vlak het van 1 tot 0, negatiewe 1, wat die uitwerking van gehad wikkel om die feit dat die mees aggressiewe karakter in die spel, op 'n waarde van 255, op 'n skaal van 1 tot 10. En sedertdien, is daar ' meer inkarnasies van die spel, en hulle het dit gehou as 'n soort van Easter eier, dat Gandhi is blykbaar so verskriklik aggressief. Maar dit was die gevolg van 'n baie eenvoudige fout programmering in daardie baie vroeë weergawe van die spel. Nou, meer ontstellend, meer Onlangs het die Boeing 787 is gedokumenteer as 'n fout, nie die soort van die toestel jy veral wil 'n fout het. En die simptome, wat ek sal lees hier, uit 'n artikel online, was dit 'n model 787 vliegtuig wat voortdurend aangedryf vir 248 dae kan alles verloor wisselstroom, AC, elektriese krag, as gevolg van die kragopwekker beheer eenhede, GCUs gelyktydig gaan in fail-safe mode. So was dit 'n waarskuwing uitgereik wanneer hierdie probleem is ontdek. Hierdie toestand word veroorsaak deur 'n sagteware toonbank, interne om die GCUs, so 'n getal of 'n veranderlike, wat oorloop na 248 dae van deurlopende krag. Boeing is in die proses van ontwikkeling van 'n GCU sagteware opgradering wat sal die onveilige toestand reg te stel. So baie soos die missiel scenario waarin hulle het 'n soort van veranderlike wat tel, en toe, en toe, maar geleidelik oorloop die grense van sy vermoë, insgelyks het die damn vliegtuig het 'n veranderlike oorloop nadat genoeg tyd van loop. En so is die tong-in-die-kies manier van die werk om hierdie probleem is om werklik, reboot, jou vliegtuig elke 247 dae, sodat die geheue kry uitgewis en die veranderlike gaan terug na 0. Maar besef dit is 'n baie groot inkarnasie van sagteware, maar veral as ons hoor oor Apple se bedryfstelsels gaan in motors, en self-ry motors van Google, en enige aantal inkarnasies van sagteware in ons daaglikse lewens, TV en horlosies, en meer, besef is omring deur sagteware, al wat geskryf is deur ons mense. En as ons almal gou ontdek, dit is baie maklik en baie tipiese om foute te maak wanneer die skryf van sagteware. En as jy dit nie vang nie, 'n paar slegte dinge kan gebeur. Nou soms, sommige snaaks dinge kan gebeur, of ten minste soms ons weet sommige sleg verwag. So 0 gedeel deur 0, vanaf graad skool, is oor die algemeen 'n slegte ding. Dit is ongedefinieerd. En dit blyk out-- en laat ons sien of my mic kan kies up-- dat Apple het 'n paar pret met hierdie onlangs. So ek het 'n iPhone hier. Ek gaan Siri te praat en vra haar Gee my die antwoord op 0 gedeel deur 0. Wat is 0 gedeel deur 0? SIRI: Stel jou voor dat jy '0 koekies en jy hulle eweredig verdeel onder 0 vriende. Hoeveel koekies het elke persoon kry? Sien? Dit maak nie sin nie. En Cookie Monster is hartseer dat daar geen koekies. En jy hartseer wat jy het geen vriende nie. DAVID J MALAN: Dit is soort van onaangenaam. So dit is wat daar net gesê. Dit is onbepaalde, dit is nie gedefinieer, en inderdaad baie programmeertale of, regtig, samestellers sal spoor wanneer jy in 'n program, probeer om te verdeel 0 deur 0. Meer pret as dit al is, is wat blykbaar, Cookie Monster is op Twitter hierdie dae. En hy het geantwoord op hierdie, met hierdie, wat absoluut adorable. Maar laat ons neem 'n vinnige blik op 'n paar van die ander konstrukte, en dan sit 'n paar van hierdie kode te gebruik, in 'n goeie maniere. So dit blyk, buiten vir lusse, daar is iets genoem 'n rukkie loop, wat lyk anders en geïmplementeer 'n bietjie differently-- en ons sal uiteindelik sien examples-- maar in 'n sekere sin, dit is makliker, want dit nie toelaat dat jy om te inisialiseer en werk binne die grense van die lus. Jy kan nog steeds implementeer. So kan jy die presiese dieselfde dinge te doen met 'n while lus, soos met 'n lus, maar jou sintaksis, ultimately-- soos ons sal uiteindelik see-- gaan om anders te wees. Daar is selfs 'n doen terwyl loop, wat is eintlik 'n bietjie anders, in daardie, terwyl 'n lus vir die en 'n rukkie loop altyd check hul toestand eerste, as julle hierdie ding bo na onder te lees, dit soort van lyk soos dit gaan check dit se toestand laaste, want dit is waarlik die laaste reël van die kode. En inderdaad, wat gaan nuttig te wees in sekere programme wat ons skryf, as jy wil net blindelings iets te doen en uiteindelik die toestand. Dit is nie noodwendig 'n slegte ding nie. As ons wil veranderlikes, kan ons doen dit in 'n paar van die verskillende maniere. En ons het in die Foxtrot spotprent, een manier om dit te doen, waar jy jou veranderlike te verklaar, soos int counter kommapunt, en dan later-- dalk die volgende lyn, miskien 10 lyne later-- jy eintlik inisialiseer nie. So het hierdie 2 lyne kode verklaar 'n veranderlike van tipe int en noem dit toonbank, so dit gee my genoeg stukkies om 'n int hou. En dan uiteindelik, dit sit die waarde 0 in daardie veranderlike. Dit reël die 0 en 1 in 'n patroon wat ons nie weet van verlede week, verteenwoordig die aantal ons weet as 0. Of eerlik is, kan jy dit doen veel meer saaklik, net soos hierdie. Nou het ons ook die vermoë om die funksies te bel. En in die feit, hier is 'n 2 lyn program, of 'n uittreksel daarvan, wat ons toelaat om werklik skryf 'n paar kode wat kry 'n string van die user-- veel soos ons vrywilliger 'n oomblik ago-- stoor die resultaat in 'n veranderlike genaamd naam en then-- baie soos met ons vrywilligers met printf-- afdrukke uit daardie waardes deur verby in twee argumente, die string, gevolg deur die veranderlike genoem, die naam, self. So laat ons 'n blik, voordat ons terug na Mario kom daar op 'n paar van die nou, voorbeelde van hierdie. Ek gaan om voort te gaan en oop up, kom ons sê, funksie-0.C. En soos altyd, hierdie kode is beskikbaar op die webwerf die kursus se sodat jy kan speel saam op huis en kyk na dit later. Maar hier is die program in sy wese, van lyn 17 tot 22. Die hoofprogram is waar die program is altyd iets om te begin. Hierdie program, blykbaar, gaan om uit te druk jou naam, kolon. Dit is dan gaan GetString noem, net soos ons gedoen het met ons vrywilligers. En dan, dit is interessant, dit gaan PrintName noem. Dit blyk uit al hierdie tyd, is daar lyk na 'n funksie genoem PrintName wees. Dit druk iemand se naam. Ons het nie nodig om te gebruik van printf weleer, daar is PrintName. Maar dit is misleidend omdat PrintName nie kom met C. Mense het nie bedink dit sowat 40 of 50 jaar gelede, Ek het, in plaas. En in die feit, as ek blaai af verder, kennisgewing hoe ek my eie kan skryf funksies in C. Ons sal uiteindelik verduidelik waarom ons hou aan sê, leemte, in 'n paar plekke, maar vir vandag, laat ons kyk net na die naam. On line 24, as jy wil skep jou eie funksie, jy letterlik skryf die Naam van die funksie. Ek het gekies PrintName. Hakies, jy dan spesifiseer watter soorte van insette, en hoeveel jy wil hierdie funksie aan te neem. In hierdie geval, ek wil om te neem 1 veranderlike genoem, die naam, en dit gaan te wees tipe, string, so dit gaan sommige volgorde van karakters. En dan, hierdie program-- baie soos in Scratch, jy kan persoonlike legkaart het pieces-- gaan hierdie persoonlike gedrag. Dit gaan 'printf noem verby in, hello, plekhouer, en dan gaan dit aan te sluit in watter die gebruiker genoem. So, dit is 'n voorbeeld van wat 'n rekenaar wetenskaplike sou oproep onttrekking of funksionele ontbinding, wat net is fancy maniere sê om, is as jy graag hierdie hoë vlak idee, soos Ek wil funksies wat druk iemand se naam, absoluut jy kan letterlik skryf printf en dan slaag in die argumente wat jy wil, en die program sal werk, want dit het sedert Woensdag. Maar jy kan begin om abstrakte weg die idee van die druk van 'n naam. Jy kan dit gee 'n naam, soos PrintName, en dit is hierdie idee van die gelaagdheid van week 0. Voortaan kan ek en jy nie weet of om hoe PrintName geïmplementeer word. Ja, dit maak gebruik printf, miskien is dit nie doen nie, wie weet wat gebruik? Wie gee om? Nou ek praat hier op, in plaas van hier af. En inderdaad, as ons programme te kry meer gevorderde en gesofistikeerde, ons gaan hou as vanselfsprekend dat laer vlak legkaart stukke bestaan ​​nie. Omdat ons dit geskryf het of iemand anders gedoen het, so dat ons dan kan bou op die top van hulle. Kom ons neem 'n blik op hierdie variant, funksioneer een. So hierdie een is 'n bietjie meer gevorderde, maar dit blyk wat in die biblioteek se CS50, daar is slegs 'n GetInt funksie. Ons het nie gedink, jare gelede, om implementering van 'n GetPositiveInt funksie. En dit is 'n bietjie irriterend, want as julle ouens skryf 'n program waarin jy wil 'n positiewe te kry heelgetal van die gebruiker, jy kan absoluut gebruik GetInt. En jy kan absoluut seker te maak met die toestand en miskien 'n lus as dit int is groter as 0 en gil op die gebruiker indien hy of sy nie gee jy 'n positiewe getal is. Maar laat ons bou hierdie gebou onsself te sluit, 'n, persoonlike Scratch stuk, as jy wil. Ek gaan 'n program het hier wat uiteindelik, ek wil in staat wees om te bel GetPositiveInt, en ek wil wees in staat om uit te druk wat dit ook al int is. Maar dit is nou onttrek weg. Dit is net gegee is 'n hoë vlak naam wat sê wat dit doen, wat is wonderlik, want dit is baie intuïtief nou te lees. En as ek doen om wat daar onder die kap, laat my rol af. En dit is 'n bietjie intimiderend op die eerste, veral As dit jou eerste program, maar laat ons neem 'n blik. Ek is nie meer sê, nietig, omdat dit blyk funksies, baie soos GetString, kan terugkeer 'n waarde vir my. Hulle het nie net druk op die skerm, hulle eintlik kan inhandig my iets terug. En terwyl voordat PrintName, Ek het niks terug nodig. Ek, die newe-effek van die nodige iets wat op die skerm, maar ek het 'n menslike nie nodig om my terug te oorhandig iets. Hier met GetPositiveInt, soos met GetInt, Ek wil terug oorhandig iets. So ek sê nie, nietig, op die lyn 23, maar int, wat sê hierdie funksie wat ek skryf, genoem GetPositiveInt gaan oorhandig my terug 'n heelgetal, nie niks nie, nie nietig. Intussen gaan dit nie te neem insette, so ek het, soort van, omgekeer het. Ek gee nie GetPositiveInt enige insette, ek wil dit aan my sy produksie te gee. En dan wat gebeur nou? So hier is hoe ek 'n veranderlike kan verklaar. Ek het dit gedoen buite die lus, om redes wat ons sal uiteindelik sien, maar dit gee net my 32 stukkies genoem, n, en ek het die pre-bepaal hulle heelgetal te stoor. En hier is dat te doen terwyl konstruk, en dit is die rede waarom dit is nuttig. Hierdie letterlik te doen, terwyl N is minder as 1. So laat ons sien wat gebeur. Ek druk, asseblief gee my 'n positiewe int. Ek kry dan 'n int, met behulp van CS50 se funksioneer en gestoor in n. En dan, wat reël van die kode waarskynlik sal uitgevoer word volgende, logies? Watter lyn nommer? Ja, so 31. Jy sal nie weet dit totdat jy vertel of soort aflei nie, maar dit is waar. Dit gaan bo na onder en dan hou herhaal. So as ek in sê, die aantal getik negatiewe 1, is N minder as negatiewe 1? Ja. Omdat negatiewe 1 is minder as 1. So wat moet gebeur? Ek gaan om dit te doen terwyl N is minder as 1, so ek gaan om terug te reël 28 gaan. En elke time-- en laat hardloop this-- maak funksie 1 om dit saam te stel, en nou dot streep funksie 1. As ek tik negatiewe 1, dit is gaan hou skree op my totdat ek saam want elke van my insette is minder as 1 en as dit terwyl minder as 1, Ek gaan hou om dit te doen. As ek uiteindelik gee dit 'n nommer soos 50, Gelukkig, dit sê, dankie vir die 50. Hoekom? Want sodra N is nie minder nie as 1, stop ek vassit in hierdie lus, en hierdie nuwe navraag vandag terugkeer, doen letterlik nie. So ek het net geïmplementeer word, in 'n sin is die ekwivalent van GetString, waar ek die uitreiking terug te wie is die gebruik van my, 'n bietjie waarde. Dit hoef nie te wees 'n string, dit is 'n int. So 'n eenvoudige, vinnige Byvoorbeeld, maar ons sal binnekort sien 'n paar meer gesofistikeerde weergawes steeds. In werklikheid, laat ons 'n blik op 'n numeriese een wat return.c genoem word. En hierdie een is eintlik 'n bietjie makliker. So doel van hierdie program in life-- laat opstel en voer dit, so maak terugkeer, dot slash, return-- kennisgewing die program cubes eenvoudig die waarde 2. Dit is redelik dom, dit is moeilik kode, beteken dit nie enige insette te neem, maar dit demonstreer nog funksie wat ek myself geskryf het. So hier het ek verklaar veranderlike, genaamd x, van die tipe int, gelyk aan die aantal 2, heeltemal arbitrêre. Dit is net 'n paar sagte druk. Dit sê x is nou, soos en sodanig cubing dot dot dot. En die magie is blykbaar in lyn 21. Ek bel 'n funksie genoem, kubus, Ek oorhandig dit 'n vel papier met die nommer 2 geskryf, en watter waarde, wiskundig, wil ek kry uit dit? Net soos 'n gesonde verstand tjek? 8. Reg? Ek wil 2 blokkies gesny terug, 2 tot die krag van 3, so 8 terug. So waar is kubus geïmplementeer? Wel, kennisgewing dit hier geïmplementeer af. En net soos voorheen, logies, selfs al is die sintaksis is waarskynlik baie nuut vir baie van julle, Ek wil om hierdie funksie aan die hand my terug 'n vel papier met 'n int op dit. So ek het 'n int, die naam is arbitrêr, maar gerieflik genoem kubus. Die insette om dit, is n van tik heelgetal, so dit is hoe ek kan slaag in die aantal 2 op 'n vel papier. En dan is dit blyk C ondersteun wiskunde, so jy hoef nie x se tye, jy net die gebruik van die asterisk vir vermenigvuldiging. En dit terug n keer n keer N, wat is bloot 'n blokkies waarde. So waar gaan ons met al hierdie? Dit is beslis 'n warrelwind toer, gerus wees, dat in die super afdelings en in die probleem stel 1, jy sal loop deur dit alles al hoe meer. En in die probleem stel 1, sal ons die oorgang uit die grafiese wêreld van Scratch om iets meer command line in C. Maar ons sal trek inspirasie Van hierdie hier spel van weleer, waarin gebruik van C en die standaard uitgawe van die p stel jy Mario se piramide te implementeer. En in die hacker uitgawe van die p stel, as jy so verkies om te kies, sal jy 'n bietjie meer te implementeer uitdagende piramide met twee pieke. Jy sal ook 'n werktuig algoritme, 'n gulsige algoritme. Dit blyk daar is 'n paar interessante logika agter die proses van hardloop stasie 'n kassier se en eintlik oorhandig iemand terug verandering. Daar is 'n algoritme wat is redelik eenvoudig, dat jy kan selfs gryp intuïtief wanneer jy die eerste lees it-- besef dit is wat ek nog altyd gedoen enige tyd Ek het iemand 'n gegewe geld back-- wat jou toelaat om altyd verminder die aantal papier notas of metaal muntstukke dat jy die uitreiking terug aan die gebruiker. En dit, natuurlik, is dwingende want as jy gaan na CVS of iets anders, jy nie wil oorhandig om te wees 'n hele klomp van die kinders of 'n hele klomp van die pennies. Jy wil die minste munte, waarskynlik, moontlik. Ten slotte, sal jy ook uitgedaag word om ploeteraars in die wêreld van die water en eintlik kry 'n waardering vir 'n kartering tussen die pryse van die vloei, van hou, water in 'n stort, net hoeveel water gebruik word. En die sinspeling daarin, sal hierdie clip hier te wees, wat ons op sal die einde vir net 60 sekondes, wat verf 'n prentjie van lae-vloei stortkoppe. [Video speel] -Alle Reg. Ek het hier alles. Ek het die Cyclone F-reeks, Hydra, Jetflow, Stockholm Supersteam, noem maar op. -en Wat beveel jy aan? -Wat Soek jy? Power man. Krag. -agtige Silkwood. -dat Is vir bestraling. -dat Is reg. -Nou Wat is dit? -dat Is die kommando 450. Ek het nie dat een verkoop. -maar Dit is wat ons wil hê. Dit is 'n kommando 450. -Geen Glo my. Dit is net in die sirkus. Dis vir olifante. -I'll Betaal nie. -Wat Oor Jerry? -hy Kon dit nie hanteer nie. Hy is delikaat. O ja. [Einde afspeel] DAVID J MALAN: Alle reg. Dit is as vir CS50. Ons sal sien dat jy volgende week. Spreker 1: [? Scully?], [? Ian,?] sover dit outro projek wat het julle ouens kom met? Spreker 2: Wel, ons het gegee dit 'n verskeidenheid van denke, en ons dink dat die beste manier aan- SPREKER 3: Mag ek? Spreker 2: Ja. Deur al beteken, eintlik. SPREKER 3: So ek dink ons kan opsom ons idee vir die plak met een word-- niks. DAVID J MALAN: Niks? SPREKER 3: Niks nie. DAVID J MALAN: Wat beteken dit? SPREKER 3: Die plak is oor niks. Spreker 2: Wel, ek bedoel, in die filosofie, Ek bedoel, niks is altyd iets. Spreker 1: So what's-- Wat is die uitgangspunt? SPREKER 3: So dit is soos die lewe. OK. Wat het jy vandag? DAVID J MALAN: Ek het opgestaan, het ontbyt, en het gekom om te werk. SPREKER 3: Dit is 'n outro. Spreker 2: Maar, ek bedoel, moet nie iets met hom gebeur op the-- SPREKER 3: Nee, nee, nee, nee. Niks gebeur nie. Spreker 1: So hoekom is ons kyk? SPREKER 3: Omdat dit is 'n outro vir CS50. DAVID J MALAN: Nog nie.