David J MALAN: Allt höger, så det här är CS50. Och detta är helt klart en fredag. Och detta är slutet av veckan en. Så du kanske minns att vi slutade, förra gången, med en cliffhanger av slag. Där vi avslöja denna lögn, att ingen Oavsett vad du har lärt växer upp, ett delat med 10 är inte i Faktum är 0,1 eller 0,100 eller 0,10000. Faktum är att om vi sammanställa denna program, som vi gjorde i går, med, gör vaghet och sedan gör prick, snedstreck, vaghet, vi lärt oss att det här är vad som är 1 dividerat med 10 i själva verket är. Så det är egentligen inte riktigt fallet. Men detta innebär antydan på några grundläggande begränsning av datorer. Och faktiskt, bland saker som vi ska göra idag är att ta en titt på varför detta har hänt, vilka konsekvenser detta har, hur mänskligheten har misslyckats att förstå detta i vissa mycket allvarlig situations-- resultatet av den som har varit ganska tragiskt och expensive-- och även ta en titt på hur vi kan faktiskt försvara mot dessa typer av begränsningar. Så intuitivt, kanske, varför är 1 dividerat med 10, enligt min dator här, inte bara 1/10, 0,10? Yeah. Vad tror du? Publiken: The radix är annorlunda? DAVID J MALAN: Den vad är? Åh, är radix annorlunda? Så inte riktigt. Det är faktiskt mer grundläggande för hårdvaran. Andra tankar? Yeah. Publiken: De representera tal på olika sätt? DAVID J MALAN: Så they-- höger. De representerar siffror på olika sätt. Felaktigt, tydligen. Så det är-- Tja, annorlunda än vad? Eller från vem? Från oss? Publikmedlem: Ja. De använder inte decimaltecknet systemet till [OHÖRBAR]. David J MALAN: OK. Så på sätt och vis, gör de inte använda decimalsystemet. Under huven, allt är, faktiskt, binär, och det är relaterat, faktiskt. Men det finns även en enklare förklaring än så. Yeah. Publiken: De bara har så många bitar. De kan bara lagra upp till en viss omfattning, i likhet med de decimaler. DAVID J MALAN: Ja. Detta är vad som verkligen komma åt det. Det visar sig att datorer typiskt, alltid kommer endast använda en begränsad mängd av information att representera något. Höger? När allt kommer omkring har vi bara en fast mängd hårddiskutrymme. Vi har bara ett fast belopp RAM eller datorminne. Och om du bara har en fast belopp på något, säkert kan du faktiskt inte räkna upp till oändlighet eller nummer du vill. Du, typ av, måste välja vad räckvidd av värden du kommer att stödja. Och så exempelvis en vecka eller två sedan, när vi talade om ASCII, och vi pratade ca 8 bitar, eller byte, så att säga, det största antalet vi kunde representera med 8 bitar var vad? 255. Och vi kan representera 256 totalvärden men inte om vi tillbringar en av dem på 0-- Tja, men om vi spendera en av dem på 0, då det största antalet är, naturligtvis, 255. Så visar det sig att detta är fallet också i detta sammanhang. Vi började prata, förra gången, om flyttal, som skiljer sig från heltal, i att de har en decimalpunkt och, förhoppningsvis, några siffror efter det, men de är för. En dator är bara typiskt går att använda 32 bitar, kanske 64 bitar för att representera ett flyttal. Så även om vi har vuxit upp lärande i matematik och veta att du absolut kan ha ett oändligt antal siffror efter decimalkommat, inte Om du har begränsat minne. Du, typ av, måste runda, eller välja vilka nummer du kommer att representera. Och så du kan tänka dig, i en mening, varvid detta är datorns närmaste tillnärmning till värdet 1/10 som det kan få, med bara 32 eller så bitar. Och det är inte bara 1/10. Till exempel, om jag ändrar detta till 1/3, vilket vi tycker är ännu enklare. Så 1 dividerat med 3. Låt mig spara filen. Låt mig gå vidare och kompilera den. Och låt mig åter köra den. Även här, uppenbarligen, inte 0,3 1/3 och sedan ett oändligt antal 3s därefter. Du har denna vaghet i slutet. Så vi människor är korrekta, och vad du lärt är i själva verket, korrekt, men vi stöta upp mot vissa begränsningar. Och vad jag trodde vi skulle göra idag, är att börja genom att titta på, ärligt talat, den tragiska konsekvenserna av detta ibland, när mänskligheten inte riktigt genomföra för denna verklighet och dessa begränsningar. Och vi får se en serie vinjetter från History Channel som tar en titt på hur det har gått fel. Det är ca 8 minuter lång, och vi kommer tillbaka efter detta och ta en titt på exakt vad kan gå fel. Om vi ​​kunde dämpa lights-- [VIDEOAVSPELNING] -Computers, Vi har alla kommit att acceptera de ofta frustrerande problem som gå med dem. Buggar, virus och programvara glapp är små priser att betala för bekvämlighet. Men i högteknologiska och hög hastighet militära och rymdprogramansökningar, det minsta problemet kan förstoras till katastrof. Den 4 juni 1996 forskare beredda att lansera en obemannad Ariane 5-raketen. Det bar vetenskapliga satelliter utformade att fastställa exakt hur Jordens magnetfält samverkar med solvinden. Raketen byggdes för Europeiska rymdorganisationen och lyfte från sin anläggning vid kusten i Franska Guyana. -Och Ca 30 sekunder in flygningen, de första märkt något gick fel. Att munstyckena var svängbara på ett sätt som de borde verkligen inte. Runt 40 sekunder in i flygningen, klart fordonet var i trubbel, och det är när de gjorde beslutet att förstöra den. En Range säkerhetsansvarige med enorma tarmar tryckte på knappen, sprängde raketen innan det kunde bli en fara för den allmänna säkerheten. -detta Var jungfrun resan av Ariane 5, och dess förstörelse tog placera beror på ett fel inbäddad i raketens mjukvara. -Den Problem på Ariane var att det var ett tal som krävs 64 bitar för att uttrycka, och han ville konvertera den till ett 16 bitars nummer. De antas att antalet var aldrig kommer att bli mycket stor, att de flesta av dessa siffror i 64 bitars numret var 0: or. De hade fel. -Den Oförmåga en mjukvaruprogram för att acceptera den typ av nummer som genereras av en annan var vid roten av misslyckande. Mjukvaruutveckling hade blivit en mycket kostsam del av ny teknik. Ariane 4 raketen hade varit mycket framgångsrik, så mycket av mjukvaran skapas för det var också används på Ariane 5. -Den Grundläggande problem var att Ariane 5 var snabbare, accelereras snabbare. Och programvaran inte hade stod för det. -Den Förstörelse av raketen var en mycket stor ekonomisk katastrof, allt på grund av en minut programfel. Men detta var inte den första tidsproblem omvandlingsdata hade plågat modern raketteknik. -I 1991 med start av det första Gulfkriget, Patriot missil upplevt liknande slag av antalet konvertering problem. Som ett resultat, 28 personer, 28 amerikanska soldater dödades och omkring 100 andra skadades, när Patriot, som var tänkt för att skydda mot inkommande Scuds, misslyckades med att avfyra en missil. -När Irak invaderade Kuwait och Amerika lanserade Desert Storm i början av 1991, Patriot missil batterier utplacerades att skydda Saudiarabien och Israel från irakiska Scud missilattacker. The Patriot är en amerikansk, medium-range surface-to-air-system tillverkad av Raytheon företaget. -Den Storlek Patriot jaktplan, själv, handlar om, ungefär 20 fot lång. Och den väger ungefär 2000 pounds. Och det bär en stridsspets med about-- Jag tror att det är ungefär 150 pounds. Och stridsspetsen, sig själv, är en sprängämne, som har fragment runt den. Höljet av stridsspetsen är utformad för att agera som hagel. -The Missiler är transporteras, 4 per container, och transporteras av en påhängsvagn. -Den Patriot anti missilsystem går tillbaka åtminstone 20 år nu. Den var ursprungligen avsedd som en luftvärnsroboten att skjuta ner fientliga flygplan. I det första Gulfkriget, när detta krig kom, armén ville använda det till skjuta ner Scuds, inte flygplan. Den irakiska Force var inte så mycket av ett problem, men armén var orolig Scuds. Och så försökte de att uppgradera Patriot. -Intercepting En fiende missil reser på mach fem skulle bli utmanande nog. Men när Patriot var rusade i bruk, armén var inte medveten om en Iraks modifiering som gjort deras Scuds nästan omöjligt att slå. -Vad Hände, är Scuds som kom in, var instabila, de vinglar. Anledningen till detta, var irakierna, för att få 600 kilometer av en 300 kilometer missiler, tog vikt ut ur den främre stridsspets och gjorde stridsspetsen lättare. Så nu, Patriot s försöker komma vid scud, och för det mesta, den överväldigande majoriteten av tid, skulle det bara flyga genom scud. -När Patriotsystemansvariga insåg Patriot missade sitt mål, De detonerade Patriot stridsspets, att undvika eventuella förluster om det fick falla till marken. -Det Var vad de flesta människor såg, de stora eldklot på himlen, och missförstås som avlyssningar av Scud stridsspetsar. Även om i det natten himmel, verkade patrioter vara framgångsrikt förstöra Scuds på Dhahran, det kan finnas några misstag om dess prestanda. Där Patriot radarsystem förlorade spår av en inkommande Scud, och aldrig lanserats, på grund av en programvara fel. Det var israelerna som först upptäckte att ju längre systemet var på, desto större tidsavvikelse blev, på grund av att en klocka inbäddad i systemets dator. -Om 2 veckor före tragedin i Dhahran, israelerna rapporteras till Försvarsdepartementet, att systemet var att förlora tid, att efter ca 8 timmars drift, de märkte att systemet var blir märkbart mindre exakt. Försvarsdepartementet svarade med berättar alla Patriot batterierna att inte lämna systemen på under en längre tid. De sa aldrig vad en lång tid var. 8 timmar? 10 timmar? 1000 timmar? Ingen visste. -The Patriot batteri stationerade vid barackerna på Dhahran, och dess bristfälliga interna klocka, hade varit på över 100 timmar på natten 25 februari. -Det Spårade tid med en noggrannhet av omkring 1/10 av en sekund. Nu 1/10 av en sekund är ett intressant läge eftersom det inte kan vara uttryckt i binär, exakt. Vilket innebär, det kan inte uttryckas, exakt, i varje modern digital dator. Det är svårt att tro, men använda detta som ett exempel. Låt oss ta nummer, 1/3. 1/3 kan inte uttryckas i decimal, exakt. 1/3 är 0,333 pågått i oändlighet. Det finns inget sätt att göra det, med absolut noggrannhet, i decimal. Det är precis samma sorts problem som hände i Patriot. Ju längre systemet sprang, den värre tidsfelet blev. -Efter 100 timmars drift, felet Tiden var endast omkring 1/3 av en sekund. Men när det gäller att rikta en missil färdas i mach 5, Det resulterade i en spårning fel på över 600 meter. Det skulle vara ett allvarligt fel för soldaterna på Dhahran. -Vad Hände, är en Scud lansering var detekteras genom tidig varning satelliter, och de nya att Scud var kommer i deras allmänna riktning. De visste inte var det var på väg. -Det Var nu upp till radarn del av Patriot-systemet, försvara Dhahran, för att lokalisera och hålla koll på inkommande fientliga missiler. -Den Radarn var mycket smart. Det skulle faktiskt spåra positionen för Scud och sedan förutsäga var det förmodligen skulle vara, nästa gång, den radar skickade en puls ut. Det kallades avståndsgrinden. -Då, När Patriot beslutar tillräckligt med tid har passerade att gå tillbaka och kontrollera nästa plats för detta detekterade objektet, den går tillbaka. Så när det gick tillbaka till fel plats, då ser det inget objekt och beslutar att det inte fanns någon objekt, var det en falsk detektering, och droppar spåret. Den tillträdande Scud försvann från radarskärmen, och sekunder senare, det smällde in i barackerna. Den Scud dödade 28 och var den sista en sköt under det första Gulfkriget. Tragiskt nog, den uppdaterade programvaran anlände till Dhahran följande dag. Mjukvaran fel hade varit fast, stängning ett kapitel i den oroliga historia Patriot missil. [END SPELA] DAVID J MALAN: Så vi tar en titt på några liknande begränsningar i bara lite. Men först, låt oss Övergången till ett fåtal är FYI. Så en-- den här helgen, det kommer att vara super sektioner, vilka är tänkta att ersätta regelbundna sektioner, som startar en vecka därmed. Ta en titt på CS50 hemsida För mer information om dessa. De kommer också att filmas och streamas leva för dem som inte kan närvara. Problem set 1 är på kursens hemsida redan, och vi tar en titt på att bara en liten bit. Och kontorstid också, tar placera denna måndag till torsdag. Så det här var den mest kanoniska program vi tittade på förra gången. Det är som det enklaste program som du kan skriva in C, och även det är lite av ett djärvt påstående. Höger? Eftersom det finns en hel del sken komplexitet till detta. Så låt oss ta en snabb titt på vad några av dessa element var och sedan försöka ge en mental modell för hur dessa enklaste av program arbete, och sedan kommer vi att börja tittar på saker allt mer komplexa. Så här linjen här, betonade nu, i gult, vad gjorde vi säga, förra gången, att detta gör för oss? Vad är syftet det tjänar? Vem som helst från längre bak? Yeah. Publikmedlem: [OHÖRBAR] DAVID J MALAN: Good. Så det ger dig tillgång på kommandon, eller låt oss kalla dem funktioner, att någon annan skrev, som deklareras, så att säga, i någon annan fil. Så vi får se exakt vad en .h fil är kontra en .c fil, så småningom. Men för nu, vet bara att printf, till exempel, är bland de funktioner som har deklareras i någon annan fil, någonstans annat på molnet hårddisk som tillåter oss att få tillgång till printf och använda den utan att behöva uppfinna som hjulet själva. Samtidigt viktigaste. Vad var analog av huvud förra veckan? Yeah. Publikmedlem: Grön flagg klickas. DAVID J MALAN: Ja. Scratch-talet, då grön flagg klickade. Det är som pusselbiten som sparkar saker. Och så samma sätt gjorde världen beslutade för några år sedan att i C, och ett gäng andra språk, Om du vill skriva ett program, din första funktion har att kallas, viktigaste. Och det måste se ut så här. Men vi kommer tillbaka, en annan tid, vad, int, och, tomrum, innebär i detta sammanhang. För nu, klammerparenteserna är vänliga av som Scratch pussel lappar form som kapslar in ett visst antal linjer. Och bland på linjerna Här är det en här. printf är en funktion vars syfte i livet är att skriva ut en formaterad sträng. Och formaterad, menar jag att du kan koppla in platshållarvärden, och du kan ange hur många decimaler punkter, hur många nummer som ska skrivas ut efter en decimalpunkt och liknande. Och printf, naturligtvis, tar en eller flera argument eller parametrar, annars känd, enklare, som insignaler. Så printf, liksom en hel del funktioner, tar ingångar. Och de ingångar omfamnade av de två parenteser här. Och insida i dem är en ingång. Det är en sträng, som vi har kallat det, vilket är bara en följd av tecken, som ett ord eller en fras, eller en hel uppsats även i mellan citattecken. Och det är vad som kommer att påverka beteende printf därför att, naturligtvis, det är bara en generisk utskriftsfunktion. Det kommer inte att veta vad att skriva ut, såvida du inte berätta det. Och sedan, några minutiae. Vad vi säger denna konstiga sekvens av symboler är? Yeah. Publikmedlem: Ny rad. DAVID J MALAN: Ny rad. Så visar det sig, du kan inte bara slå, ange när du skriver programmet. I allmänhet är kompilatorn kommer att få lite förvirrad om vad du menar. Snarare måste du bokstavligen säga, ge mig en ny linje här. Och så / n är vad vi i allmänhet ringa ett avbrottstecken. Så n för ny rad. Och kompilatorn vet att när det ser / n, Det borde egentligen framkalla datorn, slutligen, eller printf, i detta fall, att skriva ut en verklig ny linje, som att slå av, komma in, tangent på tangentbordet. Och slutligen, vad gjorde vi säger denna bit av syntaxen är till för? Vad betyder representerar? Yeah. Publikmedlem: [OHÖRBAR] DAVID J MALAN: Det är bara slutet av raden. Det är slutet av meddelandet. Och inse att vi inte sätta dem överallt. Vi verkligen inte sätta dem vid ändarna av varje rad. Till exempel finns det ingen på första raden, det finns ingen på linjen med huvudsakligt, det finns ingen efter klammerparenteserna, men du kommer att börja se och få bekant med där det kallas för. Och det är nästan alltid efter en funktion ring eller ett uttalande, några åtgärder att du faktiskt tar. Och vet nu, särskilt om bland de mindre bekväma, det är dessa typer av dumma saker att du kommer att hamna misstag näven huvudet mot väggen över. Eftersom du kommer att vara logiskt säker på vissa problem du har löst ett problem set, och skit bara kommer inte sammanställa eller ens köra. Och så ofta, tidigt på, det kommer att bero på att du missat en parentes, eller om du missat ett semikolon. Och så bara vara uppmärksam av dessa typer av saker, och försöka att inte bli frustrerad av dem eftersom mycket snabbt gör detta blir gamla hatt. Men det är mycket lätt att få frustrerad tidigt som ett resultat. Så nu, låt oss ta en titt på hur denna linje är faktiskt arbetar och sedan titta på en något mer komplicerat ett. Så vi har här, den förmåga att dra på den här skärmen. Och låt oss anta att detta är min datorskärm, men jag skriver, hello programmet, och jag har inte genomförts, printf. Någon annan har genomfört, printf. Vem skulle vilja göra anspråk på att har genomfört, printf? Om vi ​​får? Okej, vad heter du? STUDENT 1: [? Copal. ?] DAVID J MALAN: Copal, kom upp. Kom upp. Okej. Så vi har här, vissa namnbrickor, eftersom vi kommer att göra ett litet spel på detta. Och vi kommer att ringa dig, printf. Och om du vill komma hit, vad jag har precis dragit på skärmen, Det är helt enkelt, det är jag, det här. Okej, så, hälsningen mitt känt är, printf, om du vill lägga det på. Okej. Och om du kan gå monter genom datorskärmen som om du är den funktion som kom med denna datorsystem. Och ditt syfte i livet är att faktiskt skriva ut något. Men likt det program som vi bara hade på skärmen, här, vi kommer att behöva faktiskt ge dig lite input. Och så, om min ingång, här är uppenbarligen, vad ledes till printf, låt oss slags mock upp så här. Jag kommer att bokstavligen skriva på en bit papper, "hallå, världen" backslash N. Och för att vara tydlig, vad Jag har just dragit på detta papper, ser ut så här. Så när jag kör det här programmet, och detta gul kodrad blir avrättade, det är som om jag, hello programmet, jag lämna några igenkänning till en funktion att någon annan skrev. Och om du, med fingret, kunde faktiskt, med fingret, rita på skärmen oavsett det är du har överlämnats, effekten, i slutändan, är att se just det, på skärmen. Och ett litet hörn fallet här. Och bra, bör vi inte se den, nya linjen, på denna punkt. Det vore fel för dig uttryckligen dra nyrad. Men om vi höll skriva ord på skärm, skulle de hamna under den. Så tack så mycket, men stick för bara ett ögonblick runt här. Vi behöver nu en annan volontär, om vi kunde, det kommer att behöva spela rollen of-- Det är bara personer i orkestern just nu. Hur about-- OK. Precis här. Kom upp. Vad heter du? STUDENT 2: [? Ivay. ?] DAVID J MALAN: Förlåt? STUDENT 2: [? Ivay. ?] DAVID J MALAN: Ethan, kom upp. Nej? Fick jag att fel, även efter att du sa det två gånger? Kom upp. Det är svårt att höra upp här. OK. Och jag är ledsen, vad heter du? STUDENT 2: [? Ivay. ?] [? David J MALAN: Ivay. ?] OK. För nu, om du inte sinne, du getString. STUDENT 2: OK. Häftigt. DAVID J MALAN: Så om du vill att stå här bara ett ögonblick, låt oss ta en titt på en något mer komplexa program, som har nu tre rader kod. Så vi har en, ange ditt namn med hjälp av printf; två, ett samtal till getString, följt av ett uppdrag till en variabel kallas, sträng s, eller kallas s; och sedan ytterligare ett samtal till printf, men denna gång med två ingångar. Så vi har redan gjort tillstånd ditt namn, eller snarare, vi har redan gjort en printf samtal. Så jag ska skriva, Ange ditt namn. Och så, vad jag ska passera, printf, på bara ett ögonblick, är helt enkelt detta. Så om du vill gå vidare och dra denna på skärmen, det är din input nu. Okej. Och glöm sträng, vi nu har vår egen kodrad här. Så, getString, vi behöver att faktiskt ringa, getString. Så ditt syfte i livet är att bara gå ut i orkestern, om du kunde, och få någons namn. Men låt oss ge dig något att sätta på den. Om du vill gå framåt och få en sträng, få någons namn på det papper, om du kunde. Okej. Och vi får se, på bara ett ögonblick, vars namn vi får. Samtidigt vad jag ska har redo, är ett tomt av papper, där, jag kommer att lagra vad värde det är att getString återvänder till mig, Jag, som är en strängvariabel kallas, s. Okej. Så vad har du här? Nik. Okej. Så vi har Nik namn här. Så det här är vad bokstavligen har återvänt till mig, så att säga, av getString. Jag, nu tänker exekvera vänster sida av detta uttryck, där jag helt enkelt kopiera ner, för dagens ändamål, Nik. Så nu har jag en variabel kallas, s, lagring Nik namn. Jag har redan överlämnades till printf, en tidigare argumentet. Men i vår tredje och sista raden i kod, jag har faktiskt till hands printf något lite different-- "Hej,% s" backslash n. Och så den sista raden jag kommer att send-- det sista jag kommer att skriva ned nu, är detta. Så de två rader kod, eller snarare den sista raden i koden, Parlamentet efterlyser två inputs-- en, detta och två, redan. Så om vår printf funktion kan nu ta dessa som indata, Låt mig rensa skärmen för dig. Egentligen nej, kan du gå vidare. Vi lämnar det upp, eftersom det är på samma program. Vi bör se, hej, Nik. Okej. Så detta var en hel del hoops att hoppa igenom, bara att skriva, ange ditt namn, och hej, Nik. Men denna enkla idé av meddelande passerar, för ingående passerar och utgångsmottagande, är exakt den modell som vi kommer att ha för även de mest komplexa funktioner. Så tack så mycket för er båda. Vi har en härlig spänning boll för dig här. Och tack till vår getString och printf frivilliga likadana. Tack. Okej. Tack till er båda. Så vi har pratat om hittills mest om strängar. Och det visar sig att C kan faktiskt förstå några olika datatyper. I själva verket, låt oss ta en titt på dessa här. Så C, och en hel del språk, förstå saker som kallas tecken. En röding är i allmänhet en enda byte, eller åtta bitar. Och den representerar ett enda tecken, som bokstaven A eller kapitalet bokstaven A, eller liten bokstav En eller ett utropstecken, eller tecken som du kan skriva på tangentbordet, och ibland ännu mer. Vi råkar också se flottar. En flottör är, i allmänhet, en 32-bitars värde, eller fyra byte eftersom igen, är ett byte åtta bitar. Så en flottör är ett flyttalsvärde, något med ett decimalkomma. Och faktiskt, är vad som filmen talade om när de talade om flytande punkt värden, vissa fast antal bitar används för att representera ett reellt tal. Men det finns också saker som kallas dubbel. Dessa finns i Java, Om du har tagit APC och en dubbel, som namnet lyckligtvis antyder är dubbelt så stor som ett flöte. Det är fortfarande ett reellt tal, det bara har fler bitar med som att vara allt mer exakt, eller för att lagra ännu större antal. int är lätt. Vi pratade om det förra gången. Det är bara ett heltal. Och det är i allmänhet 32 bitar eller fyra byte. Och så, om du har, låt oss se nu, 32 bits-- och vi gjorde detta under vecka 0, någonsin så briefly-- om du har 32 bitar, vad är det största nummer Du kan representera som ett heltal? Ge eller ta? Det är som 4 miljarder, och det är bara om vi är representerar bara positiva tal. Om du har 32 bitar, och du vill representera negativa tal samt, ert sortiment är i huvudsak negativ 2000000000 till positiv 2 miljarder. Men generellt, börjar vi vid 0 gå upp till 4 miljarder. Du behöver inte veta exakt, men Vi kan se detta i själva verket, om jag bara öppna upp en liten miniräknare, här. Jag kan göra två 32, och det är precis hur stor, hur många värden som du kan representera, med 32 bitar. Och det är ungefär 4 miljarder. Så vi kommer att fortsätta att träffa det numret i några olika platser. Men om du behöver längre siffror än så, det visar sig att det finns något som kallas en lång lång. Och en lång lång är i allmänhet 64 bitar, som betyder att det är en storleksordning ännu större än en int. Så jag kan inte ens uttala största nummer som du kan representera, men det är betydligt större. Nu som en sidoreplik, historiskt, om en int är 32 bitar, och en lång lång är 64 bitar, hur stor är en lång, inte en lång tid? Man skulle kunna tro att det är längre än en int men kanske mindre lång än en lång lång, men det beror faktiskt. Och så visar det sig en av frustration också, med att skriva kod på vissa system, är att inte alla dessa datatyper har förutbestämda värden. Ibland är det så många bitar. Ibland är det så många bitar. Så att du faktiskt måste veta, ibland, vilken maskinvara du kör din programvara på. Tack och lov, andra språk och andra datatyper som nu finns, tillåter dig att vara mer exakt. Tja, vi såg sträng, och vi såg bool också, men det visar sig de kommer endast med CS50 biblioteket. Så de inte byggs till C. De istället, kommer i den filen som heter CS50.h, att vi kommer så småningom skal tillbaka lager av. Men nu, de är bara ytterligare datatyper. En bool är en sann eller falsk, och en sträng är en sekvens av tecken, som ett ord. Nu printf, vi har sett, har platshållare, är% s en. Och du kanske kan, nu, dra slutsatsen från de här andra exempel, hur du kan ha en platshållare för olika datatyper. Till exempel, ta en gissning, om du ville skriva ut en enda röding med hjälp av printf är platshållare troligen% c. Och om du vill skriva ut ett heltal med platshållare,% i. % lld är en lång lång decimalvärde, men lång lång, så som avbildas till det. Och sedan% f för flytande punktvärde eller för en dubbel, så ibland de är återanvänds i olika sammanhang. Så vi får se och använda några av dem med tiden. Och printf och andra funktioner också stöd andras escape-sekvenser, och ibland, dessa är nödvändiga. Så snedstreck n är en ny rad. Bakstreck t, gör någon vill ta en stab? Publiken: Tab. DAVID J MALAN: Tab. Så om du verkligen vill att skriva ut en flik, inte ett fast antal platser utan en faktisk tabbtecken, behöver du inte träffar din, fliken, tangent på tangentbordet, i allmänhet, du faktiskt göra bakstreck t. Snedstreck dubbla citattecken, varför skulle jag någonsin vill det? Höger? Varför kan jag inte bara skriva en dubbla citattecken på tangentbordet? Publiken: Jo, annars är det kommer att tro att det är slutet av vilja utskrifts [? text. ?] DAVID J MALAN: Exakt. Kom ihåg, med vår printf exempel, när vi passerar till printf i indata, till vänster om den indatasträngen och till höger om ingången fjäder, naturligtvis, var en dubbel citat. Om din egen insats har en dubbel citat i mitten av det, datorn kanske potentiellt blir förvirrade, att, gör denna dubbla citat hör hemma i mitten? Är det hör ihop med den vänstra? Är det hör ihop med den rätta? Och så, om du vill göra det super klart, gör du omvänt snedstreck dubbla citattecken, så att det är flydde, så att säga, och det är inte conflated för något annat. Och det finns några andra här, bakstreck r, enkla citationstecken, 0, att vi kan se över tid, liksom. Och nu, vad om funktioner? Så åtgärder som vi kan vidta hittills på detta språk, C, ja, vi har sett, printf, naturligtvis, och alla av andra på skärmen, här, att vi kommer att använda för kursens första veckorna bara, komma när CS50 biblioteket. Och de gör det mycket lättare, i C, att faktiskt få användarens input. Det visar sig att i C, och uppriktigt sagt i några språk, Det är en verklig smärta i nacken att göra något enkelt, som uppmanar användaren för tangentbord, för hans eller hennes ingång. Och så dessa funktioner gör det lättare. Och det har också fel kontroll hela, så att, när man minns onsdagen vi såg, försöka igen, varning, när jag inte samarbetade, och jag skrev ett ord, i stället för ett nummer? Vi har gjort grovjobbet tidigt på att se till att användaren samverkar. Men dessa är bara träning hjul som vi kommer så småningom, och snabbt, ta bort. Så för att återblick, då, låt oss ta en snabb titt, mycket som vi gjorde med Scratch, vid vissa kanoniska konstruktioner i C. Detta är tänkt att sortera av, vara en virvelvind tur, bara så att du har en referens och när du har sett saker först. Men då kommer vi att titta på själva kodningen använda en del av dessa byggstenar. Så mycket som i Scratch, när vi hade uttalanden vill, säger eller vänta i C, har vi funktioner samt, som printf. Om vi ​​vill uttrycka ett tillstånd i C, är det liknande, i anden, till den pusselbit som såg ut så här i Scratch. Men i stället, vi bokstavligen bara skriva om. Och sedan, inom parentes, vi sätter ett villkor, där detta villkor är vad vi ska samtal, återigen, ett boolskt uttryck. Och återigen, är denna typ av pseudokod. Och i själva verket är // en kommentar. Det är bara engelska ord till mig själv. Men detta är den allmänna strukturen av en, om tillstånd. Men vi får se konkreta exempel på bara ett ögonblick. Om du vill ha en två-vägs gaffel i vägen, mycket som vi gjorde med vår volontär på Onsdag, kan du ha en, annars om. Och om du vill ha en tredje och sista villkoret, eller standardsituation, du kan ha bara en annan block där. Och på samma sätt, med booleska uttryck, du kan, och dem tillsammans. Och vi såg på onsdagen, att Det finns inte en enda et-tecken, Det är två, för lägre nivå skäl som vi så småningom kommer att se och spela med. Eller-ing saker tillsammans är 2 vertikala streck. På ett amerikanskt tangentbord, detta är i allmänhet en nyckel med skifttangenten ovan din Enter eller Retur-tangenten. Sedan finns dessa saker som Vi kommer att använda kanske en eller två gånger. De är funktionellt ekvivalenta med vad du kan göra med en, om, annars om, annars om annat, konstruera, men de kallas en omkopplare. De ser väldigt annorlunda, men vi ska se i några av våra distributionskoden, för en framtida problem set, mest troligt, att det ibland bara en snyggare sätt att uttrycka en helhet gäng villkor utan att ha en hel del klammerparentes och en hel del parenteser och indrag. Men de ger oss mer makt än vi redan har. Och nu loopar. Och den här, kommer vi att titta vid en något långsammare. Men då ska vi börja använda dessa, särskilt för dem som redan känner till. Detta är den kanoniska sätt, om oerhört svårbegripliga sätt att skriva en slinga i C. Nu en slinga i Scratch var ganska enkelt. Du har en, för evigt, block. Du har en, upprepa, block med bara ett nummer som du måste skriva in. Och med den, för loop, kan du genomföra båda dessa idéer, men det är lite mer teknisk. Men ärligt talat, det är också relativt enkel. När du vet ordning operationer, du bokstavligen bara ska koppla in värden och tala om för datorn vad de ska göra. Så här är ett exempel. Detta är en slinga som, ganska enkelt, räknar från ett antal upp genom en annan. Och bara genom att ögna på det, även om du har ingen tidigare erfarenhet av detta språk, vilket nummer inte nog börja det räkna på? OK, 0. Och jag gissar att det är därför du se att det finns en int och en i, som är en variabel. Det initieras till 0. Och senare, ser det ut som vi passerar printf, ett värde. Och i själva verket gjorde jag en liten stavfel här. Men det är lätt fast. Låt mig tillägga i, jag här. Vi har nu printf varelse passerat den platshållare värde. Och vad som kommer att räkna upp genom? PUBLIK: 50. 50. 49. David J MALAN: 49. Så 50, vid första anblicken, verkar rätt. Men att det visar sig, kommer att bli vår förutsättning att vi hålla kontroll. Och vi kommer att sluta en gång Jag är inte längre är mindre än 50. Så denna slinga, Omvänt bör exekvera, så länge som i är mindre än 50. Men så fort det blir 50 eller 51, eller ännu värre, bör det stannar automatiskt. Okej. Så vad händer egentligen här? Så det här är i storleksordningen operationer för en slinga. En, har du s.k. initiering. Denna gula markerade bit av koden exekveras först, och det har den effekten att per Onsdag, ni föreställa er förmodligen. Det skapar en variabel som heter i och det butiker i den variabeln värdet 0. Så jag är 0 vid denna tidpunkt i historien. Nästa sak som händer i detta konstrukt, är att villkoret blir kontrolleras. Så jag kolla omedelbart, är jag mindre än 50? Och naturligtvis, svaret för nu är säkert, ja. Ja, eftersom jag är 0, och det är säkert mindre än 50. Sedan vad som händer, är att detta kodrad blir exekveras. Och faktiskt, om det finns flera kodrader i dessa klammerparenteser, de alla får exekveras en efter en. Och i effekten här är tydligen, att skriva ut numret i, som kommer att vara 0, och sedan 1 och sedan 2. Men varför? Varför det blir ökas? Tja, den fjärde sak som händer är att denna syntax blir verk efter semikolon. i ++ är ett stenografi sätt att säga; ta värdet av i, och tillsätt 1 till den; och sedan nästa gång omkring, tillfogar En till den; och nästa gång, lägg 1 till den. Så om vi hålla, vad som kommer att hända Nästa är att jag inte tänker initiera jag någonsin igen. Om jag höll initiering Jag till 0, detta exempel skulle aldrig sluta på grund Jag skulle vara fastnat på 0. Men vad som kommer att hända är att villkoret kommer att kontrolleras, kodraden kommer att få utföras, det jag kommer att ökas, villkor kommer att kontrolleras, kod kommer att få exekveras. Och det hålls cykling igen, och igen, och igen, tills jag ++ inducerar ett värde av 50. Villkoret säger då, är 50 mindre än 50? Svaret är naturligtvis nej, och så hela koden slutar att köra. Och om du har mer kod på skärmen nere, det är vad som händer härnäst. Det poppar ut ur dessa klammerparenteserna och fortsätter att skriva ut mer efter det. Så ett skämt nu, från foxtrot, att du kanske nu förstår. Det är alltid roligt. Det är som chuckles slags tränga, och sedan du inser att du inte bör vara skratta åt humor så här. Men det finns vissa takeaway här, pedagogiskt, också. Så visar det sig att jag är saknar en bit av syntax, eller foxtrot s saknas en bit syntaxen här. Vad som saknas, som vi har haft i alla andra exempel, hittills? Retur är där, så det är något annat, att vi ska återkomma till inom kort. Vad som saknas, men? Yeah. Publiken: Den initiering av [OHÖRBAR]. David J MALAN: OK. Så ja. Så egentligen, är-- detta Tja, och räknevärdet initialiseras upp ovan, eller rättare sagt, förklarade upp ovan. Så det här är ett annat sätt att göra det. Men inte i ett led det gäller ändå. Vad sägs om här? Publiken: Är det klammerparenteserna? DAVID J MALAN: Ja. Så klammerparenteserna saknas. Men denna kod, menar jag, till heder, är faktiskt, syntaktiskt giltigt. Det visar sig, behöver du inte behöver klammerparenteserna om du bara har en kodrad som du vill köra insidan av slingan. Nu har vi alltid, i klassen och i alla våra distributionskoden, inkludera klammerparenteserna hur som helst, bara för tydlighetens skull. Men inser att i läroböcker och online exempel, Du kan mycket väl se lockigt hängslen saknas gång. Och det är OK, om vad du har indragna och avsedda är bara en enda rad kod, och inte flera rader kod, potentiellt. Okej. Så relaterad till frågan om vaghet är en fråga om överflöd, i den meningen att, på liknande sätt, har heltal har gränser för dem precis som flyttalsvärden? I världen en flyttals värderingar, kan vi bara vara så exakt, varefter, ibland dåliga saker kan hända, och våra program kan vara buggig och fel. Nu även med heltal, du kan stöta på problem. Nu ett heltal inte har en decimalkomma eller siffror efter den. Det är bara ett naturligt tal, typiskt. Så vad kan gå fel med en int? Om jag använder en int till räkna, vad kan gå fel? Verkar mycket enklare. Yeah. Publikmedlemmen: Om nummer får [OHÖRBAR] DAVID J MALAN: Ja. Vad händer om man räknar så högt, att du kan inte uttrycka det riktigt stora antal. Höger? Vid något tillfälle, du kommer överskrida gränserna av en 32-bitars värde, eller ett 64-bitars värde. Nu igen, jag är inte säker på hur man uttalar en 64-bitars värde, men jag vet med en 32-bitars heltal, det största värdet kan det vara, om det är enda positiva värden, är ungefär 4 miljarder. Så om jag försöker räkna till 5 miljarder, något som kommer att hända. Men låt oss se vad som i själva verket kan hända. I en värld av heltal överflöd, där du på sätt och vis, svämma kapaciteten hos en heltal, vad som kan hända? Så här är ett binärt tal, Det är en återgång till 0. Det är alla 1: or, och platshållare Det är befogenheter 2, så det är binärt. Så dessa är 8, 1 bitar på skärmen. Och om ni minns eller du snabbt och enkelt göra matten, vilket värde låter sig företrädas här med dessa åtta 1 bitar? 255. Och även om du inte var helt säker av matematik, kan du göra det. Eller du kan bara typ förnuftets genom det, vänta en minut, om jag representerar ett 8 bitars värde, och jag har 256 möjliga värden, men av vilka den första är 0, Jag vet bara att det största kommer att bli 255, och det är vad detta skulle kunna vara. Så antar att jag försöker lägga till en till detta värde. Vad skulle du göra i lönegrad skolan när du lägger till en 1, och det inte riktigt passar på grund du måste bära en? Vad är detta nummer går att bli när du lägger en? Det kommer att bli 0. Höger? För om du hade mer bits-- och jag ska försöka, typ av, skriver den ut här-- om vi hade fler bitar, vad vi kan göra här är att lägga till en, och då skulle vi få detta. Hoppsan. Vi skulle ha en en bit ända hit. Men om det är en ändlig värde, det är bara 8 bitar, och det är förutbestämda av datorn, att en i själva verket är inte där. Det faller bara typ av från en klippa. Och så om du lägger till 1-255, vad värde ni tydligen få? 0. Och så nummer misstag, och kanske oavsiktligt, sluta omslag runt så här. Så vad kan vara innebörden av detta? Tja, det finns ett par olika saker. Så man, det hamna ser som 0, oavsiktligt, men du kan typ av se, även i den verkliga världen, på gott och ont, manifestationer av denna idé om en gräns. Till exempel, någon av er som har någonsin spelat Lego Star Wars, Finns det någon som råkar veta det maximala antalet mynt kan du samla in Lego Star Wars? Ta en gissning baserad på dagens ledande frågor. Det är större än 256 eller 255. Det är 4 miljarder. Så visar det sig, och det finns vissa people-- några googling bekräftade förra night-- har fått 4 miljarder guldmynt, eller allt i Lego Star Wars. Skenbart, det finns ett sätt att lura spelet, det finns en bugg eller funktion låter dig att bara samla massor av poäng. Men den största möjliga värde, enligt denna skärmbild av någon jag hittat på nätet, är verkligen, 4 miljarder. Nu varför är det? Det är just 4 miljarder, förmodligen för att någon bestämde, som skrev det här spelet, att de kunde göra 4 miljarder, något, något, något, som det värde som jag satte upp med räknaren tidigare, men det är bara en lite renare för människor säga det maximala antalet av coins-- eller dubbar, som de kallar them-- att du kan samla är 4 miljarder. Och så, varför är detta? Hur är LEGO spelet genomförande räknaren som är att hålla reda på antal mynt du har? De använder vad? Publiken: Den stannar räkna efter 4 miljarder. DAVID J MALAN: Den stannar räkna efter 4 miljarder, vilket innebär att du kan sluta, som programmerare, att de är förmodligen med användning av en 32 bitars heltal. Liksom programmeraren bokstavligen bara maskinskriven, int, i hans eller hennes kod, och det är den typ av variabel som de använder för att lagra någon kod. Så det finns andra manifestationer av dessa typer av gränser. Så jag har inte spelat här game-- och jag läste upp på historien att bekräfta som much-- men i ursprungliga versionen av Civilization, där du uppenbarligen interagerar med varandra andra och kan föra krig eller ha fred, Gandhi var tänkt att vara en av de mest fridfulla tecken, som jag förstår det, i första version of Civilization. Och faktiskt, på en skala från 1 till 10, hans aggressivitet var bara en. Så någonsin så milt aggressiv, tydligen. Men någon gång, kan du tydligen installera demokrati i geografi. Och om du installerar demokrati i din version av spelet, då din aggressionsnivå går ner. Det är en bra sak. Människor är mer lugn tydligen, i den situationen. Men uppenbarligen gjorde någon inte ha en, om, tillstånd i den ursprungliga versionen av koden. Så Gandhis aggressionsnivå gick från positiva 1, minus 2, -1, men spelet inte förstå negativa tal. Så vad hände var Gandhis aggression nivå gick från 1 till 0 till -1, vilket fick till följd att omslag runt till vara den mest aggressiva karaktär i spelet, till ett värde av 255, på en skala från en till tio. Och sedan dess har det varit fler inkarnationer av detta spel, och de har hållit det som ett slags påskägg, att Gandhi är tydligen så fruktansvärt aggressiv. Men det var ett resultat av en mycket enkelt fel programmering att mycket tidig version av spelet. Nu mer oroväckande mer nyligen, Boeing 787 dokumenterades ha en bugg, inte den typ av enhet du särskilt vill ha en bugg. Och symptomen, att jag ska läsa här, från en artikel på nätet, var detta en modell 787 flygplan som har kontinuerligt kraftförsörjd för 248 dagar kan förlora alla växelström, AC, elkraft, på grund av generatorstyrenheterna, GCUs, samtidigt gå in Felsäkert läge. Så det här var en varning när problemet upptäcktes. Detta tillstånd orsakas av en mjukvaruräknare, interna för GCUs, så ett heltal eller en variabel, som kommer svämma över efter 248 dagars kontinuerlig effekt. Boeing är i färd med att utveckla en uppgradering GCU programvara som kommer att avhjälpa risksituationen. Så mycket som missilen scenario vari de hade någon form av rörlig som räknade, och räkna, och räkna, men så småningom överfulla gränserna för sin förmåga, liknande gjorde jävla flygplan ha en variabel spill efter tillräckligt med tid att köra. Och så tungan i kinden sätt att arbeta runt det här problemet är att verkligen, starta din plan varje 247 dagar, så att minnet blir torkas och variabeln går tillbaka till 0. Men inser, är detta en mycket stora inkarnation av programvara, men framför allt som vi hör om Apples operativsystem går in i bilar, och själv kör bilar från Google, och valfritt antal inkarnationer av programvara i våra dagliga liv, TV och klockor, och mer, inser var omgiven av programvara, alla som är skriven av oss människor. Och som vi kommer alla snart att upptäcka, det är mycket lätt och mycket typiskt att göra misstag när du skriver mjukvara. Och om du inte fånga dem, några dåliga saker kan hända. Nu ibland, vissa roliga saker kan hända, eller åtminstone ibland vi veta att förvänta sig vissa dålighet. Så 0 dividerat med 0, från årskurs skola, är i allmänhet en dålig sak. Det är odefinierad. Och det visar out-- och låt oss se om min mic kan plocka up-- att Apple hade lite kul med detta nyligen. Så jag har en iPhone här. Jag ska prata med Siri och be henne att ge mig svar på 0 dividerat med 0. Vad är 0 dividerat med 0? SIRI: Tänk dig att du har 0 cookies, och du dela upp dem jämnt bland 0 vänner. Hur många kakor gör varje person få? Ser ni? Det är inte vettigt. Och Cookie Monster är ledsen att det inte finns några cookies. Och du är ledsen att du har inga vänner. DAVID J MALAN: Det är typ av motbjudande. Så det här är vad som just sagt där. Det är obestämt, det är inte definierat, Och faktiskt, många programmeringsspråk eller, egentligen, kompilatorer kommer upptäcka när du i ett program, Försök att dela 0 av 0. Roligare än så här är dock som tydligen, Cookie Monster är på Twitter dessa dagar. Och han svarade på detta, med detta, vilket är helt bedårande. Men låt oss ta en snabb titt på ett par andra konstruktioner, och sedan lägga en del av detta kod att använda i bra sätt. Så visar det sig, förutom för loopar, det finns något som kallas en while-slinga, som ser annorlunda ut och genomförs lite differently-- och vi så småningom kommer att se examples-- men i någon mening, Det är enklare eftersom det inte tillåter dig att initiera och uppdateras inom gränsen av slingan. Du kan fortfarande genomföra det. Så du kan göra exakt samma saker med en while-slinga, som med en for-loop, men din syntax, ultimately-- som vi kommer så småningom see-- kommer att vara annorlunda. Det finns även en gör while-slinga, som är faktiskt lite annorlunda, i att medan en for-slinga och en while-slinga alltid kontrollera deras tillstånd först, om du läser det här uppifrån och ned, det slags ser ut som det kommer att kolla upp det tillstånd sista eftersom det är verkligen den sista raden i koden. Och faktiskt, det kommer att vara till nytta i vissa program som vi skriver, Om du vill bara blint göra något och så småningom kontrollera tillståndet. Det är inte nödvändigtvis en dålig sak. Om vi ​​vill variabler, kan vi göra den i ett par olika sätt. Och vi såg i foxtrot tecknad film, ett sätt att göra det, där du deklarerar din variabel, liknande int räknare semikolon, och sedan later-- kanske nästa line, kanske 10 rader later-- du faktiskt initiera det. Så dessa 2 kodrader deklarera en variabel av typen int och kallar det disk, så det ger mig tillräckligt många bitar för att hålla en int. Och sedan så småningom, uttrycker det värdet 0 till den variabeln. Det anordnar 0 s och 1 s i en mönster, som vi vet från förra veckan, representerar antalet vi känner som 0. Eller ärligt talat, kan du göra det mycket mer koncist, precis som detta. Nu har vi också möjligheten att ringa funktioner. Och i själva verket, här är en 2 rad programmet, eller ett utdrag därav, som tillåter oss att faktiskt skriva lite kod som får en sträng från user-- mycket som vår volontär en stund ago-- lagring av resultatet i en variabel som heter namn, och then-- mycket som med vår volontär med printf-- skriver ut dessa värden genom att i två argument, den sträng, följt av den variabla kallas, namn, själv. Så låt oss ta en titt, innan vi kommer tillbaka till Mario där, på ett par nu, exempel på detta. Jag kommer att gå vidare och öppna upp, låt oss säga, funktions 0.c. Och som alltid, är denna kod tillgänglig på kursens hemsida, så du kan spela tillsammans på hem och titta på det senare. Men här är programmet i sin huvudsak från linjen 17-22. Huvudprogrammet är där Programmet kommer alltid att starta. Detta program, tydligen går att skriva ut ditt namn, kolon. Det är sedan kommer att ringa getString, precis som vi gjorde med våra volontärer. Och då är det intressant, det kommer att ringa PrintName. Det visar sig, hela tiden, det verkar vara en funktion som kallas PrintName. Det skriver någons namn. Vi behövde inte använda printf från förr, det finns PrintName. Men det är vilseledande eftersom PrintName inte komma med C. Människor inte uppfinna det cirka 40 eller 50 år sedan, Jag gjorde i stället. Och faktiskt, om jag rullar ned ytterligare, märka hur jag kan skriva min egen funktioner i C. Vi ska så småningom förklara varför vi fortsätter att säga, tomrum, på ett par ställen, men för i dag, låt oss titta bara på namnet. På rad 24, om du vill skapa din egen funktion, du bokstavligen skriver namn på funktionen. Jag valde PrintName. Inom parentes, du ange vilken typ ingångar, och hur många du vill denna funktion för att ta. I det här fallet, jag vill ta 1 variabel kallad, namn, och det kommer att vara av typ, sträng, så det kommer att vara någon sekvens av tecken. Och sedan, detta program-- ungefär som i Scratch, du kan ha egna pussel pieces-- kommer att ha detta beställnings- beteende. Det kommer att kalla printf passerar, hej, platshållare, och sedan det kommer att ansluta oavsett i vilken användaren kallas. Så detta är ett exempel på vad datavetare skulle samtals abstraktion eller funktionella nedbrytning, som är bara tjusiga sätt av saying-- är om du gillar denna höga nivå idé, som jag vill ha funktioner som skriver någons namn, absolut du kan bokstavligen skriva printf och sedan passera i de argument som du vill, och programmet kommer att fungera, eftersom det har sedan onsdagen. Men du kan börja abstrakt bort begreppet skriva ut ett namn. Du kan ge den ett namn, liknande PrintName, och detta är denna idé om skiktning från vecka 0. Hädanefter, jag och du behöver inte veta eller bryr sig om hur PrintName genomförs. Ja det använder printf, kanske det inte, vem vet vad använder? Vem bryr sig? Nu jag talar här uppe, i stället för här nere. Och faktiskt, som våra program får mer avancerade och sofistikerade, vi kommer att fortsätta att ta för givet att lägre nivå pusselbitar finns. Eftersom vi skrev dem eller någon annan gjorde det, så som vi sedan kan bygga vidare på dem. Låt oss ta en titt på denna varianten, fungerar en. Så här är lite mer avancerad, men det visar sig att CS50 bibliotek, det finns bara en getInt funktion. Vi trodde inte att, år sedan, implementera en GetPositiveInt funktion. Och det är lite irriterande eftersom om ni skriver ett program där du vill få en positiv heltal från användaren, Du kan absolut använda getInt. Och du kan absolut kolla med tillståndet och kanske en slinga om det int är större än 0 och skrika åt användaren om han eller hon inte ger du ett positivt tal. Men låt oss bygga denna byggsten oss, a, anpassade Scratch pjäs, om ni så vill. Jag kommer att ha ett program här som i slutändan, jag vill kunna ringa GetPositiveInt, och jag vill vara kunna skriva ut vad det int är. Men detta abstraherat bort nu. Det är precis fått en hög nivå namn som säger vad den gör, vilket är underbart eftersom det är mycket intuitivt nu att läsa. Och om jag bryr vad som finns under huven, låt mig rulla nedåt. Och det är lite skrämmande i början, särskilt Om detta är ditt första programmet, men låt oss ta en titt. Jag säger inte längre, utan laga kraft, eftersom det visar sig funktioner ungefär som getString, kan returnera ett värde för mig. De har inte bara skriva ut till skärmen, de faktiskt kan lämna mig något tillbaka. Och medan tidigare PrintName, Jag behövde något tillbaka. Jag behövde bieffekt av något dyker upp på skärmen, men jag behövde inte en människa att ge mig något tillbaka. Här, med GetPositiveInt, liknande med getInt, Jag vill lämnas något tillbaka. Så jag säger inte, utan laga kraft, på ledningen 23, men int, som säger, denna funktion att jag skriver, kallas GetPositiveInt kommer att lämna mig tillbaka ett heltal, inte ingenting, inte ogiltiga. Samtidigt kommer det att ta några ingångar, så jag har, typ av vände det. Jag tänker inte ge GetPositiveInt någon input, vill jag att ge mig sin produktion. Och vad händer nu? Så här är hur jag kan deklarera en variabel. Jag har gjort det utanför slingan, av skäl som vi så småningom kommer att se, men detta ger bara mig 32 bitar kallas, n, och jag har för-bestämning dem för att lagra heltal. Och här är det, göra medan konstruktionen, och det är därför det är nyttigt. Bokstavligen gör detta, medan n är mindre än 1. Så låt oss se vad som händer. Jag skriver ut, vänligen ge mig en positiv int. Jag får då en int, användning av CS50: s fungera och lagras i n. Och då, vad kodrad förmodligen blir verk nästa logiskt? Vilken linje nummer? Ja, så 31. Du skulle inte veta det förrän du har fått höra eller sorts sluta det, men det är sant. Det går uppifrån och ned och sedan fortsätter att upprepa. Så om jag har skrivit i säga, antalet -1, är n mindre än -1? Yeah. Eftersom -1 är mindre än 1. Så vad ska hända? Jag kommer att göra detta medan n är mindre än 1, så jag kommer att gå tillbaka till linje 28. Och varje time-- och låt oss köra this-- gör funktion 1 att kompilera det, och nu dot slash funktion 1. Om jag skriver -1, är det kommer att hålla yelling på mig tills jag samarbetar eftersom varje mina ingångar är mindre än 1 och om det är, medan mindre än 1, Jag kommer att fortsätta att göra detta. Om jag äntligen ge det ett antal som 50, tack och lov, säger det, tack för 50. Varför? Eftersom så snart n inte är mindre än 1, jag slutar fastnar i denna slinga, och denna nya sökord i dag, avkastning, bokstavligen gör det. Så jag har bara genomförts i ett avkänning, motsvarande getString, där jag lämna tillbaka vem använder mig, visst värde. Det behöver inte vara en sträng, det är en int. Så ett enkelt, snabbt exempel, men vi ska snart se lite mer sofistikerade versioner fortfarande. I själva verket, låt oss ta en titt på en numerisk en, som kallas return.c. Och den här är faktiskt lite enklare. Så det här programmets syfte i life-- låt oss kompilera och köra den, så gör retur, dot snedstreck, return-- meddelande Programmet kuber helt enkelt värdet 2. Det är ganska dumt, är det svårt koden, tar det inte några insatsvaror, men det visar en annan funktion som jag har skrivit själv. Så här har jag förklarade en variabel, kallad x, av typen int, lika med antalet två, helt godtycklig. Detta är bara några fluffig utskrift. Det säger x är nu, sådana och sådan, cubing dot dot dot. Och magi är uppenbarligen i linje 21. Jag ringer en funktion som kallas, kub, Jag överlämnar det ett pappersark med nummer 2 skrivet på det, och vilket värde, matematiskt, vill jag få ut av det? Precis som en sanity check? 8. Höger? Jag vill 2 kubik tillbaka, 2 till makt 3, så 8 tillbaka. Så där kub genomförs? Tja, märker det genomförs här nere. Och precis som tidigare, logiskt, även om syntaxen är förmodligen mycket nytt för många av er, Jag vill ha den här funktionen att lämna mig tillbaka ett ark papper med en int på det. Så jag har en int, den Namnet är godtyckligt, men bekvämt kallas kub. Insignalen till det, är n från typ heltal, så det är hur jag kan gå i antalet 2 på ett pappersark. Och då visar det sig C stöder matematik, så att du inte har kryssen för tider, du bara använda en asterisk för multiplikation. Och detta åter n gånger n gånger n, vilket helt enkelt är en kubik värde. Så vart är vi på väg med allt detta? Detta är definitivt en virvlande tur, vara säker, att i super avsnitten och problem set 1, du kommer att gått igenom allt detta desto mer. Och problemet set 1, kommer vi övergången från den grafiska värld Scratch till något mer kommandorad i C. Men vi ska dra inspiration från detta här spelet från förr, varvid med C och standard upplagan av p set du genomföra Mario pyramid. Och i hacker upplagan av p set, om du så önskar att välja, du kommer att genomföra en lite mer utmanande pyramid med två toppar. Du kommer också att genomföra ett algoritm, en girig algoritm. Det visar sig att det finns några intressanta logik bakom processen för kör en bankväxel station och faktiskt lämna någon tillbaka förändring. Det är en algoritm som är ganska okomplicerad, att du kan även förstå intuitivt när du först läste det-- inse det är vad jag har alltid gjort någon gång jag har gett någon del pengar back-- som gör att du alltid minimera antalet papper anteckningar eller metallmynt att du lämna tillbaka till användaren. Och detta, naturligtvis, är övertygande eftersom om du går till CVS eller whatnot, du inte vill ska överlämnas en massa ettor eller en hel massa småpengar. Du vill ha den mest få mynt, förmodligen möjligt. Slutligen kommer du även ifrågasättas att plaska i världen av vatten och faktiskt få en uppskattning för en avbildning mellan strömningshastigheter, av vilja, vatten i en dusch, hur mycket vatten som används. Och anspelning däri, blir klippet här, som vi kommer att hamna på för bara 60 sekunder att målar upp en bild av låga flöden duschmunstycken. [VIDEOAVSPELNING] -Okej. Jag fick allt här. Jag fick Cyclone F-serien, Hydra, Jetflow, Stockholm Supersteam, you name it. -Och Vad rekommenderar ni? -Vad letar du efter? -Power Människa. Ström. -Som Silkwood. -Det Är för strålning. -Det är rätt. -Nu Vad är detta? -Det Är Commando 450. Jag säljer inte att en. -Men Det är vad vi vill ha. Det är en commando 450. -Nej Tro mig. Det är endast i cirkusen. Det är för elefanter. -Jag Betala något. -Vad Om Jerry? -Han Kunde inte hantera det. Han är känslig. Oh yeah. [END SPELA] DAVID J MALAN: Okej. Det är om för CS50. Vi ses nästa vecka. TALARE 1: [? Scully?], [? Ian,?] såvitt denna outro projekt, vad har ni kommit fram till? TALARE 2: Jo, vi har gett det en mängd tanke och vi anser att det bästa sättet att-- TALARE 3: Får jag? TALARE 2: Ja. Med alla medel, faktiskt. TALARE 3: Så jag tror Vi kan sammanfatta vår idé för outros med en word-- ingenting. DAVID J MALAN: Ingenting? TALARE 3: Ingenting. DAVID J MALAN: Vad betyder det? TALARE 3: outros är ingenting. TALARE 2: Tja, jag menar, i filosofi, Jag menar, är ingenting alltid något. TALARE 1: Så what's-- Vad är förutsättningen? TALARE 3: Så det är som livet. OK. Vad har du gjort idag? DAVID J MALAN: Jag fick upp, hade frukost, och kom att arbeta. TALARE 3: Det är ett outro. TALARE 2: Men, jag menar, borde inte något hända honom på the-- TALARE 3: Nej, nej, nej, nej. Ingenting händer. TALARE 1: Så varför är vi tittar på? TALARE 3: Eftersom Det är ett outro för CS50. DAVID J MALAN: Inte ännu.