[Powered by Google Translate] [Week 2, Vervolg]
[David J. Malan, Harvard Universiteit]
[Hierdie is CS50. - CS50.TV]
Alles reg. Dit is CS50, en dit is die einde van die week 2.
As jy verwag om honger wees rondom hierdie tyd môre,
weet dat ons gaan om te belê as 'n klein groepie môre, Donderdag, 13:15.
Daar is hierdie URL hier as jy wil om te RSVP.
Ruimte beperk is, so asseblief vergewe indien die vorm ingevul het deur die tyd wat jy vul dit uit.
'N ander URL, al is, wat dalk van belang is.
In net oor 'n maand se tyd, word die kursus gaan beskikbaar gestel word
al die meer in die algemeen via EDX, via wat mense op die Internet sal in staat wees om te volg saam,
baie aktief betrokke te raak in die kursus, in werklikheid.
Hulle sal gebruik word om die CS50 Appliance en CS50 Bespreek
en die meeste van die verskillende sagteware gereedskap wat ons het reeds hierdie semester is deur.
En een van die inisiatiewe wat ons wil doen hierdie jaar as 'n eksperiment
is om te sien net hoe baie inhoud wat ons kan vertaal
in ander gesproke en geskrewe tale.
So as jy kan 'n belangstelling in die deelname aan hierdie projek
waardeur ons sal voorsien Engelse transkripsies en ondertitels vir die kursus se lesings
en kortbroek en seminare en artikels en dies meer,
as jy praat vlot of vlot 'n ander taal te skryf,
sou ons is lief vir jou om betrokke te raak by hierdie projek waardeur jy op een of meer van die video's,
vertaling daarvan in 'n taal wat jy baie goed ken.
>> Om te gee jou 'n gevoel van die koppelvlak, daar is hierdie web-gebaseerde user
dat ons sal gebruik word om wat in wese 'n UI soos hierdie.
Dit is my onderrig sommige Halloween gelede,
en op die regterkant is daar in swart langs hierdie tyd stempels,
sien jy die verskillende dinge wat uit my mond gekom het daardie dag,
en dan onder dit wat jy sal in staat wees om in 'n ander taal te vertaal
presies wat die kartering tussen, in hierdie geval, Engels en, sê, Spaans.
So dit is eintlik 'n baie gebruikers-vriendelike instrument.
Jy kan rewind en vinnig vorentoe baie maklik met sleutelbord kortpaaie.
So as jy wil om deel te neem in hierdie eksperiment en het jou woorde gesien en gelees
deur potensieel duisende mense daar buite, doen asseblief voel vry om deel te neem.
Een woord oor die katjie van Maandag.
Sodat ons 'n té scary boodskap gestuur het, besef dat, as kantoorure dui daarop
en as afdelings stel, die ontwerp van die kursus is baie
het studente saam en praat om te werk deur die probleem stelle
en probleme saam, en regtig die lyn net kom neer op,
weer, moet die werk wat jy uiteindelik stuur jou eie wees.
En so eerlik te wees, in kantoorure dit is heeltemal normaal,
Dit is heeltemal om selfs verwag word, te gesels met 'n paar vriend langs jou.
>> Indien hy of sy sukkel met 'n paar onderwerp en jy soos,
"O, goed, laat my gee u 'n blik van 'n paar lyn van die kode wat ek geskryf het," dit is fyn,
wat gebeur, en dit is baie bevorderlik is, dink ek, met die proses van leer.
Waar die lyn kry gekruis is wanneer die kop is 'n soort gekantel hier vir te veel sekondes
of minute wat werklik net 'n IP addresses are not geleentheid vir jou vriend,
en seker wanneer dinge uitgeruil via e-pos en Dropbox en dies meer,
daar is ook die lyn.
Dus, deur al beteken gemaklik voel en voel aangemoedig om saam met vriende te gesels
en klasmaats oor psets en meer en net besef dat dit wat jy uiteindelik dien
moet dit eintlik die produk van jou skepping en nie iemand anders nie.
En so een van die domein-spesifieke probleme vir pset2,
wat laat môreaand sal kom, is om te duik in die wêreld van kriptografie,
wat is die kuns van die versleutelen of skommeling van inligting,
en dit uiteindelik tot die wêreld van sekuriteit.
Sekuriteit vir die meeste van ons kom nou, in die vorm van 'n redelik aards meganismes.
Almal van ons het gebruikersname en wagwoorde,
en almal van ons het 'n baie slegte gebruikersname en wagwoorde, waarskynlik.
>> As jou wagwoord is dieselfde op verskeie websites, wat is waarskynlik nie die beste idee,
soos ons sal na die einde van semester se bespreek.
As jou wagwoord word geskryf op 'n taai noot - nie 'n grap nie - op jou monitor,
dit is ook nie noodwendig die beste ontwerp, maar nogal 'n algemene verskynsel.
En as jy nie die gebruik van kriptografie jou wagwoorde te enkripteer,
hulle is veral kwesbaar.
So as jy dink jy super slim deur 'n verborge Word-dokument
iewers op jou hardeskyf wat al jou wagwoorde
maar dit is in 'n gids wat niemand gaan om te kyk, ook dit is nie 'n baie veilige meganisme.
En so wat pset2 sal stel, is om die kuns van kriptografie
en roer inligting sodat dinge soos wagwoorde is al die meer veilig.
Die konteks hier is dat met onseker data
kom 'n geleentheid om dit te enkripteer en te scramble dit.
En so gaan dit, byvoorbeeld, is 'n voorbeeld van 'n geënkripteerde boodskap.
Dit sê eintlik iets in Engels, maar dit is duidelik nie heeltemal duidelik nie.
En ons sal volle sirkel kom vandag uitmekaar te terg wat hierdie geheime boodskap hier is.
Maar in die werklike wêreld van rekenaars, dinge doen nie, selfs lyk asof hulle Engelse frases kan wees.
Byvoorbeeld, dit is wat jy kan vind op 'n standaard Linux of Mac of UNIX-rekenaar
in 'n lêer wat was eens op 'n tyd het die wagwoord lêer.
>> Vandag is dit na ander plekke verskuif.
Maar as jy kyk, sien jy op die regte plek op 'n stelsel nie net jou gebruikersnaam
of dat van die ander mense op die stelsel, maar jy sal sien 'n geënkripteerde weergawe van hul wagwoord.
Trouens, die woord grafkelder daar dui daarop dat die volgende dinge is geïnkripteer,
en hierdie reeks van oënskynlik arbitrêre letters en karakters en nommers en so meer
Ontcijferde kan word slegs deur die algemeen weet 'n paar geheime -
'n geheime woord, 'n geheime getal -
en inderdaad, die kuns van kriptografie uiteindelik neer van een of ander aard te vertrou
en weet iets wat iemand anders nie.
So sal ons ondersoek dit in 'n bietjie meer detail vandag en in die pset te kom.
En nou, 'n woord oor slaag / druip.
Veral as sommige van julle het geduik in pset1, die toestel,
en 'n nuwe wêreld vir jouself, besef dat frustrasies en verwarring
en net tegniese probleme is redelik om te verwag word,
veral met die eerste pset, waar daar net so baie nuwe,
net om vertroud is met ls en CD en al hierdie arcane opdragte
en 'n nuwe omgewing, en dit is apart van die werklike materiaal en programmering self.
So ook besef dat daar is beslis kantoorure wat bestaan ​​as 'n ondersteuning struktuur.
>> Artikels begin eerskomende Sondag.
Maar die belangrikste, as jy voel net dat dit nie die wêreld vir jou,
besef dat dit regtig nie net tyd neem.
En as dit nie vir hierdie geleentheid jare gelede vir my van die neem van 'n klas slaag / druip,
eerlik, ek het nooit sou selfs gestel het voet in die klaskamer.
En jy kan dit verander tot, sê, die vyfde, die Maandag van die kursus,
so as jy op die rand nou, besef dat eerder as hoof heeltemal in 'n ander waters,
oorweeg beslis nie net die verandering om te slaag / druip.
Weereens, daar is nie regtig hierdie kultuur hier by Harvard van die neem van dinge slaag / druip
aangesien almal wil regtig te bereik of te overachieve,
maar eerlik, dit is 'n wonderlike manier om te probeer om iets uit
wat dalk nie vertroud wees aan jou, en jy sal uiteindelik doen, in die meeste gevalle, baie fyn,
miskien baie tot jou verbasing.
En in meer konkrete terme, wat ek dink slaag / druip in die algemeen nie,
veral as jy dalk ervaar het met pset0,
as jy sit in 10 uur, 15 uur, 25 uur in 'n paar pset
en jy is net gebons jou kop teen die muur en dit is steeds super laat in die nag
maar jy het die pset 90% van die pad en jy kan net nie uitvind een ding,
slaag / druip regtig die rand van 'n klas soos hierdie,
waar jy kan soort van gelukkig sê: "Goed, ek weet dit is nie volmaak,
Maar Ek het my gat af op hierdie, ek is redelik tevrede is met waar dit geëindig het, "
en dit sal voldoen aan die verwagtinge vir slaag / druip.
So hou dit in gedagte. Alles reg.
>> Sodat diegene van julle wat gesukkel het om gebruik te maak van die Harvard-Universiteit Wi-Fi,
weet dat daar 'n CS50 SSID, 'n Wi-Fi-verbinding, rondsweef
dat jy dalk 'n beter kans hê.
Dit is nogal ironies dat die wagwoord vir hierdie, as jy wil om te probeer om die verbinding met
vir 'n beter spoed - en laat ons weet as dit is geen beter - is 12.345, al die pad tot 8
want 8 is meer veilig as 5.
So as jy die Wi-Fi wagwoord verbinding met CS50 draadloos hier, 12.345.678,
en post op CS50 Bespreek as jy nog intermitterende konnektiwiteit kwessies,
en ons sal toelaat dat die magte wat wees weet vir hierdie ruimte. Alles reg.
So 'n vinnige teaser, veral vir dié van julle wat is fan seuns of meisies van alle dinge Apple.
Wat ek opgegrawe van 'n paar jaar terug, was hierdie lêer hier, iUnlock.c,
net om te soort van meer konkrete en meer komplekse
sommige van die meer basiese C programme het ons skryf.
So ek het hierdie lêer, iUnlock.c. Dit is beskikbaar op die Lesings bladsy vir vandag.
Op die linkerkant sien jy 'n lang lys van funksies.
So die man wat dit geskryf het 'n baie van die funksies, meer as net die belangrikste.
Hy gebruik 'n hele klomp van biblioteke hier, en as ons begin blaai deur,
wat dit werklik is, is die heel eerste, glo ek, kraak vir die oorspronklike iPhone.
>> As jy wou die oorspronklike iPhone te jailbreak, wat beteken untether van AT & T
en eintlik spesiale sagteware te installeer op dit en doen dinge wat Apple het nie wil hê mense moet doen,
iemand die tyd geneem het om uit te vind presies hoe hulle sagteware foute kan ontgin,
- iUnlock.c-foute, foute, in Apple sagteware, en dus is gebore
dat as jy saamgestel dit op jou rekenaar en geïnstalleer het dit op 'n iPhone
wat is gekoppel aan jou rekenaar via ', sê, 'n USB-kabel,
hierdie sal gee jou 'n administratiewe of root voorregte op jou iPhone
en laat jy pretty much doen wat jy wil.
En so daar is hierdie fassinerende kat en muis-speletjie
tussen Apple en die res van die wêreld in die besonder as hulle, soos baie maatskappye,
probeer om hulle goed af te sluit, sodat jy kan net doen met dit wat hulle van plan is.
Maar te danke aan mense soos hierdie en die begrip van 'n lae-vlak details -
en in hierdie geval C programmering - en 'n baie van die bekende konstrukte
dat ons het begin speel met, jy in staat is om werklik gebaseer is op die hardeware
op 'n wyse wat jy goeddink en nie noodwendig 'n korporatiewe entiteit.
So byvoorbeeld, ek het geen idee wat dit alles doen,
maar GetVersion klink redelik eenvoudig,
en dit lyk asof dit is 'n funksie wat hierdie persoon het geskryf.
Dit neem 'n soort van die heelgetal as 'n argument, kom nie terug nie enigiets,
maar blyk te loop met 'n lus hier en 'n as toestand, as toestand breek,
en hou op een of ander manier weergawe nommers as ons scroll down,
selfs al is 'n baie van hierdie sleutelwoorde gaan nuut wees.
En daar is 'n hele klomp van die funksies hier het ons nog nooit gesien het en dalk nie ooit sien
oor die loop van die semester.
>> Aan die einde van die dag is, volg dit dieselfde reëls en logika wat ons het is speel met tot dusver.
So dit is veels te oud om jou iPhone 3s of 4s of gou 5s hierdie dae te kraak,
maar weet dat dit alles baie afgelei van hierdie wêreld wat ons het geduik in.
Kom ons neem 'n blik op 'n bietjie meer eenvoudige voorbeeld:
hierdie een, net om te warm kry met 'n paar sintaksis en ook 'n paar ander datatipe
dat ons het gepraat oor, maar het nie regtig gesien in C.
Dit is 'n lêer genaamd positive1.c, en volgens die kommentaar aan die bokant,
Dit vereis net dat 'n gebruiker 'n positiewe getal.
So dit is 'n voorbeeld van 'n do-while lus, wat is lekker vir die gebruiker interaktiewe programme
waar jy nodig het om die gebruiker te vertel om iets te doen,
en as hulle nie saam jy skree op hulle of verwerp hul insette.
Case in point: Ek gaan doen lyne 19 deur 24
so lank as wat die user het nog nie vir my 'n positiewe getal.
Hierdie detail hier on line 18, hoekom het Ek verklaar n bo hierdie hele herhaling bou
eerder as na regs langs lyn 22 waar ek eintlik omgee om n te kry? Ja.
[Student] Scope. >> Ja, so hierdie kwessie van die omvang.
En in leketaal, wat beteken omvang verwys na?
Ja. >> [Onhoorbaar student reaksie] >> Kan jy 'n bietjie harder praat?
[Student] Waar kan jy toegang tot daardie veranderlike. >> Perfect.
Waar jy kan toegang tot 'n spesifieke veranderlike.
En oor die algemeen, die oppergesag van die duim tot dusver is dat die bestek van 'n paar veranderlike
word gedefinieer deur die mees onlangse krullerige draadjies wat jy gesien het.
>> En so in hierdie geval, as ek die fout gemaak verklaar n on line 22, sal daardie lyn werk.
Ek sou 'n int te kry, en ek sou sit dit in daardie veranderlike n in line 22,
maar wat lyn van die kode sal nou geen idee wat ek praat? >> [Student] 25.
[Malan] 25, en dit blyk uit 24 goed so, want in hierdie geval is dit val buite die kode tussen krulhakies.
So net 'n bietjie van 'n oorlas nie, maar baie maklik opgelos deur eenvoudig te verklaar die veranderlike
buite die funksie self.
Ons sal later vandag sien jy kan 'n stap verder te gaan
en jy kan selfs 'n bietjie lui.
En dit is nie in die algemeen aanbeveel word, maar jy kan selfs lui
en sit 'n veranderlike wêreldwyd, om so te praat, nie binnekant van 'n funksie, nie binnekant van 'n lus,
maar in die lêer self, buite van al die funksies wat jy geskryf het, soos ek gedoen het hier on line 15.
Dit is oor die algemeen frowned upon, maar besef dat dit 'n oplossing soms tot ander probleme,
soos ons sal uiteindelik sien.
So vir nou sal ons laat dit soos hierdie, maar laat ons kyk of ons kan Herskryf hierdie
net om te begin met die uitdrukking van onsself 'n bietjie anders.
Hierdie program, net om duidelik te wees, is positive1.
Laat my voort te gaan hier en in my terminale venster positive1, Enter.
Stel okay. Ek gaan positive1 uit te voer, druk Enter.
Ek eis dat jy gee my 'n positiewe heelgetal. Ek sal -1 sê. Wat nie werk nie.
0, 99. Dit blyk te werk.
Miskien nie die mees streng toets, maar ten minste is dit 'n mooi gesonde verstand tjek
dat ons op die regte spoor is.
>> So laat my nou voort te gaan en maak weergawe 2 van hierdie,
en wat verskillend is reeds?
Dit implemente die dieselfde ding, maar wat spring uit as duidelik anders hierdie keer?
Dit Bool in groen. Dit word uitgelig in groen, hierdie navraag bekend as Bool, wat is 'n data tipe.
Dit kom nie gebou in al die weergawes van C.
Jy moet 'n spesifieke biblioteek in te sluit.
In ons geval, ek sluit die CS50 biblioteek sodat ons toegang tot Bool.
Maar in reël 18, maar dit lyk asof ons 'n Boolese waarde hier genoem dankbaar te hê.
Ek kon genoem het iets, maar ek noem dit dankbaar
net soort van 'n paar semantiese betekenis oor te dra.
So aanvanklik on line 18, ek glo nie dankbaar
omdat die Boole-waarde dankbaar is geïnisialiseer vals in lyn 18.
En dan lyk dit wat ek hier gedoen het in lyne 21 deur 23
Ek het net soort van herskryf my logika.
So nie funksioneel verskillende, maar nou in lyn 22 Ek is so indien die int die gebruiker verskaf
groter as 0 is, dan het ek eenvoudig die waarde van dankbaar vir ware verander.
En hoekom doen ek dit? Want in line 25, glo ek gaan om 'n toestand te monitor.
Doen dit loop terwyl dankbaar is vals.
So het ek voorgestel as 'n alternatief vir weergawe 1
want dit is ten minste 'n bietjie meer intuïtief miskien, dit is 'n bietjie meer gegrond is in Engels.
So doen die volgende terwyl jy nie dankbaar is of terwyl dankbaar is vals.
En ook hierdie keer Ek glo gee nie hoef te onthou wat die gebruiker getik in
want kennis is daar geen veranderlike N, so werklik, daar 'n klein wit leuentjie.
>> Funksioneel, die program is 'n bietjie anders is wanneer ons kry aan die onderkant van
omdat ek nie onthou wat n is.
Maar ek wou hier demonstreer ook dat selfs al het ons gesien getint
en GetString wat gebruik word op die regterkant van 'n gelykaanteken tot dusver
sodat ons onthou die waarde, tegnies, dit is nie streng noodsaaklik is.
Indien, vir watter rede ook al jy net nie omgee om die waarde te red,
jy wil net om seker te maak van die waarde, opmerk dat ons net kan dit skryf as getint,
oop hakie, naby hakie.
Daardie funksie gaan 'n waarde om terug te keer, soos ons gesê.
Dit gaan jou terug te gee 'n int.
En so, as jy geestelik dink dit gebeur,
wanneer ek tik in 99, getint gee die getal 99,
en so konseptueel, dit is asof my kode eintlik.
So as 99 is inderdaad groter as 0, dan is dankbaar ware,
dan besef lyn 25 ooh, ons gedoen, want ek is nou dankbaar,
en in reël 26, het ons net sê, "Dankie vir die positiewe heelgetal!"
wat dit gebeur om te wees.
Laat ons nou doen effense "sintaktiese suiker hier, om so te praat.
Kom ons kyk as ons kan skoon te maak hierdie lyn 25 met hierdie derde en laaste variant in positive3.
>> Let op die enigste verskil is nou watter reël van die kode? >> [Student] 25. >> [Malan] Ja, 25.
En ons het nie regtig hierdie truuk gesien net nog nie, maar ons het die uitroepteken op Maandag,
wat dui op wat? >> [Student] nie. >> Nie of ontkenning.
So 'n Boolese waarde en die waarde daarvan te flip.
True vals, valse waar.
So, ek sou voorstel, is selfs 'n bietjie meer intuïtief 'n manier van die skryf van die kode
omdat ek nog steeds dankbaar vir valse inisialiseer, het ek nog steeds doen die volgende,
Ek dankbaar vir waar, wanneer die tyd aanbreek,
maar nou kan jy net regtig vertaling van hierdie kode mondelings links na regs,
while (dankbaar!), want bang of uitroepteken dui op die idee van nie,
Dus, terwyl nie dankbaar nie.
Dit weer doen, het ons nie 'n nuwe konsepte per se.
Ons het gepraat oor Booleans terug toe ons gespeel met Scratch,
maar besef nou ons kan net begin skryf ons kode in baie verskillende maniere.
Dus, veral in pset1 as jy soort van sukkel om uit te vind die manier om 'n program te skryf,
kans is jy in geluk, want daar kan 'n aantal oplossings
dat jy kan gebeur.
Byvoorbeeld, dit is net 3 vir selfs die eenvoudigste van programme. Alles reg.
En nou onthou op Maandag ons links op hierdie nota met die terugkeer waardes.
Dus, vir die heel eerste keer het ons het 'n program wat nie net hoof;
dit het ook sy eie persoonlike funksie wat ek hier geskryf het.
Dus, in line 31 deur 34 Ek het 'n kubus funksie geïmplementeer.
Dit is nie kompleks. Dit is net 'n * 'n * in hierdie geval.
Maar wat is belangrik om daaroor is dat ek insette is in die vorm van 'n
en ek terugkeer uitset in die vorm van 'n * a * a.
So nou is ek het die vermoë om, net soos Ek gebruik met prinf alleen,
hierdie funksie te roep deur die roeping van die kubus funksie.
>> En die kubus funksie neem 'n paar insette, en die kubus funksie gee 'n paar uitset.
In teenstelling, printf net iets gedoen het.
Dit het nie weer enigiets wat ons versorg, selfs al is dit nie as 'n eenkant 'n waarde teruggee;
jy net in die algemeen ignoreer dit.
Printf net iets gedoen het. Dit het 'n newe-effek van die druk op die skerm.
In teenstelling hier, ons het die kubus funksie, wat eintlik iets terug.
So vir diegene wat vertroud is met hierdie, dit is 'n redelik eenvoudige idee.
Maar vir diegene wat minder vertroud is met hierdie idee van wat in insette en om terug uitsette,
laat ons probeer om net iets super eenvoudig.
Is iemand gemaklik kom kortliks op die verhoog?
Jy moet gemaklik wees met 'n kamera op jou as goed. Ja? Okay.
Wat is jou naam? >> [Student] Ken. >> Ken. Alles reg. Ken, kom op.
Ken gaan na 'n funksie van spesies hier te wees.
Kom ons gaan voort en doen dit. Kom ons kry 'n bietjie fancy.
Nice om jou te ontmoet. Welkom by sentrum stadium. Alles reg.
Laat hierdie knoppie getref hier. Alles reg.
So hier het jy 'n moderne skryfbord,
en wat ek is, is die belangrikste funksie, byvoorbeeld,
en ek het nie 'n iPad in my hand.
>> Ek het nie regtig onthou hoe om te - Wel, ek kan nie sê dat.
Ek het nie regtig 'n goeie handskrif,
en so ook ek wil hê dat jy iets op die skerm vir my te druk.
Ek synde die hoof program, en ek gaan te hê wat jy sê dit
deur dit te skryf in my hoender kras en dan verby jou 'n inset.
So dom al hierdie oefening is, is die idee van die funksies en die roeping van 'n funksie
en die terugkeer van 'n funksie regtig kook afbring na hierdie.
Ek am Main, ek het nou net printf, kwotasie-unquote iets geskryf op die skerm,
Ek hardloop hierdie program, en so gou as printf kry genoem,
wat dit neem om 'n argument of een parameter soms tussen dubbele aanhalingstekens.
Hier is die argument. Ek om dit aan Ken.
Hy is 'n swart boks skriftelike n aantal jaar gelede
wat blykbaar weet net hoe om dinge op die skerm te druk.
So voer.
Dit is nie sleg nie. Baie goed.
So nou Ken gedoen uitvoering. Moet hy aan die hand my niks terug?
Nie dat ons het tot dusver gesien het.
Weereens, eintlik printf terugkeer 'n nommer, maar ons gaan om dit te ignoreer vir nou
want ons het dit nooit gebruik nie. So wat is dit vir Ken.
En so nou hoof neem oor die beheer van die program weer
omdat daardie lyn van kode, printf gedoen uitvoering.
En ons gaan oor ons pad, die uitvoering van enige ander lyne is daar.
So nou, laat ons probeer om 'n effens ander voorbeeld.
Hierdie keer hier laat ons eers die skerm skoon te maak, en hierdie keer sal ons die cubing funksie doen,
maar hierdie keer, ek verwag 'n uitset waarde.
>> So laat ons gaan voort en doen dit.
Nou het ek 'n reël van die kode wat sê x kry kubus van x.
Die lyn van kode, herroep, lyk soos volg: x = kubus (x);
So hoe is dit gaan werk? Kom ons gaan voort en gee jou weer 'n wit skerm.
Ek gaan nou neer te skryf die waarde van x,
wat op hierdie oomblik in die tyd gebeur om te wees, laat ons sê, 2 om dit eenvoudig te hou.
Ek geskryf het op 'n stuk papier, die waarde van 2, wat is my waarde x.
Ek oorhandig dit aan Ken. >> En ek het net skryf die antwoord? >> Ja, laat ons net skryf die antwoord.
Okay. En nou het hy my iets om terug te keer. Perfect. Nice segue.
So nou is hy oorhandig my die waarde van 8 terug in hierdie geval, en wat moet ek doen met dit?
Eintlik - laat ons sien, kry dit reg. Wat gaan ek te doen met dit?
Nou gaan ek om hierdie waarde te neem en eintlik is dit in daardie stukkies in die geheue stoor.
Maar let Ek is soort van sukkel hier.
Ek is 'n bietjie verward, want waar ek skryf eintlik die waarde van x,
want wat ek het net gedoen is fisies hand Ken 'n stuk papier wat die waarde 2,
wat x, en inderdaad, dit is presies wat gebeur het.
So dit blyk dat wanneer jy noem die funksie en jy in 'n argument
soos hello, wêreld of jy slaag in 'n argument soos 2,
die algemeen, jy wat in 'n afskrif van daardie argument.
En net soos ek geskryf het die getal 2 hier en oorhandig dit aan Ken,
wat beteken dat ek nog steeds 'n afskrif van die waarde 2 iewers
want inderdaad, nou dat ek die waarde 8 terug gekry het, ek nodig het om terug te gaan in RAM
en eintlik neer te skryf 8 waar ek een keer die getal 2.
So visueel, onthou hierdie idee van verbygaande, letterlik, 'n afskrif van die waarde.
>> Ken doen sy ding, oorhandig my terug iets - in hierdie geval 'n waarde soos 8 -
en dan het ek het iets te doen met daardie waarde as ek wil om dit rond te hou.
So al hierdie dinge sal terug kom al te bekend is kort voor lank te wees.
Thank you so much vir hierdie demo hier, Ken. [Applous]
Baie goed gedoen.
Kom ons kyk hoe dit uiteindelik betrekking het op sommige van die funksie roeping wat ons hier doen.
Laat my gaan voort en bring ons terug na die cubing voorbeeld hier.
Let op dat as ons wil eintlik begin om dit verder te neem,
ons gaan hê om bewus te wees van die feit dat die aantal x wat hier geslaag
is verskil van wat is eintlik oorgedra word na die funksie.
Dit weer doen, is dit die pad verbygaan afskrif gaan om 'n baie related in net 'n oomblik.
Kom ons neem 'n blik op iets wat nie heeltemal reg is nie werk nie.
Ek gaan om voort te gaan en 1/3 buggy voorbeeld, wat deur die natuur gebrekkig is oop,
en dit word genoem buggy3 en dit implementeer 'n uitruiling funksie.
Hier het ons het 'n belangrike funksie wat x en y het arbitrêr geïnisialiseer aan 1 en 2, onderskeidelik.
Ons kan gebruik getint, maar ons het net 'n eenvoudige oefening nodig het,
so dit is hard-gekodeerde as 1 en 2.
In reëls 21 en 22, het ons blykbaar druk x en y, 1 per lyn.
Dan on line 23, ek beweer ek hierdie waardes is uitruiling, dot, dot, dot.
Ek het blykbaar noem 'n funksie in lyn 24 sogenaamde swap neem 2 argumente.
Dit is heeltemal wettig vir funksies 2 argumente te neem. Ons het gesien printf dit reeds doen.
>> So swap neem blykbaar x en y, en soos sy naam suggereer,
Ek hoop dat dit gaan om hierdie 2 waardes te ruil.
So dan het ek beweer on line 25 "verruil!" en ek herdruk x en y
onder die veronderstelling dat hulle het wel omgeruil.
Maar as ek hierdie program - laat my 'n terminale venster oop te maak,
laat my toe om buggy3 - soos die naam aandui, is dit nie gaan om goed te eindig
want toe ek druk Enter opmerk dat x is 1, y is 2,
en nog nie aan die einde van die program, het hulle nog steeds, in werklikheid, dieselfde.
So gebaseer op die demonstrasie nou net met Ken, wat eintlik aan die gang?
Kom ons duik in hierdie swap funksie. Dit is super kort. Dit is net 'n paar reëls van die kode lank.
Maar wat is die fundamentele probleem wat gebaseer is op die eenvoudige storie vertel hier met Ken?
Hoekom is swap gebreek?
[Student] Jy stoor 'n afskrif, nie die veranderlike.
Presies. Ons is die stoor van 'n kopie, nie die veranderlike self.
Met ander woorde, swap neem blykbaar 2 argumente, 'n int,
en dit is arbitrêr a en b genoem,
en hier is ek in X en Y, wat onderskeidelik 1 en 2 geslaag het,
maar ek het letterlik is nie wat in x, ek nie letterlik wat in y,
Ek verby 'n afskrif van x en 'n afskrif van y.
Dit is amper asof jy gekopieer en geplak in ruil
die waardes wat jy dit wil hê om werklik te manipuleer.
So as dit die geval is, toe ek die program begin die uitvoering van lyn 35 dan 36,
wanneer ek by lyn 37, op hierdie punt in die verhaal, wat is die waarde van 'n?
Op hierdie punt in die verhaal, lyn 37, wat is die waarde van 'n op hierdie punt? >> [Student] 1.
[Malan] Dit moet net 1, reg, omdat x geslaag is in die eerste argument,
en hierdie funksie is net arbitrêr roep sy eerste argument.
Net so is y die tweede argument, en dit is arbitrêr net die roeping van die tweede argument b.
>> Hierdie digotomie is redelik eintlik eenvoudig verduidelik. Dink daaroor.
Nie een van ons het met die persoon wat geskryf het printf,
so sekerlik, hy of sy het geen idee wat ons veranderlikes 30 jaar later gaan genoem te word nie.
So is daar 'n onderskeid tussen wat jy noem veranderlikes in die funksies wat jy skryf
en wat jy noem veranderlikes in funksies wat jy vra of die gebruik van.
So met ander woorde, het ek geskrywe my veranderlikes x en y,
maar as iemand anders geskryf het om die ruil-funksie, wat hy of sy sou beslis nie geweet
wat my veranderlikes gaan genoem te word,
besef dat dit is waarom jy het hierdie dualiteit van name.
Tegnies, kan ek dit doen deur die toeval,
maar hulle sal nog nie geslaag word as kopieë.
Dit sou net 'n toeval esteties indien daardie persoon wat swap geskryf
gebruik het dieselfde name.
So op hierdie punt in die verhaal, lyn 37, 'n is 1, b 2, en nou kan ek gaan om dit te ruil.
Eerste van alles, laat my eintlik doen dit baie meer eenvoudig.
Ek weet nie wat hierdie 3 reëls van die kode doen.
Laat my net dit doen: b = a; a = b; gedoen.
Hoekom is hierdie gebroke, logies?
Dit is soort van die intuïtiewe ding, reg?
So 'n raak-b en b raak 'n,
maar die probleem is dat so gou as line 37 voer, wat is die waarde van a en b?
Dieselfde, 1, want jy het oók deurloop, om so te praat, jy het verander b 'n gelyk.
So een keer lyn 37 uitgevoer word, wat is 'n groot, jy het nou 2 kopieë van die aantal 1
binnekant van hierdie funksie, so dan wanneer jy sê in lyn 38 a = b,
jy soort van geskroef omdat jy net 1 toeken van 1.
Jy het soort van verlore die waarde wat jy omgegee.
So in die oorspronklike weergawe van hierdie, let op wat ek gedoen het.
Ek plaas het 1/3 lyn van kode wat lyk soos hierdie.
Ek verklaar 'n tydelike veranderlike.
>> TMP is 'n baie algemene naam vir 'n tydelike veranderlike, en dit is 'n int
omdat dit aan te pas wat ek wil hê om 'n kopie te maak van.
Ek slaan afskrif van 'n binnekant van die tmp, so een keer lyn 37 uitgevoer,
die waarde van 'n vinnige sanity check - 1, die waarde van b 2,
en die waarde van die tmp is ook 1.
So nou is ek voer lyn 38.
Sodra lyn 38 voer, neem die waarde van b. En b was 2, so 'n is nou 2.
So op hierdie punt in die verhaal, 'n 2, b 2, en tmp is 1,
so nou logies, ons kan net plop tmp se waarde in b en wat ons gedoen het.
Dus het ons dat die probleem opgelos.
Ongelukkig is wanneer ek hardloop hierdie program in hierdie vorm, beteken dit nie eintlik ruil enige waardes.
Maar duidelik te wees, hoekom?
Ek vaste die logiese probleem van net 'n oomblik gelede,
maar weer, as ek hierdie program, x en y bly onveranderd
deur die einde van die program se uitvoering.
[Onhoorbaar student comment] >> Ons het nie terug nie, so dis waar.
Maar dit blyk daar is 'n bietjie van 'n probleem hier, want tot dusver,
die enigste ding wat ons het in staat was om terug te keer is een ding, en dit is 'n beperking van C.
Jy kan eintlik net een waarde terug, in welke geval ek is soort van vas hier
want ek kon die nuwe waarde van x terug of ek kon terugkeer om die waarde van y,
maar ek wil beide terug.
So die terugkeer van die eenvoudige oplossing is nie hier nie.
Maar die probleem is fundamenteel hoekom? Wat ons eintlik verruil?
[Student] a en b. >> A en b.
Maar a en b is afskrifte van x en y, wat beteken dat ons net het al van hierdie werk,
ons net het 3 minute praat oor die ruil-funksie en al 3 van hierdie veranderlikes,
en dit is 'n groot, heeltemal korrek in isolasie nie,
maar 'n en B se omvang is slegs in hierdie lyne hier.
>> Dus, net soos 'n lus as jy 'n heelgetal verklaar ek binne die lus
Net so, as jy verklaar dat a en b binnekant van 'n funksie wat jy geskryf het,
hulle is slegs geldig binnekant van daardie funksie, wat beteken dat so gou as swap gedoen die uitvoering van
en ons gaan van lyn 24 tot line 25, x en y nie op alle verander.
Jy moet net 'n hele klomp van die tyd uitruiling afskrifte van veranderlikes gemors.
So dit blyk dat die oplossing vir hierdie werklik is nie-voor-die-handliggende.
Dit is nie heeltemal genoeg waardes om terug te keer, want ons kan net 1 waarde terugkeer,
en Ek het regtig wil beide x en y op dieselfde tyd te ruil,
so ons gaan te hê om terug te kom na hierdie.
Maar vir nou, besef dat die kwessie fundamenteel afgelei van die feit dat a en b is afskrifte
en hulle is in hul eie omvang.
Kom ons probeer om dit in die een of ander manier op te los.
Laat my eintlik blaai terug hier en oop te stel, laat ons sê, 1/4 variant van hierdie buggy4.
Wat van hierdie?
Dit is 'n soortgelyke, maar eenvoudiger probleem op te kyk voordat ons neem 'n steek om dit op te los.
Hierdie program word genoem inkrement, en dit het blykbaar initialisatie van 'n x-heelgetal tot 1 in reël 18.
Ek het toe beweer x 1, het ek dan sê, "verhoog van ..."
Ek dan noem inkrement, maar dan in lyne 22 en 23, ek beweer dit is geïnkrementeer,
Ek beweer x is nou wat dit ookal is - 2, vermoedelik, maar hierdie program is buggy.
Wat is die probleem?
Ja. >> [Onhoorbaar student reaksie] >> Presies.
So x verklaar is, natuurlik, on line 18.
Dit is binne die hoof se krullerige draadjies.
So het die eenvoudige antwoord is dat, terwyl x hier bestaan,
dit nie bestaan ​​nie in reël 32, so sal hierdie program eintlik nie eens stel.
Die samesteller wanneer ek probeer die opstel van hierdie kode is om te skreeu op my
oor 'n paar onverklaarde identifiseerder of iets te dien effekte. Om die waarheid te sê, laat ons probeer.
Dit is om buggy4. Daar is dit.
Gebruik van onverklaarde identifiseerder 'x' in lyn 32.
En eintlik, laat ons meer eksplisiet hier vandag so dat dit is nuttig
kantoorure en by die huis.
>> Let daarop dat dit 'n bietjie kripties geskryf.
Maar die feit dat die geratel het op ons geskree, sê buggy4.c: 32:5, is werklik nuttig.
Dit beteken dat die fout is on line 32 by karakter posisie 5.
So 1, 2, 3, 4, 5. Dit is, in werklikheid, waar die probleem is.
En ook, ook in gedagte hou by die kantoorure en by die huis, ek is gelukkig hier.
Ek het 'n fout. Dit gaan wees relatief maklik om vas te stel.
Maar as jy 'n hele skerm vol van oorweldigende fout boodskappe,
weer besef dat die onderste een kan wees net simptomaties van die boonste een.
Altyd so jaag jou foute van top-down
omdat daar dalk net 'n daisy chain effek
wat daarop dui jy het 'n manier om meer probleme as wat jy werklik doen.
So, hoe kan ons dit regmaak as my doel is om X te inkrementeer? >> [Student] Maak x globale.
Okay, sodat ons kan x wêreld.
Kom ons neem die kortpad dat ek gewaarsku oor vroeër, maar heck, ons moet net 'n quick fix,
so laat ons net sê int x hier. Dit maak x wêreld.
So nou hoof het toegang tot dit en inkrement het toegang tot dit,
en laat my daarom voort te gaan en stel dit nou.
Maak buggy4 Enter. Lyk nou te stel.
Kom ons loop buggy4. En dit lyk eintlik werk.
Dit is een van die dinge wat ons doen soos ek sê, nie soos ek doen,
soos ek net gedoen het, want in die algemeen,
ons programme gaan kry veel meer interessant en baie langer as dit,
en as jou oplossing vir die lewe se probleme word net al die veranderlikes op die top van jou lêer,
baie vinnig programme kry horrifically moeilik om te beheer.
Dit word moeiliker om te dink nuwe veranderlike name,
dit word moeiliker om te verstaan ​​watter veranderlike te doen wat,
en so in die algemeen, is dit nie 'n goeie oplossing.
So laat ons dit beter doen.
Ons wil nie 'n globale veranderlike hier te gebruik.
>> Ek wil x inkrementeer, so ek kon natuurlik -
aan die einde van die dag, dit is 'n soort van 'n lawwe storie omdat ons net dit doen -
maar as ek nie weet dat operateur of Ek was nie toegelaat om dit te verander in die hoof self,
hoe sou Ek anders implementeer Ken hier hierdie tyd nie te kubus, maar inkrementeer?
Hoe verander ek hierdie ding hier? Ja.
[Student] Pass in x en dan terug [onhoorbaar] >> Goed, goed.
So hoekom ek slaag nie in x en dan eerder as om dit terug,
hoekom ek nie net terug x + 1.
'N paar dinge hier te verander nie. Ek is op die regte pad.
Wat anders het ek nodig om Tweak? Iemand anders. Ja.
[Onhoorbaar student reaksie]
Ek nodig het om die opgawe tipe van inkrement te verander, want dit is nie nietig.
Void beteken niks word teruggekeer, maar duidelik is dit nou,
sodat hierdie behoeftes te verander - >> [student] int.
int om konsekwent te wees met alles wat ek eintlik terugkeer.
Nou iets anders is nog steeds karretjie hier. Ja.
[Onhoorbaar student reaksie] >> [Malan] So ek moet X te inkrementeer?
[Onhoorbaar student reaksie] >> [Malan] Ag, so ek nodig het om x te slaag.
So ek het dit nodig om hier te doen. >> [Onhoorbaar student kommentaar]
[Malan] So het die prototipe, Ek het dit hier te verander.
So dit het na 'n int, dit het te word -
hmm, ek het eintlik 'n fout hier neer. Kom ons los hierdie een eerste.
Wat dit eintlik moet wees? Dit het tot 'n int iets te wees.
Dit kan wees x, maar eerlik, as jy begin roep al van jou veranderlikes x,
dit gaan te kry minder en minder duidelik wat is wat.
>> So laat ons na willekeur net kies 'n ander Naming Convention vir my helper funksies,
die funksies wat ek skryf. Ons noem dit 'n, of ons kan dit noem -
Kom ons noem dit nommer te wees, selfs meer eksplisiet.
So dan het ek om terug te keer, ongeag die aantal plus 1,
en nou het ek 1 ander ding hier te verander en 'n ander ding hier.
Wat moet ek eerste on line 21 te verander? >> [Onhoorbaar student reaksie]
[Malan] Ek het dit toe te ken aan x. Ek kan net nie noem inkrement (x).
Ek nodig het om te onthou van die antwoord deur die verandering van die waarde van x op die linkerkant.
En selfs al is x is nou op die links en regs, dit is heeltemal fyn
omdat die regterkant kry eers uitgevoer dan kry plof in die linkerkantste ding -
x in hierdie geval.
En dan laastens, dit is 'n maklike fix nou.
Dit moet net ooreenstem met wat hieronder neer, int nommer.
So 'n hele klomp van die veranderinge vir 'n baie dom funksie
maar verteenwoordiger van die dinge wat ons toenemend sal wil doen.
So maak buggy4. Ek het screwed up iewers.
O, my God. Vyf foute in 'n 6-line program.
So, wat is verkeerd on line 18, karakter 5?
So ek het om dit te verklaar, int.
Kom ons kyk. Daar is 'n hele klomp van die ander foute.
O, my God - 19, 18, 21, maar weer, laat ons net duidelik die skerm, beheer L hier,
heruitzend kletteren.
So 5 probleme is eintlik net dat 1.
So nou laat ons hardloop buggy4, Enter. Sjoe, het x korrek geïnkrementeer.
Alles reg. Enige vrae oor hoe om getalle te inkrementeer? Ja.
[Onhoorbaar student vraag] >> Goeie vraag.
Hoe is dit dat ek net kan verander x aantal en die program sal onmiddellik weet?
>> Weereens, dink aan dit as hierdie abstraksie.
So as ek die hoof-en Ken is inkrement, eerlik, ek gee nie om nie wat Ken noem sy iPad.
Ek gee nie om wat hy noem enigiets wat te doen het met sy implementering van hierdie funksionaliteit.
Dit is 'n uitvoering detail dat ek, hoof, het nie te bekommer oor.
En so eenvoudig om dit te verander konsekwent binnekant van die funksie - nommer hier en nommer hier
is al wat dit neem so lank as wat ek heropstel.
Dit is soort van soos as jy daaroor dink baie van ons, dié van julle met rybewyse
wat gedryf as jy het selfs in 'n motor gedryf word,
Die meeste van ons het geen idee hoe 'n motor werk onder die kap.
En letterlik, as jy maak die kap, die meeste van ons - myself ingesluit -
gaan nie regtig weet wat ons is op soek na,
soort van soos jy kan nou met dinge soos dit reg voel.
Maar ons het nie regtig omgee hoe die motor werk,
ons hoef nie te sorg wat al die latte en suiers en kabels binnekant van die motor
eintlik mee besig is.
So iets soos wat jy noem die suier saak nie hier in hierdie geval. Dieselfde idee.
Ja. >> [Onhoorbaar student vraag]
Indien daar meer gebruike van die veranderlike xa oomblik gelede,
jou, die programmeerder, sou hê om hulle oral te verander.
Of jy kan letterlik doen Lêer, Menu, en dan vind, te vervang - iets soos dit -
maar jy gaan te hê om die veranderinge self te maak.
Jy het om konsekwent te wees. >> [Student] As daar meer veranderlikes [onhoorbaar]
'N spesifieke volgorde soos hier, en indien dit int n ander getal? >> [Student] korrek.
[Malan] Ja. Om sake wanneer jy bel die funksie.
>> So as ek roep inkrement hier met iets komma iets,
daar is 'n direkte kartering.
Die eerste veranderlike, wat dit ookal genoem word, is 'n afskrif van die eerste argument hier.
Jammer. Dit behoort nie 'n hakie.
Die tweede argument in lyn met die tweede een. So orde, ja, sake. Alles reg.
Jammer. Ek het die lang pad om daar te kom. Ander vrae? Alles reg.
So laat ons kyk of ons kan nie 'n prentjie van wat is eintlik hier aan die gang verf
onder die kap, om so te praat nie.
Dit is 'n reghoek wat kan verteenwoordig jou rekenaar se geheue.
Selfs as jy het geen idee hoe geheue werk of hoe 'RAM werke,
ten minste aanneem dat u trosse van hierdie dae.
Jy megagrepe dit het, het jy gigagrepe van dit,
en ons weet dat 'n greep uit week 0 is net wat? >> [Student] 8 stukkies.
8 stukkies, reg? So 8 nulpunte en 1.
So as jou rekenaar het 'n gig van RAM, 2 gigs van RAM hierdie dae,
jy het 'n miljard of 2 miljard grepe van die geheue of ongeveer 8 miljard of 16 miljard stukkies
binnekant van jou rekenaar.
In teenstelling met die klein dofklinkend Willy voorbeeld, dit is nie magnetiese deeltjies tipies meer.
Toenemend in skootrekenaars ten minste - dit is solid state drives, SSDs,
wat net het geen bewegende dele. Dit is al die elektroniese. Dit is al wat elektrisiteit-gebaseerde.
So dink van hierdie reghoek as net verteenwoordigend van die 1 of 2 GB geheue wat jy het.
>> So dit is 'n stuk van die geheue.
Die wêreld van die rekenaar wetenskap het soort van afgeskort
stukke van die geheue om verskillende dinge te doen.
Byvoorbeeld, as dit is jou rekenaar se geheue, soos voorgestel deur die reghoek daar,
dit blyk dat deur konvensie, op die top van jou geheue, om so te praat,
is oor die algemeen wat genoem word 'n teks segment.
Dit is die 0'e en 1s wat jy opgestel het.
So wanneer ons kyk onder die kap het teen watter a.out is,
al hierdie 0'e en 1s, wanneer jy 'n program,
diegene 0'e en 1s vanaf jou hardeskyf gelaai in iets genaamd RAM
en in die RAM hulle aan die bokant.
Intussen, jy het ander dinge: inisialiseer data, uninitialize data.
Diegene 2 spuitbane van die geheue verwys na globale veranderlikes, wat jy nie dikwels gebruik
maar soms as jy dit doen, het hulle uiteindelik daar as well.
Dan is daar is 'n paar ander dinge: omgewing veranderlikes, wat ons sal nie veel tyd spandeer op,
maar dan 2 belangrike dinge wat sal kom terug deur die loop van die semester,
stack en heap.
So die meeste van jou rekenaar se geheue gereserveer is wanneer 'n program
vir iets genoem die stapel en iets genaamd die hoop.
Ons gaan nie om te praat oor die hoop van vandag, maar ons sal praat oor die stapel.
Die stapel is bedoel om te besweer die visuele van die eetsaal maaltyd bak in Mather House
of waar jy ook wees waar die eetsaal personeel skoon hulle elke dag,
hulle stapel hulle van vloer tot
en insgelyks, in die geheue, daar is hierdie idee van om iets op 'n stapel,
om iets op 'n stapel, om iets op 'n stapel.
En wat bedoel ons met hierdie?
>> Kom ons zoom in op net die onderste helfte van hierdie foto, jou rekenaar se RAM,
die volgende voor te stel.
Dit blyk dat wanneer jy 'n program soos a.out of Hello -
ongeag die program is wat jy geskryf het -
weer, dié 0'e en 1s word van jou hardeskyf, wat is die langtermyn stoor gelaai,
bly daar selfs wanneer jy trek die plug, gelaai na RAM.
RAM is vinniger as hardeskywe - dit is kleiner as hardeskywe -
maar dit is waar programme leef terwyl jy hardloop hulle.
So jy dubbel kliek op 'n program op 'n Mac of PC, is dit van die hardeskyf in RAM gelaai.
So gou as wat dit in RAM, die 0'e en 1s gaan op die pad top gelaai,
die sogenaamde teks segment, maar dan so gou as jou program eintlik begin hardloop,
die belangrikste funksie genoem word, en die belangrikste, soos ons gesien het, het dikwels plaaslike veranderlikes,
en dit het ints en stringe en karakters en dies meer.
So as jou program wat jy geskryf het of die program wat jy het 'n dubbele gekliek
gebruik sommige veranderlikes binnekant van die belangrikste,
hulle uiteindelik aan die onderkant van jou stapel van die geheue, om so te praat.
Meer konkreet, wat beteken dit eintlik beteken?
Dit beteken net dat as ons gaan aantal grepe RAM op jou rekenaar,
agterkom dat dit kan byte nommer 0, kan dit byte nommer 1, 2, 3, 4, 5, 6,
al die pad tot 2 miljard sal al die pad tot daar aan die bokant.
So met ander woorde, wanneer ons praat oor RAM of geheue in terme van grepe,
dit beteken net dat iemand het besluit wat elkeen van daardie stukke van die geheue te tel.
So wanneer jy nodig het om 32 stukkies vir 'n int of wat jy nodig het 8 stukkies vir 'n kar,
waar eindig hulle in die geheue?
>> Konseptueel, het hulle net aan die onderkant van hierdie ding genaamd die stapel.
Maar wat is interessant nou is wanneer belangrikste noem 'n funksie -
Gestel 'n funksie genoem foo, net 'n arbitrêre naam -
wat gebeur belangrikste is, is aan die onderkant van die stapel geheue;
foo is nou op die top van die belangrikste in die geheue.
So 'n plaaslike veranderlikes wat foo het soort van konseptueel bo dié in die hoof beland.
As foo noem nog 'n funksie genoem bar, daardie veranderlikes hier beland.
As die bar iets anders, hier, hier, hier noem.
So, wat is interessant oor die uitvoer van 'n program is dat soos jy dit noem funksies
en as daardie funksies noem funksies en as dié funksies noem funksies,
jy die opbou van hierdie stapel van funksies in die geheue.
En slegs een keer 'n funksie opbrengste begin jy om daardie geheue terug.
So een van die maklikste maniere om uit te voer van die geheue in 'n rekenaar-program
is om te skryf funksies wat nooit weer terugkom nie.
So byvoorbeeld, laat soveel demonstreer met 'n opsetlik buggy program.
Laat my gaan voort en sluit # ,
int main (void),
en ek gaan om te doen terwyl (2> 1), wat waarskynlik ooit sal verander nie op ons,
en laat my nou voort te gaan en doen printf.
Eintlik, wat gaan minder visueel interessante. Kom ons doen dit.
Vir int i = 0; i> 0 - Kom ons maak hierdie fout - i + +.
En laat ons nie printf hier. Kom ons oefen wat ek preek.
Let's het 'n metode hier, nietig koor, en ons sal Int ek sê,
en dan het ek gaan printf sê - nee, laat ons maak dit meer interessant.
Laat ons nie eintlik print enigiets op alle. Kom ons doen dit: refrein (i).
Alles reg. So, dit is karretjie want hoekom?
Ek maak van hierdie as ek gaan omdat die program nie eintlik nie iets van belang nie.
>> Maar dit is nie die doel.
Die doel is om 'n program te skryf wie se hooffunksie doen, glo?
Bel hom. En eintlik, het ons nie nodig om die lus.
Kom ons selfs vereenvoudig dit net so as nie die oë van regtig die fundamentele fout te verloor.
Main oproepe koor koor te sing,
dan het ek het iets dom en ek het koor oproep chorus
want ek aanvaar iemand anders gaan dit dalk te implementeer,
en nou is dit nie van plan om nog te stel. Ek nodig het wat om te doen nie?
Ek moet die prototipe, onthou.
So het ek nodig om hier nietig koor (int i);
So nou as ek neerdaal hier - eintlik, kom ons gebruik die groter venster.
Kom ons gaan voort en maak koor.
Gebruik van onverklaarde identifiseerder i.
Ag, dit was dom. Ons hoef nie die argument nie. Kom ons doen dit.
Ek wens dat ons op hierdie manier begin het. Dit sou gewees het 'n baie makliker program in te skryf.
Daar. Nou, laat ons gaan oor na my terminale venster, tik klang, en hier gaan ons.
Dit was regtig vinnig.
Wat eintlik net gebeur, al is?
Wel, nou sal ek die gedrukte lyn voeg, sodat ons kan sien.
Laat my sê printf ("Ek is hier") - geen veranderlikes. Ons sal dit so verlaat.
Laat my weer uit te voer. Laat my heruitzend koor.
En ... kom op. Voort te gaan.
As 'n eenkant, waarom dit nie neergestort het nie?
Die segmentering skuld super vinnig gebeur het voor die aangesig van die.
[Onhoorbaar student reaksie] >> Presies. So dit neem tyd om te druk, reg?
Dit neem net meer werk op die rekenaar se deel.
En daar is dit: Segmentasie skuld.
>> So sien net hoe vinnig programme hardloop.
As jy nie die druk van enigiets, super vinnig.
Maar ons is nog steeds hierdie segmentering skuld, want wat gebeur het?
As jy dink oor hoe om jou rekenaar se geheue is uitgelê,
dit gebeur hoof te wees, maar hier laat ons net noem dit refrein, en laat ons noem hierdie koor.
As ek dan nou my estetika reg doen, dit is net gaan koor, koor, koor om te sê,
koor, koor, koor, koor, ad nauseum, en uiteindelik, wat gaan gebeur?
As die groot prentjie, letterlik, is dit wat gebeur net konseptueel?
Die stapel overschrijdingen die hoop.
Of nog erger, jy net oorskry alles, insluitende die teks segment,
wat is die 0'e en 1s dat jou program.
In kort, dit is net super, super sleg.
Jou program het buite beheer.
Jy gebruik manier om meer geheue as jy bedoel
alles as gevolg van 'n dom fout in hierdie geval,
of in hierdie geval 'n baie doelbewus gedoen funksie roeping self.
Nou, hierdie is nie net sleg nie.
Funksies wat hulself eintlik groot krag wanneer jy dit korrek gebruik.
Ek het nie gebruik dit korrek hier.
So dit is nie almal sleg nie, maar die feit dat ek eintlik nooit ophou roeping myself
is 'n fundamentele swakheid hier van hierdie program.
So waar gaan ons met al hierdie dinge? Wat werklik gebeur?
Toe ek noem die inkrement funksie soos ons besig was om in daardie voorbeelde,
Ek het 'n waarde soos 1 dat ek slaag.
Ek slaag in 'n afskrif van die aantal 1, so gebeur die volgende.
Kom ons gaan in die inkrement voorbeeld, hierdie ou reg hier.
Hier is wat werklik gebeur.
As ek roep inkrement en ek slaag in x, picturaal, wat gaan hier aan.
>> As ek die waarde van 1 gestoor hier en Ek het eintlik 'n beroep inkrement,
wat is nou bekend as koor - die iPad is gooi my af hier.
Kom ons noem hierdie inkrement, en ons weet nie wat hierdie volgende funksie gaan wees.
So wat eintlik gebeur is hier iewers in die belangrikste Ek het 'n stuk van die geheue
wat die stoor van die aantal 1.
As ek roep, increment, ek is met 'n ander stuk van die geheue,
maar nou het ek 'n afskrif van 1.
Toe ek daardie waarde inkrementeer, dit word 2,
maar wat gebeur dan so gou as inkrement opbrengste?
Hierdie geheue net kry oorhandig terug na die bedryfstelsel,
wat beteken dat alles wat jy gedoen het is niks nuttig.
Die 1 wat oorspronklik vervat in hoof is nog steeds eintlik is daar.
So waar gaan ons met hierdie?
Dit blyk dat in die geheue wat jy het hierdie rug-aan-rug volgorde grepe
dat jy kan sit dinge in, en dit blyk dat ons reeds gesien het iets
wat behels om dinge rug aan rug Terug na.
Wat is 'n string gebaseer op week 1 en nou week 2?
Dit is net 'n versameling van die karakters.
So dit blyk dat net soos jy kan sit in die geheue,
insgelyks kan jy karakters in die geheue.
En sodra ons begin om karakters in die geheue terug Terug na terug,
dit blyk dat die gebruik van die eenvoudigste dinge soos 'n for-lus of 'n while lus,
ons kan itereer van links na regs oor die karakters in 'n string
en begin massering hulle heeltemal in verskillende karakters -
kan word b, b kon word -
sodat uiteindelik, kan ons 'n Engelse sin wat werklik sin maak
en sit elkeen van daardie briewe 1 op 'n tyd
deur die loop deur ons rekenaar se geheue links na regs om werklik te enkripteer.
So laat ons vyf minute breek hier,
en wanneer ons terug kom, sal ons begin hierdie proses van skommeling inligting.
>> Alles reg.
Voordat ons duik in sommige crypto en hierdie dinge genoem skikkings,
laat my pouse vir enige vrae, want ek voel soos ek regtig soort vaag
sommige van daardie onderwerpe. So laat los nou as ons kan.
Ons het net gepraat oor die terugkeer waardes, het ons gepraat oor argumente,
en ons het gepraat oor hierdie idee, wat ons sal terug kom in die weke om te kom,
van die lees van geheue as 'n hele klomp van hierdie gestapel bak, om so te praat,
bottom up, soos dat elke tray wat op die stapel geplaas kry
'n funksie wat tans genoem.
Enige vrae?
Laat my 'n vraag hier vra.
Laat my vereenvoudig dit terug na wat dit was voor sommige van ons vorige Q & A.
Die feit dat die inkrement oop hakies, int nommer, gesluit hakies -
Wat int aantal verteenwoordig?
[Student] 'n argument. >> 'N argument. Okay. Maar wat is 'n argument?
[Onhoorbaar student reaksie] >> Wat is dit? >> [Student] Iets wat jy slaag.
Okay, so iets wat jy slaag. En meer in die algemeen, dit is net die inset.
As jy die skryf van 'n funksie en dat die funksie se doel in die lewe
is om iets te doen om 'n bietjie anders elke keer as jy dit gebruik,
dan is die enigste manier vir wat werklik gebeur sou blyk te wees om dit te voorsien met die insette
sodat dit iets anders kan doen met daardie insette elke keer.
>> So moet jy twee dinge nodig om te spesifiseer wanneer 'n funksie neem insette.
Jy moet die naam wat jy wil te gee aan daardie inset te spesifiseer
slegs vir jou eie gerief, sodat jy kan verwys na
in die funksie wat jy self skryf, soos ek gedoen het hier in lyn 32.
Maar jy moet ook die tipe spesifiseer, want C is 'n programmeertaal
wat vereis dat net dat as jy 'n veranderlike, jy het die rekenaar te vertel watter datatipe dit is,
in 'n groot deel sodat dit weet hoeveel stukkies toe te ken vir daardie veranderlike
want dit kan 6 - jammer, sal dit nie 6.
Dit kan wees 16, kan dit 8, kan dit wees 32, selfs 64,
maar die rekenaar nodig het om te weet.
Nou, die int op die linkerkant verteenwoordig wat, in teenstelling?
[Onhoorbaar student reaksie] >> Wat is dit? >> [Student] tipe funksie.
Die tipe van 'n funksie en, meer spesifiek, die tipe van sy produksie. Reg.
Dus, terwyl die ding in hakies verteenwoordig sy insette, indien enige,
die ding aan die linkerkant verteenwoordig sy uitset.
En in hierdie geval, inkrement terug blykbaar 'n int,
en so int is die terugkeer tipe van hierdie funksie.
Wat beteken dit om terug te keer?
Letterlik, jy gebruik die trefwoord terugkeer en dan as wat jy terugkeer
aan die regterkant van die term 'n heelgetal is,
dan is dit wel in ooreenstemming met wat ons gedoen het.
Jy kan nie iets doen soos hierdie - Hello, world - want dit is 'n string.
>> Natuurlik, dit is nie 'n heelgetal.
Dus, in kort, die las is regtig op ons, die programmeerder, om spesifiek te wees
as wat ons terugkeer en dan eintlik gaan oor die terugkeer.
Die konteks hier is nou dat jou rekenaar se geheue is 'n giga byte, 2 GB -
wat ook al - miskien is dit meer is, miskien is dit minder,
maar die rekenaar beskou dit as met verskillende afdelings.
Iets het daar iets anders gaan daar,
verskillende dinge gaan in die middel, en vandag het ons net begin om die storie te vertel,
maar ons sal terug kom na hierdie verloop van tyd.
Vir nou, die enigste stuk van die geheue ons werklik omgee is die teks segment
omdat dit net die 0'e en 1s dat kletteren verteenwoordig outputted.
So wanneer jy 'n opdrag op die sleutelbord soos a.out
of jy dubbel kliek 'n ikoon op Mac OS of Windows,
jou program word van jou hardeskyf gelaai in RAM
en dit plof op die top van jou rekenaar se RAM, om so te praat.
Intussen, as jou program begin loop en die belangrikste kry genoem
in die program wat jy geskryf het of die program Microsoft of Apple het geskryf,
enige van sy plaaslike veranderlikes beland daar by die onderkant van jou rekenaar se geheue.
Maar as hoof oproepe ander funksie wat self veranderlikes of argumente, het hulle uiteindelik bo dit.
En as daardie funksie roep iets, hulle uiteindelik bo, bo dit, bogenoemde is dit.
>> En slegs een keer 'n funksie is die uitvoering van die stapel van die bak, om so te praat,
begin te kry laer en laer afsak.
En dit is wat dan in 'n neutedop, verduidelik hoekom wanneer jy bel kubus
of jy bel inkrement, jy wat in 'n afskrif van die waarde.
En wat dit beteken picturaal is dat jy letterlik wil skryf die nommer 1
in 'n ander deel van die geheue, die verandering van 1 tot 2 in die geval van 'n inkrement
of aan 'n 8 in die geval van 'n kubus en dan gooi dat die geheue weg
so gou as die inkrement of die kubus funksie opbrengste. Vraag.
[Student] Waar is globale veranderlikes gestoor?
Globale veranderlikes word gestoor in wat tans bekend as die geïnisialiseer data of geïnitialiseerd data,
die verskil as jy 'n globale veranderlike en jy ken dit onmiddellik 'n waarde
met die gelykaan teken, dit beland op die top daar,
en as jy net int x sê, met geen waarde, dit eindig effens laer in RAM
eenvoudig deur konvensie.
Ander vrae? Alles reg.
So hierdie foto sal terugkom as ons kry meer kragtige
met wat ons kan doen met die rekenaar,
maar vir nou, laat ons 'n kort inleiding tot kriptografie,
'n spesifieke tipe van kriptografie wat nie al van die wêreld se probleme op te los
maar dit los sommige van hulle.
In hierdie geval hier, ons het iets genoem geheime-sleutel kriptografie.
Secret-sleutel kriptografie, soos die naam aandui, ontleen sy sekuriteit van 'n geheim.
>> Byvoorbeeld, as jy was terug in graad skool en jy is verby 'n bietjie geheime liefde brief
na die seuntjie of meisie wat jy breek, as jy wil om daardie kennis te slaag deur die gehoor,
jy sal waarskynlik nie so 'n nota in Engels te skryf of wat ook al jou moedertaal is.
Inteendeel, kan jy enkripteer of jy kan net hulle stuur 'n SMS-boodskap hierdie dae.
Maar jy kan dit eintlik slaag hulle 'n nota in die hele klas.
En dit veilig te doen in so 'n manier dat jou vriende en die onderwyser
weet nie wat jy skryf nie, kan jy kom met 'n redelik eenvoudige algoritme,
jong al het jy ook mag wees, net scramble die woorde.
So in plaas van die skryf van 'n jy kan skryf b,
in plaas van b jy kan skryf c,
in plaas van c jy kan skryf d, en so meer.
Of jy kan kom met 'n meer gesofistikeerde vertaling
briewe aan verskillende letters.
Maar die vangs is die meisie of seun aan wie jy die stuur van hierdie nota
iets nodig het, om te weet wat is wat, natuurlik? >> [Student] wat jy stuur.
Wat is jou geheim is, soos wat is die kartering tussen A's en B's en C's en D's.
Is dit voeg net 1 aan elk van die briewe te gaan van A na B, B na C?
Is dit meer kompleks as dit?
>> Sodat jy en jou geliefde moet hierdie geheime inligting te hê,
maar daar is 'n soort van 'n catch-22 hier.
As dit is die heel eerste keer wat jy stuur hierdie liefde brief deur die klas,
hoe is daardie seuntjie of meisie gaan om te weet wat die geheim is?
So geheim-key crypto nie al die wêreld se probleme op te los,
en daar is eintlik 'n verhouding hier dat ons sal terug kom na die einde van semester se.
Net so het die meeste van ons weet nie van iemand wat werk, byvoorbeeld, by Amazon.com,
en tog is baie van ons het waarskynlik gekoop stuff by Amazon.com,
en ons het al geleer om te aanvaar dat hierdie e-commerce transaksies veilig is.
Die URL sê waarskynlik https, is daar iewers dalk 'n dom bietjie hangslot ikoon,
daar is 'n soort van kriptografie die verkryging van jou kredietkaart inligting
tussen jou en Amazon.com.
En tog as kriptografie behels weet 'n paar geheime
en tog weet ek nie iemand by Amazon en ek het beslis nie gereël om enige soort van geheime
met iemand by Amazon, is hoe my rekenaar of my blaaier om dit te doen?
Dit blyk uit daar is ander vorme van kriptografie altesaam dat dat die probleem op te los.
Maar vir vandag, sal ons fokus op die eenvoudige een
waar jy kan reël vooraf 'n paar geheime te leer ken
soos 1 of 'n kartering tussen 'n's en b's.
En die proses van kriptografie behels oor die algemeen.
Jy het 'n paar plain text, uitgebeeld hier aan die linkerkant,
jy loop dit deur 'n soort van algoritme of prosedure vir versleutelen -
miskien is dit net 'n 'b, b raak c -
en dan beland jy met kriptoteks.
Intussen, wanneer jou geliefde hierdie geheime nota ontvang,
hy of sy decrypt dit dan deur die algemeen omkeer dat algoritme
so as om terug te kry die plain text.
Daar is fisiese inkarnasies van hierdie.
>> Byvoorbeeld, dit is 'n bietjie geheim dekodeerder ring,
en dit is 'n ring in die sin dat daar twee dials hier.
Op die buite rand van hierdie ding, daar is letters A tot Z,
hoewel hulle in lukrake volgorde,
en aan die binnekant, is daar eintlik 'n paar nommers
so dat jy met hierdie ring soort van draai die buitekant, maar nie die binnekant
ten einde te reël om getalle met letters.
Uit 'n fliek genaamd A Christmas Story, sal jy sien dat min Ralphie
was so gretig om uit te vind wat Little Orphan Annie se geheime boodskap aan hom was
wat gekommunikeer word, dink ek, in die vorm van numeriese boodskappe op 'n Graankoshouer
en jy het al die klein kaarte te versamel wat gekom het in die graan boks,
jy het om hulle te pos, jy het om terug te kry die geheime dekodeerder ring
sodat jy kan uiteindelik uitvind wat die kartering tussen letters en nommers
of briewe en briewe.
Hoe kan ons in 'n rekenaar gaan oor die implementering van of verteenwoordigend van dinge soos hierdie?
Ons moet 'n manier van uitdrukking van onsself 'n bietjie meer buigsaam
as ons veranderlikes tot dusver toegelaat het.
Ons ints het, het ons karakters het, het ons het vlotte en dubbels en 'n paar ander,
maar dit is individuele stukke van die geheue wat nie regtig ons in staat stel om dinge uit te druk
soos woorde en sinne en frases.
Inderdaad, het ons sulke dinge stringe genoem,
maar ons belowe dat dit eintlik net 'n vereenvoudiging in die CS50 biblioteek
dat ons van voorneme is om terug te skil.
En so laat ons begin wat om hier te doen.
Laat my gaan voort en 'n lêer oop te maak -
al hierdie lêers is beskikbaar, soos gewoonlik, online - sogenaamde array.c
'n probleem wat nie verband hou met stringe op te los, maar dit verf 'n prentjie hier
van hoe ons kan gebruik om iets wat 'n skikking genoem word.
>> 'N skikking is 'n data tipe.
Dit is 'n tipe van 'n veranderlike van spesies wat het verskeie kleiner datatipes binnekant van dit
rug aan rug Terug na.
So byvoorbeeld, as ons wou 'n klein program wat gee jou quiz gemiddeld te skryf
vir 'n kursus soos 50 wat 2 vasvrae,
kan jy baie maklik skryf hierdie program selfs op grond van sommige van verlede week se materiaal
getint en 'n paar van die veranderlikes deur gebruik te maak: int quiz1, int quiz2.
En dit is redelik eenvoudig.
Dit is miskien 10, 20 lyne van kode-max 'n program te implementeer
wat vir die gebruiker vra vir 2 quiz tellings en dan bere hul gemiddelde
voeg hulle saam, deel deur 2 en dan die druk van die resultate.
Ons kan waarskynlik doen redelik geredelik nou na 'n paar minute.
Maar die probleem is dat veronderstel dat 50 het 3 vasvrae of 4.
Veronderstel dat jy wou om dieselfde program te gebruik vir 'n klas wat weekliks vasvrae.
Dink na oor 'n klas wat weekliks vasvrae.
As daar 16 of so weke in 'n semester, nou jy het 16 veranderlikes:
int quiz1, int quiz2, int quiz3, int quiz4.
Sodra jy begin sien hierdie oortolligheid, kopieer en plak van die kode,
dit moet begin te maak jy wens daar was 'n beter manier.
En gelukkig, daar is as gevolg van skikkings. So laat ons dit doen.
Eerste, laat my stel 'n baie eenvoudige ding wat ons nie gebruik het tot dusver,
maar jy sien dit soms in die kode.
>> Dit is wat algemeen bekend as 'n konstante.
So dit is 'n konstante in die sin dat hierdie waarde verander nooit.
Die menslike konvensie wanneer die skep van 'n konstante
is alle hoofletters net so dat dit regtig staan ​​uit in jou kode te gebruik,
en die spesiale sleutelwoord wat jy gebruik in C # define.
So sê ons # definieer, dan 'n spasie, dan die woord wat jy wil gebruik vir die konstante se naam
en dan die waarde van die konstante.
Let op dit is verskillend van die toeken van iets aan 'n veranderlike.
Daar is geen gelykaan - teken, daar is geen kommapunt.
Dit is wat algemeen bekend is as 'n preprocessor richtlijn,
maar meer op dat 'n ander tyd.
Vir nou, dit skep 'n onveranderlike waarde genoem vasvrae
wie se werklike numeriese waarde is 2.
So waar jy sien vasvrae, vasvrae, vasvrae regdeur hierdie lêer,
dit is net die nommer 2.
As ek kyk na die belangrikste nou, laat ons sien hoe dit werk.
Die eerste dit lyk 'n bietjie kripties, maar dit is al die dinge van week 1.
Vra die gebruiker vir grade. Hoe doen ons dit?
In lyn 22 - dit is werklik die sappige deel - Ek verklaar 'n float
maar nie net 'n enkele float. Ek verklaar nie, maar eerder 'n skikking van die swaai-punt waardes.
Daardie veranderlike genoem gaan word grade, soos hier geïmpliseer,
maar die enigste stuk van nuwe sintaks dan is hierdie vierkantige hakies.
Die feit dat ek float grade en dan oop bracket en dan 'n nommer het gesê -
agterkom as dit is 'n konstante, dit is net soos ons dit gedoen het -
dit beteken, "Hey rekenaar, gee my 2 dryf en laat gesamentlik hulle noem grade."
>> Dit is in teenstelling met 'n veel meer moeisame proses soos hierdie: float voorraad1;
dryf grade2; en so meer.
So 'n skikking stel ons in staat om hierdie idee te implementeer nie, maar veel minder morsig,
in so 'n manier dat ons kan 1 reël van die kode in plaas van skryf, sê, 16 vir 'n 16-week semester.
Ek wou nie om hard-kode 2, want as jy dink oor dit nou logies,
veronderstel volgende jaar CS50 veranderinge aan 3 plaas vasvrae
en ek het die getal 2 hier, ek het die nommer 2,
Ek het die nommer 2, die getal 2.
Dit baie geduld en baie maklik om te skroef
en per ongeluk verander 1 waarde tot 3 en mis 'n ander waarde van 2.
So ek gaan hierdie weg te plaas abstrakte en gebruik hierdie konstante dat,
soos sy naam suggereer, verander nooit nie.
En nou maak nie saak of ons het verskillende vasvrae hierdie jaar of volgende,
Ek het net om dit te verander in 'n plek hier by die top.
So dit is al 'n konstante is.
Intussen het die nuwe konseptuele kenmerk is dié van 'n skikking.
So die vierkantige hakies gee my hierdie baie vlotte en laat my noem hulle gesamentlik grade hier.
So nou, laat ons sien wat ek gaan om dit te doen.
Hier in lyn 24 is die begin van 'n lus.
>> Dit is regtig niks fancy. Dit is net die gebruik van vasvrae in plaas van 'n harde-gekodeerde nommer.
Maar daar is niks intellektueel verskillende daar van verlede week.
Dit is net printf, so printf ("Quiz #% d van% d:")
want ek wil net uit te druk gee my quiz nommer 1 van 2 en dan 2 van 2.
So, dit is 'n suiwer estetiese ding.
Maar die interessante deel is nou in lyn 27.
Ten einde te vul in een van die twee plekhouers met 'n swaai-punt waarde,
gebruik jy weer tussen vierkantige hakies.
In hierdie geval, ek gebruik i omdat dit vir lus het begin met i gelykstaande aan watter waarde, glo?
[Student] 0. >> [Malan] 0.
So op die eerste iterasie van hierdie lus, is dit asof ek dit in die kode,
maar op die tweede iterasie van hierdie lus, is dit asof ek dit in my kode.
Maar die feit dat ek 'n veranderlike is die gebruik is volmaak, want soos die naam aandui,
dit wissel sy waarde op elke iterasie,
so ek vul hierdie skikking een plek op 'n slag.
Wat beteken hierdie skikking lyk?
Die rede waarom ek die super eenvoudige reghoek op die skerm getrek hier voor was vir hierdie rede.
'N skikking is net 'n stuk van die geheue, gevolg deur nog 'n stuk van die geheue
gevolg deur nog 'n stuk van die geheue en so meer.
So as my skikking van grootte 2 in hierdie geval hier, al wat ek sou doen
deur te tik in my quiz tellings soos hier - ek het 100 op hierdie een en dan het ek 'n 99 op hierdie een -
dan is die geheue kan selfs nie gebruik word nie, want ek het net die rekenaar gevra
vir 'n verskeidenheid van grootte 2.
Hierdie vierkante is steeds daar, reg?
Jy het nog steeds 2 GB RAM, selfs as jy net vra vir 2 dryf.
Dus is die idee agter skikkings is dat die rekenaar net neem 'n stuk van die geheue
en verdeeld dan kleiner stukke rug aan rug Terug na.
En so het dit is al 'n skikking is.
>> Dit is 'n aangrensende stuk van die geheue binnekant van wat jy kan dinge.
Dit gebeur dan doen net 'n paar vervelige rekenkunde.
As ek scroll down hier, dit is waar ek dan itereer oor die skikking.
Ek kom met die opsomming van al die waardes in die skikking,
en dan gebruik ek die ronde funksie hier om werklik te doen die som gedeel deur vasvrae.
Maar laat my beweeg my hand wat as 'n soort van genoeg rekenkundige vir nou.
Maar al wat vir my doen uiteindelik die berekening van 'n gemiddelde.
So eerste quiz plus tweede quiz gedeel deur 2 en dan druk dit uit as 'n int.
Maar laat ons nou die oorgang na 'n ander voorbeeld genoem string1,
wat verf 'n soortgelyke prentjie, maar met behulp van toue.
Laat my gaan voort en vereenvoudig hierdie vir net 'n oomblik.
Die inkeping vir nou vergewe.
Kennisgewing in lyn 19 van hierdie voorbeeld, ek kry 'n string van die gebruiker.
Maar let op wat ek volgende gaan doen in reëls 22 en verder.
Ek eintlik iterating van i tot - en dit is 'n nuwe truuk - strlen, string lengte.
Dit is 'n funksie wat kom met C dat as jy verby dit 'n string,
dit vir jou vertel hoeveel karakters in daardie string is. Dis al.
En die feit dat dit is strlen in plaas van string lengte is net omdat dit is meer bondig.
Dertig jaar gelede het mense graag dinge so bondig as moontlik te skryf,
so ons het aangehou dat die konvensie hier.
i + + net beteken dat ek in elke iterasie inkrementeer.
En nou is dit agterkom, wat is baie interessant.
In lyn 24, sê ek, "Computer, gee my 'n karakter, 8 bisse, en noem dit c."
Maar wat is dit op die regterkant sê?
In Engels, wat beteken dat verteenwoordig?
[Student] Die eerste karakter in die skikking.
Presies. Gee my die eerste karakter in die skikking.
Of, meer algemeen, gee my die met karakter in die skikking.
En besef dit is belangrik om nou dat as die rekenaar wetenskaplikes,
ons eintlik tel van 0.
>> Jy hoef nie die diskresie nou te begin om dit te doen.
Nou het jy om op te tree in ooreenstemming met die rekenaar se verwagtinge en tel van 0
want [0] gaan na die eerste karakter in 'n string,
[1] gaan om die tweede te wees, [2] gaan die derde wees, en so meer.
So hierdie program, as ek dit stel, is dit weer string1, so maak string1,
en nou is ek loop string1 in my terminale venster.
Dit is wag vir insette, so ek gaan in te tik Dawid: Kom,
en nou is dit druk David almal op verskillende lyne, want kennis wat ek doen.
Ek druk 'n karakter op 'n tyd.
Ons sal nie vandag in detail gaan op hierdie, maar ek verwyder 'n oomblik gelede hierdie tjek hier.
Dit blyk dat indien die gebruiker hang, opponerende, of net verward,
jy kan eintlik nie 'n string van sommige lengte te gee.
As jy druk die verkeerde sleutel op die sleutelbord, kan jy nie tou op alle gee,
of as jy kwaadwillige, kan jy probeer om te plak in 'n GB waarde van 'n opstel
om die string te vul, en indien die rekenaar loop uit van die geheue,
dit blyk dat ons gaan om terug te kry hierdie spesiale waarde genoem NULL.
So vir nou, weet net dat daar is hierdie spesiale waarde genoem NULL
wat ons sal toelaat om te kyk wanneer ons uit geheue, onder andere.
Maar as Ek maak nou string2, let op 'n verskil hier.
Kennisgewing een verskil hier met string2.
Met string2 vir lus is 'n bietjie anders.
>> Laat my verwyder die NULLs sodat ons kan praat oor die ander tyd.
Wat is daar anders oor die loop hierdie tyd?
Ek kan gaan terug na die vorige voorbeeld.
So dit is weergawe 2, hierdie is 'n weergawe 1. 1, 2.
1, 2.
Die strlen oproep is waar?
Dit is in die eerste deel van die for-lus.
Enige gedagtes waarom ek om dit te doen? Ja.
[Student] So jy noem dit nie die funksie om elke keer.
[Malan] So ons noem dit nie die funksie om elke keer. Presies.
Onthou vir loops dat hulle is super eenvoudige
sodra jy soort van verstaan ​​dat dit die inisialisering, die toestand en die update.
Die probleem is dat die toestand op elke iterasie van die lus gebeur.
En so in hierdie voorbeeld hier, wat is sleg oor die feit dat hierdie is my toestand?
[Student] Jy vra strlen.
[Malan] Jy vra strlen weer en weer en weer.
Maar sodra ek het getik in Dawid, die lengte van die string is 5,
en dit is nie van plan te verander op elke iterasie van die lus
want die tou is nog steeds D-'n-v-i-d.
So, dit is 'n wenk wat gaan 'n toenemend belangrike idee
bekend as 'n ontwerp besluit waar maak net nie die rekenaar onnodige werk doen.
>> Net soos 'n sneak preview van pset2, pset2 in die standaard uitgawe
gaan jou uit te daag om eintlik 'n aantal getalle te implementeer,
n aantal van enkripsie-algoritmes, sodat jy kan beide enkripteer
en decrypt geheime boodskappe baie soos die een Ralphie daar gedekodeer.
In die hacker uitgawe van pset2, gaan ons 'n bietjie verder gaan.
Ons gaan u 'n lêer aan die hand van 'n werklike rekenaar stelsel
wat 'n hele klomp van gebruikersnaam en werklike geïnkripteer wagwoorde,
en die uitdaging vir die hacker uitgawe gaan wees om die wagwoorde te kraak
en uit te vind wat kriptografie of wat geheim is gebruik om werklik daardie wagwoorde te genereer.
En ons gaan om dit te doen deur gebruik te maak van 'n nuwe funksie van C
dat Ek gee jou net 'n demo van bekend as command-line argumente.
Dit blyk, soos sommige van julle mag gesien het in die artikel of in handboeke,
hoof nie altyd leemte in hakies.
Dit blyk dat die hoof kan ook geskryf word soos hierdie, met twee argumente,
argc en bevat SPASIES, waar argc is die aantal woorde
wat jy intik na die program se naam op jou command line
en bevat SPASIES is die werklike woorde.
En as die vierkantige hakies dui, bevat SPASIES is blykbaar 'n skikking.
Dit gaan om 'n string na 'n string na 'n string in die geheue.
>> So, wat gaan ons in staat wees om te doen nie begin met pset 2 is iets soos hierdie.
As Ek maak argv1, wat is 'n voorbeeld sal ons kom terug na op Maandag, en voer dit uit,
agterkom dat dit lyk nie iets om nog te doen.
Hy druk net sy eie naam.
Maar as ek sê totsiens klas, kennis dat hierdie program glo iterate
oor elk van die woorde wat op die instruksielyn getik is.
En die wyse waarop ons sal toegang verkry na die woorde wat deur die gebruiker ingetik op die instruksielyn
is deur die verandering van hoof begin hierdie naweek van int main (void) hoof (argc, bevat SPASIES) om na int
en sal dus gebore word command-line argumente.
En as jy regtig gesofistikeerde op hierdie, sal jy in staat wees om werklik trippy programme te kan skryf
soos hierdie een hier, wat gaan bo en buite
sommige van die funksie het ons tot dusver gedoen het, maar almal baie kragtige.
>> So ons sal verlaat met hierdie op die skerm, en ons sal sien dat jy op Maandag.
>> [CS50.TV]