[Powered by Google Translate] DAVID J. MALAN: Oke. Dit is CS50, en dit is het einde van week twee. Als u verwacht om honger te hebben rond deze tijd morgen, weet dat we gaan bijeen te roepen als een kleine groep morgen, donderdag, 1:15 PM. Er is deze URL hier als u wilt RSVP. Ruimte is beperkt, dus vergeef, indien de formulieren opgevuld door de tijd die u fill this out. Een andere URL hoewel dat interessant kunnen zijn is dit. Dus in ongeveer een maand tijd wordt de cursus zal ter beschikking alle meer in het algemeen via EDX, via welke mensen op het internet zal worden kunnen volgen langs in de loop gaan zeer actief zelfs. Ze zullen gebruik maken van de CS50 Appliance en CS50 bespreken en het merendeel van de diverse software tools die we al hebben dit semester gebruikt. En een van de initiatieven die we graag op te nemen als een experiment dit jaar is om te zien hoeveel inhoud die we kunnen vertalen naar andere taal in woord en geschreven talen. Dus als je zou er belang bij hebben deel te nemen aan dit project, waarbij zullen wij Engels transcripties en ondertiteling voor cursus lezingen en korte broek en seminars en profielen en dergelijke - als je spreekt vloeiend of schrijven vloeiend een andere taal, zouden we je graag deelnemen aan dit project, waarbij je op een of meer van de video's, te vertalen naar een taal die je redelijk goed kent. Om u een idee van de interface, er is een web-based user interface dat we gebruiken die in wezen een UI als deze maken. Dit werd mij leren wat Halloween geleden. En aan de rechterkant er in zwart naast deze tijdstempels zie je de verschillende dingen die kwam uit mijn mond die dag. En dan eronder, zult u in staat om te vertalen naar een andere taal. Wat de mapping tussen, in dit geval Engels en, laten we zeggen, Spaans. Dus het is eigenlijk een zeer gebruiksvriendelijk hulpmiddel. U kunt terugspoelen en vooruitspoelen zeer gemakkelijk met behulp van sneltoetsen. Dus als je wilt deelnemen aan dit experiment en uw woorden gezien en gelezen door potentieel duizenden mensen die er zijn, ik neem dan gerust vrij om deel te nemen. Nu een woord over het kitten van maandag, opdat wij hebben een te sturen eng bericht. Doe beseffen dat als kantooruren suggereren en als secties suggereren, de ontwerp van de cursus is zeer aan studenten hebben samen te werken en praten om samen te werken door middel van probleem sets en problemen. En echt de lijn komt slechts neer op, nogmaals, het werk dat u uiteindelijk moeten indienen moet uw eigen. En dus is het, eerlijk gezegd - in kantooruren, het is heel normaal - Het is totaal te verwachten, zelfs - te chatten met een aantal vrienden naast je. Als hij of zij worstelt met een bepaald onderwerp, en je net als, oh, goed verhuurd Ik geef u een glimp van enkele lijn van code die ik geschreven heb. Dat is prima. Dat gebeurt. En dat is heel erg bevorderlijk, denk ik, met het proces van leren. Wanneer de lijn, opnieuw, wordt gekruist is wanneer het hoofd is een soort van gekanteld hier voor veel te veel seconden of minuten voor die echt om er gewoon nog was een deblokkering kans voor je vriend. En zeker, als dingen uitgewisseld via e-mail en Dropbox en dergelijke, ook daar is de lijn. Dus met alle middelen, zich gerust voelen en voelen aangemoedigd om te chatten met vrienden en klasgenoten over psets en nog veel meer. En realiseer je dat wat je uiteindelijk in te dienen moet echt de product van uw creatie en niet iemand anders. Dus in dezelfde geest van snoezige dieren, zou je weten van deze man hier. Dus dit is een verschrikkelijk cheesy film van jaren geleden. Iedereen hier te zien Spaceballs? Oke. Dus een flink aantal hier. Dus dit is onze prachtige academische manier van de invoering van vandaag uiteindelijk de notie van cryptografie. En dus een van de domeinspecifieke problemen voor PSET 2, die zal komen uit laat morgenavond, is om te duiken in de wereld van de cryptografie, die is de kunst van het versleutelen of scrambling informatie. En dit gaat uiteindelijk om de wereld van de beveiliging. Nu de beveiliging voor de meeste ons komt in de vorm van vrij alledaagse mechanismen. Ieder van ons heeft gebruikersnamen en wachtwoorden. En ieder van ons hebben een zeer slechte gebruikersnamen en wachtwoorden, het meest waarschijnlijk. Als uw wachtwoord is hetzelfde op meerdere websites, dat is waarschijnlijk niet het beste idee, zoals we zullen bespreken in de richting van het einde semester. Als uw wachtwoord is geschreven op een notitie - geen grap - op uw monitor, ook dat is niet per se het beste ontwerp, maar een veel voorkomend verschijnsel. En als je geen gebruik maakt cryptografie om wachtwoorden te versleutelen, zijn ze bijzonder kwetsbaar. Dus als je denkt dat je super slim zijn door het hebben van een verborgen woord documenteren ergens op uw harde schijf die al uw wachtwoorden heeft, maar het is in een map die niemand gaat kijken in, ook dat is niet erg veilig mechanisme. En dus wat PSET 2 zal introduceren is deze kunst van cryptografie en klauteren gegevens, zodat zaken als wachtwoorden des te meer veilig. Zodat deze zeer echte probleem motiveren met een niet-echte scenario, laat me je hier kennismaken met een van onze favoriete clips van deze film, Spaceballs. [VIDEO AFSPELEN] -Helm, je vijand, wat is er aan de hand? Wat doe je met mijn dochter? -Sta mij toe de briljante jonge plastisch chirurg, Dr Philip introduceren Schlotkin, de grootste neuscorrectie mens in het gehele universum en Beverly Hills. -Uwe Hoogheid. -Nose job? Ik begrijp het niet. Ze heeft al een neuscorrectie gehad. Het was een sweet 16 aanwezig is. -Nee, het is niet wat je denkt. Het is veel, veel erger. Als je niet geef me de combinatie naar de lucht schild, Dr Schlotkin zal geef je dochter terug haar oude neus. -Nee! Waar heb je dat vandaan? -Oke. Ik zal je vertellen. Ik zal je vertellen. -Nee, papa, nee. Je moet niet. -Je hebt gelijk, mijn beste. Ik zal je missen je nieuwe neus. Maar ik zal niet vertellen de combinatie er ook gebeurt. -Heel goed. Dr Schlotkin, doe je ergste. -Graag gedaan. -Nee! Wacht, wacht. Ik zal je vertellen. Ik zal je vertellen. -Ik wist dat het zou werken. Oke, geef het aan mij. De combinatie-een. -One. -One. -Twee. -Twee. -Twee. -Drie -Drie. -Drie. -Vier. -Vier. -Vier. -Vijf -Vijf. -Vijf. Dus de combinatie-een, twee, drie, vier, vijf. Dat is het stomste combinatie die ik ooit heb gehoord in mijn leven. Dat is het soort ding een idioot zou hebben op zijn bagage. -Dank u, uwe hoogheid. -Wat heb je gedaan? -Ik zette de muur. -Nee, dat deed je niet. Je zette de hele film. -Ik moet de verkeerde knop gedrukt. -Nou, zet hem weer aan. Zet de film weer aan. -Ja, meneer. Ja, meneer. -Laten we gaan, Erna. Kom, Gretchen. Natuurlijk je weet dat ik nog steeds om u te factureren voor. -Nou, het? Waar is de poort? -Het werkte, meneer. We hebben de combinatie. -Great. Nu kunnen we elke laatste adem van verse lucht van planeet Druidia. Wat is de combinatie? Een, twee, drie, vier, vijf. -Een, twee, drie, vier, vijf? -Ja. -Dat is geweldig. Ik heb dezelfde combinatie op mijn bagage. Bereid Spaceball 1 voor onmiddellijk vertrek. -Ja, meneer. -En verander de combinatie op mijn bagage. -Ow! [END VIDEO AFSPELEN] DAVID J. MALAN: Een geweldige film moet je nu allemaal zien. Dus de context hier is dat met onzekere gegevens een mogelijkheid komt om coderen en te klauteren het. En dus bijvoorbeeld, is een voorbeeld van een gecodeerd bericht. Dit zegt eigenlijk iets in het Engels. Maar het is duidelijk niet geheel duidelijk. En we zullen de cirkel rond vandaag te plagen elkaar wat dit geheim boodschap hier is. Maar in de echte wereld van computers, de dingen niet eens op dat ze misschien Engels zijn zinnen. Zo, dit is wat je zou kunnen vinden op een standaard Linux of Mac of Unix-computer in een bestand dat was ooit een tijd genaamd het wachtwoord bestand. Tegenwoordig, het is al verplaatst naar andere plaatsen. Maar als je kijkt op de juiste plaats op een systeem, ziet u niet alleen uw gebruikersnaam of die van andere mensen op het systeem, maar je zult zien een versleutelde versie van hun wachtwoord. Inderdaad, het woord crypte is er dat de volgende dingen gecodeerd. En deze reeks van schijnbaar willekeurige letters en tekens en cijfers en enzovoort kunnen worden gedecodeerd alleen door het algemeen kennis van enkele geheime - een geheim woord, een geheim nummer. En dus inderdaad, om de kunst van cryptografie uiteindelijk neer vertrouwen van sommige sorteren en weten iets dat iemand anders niet doet. We verkennen deze in een beetje meer detail nu en in de PSET te komen. En nu een woord over de pass / fail. Dus vooral, hebben zoals sommigen van jullie doken in PSET 1, het apparaat, en een heel nieuwe wereld voor jezelf, besefte dat frustraties en verwarring en slechts technische moeilijkheden te verwachten. Vooral bij de eerste PSET, waar er net zo veel nieuwe, net vertrouwd zijn met ls en cd en al deze geheimzinnige commando's in een nieuwe omgeving. En dat is los van de feitelijke materiaal en het programmeren zelf. Zo ook realiseren, dat er zeker kantooruren die bestaan ​​als de steunconstructie. Secties beginnen komende zondag. Maar het belangrijkste is, als je je voelt gewoon dat dit niet het wereld voor u, beseffen dat het echt gewoon niet de tijd te nemen. En ware het niet voor deze gelegenheid jaren geleden voor mij van het nemen van een klasse pass / fail, eerlijk gezegd, ik zou nooit hebben zelfs een voet in de klas. En u kunt dit veranderen tot, laten we zeggen, de vijfde maandag van de cursus. Dus als je op de rand nu realiseren dat in plaats van het hoofd in een aantal andere wateren helemaal, ik zeker overwegen alleen het veranderen van tot pass / fail. Nogmaals, er is niet echt deze cultuur hier op Harvard van het nemen van dingen pass / fail omdat iedereen echt wil bereiken overtreffen of. Maar eerlijk gezegd, dit is een prachtige manier om te proberen iets uit dat misschien niet zijn bekend voorkomen. En je zult uiteindelijk doen in de meeste gevallen prima, misschien veel tot uw verbazing. En in meer concrete termen, wat ik denk pass / fail over het algemeen doet, vooral omdat je misschien al hebt ervaren met PSET 0, als je hebt gezet in 10 uur, 15 uur, 25 uur in een aantal PSET - en je bent gewoon bonzen je hoofd tegen de muur, en het wordt steeds super laat in de nacht, maar je hebt genomen de PSET als 90% van de weg, je weet dat je gewoon niet kunt achterhalen een ding - pass / fail echt neemt de rand af van een klasse als deze, waar u kunt sorteren van gelukkig zeggen oke, ik weet dat het niet perfect. Maar ik werkte mijn kont af op dit punt. Ik ben erg blij met waar het uiteindelijk. En dat zal voldoen aan de verwachtingen voor pass / fail. Dus hou dat in gedachten. Oke. Dus degenen onder u die hebben lang naar de Harvard University Wi-Fi te gebruiken weet dat er een CS50 SSID, een Wi-Fi-verbinding rondzweven dat je zou kunnen hebben meer geluk voor. Het is een beetje ironisch dat het wachtwoord voor deze - indien u zou willen proberen verbinding met deze voor een betere snelheden en laat ons weten of het niet beter - een, twee, drie, vier, vijf, helemaal tot acht omdat acht is veiliger dan vijf. Dus als u de Wi-Fi-wachtwoord, verbinding te maken met CS50 draadloze hier. Een, twee, drie, vier, vijf, zes, zeven, acht. En post op CS50 Bespreek als u nog intermitterende problemen met de verbinding, en we laten de bevoegdheden die worden weet voor deze ruimte. Oke. Dus een snelle teaser, vooral voor degenen onder jullie die fan jongens of meisjes van alle dingen Apple. Wat ik opgegraven van een paar jaar terug was dit bestand hier, ilock.c, gewoon om te soort make concreter en meer complexe deel van de meer fundamentele C programma's die we hebben geschreven. Dus ik opende dit bestand, ilock.c. Het is beschikbaar op de lezingen pagina voor vandaag. Aan de linkerkant zie je een lange lijst van functies. Dus de man die dit schreef schreef een heleboel functies, meer dan alleen de belangrijkste. Hij gebruikte een hele hoop van bibliotheken hier. En als we het scrollen te starten door, wat dit eigenlijk is, is het zeer ten eerste, geloof ik, kraken voor de originele iPhone. Als je wilde de originele iPhone jailbreak, wat betekent untether het installeren van AT & T en eigenlijk speciale software op en doe dingen dat Apple niet wil dat mensen doen - goed, iemand nam de tijd om erachter te komen hoe ze kan misbruik maken van softwarefouten, fouten, bugs, in de software van Apple. En zo werd geboren ilock.c. Dat als je het compileerde op een computer en geïnstalleerd op een iPhone die werd aangesloten op uw computer via bijvoorbeeld een USB-kabel, zou dit u administratieve of root-privileges op je iPhone en laat je vrij veel wat je wilt. En dus er is al deze fascinerende kat en muis spel tussen Apple en de rest van de wereld in het bijzonder als ze, net als veel bedrijven, proberen te vergrendelen hun spullen naar beneden, zodat je kunt alleen doen wat ze van plan. Maar dankzij mensen zoals deze en hun begrip van low-level details en in dit geval, C programmering en veel van de bekende constructen dat we begonnen te spelen met, bent u in staat om echt te maken gebruik van de hardware op een manier je past en niet noodzakelijk een aantal corporate entiteit. Dus bijvoorbeeld, ik heb geen idee wat dit allemaal doet. Maar GetVersion klinkt vrij eenvoudig. En het lijkt erop dat dit is een functie dat deze persoon heeft geschreven. Neem een ​​soort van integer als argument, geeft niets, maar lijkt lus met een for-lus hier en een if-conditie, als voorwaarde, breken, en een of andere manier betrekking heeft op versienummers. Als we naar beneden scrollen - hoewel veel van deze zoekwoorden zullen zijn nieuwe, en er is een heel veel functies in hier hebben we nog nooit gezien en misschien niet altijd te zien via de loop van het semester - aan het eind van de dag, het volgt dezelfde regels en logica dat we zijn geweest spelen met tot dusver. Dus dit is veel te oud om je iPhone 3s of 4s of binnenkort 5s, deze dagen te kraken, maar weet dat het is allemaal heel erg afgeleid van deze wereld, dat hebben we dook. Dus laten we een kijkje nemen op een beetje meer eenvoudig voorbeeld. Deze, alleen maar om krijgen opgewarmd met een aantal syntax en ook een aantal andere gegevens type dat we over gesproken hebben, maar nog niet echt gezien in C. Dit is dus een bestand met de naam positive1.c. En per de opmerkingen aan de top, dit eist alleen dat de gebruiker een positief getal. Dus het is een voorbeeld van een do-while-lus, dat is leuk voor de gebruiker interactief programma's waar je moet de gebruiker vertellen om iets te doen. En als ze niet meewerken, je schreeuwen tegen hen of verwerpen hun inbreng. Case in point, ga ik doen lijnen 19 tot en met 24, zolang de gebruiker niet gegeven mij een positief getal. Nu dit detail hier op lijn 18, waarom heb ik verklaar n boven dit hele looping constructie, in tegenstelling tot direct naast lijn 22 waar ik daadwerkelijk geeft om n te krijgen? Ja? [Onverstaanbaar] DAVID J. MALAN: Ja, dus dit nummer van omvang. En in termen van de leek, het toepassingsgebied zich wat vindt u? Ja? [Onverstaanbaar] DAVID J. MALAN: Kun je je een beetje harder? LUIDSPREKER 1: Waar kun je een bepaalde variabele te openen. DAVID J. MALAN: Perfect. Waar kun je een bepaalde variabele te openen. En in het algemeen, de vuistregel tot nu toe is dat de omvang van een aantal variabele wordt bepaald door de meest recente accolades die je hebt gezien. En dus in dit geval, als ik de fout gemaakt te verklaren n op lijn 22, die lijn zou werken. Ik zou krijgen een int, en ik zou het gebracht die variabele n in lijn 22. Maar welke regel code zou nu heb geen idee waar ik het over heb? Dus 25, en het blijkt 24 en omdat in dit geval buiten van de accolades. Dus gewoon een beetje vervelend, maar zeer eenvoudig op te lossen door simpelweg te verklaren de variabele buiten de functie zelf. Nu we later zullen zien vandaag de dag, kunt u een stap verder gaan. En je kon zelfs een beetje lui - en dit is niet aan te bevelen, in het algemeen - maar je kon zelfs lui en zet een variabele wereldwijd, om zo te zeggen, niet in een functie, niet in een lus, maar in het bestand zelf buiten van alle functies die je hebt geschreven, zoals ik deed hier op lijn 15. Maar dit is over het algemeen afgekeurd. Maar beseffen dat dit een oplossing is soms tot andere problemen, zoals we zullen uiteindelijk te zien. Dus voor nu, we laten het zo. Maar laten we eens kijken of we kunnen herschrijven dit gewoon om te beginnen uiten onszelf een beetje anders. Dus dit programma, alleen maar om duidelijk, is positive1. Laat me hier ga je gang en in mijn terminal-venster maken positive1, Enter. Compileert, oke. Ik ga positive1 rennen, druk op Enter. Ik eis dat je me een positief geheel getal. Ik zal -1 zeggen. Dat werkte niet. 0, 99, dat lijkt te werken. Misschien niet de meest rigoureuze test. Maar in ieder geval het is een leuke sanity check dat we op de goede weg. Dus nu laat me gaan en open versie twee van deze. En wat is er anders al? Het implementeert hetzelfde. Maar wat springen zo duidelijk deze keer anders? Ja, dus dit bool in het groen. Gedit heeft in het groen dit sleutelwoord bekend als bool, Dit is een gegevenstype. Het komt niet ingebouwd in alle versies van C. Je moet zijn specifieke bibliotheek. In ons geval, ik onder meer de CS50 bibliotheek, zodat we toegang tot bool. Maar in lijn 18, lijken we in een Booleaanse waarde hier genoemd dankbaar zijn. Dus ik kon noemen dit alles. Maar ik noemde het alleen maar om dankbaar voor soort over te brengen wat semantische betekenis. Dus in eerste instantie op lijn 18, ik ben blijkbaar niet dankbaar, omdat de Booleaanse waarde dankbaar wordt geïnitialiseerd op false in de lijn 18. En dan lijkt het wat ik hier heb gedaan in de regels 21 tot en met 23 is ik heb net soort herschreven mijn logica. Dus geen functioneel verschillende. Maar in lijn 22 nu, ik controleren of de int de gebruiker heeft verstrekt, is groter dan 0, dan heb ik gewoon de waarde van dankbaar in op true. En waarom doe ik dat? Omdat in de lijn 25, blijkbaar, ik ga naar een toestand te controleren. Doe deze lus terwijl dankbaar is vals. Ik stel dit als alternatief voor een versie omdat het minstens weinig meer intuïtieve, misschien. Het is een beetje meer geaard in het Engels. Dus het volgende doen terwijl u niet dankbaar of tijdens dankbaar is vals. En deze keer ook, ik blijkbaar niet schelen om te onthouden wat de gebruiker heeft ingevoerd in omdat aankondiging er geen variabele n. Dus eigenlijk heb ik - Een leugentje om bestwil is. Functioneel, het programma is een beetje anders als we tot op de bodem van de omdat ik niet herinneren wat n. Maar ik wilde hier laten zien ook dat, hoewel we hebben gezien GetInt en GetString wordt gebruikt op de rechterkant van het gelijkteken dusver zodat we denken aan de waarde, technisch, dat is niet strikt noodzakelijk. Als u om welke reden dan ook gewoon niet schelen om de waarde op te slaan, wil je gewoon om de waarde te controleren, merken dat we gewoon kunnen dit schrijven als GetInt geopend haakje, in de buurt haakje. Deze functie zal een waarde te retourneren, zoals we al zeiden. Het zal u terug te geven een int. En dus als je mentaal denken dat dit gebeurt, als ik typ in 99, GetInt retourneert het getal 99. En zo conceptueel, het is alsof mijn code eigenlijk waren dit. Als 99 inderdaad groter is dan 0, dan wordt dankbaar waar. Dan lijn 25 realiseert ooh, we zijn klaar, want ik ben nu dankbaar. En in lijn 26, we gewoon zeggen, bedankt voor de positieve gehele getallen, wat het ook toevallig. Nu gaan we een lichte syntactische suiker hier, bij wijze van spreken. Laten we eens kijken of we kunnen opruimen deze lijn 25 met deze derde en laatste variantie in positive3. Dus let op de enige verschil nu is wat regel code? Ja, dus 25. En we hebben niet echt gezien deze truc gewoon nog niet. Maar we zagen het uitroepteken op maandag, die wat aanduidt? Dus niet, of ontkenning. Dus neem een ​​Booleaanse waarde en flip zijn waarde. Ware wordt vals. False wordt waar. Dus dit, ik zou willen voorstellen, is zelfs een beetje meer intuïtieve van een manier van het schrijven van de code, omdat ik nog steeds dankbaar initialiseren op false. Ik heb nog steeds het volgende doen. Ik dankbaar op true wanneer de tijd komt. Maar nu kun je eigenlijk alleen maar vertalen deze code verbaal van links naar rechts, terwijl niet dankbaar. Omdat knal of uitroepteken, duidt het begrip niet, dus terwijl niet dankbaar. Dus nogmaals, we hebben geen nieuwe concepten als zodanig. We hebben gesproken over Booleans terug toen speelden we met Scratch. Maar realiseer me nu dat we kunnen gewoon beginnen met het schrijven van onze code in verschillende manieren. Dus vooral in pset1, als je soort van worstelen om erachter te komen de weg naar schrijf een programma, worden heb je geluk kansen, want er komt wel elke aantal oplossingen die je kan gebeuren op. Zo, dit is gewoon drie voor zelfs de eenvoudigste van de programma's. Oke. En nu terug op maandag, vertrokken we op deze notitie met terugkeer waarden. Dus voor de eerste keer, schreven we een programma dat niet alleen maar de belangrijkste, Het heeft ook een eigen aangepaste functie die ik hier geschreven heb. Dus in lijn 31 tot 34, heb ik geïmplementeerd een kubus functie. Het is niet complex. Het is gewoon een keer een keer een, in dit geval. Maar wat belangrijk is over het is dat ik inbreng te nemen in de vorm van een en Ik breng output in de vorm van een keer per keer per. Dus nu heb ik de mogelijkheid, net als ik om met printf alleen wordt gebruikt, om te bellen deze functie door te bellen naar de kubus functie. En de kubus functie neemt sommige input. En de kubus functie geeft enkele uitgang. En zo daarentegen printf gewoon deed iets. Het kwam niet terug iets dat we om gaf - ook al, als een terzijde, het doet een waarde teruggeven. Je gewoon in het algemeen negeren. Printf gewoon deed iets. Het had een neveneffect van afdrukken op het scherm. Daarentegen hier, hebben we de kubus functie, die eigenlijk terug iets. Dus dit is over het algemeen - voor degenen die vertrouwd zijn met deze, het is een vrij eenvoudig idee. Maar voor de minder vertrouwd zijn met dit idee van het doorgeven in inputs en het krijgen van terug uitgangen, laten we proberen gewoon iets super eenvoudig. Is er iemand comfortabele komen op het podium kort? Je moet comfortabel met een camera op je, als goed. Ja. Oke, wat is je naam? KEN: Ken. DAVID J. MALAN: Ken. Oke, Ken. Kom op. Ken dus zal een functie soort hier. En laten we verder gaan en dit doen. Laten we een beetje fantasie. Leuk u te ontmoeten. Welkom bij centraal. Oke. Laten we hier op die knop. Oke. Dus hier heb je een moderne schoolbord. En wat ik ben is de belangrijkste functie, bijvoorbeeld. En ik heb geen iPad in mijn hand. Ik heb niet echt weet hoe je - nou eigenlijk, kan dat niet zeggen. Ik heb niet echt goed handschrift. En dus daarom, ik wil dat je iets op het scherm voor me af te drukken. Dus daar ben ik nu het hoofdprogramma. En ik ga je zeggen dat dit door het schrijven van het in mijn kip kras-en dan aan u voorbijgaan een ingang. Dus net zo dwaas alsof deze oefening is, het begrip van functies en het bellen van een functie en het retourneren van een functie echt neer op deze. Ik ben de belangrijkste. Ik heb net printf geschreven ("iets") op het scherm. Ik gebruik dit programma. En zodra printf wordt aangeroepen, duurt het een argument - of een parameter, soms - tussen dubbele aanhalingstekens. Hier is dat argument. Ik ben door te geven aan Ken. Nu is hij een zwarte doos schriftelijke bepaald aantal jaren geleden dat blijkbaar alleen weet hoe u kunt afdrukken wat op het scherm. Dus, uit te voeren. Dat is niet slecht. Dus, heel goed. Dus nu Ken gebeurt uitvoeren. Heeft hij nodig om mij iets terug? Dus niet dat we tot nu toe gezien. Nogmaals, printf eigenlijk terug een nummer. Maar we gaan dat te negeren voor nu, want we hebben het nooit gebruikt. Dus dat is het voor Ken. En nu de belangrijkste komt terug te voeren naar - belangrijkste neemt de controle over het programma opnieuw, want dat regel van de code, printf, gebeurt de uitvoering. En we gaan over onze manier uitvoeren wat andere lijnen zijn er. Oke. Dus nu laten we proberen een iets ander voorbeeld. En deze keer hier, laten we eerst het scherm te wissen. En deze keer, we doen het Cubing functie. Maar deze keer, verwacht ik een uitgangswaarde. Dus laten we verder gaan en dit doen. Dus nu heb ik een regel code die zegt x = cube (x). Dus eigenlijk let's - de regel van de code, recall, ziet er als volgt. x = cube (x). Dus hoe gaat dit werken? Dus laten we verder gaan en geven je een wit scherm weer. En ik ga nu schrijven de waarde van x, die op dit moment in tijd gebeurt, worden laten we zeggen, 2, om het simpel te houden. Dus ik heb geschreven op een stuk papier de waarde van 2, dat is mijn waarde x. Ik geef het aan Ken. KEN: En ik schrijf het antwoord? DAVID J. MALAN: Ja, laten we gewoon het antwoord te schrijven. Oke. En nu heeft hij om terug te keren me iets. Dus - perfect. Leuk segue. Dus nu geeft hij me terug de waarde van 8, in dit geval. En wat doe ik ermee? Nou, eigenlijk, laten we eens kijken. Dit goed. Wat moet ik doen? Nu ga ik om deze waarde te nemen en daadwerkelijk op te slaan in de dezelfde bits geheugen. Maar let op, ik ben een beetje worstelen hier. Ik ben een beetje in de war, want waar moet ik eigenlijk schrijf de waarde van x? Want wat ik net heb gedaan is fysiek de hand Ken een stuk papier dat was de waarde 2, die x. En inderdaad, dat is precies wat er gebeurt. Zo blijkt dat wanneer je een functie aan te roepen, en passeert u in een discussie als "hello world" of passeert u in een discussie zoals 2, in het algemeen, je bent passeren in een kopie van dit argument. En dus net zoals ik schreef het nummer 2 hier en gaf het aan Ken, dat moet betekenen dat ik nog steeds een kopie van de waarde 2 ergens. Want inderdaad, nu ik heb gekregen terug de waarde 8, moet ik om terug te gaan in RAM en eigenlijk schrijf een daling van 8 waar ik ooit had de nummer 2. Dus visueel onthoud dit begrip passeren in letterlijk een kopie van de waarde. Ken doet zijn ding, geeft me weer iets - in dit geval, een waarde als 8. En dan moet ik iets doen met die waarde, als ik willen houden rond. Dus dit alles zal zijn maar al te bekend voor lang. Dank je wel voor deze demo hier, Ken. Oke. Heel goed gedaan. Dus laten we eens kijken hoe dat uiteindelijk betrekking heeft op een deel van de functie roepen dat we hier gedaan. Dus laat me gaan en brengen ons terug naar de Cubing voorbeeld hier. En let op dat als we willen om daadwerkelijk beginnen met het innemen van dit verder, we gaan te moeten houden met het feit dat het aantal x dat wordt doorgegeven in hier is iets anders dan wat er daadwerkelijk wordt doorgegeven aan de functie. Dus nogmaals, wordt dit doorgegeven door kopie gaat behoorlijk germane in slechts een moment. Dus laten we eens een blik op iets dat niet helemaal werkt juist nog niet. Ik ga om verder te gaan en een derde buggy voorbeeld te openen, die wordt ontsierd door de natuur. En het heet buggy3, en het implementeert een swap-functie. Hier hebben we dus een van de belangrijkste functie die in willekeur heeft x-en y-geïnitialiseerd te 1 en 2 respectievelijk. We konden gebruik maken GetInt, maar we hoeven alleen maar een eenvoudige oefening. Dus het is hard-coded als 1 en 2. In lijnen 21 en 22, hebben we blijkbaar printen x en y, een per regel. Dan, op lijn 23, ik beweer ik deze waarden swapping, puntje, puntje, puntje. Ik blijkbaar roep een functie in regel 24 de naam swap dat duurt twee argumenten. Het is totaal legit voor functies te nemen twee argumenten. We hebben gezien printf al doen. Dus swap neemt blijkbaar x en y. En zoals de naam al doet vermoeden, hoop ik dat het gaat om swap deze twee waarden. Dus dan moet ik zeggen op de lijn 25, verwisseld. En ik herdrukken x en y in de veronderstelling dat ze hebben inderdaad verwisseld. Maar als ik echt uitvoeren van dit programma - Laat me open een terminal venster. Laat me buggy3. Zoals de naam al doet vermoeden, is dit niet van plan om goed af. Want als ik druk op Enter, merken dat x is 1. y 2. En toch het einde van het programma ze nog in feite hetzelfde. Dus gebaseerd op het aantonen juist nu met Ken, wat er werkelijk aan de hand is? Nou, laten we duiken in deze swap functie. Het is super kort. Het is slechts een paar regels code lang. Maar wat is het fundamentele probleem op basis van het eenvoudige verhaal verteld hier met Ken? Waarom wordt swap gebroken? [Onverstaanbaar] Precies. Dus we slaan een kopie, niet de variabele zelf. Met andere woorden, swap neemt blijkbaar twee argumenten, een int. En het is willekeurig genoemd a en b. En hier heb ik aangenomen in x en y, die respectievelijk zijn 1 en 2. Maar ik ben niet letterlijk passeren in x. Ik ben niet letterlijk voorbij in y. Ik ben het passeren van een kopie van x en een kopie van y. Het is net als bijna alsof je gekopieerd en geplakt in te wisselen de waarden die je wilt dat het daadwerkelijk manipuleren. Dus als dat het geval is, als ik het programma, start het uitvoeren van lijn 35, dan 36 - als ik naar lijn 37, op dit punt in het verhaal, wat is de waarde van een? Op dit punt in het verhaal, lijn 37, wat is de waarde van een op dit punt? Dus het moet gewoon 1. Juist? Omdat x werd doorgegeven als het eerste argument. En deze functie gewoon willekeurig roept haar eerste argument, een. Ook is y, het tweede argument. En het is gewoon willekeurig te bellen naar het tweede argument b. Nu deze tweedeling is eigenlijk vrij eenvoudig uitgelegd. Denk er eens over. Niemand van ons heeft voldaan aan de persoon die schreef printf. Dus zeker, hij of zij heeft geen idee wat onze variabelen 30 jaar later gaan genoemd te worden. Dus er moet een onderscheid te maken tussen wat je noemt variabelen in functies die u aan het schrijven bent en wat je noemt variabelen in functies die u bent bellen of gebruikt. Met andere woorden, heb ik zelf mijn variabelen x en y. Maar als iemand anders had geschreven de swap-functie, hij of zij zeker zou niet weten wat mijn variabelen zullen worden genoemd. Dus beseffen dat dit is de reden waarom u deze dualiteit van namen. Technisch gezien kan ik dit doen door toeval. Maar ze zou nog steeds worden doorgegeven als kopieën. Het zou gewoon puur toeval esthetisch als die persoon die schreef swap had gebruikt dezelfde namen. Oke. Dus op dit punt in het verhaal leiding 37 a 1. b 2. En nu moet ik gaan om ze te verwisselen. Nou allereerst wil ik eigenlijk doen dit veel eenvoudiger. Ik weet niet wat die drie regels code aan het doen waren. Laat me dit te doen. b krijgt een. a krijgt b. Gereed. Waarom is deze gebroken, logisch? Het is een soort van de intuïtieve, toch? Dus een wordt b. En b wordt een. Maar het probleem is dat zodra lijn 37 wordt uitgevoerd, wat is het waarde van a en b? Dezelfde, 1. Omdat je pan gehakt, om zo te zeggen, je hebt veranderd b om een ​​gelijk. Dus zodra lijn 37 wordt uitgevoerd, dat is geweldig. Je hebt nu twee exemplaren van het nummer 1 binnen in deze functie. Dus dan wanneer je zegt in de lijn 38, een b krijgt, nou, je bent soort geschroefd. Omdat je gewoon toewijzen van 1 tot 1. Je hebt soort van verloren de waarde die u gaf. Dus in de originele versie van dit, let op wat ik deed. Ik plaats had een derde lijn van de code die er zo uitzag. Ik verklaar een tijdelijke variabele - tmp is een veel voorkomende naam voor een tijdelijke variabele. Het is een int, omdat het moet passen bij wat ik wil een kopie van te maken. Ik bewaar een kopie van een binnenkant van tmp. Dus zodra lijn 37 heeft uitgevoerd, de waarde van a - snelle sanity check - 1. De waarde van b is 2. En de waarde van tmp is 1. Dus nu heb ik uitvoeren lijn 38. Dus als lijn 38 voert een neemt de waarde van b. En b was 2. Dus een is nu 2. Dus op dit punt in het verhaal, a 2, b 2, en tmp 1. Dus nu logisch, we kunnen gewoon plop tmp waarde in b. En we zijn klaar. Dus hebben we dat probleem opgelost. Helaas, toen ik dit programma uit te voeren in deze vorm, is het niet echt ruilen geen waarden. Maar om duidelijk te zijn, waarom? Ik maakte het logische probleem van zojuist. Maar nogmaals, als ik zonder dit programma, x en y blijven ongewijzigd tegen het einde van van het programma uitvoering. [Onverstaanbaar] DAVID J. MALAN: Dus we hebben niet teruggekeerd niets. Dus dat is waar. Maar het blijkt dat er een beetje een probleem hier omdat tot nu toe, de enige wat we in staat geweest om terug te keren is een ding. En dit is een beperking van C. U kunt pas echt een waarde teruggeven, in welk geval, ik ben een beetje hier vast want ik kon de nieuwe waarde van x terug of ik kon de terugkeer van de nieuwe waarde van y. Maar ik wil beide terug. Dus terug is niet de eenvoudige oplossing. Maar het probleem is fundamenteel waarom? Wat hebben we eigenlijk verwisseld? a en b. Maar a en b zijn kopieën van x en y, wat betekent dat we gewoon dit alles deed werken - we brachten als drie minuten praten over de swap functie en deze drie variabelen. En dat is geweldig, volkomen juist in een isolement. Maar a en b van de scope is alleen in deze lijnen hier. Dus net als een for-lus, als je verklaart een geheel getal i in de voor lus - op dezelfde wijze, als je verklaren a en b in een functie die je hebt geschreven, ze zijn alleen geldig binnen van die functie. Wat betekent dat, zodra swap wordt gedaan uitvoeren en we gaan van lijn 24 naar leiding 25 x en y zijn niet veranderd. Je hoeft alleen verspilde heel veel tijd wisselen kopieën van variabelen. Zo blijkt dat de oplossing voor dit eigenlijk niet duidelijk. Het is niet helemaal voldoende om terug te keren waarden omdat we kunnen slechts een waarde teruggeven. En ik wil zowel de x-en y-swap op hetzelfde moment. Dus we gaan terug naar deze. Maar voor nu, beseffen dat het probleem fundamenteel voort uit het feit dat a en b kopieën. En ze zijn in hun eigen toepassingsgebied. Nou, laten we proberen om dit op te lossen op een bepaalde manier. Laat me eigenlijk scrollen hier terug en open te stellen, laten we zeggen, een vierde variant hiervan buggy4. En wat dacht je hiervan? Dit is een soortgelijke, maar eenvoudiger probleem om naar te kijken voordat we een gooi naar het oplossen ervan. Dit programma heet increment. En het initialiseert blijkbaar een x geheel getal van 1 in lijn 18. Vervolgens heb ik beweren x 1. Vervolgens heb ik vordering verhogen, puntje, puntje, puntje. Ik bel dan increment. Maar dan in lijnen 22 en 23, ik beweer het is al opgehoogd. Ik eis x is nu wat het ook is, vermoedelijk 2. Maar dit programma is buggy. Wat is het probleem? Ja? [Onverstaanbaar] DAVID J. MALAN: Precies. Dus x is uiteraard verklaard op lijn 18. Dat is binnen accolades belangrijkste is. Dus het simpele antwoord is dat, nou ja, x hier bestaat. Het bestaat niet in de lijn 32. Dus dit programma eigenlijk niet eens samen te stellen. De compiler, wanneer ik probeer deze code moet compileren, gaat schreeuwen over enkele zwart-id of iets van die strekking. In feite, laten we het proberen. Dit is te buggy4. Daar is het. Het gebruik van niet-aangegeven identifier x in de lijn 32. En eigenlijk, laten we explicieter hier vandaag, zodat dit is nuttig in kantooruren en thuis. Merk op dat het een beetje cryptisch geschreven. Maar het feit dat Clang heeft schreeuwde naar ons, zeggende: buggy4.c: 32:5, is eigenlijk nuttig. Het betekent dat de fout op lijn 32 op tekenpositie vijf. Dus een, twee, drie, vier, vijf. Dat is, in feite, waar het probleem. En ook om in gedachten te houden tijdens kantooruren en thuis, ik ben gelukkig hier. Ik heb een fout gemaakt. Het gaat om relatief eenvoudig op te lossen. Maar als je een heel scherm vol met overweldigende foutmeldingen, nogmaals, beseffen dat de onderste een net kunnen een symptoom zijn van de bovenste degenen. Dus altijd achtervolgen je bugs van boven naar beneden. Omdat er misschien gewoon een daisy-chain effect dat wenst u hebben veel meer problemen dan je eigenlijk doen. Dus hoe kunnen we dit oplossen als mijn doel is om te hogen x? Wat is dat? Oke. Dus we kunnen maken x mondiaal. Laten we de snelkoppeling die ik gewaarschuwd eerder. Maar ach, we hoeven alleen maar een snelle oplossing. Dus laten we gewoon zeggen int x hier. Dat maakt x mondiaal. Dus nu de belangrijkste toegang tot het. En Toename er toegang toe heeft. En dus laat me ga je gang en nu slaat deze. Maak buggy4, Enter. Lijkt nu te compileren. Laten we lopen buggy4, en het lijkt echt te werken. Nu, dit is een van die dingen - Doe wat ik zeg, niet wat ik doe, want ik ben net klaar. Omdat in het algemeen worden onze programma's wordt nog veel interessanter en veel langer dan dit. En als je oplossing voor de problemen van het leven is gewoon ah, zet alle variabelen op de top van uw dossier, heel snel doen programma's te krijgen afschuwelijk moeilijk te beheren. Het wordt nog lastiger te bedenken nieuwe variabele namen. Het wordt nog lastiger om te begrijpen wat de variabele is wat doet. En dus in het algemeen is dit geen goede oplossing. Dus laten we dit doen beter. We willen niet een globale variabele gebruiken hier. Ik wil wel x verhogen. Dus ik kon natuurlijk - aan het eind van de dag, het is een soort van een domme verhaal, omdat we dit gewoon doen. Maar als ik niet weet over die exploitant, of ik mocht niet veranderen in de belangrijkste zichzelf, hoe zou ik anders implementeren Ken hier, dit tijd niet om kubus, maar op te hogen? Hoe kan ik hier veranderen dit ding? Ja. [Onverstaanbaar] DAVID J. MALAN: Oke, goed. Dus waarom niet ik pas in x? En dan in plaats van terug te keren, waarom niet Ik doe gewoon terug x + 1? Nu, een paar dingen moet hier veranderen. Ik ben op de goede weg. Wat heb ik nodig om te tweaken? Iemand anders. Ja? [Onverstaanbaar] DAVID J. MALAN: Ik moet de return type van increment wijzigen want het is niet vervallen. Void betekent niets er wordt geretourneerd. Maar het is duidelijk, nu is. Dus dit moet veranderen om int in overeenstemming te zijn met wat Ik ben eigenlijk terug. Nu iets anders is nog steeds buggy hier. Ja? [Onverstaanbaar] DAVID J. MALAN: Dus ik moet x verhogen? [Onverstaanbaar] DAVID J. MALAN: Ah, dus ik moet x passeren. Dus ik moet hier doen. Dus het prototype, ik moet dit veranderen hier. Dit heeft dus te worden een int. Dit moet naar - hmm. Ik heb eigenlijk een bug hier beneden. Laten we eerst bevestig deze. Wat moet dit eigenlijk? Dus het moet een int iets. Het kan x. Maar eerlijk gezegd, als je begint te bellen al je variabelen x, gaat het om steeds minder duidelijk wat wat is. Dus laten we gewoon willekeurig een andere naamgevingsconventie voor mijn kiezen helper functies, functies die ik aan het schrijven ben. We noemen het een. Of we kunnen noemen het - laten we noemen het even_number om nog meer te expliciteren. Dus dan moet ik om terug te keren, ongeacht het aantal is plus 1. En nu moet ik nog iets veranderen hier en een ander ding hier. Wat moet ik eerst wijzigen op lijn 21? Ik moet het toe te wijzen aan x. Dus ik kan niet gewoon bellen increment x. Ik moet het antwoord onthouden door het veranderen van de waarde van x op de linkerkant. En hoewel x nu op de links en rechts, dat is helemaal goed, omdat de rechterkant wordt eerst uitgevoerd krijgt dan plofte in de linker de hand ding, x in dit geval. En dan tot slot, is dit een makkelijke oplossing nu. Dit moet gewoon overeenkomen met wat er onder neer. Int nummer. Oke. Dus een hele hoop veranderingen voor een hele domme functie. Maar vertegenwoordiger van de dingen die we in toenemende mate zullen willen doen. Dus zorg buggy4. Ik heb het verknald ergens. Oh mijn God. Vijf fouten in, zoals, een zes-line programma. Dus wat is er mis op lijn 18, character 5? Oke. Dus ik moet deze int te declareren. Oke. Dus laten we eens kijken, een hele hoop andere fouten. Oh my god. 19, 18, 21. Maar nogmaals, laten we gewoon het scherm te wissen - Control L hier - en re-run Clang. Dus vijf problemen is eigenlijk alleen maar die ene. Dus laten we nu lopen buggy4, Enter. Oef. x correct verhoogd. Oke. Hebt u vragen over de manier waarop getallen verhogen? Ja? SPEAKER 2: Hoe komt het dat je gewoon x veranderen naar nummer in de variabele naam geven en weet wat je bedoelt? DAVID J. MALAN: Goede vraag. Hoe komt het dat ik kan x veranderen naar nummer en het programma zal weten onmiddellijk? Dus nogmaals, denk aan het als deze abstractie. Dus als ik de belangrijkste en Ken is incrementeel, eerlijk gezegd, kan me niet schelen wat Ken noemt zijn iPad. Kan me niet schelen wat hij noemt alles wat te maken heeft met zijn implementatie van deze functionaliteit. Dus dit is een implementatie detail dat ik, de belangrijkste, niet zorgen te maken over. En dus simpelweg het veranderen van het consequent binnenkant van de functie, het aantal hier en nummer hier, is alles wat nodig zolang ik opnieuw te compileren. Het is een soort van leuk als je erover nadenkt - velen van ons, die van u met bestuurder licenties die hebben gereden, of als je zelfs gereden in een auto - de meesten van ons hebben geen idee hoe een auto werkt onder de kap. En letterlijk, bij het openen van de motorkap, de meesten van ons - waaronder ikzelf - zijn niet van plan om echt te weten wat we kijken. Zoiets als je nu misschien voelen met dingen zoals dit recht. Maar we hoeven niet echt schelen hoe de auto werkt. We hoeven niet te schelen wat alle stangen en zuigers en kabels binnenkant van de auto eigenlijk aan het doen. Dus iets als wat je noemt de zuiger doet er niet toe hier in dit geval. Hetzelfde idee. Ja? [Onverstaanbaar] DAVID J. MALAN: Als er meer toepassingen van de variabele x een moment geleden, u, de programmeur, zou moeten overal veranderen. Of je zou kunnen letterlijk doen Bestand, Menu en vervolgens Zoeken / vervangen, zoiets. Maar je gaat te hebben om die wijzigingen zelf. Je moet consequent zijn. [Onverstaanbaar] DAVID J. MALAN: Een bepaalde volgorde zoals hier? Als dit int een ander nummer? Ja. Dus volgorde van belang wanneer u aanroepen van de functie. Dus als ik riepen Toename hier met iets komma iets, er is een directe mapping. De eerste variabele, wat het ook heet, is gemaakt van een kopie van de eerste argument hier. Sorry, mag dit niet als een haakje. Het tweede argument een lijn staat met de tweede. Dus orde, ja, zaken. Oke. Sorry dat ik nam een ​​lange weg om er te komen. Andere vragen? Oke. Dus laten we kijken of we niet een beeld schetsen van wat er werkelijk gaande is hier onder de kap, om zo te zeggen. Dus dit is een rechthoek die geheugen van uw computer zouden kunnen betekenen. Dus zelfs als je geen idee hebt hoe het geheugen werkt of hoe RAM werkt, in ieder geval ervan uit dat je trossen van het deze dagen hebben. Je hebt megabytes van. Je hebt gigabytes aan het. En we weten van week nul, dat een byte is precies wat? 8 bits. Juist, dus 8 nullen en enen. Dus als uw computer is voorzien van een gig RAM, twee optredens van RAM deze dagen, heb je een miljard of 2 miljard bytes van het geheugen, of ongeveer 8 miljard of 16 miljard bits, binnenkant van uw computer. Nu in tegenstelling tot de kleine Woolly Willy voorbeeld, het is niet magnetische deeltjes typisch meer. In toenemende mate, in laptops in ieder geval, het is solid state drives, SSD's, die net hebben geen bewegende delen. Het is allemaal elektronisch. Het is gebaseerd alle elektriciteit. Dus hoewel denken, van deze rechthoek als slechts die de een of twee gigabyte geheugen die je hebt. Dus het is een stuk van het geheugen. Nu is de wereld van de informatica heeft een soort van afgescheiden stukken geheugen om verschillende dingen te doen. Dus bijvoorbeeld, als dit je computer RAM-geheugen - zoals voorgesteld door de rechthoek er - blijkt dat volgens afspraak aan de bovenkant van uw RAM-geheugen, zodat spreken, is over het algemeen wat heet een tekstsegment. Dat zijn de nullen en enen die u hebt gecompileerd. Dus toen hebben we gekeken onder de kap naar wat a.out is, worden alle de nullen en enen - wanneer u een programma uitvoert, worden die nullen en enen geladen vanaf de vaste drive in iets genaamd RAM-geheugen. En in het RAM, ze zetten aan de top. Nu ondertussen, heb je andere dingen. Geïnitialiseerde data, niet-geïnitialiseerde data. Deze twee zwaden van het geheugen verwijzen naar globale variabelen, die u niet vaak gebruikt. Maar soms als je dat doet, belanden ze daar ook. Dan is er nog een aantal andere dingen. Omgevingsvariabelen, die we niet veel tijd besteden aan. Maar dan twee belangrijke dingen die terug zullen komen in deze semester, stack en heap. Dus het grootste deel van het geheugen van uw computer is gereserveerd bij het uitvoeren van een programma voor iets genaamd de stapel en iets genaamd de heap. En we gaan niet om te praten over de hoop van vandaag, maar we zullen praten over de stapel. En de stapel is bedoeld om roepen de visuele van, zoals de eetzaal maaltijdplateaus in Mather House, of waar u zich ook bevindt, waar de eetzaal personeel schoon te maken elke dag. Ze stapelen ze van de vloer naar boven. En evenzo in het geheugen, is er dit idee om iets op een stapelen, om iets op een stapel, om iets op een stapel. En wat bedoelen we hiermee? Nou, laten we inzoomen op alleen de onderste helft van deze foto, van uw computer RAM, de volgende voorstellen. Het blijkt dat wanneer je een programma zoals a.out uitvoeren of hallo, wat dan ook het programma is dat je hebt geschreven, weer, zijn die nullen en enen geladen van uw harde schijf - en dat is langdurige opslag, blijft daar ook als je de stekker eruit trekt - geladen in het RAM. RAM-geheugen is sneller dan harde schijven. Het is kleiner dan harde schijven. Maar het is waar programma's leven, terwijl je draait ze. Dus u dubbelklikt op een programma op een Mac of een PC - het is geladen vanaf harde schijf in het RAM. Zodra het is geladen in het RAM, de nullen en enen gaan op de manier waarop top, de zogenaamde tekstsegment. Maar zodra je het programma daadwerkelijk begint te lopen, de belangrijkste functie wordt aangeroepen. En de belangrijkste, zoals we hebben gezien, heeft vaak lokale variabelen. En het heeft ints en strijkers en tekens en dergelijke. Dus als je het programma dat je hebt geschreven of het programma dat u dubbel geklikt gebruikte een aantal variabelen in de belangrijkste, belanden ze in de onderkant van je stack van het geheugen, om zo te zeggen. Nu meer concreet, dat wil wat eigenlijk? Dit betekent gewoon dat als we zouden gaan om de dingen te tellen - als we gingen het nummer van de bytes RAM in uw computer, merken dat dit zou byte nummer nul. Dit kan byte nummer een, twee, drie, vier, vijf, zes, allemaal de weg omhoog te willen - 2 miljard helemaal tot daar aan de top te zijn. Met andere woorden, als het over RAM of geheugen in termen van bytes, het betekent gewoon dat iemand heeft besloten wat voor elk van nummeren die delen van het geheugen. Dus als u 32-bits voor een int nodig hebt, of je moet 8 bits voor een char, waar ze belanden in het geheugen? Nou conceptueel, maar ze belanden op de bodem van deze ding genaamd de stapel. Maar wat is interessant nu is wanneer de belangrijkste noemt een functie. Stel dat een functie genaamd foo, gewoon een willekeurige naam. Wat er gebeurt is belangrijkste is onderaan de stapel geheugen. Foo nu wordt gelegd op de top van de belangrijkste in het geheugen. Dus elke lokale variabelen die foo heeft uiteindelijk soort van conceptueel boven die in de belangrijkste. Als foo roept een andere functie genaamd bar, die variabelen hier terecht. Als bar noemt iets anders, hier, hier, hier. Dus wat interessant is aan het uitvoeren van een programma is dat als je functies aan te roepen, en als die functies aan te roepen functies, en als die functies aan te roepen functies, bouw je deze stapel van functies in het geheugen. En slechts een keer per functie terugkeert begin je krijgt dat het geheugen terug. Dus een van de makkelijkste manieren om opraken van geheugen in een computer programma is om schrijf functies die nooit meer terug. Dus bijvoorbeeld, laten we zo veel aan te tonen met een opzettelijk buggy programma. Laat me ga je gang en doen # include , int main (void). En ik ga doen, terwijl (2> 1), die waarschijnlijk nooit veranderen op ons. En laat me nu ga je gang en doe printf. Eigenlijk, dat gaat minder visueel interessant. Laten we dit doen. Voor int (i = 0; i> 0). Laten we deze fout, i + +. En laten we niet printf hier. Laten we doen wat ik predikte. Laten we hier een methode. Void koor, en we zullen int i zeggen. En dan ga ik naar printf zeggen, - oh, laten we dit meer interessant. Laten we eigenlijk niets afgedrukt. Laten we dit doen. Chorus (i). Oke. Dus dit is buggy want waarom? Ik verzin dit niet als ik ga, omdat het programma niet echt iets van belang. Maar dat is niet het doel. Het doel is het schrijven van een programma met als belangrijkste functie doet wat, blijkbaar? Bel zelf. En eigenlijk hebben we niet nodig hebben de lus. Laten we zelfs vereenvoudigen dit gewoon om niet uit het oog echt de verliezen fundamentele fout. Belangrijkste oproepen koor een aantal koor zingen. Toen deed ik iets stoms, en ik had refrein oproep refrein, omdat ik veronderstelde iemand anders zou misschien te voeren. En nu dit is niet van plan om nog samen te stellen. Ik moet wat doen? Ik moet het prototype, herinneren. Dus ik moet hier zijn de lege chorus (int i);. Dus nu, als ik hier beneden - eigenlijk, laten we gebruik maken van de groter venster. Laten we verder gaan en maken refrein. Laten we verder gaan en maken refrein. Gebruik van niet-geïdentificeerde leider i. Oh, dat was stom. We hebben geen behoefte het argument. Laten we dit doen. Wou dat we hadden op deze manier begonnen. Het zou veel gemakkelijker programma te schrijven. Dus. Laten we nu over te gaan naar mijn terminal venster, re-run Clang. En daar gaan we. Dat was echt snel. Wat er feitelijk gebeurde, hoewel? Nou, nu zal ik de print regel toe te voegen, zodat we kunnen zien. Dus laat ik zeggen printf, laten we zeggen, ik ben hier. Oke, geen variabelen, we laten het zo. Laat me opnieuw uit te voeren maken. Laat me re-run koor. En kom op. Ga door. Even terzijde, heeft waarom het niet neergestort nog? De segmentatie fout gebeurd super snel voor. [Onverstaanbaar] DAVID J. MALAN: Precies. Dus het kost tijd om af te drukken. Het duurt slechts meer werk van de kant van de computer. En daar is het. Segmentation fault. Dus zien hoe snel programma's te draaien. Als u niet aan het afdrukken iets, super snel. Maar we hebben nog steeds deze segmentation fault omdat wat er gebeurde? Nou, als je na te denken over hoe uw computer het geheugen is aangelegd, is dit gebeurt te zijn de belangrijkste. Maar hier - laten we gewoon noemen dit koor, en laten we noemen dit koor. En als ik nu doe mijn esthetiek recht, wordt deze net gaan refrein zeggen, chorus, chorus, chorus, chorus, chorus, chorus, tot vervelens toe. En uiteindelijk, wat is er gebeurt? Als het grote geheel letterlijk is dit, wat gebeurt er gewoon conceptueel? De stapel overschrijdingen van de heap. Of erger nog, je gewoon overspoeld alles, met inbegrip van de tekst segment, dat de nullen en enen dat uw programma vertegenwoordigen. Kortom, dit is gewoon super, super slecht. Juist? Uw programma is onbeheersbaar. Je gebruikt veel meer geheugen dan je allemaal bedoeld als gevolg van een domme fout in dit geval. Of in dit geval een zeer bewust gedaan functie die zichzelf. Nu is dit niet allemaal slecht. Functies die zichzelf heeft eigenlijk veel macht bij het gebruik van het goed. Ik heb niet gebruikt het goed hier. Dus dit is niet allemaal slecht. Maar het feit dat ik eigenlijk nooit stoppen met bellen me is een fundamenteel zwakte hier van dit programma. Dus waar gaan we heen met dit alles? Nou, wat er echt gebeurt? Toen ik de stap functie aan te roepen, zoals we aan het doen waren in die voorbeelden, Ik heb een waarde als 1 die ik pas binnen Ik passeer in een kopie van de nummer een. Dus gebeurt het volgende. Dus laten we gaan in de increment voorbeeld. En deze man rechts over hier. Dus hier is wat er daadwerkelijk gebeurt. Toen ik belde increment, en ik pas in x, picturaal wat is hier aan de hand is dit - als ik de waarde van 1 hier opgeslagen, en ik daadwerkelijk op te roepen increment, dat heet nu refrein - ja, dat is het gooien van me af hier. Dus laten we noemen dit increment. En we weten niet wat deze volgende functie gaat worden. Dus wat er eigenlijk gebeurt, is hier ergens in de belangrijkste, ik heb een brok van geheugen opslaan die het getal 1. Toen ik increment bellen, ik gebruik een andere stuk van het geheugen, maar nu heb ik de kopie van 1. Toen ik verhoog deze waarde, wordt dit 2 - vreselijk geschreven op de scherm hier. Maar dan, wat gebeurt er zodra Toename rendement? Dit geheugen gewoon wordt teruggegeven aan het besturingssysteem, wat betekent dat alle je hebt gedaan is niets nuttigs. Degene die oorspronkelijk was opgenomen in de belangrijkste is nog steeds daar feitelijk. Waar gaan we heen? Nou, het blijkt dat in het geheugen moet je dit terug om de sequentie van een back- bytes die je kunt dingen zetten inch En het blijkt dat we al iets dat inhoudt dat gezien dingen rug aan rug aan rug aan rug. Wat is een string, op basis van week een en nu week twee? Dus het is gewoon een verzameling van tekens. Zo blijkt, net zoals u kunt nummers zetten in het geheugen, net kunt u zet tekens in het geheugen. En als we eenmaal beginnen met het opzetten tekens in het geheugen rug aan rug heen en weer om terug, het blijkt dat het gebruik van de eenvoudigste dingen zoals een for-lus of een lus while, kunnen we herhalen - van links naar rechts over de karakters in een string - en beginnen masseren ze in verschillende karakters in totaal. Een zou kunnen worden B. B zou kunnen worden C. Dus dat uiteindelijk, kunnen we een Engels zin die daadwerkelijk zinvol is en converteren elk van deze letters een voor een door een wandeling door het geheugen van onze computer links naar recht om daadwerkelijk coderen. Dus laten we hier nemen onze vijf minuten pauze, en als we terug komen, we zullen begin dit proces van scrambling informatie. Oke. Dus voordat we duiken in een aantal crypto en deze dingen genoemd arrays, laat me pauze voor eventuele vragen, omdat ik het gevoel dat ik echt een soort van verwarde enkele van deze onderwerpen. Dus laten we nu oplossen als we kunnen. Dus we spraken over terugkeer waarden. We spraken over argumenten. En we spraken over dit idee, dat we terug komen in de komende weken komen, van het bekijken van het geheugen als een hele hoop van deze gestapelde trays, bij wijze van spreken. Van beneden naar boven, zodat elke lade wordt op de stapel vertegenwoordigt een functie die er op dit moment wordt genoemd. Nog vragen? Hoe zit - laat mij eens proberen een vraag te stellen. Ik blijf bederven, maar nu is - you've allemaal gezien dat de jongen het gezicht. Dus komen we terug naar dat. Dus laat me een vraag stellen hier. Laat ik dit terug te vereenvoudigen naar wat het was voor een aantal van onze eerdere Q & A. En het feit dat increment open haakje heeft, int getal, gesloten haakjes. Wat betekent int number vertegenwoordigen? [Onverstaanbaar] DAVID J. MALAN: Een argument. Oke, maar wat is een argument? [Onverstaanbaar] DAVID J. MALAN: Sorry, wat is dat? SPEAKER 3: Iets wat je passeert inch DAVID J. MALAN: Oke. Dus iets dat je langs inch En meer in het algemeen, het is gewoon de ingang. Als je het schrijven van een functie en die functie het doel in het leven is om te doen iets een beetje anders elke keer dat je het gebruikt, dan is de enige manier voor dat om echt gebeuren lijkt te zijn om het te voorzien van input, zodat het kan iets anders doen met die ingang per keer. Dus je moet twee dingen te geven wanneer een functie wordt ingangen. U moet de naam die u wilt geven aan die input, puur voor opgeven uw eigen gemak, zodat u kunt verwijzen naar het in de functie die u zelf schrijven, zoals ik deed hier in de lijn 32. Maar je moet ook aan het type te specificeren omdat C is een programmeertaal die net nodig dat als je wilt een variabele, moet u de computer vertellen wat gegevens typen is, grotendeels zodat het weet hoeveel bits wijzen voor die variabele. Omdat het zou kunnen zijn zes - Sorry, het zal niet zes. Het kan 16. Het kan 8. Het kan 32 zelfs 64. Maar de computer moet weten. Nu int aan de linkerkant staat voor wat daarentegen? [Onverstaanbaar] DAVID J. MALAN: Wat is dat? [Onverstaanbaar] DAVID J. Malan: Het type van de functie en meer bepaald de type van de output. Juist. Dus terwijl het ding tussen haakjes staat voor de ingang, indien van toepassing, de ding aan de linkerkant geeft haar output. En in dit geval, increment terug blijkbaar een int. En dus int is de terugkeer van dit type functie. Wat betekent het om terug te keren? Letterlijk, gebruikt u het sleutelwoord return. En dan, als wat je terug te keren naar de rechterkant van het zoekwoord is een geheel getal, dan is dat inderdaad overeen met wat we hebben beloofd. Je kon het niet zoiets als dit - hello, world - want dat is een string. Uiteraard is het niet een geheel getal. Dus in het kort, de last is echt op ons, de programmeur, om precies te zijn als naar wat we terug en dan eigenlijk gaan over terug te zenden. En dan te maken een beetje meer duidelijk dat de context - daar is hij weer. De context - grote verrassing komen in slechts een moment. De context hier is nu dat geheugen van uw computer is, nogmaals, een gigabyte, twee gigabyte, wat dan ook. Misschien is het meer. Misschien is het minder. Maar de computer ziet het als het hebben van verschillende secties. Er gaat iets daar beneden. Iets anders gaat daar. Verschillende dingen gaat in het midden. En vandaag, we beginnen te vertellen dit verhaal. Maar we zullen terugkeren naar dit na verloop van tijd. Voor nu, het enige stuk van het geheugen hebben we echt zorgen over is het tekstsegment omdat alleen vertegenwoordigt de nullen en enen dat Clang is uitgevoerd. Dus als je een opdracht uitvoeren op het toetsenbord, zoals a.out, of dat u dubbel Klik op een pictogram op Mac OS of Windows, is uw programma geladen vanaf de vaste rijden in het RAM. En het is plofte op de top van RAM-geheugen van uw computer, om zo te zeggen. Nu ondertussen, als uw programma begint te lopen en de belangrijkste wordt aangeroepen in de programma dat u heeft geschreven of het programma Microsoft of Apple schreef, een van haar lokale variabelen uiteindelijk daar op de bodem van het geheugen van uw computer. Maar als belangrijkste noemt een andere functie die zelf variabelen of argumenten, ze uiteindelijk erboven. En als die functie noemt iets, belanden ze erboven, boven, boven. En slechts eenmaal een functie wordt uitvoering heeft de stapel trays, zodat te spreken, beginnen te krijgen lager en lager. En dit is wat dan, in een notendop, legt uit waarom, wanneer u belt kubus - of je belt increment - je voorbij in een kopie van de waarde. En wat dat betekent picturaal is dat je letterlijk je het schrijven van nummer 1 in een ander deel van het geheugen, het veranderen dat 1 tot 2, bij increment - of een 8, bij cube - en gooien dat het geheugen weg zodra de toename of de kubus functie terugkeert. Vraag. [Onverstaanbaar] DAVID J. MALAN: Waar - globale variabelen worden opgeslagen in wat Momenteel genoemd geïnitialiseerd gegevens of gegevens geïnitialiseerd. Het verschil is, als je een globale variabele, en u deze toewijzen onmiddellijk een waarde met de gelijkteken, het eindigt aan de top daar. En als je gewoon zeggen int x puntkomma zonder waarde, het eindigt een beetje lager in het RAM gewoon volgens afspraak. Andere vragen. Oke. Dus deze foto zal terugkomen als we meer krachtige met wat we kunnen doen met de computer. Maar voor nu, laten we eens een korte intro van cryptografie, een specifiek type cryptografie die niet op te lossen alle problemen in de wereld, maar niet op te lossen sommige. In dit geval hier, we hebben iets dat we geheime sleutel cryptografie. En geheime sleutel cryptografie, zoals de naam al doet vermoeden, ontleent zijn veiligheid van een geheim. Dus bijvoorbeeld, als je terug op de lagere school en je bent het passeren van een little secret liefdesbrief aan de jongen of het meisje die u verpletteren aan - als u wilde dat door het publiek, zou u waarschijnlijk niet schrijven zodanige aantekening in het Engels of wat dan ook je moedertaal is, maar eerder, u zou kunnen coderen. Of je kan gewoon stuur ze een SMS-bericht van deze dagen. Maar je zou eigenlijk gaan ze een briefje door het hele lokaal. En op een veilige manier te doen, op zo'n manier dat je vrienden en de leraar weet niet wat je aan het schrijven bent, kun je komen met een vrij eenvoudige algoritme - jonge hoewel je misschien wel - om gewoon klauteren de woorden. Dus in plaats van het schrijven van A, zou je B. schrijft in plaats van B, kunt u schrijven C. In plaats van C, D kan schrijf, enzovoort. Of je zou kunnen komen met een meer geavanceerde vertaling van brieven verschillende letters. Maar de vangst is de jongen of het meisje aan wie u wilt verzenden deze nota moet iets weten. Dat is wat, natuurlijk? Zoals, wat uw geheim is. Zoals, wat is dat mapping tussen As en Bs en Cs en Ds? Is het gewoon het toevoegen van een, zo te zeggen, aan elk van de brieven om van A naar B, B naar C? Is het complexer dan dat? Dus jij en je geliefde moet deze geheime informatie te hebben. Maar er is een soort van een catch-22 hier. Als dit de eerste keer dat je het verzenden van deze liefdesbrief door de klasse, hoe die jongen of meisje gaat om te weten wat het geheim is zelfs? Dus geheime sleutel crypto lost niet alle problemen in de wereld. En er is eigenlijk een relatie die we terug komen in de richting van semester einde. Ook hebben niemand van ons waarschijnlijk ooit een verzonden - evenzo, de meeste van ons niet weet iemand dat, werkt bijvoorbeeld op Amazon.com. En toch, hebben velen van ons waarschijnlijk gekocht spul bij Amazon.com. En we hebben geleerd om aan te nemen dat deze e-commerce transacties veilig zijn. Juist? De URL zegt waarschijnlijk https. Er is misschien een domme kleine hangslotpictogram ergens. Er is een soort van cryptografie beveiliging van uw creditcardgegevens tussen u en Amazon.com. En toch, als cryptografie gaat weten een geheim, en toch doe ik niet Weet iemand bij Amazon, en ik heb zeker niet geregeld elke vorm van geheim met iemand bij Amazon, hoe wordt mijn computer of mijn browser om dit te doen? Nou, blijkt dat er andere vormen van cryptografie geheel dat op te lossen dat probleem. Maar voor vandaag, zullen we ons richten op de eenvoudige, waar u kunt regelen in verder te gaan naar een geheime weet wel, zoals plus 1 of enkele mapping tussen As en B's. En het proces van cryptografie gaat meestal deze. Je hebt een aantal platte tekst, hier afgebeeld aan de linkerkant. Je loopt het door een soort van algoritme of procedure voor het versleutelen van het. Misschien is dat gewoon A wordt B, B wordt C En dan eindig je met versleutelen tekst. Ondertussen, zodra je geliefde het geheim notitie ontvangt, hij of zij moet dan decoderen door het algemeen een omkering in de algoritme om te krijgen het steunen van de platte tekst. Nu zijn er fysieke incarnaties van deze. Zo, dit is een klein geheim decoder ring. En dit is een ring in de zin dat er hier twee wijzerplaten. Aan de buitenkant rand van dit ding, is er letters A tot en met Z, hoewel ze in willekeurige volgorde. En aan de binnenkant, is er eigenlijk een aantal nummers, zoals dat met deze ring, kunt u soort draai de buitenkant, maar niet de binnenkant om line-up nummers met letters. En in de clip die u gaat zien - waarvan sommige je misschien hebt gezien 24/7 rond de kerstdagen van een film genaamd A Christmas Story. U zult zien dat er weinig Ralphie was zo enthousiast om erachter te komen wat kleine wees Geheime boodschap Annie's was om hem dat waren meegedeeld, denk ik, in de vorm van numerieke berichten op een seriële box. En je moest alle kleine kaarten die kwam ophopen in de doos cornflakes. Je moest ze mailen inch Je moest terug de geheime decoder ring, zodat je eindelijk kunt achterhalen wat de mapping is tussen letters en cijfers, of letters en letters. Dus ik geef je deze korte clip van A Christmas Story te PSET 2 motiveren en onze discussie, in een ogenblik, van arrays. Hier hebben we dus Ralphie. [VIDEO AFSPELEN] -Doen te weten aan alles en iedereen dat Ralph Parker wordt hierbij benoemd tot lid van de Little Orphan Annie Secret Circle en heeft recht op alle de eer en de voordelen die zich daaraan. -Signed, Little Orphan Annie. Medeondertekend, Pierre Andre! In inkt! Eer en voordelen, al op de leeftijd van negen. Kom op, laten we aan de slag gaan. Ik hoef niet al die jazz over smokkelaars en piraten. Morgenavond-Luister naar de afsluitende avontuur van The Black Pirate Ship. Nu is het tijd voor geheime boodschap Annie's voor u leden van de Secret Circle. Vergeet niet, kinderen, kunnen alleen leden van Secret Circle Annie's decoderen Geheime boodschap Annie's. Vergeet niet, is Annie afhankelijk van je. Stel uw pennen naar B2. Hier is de boodschap. 12, 11 - -Ik ben in mijn eerste geheime vergadering. -14, 11, 18, 16 - -Pierre was in grote stem vanavond. Ik kon vertellen dat vanavond de boodschap was echt belangrijk. -3, 25. Dat is een boodschap van Annie zelf. Vergeet niet, niet verder vertellen. -90 Seconden later, ik ben in de enige kamer in het huis waar een jongen van negen konden zitten in privacy en decoderen. Aha, B. ging ik naar de volgende. E. Het eerste woord is zijn. S. Het werd gemakkelijker komen nu. U. -Oh, kom op, Ralphie. Ik moet gaan. -Ik moet recht naar beneden, ma. -Gee whiz. -T, O. Zorg ervoor dat u. Zorg ervoor dat u wat? Wat was Little Orphan Annie probeert te zeggen? Zorg ervoor dat u wat? -Ralphie! Randy heeft om te gaan. Wil je alsjeblieft naar buiten komen? -Oke, ma. Ik kom er zo aan. -Ik werd steeds dichterbij nu. De spanning was verschrikkelijk. Wat was het? Het lot van de planeet kan hangen in de balans. -Ralphie! Randy heeft om te gaan. -Ik moet zo uit, voor luid schreeuwen. -Goh, er bijna. Mijn vingers vlogen. Mijn geest was een stalen val. Elke porie getrild. Het was bijna duidelijk. Ja, ja, ja, ja. -Zorg ervoor dat u uw Ovaltine drinken. Ovaltine? Een crummy commercieel? Zoon van een teef. [END VIDEO AFSPELEN] DAVID J. MALAN: Dus daar hebben we cryptografie. Dus hoe in een computer kunnen we gaan over de uitvoering of die dit soort dingen? Nou, we moeten een manier van uitdrukken onszelf een beetje flexibeler dan onze variabelen tot nu toe hebben toegestaan. We hebben ints. We hebben tekens. We hebben praalwagens en tweepersoonskamers en een paar anderen. Maar dat zijn individuele stukken van het geheugen die niet echt ons toelaten om uitdrukken dingen zoals woorden en zinnen en zinnen. Inderdaad, we hebben wel zulke dingen snaren. Maar we beloofd dat dit echt is gewoon een vereenvoudiging van de CS50 bibliotheek die we van plan te schillen terug. En dus laten we beginnen hier doen. Laat me verder gaan en het openen van een bestand - al deze bestanden zijn beschikbaar zoals gebruikelijk online - riep array.c om een ​​probleem niets met strings op te lossen, maar dat zegt meer dan foto hier hoe we zouden kunnen gebruiken zoiets als een array. Een array is een data type. Het is een type van de variabele, van soorten, die heeft meerdere kleinere soorten gegevens binnenkant van het rug aan rug aan rug aan rug. Dus bijvoorbeeld, als we willen een klein programma dat geeft je schrijf uw quiz gemiddelde voor een cursus zoals 50 dat twee quizzen, je kon heel gemakkelijk schrijf dit programma - gebaseerd, zelfs op een aantal van materiaal van vorige week - met GetInt en een aantal variabelen. Int quiz1, int quiz2, en het is vrij eenvoudig. Het is misschien 10, 20 regels code, max, de implementatie van een programma dat de vraag gebruiker voor twee quiz scores en vervolgens berekent de gemiddelde door ze toe te voegen samen te delen door twee, en vervolgens afdrukken van de resultaten. We kunnen waarschijnlijk wel dat mooie gemakkelijk nu na een aantal minuten niet. Maar het probleem is dat veronderstellen dat 50 had drie of vier quizzen. Stel dat je wilde hetzelfde programma gebruiken voor een klasse die had wekelijkse quizzen. Denk na over een klasse die wekelijks heeft quizzen. Als er, zoals 16 of zo weken in een semester, nu heb je 16 variabelen - int quiz1, int quiz2, int quiz3, int quiz4. Zodra u begint met het zien van deze redundantie, deze kopiëren en plakken van de code moet beginnen om je wou dat er een betere manier. En gelukkig, als gevolg van arrays, is er. Dus laten we dit doen. Ten eerste, laat me even een heel simpel ding dat we niet hebben tot nu toe gebruikt, maar je zult af en toe ziet het in code. Dit is wat algemeen een constante genoemd. Dus het is een constante in de zin dat deze waarde nooit verandert. De menselijke conventie bij het maken van een constante is het gebruik van alle kapitaal brieven, gewoon zo dat het echt opvalt in uw code. En de bijzonder sleutelwoord dat u gebruikt in C # te definiëren. Dus als je zegt # en definiëren, een spatie, dan het woord dat u wilt gebruiken voor de constante naam en de waarde van de constante. Dus verklaring, deze is anders dan het toewijzen van iets aan een variabele. Er is geen gelijk-teken. Er is geen puntkomma. Dit is wat algemeen bekend als een preprocessor richtlijn, maar meer op dat een andere keer. Voor nu, dit zorgt voor een heet onveranderlijke waarde QUIZZEN waarvan de feitelijke numerieke waarde is 2. Dus overal zie je quizzen, Quizzes, quizzes gedurende dit bestand, dat is slechts het cijfer 2. Nu, als ik kijk naar de belangrijkste nu, laten we eens kijken hoe dit werkt. Op het eerste, het ziet er een beetje cryptisch. Maar het is allemaal spullen van week een. Vraag de gebruiker voor de rangen. Hoe gaan we dit doen? Nou, in de lijn 22 - dit is echt de sappige deel - Ik verklaar een vlotter, maar niet zomaar een vlotter. Ik verklaar, in plaats van, een array van floating point waarden. Die variabele zal worden genoemd kwaliteiten zoals hier gesuggereerd. Maar het enige stuk van de nieuwe syntaxis dan zijn deze vierkante haakjes, het feit dat ik heb gezegd vlotter rangen en open beugel en dan een nummer. Let op, als dit een constante, dit is net als wij deden dit. Dit betekent hey computer, geef me twee drijvers, en collectief laten we ze cijfers. Dit in tegenstelling tot een veel moeizaam proces als dit. Float Voorraad1, zweven Grade2, enzovoort. Dus een reeks stelt ons in staat de uitvoering van deze idee, maar veel minder slordig, in zodanig dat we een regel code schrijven in plaats van bijvoorbeeld 16 voor een 16 week semester. Dus ik wilde niet hard-code 2, want als je van deze nu logisch - stel volgend jaar CS50 veranderingen tot 3 quizzen plaats. En ik had de nummer 2 hier. Ik had de nummer 2 hier. Ik had de nummer 2 hier. Ik had de nummer 2 hier. Het wordt heel vervelend en heel gemakkelijk om het te verknallen en per ongeluk wijzigen een waarde 3 en missen een andere waarde van 2. Dus ik ga in plaats daarvan abstracte dit weg en het gebruik van deze constante dat, zoals de naam al doet vermoeden, verandert nooit. En nu, het maakt niet uit of we verschillende quizzen hebben dit jaar of volgende, ik gewoon om het te veranderen in een plaats, hier boven. Dus dat is alles constant is. Ondertussen de nieuwe conceptuele is dat een array. Dus de vierkante haken geef mij dit veel praalwagens en laat me collectief Hier noemen ze rangen. Dus nu laten we eens kijken wat ik ga doen. Hier in leiding 24 is het begin van een lus. Dit is echt niks speciaals. Het is alleen met behulp van quizzen in plaats van een hard-gecodeerde nummer. Maar er is niets intellectueel anders er van vorige week. Dit is gewoon printf. Dus printf ("quiz number% d van% d"), omdat ik wil gewoon uitprinten me quiz geven nummer een van de twee en dan twee van twee. Dus dit is puur een esthetische ding. Maar het interessante deel is nu in lijn 27. Om vullen een van de twee aanduidingen met drijvende komma waarde, u weer gebruik maken van vierkante haken. In dit geval, ik gebruik ik omdat dit for-lus is begonnen met i gelijk welke waarde, blijkbaar? 0. Dus op de eerste iteratie van deze lus, is het alsof ik schreef dit in de code. Maar op de tweede iteratie van deze lus, is het alsof ik schreef dit in mijn code. Maar het feit dat ik een variabele met behulp van perfect is, omdat, zoals de naam al suggereert, het variëren van de waarde van elke iteratie. Dus ik ben het vullen van deze array een plek op een moment. Wat betekent deze array eruit? Nou, de reden dat ik tekende deze super eenvoudige rechthoek op het scherm hier eerder was om deze reden. Een array is gewoon een brok van het geheugen, gevolgd door een ander stuk van het geheugen, gevolgd door een stuk geheugen, enzovoort. Dus als mijn array is van maat 2, in dit geval hier, alles wat ik zou moeten doen door te typen in mijn quiz scores, zoals hier. Ik heb 100 op deze. En toen kreeg ik een 99 op dit ene. Dan is dit geheugen kan niet worden gebruikt, zelfs, want ik heb alleen gevraagd de computer voor een array van grootte 2. Die vierkantjes zijn er nog steeds. Juist? Je hebt nog steeds twee gigabyte aan RAM-geheugen, zelfs als je alleen maar vragen om twee drijvers. Dus het idee achter arrays is dat de computer slechts een deel van het geheugen wordt en dan verdeelt kleinere stukken rug aan rug aan rug aan rug. En dus dat is alles wat een array is. Het is een aaneengesloten stuk van het geheugen, waarbinnen u kunt dingen. Nu gebeurt dit te doen dan slechts enkele saaie rekenen. Als ik naar beneden scrollen hier, dit is waar ik dan itereren over de array. Ik kom met de som van alle waarden in de array. En dan gebruik ik de ronde functie hier om daadwerkelijk de Samenvattend gedeeld door quizzen. Maar laat me mijn hand zwaaien, dat als een soort van voldoende rekenkundige voor nu. Maar dat alles doet voor mij uiteindelijk het berekenen van een gemiddelde. Dus eerst quiz plus tweede quiz, gedeeld door 2, en vervolgens afdrukken het uit als een int. Maar laten we nu de overgang naar een ander voorbeeld genoemd tekenreeks1, die schetst een soortgelijk beeld, maar met behulp van snaren. Laat me ga je gang en vereenvoudigen dit voor slechts een moment. En vergeef de inspringing voor nu. Merk op dat in lijn 19 van dit voorbeeld, krijg ik een string van de gebruiker. Maar let op wat ik daarna doe in lijnen 22 verder. Ik ben eigenlijk itereren van i tot en met - en dit is een nieuwe truc - strlen, tekstlengte. Dit is een functie die wordt geleverd met C dat als je langs het een string, het vertelt u hoeveel tekens zijn in die string. Dat is alles. Het feit dat het strlen in plaats van de string lengte is gewoon omdat het meer beknopt. 30 jaar geleden, mensen graag dingen op te schrijven zo kort en bondig mogelijk te maken. Dus we hebben gehouden dat verdrag hier. i + + betekent gewoon verhogen i in elke iteratie. En let nu op, en dat is echt interessant. Dus in lijn 24, zeg ik computer, geef me een teken, acht bits, en noem het c. Maar wat is dit op de rechterkant te zeggen? In het Engels, dat betekent wat voor? [Onverstaanbaar] DAVID J. MALAN: Precies. Geef mij het eerste teken in de array. Of meer in het algemeen, geef me de i-de karakter in de array. En nu besef dat het belangrijk is dat als informatici, we eigenlijk zijn tellen vanaf 0. Je hoeft nu niet de vrijheid hebben om te beginnen om dit te doen. Nu heb je te gedragen in overeenstemming met de verwachtingen van de computer en tellen van nul, omdat [0] zal als eerste teken in een tekenreeks. [1] gaat worden de tweede. [2] gaat de derde, enzovoort. Dus dit programma, als ik het compileren - dit is, nogmaals, tekenreeks1. Dus zorg tekenreeks1. En nu loop ik tekenreeks1 in mijn terminal-venster. Het wacht op input, dus ik ga in te typen, zeg, David. Enter. En nu wordt afgedrukt DAVID allemaal op verschillende lijnen, omdat let op wat ik doe. Ik ben het afdrukken van een karakter per keer. Nu zullen we niet in detail treden vandaag op deze. Maar ik verwijderde een moment geleden deze controle hier. Het blijkt dat als de gebruiker zich misdraagt, hoor en wederhoor, of gewoon verward, kun je eigenlijk niet aan een reeks van enige lengte te geven. Als je op de verkeerde toets op het toetsenbord, kunt u geven geen snaar helemaal. Of als je kwaadaardige, kunt u proberen te plakken in de moeite waard een gigabyte's van een essay naar deze string te vullen. En als de computer onvoldoende geheugen, blijkt dat we gaan terug te krijgen deze speciale waarde genaamd null. Dus voor nu, weet alleen dat er deze speciale waarde met de naam null, dat zal ons toelaten om na te gaan als we geen geheugen meer, onder andere dingen. Maar als ik open nu tekenreeks2, hier op te merken een verschil. Hier een opzegtermijn van een verschil met string2. Met tekenreeks2, dit for-lus is een beetje anders. Laat me verwijderen van de nullen, zodat we kunnen praten over die andere keer. Maar wat is er anders aan de for-lus deze keer? En ik kan terug te gaan naar het vorige voorbeeld. Dus dat is versie twee. Dit is versie een. Een, twee, een twee. Dus de strlen oproep is waar? Het is in het eerste deel van de lus. Elke gedachten over waarom ik dit doe? Ja. [Onverstaanbaar] DAVID J. MALAN: Dus we niet bellen met de functie iedere keer. Precies. Recall van voor loops dat ze super simpel als je eenmaal soort van begrijpen dat dit de initialisatie, de toestand en de update. Het probleem is dat de toestand gebeurt op elke iteratie van de lus. En dus in dit voorbeeld, wat slecht is over het feit dat dit mijn conditie? U belt strlen opnieuw en opnieuw en opnieuw. Maar zodra ik heb getypt in DAVID, de lengte van die string is vijf. En het is niet van plan om te veranderen op elke iteratie van de lus, omdat de koord nog D-A-V-I-D. Dus dit is een hint naar wat er gaat uitgegroeid tot een steeds belangrijker idee bekend als een ontwerpbeslissing, waar - gewoon niet maken van de computer te doen onnodig werk. Nu even een sneak preview van PSET 2, PSET 2 in de standaard editie is ga je uitdagen om daadwerkelijk uitvoering van een aantal aantal cijfers, sommige aantal encryptie-algoritmen, zodat u zowel kunt coderen en decoderen geheime boodschappen, net als degene die Ralphie daar gedecodeerd. In de hacker editie van PSET 2, we gaan een stukje verder te gaan. We gaan overhandigen u een bestand uit een werkelijke computer systeem dat een bevat hele hoop van gebruikersnamen en feitelijke gecodeerde wachtwoorden, en de uitdaging voor de hacker editie gaat worden om die wachtwoorden en figuur te kraken wat cryptografie of wat het geheim is om daadwerkelijk gebruikt genereren die wachtwoorden. En we gaan dit doen door gebruik te maken van een nieuwe feature hier van C die ik geef je gewoon een demo van, bekend als command-line argumenten. Zo blijkt, zoals sommigen van jullie misschien hebben gezien in paragraaf of in leerboeken, belangrijkste hoeft niet altijd nietig tussen haakjes zijn. Het blijkt dat de belangrijkste ook geschreven kan worden als deze, met twee argumenten, argc en argv, waar argc is het aantal woorden die u typt na van het programma de naam van uw opdrachtregel. En argv is de werkelijke woorden. En als de vierkante haken daar suggereren, argv is blijkbaar een array. Het gaat om een ​​string na een reeks na een reeks in het geheugen zijn. Dus wat we gaan om te kunnen doen, te beginnen met PSET 2, wordt iets als dit. Als ik argv1, dat is een voorbeeld dat we weer terug te komen op maandag, en voer het, merken dat het niet lijkt te nog iets doen. Hij drukt gewoon uit zijn eigen naam. Maar als ik afscheid klasse, merk op dat dit programma blijkbaar herhaalt over elk van de woorden die werden ingevoerd wordt bij het prompt. En de manier waarop we toegang tot woorden die de gebruiker te krijgen ingevoerd wordt bij het prompt is door het veranderen van de belangrijkste, te beginnen dit weekend, van int main (void) to main (argc, argv) int. En zo zullen geboren worden commandoregel argumenten. En als je eenmaal echt verfijnd op dit, zult u in staat zijn om te schrijven echt trippy programma's, zoals deze hier, die verder gaat boven en buiten deel van de functionaliteit die we tot nu toe gedaan, maar allemaal heel krachtig. Dus we laten dit met deze op het scherm. En we zullen zien je maandag.