[Powered by Google Translate] David J. MALAN: Okej.
Detta är CS50, och detta är slutet av vecka två.
Om du räknar med att vara hungrig vid denna tid i morgon, vet att vi kommer
att sammankalla en liten grupp i morgon, torsdag, 1:15 PM.
Det är denna URL här om du vill RSVP.
Utrymmet är begränsat, så förlåt om formuläret har fyllts upp med den tid du
fylla ut.
Annan URL även om det kan vara av intresse är.
>> Så i nästan en månad, kursen kommer att göras tillgänglig
allt bredare via EDX, via vilken folk på Internet kommer att vara
kunna följa med, engagera sig i kursen helt aktivt, faktiskt.
De kommer att använda CS50 Appliance och CS50 Diskutera och de flesta av
olika mjukvaruverktyg som vi redan har använt den här terminen.
Och en av de initiativ som vi vill ta på som ett experiment i år
är att se hur mycket innehåll som vi kan översätta till andra talade och
skriftspråk.
Så om du kan ha ett intresse av att delta i detta projekt, där
vi kommer att ge engelska avskrifter och undertexter för kursens
föreläsningar och shorts och seminarier och sektioner och liknande -
om du talar flytande eller skriva flytande ett annat språk, skulle vi
älskar att engagera dig i detta projekt, där du tar på en eller flera av de
videor, översätta dem till ett språk du känner ganska väl.
För att ge dig en känsla av gränssnittet, det är det här webbaserade användargränssnitt
att vi kommer att använda som kommer att skapa i huvudsak en UI som denna.
Detta var jag undervisade lite Halloween sedan.
Och på den högra sidan där i svart bredvid dessa tidsstämplar,
ser du de olika saker som kom ur min mun den dagen.
Och sedan under det, kommer du att kunna översätta till andra språk.
Exakt vad mappningen mellan, i detta fall, Engelska
och, säg, spanska.
Så det är faktiskt en mycket användarvänligt verktyg.
Du kan spola tillbaka och snabbspola framåt mycket lätt med kortkommandon.
Så om du vill delta i detta experiment och få dina ord
ses och läsas av potentiellt tusentals människor där ute, gör du välkommen
gratis att delta.
>> Nu ett ord om kattungen från måndag, så vi har skickat en alltför
skrämmande budskap.
Inser att när kontorstid föreslå och som sektioner antyder, den
utformning av kursen är mycket att ha studenter samarbetar och
pratar att arbeta igenom problemet apparater och problem tillsammans.
Och verkligen linjen kommer bara ner till, återigen, det arbete du slutligen
bör lämna bör vara din egen.
Och så är det, helt ärligt - i kontorstid, det är helt normalt -
det är helt att vänta, även - att chatta med några
vänner bredvid dig.
Om han eller hon kämpar med något ämne, och du är som, åh, bra låt
mig ge er en glimt av några kodrad som jag skrev.
Det är bra.
Det händer.
Och det är mycket gynnsam, tror jag, med processen för lärande.
Där linjen, igen, blir korsade är när huvudet är typ av lutas över
här alltför många sekunder eller minuter för att verkligen ha just
varit ett frigörande möjlighet för din vän.
Och visst, när det blir utväxlas via e-post och Dropbox och
liknande, även där är linjen.
Så med alla medel, trivs och känner uppmuntras att chatta med vänner
och klasskamrater om psets och mycket mer.
Och bara att inse att det du i slutändan skicka egentligen borde vara
produkt av din skapelse och inte någon annan.
>> Så i samma anda av gulliga varelser, kanske du
känner den här killen här.
Så detta är ett fasansfullt ostliknande film från år sedan.
Någon sett här Spaceballs?
Okej.
Så ett stort antal här.
Så detta är vårt underbart akademisk sätt att införa idag ytterst
begreppet kryptografi.
Och så en av de domänspecifika problem för pset 2, som kommer
ut sent i morgon kväll, är att dyka in i världen av kryptering, vilket
är konsten att kryptera eller förvränga information.
Och detta gäller i slutändan till en värld av säkerheten.
>> Nu trygghet för de flesta oss kommer i form av ganska vardagliga mekanismer.
Alla av oss har användarnamn och lösenord.
Och vi alla har mycket dåliga användarnamn och lösenord, troligen.
Om ditt lösenord är samma på flera webbplatser, det är förmodligen inte
den bästa idén, som vi kommer att diskutera mot termin slut.
Om ditt lösenord är skriven på en klisterlapp - inget skämt - på
bildskärm, som också är inte nödvändigtvis den bästa designen men ganska vanligt
fenomen.
Och om du inte använder kryptering för att kryptera dina lösenord, är de
särskilt utsatta.
Så om du tror att du är super smart genom att ha en dold ord
dokumentera någonstans på din hårddisk som har alla dina lösenord, men
det är i en mapp som ingen kommer att titta i, det är också inte särskilt
säker mekanism.
Och så vad pset 2 kommer att introducera är denna konst av kryptografi och
förvränga information så att saker som lösenord är
allt säkrare.
För att motivera denna mycket verkliga problem med en mycket icke-verkliga
scenario, låt mig presentera dig för en av våra favorit klipp här från detta
film, Spaceballs.
>> [VIDEOAVSPELNING]
-Hjälm, du djävul, vad händer?
Vad gör du med min dotter?
-Tillåt mig att presentera den lysande unga plastikkirurg, Dr Philip
Schlotkin, den största näsoperation mannen i hela
universum och Beverly Hills.
-Ers Höghet.
-Näsa jobb?
Jag förstår inte.
Hon har redan haft en näsoperation.
Det var en söt 16 närvarande.
-Nej, det är inte vad du tror.
Det är mycket, mycket värre.
Om du inte ger mig kombinationen till luft sköld, Dr Schlotkin kommer
ge din dotter tillbaka sin gamla näsa.
-Nej!
Var fick du det?
-Okej.
Jag ska berätta.
-Nej, pappa, nej.
Du får inte.
-Du har rätt, min kära.
Jag kommer att sakna er nya näsa.
Men jag vill inte berätta för dem kombinationen oavsett vad.
-Väldigt bra.
Dr Schlotkin, gör ditt värsta.
-Med nöje.
-Nej!
Vänta, vänta.
Jag ska berätta.
-Jag visste att det skulle fungera.
Okej, ge det till mig.
-Kombinationen är en.
-One.
-Två.
-Tre
-Tre.
-Fyra.
-Fem
-Fem.
-Så kombinationen är en, två, tre, fyra, fem.
Det är det dummaste kombinationen jag någonsin hört i mitt liv.
Det är sånt en idiot skulle ha på sitt bagage.
-Tack, Ers Höghet.
-Vad har du gjort?
-Jag stängde av väggen.
-Nej, det gjorde du inte.
Du stängde av hela filmen.
-Jag måste ha tryckt på fel knapp.
-Tja, sätter på den igen.
Sätt filmen igen.
-Ja, sir.
Ja, sir.
-Kom igen, Erna.
Kom, Gretchen.
Naturligtvis du vet att jag fortfarande blir tvungen att fakturera dig för det här.
-Jo, det fungerade?
Var är porten?
-Det fungerade, sir.
Vi har kombinationen.
-Bra.
Nu kan vi ta varje sista andetag av frisk luft från planeten Druidia.
Vad är kombinationen?
-Ett, två, tre, fyra, fem.
-Ett, två, tre, fyra, fem?
-Ja.
-Det är fantastiskt.
Jag har samma kombination av mitt bagage.
Förbered Spaceball 1 för omedelbar avgång.
-Ja, sir.
-Och ändra kombinationen på mitt bagage.
-Aj!
[END VIDEOAVSPELNING]
>> David J. MALAN: En fantastisk film du nu ska alla se.
Så sammanhanget här är att med osäkra uppgifter kommer en möjlighet att
kryptera det och att förvränga den.
Och så detta, till exempel, är ett exempel på ett krypterat meddelande.
Detta säger faktiskt något på engelska.
Men det är uppenbarligen inte helt uppenbart.
Och vi kommer full cirkel idag att retas isär vad denna hemlighet
Meddelandet här är.
Men i den verkliga världen av datorer, saker och ting inte ens ser ut som de kanske
vara engelska fraser.
Till exempel, det är vad du kan hitta på en vanlig Linux eller Mac eller
Unix-dator i en fil som var en gång i tiden kallades lösenord filen.
Numera är det flyttats till andra platser.
Men om man tittar på rätt plats på ett system, ser du inte bara din
användarnamn eller hos andra människor på systemet, men du kommer att se en
krypterad version av sitt lösenord.
I själva verket antyder ordet kryptan där att följande saker är krypterad.
Och denna serie av till synes slumpmässiga bokstäver och tecken och siffror och
så vidare kan dekrypteras endast genom allmänt veta någon hemlighet -
ett hemligt ord, ett hemligt nummer.
Och så faktiskt, till konsten att kryptografi slutligen handlar om förtroende för vissa
sortera och veta något som någon annan inte gör det.
Vi kommer att utforska detta i lite mer detalj i dag och i pset framöver.
>> Och nu några ord om Pass / Fail.
Så särskilt har som några av er dök i pset 1, apparaten, och
en helt ny värld för dig själv, insåg att frustrationer och
förvirring och bara tekniska svårigheter kan förväntas.
Speciellt med den första pset, där det finns bara så mycket nytt, bara få
bekant med ls och cd och alla dessa mystiska kommandon i en ny miljö.
Och det är skilt från själva materialet och programmering själv.
Så inser också att det finns säkert kontorstid som finns som
stödstrukturen.
Avsnitt börjar denna kommande söndag.
Men viktigast av allt, om du känner bara att det inte är
värld för dig, inse att det egentligen bara tar tid.
Och om det inte vore för denna möjlighet år sedan för mig att ta en klass
godkänd / underkänd, ärligt talat, jag skulle aldrig ens satt sin fot i klassrummet.
Och du kan ändra detta fram, säger den femte måndagen i kursen.
Så om du är på kanten nu inse att i stället huvudet i någon annan
vatten helt och hållet, anser visserligen bara byta till godkänd / underkänd.
Återigen, det är inte riktigt denna kultur här på Harvard för att ta saker
godkänd / underkänd eftersom alla verkligen vill uppnå eller överträffa.
Men ärligt talat, är detta ett underbart sätt att försöka något som kanske inte
vara bekant för dig.
Och du kommer att hamna gör i de flesta fall ganska bra, kanske
mycket till din förvåning.
Och i mer konkreta termer, vad jag tycker godkänd / underkänd i allmänhet gör,
särskilt som du kanske har upplevt med pset 0, om du har lagt
i 10 timmar, 15 timmar, 25 timmar i vissa pset - och du är bara banka
huvudet mot väggen,
och det blir super sent på natten,
men du har tagit pset som 90% av vägen,
du vet att du bara inte kan lista ut en sak -
godkänd / underkänd verkligen tar udden av en klass som denna, där du kan sortera
av glatt säga okej, jag vet att det inte är perfekt.
Men jag jobbade häcken av mig på detta.
Jag är ganska nöjd med var den hamnade.
Och det kommer att uppfylla de förväntningar på godkänt / underkänt.
Så ha det i åtanke.
>> Okej.
Så de av er som har kämpat för att använda Harvard University Wi-Fi-vet
att det finns en CS50 SSID, en Wi-Fi-anslutning flyter runt som du
kan ha bättre tur för.
Det är lite ironiskt att lösenordet för - om du vill prova
anslutning till detta för bättre hastigheter och låt oss veta om det är inte bättre -
är ett, två, tre, fyra, fem, ända upp till åtta, eftersom åtta är
säkrare än fem.
Så om du behöver Wi-Fi-lösenord, anslut till CS50 trådlöst här.
Ett, två, tre, fyra, fem, sex, sju, åtta.
Och inlägg på CS50 Diskutera om du fortfarande har återkommande anslutningsproblem,
och vi låter de befogenheter som ska veta detta utrymme.
>> Okej.
Så en snabb teaser, särskilt för dem av er som är fan pojkar eller flickor
av alla saker Apple.
Vad jag grävde upp från ett par år tillbaka var här filen här, ilock.c, bara för att
typ av göra mer konkret och mer komplex några av de mer grundläggande C
program vi har skrivit.
Så jag öppnade filen, ilock.c.
Den finns på föreläsningarna sidan för idag.
På vänster sida ser du en lång lista med funktioner.
Så kolleger som skrev detta skrev upp en massa funktioner,
mer än bara stora.
Han använde en massa bibliotek här.
Och om vi börjar rulla igenom, vad detta egentligen är är mycket
Först tror jag, knäcka för den ursprungliga iPhone.
När du ville jailbreaka den ursprungliga iPhone, vilket innebär untether
det från AT & T och faktiskt installera särskild programvara på den och göra saker
att Apple inte vill att folk ska göra -
Tja, tog någon tid att räkna ut exakt hur de skulle kunna utnyttja
programvara brister, misstag, buggar, i Apples mjukvara.
Och sålunda föddes ilock.c.
Att om du sammanställt det på en dator och installerat det på en iPhone som
var ansluten till datorn via exempelvis en USB-kabel, skulle detta ge dig
administrativa eller rotbehörighet till din iPhone och låter dig göra ganska mycket
vad du vill.
>> Och så det har varit denna fascinerande katt-och råttalek mellan Apple och
resten av världen, särskilt som de, liksom många företag, försök att låsa
sina grejer ner så att du bara kan göra med den vad de tänker.
Men tack vare personer gillar detta och deras förståelse av lågaktivt
detaljer och, i det här fallet, C programmering och en hel del de välbekanta konstruktioner
att vi har börjat spela med, kan du verkligen utnyttja den
hårdvara på ett sätt som du tycker passar och inte nödvändigtvis några företagsenhet.
Så till exempel, har jag ingen aning om vad allt detta gör.
Men getVersion låter ganska enkelt.
Och det ser ut så här är en funktion som denna person skrev.
Ta någon form av heltal som argument, inte återvänder något, men
verkar slinga med en for-slinga här och en om tillstånd, om tillstånd,
bryta, och på något sätt rör versionsnummer.
Om vi ​​scrolla ner -
även om många av dessa sökord kommer att vara nya, och det finns en
massa funktioner i här vi aldrig sett och kanske inte någonsin se över
Under terminen -
i slutet av dagen, följer samma regler och logik som vi har varit
spelar med hittills.
Så detta är alldeles för gammal för att knäcka din iPhone 3s eller 4s eller snart 5s, dessa dagar,
men vet att det är alla mycket härrör från denna värld som vi har
dök in.
>> Så låt oss ta en titt på lite mer enkelt exempel.
Den här, bara för att få värmas upp med lite syntax och även en del andra uppgifter
typ som vi har pratat om, men har inte riktigt sett i C. Så detta är ett
fil som heter positive1.c.
Och per kommentarerna överst kräver detta bara att en användare ger ett
positivt tal.
Så det är ett exempel på en gör-while-slinga, vilket är trevligt för användaren interaktivt
program där du behöver tala om för användaren att göra något.
Och om de inte samarbetar, skrika dig på dem eller förkasta deras input.
Ett typexempel, kommer jag att göra linjerna 19 till 24, så länge som användaren har
inte gett mig ett positivt tal.
Nu detalj här på linje 18, varför jag förklarar N över hela denna
looping konstruktion i motsats till höger bredvid rad 22 där jag
faktiskt bryr få n?
Ja?
[OHÖRBAR]
>> David J. MALAN: Ja, så det här numret av omfattning.
Och lekman mandatperiod, vad räckvidd hänvisar till?
Ja?
[OHÖRBAR]
David J. MALAN: Kan du tala lite högre?
Högtalare 1: Där du kan komma åt en viss variabel.
David J. MALAN: Perfect.
Där du kan komma en viss variabel.
Och generellt tumregeln hittills varit att omfattningen av vissa
variabel definieras av de senaste klammerparenteser som du har sett.
Och så i det här fallet, om jag gjorde misstaget att förklara n på linjen 22,
den linjen skulle fungera.
Jag skulle få en int, och jag skulle sätta den i den variabeln n i linje 22.
Men vilken kodrad skulle nu ha någon aning om vad jag pratar om?
Så 25, och det visar sig 24, liksom, eftersom i detta fall, faller det utanför
av klammerparenteser.
Så bara en liten bit av en olägenhet men mycket enkelt lösas genom att helt enkelt förklara
den variabla utanför själva funktionen.
>> Nu ska vi se senare idag, kan du gå ett steg längre.
Och du kan även få lite lat -
och detta är inte att rekommendera, i allmänhet -
men du kan även få lata och sätta en variabel globalt, så att säga, inte
inuti en funktion, inte inuti en slinga, men i själva filen, utanför
av alla de funktioner som du har skrivit, som jag gjorde här på rad 15.
Men detta är i allmänhet ogillat.
Men inser att detta är en lösning ibland till andra problem, som vi ska
småningom se.
Så nu kommer vi lämna det så här.
Men låt oss se om vi kan skriva om det bara att börja uttrycka oss själva en
lite annorlunda.
>> Så det här programmet, bara för att vara tydlig, är positive1.
Låt mig gå vidare här och i min terminalfönster göra positive1, Enter.
Sammanställer, okej.
Jag ska köra positive1, tryck Enter.
Jag kräver att du ger mig ett positivt heltal.
Jag ska säga -1.
Det fungerade inte.
0, 99, verkar som att arbeta.
Kanske inte den mest rigorösa testet.
Men åtminstone det är en trevlig förstånd kontrollera att vi är på rätt väg.
Så nu låt mig gå vidare och öppna versionen två i detta.
Och vad är annorlunda redan?
Det genomför samma sak.
Men vad är att hoppa så tydligt annorlunda den här gången?
Ja, så detta bool i grönt.
Gedit har markerat i grönt här sökordet som kallas bool,
vilket är en datatyp.
Det kommer inte inbyggd i alla versioner av C. Du måste inkludera en
specifik bibliotek.
I vårt fall ingår jag CS50 biblioteket så att vi
ha tillgång till BOOL.
Men i linje 18, verkar vi ha ett booleskt värde här kallas tacksam.
Så jag kunde ha kallat detta någonting.
Men jag kallade det tacksam bara typ av förmedla några semantisk innebörd.
Så först på linjen 18, jag uppenbarligen inte tacksam eftersom
Booleskt värde tacksam initieras till false i linje 18.
Och då verkar det som jag har gjort här i ledningarna 21 till 23 är jag just
typ av omskriven min logik.
Så ingen funktionellt annorlunda.
Men i linje 22 nu, kollar jag om int användaren har gett är större än
0, då ändrar jag bara värdet av tacksamma till true.
Och varför gör jag det?
Eftersom i linje 25, tydligen, jag ska kolla ett villkor.
Gör denna slinga medan tacksam är falskt.
>> Så jag föreslår detta som ett alternativ till version en eftersom det är minst en
lite mer intuitiv, kanske.
Det är lite mer grundad på engelska.
Så gör du följande när du inte är tacksam eller när tacksamma är falskt.
Och den här gången också, jag tydligen bryr inte komma ihåg vad användaren skrivit
i eftersom varsel finns ingen variabel n.
Så egentligen har jag -
en liten vit lögn där.
Funktionellt är programmet lite annorlunda när vi kommer till botten av
det eftersom jag inte ihåg vad n är.
Men jag ville visa även här att även om vi har sett getInt och
GetString som används på den högra sidan av ett likhetstecken hittills så att
Vi minns värde, tekniskt, det är inte absolut nödvändigt.
Om du av någon anledning bara inte bryr att spara värdet, vill du bara
att kontrollera värdet, märker att vi helt enkelt kan skriva detta som getInt öppna
paren, nära parentes.
Denna funktion kommer att returnera ett värde, som vi har sagt.
Det kommer att ge dig tillbaka en int.
Och så om du tror mentalt att detta händer när jag skriver in 99, getInt
returnerar antalet 99.
Och så begreppsmässigt, är det som om min kod var faktiskt här.
Så om 99 verkligen är större än 0, så tacksam blir sann.
Då linjen 25 inser ooh, vi gjort eftersom jag nu tacksam.
Och i linje 26, vi helt enkelt säga, tack för det positiva heltal, vad det
råkade vara.
>> Nu ska vi göra något syntaktisk socker här, så att säga.
Låt oss se om vi kan städa upp denna linje 25 med denna tredje och sista varians
i positive3.
Så märker den enda skillnaden nu är vad kodrad?
Ja, så 25.
Och vi har inte har verkligen sett detta trick än.
Men vi fick se den utropstecken på måndag, som betecknar vad?
Så inte, eller förnekande.
Så ta ett booleskt värde och vända dess värde.
True blir falskt.
Falskt blir sant.
Så detta, jag skulle föreslå, är ännu lite mer intuitivt för ett sätt att
skriva kod eftersom jag fortfarande initiera tacksam till false.
Jag gör fortfarande följande.
Jag satt tacksam till true när det är dags.
Men nu kan du egentligen bara översätta denna kod muntligen vänster till höger,
medan inte tacksam.
Eftersom Bang, eller utropstecken, betecknar begreppet inte, så när
inte tacksam.
>> Så återigen, har vi infört några nya begrepp i sig.
Vi har pratat om Booleans tillbaka när vi spelade med Scratch.
Men inser nu att vi bara kan börja skriva vår kod i
många olika sätt.
Så speciellt i pset1, om du är typ av svårt att räkna ut vägen till
skriva några program, har du tur odds eftersom det kommer att bli någon
antal lösningar som du kan hända på.
Till exempel är det bara tre för även de enklaste av programmen.
Okej.
Och nu minns måndagen lämnade vi på denna sedel med returvärden.
Så för första gången skrev vi ett program som inte bara har stora,
Det har också sin egen anpassad funktion som jag skrev här.
Så i linje 31 till 34 har jag genomfört en kub funktion.
Det är inte komplicerat.
Det är bara en gånger en gånger en, i det här fallet.
Men vad som är viktigt om det är att jag tar in i form av en och
Jag återvänder ut i form av en gånger en gånger en.
>> Så nu har jag möjlighet, ungefär som jag brukade med printf ensam, att ringa
denna funktion genom att ringa kuben funktionen.
Och kuben funktionen tar lite input.
Och kuben returnerar någon utgång.
Och så däremot printf bara gjorde något.
Det tog inte tillbaka någonting som vi brydde sig om - trots att, som en
undan, det gör det returnerar ett värde.
Du bara allmänt ignorera det.
Printf bara gjorde något.
Den hade en bieffekt av att skriva ut på skärmen.
Däremot här har vi kuben funktionen, som
faktiskt återvänder något.
>> Så detta är i allmänhet -
för dem som känner till detta, det är en ganska enkel idé.
Men för de mindre bekant med denna idé om att passera i ingångar och få
tillbaka utgångar, låt oss försöka bara något super enkelt.
Är det någon bekväm kommer upp på scenen en kort stund?
Du måste vara bekväm med en kamera på dig, liksom.
Ja.
Okej, vad heter du?
Ken: Ken.
David J. MALAN: Ken.
Okej, Ken.
Kom upp.
Så Ken kommer att vara en funktion av slag här.
Och låt oss gå vidare och göra det.
Låt oss få lite fantasi.
TREVLIGT ATT TRÄFFAS.
Välkommen till centrum.
Okej.
Låt oss slå den här knappen här.
Okej.
Så här har du en modern tavlan.
Och vad jag är den viktigaste funktionen, till exempel.
Och jag har inte en iPad i min hand.
Jag förstår inte riktigt ihåg hur man - ja, faktiskt, kan inte säga det.
Jag har inte riktigt bra handstil.
Och så därför vill jag att du skriver ut något på skärmen för mig.
>> Så jag är huvudprogrammet.
Och jag kommer att få dig att säga detta genom att skriva det i min kyckling repor och
då passerar du en ingång.
Så som dumt om denna övning är, begreppet funktioner och kräver en
funktion och returnera en funktion verkligen kokar ner till detta.
Jag främsta.
Jag har just skrivit printf ("något") på skärmen.
Jag kör det här programmet.
Och så snart printf anropas tar det ett argument - eller en parameter,
ibland -
mellan citationstecken.
Här är det argumentet.
Jag passerar den till Ken.
Nu är han en svart låda skrivit ett visst antal år sedan som uppenbarligen
bara vet hur man skriver ut saker på skärmen.
>> Så, kör.
Det är inte illa.
Så mycket bra.
Så nu Ken görs köra.
Behöver han att lämna mig någonting tillbaka?
Så inte att vi har sett hittills.
Återigen, inte printf faktiskt returnera ett tal.
Men vi kommer att ignorera det för nu eftersom vi aldrig har använt den.
Så det är det för Ken.
Och så nu viktigaste kommer tillbaka för att utföra -
viktigaste tar över kontrollen av programmet igen eftersom det kodrad,
printf, görs köra.
Och vi går om vår väg utför vad andra linjer är där.
>> Okej.
Så nu ska vi prova en lite annorlunda exempel.
Och den här gången här, låt oss först rensa skärmen här.
Och den här gången ska vi göra det cubing funktionen.
Men den här gången, jag förväntar mig ett produktionsvärde.
Så låt oss gå vidare och göra det.
Så nu har jag en kodrad som säger x = kub (x).
Så egentligen let's -
kodraden, minns, ser ut så här.
x = kub (x).
Så hur kommer detta att fungera?
Så låt oss gå vidare och ge dig en vit skärm igen.
Och jag ska skriva nu ned värdet på x, som i detta ögonblick i
tid råkar vara, låt oss säga, 2, för att hålla det enkelt.
Så jag har skrivit ner på ett papper värdet 2,
som är mitt värdet x.
Jag lämna det till Ken.
Ken: Och jag skriver bara svaret?
David J. MALAN: Ja, låt oss bara skriva svaret.
Okej.
Och nu måste han återvända mig något.
Så -
perfekt.
Trevlig Segue.
>> Så nu har han överlämnar mig tillbaka värdet 8, i detta fall.
Och vad gör jag med den?
Jo, faktiskt, låt oss se.
Få ordning på detta.
Vad ska jag göra med den?
Nu ska jag ta detta värde och faktiskt lagra den i de
Samma bitar i minnet.
Men varsel, jag slags kämpar här.
Jag är lite förvirrad eftersom där kan jag faktiskt skriva värdet på x?
För vad jag just gjort är fysiskt handen Ken ett papper
som hade värdet 2, vilket var X.
Och faktiskt, det är precis vad som händer.
Så det visar sig att när du ringer en funktion, och du passerar på ett argument
liknande "Hello World" eller om du passerar i ett argument som 2, i allmänhet, är du
passerar i en kopia av detta argument.
Och så precis som jag skrev ner numret 2 här och räckte den till Ken, som måste
innebär att jag fortfarande har en kopia av värdet 2 någonstans.
Eftersom faktiskt, nu när jag har fått tillbaka värdet 8, behöver jag gå tillbaka i
RAM och faktiskt skriva ner 8 där jag en gång hade numret 2.
>> Så visuellt ihåg detta begrepp passera i bokstavligen
en kopia av värdet.
Ken gör sin grej, händer mig något - i det här fallet,
ett värde som 8.
Och då måste jag göra något med det värdet om jag
vill hålla det runt.
Så allt detta kommer att bli alltför bekant kort.
Tack så mycket för denna demo här, Ken.
Okej.
Mycket bra gjort.
Så låt oss se hur det i slutändan rör en del av funktionen
ringer att vi har gjort här.
Så låt mig gå vidare och föra oss tillbaka till cubing exempel.
Och märker att om vi vill faktiskt börjar ta detta ytterligare, vi kommer
att vara uppmärksam på det faktum att antalet X som är som skickas i
Här skiljer sig från vad som faktiskt förs in i funktionen.
Så återigen, detta förbi exemplar kommer att bli ganska
relevant på bara ett ögonblick.
>> Så låt oss ta en titt på något som inte riktigt fungerar rätt ännu.
Jag ska gå vidare och öppna tredjedel buggy exempel, som
är bristfällig av naturen.
Och det kallas buggy3 och det genomför en swapping funktion.
Så här har vi en huvudfunktion som x och y godtyckligt initialiseras till
1 och 2, respektive.
Vi skulle kunna använda getInt, men vi behöver bara en enkel övning.
Så det är hårdkodad som 1 och 2.
I linjerna 21 och 22, ut vi tydligen ut x och y, en per rad.
Sedan, på linje 23, hävdar jag jag byta dessa värden, punkt, punkt, punkt.
Jag kallar tydligen en funktion i linje 24 som heter swap
som tar två argument.
Det är helt legit för funktioner för att ta två argument.
Vi har sett printf gör det redan.
Så swap tar uppenbarligen x och y..
Och som namnet antyder, skulle jag hoppas att det kommer att
byta dessa två värden.
Så då jag hävdar på rad 25, bytte.
Och jag nytryck x och y under antagandet att
de har verkligen bytts.
Men om jag kör faktiskt detta program -
Låt mig öppna upp ett terminalfönster.
Låt mig göra buggy3.
Som namnet antyder, detta kommer inte att sluta bra.
För när jag slog in, märker att x är 1.
y är 2.
Och ändå i slutet av programmet, de är fortfarande i själva verket detsamma.
>> Så baserad på visad just nu med Ken, vad egentligen som händer?
Nåväl, låt oss dyka in i denna swap funktion.
Det är super kort.
Det är bara några få rader kod lång.
Men vad är det grundläggande problemet baseras på den enkla berättelse
här uppe med Ken?
Varför swap bruten?
[OHÖRBAR]
Exakt.
Så vi lagrar en kopia, inte variabeln själv.
Med andra ord tar swap tydligen två argument, en int.
Och det är godtyckligt kallas a och b.
Och här uppe, jag har gått i x-och y som är respektive 1 och 2.
Men jag är inte bokstavligen passerar i x.
Jag är inte bokstavligen passerar i y.
Jag passerar en kopia av x och en kopia av y..
Det är som nästan som om du kopieras och klistras in byta värderingar som
du vill att det ska faktiskt manipulera.
Så om så är fallet, när jag, programmet börjar exekvera
linje 35, sedan 36 -
när jag kommer till linjen 37, vid denna punkt i berättelsen, är det värdet av en?
Vid denna punkt i berättelsen, linje 37, vad är värdet av en vid det här laget?
Så det borde bara vara 1.
Eller hur?
Eftersom X antogs i det första argumentet.
Och denna funktion bara godtyckligt ringer sitt första argument, en.
Likaså är y, det andra argumentet.
Och det är bara godtyckligt ringer det andra argumentet miljarder.
>> Nu dikotomi är faktiskt ganska enkelt förklaras.
Tänk på det.
Ingen av oss har träffat den person som skrev printf.
Så säkert har han eller hon ingen aning om vad våra variabler 30 år senare går
att kallas.
Så det måste finnas en skillnad mellan vad du kallar variabler i
funktioner du skriver och vad du kallar variabler i funktioner du är
ringer eller använder.
Så med andra ord, har jag skrivit mina variabler som x och y.
Men om någon annan hade skrivit swap-funktionen, han eller hon verkligen
skulle inte veta vad mina variabler kommer att kallas.
Så inser att det är därför du har denna dualism av namn.
Tekniskt kan jag göra detta av en tillfällighet.
Men de skulle ändå föras in som kopior.
Det skulle bara vara en ren tillfällighet estetiskt om personen som skrev
swap hade använt samma namn.
>> Okej.
Så vid denna punkt i berättelsen, linje 37, är en 1.
b är 2.
Och nu har jag fortsätter att byta dem.
Tja först av allt, låt mig faktiskt göra det mycket enklare.
Jag vet inte vad dessa tre rader kod gjorde.
Låt mig bara göra det här.
b. får en.
a får b..
Klar.
Varför är denna trasig, logiskt?
Det är typ av intuitiva sak, eller hur?
Så en blir b..
Och b blir en.
Men problemet är att så snart som linjen 37 utför, vad är
värde av a och b?
Samma, 1.
Eftersom du har clobbered, så att säga, har du ändrat b för lika en.
Så när ledningen 37 utförs, det är bra.
Du har nu två kopior av nummer 1 på insidan av denna funktion.
Så då när du säger i linje 38, får ett b, ja, du är typ av skruvade.
Eftersom du bara tilldela 1 till 1.
Du har typ av förlorat det värde som du brydde dig om.
>> Så i den ursprungliga versionen av detta, märker vad jag gjorde.
Jag hade i stället tredjedel kodrad som såg ut så här.
Jag förklarar en temporär variabel - TMP är en mycket vanligt namn
för en tillfällig variabel.
Det är en int eftersom det har att matcha vad jag vill göra en kopia av.
Jag lagrar en kopia av en insida tmp. Så när linjen 37 har utförts,
Värdet på a är -
snabb förstånd check -
1.
Värdet på b är 2.
Och värdet av TMP är också 1.
Så nu har jag köra linje 38.
Så när linjen 38 utför, tar på värdet av b.
Och b var 2.
Så en är nu 2.
Så vid denna punkt i berättelsen, är en 2, b är 2,
och TMP är 1.
Så nu logiskt kan vi bara plopp tmp värde i miljarder.
Och vi är klara.
>> Så vi har löst problemet.
Tyvärr, när jag kör det här programmet i denna form, inte egentligen byta
alla värden.
Men för att vara tydlig, varför?
Jag fixade den logiska problemet från bara en stund sedan.
Men återigen, om jag kör det här programmet, x och y är oförändrade i slutet av
programmets genomförande.
[OHÖRBAR]
David J. MALAN: Så vi inte har återvänt något.
Så det är sant.
Men det visar sig att det är lite av ett problem här eftersom hittills har
enda vi har kunnat återvända är en sak.
Och detta är en begränsning av C. Du kan bara returnera verkligen ett värde,
i vilket fall, jag slags fastnat här
eftersom jag kunde återvända det nya värdet på x eller jag kunde återvända till
nytt värde y.
Men jag vill båda tillbaka.
Så återvänder inte den enkla lösningen här.
Men problemet är i grunden varför?
Vad har vi bytte egentligen?
a och b.
Men a och b är kopior av x och y, vilket innebär att vi bara gjorde allt detta
arbete - vi tillbringade bara som tre minuter talar om swappen
funktion och alla tre av dessa variabler.
Och det är bra, helt rätt för sig.
Men a och b omfattning är bara i dessa rader här.
Så precis som en for-slinga, om du deklarerar ett heltal i inuti för
loop - på samma sätt, om du förklara a och b inuti en funktion som
du har skrivit, de är endast giltiga inuti denna funktion.
Vilket betyder när swap sker utför och vi går från ledningen 24 till
ledningen 25, x och y har inte ändrats alls.
Du slösat bara en massa tid att byta kopior av variabler.
>> Så det visar sig att lösningen på detta är faktiskt inte självklart.
Det är inte riktigt tillräckligt för att returnera värden eftersom vi kan
bara tillbaka en värde.
Och jag vill verkligen byta både x och y samtidigt.
Så vi kommer att återkomma till detta.
Men nu inser att frågan i grunden härrör från det faktum
att a och b är kopior.
Och de är i sin egen räckvidd.
Nåväl, låt oss försöka lösa detta på något sätt.
Låt mig faktiskt rulla tillbaka hit och öppna upp, låt oss säga, en fjärde variant
av detta, buggy4.
Och hur är det med det?
Detta är en liknande men enklare problem att titta på innan vi tar en stab på
lösa det.
Detta program kallas inkrement.
Och det initierar tydligen ett x heltal till 1 i linje 18.
Jag hävdar då är x 1.
Jag då anspråk uppräkning, punkt, punkt, punkt.
Jag kallar sedan steg.
Men sedan i ledningarna 22 och 23, hävdar jag att det är ökats.
Jag hävdar x är nu vad det är, 2 förmodligen.
>> Men detta program är buggigt.
Vad är problemet?
Ja?
[OHÖRBAR]
David J. MALAN: Exakt.
SO x har förklarats uppenbarligen på linje 18.
Det är inne i centrala s klammerparenteser.
Så det enkla svaret här är att, ja, det finns X här.
Det existerar inte i linje 32.
Så detta program faktiskt inte ens kompilera.
Kompilatorn, när jag försöker kompilera koden, kommer att skrika på mig
om några odeklarerat identifierare eller något om detta.
I själva verket, låt oss försöka.
Det är att buggy4.
Där är det.
Användning av odeklarerat identifierare x i linje 32.
Och faktiskt, låt oss vara tydligare här i dag så att det är användbart i
kontorstid och hemma.
Observera att det är lite kryptiskt skrivet.
Men det faktum att clang har skrek åt oss, säger
buggy4.c: 32:5, är faktiskt bra.
Det betyder att felet är på linje 32 vid teckenposition fem.
Så en två, tre, fyra, fem.
Det är i själva verket där problemet är.
Och även att hålla i minnet vid kontorstid och hemma, jag är lycklig här.
Jag har en misstag.
Det kommer att vara relativt lätt att åtgärda.
Men om du får en hel skärm full med överväldigande felmeddelanden, igen,
inse att den nedersta en bara kan vara symtom på
de översta sådana.
Så alltid jaga ner dina fel uppifrån och ned.
Eftersom det kan bara vara en daisy-chain effekt som föreslår dig
har sätt mer problem än vad du faktiskt gör.
>> Så hur kan vi fixa detta om mitt mål är att öka x?
Vad är det?
Okej.
Så vi kan göra X globala.
Låt oss ta en genväg som jag varnade tidigare.
Men heck, vi behöver bara en snabb fix.
Så låt oss bara säga int x upp här.
Det gör X global.
Så nu viktigaste har tillgång till den.
Och ökning har tillgång till den.
Och så låt mig gå vidare och sammanställa detta nu.
Gör buggy4, Enter.
Verkar kompilera nu.
Låt oss springa buggy4, och det verkar faktiskt fungera.
Nu är det här en av dessa saker -
gör som jag säger, inte som jag gör, som jag just har gjort här.
För i allmänhet våra program kommer att få mycket mer intressant och
mycket längre än detta.
Och om din lösning på livets problem är bara ah, sätta alla
variabler på toppen av din fil, mycket snabbt göra program får
fasansfullt svåra att hantera.
Det blir svårare att komma på nya variabelnamn.
Det blir svårare att förstå vad variabeln gör vad.
>> Och så i allmänhet är detta inte en bra lösning.
Så låt oss göra det här bättre.
Vi vill inte använda en global variabel här.
Jag vill öka x.
Så jag kunde naturligtvis -
i slutet av dagen, det är lite av en dum historia eftersom vi bara göra detta.
Men om jag inte visste om denna aktör, eller jag inte fick
ändra det i huvud själv, hur kunde jag annars genomföra Ken hit, detta
tid inte till kub utan att inkrementera?
Hur ändrar jag det här här?
Ja.
[OHÖRBAR]
David J. MALAN: Okej, bra.
Så varför inte jag gå i x?
Och sedan i stället lämna tillbaka det, varför inte jag bara göra retur x + 1?
Nu, ett par fler saker måste förändras här.
Jag är på rätt spår.
Vad behöver jag för att justera?
Någon annan.
Ja?
[OHÖRBAR]
David J. MALAN: Jag behöver ändra returtyp av inkrement
eftersom det inte är ogiltig.
Void betyder ingenting är som returneras.
Men helt klart, nu är det.
Så detta behöver ändras för att int vara förenlig med vad
Jag är faktiskt återvänder.
>> Nu något annat är fortfarande buggigt här.
Ja?
[OHÖRBAR]
David J. MALAN: Så jag behöver öka x?
[OHÖRBAR]
David J. MALAN: Ah, så jag måste gå x.
Så jag behöver göra det här.
Så prototypen måste jag ändra detta här.
Så detta måste bli en int.
Detta måste bli -
hmm.
Jag har faktiskt en bugg här nere.
Låt oss fixa detta först.
Vad ska det vara egentligen?
Så det måste vara en int något.
Det kan vara X.
Men ärligt talat, om du börjar ringa alla dina variabler x, det kommer att bli
mindre och mindre tydlig vilken som är vilken.
Så låt oss bara godtyckligt välja en annan namnkonvention för min
hjälpfunktioner, funktioner jag skriver.
Vi kallar det en.
Eller vi kan kalla det - låt oss kalla det even_number vara ännu tydligare.
Så då måste jag återvända oavsett antalet är plus 1.
Och nu måste jag byta en annan sak upp här och en
annan sak här uppe.
Vad ska jag byta på linje 21 först?
Jag måste ge det till x.
Så jag kan inte bara ringa stegvärde x.
Jag måste komma ihåg svaret genom att ändra värdet på x på
den vänstra sidan.
Och även om x är nu på vänster och höger, det är helt bra eftersom
den högra sidan blir utförs först sedan får plopped i den vänstra
handen sak, X i detta fall.
Och då slutligen, är detta en enkel fix nu.
Detta bör bara matcha vad nere.
Int nummer.
>> Okej.
Så en hel massa förändringar för ett riktigt dumt funktion.
Men representativ för saker som vi alltmer kommer att vilja göra.
Så gör buggy4.
Jag har skruvat upp någonstans.
Herregud.
Fem misstag i, liksom, en sex-line program.
Så vad är det för fel på rad 18, 5 tecken?
Okej.
Så jag måste förklara detta int.
Okej.
Så låt oss se, en hel massa andra fel.
Herregud.
19, 18, 21.
Men återigen, låt oss bara rensa skärmen -
Kontroll L här - och kör klang.
Så fem problem är faktiskt bara den.
Så nu ska vi köra buggy4, Enter.
Puh.
x har ökats korrekt.
>> Okej.
Har du frågor om hur man öka siffror?
Ja?
Högtalare 2: Varför är det så att du bara kan byta x till antalet i variabeln
namn och det vet vad du menar?
David J. MALAN: Bra fråga.
Hur kommer det sig att jag bara kan byta x till antalet och programmet kommer att veta
omedelbart?
Så återigen, se det som denna abstraktion.
Så om jag är huvud och Ken är inkrementell, ärligt talat, jag bryr mig inte
vad Ken kallar sin iPad.
Jag bryr mig inte vad han kallar allt som har att göra med hans genomförandet
av denna funktionalitet.
Så detta är en implementering detalj som jag, huvud, inte
måste bry sig om.
Och så helt enkelt byta det konsekvent insidan av funktionen, antal här
och nummer här, är allt som behövs så länge jag kompilera.
Det är ungefär som om du tycker om - många av oss, de av er med förarens
licenser som har kört, eller om du ens kört i en bil -
de flesta av oss har ingen aning om hur en bil fungerar under huven.
Och bokstavligen, om du öppnar upp huven, de flesta av oss - däribland jag själv -
kommer inte att verkligen veta vad vi tittar på.
Ungefär som du kan känna med sånt här just nu.
Men vi har egentligen inte bry hur bilen fungerar.
Vi behöver inte bry sig om vad alla stavar och kolvar och kablar inuti
bilen faktiskt gör.
>> Så något liknande vad du kallar kolven ingen roll
Här i detta fall.
Samma idé.
Ja?
[OHÖRBAR]
David J. MALAN: Om det fanns fler användningsområden för den variabla xa stund sedan,
du, programmerare, skulle behöva ändra dem överallt.
Eller så kan du bokstavligen göra Fil, Meny och sedan Sök / Ersätt,
något liknande.
Men du kommer att behöva göra dessa ändringar själv.
Du måste vara konsekvent.
[OHÖRBAR]
David J. MALAN: En särskild ordning som här?
Om detta var int annat nummer?
Ja.
Så att frågor när du ringer funktionen.
Så om jag ringer inkrement här med något kommatecken något,
Det finns en direkt mappning.
Den första variabeln, vad det heter, görs en kopia av det första
argument här.
Tyvärr, bör detta inte vara en parentes.
Det andra argumentet ställer upp med den andra.
>> Så att, ja, frågor.
Okej.
Förlåt att jag tog en lång väg dit.
Övriga frågor?
Okej.
Så låt oss se om vi inte kan måla en bild av vad som egentligen händer
Här under huven, så att säga.
Så detta är en rektangel som kan representera datorns minne.
Så även om du har ingen aning om hur minnet fungerar eller hur RAM fungerar, åtminstone
anta att du har klasar av det dessa dagar.
Du har megabyte det.
Du har gigabyte det.
Och vi vet från vecka noll att en byte är precis vad?
8 bitar.
Rätt, så 8 nollor och ettor.
Så om din dator har en spelning RAM, två gig RAM dessa dagar, du har en
miljarder eller 2 miljarder byte minne, eller ungefär 8 miljarder eller 16 miljarder
bitar, inne i datorn.
Nu till skillnad från den lilla Woolly Willy exempel, det är inte magnetiska partiklar
typiskt längre.
Alltmer, i bärbara datorer åtminstone är det Solid State Drives, SSD, som
bara har inga rörliga delar.
Det är alla elektroniska.
Det är all el baserad.
Så tänk dock denna rektangel som bara representerar en eller två
gigabyte minne som du har.
>> Så det är en bit av minne.
Nu värld datavetenskap har slags partitionerade bort bitar av
minne för att göra olika saker.
Så till exempel om det är din dators RAM-minne - som föreslagits av
rektangel där - visar sig att av konvention, på toppen av din RAM, så
att tala, är i allmänhet vad som kallas en text segment.
Dessa är de nollor och ettor som du har sammanställt.
Så när vi har tittat under huven på vad a.out är allt
de nollor och ettor -
När du kör ett program, är dessa nollor och ettor in från hårddisken
kör in i något som kallas RAM.
Och i RAM, de sätter på toppen.
Nu under tiden har du andra saker.
Initierade uppgifter, oinitierade data.
Dessa två stråk av minne hänvisar till globala variabler, som
du inte använder ofta.
Men ibland om du gör, hamnar de upp där också.
Sedan finns några andra saker.
Miljövariabler, som vi inte kommer att spendera mycket tid på.
Men sedan två viktiga saker som kommer tillbaka under denna
termin, stack och heap.
>> Så de flesta av datorns minne är reserverat när man kör ett program för
något som kallas stapeln och något som kallas högen.
Och vi kommer inte att tala om högen idag, men vi kommer
tala om stapeln.
Och stapeln är avsedd att trolla fram den visuella av liknande matsalen
måltid brickor i Mather House, eller varhelst du råkar vara där
matsal personal rengör dem varje dag.
De stack upp dem från golvet på upp.
Och på samma sätt i minnet, det är denna idé om att sätta något på en
stack, sätta något på en bunt, sätta något på en stack.
Och vad menar vi med det?
Nåväl, låt oss zooma in på bara den nedre halvan av bilden, datorns
RAM, att föreslå följande.
Det visar sig att när du kör ett program som a.out eller hej, vad
programmet är att du har skrivit,
igen, dessa nollor och ettor laddas från hårddisken - som är
långtidslagring, stannar där även när du dra ur kontakten -
laddas till RAM.
RAM är snabbare än hårddiskar.
Det är mindre än hårddiskar.
Men det är där programmen bor när du kör dem.
>> Så du dubbelklicka ett program på en Mac eller PC - det är laddat från
hårddisken i RAM-minnet.
Så snart det är laddat i RAM, de nollor och ettor går på vägen upp, de
så kallade textsegment.
Men sedan så fort ditt program faktiskt startar, den viktigaste
Funktionen anropas.
Och viktigaste, som vi har sett, ofta lokala variabler.
Och det har Ints och strängar samt tecken och liknande.
Så om ditt program som du har skrivit eller det program som du har
dubbel klickade använde vissa variabler inuti huvud hamnar de på
botten av din stack minne, så att säga.
Nu mer konkret vad innebär egentligen?
Det betyder bara att om vi skulle numrera saker -
Om vi ​​skulle numrera byte RAM i datorn, märker att
detta kan vara byte nummer noll.
Detta kan vara byte nummer ett, två, tre, fyra, fem, sex, alla
vägen upp till vill -
2 miljarder skulle vara hela vägen upp där i toppen.
Så med andra ord, när vi talar om RAM eller minne i form av byte, det
betyder bara att någon har bestämt vad att numrera varje
de bitar av minne.
>> Så när du behöver 32 bitar för en int, eller om du behöver 8 bitar för en röding, där
hamnar de i minnet?
Nåväl begreppsmässigt, hamnar de bara upp på botten av detta
sak kallad stapeln.
Men vad som är intressant nu är när stora anropar en funktion.
Antag en funktion som kallas foo, bara ett godtyckligt namn.
Vad som händer är viktigaste är på botten av denna stapel av minne.
Foo nu läggs ovanpå viktigaste i minnet.
Så några lokala variabler som foo har hamnar slags konceptuellt över
de i huvud.
Om foo kallar en annan funktion som heter bar, dessa variabler hamna här.
Om spärra samtal något annat, här, här, här.
Så vad är intressant om hur du kör ett program är att när du ringer funktioner,
och eftersom dessa funktioner kräver funktioner, och som dessa funktioner kallar funktioner,
du bygga upp denna trave funktioner i minnet.
Och bara en gång en funktion returnerar börjar man få att minnet tillbaka.
Så en av de enklaste sätten att få slut på minne i en dator programmet är att
skriva funktioner som aldrig återvända.
>> Så till exempel, låt oss visa så mycket med en
avsiktligt buggy programmet.
Låt mig gå vidare och göra # include , int main (void).
Och jag ska göra medan (2> 1), som troligen inte kommer att någonsin
förändring på oss.
Och låt mig gå vidare nu och göra printf.
Egentligen är det kommer att bli mindre visuellt intressant.
Låt oss göra detta.
För int (i = 0, i> 0).
Låt oss göra detta misstag, i + +.
Och låt oss inte printf här.
Låt oss leva som jag predikade.
Låt oss ha en metod här.
Void kör, och vi kommer att säga int i.
Och då ska jag säga, printf -
Åh, låt oss göra detta mer intressant.
Låt oss faktiskt inte ut något alls.
Låt oss bara göra detta.
Kör (i).
>> Okej.
Så detta är buggig eftersom varför?
Jag gör detta som jag går eftersom programmet inte egentligen göra något
av intresse.
Men det är inte målet.
Målet är att skriva ett program vars huvudfunktion gör vad, tydligen?
Kalla sig.
Och faktiskt, vi behöver inte slingan.
Låt oss förenkla även detta bara för att inte glömma verkligen
grundläggande fel.
Huvudsakliga samtal refräng att sjunga lite kör.
Sen gjorde jag något dumt, och jag hade Chorus Chorus samtal eftersom jag antar
någon annan skulle genomföra det kanske.
Och nu detta inte kommer att sammanställa ännu.
Jag behöver göra det?
Jag behöver prototypen, minns.
Så jag måste ha här uppe void kör (int i);.
>> Så nu, om jag går ner här -
faktiskt, låt oss använda den större fönstret.
Låt oss gå vidare och göra kör.
Användning av oidentifierat spelföraren i..
Åh, det var dumt.
Vi behöver inte argumentet.
Låt oss bara göra detta.
Önska vi hade börjat på detta sätt.
Det skulle ha varit en mycket enklare program för att skriva.
Så det.
Nu ska vi gå över till min terminalfönster, repris klang.
Och nu kör vi.
Det var verkligen snabbt.
Vad som egentligen hände, men?
Nåväl, nu ska jag lägga den tryckta linjen, så att vi kan se.
Så låt mig säga printf, låt oss säga, jag är här.
Okej, inga variabler, vi lämnar det så.
Låt mig köra göra.
Låt mig repris kören.
Och kom igen.
Fortsätt.
Som en sidoreplik, varför har det kraschade inte ännu?
Den segmenteringsfel hände supersnabb tidigare.
[OHÖRBAR]
David J. MALAN: Exakt.
Så det tar tid att skriva ut.
Det tar bara mer arbete på datorns sida.
Och det är det.
Segmenteringsfel.
>> Så märker hur snabbt program körs.
Om du inte skriver något, supersnabb.
Men vi fick ändå denna segmentering fel eftersom vad som hände?
Tja, om du tänker på hur datorns minne är anlagd, detta
råkar vara huvud.
Men här -
låt oss kalla just denna kör, och låt oss kalla denna kör.
Och nu om jag gör mitt estetik rätt, kommer detta bara säga kör,
kör, kör, kör, kör, kör, kör, ad nauseum.
Och slutligen, vad är det kommer att hända?
Om den stora bilden bokstavligen är, vad händer just begreppsmässigt?
Bunten överskridanden högen.
Eller ännu värre, överskridande du bara allt, inklusive text segmentet, som är
de nollor och ettor som representerar ditt program.
Kort sagt, detta är bara super, super dåligt.
Eller hur?
Ditt program har spiraled utom kontroll.
Du använder mycket mer minne än du tänkt allt på grund av en dum
misstag, i det här fallet.
Eller i detta fall, ett mycket medvetet gjort funktion kallar sig.
Nu är detta inte alla dåliga.
Funktioner som kallar sig har faktiskt stor makt
när du använder den på rätt sätt.
Jag har inte använt det på rätt här.
>> Så detta är inte negativt.
Men det faktum att jag aldrig sluta kalla mig är en grundläggande
svaghet här i detta program.
Så vart är vi på väg med allt detta?
Tja, vad som verkligen händer?
När jag ringer ökningen funktionen, som vi gjorde i dessa exempel,
Jag har ett värde som 1 som jag passerar i.
Jag passerar i en kopia av nummer ett.
Så följande händer.
Så låt oss gå in i steg exempel.
Och den här killen här borta.
Så här är vad som faktiskt händer.
När jag ringde inkrement, och jag passerar i X, bildmässigt vad
pågår här är det -
om jag har värdet 1 sparas här, och jag faktiskt kallar steg, vilket
kallas nu kör -
Ja, det är kastar mig här.
Så låt oss kalla detta steg.
Och vi vet inte vad det nästa funktion kommer att bli.
Så vad som faktiskt händer är här någonstans i main, jag har en bit av
minne som lagrar numret 1.
När jag ringer steg, jag använder en annan bit av minnet, men nu har jag
har kopian av 1.
När jag öka detta värde blir detta 2 - fruktansvärt skriven på
skärm här.
Men sedan, vad händer när inkrement återvänder?
Detta minne blir bara lämnas tillbaka till operativsystemet, vilket betyder allt
du har gjort är inget användbart.
Den som ursprungligen ingick i huvud är fortfarande faktiskt det.
>> Så vart är vi på väg med detta?
Tja, visar det sig att i minnet du har denna back to back sekvens av
byte som du kan sätta saker i.
Och det visar sig att vi redan har sett något som innebär att sätta
saker rygg mot rygg mot rygg mot rygg.
Vad är en sträng, som bygger på vecka ett och nu vecka två?
Så det är bara en samling av tecken.
Så visar det sig, precis som du kan sätta siffror i minnet, på samma sätt kan du
sätta tecken i minnet.
Och när vi börjar sätta tecken i minnet tillbaka till tillbaka till tillbaka till
tillbaka, visar det sig att använda den enklaste av saker som en for-slinga eller
en while-slinga, kan vi iterera -
från vänster till höger över tecknen i en sträng -
och börja massera dem i olika karaktärer helt och hållet.
En kan bli B. B kan bli C. Så som i slutändan kan vi ta en
Engelska mening som faktiskt är vettigt och konvertera alla dessa
bokstäver i taget genom att gå igenom vår dators minne kvar att
rätt att faktiskt kryptera.
>> Så låt oss ta vår fem-minuters paus här, och när vi kommer tillbaka, vi kommer
starta denna process förvränga information.
>> Okej.
Så innan vi dyker in i vissa krypto och dessa saker som kallas matriser, låt mig
paus för alla frågor eftersom jag känner att jag verkligen slags rörig några
dessa ämnen.
Så låt oss fixa nu om vi kan.
Så vi pratade bara om returvärden.
Vi pratade om argument.
Och vi pratade om detta begrepp, som vi ska återkomma till under de kommande veckorna
komma, av att se minnet som en massa av dessa staplade
brickor, så att säga.
Från botten på upp, så att varje fack som får sätta på stacken representerar
en funktion som för närvarande är som anropas.
Några frågor?
Så vad sägs om - låt mig försöka ställa en fråga.
Jag håller förstör det, men nu it's - you've alla sett pojkens ansikte.
Så vi ska återkomma till det.
>> Så låt mig ställa en fråga här.
Låt mig förenkla tillbaka till vad det var innan några av våra tidigare Q & A.
Och det faktum att ökningen har öppen parentes, int antal, stängd
parentes.
Vad representerar int nummer?
[OHÖRBAR]
David J. MALAN: Ett argument.
Okej, men vad är ett argument?
[OHÖRBAR]
David J. MALAN: Tyvärr, vad är det?
SPEAKER 3: Något du passerar i.
David J. MALAN: Okej.
Så något som du passerar i.
Och mer allmänt, det är bara ingången.
Om du skriver en funktion och att funktionens syfte i livet är att göra
något lite annorlunda varje gång du använder det, då det enda sättet för
att det skulle hända skulle verkligen verkar vara att förse den med bidrag så att
kan göra något annorlunda med den ingången varje gång.
>> Så du måste ange två saker när en funktion tar ingångar.
Du måste ange det namn som du vill ge till denna ingång, rent
din egen bekvämlighet så att du kan hänvisa till den i den funktion som du
själv skriver, som jag gjorde här i linje 32.
Men du måste också ange dess typ eftersom C är ett programmeringsspråk
som bara kräver
att om du vill ha en variabel måste du tala om för datorn vad
uppgifter typ det är,
till stor del så att den vet hur många bitar till
fördela för den variabeln.
Eftersom det kan vara sex -
Tyvärr, det inte sex.
Det kan vara 16.
Det kan vara 8.
Det kan vara 32, även 64.
Men datorn behöver veta.
Nu int på vänster sida representerar vad däremot?
[OHÖRBAR]
David J. MALAN: Vad är det?
[OHÖRBAR]
David J. MALAN: Typen av funktionen och, mer specifikt,
typ av produktionen.
Rätt.
Så medan sak i parentes representerar dess ingång, om någon,
sak till vänster representerar dess utgång.
Och i det här fallet returnerar steg tydligen en int.
Och så int är returtyp av denna funktion.
>> Vad innebär det att återvända?
Bokstavligen, använder du nyckelordet tillbaka.
Och sedan om vad du återvänder till höger om sökordet är en
heltal, så det är verkligen överensstämmer med vad vi har lovat.
Du kunde inte göra något liknande -
hej, värld -
eftersom det är en sträng.
Uppenbarligen är det inte ett heltal.
Så kort sagt, är bördan verkligen på oss, programmeraren, för att vara specifik som
vad vi tillbaka och sedan faktiskt gå tillbaka det.
Och sedan för att göra en smula tydligare sammanhanget -
där är han igen.
Sammanhanget -
överraskning kommer in bara ett ögonblick.
Sammanhanget här är nu att datorns minne är återigen en
gigabyte, två gigabyte, vad som helst.
Kanske är det mer.
Kanske är det mindre.
Men datorn ser det som att ha olika sektioner.
Något går ner där.
Något annat går upp där.
Olika saker går i mitten.
Och idag börjar vi bara berätta denna historia.
>> Men vi ska återkomma till detta med tiden.
För nu, är det enda minne vi verkligen bryr oss om texten segmentet
eftersom det bara representerar nollor och ettor
som klang har matas ut.
Så när du kör ett kommando på tangentbordet som a.out, eller om du dubbelklickar
klicka på en ikon i Mac OS eller Windows, är ditt program laddas från din hårddisk
köra in i RAM.
Och det är plopped på toppen av datorns RAM-minne, så att säga.
Nu under tiden, eftersom ditt program startar och viktigaste anropas i
program som du skrev eller programmet Microsoft eller Apple skrev någon av dess
lokala variabler hamnar nere på botten av din dators minne.
Men om huvudsakliga samtal en annan funktion som själv har variabler eller
argument hamnar de ovanför.
Och om den funktionen kallar någonting, hamnar de över det,
ovanför det, ovanför den.
Och endast en gång en funktion görs verkställande gör stapeln av brickor, så
att tala, börjar få lägre och lägre.
Och detta är vad då, i ett nötskal, förklarar varför när du ringer kub -
eller du kallar steg -
du passerar i en kopia av värdet.
Och vad det betyder bildmässigt är att du bokstavligen skriver den
nummer 1 i en annan del av minnet, förändras att 1 till 2, i fallet med
steg -
eller till en 8, i fallet av kub -
och sedan kasta att minnet bort så snart ökning eller kuben
returnerar funktionen.
>> Fråga.
[OHÖRBAR]
David J. MALAN: Var - globala variabler lagras i vad
närvarande kallas de initialiserade data eller oinitierade data.
Skillnaden är, om du har en global variabel, och du tilldelar den
omedelbart ett värde med likhetstecknet, slutar det upp på toppen där.
Och om du bara säga int x semikolon utan värde, slutar det upp något
lägre i RAM helt enkelt genom konventionen.
Övriga frågor.
Okej.
>> Så den här bilden kommer tillbaka när vi får mer kraftfull med vad vi kan göra
med datorn.
Men för nu, låt oss ha en kort introduktion till kryptografi, en särskild typ av
kryptografi som inte lösa alla världens problem, men löser
några av dem.
I detta fallet här har vi något som kallas hemlig nyckel kryptografi.
Och hemlig nyckel kryptografi, som namnet antyder, får sin säkerhet
från en hemlighet.
Så till exempel om du är tillbaka i skolan och du passerar en
liten hemlighet kärleksbrev till pojke eller flicka som du krossar på - om du
ville passera det genom publiken, du förmodligen inte skulle skriva
sådan anteckning i engelska eller vad ditt modersmål är, utan du
kan kryptera den.
Eller du kanske bara skicka ett textmeddelande i dessa dagar.
Men du kan faktiskt passera dem en anteckning hela klassrummet.
Och att göra detta på ett säkert, på ett sådant sätt att dina vänner och lärare
vet inte vad du skriver, kan du komma med en ganska enkel
algoritm -
ung men du kanske -
bara förvränga orden.
Så istället för att skriva A kan du skriva B. Istället för B, kan du skriva
C. Istället för C, kan du skriva D och så vidare.
Eller så kan du komma med en mer sofistikerad översättning av brev
till olika bokstäver.
Men fångsten är pojke eller flicka som du ska skicka detta meddelande måste
vet något.
Vilket är vad, uppenbarligen?
Precis, vad din hemlighet är.
Liksom, vad är det mappning mellan As och Bs och Cs och Ds?
Är det att lägga bara en, så att säga, till var och en av bokstäverna för att gå från
A till B, B till C?
Är det mer komplext än så?
Så du och din kärlek måste ha denna hemlig information.
Men det är lite av en fångst-22 här.
Om detta är första gången du skickar detta kärleksbrev genom
klass, hur det pojke eller flicka kommer att veta vad hemligheten med är?
Så hemlig nyckel krypto löser inte alla världens problem.
Och det finns faktiskt en relation som vi ska återkomma till mot
termin slut.
>> Likaså har ingen av oss förmodligen någonsin skickat ett -
Inte heller vet de flesta av oss inte någon som fungerar till exempel på
Amazon.com.
Och ändå har många av oss köpte nog grejer på Amazon.com.
Och vi har fått lära oss att anta att dessa e-handel
transaktioner är säkra.
Eller hur?
Webbadressen säger förmodligen https.
Det är kanske en dum liten hänglås någonstans.
Det finns någon form av kryptering säkra din kreditkortsinformation
mellan dig och Amazon.com.
Och ändå, om kryptografi innebär att veta någon hemlighet, och ändå gör jag inte
Vet någon på Amazon, och jag har verkligen inte arrangerat någon form av
Hemligheten med någon på Amazon, hur min dator eller min webbläsare gör detta?
Tja, visar sig att det finns andra typer av kryptografi sammanlagt att lösa
det problemet.
Men för idag, vi fokuserar på enkel, där du kan ordna i
avancera till känna någon hemlig, liksom plus 1 eller någon mappning mellan As och B..
>> Och processen för kryptografi involverar generellt detta.
Du har några oformaterad text, visas här till vänster.
Du kör det genom någon form av algoritm eller förfarandet
för kryptering det.
Kanske det är bara en blir B blir B C Och sedan du sluta med
chiffertext.
Samtidigt när din kärlek får den hemliga anmärkning, har han eller hon då
dekryptera det med allmänt motverka dessa algoritm för att få
stödja klartext.
Nu finns fysiska inkarnationer av detta.
Till exempel är det en liten hemlighet dekoder ringen.
Och detta är en ring i den meningen att det finns två rattar här.
På utsidan periferi denna sak, det finns bokstäverna A till Z,
även om de är i slumpmässig ordning.
Och på insidan, det finns faktiskt några siffror, så att vi med detta
ring, kan du typ av vrid utsidan men inte på insidan för att rada upp
siffror med bokstäver.
Och i klippet du ska se - av vilka du kan ha sett 24/7
runt julen från en film som heter A Christmas Story.
Du ser den lilla Ralphie var så ivriga att räkna ut vad lilla föräldralös
Annies hemliga budskap var för honom som hade lämnats ut, tror jag, i
form av numeriska meddelanden på en seriell låda.
Och du var tvungen att samla alla de små korten som kom
i flingpaket.
Du var tvungen att skicka dem i.
Du var tvungen att få tillbaka den hemliga dekoder ringen, så att du äntligen kan räkna
vad mappningen mellan bokstäver och siffror,
eller bokstäver och bokstäver.
Så jag ger er denna korta klipp från A Christmas Story att motivera pset 2 och
vår diskussion, i ett ögonblick av matriser.
Så här har vi Ralphie.
>> [VIDEOAVSPELNING]
-Var det känt för alla och envar att Ralph Parker härmed utses en
medlem av Little Orphan Annie Secret Circle och har rätt till alla
äran och fördelar inträffar detta.
-Undertecknad, Little Orphan Annie.
Kontrasignerade, Pierre Andre!
Med bläck!
Heder och förmåner som redan vid nio års ålder.
Kom, låt oss gå vidare med det.
Jag behöver inte allt som jazz om smugglare och pirater.
-Lyssna morgon kväll för den avslutande äventyr The Black
Pirate Ship.
Nu är det dags för Annies hemliga meddelande till dig medlemmar
av Secret Circle.
Kom ihåg, barn, kan bara medlemmar i Annies hemliga Circle avkoda
Annies hemliga budskap.
Kom ihåg att Annie beroende av dig.
Ställ dina stift till B2.
Här är budskapet.
12, 11 -
-Jag är i mitt första hemliga mötet.
-14, 11, 18, 16 -
Pierre var i stor röst ikväll.
Jag skulle kunna berätta att kvällens budskap var verkligen viktigt.
-3, 25.
Det är ett budskap från Annie själv.
Kom ihåg att inte berätta för någon.
-90 Sekunder senare, jag är i den enda rummet i huset där en pojke på nio
kunde sitta i avskildhet och avkoda.
Aha, gick B. Jag till nästa.
E. Det första ordet är vara.
S. Det kom lättare nu.
U.
-Kom igen, Ralphie.
Jag måste gå.
-Jag kommer ner, MA.
-Gee vina.
-T, O. Var noga med att.
Var noga med att vad?
Vad var Little Orphan Annie försöker säga?
Var noga med att vad?
-Ralphie!
Randy har fått gå.
Kan du komma ut?
-Okej, mamma.
Jag kommer strax ut.
-Jag närmar nu.
Spänningen var hemskt.
Vad var det?
Öde planeten kan hänga i balans.
-Ralphie!
Randy har fått gå.
-Jag är rätt ute, för crying out loud.
-Gee, nästan där.
Mina fingrar flög.
Mitt sinne var en stål fälla.
Varje por vibrerade.
Det var nästan klart.
Ja, ja, ja, ja.
-Var noga med att dricka ditt Ovaltine.
Ovaltine?
En crummy kommersiell?
Jävel.
[END VIDEOAVSPELNING]
>> David J. MALAN: Så där har vi kryptografi.
Så hur i en dator kan vi gå att genomföra eller
representerar saker som detta?
Tja, vi behöver ett sätt att uttrycka oss själva lite mer flexibelt än
våra variabler hittills ha tillåtit.
Vi har haft Ints.
Vi har haft tecken.
Vi har haft flöten och dubblar och några andra.
Men de är enskilda delar av minnet som egentligen inte möjligt för oss att
uttrycka saker som ord och meningar och fraser.
I själva verket har vi kallade dessa saker strängar.
Men vi lovade att det är egentligen bara en förenkling av CS50
bibliotek som vi avser att dra tillbaka.
>> Och så låt oss börja att göra det här.
Låt mig gå vidare och öppna upp en fil -
alla dessa filer finns som vanligt på nätet -
kallas array.c att lösa ett problem utan samband med strängar men det ger en
bild här av hur vi kan använda något som kallas en matris.
En array är en datatyp.
Det är en typ av variabel, av slag, har det flera mindre datatyper
insidan av det rygg mot rygg mot rygg mot rygg.
Så till exempel, om vi vill skriva ett litet program som ger dig din
frågesport genomsnitt för en kurs som 50 som har två frågesporter, du kan mycket enkelt
skriva det här programmet - baserad även på några av förra veckans material -
genom getInt och ett par variabler.
Int quiz1, int quiz2, och det är ganska enkelt.
Det är kanske 10, 20 rader kod, max, för att genomföra ett program som uppmanar
användare för två frågesport poäng och sedan beräknar deras genomsnittliga genom att lägga till dem
tillsammans, dela med två, och sedan skriva ut resultatet.
Vi kan nog göra det ganska lätt nu efter
ett antal minuter.
>> Men problemet är att anta att 50 hade tre frågesporter eller fyra.
Anta att du vill använda samma program för en klass som hade
veckovis frågesporter.
Tänk på en klass som varje vecka har frågesporter.
Om det är som 16 eller så veckor i termin, nu har du 16 variabler -
int quiz1, int quiz2, int quiz3, int quiz4.
Så snart du börjar se denna redundans, detta kopierar och klistrar in
av kod, bör den börja att göra dig önskar att det fanns ett bättre sätt.
Och tack och lov, på grund av matriser finns.
Så låt oss göra det här.
Först, låt mig presentera en mycket enkel sak att vi inte har använt hittills,
men du kommer att se det ibland i koden.
Detta är vad som allmänt kallas en konstant.
Så det är en konstant i den meningen att detta värde inte ändras.
Den mänskliga konvention när du skapar en konstant är att använda allt kapital
bokstäver, bara så att det verkligen sticker ut i din kod.
Och den speciella nyckelord som du använder i C definierar #.
Så om du säger # define då ett utrymme, så det ord du vill använda för
konstanten namn, och sedan värdet på konstanten.
Så varsel, skiljer sig detta från att tilldela något till en variabel.
Det finns inga likhetstecken.
Det finns ingen semikolon.
Detta är vad som allmänt är känt som en förprocessor direktiv, men mer på
att en annan gång.
>> För nu, skapar detta en oföränderlig värde kallas frågesporter vars faktiska
numeriska värdet är 2.
Så var du ser frågesport, frågesport, frågesporter hela filen, det är
bara antalet 2.
Nu, om jag tittar på huvud nu, låt oss se hur det fungerar.
Till en början ser det lite kryptiskt.
Men det är alla grejer från vecka ett.
Be användaren för betyg.
Hur gör vi det?
Tja, i linje 22 -
detta är verkligen saftig delen -
Jag förklarar en flottör, men inte bara en enda flottör.
Jag förklarar snarare en rad flyttal.
Den variabeln kommer att kallas kvaliteter, vilket antyds här.
Men den enda del av nya syntaxen är då dessa hakparenteser, det faktum
att jag har sagt float betyg och öppna sedan konsolen och sedan ett nummer.
Observera, om detta är en konstant, det är precis som vi gjorde här.
Detta innebär Hey dator, ge mig två flottar, och låt oss tillsammans kalla
dem betyg.
Detta är i motsats till en mycket mer mödosam process som denna.
Float Grade1, flyta grade2, och så vidare.
Så en array kan vi genomföra denna idé, men mycket mindre messily i
ett sådant sätt att vi kan skriva en kodrad i stället för, säg, 16 för en 16
vecka termin.
Så jag ville inte hård-kod 2 för om man tänker på detta nu
logiskt - antar nästa år CS50 ändringar 3 frågesporter istället.
Och jag hade nummer 2 här.
Jag hade nummer 2 här.
Det blir mycket tröttande och mycket lätt att skruva upp och av misstag ändra
ett värde till 3 och missa något annat värde av 2.
Så jag ska istället abstrakta detta bort och använda denna konstant som, som sitt
namnet antyder, förändras aldrig.
Och nu, frågesporter ingen roll om vi har olika i år eller nästa, jag
bara att ändra det på ett ställe, här uppe på toppen.
>> Så det är allt konstant är.
Samtidigt är den nya konceptuella funktion som av en matris.
Så hakparenteser ge mig så många flottar och låter mig kollektivt
kalla dem kvaliteter här.
Så nu ska vi se vad jag ska göra.
Här i linje 24 är början av en for-slinga.
Detta är verkligen ingenting fancy.
Det är bara att använda frågesporter stället för en hårdkodad nummer.
Men det finns inget intellektuellt annorlunda där från förra veckan.
Detta är bara printf.
Så printf ("frågesport nummer% d av% ​​d") eftersom jag vill bara skriva ut mig frågesport
nummer ett av två och sedan två av två.
Så detta är en ren estetisk sak.
Men det intressanta är nu i linje 27.
För att fylla i en av de två platshållare med en flyttal
värdet använder du igen hakparenteser.
I det här fallet, jag använder jag eftersom det för slinga har börjat med i motsvarande
vilket värde, tydligen?
0.
>> Så på den första iteration av denna slinga är det som om jag
skrev i kod.
Men på den andra iteration av denna slinga är det som om jag
skrev detta i min kod.
Men det faktum att jag använder en variabel är perfekt eftersom, som namnet
antyder, det variera dess värde på varje iteration.
Så jag fyller denna array en plats åt gången.
Hur ser denna array ut?
Jo, anledningen till att jag drog denna super enkel rektangel på skärmen här
tidigare var av denna anledning.
En array är bara en bit av minnet, följt av en annan bit av minne,
följt av en annan bit av minne, och så vidare.
Så om min array är av storlek 2, i detta fall här, allt jag skulle göra med
skriva i min frågesport poäng, som här.
Jag fick 100 på detta.
Och sedan fick jag en 99 på detta.
Då detta minne kanske inte ens användas eftersom jag har bara bett
dator för en rad storlek 2.
Dessa rutor är fortfarande där.
Eller hur?
Du har fortfarande två gigabyte RAM-minne, även om du bara
ber för två flottörer.
Så tanken bakom arrayer är att datorn bara tar en bit av minne
och sedan fördelas proportionellt mindre bitar rygg mot rygg mot rygg mot rygg.
Och så är allt en array är.
Det är en sammanhängande bit av minnet, inuti som du kan lägga saker.
>> Nu händer sedan göra några tråkiga aritmetik.
Om jag bläddra ner hit, det är här jag sedan iterera över arrayen.
Jag kommer upp med summan av alla värden i arrayen.
Och då använder jag den runda funktion här att faktiskt göra
Sammanfattningsvis dividerat med frågesporter.
Men låt mig våg min hand på det som en slags tillräckligt aritmetik för nu.
Men allt som gör för mig ytterst beräknar ett genomsnitt.
Så först frågesport plus 2. Frågesport, dividerat med 2, och sedan skriva ut
ut som en int.
>> Men låt övergång nu till en annan exempel heter sträng1,
vilket ger en liknande bild, men med strängar.
Låt mig gå vidare och förenkla detta för ett ögonblick.
Och förlåt indraget för nu.
Meddelande i linje 19 i detta exempel, får jag en sträng från användaren.
Men märka vad jag nästa ska göra i rader 22 och framåt.
Jag är faktiskt iteration från i upp till - och detta är ett nytt trick -
strlen, stränglängd.
Detta är en funktion som kommer med C att om du ge det en sträng, berättar den
hur många tecken i strängen.
Det är allt.
Det faktum att det är strlen istället för sträng längd är bara för att det är
mer kortfattad.
30 år sedan, tyckte folk att skriva saker så kortfattat som möjligt.
Så vi har hållit denna konvention här.
i + + betyder bara öka i i varje iteration.
Och nu märker detta, vilket är riktigt intressant.
Så i linje 24, säger jag dator, ge mig ett tecken, åtta
bitar, och kalla det C.
Men vad är detta på höger sida säger?
På engelska, vad står?
[OHÖRBAR]
David J. MALAN: Exakt.
Ge mig det första tecknet i arrayen.
Eller mer allmänt, ge mig det i: te tecknet i arrayen.
Och inse att det är nu viktigt att som datavetare, vi är faktiskt
räkna från 0.
Du behöver inte handlingsfrihet nu att börja göra det.
Nu måste du agera i enlighet med datorns förväntningar och
räkna från noll eftersom [0] kommer att bli den första
tecken i en sträng.
[1] kommer att bli den andra.
[2] kommer att vara den tredje, och så vidare.
Så det här programmet, om jag sammanställa det - det är, återigen, sträng1.
>> Så gör sträng1.
Och nu har jag kör sträng1 i min terminalfönster.
Det väntar för inmatning, så jag kommer att skriva på, säger David.
Enter.
Och nu skriver DAVID alla på olika linjer, eftersom
märke till vad jag gör.
Jag skriver ett tecken i taget.
Nu ska vi inte gå in i detalj i dag om detta.
Men jag raderade nyss denna kontroll här.
Det visar sig att om användaren missköter, kontradiktoriskt, eller bara
förvirrad, kan du inte faktiskt ge en sträng av viss längd.
Om du trycker på fel tangent på tangentbordet, kan du ge
ingen sträng alls.
Eller om du är skadlig, kan du prova att klistra in en gigabyte värde av en
uppsats för att fylla denna sträng.
Och om datorn får slut på minne, visar det sig att vi ska
att få tillbaka denna speciella värde som kallas noll.
Så för nu, bara veta att det är det här särskilt värde som kallas noll att
ger oss möjlighet att kontrollera när vi är ute på minne, bland annat.
>> Men om jag öppnar nu sträng2, märker en skillnad här.
Lägg märke till en skillnad här med sträng2.
Med sträng2 är detta för slinga lite annorlunda.
Låt mig ta bort nollorna så att vi kan tala om dem en annan gång.
Men vad är annorlunda for-slingan den här gången?
Och jag kan gå tillbaka till det tidigare exemplet.
Så det är version två.
Detta är version ett.
Ett, två, ett två.
Så strlen samtalet var?
Det är i första delen av for-slingan.
Några tankar om varför jag gör det här?
Ja.
[OHÖRBAR]
David J. MALAN: Så vi inte anropa funktionen varje gång.
Exakt.
Minns från loopar att de är super enkelt när du typ av
förstår att detta är initialiseringen, den
tillstånd, och uppdateringen.
Problemet är att villkoret händer på varje
iteration av slingan.
Och så i detta exempel här är vad dåligt över att
att detta är mitt tillstånd?
Du ringer strlen igen och igen och igen.
Men när jag har skrivit i David, är längden på den strängen fem.
Och det kommer inte att ändra på varje iteration av slingan eftersom
strängen är fortfarande D-A-V-I-D. Så detta är ett tips på vad som kommer att bli en
allt viktigare idé som kallas en konstruktion beslut där - bara inte
göra datorn gör onödigt arbete.
>> Nu precis som en förhandstitt på pset 2, pset 2 i standardversionen är
kommer att utmana dig att faktiskt genomföra ett visst antal chiffer, några
Antalet krypteringsalgoritmer, så att du både kan kryptera och dekryptera
hemliga meddelanden, ungefär som en Ralphie avkodas där.
I hacker upplagan av pset 2, kommer vi att gå lite längre.
Vi kommer att lämna dig en fil från en verklig datorsystem som innehåller en
massa användarnamn och faktiska krypterade lösenord, och utmaningen
för hacker upplagan kommer att vara att knäcka dessa lösenord och figur
vad kryptografi eller vad hemligheten användes för att faktiskt
generera dessa lösenord.
Och vi kommer att göra detta genom att använda en ny funktion här på C som jag ska ge
du bara en demo av, så kallad kommandoradsargument.
>> Så det visar sig, som en del av er kanske har sett i avsnitt eller i läroböcker,
viktigaste inte alltid vara ogiltig inom parentes.
Det visar sig att stora även kan skrivas så här, med två argument,
argc och argv, där argc är antalet ord som du skriver efter
programmets namn på kommandoraden.
Och argv är själva orden.
Och som hakparenteserna där antyder, är argv tydligen en matris.
Det kommer att vara en sträng efter en sträng efter en sträng i minnet.
Så vad vi ska kunna göra, med början pset 2,
något sådant.
Om jag gör argv1, vilket är ett exempel som vi ska återkomma till på måndag, och kör
den, märker att det inte verkar göra något ännu.
Den skriver bara ut sitt eget namn.
Men om jag säger adjö klass, meddelande att detta program uppenbarligen itererar
över vart och ett av orden som skrivs vid prompten.
Och de medel genom vilka vi får tillgång till ord som användaren har
skrivit vid prompten är genom att ändra huvud, från och med i helgen, från int
huvud (void) och int main (argc, argv).
Och på så sätt kommer att födas kommandoradsargument.
Och när du får riktigt sofistikerad på detta, kommer du att kunna skriva
verkligen trippy program, som denna här, som går utöver
vissa funktioner vi har gjort hittills, men alla ganska kraftfull.
>> Så vi lämnar detta med detta på skärmen.
Och vi kommer att se dig på måndag.