[Musik Spela] DAVID J MALAN: Okej, välkommen tillbaka till CS50. Detta är början på vecka två. Ett ord från en av våra vänner på campus - om du är intresserad, eventuellt, antingen nu eller i någon framtida sikt ens, en gång mer bekväm, undervisning mittskolastudenter en lite något om datavetenskap, göra huvudet till denna URL. De är i särskilt behov just nu av lärare, särskilt om du har hade viss exponering mot datavetenskap. Så minns att förra gången, introducerade vi några datatyper i C, och du kanske har börjat få din händerna smutsiga med dessa hittills i problem som en. Och vi hade en röding. Så i något tekniska termer, vad är en röding som ni vet det idag? Så det är ett tecken, men låt oss vara mer exakt nu. Vad menar vi med karaktär eller enskilda röding? En icke-numerisk karaktär - så inte nödvändigtvis. Det visar sig att även tal, även skiljetecken och bokstäver är representerade med dessa data typ som är känd som en char. Så det är inte nödvändigtvis alfabetisk. Yeah? Så det är ett ASCII-tecken. Så om du tänker tillbaka på vecka noll, när Vi hade vårt byte av volontärer komma upp och antingen hålla sina händer upp eller inte allt stod de bitar. Men kollektivt som en grupp av åtta, de utgjorde ett byte. Och vi infört begreppet ASCII vid denna föreläsning, är som helt enkelt en mappning mellan siffror och bokstäver. Och ASCII-användningsområden, som dessa människor underförstådda, åtta bitar för att representera ett tecken. Så därför, om åtta bitar kan vart tar den ena av två värden - noll eller en - Det innebär att det fanns två möjligheter för denna person - noll eller en - två för den personen, två för detta person, två för detta. Så totalt två gånger två gånger två gånger två gånger två - så två den åttonde totalt. Så det finns ett totalt antal tecken 256 möjligt att du kan representera med åtta bitar. Nu, de av er som talar Asian språk kanske vet att det finns mer tecken i världen än bara När och B och Cs och Ds. Och faktiskt, inte räcker ASCII inte för många språk i världen. Men mer om det en annan gång. För nu, vet att i C om du vill att representera en bokstav, en bit av skiljetecken, eller bara något tecken i naturen, använder vi en röding. Och det är en byte eller åtta bitar. Vad sägs om en int? Tja, är en int ett heltal. Hur många bitar, om ni minns, var ett heltal typiskt? Någon minns? Så det är normalt 32. Det beror faktiskt på datorn som du använder. Men i apparaten, och i en hel del datorer, det är 32 bitar eller fyra bytes - åtta gånger fyra. Och ints bara används för att lagra siffror, antingen negativa, positiv eller noll. Och om du har 32 bitar och du bara bryr sig om positiva tal, kan någon ungefärlig hur många möjliga heltal en dator kan representera från noll på upp? Så det skulle vara två till 32, vilket är ungefär fyra miljarder. Så dessa befogenheter två kommer att vara återkommande teman i datavetenskap. Som vi ska se, de är ganska bekvämt att jobba med även om det inte är helt lätt att göra matten i ens huvud. Så vi ska säga ungefär fyra miljarder. Nu, en lång lång - du kan typ av gissning. Det är längre än en int. Hur många bitar? Så 64 bitar eller åtta byte. Det betyder bara att du kan representera ens större siffror, större positiv eller större negativa tal. Och hur flyta? Det är ett flyttal värde på 32 bitar. Detta är bara ett reellt tal, något med en decimal. Men om du behöver istället fler platser efter decimalkommat eller om du vill representera ett större antal med några fraktion efter det, kan du använda en dubbel, vilket är 64 bitar. Men det är en intressant takeaway här. Så om ints begränsas av 32 bitar och även långa longs begränsas av 64 bitar, den sortens väcker frågan, vad händer om du verkligen vill räkna högre än 4 miljarder för en int? Tja, använder du bara en lång lång. Men vad händer om du vill räkna högre än två till den 64: e, ge eller ta? Nu, det är ett stort antal. Men så småningom, kanske du faktiskt bryr sig om dessa typer av värderingar, speciellt om du använder en databas och börja samla massor och massor av uppgifter och tilldela unika nummer på varje exemplar av dessa uppgifter. Så vi har typ av ett problem. Och på samma sätt, med flyttal värden - flöten eller dubbel - Om du har bara ett ändligt antal bitar, hur många totala antalet kunde du möjligen representerar? Tja, det är mindre tydligt när man innebära ett decimalkomma. Men det är ju ändliga. Om du har ett ändligt antal bitar, ett ändligt antal människor, en ändlig antal glödlampor, säkert du kan endast representera ett ändligt antal flyttal. Men hur många reella tal är deras i världen? Det finns en oändlig. Så det är lite av ett problem eftersom vi inte har en oändlig mängd minne eller RAM inne i våra datorer. Så några utmanande saker kan hända. Så låt oss gå vidare och prova att uttrycka detta här. Låt mig gå vidare och öppna upp gedit. Jag ska gå vidare och spara en fil kallas "floats0.c" bara för att vara överensstämmelse med ett exempel som är tillgängliga på nätet, om du vill. Och jag ska gå vidare och definiera det som följer - Jag ska gå vidare och säga, int huvudsakliga tomrum, som vi ofta gör. Och sedan i detta program, kommer jag att förklarar mig en flottör, så en 32-bitars variabel kallas f, godtyckligt. Och då ska jag lagra i det Jag vet inte, en tiondel, så 0.1. Så jag ska uttrycka det som en dividerat med 10, vilket är helt legitimt i C. Och sedan på den andra raden, bara jag vill skriva ut det värdet. Så minns att vi kan använda det välbekanta printf. Vi vill inte att använda% i för en int. Vi vill använda% f för en flottör. Och sen ska jag göra backslash N, Stäng citat, kommatecken, f, semikolon. Så här är mitt program. Det finns redan en bugg. Har någon för vilken det klickade redan vill peka åtminstone en bugg som jag har gjort? Yeah? Yeah. Jag glömde "# include" på topp, symptom de som om jag försöker sammanställa detta kommer att vara att kompilatorn kommer att skrika på mig, säger odefinierad symbol eller något om detta. Det förstår inte något gillar printf. Så jag kommer att göra "# include ", Spara filen. Och nu är det i bättre form. Men jag kommer också att peka ut en ny detalj i dag. Förutom att ange plats innehavare som% f% i% s, kan du ibland påverka beteendet av den platshållare. Till exempel i fallet med en flytande poängvärde, om jag bara vill att visa en decimal efter period, kan jag göra egentligen 0.1F. Så med andra ord, separera jag f och procenttecknet med 0,1, bara träffande printf, kanske du har en hel massa siffror efter decimalkommat punkt för mig. Men jag vill bara se en av dem. Så jag ska gå vidare nu och spara detta program, gå in i min terminal fönster, och jag kommer att gå vidare och typ gör float 0 anger. Jag ser att något kryptiska linje som kommer att börja göra mer meningsfullt när vi retas isär denna och nästa vecka. Nu ska jag gå vidare och kör float noll. Och, fan. Så det finns en bugg här av någon anledning. Jag är ganska säker på att en tiondel, eller ett delat med 10, inte är 0,0. Kanske är jag bara inte ser vid tillräckligt många siffror. Så varför inte jag säga två .2 att se två decimaler i stället för bara en. Låt mig gå tillbaka till mitt terminalfönster här och slog upp ett par gånger för att se min historia. Gör flyta noll igen, och sedan upp igen. Och nu in. Och nu är jag ganska säker på att detta är fel. Och jag kunde göra tre och fyra, och jag är förmodligen kommer att fortsätta att se nollor. Så var är felet? Ett delat med 10 bör vara 0,1. Någon vill ta en stab på vad den grundläggande frågan är? Yeah? De är båda heltal. Så vad? Så med ett delat med 10, det är vad jag gör i aritmetik. Och jag får 0.1. Yeah. Och så är det faktiskt den frågan. När du tar ett heltal i en dator och du delar den med ett annat heltal, datorn som standard kommer att antar att du vill ha ett heltal. Problemet dock, naturligtvis, är att 0,1 inte är ett heltal. Det är ett reellt tal. Och så vad datorn gör genom standard är det bara kastar bort allt efter decimalkommat. Det avrunda inte ner eller upp i sig. Det kastar bara bort allt efter decimalkommat. Och nu som är vettigt. För nu är vi klart kvar med noll. Men vänta en minut. Jag ser en int noll. Jag faktiskt ser 0,00. Så hur gör förena jag detta nu? Om man delat med 10 är noll, men jag är se 0.00, är ​​där det blir omvandlas tillbaka till ett reellt tal? Yeah. Exakt. Så här uppe i linje fem, när jag faktiskt lagra den 0,1, som sedan trunkeras till noll, insidan av en flottör, det är faktiskt motsvarar lagra det inte som en int, men, faktiskt, som ett flöte. Dessutom, jag använder sedan printf till uttryckligen skriva det numret till två decimaler även om det kanske inte egentligen vara något. Så denna typ av suger, eller hur? Tydligen kan man inte göra matte, åtminstone inte på denna nivå precision, i en dator. Men säkert finns det en lösning. Vad är det enklaste fix kunde vi kanske göra, även bara intuitivt här lösa detta? Yeah? Vänd heltalen in - Yeah. Även om jag inte är helt säker på vad som är verkligen händer här, om det grunden har att göra med dessa båda är ints, ja, varför gör inte jag göra att 10,0, vilket gör detta 1.0, spara om den. Låt mig gå tillbaka till botten och kompilera om. Låt mig nu repris. Och där - Nu har jag fått min en tiondel representerade som 0,10. Okej. Så det är inte dåligt. Och låt mig påpeka ett annat sätt vi kunde ha löst detta. Låt mig faktiskt rulla tillbaka i tiden till när vi hade detta som en tionde nyss. Och låt mig gå vidare och spara om den här filen som ett annat filnamn, bara för att har en liten checkpoint. Så det var version ett. Och låt mig nu gå vidare och göra ytterligare en version. Vi kallar denna version två noll indexerat. Och jag ska istället göra detta - vet du vad? Lägga prick noll fungerar i det här fallet. Men antar att man var en variabel. Förmodade 10 var en variabel. Med andra ord, antar att jag inte kunde bara hårt-kod 0,0 vid slutet av denna aritmetiska uttryck. Tja, kan jag faktiskt göra något inom parentes kallas gjutning. Jag kan kasta som heltal 10 till en flottör, och jag kan kasta det heltal man till en flyta, liksom. Då matten som kommer att göras effektivt 1,0 delat med 10,0, vars resultat går if som tidigare. Så om jag kompilerar detta som gör flöten 2, och nu flyter 2, får jag samma svara, liksom. Så detta är en ganska krystat exempel att lösa detta problem genom att införa gjutning. Men i allmänhet, är gjutning kommer att bli en kraftfull sak, särskilt för problem som två i en veckas tid, då du vill konvertera en datatyp till en annan att i slutet av dagen är representerade på samma sätt. Vid slutet av dagen, varenda som vi har pratat om hittills är bara ints under huven. Eller om det är för låg nivå för dig, de är bara siffror under huven. Även tecken, igen, minns från vecka noll, är siffror under huven. Vilket vill säga, kan vi konvertera mellan olika typer av tal om de är bara bitar. Vi kan konvertera mellan siffror och märker om de är bara bitar, och vice versa. Och gjutning på detta sätt är en mekanism i programmering som gör att du med våld ändra en datatyp till en annan. Tyvärr är det inte så enkelt som jag skulle ha velat. Jag kommer att gå tillbaka till flöten 1, var som de enklare, mer okomplicerad med 0,0 lades till varje. Och precis som en snabb repetition, låt mig gå vidare och kompilera detta, gör flottörer 2 - Tyvärr är detta göra flottörer 1. Och nu ska vi köra flottörer 1. Och i botten, märker att jag får faktiskt 0,1. Så löste problemet. Men inte än. Nu ska jag bli lite nyfiken, och jag kommer att gå tillbaka till min printf uttalande och säga, vet du vad? Jag skulle vilja bekräfta att detta är verkligen en tiondel. Och jag kommer att vilja se detta till, säg, fem decimaler. Det är inte ett problem. Jag ändrar två till fem, Jag kompilerar med make. Jag kör det som flyter 1. Ser ganska bra. Min Sanity kontroller kan sluta där, men Jag börjar bli lite mer äventyrligt. Jag ska byta från 0,5 till 0,10. Jag vill se 10 siffror efter den decimal. Och jag ska gå vidare och kompilera detta och köra flyter 1. Jag slags ånger ha testat detta vidare eftersom min matte är inte så korrigera längre, verkar det. Men vänta lite, kanske det är bara en lyckträff. Kanske datorn agerar lite konstigt. Låt mig gå vidare och göra 20 decimaler och försäkra mig om att jag vet hur man gör matten. Jag vet hur man programmerar. Gör flottörer 1, kompilera, och fan. Det är verkligen, verkligen få långt från märket. Så vad händer här? Intuitivt, baserat på våra antaganden tidigare om storleken på datatyper, vad ska hända här under huven? Yeah? Exakt. Om du vill ha denna mycket precision, och som är ett fan av mycket av precision - 20 nummer efter decimalkommat. Du kan omöjligen utgöra en godtyckligt antal såvida du inte har en godtyckligt antal bitar. Men vi gör inte. För en flottör, har vi bara 32 bitar. Så om 32 bitar kan endast permuteras i ett sätt - precis som våra människor på, scen händerna upp eller ner - i ett ändligt antal sätt, det finns bara ett begränsat antal av reella tal kan representera med dessa bitar. Och så att datorn till slut kommer att behöva börjar slarva. Datorn kan dölja dessa uppgifter från oss för lite tid. Men om vi börjar peta på siffrorna och ser längre och längre vid släpande nummer i heltal, då vi börjar att se att det är faktiskt approximera tanken på en tiondel. Och så visar det sig, tragiskt, det finns ett oändligt antal siffror Vi kan inte representeras exakt i en dator, åtminstone med en ändlig antal bitar, en ändlig mängden RAM-minne. Nu tyvärr, detta ibland har verkliga konsekvenser. Om människor inte riktigt uppskattar detta eller typ av tar för givet att deras dator kommer bara göra det de säger att det ska göra och inte förstå dessa underliggande representation detaljer - som, uppriktigt sagt, i vissa språk är dolda för användaren, till skillnad från i C - några dåliga saker kan hända. Och vad jag trodde vi skulle göra är att ta ett steg tillbaka. Och det handlar om en åtta minuters video. Det luftade för några år sedan, och det ger insikter faktiskt vad kan gå fel när du underrepresenterade uppskatta dessa typer av detaljer i mycket alltför verkliga världen. Om vi ​​kunde dämpa belysningen under några minuter. Högtalare 1: Vi återvänder nu till teknik katastrofer på Modern Marvels. Datorer - vi har kommit allt för att acceptera ofta frustrerande problem att gå med dem. Buggar, virus och buggar programvara är små priser att betala för bekvämlighet. Men i high-tech och high-speed militära och rymdprogram ansökningar, den minsta problemet kan förstoras till katastrof. Den 4 juni 1996 beredda forskare att lansera en obemannad Ariane 5-raket. Det medförde vetenskapliga satelliter utformad för att fastställa exakt hur jordens magnetfält interagerar med solvinden. Raketen byggdes för den europeiska Rymdorganisationen och lyfte från sin anläggning på kusten i Franska Guyana. JACK GANSSLE: Vid ca 37 sekunder in flygningen, märkte de först något var fel. Munstyckena var svängbar i ett sätt som de borde verkligen inte. Cirka 40 sekunder in i flygningen, tydligt att fordonet var i trubbel. Och det är då de gjorde en Beslutet att förstöra den. Utbudet säkerhetsansvarig, med enorma tarmar, tryckte på knappen, sprängde raketen innan den kunde blivit en fara för den allmänna säkerheten. Högtalare 1: Detta var jungfruresa av den 5 Ariane, och dess undergång skedde på grund av en inbäddad fel i raketens programvaran. JACK GANSSLE: Problemet om Ariane var att det fanns ett antal att erforderliga 64 bitar för att uttrycka. Och de ville att konvertera till ett 16-bitars nummer. De antas att antalet var aldrig kommer att vara mycket stort, att de flesta av dessa siffror i 64-bitars Antalet var nollor. De hade fel. Högtalare 1: Oförmågan hos en programvara program 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 raket hade varit mycket framgångsrik, så mycket av programvaran skapas för det var också används i Ariane 5. PHILIP Coyle: Det grundläggande problemet var att Ariane 5 var snabbare, accelererat snabbare. Och mjukvaran hade inte stod för det. SPEAKER 1: Förstörelsen av raketen var en enorm ekonomisk katastrof, allt på grund av en minut programvarufel. Men detta var inte första gången på uppgifter omställningsproblem hade plågat modern raketteknologi. JACK GANSSLE: Under 1991, med början av det första Gulfkriget, Patriot missil upplevt en liknande slag av ett antal konvertering problem. Som ett resultat, var 28 amerikanska soldater dödade och cirka 100 andra skadades när Patriot, som var tänkt att skydda mot inkommande Scuds, misslyckats med att avfyra en missil. Högtalare 1: När Irak invaderade Kuwait och Amerika lanserade Desert Storm i början av 1991, Patriot batterier utplacerades för att skydda Saudiarabien och Israel från irakiska Scud missiler. Patriot är ett amerikanskt medium-range surface-to-air system som tillverkas av Raytheon företaget. THEODORE POSTOL: Storleken på Patriot interceptor i sig är ungefär 20-meter lång. Och den väger ca 2000 pounds. Och det bär en stridsspets på ca - Jag tror det är ungefär 150 pounds. Och stridsspetsen sig är en högexplosiva som har fragment runt den. Höljet på stridsspetsen är konstruerad att agera som hagel. Högtalare 1: De missiler genomförs fyra per container och transporteras genom en semi trailer. PHILIP Coyle: The Patriot anti-missil Systemet går tillbaka på minst 20 år nu. Den var ursprungligen avsedd som luftvärnssystem missil till skjuta ner fientliga flygplan. I det första Gulfkriget, då det kriget kom, ville armén för att använda den att skjuta ner Scuds, inte flygplan. Den irakiska flygvapnet var inte så mycket av ett problem. Men armén var orolig Scuds. Och så de försökte uppgradera Patriot. Högtalare 1: Fånga upp en fiende missil färdas i Mach fem var kommer att vara utmanande nog. Men när Patriot var rusade in tjänsten, var armén inte medveten om en Irakiska modifiering som gjorde deras Scuds nästan omöjligt att slå. THEODORE POSTOL: Vad hände är de Scuds som var kommer in var instabila. De vinglar. Anledningen till detta var irakierna, i För att få 600 mil ur ett 300-kilometer-range missil, tog vikten av den främre stridsspets. De gjorde stridsspets ljusare. Så nu Patriot försöker att komma på Scud. Och för det mesta, den överväldigande majoriteten av tiden, skulle det bara flyga genom Scud. Högtalare 1: När Patriot systemet operatörer insåg Patriot missade sitt mål, detonerade de patrioterna stridsspets för att undvika eventuell olycksoffer, om den fick att falla till marken. THEODORE POSTOL: Det var vad de flesta människor såg som stora eldklot på himlen och missförstådd som fångar av Scud stridsspetsar. Högtalare 1: Även i natt himlen Patriots verkade vara framgångsrikt förstöra Scuds, vid Dhahran där kunde vara något misstag om dess prestanda. Där förlorade Patriot radarsystem koll på ett inkommande Scud och aldrig lanserades 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 en klocka inbäddade i systemets dator. JACK GANSSLE: Cirka två veckor före Tragedin i Dhahran, israelerna rapporteras till Försvarsdepartementet att systemet var att förlora tid. Efter ca åtta timmars drift, de märkte att systemet är bli märkbart mindre exakt. Försvarsdepartementet svarade med träffande alla Patriot batterierna att inte lämna de system på under en längre tid. De sa aldrig vad en lång tid var. Åtta timmar? 10 timmar? 1000 timmar? Ingen visste. Högtalare 1: The Patriot Batteriet stationerad vid barackerna på Dhahran och dess bristfälliga interna klockan hade varit på över 100 timmar på natten 25 februari. JACK GANSSLE: Det spårade tid till en noggrannhet på ungefär en tiondels sekund. Nu, är en tiondel av en sekund en intressant siffra 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 numret en tredjedel. En tredjedel kan inte uttryckas i decimal exakt. En tredjedel är 0,333 gå på för oändligheten. Det finns inget sätt att göra det med absolut noggrannhet i decimal. Det är precis samma typ av problem som hände i Patriot. Ju längre systemet sprang, den värsta tiden felet blev. Högtalare 1: Efter 100 timmars drift, felet i tiden var bara ungefär en tredjedel av en sekund. Men i termer av att en missil färdas i Mach fem, resulterade det i ett tracking error över 600 meter. Det skulle vara ett fatalt misstag för soldaterna vid Dhahran. THEODORE POSTOL: Vad hände är en Scud lanseringen upptäcktes i början av varning satelliter. Och de visste att Scud skulle komma i deras allmänna riktning. De visste inte om det skulle komma. Högtalare 1: Det var nu upp till radarn komponent av Patriot-systemet försvara Dhahran att lokalisera och hålla koll på inkommande fientliga missiler. JACK GANSSLE: Radarn var mycket smart. Det skulle faktiskt spåra positionen för den Scud och sedan förutsäga var det förmodligen skulle bli nästa gång radarn skickade en puls ut. Det kallades området grinden. THEODORE POSTOL: Sen när Patriot beslutar tillräckligt med tid har gått för att gå tillbaka och kontrollera nästa läge för Detta objekt som upptäckts, går det tillbaka. Så när det gick tillbaka till fel plats, ser det då inget objekt. Och den beslutar att det inte fanns något föremål, det var ett falsklarm, och droppar spåret. Högtalare 1: Den inkommande Scud försvann från radarskärmen, och sekunder senare det mitt framför näsan in i kasernerna. Den Scud dödade 28 och var den sista sköt under det första Gulfkriget. Tragiskt, kom den uppdaterade programvaran på Dhahran följande dag. Programvaran fel hade fastställts, stänga ett kapitel i den oroliga historia Patriot missil. Patriot är egentligen en förkortning för fasstyrda spårning Skärningspunkt Target. DAVID J MALAN: Okej, så en nyktra exempel, för att vara säker. Och lyckligtvis är dessa lägre nivå buggar är inte något som vi kommer typiskt att uppskatta, verkligen inte med några av våra tidigaste av programmen. Snarare, de flesta av de buggar kommer du Mötet kommer att vara logiskt i naturen, syntaktisk i naturen varigenom koden fungerar inte rätt. Och du vet att det ganska snabbt. Men framför allt när vi kommer till slutet av terminen, det kommer att blivit mer och mer av en möjlighet att verkligen tänka till om designen av ditt program och den underliggande representation där också, av data. Till exempel kommer vi att presentera MySQL, vilket är en populär databas motor som du kan använda med webbplatser för att lagra data på bakändan. Och du måste börja att besluta I slutet av terminen inte bara vad typer av data längs dessa linjer för att använda men exakt hur många bitar att använda, om du vill lagra datum som datum och tider som tider, och även saker som hur stor vill du ha den unika ID: n för att vara för, säg, användare i din databas. I själva verket, om någon av er har haft Facebook står för en ganska lång tid, och du vet hur man får tillgång till ditt användar-ID - vilket visar ibland upp i din profilens webbadress om du inte har valt en smeknamn för URL, eller om du har använda Facebooks Graph API, den allmänt tillgängliga API med vilket du kan be Facebook för rådata - du kan se vad din numeriska ID är. Och några år sedan, Facebook huvudsak tvungen att byta från att använda motsvarande ints att använda långa länge eftersom tiden som användarna kommer och gå och skapa massor av konton och falska konton, även de mycket enkelt kunde uttömma något som en 4 miljarder möjliga värde som en int. Så mer om dessa typer av frågor på vägen, liksom. Okej, så det var gjutning. Det var otydligt. Ett par snabba meddelanden. Så avsnitten börjar formellt denna kommande Söndag, måndag, tisdag. Du kommer att höra via e-post senare denna vecka om din sektion uppdrag. Och du kommer också här på den punkten hur att ändra din sektion om din schema har nu ändrats eller din komfortnivå har nu förändrats. Samtidigt P-set ett och hacker man är beror denna torsdag med möjlighet att förlänga denna tidsfrist per den specifikationer till fredag i ett typiskt sätt. Inse att inkluderas med problemet uppsättning specifikationer instruktioner om hur man använder CS50 apparaten, gör, samt några CS50 specifika verktyg som 50 stil, som kan ge dig med återkoppling dynamiskt på kvaliteten på din kod stil och även kolla 50, vilket kan ge dig dynamisk återkoppling på ditt kodens korrekthet. Förlåt att vi fortfarande strykning ut några kinks med check 50. Några av dina klasskamrater som fick börja runt 04:00 på fredag ​​kväll när spec gick upp har märkt sedan några buggar som vi arbetar igenom, och ber om ursäkt för alla som har upplevt onödiga frustrationer. Felet är mitt. Men vi ska följa upp CS50 diskutera när det är löst. Så ett ord om poängen själva. Så det kommer att bli en vecka eller två innan du börjar få feedback på problemsamlingar eftersom du inte ännu har en undervisning karl. Och även då kommer vi att börja utvärdera C problemet uppsättningar innan vi gå tillbaka och utvärdera scratch så att du får mer relevanta återkoppling snabbare. Men i allmänhet per kursplanen, CS50 problemsamlingar utvärderas längs efter fyra axlar - omfattning, korrekthet, design och stil. Scope kommer att bli ett antal typiskt mellan noll och fem som fångar hur mycket av pjäs som du bet av. Vanligtvis vill du att detta ska vara fem. Du åtminstone försökt allt. Och märker att det är en multiplikativ faktor så att göra endast en del av problembild är inte den bästa strategin. Under tiden, mer uppenbara är vikten av korrekthet - bara är ditt program stämmer med respektera specifikationen? Detta viktas medvetet mer hårdare än de andra två axlarna medelst en faktor tre eftersom vi inser som normalt du kommer att tillbringa en mycket mer tid att jaga ned en del buggar, få din kod till arbete, då du är indentering det och välja lämpliga variabelnamn och vill, är som i den andra änden av spektrumet av stil. Det är inte att säga stil är inte viktigt, och vi ska predika det över tid både i föreläsningar och i avsnitten. Style hänvisar till estetik av din kod. Har du valt väl namngivna variabler som är korta men något beskrivande? Är din kod indragen som du har sett i föreläsning och på ett sätt som är förenligt med stil 50? Slutligen är mönsterrätt där i mitten. Design är det svårare en att sätta en fingret på eftersom det är mycket mer subjektiv. Men det är kanske det viktigaste av de tre axlarna i form av pedagogiska värde över tiden och att detta kommer att vara undervisningen stipendiatens möjlighet att förse dig med kvalitativ feedback. Sannerligen, i CS50 fastän vi har dessa formler och ställningar, i slutet av dagen dessa är mycket medvetet mycket små hinkar - punktvärden mellan noll och tre och noll och fem. Vi försöker inte att dra mycket grova linjer mellan problemsamlingar eller mellan studenter utan snarare fokusera så mycket som vi kan på kvalitativa, longhand återkoppling, antingen maskinskriven eller verbalt från din undervisning karl, du får känna ganska bra. Men i allmänhet, de är vikterna att de olika axlarna kommer att ha. Under tiden också, det är värt att hålla i ihåg att du inte bör anta att en tre av fem är en 60% och därför grovt misslyckas. Tre är medvetet tänkt att vara slags mitten av vägen bra. Om du får treor på början av terminen, det är faktiskt tänkt att vara ett bra ställe att börja. Om du får tvåor, mässor, det finns definitivt en del arbete för att betala lite mer uppmärksamhet, för att ta tillvara av sektioner och kontorstider. Om du får fyror och femmor, bra. Men egentligen, hoppas vi att se banor bland studenter - mycket individualiserad per elev, men börjar terminen här i form av de två till tre intervall men slutar här uppe i 4:56 sortiment. Det är vad vi egentligen letar efter. Och vi håller i minnet deltat som du uppvisar mellan vecka noll och vecka 12 när jag gör kvaliteter. Det spelar ingen roll för oss absolut hur du rättvis i början om din bana är verkligen uppåt och stark. Akademisk hederlighet - så låt mig sätta på min allvarligare röst för bara ett ögonblick. Så här kursen har skillnaden av skicka fler studenter än någon annan i historien till annonsen styrelse, tror jag. Vi har liksom tappat räkningen på detta punkt i hur ofta detta händer. Och det är inte för att elever i 50 är något mer oärligt än deras klasskamrater håll. Men inser också att vi är mycket bra på att upptäcka denna typ av sak. Och det är den fördel som en datavetenskap klassen har i att vi kan och vi jämför alla elever Problemet ställer parvis mot varje andra, inte bara i år men alla tidigare år. Vi har förmågan, liksom elever i klassen, till Google och hitta koden på webbplatser som github och diskussionsforum. Det finns absolut lösningar på CS50: s p-set flyter runt där. Men om du kan hitta dem, vi kan hitta dem. Och allt detta är mycket automatiserad och enkelt och tråkigt för oss att hitta. Men jag vill betona, också, att kursens akademisk hederlighet policy är mycket tänkt att vara mycket motsatsen till den andan. I själva verket, i år har vi omformulerats saker i kursplanen för att vara här, prick dot dot, med närmare i kursplanen. Men det övergripande temat i kursen verkligen är att vara rimligt. Vi inser att det finns en betydande mängd pedagogiska värde i samarbeta, i viss utsträckning, med klasskamrater, där du två eller tre eller fler är stående vid en whiteboard whiteboard, så att tala, dina idéer - skriva ut pseudokod i bilder, diagramming vad ska Mario vara om du skulle skriva det första i pseudokod. Vad bör giriga algoritm - hur ska den bete sig per problem ställer man? Och så inser att beteendet att vi uppmuntrar är mycket mycket längs dessa linjer. Och i kursplanen, ser du en massa kulor under ett rimlig kategori och en inte rimligt kategori som hjälper oss att hjälpa du svepa dig runt där Vi drar den linjen. Och i allmänhet, en hygglig tumregel är att om du kämpar för att lösa en del buggar och din vän eller klasskamrat sitter bredvid dig, är det rimligt för dig att visa honom eller henne din kod och säga hej, kan du hjälpa mig räkna ut vad som går fel här? Vi brukar inte anamma den motsatta sidan. Det är inte ett korrekt svar för din vän eller klasskamrat här för att säga, åh, titta bara på mig och figur den ut från det. Det är en slags orimlig. Men att ha någon annan, en annan hjärna, ett annat par ögon ser på skärmen eller titta på din kod Och säg, är du säker på att du vill att ha en slinga här? Eller är du säker på att du vill att semikolon här? Eller åh, innebär att felmeddelandet detta. De är mycket rimliga och uppmuntrade beteenden. De fall som jag syftade på tidigare koka ner till när eleverna är sent på natten gör dåligt omdöme beslut och skicka e-post sin kod till någon annan eller bara säga, Här är det i Dropbox eller Googla sent på natten. Och så skulle jag uppmuntra och ber er, om du inte har de oundvikliga stunder av stress, du stöta upp mot deadline, har du ingen sen dag eftersom det är redan fredag ​​vid den punkt, maila kursens huvuden eller själv direkt. Säg, lyssna, jag är på min bristningsgränsen här. Låt oss ha en konversation och räkna ut det. Tillgripa banan eller något annat inte rimligt beteende är aldrig lösning, och alltför många av dina klasskamrater är inte längre här på campus på grund av det dåliga omdöme. Men det är mycket lätt att undgå den linjen. Och här är en liten bild för att heja dig från Reddit så att nu allt kommer att vara OK. Så en snabb resumé, då, om där vi slutade. Så förra veckan, minns att vi introducerar förhållanden, inte i Scratch men i C denna gång. Och det fanns några nya syntax men egentligen inga nya idéer i sig. Vi hade booleska uttryck som vi kunde eller tillsammans med två vertikala barer eller och tillsammans med två et-tecken, säger att både vänster och rätten måste vara sant för att verkställa. Sedan hade vi växlar, som vi såg på kort, men jag föreslår är verkligen bara annorlunda syntax för att uppnå samma slags mål om du vet i förväg vilka dina ärenden kommer att bli. Vi tittade på slingor. En for-slinga är kanske den vanligaste, eller åtminstone en som människor typiskt nå för instinktivt. Även om det ser lite kryptiskt, du kommer att se många, många exempel på detta Snart som du har redan i slutet av förra veckan. Medan slingor kan på liknande sätt uppnå samma sak. Men om du vill göra någon uppräkning eller uppdatering av variabla värden, måste du göra det mer manuellt än för slinga tillåter innan. Och sedan finns det gör-while-slinga, som tillåter oss att göra något på minst en gång under något annars är sant. Och det är särskilt bra för program eller för spel där du vill att fråga användaren om något minst en gång. Och sedan om han eller hon inte samarbetar, du kanske vill göra det igen och igen. Med variabler, under tiden, vi hade linjer av koden så här, vilket skulle kunna vara två linjer. Du kan deklarera en int kallas räknare, semikolon. Eller så kan du bara deklarera och definiera det, så att säga. Ge det ett värde på samma gång. Och sedan slutligen, pratade vi om funktioner. Och detta var ett bra exempel på den meningen att den illustrerar två typer av funktioner. En är GetString (), som, återigen, får en sträng från användaren. Men GetString () är ganska intressant, så långt som vi har använt det, eftersom vi har alltid använt det med något på den vänstra sidan av en likhetstecken. Det vill säga att GetString () returnerar ett värde. Den returnerar naturligtvis en sträng. Och sedan på vänster sida, är vi helt enkelt spara den strängen inuti en variabel som heter namn. Det är annorlunda, i en mening, från printf eftersom printf, åtminstone i vår användning här, inte återvänder någonting. Som en parentes, det gör det återvändande något. Vi bara struntar i vad det är. Men det har vad kallas en biverkan. Och vad är det bieffekt i varje fall vi har sett hittills? Vad gör printf? Den skriver något på skärmen, visar text eller siffror eller något på skärmen. Och det är bara anses vara en biverkning eftersom det inte riktigt räcka den tillbaka till mig. Det är inte ett svar inuti en svart låda som jag sedan kan nå in och greppa. Det är bara att göra det på egen hand, mycket som Colton var ansluten till denna svart låda förra veckan, och han på något sätt magiskt ritade på tavlan utan mig faktiskt inblandad. Det skulle vara en bieffekt. Men om jag hade faktiskt att nå tillbaka i här och säga, åh, här är strängen från användaren, som skulle vara ett returvärde. Och hittills har vi bara använt funktioner att andra människor har skrivit. Men vi kan faktiskt göra dessa typer av saker själva. Så jag kommer att gå in i CS50 apparaten igen. Låt mig avsluta den flik som vi hade öppna en stund sedan. Och låt mig gå vidare och Skapa en ny fil. Och jag ska gå vidare och kalla detta en positive.c. Så jag vill göra något med positiva tal här. Så jag kommer att gå vidare och göra int - sorry - # Include. Låt oss inte göra samma misstag som tidigare. Int main (void), öppen lockigt stag, stängde klammerparentes. Och nu vill jag göra följande. Jag vill skriva ett program som insisterar på att användaren ger mig ett positivt heltal. Så det finns ingen GetPositiveInt funktion i CS50 biblioteket. Det finns bara getInt (). Men det är OK eftersom jag har konstruktioner med vilka jag kan ålägga en lite mer begränsning för det värdet. Jag skulle kunna göra något sådant. Så int n - och om du skriver tillsammans, bara att inse Jag kommer att gå tillbaka och ändra vissa saker i ett ögonblick - så int n är lika getInt (). Och det kommer att sätta en int insidan av n.. Och låt mig vara en mer beskrivande. Låt mig säga något som jag kräver att du ger mig ett positivt heltal. Okej. Så bara lite instruktioner. Och nu vad kan jag göra? Tja, vet jag redan från min enkla villkor eller filialer, precis som jag hade i Scratch, kunde jag säga något vilja om n är mindre än eller lika med noll, då jag vill göra något vilja, är det inte positivt. Och då kunde jag göra - OK, men jag vill verkligen få det int. Så jag kunde gå upp här och jag kunde typ av Kopiera och strecksats här. Och sedan, OK. Så om n är mindre än eller lika med noll göra detta. Nu, tänk om användaren inte samarbetar? Jo, då kommer jag att låna detta här. Och sedan går jag in här och här och här. Så detta är helt klart inte lösningen, eller hur? Eftersom det finns inget slut i sikte. Om jag vill kräva att användaren ger mig ett positivt heltal, kan jag faktiskt få int. Jag kan då kontrollera om det int. Men då jag vill kolla upp det igen och kolla upp det igen och kolla upp det igen. Så uppenbarligen, vad är bättre konstruktion för att använda här? Okej, så någon form av loop. Så jag kommer att bli av nästan all denna. Och jag vill få detta int minst en gång. Så jag ska säga göra - och jag ska komma tillbaka till medan bara ett ögonblick - nu, gör vad? Jag kommer att göra int n får getInt (). OK. Så det är ganska bra. Och nu hur ofta gör Jag vill göra det här? Låt mig uttrycka det printf insidan av slingan så jag kan kräva och om igen, om så behövs. Och vad vill jag här medan tillstånd att göra? Jag vill fortsätta göra detta medan det är fallet? Yeah. N är mindre än eller lika med noll. Så redan, vi har betydligt städas här koden upp. Vi har lånat en mycket enkel konstruktion - gör-while-slinga. Jag har stulit bara de viktiga linjerna av kod som jag började att kopiera och klistra, vilket var inte klokt. Och så nu ska jag faktiskt klistra det här och bara göra det en gång. Och nu vad jag vill göra på Alldeles i slutet av detta program? Jag ska bara säga något enkelt gillar, tack för - och Jag ska göra% i för int - omvänt snedstreck n, komma, och sedan plugin i N, semikolon. Okej. Så låt oss se vad som händer nu när jag kör det här programmet. Jag kommer att gå vidare och gör positivt. Damn. Några fel. Så låt mig rulla tillbaka upp till den första. Arbeta inte igenom dem baklänges. Arbeta igenom dem uppifrån och ned lest de kaskad och endast en sak är fel. Implicit deklaration av Funktionen getInt (). Yeah. Så det var inte tillräckligt. Jag slags gjort samma misstag men lite annorlunda den här gången. Jag behöver inte bara omfatta stdio.h men också cs50.h, vilket inkluderar så kallade deklarationer får int, vilket undervisa apparaten, eller lär C vad getInt () är. Så låt mig spara om. Jag kommer att ignorera de andra fel eftersom jag kommer att hoppas att de är något sätt relaterade till felet Jag fast redan. Så låt mig gå vidare och kompilera med göra positiva, Enter. Damn. Tre fel, ändå. Låt mig rulla upp till den första. Oanvända variabeln n.. Vi har inte sett det här förut. Och även detta är ett lite kryptiskt. Detta är utsignalen från kompilatorn. Och vad det markerade linjen det - positive.c :9:13 - säger, det säger på rad nio av positive.c, på 13: e tecknet, 13th kolumnen, du gjorde detta misstag. Och framför allt, det säger me oanvända variabeln n. Så låt oss se - line nio. Jag använder n i den meningen att Jag ger det ett värde. Men vad kompilatorn inte gillar är att jag inte synes använder den. Men vänta lite, jag använder det. I linje 11, jag använder det här. Men om jag bläddra ner ytterligare vid positive.c :11 - så vid linjen 11, tecken 12, den kompilatorn säger till mig, användning av svartarbete identifierare n. Så odeklarerade betyder att jag måste specificeras inte det som en variabel med datatypen. Men vänta en minut. Jag gjorde exakt som i linje nio. Så någon är verkligen förvirrad här. Det är antingen mig eller kompilatorn eftersom i linje nio, igen, jag förklarar en int n, och jag tilldela det returnera värdet av getInt (). Då jag använder den variabeln n i linje 11 och kontrollera om dess värde är mindre än eller lika med noll. Men detta är tydligen dåliga och trasiga varför? Säg det igen? Ah, jag måste förklara n innan kommer in i slingan. Men varför? Jag menar, föreslog vi bara lite sen att det är bra att deklarera variabler alla på en linje och sedan tilldela dem ett visst värde. En global variabel - låt oss återkomma denna idé på bara ett ögonblick. Varför vill du att jag ska sätta den utanför slingan? Det är. Exakt. Så, om än något bakvända, Låt mig sammanfatta. När du deklarerar n insidan av do-blocket där - specifikt insidan av dessa klammerparenteser - att variabeln n har vad kallas en räckvidd - unrelated till vårt poängsystem i kurs - men har en räckvidd som är begränsat till de klammerparenteser. Med andra ord, oftast om du deklarerar en variabel inuti en uppsättning av Klammerparenteserna fastslagit att variabeln endast insidan av dessa klammerparenteser. Så genom denna logik ensam, även om Jag har förklarat n i linje nio, det huvudsak försvinner från tillämpningsområdet, försvinner från minnet, så att säga, när jag slog linje 11. Eftersom linje 11, tyvärr, är utanför dessa klammerparenteser. Så jag tyvärr inte kan åtgärda detta genom att gå tillbaka till vad jag gjorde det innan. Du kanske först göra detta. Men vad är du nu inte gör cykliskt? Du är uppenbarligen inte får int cykliskt. Så vi kan lämna getInt (), och vi bör lämna getInt () inuti loop eftersom det är vad vi vill pester användaren för och om igen. Men det räcker att gå upp till linjen, säg, sex. Int n, semikolon. Ge det inte ett värde ännu eftersom du behöver inte bara ännu. Men nu här nere, varsel - detta skulle vara ett mycket enkelt misstag. Jag vill inte att skugga min tidigare försäkran om n. Jag vill använda n som faktiskt existerar. Och så nu i linje 10, Jag tilldelar n ett värde. Men i linje sex, förklarar jag n.. Och så kan jag eller kan jag inte använda det i linje 12 nu? Jag kan på grund mellan vilka lockigt hängslen är n förklaras nu? Den ena upp här på rad fem. Till en här på rad 14. Så om jag nu zooma ut, spara filen, gå backa in och kör make positivt, det sammanställt denna gång. Så det är redan framsteg. Snedstreck. . / Positiv, Enter. Jag kräver att ni ger mig ett positivt heltal. Negativt 1. Negativ 2. Negativt 3. Zero. One. Och tack för att man är vad nu tryckt. Låt mig prova något annat, av nyfikenhet. Jag blir tillsagd att ange ett heltal. Men vad händer om jag skriver istället i lamm? Så ni ser nu en annan prompt - försöka igen. Men ingenstans i min kod skrev jag försöka igen. Så där, förmodligen, är detta nytt försök uppmana kommer från, skulle du säga? Ja, från getInt () själv. Så en av de saker CS50: s personal gör för dig, åtminstone i dessa första veckor, vi har skrivit en viss mängd av felkontroll för att säkerställa att om du kallar getInt (), kommer du åtminstone få tillbaka en int från användaren. Du kommer inte få en sträng. Du kommer inte få en röding. Du kommer inte få något helt annat. Du får en int. Nu kan det inte vara positivt. Det kan inte vara negativt. Vi gör inga garantier kring detta. Men vi kommer att besvära användaren att försöka igen, försöka igen, försöka igen tills han eller hon faktiskt samarbetar. Likaså om jag gör 1,23, det är inte en int. Men om jag skriver in, säg, 50, som ger mig ett värde som jag ville. Okej. Så inte illa. Eventuella frågor om vad vi har just gjort? Nyckeln takeaway är att vara tydlig, inte så mycket slingan, som vi har sett innan även om vi inte riktigt använde det, men frågan om omfattningen, där variabler kan endast kan endast användas inom någon specificerad omfattning. Okej, låt mig ta upp förslaget du gjort tidigare, att en global variabel. Som en parentes, visar det sig att en annan lösning på detta problem, men typiskt en felaktig lösning eller en dåligt utformad lösning, är att deklarera din variabel som vad är kallas för en global variabel. Nu är jag typ av att överträda min definition av tillämpningsområdet eftersom det finns inga Klammerparenteserna högst upp och själva botten av en fil. Men konsekvenserna av att är det nu i linje fyra, n är en global variabel. Och som namnet antyder, är det bara tillgängliga överallt. Scratch har faktiskt dessa. Om du använde en variabel, kanske ni minns du var tvungen att välja om det är för här spriten eller för alla sprites. Tja, är alla sprites bara tydligare sätt att säga global. Yeah? Ah, riktigt bra fråga. Så minns att i den allra första versionen av min kod, när jag felaktigt deklareras och definieras n i linje nio - Jag förklarade det som en variabel och jag gav det ett värde med tilldelningsoperatorn - Detta gav mig två fel. Ett, det faktum att n inte användes, och två, att i linje 11 det bara inte förklarades. Så det första jag gjorde inte adress på den tiden. Det är inte helt fel att deklarera en variabel, men inte använda den. Men en av de saker vi har gjort i den CS50 apparaten, medvetet, pedagogiskt, är att vi har skrivit upp förväntningar kompilatorn att göra Se till att du gör saker som inte bara korrekt men riktigt korrekt. För om du deklarera en variabel som n och aldrig använda den, eller använda den korrekt, vad är det där? Det tjänar verkligen inget syfte. Och det är väldigt lätt över tiden, om du inte konfigurera din egen dator här sättet, att bara ha kod som har små rester här, rester där. Och sedan månader senare du ser tillbaka och du är som, varför är denna linje av koden där? Och om det finns ingen bra anledning, det gynnar inte du eller dina kollegor väg att behöva snubblar över det då. Som en parentes, där är det kommer från? Tja, minns att varje gång vi sammanställa program, är allt det här som skrivs ut. Så vi ska återkomma till detta. Men återigen, är att göra ett verktyg som automatiserar processen med att sammanställa genom kör själva kompilatorn kallas klang. Denna sak, vi kommer så småningom se, har att göra med felsökning med en speciell program som kallas debugger. Detta har att göra med att optimera kod - mer om det i framtiden. Std = C99 - Detta betyder bara använda 1999 års version av C. C har funnits ännu längre än det, men de gjorde några trevliga ändringar 10 plus år sedan. Och här är de relevanta sådana. Vi säger att allt som tidigare skulle ha varit en varning Ett fel hindrar eleven från sammanställningen. Och väggorgan göra det för en hel massa saker, inte bara relaterade till variabler. Och låt mig rulla till I slutet av denna linje. Och även detta kommer vi så småningom komma tillbaka till. Detta är uppenbarligen känt av filen jag sammanställa. Detta påminner om namnet på filen Jag utmatning som namnet min Runnable program. Detta-lcs50 betyder bara använda CS50 bibliotek, och alla nollor och ettor som personalen skrev och sammanställt tidigare detta år, integrera dem i mitt program. Och någon som vet vad-LM är? Det är den matematiska biblioteket, vilket är bara det även om du är inte göra någon matte. Det är bara automatiskt tillgänglig oss göra. Nåväl, låt mig göra ett annat exempel här genom att öppna upp en ny fil. Och låt mig spara den här som string.c. Det visar sig att när vi talar om uppgifter typer idag, det finns ännu mer händer under huven än vad vi har sett hittills. Så låt mig snabbt göra en snabb program. Inkludera stdio.h. Och jag ska spara den. Och du vet, låt mig inte göra det samma misstag om och om igen. Inkludera cs50.h. Och låt mig gå vidare nu och gör int main (void). Och nu vill jag bara göra ett program som gör detta - deklarera en sträng heter er och få en sträng från användaren. Och låt mig göra lite instruktionerna här - snälla ge mig en sträng - så användaren vet vad de ska göra. Och sedan ner här nedanför detta, Jag vill göra följande - för int i blir noll. Återigen, datavetare typiskt börja räkna på noll, men vi kunde gör att man, om vi verkligen ville. Nu ska jag göra jag är mindre än strängen längd s. Så strlen - S-T-R-L-E-N - igen, det är kortfattat eftersom det är lättare att skriva, även om det är en lilla kryptiska. Det är en funktion vi har inte använt innan men bokstavligen gör det - tillbaka till mig ett nummer som representerar längden på strängen som användaren skrivit. Om de skrev i hej, skulle återvända fem eftersom det finns fem bokstäver i Hello. Då, på varje iteration av denna slinga, jag plus plus. Så återigen, en standard konstruktion även om du är inte riktigt alltför bekväma eller förtrogen med det ännu. Men nu på varje iteration av denna slinga, märker vad jag ska göra. Jag vill gå vidare och skriva ut ut ett enstaka tecken - så% c backslash n på en ny rad. Och då, vet du vad jag vill göra? Oavsett ordet är att användaren skriver in, liksom hej, jag vill skriva ut H-E-L-L-O, ett tecken per rad. Med andra ord, jag vill komma på enskilda tecken i en sträng, varigenom hittills en sträng har bara varit en sekvens av tecken. Och det visar sig jag kan göra s, konsol, Jag, nära fästet, stäng parentes, semikolon. Och jag måste göra en sak. Det är i en fil som heter string.h att strlen deklareras. Så om jag vill använda denna funktion, Jag måste tala om för kompilatorn, räknar med att använda den. Låt mig nu gå vidare och göra Programmet heter strängen. Dot, snedstreck, sträng. Vänligen ge mig en sträng. Jag ska gå vidare och skriva det. Hej, i versaler, Enter. Och nu märker jag ut detta ett tecken efter den andra. Så den nya detalj här är att en sträng, vid slutet av dagen, kan vara nås genom dess individuella tecken genom att införa den fyrkantiga hakparenteser. Och det beror på en rad nedanför huven är verkligen en sekvens av tecken. Men vad är snyggt om dem är i datorns RAM-minne - Mac, PC, oavsett vad det är - de är bokstavligen rygg mot rygg mot rygg - H-E-L-L-O - på individnivå, intill bytes i minnet. Så om du vill komma på åttonde sådan byten, vilket i denna slinga skulle vara fäste noll, fäste en, fäste två, fäste tre, fäste fyra - att noll är indexerade fram till fem - som kommer att skriva ut H-E-L-L-O på en egen rad. Nu, som en teaser, låt mig visa dig möjliga saker kommer du så småningom att bli kunna förstå, åtminstone med några nära ser. För en, vad vi ingår i dagens exempel, om du vill, är faktiskt en av de allra första jailbreaks för iPhone. Jailbreaking innebär sprickbildning telefonen så att du faktiskt kan använda den på ett annat transportföretag eller install din egen mjukvara. Och du kommer att märka detta ser helt kryptiskt, mest troligt. Men titta på det här. Den iPhone var tydligen knäckt med en for-loop, en om tillstånd, ett annat tillstånd, ett gäng funktioner Vi har inte sett. Och igen, kommer du inte på första anblicken förmodligen förstå hur detta fungerar. Men allt som vi liksom ta för givet i våra moderna liv faktiskt tenderar att minska även i viss av dessa grundprinciper som vi har varit tittar på. Låt mig gå vidare och öppna en andra program, holloway.c. Så detta är också något du borde egentligen inte vet. Även ingen personal eller jag kunde antagligen lista ut det genom att titta på det eftersom det var någons kod som överlämnades till vad som är historiskt känd som en förvrängd C tävling, där du skriver ett program som sammanställer och går men är så jävla kryptiskt ingen människa kan förstå vad det kommer att göra tills de kör faktiskt det. Så ja, om man tittar på det här kod, ser jag en switch. Jag ser stora. Jag ser dessa hakparenteser innebär någon form av en matris. Önskar någon att gissa vad detta program faktiskt gör om jag kör Holloway? Ja. OK. Bra gjort. Så bara personalen och jag kan inte räkna ut vad dessa saker gör. Och nu sist, låt mig gå vidare och öppna upp ett annat program. Detta - igen, vi gör källkoden tillgängliga på nätet - detta är bara slags vacker att titta på. Allt de gjorde är drabbade space bar ganska lite. Men detta är riktiga koden. Så om du tror att det är ganska, om vi kör faktiskt detta vid prompten, småningom kommer du att se hur vi kan göra saker som denna. Så vi lämnar dig på den anteckning och se dig på onsdag. [Musik Spela] Högtalare 2: Vid nästa CS50, TFS iscensätta ett myteri. SPEAKER 3: Där är han. Få honom! [Musik Spela]