[Musikk spilles] DAVID J MALAN: All right, velkommen tilbake til CS50. Dette er begynnelsen av uke to. Et ord fra en av våre venner på campus - hvis du er interessert, muligens, enten nå eller i noen fremtidig sikt selv, en gang mer behagelig, undervisning midt skoleelever litt noe om informatikk, gjøre hodet til denne nettadressen. De er særlig behov akkurat nå av lærere, spesielt hvis du har hadde noen eksponering for informatikk. Så husker at forrige gang, introduserte vi noen datatyper i C, og du har kanskje begynt å få hendene skitne med disse så langt i problemet satt en. Og vi hadde en røye. Så i noe tekniske termer, hva er en røye som du kjenner det i dag? Så det er et tegn, men la oss være mer presis nå. Hva mener vi med karakter eller individuelle røye? En ikke-numerisk karakter - så ikke nødvendigvis. Det viser seg at selv tall, selv tegnsetting og bokstaver er representert med disse dataene skriv kjent som en røye. Så det er ikke nødvendigvis alfabetisk. Yeah? Så det er et ASCII-tegn. Så hvis du tenker tilbake til uke null, når vi hadde vår byte av frivillige komme opp og enten holde hendene opp eller ikke alle, representerte de bits. Men samlet som en gruppe av åtte, de representerte en byte. Og vi introduserte begrepet ASCII på den forelesning, som er rett og slett en kartlegging mellom tall og bokstaver. Og ASCII bruker, som disse menneskene underforståtte, åtte bits for å representere et tegn. Så derfor, hvis åtte bits kan hvert ta på en av to verdier - null eller en - Det betyr at det var to muligheter for denne personen - null eller en - to for denne person to for denne person, to for denne. Så totalt to ganger to ganger to ganger to ganger to - så to den åttende totalt. Så det er et totalt antall tegn 256 mulig at du kan representere med åtte bits. Nå, de av dere som snakker Asiatisk språk kan vite at det er mer tegn i verden enn bare As og Bs og Cs og Ds. Og ja, gjør ASCII ikke være tilstrekkelig for en rekke språk i verden. Men mer om det en annen gang. For nå vet at i C hvis du vil for å representere et bokstav, et stykke tegnsetting, eller bare noe karakter i naturen, bruker vi en røye. Og det er én byte eller åtte bits. Hva med en int? Vel, er en int et heltall. Hvor mange biter, hvis du husker, var et heltall vanligvis? Noen tilbakekallingen? Så det er typisk 32. Det avhenger faktisk på datamaskinen som du bruker. Men i apparatet, og i mange datamaskiner, er det 32 ​​bits eller fire byte - åtte ganger fire. Og ints bare brukes til lagring tall, enten negative, positiv eller null. Og hvis du har 32 bits og du bare bryr seg om positive tall, kan noen ballpark hvor mange mulige heltall en datamaskin kan representere fra null på opp? Derfor ville det være to til det 32, som er omtrent fire milliarder. Så disse makter to kommer til å være tilbakevendende tema i informatikk. Som vi vil se, de er ganske praktisk å jobbe med, selv om det ikke er helt lett å gjøre regnestykket i ens hode. Så vi vil si om lag fire milliarder. Nå, en lang lang - du kan slags gjetning. Det er lenger enn en int. Hvor mange biter? Så 64 bits eller åtte bytes. Dette betyr bare at du kan representere selv større tall, større positiv eller større negative tall. Og hva med flyte? Det er et flyttall verdi av 32 biter. Dette er bare et reelt tall, noe med en desimal. Men hvis du i stedet trenger flere steder etter desimaltegnet eller du ønsker å representerer et større tall med noen brøkdel etter det, kan du bruke en double, som er 64 bits. Men det er en interessant takeaway her. Så hvis ints er begrenset av 32 biter og selv lange longs er begrenset av 64 bits, den slags ber spørsmålet, hva om du faktisk ønsker å telle høyere enn 4 milliarder for en int? Vel, du bare bruke en lang lang. Men hva hvis du ønsker å telle høyere enn to til 64th, gi eller ta? Nå, det er et stort antall. Men til slutt, kanskje du faktisk bryr seg om slike verdier, spesielt hvis du bruker en database og begynner å samle masse og masse data og tilordne unike tall til hver del av disse dataene. Så vi slags har et problem. Og på samme måte, med flyttall verdier - flyter eller dobler - hvis du har bare et endelig antall bits, hvor mange totalt tall kunne du muligens representere? Vel, det er mindre klart når du innebære et desimaltegn. Men det er sikkert begrenset. Hvis du har et endelig antall biter, et endelig antall mennesker, en endelig antall lyspærer, sikkert du kan bare representere et endelig antall flytpunktverdier. Men hvor mange reelle tall er deres i verden? Det er en uendelig. Så det er litt av et problem fordi vi ikke har en uendelig mengde minne eller RAM innsiden av våre datamaskiner. Så noen utfordrende ting kan skje. Så la oss gå videre og prøve å uttrykke dette her. La meg gå videre og åpne opp gedit. Jeg kommer til å gå videre og lagre en fil kalt "floats0.c" bare for å være forenlig med et eksempel som er tilgjengelig på nettet, hvis du ønsker. Og jeg kommer til å gå videre og definerer det slik - Jeg kommer til å gå videre og si, int viktigste tomrom, som vi ofte gjør. Og så i dette programmet, kommer jeg til å erklære meg en dupp, så en 32-bit variabel kalt f, vilkårlig. Og så skal jeg lagre i det Jeg vet ikke, en tidel, så 0,1. Så jeg kommer til å uttrykke det som en dividert med 10, er som perfekt legitimt i C. Og deretter på den andre linjen, er det bare jeg ønsker å skrive ut denne verdien. Så husker at vi kan bruke det kjente printf. Vi ønsker ikke å bruke% i for en int. Vi ønsker å bruke% f for en flåte. Og så skal jeg gjøre backslash n, nær sitat, komma, f, semikolon. Så her er mitt program. Det er allerede en bug. Har noen for hvem dette klikket allerede ønsker å peke på minst en bug jeg har gjort? Yeah? Yeah. Jeg glemte "# include" på toppen, symptom de som hvis jeg prøver å kompilere dette kommer til å være at kompilatoren kommer til å kjefte på meg, sier udefinert symbol eller noe om dette. Det forstår ikke noe liker printf. Så jeg kommer til å gjøre "# include ", Lagre filen. Og nå er det i bedre form. Men jeg er også tenkt å peke ut en ny detalj i dag. I tillegg til å angi stedet holdere som% f% i% s, kan du noen ganger påvirke atferden av at plassholderen. For eksempel, i tilfelle av en flytende poengverdi, om jeg bare vil å vise en desimal etter periode, kan jeg faktisk gjøre 0.1F. Så med andre ord, skiller jeg f og prosenttegnet med 0,1, bare forteller printf, har du kanskje en hel haug av tall etter kommaet peke for meg. Men jeg bare ønsker å se en av dem. Så jeg kommer til å gå videre nå og spar dette programmet, gå inn i terminalen min vindu, og jeg kommer til å gå videre og type gjør float 0, angir. Jeg ser at noe kryptiske linje som vil begynne å være mer fornuftig som vi erte den fra hverandre denne uken og neste. Nå skal jeg gå videre og kjøre float null. Og, faen. Så det er en annen bug her en eller annen grunn. Jeg er ganske sikker på at en tidel, eller én delt på 10, er ikke 0,0. Kanskje jeg bare ikke ser på nok sifre. Så hvorfor ikke jeg si to 0,2 for å se to desimaler i stedet for bare ett. La meg gå tilbake til min terminal vindu her og slo opp et par ganger for å se min historie. Gjør flyte null igjen, og deretter opp igjen. Og nå inn. Og nå er jeg ganske sikker på at dette er feil. Og jeg kunne gjøre tre og fire, og jeg er sannsynligvis kommer til å fortsette å se nuller. Så hvor er feilen? En delt på 10 bør være 0,1. Noen ønsker å ta en stikke på hva det grunnleggende problemet er? Yeah? De er begge heltall. Hva så? Så med ett delt på 10, som er hva jeg gjør i aritmetikk. Og jeg får 0,1. Yeah. Og så er det faktisk det problemet. Når du tar et heltall i en datamaskin og du deler den med et annet heltall, maskinen som standard kommer til å anta at du ønsker et heltall. Problemet skjønt, er selvfølgelig at 0.1 ikke er et heltall. Det er et reelt tall. Og så hva maskinen gjør ved Standard er det bare kaster bort alt etter desimaltegnet. Det betyr rundt ikke ned eller opp per se. Det bare kaster bort alt etter desimaltegnet. Og nå som er fornuftig. Fordi nå er vi klart igjen med null. Men vent litt. Jeg ser ikke en int null. Jeg er faktisk å se 0.00. Så hvordan forene jeg dette nå? Hvis man delt på 10 er null, men jeg er se 0.00, er hvor det blir konverteres tilbake til et reelt tall? Yeah. Nettopp. Så her oppe i fem linje, når jeg faktisk lagre som 0.1, som deretter avkuttet til null, på innsiden av en flottør det er effektivt tilsvarer lagrer det ikke som en int men, Faktisk, som en flottør. Dessuten er jeg så bruke printf til eksplisitt skrive ut dette antallet til to desimaler, selv om det kan faktisk ikke være noen. Så dette slags suger, ikke sant? Angivelig du ikke kan gjøre matte, i det minste på dette nivået av presisjon, i en datamaskin. Men sikkert det er en løsning. Hva er den enkleste løsning vi kunne kanskje gjøre, selv bare intuitivt her løse dette? Yeah? Snu heltall inn - ja. Selv om jeg ikke er helt sikker på hva som er egentlig skjer her, hvis det fundamentalt har å gjøre med disse både være ints, vel, hvorfor gjør ikke jeg gjør at 10,0, noe som gjør dette 1,0, lagre filen. La meg gå tilbake til bunn og rekompilere. La meg nå reprise. Og der - nå har jeg fått min en tidel representert som 0,10. OK. Så det er ikke dårlig. Og la meg peke ut en annen måte vi kunne ha løst dette. La meg faktisk rulle tilbake i tid til når vi hadde dette som en tiende et øyeblikk siden. Og la meg gå videre og resave denne filen som et annet filnavn, bare for å har et lite sjekkpunkt. Så det var en versjon. Og nå la meg gå videre og gjøre en mer versjonen. Vi kaller denne versjonen to zero indeksert. Og jeg skal i stedet gjøre dette - vet du hva? Legge dot null fungerer i dette tilfellet. Men antar at man var en variabel. Ment 10 var en variabel. Med andre ord, antar at jeg ikke kunne bare hard-koden 0,0 på slutten av denne aritmetiske uttrykk. Vel, kan jeg faktisk gjøre noe i parentes kalt casting. Jeg kan kaste som heltall 10 til en flåte, og jeg kan kaste som heltall en til en flyte, så vel. Så regnestykket som kommer til å skje er effektivt 1,0 delt på 10,0, hvor resultatet går i f som før. Så hvis jeg rekompilere dette som gjør flyter 2, og nå flyter to, får jeg det samme svarer, så vel. Så dette er en ganske konstruert eksempel å løse dette problemet ved å innføre casting. Men generelt, er casting kommer til å være en kraftig ting, spesielt for Problemet satt to i en ukes tid, når du ønsker å konvertere en datatype til hverandre at på slutten av dagen representeres på tilsvarende måte. På slutten av dagen, hver eneste ting vi har snakket om så langt er bare ints under panseret. Eller hvis det er for lavt nivå for du, de er bare tall under hetten. Selv tegn, igjen, husker fra uke null, er tall under hetten. Det vil si, vi kan konvertere mellom ulike typer tall hvis de er bare biter. Vi kan konvertere mellom tall og bokstaver hvis de er bare biter, og vice versa. Og støping på denne måten er en mekanisme i programmering som lar deg tvangsflyttet endre en datatype til en annen. Dessverre er dette ikke så enkelt som jeg kan ha likt. Jeg kommer til å gå tilbake til flottører 1, som var enklere, mer grei en med 0,0 lagt på hver. Og akkurat som en rask repetisjon, la meg gå videre og rekompilere dette, må flyter 2 - beklager, dette gjør flyter en. Og nå skal vi kjøre flyter en. Og i bunnen, merker at jeg faktisk får 0,1. Så løste problemet. Men ikke ennå. Jeg er nå kommer til å bli litt nysgjerrig, og jeg kommer til å gå tilbake til min printf uttalelse og si, vet du hva? Jeg vil gjerne bekrefte at dette er virkelig en tidel. Og jeg kommer til å ønske å se dette til, si, fem desimaler. Det er ikke et problem. Jeg endre to til fem, Jeg rekompilere med make. Jeg kjøre det som flyter en. Ser ganske bra. Min forstand sjekker kan ende der, men Jeg får en litt mer spennende. Jeg kommer til å forandre 0,5 til 0,10. Jeg vil se 10 sifre etter desimalplassen. Og jeg kommer til å gå videre og rekompilere dette og kjør flyter en. Jeg slags anger etter å ha testet dette videre fordi min matte er ikke så korrigere lenger, synes det. Men vent litt, kanskje det er bare et lykketreff. Kanskje maskinen opptrer litt rart. La meg gå videre og gjøre 20 desimaler og forsikre meg om at jeg vet hvordan du gjør regnestykket. Jeg vet hvordan man programmerer. Gjør flyter 1, rekompilere, og faen. Det er virkelig, virkelig får langt fra mark. Så hva er det som skjer her? Intuitivt, basert på våre forutsetninger tidligere om størrelsen på datatyper, hva som må skje her under panseret? Yeah? Nettopp. Hvis du ønsker dette mye presisjon, og det er en pokker for mye presisjon - 20 tall etter desimaltegnet. Du kan umulig representere en vilkårlig antall mindre du har en vilkårlig antall bits. Men vi gjør ikke det. For en dupp, vi har bare 32 bits. Så hvis 32 biter bare kan permuteres i en måte - akkurat som våre mennesker på, scene hendene opp eller ned - i et endelig antall måter, det er bare et endelig antall av reelle tall kan du representere med disse bitene. Og så maskinen til slutt er nødt til å begynne å kutte hjørner. Datamaskinen kan skjule disse detaljene fra oss for litt tid. Men hvis vi begynner poking på tallene og ser lenger og lenger på etterfølgende tall i hele tall, så vi begynner å se at det er faktisk tilnærmet den Ideen om en tidel. Og så viser det seg, tragisk, det er et uendelig antall tall vi kan ikke representere nettopp i en datamaskin, i det minste med et endelig antall biter, en endelig mengden RAM. Nå dessverre, dette noen ganger har reelle konsekvenser. Hvis folk ikke helt setter pris på dette eller slags ta for gitt det faktum at deres datamaskin vil bare gjøre det de forteller det de skal gjøre og ikke forstå disse underliggende representasjon detaljer - som oppriktig, i noen språk er skjult for brukeren, i motsetning til i C - noen dårlige ting kan skje. Og det jeg trodde vi ville gjøre er å ta et skritt tilbake. Og dette dreier seg om en åtte minutters video. Den ble sendt for noen år siden, og det gir innsikt i faktisk hva som kan gå galt når du under-verdsette disse typer detaljer i svært altfor virkelige verden. Hvis vi kunne dempe lysene i noen minutter. SPEAKER 1: Vi vender nå tilbake til prosjektering katastrofer på Modern Marvels. Datamaskiner - vi har alle kommet å akseptere ofte frustrerende problemer som går med dem. Bugs, virus og programvare glitches er en liten pris å betale for bekvemmelighet. Men i high-tech og high-speed militære og romprogram applikasjoner, den minste problemet kan foredles til katastrofe. 4. juni 1996, utarbeidet forskerne å lansere en ubemannet Ariane 5-raketten. Det var bærer vitenskapelige satellitter designet for å etablere nøyaktig hvordan Jordens magnetfelt samhandler med solvind. Raketten ble bygget for det europeiske Space Agency og tok av fra sin anlegget på kysten av Fransk Guyana. JACK GANSSLE: På ca 37 sekunder inn flyturen, de først lagt merke til noe gikk galt. Dysene ble svingbar i en måte de egentlig ikke burde. Rundt 40 sekunder inn i fly, klart kjøretøyet var i trøbbel. Og det er da de gjorde en Beslutningen om å ødelegge det. Utvalget verneleder, med enorm guts, trykket på knappen, blåste opp raketten før det kunne bli en fare for offentlig sikkerhet. SPEAKER 1: Dette var jomfruturen av Ariane 5, og dens ødeleggelse fant sted på grunn av en feil innebygd i raketten sin programvare. JACK GANSSLE: Problemet på Ariane var at det var et nummer som krevde 64 bits til å uttrykke. Og de ønsket å konvertere til et 16-bits nummer. De antok at tallet var aldri kommer til å bli veldig stor, at de fleste av disse sifrene i 64-bit nummer var nuller. De var galt. SPEAKER 1: Manglende evne ett programvare program for å ta imot den type tall generert av en annen var ved roten av svikt. Programvareutvikling hadde blitt en svært kostbare delen av ny teknologi. Ariane 4 raketten hadde vært veldig vellykket, så mye av programvaren opprettet for det var også brukes i Ariane 5. PHILIP Coyle: Det grunnleggende problemet var at Ariane 5 var raskere, akselerert raskere. Og programvaren hadde ikke stod for det. SPEAKER 1: Ødeleggelsen av raketten var en stor økonomisk katastrofe, alt på grunn av en liten software-feil. Men dette var ikke første gang data konvertering problemer hadde plaget moderne rakett-teknologi. JACK GANSSLE: I 1991, med start av den første Gulf-krigen, Patriot rakett opplevd en lignende type av et nummer konvertering problem. Som et resultat ble 28 amerikanske soldater drept og rundt 100 andre såret når Patriot, som skulle for å beskytte mot innkommende scuds, ikke klarte å fyre av en rakett. SPEAKER 1: Når Irak invaderte Kuwait og America lanserte Desert Storm i 1991 tidlig, Patriot missilbatteriene ble utplassert for å beskytte Saudi Arabia og Israel fra irakiske Scud rakettangrep. The Patriot er en amerikansk medium-range overflate-til-luft-system produsert ved Raytheon selskapet. THEODORE POSTOL: Størrelsen på Patriot interceptor selv er omtrent 20 meter lang. Og den veier ca 2000 pounds. Og det bærer et stridshode av om - Jeg tror det er rundt 150 pounds. Og stridshodet i seg selv er en høy eksplosiv som har fragmenter rundt det. Dekselet av stridshodet er utformet å opptre som haggel. SPEAKER 1: Rakettene er gjennomført fire per container og fraktes av en semitrailer. PHILIP Coyle: The Patriot anti-missil Systemet går tilbake på minst 20 år nå. Det ble opprinnelig utviklet som et luftforsvar rakett til skyte ned fiendtlige fly. I den første Gulf-krigen, da den krigen kom, ville hæren til å bruke den å skyte ned scuds, ikke fly. Den irakiske luftforsvaret var ikke så mye av et problem. Men hæren var bekymret scuds. Og så de prøvde å oppgradere Patriot. SPEAKER 1: Avskjære en fiende rakett reiser på mach fem var kommer til å være utfordrende nok. Men da Patriot ble stormet inn service, var hæren ikke klar over en Irakiske modifikasjon som gjorde sitt Scuds nesten umulig å treffe. THEODORE POSTOL: Hva skjedde er de scuds som var kommer i var ustabil. De ble vingler. Grunnen til dette var irakere, i For å få 600 kilometer ut av en 300-kilometer-range rakett, tok vekt ut av foran stridshode. De gjorde stridshodet lettere. Så nå Patriot prøver å komme på Scud. Og mesteparten av tiden, den overveldende mesteparten av tiden, ville det bare fly av Scud. SPEAKER 1: Når Patriot-systemet operatører innså Patriot savnet sitt mål, detonerte de Patriots stridshode for å unngå mulig tap hvis det ble tillatt å falle til bakken. THEODORE POSTOL: Det var det mest folk så som store ildkuler på himmelen og misforstått som avskjærer av Scud-stridshoder. SPEAKER 1: Selv i natt himmelen Patrioter syntes å være vellykket ødelegge scuds, i Dhahran det kunne være noen feil om sin ytelse. Der mistet Patriot radar system spore av et innkommende Scud og aldri startes på grunn av et programvare feil. Det var israelerne som først oppdaget at jo lenger systemet var, jo større tidsavviket ble på grunn av en klokke innebygd i systemet datamaskin. JACK GANSSLE: Om to uker før tragedien i Dhahran, israelerne rapporteres til Forsvarsdepartementet at systemet var å miste tid. Etter ca åtte timer med løping, de la merke til at systemet er bli merkbart mindre nøyaktig. Forsvarsdepartementet svarte med fortelle alle Patriot batterier å ikke la systemene på i lang tid. De har aldri sagt hva en lang tid var. Åtte timer? 10 timer? 1000 timer? Ingen visste. SPEAKER 1: The Patriot batteri stasjonert ved brakkene på Dhahran og dens mangelfulle interne klokke hadde vært på over 100 timer på natten av 25. februar. JACK GANSSLE: Det spores tid til en nøyaktighet av omtrent en tiendedel av et sekund. Nå er en tiendedel av et sekund en interessant tall fordi det ikke kan være uttrykt i binære nøyaktig, noe som betyr det kan ikke uttrykkes nøyaktig alle moderne digitale datamaskin. Det er vanskelig å tro, men bruke dette som et eksempel. La oss ta nummer én tredjedel. En tredjedel kan ikke uttrykkes i desimal nøyaktig. En tredjedel er 0.333 kommer på for uendelig. Det er ingen måte å gjøre det med absolutt nøyaktighet i desimal. Det er akkurat samme type problem som skjedde i Patriot. Jo lenger systemet løp, den verste tiden feilen ble. SPEAKER 1: Etter 100 timers drift, feilen i tiden var bare om lag en tredjedel av et sekund. Men i form av rettet mot en rakett reiser på mach fem, resulterte det i en relativ volatilitet på over 600 meter. Det ville være en fatal feil for soldatene ved Dhahran. THEODORE POSTOL: Hva har skjedd er en Scud lanseringen ble oppdaget av tidlig advarsel satellitter. Og de visste at Scud kom i deres generelle retning. De visste ikke hvor det kom. SPEAKER 1: Nå var det opp til radaren komponent av Patriot-systemet forsvare Dhahran å finne og holde spore av den innkommende fiendtlige missiler. JACK GANSSLE: Radaren var veldig smart. Det ville faktisk spore posisjonen til den Scud og deretter forutsi hvor det sannsynligvis ville være den neste gang radaren sendte en puls ut. Som ble kalt området gate. THEODORE POSTOL: Så når Patriot bestemmer nok tid har gått til å gå tilbake og sjekke neste sted for dette oppdagede objektet, går den tilbake. Så når det gikk tilbake til feil sted, ser det da ingen objekt. Og det bestemmer seg for at det var ingen objekt, det var en falsk deteksjon, og synker sporet. SPEAKER 1: Den innkommende Scud forsvant fra radarskjermen, og sekunder senere slengte inn i brakkene. The Scud drepte 28 og var den siste som sparken under den første Gulf-krigen. Tragisk nok kom den oppdaterte programvaren på Dhahran dagen etter. Programvaren feilen hadde blitt fikset, lukker ett kapittel i den urolige Historien om Patriot raketter. Patriot er faktisk et akronym for Gradvis Array sporing Skjæringspunktet av Target. DAVID J MALAN: Greit, så en tankevekkende eksempel, for å være sikker. Og heldigvis, disse lavere nivå bugs er ikke noe som vi vil vanligvis nødt til å sette pris på, sikkert ikke med noen av våre tidligste av programmer. Heller, de fleste av feilene du vil møte vil være logisk i naturen, syntaktisk i naturen der koden virker bare ikke riktig. Og du vet ordet av det ganske fort. Men spesielt når vi kommer til slutten av semesteret, det kommer til å blitt mer og mer av en mulighet for å virkelig tenke hardt om design av programmene og den underliggende representasjon der også, av dataene. For eksempel, vil vi introdusere MySQL, som er en populær database motoren som du kan bruke med nettsteder for å lagre data på bakenden. Og du må begynne å bestemme på slutten av semesteret ikke bare hva typer data langs disse linjene til å bruke men nøyaktig hvor mange biter å bruke, om du ønsker å lagre datoer som datoer og klokkeslett som ganger, og også ting som hvor stor du vil at unike IDer til å være for, sier, brukerne i databasen. Faktisk, hvis noen av dere har hatt Facebook står for en stund, og du vet hvordan du får tilgang til din bruker-ID - som viser noen ganger opp i din profilens URL mindre du har valgt en kallenavn for URL, eller hvis du har brukte Facebooks Graf API, den offentlig tilgjengelig API som du kan be Facebook for rådata - du kan se hva din numerisk ID er. Og for noen år siden, Facebook hovedsak måtte endre fra å bruke tilsvarende ints å bruke lang lenge fordi over tid som brukerne kommer og gå og lage masse kontoer og falske kontoer, selv de er veldig lett var i stand til å eksos noe som en 4 milliarder mulig verdi som en int. Så mer på slike saker nedover veien, så vel. All right, så det var avstøpning. Det var imprecision. Et par korte beskjeder. Så deler formelt begynner førstkommende Søndag, mandag, tirsdag. Du vil høre via e-post senere denne uken som til seksjon oppdrag. Og du vil også her på det punktet hvor å endre delen hvis din planen er nå endret eller komfortnivå er nå endret. I mellomtiden P-set ett og hacker man er på grunn av dette torsdag med mulighet til å forlenge denne fristen per spesifikasjonene til fredag i en typisk måte. Innse at følger med problemet sett spesifikasjonene er instruksjoner om hvordan du bruker CS50 apparatet, må man, samt noen CS50 spesifikke verktøy som 50 stil, noe som kan gi deg med tilbakemeldinger dynamisk på kvaliteten på koden din stil og også sjekk 50, noe som kan gi deg dynamisk tilbakemelding på din koden er korrekt. Tilgi at vi fremdeles stryking ut noen få floker med sjekk 50. Noen av dine klassekamerater som fikk starte rundt fire AM fredag ​​kveld da spec gikk opp har lagt merke til siden da noen bugs som vi jobber gjennom, og unnskyldninger for alle som har opplevd utilbørlig frustrasjoner. Feilen er min. Men vi vil følge opp CS50 diskutere når det er løst. Så et ord på score selv. Så det blir en uke eller to før du begynner å få tilbakemelding på oppgavesett fordi du ennå ikke har en pedagogisk fyr. Og selv da vil vi begynne å vurdere C problemet setter før vi gå tilbake og vurdere scratch så at du får mer relevant tilbakemeldinger raskere. Men generelt per pensum, CS50 oppgavesett evalueres langs etter fire akser - omfang, riktighet, design og stil. Omfang kommer til å være en rekke typisk mellom null og fem som fanger opp hvor mye av brikke som du bet av. Vanligvis vil du at dette skal være fem. Du i det minste prøvd alt. Og legg merke til det er en multiplikativ faktor så at å gjøre bare en del av oppgavesettet er ikke den beste strategien. I mellomtiden, mer opplagt er viktigheten av korrekthet - bare er programmet riktig med respekt til spesifikasjonen? Dette er vektet bevisst mer tyngre enn de andre to akser ved en faktor på tre fordi vi anerkjenner som vanligvis du kommer til å tilbringe en mye mer tid jage ned noen bugs, å få koden til å fungere, så du er innrykk den og velge hensiktsmessige variabelnavn og som, er som i den andre enden av spekteret av stilen. Det er ikke å si stilen er ikke viktig, og vi vil forkynne det over tid både i forelesninger og i seksjoner. Stil refererer til estetikk av koden din. Har du valgt godt navngitte variabler som er korte, men noe beskrivende? Er koden innrykket som du har sett i forelesning og på en måte som er forenlig med stil 50? Endelig er designet rett der i midten. Design er det vanskeligere en å sette en fingeren på fordi det er mye mer subjektiv. Men det er kanskje det viktigste av de tre aksene i form av pedagogisk verdi over tid, og at dette vil være undervisningen stipendiat mulighet til å gi deg kvalitative tilbakemeldinger. Faktisk, i CS50 selv om vi har disse formlene og score, på slutten av dagen disse er meget bevisst svært små bøtter - punkt verdier mellom null og tre og null og fem. Vi prøver ikke å trekke svært grove linjer mellom oppgavesett eller mellom studenter, men heller fokusere så mye som vi kan på en kvalitativ, longhand tilbakemeldinger, enten skrevet eller muntlig fra din spesielle undervisningen stipendiat, du får vite ganske godt. Men generelt, de er vektene at de ulike akser må. I mellomtiden også, det er verdt å holde i oppmerksom på at du ikke bør anta at en tre ut av fem er en 60% og derfor grovt sviktende. Tre er bevisst ment å være liksom midt i veien godt. Hvis du får treere på begynnelsen av semesteret, det er faktisk ment å være en god sted å begynne. Hvis du får toere, messer, er det definitivt en del arbeid å betale litt mer oppmerksomhet, for å dra nytte av seksjoner og kontortid. Hvis du får firere og femmere, flott. Men egentlig, håper vi å se baner blant elevene - veldig individualisert per student, men starter semesteret her i form av de to til tre rekkevidde men slutter her oppe i 4-5 serien. Det er det vi virkelig ser etter. Og vi gjør oppmerksom på deltaet som du viser mellom uke null og uke 12 når jeg gjør karakterer. Det spiller ingen rolle for oss helt hvordan du rettferdig i begynnelsen hvis banen er faktisk oppover og sterk. Akademisk redelighet - så la meg sette på min mer alvorlig stemme for bare et øyeblikk. Så dette kurset har æren av sende flere studenter enn noen annen i historien til annonsen styret, tror jeg. Vi har liksom mistet tellingen på dette poenget med hvor ofte dette skjer. Og det er ikke fordi elevene i 50 er noe mer uærlig enn deres klassekamerater andre steder. Men innser også at vi er veldig flinke på å oppdage denne typen ting. Og det er en fordel at en informatikk klasse har ved at vi kan og vi sammenligne alle studenter Problemet setter parvis mot alle andre, ikke bare i år men alle tidligere år. Vi har muligheten, som elevene i klassen, Google og å finne koden på nettsteder som github og diskusjonsfora. Det er absolutt løsninger til CS50 er p-sett flytende rundt der. Men hvis du kan finne dem, vi kan finne dem. Og alt dette er veldig mye automatisert og lett og trist for oss å finne. Men jeg vil understreke, også, at Kursets faglige ærlighet politikk er meget ment å være svært mye det motsatte av denne ånden. Ja, dette året vi har omformulert ting i pensum for å være dette, dot dot dot, med flere detaljer i pensum. Men det overordnede tema i kurset egentlig er å være rimelig. Vi erkjenner at det er en betydelig mengde pedagogisk verdi i samarbeidende, i noen grad med klassekamerater, der du to, eller du tre eller du flere er stående på et hvitt bord whiteboarding, så å snakke, dine ideer - skrive ut pseudokode i bilder, diagram hva som bør Mario være hvis du skulle skrive det første i pseudokode. Hva bør den grådige algoritmen - hvordan skal det oppføre per Problemet setter en? Og så innser at atferden at vi oppfordrer er veldig mye langs disse linjene. Og i pensum, vil du se en hel haug med kuler under en rimelig kategori og en ikke rimelig kategori som hjelper oss hjelpe du vikle tankene dine rundt der vi trekke den linjen. Og generelt, en anstendig tommelfingerregel er at hvis du sliter med å løse noen feil og din venn eller klassekamerat sitter ved siden av deg, er det rimelig for deg å vise ham eller henne koden din og si hei, kan du hjelpe meg å finne ut hva som går galt her? Vi vanligvis ikke omfavne den motsatte side. Det er ikke et riktig svar for din venn eller klassekamerat her å si, oh, bare se på mine og tall det ut fra det. Det er liksom urimelig. Men å ha noen andre, en annen hjerne, et annet par øyne ser på skjermen eller se på koden din og si, er du sikker på at du vil å ha en sløyfe her? Eller er du sikker på at du vil at semikolon her? Eller oh, betyr at feilmeldingen dette. De er svært rimelig og oppmuntret atferd. Sakene som jeg ble berget tidligere koke ned til når elevene er sent på natten gjør dårlig dømmekraft beslutninger og e-post koden sin for å noen andre eller bare si: her, er det i Dropbox eller Googling sent på kvelden. Og så vil jeg oppfordre og bønnfaller dere, hvis du ikke har disse uunngåelige øyeblikk av stress, du dytter opp mot fristen, har du ingen sent dag siden det er allerede fredag ​​på det punkt, email kursets hoder eller meg direkte. Si, lytte, jeg er på min bristepunktet her. La oss ha en samtale og finne det ut. Ty til nettet eller noen andre ikke rimelig oppførsel er aldri den løsning, og for mange av din klassekamerater er ikke lenger her på campus på grunn av at dårlig dømmekraft. Men det er veldig lett å skjørt den linjen. Og her er et lite bilde for å heie deg opp fra Reddit slik at nå alt skal være OK. Så en rask oppsummering, da, av der vi slapp. Så forrige uke, husker at vi innfører forhold, ikke i Scratch men i c dette tidspunktet. Og det var noen ny syntaks, men egentlig ingen nye ideer per se. Vi hadde boolske uttrykk som vi kunne eller sammen med to vertikale barer eller og sammen med to -tegn, sier at både venstre og retten må være sant for at dette skal utføre. Da hadde vi svitsjer, som vi så på kort, men jeg foreslår er virkelig bare annerledes syntaks for å oppnå samme type mål hvis du vet på avansere hva dine saker kommer til å være. Vi så på sløyfer. En for-løkke er kanskje den vanligste, eller i det minste en som folk typisk nå for instinktivt. Selv om det ser litt kryptisk, vil du se mange, mange eksempler på dette før lenge, som du har allerede sent i forrige uke. Mens sløyfer kan likeledes oppnå det samme. Men hvis du ønsker å gjøre noen incrementation eller oppdatering av variable verdier, må du gjøre det mer manuelt enn for loop tillater før. Og så er det do-while loop, som tillater oss å gjøre noe på minst én gang mens noe ellers er sant. Og dette er spesielt bra for programmer eller for spill hvor du vil å be brukeren om noe minst en gang. Og hvis han eller hun ikke samarbeider, kan det være lurt å gjøre det igjen og igjen. Med variabler, i mellomtiden, hadde vi linjer av kode som dette, noe som kan være to linjer. Du kunne erklære en int kalt teller, semikolon. Eller du kan bare erklære og definere det, så å si. Gir den en verdi på samme tid. Og så til slutt, snakket vi om funksjoner. Og dette var en fin eksempel i den forstand at den illustrerer to typer funksjoner. En er GetString (), som, igjen, får en streng fra brukeren. Men GetString () er ganske interessant, så langt som vi har brukt det, fordi vi alltid har brukt det med noe på den venstre side av en likhetstegnet. Det vil si at GetString () returnerer en verdi. Den returnerer, selvfølgelig, en streng. Og deretter på venstre side, er vi bare sparer strengen innsiden av en variabel kalt navn. Dette er annerledes, på en måte, fra printf fordi printf, i hvert fall i vår bruk her, ikke returnerer noe. Som en side, gjør det tilbake noe. Vi har bare ikke bryr seg hva det er. Men den har det er kalt en bivirkning. Og hva er det bivirkning i alle tilfelle vi har sett så langt? Hva gjør printf? Den skriver noe til skjermen, skjermer tekst eller tall eller noe på skjermen. Og det er bare ansett som en bivirkning fordi det er egentlig ikke overlate den tilbake til meg. Det er ikke et svar på innsiden av en svart boks som jeg kan da komme inn og ta. Det er bare å gjøre det på egen hånd, mye som Colton ble plugget inn i dette svart boks i forrige uke, og han liksom magisk var tegning på tavla uten meg faktisk involvert. Det ville være en bivirkning. Men hvis jeg faktisk måtte komme tilbake i her og si, oh, her er streng fra brukeren, som ville være en returverdi. Og så langt har vi bare brukte funksjoner at andre mennesker har skrevet. Men vi kan faktisk gjøre disse slags ting selv. Så jeg kommer til å gå inn i CS50 apparatet igjen. La meg lukke fanen som vi hadde åpne et øyeblikk siden. Og la meg gå videre og opprette en ny fil. Og jeg kommer til å gå videre og kalle dette en positive.c. Så jeg ønsker å gjøre noe med positive tall her. Så jeg kommer til å gå videre og gjøre int - beklager - # Include. La oss ikke gjøre det samme feil som før. Int main (void), åpen krøllete brace, lukket klammeparentes. Og nå ønsker jeg å gjøre følgende. Jeg ønsker å skrive et program som insisterer på at brukeren gir me et positivt heltall. Så det er ingen GetPositiveInt funksjon i CS50 biblioteket. Det er bare GetInt (). Men det er OK fordi jeg har konstruksjoner som jeg kan pålegge en litt mer begrensning på den verdien. Jeg kunne gjøre noe som dette. Så int n - og hvis du skriver sammen, bare innse Jeg kommer til å gå tilbake og endre noen ting i et øyeblikk - så int n er lik GetInt (). Og det kommer til å sette en int innsiden av n. Og la meg være en mer beskrivende. La meg si noe sånt Jeg krever at du gir meg et positivt heltall. OK. Så bare en liten bit av instruksjonene. Og nå hva kan jeg gjøre? Vel, jeg allerede vet fra min enkle forhold eller grener, akkurat som jeg hadde i Scratch, kunne jeg si noe som hvis n er mindre enn eller lik null, så jeg ønsker å gjøre noe liker, det er ikke positivt. Og da kunne jeg gjøre - OK, men jeg virkelig ønsker å få den int. Så jeg kunne gå opp her og jeg kunne slags på kopien dette og rykke dette. Og så, OK. Så hvis n er mindre enn eller lik null gjøre dette. Nå, hva om brukeren ikke samarbeider? Vel, da jeg kommer til å låne dette her. Og så går jeg inn her og her og her. Så dette er helt klart ikke løsningen, rett? Fordi det er ingen ende i sikte. Hvis jeg ønsker å kreve at brukeren gir meg et positivt heltall, kan jeg faktisk få int. Da kan jeg se etter at int. Men da vil jeg sjekke det igjen og sjekk det igjen og sjekke det igjen. Så åpenbart, hva er bedre konstruere å bruke her? Greit, så en slags loop. Så jeg kommer til å bli kvitt av nesten alt av dette. Og jeg ønsker å få dette int minst én gang. Så jeg kommer til å si gjøre - og jeg vil komme tilbake til mens i bare et øyeblikk - Nå, hva? Jeg kommer til å gjøre int n får GetInt (). OK. Så det er ganske bra. Og nå hvor ofte gjør Jeg ønsker å gjøre dette? La meg sette printf innsiden av løkken slik at jeg kan kreve igjen og igjen, hvis behovet være. Og hva ønsker jeg dette mens tilstanden å gjøre? Jeg vil fortsette å gjøre dette mens det er tilfelle? Yeah. N er mindre enn eller lik null. Så allerede, har vi betydelig renset denne koden opp. Vi har lånt en veldig enkel konstruere - den do-while-løkke. Jeg har stjålet bare de viktige linjene av koden at jeg begynte å kopiere og lime, var noe som ikke klok. Og så nå skal jeg faktisk lime det inn her og bare gjøre det en gang. Og nå hva ønsker jeg å gjøre på helt på slutten av dette programmet? Jeg vil bare si noe enkelt liker, takk for - og Jeg skal gjøre% i for int - backslash n, komma, og deretter plug in n, semikolon. OK. Så la oss se hva som skjer nå når jeg kjører dette programmet. Jeg kommer til å gå videre og gjør positive. Damn. Et par feil. Så la meg bla tilbake til den første. Ikke arbeid gjennom dem baklengs. Arbeide gjennom dem ovenfra og ned så de kaskade og bare en ting være feil. Implisitt deklarasjon av funksjon GetInt (). Yeah. Så det var ikke nok. Jeg slags gjort samme feil, men litt annerledes denne gangen. Jeg må ikke bare omfatte stdio.h men også cs50.h, som inkluderer såkalte erklæringer få int, som undervise apparatet, eller lærer C hva GetInt () er. Så la meg resave. Jeg kommer til å ignorere de andre feil fordi jeg kommer til å håpe at de er noe relatert til feilen Jeg har allerede fikset. Så la meg gå videre og rekompilere med gjøre positive, Enter. Damn. Tre feil, likevel. La meg bla opp til første. Ubrukte variabelen n.. Vi har ikke sett dette før. Og også dette er litt kryptisk. Dette er resultatet av kompilatoren. Og hva som markerte linjen der - positive.c :9:13 - sier, er det å si på linje ni av positive.c, i det 13. tegnet, 13. kolonne, du har gjort denne feilen. Og i særdeleshet, er det å fortelle meg ubrukt variabel n. Så la oss se - linje ni. Jeg bruker n i den forstand at Jeg gir det en verdi. Men hva kompilatoren ikke liker er at jeg ikke er tilsynelatende bruker det. Men vent litt, jeg bruker den. I tråd 11, jeg bruker det her. Men hvis jeg ruller ned ytterligere på :11 positive.c - så på linje 11, karakter 12, den kompilatoren forteller meg, bruk av undeclared identifikator n. Så uanmeldte betyr at jeg har ikke spesifisert det som en variabel med en datatype. Men vent litt. Jeg gjorde akkurat som på linje ni. Så noen er veldig forvirret her. Det er enten meg eller kompilatoren fordi i tråd ni, igjen, jeg erklære en int n, og jeg tildele det returnere verdien av GetInt (). Så jeg bruker den variabelen n på linje 11 og sjekke om verdien er lavere enn eller lik null. Men dette er tydeligvis dårlig og ødelagt hvorfor? Si det igjen? Ah, jeg må erklære n før går inn i sløyfen. Men hvorfor? Jeg mener, vi bare foreslått litt siden at det er greit å erklære variabler alt på én linje og deretter tildele dem noen verdi. En global variabel - la oss komme tilbake til at ideen om en liten stund. Hvorfor vil du ha meg til å sette den utenfor loopen? Det er. Nettopp. Så, riktignok noe motstridende, la meg oppsummere. Når du erklærer n inne av gjør blokken der - spesifikt innside de klammeparentes - den variabelen n har det som er kalles et omfang - urelatert til vårt skåringssystemet i selvfølgelig - men har et omfang som er begrenset til de klammeparentes. Med andre ord, typisk hvis du deklarerer en variabel i et sett av en klammeparentes, finnes den variabelen bare innsiden av de klammeparentes. Så ved at logikken alene, selv om Jeg har erklært n på linje ni, det hovedsak forsvinner fra omfang, forsvinner fra hukommelsen, så å si, av den tiden jeg traff linjen 11. Fordi linjen 11, dessverre, er utenfor disse klammeparentes. Så jeg dessverre ikke kan fikse dette ved å kommer tilbake til hva jeg gjorde det før. Du kan ved første gjøre dette. Men hva er du nå ikke gjør syklisk? Du er tydeligvis ikke får den int syklisk. Så vi kan la GetInt (), og vi bør forlate GetInt () inne i løkke fordi det er det vi ønsker å plage brukeren til igjen og igjen. Men det gjør nok for å gå opp til linjen, sier seks. Int n, semikolon. Ikke gi den en verdi ennå fordi du trenger ikke å bare ennå. Men nå her nede, varsel - dette ville være en svært enkel feil. Jeg ønsker ikke å skygge min forrige erklæring av n. Jeg vil bruke n som faktisk eksisterer. Og så nå i linje 10, Jeg tildele n en verdi. Men i tråd seks, erklærer jeg n. Og så kan jeg eller kan jeg ikke bruke den i linje 12 nå? Jeg kan, fordi mellom hvilke krøllete bukseseler er n erklært nå? Den opp her på linje fem. Til en her på linje 14. Så hvis jeg nå zoome ut, lagre denne filen, går tilbake inn og kjøre gjøre positive, det sammen denne gangen. Så det er allerede fremgang. Slash. . / Positiv, Enter. Jeg krever at du gir meg et positivt heltall. Negative en. Negativ to. Negativ tre. Zero. One. Og takk for den ene er hva er nå skrevet ut. La meg prøve noe annet, ut av nysgjerrighet. Jeg blir bedt om å skrive inn et heltall. Men hva om jeg i stedet skrive inn lam? Slik at du nå se en annen spør - prøv på nytt. Men ingen steder i koden min skrev jeg prøve på nytt. Så der, formodentlig, er dette nytt forsøk spør kommer fra, ville du si? Ja, fra GetInt () selv. Så en av de tingene CS50 ansatte gjør for deg, i alle fall i disse første par uker, er vi har skrevet noe beløp feilkontroll å sikre at hvis du kaller GetInt (), vil du i det minste få tilbake en int fra brukeren. Du vil ikke få en streng. Du vil ikke få en røye. Du vil ikke få noe helt annet. Du får en int. Nå kan det ikke være positive. Det kan ikke være negativ. Vi gir ingen garantier rundt det. Men vi vil plage brukeren til å prøve på nytt, prøve, prøve på nytt før han eller hun faktisk samarbeider. Tilsvarende, hvis jeg gjør 1.23, det er ikke en int. Men hvis jeg skriver i for eksempel 50, som gir meg en verdi som jeg ønsket. OK. Så ikke ille. Eventuelle spørsmål om hva vi nettopp har gjort? Nøkkelen takeaway være, for å være klar, ikke så mye loopen, som vi har sett før selv om vi har egentlig ikke brukt det, men spørsmålet om omfang, der variablene kan bare kan bare brukes innenfor noen bestemt omfang. Ok, la meg ta forslaget du har gjort tidligere, nemlig en global variabel. Som en side, viser det seg at en annen Løsningen på dette problemet, men typisk feil løsning eller en dårlig utformet løsning, er å deklarerer variabelen som hva som er kalles en global variabel. Nå er jeg slags brudd min definisjon av omfang fordi det finnes ingen klammeparentes på toppen og helt nederst på en fil. Men konsekvensen av at er at nå på linje fire, n er en global variabel. Og som navnet tilsier, er det bare tilgjengelig overalt. Scratch har faktisk disse. Hvis du brukte en variabel, kan du hente du måtte velge om det er for denne sprite eller for alle sprites. Vel, er alle sprites bare klarere måte å si globalt. Yeah? Ah, virkelig godt spørsmål. Så husker at i den aller første versjonen av koden min, da jeg feilaktig erklært og definert n i tråd ni - Jeg erklærte det som en variabel og jeg ga det en verdi med tilordningsoperatoren - Dette ga meg to feil. Én, det faktum at n ikke ble brukt, og to, som i linje 11 det bare ikke var deklarert. Så det første jeg gjorde ikke adressen på den tiden. Det er strengt tatt ikke en feil å erklære en variabel, men ikke bruke den. Men en av de tingene vi har gjort i den CS50 apparatet, bevisst, pedagogisk, er vi skrudde opp forventninger til kompilatoren å gjøre sikker på at du gjør ting ikke bare riktig, men egentlig riktig. Fordi hvis du erklære en variabel som n og aldri bruker den, eller bruker det riktig, så hva er det der? Det tjener virkelig ingen hensikt. Og det er veldig lett over tid, hvis du ikke konfigurere din egen datamaskin i denne måten, å bare ha kode som har små rester her, rester der. Og deretter måneder senere du se tilbake og du er som, hvorfor er denne linjen av kode der? Og hvis det er ingen god grunn, det gagner ikke deg eller dine kolleger nedover veien til å snuble over det da. Som en side, der er som kommer fra? Vel, husker at hver gang vi kompilere program, er alt dette ting som skrives ut. Så vi vil komme tilbake til dette. Men igjen, er å lage et verktøy som automatiserer prosessen med å sette sammen etter kjører selve kompilatoren kalt klang. Denne saken, vil vi til slutt se, har å gjøre med debugging med en spesiell program kalt debugger. Dette har å gjøre med å optimalisere kode - mer om det i fremtiden. Std = C99 - Dette betyr bare bruke 1999-versjonen av C. C har eksistert enda lenger enn det, men de gjorde noe hyggelig endringer 10 pluss år siden. Og her er de relevante seg. Vi sier at alt som tidligere ville ha vært en advarsel en feil hindrer student fra kompilering. Og vegg-del gjøre det til en hel haug av ting, ikke bare knyttet til variabler. Og så la meg bla til slutten av denne linje. Og også dette vil vi til slutt komme tilbake til. Dette er selvsagt navnet på filen jeg kompilering. Dette minner om navnet på filen Jeg sender ut som navnet av min kjørbart program. Dette-lcs50 betyr bare bruke CS50 bibliotek, og noen nuller og enere som de ansatte skrev og samlet tidligere dette året, integrere dem inn i programmet mitt. Og alle vet hva-lm er? Det er regnestykket biblioteket, som er bare der selv om du er ikke gjøre noe matte. Det er bare automatisk gitt til oss gjør. Vel, la meg gjøre en annen eksempel her ved å åpne opp en ny fil. Og la meg lagre dette som string.c. Det viser seg at når vi snakker om data typene i dag, det er enda mer skjer under panseret enn vi har sett så langt. Så la meg raskt gjøre en rask program. Inkluder stdio.h. Og jeg vil lagre det. Og du vet, la meg ikke gjøre det samme feil igjen og igjen. Inkluder cs50.h. Og la meg gå videre nå og gjøre int main (void). Og nå har jeg bare lyst til å gjøre et program som gjør dette - erklære en streng kalt s og får en streng fra brukeren. Og la meg gjøre litt instruksjonene her - vennligst gi meg en streng - så brukeren vet hva de skal gjøre. Og deretter ned her under dette, Jeg ønsker å gjøre følgende - for int får jeg null. Igjen, dataforskere typisk begynne å telle på null, men vi kunne gjør at en hvis vi virkelig ønsket. Nå skal jeg gjøre jeg er mindre enn strengen lengden på s. Så strlen - S-T-R-L-E-N - igjen, det er konsis fordi det er lettere å skrive, selv om det er en litt kryptisk. Det er en funksjon vi har ikke brukt før, men bokstavelig talt gjør det - tilbake til meg et tall som representerer lengden av strengen at brukeren har skrevet. Hvis de har skrevet i hallo, ville den komme tilbake fem fordi det er fem bokstaver i hallo. Så, på hver iterasjon av denne sløyfen, jeg pluss pluss. Så igjen, en standard konstruere, selv om du er ikke helt for komfortabel eller kjent med den ennå. Men nå på hver iterasjon av denne sløyfen, legge merke til hva jeg skal gjøre. Jeg ønsker å gå videre og skrive ut et enkelt tegn - så% c backslash n på en ny linje. Og så, vet du hva jeg ønsker å gjøre? Uansett hva ordet er at brukeren skriver inn i, som hei, jeg ønsker å skrive ut H-E-L-L-O, ett tegn per linje. Med andre ord, jeg ønsker å få på enkelte tegn i en streng, der inntil nå en streng har bare vært en sekvens av tegn. Og det viser seg at jeg kan gjøre s, brakett Jeg, i nærheten brakett, lukke parentes, semikolon. Og jeg trenger ikke å gjøre en ting. Det er i en fil som heter string.h at strlen er deklarert. Så hvis jeg vil bruke denne funksjonen, Jeg må fortelle kompilatoren, forventer å bruke den. Nå la meg gå videre og gjøre programmet heter streng. Dot, slash, streng. Vennligst gi meg en streng. Jeg skal gå videre og skriver det. Hei, i alle caps, Enter. Og nå merker jeg har skrevet dette ett tegn etter den andre. Så den nye detalj her, er at en streng, ved slutten av dagen, kan være tilgjengelig ved hjelp av individuell dens tegn ved å innføre torget brakett notasjon. Og det er fordi en streng under panseret er faktisk en sekvens av tegn. Men det som pen om dem er i datamaskinens RAM - Mac, PC, uansett hva det er - de er bokstavelig talt rygg mot rygg mot rygg - H-E-L-L-O - på individ-, tilstøtende byte i minnet. Så hvis du ønsker å få på den åttende slik byte, som i denne sløyfe ville bli brakett null, en brakett, to brakett, tre brakett, brakett fire - som er null indeksert opp til fem - som vil skrive ut H-E-L-L-O på sin egen linje. Nå, som en teaser, la meg vise deg slags ting du etterhvert bli i stand til å forstå, i det minste med noen stenger ute. For en, hva vi inkludert i dagens eksempler, hvis du ønsker, er faktisk en av de aller første jailbreaks for iPhone. Jailbreaking betyr sprengning telefonen slik at du faktisk kan bruke den på en annen operatør eller install din egen programvare. Og du vil merke dette ser helt kryptisk, mest sannsynlig. Men se på dette. IPhone ble tydeligvis sprukket med en for loop, en hvis tilstand, et annet tilstand, en haug av funksjoner vi har ikke sett. Og igjen, vil du ikke på første øyekast trolig forstå hvordan dette fungerer. Men alt at vi liksom ta for gitt i våre moderne liv faktisk en tendens til å redusere selv til noen av disse grunnleggende vi har vært ser på. La meg gå videre og åpne en andre program, holloway.c. Så også dette er noe du burde egentlig ikke vite. Selv ingen av de ansatte eller jeg kunne sannsynligvis finne ut av dette ved å se på det fordi dette var noens kode som ble sendt til hva som er historisk kjent som en uklar C konkurranse, der du kan skrive et program som kompilerer og kjører, men er så jævla kryptisk ingen menneske kan forstå hva det kommer til å gjøre før de faktisk kjøre den. Så ja, hvis du ser på dette koden, ser jeg en bryter. Jeg ser main. Jeg ser disse klammer antyde annen form for en matrise. Ønsker noen å gjette hva dette programmet faktisk gjør hvis jeg kjører Holloway? Ja. OK. Godt gjort. Så bare de ansatte og jeg kan ikke finne ut hva disse tingene gjør. Og nå til slutt, la meg gå videre og åpne opp ett annet program. Dette - igjen, vil vi gjøre kildekoden tilgjengelig på nettet - dette er bare slags pen å se på. Alt de gjorde er rammet space bar ganske mye. Men dette er reell kode. Så hvis du tror det er ganske, hvis vi faktisk kjøre dette ved ledeteksten, til slutt vil du se hvordan vi kan gjøre ting som dette. Så vi vil forlate deg på dette notatet og se deg på onsdag. [Musikk spilles] SPEAKER 2: Ved neste CS50, TFS iscenesette et mytteri. SPEAKER 3: Der er han. Få ham! [Musikk spilles]