[Powered by Google Translate] DAVID J. MALAN: Greit, dette er CS50, og dette er starter i uke to. Takk. La oss begynne her med en telefonsamtale. Jeg er i ferd med å ringe 617-BUG-CS50. CS50: Dette er CS50. For Shuttle Boy, trykk på 1. Å starte på nytt, trykk 9. DAVID J. MALAN: Så sa han til Shuttle Boy, en presse. Så vi kommer til å trykke en. CS50: Hva er ditt opphav? For quad, en presse. Mather, tast 2. Boylston, 3 trykk. Lamont, 4 trykk. Mem Hall, 5 pressen. Å starte på nytt, trykker du 0. DAVID J. MALAN: Vi trykker 1 for quad. CS50: Neste shuttle forlater dette svært minutt på 13:10, og deretter på 01:20, 01:30, 01:40. Dette er CS50. DAVID J. MALAN: Så dette er CS50 stemme. Og det er et eksempel på den slags endelige prosjekter, for eksempel kan du bite av mot slutten av semesteret. For eksempel finnes det shuttleboy.cs50.net - faktisk et prosjekt som jeg først skrev etter å ha tatt CS51 tilbake når jeg var en lavere. Og inspirasjonen her var da, var alt de hadde de utskrevne shuttle buss tidsplaner, og det var ingen oppfatningen av å se ting opp på nettet. Og så jeg liksom due i en helg, strømmet gjennom trykt tidsplan, og portet det til et dataprogram. På den tiden skjedde dataprogrammet som skal skrives i C. Og du faktisk kjørte det ved å skrive Shuttle Boy på en blinkende be som vi har gjort så langt. Men i løpet av årene, har det utviklet seg til en umiddelbar meldinger bot. Det er utviklet flere nylig inn i denne nettsiden, i en SMS-basert verktøy, samt i denne stemmen-basert verktøy. Og dette er å antyde den slags ting som du kan gjøre for deg selv ved semester slutt. For eksempel er det, skjer SMS-versjonen av Shuttle Boy å operere som følger. Hvis, på din mobiltelefon, sender du en tekstmelding til 41411 og deretter sende den spesielle symbol sboy, for Shuttle Boy, etterfulgt av A og B, hvor A er en opprinnelse og B er en destinasjon - for eksempel, Boylston Space Quad - hva du bør få tilbake innen noen få sekunder er en tekst melding fra Shuttle Boy forteller deg nøyaktig når neste skyttelbussene er, fra det punkt A skal det punkt B. Og dette er et mer generelt eksempel på det som kalles ved hjelp av en API. Så for eksempel, er dette her bare shuttleboy.cs50.net, den faktiske web-basert inkarnasjon av dette. Men dataene som understreker dette og andre programmer som CS50 har utviklet er alle utsatt for alle her i form av APIer, programmeringsgrensesnitt. Og det er bare en fancy måte å si at folk liker vi på Internett og andre har brukt litt tid på å lage programvare som du kan bruke for å hente data fra oss og deretter bygge dine egne applikasjoner på toppen av at datasettet. Så for eksempel, denne Shuttle Boy API side her, som skjer for å være i CS50 manuell, i hovedsak dokumenter hvordan du kan gå om å spørre CS50 servere for data. For eksempel, hvis du er kjent med CSV-filer, komma separerte verdier, disse er bare en slags rask og skitne Excel-lignende filer. Så du kan spørre Shuttle Boy for alle data på alle hus og deres GPS koordinater, og du får tilbake, i hovedsak, et regneark sånn at du kan da leses inn i et program for din egen og deretter generere resultater, som Shuttle Boy selv skjer til å gjøre. For de mer kjente, mer moderne data representasjoner inkludere JSON, JavaScript Object Notation. Noe vil komme tilbake til deg mot slutten av semesteret. Men igjen, dette er bare en av flere av CS50 egen APIer. Og det spennende ting er nå, i disse dager, Facebook og Twitter og Google, og ganske mye alle populære nettstedet ut Det har en slags API, som betyr at hvis du leser dokumentasjon på deres hjemmeside, kan du registrere deg for en konto, kan du begynne å skrive programvare på toppen av uansett verktøy eller data som selskapet det gir. Og så en av våre eigne pedagogiske karer et par år tilbake skrev en Mac-versjon av denne. Så på koblingen Mac her øverst til venstre, kan du faktisk laste ned en Mac OS widget som kjører på din egen Mac å gjøre samme typer ting. Så det handler om å bygge på toppen av datasett som disse. Men mer om det mot slutten av semesteret. Så la oss dykke i det virkelige rask en feil, bare for å slags få ting varmet opp i dag, og tenker tilbake på noen av de ting vi så på i forrige uke. Spesielt la meg gå videre og trekke opp, sier dette eksempelet her. Buggy1.c, er dette tilgjengelig på kursets hjemmeside hvis du hadde liker å laste det ned og rote rundt selv. Men la oss zoome inn her på denne relativt kort program, og bare en super-rask oppsummering av noen av de grunnleggende byggesteinene som vi virkelig kommer til å bare begynne å ta for gitt. Så den blå ting, i linje 1 til 9, er bare softball spørsmål. Så dette er bare kommentarer. De har ingen funksjonell betydning. Men de er kommentarer i den forstand at de er notater som Jeg, den menneskelige, laget til meg selv slik at i foredrag og etter forelesning, kan jeg faktisk huske hva dette programmet gjør uten å måtte lese gjennom det linje for linje og gjenskape historie i mitt sinn. Videre, hvis jeg levere dette programmet til noen andre som deg, er det mye klarere for deg, på grunn av kommentarer som dette, hva programmet faktisk gjør, eller i det minste hva Programmet er ment å være å gjøre. Hvorvidt det er riktig er en annen sak fullstendig. Nå, i C, med flere linjer kommentarer, husker at på linje en her er det magiske symbol / *. Det betyr her kommer starten på en kommentar. Og ingenting annet betyr noe til du kommer til slutten terminator, som er * /, det motsatte. Så det faktum at jeg har 80-noen merkelige stjerner her fra venstre til høyre er egentlig bare en estetisk detalj. Det har ingen funksjonell betydning. Nå hvordan om linje 11? Hva gjør dette i lekmann vilkår? Hva er det? PUBLIKUM: Inkluderer standard. DAVID J. MALAN: OK, god. Så det inkluderer stdio.h biblioteket. Så hva betyr det? Vel, inne filen, stdio.h, er en hel haug med funksjon erklæringer - altså kode som noen andre skrev. Og et perfekt eksempel på en funksjon som er erklært i stdio.h er - som favoritt nå? Så printf, til en av de mest vanlige bruk, absolutt tidlig, fra biblioteket er der. Hvis jeg ikke utelukke at kodelinje, er Clang kommer til å hyle på meg noe om å bruke en svart symbol. Noe svart er trolig den nøkkelord, fordi Vi har ikke informert kompilatoren hva printf ser liker mindre vi har den linjen. Og mer ned til jorden, egentlig, hva den linjen sier er åpne opp filen, stdio.h, uansett hvor den er på serverens harddisk, eller apparatet harddisk, og copy-paste det der inn filen min, uten min måtte gjøre det manuelt. Nå, når vi kommer ned hit til hovedsiden, lenge før vi begynner erting hverandre hva int og hva tomrommet er. Men for nå, la oss se på de tre linjene innen 15 til 17. Dette her jeg hevder som buggy. Linje 7 i mine kommentarer, sier "Skal ut 10 asterisker men ikke. "Hvorfor dette ikke ut, faktisk, 10 slike stjerner? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Nettopp. Så merker at vi begynner å telle fra 0. Og dette er faktisk en konvensjon i programmering og informatikk mer generelt, begynner å telle fra 0 istedenfor 1. Og dette virkelig oppebærer bare fra det faktum at for eksempel, når vi hadde åtte personer på scenen, når ingen ble heve sin hånd, de var alle effektivt nuller. Og så er det bare en slags datamaskin konvensjon så, derfor å begynne å telle fra 0. Hvis det er det laveste antallet du kan representere i binær. Så her har vi begynt å initialisere jeg til 0. Vi har satt i lik 0.. Men da jeg gjorde dette feil her, sier jeg er mindre enn eller lik 10. Men hvis du tror at gjennom, hvis jeg starter på 0 og så går jeg bort opp til 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, jeg faktisk kommer til skrive ut 11 stjerner til skjermen, fordi jeg har gått opp til, eller lik 10. Så enkel løsning her er hva så? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Bare endre det til mindre enn. Hvis du virkelig vil, kan du gjøre dette. Men generelt, det er mislikt. Og så begynner å telle fra 0 er bare noe du bør typisk bli vant til. Nå, hva om dette hele konstruere i seg selv? Denne linjen 15 demarks en for løkke. Så for er ikke en funksjon. Det er bare en uttalelse. Det er en looping konstruksjon, som vi så i Scratch. Og den har tre deler. Legg merke til at det er den første delen til venstre på semikolon. Det er den midtre delen i mellom de to semikolon. Og så er det den høyre delen til høyre av den andre semikolon. Nå gjør den første av disse hva? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Back der? Ja? PUBLIKUM: Initialiseringsfeil. DAVID J. MALAN: Initialization. Så hva betyr dette? Vi har erklært en variabel kalt jeg. Det er av type int, fordi jeg har angitt int i. Og jeg initialisering jeg til verdien av 0. Så hva er dette egentlig si? Det er effektivt å si til datamaskinen hei, gi meg nok minne, nok RAM, for å passe et nummer, og deretter sette Tallet 0 i denne del av RAM. Og som en side, hvor stor er en int typisk, minst inne av apparatet? PUBLIKUM: 32 bit. DAVID J. MALAN: 32 biter. Så det betyr gi meg 32 bits, ellers kjent som 4 byte, og sette verdien 0 i den, noe som er ganske enkelt fordi det betyr bare sette alle bitene til 0. Så nå er den andre delen her tilstanden. Og tilstanden er, som navnet antyder, er det som kontrolleres igjen og igjen og igjen som om det er sant eller usant. Så dette er bare å si gjøre følgende linjer med kode - nemlig 16 linje, fordi det er den eneste innrykket under - så lenge jeg er mindre enn 10 år. Og etter hver iterasjon gjennom denne løkken, gjør forstørrelse, som i dette tilfellet er i + +. Nå betyr det ikke trenger å være i + +. Det kan være jeg -. Men hvis jeg gjorde dette, hva atferden kommer å være av dette programmet? PUBLIKUM: Det kommer til å være en uendelig loop. DAVID J. MALAN: Det kommer til å være en slags uendelig løkke, med mindre vi får heldig etter negative 2 milliarder kroner eller så. Kanskje ting vil vikle rundt, bare ved natur endelig antall bits som vi har tildelt for en int. Men det kommer garantert til å veksle langt mer enn 10 og sikkert mer enn 11 ganger her. Og nå, akkurat som en side, innser at jeg + + og jeg - er egentlig bare syntaktisk sukker. Det er bare stenografi notasjon for hva som er en litt mer eksplisitt skrevet som følger: i = i + 1. Som er identisk med i + +. Det bare slags ser penere å si i + +. Det er mer konsis, mer lesbar. Og slik at folk flest gjør det i stedet. Men dette er identisk funksjonelt til hva vi så. Så kort sagt, er det quick fix her bare for å si iterate jeg fra 0 helt opp til mindre enn 10 år. Og så får vi faktisk få 10 stjerner. Så la oss prøve dette. La meg åpne opp terminal på bunnen. La meg gå inn i katalogen som dette er i. Og jeg kommer til å kompilere den manuelt med Clang for nå. Og jeg kommer til å kompilere dette som buggy1.c, Enter. Og nå buggy1, hvorfor er det ingen slik fil eller katalog kalt buggy1? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Yeah. Så det er faktisk kalt a.out. Så husker hvis du bare kjøre Clang, der Clang er kompilatoren, og du ikke oppgi navnet du ønsker å gi til programmet, det kommer til standard å a.out. Så faktisk hvis jeg gjør ls - oops. Og jeg didn't - svart-hvitt problemet noen av du møtt har blitt fikset. Men la meg gjøre dette. Det har vi a.out på venstre side der. Så vi må kjøre a.out stedet for buggy1. Så la meg gå videre og gjøre dette. . / A.out, Enter. Og jeg tydeligvis ikke gjorde det? PUBLIKUM: Lagre. DAVID J. MALAN: Save filen min. Så det er lett løses ved å treffe Control S, eller gå til Fil, Lagre som i de fleste programmer. La meg gå ned her, tømme skjermen, kjøre den på nytt. Og det er fortsatt en bug. Så hva som skjer - PUBLIKUM: Du har ikke kompilere. DAVID J. MALAN: Ah, good. Jeg hadde ikke kompilere den. Som en idiot, jeg ser på koden for å se hva som er galt. Så clang buggy1.c, nå a.out. Og phew, lagret. Så det ser litt stygg fordi det er ingen ny linje hvor som helst i programmet. Men igjen, det er bare et estetisk detalj. Og i hvert fall hvis vi regner dem ut, bør vi nå se 10 slike stjerner. Vel, hva med dette sekunders oppvarmingstid eksempel? Så i buggy2, hevder jeg at denne versjonen vil også ut 10 stjerner, ett per linje. Så denne gangen har jeg en ny linje karakter, bare for å gjøre ting litt penere. Men i stedet hva jeg får er dette. Så la meg gjøre clang buggy2.c, Enter. Nå er det igjen kalt a.out. Enter. Jeg ser bare én ny linje, bare den aller siste nye linjen som flytter mitt spørsmål til neste linje. Og likevel klart jeg har vært utskrift *, deretter en ny linje, *, Deretter en ny linje. Men hva er feilen her? Ja? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Nettopp. Så i motsetning til enkelte språk, som Python, der innrykk faktisk har funksjonell betydning, i en språk som C - som vi skal se, PHP, JavaScript - innrykk er egentlig bare for mennesker til gode. Så det faktum at jeg har rykket linje 16 og 17 ser flott ut, men det har ingen funksjonell betydning her. Hvis jeg vil begge linjene for å utføre som en del av for loop, så jeg må legge dem i klammeparentes ved å gjøre dette. Du kan bare klippe det hjørnet og hoppe over de klammeparentes hvis hva er tilfellet? PUBLIKUM: Bare én linje. DAVID J. MALAN: Bare én linje. Så det er bare en slags en fin slags syntaks detalj slik at du ikke kaste bort tid på å skrive tre linjer, hvorav to er klammeparentes, bare for å skrive en eneste linje med kode. Men hvis du har to eller flere linjer, vi faktisk må gjøre dette. Så nå la meg lagre denne. La meg gå videre og kjøre Clang. Så la meg kjøre a.out, og nå får jeg dem en per linje. Nå er a.out igjen en slags dum navn for et program. Hvordan kan jeg fortelle Clang å faktisk gi meg et filnavn som er mer brukervennlig, som buggy2 seg selv? Litt mer tydelig? PUBLIKUM: [uhørlig]. DAVID J. MALAN: OK, så jeg kan faktisk ta svært brukervennlig snarveien og bare skrive at buggy2. Jeg sier ikke noe om. C i dette tilfellet, og trykk på Enter. Og hva gjør gjør er det kompilerer buggy2.c for meg spør Clang å gjøre det. Spesielt, kaller det Clang, går det Clang hjelp måten mer kommandolinjeargumenter eller brytere enn jeg faktisk trenger. Med tiden vil vi komme tilbake til hva alle disse ulike kryptiske bindestrek uttrykk betyr. Men for nå, er det bare å spare meg bryet med å måtte huske og å måtte skrive ut alle disse ulike bindestrek uttrykk. Og oppsiden av det er til syvende og sist at nå har jeg buggy2. Hvis jeg ønsker å gjøre dette manuelt, men jeg kan i stedet gjøre dette - clang-o buggy2 og deretter buggy2.c. Og det vil likeledes gi meg en fil som heter buggy2. Så kort sagt, er Clang kompilatoren. Gjør er bare et brukervennlig verktøy som vi skal bruke mer og mer, fordi det begynner bare å forenkle ting for oss. Og vi kommer tilbake 0, til slutt. For nå, bare fordi, men vi vil starte teasing den delen dag og på onsdag. Eventuelle spørsmål om noe av dette? Ja? PUBLIKUM: [uhørlig] ls i anførselstegn der? DAVID J. MALAN: OK. Når jeg skrev ls i anførselstegn, som ble meg gjør litt magi bak kulissene for å fikse en feil. Jeg glemte, som vi har vært å fortelle mange av dere på diskusjonsfora, å gjøre - Vi vil gjøre dette nå - sudo yum-y oppdatering appliance50. Whoops, at det er stavet riktig. Så apparatet er som et operativsystem. Det kjører dette operativsystemet heter Fedora. Og nå på grunn av min treg Internett-tilkobling, har jeg virkelig spyles det. Så kjører sudo yum oppdatering, som vi fortelle deg å gjøre i oppgavesettet, er som i hovedsak kjører automatiske oppdateringer i Mac OS eller Windows. Og begrunnelsen for å kjøre dette på begynnelsen av Oppgavesettet er fordi når vi laget apparatet, jeg messed up, og jeg tilfeldigvis gjorde alle programmene dine ser svart på en svart skjerm, som er grunnen til at du ikke ser dem som standard. Men den nyeste versjonen av apparatet løser dette. Og jeg vil fikse det i pausen når jeg har internett tilkobling. Så sitater bare skjuler min feil, veldig diskret, tilsynelatende. Andre spørsmål? Ja? PUBLIKUM: Hvor gjør kommer fra? [Uhørlig] DAVID J. MALAN: Godt spørsmål. Hvor gjør kommer fra? Det er en Linux-program som har eksistert i mange år, lenge før CS50. Og det kommer med et operativsystem som Fedora. Det kommer ikke fra CS50 biblioteket. Faktisk, det eneste som kommer fra CS50 bibliotek så langt, at vi har sett, er GetString, GetInt, alle de Få funksjoner, og ordet streng, og til en viss grad ordet bool. Men vi vil erte at bortsett når vi dykke ned i CS50 selve apparatet. Så ja, ett spørsmål til her. PUBLIKUM: Når du sa lage og deretter buggy, hvordan datamaskin vet [uhørlig]? DAVID J. MALAN: Godt spørsmål. Så når du bare kjøre lage buggy1 eller gjøre buggy2, hvordan gjør det? Så som standard, hvis du skriver at buggy1, lage ser for en fil som heter buggy1.c. Og da er det utfører de riktige klang kommandoer, dermed overstyre standard output fil kalt a.out. Faktisk, hvis vi ser på hva gjør, hva - la oss avslutte denne. Hvis vi ser på hva som gjør faktisk gjør, gjør buggy2, det er allerede oppdatert. Så la meg fjerne rm kommandoen, programmet jeg skrev før. Skrive Y-E-S for å bekrefte at jeg ønsker å fjerne det. Hvis jeg nå gjør, legge merke til at i denne svært lang linje, det er denne siste her,-o buggy2. Alle gjør gjør er forbifarten at argumentet, så å si, til Clang, slik at jeg ikke behøver å skrive det selv. All right, så en rask par administrative kunngjøringer. Så for deler, som offisielt startet dette kommer Søndag, vil du alltid ønsker å ta, dersom du har en, en bærbar datamaskin. Hvis du ikke har en bærbar PC, må nå ut til meg av slippe meg en epost. Og vi vil finne en arbeidsflyt. Hva du vanligvis finner i delen er at de er en del konseptuelle, del hands-on. Vi vil spesielt bruke den delen av spørsmål, en del av ukens oppgavesettet, å gå gjennom noen av de konseptuelle materiale fra forelesning. Og det er alt i den aktuelle oppgaven. Og vi vil også dykke inn i noen hands-on aktiviteter, noen ganger som vil være nødvendig for å bli sendt, noen ganger av som ikke vil. For eksempel, denne første uken, de mente bare som en warm-up trening. Og du vil finne at disse problemene er egentlig bare det. De er ment å være ganske små, men ikke nødvendigvis trivielle programmer for å skrive, som ikke nødvendigvis er spennende i seg selv, men er gode muligheter til å øve med syntaks, med nye funksjoner, i den komforten av en delen der du har noen av dine klassekamerater til stede som samt TF din. Og hva vi skal gjøre over tid er å bruke et verktøy kalt CS50 Spaces, der i stedet for bare å bruke CS50 Appliance, vil du i stedet gå til en nettside i en nettleser, hvor du vil kunne å skrive kode i en nettleser-vinduet under delen. Og så hvis du melder deg på, kan undervisningen stipendiat deretter vise hva det er du skriver på skjermen din i nettleseren din vinduet opp på forsiden av klassen, enten anonymt eller offentlig, slik at han eller hun kan deretter gå gjennom med klassekameratene dine hva du gjorde bra, hva du ikke gjøre det bra. Og igjen, forsikret resten alt dette kan være pent anonymiseres. Men det vil være en fin mulighet for mye mer interaktivitet enn noe sånt som forelesning tillater. I mellomtiden vil vi ha disse tingene kalles super seksjoner, som er valgfritt, men er åpne for alle i klassen, slik at du kan gjøre dette mer kollektivt for Problemet er angitt. Her er planen. Dette er også lagt ut på hjemmesiden i cs50.net. Legg merke til at det vil være en hacker-spesifikt en i morgen ettermiddag. Og vi vil filme en dag og en i morgen og legge dem online innen 24 timer. Så hvis du ikke kan gjøre noen av disse tider, for ikke å bekymre deg. Og igjen, er planen online nå på cs50.net. I form av seksjonering selv, bør du ha fått en e-post med beskjed om å gå til kursets hjemmeside for å finne ut inndelingen. Hvis livet har endret seg og du må endre din del, ikke et problem. Gå tilbake til det samme URL, cs50.net/section, entall, og du vil fylle ut lignende form, slik at du kan så gi oss dine preferanser. Og vi vil følge opp ved ukens slutt på hva vi kan imøtekomme. Forrige uke, husker at vi foreslått å bruke CS50 Diskuter, kursets diskusjonen verktøy, forelesning. Så vi hadde 40 spørsmål som ble stilt og svarte under forelesning. Så det syntes å fungere godt, så vi vil fortsette prøver å gjøre dette. Hvis du under forelesning, trenger du ikke bare føler deg komfortabel heving hånden, ikke et problem. Gå til cs50.net/discuss, legge der, og en av vår undervisning Stipendiatene vil enten svare på det elektronisk eller heve hånd på dine vegne anonymt å spørre, avhengig av arten av spørsmålet. Og i form av tilbakemeldinger, vil generelt psets være returneres innen en uke. Fordi det tar litt tid for deler for å oppnå likevekt, vil den første pset, 0 og 1, være litt forsinket som ting slå seg ned. Men følg med for at i ukene som kommer. All right, så la meg sette på min alvorlig stemme for bare et øyeblikk. Så dette er faktisk en interessant klima å være ha denne diskusjonen, hva med alle de andre ting skjer på campus relatert til dette. Men CS50 har sikkert hatt sin historie av denne spesielle problemstilling, i så mye som hvert år, dette kurset, for mange år, Ad-Boards omtrent 3% av klassen. Dette siste året, 2011, CS50 Ad-Boarded 35 studenter. Dette er ikke, tror jeg, på grunn av mangel på klarhet. Innse at i kursets pensum, det er en side av redegjørelse hvor linjene er. Det samme setningen gjentas på hver og en av Problemet setter på side en. Så jeg nevne dette i dag egentlig bare for å gjøre folk oppmerksom på dette. Og vi har prøvd forskjellige ting. Og det jeg trodde vi ville gjøre i dag er å ta bare et øyeblikk å faktisk ser på noen av de siste sakene som har kommet opp. Snarere enn å holde disse som skitne lille hemmeligheter, faktisk peke ut hva elevene har gjort og hvordan vi har oppdaget det og virkelig hva overordnet motivasjon er for selv å ha denne samtalen. Så med det sagt, er linjen egentlig dette - per pensum, er du velkommen, oppfordres du, for å snakke med klassekamerater. Det er hele hensikten med å ha disse samarbeidende kontortid i Annenberg og oppmuntre folk til endelig prosjekt å jobbe sammen. Men linjen trekkes når det gjelder tid til å faktisk skrive den endelige løsningen. Snakke på engelsk, helt greit, snakke i pseudo-kode, helt fint. Sende en klassekamerat din pset, la dem se over skjermen som hender fortsette å skrive, over streken også. Ser til pensum for de spesielle linjene. Men bare for å male et bilde av hvordan dette er dessverre en virkeligheten, innser at det finnes nettsteder der ute som ha løsninger fra denne klassen og mange andre klasser. Det faktum at du eller noen 3% av dere vet at dette finnes betyr at vi vet at dette finnes. Det faktum at det finnes nettsteder som dette, hvor du kan betale noen for å faktisk gjøre dine oppgavesett - dette var en aktuell sak som kom opp i fjor. Dette er en nettside som heter odesk.com. Og Tim var navnet på personen her som var oppslaget på dette nettstedet og spurte noen til å gjøre sin pset 7 i denne spesielle saken. Vel, er odesk.com svært Google-stand, og vi også er veldig flinke til Googling. Også her er det områder - og dette er heller fryktelig, ærlig. [Latter] DAVID J. MALAN: Den morsomme ting om dette nettstedet er hvis du leser om side, de snakker om sine corporate kultur og hvordan kundeservice er deres nummer én prioritet, for å sørge for at oppdrag får slått inn i tide. Men i all seriøsitet, igjen, det faktum at disse nettstedene eksisterer, innser vi også er bevisst på disse typer nettsteder. Og for å gi deg en følelse av hva som former dette vanligvis tar vi vanligvis ikke har store skandaler der folk samarbeider om noen form for massiv skala, men heller det er disse nattlige øyeblikk av svakhet, hvor du har så mye å gjøre, det er 04:00, er du utslitt, og du tenke deg selv, vel, la meg bare ta en titt på min romkamerat eller min venn kode eller lignende. Og manifestasjoner av dette dessverre innebære Student En sender noe som dette og Student B innsending noe sånt som dette, som sikkert, i en datamaskin vitenskap klasse, er bemerkelsesverdig lett for dataforskere å oppdage med programvare. Dette er en annen vanlig paradigmet, hvor du har liksom jobbet sammen for noen, kanskje snakker i Engelsk, helt fint, pseudokode. Men så det er på tide å faktisk sende inn, og psets bare få byttet via e-post eller Dropbox eller lignende. Men i et forsøk på å gjøre det mindre klart at dette er hva som har skjedd, så er dette hva som sendes. Også dette ikke turen opp velskrevne biter av programvare som vi må faktisk oppdage slike ting. Og faktisk det vi gjør er å kjøre programvare som sammenligner alle årets innleveringer mot alle tidligere år innleveringer, mot alt vi fant på Internett, mot hver jobb nettsted der ute. Det er veldig automatisert. Og så gjør vi dette virkelig i stor rettferdighet til 97% som som virkelig fungerer rumpa av i denne og i andre klasser og sette i alle som innsats, slik at arbeidet de til slutt sende er deres egne. Og jeg kan gå på for aldre. Dette er bare en håndfull av fjorårets saker. Noen studenter sendt disse filene likt for pset 2, pset 3, 4 pset, 5 pset, 6 pset, 9 pset. I dette tilfellet var dette quiz 0 og i fjor, der to studenter sendt identisk denne setningen blant mange andre, "Forespørselen type -" dot, dot, dot. Slik at selv i en klasse av 600 gjorde vi oppdage dette på innsendt spørrekonkurranser. Så kort sagt, dette - ærlig, jeg hater å ha denne type samtale - men dette er virkelig en bevisst innsats dette året for å prøve å kjøre ned dette nummeret. For selv om vi sier slike ting hver år, tror jeg realiteten av å ha dvelt på det for noen flere sekunder enn vanlig og faktisk bare å peke ut at det kan virke som, eh, ikke en så stor avtale, minst tenker tilbake til dette spesielle øyeblikket, både i rettferdighet til selv og til dine klassekamerater her. Så hvis du har spørsmål om hvor linjen er, kan du bare nå ut til meg personlig. Men svaret er alltid helt stresset på siste minutt, kontanter i en sen dag. Eller om det er et spørsmål om ikke å ha noen sene dager, ærlig, send meg personlig. Vi skal finne ut av noe. Vennligst ikke sette din tid her på Harvard i fare. Nå, jeg trodde vi skulle lette stemningen, så jeg inkludert dette som neste lysbilde. [Latter] DAVID J. MALAN: Dette nettstedet var stor. Jeg fikk faktisk litt distrahert. Det er denne. Og så dette var fantastisk. Ok, så tenk på at kattungen sent på kvelden når du gjør disse avgjørelsene. All right, så tilbake til mer moro og mindre alvorlige ting, som forhold. Greit, så vi snakket kort om disse. Dette er noe som er trolig ganske kjent fra verden av Scratch. Og i en verden av Scratch, har vi dette behovet noen ganger til gå gjøre gafler i veien. Enten gjøre dette eller hint eller denne andre ting her. Og når vi ønsker å gjøre dette, kan vi bruke, i C nå, dette hvis annet konstruere. Og så her har vi boolske uttrykk. For eksempel boolske uttrykk her, kan vi ELLER dem sammen, i den forstand at vi har denne tilstanden ELLER den tilstanden. Vi kan og dem sammen, i den forstand at vi ønsker å sjekk denne tilstanden, og den tilstanden. Og her har vi en bryter uttalelse nå, som ikke er så lignende syntaktisk til disse typer forhold, men det tillater oss å gjøre det samme som if, else if, else if, else hvis, og lignende ved å opplisting dem tilfelle av hvert enkelt tilfelle. Så vi så dem sist. Og så begynte vi å berøre ting som looper. Vi så en av disse bare et øyeblikk siden. Men det er disse andre looping konstruksjoner. For eksempel, denne her. Så mens (tilstand), gjør denne tingen igjen og igjen. Så fundamentalt, hva synes å være forskjellig mellom denne for loop og dette mens loop her? Dette for loop og dette mens loop. Ja? Hva er det? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Good. Så mens i for loop tilstand, det er klart mer syntaks. Det er denne initialiseringen, det er denne oppdateringen. I en stund loop, er det bare denne tilstanden. Så det virker som det er litt avdempet i forhold til for loop, noe som betyr hvis vi ønsker å ha variabler, og vi ønsker å ha forstørrelse, vi faktisk nødt til å gjøre dette selv. Så la meg gå videre og åpne opp gedit. La meg slå over til apparatet. Og la oss bare gjøre en rask liten eksempel på at skiller en av disse fra hverandre. Og i bakhodet mitt her, skal jeg si en ting. Jeg nevnte spesielt navnet Tim. Tim var faktisk noen som en student prøvde å finne for å gjøre lekser for dem. Vi hadde ingen Tim i det aktuelle avsnittet. Så skjønner, så jeg avslørt en student, var det ikke en student. Det var en tilfeldig person på internett å gjøre ting ved fullmakt fjor. Så vi finner det også. Så i dette tilfellet her, la meg gå videre og åpne opp en ny fil. File, New. Dette gir meg en fane her. La meg gå videre og lagre det som loop.c. La meg gå og klikker på Lagre. Og deretter ned her, la oss gå videre og begynne å skrive # Include . La meg zoome inn Nå skal vi gjøre int main (void). Nå la meg gå videre og gjøre for (int i = 0; i < oh, 10; i + +). Og nå skal jeg gå videre og skriver ut stjernen at jeg gjorde tidligere. Og deretter ved utgangen av dette programmet, vi bare kommer til å skrive ut en ny linje, bare så at min spør ser ikke alle rotete. returnere 0. Seem syntaktisk riktig? Så langt. Så la oss se. Så la meg zoome ut, gå inn i min terminal-vinduet. Og la meg gå videre og kjøre loop, fordi jeg kalte dette ting loop.c. Så sørg for loop. Synes å kompilere OK. La meg kjøre loop, og nå Enter. Og det ser ut til å ha skrevet 10 stjerner. Så la oss bare konvertere dette til en stund loop og se hva typer saker vi turen over. Så i stedet for dette, la meg gå inn her og si mens jeg er mindre enn 10 - la meg bli kvitt den for loop. OK, så vi har et par problemer allerede. Så tilstanden er den samme, men jeg er tydeligvis mangler initialisering. Jeg mangler forstørrelse. Så hva skal kompilatoren sannsynlig fortelle meg når jeg prøver å kompilere dette programmet? Ja? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Good. Så det kommer til å si noe sånt svart - i dette tilfelle, variabel i. Og faktisk, bruk av svart identifikator jeg. Og så dette er i kontrast med språk som PHP og Python og Ruby, som noen av dere kanskje kjenner, der du kan bare slags start med variabler willy-Bulle og ikke trenger å bekymre deg for å erklære dem eksplisitt alltid. I C og i språk som Java og C + +, må du være super eksplisitt. Og hvis du vil ha en variabel kalt i, må du fortelle meg hva slags variabel det er. Så vi er nødt til å fikse dette på følgende måte. Jeg kommer til å gå opp her og skriv int i, og derfor Jeg har erklært en variabel kalt jeg. Nå har jeg hoppet over ett trinn. Jeg har tydeligvis ikke initialisert det, men la oss se om det på Minst merker Clang stoppe klagende. Så la meg remake dette programmet. Greit, nå er det bare klager for en annen grunn. "Variable 'i' initialisert når det brukes her." All right, så det er ganske eksplisitt. Initialisert betyr bare å sette den lik en verdi. Og vi har ikke gjort det, så la meg prøve lik 0. La oss nå prøve dette igjen og kjøre Clang. Utarbeidet denne gangen. Og jeg er i ferd med å kjøre den. Men store gamle uendelig løkke, fordi jeg har gjort det initialisering, har jeg gjort tilstanden, men jeg har aldri gjort noen form for forstørrelse. Så hvordan kan jeg gjøre forstørrelse? Vel, på en stund loop, føles det som om jeg kommer til å ha å gjøre det inne i loopen, fordi mye som den første ukens eksempler på å gjøre looping konstruksjoner, som med sokker og med selv-telling, måtte vi gjøre noe helt til slutt, som går tilbake til neste linje. Hva hvis jeg går videre og gjøre dette i + + her? La oss ikke engang kompilere dette. Ta meg allerede. Hva er galt her? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Så det er definitivt ikke int. Det er jeg. Og klammeparentes, som før, innrykk er ikke nok. Så nå har jeg konstruere denne har. Så mens jeg er mindre enn 10, skriver du ut en stjerne, deretter øke i. Og måten en stund løkke fungerer er at så snart du treffer bunnen av sløyfen, som i dette tilfellet ser ut linje 10, det kommer til å gå tilbake til linje 6, noe som medførte at tilstand vil bli sjekket igjen. Og hvis jeg fortsatt er mindre enn 10, vil vi gjøre linjene 8 og deretter 9, så får vi treffe 10, og gå tilbake til 6, igjen og igjen og igjen og igjen, så lenge jeg er mindre enn 10 år. Så la oss re-run gjøre her. Ok, vi har samlet greit. La meg re-run loop. Og nå ser det ut faktisk å jobbe. Så plusser og minuser her? Vel, så langt det er faktisk ikke en hel av PLO - så søt. Greit, det var en - ah, det var en ulykke. All right, så la oss gå tilbake til for loop. Så for løkker er fint fordi de er super eksplisitt. Og selv om de er litt clunky å skrive, er det svært kraftig og det tillater deg å gjøre flere ting på en gang. Mens løkker ikke synes å ha en stor mengde verdi bare ennå, fordi det føles som vi bare nødt til å gjøre mer arbeid. Vi må sette initialiseringen opp her, oppdatere her nede, og vi må huske å gjøre alt dette. Så vi får se i tid at mens sløyfer faktisk låne seg til bare forskjellige sammenhenger, ulike data strukturer som lister og hash tabeller, ting vi vil komme til mid-semester. Men for nå, vet at det er denne tredje typen er kjent som en do- mens loop. Og vi har sett dette kort. Og dette kan være super nyttig med pset en. Hver gang du ønsker å gjøre noe, og deretter sjekke om brukeren samarbeidet, og hvis de ikke gjør det igjen, en gjør- mens loop gir seg til den slags logikk. Fordi som bestiller fra topp til bunn her antyder, gjør betyr bokstavelig talt gjøre dette. Og gjøre dette igjen og igjen, hva kan det være? Kanskje det betyr ringer GetInt eller GetString og deretter sjekke verdien av GetInt eller GetString og deretter roping på brukeren hvis de ikke har samarbeidet ved å spørre dem igjen og igjen og igjen. Hvor du ønsker å gjøre noe en gang, så sjekk noen tilstand. Så la oss prøve dette. La meg faktisk endre dette nå til en do-while-løkke. Og jeg kommer til å gå videre og gjøre følgende. Så gjør du følgende. La oss gjøre int i = GetInt (); men la oss først fortelle brukeren hva de skal gjøre. Så en litt annerledes denne gangen. "Gi meg en int". Så jeg skal bruke printf for det. Og nå skal jeg gå ned her, og jeg kommer til å gjøre dette mens jeg er, la oss si, større enn - la oss se, er jeg, la oss si, mindre enn 0, eller jeg er større enn 10. Med andre ord, jeg vil ha et nummer fra 1 til 9, bare vilkårlig. Så jeg bruker en kombinert boolsk uttrykk her sørge for at i er mindre enn 0 eller større enn 10, hvor tilfelle jeg vil gjøre denne sløyfen her igjen. Så igjen, gjør dette - mens i er mindre enn 0 eller jeg er større enn 10. Så la oss nå gå videre og gjøre dette når vi har gjort det. La oss bare gjøre en rask sunn fornuft sjekk. printf ("Takk, jeg% d", i). Så dette enkle programmet ber brukeren om en int, gjør at det er innen noen utvalg, 1 til 9 inkluderende, og takk så brukeren ved å minne dem hva de bare skrevet i, bare som en liten mental helse sjekk. Men la oss se om dette fungerer som det skal. La meg gå hodet ned her og kjøre gjør loop. Hmm. "Bruk av svart identifikator 'i'". Det er rart. Jeg trodde vi løst det. Samme symptom, men en annen kode. Ja? PUBLIKUM: [uhørlig] inne i to, må vi [Uhørlig]. DAVID J. MALAN: Nettopp. Så dette fører oss faktisk til et emne som kalles omfang. Det viser seg at C, igjen, det virkelig tar deg bokstavelig talt. Og hvis du gjør noe som dette hvor du erklærer en int og deretter tilordne den en viss verdi, men du gjør det inne i en par klammeparentes, hva C ikke er det forutsetter at du bare vil de 32 bits kjent som jeg å eksistere innenfor sammenheng med de klammeparentes, innenfor rammen av linjer 6 til 9. Så jeg er erklært, og det er tildelt et verdi i linje 8, men så snart du kommer utenfor av linje 9 nedenfor den krøllete seler, i er ikke lenger i omfang, så å si. S-C-O-P-E. Det er ikke lenger i riktig sammenheng. Så nå er det ingen jeg, så det er som om vi hadde ikke engang erklærte i det hele tatt. Så hva er en løsning så etter noe som dette, hvis Årsaken er at jeg er erklært innenfor krøllparenteser, som er tilsynelatende dårlig? Her? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Yeah. Så vi kan initialisere den utenfor. Så la meg gå foran og slette erklæringen deler der Jeg angir type, og la meg gjøre det her oppe. Så i linje 5 står det nå "Gi meg en int." Kall det jeg. Merke til i linje 9, jeg ønsker ikke å gjøre dette, fordi jeg allerede har de 32 biter. Jeg ønsker ikke å be datamaskinen om en forskjellige 32 bits. Jeg ønsker å bruke de samme 32 bits. Og nå fordi jeg er deklarert i linje 5, er det fortsatt legit å bruke den på linje 11 og linje 12. Så la meg prøve å rekompilere dette og se hvis Clang slutter roping. lage loop. Så nå er det "implisitt erklæring av funksjon 'GetInt er ugyldig i C99. "Hva er det? Ja? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Yeah. Så nå som jeg faktisk bruker GetInt, dette er ikke noe som kommer bare med C. Dette kommer fra CS50. Så vi trenger dette her. Og la meg gå tilbake til ledeteksten ned her og kjøre gjør. Ok, til slutt. Nå har vi løst det, og den andre feil. La meg nå kjøre loop og se hva som skjer. "Gi meg en int." Jeg skal gi den 11. Jeg skal gi det -1. Jeg skal gi det foo. Jeg skal gi den 5. Og nå virker det faktisk. Men spør endret for en grunn her. Hvorfor gjorde det si prøve en av disse tider, men gi meg en int de andre tre ganger? Hvorfor er at atferd annerledes? PUBLIKUM: Ga det en streng. DAVID J. MALAN: Sorry? PUBLIKUM: Du ga det en streng. DAVID J. MALAN: Yeah. Så vi ga det en streng i denne tredje forsøk, når jeg skrev foo. Foo er en streng. Det er åpenbart ikke en int. Og måten CS50 har implementert GetInt er at vi kontroller ikke om noe er mindre enn 0 eller større enn 10 for deg, fordi hvordan vet vi på forhånd hva slags int du vil? Men vi kan minimalt sjekke for deg, gjorde brukeren minst skriver et heltall? Og hvis de ikke gjorde det, kjefte vi på brukeren ved å skrive "retry" på skjermen. Så nå har vi et program som looping. Okay. Nå, er hvilken av disse slags bedre konstruksjonen? Så dette er hvor ting begynner å bli litt rotete, det faktum at du må huske å erklære en variabel opp her Hvis du ønsker å bruke det inne i noen klammeparentes og utenfor. Men selv om dette ser litt kryptisk i starten blikk, bare en gang, husker den enkle logikk. For å kunne bruke noe i C, enten det er en funksjon eller det er en variabel, må du ta det hvis det er en funksjon i noen bibliotek, eller du trenger å erklære det. Men nå må du være ekstra oppmerksom på det faktum at du erklære den i riktig omfang. Du er ikke å ta for hardt inne i parenteser. Så la meg faktisk rulle tilbake. Hvis vi går tilbake til våre for eksempel fra tidligere, og jeg går tilbake til for int, int i = 0; i <10; i + +, og jeg gjøre printf stjerner, som dette, og lukk deretter paren, og nå printf jeg er nå - etter samme logikk, hva vil skje når jeg prøver å kompilere dette programmet? PUBLIKUM: Ugyldig identifikator. DAVID J. MALAN: Så det er en annen ugyldig identifikator, svart identifikator. Nå er grunnen litt annerledes. Det er åpenbart ingen klammeparentes her, men det samme idé, gjelder den samme historien om omfang. Hvis du har erklært en variabel som jeg inne i en for loop, selv om du ikke har eksplisitt skrevet krøllete tannregulering, tenk på dem mentalt fortsatt være der, hvor tilfelle jeg er bare gyldig innsiden av for-løkke. Det er ikke gyldig når du kommer til neste linje, som i dette tilfellet er nå 10. Så bare noen få spørsmål om omfang og lignende. Greit, noen spørsmål? Greit, så dette er en slags trivielle lite program, utskrift bare små stjerner. Men la oss se om du husker denne sangen her. Dette er en utrolig irriterende sang ungene ville synge på skolebussen o.l.. Men hva er fint om det er at det har denne syklisitet, der det er "99 flasker øl på veggen, 99 flasker øl. Ta en ned, passerer det rundt, 98 flasker øl på veggen. "Og så sang gjentar 97, deretter 96, så 95, så 94, hele veien ned til 0 hvis du faktisk fikk det langt på bussen. Så dette er en fin program for å sortere av redskapet, fordi min Gud, om du bare kunne implementere dette med noen linjer med kode, kan du spytte ut hele teksten til denne sang ganske raskt. Men underveis, kan vi begynne å nå erte hverandre litt av disse grunnleggende looping konstruerer og nå også innføre funksjoner som vi skriver selv, returnere verdier at vi passerer rundt. Men først, hva vi gå videre og ta våre fem minutters bryte her? Og når vi kommer tilbake, vil vi synge denne sangen. Greit, så vi er tilbake. Og når jeg sier vi vil nå synge denne sangen, mener jeg programmatisk, ikke verbalt. Så her har vi beer1.c, som er en implementering av denne bestemt sang. Og bare for å være klar, for de som ikke kjenner det denne tingen ser ut, la meg gå videre og gjøre beer1, Enter. Nå la meg kjøre beer1, og hva vi vil se - hvor mange flasker av øl blir det? Jeg skriver i 99, som sangen sier. Enter. Og nå hvis vi bla gjennom - oops - hvis vi blar gjennom alt dette, vil vi se at dette gjorde virkelig synge hele sangen. Vent litt. Min rullefeltet er litt messed up. La oss bruke større vindu. Så beer1, 99, der vi går. Så her har vi hele sangen, sunget mye raskere ved datamaskin enn det kunne ha vært av oss. Så legger merke til, men den sykliske natur her. Det sier 99, så 99, så "ta en ned, passerer det rundt ", så 98. Og nå er det gjentar igjen og igjen. Så dette er egentlig en perfekt mulighet for en slags looping konstruere. Legg merke til at jeg er litt kutte et hjørne her. Legg merke til at jeg sier "98 flasker øl på veggen, 97 flasker øl på veggen, "og det var bare så at når vi kommer til en flasker med øl, jeg har ikke å bekymre seg om engelsk grammatikk. Men vi kan også fikse dette med en liten bit av en hvis tilstand, kanskje. Hvis dette tallet er entall, gå videre og si "flaske", ellers hvis det er flertall, sier "flasker". Men for nå, jeg er helt kutte det hjørnet. Så la oss se hva vi har her. Så vi har fått noen kommentarer på toppen. Jeg er inkludert disse to bibliotekene, som Vi har ofte vært. Og nå la meg bla ned til det første faktiske linjer med kode. Linje 17 starter main. Linje 21 og 20 har hvor mange flasker øl vil det være? Og så kaller jeg GetInt. Og nå har jeg litt av en mental helse sjekk. Så dette er en konvensjon som vi vil nå begynne å vedta å strengere sjekk brukerens input. Noen ganger du bare ikke ønsker å be dem igjen og igjen og igjen. Hvis brukeren skruer opp og ikke samarbeider, fint. Avslutt og bare ikke håndtere dem. Og så det er det jeg gjør her. Hvis n er mindre enn 1, jeg bare kommer til å kjefte på brukeren, "Beklager, gjør at ingen mening." Og så skal jeg vilkårlig tilbake 1. Så igjen, dette er bare en konvensjon for å bli vant til. For nå, ta det på tro. Men inntil nå, har vi alltid vært tilbake 0, fordi vi har sagt retur 0 betegner hva? PUBLIKUM: Suksess. DAVID J. MALAN: Suksess, det er alt. Så nå som vi endelig begynner å tenke på ikke-suksesser - med andre ord, hjørne tilfeller, feiltilstander - nå har jeg en uendelig forsyning, eller i det minste fire milliarder mulige ting som kan gå galt i mine programmer. Og jeg kan begynne å tildele dem individuelle tall. Nå, vanligvis er det nok å bare gå tilbake noe annet enn 0. Så vi kommer til å bare gå tilbake 1 for nå. Men grunnen for retur 1 er at så snart du kommer 1, gjett hva som skjer med resten av programmet? Den stopper. Det var det. Så det faktum at jeg er tilbake 1 er effektivt kortslutning dette programmet gjennomføringen slik at ingenting under linje 27 vil fortsette å utføre. Så snart som viktigste avkastning, er at det. All right, så hvis brukeren ikke samarbeider, og vi kommer linje 30 fordi de skrev i en legitim nummer, her er min gjennomføring av denne sangen. Så jeg først skrive ut et linjeskift, bare for estetikk. Jeg har nå en for-løkke. Og legg merke til at jeg gjør ting på en litt av en annen retning. Jeg trenger ikke å gjøre mindre enn, jeg trenger ikke å gjøre + +. Jeg kan i stedet si initialisere en variabel i, sette den lik n, antall brukeren skrev inn, så gjør følgende, så lenge jeg er større enn 0, så jeg - når du har fullført en gjentakelse av denne sløyfen. Så vi kan telle ned med en for løkke i tillegg. Nå er dette ganske mye uke en ting nå, med printf. Så skrive "% d flasker øl på veggen." Print "% d flasker øl. "" Ta en ned, passerer det rundt. "Skriv ut "% D flasker øl på veggen." Så det er fortsatt% d, men merke til at argumentet til printf er i endring. Etter komma, jeg har jeg, fordi jeg ønsker å si 99. Etter dette komma, jeg har jeg, fordi jeg ønsker å si 99. Etter dette komma, jeg har i - 1, fordi jeg ønsker å si 98 i denne første iterasjon, og så videre. Og nå her nede, jeg bare har noen dum liten bemerkning. Og deretter linje 42, returnerer jeg 0 av konvensjonen, som betyr at alt er i orden. Så hva om jeg goofed? Hva kan en vanlig feil her være? Vel, hva om jeg tilfeldigvis sa vel, jeg ønsker å telle ned til 0, vil jeg 0 flasker øl på veggen? Så jeg sier, er jeg større enn eller lik 0.. Hva kommer til å være symptom som jeg nå se om jeg rekompilere beer1 og kjøre den? PUBLIKUM: Negativ. DAVID J. MALAN: Ja, det skal gå i minus. Dette er en off-by-one feil, en utrolig vanlig feil å gjøre. La oss faktisk gå tilbake til terminalen vinduet og gjøre det her, så vi kan se flere på en gang. Enter, 99 flasker øl. Lukk, men vi gikk aldri så litt for langt. Vi sang sangen for langt ned, slik at vi nå treffer negativt tall. Så det virker ikke helt. Greit, så vi kan lett fikse det ved å gå tilbake til slik det en gang var. Men hva er noen muligheter nå for forbedring? Vel, la meg åpne beer2.c og bla ned her og ta en se på denne versjonen. Hva er det første som hopper ut på deg som annerledes i denne versjonen her? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Ja, så ingen mer jeg, fordi det skjedde til meg vet du hva, jeg ber brukeren for n, og da er jeg sette i lik n, og da er jeg endre i, men jeg er aldri berøre n igjen. Så hva pokker var poenget med du tildele en annen 32 bits jeg ringte akkurat slik at jeg kan ha en annen variabel? Så i dette tilfellet, jeg liksom innsett at unødvendig designelement. Og jeg nå kommer til å si mens n er større enn 0, går videre og skrive den samme sangen, passerer en n til printf som andre argumentet, og n - 1 som det andre argumentet her nede. Og deretter på hver iterasjon av denne sløyfen, gå videre og bare minske n selv. Nå funksjonelt, dette programmet kommer til å være identiske. Hvis jeg skriver i 99, begynner n på 99. Jeg decrement, decrement, decrement, minking. Jeg kommer til å komme helt ned til "En flaske øl på veggen, en flaske øl. Ta en ned, passerer det rundt. 0 flasker øl på veggen. "The end, fordi jeg gjorde få tilstanden riktig. Det er større enn 0. Jeg gjorde ikke gjøre denne feilen. Så noe som er bedre, versjon en eller versjon to? Så hørte jeg en haug med knurr for to. Hvorfor to? Hva er det? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Oh, okay. Så det vil ikke gå under 0, men husk, i versjon en, opprinnelige riktige versjonen ikke gå under 0 heller. Så husk at dette er den riktige versjonen. Så la oss i det minste sammenligne de to riktige versjoner. Hva er et argument i favør av versjon to er, mmm, bedre? Ja? PUBLIKUM: Det tar mindre plass. DAVID J. MALAN: Ok, så den bruker mindre plass, ikke sant? Mens versjon en brukt 32 bits for n, og deretter en annen 32 biter for jeg. Versjon to bare bruker 32 bits for n, slik at synes å være et pluss. Andre tanker? Ønsker noen å argumentere for en? Ja? PUBLIKUM: Du må bruke ekstra linje med kode for n -. DAVID J. MALAN: Ok, sikkert. Så det er rettferdig. Så dette bare, minst for meg - Jeg mener, dette faktisk føles litt Messier, det faktum at Jeg kan ikke liksom kapsle alt av logikk mitt i én vakre linjer, for loop, som for loop kan. Her, jeg slags har å tråkle på dette n - ved slutten av sløyfen, fordi det er logisk nødvendig. Men den slags gnir meg på feil måte, bare fordi det synes atskilt fra logikk opp her, selv om, igjen, det er nødvendig. Andre tanker? Ja? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Yeah. Så hva om du i stedet, på slutten av sangen, ønsket å skrive ut igjen navnet på sangen? Like "Takk for å spille 99 flasker øl", eller noe dum sånn? Men poenget er, ville du tilgang til den opprinnelige verdien. Det faktum at du har mutert eller forandret n på hver iterasjon, og derfor har ødelagt sin opprinnelige verdi Det betyr at du bare ikke kan gjøre det på slutten. Nå, uten tvil, vi åpenbart ikke ønsker å gjøre at i dette programmet. Så hvem bryr seg? Men det er en veldig gyldig punkt. Og for å være ærlig, det er egentlig ingen rett svar her. De er begge like riktig. Jeg kunne bli overbevist uansett. Jeg vil si at, generelt, er det et godt prinsipp hvis du spurte brukeren for noen verdi, og du lagret i en variabel som n, bare liksom på prinsippet, er det sannsynligvis bra å holde det rundt. Og alle data du ønsker å mutere igjen og igjen, bare gi deg selv en kopi av denne variabelen, bare slik at du har tilgang til den opprinnelige. Du tilbringer 32 flere biter, men realiteten er dette datamaskinen har lyst, to gigabyte RAM i disse dager, og vi ordkløveri over 32 bits? Egentlig ikke en så stor avtale. Og selv om denne enheten her, med en halv gig eller en gigabyte RAM, 32 bits kontra 64 bits, ikke en så stor avtale. Gjerne i dag, kommer det til å være måte overveldet av størrelsen av selve programmet, som er tenkt å være flere hundre kilobyte, om ikke noen få megabyte, i disse dager. Så rimelige bekymringer, ingen rett svar. Men minst de er tanker som skal begynne å gå gjennom hodet ditt? Fordi i pset 0, selv om vi egentlig bare forventet korrekthet, eller i det minste fraskrive diverse bugs som du kan ha oppstått, når vi beveger oss fremover, er design kommer til å være en annen viktig aspekt, både for å skrive kode og også vår evaluering kode. Og så i det minste gi trodde ting som dette. Og bare fordi noe fungerer ikke betyr det er bra, betyr ikke at det er godt utformet. Og det er en av de tingene de pedagogiske stipendiater og oppgavesett vil hjelpe oss erte del over tid. Vel, hva om, la oss si, denne versjonen her? La meg gjøre noe litt sexy her et øyeblikk. Først la meg bli kvitt dette. Og nå la oss fikse dette grammatisk problemet. Så i denne versjonen, vil jeg fikse grammatikk, slik at snarere enn bare si parentes s, som "flaske" eller "flasker" - Jeg ønsker ikke å kutte det hjørnet - Jeg ønsker også å dynamisk skrive ut ordet "flasker" eller "flaske", og dermed bruker disse% s plassholdere i dag. Så jeg trenger til betinget sjekke hva som er verdien av jeg. Og hvis det er en, jeg ønsker å si "flaske", og hvis det er noe annet, vil jeg si "flasker". Så la oss prøve å gjøre dette. Så hvis jeg == 1, så la meg gå videre og erklærer - Jeg trenger en streng, så la meg gjøre streng s1, fordi det er den første strengen jeg bryr meg om akkurat nå. Jeg kommer til å si "flaske". Og så, la oss se, string s2 - og jeg vil forklare hvor jeg skal i et øyeblikk - "Flasker." Så husker at i denne sangen, må vi være i stand til å skrive ut ting, to forskjellige ord potensielt. Så hvis vi ser tilbake hit, merker at når vi kommer til dette eksempelet her, "to flasker med øl på veggen, to flasker med øl, ta en ned, passerer det rundt ", jeg vil denne fjerde linje til nå si "en flaske øl på veggen ". Så jeg trenger å bestemme seg, ønsker jeg å si" flasker "eller "Flaske"? Så jeg kommer til å vilkårlig si, all right, Jeg kommer til å nå erklære en variabel kalt s1, string en, som kommer til å få plugget inn her og også her, fordi disse ordene er alltid identiske, nettopp på grunn av natur sangen. Og jeg kommer til å ringe s2 hvilket ord jeg vil slutt vises her nede. Nå, bokstavelig talt, 99 ganger på 100, kommer det til å bli samme i begge disse tilfeller, fordi 3 er flertall, er 2 flertall, er 4 flertall. Men i dette hjørnet tilfellet, hvor vi kommer til 2 og 1, eller selv 1 og deretter 0, jeg trenger denne logikken. Så jeg må bruke litt tid på min kode å få det rett. Så hvis jeg gjør dette, hvis jeg == 1, deretter satt s1 lik "flaske" og S2 lik "flasker", fordi dette vil være for en flaske, og dette vil være for 0 flasker. Og dette her, hva dette representerer? Bare for å være klar. Dette er bare en kommentar. Så det faktum at du kan ha én linje kommentarer betyr at du kan kommentere koden som dette, men en annen vanlig paradigme, er også at hvis du har en super-kort setning som du ønsker å sette deg selv og det er bare mer lesbar å sette det helt på slutten av linjen med kode, kan du absolutt gjøre noe som dette. Så nå hva hvis jeg gjør dette? Annet hvis jeg ikke er lik en. Så bang lik - utropstegn er kjent som "bang". Så bang 1 =. Så hvis jeg ikke er lik 1, hva gjør jeg i stedet ønsker å gjøre? Vel, det første ordet jeg ønsker å være hva? Så streng en skal være "flasker" for flertall flasker, og dette vil være flertall "flasker" også, for nå. Og vi får se om dette faktisk får oss til å der vi ønsker å gå. Så nå hvis jeg ruller nedover her, merker at jeg plugge i ikke bare jeg, men S1. Jeg plugge inn i og s1. Og deretter ned her, er jeg minus 1, som er det samme som før, men s2. Med andre ord, jeg vil ha det engelske ordet for å endre basert på denne logikken. Nå er det allerede noen problemer i denne koden. Hva som er ødelagt allerede ute av porten her? Ja? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Nettopp. Så jeg har allerede brutt leksjonen av omfanget. Så jeg har erklært s1 og s2, men jeg har gjort det på innsiden av klammeparentes, noe som betyr ja, vil denne koden opparbeide til linje 42, men så snart jeg traff linjen 43, gjett hva ingen lenger eksisterer? Vel, gjett hva som er ikke lenger i omfang - verken s1 eller s2. Så vi må fikse dette. Så la meg slette de erklæringer. Og jeg vil forlate variabelnavn og slette denne her og slette denne her. Og i hvilke linjer bør jeg virkelig erklære disse tingene? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Ja, så sannsynligvis rett opp her, 33-ish. Så streng s1 og deretter streng s2. Og det viser seg, kan jeg gjøre dette. Hvis du erklære to variabler av samme type, du kan faktisk bare bruke et komma og gjøre det i C. Alle rett, så nå har jeg to variabler - S1 og S2. Jeg tildele dem verdier i disse forholdene her, eller her. Og så jeg bruker dem ned nedenfor. Hvor godt er dette nå kommer til å fungere? Vel, det er fortsatt litt buggy, men la oss i det minste se hvor langt vi har fått. Så la meg gå videre og gjøre beer3. Er dette beer3? Jepp, dette er beer3. Og nå la meg gå videre og kjøre beer3. 399 99. Vi kan nok hoppe fleste av dem. Og her nede, se på det. "En flaske øl på veggen, en flaske øl, ta en ned, passerer det rundt, 0 flasker øl på veggen. " Men jeg tegner oppmerksomheten til bare halvparten av løsningen. Slags skrudd opp her. Så det ser ut til at hjørnet tilfeller oppstår når jeg er lik hva to verdier? PUBLIKUM: 2, 1. DAVID J. MALAN: 2 og 1. Det er ikke en og ikke en. Det er egentlig bare disse to siste strofene av denne sangen. Så hva gjør jeg i stedet ønsker å gjøre? Så jeg synes å ha fanget tilfelle der hvis jeg er == 1, så det første ordet er "flaske", men det andre ordet er "flasker". Men her vil jeg endre dette til å være == 2. Og hvis dette er tilfelle, hva jeg ønsker første ordet for å være? PUBLIKUM: "flasker". DAVID J. MALAN: "flasker", så for to flasker. Og så dette ordet her bør være - PUBLIKUM: "Bottle". DAVID J. MALAN: "Bottle", entall. Greit, la oss zoome ut, gå tilbake over her, kjører make, re-run beer3, type 99 igjen. Ok, "Segmentation fault (core dumpet)." Hva har jeg gjort galt? PUBLIKUM: Du trenger ikke ha en verdi [hørbar]. DAVID J. MALAN: Ah, utmerket poeng. All right, så hva er galt her? Så segmentering feil, og vi faktisk kommer til å se dette ganske mange ganger i fremtiden, med vilje. Men for nå, hva dette egentlig betyr? En segmentering feil nesten alltid betyr at du har en eller annen måte forsøkt å få tilgang til minnet, RAM i datamaskinen, at du ikke eier, at du ikke har faktisk spurt operativsystem for. Så i dette tilfellet, legge merke til hva jeg har gjort, som er feil i min logikk. Jeg har tildelt s1 og s2 en verdi hvis jeg er lik en. Jeg har også gjort at hvis jeg er lik 2. Men jeg har ikke gjort det i det uendelige rekke andre muligheter - spesielt 3 eller 4 eller prikk, prikk, prikk, 99. Så en løsning på dette kan bare være la oss har en annen tilstand. Og la meg gå inn her og si s1 er lik - hva bør det være her? PUBLIKUM: [uhørlig]. DAVID J. MALAN: "flasker", fordi i den felles sak, det er bare det samme. Så lik sitat, unquote, "flasker." Så for flertall flasker, og deretter opp her, for flertall flasker. Ok, så nå la meg gå tilbake til mitt terminalvindu, rekompilere, kjører den. 99. Puh. Og la oss gjøre en rask sunn fornuft sjekk. Teknisk, ville vi ønsker å lese alle disse for å sikre at de er riktige, men la oss se på minst de kjente gjerningsmennene. 3 flasker, 2 flasker, 2 flasker, en flaske, en flaske, 0 flasker. Vi synes å ha minst fikset det for nå. Men fangsten her er at hva en Gud forferdelig rot dette er bare for å løse en dum ett tegn grammatisk detalj. Så det er litt av en grunn til at jeg kuttet dette hjørnet tidligere, fordi det er bare helt irriterende å skrive så mye kode. Men det viser seg at det er litt mer elegant måter uttrykke akkurat det samme. Og vi kan gjøre dette på følgende måte. La meg forlate dette på skjermen et øyeblikk og introdusere noe kjent som en trefoldig operatøren. Dette er en slags one-liner som er bare ment å gjøre våre lever litt mer sexy, som lovet. Og jeg kommer til å gjøre dette som følger. Gi meg en streng kalt s1, og la meg tilordne det som følger. (I == 1)? "Flaske", ellers "flasker". String s2 får (i == 2)? "Flaske", ellers "flasker". Så hva er da forskjellen her? Disse to linjer med kode, hevder jeg kan erstatte hele denne rotet. Så jeg kaller det et rot, bare fordi den slags gnir meg feil måte at det er så mange linjer med kode. Ikke galt. Det er ikke dårlig design. Liker, er dette helt riktig og helt greit. Men koding blir kjedelig hvis du har til å uttrykke deg selv slik faen spesifikt igjen og igjen og igjen med en enkel scenario som dette. Så C har noen snarveier, som dette. Så dette egentlig sier erklære en streng kalt S1 og tilordne det enten denne verdien eller denne verdien hvis jeg er == - Beklager, jeg burde si dette mer tydelig. Deklarerer en variabel s1, tilordne den denne verdien hvis dette er sant. Ellers, tilordne den denne verdien. Så med andre ord, dette er en slags en-linje måte si hvis annet, men gjør et oppdrag underveis. Så hvis jeg er en, og deretter gå videre og kaller dette "flaske". Og så dette annet, kaller det "flasker". Imens s2, den andre ord at vi trenger å definere, hvis jeg er lik 2, vil vi satt s2 til "flaske". Ellers, sett den til "flasker". Og hva Dette betyr nå er at jeg kan gå gjennom dette og slette alle disse linjene med kode. Og når jeg sier, noe latterlig, at dette er nå sexier, er det mer sexy i den slags stilistisk forstand. At funksjonelt, er denne koden faktisk kommer til gjøre akkurat det samme. Og selv om det kan se litt kryptisk i starten øyekast, fordi vi ikke har sett denne konstruksjonen før, ville jeg hevder at det er slutt kommer til å være så mye mer lesbar og så mye lettere for vi mennesker å sortere av forstå, fordi nå kan du bare lese kode alle på en linje. Det er fortsatt lik i ånden til en hvis, hvor dette er tilstand og så er dette hva som er inni den hvis og dette er hva som er inni annet. Men vi kan gjøre dette bare mye mer elegant. Og hvis jeg nå gå tilbake til terminalen min, etter å ha slettet alle av disse linjene og erstattet dem med bare de to, rekompilere, re-run flasker øl med 99, merker at min grammatikk er faktisk fortsatt er riktig. Så igjen, noe å starte. 2 flasker øl, en flaske øl. Ser rett. Ja. Så det har vi en mye mer konsis løsning. Så dette også, som du blir mer komfortabel med C, ikke nødvendigvis med første pset eller selv andre, men innse at disse konstruerer kan tillate oss å gjøre ting noensinne mer elegant. Nå la oss gjøre en annen ting her. La meg gå videre og åpne opp return1.c. Nå la oss starte å løse et annet problem på en måte som tillater oss å skrive mer sofistikert kode. Så her er en enkel liten program som har som formål i livet er å øke verdiene. Og faktisk, la oss ta et skritt tilbake. La meg gjøre dette manuelt. La meg gjøre inkludere og int main (void). Og la meg kalle denne increment.c. Og hva ønsker jeg å gjøre? Jeg kommer til å gå foran og si noe sånt som - vil vi kalle tallene det samme - int x. Så int x blir 2; printf x er% d, ny linje, x. Så jeg skriver raskt, men slags kjent ting nå. Så jeg kommer til å gjøre x + +. Så jeg kommer til å skrive det samme setningen igjen. Og så skal jeg komme tilbake 0 bare for å avslutte programmet. Greit, så dette er et program som inkrementer et nummer. Det er første kommer til å initialisere noe til 2, og da er det kommer til å øke den og skrive den på nytt. Så la oss kjøre intervall, utrolig enkelt program. Men anta nå at jeg ønsker å kube verdien, så gjør noe noe vilkårlig. Og jeg faktisk ønsker å gjøre x får kube av det. Så jeg kunne bruke det som kalles pow-funksjonen, men jeg har ikke virkelig vet hvor det er ennå. Så jeg kommer til å gjøre dette på den gammeldagse måten. x ganger dette tilsvarer x ganger x ganger x. Så jeg cubing verdien, multiplisere det av seg selv igjen og igjen og igjen, slik at vi får strømmen av 3 i dette tilfellet. Så nå tallene jeg skulle skrive ut bør være, som vi skal se her - gjør tilvekst, så det er faktisk ikke egentlig øke lenger, men vi vil forlate navnet alene - 2 og deretter 8. Nå har vi begynnelsen på en mulighet for videreutvikling her, der dette cubing ting av multiplisere et tall av seg selv av seg selv av seg selv føles som dette kan bare være nyttig å ha som en funksjon, mye som noen bestemte år siden - du vet, hva slags nyttig hvis en av oss setter seg og skriver printf slik at resten av verden kan bruke det, hvorfor ikke vi sitte ned og skrive en funksjon som heter kube som gjør dette cubing for oss slik at vi ikke trenger å manuelt implementere begrepet cubing verdier her? Så et enkelt eksempel, men la oss gå videre og bruke dette er som en mulighet til å skrive vår egen funksjon. Så så langt har vi bare brukt viktigste, og vi har brukt andre folks funksjoner, men vi har ikke skrevet vår egen. Så her går vi. Jeg kommer til å gå videre og skrive en funksjon som heter kube. Og jeg kommer til å ha det ta en inngang. Så sitt innspill kommer til å være et heltall. Og hva er det tenkt å gjøre? Det kommer til å erklære int output = inngang ganger inngang ganger inngang. Og så det kommer til å gå tilbake som utgang. Og da må jeg være konkret nå. Denne funksjonen kommer til å returnere en int. Så her er da hvordan du vil skrive dine egne funksjoner. Du først bestemme hva som er navnet på funksjon skal være. Og generelt, er noe forklarende bra, så jeg vil kaller det kuben. Da må du spesifisere hva det kommer til å gå tilbake, er det sin produksjon kommer til å bli. Og vi ikke har så mange alternativer ennå. Int, røye, flyte, bool, streng. For nå, jeg kommer til å feste med en int, fordi jeg ønsker det å returnere et heltall. Da må du spesifisere hva dens innganger, om noen, er. Og hvis kube tar et argument, tar noe mellom parentes, må du gi det argumentet et navn slik at du kan kalle det noe som du implementere eller skrive denne funksjonen, og du må gi det en type, som i dette saken kommer til å bli int. Så kort sagt, er kuben en funksjon som tar et heltall som input og returnerer et heltall som utgang. Så hva gjør det med at innspill? Vel, i linje 14, erklærer jeg en variabel kalt utgang, og jeg tilordne den verdien, inngang ganger inngang ganger inngang. Og så jeg kommer tilbake utgang. Så hvordan bruker jeg dette da? Hva kan jeg endre disse markerte tegn på linje 7 som skal, tror du? PUBLIKUM: [uhørlig]. DAVID J. MALAN: Ja, så kube av x. Så x er en variabel, som betyr at det har noen verdi. Heldigvis er det av type heltall. Og fordi x er en int, betyr at jeg kan sende den inn kube. Og selv om jeg overstyrer verdien av x med verdien av cube x, har som vært tilfellet så langt, hver gang du har likhetstegn og en linje med kode, ting på høyre blir utført og deretter blir tilordnet verdi på venstre. Så rekkefølgen av operasjoner er som vi håper. Så fungerer dette? Vel, la meg gå ned her. La meg åpne opp min terminal-vinduet. La meg gjør tilvekst, Enter. "Implisitt erklæring av funksjon 'kube er ugyldig i C99. "Som en side, refererer C99 til språket C som det var definert i 1999, som var en oppdatering over versjonen fra 1989, som er en oppdatering over originalen. Så det er alt som betyr. Så hva betyr det at "implisitt erklæring funksjonen 'kube er ugyldig? "Det er rett her. Det er akkurat der i linje 12. PUBLIKUM: [uhørlig]. DAVID J. MALAN: Hva er det? PUBLIKUM: Det er ikke før. DAVID J. MALAN: Det er ikke før. Så dette er tingen. C er litt dumt, eller C-kompilatorer er litt dumt. De egentlig bare gjøre det du ber dem om å gjøre. Og de, i særdeleshet, bare lese koden topp til bunn, venstre mot høyre. Så hvis kompilatoren, Clang, leser koden, linje 1, det finner ut hvordan du gjør dette. Oh, her kommer main. Ok, la meg gå videre og erklære en variabel x. La meg skrive ut noe. Linje 7, hva pokker er kube? Det er ikke erklært i stdio.h. Det kommer ikke med C. Jeg har ingen anelse om hva jeg skal gjøre. Og så Clang bails bare og avsluttes med at feilmelding. Så vi kan fikse dette i et par måter. Vi kan lære Clang hva kube er bare ved å flytte hvor Erklæringen er. Så jeg klippet ut og limt det oppå viktigste. Nå innser at bare fordi viktigste er ikke lenger først, er det fortsatt henrettet som standard. Viktigste er viktigste. Det er standard funksjon navn. Det spiller ingen rolle hvor den er i en fil. Men minst nå Clang har sett cube før jeg bruker det. Så la oss se om Clang er lykkeligere nå. Gjør tilvekst, gjorde det kompilere denne gangen. La meg kjøre tilvekst. Og ja, det synes å bli arbeider. Nå kan du komme opp med scenarier slutt der det er ikke mulig å sette hver funksjon over alle andre funksjoner. Du vil bli sittende fast i denne uendelig loop i virkeligheten, hvor denne fyren ønsker å være her, men dette fyren må være der. Så det fungerer ikke alltid. Så heldigvis har C en mer elegant løsning. Jeg kommer til å sette dette tilbake der det var, bare fordi jeg foretrekker, som et spørsmål om prinsipp, det viktigste alltid være på toppen, fordi det er bare hyggelig å se hva dette programmet gjør som standard. Og hva jeg skal gjøre her oppe er erklære det som kalles en prototype. Jeg kommer til å re-erklære min kube funksjon ved bokstavelig talt kopiere og lime inn. Egentlig er det ikke bokstavelig. Så bokstavelig kopiere og lime line 15 opp over linje 6. Det spiller ingen rolle hvilken linje dette ender opp på. Det skjer for å være på linje 4. Men det trenger å være før viktigste. Men legg merke forskjellen. Linje 4 ender med et semikolon, som betyr hei, Clang, ta mitt ord for det at det eksisterer en funksjon kalt kube som tar en int og returnerer en int. Men jeg skal ikke fortelle deg hva det er ennå. Bare vet at jeg lover å fortelle dere etter hvert. Og ja, nå er det greit at dette er ned nedenfor. Så dette er generelt bedre, fordi da øverst filen, kan du bare skrangle av, rapid-fire, én linje hver, hva navnene på funksjonene er, hva deres innganger er, hva deres utganger er. Og for å være mer tydelig, betyr inngang generelt argument eller parameter, synonymt. Utgang betyr returverdi, hva betyr det hånd tilbake til meg. Så i dette tilfelle her, har cube blitt erklært øverst, men definert, ellers kjent som implementert, nederst. Så nå la oss gå tilbake hit og kjøre dette. Så nå la meg gå videre og kjøre gjøre, re-run tilvekst. Og det synes nå å jobbe helt fint. Så nå kan vi gå videre og faktor ut noe som øl eksempel i denne fjerde versjonen. Så la meg bla nedover her. Og legg merke til at jeg slags tok denne leksjonen til hjertet akkurat nå. Det faktum at jeg sang den samme strofe igjen og igjen og igjen, det samme refrenget linje i sangen, følte som hvorfor ikke jeg faktor som ut i en funksjon? Og faktisk, bør dette være en av motivasjonene. Foruten det faktum at noen andre i verden vil kanskje å bruke en kube funksjon - det er en god grunn til å faktor noe ut og skriv din egne funksjon - hvis det er en del av koden i programmet som bare gjør konseptuelle forstand, som du slags ønsker å gi den en navn - som i dette tilfellet, chorus - så kan du på samme måte skrive det som en egen funksjon. Du trenger ikke å skrive alt i hoved hvis det bare føles renere å skille det ut og gi den et navn. Så i dette tilfellet her, merker at jeg har en kommentar på toppen denne funksjonen som bare synger om spesifiserte antall flasker. Legg merke til her at jeg ikke trenger å kalle disse ting inngang og utgang. Faktisk, denne gangen jeg bare kalt mitt innspill b for flaske. Og legg merke til her, tyder ugyldig hva? Det kor - PUBLIKUM: Har ikke tilbake det. DAVID J. MALAN: returnerer ikke en verdi. Og faktisk, trenger funksjoner ikke å returnere verdier. De kan bare gjøre noe. De kan ha det som kalles bivirkninger, som i dette saken er bare en hel haug med utskrift på skjermen. Så merker at denne koden her, jeg bokstavelig talt bare stjal fra forrige eksempel. Den eneste forskjellen er i stedet for å bruke i som min variabel, er jeg nå bruker b som variabel min. Så jeg har b her nede, jeg har b her nede, har jeg b minus 1 her nede. Men koden er nøyaktig den samme. Men bare for å vise deg nå hvordan vi kan bruke dette, la meg gå fremover og faktisk endre dette for å være en for-løkke. for (int i = n; i> n; i -). Så jeg har stjålet det fra vår forrige eksempel. Tidligere er det i linje 37 som jeg ville ha startet synge denne irriterende sang. Men i stedet, jeg bare kommer til å nå kaller koret av jeg. Ferdig. Så nå i alle gjentakelse av denne sløyfen, kaller jeg dette andre funksjon, chorus, at jeg skjedd å skrive. Det ble ikke skrevet av noen andre år siden. Men kor, i mellomtiden bruker printf å skrive ut ut disse fire linjer. Men det faktum at jeg ringer kor igjen og igjen i en løkke betyr at jeg kommer til å få, helt på slutten, den nøyaktig samme sang som jeg har så langt. Så kort sagt, nå hvis jeg ser tilbake på min kode, selv om funksjonelt dette er tilsvarende, legge merke til at det er begynner å bli enda mer lesbart. Jeg vet ikke nøyaktig hvor GetInt er implementert. Ærlig, jeg vet ikke hvordan kor er implementert. Men det spiller ingen rolle for meg. Jeg bryr meg ikke, fordi nå kan jeg liksom, som menneske, les dette fra topp til bunn. Og fordi funksjonene er navngitt i henhold til hva de gjøre, er min kode stadig lesbar. Og som våre programmer får mye mer kompleks - ved semesterets slutt, vil du være å skrive hundrevis av linjer av koden i språk som PHP og JavaScript og lignende - vil du finne at det er så mye lettere enn å holde styr på hva du har gjort. Og når du begynner å samarbeide med venner eller partnere eller kolleger, vil du være i stand til å skrive mye mer massive programmer ved å begynne å trene disse grunnleggende byggeklossene. Så med det sagt, hvorfor ikke vi kalle det en dag? Og vi vil se deg på onsdag. [Applaus]