[Powered by Google Translate] [Uge 2, Fortsat] [David J. Malan, Harvard University] [Dette er CS50. - CS50.TV] Ok. Det er CS50, og dette er slutningen af ​​uge 2. Hvis du forventer at være sultne omkring dette tidspunkt i morgen, vide, at vi kommer til at indkalde til en lille gruppe i morgen, torsdag, 13: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 webadresse, selv om, som kunne være af interesse er dette. I næsten en måneds tid, er naturligvis vil blive stillet til rådighed desto mere bredt via EDX, via hvilke folk på internettet vil være i stand til at følge med, engagere sig i løbet ganske aktivt, i virkeligheden. De vil være ved hjælp af CS50 Appliance og CS50 Diskuter og de fleste af de forskellige software-værktøjer, 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 i andre talte og skrevne sprog. Så hvis du kan have en interesse i at deltage i dette projekt hvorved vi vil give engelske udskrifter og undertekster for kursets forelæsninger og shorts og seminarer og sektioner og lignende, hvis du taler flydende eller skrive flydende et andet sprog, vi ville elske 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 undervisning nogle 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 derefter under det du vil være i stand til at oversætte til et andet sprog præcis, hvad mapping er mellem, i dette tilfælde, engelsk og sige, spansk. Så det er faktisk en meget brugervenligt værktøj. Du kan spole tilbage og spole frem meget hurtigt med tastaturgenveje. Så hvis du gerne vil deltage i dette forsøg, og få dine ord set og læst ved potentielt tusindvis af folk derude, er du velkommen til at deltage. Ét ord om killing fra mandag. Lest vi har sendt en alt for skræmmende budskab, gøre indse, at som kontortid tyder og som sektioner antyder, udformningen af ​​kurset er meget at have de studerende samarbejder og taler til arbejde gennem problematiske sæt og problemer sammen, og virkelig den linje bare kommer ned til, igen, bør det arbejde, du i sidste ende indsende være din egen. Og så helt ærligt, i kontortiden det er helt normalt, Det er helt forventes selv at blive chatter med nogle ven ved siden af ​​dig. Hvis han eller hun kæmper med nogle emne, og du er ligesom, "Nå, ja, lad mig give dig et glimt af nogle linje kode, som jeg skrev," det er fint, det sker, og det er meget befordrende, tror jeg, med processen med læring. Når linjen bliver krydset er, når hovedet er slags vippet over her i alt for mange sekunder eller minutter for at virkelig at have bare været en Unblocking mulighed for din ven, og i hvert fald når tingene bliver udvekslet via e-mail og Dropbox og lignende, der også er den linje. Så med alle midler føler sig trygge og føler sig tilskyndet til at chatte med venner og klassekammerater om psets og mere og bare indse, at hvad du i sidste ende indsende bør virkelig være et produkt af din skabelse og ikke en anden. Og så en af ​​de domæne-specifikke problemer for pset2, der vil komme ud sent i morgen aften, er at dykke ned i en verden af ​​kryptografi, som er kunsten at kryptere eller forvanske oplysninger, og dette i sidste ende drejer sig om verden i sikkerhed. Nu, sikkerhed for de fleste af 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 mod semesters afslutning. Hvis din adgangskode er skrevet på en gul seddel - ingen joke - på din skærm, der også er ikke nødvendigvis det bedste design, men ganske almindeligt fænomen. Og hvis du ikke bruger kryptografi til at kryptere dine adgangskoder, de er særligt sårbare. Så hvis du tror, ​​du er super dygtig ved at have en skjult Word-dokument 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 en meget sikker mekanisme. Og hvad så pset2 vil indføre, er denne kunst af kryptografi og scrambling oplysninger, således at ting som passwords er så meget desto mere sikker. Konteksten her er, at med usikre data kommer en mulighed for at kryptere den og at scramble den. 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 hemmelige budskab her er. Men i den virkelige verden af ​​computere, går tingene ikke engang ligne de kan 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 dit brugernavn eller for andre mennesker på systemet, men du vil se en krypteret version af deres adgangskode. Faktisk er ordet krypt der tyder på, at følgende ting er krypteret, og denne serie af tilsyneladende tilfældige bogstaver og tegn og tal og så videre 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 af en slags og at vide noget som en anden ikke gør. Så 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. Især som nogle af jer har dykket ned pset1 skal apparatet, og en meget ny verden for dig selv, indser, at frustrationer og forvirring og kun tekniske vanskeligheder er ganske forventes, især med den første Pset, hvor der er bare så meget nyt, bare at få kendskab til ls og cd, og alle disse mystiske kommandoer og et nyt miljø, og det er adskilt fra det faktiske materiale og programmering selv. Så indser også, at der er helt sikkert kontortid, der eksisterer som en støtte struktur. 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 nogle andre farvande helt, gør 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 der måske ikke være bekendt for dig, og du ender med at gøre, i de fleste tilfælde ganske fint, 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 pset0, hvis du lægger i 10 timer, 15 timer, 25 timer i nogle Pset og du bare banke hovedet mod muren, og det bliver super sent på aftenen men du har taget Pset 90% af vejen, og 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 i lykkeligt sige, "Okay, jeg ved, det er ikke perfekt, men jeg arbejdede min røv ud på dette, 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 har bedre held til. Det er lidt ironisk, at kodeordet for dette, hvis du gerne vil prøve at tilslutte til denne for bedre hastigheder - og lad os vide, hvis det ikke bedre - er 12345, hele vejen op til 8 fordi 8 er mere sikker end 5. Så hvis du har brug for Wi-Fi-adgangskode, oprette forbindelse til CS50 trådløst her, 12345678, 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 i alle ting Apple. Hvad jeg gravet op fra et par år tilbage var denne fil her, iUnlock.c, bare for at slags gøre mere konkret og mere komplekse nogle af de mere basale C-programmer, vi har skrevet. Så jeg åbnede denne fil, iUnlock.c. Det er til rådighed på Forelæsninger 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 bare main. Han brugte en hel masse biblioteker her, og hvis vi begynder at rulle gennem, hvad det egentlig er, er den allerførste, jeg tror, ​​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å det og gøre ting, som Apple ikke ønskede folk til at gøre, nogen tog sig tid til at finde ud af præcis, hvordan de kunne udnytte software-fejl, fejltagelser, bugs, i Apple-software, og dermed blev født iUnlock.c-- at hvis du har kompileret det på din computer og installeret det på en iPhone der var forbundet til din computer via fx en USB-kabel, dette ville give dig administrative eller root-rettigheder på din iPhone og lad du gøre stort set 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 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 forståelsen af ​​low-level detaljer - og i dette tilfælde C programmering - og mange af de kendte konstruktioner at vi er begyndt at spille med, er du i stand til virkelig at udnytte den 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 ligner det er en funktion, som denne person skrev. Det tager 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 pause, og på en måde vedrører 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 nogensinde se i løbet af semesteret. I slutningen af ​​dagen, følger det af de samme regler og logik, som vi har leget med hidtil. Så dette er alt for gammel til at knække din iPhone 3s eller 4s eller snart 5s disse dage, men ved, at det hele er meget stammer fra denne verden, som vi har dykket ned. 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 datatype at vi har talt om, men har ikke rigtig set i C. Dette er en fil kaldet positive1.c, og pr bemærkningerne øverst, dette blot kræver, at en bruger giver et positivt tal. Så det er et eksempel på en gør-while-løkke, hvilket er rart for brugeren interaktive programmer hvor du skal fortælle brugeren til at gøre noget, og hvis de ikke samarbejder du råber på dem eller afvise deres input. Sag i punkt: Jeg kommer til at gøre linjer 19 gennem 24 så længe brugeren ikke har givet mig et positivt tal. Denne detalje her på linie 18, hvorfor jeg erklærer n over hele denne looping konstruere i modsætning til lige ved siden af ​​linie 22, hvor jeg faktisk pleje at få n? Yeah. [Studerende] Scope. >> Yeah, så spørgsmålet om anvendelsesområde. Og i lægmandssprog, hvad omfang henvise til? Yeah. >> [Uhørlig student svar] >> Kan du tale lidt højere? [Studerende] Hvor du kan få adgang til denne variabel. >> Perfect. Hvor du kan få adgang til en bestemt variabel. Og generelt, den tommelfingerregel hidtil har været, at rækkevidden af ​​visse variable defineres 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, ville denne linje arbejde. Jeg ville få en int, og jeg ville sætte det ind i den variable n på linje 22, men som linje kode vil nu have nogen idé om, hvad jeg taler om? >> [Studerende] 25. [Malan] 25, og det viser sig 24 som godt, fordi det i dette tilfælde falder uden for de krøllede parenteser. Så bare en lille smule af et irritationsmoment, men meget let løses ved blot at erklære den variable uden for selve funktionen. Vi får se senere i dag, du kan 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 inde i en funktion, der ikke inde i en løkke, men i selve filen, uden alle de funktioner, du har skrevet, som jeg gjorde her på linie 15. Dette er generelt ildeset, men indse dette er en løsning til tider til andre problemer, da vi til sidst vil se. Så for nu vil vi overlade det ligesom dette, men lad os se om vi kan omskrive dette bare at begynde at udtrykke os selv lidt anderledes. 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. Det synes at virke. Måske ikke den mest strenge test, men mindst det er en nice tilregnelighed kontrol at vi er på rette spor. Så nu lad mig gå videre og åbne version 2 af dette, og hvad er anderledes allerede? Det gennemfører den samme ting, men hvad der springer ud som klart anderledes denne gang? Denne bool i grønt. Det er fremhævet i grøn, dette søgeord er kendt som bool, som er en datatype. Det kommer ikke indbygget i alle versioner af C. Du er nødt til at indeholde en specifik 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. Jeg kunne have kaldt det noget, men jeg kaldte det taknemmelig bare for at slags formidle nogle semantiske betydning. Så i første omgang på linie 18, jeg er åbenbart ikke taknemmelig fordi den booleske 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 bare lidt omskrevet min logik. Så ingen funktionelt forskellige, 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 har tænkt mig at tjekke en betingelse. Gør denne løkke, mens taknemmelig er falsk. Så jeg foreslog dette som et alternativ til version 1 fordi det er i det mindste 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 også denne gang jeg åbenbart ligeglad at huske, hvad brugeren har indtastet i fordi varsel der er ingen variable n, så faktisk, 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å vi husker den værdi, teknisk, det er ikke strengt nødvendigt. Hvis en eller anden grund, du bare ligeglad at gemme værdien, du blot ønsker at kontrollere værdien, bemærke, at vi bare kan skrive dette som GetInt, open 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 sandt, 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 skete for at være. 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 variant i positive3. Bemærk den eneste forskel nu er, hvad linje kode? >> [Studerende] 25. >> [Malan] Yeah, 25. Og vi har ikke rigtig set dette trick bare endnu, men vi kunne se det udråbstegn på mandag, som angiver hvad? >> [Studerende] Not. >> Ikke eller negation. Så tag en boolesk værdi og vende sin værdi. Sand bliver falsk, falsk bliver sandt. Så dette, vil jeg foreslå, er endda en smule mere intuitiv en måde at skrive koden 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, while (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 talte om Booleans tilbage, når vi legede med Scratch, men indser nu kan vi bare begynde at skrive vores kode på mange forskellige måder. Så specielt i pset1 hvis du er slags kæmper for at finde ud af den måde at skrive noget program, odds er du heldig, fordi der kan være mange løsninger at du kan ske på. For eksempel er det kun 3 for selv den simpleste af programmer. Ok. Og nu husker på mandag vi tilbage 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 Jeg har implementeret en terning funktion. Det er ikke kompliceret. Det er bare en * a * a 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 a * a * a. Så nu har jeg mulighed for, ligesom jeg vant til med prinf alene, at kalde denne funktion ved at kalde terningen funktionen. Og terningen funktionen tager nogle input, og terningen returnerer funktionen nogle output. Derimod bare printf gjorde noget. Den vendte ikke tilbage noget, som vi holdt af, selvom som en sidebemærkning det gør returnerer en værdi; du bare generelt ignorere det. Printf bare gjorde noget. Det havde en bivirkning af udskrivning til skærmen. Derimod her har vi den terning-funktion, der faktisk returnerer noget. Så for dem, der kender til 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. Ja? Okay. Hvad er dit navn? >> [Studerende] Ken. >> Ken. Ok. Ken, kom op. Ken vil være en funktion af sorterer her. 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 den vigtigste funktion, for eksempel og jeg har ikke en iPad i hånden. Jeg kan ikke rigtig huske, hvordan man - Tja, jeg kan ikke sige det. Jeg har ikke rigtig god håndskrift, og så derfor jeg vil have dig til at udskrive noget på skærmen for mig. Jeg er den vigtigste program, og jeg har tænkt mig at få dig sige dette ved at skrive det i min kylling scratch og derefter passerer dig en indgang. Så 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 lige skrevet printf, citat-citat slut noget på skærmen, Jeg kører dette program, og så snart printf bliver kaldt, Den har et argument eller en parameter undertiden mellem anførselstegn. Her er det argument. Jeg passerer det til Ken. Han er en sort boks skrevet nogle flere år siden at der tilsyneladende kun forstår at udskrive ting på skærmen. Så udføre. Det er ikke dårligt. Meget godt. Så nu Ken sker fuldbyrdende. Har han brug for at give mig noget tilbage? Ikke at vi har set hidtil. Igen, ikke printf faktisk returnere 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 overtager styringen af ​​programmet igen fordi denne linje kode, printf, sker fuldbyrdende. Og vi går om vores måde, udføre, hvad andre linjer er der. Så lad os nu prøve en lidt anderledes eksempel. Denne gang her lad os først rydde skærmen, 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. Nu har jeg en linje kode, der siger x får terning af x. Den linje kode, tilbagekaldelse, ser sådan ud: x = cube (x); Så hvordan vil dette arbejde? Lad os gå videre og give dig en hvid skærm igen. Jeg vil skrive ned nu værdien af ​​x, der på nuværende tidspunkt sker for at være, lad os sige, 2 for at holde det simpelt. Jeg har skrevet ned på et stykke papir værdien af ​​2, som er min værdi x. Jeg afleverer det til Ken. >> Og jeg bare skrive svaret? >> Ja, lad os bare skrive svaret. Okay. Og nu skal han returnere mig noget. Perfekt. Rart Segue. Så nu han rækker mig tilbage værdien af ​​8 i denne sag, og hvad skal jeg gøre med det? 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 bits i hukommelsen. Men bemærk Jeg er lidt kæmper her. Jeg er lidt forvirret, fordi hvor skal jeg faktisk skrive værdien af ​​x, fordi det, jeg lige har gjort er fysisk hånd Ken et stykke papir, der havde værdien 2, der var x, og ja, det er netop, hvad der skete. Så det viser sig, at når du kalder funktionen, og du passerer på et argument ligesom hej, eller verden, du passerer på et argument som 2, generelt, du passerer på en kopi af dette argument. Og så lige som jeg skrev ned tallet 2 her og rakte det til Ken, det må betyde, 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, husk dette begreb for at bestå i, bogstaveligt talt, 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å har jeg at gøre noget med denne værdi, hvis jeg vil beholde den rundt. Så alt dette vil komme tilbage til at være alt for velkendte inden længe. Tak så meget for denne demo her, Ken. [Bifald] Meget godt klaret. Lad os se, hvordan det i sidste ende drejer sig nogle af den funktion at kalde, at vi har gjort her. Lad mig gå videre og bringe os tilbage til Cubing eksempel her. Bemærk, at hvis vi ønsker at rent faktisk begynder at tage dette yderligere, vi er nødt til at være opmærksomme på det faktum, at antallet x, der bliver vedtaget i her er forskellig fra, hvad der rent faktisk bliver vedtaget i til funktionen. Så igen, denne forbi eksemplar kommer til at blive helt germane på bare et øjeblik. 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 iværksætter en swapping-funktion. 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, 1 per linje. Så på linie 23, hævder jeg, jeg swapping disse værdier, prik, prik, prik. Jeg åbenbart kalder en funktion på linje 24 såkaldte swap, der tager 2 argumenter. Det er helt legit for funktioner at tage 2 argumenter. Vi har set printf gøre det allerede. Så swap tilsyneladende tager x og y, og som navnet antyder, Jeg håber, at det kommer til at bytte disse 2 værdier. Så da jeg hævder på linie 25 "byttes!" og gengiver x og y under den forudsætning, at de rent faktisk er blevet skiftet. Men hvis jeg rent faktisk køre dette program - lad mig åbner et terminal vindue, 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? 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 op her med Ken? Hvorfor er swap brudt? [Studerende] Du lagring til en kopi, ikke variablen. Præcis. Vi lagring til en kopi, ikke variablen selv. Med andre ord tilsyneladende swap tager to argumenter, en int, og det vilkårligt kaldes a og b, og op her Jeg har bestået i x og y, som er henholdsvis 1 og 2, men jeg er ikke bogstaveligt passerer i x, jeg ikke bogstaveligt passerer i y, Jeg passerer en kopi af x og en kopi af y. Det er næsten som om du har kopieret og indsat i swap de værdier, som du ønsker det til rent faktisk at manipulere. Så hvis det er tilfældet, da jeg programstart fuldbyrdende linie 35 og 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? >> [Studerende] 1. [Malan] Det skal bare være 1, højre, fordi x blev vedtaget i som det 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.. Denne kontrast er faktisk temmelig simpelt forklaret. Tænk over det. Ingen af ​​os har mødt den person, der skrev printf, så sikkert, at han eller hun ikke har nogen idé om, hvad vores variable 30 år senere kommer til at hedde. Så der skal være en sondring mellem det, du kalder variable i funktioner, du skriver og hvad du kalder variable i funktioner, du ringer 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 ville i hvert fald 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 det ved en tilfældighed, men de ville 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. Så på dette punkt i historien, linje 37, en er 1, b er 2, og nu vil jeg gå videre til at bytte dem. Først og fremmest, lad mig faktisk gøre dette meget mere simpelt. Jeg ved ikke, hvad disse 3 linjer kode lavede. Lad mig bare gøre dette: b = a, a = b; gjort. Hvorfor er denne brudt, logisk? Det er lidt af den intuitive ting, right? Så Â bliver b og b bliver, men problemet er, at så snart linien 37 udfører, hvad er værdien af ​​en og b? Det samme, 1, fordi du har clobbered, så at sige, du har ændret b svare til et. Så når linje 37 er udført, det er fantastisk, du har nu 2 kopier af nummer 1 indersiden af ​​denne funktion, så så når du siger i linje 38 a = b, du er 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. TFP er et meget almindeligt navn for en midlertidig variabel, og det er en int fordi det skal matche, hvad jeg ønsker at lave en kopi af. Jeg gemmer kopi af en indersiden af ​​tmp, så når linje 37 er udført, værdien af ​​a er - hurtig tilregnelighed kontrol - 1, værdien af ​​b er 2, og værdien af ​​TMP er også 1. Så nu jeg udfører linje 38. Når linie 38 udfører, en antager værdien af ​​b. Og b var 2, så en 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 nogle 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ændrede ved udgangen af ​​programmets udførelse. [Uhørlig student kommentar] >> Vi har ikke returneret noget, så det er sandt. Men det viser sig, at der er lidt af et problem her, fordi hidtil, det 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 er lidt fast her fordi jeg kunne returnere den nye værdi af x eller jeg kunne returnere den nye værdi af y, men jeg vil have begge tilbage. Så tilbage er ikke den enkle løsning her. Men problemet fundamentalt er hvorfor? Hvad har vi egentlig byttes? [Studerende] a og b.. >> 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 3 minutter taler om swap-funktionen og alle 3 af disse 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-løkken, Tilsvarende, hvis du erklære a og b inde i en funktion, du har skrevet, de er kun gyldig indersiden af ​​denne funktion, hvilket betyder, så snart swap sker fuldbyrdende og vi går fra ledning 24 til ledningen 25, er x og y ikke er blevet forandret sig. 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 kun kan returnere 1 værdi, og jeg virkelig ønsker at bytte både x og y på samme tid, så vi bliver nødt til at vende tilbage til dette. Men for nu, indser, at det basalt set stammer fra den kendsgerning, at a og b er kopier og de er i deres egen rækkevidde. 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 af dette, buggy4. Hvad med dette? Dette er en lignende, men enklere problem at se på, før vi tager et stik til at løse det. 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 derefter hævder "Forøgelsen ..." Jeg derefter kalde tilvækst, men derefter 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? Yeah. >> [Uhørlig student svar] >> Præcis. Så x er erklæret naturligvis på linje 18. Det er inde i de vigtigste s krøllede parenteser. Så det enkle svar her er, at mens x eksisterer her, Det eksisterer ikke i linje 32, så dette program rent faktisk vil ikke engang kompilere. Compileren 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 kontortiden og derhjemme. 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 5. Så 1, 2, 3, 4, 5. Det er i virkeligheden, når problemet er. Og også, også huske på, at 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 den øverste én. Så altid jage ned dine fejl fra top down fordi der bare kunne være en daisy chain effekt der foreslår du 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? >> [Studerende] Gør x global. Okay, så vi kan gøre x global. Lad os tage den genvej, jeg advarede om tidligere, men dælen, 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. Dette er en af ​​disse ting, der er gør som jeg siger, ikke som jeg gør, som jeg lige har gjort her, fordi der i almindelighed, vores programmer kommer til at få meget mere interessant og meget længere end dette, og hvis din løsning på livets problemer bare lægge alle de variabler i toppen af ​​din fil, meget hurtigt gør programmerne får forfærdelig vanskelige at håndtere. Det bliver sværere at udtænke nye variabelnavne, bliver det sværere at forstå, hvad variabel der gør hvad, og så i almindelighed, 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 denne form for en fjollet historie, fordi vi bare gøre det - men hvis jeg ikke vidste om det operatør eller jeg fik ikke lov til at ændre det i main selv, hvor ellers kunne jeg gennemføre Ken herovre denne gang ikke til kube, men at forøge? Hvordan ændrer jeg denne ting her? Yeah. [Studerende] Pass i x og derefter vende tilbage [uhørligt] >> Okay, godt. Så hvorfor ikke jeg passere i x og derefter i stedet returnere den, hvorfor kan jeg ikke bare vende tilbage x + 1. 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. Yeah. [Uhørlig student svar] Jeg er nødt til at ændre returtypen af ​​tilvækst fordi det ikke er ugyldig. Void betyder intet bliver tilbage, men det er klart nu er det, så dette forhold skal ændres til - >> [studerende] int. int at være i overensstemmelse med hvad jeg faktisk vender tilbage. Nu noget andet, er stadig buggy her. Yeah. [Uhørlig student svar] >> [Malan] Så jeg er nødt til at forøge x? [Uhørlig student svar] >> [Malan] Ah, så jeg er nødt til at passere x. Så jeg er nødt til at gøre det her. >> [Uhørlig student kommentar] [Malan] Så prototypen, jeg er nødt til at æ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? Det må da være en int noget. Det kunne være x, men helt ærligt, hvis du begynder at kalde alle dine variabler x, Det kommer til at blive mindre og mindre tydelig der er hvad. Så lad os bare vilkårligt vælge en anden navngivningskonvention til min hjælper funktioner, de funktioner, jeg skriver. Vi kalder det en, eller vi kunne kalde det - Lad os kalde det nummer til at være endnu mere eksplicit. Så da jeg er nødt til at vende tilbage uanset antallet er plus 1, og nu har jeg nødt til at ændre 1 anden ting op her og en anden ting op her. Hvad skal jeg ændre på linie 21 først? >> [Uhørlig student svar] [Malan] Jeg er nødt til at tildele den til x. 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 den højre side bliver udført først derefter bliver plopped ind i den venstre ting - x i denne sag. Og så endelig, det er en nem løsning nu. Det skal bare matche, hvad der er dernede, int tal. 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 en 6-line program. Så hvad er der galt på linie 18, 5 tegn? Så jeg er nødt til at erklære dette, int. Lad os se. Der er en hel masse andre fejl. Åh, min Gud - 19, 18, 21 - men igen, lad os bare rydde skærmen, Control L her, og kør Dunk. Så 5 problemer er faktisk bare, at 1. Så lad os nu køre buggy4, Enter. Puha, er x blevet inkrementeret korrekt. Ok. Eventuelle spørgsmål om, hvordan man inkrementere numre? Yeah. [Uhørlig student spørgsmål] >> Godt spørgsmål. Hvordan er det at jeg bare kan ændre x til nummer og programmet vil vide med det samme? Igen, tænk på det som denne abstraktion. Så hvis jeg er hoved-og Ken er tilvækst, helt ærligt, jeg er ligeglad med, hvad Ken kalder sin iPad. Jeg er ligeglad med, hvad han kalder noget, der har at gøre med hans gennemførelsen af ​​denne funktionalitet. Dette er en implementering detalje, at jeg, main, behøver ikke at bekymre sig om. Og så blot at ændre det konsekvent inde i funktion - nummer her og nummer her - er alt det tager så længe jeg kompilere. Det er lidt ligesom hvis du tænker mange af os, dem af jer med kørekort der har drevet 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 ligegyldigt her i dette tilfælde. Samme idé. Yeah. >> [Uhørlig student spørgsmål] Hvis der er 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 i den retning - men du er nødt til at foretage disse ændringer selv. Du er nødt til at være konsekvente. >> [Studerende] Hvis der er flere variabler [uhørlig] En særlig rækkefølge som her, hvis dette var int andet nummer? >> [Studerende] Korrekt. [Malan] Yeah. Bestil tæller, 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. Undskyld. Dette bør ikke være en parentes. Det andet argument linjer op med den anden. Så orden, ja, spørgsmål. Ok. Undskyld. Jeg tog den lange 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 foregår her under hætten, så at sige. Dette er et rektangel, der kan repræsentere computerens hukommelse. Selv hvis du ikke har nogen idé om, hvordan hukommelsen virker, eller hvordan RAM værker, i det mindste forudsætter, at du har klaser af det i disse dage. Du har megabyte det, du har fået gigabytes af det, og vi ved fra uge 0, at en byte er bare hvad? >> [Studerende] 8 bit. 8 bit, right? Således otte nuller og 1. Så hvis din computer har en koncert RAM, 2 gigabyte RAM i disse dage, du har en milliard eller 2 milliarder byte hukommelse eller omkring 8 milliarder eller 16 milliarder bits indersiden af ​​din computer. I modsætning til den lille uldne Willy eksempel er det ikke magnetiske partikler typisk længere. Stadig - i bærbare computere i det mindste - det er solid state-drev, SSD'er, der bare ikke har nogen bevægelige dele. Det hele er elektronisk. Det er alt el-baseret. Så tænk på dette rektangel som blot repræsenterer de 1 eller 2 gigabyte hukommelse, som du har. Så det er en luns af hukommelse. En verden af ​​datalogi har slags partitioneret off bidder af hukommelse til at gøre forskellige ting. For eksempel, hvis dette er computerens RAM som foreslået af rektanglet er, viser det sig, at ved konvention, i toppen af ​​din RAM, så at sige, er generelt hvad der kaldes en tekst segment. Det er de 0'er og 1-taller, at du har kompileret. Så når vi har kigget under hætten på, hvad a.out er, alle disse 0'er og 1-taller, når du kører et program, de 0'er og 1-taller er indlæst fra harddisken ind i noget, der hedder RAM, og i RAM de er sat på toppen. I mellemtiden har du andre ting: initialisere data, uninitialize data. Disse 2 skår af hukommelse refererer til globale variabler, som du ikke ofte bruger 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 derefter 2 vigtige ting, som vil komme tilbage i løbet af semestret, stakken og bunke. Så de fleste af computerens hukommelse er reserveret, når du kører et program for noget, der kaldes stakken og noget, der hedder den bunke. Vi vil ikke tale om den bunke i dag, men vi vil tale om stakken. Stakken er beregnet til at fremmane den visuelle af den spisesal måltid bakker i Mather House eller hvor du tilfældigvis være der, hvor spisesal personale rense dem hver dag, de stak dem op fra gulvet på op, og ligeledes i hukommelsen, er der denne tanken om at sætte noget på en stak, sætte noget på en stak, sætte noget på en stak. Og hvad mener vi med det? 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 goddag - uanset programmet er, at du har skrevet - igen, de 0'er og 1-taller er 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 pc, er det indlæst fra harddisken ind i RAM. Så snart den er indlæst i RAM, 0'er og 1-taller gå på den måde, top, den såkaldte tekstsegment, men derefter så snart dit program faktisk begynder at køre, den vigtigste funktion kaldes, og vigtigste, som vi har set, har ofte lokale variabler, og det har int'er og bånd og specialtegn og lignende. Så hvis dit program, som du har skrevet, eller det program, du dobbelt har klikket brugt nogle variabler i main, ender de i bunden af ​​din stak af hukommelse, så at sige. Mere konkret, hvad det egentlig? Det betyder blot, at hvis vi skulle til at nummerere bytes RAM i din computer, bemærke, at dette kan være byte nummer 0, kan dette være byte nummer 1, 2, 3, 4, 5, 6, helt op til 2000000000 ville være helt oppe i toppen. Så med andre ord, når vi taler om RAM eller hukommelse i form af bytes Det betyder bare, at nogen har besluttet, hvad der skal nummerere hver 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? Begrebsmæssigt de bare ender i bunden af ​​denne ting kaldet stakken. Men hvad er interessant nu, er, når main kalder en funktion - antage en funktion kaldet foo, bare et vilkårligt navn - hvad der sker, er vigtigste 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 opgaver kræver funktioner og da disse opgaver kræver 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 et bevidst 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 vil 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, ugyldige kor, og vi vil sige int i, og så vil jeg sige printf - nej, lad os gøre det mere interessant. Lad os faktisk ikke udskrive noget som helst. Lad os bare gøre dette: omkvæd (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 den grundlæggende fejl. Vigtigste opkald kor til at synge nogle kor, så jeg gjorde noget dumt, og jeg havde chorus opkald kor fordi jeg overtog en anden ville gennemføre det måske, og nu dette kommer ikke 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. Anvendelse af sort identifikator i. Åh, det var dumt. Vi har ikke brug for argumentet. Lad os bare gøre det. Jeg ville ønske, vi havde startet på denne måde. Det ville have været et meget lettere program til at skrive. Der. Lad os nu gå over til min terminal vindue, kør 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. Lad mig sige printf ("Jeg er herinde") - ingen variabler. Vi vil overlade det sådan. Lad mig køre gøre. Lad mig køre kor. Og ... kommer på. Hold ud. Som en sidebemærkning, hvorfor har det ikke styrtede ned endnu? Segmenteringen fejl skete super hurtigt før. [Uhørlig student svar] >> Præcis. Så det tager tid at udskrive, ikke? 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? Hvis du tænker over, hvordan din computers hukommelse er lagt ud, Dette sker for at være vigtigste, 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 i sidste ende, hvad der vil ske? Hvis det store billede, bogstaveligt talt, er dette, hvad der lige sker konceptuelt? Stakken overskridelser heapen. Eller værre, du bare overrendt alt, herunder tekst-segmentet, som er den 0'er og 1-taller, der repræsenterer dit program. Kort sagt, er det bare super, super dårlig. Dit program har spiraled ud af kontrol. Du bruger måde mere hukommelse end du havde tænkt dig alt på grund af en dum fejl i dette tilfælde, eller i dette tilfælde en meget bevidst gjort funktion kalder sig. Nu, dette er ikke alle dårlige. Funktioner, der kaldte sig faktisk har stor magt, når du bruger det rigtigt. 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? Hvad der i virkeligheden sker? Når jeg kalder tilvækst funktion som vi gjorde i disse eksempler, Jeg har en værdi som 1, at jeg passerer i. Jeg passere i en kopi af nummer 1, så sker der følgende. Lad os gå ind i tilvækst eksempel, denne fyr lige herovre. Her er hvad der rent faktisk sker. Når jeg kalder tilvækst og jeg passere i x, billedligt, hvad der foregår her, er dette. Hvis jeg har værdien 1 gemmes her, og jeg rent faktisk kalder tilvækst, som nu kaldes kor - iPad er at smide mig af her. Lad os kalde dette interval, og vi ved ikke, hvad det næste funktion bliver. 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 en kopi af 1. Når jeg tilvækst denne værdi, det bliver 2, men hvad sker der, så snart tilvækst vender tilbage? Denne hukommelse bare bliver givet tilbage til operativsystemet, hvilket betyder, alt hvad du har gjort, er noget nyttigt. Den 1, der oprindeligt var indeholdt i main er stadig faktisk er der. Så hvor skal vi hen med dette? Det viser sig, at der i hukommelsen du har denne back-to-back sekvens af bytes som du kan sætte ting i, og det viser sig, at vi allerede har set noget der indebærer at sætte ting tilbage til back to back to back. Hvad er en streng baseret på uge 1 og nu uge 2? Det er bare en samling af tegn. Så det viser sig, lige som du kan sætte tal i hukommelsen, ligeledes kan du sætte tegn i hukommelsen. Og når vi begynder at sætte tegn i hukommelsen tilbage til tilbage til ryg mod ryg, viser det sig, at bruge den enkleste af ting som en for-løkke eller en while-løkke, vi kan gentage fra venstre til højre over de tegn i en streng og begynder at massere dem i forskellige figurer helt - a kan blive b, kunne b blive c - så der i sidste ende kan vi tage en engelsk sætning, der rent faktisk giver mening og konvertere hvert af disse skrivelser en ad gangen ved at gå gennem vores computers hukommelse venstre mod højre til rent 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. Før vi dykke ned i nogle krypto og disse ting kaldet 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. Vi har lige talt om returværdier, vi talte om argumenter, og vi talte om dette begreb, som vi vil vende tilbage til i de kommende uger, at betragte hukommelse som en hel bunke af disse stablede bakker, så at sige, fra bunden på op, således at hver bakke, der bliver sat på stakken repræsenterer en funktion, der er ved at blive kaldt. Eventuelle spørgsmål? 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. Den omstændighed, at tilvækst har åben parentes, int antal, lukket parentes - hvad betyder int tal repræsenterer? [Studerende] Et argument. >> Et argument. Okay. Men hvad er et argument? [Uhørlig student svar] >> Hvad er det? >> [Studerende] Noget, som du passerer i. Okay, så noget, du passerer i. Og mere generelt, det er bare input. Hvis du skrev 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 for at det skal ske ville virkelig synes at være at give det 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 udelukkende 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 er det, for en stor del, så det ved, hvor mange bits tildele for den pågældende variabel fordi det kunne være 6 - undskyld, det vil ikke være 6. Det kan være 16, kan det være 8, kan det være 32, endog 64, men computeren skal vide. Nu int på venstre side repræsenterer, hvad der derimod? [Uhørlig student svar] >> Hvad er det? >> [Student] Type af funktion. Typen af ​​en funktion, og mere specifikt den type af produktionen. Right. Så mens ting i parentes repræsenterer sit input eventuelle de ting til venstre repræsenterer dens output. Og i dette tilfælde, tilvækst tilsyneladende returnerer en int, og så int er returtypen af ​​denne funktion. Hvad betyder det at vende tilbage? Bogstaveligt, du bruger søgeordet afkast og derefter, hvis det, du vender tilbage til højre for nøgleordet er et helt tal, 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. Naturligvis er det ikke et helt tal. Så kort sagt, at byrden er virkelig på os, programmøren, at være specifik om, hvad vi vender tilbage og derefter faktisk gå om tilbagesendelse. Konteksten her nu, er, at din computers hukommelse er en gigabyte, 2 GB - 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 har vi bare begynde at fortælle historien, men vi vil vende tilbage til denne over tid. For nu, er det eneste stykke af hukommelse vi virkelig bekymrer sig om tekstsegment fordi det bare repræsenterer den 0'er og 1-taller, at Dunk har udsendt. Så når du kører en kommando på tastaturet ligesom a.out eller du dobbeltklikke på et ikon på Mac OS eller Windows, Deres program er indlæst fra harddisken til RAM og det er plopped øverst på computerens RAM, så at sige. I mellemtiden, som dit program starter, og main bliver kaldt i det program, du skrev, eller det program Microsoft eller Apple skrev, nogen af ​​sine lokale variable ender dernede på bunden af ​​computerens hukommelse. Men hvis de vigtigste opkald anden funktion, selv har variable eller argumenter, ender de op over det. Og hvis denne funktion kalder noget, de ender op over det, over det, over den. Og kun en gang en funktion er færdig fuldbyrdende ikke stakken af ​​bakker, så at sige, begynder at blive lavere og lavere. Og det er det da, i en nøddeskal, forklarer hvorfor, når du ringer terning eller du kalder tilvækst, du passerer på en kopi af værdien. Og hvad det betyder billedligt er, at du bogstaveligt talt er ved at skrive tallet 1 i en anden del af hukommelsen, ændring, at 1-2 for inkrement eller til en 8 for terningen og kaster denne hukommelse væk så snart tilvækst eller kubefunktion afkast. Spørgsmål. [Studerende] Hvor globale variabler opbevaret? Globale variabler gemmes i, hvad der i øjeblikket hedder de initialiserede data eller startværdi data, idet forskellen er, hvis du har en global variabel, og du tildeler det straks en værdi med lighedstegnet, det ender øverst dér, og hvis du bare siger int x; med nogen værdi, det ender lidt lavere i RAM blot ved konvention. Andre spørgsmål? Ok. Så dette billede vil komme tilbage, når vi får mere kraftfuld med hvad vi kan gøre med computeren, men for nu, lad os få en kort intro til kryptografi, en bestemt type kryptering, der 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. Secret-key kryptografi, som navnet antyder, får sin sikkerhed fra en hemmelighed. For eksempel, hvis du var tilbage i folkeskolen og gik forbi en lille hemmelighed kærlighedsbrev til dreng eller pige du var knusning på, hvis du ønsker at passere dette notat gennem publikum, du sandsynligvis ikke ville skrive sådan en note på engelsk eller hvad dit modersmål er. I stedet kan du 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 simpel algoritme, ung selvom du måske være, at bare forvrænge ordene. Så i stedet for at skrive en du måske skrive b, i stedet for b du måske skrive c, stedet for c man kan 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 behov for at vide noget, hvilket er, hvad selvfølgelig? >> [Studerende] Hvad du sender. Hvad din hemmelighed er, ligesom hvad er det mapping mellem en A'er og B'er og C'er og D's. Er det bare lægge 1 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 oplysninger, men der er lidt af en catch-22 her. Hvis det er allerførste gang du sender denne kærlighed brev gennem klassen, hvordan er den dreng eller pige går at vide, hvad hemmeligheden selv er? Så hemmelig-nøgle krypto ikke løse alle verdens problemer, og der er faktisk en sammenhæng her, at vi vil komme tilbage til hen imod semesters afslutning. Ligeledes gør de fleste af os ikke kender nogen, der virker for eksempel på Amazon.com, og alligevel mange af os har sikkert købt ting på Amazon.com, og vi har lært at antage, at disse e-handelstransaktioner er sikre. Den URL sandsynligvis siger https, er der måske en fjollet lille hængelås-ikonet et eller andet sted, der er en slags kryptering sikre dine kreditkortoplysninger mellem dig og Amazon.com. Og dog, hvis kryptografi indebærer at kende nogle hemmelige og alligevel har jeg ikke kender nogen på Amazon, og jeg har bestemt ikke arrangeret nogen form for hemmelig med nogen på Amazon, er, hvordan min computer eller min browser at gøre dette? Det viser sig, at der er andre former for kryptering helt at løse dette problem. Men i dag vil vi fokusere på den enkel hvor du kan arrangere på forhånd at kende nogle hemmelige som en eller nogle mapping mellem en A'er og B'er. 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 en bliver b, b bliver c - og så du ender op med ciphertext. I mellemtiden, når din knuse modtager denne hemmelige note, han eller hun har derefter dekryptere den ved generelt at vende en sådan algoritme så at komme tilbage almindelig tekst. Der er fysiske inkarnationer af dette. For eksempel er det en lille hemmelighed dekoder ring, og dette 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ådan, at med denne ring du kan slags vende udefra, men ikke inde for at line op numre med bogstaver. Fra en film kaldet A Christmas Story, vil du se, at lille Ralphie var så ivrig efter at finde ud af, hvad Little Orphan Annie hemmelige budskab var til ham der var blevet meddelt, tror jeg, i form af numeriske meddelelser på en korn kasse og du havde at akkumulere alle de små kort, der kom i korn box, De var nødt til at sende dem ind, skulle du komme tilbage den hemmelige dekoder ring så du endelig kan finde ud af hvad den kortlægning er mellem bogstaver og tal eller bogstaver og bogstaver. Hvordan i en computer kan vi gå om gennemførelsen eller repræsenterer ting som dette? 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 chars, 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 strygere, men vi lover, at dette er egentlig bare en forenkling i CS50 biblioteket 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 er tilgængelige, som sædvanlig, online - kaldet array.c at løse et problem relateret til strenge, men det tegner et billede her om, hvordan vi kunne bruge noget, der hedder et array. Et array er en datatype. Det er en type variabel slags, der har flere mindre datatyper inde i det tilbage til tilbage til back to back. Altså for eksempel, hvis vi ønskede at skrive et lille program, der giver dig din quiz gennemsnit for et kursus som 50, der har 2 quizzer, du kunne meget nemt skrive dette program baseret selv 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 beder brugeren om 2 quiz scorer og derefter beregner deres gennemsnit ved at tilsætte dem sammen, dividere med 2 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 3 quizzer eller 4. Antag, at du ønskede at bruge det samme program for en klasse, der havde ugentligt quizzer. Tænk en klasse, der har ugentlig quizzer. Hvis der er 16 eller deromkring uger i et semester, nu du har 16 variabler: int quiz1, int quiz2, int quiz3, int quiz4. Så snart du begynder at se denne redundans, det kopiere og indsætte af kode, det skulle begynde at gøre dig ønske der var en bedre måde. Og heldigvis, på grund af arrays, der er. 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 store bogstaver bare så, at det virkelig skiller sig ud i din kode, og det særlige søgeord, som du bruger i C # define. Så vi siger # define, så en plads, så det ord, du vil bruge til den konstante navn og derefter værdien af ​​konstanten. Bemærk dette er forskelligt fra tildeling af noget til en variabel. Der er ingen lighedstegnet, der er ingen semikolon. Dette er hvad der normalt betegnes som en præprocessor direktiv, men mere om det en anden gang. For nu, skaber dette en uforanderlig værdi kaldet quizzer hvis faktiske numeriske værdi er 2. Så uanset hvor du ser quizzer, quizzer, quizzer hele denne fil, det er bare et 2-tal. Hvis jeg ser på main nu, lad os se hvordan det virker. Først det ser lidt kryptisk, men det er alle ting fra uge 1. Spørg brugeren om kvaliteter. Hvordan gør vi det? I tråd 22 - dette er virkelig den saftige del - Jeg erklærer en float men ikke bare en enkelt svømmer. Jeg erklærer, snarere en række floating-point væ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 bøjle og derefter en række - varsel, hvis dette er en konstant dette er ligesom vi gjorde dette - Det betyder, "Hey computer, giv mig 2 flåd og lad os kollektivt kalde dem kvaliteter." Dette er i modsætning til en langt mere kedelig proces som denne: float Grade1; flyde grade2, og så videre. Så et array giver os mulighed for at gennemføre denne idé, men langt mindre messily, på en sådan måde, at vi kan skrive 1 linje kode i stedet for, siger, 16 for en 16-ugers semester. Jeg ønskede ikke at hard-code 2, fordi hvis du tænker over det nu logisk, Antag næste år CS50 ændringer 3 quiz'er stedet og jeg havde nummer 2 her, havde jeg nummer 2 her, Jeg havde nummer 2 her, tallet 2 her. Det bliver meget trættende og meget let at skrue op og ved et uheld ændre 1 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 som navnet antyder, forandrer sig aldrig. Og nu uanset om vi har forskellige quizzer i år eller næste, Jeg bare nødt til at ændre det på ét sted heroppe på toppen. Så det hele er en 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 #% d af% d:") fordi jeg bare ønsker at udskrive give mig quiz nummer 1 af 2 og derefter 2 af 2. Så dette er en rent æstetisk ting. Men det interessante del nu er på linje 27. For at udfylde en af ​​de to pladsholdere med et floating-point værdi, du igen bruge kantede parenteser. I dette tilfælde, jeg bruger i, fordi det for-løkke er begyndt med i svarende hvilken værdi, tilsyneladende? [Studerende] 0. >> [Malan] 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, det er varierende sin værdi på hver iteration, så jeg udfylde dette array ét sted ad gangen. Hvad betyder dette array ud? Grunden til at jeg trak den super simple 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 hukommelse og så videre. Så hvis min array er af størrelse 2 i dette tilfælde her, alt jeg ville gøre ved at skrive i min quiz scoringer gerne 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 computeren for en bred vifte af størrelse 2. Disse pladser er der stadig, ikke? Du har stadig 2 GB RAM, selvom du kun beder om 2 flåd. 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 luns af hukommelsen indeni, som du kan sætte ting. 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 den runde funktion her til faktisk at gøre det beløb 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 printe 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. Tilgiv 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 passerer det en streng, Det fortæller dig, hvor mange tegn er i denne streng. Det er alt. Og det faktum, at det er strlen stedet for streng længde er bare fordi det er mere kortfattet. Tredive å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. I linie 24, siger jeg, "Computer, giv mig et tegn, 8 bit, og kalder det c". Men hvad er dette på højre side siger? På engelsk, hvad det repræsenterer? [Studerende] Det første tegn i sættet. Præcis. Giv mig det første tegn i sættet. Eller mere generelt, giv mig den 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 det skøn nu at begynde at gøre dette. Nu har du til at opføre sig i overensstemmelse med computerens forventninger og tælle fra 0 fordi [0] vil være det første tegn i en streng, [1] bliver det andet, [2], bliver den tredje og så videre. Så dette program, hvis jeg kompilere det, det er igen streng1, så gør streng1, og nu har jeg kørt streng1 i min terminal vindue. Det venter på input, så jeg har tænkt mig at skrive i David, Enter, og nu er det udskriver David alle på forskellige linjer, fordi varsel hvad jeg gør. Jeg udskriver et tegn ad gangen. Vi vil ikke gå i detaljer i dag på dette, men jeg slettede for et øjeblik siden denne kontrol her. Det viser sig, at hvis brugeren er uartig, kontradiktion, eller bare forvirret, du kan faktisk undgå at give en streng af en vis længde. Hvis du rammer en forkert tast på tastaturet, kan du give nogen snor på alle, eller hvis du er skadeligt, kan du prøve at indsætte en gigabyte værd af et essay til at udfylde denne streng, og hvis computeren løber tør for hukommelse, Det viser sig, at vi vil komme tilbage denne særlige værdi kaldet NULL. Så for nu, ved bare at der er denne særlige værdi kaldet NULL der vil tillade os 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. Hvad er anderledes ved for-løkken denne gang? Jeg kan gå tilbage til det foregående eksempel. Så det er version 2, det er version 1. 1, 2. 1, 2. Det strlen opkald er hvor? Det er i den første del af for-løkken. Nogen tanker om, hvorfor jeg gør det? Yeah. [Studerende] Så du behøver ikke kalde funktionen hver eneste gang. [Malan] Så vi ikke kalde funktionen hver eneste gang. Præcis. Genopkald fra efter sløjfer, at de er super simpelt når du slags forstå, at dette er initialiseringen, tilstanden, og opdateringen. Problemet er, at betingelsen sker på hver iteration af sløjfen. Og så i dette eksempel her, er hvad dårligt om det faktum, at dette er min tilstand? [Studerende] Kalder du strlen. [Malan] Kalder du strlen igen og igen og igen. Men når jeg har indtastet i David, længden af ​​denne streng er 5, og det kommer ikke til at ændre sig på hver iteration af løkken fordi strengen stadig D-a-v-i-d. Så dette er en antydning af, hvad der kommer til at blive et stadigt vigtigere idé kendt som et design afgørelse, når bare ikke gøre computeren gøre unødvendigt arbejde. Ligesom et smugkig på pset2, pset2 i standard udgave vil 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 som den Ralphie der afkodes. I hacker udgave af pset2, 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 adgangskoder og finde ud af hvad kryptering eller hvad hemmelighed blev brugt til rent faktisk at generere disse passwords. Og vi vil gøre dette ved hjælp af en ny funktion her for C jeg vil give dig bare en demo af kendt som kommandolinjeargumenter. 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 at 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 startende med Pset 2 er 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 indtastet ved prompten er ved at ændre main starter i denne weekend fra int main (void) til int main (argc, argv) og vil således 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, der 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. [CS50.TV]