[Powered by Google Translate] David J. Malan: Ok, er CS50, og det er
start af uge to.
Tak.
Lad os begynde her med et telefonopkald.
Jeg er ved at ringe 617-BUG-CS50.
CS50: Dette er CS50.
For Shuttle Boy Tryk på 1.
Til at starte forfra, skal du trykke 9.
DAVID J. Malan: Så sagde han til Shuttle Boy Tryk på 1.
Så vi kommer til at trykke på 1.
CS50: Hvad er din oprindelse?
For quad Tryk på 1.
Mather, tryk 2.
Boylston, trykke på 3.
Lamont, tryk 4.
Mem Hall Tryk på 5.
Til at starte forfra, tryk 0.
DAVID J. Malan: Vi vil trykke 1 for quad.
CS50: Næste rumfærgen blade dette øjeblik ved 1:10 PM, og
derefter at 1:20 PM. 01:30, 13:40
Det er CS50.
>> DAVID J. Malan: Så dette er CS50 stemme.
Og det er et eksempel på den slags afsluttende projekter,
Du kan f.eks bide mod
I slutningen af ​​semesteret.
For eksempel findes der shuttleboy.cs50.net -
faktisk et projekt, som jeg først skrev efter at have taget CS51
tilbage, da jeg var en undergraduate.
Og inspirationen her var dengang, alle de havde var
de trykte shuttle bus tidsplaner, og der var ingen
begrebet kigge tingene op online.
Og så jeg slags due i en weekend, hældes gennem
trykt tidsplan, og porterede den til et edb-program.
Dengang skete det computerprogram, der skal skrives
i C. Og du faktisk kørte det ved at skrive Shuttle Boy på en
blinkende bede ligesom vi har gjort hidtil.
Men i årenes løb, er det udviklet sig til en øjeblikkelig
messaging bot.
Det er udviklet for nylig på denne hjemmeside, i en
SMS-baseret værktøj, samt i denne stemme-baseret værktøj.
Og det er at antyde den slags ting, som du kan
gøre for dig selv ved semesters afslutning.
>> For eksempel, der SMS version af Shuttle Boy sker
til at fungere som følger.
Hvis det på din mobiltelefon, kan du sende en SMS til 41.411 og
derefter sende den særlige symbol sboy, for Shuttle Boy,
efterfulgt af A og B, hvor A er en oprindelse og B er en
destination -
for eksempel Boylston Space Quad -
hvad du skal komme tilbage inden for få sekunder er en tekst
besked fra Shuttle Boy fortæller dig præcis, hvornår den
næste par pendulkørsler er, fra dette punkt A går til at
punkt B.
Og det er en mere generel eksempel på, hvad der er kendt som
hjælp af en API.
>> Så for eksempel, er dette her bare shuttleboy.cs50.net, den
egentlig webbaseret inkarnation af dette.
Men de data, der understreger dette og andre programmer, der CS50
har udviklet er alle udsat for alle her i form
af API'er. application programming interfaces
Og det er bare en fancy måde at sige, at folk kan lide vi på
Internettet og andre har brugt en del tid på at oprette
software, som du kan bruge for at få fat i data fra os og
derefter bygge dine egne programmer på toppen
af det pågældende datasæt.
Så for eksempel, denne Shuttle Boy API side her, som
sker for at være i CS50 manual det væsentlige dokumenter
hvordan du kan gå om at spørge CS50 servere til data.
For eksempel, hvis du er fortrolig med CSV-filer, komma
separeret værdier, er disse lige slags hurtig og beskidt
Excel-lignende filer.
Så du kan bede Shuttle Boy til alle data om alle de
huse og deres GPS-koordinater, og du får
tilbage i det væsentlige et regneark som det at
du kan så læse i et program på din egen og derefter
generere resultater, ligesom Shuttle Boy selv
sker at gøre.
For de mere velkendte, mere moderne datarepræsentationer
omfatte JSON, JavaScript Object Notation.
Noget vil komme tilbage til dig mod
I slutningen af ​​semesteret.
>> Men igen, dette er blot et af flere af CS50 egen API'er.
Og det spændende er nu, i disse dage, Facebook og
Twitter og Google og stort set hver populære websted ud
der har en form for API, hvilket betyder, at hvis du læser
dokumentation på deres hjemmeside, du tilmelder dig en
konto, kan du så begynde at skrive software på toppen af
de redskaber eller data, som selskab der giver.
Og så en af ​​vores egne undervisning stipendiater et par år tilbage
skrev en Mac-version af dette.
Så på på linket Mac her øverst til venstre, kan du faktisk
downloade en Mac OS widget, der kører på din egen Mac til at gøre det
samme slags ting.
Så det handler om at bygge oven på datasæt som disse.
Men mere om det i slutningen af ​​semestret.
>> Så lad os dykke i virkelig hurtig til en fejl, bare for at slags får
tingene varmes op i dag, og tænker tilbage på nogle af de
ting, vi så på i sidste uge.
Især lad mig gå videre og trække op, sige,
dette eksempel.
Buggy1.c, det er tilgængeligt på kursets hjemmeside, hvis du vil
gerne hente det og stikke omkring dig selv.
Men lad os zoome ind her på dette forholdsvis korte program, og bare
en super-hurtig resumé af nogle af de grundlæggende byggesten,
vi virkelig vil bare begynde at tage for givet.
>> Så den blå ting, i linjerne 1 til 9 er bare
softball spørgsmål.
Så dette er blot kommentarer.
De har ingen funktionel betydning.
Men de er kommentarer i den forstand, at de er bemærker, at
I, det menneskelige, til mig selv, så i foredrag og efter
foredrag, kan jeg faktisk huske, hvad dette program
gør uden at skulle læse igennem den linje for linje og
genskabe historien i mit sind.
Desuden, hvis jeg aflevere dette program til en anden lignende
dig, er det meget klarere for dig, på grund af kommentarer som denne,
hvad programmet er faktisk laver, eller i det mindste hvad
Programmet er meningen at gøre.
Hvorvidt det er korrekt, er en helt anden sag.
Nu, i C, med flere linjer kommentarer, minde om, at på linje
en her er det magiske symbol, / *.
Det betyder her kommer starten på en kommentar.
Og intet andet spørgsmål, indtil du når til slutningen terminator,
som er * /, det modsatte.
Så det faktum, at jeg har 80-nogle underlige stjerner her fra
venstre til højre er egentlig bare en æstetisk detalje.
Det ikke har nogen funktionel betydning.
>> Nu hvor omkring linje 11?
Hvad betyder dette gøre i lægmandssprog?
Hvad er det?
PUBLIKUM: Omfatter standard.
DAVID J. Malan: OK, godt.
Således er den stdio.h bibliotek.
Så hvad betyder det?
Nå, indeni, fil, stdio.h, er en hel bunke af
funktionserklæringer -
det vil sige, kode, som en anden skrev.
Og et perfekt eksempel på en funktion, der er angivet i
stdio.h er -
som favorit ved nu?
Så printf, en af ​​de mest almindelige brug, bestemt
tidligt, fra at biblioteket er der.
Hvis jeg udelukker, at linje kode, der Dunk vil råbe
på mig noget om at bruge en sort symbol.
Sort Noget er nok nøgleordet, fordi
Vi har ikke informeret compiler hvad printf ser
gerne medmindre vi medtage denne linje.
Og mere ned på jorden, virkelig, hvad denne linje siger, er
åbne denne fil, stdio.h, hvor det er på serverens
harddisk eller apparatets harddisk, og copy-paste det
lige der i min fil, uden at jeg
at skulle gøre det manuelt.
>> Nu, når vi kommer herned til main, vi inden længe vil begynde
drilleri fra hinanden hvad int og hvilke hulrum er.
Men for nu, lad os se på de tre linjer
inden for 15 til 17.
Det her jeg krav på som buggy.
Linje 7 i mine kommentarer, siger "Bør udskrive 10
asterisker men ikke. "Hvorfor dette ikke udskrives, i virkeligheden,
10 sådanne stjerner?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Præcis.
Så bemærke, at vi er begyndt at tælle fra 0.
Og det er faktisk en konvention i programmering og
datalogi mere generelt begynder at tælle
fra 0 i stedet for 1.
Og det er virkelig bare skyldes, at der for
Fx når vi havde otte mennesker op på scenen, når
der var ingen, hæve deres hånd, var de
alle effektivt nuller.
Og så er det bare sådan en computer konvention, så,
derfor, at begynde at tælle fra 0.
Hvis det er det laveste antal, du kan repræsentere i binær.
>> Så her har vi begyndt at initialisere i til 0.
Vi har sat i lig med 0.
Men da jeg lavede denne fejl her, siger jeg er mindre end eller
lig med 10.
Men hvis du tror, ​​igennem, hvis jeg starter på 0 og derefter går jeg
op til 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, jeg faktisk går til
udskrive 11 stjerner til skærmen, fordi jeg har gået op
til og lig med 10.
Så den nemme løsning her derefter er hvad?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Bare ændre den til mindre end.
Hvis du virkelig vil, kan du gøre det her.
Men generelt er det ildeset.
Og så begynder at tælle fra 0 er bare noget du bør
typisk vænne sig til.
Nu, hvad hele denne konstruktion i sig selv?
Denne linje 15 demarks en for-løkke.
Så for er ikke en funktion.
Det er bare en erklæring.
Det er en looping konstruktion, ligesom vi så det i Scratch.
Og det har tre dele.
Bemærk, at der er den første del til
til venstre semikolon.
Der er den midterste del mellem de to semikoloner.
Og så er der den højre del til højre
i den anden semikolon.
Nu er den første af disse gør hvad?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Tilbage er der?
Ja?
PUBLIKUM: Initialisering.
>> DAVID J. Malan: Initialisering.
Så hvad betyder dette?
Vi har erklæret en variabel kaldet i.
Det er af typen int, fordi jeg har angivet int i.
Og jeg initialisering i til værdien 0.
Så hvad er det egentlig sige?
Det er effektivt at sige til computeren hey, giv mig nok
hukommelse, nok RAM, til at passe et nummer, og derefter sætte
nummer 0 i denne bid af RAM.
Og som en sidebemærkning, er hvor stor en int typisk, i det mindste indenfor
af apparatet?
PUBLIKUM: 32 bit.
David J. Malan: 32 bit.
Så det betyder at give mig 32 bits, ellers kendt som 4 byte,
og sætte værdien 0 i det, som er temmelig let, fordi
Det betyder blot indstille alle bits til 0.
>> Så nu, den anden del her er betingelsen.
Og tilstanden, som navnet antyder, er hvad der kontrolleres
igen og igen og igen, om det er sandt eller falsk.
Så dette er bare at sige gøre følgende linjer kode -
nemlig linje 16, fordi det er den eneste indrykket en
nedenunder -
så længe i er mindre end 10.
Og efter hver iteration gennem denne løkke, skal du gøre
optælling, som i dette tilfælde er i + +.
Nu, behøver det ikke at være i + +.
Det kunne være i -.
Men hvis jeg gjorde det, hvad den adfærd går
være af dette program?
PUBLIKUM: Det kommer til at være en uendelig løkke.
DAVID J. Malan: Det kommer til at være en slags uendelig løkke,
medmindre vi får heldige efter negativ 2 mia eller deromkring.
Måske tingene skal ombrydes, blot i kraft af den begrænsede
Antallet af bit, som vi har tildelt til en int.
Men det er helt sikkert kommer til at gentage langt mere end 10 og
sikkert mere end 11 gange her.
>> Og nu, lige som en sidebemærkning, indse, at jeg + + og i -
er virkelig bare syntaktisk sukker.
Det er bare stenografi notation for, hvad der er lidt mere
udtrykkeligt er skrevet som følger:
i = i + 1.
Som er identisk med i + +.
Det bare slags ser pænere at sige jeg + +.
Det er mere kortfattet, mere læsbar.
Og så de fleste mennesker gøre det i stedet.
Men dette er identiske funktionelt til
hvad vi lige har set.
Så kort sagt, er den nemme løsning her bare for at sige gentage i
fra 0 hele vejen op til mindre end 10.
Og så vil vi faktisk få 10 stjerner.
>> Så lad os prøve dette.
Jeg vil åbne terminalen i bunden.
Lad mig gå ind i den mappe, at dette er i.
Og jeg har tænkt mig at kompilere den manuelt med Dunk for nu.
Og jeg har tænkt mig at kompilere dette som buggy1.c, Enter.
Og nu buggy1, hvorfor er der ingen sådan fil eller mappe
kaldet buggy1?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Yeah.
Så det er faktisk kaldt a.out.
Så huske, hvis du bare køre Dunk, hvor Dunk er det
compiler, og du ikke angiver det navn, du vil
give dit program, går det til standard at a.out.
Så ja, hvis jeg gør ls -
oops.
Og jeg didn't - den sort-hvide emne nogle af
du står er blevet rettet.
Men lad mig gøre det.
Der har vi a.out på venstre side der.
Så vi er nødt til at køre a.out stedet for buggy1.
>> Så lad mig gå videre og gøre det.
. / A.out, Enter.
Og jeg tilsyneladende ikke gøre hvad?
PUBLIKUM: Gem.
DAVID J. Malan: Gem mit fil.
Så det er let løses ved at trykke Control S, eller gå til
Filer, Gem, ligesom i de fleste programmer.
Lad mig gå ned her, rydde skærmen, kør den igen.
Og der er stadig en fejl.
Så hvad der foregår -
PUBLIKUM: Du har ikke kompilere.
DAVID J. Malan: Ah, godt.
Jeg har ikke kompilere det.
Ligesom en idiot, jeg ser på koden for at se, hvad der er galt.
Så klang buggy1.c, nu a.out.
Og Pyha, gemt.
>> Så det ser lidt grimt, fordi der ikke er nogen ny linje
hvor som helst i programmet.
Men igen, det er bare en æstetisk detalje.
Og i hvert fald hvis vi tæller dem ud, bør vi
nu se 10 sådanne stjerner.
Nå, hvad med dette andet warm-up eksempel?
Så i buggy2, hævder jeg, at denne version også vil udskrive
10 stjerner, én pr linje.
Så denne gang har jeg en ny linje, bare for at gøre
tingene lidt pænere.
Men i stedet, hvad jeg får, er dette.
Så lad mig gøre klang buggy2.c, Enter.
Nu er det igen hedder a.out.
Enter.
Jeg ser kun én ny linje, er kun det allersidste nye linje,
flytter min prompt til den næste linje.
Og alligevel tydeligt har jeg udskrivning *, så en ny linje,
*, Så en ny linje.
Men hvad er fejlen her?
Ja?
PUBLIKUM: [uhørlig].
>> DAVID J. Malan: Præcis.
Så i modsætning til nogle sprog, som Python, hvor indrykning
faktisk har funktionel betydning, i et
sprog som C -
som vi vil se, PHP, JavaScript -
indrykningen er virkelig bare for mennesker 'fordel.
Så det faktum, at jeg har indrykket linie 16 og 17 ser flot ud,
men det har ingen funktionel betydning her.
Hvis jeg vil begge linier at udføre som en del af for
loop, så jeg skal vedlægge dem i krøllede parenteser ved at gøre dette.
Du kan kun klippe det hjørne og udelade de krøllede parenteser, hvis
hvad er tilfældet?
PUBLIKUM: Blot én linje.
DAVID J. Malan: Bare én linje.
Så det er bare en slags pæn slags syntaks detaljer, så
at du ikke spilder tid på at skrive tre linjer, hvoraf to er
krøllede parenteser, bare for at skrive en eneste linje kode.
Men hvis du har to eller flere linjer, vi
faktisk nødt til at gøre dette.
>> Så nu lad mig gemme dette.
Lad mig gå videre og igen køre Dunk.
Så lad mig køre a.out, og nu får jeg dem én pr linje.
Nu a.out igen er sådan en dum navn til et program.
Hvordan kan jeg fortælle Dunk til rent faktisk at give mig et filnavn
der er mere brugervenlig, ligesom buggy2 selv?
Lidt mere klart?
PUBLIKUM: [uhørlig].
DAVID J. Malan: OK, så jeg kan faktisk tage det meget
brugervenlig genvej og bare skrive lave buggy2.
Jeg kan ikke specificere. C. i denne sag, og tryk på Enter.
Og hvad gør gør, er det kompilerer buggy2.c for mig af
beder Dunk at gøre det.
Specifikt er det kalder Dunk, det kører Dunk hjælp måde mere
kommandolinjeargumenter eller kontakter end jeg egentlig har brug for.
Med tiden vil vi vende tilbage til, hvad alle disse forskellige
kryptiske sammensatte udtryk betyder.
Men for nu, er der bare gemme mig for besværet med
skulle huske og skulle skrive ud alle dem
forskellige bindestreg udtryk.
Og opadrettede af det i sidste ende er
at nu har jeg buggy2.
Hvis jeg ønsker at gøre det manuelt, selv om, jeg
kan i stedet gøre det -
klang-o buggy2 og derefter buggy2.c.
Og det vil ligeledes give mig en fil kaldet buggy2.
>> Så kort sagt, er Dunk compileren.
Lav er blot et brugervenligt værktøj, som vi vil bruge mere
og mere, fordi det bare begynder at
forenkle tingene for os.
Og vi returnere 0 endelig.
For nu, for bare, men vi vil begynde at drille den del
dag og på onsdag.
Eventuelle spørgsmål om noget af dette?
Ja?
PUBLIKUM: [uhørligt]
ls i anførselstegn der?
DAVID J. Malan: OK.
Når jeg maskinskrevne ls i anførselstegn, det var mig laver nogle magi
bag kulisserne for at rette en fejl.
Jeg glemte, ligesom vi har fortalt mange af jer på
diskussionsfora, at gøre -
vi vil gøre det nu - sudo yum-y update appliance50.
Whoops, at det er stavet rigtigt.
Så apparatet er som et operativsystem.
Det kører dette operativsystem kaldet Fedora.
Og nu på grund af min langsom internetforbindelse, har jeg
virkelig spules det.
Så kører sudo yum update, som vi fortæller jer at gøre i
problem sæt, i det væsentlige kan lide at køre automatiske opdateringer
i Mac OS eller Windows.
Og årsagen til at køre dette ved selve starten af
problem sæt er fordi da vi skabte apparatet, jeg
rodet op, og jeg ved et uheld lavet alle dine programmer ser
sort på en sort skærm, hvilket er grunden til du ikke kan se dem
som standard.
Men den nyeste version af apparatet løser dette.
Og jeg ordner i løbet af pause, når jeg har internet
tilslutningsmuligheder.
>> Så de citater bare skjuler min fejl, meget diskret,
tilsyneladende.
Andre spørgsmål?
Ja?
PUBLIKUM: Hvor gør komme fra?
[Uhørlig]
DAVID J. Malan: Godt spørgsmål.
Hvor gør komme fra?
Det er et Linux-program, der har eksisteret i mange år, lang
før CS50.
Og det kommer med et operativsystem som Fedora.
Den kommer ikke fra CS50 biblioteket.
Faktisk er de eneste ting, der kommer fra CS50 biblioteket
hidtil, at vi har set, er GetString, GetInt, som alle
dem Få funktioner, og ordet streng, og til en vis
grad ordet bool.
Men vi vil drille at bortset når vi dykke ned i CS50
selve apparatet.
>> Så ja, endnu et spørgsmål her.
PUBLIKUM: Når du sagde gøre, og derefter buggy, hvordan fungerer det
computer vide [uhørligt]?
DAVID J. Malan: Godt spørgsmål.
Så når du bare køre make buggy1 eller gøre buggy2, hvordan
gør det?
Så som standard, hvis du skriver lave buggy1, lave ser for en
fil kaldet buggy1.c.
Og så udfører de passende klang kommandoer,
derved tilsidesætte standard output fil kaldet a.out.
Faktisk, hvis vi ser på det, der gør, hvad -
lad os afslutte dette.
Hvis vi ser på, hvad gør faktisk gør, gør buggy2,
det er allerede ajour.
Så lad mig fjerne rm kommandoen,
program jeg skrev før.
Typing Y-E-S for at bekræfte, at jeg ønsker at fjerne det.
Hvis jeg nu gør, bemærke, at i denne meget lange linje,
der er denne sidste ting her,-o buggy2.
Alle gøre gør passerer dette argument, så at sige, at
Klang, så jeg ikke behøver at skrive det selv.
>> Okay, så en hurtig par administrative
annonceringer.
Så for sektioner, der officielt begyndte i det kommende
Søndag, vil du altid vil bringe, hvis
du har en, en bærbar computer.
Hvis du ikke har en bærbar computer, skal du nå ud til mig af
slippe mig en e-mail.
Og vi vil finde ud af en arbejdsproces.
Hvad generelt finder du i afsnit er, at de er en del
konceptuelle, del hands-on.
Vi vil specifikt bruge afsnit med spørgsmål, en del af
ugens problem sæt, til at gå gennem nogle af de
konceptuelle materiale fra forelæsning.
Og det er alt i det aktuelle problem sæt.
Og vi vil også dykke ned i nogle hands-on aktiviteter, undertiden
som vil være forpligtet til at blive forelagt, til tider af
som ikke vil.
For eksempel, den første uge er de ment kun som en
opvarmning motion.
Og du vil opdage, at disse problemer er virkelig bare det.
De er beregnet til at være temmelig lille, men ikke nødvendigvis
trivielle programmer til at skrive, som ikke nødvendigvis er
spændende i sig selv, men er gode muligheder for at
øve med syntaks, med nye funktioner, i komfort af en
sektion, hvor du har et par af dine klassekammerater til stede som
såvel som din TF.
>> Og hvad vi vil gøre med tiden er at bruge et værktøj kaldet CS50 Spaces,
hvorved i stedet for bare at bruge CS50 Appliance, vil du
i stedet gå til en webside i en browser, hvor du vil være i stand
at skrive kode i et browservindue under sektion.
Og så hvis du vælger, kan din undervisning fyr derefter vise
uanset hvad det er du skriver på din skærm i din browser
Vinduet op foran klassen, hvad enten anonymt eller
offentligt, så han eller hun så kan gå igennem med
dine klassekammerater hvad du gjorde godt, hvad du ikke gjorde godt.
Og igen, være sikker på alt dette kan være pænt anonymiseret.
Men det vil være en god mulighed for meget mere
interaktivitet end noget lignende foredrag tillader.
>> I mellemtiden vil vi have disse ting kaldet super
sektioner, som er frivillig, men er åbne for alle i
klassen, så du kan gøre dette mere kollektivt for
problem angive én.
Her er tidsplanen.
Dette er også lagt ud på hjemmesiden på cs50.net.
Bemærk, at der vil være en hacker-specifik
i morgen eftermiddag.
Og vi vil filme en dag og i morgen og sende dem
online inden for 24 timer.
Så hvis du ikke kan gøre nogen af ​​disse tider, ikke at bekymre dig.
Og igen, tidsplanen er online nu på cs50.net.
>> Med hensyn til sektionering selv, bør du have fået en
e-mail instruere dig at gå til kursets hjemmeside for at finde
ud af din afdeling.
Hvis livet har ændret sig, og du skal ændre din afdeling,
ikke et problem.
Gå tilbage til den samme webadresse, cs50.net/section, ental,
og du vil udfylde lignende form, så du kan
derefter give os dine præferencer.
Og vi vil følge op ved ugens udgang, hvad vi kan
plads.
Sidste uge, minde om, at vi foreslået at bruge CS50 diskutere,
kursets diskussion værktøj, i foredrag.
Så havde vi 40 spørgsmål, der blev stillet, og
besvares under forelæsning.
Så det syntes at fungere godt, så vi vil fortsætte
forsøger at gøre dette.
Hvis det under foredrag, behøver du ikke bare føler sig trygge forhøjelse
hånden, ikke et problem.
Gå til cs50.net/discuss, postere der, og en af ​​vores undervisning
stipendiaterne vil enten besvare det elektronisk eller øge deres
hånd på dine vegne anonymt at spørge, afhængigt
af arten af ​​spørgsmålet.
Og i form af tilbagekobling, vil generelt psets være
returneres inden for en uge.
Fordi det tager lidt tid for sektioner for at opnå
ligevægt vil den første Pset, 0 og 1, være lidt
forsinket, da tingene falde til ro.
Men stay tuned for, at der i de kommende uger.
>> Okay, så lad mig sige på min alvorlig
stemme for bare et øjeblik.
Så det er faktisk en interessant klima til at være
har denne diskussion, hvad med alle de andre ting
foregår på campus i forbindelse hermed.
Men CS50 har helt sikkert haft sin historie af dette særlige
emnet, for så vidt som hvert år, dette naturligvis for mange
år, Ad-Boards omtrent 3% af klassen.
Denne seneste år, 2011, CS50 Ad-profilering 35 studerende.
Det er ikke, tror jeg, på grund af manglende klarhed.
Indse, at i løbet pensum, der er en side af
redegørelse, hvor linjerne er.
Samme erklæring gentages på hver enkelt af de
Problemet sætter på side et.
>> Så jeg nævner denne dag virkelig bare for at gøre
folk opmærksomme på dette.
Og vi har prøvet forskellige ting.
Og hvad jeg troede, vi ville gøre i dag er bare tage et øjeblik til
faktisk se på nogle af tidligere sager, der er kommet op.
Snarere end at holde disse som små beskidte hemmeligheder, faktisk
påpege, hvad de studerende har gjort, og hvordan vi har opdaget
det og virkelig hvad den overordnede motivation er for
selv have denne samtale.
Så med det sagt, linjen væsentlige er dette -
pr pensum, er du velkommen, du opfordres til at
tale med klassekammerater.
Det er hele formålet med at have disse kollaborative
kontortid i Annenberg og tilskynde folk til
afgangsprojekt at arbejde sammen.
Men linje tegnes når det drejer sig tid til rent faktisk at skrive
din endelige løsning.
Taler på engelsk, helt fint, taler i pseudo-kode,
helt fint.
Emailing en klassekammerat din Pset, lade dem se over
skærmen som hænderne fortsætte med at skrive,
over linje.
Må se til pensum for de særlige linjer.
>> Men bare for at male et billede af, hvordan det er desværre et
virkeligheden, indse, at der er hjemmesider derude, der
have løsninger fra denne klasse og mange andre klasser.
Det faktum, at du eller omkring 3% af jer ved, at dette eksisterer
betyder, at vi ved, at dette eksisterer.
Det faktum, at der er hjemmesider som denne, hvor du
kan betale nogen til rent faktisk at gøre dit problem sæt - det var
en aktuel sag, der kom op sidste år.
Dette er en hjemmeside kaldet odesk.com.
Og Tim var navnet på den person her, der var udstationering på
denne hjemmeside og spurgte en person til at gøre sit Pset 7 i
dette særlige tilfælde.
Nå, odesk.com er meget Google-stand, og vi også er
meget god til at google.
Også her er der steder - og denne her er snarere
grusomme, helt ærligt.
[Latter]
DAVID J. Malan: Det sjove ved dette site er, hvis
du læser om side, de taler om deres corporate
kultur og hvordan kundeservice er deres nummer et
prioritet, at sikre, at dine opgaver bliver
slået i til tiden.
>> Men i alle alvor, igen, det forhold, at disse websteder
eksistere, indser vi også er bevidste om
den slags steder.
Og for at give dig en fornemmelse af, hvilke former dette generelt
tager vi generelt ikke har store skandaler, hvor folk
samarbejder om nogen form for massiv, men snarere
det er disse sene øjeblikke af svaghed, hvor du har så
meget at gøre, det er 4:00, er du udmattet, og du
tænke på dig selv, ja, lad mig bare tage et kig på min
roommate-eller min ven kode eller lignende.
Og manifestationer af dette desværre involvere Student
En indsender noget som dette og Student B indsendelse
noget som dette, som helt sikkert, i en computer
videnskab klasse, er bemærkelsesværdigt nemt for dataloger
at opdage med software.
Dette er en anden almindelig paradigme, hvor du har slags
arbejdet sammen med nogen, måske taler i
Engelsk, bare fint, pseudokode.
Men så kommer det tid til rent faktisk at indsende, og psets
bare få udvekslet via e-mail eller Dropbox eller lignende.
Men i et forsøg på at gøre det mindre klart, at det er
hvad der er sket, så er det, hvad der er indsendt.
Også dette ikke tur op velskrevne stykker
software som vi er nødt til rent faktisk at opdage
den slags ting.
Og faktisk, hvad vi gør, er run software, der sammenligner alle
dette års indlæg mod alle tidligere års
indlæg, mod alt, hvad vi fandt på
Internet, mod alle job hjemmesiden derude.
Det er alt sammen meget automatiseret.
Og så gør vi det virkelig i stor retfærdighed til de 97%, der
virkelig arbejder deres røven ud af bukserne i denne og i andre
klasser og sætte i alle disse bestræbelser, således at arbejdet
de i sidste ende er deres egne.
Og jeg kan gå på i aldre.
>> Dette er blot en håndfuld af sidste års sager.
Et par elever forelagt disse filer identisk for Pset 2,
Pset 3, Pset 4, Pset 5, Pset 6, Pset 9.
I dette tilfælde var denne quiz 0 og i sidste år, hvor to
studerende indsendt ens denne sætning blandt mange
andre, "Anmodningen om type -" prik, prik, prik.
Så selv i en klasse på 600 gjorde vi opdage dette
på indsendt quizzer.
Så kort sagt, dette - helt ærligt, jeg hader at have denne form for
samtale - men dette er virkelig en bevidst indsats
i år at forsøge at køre ned dette nummer.
For selvom vi siger den slags ting hver
år, jeg tror den virkelighed at have dvælet ved det for et par
sekunder mere end normalt og faktisk lige påpege
at hvad der kan synes som, eh, ikke sådan en big deal, i det mindste
tænker tilbage på denne særlige øjeblik, både i retfærdighed til
dig selv og dine klassekammerater her.
Så hvis du nogensinde har spørgsmål om, hvor grænsen
er, skal du bare nå ud til mig personligt.
Men svaret er altid, helt understregede i
sidste øjeblik, kontanter i en sen dag.
Eller hvis det er et spørgsmål om ikke at have nogen sene dage,
ærligt, email mig personligt.
Vi finder ud af noget.
Vær venlig ikke at sætte din tid her på Harvard i fare.
>> Nu, jeg troede vi skulle lette stemningen, så jeg
medtaget dette som det næste dias.
[Latter]
DAVID J. Malan: Denne hjemmeside var stor.
Jeg fik faktisk lidt distraheret.
Der er denne ene.
Og så dette var forbløffende.
Okay, så tænk på, at killingen sent på aftenen, når de foretager
disse beslutninger.
Okay, så tilbage til mere sjov og mindre alvorlige ting, som
betingelser.
>> Okay, så vi talte kort om disse.
Det er noget, det er nok helt bekendt fra
en verden af ​​Scratch.
Og i en verden af ​​Scratch, har vi dette behov undertiden
gå gøre gafler i vejen.
Enten gøre dette eller hint eller dette andet ting her.
Og når vi ønsker at gøre dette, kan vi bruge, i C nu, dette, hvis
ellers konstruere.
Og så har vi her booleske udtryk.
For eksempel, boolske udtryk her kan vi ELLER
dem sammen i den forstand, at vi har denne tilstand eller
denne betingelse.
Vi kan og dem sammen, i den forstand, at vi ønsker at
tjek denne tilstand og denne betingelse.
Og her har vi en switch-statement nu, som ikke er så
ligner syntaktisk til den slags betingelser, men det
giver os mulighed for at gøre hvad der svarer til, hvis ellers hvis ellers hvis ellers
hvis og lignende ved at optælle dem fra sag til sag
ved hvert enkelt tilfælde.
Så vi oplevede dem sidste gang.
Og så begyndte vi at røre ved ting som sløjfer.
Vi oplevede en af ​​disse bare for et øjeblik siden.
Men der er disse andre looping konstruktioner.
>> For eksempel. Denne her
Så while (betingelse), skal du gøre det her igen og igen.
Så fundamentalt, hvad der synes at være forskellige mellem denne
for løkke og denne while-løkken her?
Dette for-løkke, og denne while-løkke.
Ja?
Hvad er det?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Good.
Så mens det i for-løkken tilstand, er der klart
mere syntaks.
Der er denne initialisering, der er denne opdatering.
I en while-løkke, er der bare denne betingelse.
Så det lader til, at det er lidt skåret ned i forhold til den for
loop, hvilket betyder, hvis vi ønsker at have variabler, og vi ønsker
at have optælling, vi faktisk er nødt til at
gøre dette selv.
>> Så lad mig gå videre og åbne op gedit.
Lad mig skifte over til apparatet.
Og lad os bare gøre en hurtig lille eksempel på, at
skelner en af ​​disse fra den anden.
Og på bagsiden af ​​mit sind her, vil jeg sige én ting.
Jeg specifikt nævnt navnet Tim.
Tim var faktisk nogen, at en elev har forsøgt at finde at gøre
deres hjemmearbejde for dem.
Vi havde ingen Tim i den pågældende sektion.
Så indse, at jeg ikke skal afsløres en elev, var det ikke en elev.
Det var en tilfældig person på internettet at gøre tingene
ved fuldmagt sidste år.
Så vi finder det, også.
Så i dette tilfælde her, lad mig gå videre og
åbne en ny fil.
Filer, Ny.
Dette giver mig en fane her.
Lad mig gå videre og gemme det som loop.c.
Lad mig gå hen og klik på Gem.
Og derefter ned her, så lad os gå videre og begynde at skrive
# Include .
Lad mig zoome ind
Nu vil vi gøre int main (void).
Lad mig nu gå videre og gøre for (int i = 0; i <
oh, 10; i + +).
Og nu jeg har tænkt mig at gå videre og gøre udskrive stjernen, at jeg
gjorde tidligere.
Og så i slutningen af ​​dette program, vil vi bare til
udskrive en ny linje, bare så min prompt
ser ikke alt rodet.
returnere 0.
Seem syntaktisk korrekt?
Indtil videre.
Så lad os se.
>> Så lad mig zoome ud, skal du gå ind i min terminal vindue.
Og lad mig gå videre og køre loop, fordi jeg kaldt dette
ting loop.c.
Så gør løkke.
Synes at kompilere OK.
Lad mig løbe loop, og nu Enter.
Og det synes at have udskrevet 10 stjerner.
Så lad os bare konvertere dette til en while-løkke og se, hvad
slags spørgsmål, vi falde over.
Så i stedet for dette, lad mig komme ind her og sige, mens jeg er
mindre end 10 -
lad mig slippe af for-løkken.
OK, så vi har et par problemer allerede.
Så betingelse er den samme, men jeg er selvfølgelig mangler
initialisering.
Jeg mangler den optælling.
Så hvad skal compileren sandsynligvis fortælle mig når jeg forsøger at
kompilere dette program?
Ja?
PUBLIKUM: [uhørlig].
>> DAVID J. Malan: Good.
Så det kommer til at sige noget lignende sort - i dette
tilfælde, variablen i.
Og ja, brug af sort identifikator i.
Og så dette er i modsætning til sprog som PHP og
Python og Ruby, som nogle af jer måske være bekendt,
hvor du kan bare lidt af start ved at bruge variabler
forgodtbefindende og ikke behøver at bekymre dig om at erklære dem
eksplicit altid.
I C og i sprog som Java og C + +, skal du være
super eksplicit.
Og hvis du ønsker en variabel kaldet jeg, er du nødt til at fortælle mig
hvilken variabel det.
Så vi bliver nødt til at løse dette på følgende måde.
Jeg har tænkt mig at have til at gå op her og skrive int i, og derfor
Jeg har erklæret en variabel kaldet i.
Nu har jeg sprunget et trin.
Jeg har naturligvis ikke initialiseret det, men lad os se om, at der på
mindst mærker Dunk stoppe klager.
Så lad mig genindspilning dette program.
>> Okay, nu er det bare klagende
af en anden grund.
"Variabel 'jeg' er uden startværdi når de bruges her." Okay, så
det er temmelig eksplicit.
Initialiseret betyder blot sætte det lig med en værdi.
Og vi har ikke gjort det, så lad mig prøve lig 0.
Lad os prøve det igen og igen køre Dunk.
Kompileret denne gang.
Og jeg er ved at køre den.
Men store gamle uendelig løkke, fordi jeg har gjort det
initialisering, jeg har gjort den betingelse, men jeg har aldrig gjort
enhver form for optælling.
Så hvordan kan jeg gøre det optælling?
Tja, i en while-løkke, føles det som om jeg har tænkt mig at have
at gøre det indre af sløjfen, da ligesom den første
uges eksempler på at gøre looping konstruktioner, ligesom med
sokkerne og med den selvstændige optælling havde vi at gøre
noget til allersidst, gerne gå tilbage til den næste linje.
Hvad hvis jeg gå videre og gøre det i + + her?
Lad os ikke engang kompilere dette.
Fang mig allerede.
Hvad er der galt her?
PUBLIKUM: [uhørlig].
>> DAVID J. Malan: Så det er bestemt ikke int.
Det er i.
Og de krøllede parenteser, som før,
indrykning er ikke nok.
Så nu har jeg denne konstruktion.
Så mens jeg er mindre end 10, skal du udskrive en stjerne,
derefter tilvækst i.
Og den måde en while-løkke værker er, at så snart du trykker på
bunden af ​​sløjfen, som i dette tilfælde ligner linje 10,
det kommer til at gå tilbage til linje 6, på hvilket tidspunkt
betingelse vil blive kontrolleret igen.
Og hvis jeg er stadig mindre end 10, vil vi gøre linjerne 8 og
derefter på 9, så vil vi ramt 10, og gå tilbage til 6, igen og
igen og igen og igen, så længe jeg er mindre end 10.
Så lad os re-run gøre her.
>> Okay, vi har kompileret okay.
Lad mig omvalg loop.
Og nu er det faktisk ser ud til at virke.
Så plusser og minusser her?
Nå, så langt er der faktisk ikke en helhed af PLO -
så søde.
Okay, det var en - ah, det var et uheld.
Okay, så lad os gå tilbage til for-løkken.
Så for løkker er rart, fordi de er super eksplicit.
Og selv om de er lidt klodset at skrive, det er
meget magtfulde og det giver dig mulighed for at gøre
flere ting på én gang.
Selvom sløjfer ikke synes at have en enorm mængde af værdi lige
endnu, fordi det føles som om vi bare nødt til at gøre mere arbejde.
Vi er nødt til at sætte initialiseringen op her,
opdatere hernede, og vi er nødt til at huske at gøre alt det der.
Så vi vil se i tide at mens sløjfer faktisk låne
sig til kun forskellige sammenhænge, ​​forskellige data
strukturer som lister og hash-tabeller, ting, vi vil komme til
mid-semester.
Men for nu, ved, at der er denne tredje type er kendt som en gør-
while-løkke.
Og vi har set dette kort.
Og det kan være super nyttige med Pset 1.
Hver gang du ønsker at gøre noget, og derefter kontrollere, om
den bruger, der samarbejdede, og hvis de ikke gjorde det, så gør det igen, en gør-
while-løkke egner sig til den slags logik.
Fordi som bestilling fra top til bund her antyder,
gør bogstaveligt betyder at gøre dette.
Og gøre det igen og igen, hvad kunne det være?
Måske betyder det ringer GetInt eller GetString og derefter
at kontrollere værdien af ​​GetInt eller GetString og derefter råben
på brugeren, hvis de ikke har samarbejdet ved at bede dem
igen og igen og igen.
Hvor du ønsker at gøre noget en gang,
så tjek nogle betingelse.
>> Så lad os prøve dette.
Lad mig faktisk ændre dette nu til en gør-while-løkke.
Og jeg har tænkt mig at gå videre og gøre følgende.
Så skal du gøre følgende.
Lad os gøre int i = GetInt (); men lad os først fortælle brugeren
hvad de skal gøre.
Så en lidt anderledes denne gang.
"Giv mig en int".
Så jeg vil bruge printf for.
Og nu jeg har tænkt mig at gå ned her, og jeg har tænkt mig at gøre dette
mens jeg er, lad os sige, større end -
lad os se, i er, lad os sige, mindre end 0, eller i er
større end 10.
Med andre ord ønsker jeg et tal fra 1 til 9, bare
vilkårligt.
Så jeg bruger en kombineret Boolesk udtryk her
sørge for, at i er mindre end 0 eller større end 10, hvor
tilfælde vil jeg gøre dette loop her igen.
Så igen, skal du gøre dette -
medens i er mindre end 0, eller i er større end 10.
>> Så lad os nu gå videre og gøre det, når vi har gjort det.
Lad os bare gøre en hurtig tilregnelighed check.
printf ("Tak, jeg er% d", i).
Så denne simple program beder brugeren om en int,
gør sikker på det er inden for nogle interval, 1 til 9 inklusive,
og derefter takker brugeren ved at minde dem om, hvad de lige
indtastet, ligesom en lille tilregnelighed check.
Men lad os se om det virker efter hensigten.
Lad mig gå hovedet ned her og re-run gøre loop.
Hmm.
"Brug af kaldenavn 'i'". Det er underligt.
Jeg troede, vi løst det.
Samme symptom men anden kode.
Ja?
PUBLIKUM: [uhørlig] inde i to, vi er nødt til at
[Uhørlig].
>> DAVID J. Malan: Præcis.
Så dette faktisk fører os til et emne kaldet rækkevidde.
Det viser sig, at C, igen, det virkelig tager dig bogstaveligt.
Og hvis du gør noget som dette, hvor du erklærer en int
og derefter tildele det en vis værdi, men du gør det inde i en
par krøllede parenteser, hvad C gør, er det forudsætter, at du
kun ønsker disse 32 bits kendt som I at eksistere inden for
led i disse krøllede parenteser, inden for rammerne af linjer
6 til 9. Så jeg er erklæret, og den er tildelt en
værdi i linje 8, men så snart du kommer udenfor
ledning 9 under klammeparentes, i er ikke længere i
rækkevidde, så at sige.
S-C-O-P-E. Det er ikke længere i den rette kontekst.
Så nu er der ingen i, så det er som om vi havde ikke engang
erklærede det overhovedet.
>> Så hvad er en rettelse så for noget som dette, hvis det
Grunden er, at jeg er erklæret i de krøllede parenteser, som
er tilsyneladende slemt?
Her?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Yeah.
Så vi kan initialisere den udenfor.
Så lad mig gå videre og slette erklæringen dele, hvorved
Jeg angive, hvilken type, og lad mig gøre det op her.
Så i linje 5, er det nu siger "Giv mig en int." Kald det i.
Meddelelse i linje 9, jeg ikke ønsker at gøre dette, fordi jeg
allerede har de 32 bits.
Jeg ønsker ikke at bede computeren for en
forskellige 32 bits.
Jeg vil bruge de samme 32 bit.
Og nu, fordi jeg er erklæret i linje 5, er det stadig legit
at bruge det i linie 11 og linie 12.
>> Så lad mig prøve at genoversætte dette og se
hvis Dunk stopper råben.
gøre løkken.
Så nu er det "underforstået erklæring af funktionen
»GetInt 'er ugyldig i C99." Hvad er det?
Ja?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Yeah.
Så nu, at jeg faktisk bruger GetInt, det er ikke noget
der bare kommer med C. Dette kommer fra CS50.
Så vi har brug for denne her.
Og lad mig gå tilbage til prompten ned
her og re-run gøre.
Okay, endelig.
Nu har vi besluttet, og den anden fejl.
Lad mig nu køre loop og se hvad der sker.
"Giv mig en int." Jeg vil give det 11.
Jeg vil give det -1.
Jeg vil give det foo.
Jeg vil give det 5.
Og nu er det faktisk virker.
Men prompten ændres for en grund her.
Hvorfor skulle det sige retry en af ​​disse gange, men giv mig en
int de andre tre gange?
Hvorfor er det adfærd anderledes?
PUBLIKUM: Gav det en streng.
DAVID J. Malan: Undskyld?
PUBLIKUM: Du gav det en streng.
DAVID J. Malan: Yeah.
Så vi gav det en streng i dette tredje forsøg,
når jeg har skrevet foo.
Foo er en streng.
Det er naturligvis ikke en int.
Og den måde, CS50 har implementeret GetInt er, at vi
ikke kontrollere, om noget er mindre end 0 eller større end 10
for dig, for hvordan kan vi vide på forhånd, hvad slags
int du ønsker?
Men vi kan minimalt tjekke for dig, har brugeren i det mindste
skrive et heltal?
Og hvis de ikke gjorde det, vi råber på, at brugeren ved at skrive "prøv igen" på
skærmen.
>> Så nu har vi et program, der er looping. Okay.
Nu, hvilke af disse er en slags bedre konstruktion?
Så det er her tingene begynder at blive lidt rodet, den
faktum, at du skal huske at erklære en variabel op her
hvis du ønsker at bruge det inde i nogle
krøllede parenteser og udenfor.
Men selv hvis dette ser lidt kryptisk ved første
blik, bare igen, husker den enkle logik.
For at kunne bruge noget i C, uanset om det er en funktion eller
Det er en variabel, skal du angive den, hvis det er en funktion
i nogle bibliotek, du eller har brug for at erklære den.
Men nu er du nødt til at være ekstra opmærksom på det faktum, at
du erklære den i den rigtige omfang.
Du er ikke at lægge det for stramt inde i parenteser.
>> Så lad mig faktisk rulle tilbage.
Hvis vi går tilbage til vores for eksempel fra tidligere, og jeg går
tilbage til for int, int i = 0; i <10; i + +, og jeg
gøre printf stjerner, som denne, og derefter lukke parentes, og nu
printf i er nu -
efter samme logik, hvad der vil ske, når jeg forsøger at
kompilere dette program?
PUBLIKUM: Ugyldig id.
DAVID J. Malan: Så det er en anden ugyldig identifikator,
kaldenavn.
Nu er grunden er lidt anderledes.
Der er tydeligvis ingen krøllede parenteser her, men det samme
idé, den samme historie af anvendelsesområdet gælder.
Hvis du har erklæret en variabel ligesom jeg inde i en
for-løkke, dig selv, hvis der ikke udtrykkeligt skrevet den krøllede
seler, så tænk på dem mentalt stadig være der, hvor
tilfælde jeg er kun gyldig inde i for-løkken.
Det er ikke gyldig, når du kommer til den næste linje, som i
denne sag er nu 10.
Så bare et par spørgsmål om omfang og lignende.
Okay, nogen spørgsmål?
>> Okay, så det er lidt af en triviel lille program,
udskrivning blot små stjerner.
Men lad os se om du kan huske den sang her.
Dette er en utroligt irriterende sang børnene ville synge på
skolebussen og lignende.
Men hvad er rart om det er, at det har denne cyclicity,
hvorved det er "99 flasker øl på væggen,
99 flasker øl.
Tag en ned, passerer den rundt, 98 flasker øl om
væg. "Og så sangen gentager 97, så 96, så
95, så 94, hele vejen ned til 0, hvis du rent faktisk fik at
langt på bussen.
Så dette er et godt program til at sortere i redskabet, fordi min
Gud, hvis du bare kunne gennemføre denne med et par
linjer kode, kan du spytte ud hele lyrics til dette
sang ganske hurtigt.
Men hen ad vejen, kan vi begynde at nu drille hinanden nogle
af disse grundlæggende looping konstruktioner og nu også
introducere funktioner, som vi skriver os selv, returnere værdier
vi passerer rundt.
Men først, hvorfor vi ikke gå videre og tage vores fem-minutters
pause her?
Og når vi kommer tilbage, vil vi synge denne sang.
>> Okay, så er vi tilbage.
Og når jeg siger, at vi nu vil synge denne sang, jeg mener
programmeringsmæssigt, ikke verbalt.
Så her har vi beer1.c, som er en implementering af dette
bestemt sang.
Og bare for at være klar, for dem bekendt med, hvad
denne ting ser ud, lad mig gå videre
og gøre beer1, Enter.
Lad mig løbe beer1, og hvad vi vil se - hvor mange flasker
af øl vil der være?
Jeg vil skrive i 99, ligesom sangen siger.
Enter.
Og nu, hvis vi ruller gennem -
oops - hvis vi ruller gennem alt dette, vil vi se, at
Dette har faktisk synge hele sangen.
Vent et øjeblik.
Min rullepanel er lidt rodet op.
Lad os bruge større vindue.
Så beer1, 99, vi der gå.
Så her har vi hele sangen, sunget meget hurtigere af
computer end det kunne have været med os.
Så bemærker dog, den cykliske karakter her.
Det siger 99, så 99, så "tage en ned, give det
rundt "og derefter 98.
Og nu er det gentager igen og igen.
>> Så dette er faktisk en perfekt mulighed for en slags
looping konstruktion.
Bemærk, at jeg er lidt skære et hjørne her.
Bemærk, at jeg siger "98 flasker øl på væggen,
97 flasker øl på væggen ", og det var lige så
at når vi kommer til en flasker øl, jeg har ikke
at bekymre sig om den engelske grammatik.
Men vi kan også løse dette med en lille smule af en hvis
betingelse, måske.
Hvis dette tal er ental, gå videre og sige "flaske",
ellers hvis det er flertal, siger "flasker".
Men for nu, jeg er helt skære dette hjørne.
Så lad os se, hvad vi har her.
Så vi har fået nogle kommentarer på toppen.
Jeg herunder disse to biblioteker, som
vi har ofte været.
Og lad mig rulle ned til den første
faktiske linjer kode.
Linje 17 starter main.
Linje 21 og 20 har, hvor mange flasker øl vil der være?
Og så kalder jeg GetInt.
Og nu har jeg lidt af en tilregnelighed check.
>> Så dette er en konvention, at vi nu vil begynde at vedtage at
mere stringent kontrollere brugerens input.
Nogle gange er du bare ikke ønsker at bede dem igen
og igen og igen.
Hvis brugeren skruer op og ikke samarbejder, fint.
Afslut og bare ikke håndtere dem.
Og så det er hvad jeg laver her.
Hvis n er mindre end 1, vil jeg bare råbe på brugeren,
"Beklager, det giver ingen mening." Og så jeg har tænkt mig at
vilkårligt returnere 1.
Så igen, det er bare en konvention at vænne sig til.
For nu at tage det på tro.
Men indtil nu har vi altid været tilbage 0, fordi
vi har sagt returnere 0 betegner hvad?
PUBLIKUM: Succes.
DAVID J. Malan: Succes, det er alt.
Så nu hvor vi endelig er begyndt at tænke
ikke-succeser -
med andre ord, hjørne tilfælde, fejltilstande -
nu har jeg en uendelig forsyning, eller mindst 4 milliarder
mulige ting, der kan gå galt i mine programmer.
Og jeg kan begynde at tildele dem individuelle numre.
Nu generelt er det tilstrækkeligt at bare returnere
noget andet end 0.
Så vi kommer til at blot returnere 1 for nu.
Men grunden til returnering 1 er, at så snart du vender tilbage
1, gæt hvad der sker med resten af ​​programmet?
Det stopper.
Det er det.
Så det faktum, at jeg vender tilbage 1 er effektivt
kortslutte dette program henrettelse, så
intet nedenfor linie 27 vil fortsætte udførelsen.
Så snart hovedsagen vender tilbage, er, at den.
>> Okay, så hvis brugeren ikke samarbejder, og vi når linje 30
fordi de har skrevet i en legitim tal, her er mit
gennemførelsen af ​​denne sang.
Så jeg først udskrive en ny linje, bare for
æstetik.
Jeg har nu en for-løkke.
Og mærke jeg gør tingene på en lidt
i en anden retning.
Jeg behøver ikke at gøre mindre end, jeg har ikke nødt til at gøre + +.
Jeg kan i stedet sige initialisere en variabel i, sæt den lig
n er antallet brugeren har indtastet i, skal du gøre følgende, så
længe jeg er større end 0, så jeg -
når du er færdig gentagelsen af ​​denne løkke.
Så vi kan tælle ned med en for-løkke så godt.
Nu, dette er temmelig meget uge en ting nu, med printf.
Så print "% d flasker øl på væggen." Print "% d
flasker øl. "" Tag én ned, passerer den rundt. "Print
"% D flasker øl på væggen." Så det er stadig% d, men
bemærke, at argumentet printf til at ændre sig.
Efter komma, har jeg i, fordi jeg ønsker at sige 99.
Efter denne komma, har jeg i, fordi jeg ønsker at sige 99.
Efter denne komma, har jeg i - 1, fordi jeg ønsker at sige 98 i
denne første iteration, og så videre.
Og nu hernede, jeg bare har en dum lille bemærkning.
Og så linje 42, jeg returnere 0 ved konvention, som betyder, at
alt er okay.
>> Så hvad hvis jeg goofed?
Hvad kan en almindelig fejl her være?
Nå, hvad hvis jeg ved et uheld sagde godt, ønsker jeg at tælle
ned til 0, vil jeg 0 flasker øl på væggen?
Så jeg siger, jeg er større end eller lig med 0.
Hvad vil være det symptom, at jeg nu se, om jeg kompilere
beer1 og køre det?
PUBLIKUM: Negativ.
DAVID J. Malan: Ja, det er gonna blive negativ.
Dette er en forskudt med en fejl, en utrolig
almindelig fejl at gøre.
Lad os faktisk gå tilbage til terminalvinduet og gøre det
her, så vi kan se mere på et tidspunkt.
Enter, 99 flasker øl.
Tæt på, men vi gik nogensinde så lidt for langt.
Vi sang sangen for langt ned, sådan at vi nu ramt
negativt tal.
Så det ikke helt virker.
>> Okay, så vi nemt kan ordne det ved at gå tilbage til
måde det var engang.
Men hvad er nogle muligheder nu for
forbedring?
Nå, lad mig åbne beer2.c og rulle ned her og tage et
se på denne version.
Hvad er den første ting, der springer ud på dig som forskellige
i denne version her?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Yeah, så ikke mere i, fordi det gik op for
mig ved du hvad, jeg beder brugeren om n, og så er jeg
indstilling i lig med n, og så er jeg ændre i, men jeg er aldrig
røre n igen.
Så hvad dælen var det punkt, du tildele en anden 32
bits kaldte jeg bare så jeg kan få en anden variabel?
Så i dette tilfælde, jeg slags anerkendt, at unødvendige
design funktion.
Og jeg vil nu sige, mens n er større end 0, skal du gå
fremad og udskrive den samme sang, der passerer et n til printf som
andet argument, og n - 1 som det andet argument hernede.
Og så på hver gentagelse af denne løkke, gå videre og blot
dekrementere n selv.
Nu, funktionelt, dette program
vil være identiske.
Hvis jeg skriver i 99, n starter kl 99.
Jeg decrement, decrement, decrement, dekrement.
Jeg har tænkt mig at komme hele vejen ned til "En flaske øl på
muren, en flaske øl.
Tag en ned, passerer det rundt.
0 flasker øl på væggen. "Sidste ende, fordi jeg gjorde
får den betingelse korrekt.
Det er større end 0.
Jeg har ikke gøre denne fejl.
>> Så der er bedre, version én eller version to?
Så hørte jeg en masse murren til to.
Hvorfor to?
Hvad er det?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Oh, okay.
Så det vil ikke gå under 0, men husk, i version One,
original korrekte version ikke gå under 0 enten.
Så husk, at dette er den korrekte version.
Så lad os i det mindste sammenligne de to korrekte versioner.
Hvad er et argument af version
to er, mmm, bedre?
Ja?
PUBLIKUM: Den bruger mindre plads.
DAVID J. Malan: Okay, så det bruger mindre plads, ikke?
Betragtninger versionen der bruges 32 bit til n, og derefter en anden
32 bit for jeg.
Version to bruger kun 32 bit for n, således at
synes at være en plus.
Andre tanker?
Er der nogen ønsker at argumentere for en?
Ja?
PUBLIKUM: Du er nødt til at bruge ekstra linje kode for n -.
>> DAVID J. Malan: Okay, helt sikkert.
Så det er fair.
Så dette bare det mindste for mig -
Jeg mener, dette faktisk føles lidt Messier, den omstændighed, at
Jeg kan ikke sortere af indkapsler hele min logik i én
smuk linje, for-løkken, som for-løkken kan.
Her vil jeg slags nødt til at hæfte på denne n -
ved slutningen af ​​sløjfen, da
Det er logisk nødvendig.
Men den slags gnider mig den forkerte vej, bare fordi det
synes adskilt fra logikken i op her, selv om
igen, det er nødvendigt.
Andre tanker?
Ja?
PUBLIKUM: [uhørlig].
>> DAVID J. Malan: Yeah.
Så hvad nu hvis du i stedet, i slutningen af ​​sangen, ønskede at
udskrive igen navnet på den sang?
Ligesom "Tak for at spille 99 flasker øl", noget eller
fjollet sådan?
Men pointen er, du ville få adgang til den oprindelige værdi.
Det faktum, at du har muteret eller ændrede n på hver
iteration og derfor har ødelagt sin oprindelige værdi
betyder, at du kan bare ikke gøre det i slutningen.
Nu, velsagtens, vi tydeligvis ikke ønsker at gøre
at i dette program.
Så hvem bekymrer sig?
Men det er et meget gyldigt punkt.
Og for at være ærlig, er der virkelig ingen
rigtige svar her.
De er begge lige korrekte.
Jeg kunne blive overbevist enten måde.
Jeg vil sige, at der generelt, det er et godt princip, hvis du
spurgte brugeren for en vis værdi, og du har gemt i en variabel
ligesom n, en slags på princippet lige, er det sikkert godt
at holde det omkring.
Og alle data, du ønsker at mutere igen og igen, bare
give dig selv en kopi af denne variabel, bare så du
har adgang til den oprindelige.
Du bruger 32 flere bit, men virkeligheden er dette
computer har, ligesom, to gigabyte RAM i disse dage,
og vi ordkløveri over 32 bits?
Virkelig ikke sådan en big deal.
Og selv om denne enhed her, med en halv koncert eller en
gigabyte RAM, 32 bits versus 64 bit,
ikke sådan en big deal.
Bestemt i dag, det vil være måde overvældet af størrelsen
af selve programmet, er der vil være flere hundrede
kilobyte, hvis ikke et par megabyte, i disse dage.
>> Så rimelige bekymringer, ingen rigtige svar.
Men i det mindste det er de tanker, der bør begynde at
gå gennem dit sind?
Fordi der i Pset 0, selvom vi egentlig kun forventet
korrekthed, eller i det mindste fraskrivelse forskellige fejl, der
du måske har stødt på, som vi bevæger os fremad, design er
vil være et andet centralt aspekt, som begge skrive kode
og også vores vurdering kode.
Og så i det mindste give menes at ting som dette.
Og bare fordi noget virker, betyder ikke, det er godt,
betyder ikke, det er godt udformet.
Og det er en af ​​de ting de undervisningsmæssige fellows og
problemområder sæt vil hjælpe os med at drille en del over tid.
>> Nå, hvad med, lad os sige, denne version her?
Lad mig gøre noget lidt sexet her om et øjeblik.
Først lad mig slippe af med dette.
Og lad os nu løse dette grammatisk problem.
Så i denne version, vil jeg gerne rette grammatik, således at
snarere end blot sige parentetiske s, som "flaske"
eller "flasker" -
Jeg ønsker ikke at skære den hjørne -
Jeg vil også gerne dynamisk udskrive ordet "flasker"
eller "flaske" og derved anvende disse% s pladsholdere i dag.
Så jeg er nødt til at betinget kontrollere, hvad er værdien af ​​i.
Og hvis det er 1, jeg ønsker at sige "flaske", og hvis det er noget
ellers vil jeg sige "flasker". Så lad os prøve at gøre dette.
Så hvis jeg == 1, så lad mig gå videre og erklære -
Jeg har brug for en snor, så lad mig gøre string s1, fordi det er
første streng jeg ligeglad med lige nu.
Jeg har tænkt mig at sige "flaske". Og så, lad os se, string
s2 - og jeg vil forklare, hvor jeg har tænkt mig om et øjeblik -
"Flasker". Så huske, at i denne sang, er vi nødt til at kunne
at udskrive ting, to forskellige ord potentielt.
Så hvis vi ser tilbage her, bemærke, at når vi kommer til
dette eksempel her, "to flasker øl på væggen,
to flasker øl, tage en ned, passerer det rundt ", jeg ønsker
denne fjerde linie til nu sige "en flaske øl på
væggen ". Så jeg er nødt til at beslutte, ønsker jeg at sige" flasker "eller
"Flaske"? Så jeg har tænkt mig at vilkårligt at sige, okay,
Jeg har tænkt mig at nu erklære en variabel kaldet s1, string
én, er at gå for at få sat ind her, og også her,
fordi disse ord er altid identisk, blot på grund af
karakter af sangen.
Og jeg har tænkt mig at kalde S2 hvad ord jeg vil
sidst vises hernede.
Nu, bogstaveligt talt, 99 gange ud af 100, det vil være den
samme i begge disse sager, fordi 3 er flertal, 2 er
flertal, 4 er flertal.
Men i dette hjørne tilfælde, hvor vi kommer til 2 og derefter 1, eller
selv 1 og derefter 0, jeg har brug for denne logik.
Så jeg er nødt til at tilbringe noget tid i min kode at få denne ret.
Så hvis jeg gør det, hvis jeg == 1, så der s1 er lig med "flaske"
og s2 er lig med "flasker", fordi det vil være for 1
flaske, og dette vil være på 0 flasker.
Og dette her, hvad det repræsenterer?
Bare for at være klar.
Dette er blot en kommentar.
Så det faktum, at du kan have single-line kommentarer betyder, at du
kan kommentere din kode som denne, men en anden fælles
paradigme, også er, at hvis du har en super-kort sætning, at
du ønsker at sætte dig selv og det er bare lettere at læse for at sætte
det lige for enden af ​​den linje kode, kan du
absolut gøre noget som dette.
>> Så hvad nu hvis jeg gør dette? Else hvis jeg ikke er lig med 1.
Så bang lig -
udråbstegn er kendt som "bang".
Så bang = 1.
Så hvis jeg ikke er lig med 1, hvad skal jeg i stedet ønsker at gøre?
Nå, det første ord jeg ønsker at være, hvad?
Så streng 1 bør være "flasker" for pluralistiske flasker,
og så vil det være flertal "flasker" så godt, for nu.
Og vi vil se, om det rent faktisk får os til
hvor vi vil hen.
Så nu hvis jeg rulle ned her mærke til, at jeg sætter stikket i
ikke kun jeg, men S1.
Jeg tilslutte i og s1.
Og derefter ned her, jeg er minus 1, hvilket er det samme som
før, men s2.
Med andre ord ønsker jeg det engelske ord for at ændre baseret
på denne logik.
Nu er der allerede nogle problemer i denne kode.
Hvad er brudt allerede ud af porten her?
Ja?
PUBLIKUM: [uhørlig].
>> DAVID J. Malan: Præcis.
Så jeg har allerede overtrådt den lektie af anvendelsesområdet.
Så jeg har erklæret S1 og S2, men jeg har gjort det inde i
krøllede parenteser, hvilket betyder yeah, vil denne kode arbejde op
indtil linje 42, så snart jeg ramte linie 43, men gæt hvad ingen
længere eksisterer?
Nå, gætte, hvad er ikke længere i omfang - hverken s1 eller s2.
Så vi er nødt til at løse dette.
Så lad mig slette erklæringerne.
Og jeg vil overlade de variable navne og slette denne her
og slet denne her.
Og på hvilken linjer bør jeg virkelig erklære disse ting?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Yeah, så sandsynligvis
lige heroppe, 33-ish.
Så streng s1 og derefter streng s2.
Og det viser sig, kan jeg gøre det.
Hvis du erklære to variabler af samme type,
du kan faktisk bare bruge et komma og gøre det i C. Alle
højre, så nu har jeg to variable -
s1 og s2.
Jeg tildele dem værdier i disse
forholdene her, eller herinde.
Og så jeg bruger dem dernede.
Hvor godt er det nu kommer til at arbejde?
>> Tja, det er stadig lidt buggy, men lad os i det mindste se
hvor langt vi har fået.
Så lad mig gå videre og gøre beer3.
Er dette beer3?
Yep, det er beer3.
Og lad mig nu gå videre og køre beer3.
399 99.
Vi kan sandsynligvis springe de fleste af dem.
Og hernede, se på det.
"En flaske øl på væggen, en flaske øl, tage
én ned, passerer den rundt, 0 flasker øl på væggen. "
Men jeg henlede Deres opmærksomhed på kun halvdelen af ​​løsningen.
Kind of skruet op her.
Så det lader til, at hjørne sager opstår, når jeg lig hvad
to værdier?
PUBLIKUM: 2, 1.
David J. Malan: 2 og 1.
Det er ikke 1 og ikke 1.
Det er virkelig bare de to sidste strofer af denne sang.
Så hvad gør jeg i stedet ønsker at gøre?
Så jeg synes at have fanget det tilfælde, hvor hvis jeg er == til 1,
derefter det første ord er "flaske", men det andet ord
er "flasker". Men her, jeg ønsker at ændre dette for at være == 2.
Og hvis dette er tilfældet, hvad jeg vil have det
første ord at være?
Publikum: "flasker".
DAVID J. Malan: "flasker", så for to flasker.
Og så dette ord her bør være -
Publikum: "Bottle".
DAVID J. Malan: "Bottle", ental.
>> Okay, lad os zoome ud, gå tilbage herovre, re-run gøre,
omvalg beer3, type 99 igen.
Okay, "Segmentation fault (core dumpet)."
Hvad har jeg gjort forkert?
PUBLIKUM: Du behøver ikke have en værdi [uhørlig].
DAVID J. Malan: Ah, excellent punkt.
Okay, så hvad er der galt her?
Så segmenteringsfejl, og vi faktisk kommer til at se
dette helt et par gange i fremtiden, bevidst.
Men for nu, hvad betyder det egentlig?
En segmentering fejl næsten altid betyder, at du har
en eller anden måde forsøgt at få adgang hukommelse, RAM i din computer,
at du ikke ejer, at du faktisk ikke har anmodet
operativsystem til.
Så i dette tilfælde, mærke til, hvad jeg har gjort, som er
behæftet med fejl i min logik.
Jeg har tildelt s1 og s2 en værdi, hvis jeg er lig med 1.
Jeg har også gjort det, hvis jeg er lig 2.
Men jeg har ikke gjort det i det uendelige antal af andre
muligheder -
i særdeleshed. 3 eller 4 eller prik, prik, prik, 99
Så en rettelse til dette kunne bare være lad os
have en anden tilstand.
Og lad mig gå ind her og sige s1 lig -
hvad skulle det være her?
PUBLIKUM: [uhørlig].
>> DAVID J. Malan: "flasker", fordi der i den fælles sag,
det er bare det samme.
Så lig citerer, citat slut, "flasker". Så for flertalsformen
flasker, og derefter op her, for flertalsformer flasker.
Okay, så lad mig vende tilbage til mit terminalvindue,
rekompilere, re-køre den.
99.
Puha.
Og lad os gøre en hurtig tilregnelighed check.
Teknisk set ville vi ønsker at læse alle disse for at sikre
de er korrekte, men lad os se på
mindst de kendte syndere.
3 flasker, 2 flasker, 2 flasker, 1
flaske, 1 flaske, 0 flasker.
Vi synes at have i det mindste fastsættes det for nu.
Men fangsten her er, at hvad en Gud forfærdelige rod dette er
bare for at løse en dum
ét tegn grammatiske detaljer.
Så der er lidt af en grund, at jeg skar dette hjørne
tidligere, at fordi det er bare helt irriterende nødt til at
skrive så meget kode.
Men det viser sig, at der er lidt mere elegante måder
udtrykker præcis det samme.
Og vi kan gøre det på følgende måde.
>> Lad mig forlade dette på skærmen et øjeblik og
introducere noget kendt som en ternær operatør.
Det er lidt af en one-liner, der er blot ment til at gøre vores
bor en lidt mere sexet, som lovet.
Og jeg har tænkt mig at gøre det som følger.
Giv mig en streng kaldet s1, og lad mig
tildele det som følger.
(I == 1)?
"Flaske", ellers "flasker". String s2 får (i == 2)?
"Flaske", ellers "flasker".
Så hvad er så forskellen her?
Disse to linjer kode, jeg argumentere, kan
erstatte hele denne rod.
Så jeg kalder det noget rod, bare fordi det slags gnider mig
forkert måde, at det er så mange linjer kode.
Ikke forkert.
Det er ikke dårligt design.
Ligesom, det er helt korrekt og helt fint.
Men kodning bliver kedelig, hvis du er nødt til at udtrykke dig så
pokkers specifikt igen og igen og igen med en enkel
scenarie som dette.
Så C har nogle genveje, som denne.
Så dette væsentlige siger erklære en streng kaldet s1 og
tildele det enten denne værdi eller denne værdi, hvis jeg er == -
Undskyld, skal jeg sige det mere tydeligt.
Erklær en variabel s1, tildele det denne værdi, hvis dette er sandt.
Ellers tildele det denne værdi.
Så med andre ord, er denne form for en linie måde
siger, hvis ellers men laver en opgave undervejs.
Så hvis jeg er 1, derefter gå videre og kalde det "flaske". Og
så er dette andet, kalder det "flasker". I mellemtiden s2, at
andet ord, som vi er nødt til at definere, hvis jeg er lig med 2, vil vi
mængden S2 til "flaske". Ellers sæt den til "flasker". Og hvad
Dette betyder nu, er jeg kan gå igennem dette og slette alle
disse linjer kode.
Og når jeg siger, noget latterligt, at dette nu er
sexier, det er mere sexet i den slags stilistiske fornuft.
Det faktum, at funktionelt, er denne kode der faktisk går til
gøre præcis de samme ting.
Og selvom det måske ser lidt kryptisk ved første
blik, fordi vi ikke har set denne konstruktion før, jeg havde
hævder, at det i sidste ende kommer til at være så meget mere
læsbar og så meget lettere for vi mennesker at sortere i
forstå, fordi nu kan du bare læse
kode på én linje.
Det er stadig samme ånd til en hvis det, hvor det er
tilstand og derefter dette er hvad der er inde i if, og dette
er, hvad der er inde i andet.
Men vi kan gøre det lige meget mere elegant.
>> Og hvis jeg nu gå tilbage til min terminal, efter at have slettet alle
af disse linjer og erstattet dem med bare de to,
rekompilere, re-run flasker øl med 99, meddelelse om, at min
grammatik er faktisk stadig korrekt.
Så igen, noget at starte.
2 flasker øl, 1 flaske øl.
Ser ret.
Yeah.
Så der har vi en langt mere kortfattet løsning.
Så det også, som du får mere komfortabel med C, ikke
nødvendigvis med den første Pset eller endog sekunder, men
indse, at disse konstruktioner kan tillade os at gøre tingene nogensinde
mere elegant.
Nu lad os gøre en anden ting her.
Lad mig gå videre og åbne op return1.c.
Lad os nu begynde at løse et andet problem på en måde,
giver os mulighed for at skrive mere sofistikerede kode.
>> Så her er en simpel lille program, hvis formål i livet
at inkrementere værdier.
Og faktisk, lad os tage et skridt tilbage.
Lad mig gøre det manuelt.
Lad mig gøre inkludere og int main (void).
Og lad mig kalde denne increment.c.
Og hvad vil jeg gøre?
Jeg har tænkt mig at gå videre og sige noget lignende -
vil vi kalde tallene det samme -
int x.
Så int x får 2; printf x er% d, ny linje, x.
Så jeg skriver hurtigt, men slags velkendte ting nu.
Så jeg har tænkt mig at gøre x + +.
Så jeg har tænkt mig at udskrive den samme sætning igen.
Og så jeg har tænkt mig at vende tilbage 0 bare for at afslutte programmet.
Okay, så dette er et program,
inkrementer et tal.
Det er først at gå til initialisere noget til 2, og så er det
kommer til at forøge den og udskrive den igen.
>> Så lad os køre tilvækst, utroligt simpelt program.
Men formoder nu, at jeg ønsker at terning værdien, så gør
noget noget arbitrær.
Og jeg vil faktisk gerne gøre x får terning af det.
Så jeg kunne bruge det, der kaldes pow-funktionen, men jeg gør ikke
virkelig ved, hvor det er endnu.
Så jeg har tænkt mig at gøre det på den gammeldags måde.
x gange svarer dette til x gange x gange x.
Så jeg Cubing værdien multiplicere det af sig selv igen
og igen og igen, så vi får magt
af 3 i dette tilfælde.
Så nu de tal, jeg skulle udskrive burde være, som vi vil se
her - gøre tilvækst, så det er faktisk ikke rigtig tilvækst
længere, men vi vil forlade navn alene -
2 og derefter 8.
Nu har vi begyndelsen til en mulighed for raffinement
her, hvorved denne Cubing ting om at multiplicere et tal
af sig selv af sig selv i sig selv føles som dette kan bare være
nyttigt at have som en funktion, ligesom nogen besluttede
år siden - du ved, sådan nyttig, hvis en af ​​os sidder ned
og skriver printf så resten af ​​verden kan bruge det,
hvorfor gør vi ikke sidde ned og skrive en funktion kaldet terning
der gør dette Cubing for os, så vi ikke behøver at manuelt
implementere begrebet Cubing værdier her?
>> Så et simpelt eksempel, men lad os gå videre og bruge dette som en
mulighed for at skrive vores egen funktion.
Indtil hidtil har vi kun brugt vigtigste, og vi har brugt andre
folks funktioner, men vi har ikke skrevet vores egen.
Så her går vi.
Jeg har tænkt mig at gå videre og skrive en funktion kaldet terning.
Og jeg har tænkt mig at få det tage en indgang.
Så sin indgang vil være et heltal.
Og hvad er det tænkt sig at gøre?
Det kommer til at erklære int output = input gange input
gange input.
Og så det kommer til at vende tilbage, at output.
Og så er jeg nødt til at være specifik nu.
Denne funktion vil returnere en int.
Så her er så, hvordan du ville skrive dine egne funktioner.
Du skal først beslutte, hvad er navnet på din
funktion vil være.
Og generelt, noget forklarende er god, så jeg vil
kalder det terning.
Så er du nødt til at specificere, hvad det kommer til at vende tilbage, hvad er
sin produktion vil være.
Og vi har ikke så mange muligheder endnu.
Int, char, float, bool, string.
For nu, vil jeg holde fast i en int, fordi jeg ønsker det
at returnere et heltal.
Så er du nødt til at præcisere, hvad dens indgange, hvis nogen, er.
Og hvis terning tager et argument, tager noget mellem
parenteser, du har at give dette argument et navn, så
man kan kalde det noget som du gennemfører eller skriver
denne funktion, og du er nødt til at give det en type, som i dette
tilfælde vil være int.
Så kort sagt, er terning en funktion, der tager et heltal
som input og returnerer et heltal som output.
>> Så hvad betyder det gøre med, at input?
Tja, i linje 14, erklærer jeg en variabel kaldet output, og jeg
tildele den værdien, input gange input gange input.
Og så vender jeg tilbage output.
Så hvordan bruger jeg dette så?
Hvad skal jeg ændre disse fremhævede tegn på linje
7, der skal, tror du?
PUBLIKUM: [uhørlig].
DAVID J. Malan: Ja, så terning af x.
Så x er en variabel, hvilket betyder, at det besidder en vis værdi.
Heldigvis er det af typen heltal.
Og fordi x er en int, der betyder, at jeg kan give det til terning.
Og selvom jeg tvingende værdien af ​​x med den værdi
af kube x, som det har været tilfældet hidtil, hver gang du
har lighedstegn og en linje kode, de ting på den rigtige
bliver henrettet, og bliver tildelt
værdien til venstre.
Så rækkefølgen af ​​operationer er, som vi kunne håbe.
Så fungerer det?
Nå, lad mig gå ned her.
Lad mig åbne mit terminalvindue.
Lad mig gør tilvækst, Enter.
"Implicit erklæring af funktionen 'terning' er ugyldig i
C99 ". Som en sidebemærkning C99 refererer til sproget C, som det var
fastlagt i 1999, hvilket var en opdatering over version fra
1989, hvilket er en opdatering i den oprindelige.
Så det er alt der betyder.
>> Så hvad betyder det, at "der er
funktionen 'terning' er ugyldig? "Det er lige her.
Det er lige der på linje 12.
PUBLIKUM: [uhørlig].
DAVID J. Malan: Hvad er det?
PUBLIKUM: Det er ikke før.
DAVID J. Malan: Det er ikke før.
Så dette er den ting.
C er en slags dum, eller C-compilere er lidt dum.
De virkelig kun gøre, hvad du fortæller dem at gøre.
Og de bl.a. læse kun din kode top til bund,
venstre til højre.
Så hvis compileren, Dunk, læser din kode, linje 1, det
tal ud af hvordan du gør dette.
Åh, her kommer main.
Okay, lad mig gå videre og erklære en variabel x.
Lad mig udskrive noget.
Linje 7, hvad dælen er terning?
Det er ikke erklæret i stdio.h.
Det kommer ikke med C. Jeg har ingen idé om hvad de skal gøre.
Og så Dunk bare bails og afsluttes med denne fejlmeddelelse.
Så vi kan løse dette på et par forskellige måder.
Vi kan undervise Dunk hvilken terning er ved blot at flytte, når
erklæring er.
Så jeg klippet og klistret det oven main.
Nu indse, at bare fordi main er ikke længere først, det er
stadig henrettet som standard.
Main er main.
Det er standard funktion navn.
Det betyder ikke noget, hvor det er i en fil.
Men i det mindste nu Dunk har set terning før jeg bruger det.
Så lad os se om Dunk er gladere nu.
Gør tilvækst, gjorde det kompilere denne gang.
>> Lad mig løbe tilvækst.
Og ja, det synes at virke.
Nu kan du komme op med scenarier til sidst hvor
det er ikke muligt at sætte enhver funktion
over hver anden funktion.
Du vil sidde fast i denne uendelig løkke i virkeligheden,
hvor denne fyr ønsker at være her, men dette
fyr skal være der.
Så det fungerer ikke altid.
Så heldigvis, C har en mere elegant løsning.
Jeg har tænkt mig at sætte dette tilbage, hvor det var, bare fordi jeg
foretrækker, som en principsag, at main altid være
i toppen, fordi er bare rart at se, hvad dette program
gør som standard.
Og hvad jeg har tænkt mig at gøre heroppe er erklære, hvad der kaldes
en prototype.
Jeg har tænkt mig at re-erklære min terning funktion ved bogstaveligt
kopiere og indsætte.
Faktisk er det ikke bogstaveligt.
Så bogstaveligt kopiere og indsætte linie 15
op over linjen 6.
Det er ligegyldigt, hvilken linje dette ender på.
Det sker for at være på linie 4.
Men det behøver at være før main.
Men læg mærke forskellen.
Linje 4 ender med et semikolon, hvilket betyder hey,
Klang, tage mit ord for det, at der findes en funktion
kaldet terning, der tager en int og returnerer en int.
Men jeg vil ikke fortælle dig, hvad det er endnu.
Bare vide, at jeg lover at fortælle dig i sidste ende.
Og ja, nu er det okay, at dette er dernede.
>> Så dette er generelt bedre, for så i toppen af
din fil, kan du bare aflire, hurtige brand, en linje
hver, hvad navnene på dine funktioner er, hvad deres
indgange er, hvad deres udgange er.
Og for at være mere klar, input betyder generelt argument eller
parameter, synonyme.
Output betyder returværdi, hvad betyder det
hånd tilbage til mig.
Så i dette tilfælde her, er terning blevet erklæret i toppen, men
defineret, også kendt som implementeres, i bunden.
Så lad os nu gå tilbage her og returnerer til dette.
Så nu lad mig gå videre og igen køre make, re-run tilvækst.
Og det ser nu ud til at virke fint.
Så nu kan vi gå videre og faktor ud af noget som
øl eksempel i denne fjerde udgave.
Så lad mig rulle ned her.
Og bemærke, at jeg slags tog denne lektion til hjertet lige nu.
Det faktum, at jeg var synger den samme strofe igen og
igen og igen, det samme kor linje i sangen, følte
ligesom hvorfor gør jeg ikke faktor, ud i en funktion?
Og ja, bør dette være et af motiverne.
Ud over det faktum, at nogen andre i verden vil måske
at anvende en terning funktion -
der er en god grund til faktor noget ud og skriv din
egne brugerdefinerede funktion -
hvis der er et stykke kode i dit program, der bare gør
begrebsmæssig forstand, at du slags ønsker at give det en
navn - som i dette tilfælde, kor -
så kan du ligeledes skrive det som en separat funktion.
Du behøver ikke at skrive alt i main hvis det bare
føles renere at adskille det, og giv den et navn.
>> Så i dette tilfælde her, bemærke, at jeg har en kommentar oven
denne funktion, som kun synger om
angivne antal flasker.
Bemærk her, at jeg ikke behøver at kalde disse
ting input og output.
Faktisk jeg denne gang har lige ringet min indgang B til flaske.
Og mærke her, ugyldig antyder, hvad?
Denne kor -
PUBLIKUM: Har ikke returnere den.
DAVID J. Malan: returnerer ikke en værdi.
Og ja, behøver funktioner ikke behøver at vende tilbage værdier.
De kan bare gøre noget.
De kan have såkaldte bivirkninger, som i dette
Sagen er bare en hel bunke af udskrivning på skærmen.
Så bemærke, at denne kode, jeg bogstaveligt talt bare stjal fra
det foregående eksempel.
Den eneste forskel er i stedet for at bruge i som min
variable, jeg nu bruger b som min variabel.
Så jeg har b hernede, jeg har b hernede, jeg har b
minus 1 ned her.
Men koden er nøjagtig den samme.
Men bare for at vise dig nu, hvordan vi kan bruge dette, så lad mig gå
fremad og faktisk ændre dette for at være en for-løkke.
for (int i = n; i> n; i -).
>> Så jeg har stjålet den fra vores tidligere eksempel.
Tidligere er det på linje 37, at jeg ville have startet
synge denne irriterende sang.
Men i stedet, jeg bare nu kalder koret af i.
Udført.
Så nu i hver iteration af denne løkke, kalder jeg denne anden
funktion, kor, som jeg tilfældigvis at skrive.
Det blev ikke skrevet af en anden år siden.
Men kor, i mellemtiden, bruger printf at udskrive
af disse fire linjer.
Men det faktum, at jeg ringer kor igen og igen i en
løkke betyder, at jeg har tænkt mig at få, til allersidst, det
nøjagtig samme sang, som jeg har hidtil.
Så kort sagt, nu, hvis jeg ser tilbage på min kode, selvom
funktionelt dette er ækvivalent, bemærke, at det er
begyndt at få endnu mere læsevenlig.
Jeg ved ikke præcis, hvordan GetInt
er implementeret.
Helt ærligt, jeg ved ikke, hvordan kor er implementeret.
Men det betyder ikke noget for mig.
Jeg er ligeglad, fordi jeg nu kan sortere i, som et menneske, læse
dette fra top til bund.
Og fordi funktionerne er navngivet efter, hvad de
gør, min kode bliver stadig læses.
Og da vores programmer får meget mere kompleks -
ved semestrets afslutning, vil du skrive hundredvis af linjer
af kode i sprog som PHP og JavaScript og lignende -
vil du opdage, at det er så meget nemmere end at holde styr på
hvad du har gjort.
Og når du begynder at samarbejde med venner eller
partnere eller kolleger, vil du være i stand til at skrive meget mere
massive programmer ved at begynde at udøve disse grundlæggende
byggesten.
>> Så med det sagt, hvorfor vi ikke kalde det en dag?
Og vi vil se dig på onsdag.
[Bifald]