[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]