[Powered by Google Translate] DAVID J. Malan: Okay. Det er CS50, og det er i slutningen af ​​uge to. Hvis du forventer at være sultne omkring dette tidspunkt i morgen, ved, at vi skal at indkalde som en lille gruppe i morgen, torsdag, 01:15. Der er denne URL her, hvis du gerne vil RSVP. Rummet er begrænset, så tilgiv, hvis formularen er fyldt op med den tid, du udfylde denne. En anden URL selvom det kunne være af interesse er dette. Så i næsten en måneds tid, er naturligvis vil blive stillet til rådighed desto mere bredt via EDX, via hvilken folk på internettet vil være i stand til at følge med, deltage i kurset ganske aktivt, i virkeligheden. De vil være ved hjælp af CS50 Appliance og CS50 Diskuter og de fleste af forskellige software-værktøjer, som vi allerede har brugt dette semester. Og en af ​​de initiativer, vi gerne vil tage på som et eksperiment i år er at se, hvor meget indhold, vi kan oversætte til andre talt og skriftsprog. Så hvis du kan have en interesse i at deltage i dette projekt, hvor vil vi give engelsk udskrifter og undertekster for kursets foredrag og shorts og seminarer og sektioner og lignende - hvis du taler flydende eller skrive flydende et andet sprog, ville vi elsker at engagere dig i dette projekt, hvor du tager på en eller flere af de videoer, omsætte dem til et sprog, du kender ganske godt. For at give dig en fornemmelse af grænsefladen, der er denne web-baserede brugergrænseflade at vi kommer til at bruge, som vil skabe væsentlige en UI som denne. Dette blev mig lære noget Halloween siden. Og på den højre side er der i sort siden af ​​disse tidsstempler, kan du se de forskellige ting, der kom ud af min mund den dag. Og så under det, vil du være i stand til at oversætte til et andet sprog. Præcis hvad den kortlægning er mellem, i dette tilfælde, engelsk og, siger, spansk. Så det er faktisk en meget brugervenligt værktøj. Du kan spole tilbage og hurtig fremad meget let med tastaturgenveje. Så hvis du gerne vil deltage i dette forsøg, og få dine ord set og læst af potentielt tusindvis af folk derude, behøver du velkommen gratis at deltage. Nu et ord om den killing fra mandag, så vi har sendt en alt skræmmende besked. Gør klar over, at som kontortid foreslå og som sektioner antyder, at design af kurset er meget at have de studerende at samarbejde og taler til arbejde gennem problematiske sæt og problemer sammen. Og virkelig linjen bare kommer ned til, igen, det arbejde, du i sidste ende skal indsende skal være din egen. Og så er det helt ærligt - i kontortiden, er det helt normal - Det er helt kunne forventes, selv - at chatte med nogle venner ved siden af ​​dig. Hvis han eller hun kæmper med nogle emne, og du er ligesom, oh, godt lade mig give dig et glimt af nogle linje kode, jeg skrev. Det er fint. Det sker. Og det er meget befordrende, tror jeg, med processen med læring. Hvor linien, igen bliver krydset er, når hovedet er slags vippes over her i alt for mange sekunder eller minutter for at virkelig at få netop været en Unblocking mulighed til din ven. Og helt sikkert, når tingene bliver udvekslet via e-mail og Dropbox og lignende, der også er linjen. Så med alle midler, føler sig trygge og føler sig tilskyndet til at chatte med venner og klassekammerater om psets og meget mere. Og bare indse, at hvad du i sidste ende indsende virkelig bør være produkt af din skabelse og ikke en anden. Så i samme ånd af nuttede skabninger, kan du kender denne fyr her. Så dette er en forfærdelig teatralsk film fra år siden. Nogen her set Spaceballs? Ok. Så et godt nummer her. Så det er vores vidunderligt akademisk måde at indføre i dag i sidste ende begrebet kryptografi. Og så en af ​​de domæne specifikke problemer for Pset 2, der vil komme ud sent i morgen aften, er at dykke ned i en verden af ​​kryptering, hvilket er kunsten at kryptere eller forvanske oplysninger. Og det i sidste ende drejer sig om verden i sikkerhed. Nu sikkerhed for de fleste os kommer i form af temmelig verdslige mekanismer. Vi har alle brugernavne og adgangskoder. Og alle af os har meget dårlige brugernavne og adgangskoder, mest sandsynlige. Hvis din adgangskode er den samme på flere websteder, det er nok ikke den bedste idé, som vi vil diskutere i retning semesters afslutning. Hvis din adgangskode er skrevet på en gul seddel - ingen joke - på din monitor, der også er ikke nødvendigvis det bedste design, men en ganske almindelig fænomen. Og hvis du ikke bruger kryptografi til at kryptere dine adgangskoder, er de særligt sårbare. Så hvis du tror, ​​du er super dygtig ved at have en skjult Word dokumentere et sted på din harddisk, der har alle dine passwords, men det er i en mappe, som ingen kommer til at se i, at også ikke er et meget sikker mekanisme. Og hvad så Pset 2 vil indføre, er denne kunst af kryptografi og scrambling oplysninger, således at ting som passwords er desto mere sikker. For at motivere denne meget virkelige verden problem med en meget ikke-real-verden scenarie, lad mig introducere dig til en af ​​vores foretrukne klip her fra dette film, Spaceballs. [VIDEO PLAYBACK] -Hjelm, du djævel, hvad sker der? Hvad laver du til min datter? -Lad mig introducere den strålende unge plastikkirurg, Dr. Philip Schlotkin, den største næse job mand i hele univers og Beverly Hills. -Deres Højhed. -Næse job? Jeg forstår det ikke. Hun har allerede haft en næse job. Det var en sød 16 til stede. -Nej, det er ikke hvad du tror. Det er meget, meget værre. Hvis du ikke giver mig den kombination til luft skjold, Dr. Schlotkin vil give din datter tilbage sit gamle næse. -Nej! Hvor fik du den? -Okay. Jeg vil fortælle. Jeg vil fortælle. -Nej, far, nej. Du må ikke. -Du er ret, min kære. Jeg kommer til at savne din nye næse. Men jeg vil ikke fortælle dem kombinationen uanset hvad. -Meget godt. Dr. Schlotkin, gør dit værste. -Min fornøjelse. -Nej! Vent, vent. Jeg vil fortælle. Jeg vil fortælle. -Jeg vidste, at det ville virke. Okay, giv den til mig. -Kombinationen er én. -One. -One. -Two. -Two. -Two. -Tre -Tre. -Tre. -Four. -Four. -Four. -Five -Five. -Five. -Så kombinationen er én, to, tre, fire, fem. Det er den dummeste kombination jeg nogensinde har hørt i mit liv. Det er den slags ting en idiot ville have på hans bagage. -Tak, Deres Højhed. -Hvad gjorde du? -Jeg slukkede væggen. -Nej, du gjorde ikke. Du slukket hele filmen. -Jeg må have trykket på den forkerte knap. -Nå, sætte den på igen. Sæt filmen igen. -Ja, sir. Ja, sir. -Lad os gå, Erna. Kom, Gretchen. Selvfølgelig du kender jeg stadig nødt til at fakturere dig for dette. -Jamen, virkede det? Hvor er porten? -Det virkede, sir. Vi har kombinationen. -Godt. Nu kan vi tage hver sidste pust af frisk luft fra planeten Druidia. Hvad er kombinationen? -En, to, tre, fire, fem. -En, to, tre, fire, fem? -Ja. -Det er forbløffende. Jeg har fået den samme kombination på min bagage. Forbered Spaceball 1 for øjeblikkelig afgang. -Ja, sir. -Og ændre kombinationen på min bagage. -Av! [END VIDEO PLAYBACK] DAVID J. Malan: An amazing film, du skulle nu alle se. Så sammenhæng her er, at med usikre data kommer en mulighed for at kryptere den, og scramble det. Og så dette for eksempel er et eksempel på en krypteret meddelelse. Dette faktisk siger noget på engelsk. Men det er tydeligvis ikke helt indlysende. Og vi kommer hele vejen rundt i dag for at drille hinanden, hvad denne hemmelighed budskab her er. Men i den virkelige verden af ​​computere, går tingene ikke engang ligne de måske være engelske sætninger. For eksempel er det, hvad du kan finde på en standard Linux eller Mac eller UNIX-computer i en fil, der var engang kaldet password-filen. I dag er det blevet flyttet til andre steder. Men hvis man ser på det rigtige sted på et system, vil du se ikke kun din brugernavn eller for andre mennesker på systemet, men du vil se et krypteret version af deres adgangskode. Faktisk ordet crypt der tyder på, at følgende ting er krypteret. Og denne serie af tilsyneladende tilfældige bogstaver og tegn og tal, og osv. kan dekrypteres kun ved generelt at kende nogle hemmelige - et hemmeligt ord, et hemmeligt nummer. Og så endda til kunsten at kryptografi sidste ende koges ned stole på nogle sortere og vide noget som en anden ikke gør. Vi vil udforske dette i en lidt mere detaljeret i dag og i Pset at komme. Og nu et ord om bestået / ikke bestået. Så specielt, har som nogle af jer dykket ned Pset 1, apparatet, og en meget ny verden for dig selv, indså, at frustrationer og forvirring og bare tekniske problemer kan forventes. Især med den første Pset, hvor der er bare så meget nyt, bare komme fortrolig med ls og cd og alle disse mystiske kommandoer i et nyt miljø. Og det er adskilt fra det faktiske materiale og programmering selv. Så indser også, at der er helt sikkert kontortid, der findes som støttestrukturen. Sektioner begynder den kommende søndag. Men vigtigst af alt, hvis du føler bare, at dette ikke er verden for dig, indse, at det virkelig bare tage tid. Og var det ikke for denne mulighed år siden for mig at tage en klasse bestået / ikke bestået, ærligt, jeg aldrig ville have endog sat foden i klasseværelset. Og du kan ændre dette indtil, siger, den femte mandag i kurset. Så hvis du er på kanten nu, indse, at i stedet for hovedet ind i en anden farvande helt, må du bestemt overveje bare skift til bestået / ikke bestået. Igen, der er ikke virkelig denne kultur her på Harvard for at tage tingene bestået / ikke bestået, da alle virkelig ønsker at opnå eller endnu bedre end. Men helt ærligt, det er en vidunderlig måde at forsøge noget ud, som måske ikke være velkendt for dig. Og du vil ende med at gøre i de fleste tilfælde ganske fine, måske meget til din overraskelse. Og endnu mere konkret, hvad jeg tror bestået / ikke bestået generelt gør, især som du måske har oplevet med Pset 0, hvis du har lagt i 10 timer, 15 timer, 25 timer i nogle Pset - og du bare banging dit hoved mod væggen, og det bliver super sent på aftenen, men du har taget Pset ligesom 90% af den måde, du ved, du kan bare ikke finde ud af én ting - bestået / ikke bestået virkelig tager brodden af ​​en klasse som denne, hvor du kan sortere af lykkeligt sige okay, jeg ved, det er ikke perfekt. Men jeg arbejdede min røv ud på denne. Jeg er temmelig tilfreds med, hvor det endte. Og det vil opfylde forventningerne til bestået / ikke bestået. Så du skal holde det i tankerne. Ok. Så dem af jer der har kæmpet for at bruge Harvard University Wi-Fi vide at der er en CS50 SSID, en Wi-Fi-forbindelse flyder rundt, at du måske have bedre held til. Det er lidt ironisk, at adgangskoden til dette - hvis du gerne vil prøve tilslutning til dette for bedre hastigheder og lad os vide, hvis det er ikke noget bedre - er en, to, tre, fire, fem, hele vejen op til otte fordi otte er mere sikker end fem. Så hvis du har brug for Wi-Fi-adgangskode, oprette forbindelse til CS50 trådløst her. En, to, tre, fire, fem, seks, syv, otte. Og post på CS50 Diskuter hvis du stadig har intermitterende forbindelsesproblemer, og vi vil lade de beføjelser, der skal vide for dette rum. Ok. Så en hurtig teaser, især for dem af jer der er fan drenge eller piger af alle ting Apple. Hvad jeg gravet op fra et par år tilbage var denne fil her, ilock.c, bare for at slags gøre mere konkret og mere kompleks nogle af de mere grundlæggende C programmer, vi har skrevet. Så jeg åbnede denne fil, ilock.c. Det er til rådighed på foredrag side for i dag. På venstre side kan du se en lang liste over funktioner. Så fyr, der skrev dette skrev en masse funktioner, mere end blot main. Han brugte en hel masse biblioteker her. Og hvis vi starter rulle gennem, hvad det egentlig er, er det meget Først tror jeg, knæk for den oprindelige iPhone. Når du ønskede at jailbreake den originale iPhone, hvilket betyder untether det fra AT & T og faktisk installere speciel software på den og gøre ting at Apple ikke vil have folk til at gøre - godt, nogen tog sig tid til at finde ud af præcis, hvordan de kunne udnytte software fejl, fejl, bugs, i Apples software. Og således blev født ilock.c. At hvis du har kompileret den på en computer og installeret det på en iPhone, der blev sluttet til din computer via fx en USB-kabel, ville det give dig administrative eller root-rettigheder på din iPhone og lade dig gøre temmelig meget hvad du vil. Og så der har været denne fascinerende kat og mus spil mellem Apple og resten af ​​verden, navnlig da de, ligesom mange virksomheder, så prøv at låse deres ting ned, så du kan kun gøre med det hvad de har til hensigt. Men takket være folk som dette og deres forståelse af lav-niveau detaljer og, i dette tilfælde, programmering C og en masse af de velkendte konstruktioner at vi er begyndt at spille med, er du i stand til virkelig udnytter hardware på en måde, du kan se passer og ikke nødvendigvis nogle virksomhedsenhed. Så for eksempel, har jeg ingen idé om, hvad alt dette gør. Men GetVersion lyder temmelig ligetil. Og det ser ud til det er en funktion, som denne person skrev. Tag en slags heltal som argument, ikke vender tilbage noget, men ser ud til at sløjfe med en for-løkke her, og en hvis betingelse, hvis betingelse, bryde, og på en måde relaterer til versionsnumre. Hvis vi rulle ned - selv om en masse af disse søgeord der vil være nye, og der er en hel masse funktioner i her vi har aldrig set og måske ikke altid se over løbet af semesteret - ved slutningen af ​​dagen, følger det af de samme regler og logik, at vi har været leger med hidtil. Så dette er alt for gammel til at knække din iPhone 3s eller 4s eller snart 5s, i disse dage, men ved, at det hele er meget afledt af denne verden, at vi har dykket ned. Så lad os tage et kig på en lidt mere simpelt eksempel. Denne ene, bare for at få varmes op med nogle syntaks og også nogle andre data type, som vi har talt om, men har ikke rigtig set i C. Så det er en fil kaldet positive1.c. Og pr bemærkningerne øverst, det bare kræver, at en bruger giver en positivt tal. Så det er et eksempel på en gør-while-løkke, hvilket er rart for bruger-interactive programmer, hvor du har brug for at fortælle brugeren at gøre noget. Og hvis de ikke samarbejder, du råber ad dem eller afvise deres input. Sag i punkt, jeg kommer til at gøre linjer 19 gennem 24, så længe brugeren har ikke givet mig et positivt tal. Nu er denne detalje her på linie 18, hvorfor jeg erklærer n over hele denne looping konstrukt i modsætning til lige ved siden af ​​linie 22, hvor jeg faktisk pleje at få n? Ja? [Uhørlig] DAVID J. Malan: Yeah, så spørgsmålet om anvendelsesområde. Og i lægmands sigt Hvilke muligheder henvise til? Ja? [Uhørlig] DAVID J. Malan: Kan du tale lidt højere? SPEAKER 1: Hvor du kan få adgang til en bestemt variabel. DAVID J. Malan: Perfect. Hvor du kan få adgang til en bestemt variabel. Og generelt, den tommelfingerregel hidtil har været, at rækkevidden af ​​visse variabel er defineret af de seneste krøllede parenteser, som du har set. Og så i dette tilfælde, hvis jeg gjorde fejlen at erklære n on line 22, denne linje ville arbejde. Jeg ville få en int, og jeg ville sætte det ind i den variable n i linie 22. Men hvilken linje kode vil nu have nogen idé om, hvad jeg taler om? Så 25, og det viser sig 24, så godt, fordi i dette tilfælde, det falder udenfor af tuborg-klammerne. Så bare en lille smule af et irritationsmoment, men meget let løses ved blot at erklære den variable uden for funktionen selv. Nu må vi se senere i dag, kan du gå et skridt videre. Og du kan endda få lidt doven - og det er ikke at blive anbefalet, i almindelighed - men du kan endda få doven og sætte en variabel globalt, så at sige, ikke indersiden af ​​en funktion, der ikke inde i en sløjfe, men i selve filen, uden af alle de funktioner, du har skrevet, som jeg gjorde her på linie 15. Men det er generelt ildeset. Men indse dette er en løsning til tider til andre problemer, som vi vil sidste ende se. Så for nu vil vi overlade det sådan her. Men lad os se om vi kan omskrive dette bare for at begynde at udtrykke os selv et lidt anderledes. Så dette program, bare for at være klar, er positive1. Lad mig gå videre her og i min terminalvindue gøre positive1, Enter. Kompilerer, okay. Jeg har tænkt mig at køre positive1, trykke Enter. Jeg forlanger, at du giver mig et positivt heltal. Jeg vil sige -1. Det virkede ikke. 0, 99, der synes at arbejde. Måske ikke den mest strenge test. Men i det mindste er det en nice tilregnelighed kontrollere, at vi er på rette spor. Så nu lad mig gå videre og åbne version to af dette. Og hvad er anderledes allerede? Det gennemfører det samme. Men hvad der springer ud som klart anderledes denne gang? Ja, så denne bool i grønt. Gedit har fremhævet i grøn dette søgeord er kendt som bool, hvilket er en datatype. Det kommer ikke indbygget i alle versioner af C. Du er nødt til at indeholde en specifikke bibliotek. I vores tilfælde medtaget jeg CS50 biblioteket, så vi har adgang til bool. Men i linie 18, synes vi at have en boolesk værdi her kaldet taknemmelige. Så jeg kunne have kaldt det noget. Men jeg kaldte det taknemmelig bare at slags formidle nogle semantiske betydning. Så i første omgang på linie 18, jeg er åbenbart ikke taknemmelig, fordi Boolesk værdi taknemmelig er initialiseret til false på linje 18. Og så synes hvad jeg har gjort her i linjerne 21 til 23 er jeg lige har slags omskrevet min logik. Så ingen funktionelt anderledes. Men i linie 22 nu, jeg kontrollere, om int brugeren har givet, er større end 0, så jeg simpelthen ændre værdien af ​​taknemmelige for sand. Og hvorfor gør jeg det? Fordi der i linje 25, tilsyneladende, jeg skal tjekke en betingelse. Gør denne løkke, mens taknemmelig er falsk. Så jeg foreslår dette som et alternativ til version en, fordi det er mindst en lidt mere intuitiv, måske. Det er lidt mere jordforbindelse på engelsk. Så skal du gøre følgende, mens du ikke er taknemmelig eller mens taknemmelig er falsk. Og denne gang også, jeg åbenbart er ligeglad med at huske, hvad brugeren har indtastet i, fordi bekendtgørelsen er der ingen variable n.. Så faktisk, jeg - en lille hvid løgn der. Funktionelt, at programmet er en smule anderledes, når vi kommer til bunds i det, fordi jeg ikke huske, hvad n er. Men jeg ønskede at vise, også her, at selvom vi har set GetInt og GetString anvendes på højre side af et lighedstegn hidtil, således at vi husker den værdi, teknisk, det er ikke strengt nødvendigt. Hvis du af en eller anden grund, du bare ligeglad for at gemme værdien, du bare vil at kontrollere værdien, bemærke, at vi bare kan skrive dette som GetInt åben paren tæt parentes. Denne funktion vil returnere en værdi, som vi har sagt. Det kommer til at give dig tilbage en int. Og så hvis du mentalt tænker på at dette sker, når jeg skriver i 99, GetInt returnerer tallet 99. Og så begrebsmæssigt, det er som om min kode var faktisk dette. Så hvis 99 faktisk er større end 0, så taknemmelige bliver sand. Så linje 25 indser ooh, vi gjort, fordi jeg nu taknemmelig. Og i linje 26, vi simpelthen sige, tak for den positive heltal, hvad det tilfældigvis. Nu lad os gøre lidt syntaktisk sukker her, så at sige. Lad os se om vi kan rydde op i denne linje 25 med denne tredje og sidste varians i positive3. Så mærke den eneste forskel nu er, hvad linje kode? Yeah, så 25. Og vi har ikke rigtig set dette trick endnu. Men vi kunne se det udråbstegn på mandag, som angiver hvad? Så ikke, eller negation. Så tag en boolesk værdi og vende sin værdi. Sand bliver falsk. False bliver sand. Så det, jeg ville foreslå, er endda lidt mere intuitiv af en måde at skrive kode, fordi jeg stadig initialisere taknemmelig for falsk. Jeg stadig gøre følgende. Jeg satte taknemmelig for sand, når den tid kommer. Men nu kan du virkelig bare oversætte denne kode verbalt venstre mod højre, mens ikke taknemmelige. Fordi bang, eller udråbstegn, betegner begrebet ikke, så mens ikke taknemmelige. Så igen har vi ikke har indført nye koncepter i sig selv. Vi har talt om Booleans tilbage, når vi spillede med Scratch. Men indser nu kan vi bare begynde at skrive vores kode i mange forskellige måder. Så specielt i pset1, hvis du er slags kæmper for at finde ud af vejen til skrive nogle program, er du heldig odds, fordi der vil være nogen antal løsninger, som du kan ske på. For eksempel er det kun tre for selv den simpleste af programmer. Ok. Og nu husker på mandag, vi efterlod på denne note med returværdier. Så for første gang, skrev vi et program, som ikke bare har main, det har også sin egen brugerdefinerede funktion, som jeg skrev her. Så i linje 31 til 34, har jeg implementeret en terning funktion. Det er ikke kompliceret. Det er bare en gange en gange en, i dette tilfælde. Men hvad der er vigtigt om det er, at jeg tager input i form af en og Jeg vender tilbage output i form af en gange en gange en. Så nu har jeg mulighed for, ligesom jeg vant til med printf alene, at kalde denne funktion ved at kalde terningen funktionen. Og terningen funktion har nogle input. Og terningen returnerer funktionen nogle output. Og så derimod printf bare gjorde noget. Den vendte ikke tilbage noget, som vi holdt af - selvom, som en til side, det gør returnere en værdi. Du skal bare generelt ignorere det. Printf bare gjorde noget. Det havde en bivirkning af udskrivning til skærmen. Derimod her har vi terningen funktion, som faktisk returnerer noget. Så dette er generelt - For dem bekendt med dette, er det en forholdsvis simpel idé. Men for dem mindre fortrolige med denne idé om at passere i inputs og få tilbage udgange, lad os prøve bare noget super simpelt. Er der nogen behagelig kommer op på scenen kortvarigt? Du skal være fortrolig med et kamera på dig, så godt. Yeah. Okay, hvad er dit navn? KEN: Ken. DAVID J. Malan: Ken. Okay, Ken. Kom nu op. Så Ken kommer til at være en funktion af sorterer her. Og lad os gå videre og gøre det. Lad os få lidt fancy. Hyggeligt at møde dig. Velkommen til centrum. Ok. Lad os slå denne knap her. Ok. Så her har du en moderne tavle. Og hvad jeg er, er den vigtigste funktion, for eksempel. Og jeg har ikke en iPad i hånden. Jeg kan ikke rigtig huske, hvordan man - ja, faktisk kan ikke sige. Jeg har ikke rigtig god håndskrift. Og så derfor vil jeg have dig til at udskrive noget på skærmen for mig. Så jeg er det vigtigste program. Og jeg vil have du siger dette ved at skrive det i min kylling scratch og derefter passerer dig en indgang. Så som fjollet men denne øvelse er, begrebet funktioner og kalde en funktion og returnerer en funktion virkelig kan koges ned til denne. Jeg er main. Jeg har netop skrevet printf ("noget") på skærmen. Jeg kører dette program. Og så snart printf bliver kaldt, det tager ét argument - eller en parameter, undertiden - mellem anførselstegn. Her er det argument. Jeg passerer det til Ken. Nu er han en sort boks skrevet nogle flere år siden, at der tilsyneladende kun ved, hvordan man udskriver ting på skærmen. Så udføre. Det er ikke dårligt. Så meget god. Så nu Ken sker fuldbyrdende. Har han brug for at give mig noget tilbage? Så ikke, at vi har set hidtil. Heller ikke printf faktisk returnerer et tal. Men vi vil ignorere, at for nu, fordi vi aldrig har brugt det. Så det er det for Ken. Og så nu main kommer tilbage til at udføre - main overtager kontrol af programmet igen, fordi denne linje kode, printf, sker fuldbyrdende. Og vi går om vores måde fuldbyrdende uanset hvilke andre linjer er der. Ok. Så lad os nu prøve en lidt anderledes eksempel. Og denne gang her, lad os først rydde skærmen her. Og denne gang vil vi gøre det Cubing funktion. Men denne gang, jeg forventer et output værdi. Så lad os gå videre og gøre det. Så nu har jeg en linje kode, der siger x = cube (x). Så faktisk let's - den linje kode, tilbagekaldelse, ser sådan her ud. x = cube (x). Så hvordan vil dette arbejde? Så lad os gå videre og give dig en hvid skærm igen. Og jeg vil skrive nu ned værdien af ​​x, der på dette tidspunkt i tid sker for at være, lad os sige, 2, for at holde det enkelt. Så jeg har skrevet ned på et stykke papir værdien af ​​2, som er min værdi x. Jeg afleverer det til Ken. KEN: Og jeg bare skrive svaret? DAVID J. Malan: Ja, lad os bare skrive svaret. Okay. Og nu skal han returnere mig noget. Så - perfect. Rart Segue. Så nu han rækker mig tilbage værdi på 8, i dette tilfælde. Og hvad skal jeg gøre med det? Tja, faktisk, lad os se. Få denne ret. Hvad skal jeg gøre med det? Nu jeg har tænkt mig at tage denne værdi og faktisk gemme det i de samme bit i hukommelsen. Men læg mærke til, jeg er lidt kæmper her. Jeg er lidt forvirret, fordi hvor skal jeg faktisk skrive værdien af ​​x? For hvad jeg lige har gjort er fysisk hånd Ken et stykke papir der havde værdien 2, som var x. Og ja, det er netop, hvad der sker. Så det viser sig, at når du kalder en funktion, og du passerer på et argument gerne "hej verden", eller du passere i et argument som 2, generelt, er du passerer i en kopi af dette argument. Og så lige som jeg skrev ned tallet 2 her og rakte det til Ken, det skal betyder, at jeg stadig har en kopi af værdien 2 eller andet sted. Fordi ja, nu hvor jeg har fået tilbage værdien 8, jeg er nødt til at gå tilbage i RAM og faktisk skrive ned 8 hvor jeg engang havde et 2-tal. Så visuelt huske denne forestilling om at passere i bogstaveligste forstand en kopi af værdien. Ken gør hans ting, rækker mig tilbage noget - i dette tilfælde, en værdi som 8. Og så er jeg nødt til at gøre noget med denne værdi, hvis jeg ønsker at holde den rundt. Så alt dette vil være alt for velkendte inden længe. Tak så meget for denne demo her, Ken. Ok. Meget godt klaret. Så lad os se, hvordan det i sidste ende relaterer til nogle af funktion ringer, at vi har gjort her. Så lad mig gå videre og bringe os tilbage til Cubing eksempel her. Og bemærke, at hvis vi ønsker at rent faktisk begynder at tage dette yderligere, vil vi at være opmærksomme på, at antallet x, der bliver vedtaget i her er forskelligt fra det, der rent faktisk ledes ind i funktionen. Så igen, dette forbi eksemplar kommer til at blive helt germane på bare et øjeblik. Så lad os tage et kig på noget, der ikke helt virker rigtigt endnu. Jeg har tænkt mig at gå videre og åbne en tredje buggy eksempel, som er behæftet med naturen. Og det hedder buggy3, og det gennemfører en swapping-funktion. Så her har vi en hovedfunktion, der har x og y vilkårligt initialiseres til 1 og 2, henholdsvis. Vi kunne bruge GetInt, men vi skal bare have en simpel øvelse. Så det er hard-coded som 1 og 2. I linierne 21 og 22, tilsyneladende vi udskrive x og y, én pr linje. Så på linie 23, hævder jeg, jeg swapping disse værdier, prik, prik, prik. Jeg åbenbart kalder en funktion i linje 24 kaldes swap der tager to argumenter. Det er helt legit for funktioner til at tage to argumenter. Vi har set printf gøre det allerede. Så swap tilsyneladende tager x og y. Og som navnet antyder, vil jeg håbe, at det kommer til at bytte disse to værdier. Så da jeg hævder på linie 25, byttes. Og gengiver x og y den antagelse, at de har faktisk blevet byttet. Men hvis jeg rent faktisk køre dette program - lad mig åbne et terminalvindue. Lad mig gøre buggy3. Som navnet antyder, er dette ikke kommer til at ende godt. Fordi når jeg trykker på Enter, bemærke, at x er 1. y er 2. Og dog ved afslutningen af ​​programmet, er de stadig i virkeligheden det samme. Så baseret på påvisning lige nu med Ken, hvad der faktisk foregår? Nå, lad os dykke ned i denne swap-funktion. Det er super kort. Det er kun et par linjer kode lang. Men hvad er det grundlæggende problem er baseret på den enkle historie fortalt herop med Ken? Hvorfor er swap brudt? [Uhørlig] Præcis. Så vi er lagring til en kopi, ikke variablen selv. Med andre ord tilsyneladende swap tager to argumenter, en int. Og det er vilkårligt kaldes a og b. Og heroppe, har jeg passeret i x og y, som er henholdsvis 1 og 2. Men jeg er ikke bogstaveligt passerer i x. Jeg er ikke bogstaveligt passerer i y. Jeg passerer en kopi af x og en kopi af y. Det er ligesom næsten som om du har kopieret og indsat i bytte de værdier, du ønsker det faktisk manipulere. Så hvis det er tilfældet, da jeg, det program, start fuldbyrdende linie 35, derefter 36 - når jeg kommer til linie 37, på dette tidspunkt i historien, hvad er værdien af ​​et? På dette tidspunkt i historien, linie 37, hvad er værdien af ​​et på dette punkt? Så det skal bare være 1. Right? Fordi x blev vedtaget i som første argument. Og denne funktion bare vilkårligt kalder sin første argument, en. Tilsvarende er y, det andet argument. Og det er bare vilkårligt at kalde det andet argument b.. Nu er denne dikotomi er faktisk temmelig simpelt forklaret. Tænk over det. Ingen af ​​os har mødt den person, der skrev printf. Så sikkert, han eller hun har ingen idé om, hvad vores variable 30 år senere går at blive kaldt. Så der skal være en sondring mellem, hvad du kalder variabler i funktioner, du skriver, og hvad du kalder variable i funktioner, du er kalder op eller bruger. Så med andre ord, har jeg skrevet mine variabler som x og y. Men hvis en anden havde skrevet swap-funktion, han eller hun helt sikkert ville ikke vide hvad mine variabler vil blive kaldt. Så indse, at det er derfor, du har denne dobbelthed af navne. Teknisk set kan jeg gøre dette ved en tilfældighed. Men de vil stadig blive væltet ind som kopier. Det ville bare være en ren tilfældighed æstetisk hvis den person, som skrev swap havde brugt de samme navne. Ok. Så på dette punkt i historien, linje 37, en er 1. b er 2. Og nu vil jeg gå videre til at bytte dem. Jamen først og fremmest, lad mig faktisk gøre dette meget mere simpelt. Jeg ved ikke, hvad disse tre linjer kode lavede. Lad mig bare gøre det. b får. a får b. Udført. Hvorfor er denne brudt, logisk? Det er lidt af den intuitive ting, right? Så en bliver til b.. Og B bliver en. Men problemet er, at så snart linien 37 udfører, hvad er det Værdien af ​​a og b? Det samme, 1. Fordi du har clobbered, så at sige, har du ændret b svare til et. Så når linje 37 er udført, det er fantastisk. Du har nu to kopier af nummer 1 indersiden af ​​denne funktion. Så når du siger på linje 38, en får b, godt, du slags skruet. Fordi du bare tildele 1 til 1. Du har lidt tabt den værdi, du plejet om. Så i den oprindelige version af dette, mærke til, hvad jeg gjorde. Jeg stedet havde en tredje linje kode, der lignede dette. Jeg erklærer en midlertidig variabel - TMP er et meget almindeligt navn for en midlertidig variabel. Det er en int fordi den skal matche, hvad jeg ønsker at lave en kopi af. Jeg gemmer en kopi af en inderside tmp. Så når linje 37 er udført, værdien af ​​a er - hurtig tilregnelighed check - 1. Værdien af ​​b er 2. Og værdien af ​​TMP er også 1. Så nu jeg udfører linje 38. Så når linje 38 udfører, en antager værdien af ​​b. Og b var 2. Så a er nu 2. Så på dette punkt i historien, en er 2, b er 2, og tmp er 1. Så nu logisk, kan vi bare plop tmp værdi i b.. Og vi er færdige. Så vi har løst dette problem. Desværre, når jeg kører dette program i denne form, betyder det faktisk ikke bytte nogen værdier. Men for at være klar, hvorfor? Jeg fast den logiske problem fra blot et øjeblik siden. Men igen, hvis jeg køre dette program, x og y er uændret ved udgangen af programmets gennemførelse. [Uhørlig] DAVID J. Malan: Så vi har ikke returneret noget. Så det er sandt. Men det viser sig, at der er lidt af et problem her, fordi hidtil, den eneste, vi har været i stand til at vende tilbage, er én ting. Og det er en begrænsning af C. Du kan kun returnere virkelig en værdi, i hvilket tilfælde, jeg slags fast her fordi jeg kunne returnere den nye værdi af x eller jeg kunne returnere ny værdi af y. Men jeg vil begge tilbage. Så tilbage er ikke den enkle løsning her. Men problemet fundamentalt er hvorfor? Hvad har vi egentlig byttes? a og b. Men a og b er kopier af x og y, hvilket betyder, at vi bare gjorde alt dette arbejde - vi lige brugt som tre minutter taler om swap funktion og alle disse tre variabler. Og det er fantastisk, helt korrekt i isolation. Men a og b anvendelsesområde kun er i disse linjer her. Så ligesom en for-løkke, hvis du erklærer et heltal i inde i for loop - på samme måde, hvis du erklære a og b inde i en funktion, du har skrevet, de er kun gyldige indersiden af ​​denne funktion. Hvilket betyder så snart swap sker fuldbyrdende og vi går fra linie 24 til linie 25, x og y er ikke ændret overhovedet. Du har lige spildt en hel masse tid bytte kopier af variabler. Så viser det sig, at løsningen på dette faktisk ikke indlysende. Det er ikke helt nok til at returnere værdier, fordi vi kan kun returnere én værdi. Og jeg virkelig ønsker at bytte både x og y på samme tid. Så vi vil vende tilbage til dette. Men for nu, indser, at det basalt set stammer fra det faktum at a og b er kopier. Og de er i deres egen rækkevidde. Nå, lad os prøve at løse dette på en eller anden måde. Lad mig faktisk rulle tilbage her og åbne op, lad os sige, en fjerde variant heraf. buggy4 Og hvad med denne? Dette er en lignende, men enklere problem at se på, før vi tager et stik på løse den. Dette program kaldes tilvækst. Og det tilsyneladende initialiserer en x heltal til 1 på linje 18. Jeg så hævder x er 1. Jeg så hævder forøgelse, prik, prik, prik. Jeg så ring tilvækst. Men så i linjerne 22 og 23, jeg hævder, at det er blevet forøget. Jeg hævder x er nu, hvad det er, 2 formentlig. Men dette program er buggy. Hvad er problemet? Ja? [Uhørlig] DAVID J. Malan: Præcis. Så x er blevet erklæret naturligvis på linje 18. Det er inde i de vigtigste s krøllede parenteser. Så det enkle svar her er, at, ja, x eksisterer her. Det findes ikke på linje 32. Så dette program rent faktisk vil ikke engang kompilere. Den compiler, når jeg prøve at oversætte denne kode, vil yell på mig om nogle kaldenavn eller noget i den retning. Faktisk, lad os prøve. Det er at gøre buggy4. Der er det. Anvendelse af sort identifikator x på linje 32. Og faktisk, lad os være mere eksplicit her i dag, så det er nyttigt i kontortid og hjemme. Bemærk, at det er lidt kryptisk skrevet. Men det faktum, at Dunk har råbte på os, siger buggy4.c: 32:5, er faktisk nyttigt. Det betyder, at fejlen er på linje 32 ved tegnposition fem. Så en, to, tre, fire, fem. Det er i virkeligheden, når problemet er. Og også at huske på kontortiden og derhjemme, jeg er heldig her. Jeg har en fejl. Det kommer til at være relativt let at rette. Men hvis du får en hel skærm fuld af overvældende fejlmeddelelser, igen, indse, at den nederste man bare kunne være symptomatisk for de øverste dem. Så altid jage ned dine fejl ovenfra og ned. Fordi der bare kunne være en daisy-chain effekt, der tyder på dig har måde flere problemer, end du rent faktisk gør. Så hvordan kan vi løse dette, hvis mit mål er at forøge x? Hvad er det? Okay. Så vi kan gøre x global. Lad os tage den genvej, jeg advarede om tidligere. Men heck, vi bare brug for et hurtigt fix. Så lad os bare sige int x heroppe. Det gør x global. Så nu main har adgang til det. Og tilvækst har adgang til det. Og så lad mig gå videre og kompilere dette nu. Gør buggy4, Enter. Synes at kompilere nu. Lad os løbe buggy4, og det ser ud til rent faktisk at arbejde. Nu dette er en af ​​disse ting - gør som jeg siger, ikke som jeg gør, som jeg netop har gjort her. Fordi der i almindelighed, vil vore programmer vil få meget mere interessant og meget længere end dette. Og hvis din løsning på livets problemer er bare ah, sætte alle variabler i toppen af ​​din fil, meget hurtigt gøre programmer får forfærdelig vanskelige at håndtere. Det bliver sværere at udtænke nye variabelnavne. Det bliver sværere at forstå, hvad variabel der gør hvad. Og så generelt, er det ikke en god løsning. Så lad os gøre det bedre. Vi ønsker ikke at bruge en global variabel her. Jeg ønsker at forøge x. Så jeg kunne selvfølgelig - ved slutningen af ​​dagen, er det sådan en fjollet historie, fordi vi bare gøre det. Men hvis jeg ikke vidste om, at operatør, eller jeg fik ikke lov til ændre det i main selv, hvordan kunne jeg ellers gennemfører Ken herovre, dette tid ikke terning, men at inkrementere? Hvordan ændrer jeg denne ting her? Yeah. [Uhørlig] DAVID J. Malan: Okay, godt. Så hvorfor ikke jeg passere i x? Og så i stedet returnere det, hvorfor kan jeg ikke bare gøre gengæld x + 1? Nu, et par flere ting nødt til at ændre her. Jeg er på rette spor. Hvad skal jeg ellers nødt til at trimme? En anden. Ja? [Uhørlig] DAVID J. Malan: Jeg er nødt til at ændre returtypen af ​​tilvækst fordi det ikke er ugyldig. Void betyder intet der bliver returneret. Men det er klart, nu er det. Så dette forhold skal ændres til int at være i overensstemmelse med, hvad Jeg er faktisk vender tilbage. Nu noget andet, er stadig buggy her. Ja? [Uhørlig] DAVID J. Malan: Så jeg har brug for at forøge x? [Uhørlig] DAVID J. Malan: Ah, så jeg er nødt til at passere x. Så jeg er nødt til at gøre det her. Så prototypen, er jeg nødt til ændre dette op her. Så det skal være en int. Dette skal blive - hmm. Jeg har faktisk en fejl hernede. Lad os løse dette ene først. Hvad skal det egentlig være? Så det er nødt til at være en int noget. Det kunne være x. Men helt ærligt, hvis du begynder at kalde alle dine variabler x, det vil få mindre og mindre tydelig der er hvad. Så lad os bare vilkårligt vælge en anden navngivningskonvention for min hjælpefunktioner, de funktioner jeg skriver. Vi kalder det en. Eller vi kunne kalde det - lad os kalde det even_number at være endnu mere eksplicit. Så da jeg er nødt til at vende tilbage uanset antallet er plus 1. Og nu jeg er nødt til at ændre en anden ting op her og en andre ting heroppe. Hvad skal jeg ændre på linie 21 først? Jeg er nødt til at tildele den til x. Så jeg kan ikke bare ringe tilvækst x. Jeg har brug for at huske svaret ved at ændre værdien af ​​x på venstre side. Og selv om x er nu på venstre og højre, det er helt fint, fordi højre side bliver udført først derefter bliver plopped i den venstre hånd ting, x i dette tilfælde. Og så endelig, det er en nem løsning nu. Det skal bare matche, hvad der er dernede. Int tal. Ok. Så en hel masse ændringer for en virkelig dum funktion. Men repræsentant for ting, som vi i stigende grad vil få lyst til at gøre. Så gør buggy4. Jeg har skruet op et eller andet sted. Åh min Gud. Fem fejl i, ligesom, en seks-line program. Så hvad er der galt på linie 18, 5 tegn? Ok. Så jeg er nødt til at erklære denne int. Ok. Så lad os se, en hel bunke af andre fejl. Oh my god. 19, 18, 21. Men igen, lad os bare rydde skærmen - Kontrol L her - og re-run Dunk. Så fem problemer er faktisk bare, at én. Så lad os nu køre buggy4, Enter. Puha. x er blevet inkrementeret korrekt. Ok. Eventuelle spørgsmål om, hvordan man inkrementere numre? Ja? SPEAKER 2: Hvorfor er det, at du bare kan ændre x til nummer i den variable navngive og det vil vide, hvad du mener? DAVID J. Malan: Godt spørgsmål. Hvordan er det at jeg bare kan ændre x til nummer og programmet vil vide straks? Så igen, tænk på det som denne abstraktion. Så hvis jeg er hoved-og Ken er trinvis, helt ærligt, jeg er ligeglad hvad Ken kalder sin iPad. Jeg er ligeglad med, hvad han kalder noget, der har at gøre med hans gennemførelsen af denne funktion. Så dette er en implementering detalje, at jeg, main, ikke gøre nødt til at bekymre sig om. Og så blot at ændre det konsekvent inde i funktionen, nummer her og nummer her, er alt det tager så længe jeg kompilere. Det er lidt ligesom hvis du tænker over - mange af os, dem af jer med førerens licenser, der har kørt, eller hvis du selv har kørt i en bil - de fleste af os har ingen idé om, hvordan en bil fungerer under motorhjelmen. Og bogstaveligt, hvis du åbner op hætten, de fleste af os - inklusive mig selv - vil ikke rigtig ved, hvad vi ser på. Lidt ligesom du måske føle med ting som dette lige nu. Men vi behøver ikke virkelig nødt til at bekymre sig, hvordan bilen fungerer. Vi behøver ikke at bekymre sig, hvad alle stængerne og stemplerne og kabler inde i bilen rent faktisk gør. Så noget lignende hvad du kalder stemplet er ligegyldigt her i dette tilfælde. Samme idé. Ja? [Uhørlig] DAVID J. Malan: Hvis der var flere anvendelser af den variable xa øjeblik siden, dig, programmør, skulle ændre dem overalt. Eller du kunne bogstaveligt talt gøre Filer, Menu, og derefter Find / Erstat, noget lignende. Men du er nødt til at foretage disse ændringer selv. Du er nødt til at være konsekvente. [Uhørlig] DAVID J. Malan: En særlig rækkefølge som her? Hvis dette var int andet nummer? Yeah. Så rækkefølge betyder noget, når du kalder funktionen. Så hvis jeg kaldte tilvækst her med noget komma noget, der er en direkte kortlægning. Den første variabel, hvad det nu hedder, er lavet en kopi af den første argument herovre. Beklager, bør dette ikke være en parentes. Det andet argument linjer op med den anden. Så orden, ja, spørgsmål. Ok. Undskyld jeg tog en lang måde at komme dertil. Andre spørgsmål? Ok. Så lad os se om vi ikke kan male et billede af, hvad der rent faktisk sker her under hætten, så at sige. Så dette er et rektangel, der kan repræsentere computerens hukommelse. Så selvom du ikke har nogen idé om, hvordan hukommelsen virker, eller hvordan RAM værker, i det mindste antage, at du har klaser af det i disse dage. Du har megabyte det. Du har gigabytes af det. Og vi ved fra uge nul, at en byte er bare hvad? 8 bit. Højre, så 8 nuller og ettaller. Så hvis din computer har en koncert RAM, to gigabyte RAM i disse dage, har du en milliard eller 2 milliarder byte hukommelse, eller omkring 8 milliarder eller 16 milliarder bits, indersiden af ​​din computer. Nu i modsætning til den lille Woolly Willy eksempel er det ikke magnetiske partikler typisk længere. Stigende grad i bærbare computere i det mindste, er det solid state-drev, SSD'er, at netop har ingen bevægelige dele. Det hele er elektronisk. Det er alle baseret elektricitet. Så mener dog, af dette rektangel som blot repræsenterer en eller to gigabyte hukommelse, du har. Så det er en luns af hukommelse. Nu verden datalogi har slags partitioneret off bidder af hukommelse til at gøre forskellige ting. Altså for eksempel, hvis dette er computerens RAM - som foreslået af rektangel der - viser sig, at ved konvention, i toppen af ​​din RAM, så at tale, er generelt hvad der kaldes en tekst segment. Det er de nuller og ettaller, som du har kompileret. Så når vi har kigget under hætten på, hvad a.out er, alle de nuller og ettaller - når du kører et program, er disse nuller og ettaller indlæst fra harddisken drev i noget, der hedder RAM. Og i RAM, de er sat øverst. Nu i mellemtiden, har du andre ting. Klargjorte data, uden startværdi data. Disse to skår hukommelse refererer til globale variabler, som du ikke bruger ofte. Men nogle gange, hvis du gør det, de ender op der. Så er der nogle andre ting. Miljøvariabler, som vi ikke vil bruge meget tid på. Men så to vigtige ting, der vil komme tilbage i hele denne semester, stakken og bunke. Så de fleste af computerens hukommelse er reserveret, når du kører et program for noget, der hedder stakken og noget, der hedder den bunke. Og vi vil ikke tale om den bunke i dag, men vi vil taler om stakken. Og stakken er beregnet til at fremmane det visuelle ligesom den spisesal måltid bakker i Mather House, eller hvor du tilfældigvis, hvor spisesal personale rense dem hver dag. De stak dem op fra gulvet på op. Og på samme måde i hukommelsen, er der denne tanken om at sætte noget på en stable, sætte noget på en stak, sætte noget på en stak. Og hvad mener vi med det? Nå, lad os zoome ind på netop den nederste halvdel af dette billede, computerens RAM, at foreslå følgende. Det viser sig, at når du kører et program som a.out eller hej, uanset programmet er, at du har skrevet, igen, er disse nuller og ettaller indlæst fra din harddisk - som er langtidsopbevaring, forbliver der, selv når du trække i stikket - indlæst i RAM. RAM er hurtigere end harddiske. Det er mindre end harddiske. Men det er, hvor programmer leve mens du kører dem. Så du dobbeltklikke på et program på en Mac eller en PC - det er indlæst fra harddisk i RAM. Så snart den er indlæst i RAM, de nuller og ettaller gå på den måde toppen, såkaldte tekstsegment. Men så så snart dit program faktisk begynder at løbe, det vigtigste funktion kaldes. Og vigtigste, som vi har set, har ofte lokale variabler. Og det har int'er og strygere og specialtegn og lignende. Så hvis dit program, som du har skrevet, eller det program, du har dobbeltklikket brugt nogle variabler inde i main, de ender på bunden af ​​din stak af hukommelse, så at sige. Nu mere konkret, hvad det egentlig? Det betyder blot, at hvis vi skulle nummerere de ting - hvis vi skulle til at nummerere bytes RAM i din computer, bemærke, at dette kan være byte tal nul. Dette kan være byte nummer et, to, tre, fire, fem, seks, alle vejen op til at kunne lide - 2 mia være helt oppe i toppen. Så med andre ord, når vi taler om RAM eller hukommelse i form af bytes, det betyder blot, at nogen har besluttet, hvad der skal nummerere hver enkelt af disse bidder af hukommelsen. Så når du har brug for 32 bit for en int, eller du har brug for 8 bit for en char, hvor ender de i hukommelsen? Nå begrebsmæssigt, de bare ender nederst i dette ting kaldet stakken. Men hvad er interessant nu, er, når main kalder en funktion. Antag en funktion kaldet foo, bare et vilkårligt navn. Hvad sker er main er i bunden af ​​denne stak af hukommelse. Foo nu er sat på toppen af ​​main i hukommelsen. Så eventuelle lokale variable at foo har ender slags konceptuelt over dem i main. Hvis Foo kalder en anden funktion kaldet bar, disse variabler ender her. Hvis bar kalder noget andet, her, her, her. Så hvad er interessant ved at køre et program er, at du kalder funktioner, og da disse funktioner kalde funktioner, og som disse funktioner kalde funktioner, du opbygger denne stak af funktioner i hukommelsen. Og kun en gang En funktion returnerer du begynde at få at hukommelsen tilbage. Så en af ​​de nemmeste måder at løbe tør for hukommelse i et edb-program er at skrive funktioner, der aldrig vender tilbage. Så for eksempel, lad os vise så meget med en forsætligt buggy program. Lad mig gå videre og gøre # include , int main (void). Og jeg har tænkt mig at gøre, mens (2> 1), som sandsynligvis ikke nogensinde ændre på os. Og lad mig gå videre nu, og gøre printf. Faktisk er der kommer til at være mindre visuelt interessant. Lad os gøre det. For int (i = 0; i> 0). Lad os gøre denne fejl, i + +. Og lad os ikke printf her. Lad os praktisere, hvad jeg prædikede. Lad os få en metode her. Void kor, og vi vil sige int i. Og så vil jeg sige, printf - oh, lad os gøre det mere interessant. Lad os faktisk ikke udskrive noget som helst. Lad os bare gøre det. Kor (i). Ok. Så dette er buggy, fordi hvorfor? Jeg gør dette som jeg går, fordi programmet ikke rent faktisk gør noget af interesse. Men det er ikke målet. Målet er at skrive et program, hvis vigtigste funktion gør hvad, tilsyneladende? Ring til sig selv. Og faktisk har vi ikke brug for løkken. Lad os selv forenkle dette bare for ikke at tabe af syne virkelig fundamental fejl. Vigtigste opkald kor til at synge nogle kor. Så gjorde jeg noget dumt, og jeg havde kor opkald kor, fordi jeg antog en anden ville gennemføre det måske. Og nu er dette ikke kommer til at kompilere endnu. Jeg skal gøre hvad? Jeg har brug for prototypen, huske. Så jeg er nødt til at have op her void kor (int i);. Så nu, hvis jeg går ned her - faktisk, lad os bruge den større vindue. Lad os gå videre og gøre kor. Lad os gå videre og gøre kor. Brug af uidentificeret spilfører i. Åh, det var dumt. Vi har ikke brug for argumentet. Lad os bare gøre det. Ønske vi havde startet på denne måde. Det ville have været et meget lettere program til at skrive. Så der. Lad os nu gå over til min terminal vindue, re-run Dunk. Og her er vi gå. Det var virkelig hurtig. Hvad der rent faktisk skete, selvom? Nå, nu vil jeg tilføje print linje, så vi kan se. Så lad mig sige printf, lad os sige, jeg er herinde. Okay, ingen variabler, vil vi overlade det sådan. Lad mig igen køre gøre. Lad mig omvalg kor. Og kom nu. Hold ud. Som en sidebemærkning, hvorfor har det ikke styrtede ned endnu? Segmenteringen fejl skete super hurtigt før. [Uhørlig] DAVID J. Malan: Præcis. Så det tager tid at udskrive. Det tager bare mere arbejde på computerens side. Og der er det. Segmentering fejl. Så opdager, hvor hurtigt programmer til at køre. Hvis du ikke udskriver noget, super hurtigt. Men vi har stadig denne segmentering skyld, fordi hvad der foregik? Tja, hvis du tænker over, hvordan din computers hukommelse er lagt ud, er dette sker for at være main. Men her - lad os bare kalde dette kor, og lad os kalde dette kor. Og nu, hvis jeg gør mine æstetik højre, er dette bare for at sige kor, kor, kor, kor, kor, kor, kor, ad nauseum. Og til sidst, hvad der skal ske? Hvis det store billede bogstaveligt er dette, hvad der lige sker konceptuelt? Stakken overskridelser heapen. Eller værre, du bare overrendt alt, herunder tekst-segmentet, som er de nuller og ettaller, der repræsenterer dit program. Kort sagt, er det bare super, super dårlig. Right? Dit program har spiraled ud af kontrol. Du bruger måde mere hukommelse end du havde tænkt dig alle på grund af en dum fejl i dette tilfælde. Eller i dette tilfælde, at kalde en meget bevidst gjort funktion selv. Nu er det er ikke alle dårlige. Funktioner, der kaldte sig faktisk har stor magt når du bruger det korrekt. Jeg har ikke brugt det korrekt her. Så dette er ikke alle dårlige. Men det faktum, at jeg faktisk aldrig stoppe med at kalde mig selv er en fundamental svaghed her i dette program. Så hvor skal vi hen med alt dette? Nå, hvad der virkelig sker? Når jeg kalder tilvækst funktionen, ligesom vi gjorde i disse eksempler, Jeg har en værdi som 1, at jeg passerer i. Jeg passere i en kopi af nummer et. Så sker der følgende. Så lad os gå ind i tilvækst eksempel. Og denne fyr lige herovre. Så her er hvad der rent faktisk sker. Når jeg kaldes tilvækst, og jeg går i x, billedligt hvad er foregår her, er dette - hvis jeg har værdien 1 gemmes her, og jeg rent faktisk kalder tilvækst, som kaldes nu kor - Ja, der kaster mig ud her. Så lad os kalde denne tilvækst. Og vi ved ikke, hvad det næste funktion kommer til at være. Så hvad der rent faktisk sker, er her et eller andet sted i main, jeg har en luns af hukommelse, der lagrer tallet 1. Når jeg kalder tilvækst, jeg bruger en anden bid af hukommelse, men nu har jeg have kopi af 1. Når jeg tilvækst denne værdi, det bliver 2 - forfærdeligt skrevet på skærm her. Men så, hvad der sker, så snart tilvækst vender tilbage? Denne hukommelse bare bliver givet tilbage til operativsystemet, hvilket betyder alle du har gjort, er noget nyttigt. Den ene, der var indeholdt oprindeligt i main er stadig faktisk er der. Så hvor skal vi hen med dette? Tja, det viser sig, at i hukommelsen du har denne ryg mod ryg sekvens af bytes som du kan sætte ting i. Og det viser sig, at vi allerede har set noget, der indebærer, at der tingene tilbage til back to back to back. Hvad er en streng, der er baseret på uge en og nu uge to? Så det er bare en samling af tegn. Så det viser sig, ligesom du kan sætte tal i hukommelsen, på samme måde kan du sætte tegn i hukommelsen. Og når vi begynder at sætte tegn i hukommelsen tilbage til tilbage til tilbage til tilbage, viser det sig, at bruge den enkleste af ting som en for-løkke eller en while-løkke, kan vi gentage - fra venstre til højre over de tegn i en streng - og begynder at massere dem ind i forskellige karakterer helt. A kan blive B. B kunne blive C. Så i sidste ende, kan vi tage en Engelsk sætning, der rent faktisk giver mening og konvertere hver af disse breve én ad gangen ved at gå gennem vores computers hukommelse overladt til ret til faktisk at kryptere. Så lad os tage vores fem minutters pause her, og når vi kommer tilbage, vil vi starte denne proces med scrambling information. Ok. Så før vi dykke i nogle krypto og disse ting kaldes arrays, lad mig pause for eventuelle spørgsmål, fordi jeg føler, at jeg virkelig slags rodede nogle af disse emner. Så lad os løse nu, hvis vi kan. Så vi netop talt om returværdier. Vi talte om argumenter. Og vi talte om dette begreb, som vi vil vende tilbage til i de kommende uger komme, for at betragte hukommelse som en hel bunke af disse stablede bakker, så at sige. Fra bunden af ​​op, at sådan hver bakke, der bliver sat på stakken repræsenterer en funktion, der er ved at blive kaldt. Eventuelle spørgsmål? Så hvad med - lad mig prøve at stille et spørgsmål. Jeg holder ødelægge det, men nu det er - you've alle set drengens ansigt. Så vi vil komme tilbage til. Så lad mig stille et spørgsmål her. Lad mig forenkle denne tilbage til hvad den var før nogle af vores tidligere Q & A. Og det faktum, at tilvækst har åben parentes, int antal, lukket parentes. Hvad betyder int tal repræsenterer? [Uhørlig] DAVID J. Malan: Et argument. Okay, men hvad er et argument? [Uhørlig] DAVID J. Malan: Undskyld, hvad er det? SPEAKER 3: Noget du passerer i. DAVID J. Malan: Okay. Så noget som du passerer i. Og mere generelt, det er bare input. Hvis du skriver en funktion, og at funktionens formål i livet er at gøre noget lidt anderledes, hver gang du bruger det, så er den eneste måde, hvorpå at det skal ske ville virkelig synes at være at forsyne den med input, så det kan gøre noget anderledes med det input hver gang. Så du er nødt til at angive to ting, når en funktion tager input. Du skal angive det navn, du ønsker at give til denne indgang, rent for din egen bekvemmelighed, så du kan henvise til det i den funktion, du selv skriver, som jeg gjorde her på linje 32. Men du også nødt til at specificere sin type, fordi C er et programmeringssprog der bare kræver at hvis du ønsker en variabel, du nødt til at fortælle computeren, hvad datatype det er, i vid udstrækning, således at den ved hvor mange bit til tildele for den pågældende variabel. Fordi det kunne være seks - ked, vil det ikke være seks. Det kan være 16. Det kan være 8. Det kan være 32, endog 64. Men computeren skal vide. Nu int på den venstre side repræsenterer, hvad der derimod? [Uhørlig] DAVID J. Malan: Hvad er det? [Uhørlig] David J. Malan: Typen af ​​funktionen og, mere specifikt type af sin produktion. Right. Så mens ting i parentes repræsenterer sit input, om nogen, den ting til venstre repræsenterer dens output. Og i dette tilfælde, tilvækst tilsyneladende returnerer en int. Og så int er en tilbagevenden type af denne funktion. Hvad betyder det at vende tilbage? Bogstaveligt, du bruger søgeordet afkast. Og så hvis det, du vender tilbage til højre for søgeordet er en heltal, så er det faktisk overensstemmelse med, hvad vi har lovet. Du kunne ikke gøre noget som dette - hej, verden - fordi det er en streng. Det er naturligvis ikke et heltal. Så kort sagt, at byrden er virkelig på os, programmøren, at være specifik som til, hvad vi vender tilbage og derefter faktisk gå om tilbagesendelse. Og så for at gøre en smule mere klar sammenhæng - Der er han igen. Konteksten - store overraskelse kommer på bare et øjeblik. Konteksten her nu, er, at computerens hukommelse er, igen, en gigabyte, to gigabyte, uanset hvad. Måske er det mere. Måske er det mindre. Men computeren ser den som havende forskellige sektioner. Noget går dernede. Noget andet går deroppe. Forskellige ting går i midten. Og i dag, vi bare begynde at fortælle denne historie. Men vi vil vende tilbage til denne over tid. For nu, er det eneste stykke af hukommelse vi virkelig bekymrer sig om tekstsegment fordi der kun repræsenterer nuller og ettaller at Dunk har udsendt. Så når du kører en kommando på tastaturet ligesom a.out, eller du dobbelt klikke på et ikon på Mac OS eller Windows, er dit program indlæst fra harddisken drive i RAM. Og det er plopped øverst på computerens RAM, så at sige. Nu mellemtiden, som dit program starter, og main bliver kaldt i program, du skrev, eller det program Microsoft eller Apple skrev, at nogen af ​​den lokale variable ender dernede på bunden af ​​computerens hukommelse. Men hvis main kalder en anden funktion, som selv har variabler eller argumenter, de ender over det. Og hvis denne funktion kalder noget, de ender op over det, oven over den,. ovenover Og kun en gang om funktion er gjort udførelse gør stablen af ​​bakker, så tale, begynder at blive lavere og lavere. Og det er det da, i en nøddeskal, forklarer hvorfor, når du ringer terning - eller du ringer interval - du passerer i en kopi af værdien. Og hvad det betyder billedligt er, at du bogstaveligt talt er ved at skrive det nummer 1 i en anden del af hukommelsen, ændring, at 1-2, i tilfælde af tilvækst - eller et 8, i tilfælde af kuben - og derefter smide det hukommelse væk, så snart tilvækst eller kuben returnerer funktionen. Spørgsmål. [Uhørlig] DAVID J. Malan: Hvor - globale variable gemmes i, hvad der er øjeblikket hedder de initialiserede data eller startværdi data. Forskellen er, hvis du har en global variabel, og du tildeler det straks en værdi med lighedstegnet, det ender i toppen der. Og hvis du bare siger int x semikolon uden nogen værdi, det ender lidt op lavere i RAM simpelthen ved konvention. Andre spørgsmål. Ok. Så dette billede vil komme tilbage, når vi får mere kraftfulde med hvad vi kan gøre med computeren. Men for nu, lad os få en kort intro til kryptografi, en særlig form for kryptografi, som ikke løse alle verdens problemer, men løser nogle af dem. I dette tilfælde her har vi noget, der hedder hemmelig nøgle-kryptering. Og hemmelig nøgle kryptografi, som navnet antyder, stammer dets sikkerhed fra en hemmelighed. Altså for eksempel, hvis du er tilbage i folkeskolen og du passerer en lille hemmelige kærlighedserklæring til den dreng eller pige, du knusning på - hvis du ønskede at videregive det gennem publikum, har du sandsynligvis ikke ville skrive sådan en note på engelsk eller hvad dit modersmål er, men snarere, du kan kryptere det. Eller du kan bare sende dem en sms i disse dage. Men du kan faktisk give dem en note i hele klasseværelset. Og for at gøre det sikkert på en sådan måde, at dine venner og læreren ved ikke, hvad du skriver, kan du komme op med en forholdsvis enkel algoritme - ung selvom du måske - til bare forvrænge ordene. Så i stedet for at skrive A, kan du skrive B. I stedet for B, kan du skrive C. I stedet for C, kan du skrive D, og ​​så videre. Eller du kan komme op med en mere sofistikeret oversættelse af breve til forskellige bogstaver. Men fangsten er dreng eller pige, til hvem du sender denne note skal vide noget. Hvilket er hvad, naturligvis? Ligesom, hvad din hemmelighed er. Ligesom, hvad er det mapping mellem As og Bs og Cs og Ds? Er det blot at tilføje en, så at sige, til hver af de bogstaver, at gå fra A til B, B til C? Er det mere kompliceret end det? Så du og din knuse er nødt til at have denne hemmelige informationer. Men der er lidt af en catch-22 her. Hvis det er allerførste gang du sender denne kærlighed brev gennem klasse, er, hvordan den dreng eller pige vil vide, hvad hemmeligheden selv er? Så hemmelig nøgle krypto løser ikke alle problemer i verden. Og der er faktisk et forhold, som vi vil komme tilbage til mod semesters afslutning. Ligeledes har ingen af ​​os sandsynligvis nogensinde sendt en - Heller ikke de fleste af os ikke kender nogen, der virker, for eksempel på Amazon.com. Og alligevel har mange af os nok købt ting på Amazon.com. Og vi har lært at antage, at disse e-handel transaktioner er sikre. Right? Den URL sandsynligvis siger https. Der er måske en fjollet lille hængelås-ikonet eller andet sted. Der er en slags kryptering sikrer dine kreditkortoplysninger mellem dig og Amazon.com. Og dog, hvis kryptografi indebærer at kende nogle hemmelige, og alligevel har jeg ikke kender nogen hos Amazon, og jeg har bestemt ikke arrangeret nogen form for hemmelighed med nogen på Amazon, er, hvordan min computer eller min browser at gøre dette? Nå, viser sig at der er andre typer af kryptografi i alt, der løser dette problem. Men i dag vil vi fokusere på den enkel, hvor du kan arrangere i videre til kende nogle hemmelige, ligesom plus 1 eller nogle mapping mellem As og Bs. Og processen for kryptografi generelt indebærer dette. Du har nogle almindelig tekst, der er afbildet her til venstre. Du kører det gennem en form for algoritme eller procedure for at kryptere den. Måske det er bare A bliver B, B bliver C. Og så ender man med Cipher tekst. I mellemtiden, når din knuse modtager den hemmelige note, han eller hun har til så dekryptere den ved generelt at vende en sådan algoritme så for at få bakke almindelig tekst. Nu er der fysiske inkarnationer af denne. For eksempel er det en lille hemmelighed dekoder ring. Og det er en ring i den forstand, at der er to skiver her. På ydersiden periferi af det her, er der Bogstaverne A til Z, selvom de er i tilfældig rækkefølge. Og på indersiden, er der faktisk nogle numre, således at med dette ring, kan du slags vende udefra, men ikke inde for at line op tal med bogstaver. Og i det klip, du er ved at se - nogle som du måske har set 24/7 omkring julen fra en film kaldet A Christmas Story. Du vil se, at lille Ralphie var så ivrig efter at finde ud af hvad lille forældreløse Annies hemmelige budskab var ham, der var blevet meddelt, tror jeg, i dannelse af numeriske meddelelser på en seriel boks. Og du var nødt til at samle alle de små kort, der fulgte i korn boksen. Du havde at maile dem i. Du havde at komme tilbage den hemmelige dekoder ring, så du endelig kan regne ud af, hvad den kortlægning er mellem bogstaver og tal, eller bogstaver og bogstaver. Så jeg giver dig denne korte klip fra A Christmas Story at motivere Pset 2 og vores diskussion, i et øjeblik af arrays. Så her har vi Ralphie. [VIDEO PLAYBACK] -Være det kendt at alle og enhver, at Ralph Parker hermed er udnævnt til en medlem af Little Orphan Annie Secret Circle og er berettiget til alle den hæder og fordele forekommer dertil. -Signed, Little Orphan Annie. Kontrasigneret, Pierre Andre! I blæk! Honors og fordele, der allerede i en alder af ni. Kom, lad os komme videre med det. Jeg har ikke brug for alt det jazz om smuglere og pirater. -Lyt morgen aften for den afsluttende eventyr af The Black Pirate Ship. Nu er det tid til Annie hemmelige budskab til jer medlemmer af Secret Circle. Husk, børn, kan kun medlemmer af Annie Secret Circle afkode Annies hemmelige besked. Husk, at Annie afhængig af dig. Sæt dine ben til B2. Her er budskabet. 12, 11 - -Jeg er i min første hemmelige møde. -14, 11, 18, 16 - -Pierre var i stor stemme i aften. Jeg kunne fortælle, at aftenens budskab var virkelig vigtigt. -3, 25. Det er en besked fra Annie selv. Husk, du ikke sige det til nogen. -90 Sekunder senere, er jeg på den eneste plads i huset, hvor en dreng på ni kunne sidde i fred og afkode. Aha, gik B. I den næste. E. Det første ord er være. S. Det kom lettere nu. U. -Oh, kom nu, Ralphie. Jeg fik at gå. -Jeg er helt ned, ma. -Gee guru. -T, O. Vær sikker på at. Vær sikker på at hvad? Hvad var Little Orphan Annie prøver at sige? Vær sikker på at hvad? -Ralphie! Randy har fået til at gå. Vil du venligst komme ud? -Okay, ma. Jeg kommer lige ud. -Jeg var ved at blive tættere nu. Spændingen var forfærdeligt. Hvad var det? Den planetens skæbne kan hænge i balance. -Ralphie! Randy er nødt til at gå. -Jeg er lige ud, for skriger højt. -Gee, der næsten. Mine fingre fløj. Mit sind var en stål fælde. Hver pore vibrerede. Det var næsten klar. Ja, ja, ja, ja. -Sørg for at drikke din Ovaltine. Ovaltine? En crummy kommerciel? Søn af en kælling. [END VIDEO PLAYBACK] DAVID J. Malan: Så der har vi kryptografi. Så hvordan i en computer kan vi gå om gennemførelsen eller repræsenterer ting som dette? Tja, vi har brug for en måde at udtrykke os selv lidt mere fleksibelt end vores variabler hidtil har tilladt. Vi har haft int'er. Vi har haft tegn. Vi har haft flåd og doubler og et par andre. Men de er enkelte stykker hukommelse, der ikke rigtig tillader os at udtrykke ting som ord og sætninger og sætninger. Faktisk har vi kaldt sådanne ting strenge. Men vi lovede, at dette er egentlig bare en forenkling i CS50 bibliotek, at vi har til hensigt at skrælle tilbage. Og så lad os begynde at gøre det her. Lad mig gå videre og åbne en fil - alle disse filer findes som sædvanlig online - kaldet array.c at løse et problem relateret til strenge, men det giver et Billedet her af, hvordan vi kan bruge noget, der hedder et array. Et array er en datatype. Det er en type variabel, slags, der har flere mindre datatyper indersiden af ​​det tilbage til back to back to back. Altså for eksempel, hvis vi ønsker at skrive et lille program, der giver dig din quiz gennemsnittet for et kursus som 50, der har to quizzer, du kunne meget nemt skrive dette program - baseret endda på nogle af sidste uges materiale - ved hjælp af GetInt og et par variabler. Int quiz1, int quiz2, og det er temmelig ligetil. Det er måske 10, 20 linjer kode, max, at gennemføre et program, der anmoder bruger for to quiz scorer og derefter beregner deres gennemsnit ved at tilføje dem sammen, dividere med to, og derefter trykning af resultaterne. Vi kunne sandsynligvis gøre det temmelig let nu efter et bestemt antal minutter. Men problemet er at antage, at 50 havde tre quizzer eller fire. Antag, at du ønskede at bruge det samme program for en klasse, der havde ugentlig quizzer. Tænk en klasse, der har ugentlig quizzer. Hvis der er ligesom 16 eller deromkring uger i et semester, nu du har 16 variable - int quiz1, int quiz2, int quiz3, int quiz4. Så snart du begynder at se denne redundans, det kopiere og indsætte af kode, bør den begynde at gøre dig ønske der var en bedre måde. Og heldigvis, på grund af arrays, er der. Så lad os gøre det. Først, lad mig introducere en meget simpel ting, som vi ikke har brugt hidtil, men du vil se det lejlighedsvis i kode. Dette er, hvad der generelt kaldes en konstant. Så det er en konstant i den forstand, at denne værdi aldrig ændrer. Den menneskelige konvention, når du opretter en konstant er at bruge al kapital breve, bare så det virkelig skiller sig ud i din kode. Og det særlige søgeord, du bruger i C # define. Så hvis du siger # define, så en plads, så det ord, du vil bruge til den konstante navn, hvorefter værdien af ​​konstanten. Så varsel, er dette anderledes i at tildele noget til en variabel. Der er ingen lighedstegn. Der er ingen semikolon. Dette er hvad der normalt betegnes som en præprocessor direktiv, men mere på at en anden gang. For nu, skaber dette en uforanderlig kaldet værdi quizzer hvis faktiske numeriske værdi er 2. Så uanset hvor du ser quizzer, quizzer, quizzer hele denne fil, det er kun tallet 2.. Nu, hvis jeg ser på main nu, lad os se hvordan det virker. I første omgang ser det lidt kryptisk. Men det er alt ting fra uge ét. Spørg brugeren om kvaliteter. Hvordan gør vi det? Tja, på linje 22 - Dette er virkelig den saftige del - Jeg erklærer en svømmer, men ikke bare en enkelt svømmer. Jeg erklærer, snarere en matrix af kommeværdier. Denne variabel vil blive kaldt kvaliteter, som antydet her. Men det eneste stykke ny syntaks så er disse firkantede parenteser, det faktum at jeg har sagt float kvaliteter og derefter åbne beslag og derefter et nummer. Varsel, hvis dette er en konstant, det er bare ligesom vi gjorde dette. Det betyder, hey computer, giv mig to flydere, og lad os i fællesskab kalde dem karakterer. Dette er i modsætning til en meget mere langsommelig proces som denne. Float Grade1, flyder grade2, og så videre. Så et array giver os mulighed for at gennemføre denne idé, men langt mindre messily, i sådan måde, at man kan skrive en linje kode i stedet for fx 16 for en 16 uge semester. Så jeg havde ikke lyst til hard-kode 2, fordi hvis du tænker over det nu logisk - vel næste år CS50 ændringer til 3 quizzer i stedet. Og jeg havde det nummer 2 her. Jeg havde nummer 2 her. Jeg havde nummer 2 her. Jeg havde nummer 2 her. Det bliver meget trættende og meget let at skrue op og ved et uheld ændre én værdi til 3 og gå glip af en anden værdi af 2. Så jeg har tænkt mig at i stedet abstrakt dette væk og bruge denne konstante at, da dens navnet antyder, aldrig ændrer sig. Og nu, uanset om vi har forskellige quizzer i år eller næste, jeg bare nødt til at ændre det på ét sted, op her på toppen. Så det er alt konstant er. I mellemtiden er den nye begrebsmæssige træk er, at i et array. Så de firkantede parenteser giver mig så mange flåd og lader mig kollektivt kalder dem kvaliteter her. Så lad os nu se, hvad jeg har tænkt mig at gøre. Her i ledningen 24 er begyndelsen på en for-løkke. Dette er virkelig ikke noget fancy. Det er bare med quizzer i stedet for en hård-kodet nummer. Men der er ikke noget intellektuelt anderledes der fra sidste uge. Dette er blot printf. Så printf ("quiz nummer% d af% d"), fordi jeg bare ønsker at udskrive give mig quiz nummer et af to og derefter to af to. Så dette er et rent æstetisk ting. Men det interessante del nu er på linje 27. For at udfylde en af ​​de to pladsholdere med flydende komma værdi, du igen bruge kantede parenteser. I dette tilfælde, jeg bruger i, fordi det for-løkke er begyndt med i lig hvilken værdi, tilsyneladende? 0. Så på den første iteration af dette loop, er det som om jeg skrev dette i kode. Men på den anden iteration af dette loop, er det som om jeg skrev dette i min kode. Men det faktum, at jeg bruger en variabel er perfekt, fordi, som navnet antyder, er det varierende sin værdi på hver iteration. Så jeg fylder dette array ét sted ad gangen. Hvad betyder dette array ud? Nå, grunden til at jeg trak denne super enkle rektangel på skærmen her før var af denne grund. Et array er bare en bid af hukommelse, efterfulgt af en anden bid af hukommelse, efterfulgt af et andet stykke af hukommelsen, og så videre. Så hvis min array er af størrelse 2, i dette tilfælde her, alt jeg ville gøre ved skrive i min quiz scoringer, ligesom her. Jeg fik 100 på denne ene. Og så fik jeg en 99 på denne ene. Så denne hukommelse måske ikke engang blive brugt, fordi jeg kun har bedt computer til en bred vifte af størrelse 2. Disse pladser er der stadig. Right? Du har stadig to gigabyte RAM, selvom du kun beder om to flydere. Så ideen bag arrays er, at computeren bare tager en bid af hukommelse og derefter fordeler mindre stykker tilbage til back to back to back. Og så det er alt et array er. Det er en sammenhængende klump hukommelse, inden i, som du kan sætte ting. Nu dette sker for derefter gøre bare nogle kedelige aritmetik. Hvis jeg rulle ned her, det er her, jeg så gentage over opstillingen. Jeg kommer op med summen af ​​alle værdierne i arrayet. Og så bruger jeg funktionen round her til faktisk at gøre det opsummere divideret med quizzer. Men lad mig bølge min hånd på det som en slags nok aritmetik for nu. Men alt, hvad der gør for mig i sidste ende er at beregne et gennemsnit. Så første quiz plus sekunder quiz, divideret med 2, og derefter udskrive det ud som en int. Men lad os nu overgang til en anden eksempel kaldet streng1, der tegner et lignende billede, men ved hjælp af strenge. Lad mig gå videre og forenkle dette for bare et øjeblik. Og tilgive indrykningen for nu. Bemærk i linje 19 i dette eksempel, får jeg en streng fra brugeren. Men bemærk hvad jeg næste gør i linjerne 22 og fremefter. Jeg er faktisk iteration fra i op til - og det er et nyt trick - strlen, streng længde. Dette er en funktion, der kommer med C, hvis du give det en streng, det fortæller dig, hvor mange tegn er i denne streng. Det er alt. Det faktum, at det er strlen stedet for streng længde er bare fordi det er mere kortfattet. 30 år siden, folk kunne lide at skrive ting som kortfattet som muligt. Så vi har holdt denne konvention her. i + + betyder blot forøge i i hver iteration. Og nu bemærke dette, som er virkelig interessant. Så i linje 24, jeg siger computer, giv mig et tegn, otte bits, og kalder det c. Men hvad er dette på højre side siger? På engelsk, hvad det repræsenterer? [Uhørlig] DAVID J. Malan: Præcis. Giv mig det første tegn i sættet. Eller mere generelt, giv mig det i'te tegn i array. Og indse det er vigtigt nu, at som dataloger, vi er faktisk at tælle fra 0. Du har ikke diskretion nu at begynde at gøre dette. Nu har du til at opføre sig i overensstemmelse med computerens forventninger og tælle fra nul, fordi [0] vil være den første tegn i en streng. [1] vil være det andet. [2] vil være den tredje og så videre. Så dette program, hvis jeg kompilere det - det er, igen, streng1. Så gør streng1. Og nu løber jeg streng1 i min terminal vindue. Det venter på input, så jeg har tænkt mig at skrive i, siger, David. Enter. Og nu er det udskriver DAVID alle på forskellige linjer, fordi mærke til, hvad jeg laver. Jeg udskriver et tegn ad gangen. Nu vil vi ikke gå i detaljer i dag om dette. Men jeg slettet et øjeblik siden denne kontrol her. Det viser sig, at hvis brugeren er uartig, kontradiktion, eller bare forvirret, kan du faktisk undgå at give en streng af en vis længde. Hvis du rammer en forkert tast på tastaturet, kan du give ingen snor på alle. Eller hvis du er skadeligt, kan du prøve at indsætte en gigabyte værd af en essay at fylde denne streng. Og hvis computeren løber tør for hukommelse, viser det sig, at vi skal at komme tilbage denne særlige værdi kaldet null. Så for nu, ved bare at der er denne særlige værdi kaldet null, at vil give os mulighed for at kontrollere, når vi er ude af hukommelsen, blandt andre ting. Men hvis jeg åbner nu streng2, bemærke en forskel her. Bemærke en forskel her med streng2. Med streng2, er dette for-løkke lidt anderledes. Lad mig slette de nuller, så vi kan tale om dem en anden gang. Men hvad er anderledes ved for-løkken denne gang? Og jeg kan gå tilbage til det foregående eksempel. Så det er version to. Dette er version et. En, to, en to. Så strlen opkaldet er hvor? Det er i den første del af for-løkken. Nogen tanker om, hvorfor jeg gør det? Yeah. [Uhørlig] DAVID J. Malan: Så vi ikke kalde funktionen hver eneste gang. Præcis. Genopkald fra efter sløjfer, at de er super enkel, når du slags forstå, at det er initialiseringen, at tilstand, og opdateringen. Problemet er, at betingelsen sker på hver iteration af løkken. Og så i dette eksempel her, er hvad dårligt om det faktum, at dette er min tilstand? Du ringer strlen igen og igen og igen. Men når jeg har indtastet i DAVID, længden af ​​strengen er fem. Og det kommer ikke til at ændre sig på hver iteration af løkken, fordi streng er stadig D-A-V-I-D. Så dette er en antydning af, hvad der kommer til at blive en stadig vigtigere idé kendt som en design beslutning, hvor - bare ikke gøre computeren gøre unødvendigt arbejde. Nu blot som en forsmag på Pset 2, Pset 2 i standardudgaven er kommer til at udfordre dig til rent faktisk at gennemføre nogle flere ciphers, nogle Antallet af krypteringsalgoritmer, så du både kan kryptere og dekryptere hemmelige beskeder, meget gerne den ene Ralphie der afkodes. I hacker udgave af Pset 2, vi kommer til at gå lidt videre. Vi kommer til at hånd du en fil fra et egentligt edb-system, der indeholder en hel masse brugernavne og faktiske krypterede passwords, og udfordringen for hacker-udgave vil være at knække disse passwords og figur ud af, hvad kryptering eller hvad hemmelighed blev brugt til rent faktisk at generere disse adgangskoder. Og vi vil gøre dette ved hjælp af en ny funktion her af C, at jeg vil give du bare en demo af, kendt som kommandolinjeargumenter. Så det viser sig, som nogle af jer måske har set i afsnit eller i lærebøger, main ikke altid behøver at være ugyldig i parentes. Det viser sig, at main også kan skrives på denne måde, med to argumenter, argc og argv, hvor argc er antallet af ord, du skriver efter programmets navn på din kommandolinje. Og argv er de faktiske ord. Og da de firkantede parenteser dér antyder, argv er tilsyneladende et array. Det kommer til at være en streng efter en streng efter en streng i hukommelsen. Så det vi vil være i stand til at gøre, begyndende med Pset 2, noget som dette. Hvis jeg laver argv1, som er et eksempel, vi vil vende tilbage til på mandag, og kør det, bemærke, at det ikke synes at gøre noget endnu. Det bare udskriver sit eget navn. Men hvis jeg siger farvel klasse, meddelelse om, at dette program tilsyneladende gentager over hver af de ord, der blev skrevet ved prompten. Og de måder, som vi vil få adgang til ord, som brugeren har indtastes ved prompten er ved at ændre main, der starter i denne weekend, fra int main (void) til int main (argc, argv). Og dermed vil blive født kommandolinjeargumenter. Og når du får virkelig sofistikeret på dette, vil du være i stand til at skrive virkelig trippy programmer, som denne her, som går ud over nogle af de funktioner, vi har gjort hidtil, men alle ganske kraftige. Så vi vil forlade dette med dette på skærmen. Og vi vil se dig på mandag.