[MUSIC Playing] DAVID J MALAN: Okay, velkommen tilbage til CS50. Dette er starten på uge to. Et ord fra en af ​​vores venner på campus - hvis du er interesseret, eventuelt, enten nu eller i en fremtidig periode endnu en gang mere komfortabel, undervisning middle school studerende en lidt noget om datalogi, gør hovedet til denne webadresse. De er særligt behov lige nu for lærere, især hvis du har havde nogle eksponering for datalogi. Så minde om, at sidste gang, vi introducerede et par datatyper i C, og du måske er begyndt at få din hænder beskidte med disse hidtil i problemet indstillet en sådan. Og vi havde en char. Så i noget tekniske termer, hvad er en char som du kender det i dag? Så det er et tegn, men lad os være mere præcis nu. Hvad forstår vi ved tegn eller individuelle char? En ikke-numerisk karakter - så ikke nødvendigvis. Det viser sig, at selv numre, selv tegnsætning og breve er repræsenteret med disse data skriv kendt som en char. Så det er ikke nødvendigvis alfabetisk. Ja? Så det er en ASCII-tegn. Så hvis du tænker tilbage på uge nul, når vi havde vores byte af frivillige komme op og enten holde deres hænder op eller ikke alle, de repræsenterede bits. Men kollektivt som en gruppe af otte, de repræsenterede en byte. Og vi introducerede begrebet ASCII på det foredrag, blot der er en kortlægning mellem tal og bogstaver. Og ASCII anvendelser, som dem mennesker underforståede, otte bits at repræsentere en karakter. Så derfor, hvis otte bits kan hver især på én af to værdier - nul eller én - det betyder der var to muligheder for den pågældende person - nul eller én - to for denne person, to for dette person to for denne ene. Så i alt to gange to gange to gange to gange to - så to den ottende i alt. Så der er en samlede antal tegn 256 muligt, at du kan repræsentere med otte bits. Nu de af jer, der taler asiatiske sprog kan vide, at der er mere tegn i verden end blot As og Bs og Cs og Ds. Og ja, er ASCII ikke tilstrækkeligt for en masse af verdens sprog. Men mere om det en anden gang. For nu, ved, at i C, hvis du ønsker at repræsentere et brev, et stykke tegnsætning, eller bare noget tegn i naturen, bruger vi en char. Og det er en byte eller otte bits. Hvad med en int? Tja, en int er et heltal. Hvor mange bits, hvis du husker, var et heltal typisk? Enhver tilbagekaldelse? Så det er typisk 32. Det faktisk afhænger af computeren at du bruger. Men i apparatet, og i en masse computere, er det 32 ​​bit eller fire bytes - otte gange fire. Og ints bare bruges til opbevaring numre, enten negative, positive eller nul. Og hvis du har fået 32 ​​bit, og du kun pleje om positive tal, kan nogen ballpark hvor mange mulige heltal en computer kan repræsenterer, fra nul på op? Så det ville være to til 32, som er omtrent fire milliarder. Så disse beføjelser to kommer til at være tilbagevendende temaer i datalogi. Som vi kan se, de er helt praktisk til at arbejde med, selvom det ikke er helt let at gøre det math i ens hoved. Så vi vil sige omkring fire milliarder. Nu en lang lang - du kan slags gæt. Det er længere end en int. Hvor mange bits? Så 64 bits eller otte bytes. Det betyder bare, du kan repræsentere selv større tal, større positiv eller større negative tal. Og hvad flyde? Det er en floating point værdi af 32 bit. Dette er blot et reelt tal, noget med et komma. Men hvis man i stedet har brug for flere steder efter kommaet, eller du ønsker at repræsentere et større antal med nogle fraktion efter det, kan du bruge en dobbelt, hvilket er 64 bit. Men der er en interessant takeaway her. Så hvis int'er er begrænset af 32 bits og selv lange længes er begrænset af 64 bits, den slags rejser spørgsmålet, hvad nu hvis du rent faktisk ønsker at tælle højere end 4 milliarder for en int? Nå, du bare bruge en lang lang. Men hvad nu hvis du ønsker at tælle højere end to til den 64., give eller tage? Nu, det er et enormt antal. Men til sidst, du kan faktisk bekymrer sig om den slags værdier, især hvis du bruger en database og begynder at indsamle masser og masser og masser af data og tildele unikke tal til hvert stykke af disse data. Så vi slags har et problem. , Og ligeledes med flydende komma værdier - flåd eller doubler - hvis du kun har et begrænset antal bits, hvor mange samlede tal kunne du muligvis repræsentere? Tja, det er mindre klart, når du involvere et komma. Men det er sikkert begrænset. Hvis du har et endeligt antal bits, et endeligt antal mennesker, et endeligt Antallet af pærer, helt sikkert du kan kun repræsenterer et endeligt antal kommeværdier. Men hvor mange reelle tal er deres i verden? Der er en uendelig. Så det er lidt af et problem, fordi vi ikke har en uendelig mængde af hukommelse eller RAM inde i vores computere. Så nogle udfordrende ting kan ske. Så lad os gå videre og prøve at udtrykke dette her. Lad mig gå videre og åbne op gedit. Jeg har tænkt mig at gå videre og gemme en fil kaldet "floats0.c" bare for at være overensstemmelse med et eksempel, der er tilgængelige online, hvis du gerne vil. Og jeg har tænkt mig at gå videre og definere det som følger - Jeg har tænkt mig at gå videre og sige, int main tomrum, som vi ofte gør. Og så i dette program, vil jeg erklære mig en float, så en 32-bit variabel kaldet f, vilkårligt. Og så jeg har tænkt mig at gemme i det Jeg ved det ikke, en tiendedel, så 0.1. Så jeg har tænkt mig at udtrykke, at som én divideret med 10, hvilket er helt legitime i C. Og så på den anden linje, jeg simpelthen ønsker at udskrive denne værdi. Så minde om, at vi kan bruge den velkendte printf. Vi ønsker ikke at bruge% i for en int. Vi ønsker at bruge% f for en svømmer. Og så vil jeg tænkt mig at gøre backslash n, tæt citat, komma, f, semikolon. Så her er mit program. Der er allerede én fejl. Er der nogen, for hvem denne klikket vil allerede pege mindst én fejl jeg har lavet? Ja? Ja. Jeg glemte "# include" på top, de symptom på som, hvis jeg forsøger at kompilere dette vil være, at compiler vil råbe på mig, siger udefineret symbol eller noget i den retning. Det betyder ikke forstå noget gerne printf. Så jeg har tænkt mig at gøre "# include "Gemme filen. Og nu er det i bedre form. Men jeg vil også pege ud én ny detalje i dag. Ud over at angive sted holdere som% f% i% s, kan du undertiden påvirke adfærden af denne pladsholder. For eksempel, i tilfælde af en variabel pointværdi, hvis jeg kun vil at vise én decimal efter periode, kan jeg rent faktisk gør 0.1f. Så med andre ord, adskille jeg f og procenttegn med 0,1, bare fortæller printf, har du måske en hel masse tal efter kommaet punkt for mig. Men jeg kun ønsker at se en af ​​dem. Så jeg har tænkt mig at gå videre nu og spar dette program, skal du gå ind i min terminal vinduet, og jeg har tænkt mig at gå videre og type gør float 0, ind. Jeg kan se, at noget kryptiske linje, vil begynde at give mere mening, da vi drille det fra hinanden i denne uge og næste. Nu vil jeg gå videre og køre float nul. Og, fandens. Så der er en anden fejl her for nogle grund. Jeg er temmelig sikker på, at en tiendedel eller én divideret med 10, er ikke 0.0. Måske er jeg bare ikke ser ved nok cifre. Så hvorfor ikke siger jeg to .2 at se to decimaler stedet for blot én. Lad mig gå tilbage til min terminal vindue her og ramt op et par gange for at se min historie. Gør flyde nul igen, og derefter op igen. Og nu ind. Og nu er jeg temmelig sikker på det er forkert. Og jeg kunne gøre tre og fire, og jeg er sandsynligvis kommer til at holde se nuller. Så hvor er fejlen? Én divideret med 10, bør være 0,1. Nogen ønsker at tage et stik på, hvad det grundlæggende spørgsmål er? Ja? De er begge heltal. Og hvad så? Så med et divideret med 10, der er hvad jeg gør i matematik. Og jeg får 0.1. Ja. Og så er det faktisk, at spørgsmålet. Når du tager et heltal i en computer og du dividere det med et andet heltal, computeren som standard vil antage, at du vil have et heltal. Problemet er dog, selvfølgelig, er at 0,1 ikke er et heltal. Det er et reelt tal. Og så hvad computeren gør ved Standard er det bare smider væk alt efter kommaet. Det betyder ikke runde ned eller op per se. Det bare smider alt væk efter kommaet. Og nu det giver mening. Fordi nu er vi helt klart tilbage med nul. Men vent et øjeblik. Jeg kan ikke se en int nul. Jeg faktisk ser 0,00. Så hvordan kan jeg forene det nu? Hvis man divideret med 10 er nul, men jeg er se 0.00, hvor er det at få konverteres tilbage til et reelt tal? Ja. Præcis. Så op her på linje fem, da jeg faktisk gemme det 0,1, som derefter trunkeret til nul, inde i en float, det er faktisk svarer til lagre den ikke som en int, men ja, som en float. Desuden, jeg derefter bruge printf til udtrykkeligt udskrive dette nummer til to decimaler selvom der måske faktisk ikke være nogen. Så denne slags stinker, right? Tilsyneladende kan du ikke gøre matematik, i det mindste på dette niveau af præcision, i en computer. Men sikkert er der en løsning. Hvad er den enkleste fix kunne vi måske gøre, bare intuitivt her løse dette? Ja? Drej heltal ind - ja. Selvom jeg ikke er helt sikker på, hvad der er virkelig foregår her, hvis det fundamentalt har at gøre med disse både være ints, ja, hvorfor ikke jeg gør at 10,0, hvilket gør dette 1.0, gem filen. Lad mig gå ned til bund og rekompilering. Lad mig nu køre. Og der - Nu har jeg fået min en tiendedel repræsenteret 0,10. Ok. Så det er ikke dårligt. Og lad mig påpege en anden vej vi kunne have løst dette. Lad mig faktisk rulle tilbage i tiden til, når vi havde dette som en tiendedel et øjeblik siden. Og lad mig gå videre og gem denne fil som et andet filnavn, for blot at har en lille checkpoint. Så det var udgave én. Og lad mig nu gå videre og gøre én mere versionen. Vi kalder denne udgave to zero indekseret. Og jeg har tænkt mig at stedet gøre det - ved du hvad? Tilføjelse dot nul fungerer i dette tilfælde. Men formoder, at man var en variabel. Formodes 10 var en variabel. Med andre ord, formoder, at jeg ikke kunne bare hårdt kode .0 ved udgangen af denne aritmetiske udtryk. Tja, jeg kan faktisk gøre noget i parentes kaldes støbning. Jeg kan kaste, at heltal 10 til en float, og jeg kan kaste, at heltal en til en flyde, samt. Så matematik, der kommer til at ske effektivt 1.0 divideret med 10,0, resultatet heraf går if som før. Så hvis jeg kompilere det som gør flåd 2., og nu flyder 2, får jeg den samme besvare, samt. Så dette er en temmelig kunstig eksempel, at løse dette problem ved at indføre støbning. Men generelt er casting kommer til at være en kraftfuld ting, især for Problemet indstille to i en uges tid, hvor du ønsker at konvertere en datatype andet, at ved udgangen af ​​dagen er repræsenteret på den samme måde. Ved slutningen af ​​dagen, hver enkelt ting, vi har talt om hidtil er bare ints under hætten. Eller hvis det er for lavt niveau for dig, de er bare tal under hætten. Selv tegn, igen, husker fra uge nul, er tal under hætten. Hvilket vil sige, vi kan konvertere mellem forskellige typer af numre, hvis de er bare bits. Vi kan konvertere mellem numrene og breve, hvis de er bare bits, og vice versa. Og støbning på denne måde er en mekanisme i programmering, der lader dig magt ændre en datatype til en anden. Desværre er det ikke så ligetil som jeg kunne have ønsket. Jeg har tænkt mig at gå tilbage til flåd 1, som var enklere, mere ligetil med .0 Tilføjet til hver. Og ligesom en opfrisket, lad mig gå videre og kompilere dette, skal flåd 2 - Beklager, det er at gøre flåd 1.. Og lad os nu køre flåd 1.. Og i bunden, bemærk at jeg faktisk får 0.1. Så problem løst. Men ikke endnu. Jeg er nu kommer til at få en smule nysgerrig, og jeg har tænkt mig at gå tilbage til mit printf erklæring og sige, ved du hvad? Jeg vil gerne bekræfte, at denne er virkelig en tiendedel. Og jeg har tænkt mig at ønsker at se denne til,, siger fem decimaler. Det er ikke et problem. Jeg ændre to til fem, Jeg kompilere med lave. Jeg køre det som flyder 1.. Ser temmelig godt. Mine fornuftighedskontroller kan ende der, men Jeg får lidt mere eventyrlystne. Jeg har tænkt mig at ændre 0,5-0,10. Jeg ønsker at se 10 cifre efter det decimal. Og jeg har tænkt mig at gå videre og kompilere dette og køre svæver 1.. Jeg slags beklagelse have testet dette længere, fordi min matematik er ikke så korrigere længere, det forekommer. Men vent et øjeblik, måske det er bare et lykketræf. Måske computer fungerer en lille smule mærkeligt. Lad mig gå videre og gøre 20 decimaler og berolige mig selv, at jeg kender hvordan man gør matematik. Jeg ved, hvordan man programmerer. Foretag flåd 1, rekompilere og helvede. Det er virkelig, virkelig komme langt fra mærket. Så hvad sker der her? Intuitivt er baseret på vores antagelser tidligere om størrelsen af ​​datatyper hvad der skal ske her under hætten? Ja? Præcis. Hvis du ønsker denne meget præcision, og det er en pokkers af en masse præcision - 20 numre efter kommaet. Du kan umuligt udgøre en vilkårligt antal medmindre du har en vilkårligt antal bits. Men det gør vi ikke. For en svømmer, har vi kun 32 bit. Så hvis 32 bit kan kun ionbyttet i en måde - ligesom vores mennesker på, scene hænderne op eller ned - i et begrænset antal måder, er der kun et begrænset antal af reelle tal, du kan repræsentere med disse bit. Og så computeren sidst er nødt til at begynde at skære hjørner. Computeren kan skjule disse detaljer fra os for en lille smule tid. Men hvis vi begynder at stikke på tallene og ser længere og længere på efterstillede tal i hele tal, så vi begynder at se, at det er faktisk tilnærme idé på en tiendedel. Og så viser det sig, tragisk, er der et uendeligt antal numre Vi kan ikke repræsentere netop i en computer, i det mindste med en endelig Antallet af bits, et endeligt mængden af ​​RAM. Nu desværre, det til tider har virkelige verden konsekvenser. Hvis folk ikke helt sætte pris på denne eller slags tager for givet, at deres computer bare vil gøre, hvad de fortæller det til at gøre, og ikke forstå disse underliggende repræsentation detaljer - som ærligt talt, i nogle sprog er skjult for brugeren, i modsætning til C - nogle dårlige ting kan ske. Og hvad jeg troede, vi ville gøre er at tage et skridt tilbage. Og det er omkring en otte-minutters video. Det blev sendt for et par år siden, og det giver indblik i faktisk hvad der kan gå galt, når du under-værdsætte disse former for detaljer i meget alt for virkelige verden. Hvis vi kunne dæmpe lyset i et par minutter. SPEAKER 1: Vi vender nu tilbage til teknik katastrofer på Modern Marvels. Computere - vi har alle kommet til at acceptere ofte frustrerende problemer der går med dem. Bugs, vira og software glitches er små priser til at betale for bekvemmelighed. Men i high-tech og high-speed militær og rumprogram applikationer, den mindste problem kan forstørres i katastrofen. Den 4. juni 1996 udarbejdet forskerne at lancere en ubemandet Ariane 5 raket. Det var i færd videnskabelige satellitter til formål at skabe præcist, hvordan Jordens magnetfelt interagerer med solvind. Raketten blev bygget til det europæiske Rumorganisation og løftes fra dets facilitet på kysten Fransk Guyana. JACK GANSSLE: I omkring 37 sekunder inde flyvningen, de først bemærket noget gik galt. Dyserne blev dreje i en måde, de burde virkelig ikke. Ca. 40 sekunder inde i flyvningen, klart køretøjet var i knibe. Og det er, når de lavede en beslutning om at ødelægge det. Sortimentet sikkerhed officer med enorme tarme, trykkede på knappen, sprængte raketten før den kunne blive en fare for den offentlige sikkerhed. SPEAKER 1: Dette var den jomfrurejse af Ariane 5 og dens ødelæggelse fandt sted på grund af en indbygget fejl i rakettens software. JACK GANSSLE: Problemet på Ariane var, at der var en række det krævede 64 bits til at udtrykke. Og de ønskede at konvertere til en 16-bit tal. De antog, at antallet var aldrig vil være meget stor, at de fleste af disse cifre i 64-bit Antallet var nuller. De var forkert. SPEAKER 1: Den manglende evne af et software program til at acceptere den slags tal, som genereres af en anden var ved roden af ​​den manglende. Softwareudvikling var blevet en meget kostbare del af ny teknologi. Ariane 4 raket havde været meget succes, så meget af softwaren skabt for det var også anvendes i Ariane 5. PHILIP COYLE: Det grundlæggende problem var at Ariane 5 var hurtigere, fremskyndes hurtigere. Og softwaren ikke havde tegnede sig for det. SPEAKER 1: Ødelæggelsen af ​​raketten var en enorm økonomisk katastrofe, alle på grund af et minut softwarefejl. Men dette var ikke første gang data konvertering problemer var plaget moderne raketteknologien. JACK GANSSLE: I 1991 med starten af den første Golfkrig, Patriot missil oplevet en lignende art en række konvertering problem. Som følge heraf var 28 amerikanske soldater dræbt og omkring 100 andre såret når Patriot, som skulle at beskytte mod indkommende Scuds, undladt at affyre et missil. SPEAKER 1: Når Irak invaderede Kuwait, og America lancerede Desert Storm i begyndelsen af ​​1991, Patriot missil-batterier blev indsat for at beskytte Saudi-Arabien og Israel fra irakisk Scud missilangreb. The Patriot er et amerikansk mellemdistance overflade-til-luft-system fremstillet af Raytheon selskab. THEODORE POSTOL: Størrelsen af ​​Patriot opfanger selv er groft 20-meter lang. Og det vejer omkring 2000 pounds. Og det bærer et sprænghoved på omkring - Jeg synes det er omkring 150 pounds. Og sprænghoved selv er en højeksplosive der har fragmenter omkring det. Den beklædning i sprænghoved er konstrueret at optræde som hagl. SPEAKER 1: missiler udføres fire pr beholder og transporteres af en sættevogn. PHILIP COYLE: The Patriot anti-missil systemet går tilbage til mindst 20 år nu. Det var oprindeligt designet som en luftforsvar missil nedskyde fjendtlige fly. I den første Golfkrig, når denne krig kom, hæren ønskede at bruge det at nedskyde Scuds, ikke fly. Den irakiske luftvåben var ikke så meget af et problem. Men hæren var bekymret Scuds. Og så de forsøgte at opgradere Patriot. SPEAKER 1: Aflytning en fjende missil rejser på mach fem var vil være udfordrende nok. Men da Patriot blev hastet ind service, hæren var ikke klar over en Irakiske modifikation, der gjorde deres Scuds næsten umuligt at ramme. THEODORE POSTOL: Hvad skete er Scuds der var kommer var ustabil. De var slingrende. Grunden til dette var irakerne, i For at få 600 km ud af en 300-kilometer-range missil tog vægt af den forreste sprænghoved. De gjorde sprænghoved lysere. Så nu Patriot forsøger at komme på Scud. Og det meste af tiden, den overvældende størstedelen af ​​den tid, det ville bare flyve ved Scud. SPEAKER 1: Når Patriot-systemet operatører indså Patriot savnet sit mål, de detonerede Patriots sprænghoved for at undgå mulig tab, hvis det blev tilladt at falde til jorden. THEODORE POSTOL: Det var, hvad de fleste folk så som store ildkugler på himlen og misforstået som aflytninger af Scud sprænghoveder. SPEAKER 1: Selv om i nat himmel Patrioter syntes at være vellykket ødelægge Scuds på Dhahran der kunne ikke fejl om dens ydeevne. Der, Patriot radarsystem tabt styr på en indkommende Scud og aldrig iværksat på grund af en software-fejl. Det var israelere, der først opdagede at jo længere systemet var på, jo større tidssammenfald forfaldt til et ur indlejret i systemets computer. JACK GANSSLE: Omkring to uger før tragedie i Dhahran, israelerne indberettes til forsvarsministeriet at systemet var ved at miste tid. Efter omkring otte timers drift, bemærkede de, at systemet er bliver mærkbart mindre nøjagtige. Forsvarsministeriet reagerede ved fortæller alle de Patriot batterier at ingen af ​​systemerne på i lang tid. De har aldrig sagt, hvad en lang tid var. Otte timer? 10 timer? 1000 timer? Ingen vidste det. SPEAKER 1: The Patriot batteri stationeret på kasernen på Dhahran og dets mangelfulde interne ur havde været på mere end 100 timer på natten 25. februar. JACK GANSSLE: Det spores tid til en nøjagtighed på omkring en tiendedel af et sekund. Nu, en tiendedel af et sekund er en interessant nummer, fordi det ikke kan være udtrykt i binær nøjagtigt, hvilket betyder det ikke kan udtrykkes nøjagtigt enhver moderne digital computer. Det er svært at tro, men bruge dette som et eksempel. Lad os tage nummer en tredjedel. En tredjedel kan ikke udtrykkes i decimal nøjagtigt. En tredjedel er 0,333 går på til uendeligt. Der er ingen måde at gøre det med absolutte nøjagtighed i decimal. Det er præcis den samme slags problemer der skete i Patriot. Jo længere systemet kørte den værst tiden fejlen blev. SPEAKER 1: Efter 100 timers drift, fejlen i tid var kun omkring en tredjedel af et sekund. Men med hensyn til målretning et missil rejser på mach fem, det resulterede i en tracking error på over 600 meter. Det ville være en fatal fejl for soldaterne ved Dhahran. THEODORE POSTOL: Hvad skete der er en Scud lancering blev opdaget i begyndelsen af advarsels-satellitter. Og de vidste, at Scud kom i deres generelle retning. De vidste ikke, hvor det kommer. SPEAKER 1: Det var nu op til radaren komponent af Patriot-systemet forsvare Dhahran at lokalisere og holde styr på de indkommende fjendtlige missil. JACK GANSSLE: Radaren var meget smart. Det ville faktisk spore positionen af Scud og derefter forudsige, hvor det sandsynligvis ville være den næste gang radaren sendte en puls ud. Der blev kaldt intervallet gate. THEODORE POSTOL: Så når Patriot beslutter er gået tid nok til at gå tilbage og tjekke det næste sted for dette opdagede objekt, det går tilbage. Så når det gik tilbage til den forkerte sted, er det så ikke ser nogen objekt. Og det beslutter, at der ikke var nogen genstand, det var en falsk afsløring og dråber sporet. SPEAKER 1: Det kommende Scud forsvandt fra radar skærmen, og sekunder senere smækkede ind i kasernen. Den Scud dræbte 28 og var den sidste fyret under den første Golfkrig. Tragisk, den opdaterede software ankom ved Dhahran den følgende dag. Den software fejl var blevet fastsat, lukke et kapitel i den urolige historie Patriot missil. Patriot er faktisk et akronym for Trinvis Array SPORING Skæring Target. DAVID J MALAN: Okay, så en ædru eksempel, for at være sikker. Og heldigvis er disse lavere niveau bugs er ikke noget, vi vil typisk at værdsætte, bestemt ikke med nogle af vores tidligste af programmerne. Snarere, de fleste af de fejl vil du møde vil være logisk i naturen, syntaktisk i naturen, hvorved kode fungerer bare ikke rigtigt. Og du ved det temmelig hurtigt. Men især når vi kommer til slutningen af ​​semestret, det kommer til at bliver mere og mere af en mulighed for at virkelig tænke hårdt om design af dine programmer og de underliggende repræsentation der også, af data. For eksempel, vil vi introducere MySQL, som er et populært database motor som du kan bruge med hjemmesider til gemme data på bagenden. Og du bliver nødt til at begynde at afgøre, på slutningen af ​​semestret ikke kun, hvad typer af data langs disse linjer at bruge men præcis hvor mange bits til at bruge, hvorvidt du ønsker at gemme datoer som datoer og tidspunkter som tider, og også ting som hvor stor vil du have entydige id'er til at være for, siger, brugerne i din database. Faktisk haft, hvis nogle af jer har Facebook tegner sig for temmelig lang tid, og du ved, hvordan du får adgang til til din bruger-id - som undertiden dukker op i din profil URL, medmindre du har valgt en kaldenavn for den webadresse, eller hvis du har brugte Facebooks Graph API, den offentligt tilgængelig API, som du kan bede Facebook for rådata - kan du se, hvad din numerisk id er. Og for nogle år siden, Facebook væsentlige måttet ændre fra at bruge svarer til int'er at bruge lang lang, fordi over tid som brugere kommer og gå og skabe masser af konti, og falske konti, selv de meget let var i stand til at udtømme noget som en 4 milliarder mulig værdi som en int. Så mere på den slags spørgsmål ned ad vejen,. samt Okay, så det var casting. Det var upræcist. Et par hurtige meddelelser. Så sektioner formelt begynder denne kommende Søndag, mandag, tirsdag. Du vil høre via e-mail senere i denne uge at din afdeling opgave. Og du vil også her på det punkt, hvor at ændre din afdeling, hvis din tidsplan er nu ændret eller din komfort niveau er nu ændret. Imens P-set én og hacker man er grund denne torsdag med mulighed for at forlænge fristen pr specifikationer til fredag i en typisk måde. Indse, at følger med problemet sæt specifikationer er instruktioner om hvordan man bruger CS50 apparat, gør, samt nogle CS50 konkrete værktøjer agtig stil 50, der kan give dig feedback dynamisk på kvaliteten af ​​din kode stil og også tjek 50, der kan give dig dynamisk feedback på din kodens korrekthed. Tilgiv, at vi stadig strygning ud et par kinks med checken 50 år. Et par af dine klassekammerater, der gjorde begynde omkring 04:00 fredag ​​aften, når spec gik op have bemærket siden et par bugs, som vi arbejder igennem, og undskyldninger for alle, der har oplevet uberettigede frustrationer. Fejlen er min. Men vi vil følge op på CS50 diskutere, hvornår der er løst. Så et ord på scoringer selv. Så det vil være en uge eller to, før du begynder at få feedback på problemet sæt fordi du endnu ikke har en undervisning fyr. Og selv da, vil vi begynde at evaluere C problemet sæt, før vi gå tilbage og evaluere bunden så at du får mere relevant tilbagemeldinger hurtigere. Men generelt per pensum, CS50 problem sæt evalueres langs efter fire akser - rækkevidde, korrekthed, design og stil. Scope vil være en række typisk mellem nul og fem, indfanger hvor meget af stykke, som du smule. Typisk, vil du have dette at være fem. Du i det mindste prøvet alt. Og mærke det er en multiplikativ faktor således at gøre kun en del af Problemet sæt er ikke den bedste strategi. I mellemtiden mere indlysende er det vigtigheden af ​​korrekthed - bare dit program korrekt med respekt til specifikationen? Det vægtes bevidst mere hårdere end de to andre akser ved en faktor tre, fordi vi anerkender der typisk du kommer til at tilbringe en meget mere tid jagter ned nogle bugs, få din kode for at arbejde, så er du er indrykke den og vælge passende variable navne og gerne, der er på den anden ende af spektret af stil. Det er ikke til at sige stil er ikke vigtigt, og vi vil prædike det over gang både i foredrag og i sektioner. Stil refererer til æstetik af din kode. Har du valgt vel-navngivne variabler der er korte, men noget beskrivende? Er din kode indrykket som du har set i foredrag og på en måde, med stil 50? Endelig er designet til højre der i midten. Design er jo sværere en til at sætte en finger på, fordi det er meget mere subjektive. Men det er måske den vigtigste af De tre akser i form af pædagogisk værdi over tid, og at dette vil være undervisningen stipendiatens mulighed for at give dig kvalitativ feedback. Ja, i CS50 selvom vi har disse formler og scoringer, som ultimo af dagen disse er meget bevidst meget små spande - kommaværdier mellem nul og tre og nul og fem. Vi forsøger ikke at trække meget grove linjer mellem problem sæt eller mellem studerende, men snarere fokusere så meget som Vi kan på kvalitative, hånden feedback, enten maskinskrevet eller verbale fra netop din undervisning fyr, du får at vide ganske godt. Men i almindelighed er dem vægtene at de forskellige akser skal have. I mellemtiden også, det er værd at holde i imod, at man ikke bør antage, at en tre ud af fem er en 60% og derfor groft svigter. Tre er bevidst menes at være slags midten af ​​vejen godt. Hvis du får treere på semesterstart, det er faktisk beregnet til at være en god sted at begynde. Hvis du får toere, messer, er der absolut noget arbejde til at betale lidt mere opmærksomhed, for at drage fordel afsnit og kontortid. Hvis du får fours og femmere, store. Men virkelig, vi håber at se baner blandt de studerende - meget individualiseret per elev, men starter semestret her slags de to til tre rækkevidde, men slutter heroppe i de fire til fem rækkevidde. Det er, hvad vi virkelig søger. Og vi huske deltaet, som du udviser mellem uge nul og uge 12, når jeg laver kvaliteter. Det betyder ikke noget for os helt hvordan du retfærdigt i starten, hvis din bane er faktisk opad og stærk. Akademisk ærlighed - så lad mig sætte på min mere alvorlig stemme for bare et øjeblik. Så dette kursus har sondringen for sende flere studerende end nogen anden i historien til annoncen bord, tror jeg. Vi har slags mistet optælling på dette punkt, hvor ofte dette sker. Og det er ikke fordi de studerende i 50 er mere uærlig end deres klassekammerater andetsteds. Men indser også, at vi er meget gode til at opdage den slags ting. Og det er den fordel, at en datalogi klasse har i, at vi kan, og vi sammenligne alle elever Problemet sætter parvise imod enhver anden, ikke kun i år men alle tidligere år. Vi har evnen, ligesom studerende i klassen, Google og finde koden på websteder som github og diskussionsfora. Der er absolut løsninger på CS50 s p-sæt flyder rundt der. Men hvis du kan finde dem, vi kan finde dem. Og alt dette er meget automatiseret og nemt og trist for os at finde. Men jeg vil gerne understrege, også, at de Uddannelsens faglige ærlighed politik meget betød at være meget det modsatte af denne ånd. Faktisk dette år har vi omformuleret tingene i pensum at være denne, dot dot dot med flere detaljer i pensum. Men det overordnede tema i kurset er virkelig at være rimelig. Vi anerkender, at der er en betydelig mængde af pædagogisk værdi i samarbejdende, til en vis grad, med klassekammerater, hvor du to eller du tre eller du flere er stående på et hvidt bord whiteboarding, så at tale, dine ideer - at skrive pseudokode i billeder, diagrammering hvad skal Mario være, hvis du skulle skrive det første i pseudokode. Hvad skal grådige algoritme - hvordan skal den opfører per Problemet sætter en? Og så indse, at adfærden at vi tilskynder er meget meget langs disse linjer. Og i pensum, vil du se en hel masse kugler under en rimelig kategori og en ikke rimeligt kategori, der hjælper os med at hjælpe du pakke dit sind omkring hvor vi trækker denne linje. Og generelt, en anstændig tommelfingerregel er, at hvis du kæmper for at løse nogle fejl og din ven eller klassekammerat sidder ved siden af ​​dig, det er rimeligt for dig at vise ham eller hende din kode og sige, hey, kan du hjælpe mig regne ud, hvad der går galt her? Vi typisk ikke omfavne den modsatte side. Det er ikke et korrekt svar til din ven eller klassekammerat her for at sige, åh, bare se på mine og tal det ud fra det. Det er slags urimeligt. Men efter at have en anden, en anden hjerne, et andet par øjne ser på skærmen, eller se på din kode og sige, er du sikker på du vil at have en løkke her? Eller er du sikker på du vil at semikolon her? Eller åh, det fejlmeddelelsen betyder dette. De er meget rimelige og opmuntret adfærd. De sager, som jeg hentydede til tidligere koges ned til, når eleverne er sent på aftenen gør dårlig dømmekraft beslutninger og emailing deres kode til en anden eller bare at sige, her, det er i Dropbox eller Googling sent om natten. Og så vil jeg opmuntre og beder dig, hvis du har dem uundgåelige øjeblikke af stress, du ramlede mod deadline, har du ingen sent dag, da det er allerede fredag ​​på det punkt, email kursets hoveder eller selv direkte. Sig, lytte, jeg er på min bristepunktet her. Lad os få en samtale og regne det ud. Ty til internettet eller en anden ikke rimelig adfærd er aldrig løsning, og alt for mange af dine klassekammerater er ikke længere her på campus på grund af, at dårlig dømmekraft. Men det er meget nemt at nederdel denne linje. Og her er et lille billede til at juble dig fra Reddit så der nu alt vil være OK. Så en hurtig resumé, så af, hvor vi slap. Så i sidste uge, minde om, at vi indfører betingelser, ikke i Scratch men i C denne gang. Og der var nogle nye syntaks, men virkelig ingen nye ideer selv. Vi havde boolske udtryk, vi kunne eller sammen med to lodrette barer eller og sammen med to ampersands, siger, at både venstre og retten skal være sandt for at dette kan udføre. Derefter havde vi switches, som vi kiggede ved kortvarigt, men jeg foreslår, er virkelig bare forskellige syntaks for at nå samme slags mål, hvis du kender i forhånd, hvad dine sager vil være. Vi kiggede på sløjfer. En for-løkke er måske den mest almindelige, eller i det mindste den ene, at folk typisk nå til instinktivt. Selvom det ser lidt kryptisk, du vil se mange, mange eksempler på denne inden længe, ​​som du har allerede i slutningen af ​​sidste uge. Mens sløjfer kan ligeledes opnå det samme. Men hvis du ønsker at gøre nogen optælling eller ajourføring af variable værdier, er du nødt til gøre det mere manuelt end for loop før tillader. Og så er der den do-while løkke, som giver os mulighed for at gøre noget ved mindst én gang, mens noget ellers er sandt. Og det er især god til programmer eller til spil, hvor du ønsker til at bede brugeren for noget mindst én gang. Og så, hvis han eller hun ikke samarbejder, du måske ønsker at gøre det igen og igen. Med variable, i mellemtiden havde vi linjer kode som dette, der kunne være to linjer. Du kunne erklære en kaldet int tæller, semikolon. Eller du kan bare erklære og definere det, så at sige. Give det en værdi på samme tid. Og så endelig, talte vi om funktioner. Og dette var en nice eksempel på den forstand, at det illustrerer to typer funktioner. Ene er getString (), som igen får en streng fra brugeren. Men getString () er lidt interessant, så vidt vi har brugt det, fordi vi altid har brugt det med noget på venstre side af en lighedstegn. Det vil sige, at getString () returnerer en værdi. Den returnerer naturligvis en streng. Og derefter på den venstre side, er vi simpelthen gemme denne streng inde i en variabel kaldet navn. Det er anderledes, i en vis forstand, fra printf fordi printf, mindst i vores forbrug her ikke vender tilbage noget. Som en sidebemærkning, betyder det tilbagevenden noget. Vi bare ligeglad, hvad det er. Men det har, hvad der er kaldes en bivirkning. Og hvad er det bivirkning i alle tilfælde, vi har set hidtil? Hvad betyder printf gøre? Den udskriver noget til skærmen, displays tekst eller tal eller noget på skærmen. Og det er bare betragtes som en bivirkning fordi det ikke er rigtig at uddele det tilbage til mig. Det er ikke et svar inde i en sort boks, som jeg derefter kan nå ind og få fat. Det er bare at gøre det på sin egen, meget ligesom Colton var tilsluttet dette black box i sidste uge, og han eller anden måde magisk var trække på tavlen uden mig faktisk involveret. Det ville være en bivirkning. Men hvis jeg havde faktisk at nå tilbage i her og sige, åh, her er strengen fra brugeren, ville det være en tilbagevenden værdi. Og hidtil har vi kun anvendte funktioner at andre mennesker har skrevet. Men vi kan faktisk gøre disse slags ting selv. Så jeg har tænkt mig at gå ind i CS50 apparat igen. Lad mig slutte den fane, vi havde åbne for et øjeblik siden. Og lad mig gå videre og oprette en ny fil. Og jeg har tænkt mig at gå videre og kalder dette ene positive.c. Så jeg ønsker at gøre noget med positive tal her. Så jeg har tænkt mig at gå videre og gøre int - sorry - # Include. Lad os ikke gøre det samme fejl som før. Int main (void), åben curly klampe, lukket klammeparentes. Og nu vil jeg gøre følgende. Jeg vil skrive et program, der insisterer på, at brugeren giver mig et positivt heltal. Så der er ingen GetPositiveInt funktion i CS50 biblioteket. Der er kun GetInt (). Men det er OK, fordi jeg har den konstruktioner, som jeg kan pålægge en lidt mere pres på denne værdi. Jeg kunne gøre noget som dette. Så int n - og hvis du skriver sammen, bare indse Jeg har tænkt mig at gå tilbage og ændre nogle ting i et øjeblik - så int n lig GetInt (). Og det kommer til at sætte en int indersiden af ​​n.. Og lad mig være en mere beskrivende. Lad mig sige noget som jeg forlanger, at du give mig et positivt heltal. Ok. Så bare en lille smule af instruktioner. Og nu, hvad kan jeg gøre? Nå, jeg allerede kender fra min simple betingelser eller filialer, ligesom jeg havde i Scratch, kunne jeg sige noget gerne, hvis n er mindre end eller lig med nul, så jeg ønsker at gøre noget gerne, det er ikke positivt. Og så kunne jeg gøre - OK, men jeg virkelig ønsker at få det int. Så jeg kunne gå op her, og jeg kunne slags af eksemplar dette og led dette. Og så, OK. Så hvis n er mindre end eller lig med nul gøre dette. Hvad nu, hvis brugeren ikke samarbejder? Nå, så jeg har tænkt mig at låne dette her. Og så går jeg ind her og her og her. Så dette er tydeligvis ikke løsningen, right? Fordi der er ingen ende i sigte. Hvis jeg ønsker at kræve, at brugeren giver mig et positivt heltal, kan jeg faktisk få int. Jeg kan så kontrollere, om denne int. Men så vil jeg tjekke det igen og tjekke det igen og tjekke det igen. Så selvfølgelig, hvad er bedre konstruere at være ved hjælp her? Okay, så en form for løkke. Så jeg har tænkt mig at slippe næsten alt dette. Og jeg ønsker at få denne int mindst én gang. Så jeg har tænkt mig at sige gøre - og jeg vil vende tilbage til mens der i bare et øjeblik - nu, gør hvad? Jeg har tænkt mig at gøre int n får GetInt (). OK. Så det er temmelig godt. Og nu, hvor ofte gør Jeg ønsker at gøre dette? Lad mig sætte printf indersiden af ​​løkken så jeg kan forlange igen og igen, hvis nødvendigt. Og hvad vil jeg det mens betingelse for at gøre? Jeg ønsker at holde gør dette mens det er tilfældet? Ja. N er mindre end eller lig med nul. Så allerede vi har betydeligt rengøres denne kode op. Vi har lånt en meget enkel konstruktion - gør-while-løkke. Jeg har stjålet bare de vigtige linjer kode, at jeg begyndte at kopiere og indsætning, som ikke var klogt. Og så nu vil jeg faktisk indsætte det her og bare gøre det én gang. Og nu, hvad ønsker jeg at gøre på slutningen af ​​dette program? Jeg vil bare sige noget simpelt gerne, tak for - og Jeg vil gøre% i for int - backslash n, komma og derefter plug in n, semikolon. Ok. Så lad os se, hvad der sker nu når jeg køre dette program. Jeg har tænkt mig at gå videre og gør positiv. Damn. Et par fejl. Så lad mig rulle tilbage op til den første. Må ikke arbejde gennem dem baglæns. Arbejde gennem dem fra toppen og ned at de ikke kaskade, og kun én ting være forkert. Implicit erklæring funktion GetInt (). Ja. Så det var ikke nok. Jeg slags lavet den samme fejl, men lidt anderledes denne gang. Jeg skal ikke kun omfatte stdio.h men også cs50.h, som omfatter såkaldte erklæringer om at få int, hvilket undervise apparatet eller lærer C hvad GetInt () er. Så lad mig gemme!. Jeg har tænkt mig at ignorere de andre fejl fordi jeg har tænkt mig at håbe, at de er anden måde relateret til fejlen Jeg har allerede fast. Så lad mig gå videre og kompilere med make positive, Enter. Damn. Tre fejl, stadig. Lad mig rulle op til den første. Ubrugte variabel n.. Vi har ikke set det før. Og også dette er lidt kryptisk. Dette er outputtet af compileren. Og hvad der fremhævede linje der - positive.c :9:13 - siger, det siger on line ni af positive.c, på den 13. karakter, 13. kolonne, du har lavet denne fejl. Og i særdeleshed, er det at fortælle mig ubrugt variabel n.. Så lad os se - linie ni. Jeg bruger n i den forstand, Jeg giver det en værdi. Men hvad compileren ikke kan lide, er at jeg ikke tilsyneladende bruger det. Men vent et øjeblik, jeg bruger det. På linje 11, jeg bruger det her. Men hvis jeg rulle ned yderligere på positive.c :11 - så ved linie 11, tegn 12, den compiler fortæller mig, brug af kaldenavn n. Så sort betyder, at jeg har ikke specificeret det som en variabel med en datatype. Men vent et øjeblik. Jeg gjorde præcis det på linje ni. Så nogen er virkelig forvirret her. Det er enten mig eller compiler, fordi på linje ni, igen jeg erklære en int n, og jeg tildele det returnere værdien af ​​GetInt (). Så jeg bruger denne variabel n på linje 11 og kontrollere, hvis dens værdi er mindre end eller lig med nul. Men det er tilsyneladende dårlige og brudt hvorfor? Sig det igen? Ah, jeg nødt til at erklære n før ind i løkken. Men hvorfor? Jeg mener, vi netop foreslået en smule siden, at det er fint at erklære variabler alle på én linje og derefter tildele dem en vis værdi. En global variabel - lad os vende tilbage til denne idé i bare et øjeblik. Hvorfor vil du have mig til at sætte den ud af løkken? Det er. Præcis. Så, omend noget ulogisk, lad mig opsummere. Når du erklærer n inde af gør blokken der - specifikt inde i de krøllede parenteser - denne variabel n har, hvad der er kaldes en rækkevidde - relateret til vores pointsystem i kursus - men har en rækkevidde, der er begrænset til de krøllede parenteser. Med andre ord, hvis du typisk erklærer en variabel inde i et sæt krøllede parenteser, at variable eksisterer kun indersiden af ​​disse krøllede parenteser. Så ved denne logik alene, men selv Jeg har erklæret n på linje ni, det væsentlige forsvinder fra anvendelsesområdet forsvinder fra hukommelsen, så at sige, med den tid, jeg ramte linie 11. Fordi linje 11, desværre, er uden for disse krøllede parenteser. Så jeg kan desværre ikke løse dette ved gå tilbage til, hvad jeg gjorde det før. Du kan i første omgang gøre det. Men hvad er du nu ikke laver cyklisk? Du naturligvis ikke at få int cyklisk. Så vi kan forlade GetInt (), og vi skal forlade GetInt () inde i loop fordi det er hvad vi ønsker at forpeste brugeren om igen og igen. Men det er tilstrækkeligt til at gå op til linje, siger seks. Int n, semikolon. Må ikke give det en værdi endnu, fordi du behøver ikke at bare endnu. Men nu hernede, varsel - det ville være en meget nem fejltagelse. Jeg ønsker ikke at skygge min tidligere erklæring n. Jeg ønsker at bruge n som rent faktisk eksisterer. Og så nu i linje 10, Jeg tildeler n en værdi. Men på linje seks, erklærer I n. Og så kan jeg eller kan jeg ikke bruge det i linje 12 nu? Jeg kan, fordi mellem hvilke krøllet seler er n erklæret nu? Den ene op her på linje fem. Til en her på linie 14.. Så hvis jeg nu zoome ud, skal du gemme denne fil, gå tilbage i og køre gøre positive, det udarbejdet denne gang. Så det er allerede fremskridt. Slash. . / Positive, Enter. Jeg forlanger, at du giver mig et positivt heltal. Negativ 1.. Negativ 2.. Negativ 3.. Nul. One. Og tak for den ene er hvad der nu er udskrevet. Lad mig prøve noget andet, ud af nysgerrighed. Jeg bliver bedt om at indtaste et heltal. Men hvad nu hvis jeg i stedet skrive i lam? Så du nu se en anden prompt - prøv igen. Men ingen steder i min kode jeg skriver prøv igen. Så hvor formentlig, er det prøve igen bede kommer fra, ville du sige? Ja, fra GetInt () selv. Så en af ​​de ting, CS50 personale gør for dig, i det mindste disse første par uger har vi skrevet nogle beløb af fejlkontrol til at sikre, at hvis du kalder GetInt (), vil du i det mindste komme tilbage en int fra brugeren. Du vil ikke få en streng. Du vil ikke få en char. Du vil ikke få noget helt andet. Du får en int. Nu kan det ikke være positiv. Det er måske ikke være negativ. Vi giver ingen garantier omkring dette. Men vi vil forpeste brugeren for at prøve igen, prøve igen, prøve igen, indtil han eller hun faktisk samarbejder. Tilsvarende, hvis jeg gør 1,23, det er ikke en int. Men hvis jeg skriver i, siger, 50, der giver mig en værdi, som jeg ønskede. Ok. Så ikke dårligt. Eventuelle spørgsmål om, hvad vi lige har gjort? Nøglen takeaway er, at være klar, ikke så meget løkke, som vi har set før selvom vi har ikke rigtig brugt det, men spørgsmålet om omfanget, hvor variable kan kun kan kun bruges inden nogle nærmere angivet omfang. Okay, lad mig tage fat forslaget du har lavet tidligere, at en global variabel. Som en sidebemærkning viser det sig, at en anden løsning på dette problem, men typisk en forkert opløsning eller en dårligt designet løsning, er at erklære din variabel som, hvad der er kaldes en global variabel. Nu er jeg slags krænke min definition af muligheder, fordi der er ingen krøllede parenteser allerøverst og selve bunden af ​​en fil. Men konsekvenserne af denne er det nu i overensstemmelse fire, n er en global variabel. Og som navnet antyder, er det bare tilgængelig overalt. Scratch har faktisk disse. Hvis du har brugt en variabel, kan du huske du skulle vælge, hvis det er for dette sprite eller for alle sprites. Tja, alle sprites er bare tydeligere måde at sige global. Ja? Ah, virkelig godt spørgsmål. Så huske, at i den allerførste udgave af min kode, da jeg forkert erklæret og defineret n på linje ni - Jeg erklærede det som en variabel og jeg gav det en værdi med opgaven operatør - dette gav mig to fejl. Én, at n ikke er blevet anvendt, og to, at i linie 11 Det var bare ikke deklareret. Så den første jeg gjorde ikke adresse på det tidspunkt. Det er strengt taget ikke en fejl at erklære en variabel, men ikke bruge det. Men en af ​​de ting, vi har gjort i Den CS50 apparat, bevidst, pædagogisk, er vi skrevet op forventninger til compiler til at gøre sikker på, at du laver tingene ikke bare korrekt, men virkelig korrekt. Fordi hvis du erklære en variabel ligesom n og aldrig bruger det, eller bruger det korrekt, så hvad det gør der? Det er virkelig tjener ikke noget formål. Og det er meget nemt over tid, hvis du ikke konfigurerer din egen computer i denne måde, at bare have kode, der har små rester her, rester der. Og så måneder senere du se tilbage og du er ligesom, hvorfor er denne linje af kode der? Og hvis der ikke er nogen god grund, er det gavner ikke dig eller dine kolleger ned ad vejen til at snuble over det dengang. Som en sidebemærkning, hvor er , som kommer fra? Nå, minde om, at hver gang vi kompilere program, alle disse ting er blive udskrevet. Så vi vil vende tilbage til dette. Men igen, gør er et hjælpeprogram, automatiserer processen med udarbejdelse af kører faktiske compiler kaldet klang. Denne ting, vil vi i sidste ende se, har at gøre med debugging med en speciel program kaldet debugger. Dette har at gøre med at optimere kode - mere om det i fremtiden. Std = C99 - dette betyder bare bruge 1999-udgaven af C. C har været omkring endnu længere end det, men de gjorde nogle nice ændringer 10 plus år siden. Og her er de relevante virksomheder. Vi siger gøre noget, tidligere ville have været en advarsel en fejl forhindrer eleven fra kompilering. Og vægorganer gøre det for en hel masse ting, ikke netop relateret til variable. Og så lad mig rulle til slutningen af ​​denne linie. Og også dette vi vil i sidste ende komme tilbage til. Dette er naturligvis navnet filen jeg kompilering. Det minder om navnet på filen Jeg udsender som navnet min kørbar program. Dette-lcs50 betyder blot bruge CS50 bibliotek og eventuelle nuller og ettaller, der personalet skrev og kompileret tidligere dette år, integrerer dem ind i mit program. Og nogen vide, hvad-lm er? Det er den matematiske bibliotek, som er der bare selvom du ikke gør nogen math. Det er bare automatisk forudsat os ved at gøre. Nå, lad mig gøre et andet eksempel her ved at åbne en ny fil. Og lad mig gemme denne ene som string.c. Det viser sig, at når vi taler om data typer i dag, er der endnu mere foregår under hætten end vi har set hidtil. Så lad mig hurtigt gøre en hurtig program. Medtag stdio.h. Og jeg vil gemme det. Og du ved, jeg ikke gør så lad samme fejl igen og igen. Medtag cs50.h. Og lad mig gå videre nu og gør int main (void). Og nu vil jeg bare ønsker at gøre et program der gør dette - erklære en streng kaldet s og få en streng fra brugeren. Og lad mig gøre lidt vejledningen her - bedes du give mig en snor - så brugeren ved, hvad de skal gøre. Og så hernede under dette, Jeg ønsker at gøre følgende - til int i bliver nul. Igen, dataloger typisk begynder at tælle ved nul, men vi kunne gør, at man, hvis vi virkelig ønskede. Nu vil jeg lave jeg er mindre end strengen længde sek. Så strlen - S-T-R-L-E-N - igen, det er kortfattet, fordi det er nemmere at skrive, selvom det er en lidt kryptisk. Det er en funktion, vi har ikke brugt før, men bogstaveligt gør det - tilbage til mig et tal, der repræsenterer længden af ​​strengen at brugeren har indtastet. Hvis de har skrevet i hej, det ville vende tilbage fem, fordi der er fem bogstaver i Hello. Derefter på hver iteration af denne løkke, jeg plus plus. Så igen en standard konstruere selvom du er ikke helt for godt eller fortrolig med det endnu. Men nu hver iteration af denne løkke, mærke til, hvad jeg har tænkt mig at gøre. Jeg ønsker at gå videre og udskrive ud af en enkelt karakter - så% c backslash n på en ny linje. Og så ved du hvad jeg ønsker at gøre? Uanset ordet er at brugeren skriver i, ligesom hej, jeg ønsker at udskrive H-E-L-L-O, ét tegn pr linje. Med andre ord, vil jeg til at komme på enkelte tegn i en streng, hvorved indtil nu en streng har netop været en sekvens af tegn. Og det viser sig, jeg kan gøre s, konsol I tæt beslag, luk parentes, semikolon. Og jeg behøver at gøre én ting mere. Det er i en fil kaldet string.h at strlen deklareres. Så hvis jeg ønsker at bruge denne funktion, Jeg har brug for at fortælle compiler, forventer at bruge det. Lad mig nu gå videre og gøre det program kaldet strengen. Dot, skråstreg, streng. Giv mig en streng. Jeg vil gå videre og skrive det. Hej, i alle caps, Enter. Og nu mærke til jeg har udskrevet dette et tegn efter den anden. Så den nye detalje her er, at en streng, ved slutningen af ​​dagen, kan være tilgås ved hjælp af dens individuelle tegn ved at indføre pladsen beslag notation. Og det er fordi en streng nedenunder hætten er faktisk en sekvens af tegn. Men hvad er pæne om dem er i computerens RAM - Mac, pc, uanset hvad det er - de er bogstaveligt tilbage til tilbage til tilbage - H-E-L-L-O - på individuelt, der støder op bytes i hukommelsen. Så hvis du ønsker at få ram på den ottende byte, som i denne sløjfe ville være beslag nul, beslag én, konsol to, beslag tre beslag fire - der er nul indekseret indtil fem - der vil udskrive H-E-L-L-O på sin egen linje. Nu, som en teaser, så lad mig vise dig slags ting, du vil i sidste ende blive stand til at forstå, i det mindste med nogle close leder. For én, vi hvad indeholdt i dagens eksempler, hvis du gerne vil, er faktisk en af ​​de allerførste jailbreaks til iPhone. Jailbreaking betyder revner telefonen så du kan faktisk bruge det på en anden transportvirksomhed eller installere din egen software. Og du vil bemærke dette ser helt kryptisk, mest sandsynligt. Men se på dette. IPhone var tilsyneladende revnet med en for-løkke, en hvis betingelse, en ellers tilstand, en flok af funktioner vi har ikke set. Og igen, vil du ikke første øjekast formentlig forstå, hvordan dette virker. Men alt det, vi slags tage for givet i vores moderne liv faktisk tendens til at reducere endog til en vis af disse fundamentale vi har været ser på. Lad mig gå videre og åbne en andet program, holloway.c. Så dette også er noget, du burde ikke rigtig kender. Selv ingen af ​​personale eller jeg kunne formentlig finde ud af dette ved at se på det, fordi det var en kode der blev indgivet til, hvad der er historisk kendt som en korrumperet C konkurrence, hvor du skriver et program der kompilerer og kører, men er så pokkers kryptisk intet menneske kan forstå, hvad det kommer til at gøre, indtil de faktisk køre den. Så ja, hvis man ser på dette kode, ser jeg en switch. Jeg ser main. Jeg ser disse firkantede parenteser indebærer en form for en matrix. Er der nogen der ønsker at gætte, hvad dette program faktisk gør, hvis jeg kører Holloway? Ja. OK. Godt gået. Så kun de ansatte, og jeg kan ikke regne ud af, hvad disse ting gør. Og nu endelig, lad mig gå videre og åbne op et andet program. Denne ene - igen, vil vi gøre kildekoden tilgængelig online - det ene er bare slags smuk at se på. Alt, hvad de gjorde, er ramt space bar ganske lidt. Men dette er virkeligt kode. Så hvis du tror, ​​det er smuk, hvis vi faktisk køre dette på prompt, sidste ende vil du se, hvordan vi kan gøre ting som dette. Så vi vil forlade dig på dette notat og se dig på onsdag. [MUSIC Playing] SPEAKER 2: På det næste CS50, TFS iscenesætte et mytteri. SPEAKER 3: Der er han. Få ham! [MUSIC Playing]