[Powered by Google Translate] David J. Malan: Alle reg. Dit is CS50, en dit is die einde van die week twee. As jy honger is verwag om te wees rondom hierdie tyd môre, weet dat ons gaan te belê as 'n klein groepie môre, Donderdag, 01:15. Daar is hierdie URL hier as jy wil om te RSVP. Ruimte beperk is, so asseblief vergewe indien die vorm ingevul het teen die tyd wat jy vul dit uit. Nog 'n URL al wat van belang kan wees, is dit. So 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 wees in staat wees om te volg saam, betrokke te raak in die kursus baie aktief, in werklikheid. Hulle sal gebruik word om die CS50 Appliance en CS50 Bespreek en die meeste van die verskillende sagteware gereedskap wat ons 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 gepraat en geskrewe taal. So as jy kan 'n belangstelling in die deelname aan hierdie projek, waardeur sal ons 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 lief vir jou om betrokke te raak by hierdie projek, waardeur jy op een of meer van die video's, die vertaling van hulle 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, sal jy 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 jou woorde gesien en gelees deur potensieel duisende mense daar buite, doen asseblief voel vry om deel te neem. Nou een woord oor die katjie van Maandag, sodat ons 'n té gestuur scary boodskap. Besef dat as kantoorure raai en as artikels raai, die ontwerp van die kursus is baie het studente saam en praat saam te werk deur middel van die probleem stelle en probleme. En regtig die lyn kom net neer op, weer, die werk wat jy uiteindelik moet voorlê moet jou eie wees. En dus is dit, om eerlik te wees - in kantoorure, dit is heeltemal normaal - Dit is heeltemal te verwag word, selfs - om te gesels met 'n paar vriende langs jou. Indien hy of sy sukkel met 'n paar onderwerp, en jy is net soos ", soos" O, goed laat Ek gee jou 'n kykie van 'n paar lyn van die kode wat ek geskryf het. Dit is goed. Dit gebeur. En dit is baie bevorderlik is, dink ek, met die proses van leer. Waar die lyn kry, weer, gekruis is wanneer die kop is 'n soort gekantel oor hier vir te veel sekondes of minute vir dit werklik net om 'n IP addresses are not geleentheid vir jou vriend. En seker wanneer dinge kry uitgeruil via e-pos en Dropbox en die wil, daar is ook die lyn. Dus, deur al beteken, gemaklik voel en voel aangemoedig om te klets met vriende en klasmaats oor psets en nog baie meer. En net besef dat dit wat jy uiteindelik dien moet regtig die produk van jou skepping en nie iemand anders nie. Dus, in dieselfde trant van die snoesige wesens, dan kan jy weet van hierdie man hier. So, dit is 'n horrifically Wink film van jare gelede. Iemand hier gesien Space Balls? Alles reg. So 'n goeie aantal hier. So, dit is ons wonderlike akademiese manier van die invoering van vandag uiteindelik die idee van kriptografie. En so een van die domein spesifieke probleme vir pset 2, wat sal kom uit te laat môreaand, 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. Nou sekuriteit vir die meeste van ons kom 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, is dit waarskynlik nie die beste idee, soos ons sal bespreek tot die einde van semester se. As jou wagwoord is geskryf op 'n taai noot - nie 'n grap nie - op jou monitor, ook dit is nie noodwendig die beste ontwerp, maar nogal 'n algemene verskynsel. En as jy nie kriptografie gebruik om jou wagwoorde te enkripteer, hulle is veral kwesbaar. So as jy dink jy super slim deur 'n verborge Woord dokumenteer iewers op jou hardeskyf wat al jou wagwoorde, maar dit is in 'n gids wat niemand gaan om te kyk, dit is ook nie 'n baie veilige meganisme. En wat pset 2 sal voer is dit kuns van kriptografie en skommeling inligting sodat dinge soos wagwoorde is al die meer veilig is. So as hierdie baie werklike wêreld probleem met 'n baie nie-reële wêreld te motiveer scenario, laat ek jou na een van ons gunsteling clips van hierdie movie, Space Balls. [Video-vertoning] -Helmet Fiend, wat gaan aan? Wat doen jy aan my dogter? Laat my die briljante jong plastiese chirurg, Dr Philip te stel Schlotkin, die grootste neus-job man in die hele heelal en Beverly Hills. -Jou hoogheid. -Neus-job? Ek verstaan ​​nie. Sy het reeds 'n neus-job. Dit was 'n lieflike 16 teenwoordig. -Nee, dit is nie wat jy dink nie. Dit is baie, baie erger. As jy gee nie vir my die kombinasie na die lug skild, Dr. Schlotkin sal Gee jou dogter haar ou neus terug. -Nee! Waar het jy dit? -Alle regte. Ek sal jou vertel. Ek sal jou vertel. -Nee, Pappa, no. Jy moet nie. Jy het gelyk, my liewe. Ek sal jou mis jou nuwe neus. Maar ek sal nie vir hulle vertel die kombinasie maak nie saak wat. -Baie goed. Dr. Schlotkin, doen jou ergste. My plesier. -Nee! Wag, wag. Ek sal jou vertel. Ek sal jou vertel. Ek het geweet dit sou werk. Alle reg, gee dit aan my. Die kombinasie is een. -One. -One. Twee-en-. Twee-en-. Twee-en-. Drie-en- Drie. Drie. Vier-en-. Vier-en-. Vier-en-. Vyf-en- Vyf. Vyf. So die kombinasie is een, twee, drie, vier, vyf. Dit is die domste kombinasie wat ek nog ooit in my lewe gehoor het. Dit is die soort ding wat 'n idioot sou hê op sy bagasie. Dankie, jou hoogheid. Wat het jy gedoen? Ek afgeskakel die muur. Nee, jy het nie. Jy die hele film afgeskakel. Moet ek die verkeerde knoppie gedruk het. Wel, sit dit terug op. Sit die film weer op. -Ja, meneer. Ja, meneer. -Laat ons gaan, Erna. Kom, Gretchen. Natuurlik moet jy weet dat ek nog sal hê om jou te faktureer vir hierdie. Wel, het dit gewerk? Waar is die hek? Dit het gewerk, meneer. Ons het die kombinasie. -Groot. Nou kan ons elke laaste asem van die vars lug van die planeet Druidia. Wat is die kombinasie? -Een, twee, drie, vier, vyf. -Een, twee, drie, vier, vyf? Ja. -Dit is ongelooflik. Ek het dieselfde kombinasie op my bagasie. Berei Spaceball 1 vir onmiddellike afwyking. -Ja, meneer. En verander die kombinasie op my bagasie. -Ow! [Einde VIDEO speel] David J. Malan: 'n wonderlike film moet julle almal nou sien. So die konteks hier is dat met onveilige data kom om 'n geleentheid te bied om 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 om te pla uitmekaar wat hierdie geheim boodskap hier is. Maar in die werklike wêreld van rekenaars, dinge doen nie, selfs lyk hulle kan Engelse frases. 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 dié van ander mense op die stelsel nie, maar jy sal sien 'n geïnkripteer 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 getalle en ensovoorts 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 'n paar te vertrou sorteer en wetende dat iets wat iemand anders nie. Ons sal verken vandag in 'n bietjie meer detail en in die pset te kom. En nou, 'n woord oor slaag / druip. So veral as sommige van julle geduik in pset 1, die toestel, en 'n nuwe wêreld vir jouself, besef dat frustrasies en verwarring en net tegniese probleme is te verwag word. Veral met die eerste pset, waar daar net so baie nuwe, maar net vertroud is met ls en CD en al hierdie arcane opdragte in 'n nuwe omgewing. En dit is apart van die werklike materiaal en programmering self. So besef ook dat daar is beslis kantoorure wat bestaan ​​as die steunstruktuur. Artikels begin eerskomende Sondag. Maar die belangrikste, as jy voel net dat dit is 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 om kop in 'n ander waters heeltemal, oorweeg seker 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 regtig wil bereik of overachieve. Maar eerlik, dit is 'n wonderlike manier om te probeer om iets uit wat dalk nie vertroud te wees aan jou. En jy sal uiteindelik doen in die meeste gevalle baie fyn, miskien veel om jou verrassing. En in meer konkrete terme, wat ek dink slaag / druip in die algemeen nie, veral as jy dalk ervaar het met pset 0, indien jy in 10 uur, 15 uur, 25 uur in 'n paar pset - en jy net gebons jou kop teen die muur, en dit is om super laat in die nag, maar jy geneem het die pset soos 90% van die manier, jy weet dat jy nie kan uitvind een ding - slaag / druip regtig die rand van 'n klas soos hierdie, waar jy kan sorteer van gelukkig sê oukei, ek weet dit is nie volmaak. Maar Ek het my gat af op hierdie punt. 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. So 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 rond dryf dat jy dalk 'n beter kans hê. Dit is nogal ironies dat die wagwoord vir hierdie - as jy wil om te probeer verbinding met dit vir 'n beter spoed en laat ons weet as dit is geen beter - is een, twee, drie, vier, vyf, al die pad tot agt omdat agt is meer veilig as vyf. So as jy die Wi-Fi wagwoord, verbind tot CS50 draadloos hier. Een, twee, drie, vier, vyf, ses, sewe, agt. 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 alles Apple. Wat ek opgegrawe van 'n paar jaar terug was hierdie lêer hier, ilock.c, net om te soort van meer konkrete en meer komplekse maak 'n paar van die meer basiese C programme het ons skryf. So ek het hierdie lêer, ilock.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 belangrikste. Hy het 'n hele klomp van die biblioteke gebruik hier. En as ons begin blaai deur, wat dit eintlik is, is die eerste, glo ek, vir die oorspronklike iPhone kraak. As jy wou die oorspronklike iPhone te jailbreak, wat beteken untether dit van AT & T en eintlik spesiale sagteware te installeer op dit en doen dinge dat Apple nie wil hê mense moet doen - Wel, iemand die tyd geneem het om uit te vind presies hoe hulle kan uitbuit sagteware foute, foute, foute, in Apple se sagteware. En so gebore ilock.c. Dat as jy saamgestel dit op 'n rekenaar en geïnstalleer het dit op 'n iPhone wat via, sê, 'n USB-kabel aan jou rekenaar gekoppel is, sal dit gee jou administratiewe of root voorregte op jou iPhone en laat jy dit doen pretty much 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 te sluit hul dinge neer sodat jy kan net doen met dit wat hulle van plan is. Maar te danke aan mense soos hierdie en hul begrip van die lae-vlak besonderhede 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 in 'n manier 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 soos dit is 'n funksie wat hierdie persoon het geskryf. Neem 'n soort van die heelgetal as 'n argument, nie terugkeer nie enigiets nie, maar blyk te loop met 'n lus hier en 'n as voorwaarde, as voorwaarde, breek, en op een of ander manier verband hou met die weergawe nommers. As ons scroll down - selfs al is 'n baie van hierdie sleutelwoorde gaan nuut wees, en daar is 'n die hele lot van funksies hier het ons nog nooit gesien het en dalk nie ooit sal sien oor die loop van die semester - aan die einde van die dag is, volg dit dieselfde reëls en logika wat ons het speel met tot dusver. So dit is veels te oud om jou iPhone 3s of 4s of gou 5s om te kraak, hierdie dae, maar weet dat dit alles baie afgelei van hierdie wêreld wat ons het duik in. So laat ons neem 'n blik op 'n bietjie meer eenvoudige voorbeeld. Hierdie een, net om te warm raak met 'n paar sintaksis en ook 'n paar ander data tipe wat ons het gepraat oor, maar het nie regtig gesien in C. So 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 mooi is vir die gebruiker-interaktiewe programme waar jy nodig het om te vertel van die gebruiker om iets te doen. En as hulle nie saam, jy gil op hulle of hul insette te verwerp. Case in point, ek gaan om te doen lyne 19 deur 24 so lank as die gebruiker nie vir my 'n positiewe getal. Nou is hierdie detail hier on line 18, hoekom het Ek verklaar n bo hierdie geheel herhaling konstruk in teenstelling met reg langs lyn 22 waar ek eintlik omgee n te kry? Ja? [Onhoorbaar] David J. Malan: Ja, so hierdie kwessie van die omvang. En in die leek se termyn, wat beteken omvang verwys na? Ja? [Onhoorbaar] David J. Malan: Kan jy 'n bietjie harder praat? Spreker 1: Waar kan jy toegang tot 'n spesifieke veranderlike. David J. Malan: Perfect. Waar jy kan toegang tot 'n spesifieke veranderlike. En oor die algemeen, die oppergesag van die duim tot dusver is dat die omvang van sommige 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, daardie lyn sal werk. Ek sou 'n int te kry, en ek sou sit dit in daardie veranderlike n in reël 22. Maar watter lyn van die kode sal nou nie 'n idee wat ek praat? So 25, en dit draai uit 24, goed so, want in hierdie geval, is dit buite van die kode tussen krulhakies. So net 'n bietjie van 'n oorlas nie, maar baie maklik opgelos deur eenvoudig te verklaar die veranderlike buitekant van die funksie self. Nou het ons later vandag sal sien, kan jy 'n stap verder gaan. En jy kan selfs 'n bietjie lui - en dit is nie te aanbeveel word, in die algemeen - maar jy kan selfs lui en '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. Maar dit is oor die algemeen frowned upon. Maar besef dit is '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 net om te begin met die uitdrukking van onsself 'n n bietjie anders. So 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, wat blyk te werk. Miskien nie die mees streng toets. Maar ten minste is dit 'n mooi gesonde verstand check dat ons op die regte spoor. So laat my nou voort te gaan en maak weergawe twee van hierdie. En wat verskillend is reeds? Dit implemente dieselfde ding. Maar wat spring uit as duidelik dié keer anders? Ja, so dit Bool in die groen. Gedit 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 te sluit spesifieke biblioteek. In ons geval, ek sluit die CS50 biblioteek, sodat ons het toegang tot Bool. Maar in reël 18, maar dit lyk asof ons 'n Boolese waarde hier genoem dankbaar te hê. Sodat ek kon genoem het hierdie iets. Maar ek het dit dankbaar net soort sommige semantiese betekenis oordra. So aanvanklik on line 18, ek glo nie dankbaar omdat die Boolese waarde dankbaar is geïnisialiseer vals in lyn 18. En dan lyk dit wat ek hier gedoen in lyne 21 deur 23 is ek net soort van herskryf my logika. So nie funksioneel verskillende. Maar in lyn 22 nou, ek kyk of die int die gebruiker verskaf is groter as 0, dan het ek eenvoudig die waarde van dankbaar vir ware verander. En hoekom doen ek dit? Omdat in reël 25, blykbaar, ek gaan om 'n toestand te monitor. Doen dit loop terwyl dankbaar is vals. So ek stel dit as 'n alternatief na weergawe een, 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 of terwyl dankbaar is vals. En hierdie keer ook, ek glo gee nie hoef te onthou wat die gebruiker ingetik omdat kennisgewing is daar geen veranderlike n. So eintlik, I - 'n klein wit leuentjie. Funksioneel, die program is 'n bietjie anders is wanneer ons kry aan die onderkant van dit omdat ek nie onthou wat n. Maar ek wou hier demonstreer ook dat selfs al het ons gesien getint en GetString wat gebruik word op die regterkant van 'n gelyke teken tot dusver sodat ons onthou die waarde, tegnies, dit is nie streng noodsaaklik is. Indien, vir watter rede ookal jy net gee nie om nie 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 nommer 99. En so konseptueel, dit is asof my kode eintlik. So as 99 is inderdaad groter as 0, dan is dankbaar waar. Dan besef lyn 25 ooh, ons gedoen, want ek is nou dankbaar. En in lyn 26, het ons net sê, Dankie vir die positiewe heelgetal is, wat dit ookal gebeur om te wees. Laat ons nou doen effense "sintaktiese suiker hier, om so te praat. Kom ons kyk of ons kan skoon te maak van hierdie lyn 25 met hierdie derde en laaste variansie in positive3. So let die enigste verskil is nou watter reël van die kode? Ja, so 25. En ons het nie regtig hierdie truuk gesien net nog nie. Maar ons het die uitroepteken op Maandag, wat dui op wat? So nie, of ontkenning. So 'n Boolese waarde en die waarde daarvan te flip. True vals. False waar. So, ek sou voorstel, is selfs 'n bietjie meer intuïtief van 'n manier van die skryf van die kode, want ek nog steeds dankbaar inisialiseer op vals. Ek het nog nie die volgende. Ek dankbaar vir waar, wanneer die tyd kom. Maar nou kan jy net regtig vertaling van hierdie kode mondelings links na regs, terwyl nie dankbaar nie. Omdat bang, of uitroepteken, dui op die idee van nie, sodat, terwyl nie dankbaar. 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. So, as jy veral in pset1 soort sukkel om uit te vind die pad na skryf 'n program, is jy in die geluk kans, want daar gaan om te wees nie aantal oplossings wat jy kan gebeur op. Byvoorbeeld, dit is net drie vir selfs die eenvoudigste van programme. Alles reg. En nou onthou op Maandag, ons het op hierdie noot met terugkeer waardes. Dus, vir die heel eerste keer, ons het 'n program wat nie net hoof, dit het ook sy eie persoonlike funksie wat ek hier geskryf het. So in lyn 31 deur 34, het ek 'n kubus funksie geïmplementeer. Dit is nie kompleks. Dit is net 'n keer 'n keer 'n, in hierdie geval. Maar wat is belangrik om daaroor is dat ek insette is in die vorm van 'n Ek terugkeer uitset in die vorm van 'n keer 'n keer 'n. So nou is ek het die vermoë om, net soos Ek gebruik word om met printf alleen, om te bel hierdie funksie deur die roeping van die kubus funksie. En die kubus funksie neem 'n paar insette. En die kubus funksie gee 'n paar uitset. En so in teenstelling, printf net iets gedoen het. Dit het nie terugkeer nie iets wat ons oor versorg - selfs al is, as 'n eenkant, is dit nie 'n waarde terug. Jy moet net 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 terug iets. So, dit is oor die algemeen - 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 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, asook. Ja. Okay, wat is jou naam? KEN: Ken. David J. Malan: Ken. Alle reg, Ken. Kom op. So Ken gaan na 'n funksie van spesies hier te wees. En laat 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, eintlik, kan nie sê dat. Ek het nie regtig 'n goeie handskrif. En so ook, ek wil jou iets te druk op die skerm vir my. So ek die hoofprogram. En ek gaan om jou te hê, sê dit deur dit te skryf in my hoender kras en dan verby jou 'n inset. So as dom al hierdie oefening is, is die idee van die funksies en die uitroep van 'n funksie en die terugkeer van 'n funksie regtig kook afbring na hierdie. Ek am Main. Ek het nou net geskryf printf ("iets") 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. Nou is hy 'n swart blokkie n aantal jare gelede geskryf wat blykbaar weet net hoe om dinge op die skerm te druk. So, uit te voer. Dit is nie sleg nie. So, baie goed. So nou Ken gedoen uitvoering. Moet hy aan die hand my niks terug? So nie het ons tot dusver gesien het. Weer terugkeer eintlik printf 'n aantal. Maar ons gaan om dit te ignoreer vir nou, want ons het nog nooit dit gebruik. So wat is dit vir Ken. En so nou hoof terug kom om uit te voer - hoof neem oor die beheer van die program weer omdat daardie lyn van die kode, printf, word gedoen die uitvoering. En ons gaan oor ons manier uitvoering van enige ander lyne is daar. Alles reg. So nou, laat ons probeer om 'n effens ander voorbeeld. En hierdie keer hier, laat ons eers duidelik die skerm hier. En hierdie keer, sal ons doen die cubing funksie. Maar hierdie keer, ek verwag 'n uitset waarde. So laat ons gaan voort en doen dit. So nou het ek 'n reël van die kode wat sê x = kubus (x). Dus eintlik let's - die lyn van kode, onthou, so lyk. x = kubus (x). So hoe is dit gaan werk? So laat ons gaan voort en gee jou weer 'n wit skerm. En ek gaan om te skryf nou die waarde van x, wat op hierdie oomblik in tyd gebeur te word, laat ons sê, 2, om dit eenvoudig te hou. So ek neergeskryf het op 'n stuk papier, die waarde van 2, wat is my waarde x. Ek oorhandig dit aan Ken. KEN: En ek het net skryf die antwoord? David J. Malan: Ja, laat ons net skryf die antwoord. Okay. En nou het hy my iets om terug te keer. So - volmaak is. Nice segue. So nou is hy oorhandig my terug die waarde van 8, in hierdie geval. En wat moet ek doen met dit? Wel, 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 die stoor dieselfde stukkies in die geheue. Maar let op, 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. So dit blyk dat wanneer jy noem 'n funksie, en jy het in 'n argument "hello world" of jy slaag in 'n argument soos 2, oor die algemeen, is jy wat in 'n afskrif van daardie argument. En net soos ek geskryf het die getal 2 hier en oorhandig dit aan Ken, wat moet 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 hierdie idee van wat in letterlik onthou '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 al te bekend is kort voor lank sal wees. Thank you so much vir hierdie demo hier, Ken. Alles reg. Baie goed gedoen. So laat ons sien hoe dit uiteindelik betrekking het op sommige van die funksie roeping wat ons hier doen. So laat ek gaan voort en bring ons terug na die cubing voorbeeld hier. En let op dat as ons wil eintlik begin om dit verder te neem, gaan ons hoef te wees bewus van die feit dat die aantal x wat geslaag het in hier is verskillend van wat werklik in die funksie geslaag. Dit weer doen, word geslaag deur afskrif gaan word baie related in net 'n oomblik. So laat ons neem 'n blik op iets wat nie heeltemal reg is nie werk. Ek gaan om voort te gaan en 1/3 buggy voorbeeld oopmaak, wat word deur die natuur gebrekkig. En dit word genoem buggy3, en dit implementeer 'n uitruiling funksie. So hier het ons 'n hoof funksie wat x en y het arbitrêr geïnisialiseer 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, een per reël. Dan, on line 23, ek beweer ek hierdie waardes is uitruiling, dot, dot, dot. Ek het blykbaar noem 'n funksie in lyn 24 genoem swap Dit neem twee argumente. Dit is heeltemal wettig vir funksies twee argumente te neem. Ons het gesien printf dit reeds doen. So swap neem blykbaar x en y. En soos sy naam suggereer, hoop ek dat dit gaan ruil die twee waardes. So dan het ek beweer on line 25, omgeruil. En ek herdruk x en y in die veronderstelling dat hulle het wel omgeruil. Maar as ek eintlik 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 1. y is 2. En tog 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? Wel, laat 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? [Onhoorbaar] Presies. Sodat ons die stoor van 'n kopie, nie die veranderlike self. Met ander woorde, swap neem blykbaar twee argumente, 'n int. En dit is arbitrêr a en b genoem. En hier het ek in X en Y, wat onderskeidelik 1 en 2 geslaag. Maar ek is nie letterlik wat in x. Ek letterlik nie verby in y. Ek verby 'n afskrif van x en 'n afskrif van y. Dit is soos amper asof jy gekopieer en geplak in ruil die waardes wat 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 is 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? So dit moet net 1. Reg? Omdat x aangeneem is as die eerste argument. En hierdie funksie is net arbitrêr roep sy eerste argument, 'n. Net so is y, die tweede argument. En dit is arbitrêr bel net die tweede argument b. Nou is hierdie digotomie is redelik eintlik eenvoudig verduidelik. Dink daaroor. Nie een van ons het met die persoon wat geskryf het printf. So seker, 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 funksies wat jy skryf en wat jy noem veranderlikes in die funksies wat jy is roep of die gebruik van. So met ander woorde, het ek geskrywe my veranderlikes x en y. Maar as iemand anders die swap funksie geskryf het, het hy of sy sal nie weet wat my veranderlikes gaan genoem te word nie. So besef dat dit is waarom jy het hierdie dualiteit van name. Tegnies, kan ek dit doen deur toeval. Maar hulle sal nog nie geslaag word as kopieë. Dit sou net 'n toeval esteties indien daardie persoon wat geskryf het swap gebruik het dieselfde name. Alles reg. Dus, op hierdie punt in die verhaal, lyn 37, 'n is 1. b 2. En nou kan ek gaan om dit te ruil. Wel in die eerste plek, laat my eintlik doen dit baie meer eenvoudig. Ek weet nie wat hierdie drie reëls van die kode doen. Laat my net dit doen. b kry 'n. 'n kry b. Gedoen het. Hoekom is hierdie gebroke, logies? Dit is soort van die intuïtiewe ding, reg? So word 'n b. En (b) '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, het jy verander b 'n gelyk. So een keer lyn 37 uitgevoer word, wat is 'n groot. Jy het nou twee kopieë van die aantal 1 binnekant van hierdie funksie. So dan wanneer jy sê in reël 38, 'n kry b, goed, jy is soort van geskroef. Omdat jy net toeken van 1 tot 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. Dit is 'n int, want dit het te pas wat ek wil hê om 'n kopie te maak van. Ek slaan 'n afskrif van 'n binnekant van die tmp. So een keer lyn 37 uitgevoer word, die waarde van 'n - vinnige sanity check - 1. Die waarde van b 2. En die waarde van tmp is ook 1. So nou is ek voer lyn 38. So een keer 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 ons klaar is. 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 weereens, as ek hierdie program, x en y bly onveranderd deur die einde van die program se uitvoering. [Onhoorbaar] David J. Malan: Dus het ons nie teruggestuur nie. So dis waar. Maar dit blyk daar is 'n bietjie van 'n probleem hier, want tot dusver, 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 terugkeer, in welke geval, ek is soort van vas hier want ek kon die nuwe waarde van x terug of ek kon die standaard van die nuwe 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? a en b. Maar a en b is afskrifte van x en y, wat beteken dat ons net het al hierdie werk - ons het net spandeer soos drie minute praat oor die ruillêer funksie en al drie 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 verklaar dat 'n heelgetal i binne die vir lus - Net so, as jy verklaar dat a en b binnekant van 'n funksie wat wat jy geskryf het, hulle is slegs geldig binnekant van daardie funksie. Wat beteken dat sodra swap gedoen uitvoering en ons gaan van lyn 24 tot lyn 25, x en y het glad nie verander nie. 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 slegs een waarde terug. En ek het regtig nie wil beide x en y op dieselfde tyd te ruil. So ons gaan om terug te kom na hierdie. Maar vir nou, besef dat die kwessie fundamenteel spruit uit die feit dat a en b is kopieë. En hulle is in hul eie omvang. Wel, laat 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. En wat van hierdie? Dit is 'n soortgelyke, maar eenvoudiger probleem op te kyk voordat ons 'n steek op om dit op te los. Hierdie program word genoem inkrement. En dit initialisatie blykbaar 'n x heelgetal 1 in reël 18. Ek het toe beweer x 1. Ek dan eis verhoog van, dot, dot, dot. Dan bel ek inkrement. Maar dan in reëls 22 en 23, het 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] David J. Malan: Presies. So x is natuurlik verklaar on line 18. Dit is binne die hoof se krullerige draadjies. So het die eenvoudige antwoord hier is dat, wel, x hier bestaan. Dit bestaan ​​nie in lyn 32. So sal hierdie program eintlik nie eens stel. Die samesteller, wanneer ek probeer om die opstel van hierdie kode, gaan 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 'n onverklaarde identifiseerder x in reël 32. En eintlik, laat ons meer eksplisiet hier vandag, sodat dit is nuttig in die kantoorure en by die huis. Let daarop dat dit 'n bietjie kripties geskryf. Maar die feit dat die geratel het het op ons geskree en gesê: buggy4.c: 32:5, is werklik nuttig. Dit beteken dat die fout is on line 32 by karakter posisie vyf. So een, twee, drie, vier, vyf. Dit is, in werklikheid, waar die probleem is. En ook in gedagte te 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. Altyd so jaag jou foute neer van bo na onder. Omdat daar dalk net 'n daisy-ketting 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? Wat is dit? Okay. Sodat ons kan x globale. 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 nou een van hierdie dinge - doen soos ek sê, nie soos ek doen, as ek net hier gedoen word. Want in die algemeen, word ons programme gaan kry veel meer interessant en veel langer as dit. En as jou oplossing vir die lewe se probleme is net ah, het al die veranderlikes op die top van jou lêer, baie vinnig doen programme kry horrifically moeilik om te beheer. Dit word moeiliker om te dink nuwe veranderlike name. Dit raak moeiliker om te verstaan ​​wat veranderlike doen. 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 te inkrementeer. Sodat ek kan natuurlik - aan die einde van die dag, dit is soort van 'n lawwe storie omdat ons net dit doen. Maar as ek nie weet dat operateur, of ek was nie toegelaat om te verander dit in die belangrikste self, kan hoe anders ek implementeer Ken hier, dit tyd nie kubus maar inkrementeer? Hoe verander ek hierdie ding hier? Ja. [Onhoorbaar] David J. Malan: Goed. So hoekom ek nie slaag nie in x? En dan eerder as om dit terug, hoekom doen ek net doen terugkeer x + 1? Nou, 'n paar dinge hier te verander nie. Ek is op die regte pad. Wat anders het ek nodig om Tweak? Iemand anders. Ja? [Onhoorbaar] David J. Malan: Ek moet die opbrengs tipe van inkrement te verander want dit is nie nietig. Void beteken niks teruggestuur word. Maar dit is duidelik, nou is dit. So hierdie behoeftes te verander na int om konsekwent te wees met alles wat Ek is eintlik terugkeer. Nou iets anders is nog steeds karretjie hier. Ja? [Onhoorbaar] David J. Malan: So ek moet X te inkrementeer? [Onhoorbaar] David J. Malan: Ag, so ek nodig het om x te slaag. So ek het dit nodig om hier te doen. So het die prototipe, ek het om dit te verander hier. 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? So 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 net na willekeur 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 even_number te wees, selfs meer eksplisiet. So dan het ek om terug te keer, ongeag die aantal plus 1. En nou het ek 'n ander ding om te verander hier en een ander ding hier. Wat moet ek eerste on line 21 te verander? Ek het dit toe te ken aan x. So ek kan net nie noem inkrement x. Ek nodig het om te onthou van die antwoord deur die verandering van die waarde van x die linkerkant. En selfs al is x is nou op die links en regs, dit is heeltemal fyn, omdat die regterkant kry eerste uitgevoer, dan kry plons in die linkerkant hand ding, x in hierdie geval. En dan laastens, dit is 'n maklike fix nou. Dit moet net ooreenstem met wat hieronder neer. Int. Alles reg. So 'n hele klomp van 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. Oh my God. Vyf foute in, soos, 'n ses-line program. So, wat is verkeerd on line 18, karakter 5? Alles reg. So ek het hierdie int te verklaar. Alles reg. So laat ons sien, 'n hele klomp van die ander foute. Oh my god. 19, 18, 21. Maar weereens, laat ons net duidelik die skerm - Beheer L hier - en re-run kletteren. So vyf probleme is eintlik net dat 'n mens. So nou laat ons hardloop buggy4, Enter. Sjoe. x korrek geïnkrementeer. Alles reg. Enige vrae oor hoe om getalle te inkrementeer? Ja? Spreker 2: Waarom is dit dat jy net kan verander x na die nommer in die veranderlike noem en dit sal weet wat jy bedoel? David J. Malan: Goeie vraag. Hoe is dit dat ek net kan verander x aantal en die program sal weet onmiddellik? Dit weer doen, dink aan dit as hierdie abstraksie. So as ek die hoof-en Ken is inkrementele, eerlik, ek gee nie om nie wat Ken roep sy iPad. Ek gee nie om wat hy noem enigiets wat te doen het met sy implementering van hierdie funksionaliteit. So, dit is 'n implementering detail dat ek, hoof, doen nie hul 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, die van julle met die bestuurder se lisensies wat gedryf het, of as jy het selfs in 'n motor gedryf - 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 is eintlik doen. So iets soos wat jy noem die suier maak nie saak hier in hierdie geval. Dieselfde idee. Ja? [Onhoorbaar] David J. Malan: As 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 Soek / vervang, iets soos dit. Maar jy gaan te hê om die veranderinge self te maak. Jy het om konsekwent te wees. [Onhoorbaar] David J. Malan: 'n spesifieke volgorde soos hier? As dit was 'int 'n ander getal? Ja. So 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, moet dit nie 'n hakie. Die tweede argument in lyn met die tweede een. So orde, ja, sake. Alles reg. Jammer ek het 'n lang pad om daar te kom. Ander vrae? Alles reg. So laat ons kyk of ons kan nie 'n prentjie van wat eintlik gaan verf hier onder die kap, om so te praat nie. So, dit is 'n reghoek wat kan verteenwoordig jou rekenaar se geheue. Dus selfs as jy het geen idee hoe geheue werk of hoe 'RAM werke, ten minste aanvaar dat jy trosse van hierdie dae. Jy het megagrepe van dit. Jy het gigagrepe van dit. En ons weet van week nul dat 'n greep is net wat? 8 bisse. Reg, so 8 nulle en ene. So as jou rekenaar het 'n gig van RAM, twee gigs 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. Nou in teenstelling met die klein Wollerige Willy voorbeeld, dit is nie magnetiese deeltjies tipies nie. Toenemend in skootrekenaars ten minste, dit is solid state drives, SSDs, wat net geen bewegende dele. Dit is al die elektroniese. Dit is alle elektrisiteit gebaseer. Dink so, al is, as net die een of twee van hierdie reghoek GB geheue wat jy het. So dit is 'n stuk van die geheue. Nou is die wêreld van die rekenaar wetenskap het 'n soort van afgeskort stukke van geheue om verskillende dinge te doen. So byvoorbeeld, indien dit jou rekenaar se RAM - soos voorgestel deur die reghoek daar - blyk dat deur die konvensie, op die top van jou geheue, sodat om te praat, is oor die algemeen wat genoem word 'n teks segment. Dit is die nulle en ene wat jy opgestel het. So wanneer ons kyk onder die kap het teen watter a.out is, alle die nulle en ene - wanneer jy 'n program, daardie nulle en ene van jou harde gelaai Ry in iets genaamd RAM. En in die geheue, is hulle aan die bokant. Nou intussen, jy het ander dinge. Geïnisialiseer data, geïnitialiseerd data. Daardie twee 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 twee belangrike dinge wat sal kom dwarsdeur hierdie semester, stapel en hoop. So die meeste van jou rekenaar se geheue gereserveer is wanneer die bestuur van 'n program vir iets genoem die stapel en iets genaamd die hoop. En ons is nie van plan om te praat oor die hoop van vandag, maar ons sal praat oor die stapel. En die stapel is bedoel om te besweer die visuele soos die eetsaal maaltyd bak in Mather House, of waar jy ook word, waar die eetsaal personeel skoon hulle elke dag. Hulle stapel hulle van die vloer op die up. 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? Wel, laat ons zoom in op net die onderste helfte van hierdie foto, jou rekenaar RAM, om die volgende voor te stel. Dit blyk dat wanneer jy 'n program soos a.out of hello, wat ookal die program is wat jy geskryf het, weer, is daardie nulle en ene van jou hardeskyf gelaai - wat is langtermyn stoor, bly daar selfs wanneer jy trek die plug - in RAM gelaai. 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 'n rekenaar - dit is gelaai uit hard drive in RAM. So gou as wat dit in RAM gelaai, die nulle en ene gaan by die top, die sogenaamde teks segment. Maar dan so gou as jou program eintlik begin hardloop, die belangrikste funksie geroep 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 dubbel gekliek gebruik om 'n paar veranderlikes binnekant van die belangrikste, het hulle uiteindelik by die onderkant van jou stapel van die geheue, om so te praat. Nou meer konkreet, wat beteken dit eintlik beteken? Dit beteken net dat as ons op pad was om die dinge te tel - as ons gaan aantal grepe RAM op jou rekenaar, sien dat dit kan byte getal nul wees. Dit kan byte nommer een, twee, drie, vier, vyf, ses, almal die pad te hou - 2 miljard al die pad tot daar aan die bokant. So met ander woorde, wanneer ons praat oor RAM of geheue in terme van grepe, is dit beteken net dat iemand het besluit wat elkeen van tel daardie stukke van die geheue. 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? Wel, konseptueel, het hulle net beland op die onderkant van die 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 nou op die top van die belangrikste in die geheue. So 'n plaaslike veranderlikes wat foo het uiteindelik soort van konseptueel bo dié in die hoof. 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 as jy 'n beroep funksies, en as daardie funksies noem funksies, en as die 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 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 dit te doen, terwyl (2> 1), wat sal waarskynlik nooit verander ons. En laat my nou voort te gaan en doen printf. Eintlik, wat gaan minder visueel interessante. Kom ons doen dit. Na 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. Void koor, en ons sal Int ek sê. En dan gaan ek om te sê, printf - oh, kom ons maak dit meer interessant. Laat ons nie eintlik print enigiets op alle. Kom ons doen dit. Chorus (i). Alles reg. So, dit is karretjie want hoekom? Ek maak van hierdie as ek gaan nie, want die program eintlik niks doen nie van belang. 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 hierdie net om nie uit die oog te verloor van werklik die fundamentele fout. Main oproepe koor koor te sing. Toe 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, laat ons gebruik maak van die groter venster. Kom ons gaan voort en maak koor. Kom ons gaan voort en maak koor. Gebruik van ongeïdentifiseerde declarant i. Ag, dit was dom. Ons hoef nie die argument nie. Kom ons doen dit. Wens ons het begin om op hierdie manier. Dit sou gewees het 'n baie makliker program in te skryf. So is daar. Laat ons nou oor te gaan na my terminale venster, re-run kletteren. En hier gaan ons. Dit was regtig vinnig. Wat eintlik net gebeur, al is? Wel, nou sal ek die gedrukte lyn te voeg, sodat ons kan sien. So laat my printf sê, kom ons sê, ek is hier. Okay, geen veranderlikes, sal ons laat dit soos dit. Laat my weer uit te voer. Laat my re-run 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] David J. Malan: Presies. So is dit neem tyd om te druk. Dit neem net meer werk op die rekenaar se deel. En dit is daar. Segmentering 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? Wel, as jy dink oor hoe om jou rekenaar se geheue is uitgelê, gebeur hoof te wees. Maar hier - laat ons net noem dit die koor, en laat ons noem hierdie koor. As ek dan nou my estetika reg doen, is dit net gaan koor om te sê, koor, koor, koor, koor, koor, koor, ad nauseum. En uiteindelik, is 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 die nulpunte en dié wat jou program. In kort, dit is net super, super sleg. Reg? Jou program het buite beheer. Jy gebruik manier om meer geheue as julle almal bedoel is as gevolg van 'n dom fout gemaak het, in hierdie geval. Of in hierdie geval, 'n baie doelbewus gedoen funksie roeping self. Nou is dit nie al die slegte. Funksies wat hulself eintlik groot krag wanneer jy dit korrek gebruik. Ek het nie gebruik dit korrek hier. Dit is dus nie net 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? Wel, wat is regtig gebeur? As ek roep die inkrement funksie, soos ons besig was om in daardie voorbeelde, Ek het 'n waarde soos 1 dat ek slaag. Ek slaag in 'n kopie van die nommer een. So gebeur die volgende. So laat ons gaan in die inkrement voorbeeld. En hierdie man reg oor hier. So hier is wat werklik gebeur. Toe ek gebel het inkrement, en ek slaag in x, picturaal wat hier aan die gang is - as ek die waarde van 1 gestoor word hier, en Ek het eintlik 'n beroep inkrement, wat word nou genoem koor - ja, wat gooi my af hier. So laat ons noem dit inkrement. En ons weet nie wat hierdie volgende funksie gaan wees. So wat eintlik gebeur, is hier iewers in die hoof, Ek het 'n stuk van geheue wat die stoor van die aantal 1. As ek roep inkrement, ek met 'n ander stuk van die geheue, maar nou is ek die kopie van 1. Toe ek daardie waarde inkrementeer, dit word 2 - verskriklik geskryf oor die skerm hier. Maar dan, wat gebeur so gou as inkrement opbrengste? Hierdie geheue net kry oorhandig terug na die bedryfstelsel, wat beteken al wat jy gedoen het is niks nuttig. Die een wat oorspronklik vervat in hoof is nog steeds eintlik is daar. So waar gaan ons met hierdie? Wel, dit blyk dat jy dit terug in die geheue volgorde van om terug te bytes dat jy dinge kan sit. En dit blyk dat ons reeds gesien het iets wat die volgende behels om dinge rug aan rug Terug na. Wat is 'n string, gebaseer op week een en nou week twee? So dit is net 'n versameling van die karakters. So dit blyk, net soos jy kan sit in die geheue, net soos wat jy kan 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, kan ons itereer - van links na regs oor die karakters in 'n tou - en begin massering hulle heeltemal in verskillende karakters. A kan word B. B kan word C. Sodat uiteindelik, ons kan neem om 'n Engelse sin wat werklik sin maak en bekeer elkeen van daardie letters een op 'n tyd deur die loop deur ons rekenaar se geheue links na reg 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. So voordat ons duik in tot 'n crypto en hierdie dinge genoem skikkings, laat my breek vir enige vrae, want ek voel soos ek regtig soort deurmekaar sommige van daardie onderwerpe. So laat los nou as ons kan. Dus het ons net gepraat oor die terugkeer waardes. Ons het gepraat oor die argumente. En ons het gepraat oor hierdie idee, wat ons sal terug kom in die weke na kom, kyk geheue as 'n hele klomp van hierdie gestapel bak, om so te praat. Van onder op up, van so 'n aard dat elke tray wat op die stapel geplaas kry, verteenwoordig 'n funksie wat tans genoem. Enige vrae? So, hoe oor - laat ek probeer om 'n vraag te vra. Ek hou bederf nie, maar nou it's - you've die seun se gesig gesien. So kom ons terug na daardie. So laat my vra 'n vraag hier. Laat my vereenvoudig dit terug na wat dit was voor sommige van ons vorige Q & A. En die feit dat inkrement oop hakies, int nommer, gesluit hakies. Wat verteenwoordig int nommer? [Onhoorbaar] David J. Malan: 'n argument. Okay, maar wat is 'n argument? [Onhoorbaar] David J. Malan: Jammer, wat is dit? SPREKER 3: iets wat jy slaag. David J. Malan: Goed. So iets wat jy slaag. En meer algemeen, dit is net die insette. As jy die skryf van 'n funksie en dat die funksie se doel in die lewe is om te doen iets wat 'n bietjie anders elke keer as jy dit gebruik, dan is die enigste manier om vir wat werklik gebeur sou blyk te wees om dit te voorsien met 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, suiwer vir spesifiseer jou eie gerief, sodat jy kan verwys na dit in die funksie wat u jouself 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, moet jy die rekenaar te vertel wat data tipe dit is, in 'n groot deel sodat dit weet hoeveel stukkies ken vir daardie veranderlike. Want dit kan ses - jammer, sal dit nie ses. Dit kan wees 16. Dit kan wees 8. Dit kan wees 32, selfs 64. Maar die rekenaar nodig het om te weet. Nou die int op die linkerkant verteenwoordig wat, in teenstelling? [Onhoorbaar] David J. Malan: Wat is dit? [Onhoorbaar] David J. Malan: Die tipe van die 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 na die reg van die term is 'n heelgetal is, dan is dit wel in ooreenstemming met wat ons gedoen het. Jy kan nie iets doen soos hierdie - hello, wêreld - want dit is 'n string. Natuurlik is dit 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. Te maak en dan 'n bietjie meer duidelik dat die konteks - daar is hy weer. Die konteks - groot verrassing kom in net 'n oomblik. Die konteks hier is nou dat jou rekenaar se geheue is, weer 'n gigagreep, twee gigagrepe, wat ook al. Miskien is dit nog baie meer. Miskien is dit minder. Maar die rekenaar beskou dit as met verskillende afdelings. Iets gaan daar. Iets anders gaan daar. Verskillende dinge gaan in die middel. En vandag, het ons net begin om hierdie 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 want dit verteenwoordig net die nulle en ene dat die geratel het outputted. So wanneer jy 'n opdrag by die sleutelbord soos a.out, of jy dubbel klik op 'n ikoon op Mac OS of Windows, jou program van jou harde gelaai ry in RAM. En dit plof op die top van jou rekenaar se RAM, om so te praat. Nou 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 lokale veranderlikes beland daar by die onderkant van jou rekenaar se geheue. Maar as hoof roep 'n ander funksie wat self veranderlikes of argumente, het hulle uiteindelik bo dit. En as daardie funksie roep iets, het hulle uiteindelik bo dit, bogenoemde is dit, bogenoemde is dit. En slegs een keer 'n funksie is die uitvoering van doen die stapel van bak, so om 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 is die skryf van die nommer 1 in 'n ander deel van die geheue, die verandering van dat 1 tot 2, in die geval van inkrement - of aan 'n 8, in die geval van die kubus - en dan gooi dat die geheue weg so gou as die inkrement of die kubus funksie opbrengste. Vraag. [Onhoorbaar] David J. Malan: Waar globale veranderlikes in wat gestoor word tans die geïnisialiseer data of geïnitialiseerd data genoem. Die verskil is, as jy 'n globale veranderlike, en jy ken dit onmiddellik 'n waarde met die gelykaan teken, dit eindig aan die bokant. En as jy net int x kommapunt sê met geen waarde nie, 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 intro 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. En geheime sleutel kriptografie, soos die naam aandui, ontleen sy sekuriteit van 'n geheim. So byvoorbeeld, as jy terug in graad skool en jy verby 'n klein geheime liefde brief aan die seun of meisie wat jy breek - as jy wou gehad het om te slaag deur die gehoor, jy sal waarskynlik nie skryf nie so 'n nota in Engels of wat ookal jou moedertaal is nie, maar eerder, jy dit kan enkripteer. Of jy kan net hulle stuur 'n SMS-boodskap van 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 maar jy kan wees - net scramble die woorde. So in plaas van die skryf van 'n, jy B. kan plaas van B te skryf, kan jy skryf C. In plaas van C, sou jy skryf D, en so meer. Of jy kan kom met 'n meer gesofistikeerde vertaling van letters aan verskillende letters. Maar die vangs is die meisie of seun aan wie jy die stuur van hierdie nota moet weet iets. En dit is wat, natuurlik? Soos wat jou geheim is. Soos, wat is die kartering tussen As en Bs en Cs en Ds? Is dit net nog een, om so te praat, aan elk van die letters om te gaan 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 daardie seun of 'n meisie gaan om te weet wat die geheim is? So geheime sleutel crypto nie al die wêreld se probleme op te los. En daar is eintlik 'n verhouding wat ons sal terug te kom na die rigting van semester se einde. Net so, het niemand van ons ooit waarskynlik het 'n - op soortgelyke wyse, die meeste van ons weet nie iemand wat werk, byvoorbeeld, op Amazon.com. En tog, 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. Reg? Die URL sê waarskynlik https. Daar is dalk 'n dom bietjie hangslot ikoon iewers. 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 het ek dit nie doen nie weet iemand by Amazon, en ek het beslis nie gereël om enige soort van geheim met iemand by Amazon, is hoe my rekenaar of my blaaier om dit te doen? Wel, blyk daar is ander vorme van kriptografie heeltemal los dat die probleem. Maar vir vandag, sal ons fokus op die eenvoudige een, waar jy kan reël bevorder 'n paar geheime te leer ken, soos plus 1 of 'n kartering tussen As en Bs. En die proses van kriptografie behels oor die algemeen. Jy het 'n paar plain text, uitgebeeld hier aan die linkerkant. U hardloop en dit deur middel van 'n soort van algoritme of prosedure vir versleutelen. Miskien is dit net 'n 'B, B word C. En dan eindig jy met becijferen teks. Intussen, wanneer jou geliefde ontvang die geheime kennis, hy of sy het dan decrypt dit deur die algemeen omkeer dat die algoritme so te kry terug die plain text. Nou is daar fisiese inkarnasies van hierdie. Byvoorbeeld, dit is 'n klein 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 enige volgorde. En aan die binnekant, is daar eintlik 'n paar nommers, soos wat met hierdie ring, soort van draai jy die buite, maar nie die binnekant om te line-up getalle met letters. En in die clip wat jy oor om te sien sommige van wat jy gesien het 24/7 rondom die Kersseisoen van 'n fliek genaamd A Christmas Story. Jy sal sien dat daar min Ralphie was so gretig om uit te vind wat klein weeskind Annie se geheime boodskap was aan Hom wat gekommunikeer het, dink ek, in die vorm van 'n numeriese boodskappe op 'n seriële boks. En jy het al die kinders-kaarte wat gekom het om te akkumuleer in die graan boks. Jy het om hulle te pos. Jy het die geheime dekodeerder ring terug te kry, sodat jy uiteindelik kan uitvind uit te vind wat die kartering tussen letters en nommers, of briewe en briewe. So EK gee julle hierdie kort clip van A Christmas Story pset 2 te motiveer en ons bespreking, in 'n oomblik van skikkings. So hier het ons Ralphie. [Video-vertoning] Word-dit bekend wees aan almal en diverse dat Ralph Parker benoem 'n lid van die Little Orphan Annie Secret Circle en is geregtig op alle die honneurs-en voordele voorkom daartoe. Onderteken, Little Orphan Annie. Onderteken, Pierre-Andre! In ink! Honneurs-en voordele, wat reeds op die ouderdom van nege. Kom, laat ons gaan met dit. Ek hoef nie alles wat jazz oor smokkelaars en seerowers. Luister môreaand vir die sluiting van avontuur van die swart Seerower skip. Nou is dit tyd vir Annie se geheime boodskap vir jou lede van die Secret Circle. Onthou, kinders, kan slegs lede van Annie se Secret Circle dekodeer Annie se geheime boodskap. Onthou, Annie, afhangende van jou. Stel jou penne B2. Hier is die boodskap. 12, 11 - Ek is in my eerste geheime vergadering. -14, 11, 18, 16 - -Pierre was in 'n groot stem vanaand. Ek kon vertel dat vanaand se boodskap was werklik belangrik is. -3, 25. Dit is 'n boodskap van Annie haarself. Onthou, nie verder vertel. -90 Sekondes later, ek is in die enigste kamer in die huis waar 'n seuntjie van nege kan sit in die privaatheid en dekodeer. Aha, B. Ek het na die volgende. E. Die eerste woord is. S. Dit is makliker kom nou. U. -O, kom op, Ralphie. Ek het om te gaan. -I'll regs af, ma. Gee gefluit. -T, O. Wees seker om te. Maak seker dat jy na wat? Wat was Little Orphan Annie probeer om te sê? Maak seker dat jy na wat? -Ralphie! Randy het om te gaan. Sal jy asseblief kom uit? -Alle reg, ma. Ek kom gou uit. Ek was al hoe nader nou. Die spanning was verskriklik. Wat was dit? Die lot van die planeet kan hang in die weegskaal. -Ralphie! Randy het om te gaan. -I'll reg uit, vir huil hardop. Gee, amper daar. My vingers gevlieg. My gedagte was 'n staal trap. Elke porie vibreer. Dit was amper duidelik. Ja, ja, ja, ja. Maak seker dat jou Ovaltine te drink. Ovaltine? 'N morsige kommersiële? Die seun van 'n teef. [Einde VIDEO speel] David J. Malan: So daar het ons kriptografie. So, hoe kan ons in 'n rekenaar gaan oor die uitvoering of wat dinge soos hierdie? Wel, ons moet 'n manier van uitdrukking van onsself 'n bietjie meer buigsaam as ons veranderlikes tot dusver toegelaat het. Ons het ints. Ons het karakters. Ons het vlotte en dubbels en 'n paar ander. Maar dit is individuele stukke van die geheue wat nie werklik toelaat om ons te uitspreek dinge 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 skil terug. 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 as usual aanlyn - genoem array.c om 'n probleem op te los wat nie verband hou met stringe maar dat verf 'n prentjie hier van hoe ons kan gebruik om iets genoem 'n skikking. '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 wil 'n klein program waarmee jy te skryf jou gemiddeld vir 'n kursus soos 50 wat twee vasvrae, kan jy baie maklik quiz skryf hierdie program - selfs op grond van sommige van verlede week se materiaal - deur gebruik te maak van getint en 'n paar van die veranderlikes. Int quiz1, int quiz2, en dit is redelik eenvoudig. Dit is miskien 10, 20 lyne van kode, max, te implementeer 'n program wat vir die gebruiker vir twee quiz tellings en dan bere hulle gemiddeld deur die toevoeging van hulle saam, deel deur twee en dan druk van die resultate. Ons kan waarskynlik doen redelik geredelik nou na n sekere aantal minute. Maar die probleem is dat veronderstel dat 50 het drie vasvrae of vier. Veronderstel dat jy wou dieselfde program te gebruik vir 'n klas wat weeklikse vasvrae. Dink na oor 'n klas wat weekliks vasvrae. As daar is soos 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, moet dit begin te maak jy wens daar was 'n beter manier. En gelukkig, omdat van skikkings, wat daar is. 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 kapitaal te gebruik letters, net so dat dit regtig staan ​​uit in jou kode. En die spesiale sleutelwoord wat jy gebruik in C # define. So as jy sê # definieer, dan 'n spasie, dan die woord wat jy wil gebruik vir die konstante se naam, en dan die waarde van die konstante. So kennisgewing, dit is verskillend van die toeken van iets aan 'n veranderlike. Daar is geen gelykaanteken. Daar is geen kommapunt. Dit is wat algemeen bekend is as 'n preprocessor richtlijn, maar meer oor 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, wat is net die getal 2. Nou, as ek nou kyk na die belangrikste, laat ons sien hoe dit werk. Op die eerste, dit lyk 'n bietjie kripties. Maar dit is al die dinge van die week een. Vra die gebruiker vir grade. Hoe doen ons dit? Wel, in lyn 22 - dit is regtig die sappige deel - Ek verklaar 'n vlot, maar nie net 'n enkele float. Ek verklaar nie, maar eerder 'n verskeidenheid van floating point 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 wat ek gesê float grade en dan oop bracket en dan 'n nommer. Kennisgewing, indien dit is 'n konstante, dit is net soos ons het dit gedoen. Dit beteken hey rekenaar, gee my twee dryf, en laat ons gesamentlik noem hulle grade. Dit is in teenstelling met 'n veel meer moeisame proses soos hierdie. Dryf 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 een lyn van kode in plaas van skryf, sê, 16 vir 'n 16 week semester. So ek wou nie te 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. Ek het hier die getal 2. Ek het hier die getal 2. Ek het hier die getal 2. Dit baie geduld en baie maklik om te skroef en om per ongeluk verander een waarde tot 3 en mis 'n ander waarde van 2. So ek gaan hierdie weg te plaas abstrakte en gebruik van hierdie konstante dat, as sy naam suggereer, verander nooit nie. En nou, maak nie saak of ons het verskillende vasvrae hierdie jaar of volgende, ek moet net om dit te verander in 'n plek, hier by die top. So dit is al 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 gesamentlik hulle noem 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 aantal% d van% d"), want ek wil net uit te druk gee my quiz nommer een van die twee en dan twee van twee. So, dit is bloot 'n 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 want for-lus het begin met i gelykstaande watter waarde, glo? 0. So op die eerste iterasie van hierdie lus, is dit asof ek het hierdie kode. Maar op die tweede iterasie van hierdie lus, is dit asof ek het hierdie in my kode. Maar die feit dat ek 'n veranderlike is die gebruik is volmaak, want, soos die naam suggereer, is dit wisselende sy waarde op elke iterasie. So ek vul hierdie skikking een plek op 'n slag. Wat beteken hierdie skikking lyk? Wel, die rede waarom ek hierdie super eenvoudige reghoek op die skerm getrek hier tevore was vir hierdie rede. 'N skikking is net 'n stuk van die geheue, gevolg deur nog 'n stuk van die geheue, gevolg deur 'n ander stuk van die geheue, en so meer. So as my skikking van grootte 2, in hierdie geval hier, al wat ek sou doen word deur tik in my quiz tellings, soos hier nie. Ek het 100 op hierdie een. En dan het ek 'n 99 op hierdie een. Dan is hierdie geheue kan selfs nie gebruik word nie, want ek het net gevra die rekenaar vir 'n verskeidenheid van grootte 2. Hierdie vierkante is nog steeds daar. Reg? Jy het nog steeds twee GB RAM, selfs al is jy net vra vir twee 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. Nou 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 om 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. Sodat die 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. En vergewe die inkeping vir nou. 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 slaag dit 'n string, dit vertel hoeveel karakters in daardie string is. Dis al. Die feit dat dit is strlen in plaas van string lengte is net omdat dit meer bondig. 30 jaar gelede, mense wat graag dinge om so bondig as moontlik te skryf. Dus het ons dat die konvensie hier gehou. i + + net beteken dat ek in elke iterasie inkrementeer. En nou is dit agterkom, wat is baie interessant. So in reël 24, Ek sê rekenaar, gee my 'n karakter, agt stukkies, en noem dit c. Maar wat is dit op die regterkant sê? In Engels, wat beteken dat verteenwoordig? [Onhoorbaar] David J. Malan: Presies. Gee my die eerste karakter in die skikking. Of meer algemeen, gee my die i-de karakter in die skikking. En besef dit is nou belangrik dat as die rekenaar wetenskaplikes, het ons eintlik is tel van 0. Jy hoef nie 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 nul, want [0] gaan om die eerste te wees karakter in 'n string. [1] gaan om die tweede te wees. [2] gaan na die derde wees, en so meer. So hierdie program, as ek dit stel - dit is, weer, string1. So maak string1. En nou loop ek string1 in my terminale venster. Dit is wag vir insette, so ek gaan in te tik, sê Dawid. Enter. En nou is dit druk DAVID almal op verskillende lyne, want let op wat ek doen. Ek druk 'n karakter op 'n tyd. Nou sal ons 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 verwar, kan jy eintlik nie 'n string van sommige lengte te gee. As jy druk die verkeerde sleutel op die sleutelbord, kan jy gee geen string at all. Of as jy kwaadwillige, kan jy probeer om te plak in 'n GB waarde van 'n opstel om die string te vul. En as die rekenaar loop uit geheue, dit blyk dat ons gaan terug te kry hierdie spesiale waarde genoem null. So vir nou, weet net dat daar is hierdie spesiale waarde genoem null sal ons in staat stel 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. Maar wat anders oor die loop hierdie tyd? En ek kan terug gaan na die vorige voorbeeld. So dit is weergawe 2. Dit is 'n eerste weergawe. Een, twee, een twee. So het die strlen oproep is waar? Dit is in die eerste deel van die for-lus. Enige gedagtes waarom ek om dit te doen? Ja. [Onhoorbaar] David J. Malan: sodat ons nie noem die funksie elke keer. Presies. Onthou vir loops dat hulle is super eenvoudige wanneer jy soort van verstaan ​​dat dit die inisialisering, die toestand is, en die update. Die probleem is dat die toestand gebeur op elke iterasie van die lus. En so in hierdie voorbeeld hier, wat is sleg oor die feit dat hierdie is my toestand? Jy roep strlen weer en weer en weer. Maar sodra ek het getik in Dawid, die lengte van die string is vyf. En dit gaan nie op elke iterasie van die lus om te verander omdat die string is nog steeds D-A-V-I-D. So, dit is 'n wenk wat gaan word 'n toenemend 'n belangrike idee wat bekend staan ​​as 'n ontwerp besluit, waar - net nie maak die rekenaar onnodige werk doen. Nou, net soos 'n sneak preview van pset 2, pset 2 in die standaard uitgawe is gaan jou uit te daag om eintlik 'n aantal van karakters, sommige implementeer aantal enkripsie-algoritmes, sodat jy kan enkripteer en dekripteer geheime boodskappe, baie soos die een Ralphie daar ontsyfer. In die hacker uitgawe van pset 2, 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 daardie wagwoorde en figuur te kraak uit wat kriptografie of watter geheim is om werklik te gebruik genereer die wagwoorde. En ons gaan om dit te doen deur gebruik te maak van 'n nuwe funksie hier van C wat Ek sal gee, jy net 'n demo van, wat bekend staan ​​as die command-line argumente. So 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 ons gaan om in staat wees om dit te doen, begin met pset 2, iets soos hierdie. As Ek maak argv1, wat is 'n voorbeeld sal ons om terug te kom op Maandag, en hardloop dit 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 tot die woorde wat die gebruiker kry getik op die instruksielyn, is deur die verandering van die hoof, begin hierdie naweek, vanaf int main (void) int main (argc, bevat SPASIES). En sal dus gebore word command line argumente. En as jy regtig gesofistikeerde op hierdie, sal jy in staat wees om te skryf regtig trippy programme, 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 laat dit op die skerm. En ons sal sien wat jy op Maandag.