[Powered by Google Translate] David J. MALAN: Okej, det här är CS50, och det är
start av vecka två.
Tack.
Låt oss börja här med ett telefonsamtal.
Jag ska ringa 617-BUG-CS50.
CS50: Detta är CS50.
För Shuttle pojke, tryck 1.
Att börja om, tryck 9.
David J. MALAN: Så sa han till Shuttle Boy, tryck på 1.
Så vi kommer att trycka på 1.
CS50: Vilken är din ursprung?
För quad, tryck 1.
Mather, tryck på 2.
Boylston, tryck 3.
Lamont, tryck på 4.
Mem Hall, tryck 5.
Att börja om, tryck 0.
David J. MALAN: Vi ska trycka 1 för quad.
CS50: Nästa buss lämnar denna stund vid 1:10 PM och
sedan vid 01:20, 1:30 PM, 1:40 PM.
Detta är CS50.
>> David J. MALAN: Så det här är CS50 röst.
Och det är ett exempel på den typ av slutliga projekt,
Exempelvis kan du bita av mot
slutet av terminen.
Till exempel finns det shuttleboy.cs50.net -
faktiskt ett projekt som jag först skrev efter att ha tagit CS51
tillbaka när jag var ett grundutbildningsprogram.
Och inspirationen här var då, var allt de hade
de tryckta shuttle buss tidtabeller, och det fanns ingen
begreppet titta upp saker på nätet.
Och så jag slags duva i en helg, hälls genom
tryckt schema och ported till ett datorprogram.
Vid den tiden, hände datorprogrammet som skall skrivas
i C. Och du körde faktiskt genom att skriva Shuttle Pojke på en
blinkande uppmana som vi har gjort hittills.
Men under årens lopp har det utvecklats till en omedelbar
meddelanden bot.
Det utvecklades senare till denna webbplats, i ett
SMS-baserat verktyg, liksom i denna röst-baserade verktyg.
Och det är att antyda vilka typer av saker som du kan
göra för dig själv genom termins slut.
>> Till exempel finns det händer SMS versionen av Shuttle Boy
att fungera såsom följer.
Om på din mobiltelefon, skicka ett SMS till 41411 och
sedan skicka den speciella symbolen sboy för Shuttle pojke,
följt av A och B, där A är ett ursprung och B är en
destination -
exempelvis Boylston Space Quad -
vad du ska få tillbaka inom några sekunder är en text
meddelande från Shuttle Pojke berätta exakt när
närmaste skyttlar är från den punkten A går till det
punkt B.
Och detta är en mer allmän exempel på vad som kallas
med hjälp av en API.
>> Så till exempel är det här bara shuttleboy.cs50.net, den
faktiska webbaserad inkarnation av detta.
Men de data som understryker detta och andra program som CS50
har utvecklat är alla utsatta för alla här i form
av API, programmeringsgränssnitt.
Och det är bara ett finare sätt att säga att folk gillar vi på
Internet och andra har tillbringat en tid att skapa
programvara som du kan använda för att ta uppgifter från oss och
sedan bygga egna applikationer ovanpå
detta datauppsättning.
Så till exempel, denna Shuttle Boy API sida här, som
råkar vara i CS50 manuell, huvudsakligen dokument
hur du kan gå om att be CS50 servrar för data.
Till exempel, om du är bekant med CSV-filer, komma
separerade värden, dessa är bara typ av snabb och smutsig
Excel-liknande filer.
Så du kan be Shuttle Boy för alla uppgifter om alla
hus och deras GPS-koordinater, och du får
tillbaka i huvudsak ett kalkylblad som det som
Du kan sedan läsa in ett program med din egen och sedan
generera resultat, som Shuttle Boy själv
råkar göra.
För de mer välkända, modernare datarepresentationer
omfatta JSON, JavaScript Object Notation.
Något kommer att återkomma till dig mot
slutet av terminen.
>> Men återigen, detta är bara ett av flera av CS50 egen API.
Och det spännande är nu i dessa dagar, Facebook och
Twitter och Google och ganska mycket varje populära hemsidan ut
Det har någon form av API, vilket innebär att om du läser
dokumentation på deras hemsida, registrera dig för en
konto kan du börja sedan skriva programvara ovanpå
de verktyg och data som företag där ger.
Och så en av våra egna pedagogiska medmänniskor ett par år tillbaka
skrev en Mac-version av detta.
Så på länken titeln Mac här uppe till vänster, kan du faktiskt
ladda ner en Mac OS widget som körs på din egen Mac att göra
samma typer av saker.
Så det handlar om att bygga på toppen av datamängder som dessa.
Men mer om det mot slutet av terminen.
>> Så låt oss dyka i riktigt snabbt en bugg, bara för att typ av få
Saker värmas upp idag, och tänker tillbaka på några av de
saker vi tittat på förra veckan.
I synnerhet vill jag gå vidare och dra upp, säg,
detta exempel här.
Buggy1.c är detta tillgängligt på kursens hemsida om du skulle
gillar att ladda ner den och rota runt dig själv.
Men låt oss zooma in på den här ganska kort program, och bara
en supersnabb resumé av några av de grundläggande byggstenarna som
vi verkligen kommer att bara börja ta för givet.
>> Så blå saker i linjer 1 till 9, är bara
softball frågor.
Så det är bara kommentarer.
De har ingen funktionell betydelse.
Men de är kommentarer i den meningen att de är noterar att
Jag, människan, gjorde till mig själv så att i föredrag och efter
föreläsning, jag minns faktiskt vad detta program
gör utan att behöva läsa igenom rad för rad och
återskapa historia i mitt sinne.
Dessutom, om jag överlämna detta program till någon annan som
dig är det mycket tydligare för dig, på grund av kommentarer som denna,
vad programmet egentligen gör, eller åtminstone vad
Programmet är tänkt att göra.
Oavsett om det är rätt är en annan sak helt och hållet.
Nu i C, med flera linjer kommentarer ihåg att på nätet
en här den magiska symbolen, / *.
Det betyder här kommer i början av en kommentar.
Och inget annat frågor tills du når slutet terminatorn,
som är * /, tvärtom.
Så det faktum att jag har 80-några udda stjärnor här från
vänster till höger är egentligen bara en estetisk detalj.
Det har ingen funktionell betydelse.
>> Nu sägs om linjen 11?
Vad gör detta i lekmannaspråk?
Vad är det?
PUBLIK: inkluderar standard.
David J. MALAN: OK, bra.
Så det ingår stdio.h biblioteket.
Så vad betyder det?
Tja, inuti den filen, stdio.h är ett helt gäng
funktionsdeklarationer -
det vill säga kod som någon annan skrivit.
Och ett perfekt exempel på en funktion som är deklarerade i
stdio.h är -
vilket favorit vid det här laget?
Så printf, en av de vanligaste använda, säkert
tidigt, från biblioteket är där.
Om jag utesluter att kodraden är klang kommer att skrika
på mig något om att använda en svart symbol.
Något odeklarerat är förmodligen nyckelordet, eftersom
vi har inte informerat kompilatorn vad printf ser
liknande om vi inkluderar den linjen.
Och mer jordnära, egentligen, vad den linjen säger är
öppna filen, stdio.h, var det är på servern
hårddisk eller apparatens hårddisk och kopiera-klistra in den
rätt där i min fil, utan min
behöva göra det manuellt.
>> Nu, när vi kommer ner hit till huvudgruppen, snart börjar vi
retas isär vad int och vad tomrum.
Men för nu, låt oss titta på de tre raderna
inom 15 till 17.
Detta här jag hävdar som buggy.
Linje 7 i mina kommentarer säger "ska skrivas ut 10
asterisker men inte. "Varför skriver ut inte i själva verket
10 sådana stjärnor?
PUBLIK: [OHÖRBAR].
David J. MALAN: Exakt.
Så märker att vi börjar räkna från 0.
Och det är faktiskt en konvention i programmering och
datavetenskap mer allmänt börjar räkna
från 0 istället för 1.
Och detta är verkligen bara härrör från det faktum att för
Exempelvis när vi hade åtta personer upp på scenen, då
ingen var att höja sin hand, var de
Alla effektivt nollor.
Och så är det bara typ av dator konvention så,
Därför, för att börja räkna från 0.
Om det är det lägsta antalet kan representera i binärt.
>> Så här har vi börjat initiera i till 0.
Vi har satt i lika med 0.
Men sedan jag gjorde detta misstag här, säger jag är mindre än eller
lika med 10.
Men om du tror att genom om jag börjar på 0 och sedan går jag
upp till 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, jag ska faktiskt
skriva ut 11 stjärnor till skärmen, för jag har gått upp
till och lika med 10.
Så enkel fix här är vad?
PUBLIK: [OHÖRBAR].
David J. MALAN: Bara ändra till mindre än.
Om du verkligen vill, kan du göra det här.
Men i allmänhet, det är ogillat.
Och så börjar räkna från 0 är bara något du bör
vanligtvis vänja sig.
Nu, vad om hela konstruktion i sig?
Denna linje 15 demarks en for-slinga.
Så för är inte en funktion.
Det är bara ett uttalande.
Det är en looping konstruktion, som vi såg i Scratch.
Och den har tre delar.
Observera att det är den första delen som
vänster om semikolon.
Det är den mellersta delen mellan de två semikolon.
Och sedan finns det högra delen åt höger
av den andra semikolon.
Nu gör den första av dessa vad?
PUBLIK: [OHÖRBAR].
David J. MALAN: Tillbaka där?
Ja?
Publiken: Initiering.
>> David J. MALAN: Initiering.
Så vad betyder det?
Vi har deklarerat en variabel som heter jag.
Det är av typen int, för jag har angett int i.
Och jag initialiseras i till värdet 0.
Så vad är detta talesätt egentligen?
Det är ett effektivt sätt att säga till datorn Ge mig nog
minne, tillräckligt med RAM för att passa ett nummer och sedan lägga
nummer 0 i den bit av RAM.
Och som en sidoreplik, hur stor är en int typiskt, åtminstone inom
av apparaten?
Publiken: 32 bitar.
David J. MALAN: 32 bitar.
Så det betyder att ge mig 32 bitar, annars känd som 4 byte,
och sätta värdet 0 i den, vilket är ganska lätt eftersom
det betyder bara satt alla bitar till 0.
>> Så nu är den andra delen här tillståndet.
Och villkoret, som namnet antyder, är vad som kontrolleras
igen och igen och igen om huruvida det är sant eller falskt.
Så detta är bara säga göra följande kodrader -
nämligen linjen 16, eftersom det är den enda indragen
under -
så länge som i är mindre än 10.
Och efter varje iteration genom denna slinga, gör
inkrementering, som i detta fall är i + +.
Nu behöver det inte vara i + +.
Det kan vara i. -.
Men om jag gjorde det, vad beteendet går
vara i detta program?
PUBLIK: Det kommer att bli en oändlig slinga.
David J. MALAN: Det kommer att bli någon form av oändlig slinga,
om vi har tur efter negativ 2 miljarder eller så.
Kanske saker kommer linda runt, precis som på grund av den ändliga
antalet bitar som vi har tilldelats för en int.
Men det är verkligen kommer att iterera långt mer än 10 och
säkert mer än 11 ​​gånger här.
>> Och nu, precis som en parentes, inser att jag + + och i -
är egentligen bara syntaktisk socker.
Det är bara förkortning för vad som är lite mer
uttryckligen skrivs enligt följande:
i = i + 1.
Som är identisk med I + +.
Det bara slags ser snyggare säga att jag + +.
Det är mer kortfattad, mer lättläst.
Och så de flesta människor gör det i stället.
Men detta är identisk funktionellt
vad vi just såg.
Så kort sagt, är det snabb lösning här bara säga iterera jag
från 0 ända upp till mindre än 10.
Och sedan ska vi verkligen få 10 stjärnor.
>> Så låt oss prova det här.
Låt mig öppnar terminalen nedtill.
Låt mig gå in i katalogen som är i.
Och jag kommer att sammanställa det manuellt med klang för nu.
Och jag kommer att sammanställa detta som buggy1.c, Enter.
Och nu buggy1, varför finns det ingen sådan fil eller katalog
heter buggy1?
PUBLIK: [OHÖRBAR].
David J. MALAN: Ja.
Så det är faktiskt kallas a.out.
Så minns om du bara kör klang, där klang är
kompilator, och du inte anger det namn du vill
ge ditt program, det kommer att standardinställningen a.out.
Så ja, om jag gör ls -
oops.
Och jag didn't - den svart-vita frågan några
Ni möter har fastställts.
Men låt mig göra det här.
Där har vi a.out till vänster där.
Så vi måste köra a.out istället för buggy1.
>> Så låt mig gå vidare och göra det.
. / A.out, Enter.
Och jag uppenbarligen inte gör vad?
Publiken: Spara.
David J. MALAN: Spara min fil.
Så det är lätt att lösa genom att slå Ctrl S eller gå till
Arkiv, Spara, liksom i de flesta program.
Låt mig gå ner hit, rensa skärmen, köra den igen.
Och det finns fortfarande en bugg.
Så vad som händer -
Målgrupp: Du har inte kompilera.
David J. MALAN: Ah, bra.
Jag har inte kompilera det.
Som en idiot, jag tittar på koden för att se vad som är fel.
Så klang buggy1.c nu a.out.
Och Puh, räddade.
>> Så det ser lite ful eftersom det inte finns någon ny linje
helst i programmet.
Men återigen, det är bara en estetisk detalj.
Och åtminstone om vi räknar de ut, bör vi
nu se 10 sådana stjärnor.
Nå, hur är det med denna andra uppvärmning exempel?
Så buggy2 hävdar jag att denna version kommer också att skrivas ut
10 stjärnor, en per rad.
Så den här gången har jag en radmatningstecken, bara för att
saker lite snyggare.
Men istället vad jag får är det.
Så låt mig göra klang buggy2.c, Enter.
Nu är det åter kallas a.out.
Enter.
Jag ser bara en ny rad, bara det allra sista nya linje som
flyttar min uppmaning till nästa rad.
Och ändå klart jag har utskrift *, sedan en ny linje,
*, Sedan en ny rad.
Men vad är felet här?
Ja?
PUBLIK: [OHÖRBAR].
>> David J. MALAN: Exakt.
Så till skillnad från vissa språk, t.ex. Python, där indrag
faktiskt har funktionell betydelse, i ett
språk som C -
som vi ser, PHP, Javascript -
fördjupningen är egentligen bara för människans nytta.
Så det faktum att jag har indragen rad 16 och 17 ser bra ut,
men det har ingen funktionell betydelse här.
Om jag vill båda linjerna att utföra som en del av för
slinga, så måste jag bifoga dem i klammerparenteser genom att göra detta.
Du kan bara klippa det hörnet och utelämna klammerparenteser om
vad är fallet?
PUBLIK: Bara en rad.
David J. MALAN: Bara en rad.
Så det är bara typ av en trevlig sorts syntax detalj så att
du slösar inte tid på att skriva tre rader, två av dessa är
klammerparenteser, bara för att skriva en enda rad kod.
Men om du har två eller flera linjer, vi
verkligen behöver göra detta.
>> Så nu låt mig spara den här.
Låt mig gå vidare och köra klang.
Låt mig köra a.out och nu får jag dem en per rad.
Nu är a.out återigen slags dum namn för ett program.
Hur vet jag klang att faktiskt ge mig ett filnamn
det är mer användarvänligt, liksom buggy2 själv?
Lite tydligare?
PUBLIK: [OHÖRBAR].
David J. MALAN: OK, så jag kan faktiskt ta mycket
användarvänliga genväg och bara skriva att buggy2.
Jag inte anger. C. i detta fall, och tryck på Retur.
Och vad gör gör det sammanställer buggy2.c för mig av
be klang att göra det.
Specifikt kallar det klang, kör det klang med mycket mer
kommandoradsargument eller växlar än jag faktiskt behöver.
Med tiden kommer vi att komma tillbaka till vad alla dessa olika
kryptiska bindestreck uttryck betyder.
Men för tillfället är att rädda mig bara besväret att
behöva komma ihåg och med skriva ut alla dessa
olika bindestreck uttryck.
Och uppåtsidan av det är ytterst
att nu har jag buggy2.
Om jag vill göra detta manuellt, men jag
kan istället göra detta -
klang-o buggy2 och buggy2.c.
Och det kommer liknande ge mig en fil som heter buggy2.
>> Så kort sagt, är klang kompilatorn.
Gör bara ett användarvänligt verktyg som vi kommer att använda mer
och mer, eftersom det börjar bara
förenkla saker för oss.
Och vi återvänder 0 slutligen.
För nu, bara för att, men vi börjar reta den del
idag och på onsdag.
Eventuella frågor om något av detta?
Ja?
PUBLIK: [OHÖRBAR]
Är i citat där?
David J. MALAN: OK.
När jag skrev ls i citat, som jag gör några magiska
bakom kulisserna för att fixa en bugg.
Jag glömde, som vi har talat många av er på
diskussionsforum, att göra -
Vi ska göra det här nu - sudo yum-y update appliance50.
Hoppsan, det som är stavat rätt.
Så apparaten är som ett operativsystem.
Det kör denna operativsystem kallat Fedora.
Och nu på grund av min långsam Internetanslutning, jag har
verkligen spolas det.
Så kör sudo yum update, som vi säger att du ska göra i
problembild, är som i huvudsak kör automatiska uppdateringar
i Mac OS eller Windows.
Och anledningen till att köra detta i början av
problem är att när vi skapade apparaten, jag
trasslat till, och jag av misstag gjort alla dina program ser
svart på en svart skärm, vilket är varför du inte ser dem
som standard.
Men den senaste versionen av apparaten fixar detta.
Och jag ska fixa det under paus när jag har Internet
anslutning.
>> Så citat döljer bara min misstag, mycket diskret,
tydligen.
Övriga frågor?
Ja?
PUBLIK: Var gör ifrån?
[OHÖRBAR]
David J. MALAN: Bra fråga.
Var gör ifrån?
Det är ett Linux-program som har funnits i många år, långt
före CS50.
Och det kommer med ett operativsystem som Fedora.
Den kommer inte från CS50 biblioteket.
I själva verket det enda som kommer från CS50 biblioteket
hittills, att vi har sett, är GetString, getInt, alla
de Få funktioner, och ordet strängen, och i viss
utsträckning, ordet BOOL.
Men vi reta att förutom när vi dyka in i CS50
själva apparaten.
>> Så ja, en ytterligare fråga här.
PUBLIK: När du sa ringa och sedan buggig, hur
Datorn känner [OHÖRBAR]?
David J. MALAN: Bra fråga.
Så när du bara kör make buggy1 eller göra buggy2, hur
gör det?
Så som standard, om du skriver göra buggy1, göra letar efter en
fil som heter buggy1.c.
Och då kör rätt klang kommandon,
vilket åsidosätter filen förvalda heter a.out.
Faktum är att om vi tittar på vad som gör, vad -
låt oss avsluta det här.
Om vi ​​tittar på vad som gör faktiskt gör, gör buggy2,
det är redan aktuell.
Så låt mig ta bort rm kommandot,
program jag skrev innan.
Skriva Y-E-S för att bekräfta att jag vill ta bort den.
Om jag nu gör göra, märker att i denna mycket lång rad,
Det är detta sista här,-o buggy2.
Alla gör gör passerar detta argument så att säga, att
Klang, så att jag inte behöver skriva det själv.
>> Okej, så en snabb par administrativa
meddelanden.
Så för sektioner, började som officiellt denna kommande
Söndag, du vill alltid ta, om
du har en, en bärbar dator.
Om du inte har en bärbar dator, når ut till mig av
släppa mig ett mail.
Och vi kommer räkna ut ett arbetsflöde.
Vad som allmänt du hittar i avsnittet är att de är en del
begreppsmässig, del praktisk.
Vi kommer särskilt att använda den del av frågor, en del av
veckans problembild, att gå igenom några av de
konceptuella material från föreläsning.
Och det är alla i det aktuella problemet set.
Och vi kommer också dyka in några praktiska aktiviteter, ibland
av dem kommer att krävas in, ibland i
som inte kommer.
Till exempel den här första veckan, de är tänkt bara som en
uppvärmning övning.
Och du kommer att upptäcka att dessa problem är egentligen bara det.
De är avsedda att vara ganska liten, men inte nödvändigtvis
triviala program för att skriva, som inte nödvändigtvis
spännande i sig, men finns goda möjligheter att
öva med syntax, med nya funktioner, hemma i en
där du har några av dina klasskamrater närvarande som
samt din TF.
>> Och vad vi ska göra under tiden är att använda ett verktyg som heter CS50 utrymmen,
varigenom istället för att bara använda CS50 Appliance, du kommer
istället gå till en webbsida i en webbläsare, där du kommer att kunna
att skriva kod i ett webbläsarfönster under sektion.
Och sedan om du väljer in kan din undervisning karl visar sedan
vad det är du skriver på skärmen i din webbläsare
fönster upp på framsidan av klassen, oavsett anonymt eller
offentligt, så att han eller hon kan sedan gå igenom med
dina klasskamrater vad du gjorde bra, vad du inte gjorde bra.
Och återigen, försäkrade vila allt detta fint kan anonymiseras.
Men det blir en fin möjlighet för mycket mer
interaktivitet än något liknande föreläsning tillåter.
>> Under tiden kommer vi att ha dessa saker som kallas super
sektioner, som är frivillig, men är öppna för alla i
klassen, så att du kan göra detta mer kollektivt för
Problemet som en.
Här är schemat.
Detta är också publiceras på hemsidan cs50.net.
Observera att det blir en hacker-specifik
en morgon eftermiddag.
Och vi kommer att filma en dag och en i morgon och lägga dem
nätet inom 24 timmar.
Så om du inte kan göra något av dessa tillfällen, inte oroa dig.
Och återigen är schemat på nätet nu på cs50.net.
>> När det gäller sektionering själv, bör du ha fått en
e-post som uppmanar dig att gå till kursens hemsida för att hitta
ut din avdelning.
Om livet har förändrats och du behöver ändra din sektion,
inte ett problem.
Gå tillbaka till samma webbadress, cs50.net/section, singularis,
och du fylla i liknande form så att du kan
sedan ge oss dina preferenser.
Och vi kommer att följa upp med veckans slut vad vi kan
rymma.
Förra veckan, påminna om att vi föreslog med CS50 diskutera,
kursens diskussion verktyg i föreläsning.
Så vi hade 40 frågor som ställdes och
besvaras under föreläsningen.
Så det verkade fungera bra, så vi kommer att fortsätta
försöker göra det.
Om det under föreläsning, behöver du inte bara känner dig bekväm höjning
din hand, inte ett problem.
Gå till cs50.net/discuss, posta där, och en av vår undervisning
stipendiaterna antingen svara elektroniskt eller höja sin
handen för din räkning anonymt fråga, beroende
på vilken typ av fråga.
Och i termer av återkoppling, kommer i allmänhet att vara psets
tillbaka inom en vecka.
Eftersom det tar en liten stund för avsnitt för att uppnå
jämvikt, kommer den första pset, 0 och 1, vara lite
försenas saker bosätta sig.
Men håll ögonen öppna för att de kommande veckorna.
>> Okej, så låt mig sätta på min allvarliga
röst för ett ögonblick.
Så detta är faktiskt en intressant klimat som
denna diskussion, vad med alla de andra saker
pågår på campus relaterade därtill.
Men CS50 har verkligen haft sin historia denna
ämne, i så mycket som varje år, den här kursen, för många
år, Ad-styrelserna ungefär 3% av klassen.
Detta det senaste året, 2011, CS50 Ad-Boarded 35 studenter.
Detta är inte, tror jag, på grund av bristande tydlighet.
Inser att i kursens kursplan, finns en sida av
redogörelse där linjerna är.
Samma uttalande upprepas på var och en av de
Problemet sätter på sidan ett.
>> Så jag nämner detta i dag egentligen bara att göra
folk uppmärksamma på detta.
Och vi har provat olika saker.
Och vad jag trodde att vi skulle göra idag är att ta bara ett ögonblick att
faktiskt titta på några av tidigare fall som har kommit upp.
Hellre än att hålla dessa så smutsiga små hemligheter, faktiskt
peka på vad eleverna har gjort och hur vi har upptäckt
den och verkligen vad den övergripande motivationen är för
även med det här samtalet.
Så med det sagt, är den linje i huvudsak detta -
per kursplanen, du välkommen, du uppmuntras att
prata med klasskamrater.
Det är hela syftet med att ha dessa samarbetsprojekt
kontorstid i Annenberg och uppmuntra människor för
slutprojekt att arbeta tillsammans.
Men linje dras när det blir dags att faktiskt skriva
din slutliga lösning.
Talar engelska, helt bra, talade i pseudokod,
helt bra.
E-posta en klasskamrat din pset, låta dem se över
skärmen som händer fortsätta skriva,
över linjen också.
Ser till kursplanen för de särskilda linjerna.
>> Men bara för att måla en bild av hur det är tyvärr en
verkligheten, inse att det finns webbplatser där ute som
har lösningar från denna klass och många andra klasser.
Det faktum att du eller någon 3% av er vet att det finns
innebär att vi vet att detta existerar.
Det faktum att det finns webbplatser som denna där du
kan betala någon för att faktiskt göra dina problemområden uppsättningar - detta var
ett verkligt fall som kom upp förra året.
Detta är en hemsida som heter odesk.com.
Och Tim var namnet på den person här som var utstationering på
denna webbplats och frågade någon att göra sin pset 7 i
detta fall.
Tja, är odesk.com mycket Google-stånd, och även vi är
mycket bra på att googla.
Även här finns det platser - och detta en är ganska
avskyvärda, uppriktigt sagt.
[Skratt]
David J. MALAN: Det roliga här webbplatsen är om
man läser om sidan talar de om deras företags
kultur och hur kundservice är deras nummer ett
prioritet att se till att dina uppdrag får
vände i tid.
>> Men på fullt allvar, igen, det faktum att dessa platser
finns inser vi också är medvetna om
dessa typer av platser.
Och för att ge dig en känsla för vad som utgör detta i allmänhet
tar, vi vanligtvis inte har stora skandaler där människor
samarbetar på alla typer av massiv skala, utan snarare
Det är dessa sena stunder av svaghet, där du har så
mycket att göra, det är 4:00, du utmattad och du
tror på dig själv, ja, låt mig bara ta en titt på min
rumskompis eller min vän kod eller liknande.
Och manifestationer av detta innebär tyvärr Student
Ett lämnar något sådant och Student B inlämnande
något sådant, som verkligen, i en dator
vetenskap klass, är förvånansvärt lätt för datavetare
att detektera med programvara.
Detta är en annan vanlig paradigm, där du har typ av
arbetat vid sidan av någon, kanske talar i
Engelska, bara bra, pseudokod.
Men sedan det blir dags att faktiskt lämna och psets
bara få utbyts via e-post eller Dropbox eller liknande.
Men i ett försök att göra det mindre uppenbart att detta är
vad som hänt, så är det som lämnas in.
Även detta inte resa upp välskrivna bitar av
programvara som vi måste faktiskt upptäcka
dessa typer av saker.
Och faktiskt det vi gör är köra programvara som jämför alla
årets bidrag mot alla tidigare år
inlagor, mot allt vi finns på
Internet mot varje jobb webbplats där ute.
Det är alla mycket automatiserad.
Och så gör vi det verkligen bra rättvisans namn till 97% som
verkligen arbetar häcken av sig i detta och i andra
klasser och sätta i allt det arbete, så att arbetet
de lämnar in slutändan är deras eget.
Och jag kan gå på för åldrar.
>> Dessa är bara en handfull av förra årets fall.
Några elever lämnade dessa filer på samma sätt för pset 2,
pset 3, 4 pset, 5 pset, 6 pset, pset 9.
I detta fall var det frågesport 0 och i fjol, där två
eleverna lämnade identiskt denna mening bland många
andra "Begäran av typ -" punkt, punkt, punkt.
Så även i en klass för 600 har vi upptäcker detta
på in frågesporter.
Så kort sagt, detta - ärligt talat, jag hatar att ha denna typ av
konversation - men detta är verkligen en medveten ansträngning
i år för att försöka pressa ner det numret.
För även om vi säger sådana här saker varje
år, jag tror verkligheten för att ha uppehöll på den för ett par
fler sekunder än vanligt och faktiskt bara påpeka
att det kan tyckas, va inte så stor roll, åtminstone
tänker tillbaka på detta ögonblick, både i rättvisans namn till
dig själv och dina klasskamrater här.
Så om du har någonsin några frågor om var linjen
är snälla, bara nå ut till mig personligen.
Men svaret är alltid helt betonade vid
sista minuten, kontanter i en sen dag.
Eller om det är en fråga om att inte ha några sena dagar,
ärligt, maila mig personligen.
Vi kommer pĺ nĺgot.
Vänligen inte sätta din tid här på Harvard i riskzonen.
>> Nu tänkte jag att vi skulle lätta upp stämningen, så jag
ingår detta som nästa bild.
[Skratt]
David J. MALAN: Denna webbplats var stor.
Jag fick faktiskt lite distraherad.
Det är den här.
Och så här var fantastisk.
Okej, så tänk på att kattungen sent på natten när du gör
dessa beslut.
Okej, så tillbaka till roligare och mindre allvarlig saker, som
förhållanden.
>> Okej, så vi pratade kortfattat om dessa.
Detta är något som är nog ganska bekant från
värld Scratch.
Och i en värld av Scratch har vi detta behov ibland
gå att gafflarna i vägen.
Antingen göra det eller det eller det andra sak här.
Och när vi vill göra detta kan vi använda i C nu, detta om
annars konstruera.
Och så här har vi booleska uttryck.
Till exempel booleska uttryck här kan vi eller
dem tillsammans, i den meningen att vi har detta villkor ELLER
detta villkor.
Vi kan och dem tillsammans, i den meningen att vi vill
kontrollera detta villkor och detta villkor.
Och här har vi en switch-sats nu, vilket inte är så
liknande syntaktiskt till dessa typer av villkor, men det
tillåter oss att göra motsvarande om else if, annars om, annars
om, och liknande genom att helt enkelt räkna dem från fall till fall
från fall till fall till fall.
Så vi såg dem förra gången.
Och då började vi röra på saker som slingor.
Vi såg en av dessa nyss.
Men det är dessa andra looping konstruktioner.
>> Till exempel den här här.
Så medan (villkor), gör det här och om igen.
Så i grunden verkar det som att vara olika mellan detta
för slinga och detta samtidigt slinga här?
Detta för slinga och detta samtidigt slinga.
Ja?
Vad är det?
PUBLIK: [OHÖRBAR].
David J. MALAN: Bra.
Så medan for-slingan tillstånd, det finns helt klart
mer syntax.
Det är detta initiering, det finns den här uppdateringen.
I en while-slinga, det finns bara detta villkor.
Så det verkar som det är lite avskalad jämfört med för
slinga, vilket innebär om vi vill ha variabler och vi vill
att ha inkrementering har vi faktiskt
göra det här själva.
>> Så låt mig gå vidare och öppna upp gedit.
Låt mig övergå till apparaten.
Och låt oss göra bara en snabb liten exempel som
skiljer ett av dessa från andra.
Och i bakhuvudet här skulle jag säga en sak.
Jag nämnde specifikt namn Tim.
Tim var faktiskt någon som en student försökt hitta göra
sina läxor för dem.
Vi hade ingen Tim i just den delen.
Så inser, så att jag beskriver en elev, det var inte en student.
Det var en slumpmässig person på Internet att göra saker
genom ombud förra året.
Så finner vi det också.
Så i detta fall här, låt mig gå vidare och
öppna upp en ny fil.
Arkiv, Nytt.
Det ger mig en flik här.
Låt mig gå vidare och spara det som loop.c.
Låt mig gå och klicka på Spara.
Och sedan ner hit, låt oss gå vidare och börja skriva
# Include .
Låt mig zooma in
Nu ska vi göra int main (void).
Låt mig gå vidare och göra for (int i = 0; I <
åh, 10, i + +).
Och nu ska jag gå vidare och göra ut stjärnan som jag
gjorde tidigare.
Och sedan i slutet av detta program kommer vi bara att
skriva ut en ny linje, bara så att min snabba
ser inte alla rörigt.
tillbaka 0.
Verkar syntaktiskt korrekt?
Hittills.
Så låt oss se.
>> Så låt mig zooma ut, gå in i min terminalfönster.
Och låt mig gå vidare och köra slinga, eftersom jag kallade detta
sak loop.c.
Så gör loop.
Verkar kompilera på OK.
Låt mig köra slinga, och nu på Enter.
Och det verkar ha tryckt 10 stjärnor.
Så låt oss bara konvertera detta till en while-slinga och se vad
typer av frågor som vi snubbla över.
Så i stället för denna, låt mig gå in här och säga när jag är
mindre än 10 -
Låt mig bli av med for-slingan.
OK, så vi har ett par problem redan.
Så tillståndet är densamma, men jag uppenbarligen saknas
initiering.
Jag saknar inkrementering.
Så vad ska kompilatorn säger sannolikt mig när jag försöker
sammanställa detta program?
Ja?
PUBLIK: [OHÖRBAR].
>> David J. MALAN: Bra.
Så det kommer att säga något i stil svart - i detta
fall, variabel jag.
Och faktiskt, användning av svart identifierare i..
Och så detta är i kontrast med språk som PHP och
Python och Ruby, som några av er kanske känner,
där du kan bara typ av start med hjälp av variabler
mot sin vilja och inte behöver oroa sig för att förklara dem
explicit alltid.
I C och i språk som Java och C + +, måste du vara
Super explicit.
Och om du vill ha en variabel som heter jag, måste du berätta för mig
vilken typ av variabel det är.
Så vi kommer att behöva för att fixa detta på följande sätt.
Jag kommer att behöva gå upp här och skriver int i, därför
Jag har förklarat en variabel som heter jag.
Nu har jag hoppade ett steg.
Jag har naturligtvis inte initierats, men låt oss se om det vid
Minst fabrikat klang sluta klaga.
Så låt mig göra om detta program.
>> Okej, nu är det bara klaga
av ett annat skäl.
"Variabel" i "oinitierad när de används här." Okej, så
det är ganska tydligt.
Initierat betyder bara ställa in den lika med ett värde.
Och vi har inte gjort det, så låt mig försöka lika med 0.
Nu ska vi prova det här igen och köra klang.
Sammanställt denna gång.
Och jag är på väg att köra den.
Men stora gamla oändlig slinga, eftersom jag har gjort
initiering, jag har gjort tillståndet, men jag har aldrig gjort
någon form av inkrementering.
Så hur kan jag göra inkrementering?
Tja, i en while-slinga, det känns som jag ska ha
att göra det insidan av slingan, eftersom mycket som den första
veckans exempel på att göra looping konstruktioner, som med
strumpor och med själv-räkning, hade vi att göra
något i slutet, vilja gå tillbaka till nästa rad.
Vad händer om jag gå vidare och göra det jag + + här?
Låt oss inte ens sammanställa denna.
Fånga mig redan.
Vad är det för fel här?
PUBLIK: [OHÖRBAR].
>> David J. MALAN: Så det är definitivt inte int.
Det är jag.
Och klammerparenteser, som tidigare,
indrag räcker inte.
Så nu har jag bygga detta.
Så medan jag är mindre än 10, ut en stjärna,
sedan öka i..
Och hur en while-slinga fungerar är att så fort du träffar
botten av slingan, som i detta fall ser ut som linje 10,
det kommer att gå tillbaka till linje 6, vid vilken punkt
villkor kommer att kontrolleras på nytt.
Och om jag fortfarande är mindre än 10, ska vi göra linjerna 8 och
då 9, då vi kommer hit 10, och gå tillbaka till 6, igen och
igen och igen och igen, så länge som i är mindre än 10.
Så låt oss köra göra här.
>> Okej, vi har sammanställt okej.
Låt mig repris slinga.
Och nu verkar det faktiskt fungera.
Så plus och minus här?
Tja, så länge det finns faktiskt inte en helhet PLO -
så söt.
Okej, det var en - ah, det var en olycka.
Okej, så låt oss gå tillbaka till for-slingan.
Så för slingor är trevligt eftersom de är super tydlig.
Och trots att de är lite otymplig att skriva, det är
mycket kraftfull och det tillåter dig att göra
flera saker samtidigt.
Medan slingor verkar inte ha en stor mängd av värde bara
ännu, eftersom det känns som om vi bara måste göra mer arbete.
Vi måste sätta initieringen upp här,
uppdatera här nere, och vi måste komma ihåg att göra allt detta.
Så vi får se med tiden att medan slingor faktiskt låna
sig bara olika sammanhang, olika data
strukturer som listor och hashtabeller, saker vi kommer till
mitten termin.
Men nu, vet att det finns denna tredje typ som kallas en gör-
while-slinga.
Och vi har sett detta kort.
Och detta kan vara super bra med pset 1.
Varje gång du vill göra något och sedan kontrollera om
användaren samarbetade, och om de inte gjorde det, göra det igen, en gör-
medan slingan lämpar sig för denna typ av logik.
För som beställning från toppen till botten här antyder,
gör bokstavligen betyder gör detta.
Och göra det om och om igen, vad kan det vara?
Kanske det betyder att ringa getInt eller GetString och sedan
kontrollera värdet av getInt eller GetString och sedan skrika
på användaren om de inte har samarbetat genom att be dem
igen och igen och igen.
Där du vill göra något en gång,
kontrollera sedan något villkor.
>> Så låt oss prova det här.
Låt mig faktiskt ändra detta nu till en gör-while-slinga.
Och jag kommer att gå vidare och gör följande.
Så gör följande.
Låt oss göra int i = getInt (), men låt oss först tala om för användaren
vad de ska göra.
Så lite annorlunda den här gången.
"Ge mig en int".
Så jag kommer att använda printf för det.
Och nu ska jag gå ner här, och jag kommer att göra detta
medan jag är, låt oss säga, mer än -
låt oss se, är jag, låt oss säga, mindre än 0, eller i är
större än 10.
Med andra ord, jag vill ha en siffra från 1 till 9 bara
godtyckligt.
Så jag använder en kombinerad booleskt uttryck här
se till att i är mindre än 0 eller större än 10, i vilken
fall jag kommer att göra denna slinga här igen.
Så återigen, gör detta -
medan i är mindre än 0 eller i är större än 10.
>> Så låt oss nu gå vidare och göra det när vi har gjort det.
Låt oss bara göra en snabb sanity check.
printf ("Tack, är jag% d", i).
Så denna enkla programmet frågar användaren för en int,
gör att det är inom vissa intervall, 1 och 9,
och sedan tackar användaren genom att påminna dem vad de bara
skrivs in, precis som en liten sanity check.
Men låt oss se om detta fungerar som det är tänkt.
Låt mig gå head hit och köra göra slinga.
Hmm.
"Användning av odeklarerat identifierare" i "". Det är konstigt.
Jag trodde att vi löst det.
Samma symptom men olika kod.
Ja?
PUBLIK: [OHÖRBAR] inuti två, vi måste
[OHÖRBAR].
>> David J. MALAN: Exakt.
Så detta leder oss faktiskt till ett ämne som kallas omfattning.
Det visar sig att C, återigen, det verkligen tar du bokstavligen.
Och om du gör något liknande där du deklarerar en int
och tilldela den ett visst värde, men du gör det inne i en
par klammerparenteser, vad C gör det förutsätter att du
bara vill de 32 bitar som kallas jag att existera inom
samband med dessa klammerparenteser, inom ramen för linjer
6 till 9. Så jag deklareras, och det är tilldelad en
värde i linje 8, men så snart du får utanför
linje 9 under klammerparentes är jag inte längre i
omfattning, så att säga.
S-C-O-P-E. Det är inte längre i rätt sammanhang.
Så nu finns det ingen i, så det är som om vi hade inte ens
förklarade det alls.
>> Så vad är en fix sedan för något sådant, om
Anledningen är att jag har avgetts inom klammerparenteser, som
är tydligen dåligt?
Här?
PUBLIK: [OHÖRBAR].
David J. MALAN: Ja.
Så vi kan initiera det utanför.
Så låt mig gå vidare och ta bort förklaringen delar varigenom
Jag anger vilken typ, och låt mig göra det här.
Så i linje 5, står det nu "Ge mig en int." Kalla det jag.
Kallelse i linje 9, jag vill inte göra det här, eftersom jag
redan har de 32 bitarna.
Jag vill inte be datorn för en
olika 32 bitar.
Jag vill använda samma 32 bitar.
Och nu eftersom jag är deklarerad på rad 5, det är fortfarande legit
att använda den i ledningen 11 och ledningen 12.
>> Så låt mig försöka kompilera detta och se
Om klang slutar skrika.
göra slinga.
Så nu är det "implicit deklaration av funktionen
"GetInt" är ogiltigt i C99. "Vad är det?
Ja?
PUBLIK: [OHÖRBAR].
David J. MALAN: Ja.
Så nu att jag faktiskt är med getInt, är detta inte något
som kommer bara med C. Detta kommer från CS50.
Så vi behöver det här.
Och låt mig gå tillbaka till prompten ner
här och köra göra.
Okej, äntligen.
Nu har vi löst det och det andra felet.
Låt mig nu kör slingan och se vad som händer.
"Ge mig en int." Jag ska ge det 11.
Jag ska ge det -1.
Jag ska ge det foo.
Jag ska ge det 5.
Och nu fungerar faktiskt.
Men prompten ändras för en anledning här.
Varför stod det försök en av dessa gånger men ge mig en
int de övriga tre gånger?
Varför är det beteende annorlunda?
PUBLIK: Gav det en sträng.
David J. MALAN: Ursäkta?
Målgrupp: Du gav det en sträng.
David J. MALAN: Ja.
Så vi gav det en sträng i tredje försöket,
när jag skrev foo.
Foo är en sträng.
Det är naturligtvis inte en int.
Och sättet att CS50 har genomfört getInt är att vi
kollar inte om något är mindre än 0 eller större än 10
för er, för hur vet vi i förväg vilken typ av
int du vill ha?
Men vi kan minimalt kontrollera dig, gjorde användaren åtminstone
Skriv ett heltal?
Och om de inte gjorde det, skrika vi på användaren genom att skriva "retry" på
skärmen.
>> Så nu har vi ett program som är looping. Okej.
Nu är vilka av dessa slags bättre konstruktionen?
Så det är här det börjar bli lite rörigt, det
faktum att du måste komma ihåg att deklarera en variabel upp här
Om du vill använda den i vissa
klammerparenteser och utanför.
Men även om det ser lite kryptiskt vid första
blick, bara en gång, kom ihåg den enkla logik.
För att kunna använda något i C, om det är en funktion eller
Det är en variabel, måste du inkludera den om det är en funktion
i någon bibliotek, eller om du behöver förklara den.
Men nu måste du vara extra uppmärksam på det faktum att
du förklara det på rätt omfattning.
Du är inte att sätta det för hårt inuti parenteser.
>> Så låt mig faktiskt rulla tillbaka.
Om vi ​​går tillbaka till vår exempel från tidigare, och jag går
tillbaka till för int, int i = 0; i <10, i + +, och jag
göra printf stjärnor, så här, och stäng sedan Paren, och nu
printf i är nu -
enligt samma logik, vad kommer att hända när jag försöker
sammanställa detta program?
Publiken: Ogiltig identifierare.
David J. MALAN: Så det är en annan ogiltig identifierare,
odeklarerat identifierare.
Nu är anledningen lite annorlunda.
Det finns uppenbarligen ingen klammerparenteser här, men samma
idé, gäller samma historia omfattning.
Om du har deklarerat en variabel som jag inne i en
for-slingan, även om du inte uttryckligen skrivit lockigt
hängslen, tänk på dem mentalt fortfarande är där, där
fall jag är endast giltig inuti for-slingan.
Det är inte giltigt när du kommer till nästa rad, som i
detta fall är nu 10.
Så några frågor om omfattning och liknande.
Okej, några frågor?
>> Okej, så detta är typ av en trivial litet program,
skriva bara små stjärnor.
Men låt oss se om du kommer ihåg den här låten här.
Detta är en otroligt irriterande låt barnen skulle sjunga på
skolbussen och liknande.
Men vad är trevligt om det är att det har denna Konjunkturberoende,
varigenom det är "99 flaskor öl på väggen,
99 flaskor öl.
Ta en ner, passera runt, 98 flaskor öl på
vägg. "Och sedan sången upprepar 97, sedan 96, sedan
95, därefter 94, hela vägen ner till 0 om du verkligen fick det
långt på bussen.
Så detta är ett trevligt program för att sortera om redskapet, eftersom min
Gud, om du bara kunde genomföra detta med några
rader kod, kan du spotta ut hela texterna till denna
låt ganska snabbt.
Men längs vägen, kan vi börja nu retas isär några
av dessa grundläggande looping konstruktioner och nu även
införa funktioner som vi skriver själva, returnera värden
vi passerar runt.
Men först, varför inte vi gå vidare och ta våra fem minuter
bryta här?
Och när vi kommer tillbaka, kommer vi sjunga den här låten.
>> Okej, så vi är tillbaka.
Och när jag säger att vi nu kommer att sjunga den här låten, jag menar
programmatiskt, inte verbalt.
Så här har vi beer1.c, vilket är en implementering av detta
viss låt.
Och bara för att vara tydlig, för dem obekanta med vad
denna sak ser ut, låt mig gå vidare
och göra beer1, Enter.
Låt mig springa beer1, och vad vi får se - hur många flaskor
öl blir det?
Jag skriver under 99, liksom sången säger.
Enter.
Och nu när vi bläddrar igenom -
oops - om vi bläddrar igenom allt detta kommer vi se att
detta har faktiskt sjunga hela låten.
Vänta lite.
Min rullningslisten är lite trasslat till.
Låt oss använda större fönstret.
Så beer1, 99, där vi går.
Så här har vi hela låten, sjungit mycket snabbare med
dator än den kunde ha varit av oss.
Så märker dock den cykliska naturen här.
Det säger 99, sedan 99, sedan "ta en ner, passera den
runt "och sedan 98.
Och nu upprepar om och om igen.
>> Så detta är faktiskt ett perfekt tillfälle för någon form av
looping konstruera.
Observera att jag är typ att skära ett hörn här.
Observera att jag säger "98 flaskor öl på väggen,
97 flaskor öl på väggen, "och det var bara så
att när vi kommer till en flaskor öl, jag har inte
att oroa sig för engelsk grammatik.
Men vi kan också fixa detta med en liten bit av en om
tillstånd, kanske.
Om detta antal är singularis, gå vidare och säga "flaska",
annars om det är plural, säger "flaskor".
Men för nu, jag skär helt det hörnet.
Så låt oss se vad vi har här.
Så vi har fått några kommentarer i toppen.
Jag inklusive dessa två bibliotek, som
Vi har ofta varit.
Och låt mig nu bläddra ner till den första
faktiska kodrader.
Linje 17 startar viktigaste.
Linje 21 och 20 har hur många flaskor öl kommer det att finnas?
Och då kallar jag getInt.
Och nu har jag lite av en sanity check.
>> Så detta är en konvention som vi nu börjar anta att
mer rigoröst kontrollera användarens input.
Ibland kan du bara inte vill få dem igen
och igen och igen.
Om användaren skruvar upp och inte samarbetar bra.
Avsluta och bara inte ta itu med dem.
Och så det är vad jag gör här.
Om n är mindre än 1, jag ska bara skrika på användaren,
"Tyvärr, gör att ingen mening." Och då ska jag
godtyckligt tillbaka 1.
Så återigen, detta är bara en konvention att vänja sig.
För nu, ta det på tro.
Men fram till nu har vi alltid varit tillbaka 0, eftersom
Vi har sagt återvänder 0 betecknar vad?
Publiken: framgång.
David J. MALAN: Framgång, det är allt.
Så nu när vi äntligen har börjat tänka på
icke-framgångar -
med andra ord, fall hörn, feltillstånd -
nu har jag ett oändligt utbud, eller åtminstone 4 miljarder
möjliga saker som kan gå fel i mina program.
Och jag kan börja ge dem individuella nummer.
Nu, i allmänhet räcker det att bara återvända
något annat än 0.
Så vi ska bara tillbaka 1 för nu.
Men anledningen för återvändande 1 är att så fort du återvänder
1, gissa vad som händer med resten av programmet?
Den stannar.
Det var allt.
Så det faktum att jag återvänder 1 är effektivt
kortsluter detta program avrättning så
ingenting under linjen 27 fortsätter köra.
Så snart huvudsakliga avkastning, är det det.
>> Okej, så om användaren gör samarbeta och vi når linjen 30
eftersom de skriver i en legitim nummer, här är min
genomförandet av den här låten.
Så jag skriva först ut ett nyradstecken, bara för
estetik.
Jag har nu en for-slinga.
Och märker att jag gör saker i lite
av en annan riktning.
Jag behöver inte göra mindre än, jag har inte att göra + +.
Jag kan istället säga initiera en variabel i, ställa in den lika med
n, antalet användaren har skrivit in, gör följande, så
länge jag är större än 0, då jag -
när du är klar en variant av denna slinga.
Så vi kan räkna ner med hjälp av en for-slinga också.
Nu är det ganska mycket veckan en grejer nu, med printf.
Så ut "% d flaskor öl på väggen." Print "% d
flaskor öl. "" Ta en ner, skicka runt. "Skriv ut
"% D flaskor öl på väggen." Så det är fortfarande% d, men
märker att argumentet printf till förändras.
Efter kommatecknet, jag har jag, för att jag vill säga 99.
Efter denna kommatecken, jag har jag, för att jag vill säga 99.
Efter denna kommatecken, jag har i - 1, för jag vill säga 98 i
denna första iteration, och så vidare.
Och nu här nere, jag har bara några dumma lilla anmärkning.
Och sedan linjen 42, återvänder jag 0 av konvention, vilket innebär att
allt är okej.
>> Så vad händer om jag goofed?
Vad kan ett vanligt misstag här vara?
Tja, tänk om jag av misstag sagt ja, jag vill räkna
ner till 0, jag vill 0 flaskor öl på väggen?
Så jag säger, jag är större än eller lika med 0.
Vad kommer att bli det symptom som jag nu se om jag kompilerar
beer1 och kör den?
Publiken: Negativ.
David J. MALAN: Ja, det kommer gå negativt.
Detta är en off-för-ett fel, en otroligt
vanligt misstag att göra.
Vi går faktiskt tillbaka till terminalfönster och göra det
här, så att vi kan se mer på en gång.
Enter, 99 flaskor öl.
Nära, men vi gick aldrig så lite för långt.
Vi sjöng sången för långt ner, så att vi nu träffar
negativt tal.
Så det fungerar inte riktigt.
>> Okej, så vi kan lätt fixa det genom att gå tillbaka till
hur det var en gång.
Men vad är några möjligheter nu
förbättring?
Nåväl, låt mig öppna beer2.c och rulla ner hit och ta en
titta på denna version.
Vad är det första som hoppar ut på dig som olika
i denna version här?
PUBLIK: [OHÖRBAR].
David J. MALAN: Ja, så ingen mer jag, eftersom det förekommit att
mig att du vet vad, jag ber användaren för n, och så är jag
inställning i lika med n, och sedan jag ändra i, men jag är aldrig
vidrör n igen.
Så vad sjutton var poängen med er fördela ytterligare 32
bitar kallade jag bara så att jag kan ha en annan variabel?
Så i det här fallet, jag slags insett att onödiga
designelement.
Och jag kommer nu att säga när n är större än 0, gå
framåt och skriva samma låt, passerar en n till printf som
andra argumentet, och n - 1 som det andra argumentet här nere.
Och sedan på varje iteration av denna slinga, gå vidare och bara
dekrementera n själv.
Nu funktionellt, det här programmet
kommer att vara identiska.
Om jag skriver under 99, börjar n vid 99.
Jag förminskningsvärde minskning, minskning, minskning.
Jag kommer att få hela vägen ner till "En flaska öl på
väggen, en flaska öl.
Ta en ner, skicka runt.
0 flaskor öl på väggen. "Slutet, eftersom jag gjorde
få tillståndet korrekt.
Det är större än 0.
Jag gjorde inte detta misstag.
>> Så vilket är bättre, version ett eller version två?
Jag hörde en massa knot för två.
Varför två?
Vad är det?
PUBLIK: [OHÖRBAR].
David J. MALAN: Åh, okej.
Så det kommer inte att gå under 0, men kom ihåg, i version ett,
ursprungliga rätt version inte gå under 0 heller.
Så kom ihåg att detta är rätt version.
Så låt oss åtminstone jämföra de två rätt versioner.
Vad är ett argument till förmån för version
två är, mmm, bättre?
Ja?
Målgrupp: Den använder mindre utrymme.
David J. MALAN: Okej, så det tar mindre plats, eller hur?
Medan version som används 32 bitar för N, och sedan en annan
32 bitar för jag.
Version två bara använder 32 bitar för n, så att
verkar vara ett plus.
Andra tankar?
Vill någon att argumentera för en?
Ja?
Målgrupp: Du måste använda extra kodrad för n -.
>> David J. MALAN: Okej, visst.
Så det är rättvist.
Så det här bara, åtminstone för mig -
Jag menar, det känns faktiskt lite stökigare, det faktum att
Jag kan inte sortera om inkapslar alla mina logik i en
vacker linje, for-slingan, som for-slingan kan.
Här har jag slags måste tack på detta n -
vid slutet av slingan, eftersom
Det är logiskt nödvändigt.
Men det slags gnuggar mig på fel sätt, bara för att det
verkar separat från logik här uppe, även om
igen, det är nödvändigt.
Andra tankar?
Ja?
PUBLIK: [OHÖRBAR].
>> David J. MALAN: Ja.
Så vad händer om du istället i slutet av låten, ville
skriva ut igen namnet på låten?
Som "Tack för att spela 99 flaskor öl", eller något
dumt som det?
Men poängen är, ville du tillgång till det ursprungliga värdet.
Det faktum att du har muterat eller ändrade n på varje
iteration och därför har förstört sitt ursprungliga värde
innebär att du bara inte kan göra det på slutet.
Nu, utan tvekan, vi uppenbarligen inte vill göra
att i detta program.
Så vem bryr sig?
Men det är en mycket bra plats.
Och för att vara ärlig, det är verkligen ingen
rätt svar här.
De är båda lika rätt.
Jag kunde övertygas båda hållen.
Jag kommer att säga att i allmänhet är det en bra princip om man
frågade användaren något värde och du lagrat i en variabel
såsom N, bara typ av principiellt, är det förmodligen bra
att hålla den runt.
Och alla data som du vill att mutera och om igen, bara
ge dig själv en kopia av den variabeln, bara så att du
har tillgång till den ursprungliga.
Du spenderar 32 fler bitar, men verkligheten är detta
datorn har liknande, två gigabyte RAM dessa dagar,
och vi hårklyverier över 32 bitar?
Verkligen inte en så stor sak.
Och även på den här enheten här, med en halv en spelning eller en
gigabyte RAM, 32 bitar kontra 64 bitar,
inte så stor roll.
Visst idag, det kommer att bli så överväldigad av storleken
av själva programmet, vilket kommer att bli flera hundra
kilobyte, om inte några megabyte, dessa dagar.
>> Så rimliga oro, ingen rätt svar.
Men åtminstone det är de tankar som ska börja
gå igenom ditt sinne?
För i pset 0, trots att vi egentligen bara väntat
korrekthet, eller åtminstone avstå olika buggar som
du kanske har stött på, när vi går framåt, är designen
kommer att vara en annan viktig aspekt, både att skriva kod
och även vår utvärdering kod.
Och så åtminstone ge tros sånt här.
Och bara för att något fungerar betyder inte att det är bra,
betyder inte att det är väl utformat.
Och det är en av de saker de pedagogiska kamrater och
problem uppsättningar kommer att hjälpa oss retas del över tiden.
>> Nå, hur är det med, låt oss säga, denna version här?
Låt mig göra något lite sexigt här på ett ögonblick.
Låt mig först bli av med detta.
Och nu ska vi fixa det här grammatiska problem.
Så i den här versionen, jag vill fixa grammatik så att,
snarare än bara säga parentes s, som "flaska"
eller "flaskor" -
Jag vill inte klippa det hörnet -
Jag vill också dynamiskt skriva ut ordet "flaskor"
eller "flaska", vilket med hjälp av dessa% s platshållare idag.
Så jag behöver villkorligt kolla vad är värdet av jag.
Och om det är 1, vill jag säga "flaska", och om det är något
annars vill jag säga "flaskor". Så låt oss försöka att göra detta.
Så om jag == 1, låt mig gå vidare och förklara -
Jag behöver en sträng, så låt mig göra string s1, eftersom det är
första strängen jag bryr mig om just nu.
Jag kommer att säga "flaska". Och sedan ska vi se, sträng
s2 - och jag ska förklara vart jag ska om en stund -
"Flaskor". Så erinra om att i den här låten, vi behöver kunna
för att skriva ut saker, två olika ord potentiellt.
Så om vi ser tillbaka, märker att när vi kommer till
detta exempel här "två flaskor öl på väggen,
två flaskor öl, ta en ner, passera runt ", jag vill ha
denna fjärde raden att nu säga "en flaska öl på
vägg ". Jag måste bestämma, jag vill säga" flaskor "eller
"Flaska"? Så jag ska godtyckligt säga, okej,
Jag ska nu förklara en variabel som heter S1, sträng
en, det är kommer att få inkopplad här och även här,
eftersom dessa ord är alltid identiska, bara på grund av den
natur låten.
Och jag kommer att kalla s2 vad ord vill jag
småningom synas här nere.
Nu, bokstavligen, 99 gånger av 100, det kommer att vara
samma i båda dessa fall, eftersom 3 är plural, är 2
plural, är 4 plural.
Men i detta hörn fall, där vi får 2 och sedan 1, eller
även 1 och sedan 0, jag behöver denna logik.
Så jag har att spendera lite tid i min kod få denna rätt.
Så om jag gör det, om jag == 1, ställ sedan in S1 lika med "flaska"
och s2 lika med "flaskor", eftersom detta kommer att vara 1
flaska, och det kommer att vara för 0 flaskor.
Och det här, vad står?
Bara för att vara tydlig.
Detta är bara en kommentar.
Så det faktum att du kan ha enradiga kommentarer innebär att du
kan kommentera din kod så här, men en annan vanlig
paradigm är också att om du har en super-kort fras som
du vill sätta dig och det är bara mer lättläst för att sätta
det rätt i slutet av raden av kod, kan du
absolut göra något liknande.
>> Så nu vad händer om jag gör det? Annars om jag inte är lika med 1.
Så bang lika -
utropstecken är känd som "bang".
Så Bang = 1.
Så om jag inte är lika med 1, vad jag vill i stället göra?
Tja, det första ordet jag vill vara vad?
Så sträng 1 vara "flaskor" för flera flaskor,
och då detta kommer att vara flera "flaskor" också, för nu.
Och vi får se om det faktiskt får oss att
där vi vill gå.
Så nu om jag bläddra ner hit, märker att jag ansluta
inte bara jag, utan S1.
Jag ansluter i och S1.
Och sedan ner här, jag minus 1, vilket är detsamma som
tidigare, men S2.
Med andra ord vill jag det engelska ordet för förändring som bygger
på denna logik.
Nu finns det redan en del problem i denna kod.
Vad bryts redan ut ur porten här?
Ja?
PUBLIK: [OHÖRBAR].
>> David J. MALAN: Exakt.
Så jag har redan brutit lektionen utrymme.
Så jag har förklarat S1 och S2, men jag har gjort det inuti
klammerparenteser, vilket innebär ja, kommer denna kod att arbeta upp
tills linjen 42, men så fort jag slog linjen 43, gissa vad ingen
längre existerar?
Ja, gissa vad är inte längre i omfattning - varken S1 eller S2.
Så vi måste fixa det här.
Så låt mig ta deklarationerna.
Och jag lämnar variabelnamn och radera detta här
och ta bort det här.
Och i vilka linjer ska jag deklarera verkligen dessa saker?
PUBLIK: [OHÖRBAR].
David J. MALAN: Ja, så antagligen
ända hit, 33-ish.
Så sträng s1 och sedan sträng s2.
Och det visar sig, kan jag göra det.
Om du förklara två variabler av samma typ,
kan du faktiskt bara använda ett kommatecken och göra det i C. Alla
rätt, så nu har jag två variabler -
s1 och s2.
Jag tilldela dem värden i dessa
villkor här, eller här.
Och då jag använder dem nedan.
Hur väl kommer detta nu att fungera?
>> Tja, det är fortfarande lite buggig, men låt oss åtminstone se
hur långt vi har kommit.
Så låt mig gå vidare och göra beer3.
Är detta beer3?
Japp, det här beer3.
Och låt mig nu gå vidare och köra beer3.
399 99.
Vi kan nog hoppa de flesta av dem.
Och här nere, titta på det.
"En flaska öl på väggen, en flaska öl, ta
en nedåt, passera runt, 0 flaskor öl på väggen. "
Men jag fästa er uppmärksamhet på bara halva lösningen.
Typ av skruvas upp här.
Så det verkar som om hörnet fallen uppstår när jag är lika vad
två värden?
Publik: 2, 1.
David J. MALAN: 2 och 1.
Det är inte 1 och inte 1.
Det är verkligen bara dessa sista två strofer av den här låten.
Så vad vill jag istället göra?
Så jag verkar ha fångat fall om jag är == till 1,
då det första ordet är "flaska", men det andra ordet
är "flaskor". Men här vill jag ändra detta är == 2.
Och om så är fallet, vad jag vill
första ordet vara?
Publik: "Flaskor".
David J. MALAN: "flaskor", så för två flaskor.
Och sedan detta ord här bör vara -
PUBLIK: "Bottle".
David J. MALAN: "Bottle", singular.
>> Okej, låt oss zooma ut, gå tillbaka hit, repris göra,
repris beer3, typ 99 igen.
Okej, "segmenteringsfel (core dumpad)."
Vad har jag gjort för fel?
Målgrupp: Du behöver inte ha ett värde [OHÖRBAR].
David J. MALAN: Ah, utmärkt punkt.
Okej, så vad är det för fel här?
Så segmenteringsfel, och vi faktiskt kommer att se
detta ganska många gånger i framtiden, medvetet.
Men nu, vad betyder egentligen?
En segmenteringsfel nästan alltid innebär att du har
på något sätt försökt att få tillgång till minnet, RAM i din dator,
att du inte äger, att du inte har faktiskt bett
operativsystem för.
Så i det här fallet, märker vad jag har gjort, vilket är
bristfällig i min logik.
Jag har tilldelat S1 och S2 ett värde om jag är lika med 1.
Jag har också gjort det om jag är lika 2.
Men jag har inte gjort det i oändligt många andra
möjligheter -
särskilt 3 eller 4 eller punkt, punkt, punkt, 99.
Så en fix för detta kan bara vara låt oss
har en annan tillstånd.
Och låt mig gå in här och säga S1 lika -
vad ska det vara här?
PUBLIK: [OHÖRBAR].
>> David J. MALAN: "Flaskor", eftersom det i det vanliga fallet,
Det är precis samma sak.
Så lika citat, citat, "flaskor". Så för plural
flaskor, och sedan upp här, för flera flaskor.
Okej, så låt mig nu gå tillbaka till min terminalfönster,
kompilera, repris den.
99.
Puh.
Och låt oss göra en snabb sanity check.
Tekniskt sett skulle vi vilja läsa alla dessa för att se
de är korrekt, men låt oss titta på
minst de kända syndarna.
3 flaskor, 2 flaskor, 2 flaskor, 1
flaska, 1 flaska, 0 flaskor.
Vi tycks ha åtminstone fast det för nu.
Men fångsten här är att vad en Guds fruktansvärda röra detta är
bara för att lösa en dum
ett tecken grammatisk detalj.
Så det är lite av en anledning som jag skär detta hörn
tidigare, eftersom det är bara helt irriterande måste
skriva denna kod mycket.
Men det visar sig att det finns något mer elegant sätt
uttrycker exakt samma sak.
Och vi kan göra detta på följande sätt.
>> Låt mig lämna detta på skärmen en stund och
införa något som kallas en ternär operatör.
Detta är lite av en one-liner som bara är tänkt att göra vår
lever lite sexigare, som utlovat.
Och jag kommer att göra detta på följande sätt.
Ge mig en sträng som heter s1, och låt mig
tilldela den som följer.
(I == 1)?
"Flaska", annars "flaskor". String s2 får (i == 2)?
"Flaska", annars "flaskor".
Så vad är då skillnaden här?
Dessa två rader kod, hävdar jag, kan
ersätta hela den här röran.
Så jag kallar det en enda röra, bara för att det slags gnuggar mig
fel sätt att det är så många rader kod.
Inte fel.
Det är inte dålig design.
Liksom, det är helt korrekt och perfekt fina.
Men kodning blir tråkig om du måste uttrycka dig så
fan specifikt igen och igen och igen med en enkel
scenario så här.
Så C har vissa genvägar, så här.
Så detta främst säger förklara en sträng som heter S1 och
tilldela det antingen detta värde eller detta värde om jag är == -
ledsen, skulle jag säga detta tydligare.
Deklarera en variabel s1, tilldela den detta värde om detta är sant.
Annars tilldela den detta värde.
Så med andra ord är denna typ av en-line sätt
säger om annat än att göra ett uppdrag på vägen.
Så om jag är 1, sedan gå vidare och kallar detta "flaska". Och
då detta annars, kalla det "flaskor". Samtidigt S2
andra ordet som vi måste definiera, om jag är lika med 2, vi
uppsättningen S2 till "flaska". Annars, ställ in "flaskor". Och vad
Detta innebär nu kan jag gå igenom detta och ta bort alla
de kodrader.
Och när jag säger, något löjligt, att detta nu
sexigare är det sexigare i den typ av stilistisk känsla.
Att funktionellt är denna kod faktiskt kommer att
göra exakt samma sak.
Och även om det kan se lite kryptisk först
blick, eftersom vi inte har sett denna konstruktion tidigare, skulle jag
hävdar att det i slutändan kommer att bli så mycket mer
läsbar och så mycket lättare för vi människor att sortera på
förstår, för nu kan du bara läsa
kod på en rad.
Det är fortfarande likadana i andemening som ett om, om det är den
tillstånd och då är vad som finns inuti om och detta
är vad som finns inne i annat.
Men vi kan göra detta bara mycket mer elegant.
>> Och om jag nu går tillbaka till min terminal, efter att ha bort alla
av dessa linjer och ersatte dem med bara de två,
kompilera, köra flaskor öl med 99, märker att min
grammatik är i själva verket fortfarande är korrekt.
Så återigen, något att starta.
2 flaskor öl, 1 flaska öl.
Ser rätt.
Ja.
Så där har vi en mycket mer kortfattad lösning.
Så det här också, som du får mer bekväm med C, inte
nödvändigtvis med den första pset eller andra, men
inse att dessa konstruktioner kan tillåta oss att göra saker som någonsin
mer elegant.
Nu ska vi göra en annan sak här.
Låt mig gå vidare och öppna upp return1.c.
Nu ska vi börja att lösa ett annat problem på ett sätt som
tillåter oss att skriva mer sofistikerad kod.
>> Så här är ett enkelt litet program vars syfte i livet
är att inkrementera värden.
Och faktiskt, låt oss ta ett steg tillbaka.
Låt mig göra det manuellt.
Låt mig göra inkludera och int main (void).
Och låt mig kalla denna increment.c.
Och vad vill jag göra?
Jag ska gå vidare och säga något i stil -
kommer vi att ringa numren samma -
int X.
Så int x får 2, printf x är% d, ny rad, x.
Så jag skriver snabbt, men sorts familjära saker nu.
Sen ska jag göra X + +.
Sen ska jag skriva ut samma mening igen.
Och då ska jag återgå 0 bara för att avsluta programmet.
Okej, så detta är ett program som
steg ett nummer.
Det först gå att initiera något till 2, och då är det
kommer att öka den och skriva ut den på nytt.
>> Så låt oss köra steg, otroligt enkelt program.
Men anta nu att jag vill kub värdet, så gör
något något godtyckliga.
Och jag vill verkligen göra X får kuben av det.
Så jag kunde använda vad som kallas pow funktion, men det gör jag inte
verkligen vet var det är ännu.
Så jag ska göra detta gammaldags sätt.
x gånger detta lika x ggr x gånger x.
Så jag cubing värdet multipliceras med sig själv igen
och igen och igen, så att vi får makten
av 3 i det här fallet.
Så nu de siffror jag skulle skriva ut bör, som vi ska se
här - att göra steg, så det är faktiskt inte riktigt öka
längre, men vi lämnar namnet ensam -
2 och därefter 8.
Nu har vi början till en möjlighet till förbättring
Här, där det cubing sak multiplicera ett antal
i sig själv av sig själv känns detta kan bara vara
bra att ha som en funktion, ungefär som någon beslutat
år sedan - ni vet, typ av användbar om en av oss sätter sig
och skriver printf så att resten av världen kan använda det,
varför vi inte sitta ner och skriva en funktion som kallas kub
som gör detta cubing för oss så vi behöver inte manuellt
genomföra begreppet cubing värden här?
>> Så ett enkelt exempel, men låt oss gå vidare och använda detta som en
möjlighet att skriva vår egen funktion.
Så hittills har vi endast huvud, och vi har använt andra
människors funktioner, men vi har inte skrivit våra egna.
Så här går vi.
Jag ska gå vidare och skriva en funktion som kallas kub.
Och jag kommer att få det ta en ingång.
Så dess ingång kommer att bli ett heltal.
Och vad kommer det att göra?
Det kommer att förklara int utgång = ingång gånger ingång
gånger ingång.
Och sedan kommer att återvända som utgång.
Och då måste jag vara specifik nu.
Denna funktion kommer att returnera en int.
Så här är då hur man skulle skriva egna funktioner.
Du bestämmer först vad är namnet på din
funktion kommer att bli.
Och generellt är något förklarande bra, så jag ska
kalla det kub.
Då måste man specificera vad det kommer att återvända, är det
sin produktion kommer att bli.
Och vi har inte så många alternativ ännu.
Int, röding, flyta, BOOL, sträng.
För nu, kommer jag att hålla fast vid en int, eftersom jag vill att det
tillbaka ett heltal.
Då måste man ange vad dess ingångar, om sådana finns, är.
Och om kub tar ett argument, tar något mellan
parenteser, måste du ge det argumentet ett namn så att
du kan kalla det något som du är att genomföra eller skriva
denna funktion och du måste ge det en typ, som i detta
fall kommer att vara int.
Så kort sagt, är kub en funktion som tar ett heltal
som inmatning och returnerar ett heltal som utsignal.
>> Så vad gör det med den ingången?
Tja, i linje 14, förklarar jag en variabel som heter utgång, och jag
tilldela det värdet, ingång gånger ingång gånger ingång.
Och då jag återvänder utgång.
Så hur använder jag det då?
Vad ändrar jag dessa markerade tecknen på nätet
7 att, tror du?
PUBLIK: [OHÖRBAR].
David J. MALAN: Ja, så kuben av X.
SO x är en variabel, vilket betyder att det har något värde.
Lyckligtvis är det av typen heltal.
Och eftersom x är en int, innebär att jag kan ge det till kuben.
Och även om jag åsidosätta värdet på x med värdet
av kub x, har som varit fallet hittills, när du
har samma tecken och en kodrad, grejer till höger
blir avrättade och sedan blir tilldelad
värde till vänster.
Så ordningen av verksamheten är som vi hoppas.
Så fungerar det här?
Nåväl, låt mig gå hit.
Låt mig öppna min terminalfönster.
Låt mig gör steg, Enter.
"Implicit deklaration av funktionen" kub "är ogiltigt i
C99. "Inom parentes hänvisar C99 till det språk C som det var
definieras i 1999, var som en uppdatering över versionen från
1989, vilket är en uppdatering över originalet.
Så det är allt som betyder.
>> Så vad betyder det att "implicit deklaration av
funktion "kub" är ogiltig? "Det är här.
Det är just där i linje 12.
PUBLIK: [OHÖRBAR].
David J. MALAN: Vad är det?
PUBLIK: Det är inte förr.
David J. MALAN: Det är inte förr.
Så detta är en sak.
C är typ av dumt, eller C-kompilatorer är typ av dumma.
De verkligen bara göra vad du säger till dem att göra.
Och de, i synnerhet bara läsa din kod uppifrån och ned,
vänster till höger.
Så om kompilatorn, klang, läser din kod, linje 1, den
räknar ut hur man gör detta.
Åh, här kommer huvud.
Okej, låt mig gå vidare och förklara en variabel x.
Låt mig skriva ut något.
Linje 7, vad sjutton är kuben?
Det är inte deklarerats i stdio.h.
Den kommer inte med C. Jag har ingen aning vad jag ska göra.
Och så clang BAILS rättvis och avslutas med att felmeddelandet.
Så vi kan fixa det här på ett par olika sätt.
Vi kan lära klang vilken kub är genom att bara flytta om
deklaration är.
Så jag klippt ut och klistrat den ovanpå viktigaste.
Nu inser att bara för att stora inte längre först, är det
fortfarande körs som standard.
Main är främsta.
Det är den förvalda funktionen namn.
Det spelar ingen roll om det är i en fil.
Men åtminstone nu klang har sett kub innan jag använder den.
Så låt oss se om klang är lyckligare nu.
Gör steg, det sammanställa denna gång.
>> Låt mig köra steg.
Och mycket riktigt, det verkar fungera.
Nu kan du komma med scenarier småningom när
Det är inte möjligt att sätta alla funktioner
över alla andra funktioner.
Du kommer att fastna i denna oändlig slinga i verkligheten,
där denna kille vill vara här, men detta
kille måste vara där.
Så det fungerar inte alltid.
Så tack och lov, har C en mer elegant lösning.
Jag ska sätta detta tillbaka där den var, bara för att jag
föredrar, som i princip att största alltid
på toppen, eftersom det är bara trevligt att se vad det här programmet
gör som standard.
Och vad jag ska göra här uppe är förklara vad som kallas
en prototyp.
Jag ska åter förkunna mitt kub funktion genom att bokstavligen
kopiera och klistra in.
Egentligen, det är inte bokstavligen.
Så bokstavligen kopiera och klistra in linjen 15
upp över linjen 6.
Det spelar ingen roll vilken linje det hamnar på.
Det råkar vara på linje 4.
Men det måste vara innan huvud.
Men märker skillnaden.
Linje 4 slutar med ett semikolon, vilket innebär hey,
Klang, ta mitt ord för det att det finns en funktion
kallas kub som tar en int och returnerar en int.
Men jag tänker inte berätta vad det är ännu.
Vet bara att jag lovar att berätta så småningom.
Och mycket riktigt, nu är det okej att det är nere.
>> Så detta är i allmänhet bättre, för då på toppen av
filen kan du skramla strax utanför, blixtsnabb, en rad
varje, vad namnen på dina funktioner, vad deras
ingångar är, vad deras resultat är.
Och för att vara mer tydlig, betyder ingång allmänhet argument eller
parametern, synonyma.
Utgång betyder returvärdet, vad gör det
handen tillbaka till mig.
Så i detta fallet här, har kub förklarats i toppen, men
definierade, annars känd som genomförs vid botten.
Så låt oss nu gå tillbaka hit och köra det.
Så nu låt mig gå vidare och köra göra, köra steg.
Och det verkar nu fungera bra.
Så nu kan vi gå vidare och räkna ut något liknande
öl exempel i denna fjärde versionen.
Så låt mig rulla ner här.
Och märker att jag typ av tog den här lektionen till sig just nu.
Det faktum att jag sjöng samma strof igen och
om och om igen, samma Chorus Line i låten, kände
som varför inte jag faktor som ut i en funktion?
Och faktiskt, bör detta vara ett av motiven.
Förutom det faktum att någon annan i världen kanske vill
att använda en kub funktion -
Det är en bra anledning till faktor något och skriv
egen anpassad funktion -
om det finns en bit av kod i ditt program som bara gör
begreppsmässig mening, att du typ av vill ge det en
namn - som i detta fall, kör -
då kan du på samma sätt skriva det som en separat funktion.
Du behöver inte skriva allt i huvud om det bara
känns renare att skilja ut och ge den ett namn.
>> Så i detta fall här, märker att jag har en kommentar ovanpå
denna funktion som bara sjunger om
specificerade antal flaskor.
Notera här att jag inte behöver ringa dessa
Saker ingång och utgång.
I själva verket, den här gången jag ringde bara min ingång B för flaska.
Och märker här föreslår ogiltig vad?
Det kör -
PUBLIK: inte tillbaka det.
David J. MALAN: returnerar inte ett värde.
Och faktiskt, behöver uppgifter inte återvända värden.
De kan bara göra något.
De kan ha så kallade biverkningar, som i detta
fall är bara en massa utskrift på skärmen.
Så märker att den här koden här, jag bokstavligen bara stal från
det tidigare exemplet.
Den enda skillnaden är istället för att använda i som min
variabel, jag använder nu B som min variabel.
Så jag har b här nere, jag har b här nere, jag har b
minus 1 här nere.
Men koden är exakt densamma.
Men bara för att visa dig nu hur vi kan använda detta, låt mig gå
framåt och faktiskt ändra detta är en for-slinga.
for (int i = n, i> n, i -).
>> Så jag har stulit det från våra tidigare exempel.
Tidigare är det i linje 37 som jag skulle ha börjat
sjunger detta irriterande låt.
Men istället, jag ska bara nu kallar kör av i.
Klar.
Så nu i varje iteration av denna slinga, kallar jag detta andra
funktion, kör, som jag råkade skriva.
Det var inte skriven av någon annan år sedan.
Men kör, under tiden, använder printf för att skriva ut
ut dessa fyra rader.
Men det faktum att jag ringer kör om och om igen i en
loop innebär att jag kommer att få, alldeles slut,
exakt samma låt som jag har hittills.
Så kort sagt, nu om jag ser tillbaka på min kod, även om
funktionellt motsvarar detta, märker att det är
börjar bli ännu mer lättläst.
Jag vet inte exakt hur getInt
genomförs.
Ärligt talat, jag vet inte hur kör genomförs.
Men det spelar ingen roll för mig.
Jag bryr mig inte, för nu kan jag sortera om, som människa, läs
detta från topp till botten.
Och eftersom funktionerna är namngivna enligt vad de
göra, är min kod alltmer läsbar.
Och som våra program får mycket mer komplex -
av terminen slut kommer du att skriva hundratals rader
kod i språk som PHP och Javascript och liknande -
du kommer att upptäcka att det är så mycket lättare än att hålla reda på
vad du har gjort.
Och när du börjar samarbeta med vänner eller
partners eller kollegor, kommer du att kunna skriva mycket mer
massiva program genom att börja träna dessa grundläggande
byggstenar.
>> Så med det sagt, varför inte vi kallar det en dag?
Och vi kommer att se dig på onsdag.
[Applåder]