1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [Week 2, Vervolg] 2 00:00:02,270 --> 00:00:04,220 [David J. Malan, Harvard University] 3 00:00:04,220 --> 00:00:06,880 [Dit is CS50. - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 Oke. Dit is CS50, en dit is het einde van week 2. 5 00:00:10,990 --> 00:00:14,410 Als u verwacht dat honger rond deze tijd morgen, 6 00:00:14,410 --> 00:00:18,620 weten dat we gaan roepen als een kleine groep morgen, donderdag, 1:15 pm. 7 00:00:18,620 --> 00:00:21,360 Er is deze URL hier als u wilt RSVP. 8 00:00:21,360 --> 00:00:26,740 Ruimte is beperkt, dus vergeef, indien de formulieren opgevuld door de tijd dat je dit invullen. 9 00:00:26,740 --> 00:00:29,300 Een andere URL, echter dat interessant kunnen zijn is dit. 10 00:00:29,300 --> 00:00:32,369 In slechts een maand tijd, is de cursus zal ter beschikking worden gesteld 11 00:00:32,369 --> 00:00:36,890 de ruimer via EDX, via welke hebben op het Internet kunnen volgen zul 12 00:00:36,890 --> 00:00:39,380 deelnemen aan de cursus heel actief, in feite. 13 00:00:39,380 --> 00:00:42,270 Ze zullen gebruik maken van de CS50 Appliance en CS50 Bespreek 14 00:00:42,270 --> 00:00:45,490 en de meeste van de verschillende software tools die we al zijn dit semester gebruikt. 15 00:00:45,490 --> 00:00:48,710 En een van de initiatieven die we graag op te nemen als een experiment dit jaar 16 00:00:48,710 --> 00:00:51,930 is om te zien hoeveel inhoud die we kunnen vertalen 17 00:00:51,930 --> 00:00:53,960 in andere gesproken en geschreven taal. 18 00:00:53,960 --> 00:00:57,500 Dus als je zou er belang bij hebben deel te nemen aan dit project 19 00:00:57,500 --> 00:01:02,270 waarbij we zullen Engels transcripties en ondertiteling voor lezingen van de cursus 20 00:01:02,270 --> 00:01:05,450 en korte broeken en seminars en profielen en dergelijke, 21 00:01:05,450 --> 00:01:08,200 als je spreekt vloeiend of schrijven vloeiend een andere taal, 22 00:01:08,200 --> 00:01:12,290 we u graag deelnemen aan dit project, waarbij je op een of meer van de video's, 23 00:01:12,290 --> 00:01:15,200 vertalen in een taal die je redelijk goed kent. 24 00:01:15,200 --> 00:01:18,700 >> Om u een idee van de interface, er is een web-based user interface 25 00:01:18,700 --> 00:01:22,090 dat we gebruiken die in wezen een UI als deze maken. 26 00:01:22,090 --> 00:01:24,290 Dit werd mij leren wat Halloween geleden, 27 00:01:24,290 --> 00:01:27,390 en de rechter zijde in zwart naast deze tijdstempels 28 00:01:27,390 --> 00:01:31,210 zie je de verschillende dingen die kwam uit mijn mond die dag, 29 00:01:31,210 --> 00:01:34,850 en dan eronder zul je in staat om te vertalen naar een andere taal 30 00:01:34,850 --> 00:01:38,690 wat de mapping tussen, in dit geval Engels en bijvoorbeeld Spaans. 31 00:01:38,690 --> 00:01:40,440 Dus het is eigenlijk een zeer gebruiksvriendelijk hulpmiddel. 32 00:01:40,440 --> 00:01:43,370 U kunt terugspoelen en vooruitspoelen zeer gemakkelijk met behulp van sneltoetsen. 33 00:01:43,370 --> 00:01:47,490 Dus als je wilt deelnemen aan dit experiment en hebben uw woorden gezien en gelezen 34 00:01:47,490 --> 00:01:51,850 door potentieel duizenden mensen die er zijn, ik aarzel dan niet om deel te nemen. 35 00:01:51,850 --> 00:01:54,350 Een woord over het kitten van maandag. 36 00:01:54,350 --> 00:02:00,350 Opdat wij niet hebt een overdreven enge bericht, doen beseffen dat, als kantooruren suggereren 37 00:02:00,350 --> 00:02:03,300 en als secties stellen, het ontwerp van de natuurlijk zeer 38 00:02:03,300 --> 00:02:07,360 aan studenten hebben samen te werken en te praten om te werken door middel van probleem sets 39 00:02:07,360 --> 00:02:11,260 en problemen bij elkaar, en echt de lijn net komt neer op, 40 00:02:11,260 --> 00:02:16,010 nogmaals, moet het werk dat je uiteindelijk in te dienen worden uw eigen. 41 00:02:16,010 --> 00:02:18,860 En dus eerlijk gezegd, in kantooruren is het heel normaal, 42 00:02:18,860 --> 00:02:22,240 Het is totaal nog te verwachten, te chatten met een aantal vrienden naast je. 43 00:02:22,240 --> 00:02:24,370 >> Als hij of zij kampt met een bepaald onderwerp en je net als, 44 00:02:24,370 --> 00:02:27,940 "Oh, nou, laat me je een glimp van enkele lijn van code die ik schreef:" dat is prima, 45 00:02:27,940 --> 00:02:31,250 dat gebeurt, en dat is heel erg bevorderlijk, denk ik, met het proces van leren. 46 00:02:31,250 --> 00:02:36,750 Wanneer de lijn wordt overschreden is wanneer het hoofd is een soort van gekanteld hier voor veel te veel seconden 47 00:02:36,750 --> 00:02:41,160 of minuten voor die echt te zijn geweest op een deblokkering kans voor je vriend, 48 00:02:41,160 --> 00:02:44,160 en zeker wanneer dingen krijgen uitgewisseld via e-mail en Dropbox en dergelijke, 49 00:02:44,160 --> 00:02:45,640 ook daar is de lijn. 50 00:02:45,640 --> 00:02:48,620 Dus met alle middelen zich gerust voelen en zich aangemoedigd voelen om te chatten met vrienden 51 00:02:48,620 --> 00:02:52,810 en klasgenoten over psets en meer en gewoon beseffen dat wat je uiteindelijk in te dienen 52 00:02:52,810 --> 00:02:57,340 moet echt het product van uw creatie en niet iemand anders. 53 00:02:57,340 --> 00:03:00,490 En dus een van de domein-specifieke problemen voor pset2, 54 00:03:00,490 --> 00:03:04,740 die zal komen laat morgenavond, is om te duiken in de wereld van de cryptografie, 55 00:03:04,740 --> 00:03:08,970 dat is de kunst van het versleutelen of scrambling informatie, 56 00:03:08,970 --> 00:03:12,600 en dit gaat uiteindelijk om de wereld van de beveiliging. 57 00:03:12,600 --> 00:03:16,560 Nu, de veiligheid voor de meesten van ons komt in de vorm van vrij alledaagse mechanismen. 58 00:03:16,560 --> 00:03:19,050 Ieder van ons heeft gebruikersnamen en wachtwoorden, 59 00:03:19,050 --> 00:03:23,450 en ieder van ons hebben een zeer slechte gebruikersnamen en wachtwoorden, het meest waarschijnlijk. 60 00:03:23,450 --> 00:03:28,240 >> Als uw wachtwoord is hetzelfde op meerdere websites, dat is waarschijnlijk niet het beste idee, 61 00:03:28,240 --> 00:03:30,070 zoals we zullen bespreken in de richting van het einde semester. 62 00:03:30,070 --> 00:03:34,720 Als uw wachtwoord is geschreven op een notitie - geen grap - op uw monitor, 63 00:03:34,720 --> 00:03:38,350 dat is ook niet per se de beste ontwerp, maar een veel voorkomend fenomeen. 64 00:03:38,350 --> 00:03:42,470 En als je geen gebruik maakt cryptografie om wachtwoorden te versleutelen, 65 00:03:42,470 --> 00:03:44,210 ze zijn bijzonder kwetsbaar. 66 00:03:44,210 --> 00:03:47,270 Dus als je denkt dat je super slim zijn door het hebben van een verborgen Word-document 67 00:03:47,270 --> 00:03:49,910 ergens op uw harde schijf die is al uw wachtwoorden 68 00:03:49,910 --> 00:03:53,670 maar het is in een map die niemand gaat kijken in, dat niet al te is een zeer veilige mechanisme. 69 00:03:53,670 --> 00:03:56,990 En dus wat pset2 introduceert is deze kunst van cryptografie 70 00:03:56,990 --> 00:04:02,010 en klauteren gegevens, zodat zaken als wachtwoorden zijn des te veiliger. 71 00:04:02,010 --> 00:04:05,790 De context is hier dat met onzekere gegevens 72 00:04:05,790 --> 00:04:07,930 komt een mogelijkheid om het te versleutelen en te klauteren het. 73 00:04:07,930 --> 00:04:11,470 En dus bijvoorbeeld, is een voorbeeld van een gecodeerd bericht. 74 00:04:11,470 --> 00:04:14,700 Dit zegt eigenlijk iets in het Engels, maar het is duidelijk niet geheel duidelijk. 75 00:04:14,700 --> 00:04:18,279 En we zullen de cirkel rond vandaag te plagen elkaar wat deze geheime boodschap hier is. 76 00:04:18,279 --> 00:04:23,490 Maar in de echte wereld van computers, de dingen niet eens op dat ze misschien wel Engels zinnen. 77 00:04:23,490 --> 00:04:28,430 Zo, dit is wat je zou kunnen vinden op een standaard Linux of Mac of UNIX-computer 78 00:04:28,430 --> 00:04:32,070 in een bestand dat was eens een tijd genaamd het wachtwoord bestand. 79 00:04:32,070 --> 00:04:34,200 >> Tegenwoordig is al verplaatst naar andere plaatsen. 80 00:04:34,200 --> 00:04:39,210 Maar als je kijkt op de juiste plaats op een systeem, ziet u niet alleen uw gebruikersnaam 81 00:04:39,210 --> 00:04:43,400 of die van andere mensen op het systeem, maar je zult een versleutelde versie van hun wachtwoord te zien. 82 00:04:43,400 --> 00:04:47,980 Inderdaad, het woord crypte is er dat de volgende dingen gecodeerd is, 83 00:04:47,980 --> 00:04:52,680 en deze reeks van schijnbaar willekeurige letters en tekens en cijfers, enzovoort 84 00:04:52,680 --> 00:04:56,480 kunnen worden gedecodeerd alleen door het algemeen kennis van enkele geheime - 85 00:04:56,480 --> 00:04:58,840 een geheim woord, een geheim nummer - 86 00:04:58,840 --> 00:05:03,160 en zo ja, om de kunst van cryptografie uiteindelijk neer vertrouwen van een soort 87 00:05:03,160 --> 00:05:05,650 en weten iets dat iemand anders niet doet. 88 00:05:05,650 --> 00:05:10,090 Dus we zullen het verkennen van deze in een beetje meer detail nu en in de PSET te komen. 89 00:05:10,090 --> 00:05:12,200 En nu een woord over de pass / fail. 90 00:05:12,200 --> 00:05:15,360 Vooral omdat sommige van jullie hebben gedoken in pset1, de Appliance, 91 00:05:15,360 --> 00:05:19,080 en een heel nieuwe wereld voor jezelf, beseffen dat frustraties en verwarring 92 00:05:19,080 --> 00:05:21,700 en op technische problemen zijn zeer te verwachten 93 00:05:21,700 --> 00:05:24,180 vooral met de eerste PSET, waar er net zo veel nieuwe, 94 00:05:24,180 --> 00:05:27,730 gewoon kennis te maken met ls en cd en al deze geheimzinnige commando's 95 00:05:27,730 --> 00:05:33,050 en een nieuwe omgeving, en dat is los van de feitelijke materiaal en het programmeren zelf. 96 00:05:33,050 --> 00:05:36,940 Zo ook beseffen dat er zeker kantooruren die bestaan ​​als een ondersteunende structuur. 97 00:05:36,940 --> 00:05:38,880 >> Secties beginnen komende zondag. 98 00:05:38,880 --> 00:05:42,960 Maar het belangrijkste is, als je je voelt gewoon dat dit niet de wereld voor u, 99 00:05:42,960 --> 00:05:44,710 beseffen dat het echt gewoon niet de tijd te nemen. 100 00:05:44,710 --> 00:05:48,600 En ware het niet voor deze gelegenheid jaren geleden voor mij van het nemen van een klasse pass / fail, 101 00:05:48,600 --> 00:05:50,990 eerlijk gezegd, ik zou nooit hebben zelfs een voet in de klas. 102 00:05:50,990 --> 00:05:53,690 En u kunt dit veranderen tot, laten we zeggen, de vijfde maandag van de cursus, 103 00:05:53,690 --> 00:05:58,280 dus als je aan de rand nu realiseren dat in plaats van het hoofd in een aantal andere wateren in totaal, 104 00:05:58,280 --> 00:06:01,260 er zeker overwegen alleen het veranderen van tot pass / fail. 105 00:06:01,260 --> 00:06:04,570 Nogmaals, er is niet echt deze cultuur hier op Harvard van het nemen van dingen pass / fail 106 00:06:04,570 --> 00:06:08,670 omdat iedereen echt wil bereiken of overtreffen, 107 00:06:08,670 --> 00:06:11,130 maar eerlijk gezegd, dit is een prachtige manier om te proberen iets uit 108 00:06:11,130 --> 00:06:16,720 die misschien niet bekend voor, en je zult uiteindelijk doen, in de meeste gevallen, heel fijn, 109 00:06:16,720 --> 00:06:18,210 misschien wel veel tot uw verbazing. 110 00:06:18,210 --> 00:06:20,980 En in meer concrete termen, wat ik denk pass / fail over het algemeen doet, 111 00:06:20,980 --> 00:06:22,940 vooral omdat je misschien al hebt ervaren met pset0, 112 00:06:22,940 --> 00:06:26,560 als je in 10 uur, 15 uur, 25 uur in sommige PSET 113 00:06:26,560 --> 00:06:29,920 en je bent gewoon bonzen je hoofd tegen de muur en het is al super laat op de avond 114 00:06:29,920 --> 00:06:33,950 maar je hebt genomen de PSET 90% van de weg en je kan het gewoon niet begrijpen een ding, 115 00:06:33,950 --> 00:06:36,520 pass / fail echt neemt de rand af van een klasse als deze, 116 00:06:36,520 --> 00:06:39,100 waar u kunt sorteren van gelukkig zeggen: "Oke, ik weet dat het niet perfect is, 117 00:06:39,100 --> 00:06:42,350 maar ik werkte mijn kont af op dit, ik ben best tevreden met waar het uiteindelijk, " 118 00:06:42,350 --> 00:06:44,850 en dat zal voldoen aan de verwachtingen voor pass / fail. 119 00:06:44,850 --> 00:06:47,540 Dus hou dat in gedachten. Oke. 120 00:06:47,540 --> 00:06:50,520 >> Dus degenen onder u die hebben lang naar de Harvard University Wi-Fi te gebruiken, 121 00:06:50,520 --> 00:06:54,780 weten dat er een CS50 SSID, een Wi-Fi-verbinding, rondzweven 122 00:06:54,780 --> 00:06:56,490 die u zou kunnen hebben meer geluk voor. 123 00:06:56,490 --> 00:07:00,130 Het is een beetje ironisch dat het wachtwoord voor dit, als je zou willen proberen het aansluiten van dit 124 00:07:00,130 --> 00:07:08,350 voor een betere snelheden - en laat ons weten of het niet beter - is 12345, de hele weg tot 8 125 00:07:08,350 --> 00:07:10,910 omdat 8 is veiliger dan 5. 126 00:07:10,910 --> 00:07:16,910 Dus als u de Wi-Fi-wachtwoord, verbinding te maken met CS50 draadloze hier, 12345678, 127 00:07:16,910 --> 00:07:20,380 en post op CS50 Bespreek als u nog intermitterende problemen met de verbinding, 128 00:07:20,380 --> 00:07:25,420 en we laten de bevoegdheden die worden weet voor deze ruimte. Oke. 129 00:07:25,420 --> 00:07:32,230 Dus een snelle teaser, vooral voor degenen onder jullie die fan jongens of meisjes van alle dingen Apple. 130 00:07:32,230 --> 00:07:37,460 Wat ik opgegraven van een paar jaar terug was dit bestand hier, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 alleen maar om soort van te maken concreter en meer complexe 132 00:07:39,930 --> 00:07:42,560 een aantal van de meer fundamentele C-programma's die we hebben geschreven. 133 00:07:42,560 --> 00:07:46,910 Dus ik opende dit bestand, iUnlock.c. Het is beschikbaar op de pagina Lezingen voor vandaag. 134 00:07:46,910 --> 00:07:49,810 Aan de linkerkant zie je een lange lijst van functies. 135 00:07:49,810 --> 00:07:53,230 Dus de man die dit schreef schreef een hoop functies, meer dan alleen de belangrijkste. 136 00:07:53,230 --> 00:07:57,340 Hij gebruikte een hele hoop van bibliotheken hier, en als we beginnen scrollen door, 137 00:07:57,340 --> 00:08:04,890 wat dit eigenlijk is, is de eerste, geloof ik, crack voor de originele iPhone. 138 00:08:04,890 --> 00:08:09,830 >> Als je wilde de originele iPhone jailbreak, wat betekent untether het van AT & T 139 00:08:09,830 --> 00:08:13,710 en effectief te installeren speciale software op en dingen doen die Apple niet wil dat mensen doen, 140 00:08:13,710 --> 00:08:18,480 iemand nam de tijd om erachter te komen hoe ze konden softwarefouten te exploiteren, 141 00:08:18,480 --> 00:08:22,690 - iUnlock.c-fouten, bugs, in Apple-software, en dus werd geboren 142 00:08:22,690 --> 00:08:26,760 dat als je gecompileerd op uw computer en geïnstalleerd op een iPhone 143 00:08:26,760 --> 00:08:29,430 dat is aangesloten op uw computer via bijvoorbeeld een USB-kabel, 144 00:08:29,430 --> 00:08:32,450 Dit zou u administratieve of root-privileges op je iPhone 145 00:08:32,450 --> 00:08:34,620 en laat je vrij veel wat je wilt. 146 00:08:34,620 --> 00:08:36,400 En dus er is al deze fascinerende kat en muis spel 147 00:08:36,400 --> 00:08:39,340 tussen Apple en de rest van de wereld in het bijzonder als ze, net als veel bedrijven, 148 00:08:39,340 --> 00:08:43,350 proberen om hun spullen te vergrendelen, zodat u kunt alleen doen wat ze van plan. 149 00:08:43,350 --> 00:08:47,360 Maar dankzij mensen zoals deze en het begrip van low-level details - 150 00:08:47,360 --> 00:08:50,830 en in dit geval C programmering - en veel van de bekende constructen 151 00:08:50,830 --> 00:08:55,280 dat we begonnen te spelen met, bent u in staat om echt te maken gebruik van de hardware 152 00:08:55,280 --> 00:08:59,250 op een manier die je past en niet noodzakelijk een aantal corporate entiteit. 153 00:08:59,250 --> 00:09:01,600 Dus bijvoorbeeld, ik heb geen idee wat dit allemaal aan het doen is, 154 00:09:01,600 --> 00:09:03,580 maar GetVersion klinkt vrij eenvoudig, 155 00:09:03,580 --> 00:09:05,710 en het lijkt erop dat dit is een functie dat deze persoon heeft geschreven. 156 00:09:05,710 --> 00:09:09,250 Het duurt een soort van integer als argument, geeft niets, 157 00:09:09,250 --> 00:09:13,710 maar lijkt lus met een for-lus hier en een if-conditie, als voorwaarde breken, 158 00:09:13,710 --> 00:09:16,770 en een of andere manier betrekking heeft op versienummers als we naar beneden scrollen, 159 00:09:16,770 --> 00:09:19,650 hoewel veel van deze zoekwoorden zullen nieuw zijn. 160 00:09:19,650 --> 00:09:22,590 En er is een heleboel functies in hier hebben we nog nooit eerder gezien en misschien niet altijd te zien 161 00:09:22,590 --> 00:09:24,350 in de loop van het semester. 162 00:09:24,350 --> 00:09:29,160 >> Aan het eind van de dag, het volgt dezelfde regels en logica dat we al het spelen met tot nu toe. 163 00:09:29,160 --> 00:09:34,340 Dus dit is veel te oud om je iPhone 3s of 4s of 5s snel deze dagen te kraken, 164 00:09:34,340 --> 00:09:38,830 maar weet dat het is allemaal heel erg afgeleid van deze wereld dat we doken in. 165 00:09:38,830 --> 00:09:42,280 Laten we eens een kijkje nemen op een beetje meer eenvoudig voorbeeld: 166 00:09:42,280 --> 00:09:46,260 deze, alleen maar om krijgen opgewarmd met een aantal syntax en ook een ander gegevenstype 167 00:09:46,260 --> 00:09:48,910 dat we hebben gesproken over maar nog niet echt gezien in C. 168 00:09:48,910 --> 00:09:53,670 Dit is een bestand met de naam positive1.c, en per de opmerkingen aan de top, 169 00:09:53,670 --> 00:09:56,070 Dit vereist slechts dat de gebruiker een positief getal. 170 00:09:56,070 --> 00:09:59,910 Dus het is een voorbeeld van een do-while-lus, dat is leuk voor de gebruiker interactieve programma's 171 00:09:59,910 --> 00:10:02,070 waar je moet de gebruiker vertellen om iets te doen, 172 00:10:02,070 --> 00:10:05,530 en als ze niet meewerken je schreeuwen tegen hen of verwerpen hun inbreng. 173 00:10:05,530 --> 00:10:10,480 Case in point: ik ga doen lijnen 19 tot en met 24 174 00:10:10,480 --> 00:10:14,620 zolang de gebruiker niet heeft gegeven mij een positief getal. 175 00:10:14,620 --> 00:10:21,340 Dit detail hier op lijn 18, waarom heb ik verklaar n boven dit hele looping construeren 176 00:10:21,340 --> 00:10:26,870 in tegenstelling tot direct naast lijn 22 waar ik echt om naar n te krijgen? Ja. 177 00:10:26,870 --> 00:10:29,330 [Student] Scope. >> Ja, dus dit nummer van omvang. 178 00:10:29,330 --> 00:10:31,770 En in termen van de leek, het toepassingsgebied zich wat vindt u? 179 00:10:34,880 --> 00:10:41,560 Ja. >> [Onverstaanbaar student reactie] >> Kun je je een beetje harder? 180 00:10:41,560 --> 00:10:45,440 [Student] Waar kun je die variabele te openen. >> Perfect. 181 00:10:45,440 --> 00:10:47,610 Waar kun je een bepaalde variabele te openen. 182 00:10:47,610 --> 00:10:50,990 En in het algemeen, de vuistregel tot nu toe is dat de omvang van een aantal variabele 183 00:10:50,990 --> 00:10:56,140 wordt bepaald door de meest recente accolades die je hebt gezien. 184 00:10:56,140 --> 00:11:03,070 >> En dus in dit geval, als ik de fout gemaakt te verklaren n op de lijn 22, zou die lijn werken. 185 00:11:03,070 --> 00:11:10,840 Ik zou krijgen een int, en ik zou het gebracht die variabele n in lijn 22, 186 00:11:10,840 --> 00:11:17,060 maar die regel code zou nu heb geen idee waar ik het over heb? >> [Student] 25. 187 00:11:17,060 --> 00:11:23,840 [Malan] 25, en het blijkt dat 24 goed ook, want in dit geval is valt buiten de accolades. 188 00:11:23,840 --> 00:11:28,550 Dus gewoon een beetje vervelend, maar zeer eenvoudig op te lossen door simpelweg te verklaren de variabele 189 00:11:28,550 --> 00:11:30,700 buiten de functie zelf. 190 00:11:30,700 --> 00:11:32,760 We zullen later vandaag zien, kunt u nog een stap verder te gaan 191 00:11:32,760 --> 00:11:34,940 en je kon zelfs een beetje lui. 192 00:11:34,940 --> 00:11:39,660 En dit is niet aan te bevelen in het algemeen, maar je kon zelfs lui 193 00:11:39,660 --> 00:11:44,150 en wereldwijd zet een variabele zogezegd, niet in een functie, niet in een lus, 194 00:11:44,150 --> 00:11:49,800 maar in het bestand zelf, buiten alle functies die je hebt geschreven, zoals ik deed hier op lijn 15. 195 00:11:49,800 --> 00:11:55,220 Dit wordt over het algemeen afgekeurd, maar beseffen dat dit een oplossing is soms tot andere problemen, 196 00:11:55,220 --> 00:11:56,910 zoals we zullen uiteindelijk zien. 197 00:11:56,910 --> 00:11:59,500 Dus voor nu zullen we laten het zo, maar laten we eens kijken of we kunnen herschrijven deze 198 00:11:59,500 --> 00:12:02,360 gewoon om te beginnen uiten onszelf een beetje anders. 199 00:12:02,360 --> 00:12:05,550 Dit programma, alleen maar om duidelijk, is positive1. 200 00:12:05,550 --> 00:12:11,980 Laat me hier ga je gang en in mijn terminal-venster maken positive1, Enter. 201 00:12:11,980 --> 00:12:15,080 Compileert oke. Ik ga positive1 rennen, druk op Enter. 202 00:12:15,080 --> 00:12:19,250 Ik eis dat je me een positief geheel getal. Ik zal -1 zeggen. Dat werkte niet. 203 00:12:19,250 --> 00:12:22,340 0, 99. Dat lijkt te werken. 204 00:12:22,340 --> 00:12:25,310 Misschien niet de meest rigoureuze test, maar in ieder geval is het een leuke sanity check 205 00:12:25,310 --> 00:12:27,100 dat we op de goede weg. 206 00:12:27,100 --> 00:12:29,570 >> Dus nu laat me gaan en open versie 2 van deze, 207 00:12:29,570 --> 00:12:32,800 en wat is er anders al? 208 00:12:32,800 --> 00:12:39,030 Het geeft uitvoering aan het zelfde ding, maar wat springen zo duidelijk deze keer anders? 209 00:12:40,790 --> 00:12:47,090 Dit bool in het groen. Het groen is gemarkeerd, is dit zoekwoord bekend als bool, dat is een gegevenstype. 210 00:12:47,090 --> 00:12:50,510 Het komt niet ingebouwd in alle versies van C. 211 00:12:50,510 --> 00:12:52,650 U moet een specifieke bibliotheek op te nemen. 212 00:12:52,650 --> 00:12:56,460 In ons geval, ik onder meer de CS50 bibliotheek, zodat we toegang tot bool. 213 00:12:56,460 --> 00:12:59,860 Maar in lijn 18, lijken we in een Booleaanse waarde hier genoemd dankbaar zijn. 214 00:12:59,860 --> 00:13:02,190 Ik had noemde dit alles, maar ik noemde het dankbaar 215 00:13:02,190 --> 00:13:04,750 alleen maar om soort over te brengen wat semantische betekenis. 216 00:13:04,750 --> 00:13:07,700 Dus in eerste instantie op lijn 18, ik ben blijkbaar niet dankbaar 217 00:13:07,700 --> 00:13:12,230 omdat de Booleaanse waarde dankbaar wordt geïnitialiseerd op false in de lijn 18. 218 00:13:12,230 --> 00:13:16,500 En dan lijkt het wat ik hier heb gedaan in lijnen 21 tot en met 23 219 00:13:16,500 --> 00:13:19,200 is Ik heb gewoon een soort van herschreven mijn logica. 220 00:13:19,200 --> 00:13:26,100 Dus geen functioneel verschillend, maar in lijn 22 nu ik controleren of de int de gebruiker heeft 221 00:13:26,100 --> 00:13:31,360 groter is dan 0, dan heb ik gewoon de waarde van dankbaar in op true. 222 00:13:31,360 --> 00:13:35,590 En waarom doe ik dat? Omdat in lijn 25, blijkbaar Ik ga een toestand te controleren. 223 00:13:35,590 --> 00:13:39,760 Doe deze lus terwijl dankbaar is vals. 224 00:13:39,760 --> 00:13:42,960 Dus heb ik voorgesteld dit als een alternatief voor de versie 1 225 00:13:42,960 --> 00:13:47,050 want het is op zijn minst een beetje meer intuïtief misschien is het een beetje meer geaard in het Engels. 226 00:13:47,050 --> 00:13:51,980 Dus het volgende doen terwijl u niet dankbaar of tijdens dankbaar is vals. 227 00:13:51,980 --> 00:13:56,220 En ook deze keer ik blijkbaar niet schelen om te onthouden wat de gebruiker heeft ingevoerd in 228 00:13:56,220 --> 00:14:00,050 want aankondiging er is geen variabele n, dus eigenlijk, een leugentje om bestwil is. 229 00:14:00,050 --> 00:14:03,290 >> Functioneel, het programma is een beetje anders als we eenmaal op de bodem van het 230 00:14:03,290 --> 00:14:04,960 want ik ben niet herinneren wat n. 231 00:14:04,960 --> 00:14:09,120 Maar ik wilde hier laten zien ook dat, hoewel we hebben gezien GetInt 232 00:14:09,120 --> 00:14:13,780 en GetString wordt gebruikt op de rechterkant van een gelijkteken dusver 233 00:14:13,780 --> 00:14:17,310 zodat wij de waarde, technisch, dat is niet strikt noodzakelijk te herinneren. 234 00:14:17,310 --> 00:14:20,290 Als u om welke reden dan ook gewoon niet schelen om de waarde op te slaan, 235 00:14:20,290 --> 00:14:25,540 je wil gewoon de waarde te controleren, merken dat we gewoon kunnen dit schrijven als GetInt, 236 00:14:25,540 --> 00:14:27,320 openen haakje, in de buurt haakje. 237 00:14:27,320 --> 00:14:30,570 Deze functie zal een waarde te retourneren, zoals we al zeiden. 238 00:14:30,570 --> 00:14:32,220 Het zal u terug te geven een int. 239 00:14:32,220 --> 00:14:34,460 En dus als je mentaal denken dat dit gebeurt, 240 00:14:34,460 --> 00:14:38,190 als ik typ in 99, GetInt geeft het aantal 99, 241 00:14:38,190 --> 00:14:41,840 en dus conceptueel, het is alsof mijn code eigenlijk waren dit. 242 00:14:41,840 --> 00:14:45,950 Als 99 inderdaad groter is dan 0, dan wordt dankbaar waar 243 00:14:45,950 --> 00:14:50,810 dan lijn 25 realiseert ooh, we zijn klaar, want ik ben nu dankbaar, 244 00:14:50,810 --> 00:14:53,970 en in lijn 26, we gewoon zeggen: "Bedankt voor de positieve integer!" 245 00:14:53,970 --> 00:14:55,960 wat het ook toevallig. 246 00:14:55,960 --> 00:14:59,140 Nu gaan we een lichte syntactische suiker hier, bij wijze van spreken. 247 00:14:59,140 --> 00:15:04,670 Laten we eens kijken of we kunnen opruimen deze lijn 25 met deze derde en laatste variant in positive3. 248 00:15:04,670 --> 00:15:13,600 >> Let op het enige verschil nu is wat regel code? >> [Student] 25. >> [Malan] Ja, 25. 249 00:15:13,600 --> 00:15:17,680 En we hebben niet echt gezien deze truc gewoon nog niet, maar we hebben op het uitroepteken op maandag te zien, 250 00:15:17,680 --> 00:15:21,070 geven, waarin vastligt wat? >> [Student] Niet. >> Niet of ontkenning. 251 00:15:21,070 --> 00:15:23,510 Dus neem een ​​Booleaanse waarde en flip zijn waarde. 252 00:15:23,510 --> 00:15:25,810 True false wordt, valse wordt waar. 253 00:15:25,810 --> 00:15:30,420 Dus dit, ik zou willen voorstellen, is zelfs een beetje meer intuïtieve manier van schrijven van de code 254 00:15:30,420 --> 00:15:33,430 omdat ik nog steeds initialiseren dankbaar valse, heb ik nog het volgende doen, 255 00:15:33,430 --> 00:15:36,010 Ik dankbaar op true wanneer de tijd komt, 256 00:15:36,010 --> 00:15:40,880 maar nu kun je eigenlijk alleen maar vertalen deze code verbaal van links naar rechts, 257 00:15:40,880 --> 00:15:45,630 while (dankbaar!), want bang of uitroepteken duidt het begrip niet, 258 00:15:45,630 --> 00:15:47,580 dus terwijl niet dankbaar. 259 00:15:47,580 --> 00:15:49,900 Dus nogmaals, we hebben geen nieuwe concepten als zodanig. 260 00:15:49,900 --> 00:15:53,730 We spraken over Booleans terug toen speelden we met Scratch, 261 00:15:53,730 --> 00:15:56,720 maar beseffen nu kunnen we gewoon beginnen met het schrijven van onze code op veel verschillende manieren. 262 00:15:56,720 --> 00:16:01,060 Dus vooral in pset1 als je soort van worstelen om erachter te komen de weg naar een programma te schrijven, 263 00:16:01,060 --> 00:16:04,340 kansen zijn heb je geluk, want er kan een willekeurig aantal oplossingen 264 00:16:04,340 --> 00:16:06,110 dat je kan gebeuren op. 265 00:16:06,110 --> 00:16:10,500 Zo, dit is gewoon 3 voor zelfs de eenvoudigste van de programma's. Oke. 266 00:16:10,500 --> 00:16:14,200 En nu terug op maandag vertrokken we op deze notitie met terugkeer waarden. 267 00:16:14,200 --> 00:16:18,450 Dus voor de allereerste keer schreven we een programma dat niet alleen maar de belangrijkste; 268 00:16:18,450 --> 00:16:22,550 Het heeft ook een eigen aangepaste functie die ik hier geschreven heb. 269 00:16:22,550 --> 00:16:26,810 Dus in lijn 31 tot 34 heb ik geïmplementeerd een kubus functie. 270 00:16:26,810 --> 00:16:30,240 Het is niet complex. Het is gewoon een * a * a in dit geval. 271 00:16:30,240 --> 00:16:34,750 Maar wat belangrijk is over het is dat ik inbreng te nemen in de vorm van een 272 00:16:34,750 --> 00:16:39,180 en ik terug output in de vorm van een * a * a. 273 00:16:39,180 --> 00:16:43,560 Dus nu heb ik de mogelijkheid, net als ik om met prinf alleen wordt gebruikt, 274 00:16:43,560 --> 00:16:47,240 Om deze functie te bellen door te bellen naar de kubus functie. 275 00:16:47,240 --> 00:16:51,970 >> En de kubus functie neemt een aantal input, en de kubus functie geeft enkele uitgang. 276 00:16:51,970 --> 00:16:56,960 Daarentegen printf gewoon deed iets. 277 00:16:56,960 --> 00:17:00,840 Het kwam niet terug iets dat we om gaf, ook al als een terzijde het heeft een waarde te retourneren; 278 00:17:00,840 --> 00:17:03,110 je gewoon in het algemeen negeren. 279 00:17:03,110 --> 00:17:06,510 Printf gewoon deed iets. Het had een neveneffect van afdrukken op het scherm. 280 00:17:06,510 --> 00:17:11,770 Daarentegen hier, hebben we de kubus functie, die eigenlijk terug iets. 281 00:17:11,770 --> 00:17:15,520 Dus voor die bekend zijn met dit, het is een vrij eenvoudig idee. 282 00:17:15,520 --> 00:17:19,640 Maar voor de minder vertrouwd zijn met dit idee van het doorgeven in in-en om terug uitgangen, 283 00:17:19,640 --> 00:17:21,950 laten we proberen gewoon iets super eenvoudig. 284 00:17:21,950 --> 00:17:25,490 Is er iemand comfortabele komen op het podium kort? 285 00:17:25,490 --> 00:17:28,040 Je moet comfortabel met een camera op je net zo goed. Ja? Oke. 286 00:17:28,040 --> 00:17:31,240 Wat is je naam? >> [Student] Ken. >> Ken. Oke. Ken, kom naar boven. 287 00:17:31,240 --> 00:17:35,050 Ken zal een functie soort hier. 288 00:17:35,050 --> 00:17:38,720 Laten we verder gaan en dit doen. Laten we een beetje fantasie. 289 00:17:38,720 --> 00:17:42,260 Leuk u te ontmoeten. Welkom bij centraal. Oke. 290 00:17:42,260 --> 00:17:46,640 Laten we hier op die knop. Oke. 291 00:17:46,640 --> 00:17:49,820 Dus hier heb je een moderne schoolbord, 292 00:17:49,820 --> 00:17:53,470 en wat ik ben is de belangrijkste functie, bijvoorbeeld, 293 00:17:53,470 --> 00:17:56,460 en ik heb geen iPad in mijn hand. 294 00:17:56,460 --> 00:17:59,710 >> Ik heb niet echt weet hoe je - Nou, ik kan dat zeggen. 295 00:17:59,710 --> 00:18:02,480 Ik heb niet echt goed handschrift, 296 00:18:02,480 --> 00:18:05,520 en dus daarom wil ik dat je iets op het scherm voor me af te drukken. 297 00:18:05,520 --> 00:18:12,040 Daar ben ik nu het hoofdprogramma, en ik ga om u te hebben zeggen dat dit 298 00:18:12,040 --> 00:18:16,720 door het schrijven van het in mijn kip scratch, waarna u voorbijgaan een ingang. 299 00:18:16,720 --> 00:18:20,400 Zo dom hoewel deze oefening is, het begrip van functies en het aanroepen van een functie 300 00:18:20,400 --> 00:18:22,400 en het retourneren van een functie echt neer op deze. 301 00:18:22,400 --> 00:18:26,260 Ik ben de belangrijkste, ik heb net geschreven printf, quote-unquote iets op het scherm, 302 00:18:26,260 --> 00:18:29,110 Ik gebruik dit programma, en zodra printf wordt aangeroepen, 303 00:18:29,110 --> 00:18:32,880 het duurt een argument of een parameter soms tussen dubbele aanhalingstekens. 304 00:18:32,880 --> 00:18:35,880 Hier is dat argument. Ik ben door te geven aan Ken. 305 00:18:35,880 --> 00:18:39,020 Hij is een zwarte doos schriftelijke bepaald aantal jaren geleden 306 00:18:39,020 --> 00:18:41,510 dat blijkbaar alleen weet hoe u kunt afdrukken wat op het scherm. 307 00:18:41,510 --> 00:18:43,150 Dus voeren. 308 00:18:49,280 --> 00:18:51,280 Dat is niet slecht. Heel goed. 309 00:18:51,280 --> 00:18:55,510 Dus nu Ken gebeurt uitvoeren. Heeft hij nodig om mij iets terug? 310 00:18:55,510 --> 00:18:57,470 Niet dat we tot nu toe gezien. 311 00:18:57,470 --> 00:19:00,460 Nogmaals, printf eigenlijk terug een nummer, maar we gaan die te negeren voor nu 312 00:19:00,460 --> 00:19:03,470 want we hebben het nooit gebruikt. Dus dat is het voor Ken. 313 00:19:03,470 --> 00:19:08,580 En nu de belangrijkste neemt de controle over het programma opnieuw 314 00:19:08,580 --> 00:19:11,060 want dat regel van de code, printf, gebeurt de uitvoering. 315 00:19:11,060 --> 00:19:14,050 En we gaan over onze manier, het uitvoeren van welke andere lijnen zijn er. 316 00:19:14,050 --> 00:19:17,320 Dus nu laten we proberen een iets ander voorbeeld. 317 00:19:17,320 --> 00:19:24,940 Deze keer hier laten we eerst het scherm te verwijderen, en deze keer zullen we het Cubing functie te doen, 318 00:19:24,940 --> 00:19:27,080 maar deze keer verwacht ik een uitgangswaarde. 319 00:19:27,080 --> 00:19:29,180 >> Dus laten we verder gaan en dit doen. 320 00:19:29,180 --> 00:19:35,790 Nu heb ik een regel code die zegt x krijgt kubus van x. 321 00:19:41,370 --> 00:19:46,370 De regel van de code, recall, ziet er als volgt uit: x = cube (x); 322 00:19:46,370 --> 00:19:50,930 Dus hoe gaat dit werken? Laten we verder gaan en geven je een wit scherm weer. 323 00:19:50,930 --> 00:19:54,070 Ik ga nu schrijven de waarde van x, 324 00:19:54,070 --> 00:20:01,400 die op dit moment in de tijd gebeurt te zijn, laten we zeggen, 2 het simpel te houden. 325 00:20:01,400 --> 00:20:06,150 Ik heb geschreven op een stuk papier de waarde van 2, dat is mijn waarde x. 326 00:20:06,150 --> 00:20:10,920 Ik geef het aan Ken. >> En ik schrijf het antwoord? >> Ja, laten we gewoon het antwoord te schrijven. 327 00:20:12,760 --> 00:20:18,940 Oke. En nu heeft hij om terug te keren me iets. Perfect. Leuk segue. 328 00:20:18,940 --> 00:20:23,120 Dus nu geeft hij me terug de waarde van 8 in dit geval, en wat moet ik ermee doen? 329 00:20:23,120 --> 00:20:28,250 Eigenlijk - laten we eens kijken, dit goed. Wat moet ik doen? 330 00:20:28,250 --> 00:20:33,440 Nu ga ik om deze waarde te nemen en eigenlijk is het op te slaan in diezelfde bits in het geheugen. 331 00:20:33,440 --> 00:20:35,170 Maar let op ik ben een beetje worstelen hier. 332 00:20:35,170 --> 00:20:38,210 Ik ben een beetje in de war, want waar moet ik eigenlijk schrijf de waarde van x, 333 00:20:38,210 --> 00:20:43,150 want wat ik net heb gedaan is fysiek de hand Ken een stuk papier dat de waarde 2 heeft, 334 00:20:43,150 --> 00:20:46,590 en dat was x, en inderdaad, dat is precies wat er gebeurde. 335 00:20:46,590 --> 00:20:50,210 Zo blijkt dat wanneer je de functie aan te roepen en u passeert in een discussie 336 00:20:50,210 --> 00:20:53,290 zoals hello, world of u doorgeeft in een argument als 2, 337 00:20:53,290 --> 00:20:57,110 het algemeen, je passeren in een kopie van dit argument. 338 00:20:57,110 --> 00:21:00,730 En dus net zoals ik schreef het nummer 2 hier en gaf het aan Ken, 339 00:21:00,730 --> 00:21:04,720 dat moet betekenen dat ik nog steeds een kopie van de waarde 2 ergens 340 00:21:04,720 --> 00:21:08,890 want inderdaad, nu ik heb gekregen terug de waarde 8, moet ik om terug te gaan in het RAM 341 00:21:08,890 --> 00:21:12,130 en eigenlijk schrijf een daling van 8 waar ik ooit had de nummer 2. 342 00:21:12,130 --> 00:21:16,950 Dus visueel, onthoud dit begrip passeren in, letterlijk, een kopie van de waarde. 343 00:21:16,950 --> 00:21:20,780 >> Ken doet zijn ding, me terug overhandigt iets - in dit geval een waarde als 8 - 344 00:21:20,780 --> 00:21:24,980 en dan moet ik iets doen met die waarde als ik wil om het te houden rond. 345 00:21:24,980 --> 00:21:29,650 Dus dit alles zal terugkeren naar zijn maar al te bekend voor lang. 346 00:21:29,650 --> 00:21:34,920 Dank je wel voor deze demo hier, Ken. [Applaus] 347 00:21:34,920 --> 00:21:36,920 Heel goed gedaan. 348 00:21:36,920 --> 00:21:42,690 Laten we eens kijken hoe dat uiteindelijk betrekking heeft op een deel van de functie te bellen dat we hier gedaan. 349 00:21:42,690 --> 00:21:47,910 Laat me ga je gang en breng ons terug naar de Cubing voorbeeld hier. 350 00:21:47,910 --> 00:21:53,300 Merk op dat als we willen om daadwerkelijk beginnen met het innemen van dit verder, 351 00:21:53,300 --> 00:21:57,570 we zullen moeten houden met het feit dat het aantal x dat wordt doorgegeven in hier 352 00:21:57,570 --> 00:22:01,530 is anders dan wat er daadwerkelijk wordt doorgegeven aan de functie. 353 00:22:01,530 --> 00:22:05,880 Dus nogmaals, wordt deze pas door kopie gaat nogal germane worden in slechts een moment. 354 00:22:05,880 --> 00:22:09,580 Laten we eens een kijkje nemen op iets dat niet helemaal werkt juist nog niet. 355 00:22:09,580 --> 00:22:13,250 Ik ga om verder te gaan en een derde buggy voorbeeld, dat wordt ontsierd door de natuur te openen, 356 00:22:13,250 --> 00:22:18,550 en het heet buggy3 en implementeert een swap-functie. 357 00:22:18,550 --> 00:22:25,110 Hier hebben we een hoofdfunctie die willekeurig x en y geïnitialiseerd op 1 en 2 respectievelijk. 358 00:22:25,110 --> 00:22:27,700 We konden gebruik maken GetInt, maar we hoeven alleen maar een eenvoudige oefening, 359 00:22:27,700 --> 00:22:30,170 dus het is hard-coded als 1 en 2. 360 00:22:30,170 --> 00:22:35,340 In leidingen 21 en 22, we blijkbaar printen x en y, 1 per regel. 361 00:22:35,340 --> 00:22:39,720 Dan op lijn 23, ik beweer ik deze waarden swapping, puntje, puntje, puntje. 362 00:22:39,720 --> 00:22:44,170 Ik blijkbaar roep een functie in regel 24 zogenaamde swap dat 2 argumenten heeft. 363 00:22:44,170 --> 00:22:48,300 Het is helemaal legit voor functies tot en met 2 argumenten te nemen. We hebben gezien printf al doen. 364 00:22:48,300 --> 00:22:51,830 >> Dus swap neemt blijkbaar x en y, en zoals de naam al doet vermoeden, 365 00:22:51,830 --> 00:22:54,670 Ik hoop dat het gaat om deze 2 waarden te wisselen. 366 00:22:54,670 --> 00:23:00,090 Dus dan moet ik zeggen on line 25 "verwisseld!" en ik herdruk x-en y- 367 00:23:00,090 --> 00:23:03,070 in de veronderstelling dat ze inderdaad al verwisseld. 368 00:23:03,070 --> 00:23:06,080 Maar als ik echt dit programma uitvoert - laat me open een terminal venster, 369 00:23:06,080 --> 00:23:09,860 laat me buggy3 - zoals de naam al doet vermoeden, is dit niet van plan om goed af 370 00:23:09,860 --> 00:23:15,770 want als ik op Enter, merken dat x is 1 hit, y 2, 371 00:23:15,770 --> 00:23:19,420 en toch aan het einde van het programma zij nog in feite hetzelfde. 372 00:23:19,420 --> 00:23:22,960 Dus gebaseerd op het aantonen juist nu met Ken, wat er werkelijk aan de hand is? 373 00:23:22,960 --> 00:23:28,710 Laten we een duik nemen in deze swap functie. Het is super kort. Het is slechts een paar regels code lang. 374 00:23:28,710 --> 00:23:34,520 Maar wat is het fundamentele probleem op basis van de eenvoudige verhaal hier met Ken? 375 00:23:34,520 --> 00:23:36,670 Waarom wordt swap gebroken? 376 00:23:36,670 --> 00:23:39,660 [Student] Je opslaan van een kopie, niet de variabele. 377 00:23:39,660 --> 00:23:43,980 Precies. We slaan een kopie, niet de variabele zelf. 378 00:23:43,980 --> 00:23:47,170 Met andere woorden, swap duurt blijkbaar 2 argumenten, een int, 379 00:23:47,170 --> 00:23:49,370 en het is willekeurig A en B genoemd, 380 00:23:49,370 --> 00:23:54,420 en hier heb aangenomen in x en y, die respectievelijk 1 en 2, 381 00:23:54,420 --> 00:23:58,770 maar ik ben niet letterlijk passeren in x, ik ben niet letterlijk passeren in y, 382 00:23:58,770 --> 00:24:01,450 Ik ben het passeren van een kopie van x en een kopie van y. 383 00:24:01,450 --> 00:24:04,510 Het is bijna alsof je gekopieerd en geplakt in swap 384 00:24:04,510 --> 00:24:07,810 de waarden die u wilt eigenlijk te manipuleren. 385 00:24:07,810 --> 00:24:14,480 Dus als dat het geval is, als ik het programma start lijn uitvoeren van 35 dan 36, 386 00:24:14,480 --> 00:24:18,650 als ik naar lijn 37, op dit punt in het verhaal, wat is de waarde van een? 387 00:24:21,040 --> 00:24:25,050 Op dit punt in het verhaal, lijn 37, wat is de waarde van een op dit punt? >> [Student] 1. 388 00:24:25,050 --> 00:24:29,280 [Malan] Het moet gewoon 1, rechts, want x is doorgegeven als het eerste argument, 389 00:24:29,280 --> 00:24:33,080 en deze functie gewoon willekeurig roept haar eerste argument een. 390 00:24:33,080 --> 00:24:38,200 Ook is y het tweede argument, en het is gewoon willekeurig te bellen naar het tweede argument b. 391 00:24:38,200 --> 00:24:40,990 >> Deze tweedeling is eigenlijk vrij eenvoudig uitgelegd. Denk er eens over. 392 00:24:40,990 --> 00:24:43,320 Niemand van ons heeft voldaan aan de persoon die schreef printf, 393 00:24:43,320 --> 00:24:50,770 zo zeker, hij of zij heeft geen idee wat onze variabelen 30 jaar later zullen worden genoemd. 394 00:24:50,770 --> 00:24:56,650 Dus er moet een onderscheid te maken tussen wat je noemt variabelen in functies die u aan het schrijven bent 395 00:24:56,650 --> 00:25:02,080 en wat je noemt variabelen in functies die u belt of met behulp van. 396 00:25:02,080 --> 00:25:05,340 Met andere woorden, heb ik zelf mijn variabelen x en y, 397 00:25:05,340 --> 00:25:08,890 maar als iemand anders had geschreven de swap-functie, hij of zij zou zeker niet weten 398 00:25:08,890 --> 00:25:10,690 wat mijn variabelen zullen worden genoemd, 399 00:25:10,690 --> 00:25:13,830 zodat beseffen dat dit is de reden waarom u deze dualiteit van namen. 400 00:25:13,830 --> 00:25:16,750 Technisch gezien kan ik dit doen door toeval, 401 00:25:16,750 --> 00:25:20,080 maar ze zouden nog steeds worden doorgegeven als kopieën. 402 00:25:20,080 --> 00:25:23,650 Het zou gewoon puur toeval esthetisch als die persoon die schreef swap 403 00:25:23,650 --> 00:25:26,150 had gebruikt dezelfde namen. 404 00:25:26,150 --> 00:25:32,370 Dus op dit punt in het verhaal, lijn 37, a 1, b 2, en nu ik ga om ze te verwisselen. 405 00:25:32,370 --> 00:25:34,900 Allereerst wil ik eigenlijk dit te doen veel eenvoudiger. 406 00:25:34,900 --> 00:25:36,690 Ik weet niet wat die 3 regels code aan het doen waren. 407 00:25:36,690 --> 00:25:41,210 Laat me dit doen: b = a; a = b; gedaan. 408 00:25:41,210 --> 00:25:44,690 Waarom is deze gebroken, logisch? 409 00:25:46,490 --> 00:25:48,900 Het is een soort van de intuïtieve, toch? 410 00:25:48,900 --> 00:25:52,560 Dus A wordt B en B wordt een, 411 00:25:52,560 --> 00:25:57,730 maar het probleem is dat zodra leiding 37 wordt uitgevoerd, wat de waarde van a en b? 412 00:25:57,730 --> 00:26:03,410 Hetzelfde, 1, omdat je pan gehakt, om zo te zeggen, je bent veranderd b om een ​​gelijk. 413 00:26:03,410 --> 00:26:08,890 Dus zodra lijn 37 is uitgevoerd, dat is geweldig, je hebt nu 2 exemplaren van het nummer 1 414 00:26:08,890 --> 00:26:13,350 binnenkant van deze functie, dus dan wanneer je zegt in de lijn 38 a = b, 415 00:26:13,350 --> 00:26:17,640 je bent soort van genaaid, want je bent gewoon het toewijzen van 1 tot 1. 416 00:26:17,640 --> 00:26:20,580 Je hebt soort van verloren de waarde die u gaf. 417 00:26:20,580 --> 00:26:23,220 Dus in de originele versie van dit, let op wat ik deed. 418 00:26:23,220 --> 00:26:26,850 Ik plaats had een derde lijn van de code die er zo uitzag. 419 00:26:26,850 --> 00:26:28,580 Ik verklaar een tijdelijke variabele. 420 00:26:28,580 --> 00:26:32,170 >> Tmp is een veel voorkomende naam voor een tijdelijke variabele, en het is een int 421 00:26:32,170 --> 00:26:34,580 omdat het moet overeenkomen met wat ik wil een kopie van te maken. 422 00:26:34,580 --> 00:26:39,770 Ik bewaar een kopie van een binnenkant van tmp, dus zodra lijn 37 heeft uitgevoerd, 423 00:26:39,770 --> 00:26:45,860 de waarde van a - snel sanity check - 1, de waarde van b is 2, 424 00:26:45,860 --> 00:26:48,970 en de waarde van tmp is 1. 425 00:26:48,970 --> 00:26:52,060 Dus nu heb ik uitvoeren lijn 38. 426 00:26:52,060 --> 00:27:00,540 Zodra lijn 38 voert een neemt de waarde van b. En b is 2, zodat een nu 2. 427 00:27:00,540 --> 00:27:05,210 Dus op dit punt in het verhaal, a 2, b is 2 en tmp 1 is, 428 00:27:05,210 --> 00:27:11,060 dus nu logisch, we kunnen gewoon plop tmp de waarde in b en we zijn klaar. 429 00:27:11,060 --> 00:27:12,800 Dus hebben we dat probleem opgelost. 430 00:27:12,800 --> 00:27:17,720 Helaas, toen ik dit programma uit te voeren in deze vorm, is het niet echt ruilen geen waarden. 431 00:27:17,720 --> 00:27:20,100 Maar om duidelijk te zijn, waarom? 432 00:27:23,660 --> 00:27:26,450 Ik maakte het logische probleem van zojuist, 433 00:27:26,450 --> 00:27:31,020 maar nogmaals, als ik zonder dit programma, x en y blijven ongewijzigd 434 00:27:31,020 --> 00:27:33,310 het eind van de uitvoering van het programma. 435 00:27:33,310 --> 00:27:37,220 [Onverstaanbaar student commentaar] >> We hebben niet terug niets, dus dat is waar. 436 00:27:37,220 --> 00:27:39,670 Maar het blijkt dat er een beetje een probleem hier omdat tot nu toe, 437 00:27:39,670 --> 00:27:44,170 het enige wat we in staat geweest om terug te keren is een ding, en dat is een beperking van C. 438 00:27:44,170 --> 00:27:49,070 Je kunt pas echt een waarde teruggeven, in welk geval ik ben een beetje hier vast 439 00:27:49,070 --> 00:27:53,310 want ik kon de nieuwe waarde van x terug of ik kon de terugkeer van de nieuwe waarde van y, 440 00:27:53,310 --> 00:27:55,190 maar ik wil beide terug. 441 00:27:55,190 --> 00:27:58,650 Dus terug is niet de eenvoudige oplossing. 442 00:27:58,650 --> 00:28:01,710 Maar het probleem is fundamenteel waarom? Wat hebben we eigenlijk verwisseld? 443 00:28:01,710 --> 00:28:04,190 [Student] a en b. >> A en b. 444 00:28:04,190 --> 00:28:08,230 Maar a en b zijn kopieën van x en y, wat betekent dat we gewoon al dit werk deed, 445 00:28:08,230 --> 00:28:11,650 we net 3 minuten praten over de swap functie en alle 3 van deze variabelen, 446 00:28:11,650 --> 00:28:15,420 en dat is geweldig, perfect juist op zichzelf, 447 00:28:15,420 --> 00:28:20,740 maar a en b de reikwijdte alleen in deze lijnen hier. 448 00:28:20,740 --> 00:28:24,790 >> Dus net als een for-lus, als u Ik verklaar een geheel getal in de for-lus, 449 00:28:24,790 --> 00:28:28,760 op dezelfde wijze, als je verklaren a en b in een functie die u hebt geschreven, 450 00:28:28,760 --> 00:28:33,320 ze zijn alleen geldig binnen van die functie, wat betekent dat zodra swap wordt gedaan het uitvoeren van 451 00:28:33,320 --> 00:28:38,470 en we gaan van lijn 24 naar lijn 25, hebben x en y niet veranderd. 452 00:28:38,470 --> 00:28:42,790 Je hoeft alleen verspilde heel veel tijd wisselen kopieën van variabelen. 453 00:28:42,790 --> 00:28:47,010 Zo blijkt dat de oplossing voor dit eigenlijk niet duidelijk. 454 00:28:47,010 --> 00:28:50,670 Het is niet helemaal voldoende om de waarden terug te keren, want we kunnen alleen terugkeren 1 waarde, 455 00:28:50,670 --> 00:28:53,470 en ik wil zowel de x-en y-swap op hetzelfde moment, 456 00:28:53,470 --> 00:28:55,210 dus we gaan hebben om terug te komen naar dit. 457 00:28:55,210 --> 00:29:01,020 Maar nu beseffen dat het probleem fundamenteel afgeleid uit het feit dat a en b exemplaren 458 00:29:01,020 --> 00:29:03,630 en ze zijn in hun eigen toepassingsgebied. 459 00:29:03,630 --> 00:29:05,050 Laten we proberen dit op te lossen op een bepaalde manier. 460 00:29:05,050 --> 00:29:11,250 Laat me eigenlijk scrollen hier terug en open te stellen, laten we zeggen, een vierde variant van deze, buggy4. 461 00:29:11,250 --> 00:29:13,370 Hoe zit dit? 462 00:29:13,370 --> 00:29:17,810 Dit is een soortgelijke, maar eenvoudiger probleem om naar te kijken voordat we een poging te nemen op het oplossen ervan. 463 00:29:17,810 --> 00:29:24,190 Dit programma heet increment, en blijkbaar initialiseert een x geheel getal van 1 in lijn 18. 464 00:29:24,190 --> 00:29:28,150 Vervolgens heb ik beweren x 1 is, ik dan beweren "Verhogen van ..." 465 00:29:28,150 --> 00:29:33,730 Ik roep increment, maar dan in lijnen 22 en 23, ik beweer het is al opgehoogd, 466 00:29:33,730 --> 00:29:40,220 Ik eis x is nu wat het ook is - 2 vermoedelijk, - maar dit programma is buggy. 467 00:29:40,220 --> 00:29:42,610 Wat is het probleem? 468 00:29:43,440 --> 00:29:50,160 Ja. >> [Onverstaanbaar student reactie] >> Precies. 469 00:29:50,160 --> 00:29:52,490 Dus x is verklaard, uiteraard, op lijn 18. 470 00:29:52,490 --> 00:29:54,700 Dat is binnen accolades belangrijkste is. 471 00:29:54,700 --> 00:29:58,440 Dus het simpele antwoord is dat, terwijl x hier bestaat, 472 00:29:58,440 --> 00:30:03,930 het bestaat niet in de lijn 32, zodat dit programma eigenlijk niet eens samen te stellen. 473 00:30:03,930 --> 00:30:07,940 De compiler wanneer ik probeer deze code compileren gaat schreeuwen 474 00:30:07,940 --> 00:30:14,100 over enkele zwart-id of iets van die strekking. In feite, laten we het proberen. 475 00:30:14,100 --> 00:30:18,470 Dit is te buggy4. Daar is het. 476 00:30:18,470 --> 00:30:22,110 Gebruik van 'x' aangegeven identifier in de lijn 32. 477 00:30:22,110 --> 00:30:25,580 En eigenlijk, dus laten we hier meer expliciete vandaag aan dat dit nuttig is 478 00:30:25,580 --> 00:30:27,580 in kantooruren en thuis. 479 00:30:27,580 --> 00:30:29,300 >> Merk op dat het een beetje cryptisch geschreven. 480 00:30:29,300 --> 00:30:37,270 Maar het feit dat Clang heeft schreeuwde naar ons, zeggende buggy4.c: 32:5, is eigenlijk nuttig. 481 00:30:37,270 --> 00:30:42,050 Dit betekent dat de fout op lijn 32 op tekenpositie 5. 482 00:30:42,050 --> 00:30:46,700 Dus 1, 2, 3, 4, 5. Dat is, in feite, waar het probleem. 483 00:30:46,700 --> 00:30:49,790 En ook, ook, in gedachten te houden tijdens kantooruren en thuis, ik ben gelukkig hier. 484 00:30:49,790 --> 00:30:52,990 Ik heb een fout gemaakt. Het gaat om relatief eenvoudig op te lossen. 485 00:30:52,990 --> 00:30:55,990 Maar als je een heel scherm vol met overweldigende foutmeldingen, 486 00:30:55,990 --> 00:31:00,330 nogmaals beseffen dat de onderste een net zou kunnen zijn symptomatisch voor de bovenste een. 487 00:31:00,330 --> 00:31:03,450 Dus altijd achtervolgen je bugs van boven naar beneden 488 00:31:03,450 --> 00:31:05,820 omdat er misschien wel een daisy chain effect 489 00:31:05,820 --> 00:31:09,240 dat suggereert u veel meer problemen dan je eigenlijk doen. 490 00:31:09,240 --> 00:31:15,150 Dus hoe kunnen we dit oplossen als mijn doel is om te hogen x? >> [Student] Zorg x mondiaal. 491 00:31:15,150 --> 00:31:17,060 Oke, dus we kunnen maken x mondiaal. 492 00:31:17,060 --> 00:31:20,480 Laten we de snelkoppeling die ik gewaarschuwd over vroeger, maar ach, we hoeven alleen maar een snelle oplossing, 493 00:31:20,480 --> 00:31:25,730 dus laten we gewoon zeggen int x hier. Dat maakt x mondiaal. 494 00:31:25,730 --> 00:31:31,800 Dus nu de belangrijkste toegang tot het en increment heeft toegang tot het, 495 00:31:31,800 --> 00:31:34,110 en dus laat me ga je gang en nu slaat deze. 496 00:31:34,110 --> 00:31:37,630 Maak buggy4, Enter. Lijkt nu te compileren. 497 00:31:37,630 --> 00:31:41,230 Laten we lopen buggy4. En het lijkt om daadwerkelijk te werken. 498 00:31:41,230 --> 00:31:45,150 Dit is een van die dingen dat is doen wat ik zeg, niet wat ik doe, 499 00:31:45,150 --> 00:31:47,010 zoals ik net heb hier gedaan, omdat in het algemeen, 500 00:31:47,010 --> 00:31:50,440 onze programma's gaat krijgen veel interessanter en veel langer dan dit, 501 00:31:50,440 --> 00:31:56,390 en als uw oplossing voor de problemen van het leven is gewoon alle variabelen zetten op de top van uw dossier, 502 00:31:56,390 --> 00:31:59,690 heel snel doen programma's te krijgen verschrikkelijk moeilijk te beheren. 503 00:31:59,690 --> 00:32:02,190 Het wordt nog lastiger te bedenken nieuwe variabele namen, 504 00:32:02,190 --> 00:32:05,240 het wordt nog lastiger om te begrijpen wat de variabele doet wat, 505 00:32:05,240 --> 00:32:08,460 en dat in het algemeen is dit geen goede oplossing. 506 00:32:08,460 --> 00:32:10,030 Dus laten we dit doen beter. 507 00:32:10,030 --> 00:32:12,160 We willen niet een globale variabele gebruiken hier. 508 00:32:12,160 --> 00:32:16,240 >> Ik wil wel x verhogen, dus ik kon natuurlijk - 509 00:32:16,240 --> 00:32:18,670 aan het eind van de dag, dit is een soort van een dwaze verhaal, omdat we dit gewoon doen - 510 00:32:18,670 --> 00:32:24,450 maar als ik nog niet wist over de exploitant, of ik was niet toegestaan ​​om het te veranderen in de belangrijkste zelf, 511 00:32:24,450 --> 00:32:30,730 Hoe kon ik anders implementeren Ken hier nu niet om kubus, maar op te hogen? 512 00:32:31,380 --> 00:32:33,190 Hoe kan ik hier veranderen dit ding? Ja. 513 00:32:33,190 --> 00:32:38,480 [Student] Pass in x en dan terug [onverstaanbaar] >> Oke, goed. 514 00:32:38,480 --> 00:32:41,900 Dus waarom niet ik pas in x en vervolgens in plaats van terug, 515 00:32:41,900 --> 00:32:44,870 waarom ik niet gewoon terug x + 1. 516 00:32:44,870 --> 00:32:47,710 Een paar dingen moet hier veranderen. Ik ben op de goede weg. 517 00:32:47,710 --> 00:32:49,770 Wat heb ik nodig om te tweaken? Iemand anders. Ja. 518 00:32:49,770 --> 00:32:51,740 [Onverstaanbaar student reactie] 519 00:32:51,740 --> 00:32:54,730 Ik moet de return type van de groei te veranderen omdat het niet ongeldig maken. 520 00:32:54,730 --> 00:32:57,780 Leegte betekent niets wordt geretourneerd, maar het is duidelijk nu is, 521 00:32:57,780 --> 00:32:59,830 dus dit moet veranderen - >> [student] int. 522 00:32:59,830 --> 00:33:02,740 int overeenstemming te zijn met alles wat ik ben eigenlijk terug. 523 00:33:02,740 --> 00:33:05,180 Nu iets anders is nog steeds buggy hier. Ja. 524 00:33:05,180 --> 00:33:08,400 [Onverstaanbaar student antwoord] >> [Malan] Dus ik moet x verhogen? 525 00:33:08,400 --> 00:33:12,080 [Onverstaanbaar student antwoord] >> [Malan] Ah, dus ik moet x passeren. 526 00:33:12,080 --> 00:33:16,660 Dus ik moet hier doen. >> [Onverstaanbaar student commentaar] 527 00:33:16,660 --> 00:33:20,050 [Malan] Dus het prototype, ik moet dit veranderen hier. 528 00:33:20,050 --> 00:33:22,930 Dit heeft dus te worden een int, deze is geworden tot - 529 00:33:22,930 --> 00:33:25,620 hmm, ik heb eigenlijk een bug hier beneden. Laten we eerst bevestig deze. 530 00:33:25,620 --> 00:33:29,590 Wat moet dit eigenlijk? Het moet een int iets. 531 00:33:29,590 --> 00:33:32,700 Het zou kunnen zijn x, maar eerlijk gezegd, als je begint te bellen al je variabelen x, 532 00:33:32,700 --> 00:33:35,390 het gaat steeds minder duidelijk wat wat is. 533 00:33:35,390 --> 00:33:39,560 >> Dus laten we gewoon willekeurig een andere naamgevingsconventie voor mijn helper functies te kiezen, 534 00:33:39,560 --> 00:33:41,940 functies die ik aan het schrijven ben. We noemen het een, of we kunnen noemen - 535 00:33:41,940 --> 00:33:45,010 Laten we het nummer nog explicieter. 536 00:33:45,010 --> 00:33:47,560 Dus dan moet ik om terug te keren, ongeacht het aantal is plus 1, 537 00:33:47,560 --> 00:33:50,740 en nu moet ik een andere ding veranderen hier en een ander ding hier. 538 00:33:50,740 --> 00:33:54,350 Wat moet ik eerst wijzigen op lijn 21? >> [Onverstaanbaar student reactie] 539 00:33:54,350 --> 00:33:57,610 [Malan] Ik heb deze wordt toegekend aan x. Ik kan niet zomaar bellen increment (x). 540 00:33:57,610 --> 00:34:01,960 Ik moet het antwoord onthouden door het veranderen van de waarde van x op de linkerkant. 541 00:34:01,960 --> 00:34:04,680 En hoewel x nu op de links en rechts, dat is helemaal goed 542 00:34:04,680 --> 00:34:08,860 omdat de rechterkant wordt eerst uitgevoerd krijgt dan plofte in de linker ding - 543 00:34:08,860 --> 00:34:10,600 x in dit geval. 544 00:34:10,600 --> 00:34:12,159 En dan tot slot, is dit een makkelijke oplossing nu. 545 00:34:12,159 --> 00:34:17,230 Dit moet gewoon overeenkomen met wat er onder zitten, int number. 546 00:34:17,230 --> 00:34:20,570 Dus een hele hoop veranderingen voor een hele domme functie 547 00:34:20,570 --> 00:34:24,420 maar vertegenwoordiger van de dingen die we in toenemende mate zullen willen doen. 548 00:34:24,420 --> 00:34:27,090 Dus zorg buggy4. Ik heb het verknald ergens. 549 00:34:27,090 --> 00:34:30,139 Oh, mijn God. Vijf fouten in een 6-line programma. 550 00:34:30,139 --> 00:34:35,690 Dus wat is er mis op lijn 18, character 5? 551 00:34:35,690 --> 00:34:39,610 Dus ik moet dit, int te declareren. 552 00:34:39,610 --> 00:34:41,920 Laten we eens kijken. Er zijn een hele hoop andere fouten. 553 00:34:41,920 --> 00:34:47,010 Oh, mijn God - 19, 18, 21 - maar nogmaals, laten we gewoon het scherm te verwijderen, hier Control L, 554 00:34:47,010 --> 00:34:49,380 en herstart Clang. 555 00:34:49,380 --> 00:34:51,340 Dus 5 problemen is eigenlijk alleen maar dat 1. 556 00:34:51,340 --> 00:34:57,520 Dus laten we nu lopen buggy4, Enter. Oef, is x correct opgehoogd. 557 00:34:57,520 --> 00:35:02,720 Oke. Hebt u vragen over de manier waarop getallen verhogen? Ja. 558 00:35:02,720 --> 00:35:09,870 [Onverstaanbaar student vraag] >> Goede vraag. 559 00:35:09,870 --> 00:35:14,220 Hoe komt het dat ik kan x veranderen in aantal en het programma zal onmiddellijk weten? 560 00:35:14,220 --> 00:35:16,200 >> Nogmaals, denk aan het als deze abstractie. 561 00:35:16,200 --> 00:35:21,600 Dus als ik de belangrijkste en Ken is increment, eerlijk gezegd, kan me niet schelen wat Ken noemt zijn iPad. 562 00:35:21,600 --> 00:35:26,570 Kan me niet schelen wat hij noemt alles wat te maken heeft met zijn uitvoering van deze functionaliteit. 563 00:35:26,570 --> 00:35:33,340 Dit is een implementatie detail dat ik, de belangrijkste, geen zorgen te maken over. 564 00:35:33,340 --> 00:35:38,250 En dus simpelweg het veranderen van het consequent binnenkant van de functie - nummer hier en nummer hier - 565 00:35:38,250 --> 00:35:40,960 is alles wat nodig zolang ik opnieuw te compileren. 566 00:35:40,960 --> 00:35:44,180 Het is een soort van leuk als je erover nadenkt velen van ons, die van u met rijbewijzen 567 00:35:44,180 --> 00:35:46,770 die hebben of gereden als je hebt zelfs gereden in een auto, 568 00:35:46,770 --> 00:35:50,950 de meesten van ons hebben geen idee hoe een auto werkt onder de kap. 569 00:35:50,950 --> 00:35:54,970 En letterlijk, bij het openen van de motorkap, de meesten van ons - waaronder ikzelf - 570 00:35:54,970 --> 00:35:56,940 zijn niet van plan om echt te weten waar we naar op, 571 00:35:56,940 --> 00:35:59,220 een beetje zoals je nu misschien voelen met dingen zoals dit recht. 572 00:35:59,220 --> 00:36:01,480 Maar we hoeven niet echt schelen hoe de auto werkt, 573 00:36:01,480 --> 00:36:05,970 we hoeven niet te schelen wat alle stangen en zuigers en kabels in de auto 574 00:36:05,970 --> 00:36:08,160 eigenlijk doen. 575 00:36:08,160 --> 00:36:12,770 Dus iets als wat je noemt de zuiger maakt hier niet uit in dit geval. Hetzelfde idee. 576 00:36:12,770 --> 00:36:25,300 Ja. >> [Onverstaanbaar student vraag] 577 00:36:25,300 --> 00:36:29,180 Als er meer toepassingen van de variabele xa zojuist 578 00:36:29,180 --> 00:36:32,150 u, de programmeur, zou moeten overal veranderen. 579 00:36:32,150 --> 00:36:36,600 Of je zou kunnen letterlijk doen Bestand, Menu en vervolgens zoeken, Vervangen - zoiets - 580 00:36:36,600 --> 00:36:39,170 maar je gaat te hebben om die wijzigingen zelf. 581 00:36:39,170 --> 00:36:47,450 Je moet consequent zijn. >> [Student] Als er meerdere variabelen [onverstaanbaar] 582 00:36:47,450 --> 00:36:53,100 Een bepaalde volgorde zoals hier, als dit was int een ander nummer? >> [Student] Correct. 583 00:36:53,100 --> 00:36:56,590 [Malan] Ja. Bestel belangrijk wanneer u belt de functie. 584 00:36:56,590 --> 00:37:00,050 >> Dus als ik riepen Toename hier met iets komma iets, 585 00:37:00,050 --> 00:37:01,680 er is een directe mapping. 586 00:37:01,680 --> 00:37:05,690 De eerste variabele, wat het ook heet, is gemaakt van een kopie van het eerste argument hier. 587 00:37:05,690 --> 00:37:07,760 Sorry. Dit moet niet een haakje. 588 00:37:07,760 --> 00:37:11,490 Het tweede argument een lijn staat met de tweede. Dus orde, ja, zaken. Oke. 589 00:37:11,490 --> 00:37:17,020 Sorry. Ik nam de lange weg om er te komen. Andere vragen? Oke. 590 00:37:17,020 --> 00:37:20,610 Dus laten we kijken of we niet een beeld schetsen van wat er werkelijk gaande is hier 591 00:37:20,610 --> 00:37:23,090 onder de kap, om zo te zeggen. 592 00:37:23,090 --> 00:37:26,640 Dit is een rechthoek die geheugen van uw computer zouden kunnen betekenen. 593 00:37:26,640 --> 00:37:30,970 Zelfs als je geen idee hebt hoe het geheugen werkt of hoe RAM werkt, 594 00:37:30,970 --> 00:37:33,940 op zijn minst aannemen dat je trossen van het hebben van deze dagen. 595 00:37:33,940 --> 00:37:36,280 Je hebt megabytes kreeg het, je hebt gigabytes aan het, 596 00:37:36,280 --> 00:37:40,870 en we weten uit week 0, dat een byte is precies wat? >> [Student] 8 bits. 597 00:37:40,870 --> 00:37:42,950 8 bits, toch? Dus 8 nullen en 1. 598 00:37:42,950 --> 00:37:45,880 Dus als uw computer is voorzien van een gig RAM, 2 optredens van RAM-geheugen van deze dag, 599 00:37:45,880 --> 00:37:55,030 je hebt een miljard of 2 miljard bytes van het geheugen of ongeveer 8 miljard of 16 miljard bits 600 00:37:55,030 --> 00:37:56,890 binnenkant van uw computer. 601 00:37:56,890 --> 00:38:00,590 In tegenstelling tot de kleine Wooly Willy voorbeeld, het is niet magnetische deeltjes meestal meer. 602 00:38:00,590 --> 00:38:04,450 In toenemende mate - in laptops althans - het is solid state drives, SSD's, 603 00:38:04,450 --> 00:38:08,580 die net hebben geen bewegende delen. Het is allemaal elektronisch. Het is alle elektriciteit op basis van. 604 00:38:08,580 --> 00:38:14,060 Dus denk aan deze rechthoek als gewoon die het 1 of 2 gigabyte aan geheugen die je hebt. 605 00:38:14,060 --> 00:38:16,020 >> Dus het is een stuk van het geheugen. 606 00:38:16,020 --> 00:38:19,830 De wereld van de informatica is soort van afgescheiden 607 00:38:19,830 --> 00:38:22,950 delen van het geheugen om verschillende dingen te doen. 608 00:38:22,950 --> 00:38:27,190 Bijvoorbeeld, als dit computer RAM, zoals voorgesteld door de rechthoek is, 609 00:38:27,190 --> 00:38:31,130 blijkt dat volgens afspraak, dus aan de bovenkant van uw RAM-geheugen, spreken, 610 00:38:31,130 --> 00:38:33,660 is over het algemeen wat heet een tekstsegment. 611 00:38:33,660 --> 00:38:36,740 Dat zijn de 0s en 1s die u hebt gecompileerd. 612 00:38:36,740 --> 00:38:39,020 Dus toen hebben we gekeken onder de kap naar wat a.out is, 613 00:38:39,020 --> 00:38:41,980 al deze 0s en 1s, wanneer u een programma uit te voeren, 614 00:38:41,980 --> 00:38:46,290 die 0s en 1s worden geladen van uw harde schijf in een zogenaamde RAM-geheugen, 615 00:38:46,290 --> 00:38:49,320 en in het RAM-geheugen dat ze brengen aan de top. 616 00:38:49,320 --> 00:38:52,770 Ondertussen heb je andere dingen: initialiseren gegevens, ongedaan te gegevens. 617 00:38:52,770 --> 00:38:57,510 Deze 2 zwaden van het geheugen verwijzen naar globale variabelen, die u niet vaak gebruikt 618 00:38:57,510 --> 00:39:00,760 maar soms als je dat doet, belanden ze daar ook. 619 00:39:00,760 --> 00:39:04,260 Dan is er nog een aantal andere dingen: omgevingsvariabelen, die we niet veel tijd te besteden aan, 620 00:39:04,260 --> 00:39:06,860 maar toen 2 belangrijke dingen die terugkomt in de hele semester, 621 00:39:06,860 --> 00:39:08,550 stack en heap. 622 00:39:08,550 --> 00:39:12,210 Dus het grootste deel van het geheugen van uw computer is gereserveerd bij het uitvoeren van een programma 623 00:39:12,210 --> 00:39:15,370 voor iets genaamd de stapel en iets genaamd de heap. 624 00:39:15,370 --> 00:39:18,840 We gaan niet om te praten over de hoop vandaag, maar we zullen praten over de stapel. 625 00:39:18,840 --> 00:39:24,600 De stapel is bedoeld om roepen de visuele van de eetzaal maaltijd trays in Mather Huis 626 00:39:24,600 --> 00:39:28,110 of waar u zich ook bevindt, waar de eetzaal personeel schoonmaken elke dag, 627 00:39:28,110 --> 00:39:30,180 ze stapelen ze van de vloer op maximaal, 628 00:39:30,180 --> 00:39:34,550 en evenzo in het geheugen, is er dit idee om iets op een stapel, 629 00:39:34,550 --> 00:39:36,860 om iets op een stapel, om iets op een stapel. 630 00:39:36,860 --> 00:39:38,240 En wat bedoelen we hiermee? 631 00:39:38,240 --> 00:39:41,860 >> Laten we inzoomen op alleen de onderste helft van deze foto, van uw computer RAM-geheugen, 632 00:39:41,860 --> 00:39:44,330 de volgende voorstellen. 633 00:39:44,330 --> 00:39:48,170 Het blijkt dat wanneer je een programma zoals a.out of hallo te voeren - 634 00:39:48,170 --> 00:39:50,100 ongeacht het programma is dat je hebt geschreven - 635 00:39:50,100 --> 00:39:54,020 weer, die 0s en 1s worden geladen vanaf de harde schijf, dat is langdurige opslag, 636 00:39:54,020 --> 00:39:57,230 blijft daar zelfs wanneer u aan de stekker trekken, geladen in het RAM. 637 00:39:57,230 --> 00:40:00,610 RAM-geheugen is sneller dan harde schijven - het is kleiner dan harde schijven - 638 00:40:00,610 --> 00:40:03,300 maar het is waar programma's leven, terwijl je draait ze. 639 00:40:03,300 --> 00:40:08,230 Dus je dubbel van een programma op een Mac of pc op, het is geladen vanaf de harde schijf in het RAM. 640 00:40:08,230 --> 00:40:11,520 Zodra het is geladen in het RAM, de 0s en 1s gaan op de weg boven, 641 00:40:11,520 --> 00:40:16,610 de zogenaamde tekstsegment, maar dan zodra uw programma daadwerkelijk begint te lopen, 642 00:40:16,610 --> 00:40:21,360 de belangrijkste functie wordt aangeroepen, en de belangrijkste, zoals we hebben gezien, heeft vaak lokale variabelen, 643 00:40:21,360 --> 00:40:24,870 en het heeft ints en strijkers en tekens en dergelijke. 644 00:40:24,870 --> 00:40:29,180 Dus als je het programma dat je hebt geschreven of het programma dat u dubbel hebt geklikt 645 00:40:29,180 --> 00:40:32,970 gebruikte een aantal variabelen in de belangrijkste, 646 00:40:32,970 --> 00:40:37,240 ze uiteindelijk op de bodem van je stack van het geheugen, om zo te zeggen. 647 00:40:37,240 --> 00:40:39,410 Meer concreet, dat wil wat eigenlijk? 648 00:40:39,410 --> 00:40:48,450 Dit betekent gewoon dat als we zouden gaan om het aantal bytes van RAM-geheugen in uw computer, 649 00:40:48,450 --> 00:40:55,750 merken dat dit zou byte nummer 0 zijn, kan dit byte nummer 1, 2, 3, 4, 5, 6, 650 00:40:55,750 --> 00:41:01,480 helemaal tot 2 miljard zou helemaal tot daar aan de top te zijn. 651 00:41:01,480 --> 00:41:05,880 Met andere woorden, als het over RAM of geheugen in termen van bytes, 652 00:41:05,880 --> 00:41:11,500 het betekent alleen dat iemand heeft besloten wat voor elk van deze delen van het geheugen tellen. 653 00:41:11,500 --> 00:41:16,650 Dus als u 32-bits voor een int nodig of je moet 8 bits voor een char, 654 00:41:16,650 --> 00:41:18,840 waar komen ze terecht in het geheugen? 655 00:41:18,840 --> 00:41:22,350 >> Conceptueel, maar ze belanden op de bodem van dit ding heet de stapel. 656 00:41:22,350 --> 00:41:25,870 Maar wat interessant is nu bij de belangrijkste oproepen van een functie - 657 00:41:25,870 --> 00:41:28,750 Stel dat een functie genaamd foo, gewoon een willekeurige naam - 658 00:41:28,750 --> 00:41:32,330 wat gebeurt belangrijkste is onderaan deze stapel geheugen; 659 00:41:32,330 --> 00:41:35,680 foo nu wordt gelegd op de top van de belangrijkste in het geheugen. 660 00:41:35,680 --> 00:41:40,990 Dus elke lokale variabelen die foo heeft uiteindelijk soort van conceptueel boven die in de belangrijkste. 661 00:41:40,990 --> 00:41:47,070 Als foo roept een andere functie genaamd bar, die variabelen hier terecht. 662 00:41:47,070 --> 00:41:50,120 Als bar noemt iets anders, hier, hier, hier. 663 00:41:50,120 --> 00:41:53,830 Dus wat interessant is aan het uitvoeren van een programma is dat als je functies aanroepen 664 00:41:53,830 --> 00:41:57,750 en als die functies aan te roepen functies en als die functies aan te roepen functies, 665 00:41:57,750 --> 00:42:01,470 bouw je deze stapel van functies in het geheugen. 666 00:42:01,470 --> 00:42:06,890 En slechts een keer per functie terugkeert begin je krijgt dat het geheugen terug. 667 00:42:06,890 --> 00:42:10,860 Dus een van de makkelijkste manieren om opraken van geheugen in een computer programma 668 00:42:10,860 --> 00:42:14,360 is het schrijven van functies die nooit meer terug. 669 00:42:14,360 --> 00:42:18,900 Dus bijvoorbeeld, laten we zo veel aan te tonen met een opzettelijk buggy programma. 670 00:42:18,900 --> 00:42:22,230 Laat me ga je gang en doen # include , 671 00:42:22,230 --> 00:42:25,000 int main (void), 672 00:42:25,000 --> 00:42:32,940 en ik ga doen, terwijl (2> 1), die waarschijnlijk nooit zal veranderen op ons, 673 00:42:32,940 --> 00:42:37,560 en laat me nu ga je gang en doe printf. 674 00:42:37,560 --> 00:42:40,700 Eigenlijk, dat gaat minder visueel interessant. Laten we dit doen. 675 00:42:40,700 --> 00:42:50,240 Voor int i = 0; i> 0 - laten we deze fout - i + +. 676 00:42:50,240 --> 00:42:52,720 En laten we niet printf hier. Laten we doen wat ik predikte. 677 00:42:52,720 --> 00:43:00,190 Laten we een methode hier, nietig koor, en we zullen int i say, 678 00:43:00,190 --> 00:43:06,830 en dan ga ik naar printf zeggen - nee, laten we dit nog interessanter. 679 00:43:06,830 --> 00:43:15,790 Laten we eigenlijk niets afgedrukt. Laten we dit doen: chorus (i). 680 00:43:15,790 --> 00:43:20,390 Oke. Dus dit is buggy want waarom? 681 00:43:20,390 --> 00:43:23,380 Ik verzin dit niet als ik ga, omdat het programma niet echt iets van belang. 682 00:43:23,380 --> 00:43:25,320 >> Maar dat is niet het doel. 683 00:43:25,320 --> 00:43:29,630 Het doel is het schrijven van een programma met als belangrijkste functie doet wat, blijkbaar? 684 00:43:30,720 --> 00:43:32,860 Bel zelf. En eigenlijk hebben we niet nodig hebben de lus. 685 00:43:32,860 --> 00:43:37,200 Laten we zelfs vereenvoudigen dit net zo als niet uit het oog werkelijk de fundamentele fout te verliezen. 686 00:43:37,200 --> 00:43:39,640 Belangrijkste oproepen koor een aantal koor te zingen, 687 00:43:39,640 --> 00:43:41,440 toen deed ik iets stoms en ik had refrein oproep koor 688 00:43:41,440 --> 00:43:43,760 want ik nam aan iemand anders zou gaan misschien implementeren, 689 00:43:43,760 --> 00:43:47,210 en nu deze is niet van plan om nog samen te stellen. Ik moet wat doen? 690 00:43:47,210 --> 00:43:49,970 Ik moet het prototype, herinneren. 691 00:43:49,970 --> 00:43:56,110 Dus ik moet hier zijn de lege chorus (int i); 692 00:43:56,110 --> 00:43:59,210 Dus nu als ik ga hier beneden - in feite, laten we gebruik maken van de groter venster. 693 00:43:59,210 --> 00:44:01,980 Laten we verder gaan en maken refrein. 694 00:44:01,980 --> 00:44:06,490 Laten we verder gaan en maken refrein. 695 00:44:06,490 --> 00:44:08,370 Gebruik van niet-aangegeven identifier i. 696 00:44:08,370 --> 00:44:12,500 Oh, dat was stom. We hebben geen behoefte het argument. Laten we dit doen. 697 00:44:12,500 --> 00:44:16,370 Ik wou dat we op deze manier begonnen. Het zou veel gemakkelijker programma te schrijven. 698 00:44:16,370 --> 00:44:25,590 Er. Laten we nu over te gaan naar mijn terminal venster, voert u Clang, en daar gaan we. 699 00:44:25,590 --> 00:44:28,460 Dat was echt snel. 700 00:44:28,460 --> 00:44:31,150 Wat er feitelijk gebeurde, hoewel? 701 00:44:31,150 --> 00:44:33,730 Nou, nu zal ik voeg de afdruk lijn zodat we kunnen zien. 702 00:44:33,730 --> 00:44:43,490 Laat ik zeggen printf ("Ik ben hier") - geen variabelen. We laten het zo. 703 00:44:43,490 --> 00:44:47,480 Laat me herhaling te maken. Laat me herhaling refrein. 704 00:44:47,480 --> 00:44:57,380 En ... kom op. Ga door. 705 00:44:57,380 --> 00:44:59,930 Even terzijde, heeft waarom het niet neergestort nog? 706 00:44:59,930 --> 00:45:02,080 De segmentatie fout gebeurd super snel voor. 707 00:45:02,080 --> 00:45:06,570 [Onverstaanbaar student reactie] >> Precies. Dus het kost tijd om af te drukken, toch? 708 00:45:06,570 --> 00:45:08,610 Het duurt slechts meer werk van de kant van de computer. 709 00:45:08,610 --> 00:45:10,620 En daar is het: Segmentation fault. 710 00:45:10,620 --> 00:45:12,340 >> Dus zien hoe snel programma's te draaien. 711 00:45:12,340 --> 00:45:14,130 Als u niet aan het afdrukken iets, super snel. 712 00:45:14,130 --> 00:45:18,770 Maar we hebben nog steeds deze segmentation fault omdat wat er gebeurde? 713 00:45:18,770 --> 00:45:21,210 Als u denkt over de manier waarop geheugen van uw computer is aangelegd, 714 00:45:21,210 --> 00:45:28,740 dit gebeurt te zijn de belangrijkste, maar hier laten we dit koor roepen, en laten we dit koor. 715 00:45:28,740 --> 00:45:34,550 En als ik nu doe mijn esthetiek recht, wordt deze gewoon naar chorus, chorus, chorus zeggen, 716 00:45:34,550 --> 00:45:40,550 chorus, chorus, chorus, chorus, tot vervelens toe, en uiteindelijk, wat er gaat gebeuren? 717 00:45:40,550 --> 00:45:45,630 Als het grote geheel, letterlijk, is dit, wat gebeurt er gewoon conceptueel? 718 00:45:46,520 --> 00:45:48,630 De stapel overschrijdingen van de heap. 719 00:45:48,630 --> 00:45:51,940 Of, erger nog, je gewoon overspoeld alles, met inbegrip van de tekst segment, 720 00:45:51,940 --> 00:45:54,590 dat is de 0s en 1s dat uw programma vertegenwoordigen. 721 00:45:54,590 --> 00:45:57,080 Kortom, dit is gewoon super, super slecht. 722 00:45:57,080 --> 00:45:58,830 Uw programma is onbeheersbaar. 723 00:45:58,830 --> 00:46:01,220 Je gebruikt veel meer geheugen dan je van plan 724 00:46:01,220 --> 00:46:03,960 allemaal door een domme fout in dit geval, 725 00:46:03,960 --> 00:46:08,040 of in dit geval een heel bewust gedaan functie die zichzelf. 726 00:46:08,040 --> 00:46:09,500 Nu, dit is niet allemaal slecht. 727 00:46:09,500 --> 00:46:13,800 Functies die zichzelf heeft eigenlijk veel macht bij het gebruik van het goed. 728 00:46:13,800 --> 00:46:15,800 Ik heb niet gebruikt het goed hier. 729 00:46:15,800 --> 00:46:19,780 Dus dit is niet allemaal slecht, maar het feit dat ik eigenlijk nooit stoppen met bellen me 730 00:46:19,780 --> 00:46:23,520 is een zwak punt hier van dit programma. 731 00:46:23,520 --> 00:46:26,400 Dus waar gaan we heen met dit alles? Wat is er echt aan de hand? 732 00:46:26,400 --> 00:46:30,340 Toen ik de stap functie aan te roepen dat we aan het doen waren in die voorbeelden, 733 00:46:30,340 --> 00:46:33,420 Ik heb een waarde als 1 die ik pas binnen 734 00:46:33,420 --> 00:46:37,570 Ik passeer in een kopie van het nummer 1, dus gebeurt het volgende. 735 00:46:37,570 --> 00:46:44,240 Laten we naar de toename voorbeeld, deze man rechts over hier. 736 00:46:44,240 --> 00:46:46,870 Hier is wat er daadwerkelijk gebeurt. 737 00:46:46,870 --> 00:46:53,400 Toen ik increment bellen en ik passeer in x, picturaal, wat is hier aan de hand is dit. 738 00:46:53,400 --> 00:46:59,520 >> Als ik de waarde van 1 hier opgeslagen en ik daadwerkelijk op te roepen increment, 739 00:46:59,520 --> 00:47:04,330 die nu wordt genoemd koor - de iPad is het gooien van me af hier. 740 00:47:04,330 --> 00:47:09,760 Laten we deze toename, en we weten niet wat deze volgende functie gaat worden. 741 00:47:09,760 --> 00:47:14,840 Dus wat er eigenlijk gebeurt, is hier ergens in de belangrijkste heb ik een stuk van het geheugen 742 00:47:14,840 --> 00:47:17,000 dat opslaan van het nummer 1. 743 00:47:17,000 --> 00:47:19,380 Toen ik increment bellen, ik gebruik een andere stuk van het geheugen, 744 00:47:19,380 --> 00:47:21,230 maar nu heb ik de kopie van 1. 745 00:47:21,230 --> 00:47:26,660 Toen ik verhoog deze waarde, wordt dit 2, 746 00:47:26,660 --> 00:47:30,560 maar wat gebeurt er dan zo spoedig Toename rendement? 747 00:47:30,560 --> 00:47:33,630 Dit geheugen gewoon wordt teruggegeven aan het besturingssysteem, 748 00:47:33,630 --> 00:47:37,450 wat betekent dat alles wat je hebt gedaan is niets nuttigs. 749 00:47:37,450 --> 00:47:43,120 De 1 die oorspronkelijk was opgenomen in de belangrijkste is nog steeds daar feitelijk. 750 00:47:43,120 --> 00:47:44,890 Waar gaan we heen? 751 00:47:44,890 --> 00:47:49,770 Het blijkt dat in dit geheugen back-to-back reeks bytes 752 00:47:49,770 --> 00:47:53,050 die je kunt zetten spullen in, en het blijkt dat we al iets gezien 753 00:47:53,050 --> 00:47:55,390 dat inhoudt dat dingen rug aan rug aan rug aan rug. 754 00:47:55,390 --> 00:47:59,860 Wat is een string op basis van week 1 en week 2 nu? 755 00:48:00,020 --> 00:48:01,980 Het is gewoon een verzameling van tekens. 756 00:48:01,980 --> 00:48:04,310 Zo blijkt, net zoals u kunt nummers zetten in het geheugen, 757 00:48:04,310 --> 00:48:06,990 evenzo kan je er tekens in het geheugen. 758 00:48:06,990 --> 00:48:10,530 En als we eenmaal beginnen met het opzetten tekens in het geheugen rug aan rug aan rug aan rug, 759 00:48:10,530 --> 00:48:13,620 blijkt dat met de eenvoudige dingen zoals een for-lus of een while-lus, 760 00:48:13,620 --> 00:48:17,170 we kunnen herhalen van links naar rechts over de karakters in een string 761 00:48:17,170 --> 00:48:20,600 en beginnen masseren ze in verschillende karakters in totaal - 762 00:48:20,600 --> 00:48:23,370 a zou kunnen worden b, kan b worden c - 763 00:48:23,370 --> 00:48:27,780 zodat uiteindelijk, kunnen we een Engels zin die daadwerkelijk zinvol 764 00:48:27,780 --> 00:48:30,310 en omzetten elk van deze letters een voor een 765 00:48:30,310 --> 00:48:34,400 door een wandeling door het geheugen van onze computer links naar rechts om daadwerkelijk te versleutelen. 766 00:48:34,400 --> 00:48:35,810 Dus laten we hier nemen onze vijf minuten pauze, 767 00:48:35,810 --> 00:48:40,730 en als we terug komen, zullen we beginnen met dit proces van scrambling informatie. 768 00:48:42,020 --> 00:48:43,520 >> Oke. 769 00:48:43,520 --> 00:48:48,070 Voordat we een duik in een aantal crypto en deze dingen genoemd arrays, 770 00:48:48,070 --> 00:48:51,470 laat me pauze voor eventuele vragen, omdat ik het gevoel dat ik echt een soort van verwarde 771 00:48:51,470 --> 00:48:54,080 een aantal van deze onderwerpen. Dus laten we nu oplossen als we kunnen. 772 00:48:54,080 --> 00:48:58,700 We hebben net gesproken over terugkeer waarden, hebben we gesproken over argumenten, 773 00:48:58,700 --> 00:49:03,250 en we hadden het over dit idee, dat we komen terug in de komende weken, 774 00:49:03,250 --> 00:49:08,720 van het bekijken van het geheugen als een hele hoop van deze gestapelde trays, om zo te zeggen, 775 00:49:08,720 --> 00:49:12,660 van beneden naar boven, zodat elke lade wordt op de stack 776 00:49:12,660 --> 00:49:16,530 representeert een functie die momenteel wordt gebeld. 777 00:49:17,900 --> 00:49:20,260 Nog vragen? 778 00:49:20,260 --> 00:49:22,640 Laat me een vraag stellen hier. 779 00:49:22,640 --> 00:49:27,890 Laat ik dit terug te vereenvoudigen naar wat het was voor een aantal van onze eerdere Q & A. 780 00:49:27,890 --> 00:49:35,570 Het feit dat increment open haakje, int nummer heeft, gesloten tussen haakjes - 781 00:49:35,570 --> 00:49:39,110 wat doet int number vertegenwoordigen? 782 00:49:39,110 --> 00:49:42,790 [Student] Een argument. >> Een argument. Oke. Maar wat is een argument? 783 00:49:42,790 --> 00:49:46,370 [Onverstaanbaar student reactie] >> Wat is dat? >> [Student] Iets dat je langs inch 784 00:49:46,370 --> 00:49:49,940 Oke, dus iets dat je langs inch En meer in het algemeen, het is gewoon de ingang. 785 00:49:49,940 --> 00:49:52,450 Als u het schrijven van een functie en die functie doel in het leven 786 00:49:52,450 --> 00:49:55,770 is om iets te doen een beetje anders elke keer dat je het gebruikt, 787 00:49:55,770 --> 00:50:00,110 dan is de enige manier om dat te laten echt gebeuren lijkt te zijn om het te voorzien van input 788 00:50:00,110 --> 00:50:03,510 zodat het iets anders met die ingang telkens. 789 00:50:03,510 --> 00:50:06,650 >> Dus je moet twee dingen te geven wanneer een functie neemt ingang. 790 00:50:06,650 --> 00:50:09,590 U moet de naam die u wilt geven op die ingang te geven 791 00:50:09,590 --> 00:50:12,700 puur voor je eigen gemak, zodat u kunt verwijzen naar het 792 00:50:12,700 --> 00:50:16,540 in de functie die je zelf schrijft, als ik hier in de lijn 32. 793 00:50:16,540 --> 00:50:20,800 Maar je moet ook aan het type te specificeren omdat C is een programmeertaal 794 00:50:20,800 --> 00:50:25,940 dat vereist alleen dat als je een variabele, moet u de computer vertellen wat data type het is, 795 00:50:25,940 --> 00:50:30,200 grotendeels zodat het weet hoeveel bits toewijzen aan die variabele 796 00:50:30,200 --> 00:50:33,020 want het kan 6 - me, zal het niet 6. 797 00:50:33,020 --> 00:50:37,080 Het kan 16 het kan 8, kan het 32 ​​zelfs 64, 798 00:50:37,080 --> 00:50:39,130 maar de computer moet weten. 799 00:50:39,130 --> 00:50:43,180 Nu de int aan de linkerkant staat voor wat daarentegen? 800 00:50:46,350 --> 00:50:48,850 [Onverstaanbaar student reactie] >> Wat is dat? >> [Student] Soort functie. 801 00:50:48,850 --> 00:50:53,610 Het type van een functie en meer bepaald het type van de output. Juist. 802 00:50:53,610 --> 00:50:57,380 Dus terwijl het ding tussen haakjes staat voor de ingang, indien van toepassing, 803 00:50:57,380 --> 00:50:59,660 het ding aan de linkerkant geeft haar output. 804 00:50:59,660 --> 00:51:03,530 En in dit geval, increment terug blijkbaar een int, 805 00:51:03,530 --> 00:51:07,690 en zo int is de terugkeer van dit type functie. 806 00:51:07,690 --> 00:51:09,340 Wat betekent het om terug te keren? 807 00:51:09,340 --> 00:51:15,090 Letterlijk, gebruikt u het zoekwoord terug en dan als wat je terug 808 00:51:15,090 --> 00:51:18,600 rechts van het trefwoord is een geheel getal, 809 00:51:18,600 --> 00:51:21,660 dan is dat inderdaad overeen met wat we hebben beloofd. 810 00:51:21,660 --> 00:51:26,410 Je kon het niet zoiets als dit - hello, world - want dat is een string. 811 00:51:26,410 --> 00:51:28,860 >> Uiteraard is geen geheel getal. 812 00:51:28,860 --> 00:51:33,140 Dus in het kort, de last is echt op ons, de programmeur, om precies te zijn 813 00:51:33,140 --> 00:51:37,770 over wat we terug en dan eigenlijk gaan over terug te zenden. 814 00:51:37,770 --> 00:51:43,440 De context hier is nu dat geheugen van uw computer is een gigabyte, 2 gigabyte - 815 00:51:43,440 --> 00:51:45,920 wat dan ook - misschien is het meer, misschien is het minder, 816 00:51:45,920 --> 00:51:49,050 maar de computer ziet het als het hebben van verschillende secties. 817 00:51:49,050 --> 00:51:51,200 Er gaat iets daar beneden, iets anders gaat daar, 818 00:51:51,200 --> 00:51:54,290 verschillende dingen gaat in het midden, en vandaag hebben we gewoon beginnen vertellen van het verhaal, 819 00:51:54,290 --> 00:51:56,340 maar we zullen terugkeren naar dit na verloop van tijd. 820 00:51:56,340 --> 00:51:59,980 Voor nu, het enige stuk van het geheugen hebben we echt zorgen over is het tekstsegment 821 00:51:59,980 --> 00:52:03,360 want dat alleen staat voor de 0s en 1s dat Clang heeft uitgevoerd. 822 00:52:03,360 --> 00:52:06,050 Dus wanneer u een opdracht bij het toetsenbord, zoals a.out 823 00:52:06,050 --> 00:52:09,110 of u dubbelklikt op een pictogram op Mac OS of Windows, 824 00:52:09,110 --> 00:52:11,880 uw programma wordt geladen vanaf de vaste schijf in het RAM 825 00:52:11,880 --> 00:52:16,330 en het is plofte op de top van RAM-geheugen van uw computer, om zo te zeggen. 826 00:52:16,330 --> 00:52:20,450 Intussen, zoals uw programma begint te lopen en de belangrijkste wordt aangeroepen 827 00:52:20,450 --> 00:52:23,640 in het programma dat u heeft geschreven of het programma Microsoft of Apple schreef, 828 00:52:23,640 --> 00:52:27,860 een van zijn lokale variabelen uiteindelijk daar op de bodem van het geheugen van uw computer. 829 00:52:27,860 --> 00:52:33,230 Maar als belangrijkste gesprekken een andere functie die zelf variabelen of argumenten heeft, belanden ze erboven. 830 00:52:33,230 --> 00:52:36,680 En als die functie die iets, ze eindigen boven, boven, boven. 831 00:52:36,680 --> 00:52:41,460 >> En slechts eenmaal een functie wordt uitvoering wordt de stapel trays, zogezegd 832 00:52:41,460 --> 00:52:43,240 beginnen te krijgen lager en lager. 833 00:52:43,240 --> 00:52:48,250 En dit is wat dan, in een notendop, legt uit waarom als je kubus belt 834 00:52:48,250 --> 00:52:51,550 of je increment belt, je passeren in een kopie van de waarde. 835 00:52:51,550 --> 00:52:55,520 En wat dat betekent picturaal is dat je letterlijk je het getal 1 het schrijven van 836 00:52:55,520 --> 00:53:00,460 in een ander deel van het geheugen, het veranderen dat 1 tot 2 bij increment 837 00:53:00,460 --> 00:53:04,820 of een 8 bij kubus en dat het geheugen weg te gooien 838 00:53:04,820 --> 00:53:09,140 zodra de toename of de kubus functie terugkeert. Vraag. 839 00:53:09,140 --> 00:53:12,900 [Student] Waar globale variabelen opgeslagen? 840 00:53:12,900 --> 00:53:18,100 Globale variabelen worden opgeslagen in wat er momenteel wel de geïnitialiseerd gegevens of niet-geïnitialiseerd gegevens, 841 00:53:18,100 --> 00:53:21,920 het verschil is als je een globale variabele en wijst u het meteen een waarde 842 00:53:21,920 --> 00:53:24,640 met de gelijk-teken, het eindigt aan de top daar, 843 00:53:24,640 --> 00:53:29,200 en als je gewoon zeggen int x; zonder waarde, het eindigt iets lager in het RAM 844 00:53:29,200 --> 00:53:31,710 gewoon volgens afspraak. 845 00:53:31,710 --> 00:53:34,940 Andere vragen? Oke. 846 00:53:34,940 --> 00:53:37,340 Dus deze foto zal terugkomen als we meer krachtige 847 00:53:37,340 --> 00:53:39,170 met wat we kunnen doen met de computer, 848 00:53:39,170 --> 00:53:42,720 maar voor nu, laten we eens een korte intro van cryptografie, 849 00:53:42,720 --> 00:53:46,080 een specifiek type cryptografie dat niet alle problemen van de wereldproblemen 850 00:53:46,080 --> 00:53:47,720 maar wel op te lossen een aantal van hen. 851 00:53:47,720 --> 00:53:51,700 In dit geval hier, hebben we iets genaamd geheime sleutel cryptografie. 852 00:53:51,700 --> 00:53:56,410 Secret-key cryptografie, zoals de naam al doet vermoeden, ontleent zijn beveiliging van een geheim. 853 00:53:56,410 --> 00:54:00,690 >> Bijvoorbeeld, als je terug op de lagere school en je was het passeren van een klein geheim liefdesbrief 854 00:54:00,690 --> 00:54:04,850 aan de jongen of het meisje dat je verpletteren op, als je wilde die nota door het publiek, 855 00:54:04,850 --> 00:54:08,380 zou u waarschijnlijk niet schrijven zoals een notitie in het Engels of wat dan ook je moedertaal is. 856 00:54:08,380 --> 00:54:13,340 In plaats daarvan kunt u coderen of je kan gewoon stuur ze een SMS-bericht van deze dagen. 857 00:54:13,340 --> 00:54:15,460 Maar je zou eigenlijk gaan ze een briefje door het hele lokaal. 858 00:54:15,460 --> 00:54:18,700 En om veilig doen dit op zo'n manier dat je vrienden en de leraar 859 00:54:18,700 --> 00:54:22,650 weet niet wat je aan het schrijven bent, kun je komen met een vrij eenvoudige algoritme, 860 00:54:22,650 --> 00:54:25,920 jonge hoewel je zou kunnen zijn, om gewoon versleutelen van de woorden. 861 00:54:25,920 --> 00:54:28,130 Dus in plaats van het schrijven van een je zou kunnen schrijven b, 862 00:54:28,130 --> 00:54:30,220 in plaats van b je zou kunnen schrijven c, 863 00:54:30,220 --> 00:54:32,140 plaats van c u misschien schrijven d, enzovoort. 864 00:54:32,140 --> 00:54:34,360 Of je zou kunnen komen met een meer geavanceerde vertaling 865 00:54:34,360 --> 00:54:36,720 van brieven aan verschillende letters. 866 00:54:36,720 --> 00:54:39,740 Maar de vangst is de jongen of het meisje aan wie u bent het verzenden van deze notitie 867 00:54:39,740 --> 00:54:45,020 moet iets, dat is wat, natuurlijk weet je? >> [Student] Wat u verzendt. 868 00:54:45,020 --> 00:54:49,720 Wat je geheim is, zoals wat is dat mapping tussen a's en b's en c's en d's. 869 00:54:49,720 --> 00:54:54,650 Is het alleen het toevoegen van 1 tot en met elk van de letters om van a naar b, b naar c? 870 00:54:54,650 --> 00:54:56,670 Is het complexer dan dat? 871 00:54:56,670 --> 00:55:01,540 >> Dus jij en je geliefde moet deze geheime informatie te hebben, 872 00:55:01,540 --> 00:55:03,190 maar er is een beetje een catch-22 hier. 873 00:55:03,190 --> 00:55:06,830 Als dit de eerste keer dat je het verzenden van deze liefdesbrief door de klasse, 874 00:55:06,830 --> 00:55:10,720 hoe is die jongen of meisje gaat om te weten wat het geheim is zelfs? 875 00:55:10,720 --> 00:55:13,930 Zo geheim-key crypto lost niet alle problemen in de wereld, 876 00:55:13,930 --> 00:55:16,320 en er is eigenlijk een relatie hier dat we terug komen om tegen het einde semester. 877 00:55:16,320 --> 00:55:25,110 Ook hebben de meeste van ons niet weet iemand dat, werkt bijvoorbeeld bij Amazon.com, 878 00:55:25,110 --> 00:55:28,190 en toch velen van ons hebben waarschijnlijk gekocht spul bij Amazon.com, 879 00:55:28,190 --> 00:55:31,990 en we hebben geleerd om aan te nemen dat deze e-commerce transacties veilig zijn. 880 00:55:31,990 --> 00:55:36,470 De URL zegt waarschijnlijk https, is er misschien een domme kleine hangslotpictogram ergens, 881 00:55:36,470 --> 00:55:39,930 er is een soort van cryptografie beveiliging van uw creditcardgegevens 882 00:55:39,930 --> 00:55:42,160 tussen u en Amazon.com. 883 00:55:42,160 --> 00:55:45,430 En toch, als cryptografie gaat weten een geheim 884 00:55:45,430 --> 00:55:48,620 en toch weet ik niet iedereen op Amazon en ik heb zeker niet geregeld elke vorm van geheime 885 00:55:48,620 --> 00:55:52,710 met iemand op Amazon, hoe is mijn computer of mijn browser om dit te doen? 886 00:55:52,710 --> 00:55:55,720 Het blijkt dat er andere vormen van cryptografie geheel dat op te lossen dat probleem. 887 00:55:55,720 --> 00:55:57,670 Maar voor vandaag, zullen we ons richten op de eenvoudige 888 00:55:57,670 --> 00:56:00,290 waar u kunt vooraf te regelen om een ​​geheime weten 889 00:56:00,290 --> 00:56:03,760 zoals +1 of sommige mapping tussen a's en b's. 890 00:56:03,760 --> 00:56:05,840 En het proces van cryptografie gaat meestal deze. 891 00:56:05,840 --> 00:56:08,620 Je hebt een aantal platte tekst, hier afgebeeld aan de linkerkant, 892 00:56:08,620 --> 00:56:12,930 je het door een soort van algoritme of de procedure voor het versleutelen van het - 893 00:56:12,930 --> 00:56:15,100 misschien is dat gewoon een wordt b, b wordt c - 894 00:56:15,100 --> 00:56:17,490 en dan eindig je met cijfertekst. 895 00:56:17,490 --> 00:56:20,380 Ondertussen, zodra je geliefde ontvangt dit geheim nota, 896 00:56:20,380 --> 00:56:24,200 hij of zij moet dan ontcijferen door algemeen een omkering in de algoritme 897 00:56:24,200 --> 00:56:27,190 om zo terug te krijgen van de platte tekst. 898 00:56:27,190 --> 00:56:28,960 Er zijn fysieke incarnaties van deze. 899 00:56:28,960 --> 00:56:31,680 >> Zo, dit is een klein geheim decoder ring, 900 00:56:31,680 --> 00:56:35,110 en dit is een ring in de zin dat er hier twee wijzerplaten. 901 00:56:35,110 --> 00:56:38,490 Aan de buitenkant rand van dit ding, is er letters A tot en met Z, 902 00:56:38,490 --> 00:56:40,340 hoewel ze in willekeurige volgorde, 903 00:56:40,340 --> 00:56:42,880 en aan de binnenkant, is er eigenlijk een aantal nummers 904 00:56:42,880 --> 00:56:46,620 zodanig dat met deze ring kun je soort van de buitenkant draaien niet, maar de binnenkant 905 00:56:46,620 --> 00:56:49,140 om line-up nummers met letters. 906 00:56:49,140 --> 00:56:53,020 Van een film genaamd A Christmas Story, zul je zien dat er weinig Ralphie 907 00:56:53,020 --> 00:56:58,000 was zo enthousiast om erachter te komen wat geheime boodschap Little Orphan Annie's was om hem te 908 00:56:58,000 --> 00:57:02,570 die waren doorgegeven, denk ik, in de vorm van numerieke berichten op een doos cornflakes 909 00:57:02,570 --> 00:57:07,220 en je moest alle kleine kaarten die kwam in de cornflakes doos accumuleren, 910 00:57:07,220 --> 00:57:09,770 je moest ze mailen in, je moest terug de geheime decoder ring 911 00:57:09,770 --> 00:57:13,910 zodat u kunt eindelijk erachter te komen wat de mapping is tussen letters en cijfers 912 00:57:13,910 --> 00:57:15,550 of letters en letters. 913 00:57:15,550 --> 00:57:19,520 Hoe in een computer kunnen we gaan over de uitvoering of vertegenwoordigen dit soort dingen? 914 00:57:19,520 --> 00:57:22,560 We hebben een manier van uitdrukken onszelf een beetje meer flexibel 915 00:57:22,560 --> 00:57:25,080 dan onze variabelen tot nu toe hebben toegestaan. 916 00:57:25,080 --> 00:57:29,000 We hebben ints gehad, we hebben chars gehad, we hebben praalwagens en tweepersoonskamers en een paar anderen, 917 00:57:29,000 --> 00:57:34,200 maar dat zijn individuele stukken van het geheugen die niet echt ons toelaten om dingen uit te drukken 918 00:57:34,200 --> 00:57:36,440 zoals woorden en zinnen en zinnen. 919 00:57:36,440 --> 00:57:38,630 Inderdaad, we hebben wel zulke dingen strijkers, 920 00:57:38,630 --> 00:57:42,660 maar we beloven dat dit echt is gewoon een vereenvoudiging van de CS50 bibliotheek 921 00:57:42,660 --> 00:57:45,540 dat we van plan te schillen terug. 922 00:57:45,540 --> 00:57:47,500 En dus laten we beginnen hier doen. 923 00:57:47,500 --> 00:57:49,840 Laat me verder gaan en het openen van een bestand - 924 00:57:49,840 --> 00:57:54,100 al deze bestanden zijn beschikbaar, zoals gebruikelijk, online - zogenaamde array.c 925 00:57:54,100 --> 00:57:58,960 om een ​​probleem niets met strings op te lossen, maar dat een beeld schetst hier 926 00:57:58,960 --> 00:58:01,520 van hoe we zouden kunnen gebruiken zoiets als een array. 927 00:58:01,520 --> 00:58:04,050 >> Een array is een data type. 928 00:58:04,050 --> 00:58:10,730 Het is een type van de variabele van soorten die meerdere kleinere data types binnenkant van het heeft 929 00:58:10,730 --> 00:58:12,680 rug aan rug aan rug aan rug. 930 00:58:12,680 --> 00:58:16,980 Dus bijvoorbeeld, als we wilden een klein programma dat geeft je je quiz gemiddelde schrijven 931 00:58:16,980 --> 00:58:19,780 voor een cursus zoals 50 dat 2 quizzen heeft, 932 00:58:19,780 --> 00:58:23,450 je kan heel gemakkelijk schrijven dit programma gebaseerd zelfs op een aantal van materiaal van vorige week 933 00:58:23,450 --> 00:58:28,830 door gebruik te maken GetInt en een paar van variabelen: int quiz1, int quiz2. 934 00:58:28,830 --> 00:58:30,550 En het is vrij eenvoudig. 935 00:58:30,550 --> 00:58:33,500 Het is misschien 10, 20 regels code max uitvoering van een programma 936 00:58:33,500 --> 00:58:38,940 dat de gebruiker voor 2 quiz scores vraagt ​​en vervolgens berekent het gemiddelde 937 00:58:38,940 --> 00:58:42,020 door te tellen, te delen door 2 en afdrukken van de resultaten. 938 00:58:42,020 --> 00:58:46,400 We kunnen waarschijnlijk wel dat mooie gemakkelijk nu na een aantal minuten niet. 939 00:58:46,400 --> 00:58:49,450 Maar het probleem is dat veronderstellen dat 50 had 3 of 4 quizzen. 940 00:58:49,450 --> 00:58:52,830 Stel dat je wilde hetzelfde programma gebruiken voor een klasse die per week had quizzen. 941 00:58:52,830 --> 00:58:55,100 Denk na over een klasse die wekelijks heeft quizzen. 942 00:58:55,100 --> 00:58:58,840 Als er 16 of zo weken in een semester, nu heb je 16 variabelen: 943 00:58:58,840 --> 00:59:03,030 int quiz1, int quiz2, int quiz3, int quiz4. 944 00:59:03,030 --> 00:59:06,870 Zodra u begint met het zien van deze redundantie, deze kopiëren en plakken van de code, 945 00:59:06,870 --> 00:59:09,810 het moet gaan om je wou dat er een betere manier. 946 00:59:09,810 --> 00:59:13,610 En gelukkig, want van arrays die er is. Dus laten we dit doen. 947 00:59:13,610 --> 00:59:16,700 Ten eerste, laat me even een heel simpel ding dat we niet hebben tot nu toe gebruikt, 948 00:59:16,700 --> 00:59:18,820 maar je zult af en toe ziet het in code. 949 00:59:18,820 --> 00:59:21,270 >> Dit is wat algemeen een constante genoemd. 950 00:59:21,270 --> 00:59:24,410 Dus het is een constante in de zin dat deze waarde nooit verandert. 951 00:59:24,410 --> 00:59:26,450 De menselijke conventie bij het maken van een constante 952 00:59:26,450 --> 00:59:30,420 is om alle hoofdletters te gebruiken gewoon zo dat het echt opvalt in uw code, 953 00:59:30,420 --> 00:59:34,270 en het bijzonder sleutelwoord dat u gebruikt in C # te definiëren. 954 00:59:34,270 --> 00:59:39,970 Dus we zeggen # en te definiëren, een spatie en dan het woord dat u wilt gebruiken voor de naam van de constante's 955 00:59:39,970 --> 00:59:41,730 waarna de waarde van de constante. 956 00:59:41,730 --> 00:59:44,710 Let op dit is iets anders dan het toewijzen van iets aan een variabele. 957 00:59:44,710 --> 00:59:46,430 Er is geen teken gelijk is aan, er is geen puntkomma. 958 00:59:46,430 --> 00:59:49,140 Dit is wat algemeen bekend als een preprocessor richtlijn, 959 00:59:49,140 --> 00:59:50,840 maar daarover een andere keer. 960 00:59:50,840 --> 00:59:56,350 Voor nu, creëert dit een onveranderlijke waarde genaamd QUIZZEN 961 00:59:56,350 --> 00:59:58,290 waarvan de feitelijke numerieke waarde is 2. 962 00:59:58,290 --> 01:00:02,180 Dus overal zie je quizzen, Quizzes, quizzes gedurende dit bestand, 963 01:00:02,180 --> 01:00:04,230 dat is nog maar de nummer 2. 964 01:00:04,230 --> 01:00:06,550 Als ik kijk naar de belangrijkste nu, laten we eens kijken hoe dit werkt. 965 01:00:06,550 --> 01:00:09,770 Eerst ziet er een beetje cryptisch, maar het is allemaal spullen van week 1. 966 01:00:09,770 --> 01:00:12,210 Vraag de gebruiker voor de rangen. Hoe gaan we dit doen? 967 01:00:12,210 --> 01:00:17,350 In lijn 22 - dit is echt de sappige deel - Ik verklaar een vlotter 968 01:00:17,350 --> 01:00:23,240 maar niet alleen een vlotter. Ik verklaar, in plaats van, een reeks van floating-point waarden. 969 01:00:23,240 --> 01:00:27,700 Die variabele zal worden genoemd kwaliteiten zoals hier impliciet, 970 01:00:27,700 --> 01:00:31,420 maar het enige stuk van de nieuwe syntaxis dan zijn deze vierkante haken. 971 01:00:31,420 --> 01:00:37,280 Het feit dat ik vlotter cijfers en open beugel en dan een nummer gezegd - 972 01:00:37,280 --> 01:00:40,980 merken als deze is een constante dit is net als we dit deden - 973 01:00:40,980 --> 01:00:46,840 dit betekent: "He computer, geef me 2 wagens en laten we samen noemen ze rangen." 974 01:00:46,840 --> 01:00:51,780 >> Dit is in tegenstelling tot een veel moeizaam proces als volgt: float Voorraad1; 975 01:00:51,780 --> 01:00:54,580 Grade2 drijven, enzovoort. 976 01:00:54,580 --> 01:00:58,310 Dus een reeks stelt ons in staat de uitvoering van deze idee, maar veel minder slordig, 977 01:00:58,310 --> 01:01:04,560 zodanig dat we een regel code te schrijven in plaats van bijvoorbeeld 16 voor een 16-week semester. 978 01:01:04,560 --> 01:01:09,060 Ik wilde niet te hard-code 2, want als je van deze nu logisch, 979 01:01:09,060 --> 01:01:12,560 neem aan dat volgend jaar CS50 veranderingen tot 3 quizzen plaats 980 01:01:12,560 --> 01:01:15,010 en ik het nummer 2 hier had, had ik de nummer 2 hier, 981 01:01:15,010 --> 01:01:17,210 Ik had de nummer 2 hier, de nummer 2 hier. 982 01:01:17,210 --> 01:01:19,890 Het wordt heel vervelend en heel gemakkelijk om het te verknallen 983 01:01:19,890 --> 01:01:26,550 en een waarde ongeluk op 3 te missen en een andere waarde van 2. 984 01:01:26,550 --> 01:01:30,660 Dus ik ga in plaats daarvan abstracte dit weg en gebruik deze constante die, 985 01:01:30,660 --> 01:01:32,520 zoals de naam al doet vermoeden, verandert nooit. 986 01:01:32,520 --> 01:01:35,870 En nu maakt niet uit of we verschillende quizzen hebben dit jaar of volgend, 987 01:01:35,870 --> 01:01:39,380 Ik moet gewoon om het te veranderen in een plaats hier aan de bovenkant. 988 01:01:39,380 --> 01:01:41,230 Dus dat is al een constante is. 989 01:01:41,230 --> 01:01:47,100 Ondertussen de nieuwe conceptuele is dat een array. 990 01:01:47,100 --> 01:01:55,030 Dus de vierkante haken geef mij dit veel praalwagens en laat me collectief noemen ze hier rangen. 991 01:01:55,030 --> 01:01:56,720 Dus nu laten we eens kijken wat ik ga doen. 992 01:01:56,720 --> 01:01:59,220 Hier in leiding 24 is het begin van een lus. 993 01:01:59,220 --> 01:02:03,380 >> Dit is echt niks speciaals. Het is alleen met behulp van QUIZZEN in plaats van een hard-gecodeerde nummer. 994 01:02:03,380 --> 01:02:06,740 Maar er is niets intellectueel anders er van vorige week. 995 01:02:06,740 --> 01:02:11,650 Dit is gewoon printf, dus printf ("Quiz #% d van% d:") 996 01:02:11,650 --> 01:02:16,670 want ik wil gewoon uitprinten me quiz nummer 1 van 2 en dan 2 van 2 te geven. 997 01:02:16,670 --> 01:02:18,480 Dus dit is een puur esthetisch ding. 998 01:02:18,480 --> 01:02:21,000 Maar het interessante deel is nu in lijn 27. 999 01:02:21,000 --> 01:02:27,840 Om in een van de twee aanduidingen vullen met een drijvende komma waarde 1000 01:02:27,840 --> 01:02:29,640 u weer gebruik maken van vierkante haken. 1001 01:02:29,640 --> 01:02:35,170 In dit geval, ik gebruik ik omdat dit for-lus is begonnen met i gelijk welke waarde, blijkbaar? 1002 01:02:35,170 --> 01:02:36,670 [Student] 0. >> [Malan] 0. 1003 01:02:36,670 --> 01:02:40,990 Dus op de eerste iteratie van deze lus, het is alsof ik schreef dit in de code, 1004 01:02:40,990 --> 01:02:46,310 maar op de tweede iteratie van deze lus, het is alsof ik schreef dit in mijn code. 1005 01:02:46,310 --> 01:02:49,970 Maar het feit dat ik een variabele met behulp van perfect is, omdat, zoals de naam al doet vermoeden, 1006 01:02:49,970 --> 01:02:52,600 het is het variëren van de waarde op elke iteratie 1007 01:02:52,600 --> 01:02:55,900 dus ik ben het vullen van deze array een plek op een moment. 1008 01:02:55,900 --> 01:02:57,380 Wat betekent deze array eruit? 1009 01:02:57,380 --> 01:03:01,570 De reden dat ik de aandacht van de super eenvoudige rechthoek op het scherm hier voor was om deze reden. 1010 01:03:01,570 --> 01:03:05,590 Een array is gewoon een brok van het geheugen, gevolgd door een ander stuk van het geheugen 1011 01:03:05,590 --> 01:03:08,570 gevolgd door een stuk geheugen enzovoort. 1012 01:03:08,570 --> 01:03:13,120 Dus als mijn array is van grootte 2 hier in dit geval, het enige wat ik zou moeten doen 1013 01:03:13,120 --> 01:03:20,200 door te typen in mijn quiz scores zoals hier - Ik heb 100 op dit ene en toen kreeg ik een 99 op dit ene - 1014 01:03:20,200 --> 01:03:24,970 dan is dit geheugen misschien niet eens worden gebruikt, want ik heb alleen gevraagd de computer 1015 01:03:24,970 --> 01:03:26,840 voor een array van grootte 2. 1016 01:03:26,840 --> 01:03:28,600 Die pleinen zijn er nog steeds, toch? 1017 01:03:28,600 --> 01:03:32,670 Je hebt nog steeds 2 gigabyte aan RAM-geheugen, zelfs als je alleen vraagt ​​voor 2 wagens. 1018 01:03:32,670 --> 01:03:36,840 Dus het idee achter arrays is dat de computer slechts een deel van het geheugen wordt 1019 01:03:36,840 --> 01:03:41,340 en dan verdeelt kleinere stukken rug aan rug aan rug aan rug. 1020 01:03:41,340 --> 01:03:43,310 En dus dat is alles wat een array is. 1021 01:03:43,310 --> 01:03:47,350 >> Het is een aaneengesloten stuk geheugen in waarvan u kunt dingen. 1022 01:03:47,350 --> 01:03:50,700 Dit gebeurt dan doen slechts enkele saaie rekenen. 1023 01:03:50,700 --> 01:03:54,640 Als ik naar beneden scrollen hier, dit is waar ik dan itereren over de array. 1024 01:03:54,640 --> 01:03:58,020 I komen met de som van alle waarden in de array, 1025 01:03:58,020 --> 01:04:02,470 en dan gebruik ik de ronde functie hier om daadwerkelijk de som gedeeld door quizzen. 1026 01:04:02,470 --> 01:04:06,320 Maar laat me mijn hand zwaaien, dat als een soort van voldoende rekenkundige voor nu. 1027 01:04:06,320 --> 01:04:08,370 Maar dat alles doet voor mij uiteindelijk het berekenen van een gemiddelde. 1028 01:04:08,370 --> 01:04:13,580 Dus eerst quiz plus tweede quiz gedeeld door 2 en dan af te drukken het uit als een int. 1029 01:04:13,580 --> 01:04:17,280 Maar laten we nu de overgang naar een ander voorbeeld genoemd tekenreeks1, 1030 01:04:17,280 --> 01:04:20,700 die schetst een soortgelijk beeld, maar met behulp van snaren. 1031 01:04:20,700 --> 01:04:23,940 Laat me ga je gang en vereenvoudigen dit voor slechts een moment. 1032 01:04:23,940 --> 01:04:27,090 Vergeef de inspringing voor nu. 1033 01:04:27,090 --> 01:04:30,870 Merk op dat in lijn 19 van dit voorbeeld, krijg ik een string van de gebruiker. 1034 01:04:30,870 --> 01:04:34,640 Maar let op wat ik daarna doe in lijnen 22 verder. 1035 01:04:34,640 --> 01:04:41,250 Ik ben eigenlijk itereren van i tot en met - en dit is een nieuwe truc - strlen, tekstlengte. 1036 01:04:41,250 --> 01:04:44,880 Dit is een functie die wordt geleverd met C dat als je langs het een string, 1037 01:04:44,880 --> 01:04:47,730 het vertelt je hoeveel tekens zijn in die string. Dat is alles. 1038 01:04:47,730 --> 01:04:51,550 En het feit dat het strlen in plaats van de string lengte is gewoon omdat het meer beknopt. 1039 01:04:51,550 --> 01:04:55,100 Dertig jaar geleden, mensen graag dingen op te schrijven zo kort mogelijk te maken, 1040 01:04:55,100 --> 01:04:57,630 dus we hebben gehouden dat verdrag hier. 1041 01:04:57,630 --> 01:05:00,660 i + + betekent gewoon verhogen i in elke iteratie. 1042 01:05:00,660 --> 01:05:02,990 En let nu op, en dat is echt interessant. 1043 01:05:02,990 --> 01:05:09,180 In regel 24, zeg ik, "Computer, geef me een teken, 8 bits, en noem het c." 1044 01:05:09,180 --> 01:05:12,630 Maar wat is dit op de rechterkant te zeggen? 1045 01:05:13,490 --> 01:05:16,530 In het Engels, dat betekent wat voor? 1046 01:05:16,530 --> 01:05:18,730 [Student] Het eerste teken in de array. 1047 01:05:18,730 --> 01:05:20,790 Precies. Geef mij het eerste teken in de array. 1048 01:05:20,790 --> 01:05:24,090 Of, meer in het algemeen, geef me de i-teken in de array. 1049 01:05:24,090 --> 01:05:26,100 En nu besef dat het belangrijk is dat als informatici, 1050 01:05:26,100 --> 01:05:27,890 we eigenlijk lopen vanaf 0. 1051 01:05:27,890 --> 01:05:29,720 >> Je hoeft nu niet de bevoegdheid te hebben om te beginnen met dit te doen. 1052 01:05:29,720 --> 01:05:34,160 Nu heb je te gedragen in overeenstemming met de verwachtingen van de computer en van 0 te tellen 1053 01:05:34,160 --> 01:05:38,180 omdat [0] zal het eerste teken in een string, 1054 01:05:38,180 --> 01:05:42,150 [1] gaat worden de tweede, [2] gaat de derde, enzovoort. 1055 01:05:42,150 --> 01:05:49,720 Dus dit programma, als ik het compileren, dit weer is tekenreeks1, dus zorg tekenreeks1, 1056 01:05:49,720 --> 01:05:54,670 en nu heb ik lopen tekenreeks1 in mijn terminal-venster. 1057 01:05:54,670 --> 01:05:58,330 Het wacht op input, dus ik ga te typen in David, Enter, 1058 01:05:58,330 --> 01:06:02,540 en nu drukt David allemaal op verschillende lijnen, want let op wat ik doe. 1059 01:06:02,540 --> 01:06:05,820 Ik ben het afdrukken van een karakter per keer. 1060 01:06:05,820 --> 01:06:10,100 We zullen niet in detail treden vandaag op deze, maar ik verwijderde een ogenblik geleden deze controle hier. 1061 01:06:10,100 --> 01:06:15,480 Het blijkt dat als de gebruiker zich misdraagt, hoor en wederhoor, of gewoon in de war, 1062 01:06:15,480 --> 01:06:20,210 kun je eigenlijk niet aan een reeks van enige lengte te geven. 1063 01:06:20,210 --> 01:06:22,860 Als je op de verkeerde toets op het toetsenbord, kunt u geven geen snaar helemaal niet, 1064 01:06:22,860 --> 01:06:26,950 of als je kwaadaardige, kunt u proberen te plakken in de moeite waard een gigabyte van een essay 1065 01:06:26,950 --> 01:06:29,290 naar deze string vullen en als de computer geen geheugen, 1066 01:06:29,290 --> 01:06:32,710 het blijkt dat we gaan terug deze speciale waarde genaamd NULL. 1067 01:06:32,710 --> 01:06:35,580 Dus voor nu, weet alleen dat er deze speciale waarde met de naam NULL 1068 01:06:35,580 --> 01:06:39,580 die ons in staat om te controleren als we uit het geheugen, onder andere dingen. 1069 01:06:39,580 --> 01:06:45,630 Maar als ik open nu tekenreeks2, hier op te merken een verschil. 1070 01:06:45,630 --> 01:06:48,210 Hier een opzegtermijn van een verschil met string2. 1071 01:06:48,210 --> 01:06:51,340 Met tekenreeks2, dit for-lus is een beetje anders. 1072 01:06:51,340 --> 01:06:55,010 >> Laat me verwijderen van de Null-waarden, zodat we kunnen praten over die andere keer. 1073 01:06:55,010 --> 01:06:57,800 Wat is er anders aan de for-lus deze keer? 1074 01:06:59,620 --> 01:07:01,670 Ik kan terug gaan naar het vorige voorbeeld. 1075 01:07:01,670 --> 01:07:08,580 Dus dat is versie 2, dit is versie 1. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 De strlen oproep is waar? 1078 01:07:16,660 --> 01:07:18,860 Het is in het eerste deel van de lus. 1079 01:07:18,860 --> 01:07:21,830 Elke gedachten over waarom ik dit doe? Ja. 1080 01:07:21,830 --> 01:07:24,560 [Student] U hoeft dus niet bellen met de functie iedere keer. 1081 01:07:24,560 --> 01:07:26,440 [Malan] Dus we niet bellen met de functie iedere keer. Precies. 1082 01:07:26,440 --> 01:07:28,300 Recall van voor loops dat ze super eenvoudig 1083 01:07:28,300 --> 01:07:31,770 als je eenmaal soort van begrijpen dat dit de initialisatie, de conditie en de update. 1084 01:07:31,770 --> 01:07:34,750 Het probleem is dat de toestand gebeurt op elke iteratie van de lus. 1085 01:07:34,750 --> 01:07:40,010 En dus in dit voorbeeld, wat slecht is over het feit dat dit mijn conditie? 1086 01:07:40,010 --> 01:07:41,830 [Student] Je noemt strlen. 1087 01:07:41,830 --> 01:07:44,340 [Malan] Je noemt strlen opnieuw en opnieuw en opnieuw. 1088 01:07:44,340 --> 01:07:47,410 Maar zodra ik heb getypt in David, de lengte van die string is 5, 1089 01:07:47,410 --> 01:07:49,650 en het is niet van plan om te veranderen op elke iteratie van de lus 1090 01:07:49,650 --> 01:07:51,670 omdat de string nog D-a-v-i-d. 1091 01:07:51,670 --> 01:07:55,320 Dus dit is een hint naar wat er gaat een steeds belangrijkere idee geworden 1092 01:07:55,320 --> 01:08:00,410 bekend als een ontwerpbeslissing waar gewoon niet maken de computer te doen onnodig werk. 1093 01:08:00,410 --> 01:08:03,920 >> Net zoals een sneak preview van pset2, pset2 in de standaard editie 1094 01:08:03,920 --> 01:08:07,030 zal je uitdagen om daadwerkelijk uitvoering van een aantal aantal cijfers, 1095 01:08:07,030 --> 01:08:10,410 een bepaald aantal encryptie-algoritmen, zodat u zowel coderen 1096 01:08:10,410 --> 01:08:13,840 en decoderen van geheime boodschappen die lijkt op degene Ralphie daar gedecodeerd. 1097 01:08:13,840 --> 01:08:16,810 In de hacker editie van pset2, gaan we een stapje verder te gaan. 1098 01:08:16,810 --> 01:08:19,649 We gaan overhandigen u een bestand van een echte computer-systeem 1099 01:08:19,649 --> 01:08:23,479 dat bevat een hele hoop van gebruikersnamen en feitelijke gecodeerde wachtwoorden, 1100 01:08:23,479 --> 01:08:26,939 en de uitdaging voor de hacker editie gaat worden om die wachtwoorden te kraken 1101 01:08:26,939 --> 01:08:33,200 en erachter te komen wat cryptografie of wat het geheim werd gebruikt om daadwerkelijk te genereren die wachtwoorden. 1102 01:08:33,200 --> 01:08:36,109 En we gaan dit doen door gebruik te maken van een nieuwe feature hier van C 1103 01:08:36,109 --> 01:08:40,630 dat Ik geef je gewoon een demo van zogenaamde command-line argumenten. 1104 01:08:40,630 --> 01:08:44,229 Het blijkt, zoals sommigen van jullie misschien hebben gezien in paragraaf of in leerboeken, 1105 01:08:44,229 --> 01:08:48,260 belangrijkste hoeft niet altijd nietig tussen haakjes zijn. 1106 01:08:48,260 --> 01:08:52,430 Het blijkt dat de belangrijkste ook geschreven kan worden als deze, met twee argumenten, 1107 01:08:52,430 --> 01:08:56,870 argc en argv, waar argc is het aantal woorden 1108 01:08:56,870 --> 01:09:00,020 die u typt na de naam van het programma op uw opdrachtregel 1109 01:09:00,020 --> 01:09:03,420 en argv is de werkelijke woorden. 1110 01:09:03,420 --> 01:09:07,540 En als de vierkante haken daar suggereren, argv is blijkbaar een array. 1111 01:09:07,540 --> 01:09:12,210 Het gaat om een ​​string na een reeks na een reeks in het geheugen zijn. 1112 01:09:12,210 --> 01:09:16,010 >> Dus wat we gaan om te kunnen doen beginnen met PSET 2 is iets als dit. 1113 01:09:16,010 --> 01:09:21,350 Als ik argv1, dat is een voorbeeld dat we weer terug te komen op maandag en voer het uit, 1114 01:09:21,350 --> 01:09:23,370 merken dat het niet lijkt te nog iets doen. 1115 01:09:23,370 --> 01:09:25,490 Hij drukt gewoon uit zijn eigen naam. 1116 01:09:25,490 --> 01:09:31,479 Maar als ik afscheid klasse, merk op dat dit programma blijkbaar herhaalt 1117 01:09:31,479 --> 01:09:35,479 over elk van de woorden die werden ingevoerd wordt bij het prompt. 1118 01:09:35,479 --> 01:09:41,630 En de manier waarop we toegang tot woorden te krijgen die de gebruiker heeft ingevoerd wordt bij het prompt 1119 01:09:41,630 --> 01:09:49,160 is door het veranderen van de belangrijkste dit weekend van start vanaf int main (void) to main (argc, argv) int 1120 01:09:49,160 --> 01:09:52,050 en dus zullen geboren worden command-line argumenten. 1121 01:09:52,050 --> 01:09:57,100 En als je eenmaal echt verfijnd op dit, zult u in staat om echt trippy programma's te schrijven 1122 01:09:57,100 --> 01:09:59,610 zoals deze hier, die verder gaat boven en buiten 1123 01:09:59,610 --> 01:10:03,940 deel van de functionaliteit die we tot nu toe gedaan, maar allemaal heel krachtig. 1124 01:10:03,940 --> 01:10:08,950 >> Dus we laten dit met deze op het scherm, en we zullen u op maandag. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]