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 Universiteit] 3 00:00:04,220 --> 00:00:06,880 [Hierdie is CS50. - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 Alles reg. Dit is CS50, en dit is die einde van die week 2. 5 00:00:10,990 --> 00:00:14,410 As jy verwag om honger wees rondom hierdie tyd môre, 6 00:00:14,410 --> 00:00:18,620 weet dat ons gaan om te belê as 'n klein groepie môre, Donderdag, 13:15. 7 00:00:18,620 --> 00:00:21,360 Daar is hierdie URL hier as jy wil om te RSVP. 8 00:00:21,360 --> 00:00:26,740 Ruimte beperk is, so asseblief vergewe indien die vorm ingevul het deur die tyd wat jy vul dit uit. 9 00:00:26,740 --> 00:00:29,300 'N ander URL, al is, wat dalk van belang is. 10 00:00:29,300 --> 00:00:32,369 In net oor 'n maand se tyd, word die kursus gaan beskikbaar gestel word 11 00:00:32,369 --> 00:00:36,890 al die meer in die algemeen via EDX, via wat mense op die Internet sal in staat wees om te volg saam, 12 00:00:36,890 --> 00:00:39,380 baie aktief betrokke te raak in die kursus, in werklikheid. 13 00:00:39,380 --> 00:00:42,270 Hulle sal gebruik word om die CS50 Appliance en CS50 Bespreek 14 00:00:42,270 --> 00:00:45,490 en die meeste van die verskillende sagteware gereedskap wat ons het reeds hierdie semester is deur. 15 00:00:45,490 --> 00:00:48,710 En een van die inisiatiewe wat ons wil doen hierdie jaar as 'n eksperiment 16 00:00:48,710 --> 00:00:51,930 is om te sien net hoe baie inhoud wat ons kan vertaal 17 00:00:51,930 --> 00:00:53,960 in ander gesproke en geskrewe tale. 18 00:00:53,960 --> 00:00:57,500 So as jy kan 'n belangstelling in die deelname aan hierdie projek 19 00:00:57,500 --> 00:01:02,270 waardeur ons sal voorsien Engelse transkripsies en ondertitels vir die kursus se lesings 20 00:01:02,270 --> 00:01:05,450 en kortbroek en seminare en artikels en dies meer, 21 00:01:05,450 --> 00:01:08,200 as jy praat vlot of vlot 'n ander taal te skryf, 22 00:01:08,200 --> 00:01:12,290 sou ons is lief vir jou om betrokke te raak by hierdie projek waardeur jy op een of meer van die video's, 23 00:01:12,290 --> 00:01:15,200 vertaling daarvan in 'n taal wat jy baie goed ken. 24 00:01:15,200 --> 00:01:18,700 >> Om te gee jou 'n gevoel van die koppelvlak, daar is hierdie web-gebaseerde user 25 00:01:18,700 --> 00:01:22,090 dat ons sal gebruik word om wat in wese 'n UI soos hierdie. 26 00:01:22,090 --> 00:01:24,290 Dit is my onderrig sommige Halloween gelede, 27 00:01:24,290 --> 00:01:27,390 en op die regterkant is daar in swart langs hierdie tyd stempels, 28 00:01:27,390 --> 00:01:31,210 sien jy die verskillende dinge wat uit my mond gekom het daardie dag, 29 00:01:31,210 --> 00:01:34,850 en dan onder dit wat jy sal in staat wees om in 'n ander taal te vertaal 30 00:01:34,850 --> 00:01:38,690 presies wat die kartering tussen, in hierdie geval, Engels en, sê, Spaans. 31 00:01:38,690 --> 00:01:40,440 So dit is eintlik 'n baie gebruikers-vriendelike instrument. 32 00:01:40,440 --> 00:01:43,370 Jy kan rewind en vinnig vorentoe baie maklik met sleutelbord kortpaaie. 33 00:01:43,370 --> 00:01:47,490 So as jy wil om deel te neem in hierdie eksperiment en het jou woorde gesien en gelees 34 00:01:47,490 --> 00:01:51,850 deur potensieel duisende mense daar buite, doen asseblief voel vry om deel te neem. 35 00:01:51,850 --> 00:01:54,350 Een woord oor die katjie van Maandag. 36 00:01:54,350 --> 00:02:00,350 Sodat ons 'n té scary boodskap gestuur het, besef dat, as kantoorure dui daarop 37 00:02:00,350 --> 00:02:03,300 en as afdelings stel, die ontwerp van die kursus is baie 38 00:02:03,300 --> 00:02:07,360 het studente saam en praat om te werk deur die probleem stelle 39 00:02:07,360 --> 00:02:11,260 en probleme saam, en regtig die lyn net kom neer op, 40 00:02:11,260 --> 00:02:16,010 weer, moet die werk wat jy uiteindelik stuur jou eie wees. 41 00:02:16,010 --> 00:02:18,860 En so eerlik te wees, in kantoorure dit is heeltemal normaal, 42 00:02:18,860 --> 00:02:22,240 Dit is heeltemal om selfs verwag word, te gesels met 'n paar vriend langs jou. 43 00:02:22,240 --> 00:02:24,370 >> Indien hy of sy sukkel met 'n paar onderwerp en jy soos, 44 00:02:24,370 --> 00:02:27,940 "O, goed, laat my gee u 'n blik van 'n paar lyn van die kode wat ek geskryf het," dit is fyn, 45 00:02:27,940 --> 00:02:31,250 wat gebeur, en dit is baie bevorderlik is, dink ek, met die proses van leer. 46 00:02:31,250 --> 00:02:36,750 Waar die lyn kry gekruis is wanneer die kop is 'n soort gekantel hier vir te veel sekondes 47 00:02:36,750 --> 00:02:41,160 of minute wat werklik net 'n IP addresses are not geleentheid vir jou vriend, 48 00:02:41,160 --> 00:02:44,160 en seker wanneer dinge uitgeruil via e-pos en Dropbox en dies meer, 49 00:02:44,160 --> 00:02:45,640 daar is ook die lyn. 50 00:02:45,640 --> 00:02:48,620 Dus, deur al beteken gemaklik voel en voel aangemoedig om saam met vriende te gesels 51 00:02:48,620 --> 00:02:52,810 en klasmaats oor psets en meer en net besef dat dit wat jy uiteindelik dien 52 00:02:52,810 --> 00:02:57,340 moet dit eintlik die produk van jou skepping en nie iemand anders nie. 53 00:02:57,340 --> 00:03:00,490 En so een van die domein-spesifieke probleme vir pset2, 54 00:03:00,490 --> 00:03:04,740 wat laat môreaand sal kom, is om te duik in die wêreld van kriptografie, 55 00:03:04,740 --> 00:03:08,970 wat is die kuns van die versleutelen of skommeling van inligting, 56 00:03:08,970 --> 00:03:12,600 en dit uiteindelik tot die wêreld van sekuriteit. 57 00:03:12,600 --> 00:03:16,560 Sekuriteit vir die meeste van ons kom nou, in die vorm van 'n redelik aards meganismes. 58 00:03:16,560 --> 00:03:19,050 Almal van ons het gebruikersname en wagwoorde, 59 00:03:19,050 --> 00:03:23,450 en almal van ons het 'n baie slegte gebruikersname en wagwoorde, waarskynlik. 60 00:03:23,450 --> 00:03:28,240 >> As jou wagwoord is dieselfde op verskeie websites, wat is waarskynlik nie die beste idee, 61 00:03:28,240 --> 00:03:30,070 soos ons sal na die einde van semester se bespreek. 62 00:03:30,070 --> 00:03:34,720 As jou wagwoord word geskryf op 'n taai noot - nie 'n grap nie - op jou monitor, 63 00:03:34,720 --> 00:03:38,350 dit is ook nie noodwendig die beste ontwerp, maar nogal 'n algemene verskynsel. 64 00:03:38,350 --> 00:03:42,470 En as jy nie die gebruik van kriptografie jou wagwoorde te enkripteer, 65 00:03:42,470 --> 00:03:44,210 hulle is veral kwesbaar. 66 00:03:44,210 --> 00:03:47,270 So as jy dink jy super slim deur 'n verborge Word-dokument 67 00:03:47,270 --> 00:03:49,910 iewers op jou hardeskyf wat al jou wagwoorde 68 00:03:49,910 --> 00:03:53,670 maar dit is in 'n gids wat niemand gaan om te kyk, ook dit is nie 'n baie veilige meganisme. 69 00:03:53,670 --> 00:03:56,990 En so wat pset2 sal stel, is om die kuns van kriptografie 70 00:03:56,990 --> 00:04:02,010 en roer inligting sodat dinge soos wagwoorde is al die meer veilig. 71 00:04:02,010 --> 00:04:05,790 Die konteks hier is dat met onseker data 72 00:04:05,790 --> 00:04:07,930 kom 'n geleentheid om dit te enkripteer en te scramble dit. 73 00:04:07,930 --> 00:04:11,470 En so gaan dit, byvoorbeeld, is 'n voorbeeld van 'n geënkripteerde boodskap. 74 00:04:11,470 --> 00:04:14,700 Dit sê eintlik iets in Engels, maar dit is duidelik nie heeltemal duidelik nie. 75 00:04:14,700 --> 00:04:18,279 En ons sal volle sirkel kom vandag uitmekaar te terg wat hierdie geheime boodskap hier is. 76 00:04:18,279 --> 00:04:23,490 Maar in die werklike wêreld van rekenaars, dinge doen nie, selfs lyk asof hulle Engelse frases kan wees. 77 00:04:23,490 --> 00:04:28,430 Byvoorbeeld, dit is wat jy kan vind op 'n standaard Linux of Mac of UNIX-rekenaar 78 00:04:28,430 --> 00:04:32,070 in 'n lêer wat was eens op 'n tyd het die wagwoord lêer. 79 00:04:32,070 --> 00:04:34,200 >> Vandag is dit na ander plekke verskuif. 80 00:04:34,200 --> 00:04:39,210 Maar as jy kyk, sien jy op die regte plek op 'n stelsel nie net jou gebruikersnaam 81 00:04:39,210 --> 00:04:43,400 of dat van die ander mense op die stelsel, maar jy sal sien 'n geënkripteerde weergawe van hul wagwoord. 82 00:04:43,400 --> 00:04:47,980 Trouens, die woord grafkelder daar dui daarop dat die volgende dinge is geïnkripteer, 83 00:04:47,980 --> 00:04:52,680 en hierdie reeks van oënskynlik arbitrêre letters en karakters en nommers en so meer 84 00:04:52,680 --> 00:04:56,480 Ontcijferde kan word slegs deur die algemeen weet 'n paar geheime - 85 00:04:56,480 --> 00:04:58,840 'n geheime woord, 'n geheime getal - 86 00:04:58,840 --> 00:05:03,160 en inderdaad, die kuns van kriptografie uiteindelik neer van een of ander aard te vertrou 87 00:05:03,160 --> 00:05:05,650 en weet iets wat iemand anders nie. 88 00:05:05,650 --> 00:05:10,090 So sal ons ondersoek dit in 'n bietjie meer detail vandag en in die pset te kom. 89 00:05:10,090 --> 00:05:12,200 En nou, 'n woord oor slaag / druip. 90 00:05:12,200 --> 00:05:15,360 Veral as sommige van julle het geduik in pset1, die toestel, 91 00:05:15,360 --> 00:05:19,080 en 'n nuwe wêreld vir jouself, besef dat frustrasies en verwarring 92 00:05:19,080 --> 00:05:21,700 en net tegniese probleme is redelik om te verwag word, 93 00:05:21,700 --> 00:05:24,180 veral met die eerste pset, waar daar net so baie nuwe, 94 00:05:24,180 --> 00:05:27,730 net om vertroud is met ls en CD en al hierdie arcane opdragte 95 00:05:27,730 --> 00:05:33,050 en 'n nuwe omgewing, en dit is apart van die werklike materiaal en programmering self. 96 00:05:33,050 --> 00:05:36,940 So ook besef dat daar is beslis kantoorure wat bestaan ​​as 'n ondersteuning struktuur. 97 00:05:36,940 --> 00:05:38,880 >> Artikels begin eerskomende Sondag. 98 00:05:38,880 --> 00:05:42,960 Maar die belangrikste, as jy voel net dat dit nie die wêreld vir jou, 99 00:05:42,960 --> 00:05:44,710 besef dat dit regtig nie net tyd neem. 100 00:05:44,710 --> 00:05:48,600 En as dit nie vir hierdie geleentheid jare gelede vir my van die neem van 'n klas slaag / druip, 101 00:05:48,600 --> 00:05:50,990 eerlik, ek het nooit sou selfs gestel het voet in die klaskamer. 102 00:05:50,990 --> 00:05:53,690 En jy kan dit verander tot, sê, die vyfde, die Maandag van die kursus, 103 00:05:53,690 --> 00:05:58,280 so as jy op die rand nou, besef dat eerder as hoof heeltemal in 'n ander waters, 104 00:05:58,280 --> 00:06:01,260 oorweeg beslis nie net die verandering om te slaag / druip. 105 00:06:01,260 --> 00:06:04,570 Weereens, daar is nie regtig hierdie kultuur hier by Harvard van die neem van dinge slaag / druip 106 00:06:04,570 --> 00:06:08,670 aangesien almal wil regtig te bereik of te overachieve, 107 00:06:08,670 --> 00:06:11,130 maar eerlik, dit is 'n wonderlike manier om te probeer om iets uit 108 00:06:11,130 --> 00:06:16,720 wat dalk nie vertroud wees aan jou, en jy sal uiteindelik doen, in die meeste gevalle, baie fyn, 109 00:06:16,720 --> 00:06:18,210 miskien baie tot jou verbasing. 110 00:06:18,210 --> 00:06:20,980 En in meer konkrete terme, wat ek dink slaag / druip in die algemeen nie, 111 00:06:20,980 --> 00:06:22,940 veral as jy dalk ervaar het met pset0, 112 00:06:22,940 --> 00:06:26,560 as jy sit in 10 uur, 15 uur, 25 uur in 'n paar pset 113 00:06:26,560 --> 00:06:29,920 en jy is net gebons jou kop teen die muur en dit is steeds super laat in die nag 114 00:06:29,920 --> 00:06:33,950 maar jy het die pset 90% van die pad en jy kan net nie uitvind een ding, 115 00:06:33,950 --> 00:06:36,520 slaag / druip regtig die rand van 'n klas soos hierdie, 116 00:06:36,520 --> 00:06:39,100 waar jy kan soort van gelukkig sê: "Goed, ek weet dit is nie volmaak, 117 00:06:39,100 --> 00:06:42,350 Maar Ek het my gat af op hierdie, ek is redelik tevrede is met waar dit geëindig het, " 118 00:06:42,350 --> 00:06:44,850 en dit sal voldoen aan die verwagtinge vir slaag / druip. 119 00:06:44,850 --> 00:06:47,540 So hou dit in gedagte. Alles reg. 120 00:06:47,540 --> 00:06:50,520 >> Sodat diegene van julle wat gesukkel het om gebruik te maak van die Harvard-Universiteit Wi-Fi, 121 00:06:50,520 --> 00:06:54,780 weet dat daar 'n CS50 SSID, 'n Wi-Fi-verbinding, rondsweef 122 00:06:54,780 --> 00:06:56,490 dat jy dalk 'n beter kans hê. 123 00:06:56,490 --> 00:07:00,130 Dit is nogal ironies dat die wagwoord vir hierdie, as jy wil om te probeer om die verbinding met 124 00:07:00,130 --> 00:07:08,350 vir 'n beter spoed - en laat ons weet as dit is geen beter - is 12.345, al die pad tot 8 125 00:07:08,350 --> 00:07:10,910 want 8 is meer veilig as 5. 126 00:07:10,910 --> 00:07:16,910 So as jy die Wi-Fi wagwoord verbinding met CS50 draadloos hier, 12.345.678, 127 00:07:16,910 --> 00:07:20,380 en post op CS50 Bespreek as jy nog intermitterende konnektiwiteit kwessies, 128 00:07:20,380 --> 00:07:25,420 en ons sal toelaat dat die magte wat wees weet vir hierdie ruimte. Alles reg. 129 00:07:25,420 --> 00:07:32,230 So 'n vinnige teaser, veral vir dié van julle wat is fan seuns of meisies van alle dinge Apple. 130 00:07:32,230 --> 00:07:37,460 Wat ek opgegrawe van 'n paar jaar terug, was hierdie lêer hier, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 net om te soort van meer konkrete en meer komplekse 132 00:07:39,930 --> 00:07:42,560 sommige van die meer basiese C programme het ons skryf. 133 00:07:42,560 --> 00:07:46,910 So ek het hierdie lêer, iUnlock.c. Dit is beskikbaar op die Lesings bladsy vir vandag. 134 00:07:46,910 --> 00:07:49,810 Op die linkerkant sien jy 'n lang lys van funksies. 135 00:07:49,810 --> 00:07:53,230 So die man wat dit geskryf het 'n baie van die funksies, meer as net die belangrikste. 136 00:07:53,230 --> 00:07:57,340 Hy gebruik 'n hele klomp van biblioteke hier, en as ons begin blaai deur, 137 00:07:57,340 --> 00:08:04,890 wat dit werklik is, is die heel eerste, glo ek, kraak vir die oorspronklike iPhone. 138 00:08:04,890 --> 00:08:09,830 >> As jy wou die oorspronklike iPhone te jailbreak, wat beteken untether van AT & T 139 00:08:09,830 --> 00:08:13,710 en eintlik spesiale sagteware te installeer op dit en doen dinge wat Apple het nie wil hê mense moet doen, 140 00:08:13,710 --> 00:08:18,480 iemand die tyd geneem het om uit te vind presies hoe hulle sagteware foute kan ontgin, 141 00:08:18,480 --> 00:08:22,690 - iUnlock.c-foute, foute, in Apple sagteware, en dus is gebore 142 00:08:22,690 --> 00:08:26,760 dat as jy saamgestel dit op jou rekenaar en geïnstalleer het dit op 'n iPhone 143 00:08:26,760 --> 00:08:29,430 wat is gekoppel aan jou rekenaar via ', sê, 'n USB-kabel, 144 00:08:29,430 --> 00:08:32,450 hierdie sal gee jou 'n administratiewe of root voorregte op jou iPhone 145 00:08:32,450 --> 00:08:34,620 en laat jy pretty much doen wat jy wil. 146 00:08:34,620 --> 00:08:36,400 En so daar is hierdie fassinerende kat en muis-speletjie 147 00:08:36,400 --> 00:08:39,340 tussen Apple en die res van die wêreld in die besonder as hulle, soos baie maatskappye, 148 00:08:39,340 --> 00:08:43,350 probeer om hulle goed af te sluit, sodat jy kan net doen met dit wat hulle van plan is. 149 00:08:43,350 --> 00:08:47,360 Maar te danke aan mense soos hierdie en die begrip van 'n lae-vlak details - 150 00:08:47,360 --> 00:08:50,830 en in hierdie geval C programmering - en 'n baie van die bekende konstrukte 151 00:08:50,830 --> 00:08:55,280 dat ons het begin speel met, jy in staat is om werklik gebaseer is op die hardeware 152 00:08:55,280 --> 00:08:59,250 op 'n wyse wat jy goeddink en nie noodwendig 'n korporatiewe entiteit. 153 00:08:59,250 --> 00:09:01,600 So byvoorbeeld, ek het geen idee wat dit alles doen, 154 00:09:01,600 --> 00:09:03,580 maar GetVersion klink redelik eenvoudig, 155 00:09:03,580 --> 00:09:05,710 en dit lyk asof dit is 'n funksie wat hierdie persoon het geskryf. 156 00:09:05,710 --> 00:09:09,250 Dit neem 'n soort van die heelgetal as 'n argument, kom nie terug nie enigiets, 157 00:09:09,250 --> 00:09:13,710 maar blyk te loop met 'n lus hier en 'n as toestand, as toestand breek, 158 00:09:13,710 --> 00:09:16,770 en hou op een of ander manier weergawe nommers as ons scroll down, 159 00:09:16,770 --> 00:09:19,650 selfs al is 'n baie van hierdie sleutelwoorde gaan nuut wees. 160 00:09:19,650 --> 00:09:22,590 En daar is 'n hele klomp van die funksies hier het ons nog nooit gesien het en dalk nie ooit sien 161 00:09:22,590 --> 00:09:24,350 oor die loop van die semester. 162 00:09:24,350 --> 00:09:29,160 >> Aan die einde van die dag is, volg dit dieselfde reëls en logika wat ons het is speel met tot dusver. 163 00:09:29,160 --> 00:09:34,340 So dit is veels te oud om jou iPhone 3s of 4s of gou 5s hierdie dae te kraak, 164 00:09:34,340 --> 00:09:38,830 maar weet dat dit alles baie afgelei van hierdie wêreld wat ons het geduik in. 165 00:09:38,830 --> 00:09:42,280 Kom ons neem 'n blik op 'n bietjie meer eenvoudige voorbeeld: 166 00:09:42,280 --> 00:09:46,260 hierdie een, net om te warm kry met 'n paar sintaksis en ook 'n paar ander datatipe 167 00:09:46,260 --> 00:09:48,910 dat ons het gepraat oor, maar het nie regtig gesien in C. 168 00:09:48,910 --> 00:09:53,670 Dit is 'n lêer genaamd positive1.c, en volgens die kommentaar aan die bokant, 169 00:09:53,670 --> 00:09:56,070 Dit vereis net dat 'n gebruiker 'n positiewe getal. 170 00:09:56,070 --> 00:09:59,910 So dit is 'n voorbeeld van 'n do-while lus, wat is lekker vir die gebruiker interaktiewe programme 171 00:09:59,910 --> 00:10:02,070 waar jy nodig het om die gebruiker te vertel om iets te doen, 172 00:10:02,070 --> 00:10:05,530 en as hulle nie saam jy skree op hulle of verwerp hul insette. 173 00:10:05,530 --> 00:10:10,480 Case in point: Ek gaan doen lyne 19 deur 24 174 00:10:10,480 --> 00:10:14,620 so lank as wat die user het nog nie vir my 'n positiewe getal. 175 00:10:14,620 --> 00:10:21,340 Hierdie detail hier on line 18, hoekom het Ek verklaar n bo hierdie hele herhaling bou 176 00:10:21,340 --> 00:10:26,870 eerder as na regs langs lyn 22 waar ek eintlik omgee om n te kry? Ja. 177 00:10:26,870 --> 00:10:29,330 [Student] Scope. >> Ja, so hierdie kwessie van die omvang. 178 00:10:29,330 --> 00:10:31,770 En in leketaal, wat beteken omvang verwys na? 179 00:10:34,880 --> 00:10:41,560 Ja. >> [Onhoorbaar student reaksie] >> Kan jy 'n bietjie harder praat? 180 00:10:41,560 --> 00:10:45,440 [Student] Waar kan jy toegang tot daardie veranderlike. >> Perfect. 181 00:10:45,440 --> 00:10:47,610 Waar jy kan toegang tot 'n spesifieke veranderlike. 182 00:10:47,610 --> 00:10:50,990 En oor die algemeen, die oppergesag van die duim tot dusver is dat die bestek van 'n paar veranderlike 183 00:10:50,990 --> 00:10:56,140 word gedefinieer deur die mees onlangse krullerige draadjies wat jy gesien het. 184 00:10:56,140 --> 00:11:03,070 >> En so in hierdie geval, as ek die fout gemaak verklaar n on line 22, sal daardie lyn werk. 185 00:11:03,070 --> 00:11:10,840 Ek sou 'n int te kry, en ek sou sit dit in daardie veranderlike n in line 22, 186 00:11:10,840 --> 00:11:17,060 maar wat lyn van die kode sal nou geen idee wat ek praat? >> [Student] 25. 187 00:11:17,060 --> 00:11:23,840 [Malan] 25, en dit blyk uit 24 goed so, want in hierdie geval is dit val buite die kode tussen krulhakies. 188 00:11:23,840 --> 00:11:28,550 So net 'n bietjie van 'n oorlas nie, maar baie maklik opgelos deur eenvoudig te verklaar die veranderlike 189 00:11:28,550 --> 00:11:30,700 buite die funksie self. 190 00:11:30,700 --> 00:11:32,760 Ons sal later vandag sien jy kan 'n stap verder te gaan 191 00:11:32,760 --> 00:11:34,940 en jy kan selfs 'n bietjie lui. 192 00:11:34,940 --> 00:11:39,660 En dit is nie in die algemeen aanbeveel word, maar jy kan selfs lui 193 00:11:39,660 --> 00:11:44,150 en sit 'n veranderlike wêreldwyd, om so te praat, nie binnekant van 'n funksie, nie binnekant van 'n lus, 194 00:11:44,150 --> 00:11:49,800 maar in die lêer self, buite van al die funksies wat jy geskryf het, soos ek gedoen het hier on line 15. 195 00:11:49,800 --> 00:11:55,220 Dit is oor die algemeen frowned upon, maar besef dat dit 'n oplossing soms tot ander probleme, 196 00:11:55,220 --> 00:11:56,910 soos ons sal uiteindelik sien. 197 00:11:56,910 --> 00:11:59,500 So vir nou sal ons laat dit soos hierdie, maar laat ons kyk of ons kan Herskryf hierdie 198 00:11:59,500 --> 00:12:02,360 net om te begin met die uitdrukking van onsself 'n bietjie anders. 199 00:12:02,360 --> 00:12:05,550 Hierdie program, net om duidelik te wees, is positive1. 200 00:12:05,550 --> 00:12:11,980 Laat my voort te gaan hier en in my terminale venster positive1, Enter. 201 00:12:11,980 --> 00:12:15,080 Stel okay. Ek gaan positive1 uit te voer, druk Enter. 202 00:12:15,080 --> 00:12:19,250 Ek eis dat jy gee my 'n positiewe heelgetal. Ek sal -1 sê. Wat nie werk nie. 203 00:12:19,250 --> 00:12:22,340 0, 99. Dit blyk te werk. 204 00:12:22,340 --> 00:12:25,310 Miskien nie die mees streng toets, maar ten minste is dit 'n mooi gesonde verstand tjek 205 00:12:25,310 --> 00:12:27,100 dat ons op die regte spoor is. 206 00:12:27,100 --> 00:12:29,570 >> So laat my nou voort te gaan en maak weergawe 2 van hierdie, 207 00:12:29,570 --> 00:12:32,800 en wat verskillend is reeds? 208 00:12:32,800 --> 00:12:39,030 Dit implemente die dieselfde ding, maar wat spring uit as duidelik anders hierdie keer? 209 00:12:40,790 --> 00:12:47,090 Dit Bool in groen. Dit word uitgelig in groen, hierdie navraag bekend as Bool, wat is 'n data tipe. 210 00:12:47,090 --> 00:12:50,510 Dit kom nie gebou in al die weergawes van C. 211 00:12:50,510 --> 00:12:52,650 Jy moet 'n spesifieke biblioteek in te sluit. 212 00:12:52,650 --> 00:12:56,460 In ons geval, ek sluit die CS50 biblioteek sodat ons toegang tot Bool. 213 00:12:56,460 --> 00:12:59,860 Maar in reël 18, maar dit lyk asof ons 'n Boolese waarde hier genoem dankbaar te hê. 214 00:12:59,860 --> 00:13:02,190 Ek kon genoem het iets, maar ek noem dit dankbaar 215 00:13:02,190 --> 00:13:04,750 net soort van 'n paar semantiese betekenis oor te dra. 216 00:13:04,750 --> 00:13:07,700 So aanvanklik on line 18, ek glo nie dankbaar 217 00:13:07,700 --> 00:13:12,230 omdat die Boole-waarde dankbaar is geïnisialiseer vals in lyn 18. 218 00:13:12,230 --> 00:13:16,500 En dan lyk dit wat ek hier gedoen het in lyne 21 deur 23 219 00:13:16,500 --> 00:13:19,200 Ek het net soort van herskryf my logika. 220 00:13:19,200 --> 00:13:26,100 So nie funksioneel verskillende, maar nou in lyn 22 Ek is so indien die int die gebruiker verskaf 221 00:13:26,100 --> 00:13:31,360 groter as 0 is, dan het ek eenvoudig die waarde van dankbaar vir ware verander. 222 00:13:31,360 --> 00:13:35,590 En hoekom doen ek dit? Want in line 25, glo ek gaan om 'n toestand te monitor. 223 00:13:35,590 --> 00:13:39,760 Doen dit loop terwyl dankbaar is vals. 224 00:13:39,760 --> 00:13:42,960 So het ek voorgestel as 'n alternatief vir weergawe 1 225 00:13:42,960 --> 00:13:47,050 want dit is ten minste 'n bietjie meer intuïtief miskien, dit is 'n bietjie meer gegrond is in Engels. 226 00:13:47,050 --> 00:13:51,980 So doen die volgende terwyl jy nie dankbaar is of terwyl dankbaar is vals. 227 00:13:51,980 --> 00:13:56,220 En ook hierdie keer Ek glo gee nie hoef te onthou wat die gebruiker getik in 228 00:13:56,220 --> 00:14:00,050 want kennis is daar geen veranderlike N, so werklik, daar 'n klein wit leuentjie. 229 00:14:00,050 --> 00:14:03,290 >> Funksioneel, die program is 'n bietjie anders is wanneer ons kry aan die onderkant van 230 00:14:03,290 --> 00:14:04,960 omdat ek nie onthou wat n is. 231 00:14:04,960 --> 00:14:09,120 Maar ek wou hier demonstreer ook dat selfs al het ons gesien getint 232 00:14:09,120 --> 00:14:13,780 en GetString wat gebruik word op die regterkant van 'n gelykaanteken tot dusver 233 00:14:13,780 --> 00:14:17,310 sodat ons onthou die waarde, tegnies, dit is nie streng noodsaaklik is. 234 00:14:17,310 --> 00:14:20,290 Indien, vir watter rede ook al jy net nie omgee om die waarde te red, 235 00:14:20,290 --> 00:14:25,540 jy wil net om seker te maak van die waarde, opmerk dat ons net kan dit skryf as getint, 236 00:14:25,540 --> 00:14:27,320 oop hakie, naby hakie. 237 00:14:27,320 --> 00:14:30,570 Daardie funksie gaan 'n waarde om terug te keer, soos ons gesê. 238 00:14:30,570 --> 00:14:32,220 Dit gaan jou terug te gee 'n int. 239 00:14:32,220 --> 00:14:34,460 En so, as jy geestelik dink dit gebeur, 240 00:14:34,460 --> 00:14:38,190 wanneer ek tik in 99, getint gee die getal 99, 241 00:14:38,190 --> 00:14:41,840 en so konseptueel, dit is asof my kode eintlik. 242 00:14:41,840 --> 00:14:45,950 So as 99 is inderdaad groter as 0, dan is dankbaar ware, 243 00:14:45,950 --> 00:14:50,810 dan besef lyn 25 ooh, ons gedoen, want ek is nou dankbaar, 244 00:14:50,810 --> 00:14:53,970 en in reël 26, het ons net sê, "Dankie vir die positiewe heelgetal!" 245 00:14:53,970 --> 00:14:55,960 wat dit gebeur om te wees. 246 00:14:55,960 --> 00:14:59,140 Laat ons nou doen effense "sintaktiese suiker hier, om so te praat. 247 00:14:59,140 --> 00:15:04,670 Kom ons kyk as ons kan skoon te maak hierdie lyn 25 met hierdie derde en laaste variant in positive3. 248 00:15:04,670 --> 00:15:13,600 >> Let op die enigste verskil is nou watter reël van die kode? >> [Student] 25. >> [Malan] Ja, 25. 249 00:15:13,600 --> 00:15:17,680 En ons het nie regtig hierdie truuk gesien net nog nie, maar ons het die uitroepteken op Maandag, 250 00:15:17,680 --> 00:15:21,070 wat dui op wat? >> [Student] nie. >> Nie of ontkenning. 251 00:15:21,070 --> 00:15:23,510 So 'n Boolese waarde en die waarde daarvan te flip. 252 00:15:23,510 --> 00:15:25,810 True vals, valse waar. 253 00:15:25,810 --> 00:15:30,420 So, ek sou voorstel, is selfs 'n bietjie meer intuïtief 'n manier van die skryf van die kode 254 00:15:30,420 --> 00:15:33,430 omdat ek nog steeds dankbaar vir valse inisialiseer, het ek nog steeds doen die volgende, 255 00:15:33,430 --> 00:15:36,010 Ek dankbaar vir waar, wanneer die tyd aanbreek, 256 00:15:36,010 --> 00:15:40,880 maar nou kan jy net regtig vertaling van hierdie kode mondelings links na regs, 257 00:15:40,880 --> 00:15:45,630 while (dankbaar!), want bang of uitroepteken dui op die idee van nie, 258 00:15:45,630 --> 00:15:47,580 Dus, terwyl nie dankbaar nie. 259 00:15:47,580 --> 00:15:49,900 Dit weer doen, het ons nie 'n nuwe konsepte per se. 260 00:15:49,900 --> 00:15:53,730 Ons het gepraat oor Booleans terug toe ons gespeel met Scratch, 261 00:15:53,730 --> 00:15:56,720 maar besef nou ons kan net begin skryf ons kode in baie verskillende maniere. 262 00:15:56,720 --> 00:16:01,060 Dus, veral in pset1 as jy soort van sukkel om uit te vind die manier om 'n program te skryf, 263 00:16:01,060 --> 00:16:04,340 kans is jy in geluk, want daar kan 'n aantal oplossings 264 00:16:04,340 --> 00:16:06,110 dat jy kan gebeur. 265 00:16:06,110 --> 00:16:10,500 Byvoorbeeld, dit is net 3 vir selfs die eenvoudigste van programme. Alles reg. 266 00:16:10,500 --> 00:16:14,200 En nou onthou op Maandag ons links op hierdie nota met die terugkeer waardes. 267 00:16:14,200 --> 00:16:18,450 Dus, vir die heel eerste keer het ons het 'n program wat nie net hoof; 268 00:16:18,450 --> 00:16:22,550 dit het ook sy eie persoonlike funksie wat ek hier geskryf het. 269 00:16:22,550 --> 00:16:26,810 Dus, in line 31 deur 34 Ek het 'n kubus funksie geïmplementeer. 270 00:16:26,810 --> 00:16:30,240 Dit is nie kompleks. Dit is net 'n * 'n * in hierdie geval. 271 00:16:30,240 --> 00:16:34,750 Maar wat is belangrik om daaroor is dat ek insette is in die vorm van 'n 272 00:16:34,750 --> 00:16:39,180 en ek terugkeer uitset in die vorm van 'n * a * a. 273 00:16:39,180 --> 00:16:43,560 So nou is ek het die vermoë om, net soos Ek gebruik met prinf alleen, 274 00:16:43,560 --> 00:16:47,240 hierdie funksie te roep deur die roeping van die kubus funksie. 275 00:16:47,240 --> 00:16:51,970 >> En die kubus funksie neem 'n paar insette, en die kubus funksie gee 'n paar uitset. 276 00:16:51,970 --> 00:16:56,960 In teenstelling, printf net iets gedoen het. 277 00:16:56,960 --> 00:17:00,840 Dit het nie weer enigiets wat ons versorg, selfs al is dit nie as 'n eenkant 'n waarde teruggee; 278 00:17:00,840 --> 00:17:03,110 jy net in die algemeen ignoreer dit. 279 00:17:03,110 --> 00:17:06,510 Printf net iets gedoen het. Dit het 'n newe-effek van die druk op die skerm. 280 00:17:06,510 --> 00:17:11,770 In teenstelling hier, ons het die kubus funksie, wat eintlik iets terug. 281 00:17:11,770 --> 00:17:15,520 So vir diegene wat vertroud is met hierdie, dit is 'n redelik eenvoudige idee. 282 00:17:15,520 --> 00:17:19,640 Maar vir diegene wat minder vertroud is met hierdie idee van wat in insette en om terug uitsette, 283 00:17:19,640 --> 00:17:21,950 laat ons probeer om net iets super eenvoudig. 284 00:17:21,950 --> 00:17:25,490 Is iemand gemaklik kom kortliks op die verhoog? 285 00:17:25,490 --> 00:17:28,040 Jy moet gemaklik wees met 'n kamera op jou as goed. Ja? Okay. 286 00:17:28,040 --> 00:17:31,240 Wat is jou naam? >> [Student] Ken. >> Ken. Alles reg. Ken, kom op. 287 00:17:31,240 --> 00:17:35,050 Ken gaan na 'n funksie van spesies hier te wees. 288 00:17:35,050 --> 00:17:38,720 Kom ons gaan voort en doen dit. Kom ons kry 'n bietjie fancy. 289 00:17:38,720 --> 00:17:42,260 Nice om jou te ontmoet. Welkom by sentrum stadium. Alles reg. 290 00:17:42,260 --> 00:17:46,640 Laat hierdie knoppie getref hier. Alles reg. 291 00:17:46,640 --> 00:17:49,820 So hier het jy 'n moderne skryfbord, 292 00:17:49,820 --> 00:17:53,470 en wat ek is, is die belangrikste funksie, byvoorbeeld, 293 00:17:53,470 --> 00:17:56,460 en ek het nie 'n iPad in my hand. 294 00:17:56,460 --> 00:17:59,710 >> Ek het nie regtig onthou hoe om te - Wel, ek kan nie sê dat. 295 00:17:59,710 --> 00:18:02,480 Ek het nie regtig 'n goeie handskrif, 296 00:18:02,480 --> 00:18:05,520 en so ook ek wil hê dat jy iets op die skerm vir my te druk. 297 00:18:05,520 --> 00:18:12,040 Ek synde die hoof program, en ek gaan te hê wat jy sê dit 298 00:18:12,040 --> 00:18:16,720 deur dit te skryf in my hoender kras en dan verby jou 'n inset. 299 00:18:16,720 --> 00:18:20,400 So dom al hierdie oefening is, is die idee van die funksies en die roeping van 'n funksie 300 00:18:20,400 --> 00:18:22,400 en die terugkeer van 'n funksie regtig kook afbring na hierdie. 301 00:18:22,400 --> 00:18:26,260 Ek am Main, ek het nou net printf, kwotasie-unquote iets geskryf op die skerm, 302 00:18:26,260 --> 00:18:29,110 Ek hardloop hierdie program, en so gou as printf kry genoem, 303 00:18:29,110 --> 00:18:32,880 wat dit neem om 'n argument of een parameter soms tussen dubbele aanhalingstekens. 304 00:18:32,880 --> 00:18:35,880 Hier is die argument. Ek om dit aan Ken. 305 00:18:35,880 --> 00:18:39,020 Hy is 'n swart boks skriftelike n aantal jaar gelede 306 00:18:39,020 --> 00:18:41,510 wat blykbaar weet net hoe om dinge op die skerm te druk. 307 00:18:41,510 --> 00:18:43,150 So voer. 308 00:18:49,280 --> 00:18:51,280 Dit is nie sleg nie. Baie goed. 309 00:18:51,280 --> 00:18:55,510 So nou Ken gedoen uitvoering. Moet hy aan die hand my niks terug? 310 00:18:55,510 --> 00:18:57,470 Nie dat ons het tot dusver gesien het. 311 00:18:57,470 --> 00:19:00,460 Weereens, eintlik printf terugkeer 'n nommer, maar ons gaan om dit te ignoreer vir nou 312 00:19:00,460 --> 00:19:03,470 want ons het dit nooit gebruik nie. So wat is dit vir Ken. 313 00:19:03,470 --> 00:19:08,580 En so nou hoof neem oor die beheer van die program weer 314 00:19:08,580 --> 00:19:11,060 omdat daardie lyn van kode, printf gedoen uitvoering. 315 00:19:11,060 --> 00:19:14,050 En ons gaan oor ons pad, die uitvoering van enige ander lyne is daar. 316 00:19:14,050 --> 00:19:17,320 So nou, laat ons probeer om 'n effens ander voorbeeld. 317 00:19:17,320 --> 00:19:24,940 Hierdie keer hier laat ons eers die skerm skoon te maak, en hierdie keer sal ons die cubing funksie doen, 318 00:19:24,940 --> 00:19:27,080 maar hierdie keer, ek verwag 'n uitset waarde. 319 00:19:27,080 --> 00:19:29,180 >> So laat ons gaan voort en doen dit. 320 00:19:29,180 --> 00:19:35,790 Nou het ek 'n reël van die kode wat sê x kry kubus van x. 321 00:19:41,370 --> 00:19:46,370 Die lyn van kode, herroep, lyk soos volg: x = kubus (x); 322 00:19:46,370 --> 00:19:50,930 So hoe is dit gaan werk? Kom ons gaan voort en gee jou weer 'n wit skerm. 323 00:19:50,930 --> 00:19:54,070 Ek gaan nou neer te skryf die waarde van x, 324 00:19:54,070 --> 00:20:01,400 wat op hierdie oomblik in die tyd gebeur om te wees, laat ons sê, 2 om dit eenvoudig te hou. 325 00:20:01,400 --> 00:20:06,150 Ek geskryf het op 'n stuk papier, die waarde van 2, wat is my waarde x. 326 00:20:06,150 --> 00:20:10,920 Ek oorhandig dit aan Ken. >> En ek het net skryf die antwoord? >> Ja, laat ons net skryf die antwoord. 327 00:20:12,760 --> 00:20:18,940 Okay. En nou het hy my iets om terug te keer. Perfect. Nice segue. 328 00:20:18,940 --> 00:20:23,120 So nou is hy oorhandig my die waarde van 8 terug in hierdie geval, en wat moet ek doen met dit? 329 00:20:23,120 --> 00:20:28,250 Eintlik - laat ons sien, kry dit reg. Wat gaan ek te doen met dit? 330 00:20:28,250 --> 00:20:33,440 Nou gaan ek om hierdie waarde te neem en eintlik is dit in daardie stukkies in die geheue stoor. 331 00:20:33,440 --> 00:20:35,170 Maar let Ek is soort van sukkel hier. 332 00:20:35,170 --> 00:20:38,210 Ek is 'n bietjie verward, want waar ek skryf eintlik die waarde van x, 333 00:20:38,210 --> 00:20:43,150 want wat ek het net gedoen is fisies hand Ken 'n stuk papier wat die waarde 2, 334 00:20:43,150 --> 00:20:46,590 wat x, en inderdaad, dit is presies wat gebeur het. 335 00:20:46,590 --> 00:20:50,210 So dit blyk dat wanneer jy noem die funksie en jy in 'n argument 336 00:20:50,210 --> 00:20:53,290 soos hello, wêreld of jy slaag in 'n argument soos 2, 337 00:20:53,290 --> 00:20:57,110 die algemeen, jy wat in 'n afskrif van daardie argument. 338 00:20:57,110 --> 00:21:00,730 En net soos ek geskryf het die getal 2 hier en oorhandig dit aan Ken, 339 00:21:00,730 --> 00:21:04,720 wat beteken dat ek nog steeds 'n afskrif van die waarde 2 iewers 340 00:21:04,720 --> 00:21:08,890 want inderdaad, nou dat ek die waarde 8 terug gekry het, ek nodig het om terug te gaan in RAM 341 00:21:08,890 --> 00:21:12,130 en eintlik neer te skryf 8 waar ek een keer die getal 2. 342 00:21:12,130 --> 00:21:16,950 So visueel, onthou hierdie idee van verbygaande, letterlik, 'n afskrif van die waarde. 343 00:21:16,950 --> 00:21:20,780 >> Ken doen sy ding, oorhandig my terug iets - in hierdie geval 'n waarde soos 8 - 344 00:21:20,780 --> 00:21:24,980 en dan het ek het iets te doen met daardie waarde as ek wil om dit rond te hou. 345 00:21:24,980 --> 00:21:29,650 So al hierdie dinge sal terug kom al te bekend is kort voor lank te wees. 346 00:21:29,650 --> 00:21:34,920 Thank you so much vir hierdie demo hier, Ken. [Applous] 347 00:21:34,920 --> 00:21:36,920 Baie goed gedoen. 348 00:21:36,920 --> 00:21:42,690 Kom ons kyk hoe dit uiteindelik betrekking het op sommige van die funksie roeping wat ons hier doen. 349 00:21:42,690 --> 00:21:47,910 Laat my gaan voort en bring ons terug na die cubing voorbeeld hier. 350 00:21:47,910 --> 00:21:53,300 Let op dat as ons wil eintlik begin om dit verder te neem, 351 00:21:53,300 --> 00:21:57,570 ons gaan hê om bewus te wees van die feit dat die aantal x wat hier geslaag 352 00:21:57,570 --> 00:22:01,530 is verskil van wat is eintlik oorgedra word na die funksie. 353 00:22:01,530 --> 00:22:05,880 Dit weer doen, is dit die pad verbygaan afskrif gaan om 'n baie related in net 'n oomblik. 354 00:22:05,880 --> 00:22:09,580 Kom ons neem 'n blik op iets wat nie heeltemal reg is nie werk nie. 355 00:22:09,580 --> 00:22:13,250 Ek gaan om voort te gaan en 1/3 buggy voorbeeld, wat deur die natuur gebrekkig is oop, 356 00:22:13,250 --> 00:22:18,550 en dit word genoem buggy3 en dit implementeer 'n uitruiling funksie. 357 00:22:18,550 --> 00:22:25,110 Hier het ons het 'n belangrike funksie wat x en y het arbitrêr geïnisialiseer aan 1 en 2, onderskeidelik. 358 00:22:25,110 --> 00:22:27,700 Ons kan gebruik getint, maar ons het net 'n eenvoudige oefening nodig het, 359 00:22:27,700 --> 00:22:30,170 so dit is hard-gekodeerde as 1 en 2. 360 00:22:30,170 --> 00:22:35,340 In reëls 21 en 22, het ons blykbaar druk x en y, 1 per lyn. 361 00:22:35,340 --> 00:22:39,720 Dan on line 23, ek beweer ek hierdie waardes is uitruiling, dot, dot, dot. 362 00:22:39,720 --> 00:22:44,170 Ek het blykbaar noem 'n funksie in lyn 24 sogenaamde swap neem 2 argumente. 363 00:22:44,170 --> 00:22:48,300 Dit is heeltemal wettig vir funksies 2 argumente te neem. Ons het gesien printf dit reeds doen. 364 00:22:48,300 --> 00:22:51,830 >> So swap neem blykbaar x en y, en soos sy naam suggereer, 365 00:22:51,830 --> 00:22:54,670 Ek hoop dat dit gaan om hierdie 2 waardes te ruil. 366 00:22:54,670 --> 00:23:00,090 So dan het ek beweer on line 25 "verruil!" en ek herdruk x en y 367 00:23:00,090 --> 00:23:03,070 onder die veronderstelling dat hulle het wel omgeruil. 368 00:23:03,070 --> 00:23:06,080 Maar as ek hierdie program - laat my 'n terminale venster oop te maak, 369 00:23:06,080 --> 00:23:09,860 laat my toe om buggy3 - soos die naam aandui, is dit nie gaan om goed te eindig 370 00:23:09,860 --> 00:23:15,770 want toe ek druk Enter opmerk dat x is 1, y is 2, 371 00:23:15,770 --> 00:23:19,420 en nog nie aan die einde van die program, het hulle nog steeds, in werklikheid, dieselfde. 372 00:23:19,420 --> 00:23:22,960 So gebaseer op die demonstrasie nou net met Ken, wat eintlik aan die gang? 373 00:23:22,960 --> 00:23:28,710 Kom ons duik in hierdie swap funksie. Dit is super kort. Dit is net 'n paar reëls van die kode lank. 374 00:23:28,710 --> 00:23:34,520 Maar wat is die fundamentele probleem wat gebaseer is op die eenvoudige storie vertel hier met Ken? 375 00:23:34,520 --> 00:23:36,670 Hoekom is swap gebreek? 376 00:23:36,670 --> 00:23:39,660 [Student] Jy stoor 'n afskrif, nie die veranderlike. 377 00:23:39,660 --> 00:23:43,980 Presies. Ons is die stoor van 'n kopie, nie die veranderlike self. 378 00:23:43,980 --> 00:23:47,170 Met ander woorde, swap neem blykbaar 2 argumente, 'n int, 379 00:23:47,170 --> 00:23:49,370 en dit is arbitrêr a en b genoem, 380 00:23:49,370 --> 00:23:54,420 en hier is ek in X en Y, wat onderskeidelik 1 en 2 geslaag het, 381 00:23:54,420 --> 00:23:58,770 maar ek het letterlik is nie wat in x, ek nie letterlik wat in y, 382 00:23:58,770 --> 00:24:01,450 Ek verby 'n afskrif van x en 'n afskrif van y. 383 00:24:01,450 --> 00:24:04,510 Dit is amper asof jy gekopieer en geplak in ruil 384 00:24:04,510 --> 00:24:07,810 die waardes wat jy dit wil hê om werklik te manipuleer. 385 00:24:07,810 --> 00:24:14,480 So as dit die geval is, toe ek die program begin die uitvoering van lyn 35 dan 36, 386 00:24:14,480 --> 00:24:18,650 wanneer ek by lyn 37, op hierdie punt in die verhaal, wat is die waarde van 'n? 387 00:24:21,040 --> 00:24:25,050 Op hierdie punt in die verhaal, lyn 37, wat is die waarde van 'n op hierdie punt? >> [Student] 1. 388 00:24:25,050 --> 00:24:29,280 [Malan] Dit moet net 1, reg, omdat x geslaag is in die eerste argument, 389 00:24:29,280 --> 00:24:33,080 en hierdie funksie is net arbitrêr roep sy eerste argument. 390 00:24:33,080 --> 00:24:38,200 Net so is y die tweede argument, en dit is arbitrêr net die roeping van die tweede argument b. 391 00:24:38,200 --> 00:24:40,990 >> Hierdie digotomie is redelik eintlik eenvoudig verduidelik. Dink daaroor. 392 00:24:40,990 --> 00:24:43,320 Nie een van ons het met die persoon wat geskryf het printf, 393 00:24:43,320 --> 00:24:50,770 so sekerlik, hy of sy het geen idee wat ons veranderlikes 30 jaar later gaan genoem te word nie. 394 00:24:50,770 --> 00:24:56,650 So is daar 'n onderskeid tussen wat jy noem veranderlikes in die funksies wat jy skryf 395 00:24:56,650 --> 00:25:02,080 en wat jy noem veranderlikes in funksies wat jy vra of die gebruik van. 396 00:25:02,080 --> 00:25:05,340 So met ander woorde, het ek geskrywe my veranderlikes x en y, 397 00:25:05,340 --> 00:25:08,890 maar as iemand anders geskryf het om die ruil-funksie, wat hy of sy sou beslis nie geweet 398 00:25:08,890 --> 00:25:10,690 wat my veranderlikes gaan genoem te word, 399 00:25:10,690 --> 00:25:13,830 besef dat dit is waarom jy het hierdie dualiteit van name. 400 00:25:13,830 --> 00:25:16,750 Tegnies, kan ek dit doen deur die toeval, 401 00:25:16,750 --> 00:25:20,080 maar hulle sal nog nie geslaag word as kopieë. 402 00:25:20,080 --> 00:25:23,650 Dit sou net 'n toeval esteties indien daardie persoon wat swap geskryf 403 00:25:23,650 --> 00:25:26,150 gebruik het dieselfde name. 404 00:25:26,150 --> 00:25:32,370 So op hierdie punt in die verhaal, lyn 37, 'n is 1, b 2, en nou kan ek gaan om dit te ruil. 405 00:25:32,370 --> 00:25:34,900 Eerste van alles, laat my eintlik doen dit baie meer eenvoudig. 406 00:25:34,900 --> 00:25:36,690 Ek weet nie wat hierdie 3 reëls van die kode doen. 407 00:25:36,690 --> 00:25:41,210 Laat my net dit doen: b = a; a = b; gedoen. 408 00:25:41,210 --> 00:25:44,690 Hoekom is hierdie gebroke, logies? 409 00:25:46,490 --> 00:25:48,900 Dit is soort van die intuïtiewe ding, reg? 410 00:25:48,900 --> 00:25:52,560 So 'n raak-b en b raak 'n, 411 00:25:52,560 --> 00:25:57,730 maar die probleem is dat so gou as line 37 voer, wat is die waarde van a en b? 412 00:25:57,730 --> 00:26:03,410 Dieselfde, 1, want jy het oók deurloop, om so te praat, jy het verander b 'n gelyk. 413 00:26:03,410 --> 00:26:08,890 So een keer lyn 37 uitgevoer word, wat is 'n groot, jy het nou 2 kopieë van die aantal 1 414 00:26:08,890 --> 00:26:13,350 binnekant van hierdie funksie, so dan wanneer jy sê in lyn 38 a = b, 415 00:26:13,350 --> 00:26:17,640 jy soort van geskroef omdat jy net 1 toeken van 1. 416 00:26:17,640 --> 00:26:20,580 Jy het soort van verlore die waarde wat jy omgegee. 417 00:26:20,580 --> 00:26:23,220 So in die oorspronklike weergawe van hierdie, let op wat ek gedoen het. 418 00:26:23,220 --> 00:26:26,850 Ek plaas het 1/3 lyn van kode wat lyk soos hierdie. 419 00:26:26,850 --> 00:26:28,580 Ek verklaar 'n tydelike veranderlike. 420 00:26:28,580 --> 00:26:32,170 >> TMP is 'n baie algemene naam vir 'n tydelike veranderlike, en dit is 'n int 421 00:26:32,170 --> 00:26:34,580 omdat dit aan te pas wat ek wil hê om 'n kopie te maak van. 422 00:26:34,580 --> 00:26:39,770 Ek slaan afskrif van 'n binnekant van die tmp, so een keer lyn 37 uitgevoer, 423 00:26:39,770 --> 00:26:45,860 die waarde van 'n vinnige sanity check - 1, die waarde van b 2, 424 00:26:45,860 --> 00:26:48,970 en die waarde van die tmp is ook 1. 425 00:26:48,970 --> 00:26:52,060 So nou is ek voer lyn 38. 426 00:26:52,060 --> 00:27:00,540 Sodra lyn 38 voer, neem die waarde van b. En b was 2, so 'n is nou 2. 427 00:27:00,540 --> 00:27:05,210 So op hierdie punt in die verhaal, 'n 2, b 2, en tmp is 1, 428 00:27:05,210 --> 00:27:11,060 so nou logies, ons kan net plop tmp se waarde in b en wat ons gedoen het. 429 00:27:11,060 --> 00:27:12,800 Dus het ons dat die probleem opgelos. 430 00:27:12,800 --> 00:27:17,720 Ongelukkig is wanneer ek hardloop hierdie program in hierdie vorm, beteken dit nie eintlik ruil enige waardes. 431 00:27:17,720 --> 00:27:20,100 Maar duidelik te wees, hoekom? 432 00:27:23,660 --> 00:27:26,450 Ek vaste die logiese probleem van net 'n oomblik gelede, 433 00:27:26,450 --> 00:27:31,020 maar weer, as ek hierdie program, x en y bly onveranderd 434 00:27:31,020 --> 00:27:33,310 deur die einde van die program se uitvoering. 435 00:27:33,310 --> 00:27:37,220 [Onhoorbaar student comment] >> Ons het nie terug nie, so dis waar. 436 00:27:37,220 --> 00:27:39,670 Maar dit blyk daar is 'n bietjie van 'n probleem hier, want tot dusver, 437 00:27:39,670 --> 00:27:44,170 die enigste ding wat ons het in staat was om terug te keer is een ding, en dit is 'n beperking van C. 438 00:27:44,170 --> 00:27:49,070 Jy kan eintlik net een waarde terug, in welke geval ek is soort van vas hier 439 00:27:49,070 --> 00:27:53,310 want ek kon die nuwe waarde van x terug of ek kon terugkeer om die waarde van y, 440 00:27:53,310 --> 00:27:55,190 maar ek wil beide terug. 441 00:27:55,190 --> 00:27:58,650 So die terugkeer van die eenvoudige oplossing is nie hier nie. 442 00:27:58,650 --> 00:28:01,710 Maar die probleem is fundamenteel hoekom? Wat ons eintlik verruil? 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 is afskrifte van x en y, wat beteken dat ons net het al van hierdie werk, 445 00:28:08,230 --> 00:28:11,650 ons net het 3 minute praat oor die ruil-funksie en al 3 van hierdie veranderlikes, 446 00:28:11,650 --> 00:28:15,420 en dit is 'n groot, heeltemal korrek in isolasie nie, 447 00:28:15,420 --> 00:28:20,740 maar 'n en B se omvang is slegs in hierdie lyne hier. 448 00:28:20,740 --> 00:28:24,790 >> Dus, net soos 'n lus as jy 'n heelgetal verklaar ek binne die lus 449 00:28:24,790 --> 00:28:28,760 Net so, as jy verklaar dat a en b binnekant van 'n funksie wat jy geskryf het, 450 00:28:28,760 --> 00:28:33,320 hulle is slegs geldig binnekant van daardie funksie, wat beteken dat so gou as swap gedoen die uitvoering van 451 00:28:33,320 --> 00:28:38,470 en ons gaan van lyn 24 tot line 25, x en y nie op alle verander. 452 00:28:38,470 --> 00:28:42,790 Jy moet net 'n hele klomp van die tyd uitruiling afskrifte van veranderlikes gemors. 453 00:28:42,790 --> 00:28:47,010 So dit blyk dat die oplossing vir hierdie werklik is nie-voor-die-handliggende. 454 00:28:47,010 --> 00:28:50,670 Dit is nie heeltemal genoeg waardes om terug te keer, want ons kan net 1 waarde terugkeer, 455 00:28:50,670 --> 00:28:53,470 en Ek het regtig wil beide x en y op dieselfde tyd te ruil, 456 00:28:53,470 --> 00:28:55,210 so ons gaan te hê om terug te kom na hierdie. 457 00:28:55,210 --> 00:29:01,020 Maar vir nou, besef dat die kwessie fundamenteel afgelei van die feit dat a en b is afskrifte 458 00:29:01,020 --> 00:29:03,630 en hulle is in hul eie omvang. 459 00:29:03,630 --> 00:29:05,050 Kom ons probeer om dit in die een of ander manier op te los. 460 00:29:05,050 --> 00:29:11,250 Laat my eintlik blaai terug hier en oop te stel, laat ons sê, 1/4 variant van hierdie buggy4. 461 00:29:11,250 --> 00:29:13,370 Wat van hierdie? 462 00:29:13,370 --> 00:29:17,810 Dit is 'n soortgelyke, maar eenvoudiger probleem op te kyk voordat ons neem 'n steek om dit op te los. 463 00:29:17,810 --> 00:29:24,190 Hierdie program word genoem inkrement, en dit het blykbaar initialisatie van 'n x-heelgetal tot 1 in reël 18. 464 00:29:24,190 --> 00:29:28,150 Ek het toe beweer x 1, het ek dan sê, "verhoog van ..." 465 00:29:28,150 --> 00:29:33,730 Ek dan noem inkrement, maar dan in lyne 22 en 23, ek beweer dit is geïnkrementeer, 466 00:29:33,730 --> 00:29:40,220 Ek beweer x is nou wat dit ookal is - 2, vermoedelik, maar hierdie program is buggy. 467 00:29:40,220 --> 00:29:42,610 Wat is die probleem? 468 00:29:43,440 --> 00:29:50,160 Ja. >> [Onhoorbaar student reaksie] >> Presies. 469 00:29:50,160 --> 00:29:52,490 So x verklaar is, natuurlik, on line 18. 470 00:29:52,490 --> 00:29:54,700 Dit is binne die hoof se krullerige draadjies. 471 00:29:54,700 --> 00:29:58,440 So het die eenvoudige antwoord is dat, terwyl x hier bestaan, 472 00:29:58,440 --> 00:30:03,930 dit nie bestaan ​​nie in reël 32, so sal hierdie program eintlik nie eens stel. 473 00:30:03,930 --> 00:30:07,940 Die samesteller wanneer ek probeer die opstel van hierdie kode is om te skreeu op my 474 00:30:07,940 --> 00:30:14,100 oor 'n paar onverklaarde identifiseerder of iets te dien effekte. Om die waarheid te sê, laat ons probeer. 475 00:30:14,100 --> 00:30:18,470 Dit is om buggy4. Daar is dit. 476 00:30:18,470 --> 00:30:22,110 Gebruik van onverklaarde identifiseerder 'x' in lyn 32. 477 00:30:22,110 --> 00:30:25,580 En eintlik, laat ons meer eksplisiet hier vandag so dat dit is nuttig 478 00:30:25,580 --> 00:30:27,580 kantoorure en by die huis. 479 00:30:27,580 --> 00:30:29,300 >> Let daarop dat dit 'n bietjie kripties geskryf. 480 00:30:29,300 --> 00:30:37,270 Maar die feit dat die geratel het op ons geskree, sê buggy4.c: 32:5, is werklik nuttig. 481 00:30:37,270 --> 00:30:42,050 Dit beteken dat die fout is on line 32 by karakter posisie 5. 482 00:30:42,050 --> 00:30:46,700 So 1, 2, 3, 4, 5. Dit is, in werklikheid, waar die probleem is. 483 00:30:46,700 --> 00:30:49,790 En ook, ook in gedagte hou by die kantoorure en by die huis, ek is gelukkig hier. 484 00:30:49,790 --> 00:30:52,990 Ek het 'n fout. Dit gaan wees relatief maklik om vas te stel. 485 00:30:52,990 --> 00:30:55,990 Maar as jy 'n hele skerm vol van oorweldigende fout boodskappe, 486 00:30:55,990 --> 00:31:00,330 weer besef dat die onderste een kan wees net simptomaties van die boonste een. 487 00:31:00,330 --> 00:31:03,450 Altyd so jaag jou foute van top-down 488 00:31:03,450 --> 00:31:05,820 omdat daar dalk net 'n daisy chain effek 489 00:31:05,820 --> 00:31:09,240 wat daarop dui jy het 'n manier om meer probleme as wat jy werklik doen. 490 00:31:09,240 --> 00:31:15,150 So, hoe kan ons dit regmaak as my doel is om X te inkrementeer? >> [Student] Maak x globale. 491 00:31:15,150 --> 00:31:17,060 Okay, sodat ons kan x wêreld. 492 00:31:17,060 --> 00:31:20,480 Kom ons neem die kortpad dat ek gewaarsku oor vroeër, maar heck, ons moet net 'n quick fix, 493 00:31:20,480 --> 00:31:25,730 so laat ons net sê int x hier. Dit maak x wêreld. 494 00:31:25,730 --> 00:31:31,800 So nou hoof het toegang tot dit en inkrement het toegang tot dit, 495 00:31:31,800 --> 00:31:34,110 en laat my daarom voort te gaan en stel dit nou. 496 00:31:34,110 --> 00:31:37,630 Maak buggy4 Enter. Lyk nou te stel. 497 00:31:37,630 --> 00:31:41,230 Kom ons loop buggy4. En dit lyk eintlik werk. 498 00:31:41,230 --> 00:31:45,150 Dit is een van die dinge wat ons doen soos ek sê, nie soos ek doen, 499 00:31:45,150 --> 00:31:47,010 soos ek net gedoen het, want in die algemeen, 500 00:31:47,010 --> 00:31:50,440 ons programme gaan kry veel meer interessant en baie langer as dit, 501 00:31:50,440 --> 00:31:56,390 en as jou oplossing vir die lewe se probleme word net al die veranderlikes op die top van jou lêer, 502 00:31:56,390 --> 00:31:59,690 baie vinnig programme kry horrifically moeilik om te beheer. 503 00:31:59,690 --> 00:32:02,190 Dit word moeiliker om te dink nuwe veranderlike name, 504 00:32:02,190 --> 00:32:05,240 dit word moeiliker om te verstaan ​​watter veranderlike te doen wat, 505 00:32:05,240 --> 00:32:08,460 en so in die algemeen, is dit nie 'n goeie oplossing. 506 00:32:08,460 --> 00:32:10,030 So laat ons dit beter doen. 507 00:32:10,030 --> 00:32:12,160 Ons wil nie 'n globale veranderlike hier te gebruik. 508 00:32:12,160 --> 00:32:16,240 >> Ek wil x inkrementeer, so ek kon natuurlik - 509 00:32:16,240 --> 00:32:18,670 aan die einde van die dag, dit is 'n soort van 'n lawwe storie omdat ons net dit doen - 510 00:32:18,670 --> 00:32:24,450 maar as ek nie weet dat operateur of Ek was nie toegelaat om dit te verander in die hoof self, 511 00:32:24,450 --> 00:32:30,730 hoe sou Ek anders implementeer Ken hier hierdie tyd nie te kubus, maar inkrementeer? 512 00:32:31,380 --> 00:32:33,190 Hoe verander ek hierdie ding hier? Ja. 513 00:32:33,190 --> 00:32:38,480 [Student] Pass in x en dan terug [onhoorbaar] >> Goed, goed. 514 00:32:38,480 --> 00:32:41,900 So hoekom ek slaag nie in x en dan eerder as om dit terug, 515 00:32:41,900 --> 00:32:44,870 hoekom ek nie net terug x + 1. 516 00:32:44,870 --> 00:32:47,710 'N paar dinge hier te verander nie. Ek is op die regte pad. 517 00:32:47,710 --> 00:32:49,770 Wat anders het ek nodig om Tweak? Iemand anders. Ja. 518 00:32:49,770 --> 00:32:51,740 [Onhoorbaar student reaksie] 519 00:32:51,740 --> 00:32:54,730 Ek nodig het om die opgawe tipe van inkrement te verander, want dit is nie nietig. 520 00:32:54,730 --> 00:32:57,780 Void beteken niks word teruggekeer, maar duidelik is dit nou, 521 00:32:57,780 --> 00:32:59,830 sodat hierdie behoeftes te verander - >> [student] int. 522 00:32:59,830 --> 00:33:02,740 int om konsekwent te wees met alles wat ek eintlik terugkeer. 523 00:33:02,740 --> 00:33:05,180 Nou iets anders is nog steeds karretjie hier. Ja. 524 00:33:05,180 --> 00:33:08,400 [Onhoorbaar student reaksie] >> [Malan] So ek moet X te inkrementeer? 525 00:33:08,400 --> 00:33:12,080 [Onhoorbaar student reaksie] >> [Malan] Ag, so ek nodig het om x te slaag. 526 00:33:12,080 --> 00:33:16,660 So ek het dit nodig om hier te doen. >> [Onhoorbaar student kommentaar] 527 00:33:16,660 --> 00:33:20,050 [Malan] So het die prototipe, Ek het dit hier te verander. 528 00:33:20,050 --> 00:33:22,930 So dit het na 'n int, dit het te word - 529 00:33:22,930 --> 00:33:25,620 hmm, ek het eintlik 'n fout hier neer. Kom ons los hierdie een eerste. 530 00:33:25,620 --> 00:33:29,590 Wat dit eintlik moet wees? Dit het tot 'n int iets te wees. 531 00:33:29,590 --> 00:33:32,700 Dit kan wees x, maar eerlik, as jy begin roep al van jou veranderlikes x, 532 00:33:32,700 --> 00:33:35,390 dit gaan te kry minder en minder duidelik wat is wat. 533 00:33:35,390 --> 00:33:39,560 >> So laat ons na willekeur net kies 'n ander Naming Convention vir my helper funksies, 534 00:33:39,560 --> 00:33:41,940 die funksies wat ek skryf. Ons noem dit 'n, of ons kan dit noem - 535 00:33:41,940 --> 00:33:45,010 Kom ons noem dit nommer te wees, selfs meer eksplisiet. 536 00:33:45,010 --> 00:33:47,560 So dan het ek om terug te keer, ongeag die aantal plus 1, 537 00:33:47,560 --> 00:33:50,740 en nou het ek 1 ander ding hier te verander en 'n ander ding hier. 538 00:33:50,740 --> 00:33:54,350 Wat moet ek eerste on line 21 te verander? >> [Onhoorbaar student reaksie] 539 00:33:54,350 --> 00:33:57,610 [Malan] Ek het dit toe te ken aan x. Ek kan net nie noem inkrement (x). 540 00:33:57,610 --> 00:34:01,960 Ek nodig het om te onthou van die antwoord deur die verandering van die waarde van x op die linkerkant. 541 00:34:01,960 --> 00:34:04,680 En selfs al is x is nou op die links en regs, dit is heeltemal fyn 542 00:34:04,680 --> 00:34:08,860 omdat die regterkant kry eers uitgevoer dan kry plof in die linkerkantste ding - 543 00:34:08,860 --> 00:34:10,600 x in hierdie geval. 544 00:34:10,600 --> 00:34:12,159 En dan laastens, dit is 'n maklike fix nou. 545 00:34:12,159 --> 00:34:17,230 Dit moet net ooreenstem met wat hieronder neer, int nommer. 546 00:34:17,230 --> 00:34:20,570 So 'n hele klomp van die veranderinge vir 'n baie dom funksie 547 00:34:20,570 --> 00:34:24,420 maar verteenwoordiger van die dinge wat ons toenemend sal wil doen. 548 00:34:24,420 --> 00:34:27,090 So maak buggy4. Ek het screwed up iewers. 549 00:34:27,090 --> 00:34:30,139 O, my God. Vyf foute in 'n 6-line program. 550 00:34:30,139 --> 00:34:35,690 So, wat is verkeerd on line 18, karakter 5? 551 00:34:35,690 --> 00:34:39,610 So ek het om dit te verklaar, int. 552 00:34:39,610 --> 00:34:41,920 Kom ons kyk. Daar is 'n hele klomp van die ander foute. 553 00:34:41,920 --> 00:34:47,010 O, my God - 19, 18, 21, maar weer, laat ons net duidelik die skerm, beheer L hier, 554 00:34:47,010 --> 00:34:49,380 heruitzend kletteren. 555 00:34:49,380 --> 00:34:51,340 So 5 probleme is eintlik net dat 1. 556 00:34:51,340 --> 00:34:57,520 So nou laat ons hardloop buggy4, Enter. Sjoe, het x korrek geïnkrementeer. 557 00:34:57,520 --> 00:35:02,720 Alles reg. Enige vrae oor hoe om getalle te inkrementeer? Ja. 558 00:35:02,720 --> 00:35:09,870 [Onhoorbaar student vraag] >> Goeie vraag. 559 00:35:09,870 --> 00:35:14,220 Hoe is dit dat ek net kan verander x aantal en die program sal onmiddellik weet? 560 00:35:14,220 --> 00:35:16,200 >> Weereens, dink aan dit as hierdie abstraksie. 561 00:35:16,200 --> 00:35:21,600 So as ek die hoof-en Ken is inkrement, eerlik, ek gee nie om nie wat Ken noem sy iPad. 562 00:35:21,600 --> 00:35:26,570 Ek gee nie om wat hy noem enigiets wat te doen het met sy implementering van hierdie funksionaliteit. 563 00:35:26,570 --> 00:35:33,340 Dit is 'n uitvoering detail dat ek, hoof, het nie te bekommer oor. 564 00:35:33,340 --> 00:35:38,250 En so eenvoudig om dit te verander konsekwent binnekant van die funksie - nommer hier en nommer hier 565 00:35:38,250 --> 00:35:40,960 is al wat dit neem so lank as wat ek heropstel. 566 00:35:40,960 --> 00:35:44,180 Dit is soort van soos as jy daaroor dink baie van ons, dié van julle met rybewyse 567 00:35:44,180 --> 00:35:46,770 wat gedryf as jy het selfs in 'n motor gedryf word, 568 00:35:46,770 --> 00:35:50,950 Die meeste van ons het geen idee hoe 'n motor werk onder die kap. 569 00:35:50,950 --> 00:35:54,970 En letterlik, as jy maak die kap, die meeste van ons - myself ingesluit - 570 00:35:54,970 --> 00:35:56,940 gaan nie regtig weet wat ons is op soek na, 571 00:35:56,940 --> 00:35:59,220 soort van soos jy kan nou met dinge soos dit reg voel. 572 00:35:59,220 --> 00:36:01,480 Maar ons het nie regtig omgee hoe die motor werk, 573 00:36:01,480 --> 00:36:05,970 ons hoef nie te sorg wat al die latte en suiers en kabels binnekant van die motor 574 00:36:05,970 --> 00:36:08,160 eintlik mee besig is. 575 00:36:08,160 --> 00:36:12,770 So iets soos wat jy noem die suier saak nie hier in hierdie geval. Dieselfde idee. 576 00:36:12,770 --> 00:36:25,300 Ja. >> [Onhoorbaar student vraag] 577 00:36:25,300 --> 00:36:29,180 Indien daar meer gebruike van die veranderlike xa oomblik gelede, 578 00:36:29,180 --> 00:36:32,150 jou, die programmeerder, sou hê om hulle oral te verander. 579 00:36:32,150 --> 00:36:36,600 Of jy kan letterlik doen Lêer, Menu, en dan vind, te vervang - iets soos dit - 580 00:36:36,600 --> 00:36:39,170 maar jy gaan te hê om die veranderinge self te maak. 581 00:36:39,170 --> 00:36:47,450 Jy het om konsekwent te wees. >> [Student] As daar meer veranderlikes [onhoorbaar] 582 00:36:47,450 --> 00:36:53,100 'N spesifieke volgorde soos hier, en indien dit int n ander getal? >> [Student] korrek. 583 00:36:53,100 --> 00:36:56,590 [Malan] Ja. Om sake wanneer jy bel die funksie. 584 00:36:56,590 --> 00:37:00,050 >> So as ek roep inkrement hier met iets komma iets, 585 00:37:00,050 --> 00:37:01,680 daar is 'n direkte kartering. 586 00:37:01,680 --> 00:37:05,690 Die eerste veranderlike, wat dit ookal genoem word, is 'n afskrif van die eerste argument hier. 587 00:37:05,690 --> 00:37:07,760 Jammer. Dit behoort nie 'n hakie. 588 00:37:07,760 --> 00:37:11,490 Die tweede argument in lyn met die tweede een. So orde, ja, sake. Alles reg. 589 00:37:11,490 --> 00:37:17,020 Jammer. Ek het die lang pad om daar te kom. Ander vrae? Alles reg. 590 00:37:17,020 --> 00:37:20,610 So laat ons kyk of ons kan nie 'n prentjie van wat is eintlik hier aan die gang verf 591 00:37:20,610 --> 00:37:23,090 onder die kap, om so te praat nie. 592 00:37:23,090 --> 00:37:26,640 Dit is 'n reghoek wat kan verteenwoordig jou rekenaar se geheue. 593 00:37:26,640 --> 00:37:30,970 Selfs as jy het geen idee hoe geheue werk of hoe 'RAM werke, 594 00:37:30,970 --> 00:37:33,940 ten minste aanneem dat u trosse van hierdie dae. 595 00:37:33,940 --> 00:37:36,280 Jy megagrepe dit het, het jy gigagrepe van dit, 596 00:37:36,280 --> 00:37:40,870 en ons weet dat 'n greep uit week 0 is net wat? >> [Student] 8 stukkies. 597 00:37:40,870 --> 00:37:42,950 8 stukkies, reg? So 8 nulpunte en 1. 598 00:37:42,950 --> 00:37:45,880 So as jou rekenaar het 'n gig van RAM, 2 gigs van RAM hierdie dae, 599 00:37:45,880 --> 00:37:55,030 jy het 'n miljard of 2 miljard grepe van die geheue of ongeveer 8 miljard of 16 miljard stukkies 600 00:37:55,030 --> 00:37:56,890 binnekant van jou rekenaar. 601 00:37:56,890 --> 00:38:00,590 In teenstelling met die klein dofklinkend Willy voorbeeld, dit is nie magnetiese deeltjies tipies meer. 602 00:38:00,590 --> 00:38:04,450 Toenemend in skootrekenaars ten minste - dit is solid state drives, SSDs, 603 00:38:04,450 --> 00:38:08,580 wat net het geen bewegende dele. Dit is al die elektroniese. Dit is al wat elektrisiteit-gebaseerde. 604 00:38:08,580 --> 00:38:14,060 So dink van hierdie reghoek as net verteenwoordigend van die 1 of 2 GB geheue wat jy het. 605 00:38:14,060 --> 00:38:16,020 >> So dit is 'n stuk van die geheue. 606 00:38:16,020 --> 00:38:19,830 Die wêreld van die rekenaar wetenskap het soort van afgeskort 607 00:38:19,830 --> 00:38:22,950 stukke van die geheue om verskillende dinge te doen. 608 00:38:22,950 --> 00:38:27,190 Byvoorbeeld, as dit is jou rekenaar se geheue, soos voorgestel deur die reghoek daar, 609 00:38:27,190 --> 00:38:31,130 dit blyk dat deur konvensie, op die top van jou geheue, om so te praat, 610 00:38:31,130 --> 00:38:33,660 is oor die algemeen wat genoem word 'n teks segment. 611 00:38:33,660 --> 00:38:36,740 Dit is die 0'e en 1s wat jy opgestel het. 612 00:38:36,740 --> 00:38:39,020 So wanneer ons kyk onder die kap het teen watter a.out is, 613 00:38:39,020 --> 00:38:41,980 al hierdie 0'e en 1s, wanneer jy 'n program, 614 00:38:41,980 --> 00:38:46,290 diegene 0'e en 1s vanaf jou hardeskyf gelaai in iets genaamd RAM 615 00:38:46,290 --> 00:38:49,320 en in die RAM hulle aan die bokant. 616 00:38:49,320 --> 00:38:52,770 Intussen, jy het ander dinge: inisialiseer data, uninitialize data. 617 00:38:52,770 --> 00:38:57,510 Diegene 2 spuitbane van die geheue verwys na globale veranderlikes, wat jy nie dikwels gebruik 618 00:38:57,510 --> 00:39:00,760 maar soms as jy dit doen, het hulle uiteindelik daar as well. 619 00:39:00,760 --> 00:39:04,260 Dan is daar is 'n paar ander dinge: omgewing veranderlikes, wat ons sal nie veel tyd spandeer op, 620 00:39:04,260 --> 00:39:06,860 maar dan 2 belangrike dinge wat sal kom terug deur die loop van die semester, 621 00:39:06,860 --> 00:39:08,550 stack en heap. 622 00:39:08,550 --> 00:39:12,210 So die meeste van jou rekenaar se geheue gereserveer is wanneer 'n program 623 00:39:12,210 --> 00:39:15,370 vir iets genoem die stapel en iets genaamd die hoop. 624 00:39:15,370 --> 00:39:18,840 Ons gaan nie om te praat oor die hoop van vandag, maar ons sal praat oor die stapel. 625 00:39:18,840 --> 00:39:24,600 Die stapel is bedoel om te besweer die visuele van die eetsaal maaltyd bak in Mather House 626 00:39:24,600 --> 00:39:28,110 of waar jy ook wees waar die eetsaal personeel skoon hulle elke dag, 627 00:39:28,110 --> 00:39:30,180 hulle stapel hulle van vloer tot 628 00:39:30,180 --> 00:39:34,550 en insgelyks, in die geheue, daar is hierdie idee van om iets op 'n stapel, 629 00:39:34,550 --> 00:39:36,860 om iets op 'n stapel, om iets op 'n stapel. 630 00:39:36,860 --> 00:39:38,240 En wat bedoel ons met hierdie? 631 00:39:38,240 --> 00:39:41,860 >> Kom ons zoom in op net die onderste helfte van hierdie foto, jou rekenaar se RAM, 632 00:39:41,860 --> 00:39:44,330 die volgende voor te stel. 633 00:39:44,330 --> 00:39:48,170 Dit blyk dat wanneer jy 'n program soos a.out of Hello - 634 00:39:48,170 --> 00:39:50,100 ongeag die program is wat jy geskryf het - 635 00:39:50,100 --> 00:39:54,020 weer, dié 0'e en 1s word van jou hardeskyf, wat is die langtermyn stoor gelaai, 636 00:39:54,020 --> 00:39:57,230 bly daar selfs wanneer jy trek die plug, gelaai na RAM. 637 00:39:57,230 --> 00:40:00,610 RAM is vinniger as hardeskywe - dit is kleiner as hardeskywe - 638 00:40:00,610 --> 00:40:03,300 maar dit is waar programme leef terwyl jy hardloop hulle. 639 00:40:03,300 --> 00:40:08,230 So jy dubbel kliek op 'n program op 'n Mac of PC, is dit van die hardeskyf in RAM gelaai. 640 00:40:08,230 --> 00:40:11,520 So gou as wat dit in RAM, die 0'e en 1s gaan op die pad top gelaai, 641 00:40:11,520 --> 00:40:16,610 die sogenaamde teks segment, maar dan so gou as jou program eintlik begin hardloop, 642 00:40:16,610 --> 00:40:21,360 die belangrikste funksie genoem word, en die belangrikste, soos ons gesien het, het dikwels plaaslike veranderlikes, 643 00:40:21,360 --> 00:40:24,870 en dit het ints en stringe en karakters en dies meer. 644 00:40:24,870 --> 00:40:29,180 So as jou program wat jy geskryf het of die program wat jy het 'n dubbele gekliek 645 00:40:29,180 --> 00:40:32,970 gebruik sommige veranderlikes binnekant van die belangrikste, 646 00:40:32,970 --> 00:40:37,240 hulle uiteindelik aan die onderkant van jou stapel van die geheue, om so te praat. 647 00:40:37,240 --> 00:40:39,410 Meer konkreet, wat beteken dit eintlik beteken? 648 00:40:39,410 --> 00:40:48,450 Dit beteken net dat as ons gaan aantal grepe RAM op jou rekenaar, 649 00:40:48,450 --> 00:40:55,750 agterkom dat dit kan byte nommer 0, kan dit byte nommer 1, 2, 3, 4, 5, 6, 650 00:40:55,750 --> 00:41:01,480 al die pad tot 2 miljard sal al die pad tot daar aan die bokant. 651 00:41:01,480 --> 00:41:05,880 So met ander woorde, wanneer ons praat oor RAM of geheue in terme van grepe, 652 00:41:05,880 --> 00:41:11,500 dit beteken net dat iemand het besluit wat elkeen van daardie stukke van die geheue te tel. 653 00:41:11,500 --> 00:41:16,650 So wanneer jy nodig het om 32 stukkies vir 'n int of wat jy nodig het 8 stukkies vir 'n kar, 654 00:41:16,650 --> 00:41:18,840 waar eindig hulle in die geheue? 655 00:41:18,840 --> 00:41:22,350 >> Konseptueel, het hulle net aan die onderkant van hierdie ding genaamd die stapel. 656 00:41:22,350 --> 00:41:25,870 Maar wat is interessant nou is wanneer belangrikste noem 'n funksie - 657 00:41:25,870 --> 00:41:28,750 Gestel 'n funksie genoem foo, net 'n arbitrêre naam - 658 00:41:28,750 --> 00:41:32,330 wat gebeur belangrikste is, is aan die onderkant van die stapel geheue; 659 00:41:32,330 --> 00:41:35,680 foo is nou op die top van die belangrikste in die geheue. 660 00:41:35,680 --> 00:41:40,990 So 'n plaaslike veranderlikes wat foo het soort van konseptueel bo dié in die hoof beland. 661 00:41:40,990 --> 00:41:47,070 As foo noem nog 'n funksie genoem bar, daardie veranderlikes hier beland. 662 00:41:47,070 --> 00:41:50,120 As die bar iets anders, hier, hier, hier noem. 663 00:41:50,120 --> 00:41:53,830 So, wat is interessant oor die uitvoer van 'n program is dat soos jy dit noem funksies 664 00:41:53,830 --> 00:41:57,750 en as daardie funksies noem funksies en as dié funksies noem funksies, 665 00:41:57,750 --> 00:42:01,470 jy die opbou van hierdie stapel van funksies in die geheue. 666 00:42:01,470 --> 00:42:06,890 En slegs een keer 'n funksie opbrengste begin jy om daardie geheue terug. 667 00:42:06,890 --> 00:42:10,860 So een van die maklikste maniere om uit te voer van die geheue in 'n rekenaar-program 668 00:42:10,860 --> 00:42:14,360 is om te skryf funksies wat nooit weer terugkom nie. 669 00:42:14,360 --> 00:42:18,900 So byvoorbeeld, laat soveel demonstreer met 'n opsetlik buggy program. 670 00:42:18,900 --> 00:42:22,230 Laat my gaan voort en sluit # , 671 00:42:22,230 --> 00:42:25,000 int main (void), 672 00:42:25,000 --> 00:42:32,940 en ek gaan om te doen terwyl (2> 1), wat waarskynlik ooit sal verander nie op ons, 673 00:42:32,940 --> 00:42:37,560 en laat my nou voort te gaan en doen printf. 674 00:42:37,560 --> 00:42:40,700 Eintlik, wat gaan minder visueel interessante. Kom ons doen dit. 675 00:42:40,700 --> 00:42:50,240 Vir int i = 0; i> 0 - Kom ons maak hierdie fout - i + +. 676 00:42:50,240 --> 00:42:52,720 En laat ons nie printf hier. Kom ons oefen wat ek preek. 677 00:42:52,720 --> 00:43:00,190 Let's het 'n metode hier, nietig koor, en ons sal Int ek sê, 678 00:43:00,190 --> 00:43:06,830 en dan het ek gaan printf sê - nee, laat ons maak dit meer interessant. 679 00:43:06,830 --> 00:43:15,790 Laat ons nie eintlik print enigiets op alle. Kom ons doen dit: refrein (i). 680 00:43:15,790 --> 00:43:20,390 Alles reg. So, dit is karretjie want hoekom? 681 00:43:20,390 --> 00:43:23,380 Ek maak van hierdie as ek gaan omdat die program nie eintlik nie iets van belang nie. 682 00:43:23,380 --> 00:43:25,320 >> Maar dit is nie die doel. 683 00:43:25,320 --> 00:43:29,630 Die doel is om 'n program te skryf wie se hooffunksie doen, glo? 684 00:43:30,720 --> 00:43:32,860 Bel hom. En eintlik, het ons nie nodig om die lus. 685 00:43:32,860 --> 00:43:37,200 Kom ons selfs vereenvoudig dit net so as nie die oë van regtig die fundamentele fout te verloor. 686 00:43:37,200 --> 00:43:39,640 Main oproepe koor koor te sing, 687 00:43:39,640 --> 00:43:41,440 dan het ek het iets dom en ek het koor oproep chorus 688 00:43:41,440 --> 00:43:43,760 want ek aanvaar iemand anders gaan dit dalk te implementeer, 689 00:43:43,760 --> 00:43:47,210 en nou is dit nie van plan om nog te stel. Ek nodig het wat om te doen nie? 690 00:43:47,210 --> 00:43:49,970 Ek moet die prototipe, onthou. 691 00:43:49,970 --> 00:43:56,110 So het ek nodig om hier nietig koor (int i); 692 00:43:56,110 --> 00:43:59,210 So nou as ek neerdaal hier - eintlik, kom ons gebruik die groter venster. 693 00:43:59,210 --> 00:44:01,980 Kom ons gaan voort en maak koor. 694 00:44:01,980 --> 00:44:06,490 Kom ons gaan voort en maak koor. 695 00:44:06,490 --> 00:44:08,370 Gebruik van onverklaarde identifiseerder i. 696 00:44:08,370 --> 00:44:12,500 Ag, dit was dom. Ons hoef nie die argument nie. Kom ons doen dit. 697 00:44:12,500 --> 00:44:16,370 Ek wens dat ons op hierdie manier begin het. Dit sou gewees het 'n baie makliker program in te skryf. 698 00:44:16,370 --> 00:44:25,590 Daar. Nou, laat ons gaan oor na my terminale venster, tik klang, en hier gaan ons. 699 00:44:25,590 --> 00:44:28,460 Dit was regtig vinnig. 700 00:44:28,460 --> 00:44:31,150 Wat eintlik net gebeur, al is? 701 00:44:31,150 --> 00:44:33,730 Wel, nou sal ek die gedrukte lyn voeg, sodat ons kan sien. 702 00:44:33,730 --> 00:44:43,490 Laat my sê printf ("Ek is hier") - geen veranderlikes. Ons sal dit so verlaat. 703 00:44:43,490 --> 00:44:47,480 Laat my weer uit te voer. Laat my heruitzend koor. 704 00:44:47,480 --> 00:44:57,380 En ... kom op. Voort te gaan. 705 00:44:57,380 --> 00:44:59,930 As 'n eenkant, waarom dit nie neergestort het nie? 706 00:44:59,930 --> 00:45:02,080 Die segmentering skuld super vinnig gebeur het voor die aangesig van die. 707 00:45:02,080 --> 00:45:06,570 [Onhoorbaar student reaksie] >> Presies. So dit neem tyd om te druk, reg? 708 00:45:06,570 --> 00:45:08,610 Dit neem net meer werk op die rekenaar se deel. 709 00:45:08,610 --> 00:45:10,620 En daar is dit: Segmentasie skuld. 710 00:45:10,620 --> 00:45:12,340 >> So sien net hoe vinnig programme hardloop. 711 00:45:12,340 --> 00:45:14,130 As jy nie die druk van enigiets, super vinnig. 712 00:45:14,130 --> 00:45:18,770 Maar ons is nog steeds hierdie segmentering skuld, want wat gebeur het? 713 00:45:18,770 --> 00:45:21,210 As jy dink oor hoe om jou rekenaar se geheue is uitgelê, 714 00:45:21,210 --> 00:45:28,740 dit gebeur hoof te wees, maar hier laat ons net noem dit refrein, en laat ons noem hierdie koor. 715 00:45:28,740 --> 00:45:34,550 As ek dan nou my estetika reg doen, dit is net gaan koor, koor, koor om te sê, 716 00:45:34,550 --> 00:45:40,550 koor, koor, koor, koor, ad nauseum, en uiteindelik, wat gaan gebeur? 717 00:45:40,550 --> 00:45:45,630 As die groot prentjie, letterlik, is dit wat gebeur net konseptueel? 718 00:45:46,520 --> 00:45:48,630 Die stapel overschrijdingen die hoop. 719 00:45:48,630 --> 00:45:51,940 Of nog erger, jy net oorskry alles, insluitende die teks segment, 720 00:45:51,940 --> 00:45:54,590 wat is die 0'e en 1s dat jou program. 721 00:45:54,590 --> 00:45:57,080 In kort, dit is net super, super sleg. 722 00:45:57,080 --> 00:45:58,830 Jou program het buite beheer. 723 00:45:58,830 --> 00:46:01,220 Jy gebruik manier om meer geheue as jy bedoel 724 00:46:01,220 --> 00:46:03,960 alles as gevolg van 'n dom fout in hierdie geval, 725 00:46:03,960 --> 00:46:08,040 of in hierdie geval 'n baie doelbewus gedoen funksie roeping self. 726 00:46:08,040 --> 00:46:09,500 Nou, hierdie is nie net sleg nie. 727 00:46:09,500 --> 00:46:13,800 Funksies wat hulself eintlik groot krag wanneer jy dit korrek gebruik. 728 00:46:13,800 --> 00:46:15,800 Ek het nie gebruik dit korrek hier. 729 00:46:15,800 --> 00:46:19,780 So dit is nie almal sleg nie, maar die feit dat ek eintlik nooit ophou roeping myself 730 00:46:19,780 --> 00:46:23,520 is 'n fundamentele swakheid hier van hierdie program. 731 00:46:23,520 --> 00:46:26,400 So waar gaan ons met al hierdie dinge? Wat werklik gebeur? 732 00:46:26,400 --> 00:46:30,340 Toe ek noem die inkrement funksie soos ons besig was om in daardie voorbeelde, 733 00:46:30,340 --> 00:46:33,420 Ek het 'n waarde soos 1 dat ek slaag. 734 00:46:33,420 --> 00:46:37,570 Ek slaag in 'n afskrif van die aantal 1, so gebeur die volgende. 735 00:46:37,570 --> 00:46:44,240 Kom ons gaan in die inkrement voorbeeld, hierdie ou reg hier. 736 00:46:44,240 --> 00:46:46,870 Hier is wat werklik gebeur. 737 00:46:46,870 --> 00:46:53,400 As ek roep inkrement en ek slaag in x, picturaal, wat gaan hier aan. 738 00:46:53,400 --> 00:46:59,520 >> As ek die waarde van 1 gestoor hier en Ek het eintlik 'n beroep inkrement, 739 00:46:59,520 --> 00:47:04,330 wat is nou bekend as koor - die iPad is gooi my af hier. 740 00:47:04,330 --> 00:47:09,760 Kom ons noem hierdie inkrement, en ons weet nie wat hierdie volgende funksie gaan wees. 741 00:47:09,760 --> 00:47:14,840 So wat eintlik gebeur is hier iewers in die belangrikste Ek het 'n stuk van die geheue 742 00:47:14,840 --> 00:47:17,000 wat die stoor van die aantal 1. 743 00:47:17,000 --> 00:47:19,380 As ek roep, increment, ek is met 'n ander stuk van die geheue, 744 00:47:19,380 --> 00:47:21,230 maar nou het ek 'n afskrif van 1. 745 00:47:21,230 --> 00:47:26,660 Toe ek daardie waarde inkrementeer, dit word 2, 746 00:47:26,660 --> 00:47:30,560 maar wat gebeur dan so gou as inkrement opbrengste? 747 00:47:30,560 --> 00:47:33,630 Hierdie geheue net kry oorhandig terug na die bedryfstelsel, 748 00:47:33,630 --> 00:47:37,450 wat beteken dat alles wat jy gedoen het is niks nuttig. 749 00:47:37,450 --> 00:47:43,120 Die 1 wat oorspronklik vervat in hoof is nog steeds eintlik is daar. 750 00:47:43,120 --> 00:47:44,890 So waar gaan ons met hierdie? 751 00:47:44,890 --> 00:47:49,770 Dit blyk dat in die geheue wat jy het hierdie rug-aan-rug volgorde grepe 752 00:47:49,770 --> 00:47:53,050 dat jy kan sit dinge in, en dit blyk dat ons reeds gesien het iets 753 00:47:53,050 --> 00:47:55,390 wat behels om dinge rug aan rug Terug na. 754 00:47:55,390 --> 00:47:59,860 Wat is 'n string gebaseer op week 1 en nou week 2? 755 00:48:00,020 --> 00:48:01,980 Dit is net 'n versameling van die karakters. 756 00:48:01,980 --> 00:48:04,310 So dit blyk dat net soos jy kan sit in die geheue, 757 00:48:04,310 --> 00:48:06,990 insgelyks kan jy karakters in die geheue. 758 00:48:06,990 --> 00:48:10,530 En sodra ons begin om karakters in die geheue terug Terug na terug, 759 00:48:10,530 --> 00:48:13,620 dit blyk dat die gebruik van die eenvoudigste dinge soos 'n for-lus of 'n while lus, 760 00:48:13,620 --> 00:48:17,170 ons kan itereer van links na regs oor die karakters in 'n string 761 00:48:17,170 --> 00:48:20,600 en begin massering hulle heeltemal in verskillende karakters - 762 00:48:20,600 --> 00:48:23,370 kan word b, b kon word - 763 00:48:23,370 --> 00:48:27,780 sodat uiteindelik, kan ons 'n Engelse sin wat werklik sin maak 764 00:48:27,780 --> 00:48:30,310 en sit elkeen van daardie briewe 1 op 'n tyd 765 00:48:30,310 --> 00:48:34,400 deur die loop deur ons rekenaar se geheue links na regs om werklik te enkripteer. 766 00:48:34,400 --> 00:48:35,810 So laat ons vyf minute breek hier, 767 00:48:35,810 --> 00:48:40,730 en wanneer ons terug kom, sal ons begin hierdie proses van skommeling inligting. 768 00:48:42,020 --> 00:48:43,520 >> Alles reg. 769 00:48:43,520 --> 00:48:48,070 Voordat ons duik in sommige crypto en hierdie dinge genoem skikkings, 770 00:48:48,070 --> 00:48:51,470 laat my pouse vir enige vrae, want ek voel soos ek regtig soort vaag 771 00:48:51,470 --> 00:48:54,080 sommige van daardie onderwerpe. So laat los nou as ons kan. 772 00:48:54,080 --> 00:48:58,700 Ons het net gepraat oor die terugkeer waardes, het ons gepraat oor argumente, 773 00:48:58,700 --> 00:49:03,250 en ons het gepraat oor hierdie idee, wat ons sal terug kom in die weke om te kom, 774 00:49:03,250 --> 00:49:08,720 van die lees van geheue as 'n hele klomp van hierdie gestapel bak, om so te praat, 775 00:49:08,720 --> 00:49:12,660 bottom up, soos dat elke tray wat op die stapel geplaas kry 776 00:49:12,660 --> 00:49:16,530 'n funksie wat tans genoem. 777 00:49:17,900 --> 00:49:20,260 Enige vrae? 778 00:49:20,260 --> 00:49:22,640 Laat my 'n vraag hier vra. 779 00:49:22,640 --> 00:49:27,890 Laat my vereenvoudig dit terug na wat dit was voor sommige van ons vorige Q & A. 780 00:49:27,890 --> 00:49:35,570 Die feit dat die inkrement oop hakies, int nommer, gesluit hakies - 781 00:49:35,570 --> 00:49:39,110 Wat int aantal verteenwoordig? 782 00:49:39,110 --> 00:49:42,790 [Student] 'n argument. >> 'N argument. Okay. Maar wat is 'n argument? 783 00:49:42,790 --> 00:49:46,370 [Onhoorbaar student reaksie] >> Wat is dit? >> [Student] Iets wat jy slaag. 784 00:49:46,370 --> 00:49:49,940 Okay, so iets wat jy slaag. En meer in die algemeen, dit is net die inset. 785 00:49:49,940 --> 00:49:52,450 As jy die skryf van 'n funksie en dat die funksie se doel in die lewe 786 00:49:52,450 --> 00:49:55,770 is om iets te doen om 'n bietjie anders elke keer as jy dit gebruik, 787 00:49:55,770 --> 00:50:00,110 dan is die enigste manier vir wat werklik gebeur sou blyk te wees om dit te voorsien met die insette 788 00:50:00,110 --> 00:50:03,510 sodat dit iets anders kan doen met daardie insette elke keer. 789 00:50:03,510 --> 00:50:06,650 >> So moet jy twee dinge nodig om te spesifiseer wanneer 'n funksie neem insette. 790 00:50:06,650 --> 00:50:09,590 Jy moet die naam wat jy wil te gee aan daardie inset te spesifiseer 791 00:50:09,590 --> 00:50:12,700 slegs vir jou eie gerief, sodat jy kan verwys na 792 00:50:12,700 --> 00:50:16,540 in die funksie wat jy self skryf, soos ek gedoen het hier in lyn 32. 793 00:50:16,540 --> 00:50:20,800 Maar jy moet ook die tipe spesifiseer, want C is 'n programmeertaal 794 00:50:20,800 --> 00:50:25,940 wat vereis dat net dat as jy 'n veranderlike, jy het die rekenaar te vertel watter datatipe dit is, 795 00:50:25,940 --> 00:50:30,200 in 'n groot deel sodat dit weet hoeveel stukkies toe te ken vir daardie veranderlike 796 00:50:30,200 --> 00:50:33,020 want dit kan 6 - jammer, sal dit nie 6. 797 00:50:33,020 --> 00:50:37,080 Dit kan wees 16, kan dit 8, kan dit wees 32, selfs 64, 798 00:50:37,080 --> 00:50:39,130 maar die rekenaar nodig het om te weet. 799 00:50:39,130 --> 00:50:43,180 Nou, die int op die linkerkant verteenwoordig wat, in teenstelling? 800 00:50:46,350 --> 00:50:48,850 [Onhoorbaar student reaksie] >> Wat is dit? >> [Student] tipe funksie. 801 00:50:48,850 --> 00:50:53,610 Die tipe van 'n funksie en, meer spesifiek, die tipe van sy produksie. Reg. 802 00:50:53,610 --> 00:50:57,380 Dus, terwyl die ding in hakies verteenwoordig sy insette, indien enige, 803 00:50:57,380 --> 00:50:59,660 die ding aan die linkerkant verteenwoordig sy uitset. 804 00:50:59,660 --> 00:51:03,530 En in hierdie geval, inkrement terug blykbaar 'n int, 805 00:51:03,530 --> 00:51:07,690 en so int is die terugkeer tipe van hierdie funksie. 806 00:51:07,690 --> 00:51:09,340 Wat beteken dit om terug te keer? 807 00:51:09,340 --> 00:51:15,090 Letterlik, jy gebruik die trefwoord terugkeer en dan as wat jy terugkeer 808 00:51:15,090 --> 00:51:18,600 aan die regterkant van die term 'n heelgetal is, 809 00:51:18,600 --> 00:51:21,660 dan is dit wel in ooreenstemming met wat ons gedoen het. 810 00:51:21,660 --> 00:51:26,410 Jy kan nie iets doen soos hierdie - Hello, world - want dit is 'n string. 811 00:51:26,410 --> 00:51:28,860 >> Natuurlik, dit is nie 'n heelgetal. 812 00:51:28,860 --> 00:51:33,140 Dus, in kort, die las is regtig op ons, die programmeerder, om spesifiek te wees 813 00:51:33,140 --> 00:51:37,770 as wat ons terugkeer en dan eintlik gaan oor die terugkeer. 814 00:51:37,770 --> 00:51:43,440 Die konteks hier is nou dat jou rekenaar se geheue is 'n giga byte, 2 GB - 815 00:51:43,440 --> 00:51:45,920 wat ook al - miskien is dit meer is, miskien is dit minder, 816 00:51:45,920 --> 00:51:49,050 maar die rekenaar beskou dit as met verskillende afdelings. 817 00:51:49,050 --> 00:51:51,200 Iets het daar iets anders gaan daar, 818 00:51:51,200 --> 00:51:54,290 verskillende dinge gaan in die middel, en vandag het ons net begin om die storie te vertel, 819 00:51:54,290 --> 00:51:56,340 maar ons sal terug kom na hierdie verloop van tyd. 820 00:51:56,340 --> 00:51:59,980 Vir nou, die enigste stuk van die geheue ons werklik omgee is die teks segment 821 00:51:59,980 --> 00:52:03,360 omdat dit net die 0'e en 1s dat kletteren verteenwoordig outputted. 822 00:52:03,360 --> 00:52:06,050 So wanneer jy 'n opdrag op die sleutelbord soos a.out 823 00:52:06,050 --> 00:52:09,110 of jy dubbel kliek 'n ikoon op Mac OS of Windows, 824 00:52:09,110 --> 00:52:11,880 jou program word van jou hardeskyf gelaai in RAM 825 00:52:11,880 --> 00:52:16,330 en dit plof op die top van jou rekenaar se RAM, om so te praat. 826 00:52:16,330 --> 00:52:20,450 Intussen, as jou program begin loop en die belangrikste kry genoem 827 00:52:20,450 --> 00:52:23,640 in die program wat jy geskryf het of die program Microsoft of Apple het geskryf, 828 00:52:23,640 --> 00:52:27,860 enige van sy plaaslike veranderlikes beland daar by die onderkant van jou rekenaar se geheue. 829 00:52:27,860 --> 00:52:33,230 Maar as hoof oproepe ander funksie wat self veranderlikes of argumente, het hulle uiteindelik bo dit. 830 00:52:33,230 --> 00:52:36,680 En as daardie funksie roep iets, hulle uiteindelik bo, bo dit, bogenoemde is dit. 831 00:52:36,680 --> 00:52:41,460 >> En slegs een keer 'n funksie is die uitvoering van die stapel van die bak, om so te praat, 832 00:52:41,460 --> 00:52:43,240 begin te kry laer en laer afsak. 833 00:52:43,240 --> 00:52:48,250 En dit is wat dan in 'n neutedop, verduidelik hoekom wanneer jy bel kubus 834 00:52:48,250 --> 00:52:51,550 of jy bel inkrement, jy wat in 'n afskrif van die waarde. 835 00:52:51,550 --> 00:52:55,520 En wat dit beteken picturaal is dat jy letterlik wil skryf die nommer 1 836 00:52:55,520 --> 00:53:00,460 in 'n ander deel van die geheue, die verandering van 1 tot 2 in die geval van 'n inkrement 837 00:53:00,460 --> 00:53:04,820 of aan 'n 8 in die geval van 'n kubus en dan gooi dat die geheue weg 838 00:53:04,820 --> 00:53:09,140 so gou as die inkrement of die kubus funksie opbrengste. Vraag. 839 00:53:09,140 --> 00:53:12,900 [Student] Waar is globale veranderlikes gestoor? 840 00:53:12,900 --> 00:53:18,100 Globale veranderlikes word gestoor in wat tans bekend as die geïnisialiseer data of geïnitialiseerd data, 841 00:53:18,100 --> 00:53:21,920 die verskil as jy 'n globale veranderlike en jy ken dit onmiddellik 'n waarde 842 00:53:21,920 --> 00:53:24,640 met die gelykaan teken, dit beland op die top daar, 843 00:53:24,640 --> 00:53:29,200 en as jy net int x sê, met geen waarde, dit eindig effens laer in RAM 844 00:53:29,200 --> 00:53:31,710 eenvoudig deur konvensie. 845 00:53:31,710 --> 00:53:34,940 Ander vrae? Alles reg. 846 00:53:34,940 --> 00:53:37,340 So hierdie foto sal terugkom as ons kry meer kragtige 847 00:53:37,340 --> 00:53:39,170 met wat ons kan doen met die rekenaar, 848 00:53:39,170 --> 00:53:42,720 maar vir nou, laat ons 'n kort inleiding tot kriptografie, 849 00:53:42,720 --> 00:53:46,080 'n spesifieke tipe van kriptografie wat nie al van die wêreld se probleme op te los 850 00:53:46,080 --> 00:53:47,720 maar dit los sommige van hulle. 851 00:53:47,720 --> 00:53:51,700 In hierdie geval hier, ons het iets genoem geheime-sleutel kriptografie. 852 00:53:51,700 --> 00:53:56,410 Secret-sleutel kriptografie, soos die naam aandui, ontleen sy sekuriteit van 'n geheim. 853 00:53:56,410 --> 00:54:00,690 >> Byvoorbeeld, as jy was terug in graad skool en jy is verby 'n bietjie geheime liefde brief 854 00:54:00,690 --> 00:54:04,850 na die seuntjie of meisie wat jy breek, as jy wil om daardie kennis te slaag deur die gehoor, 855 00:54:04,850 --> 00:54:08,380 jy sal waarskynlik nie so 'n nota in Engels te skryf of wat ook al jou moedertaal is. 856 00:54:08,380 --> 00:54:13,340 Inteendeel, kan jy enkripteer of jy kan net hulle stuur 'n SMS-boodskap hierdie dae. 857 00:54:13,340 --> 00:54:15,460 Maar jy kan dit eintlik slaag hulle 'n nota in die hele klas. 858 00:54:15,460 --> 00:54:18,700 En dit veilig te doen in so 'n manier dat jou vriende en die onderwyser 859 00:54:18,700 --> 00:54:22,650 weet nie wat jy skryf nie, kan jy kom met 'n redelik eenvoudige algoritme, 860 00:54:22,650 --> 00:54:25,920 jong al het jy ook mag wees, net scramble die woorde. 861 00:54:25,920 --> 00:54:28,130 So in plaas van die skryf van 'n jy kan skryf b, 862 00:54:28,130 --> 00:54:30,220 in plaas van b jy kan skryf c, 863 00:54:30,220 --> 00:54:32,140 in plaas van c jy kan skryf d, en so meer. 864 00:54:32,140 --> 00:54:34,360 Of jy kan kom met 'n meer gesofistikeerde vertaling 865 00:54:34,360 --> 00:54:36,720 briewe aan verskillende letters. 866 00:54:36,720 --> 00:54:39,740 Maar die vangs is die meisie of seun aan wie jy die stuur van hierdie nota 867 00:54:39,740 --> 00:54:45,020 iets nodig het, om te weet wat is wat, natuurlik? >> [Student] wat jy stuur. 868 00:54:45,020 --> 00:54:49,720 Wat is jou geheim is, soos wat is die kartering tussen A's en B's en C's en D's. 869 00:54:49,720 --> 00:54:54,650 Is dit voeg net 1 aan elk van die briewe te gaan van A na B, B na C? 870 00:54:54,650 --> 00:54:56,670 Is dit meer kompleks as dit? 871 00:54:56,670 --> 00:55:01,540 >> Sodat jy en jou geliefde moet hierdie geheime inligting te hê, 872 00:55:01,540 --> 00:55:03,190 maar daar is 'n soort van 'n catch-22 hier. 873 00:55:03,190 --> 00:55:06,830 As dit is die heel eerste keer wat jy stuur hierdie liefde brief deur die klas, 874 00:55:06,830 --> 00:55:10,720 hoe is daardie seuntjie of meisie gaan om te weet wat die geheim is? 875 00:55:10,720 --> 00:55:13,930 So geheim-key crypto nie al die wêreld se probleme op te los, 876 00:55:13,930 --> 00:55:16,320 en daar is eintlik 'n verhouding hier dat ons sal terug kom na die einde van semester se. 877 00:55:16,320 --> 00:55:25,110 Net so het die meeste van ons weet nie van iemand wat werk, byvoorbeeld, by Amazon.com, 878 00:55:25,110 --> 00:55:28,190 en tog is baie van ons het waarskynlik gekoop stuff by Amazon.com, 879 00:55:28,190 --> 00:55:31,990 en ons het al geleer om te aanvaar dat hierdie e-commerce transaksies veilig is. 880 00:55:31,990 --> 00:55:36,470 Die URL sê waarskynlik https, is daar iewers dalk 'n dom bietjie hangslot ikoon, 881 00:55:36,470 --> 00:55:39,930 daar is 'n soort van kriptografie die verkryging van jou kredietkaart inligting 882 00:55:39,930 --> 00:55:42,160 tussen jou en Amazon.com. 883 00:55:42,160 --> 00:55:45,430 En tog as kriptografie behels weet 'n paar geheime 884 00:55:45,430 --> 00:55:48,620 en tog weet ek nie iemand by Amazon en ek het beslis nie gereël om enige soort van geheime 885 00:55:48,620 --> 00:55:52,710 met iemand by Amazon, is hoe my rekenaar of my blaaier om dit te doen? 886 00:55:52,710 --> 00:55:55,720 Dit blyk uit daar is ander vorme van kriptografie altesaam dat dat die probleem op te los. 887 00:55:55,720 --> 00:55:57,670 Maar vir vandag, sal ons fokus op die eenvoudige een 888 00:55:57,670 --> 00:56:00,290 waar jy kan reël vooraf 'n paar geheime te leer ken 889 00:56:00,290 --> 00:56:03,760 soos 1 of 'n kartering tussen 'n's en b's. 890 00:56:03,760 --> 00:56:05,840 En die proses van kriptografie behels oor die algemeen. 891 00:56:05,840 --> 00:56:08,620 Jy het 'n paar plain text, uitgebeeld hier aan die linkerkant, 892 00:56:08,620 --> 00:56:12,930 jy loop dit deur 'n soort van algoritme of prosedure vir versleutelen - 893 00:56:12,930 --> 00:56:15,100 miskien is dit net 'n 'b, b raak c - 894 00:56:15,100 --> 00:56:17,490 en dan beland jy met kriptoteks. 895 00:56:17,490 --> 00:56:20,380 Intussen, wanneer jou geliefde hierdie geheime nota ontvang, 896 00:56:20,380 --> 00:56:24,200 hy of sy decrypt dit dan deur die algemeen omkeer dat algoritme 897 00:56:24,200 --> 00:56:27,190 so as om terug te kry die plain text. 898 00:56:27,190 --> 00:56:28,960 Daar is fisiese inkarnasies van hierdie. 899 00:56:28,960 --> 00:56:31,680 >> Byvoorbeeld, dit is 'n bietjie geheim dekodeerder ring, 900 00:56:31,680 --> 00:56:35,110 en dit is 'n ring in die sin dat daar twee dials hier. 901 00:56:35,110 --> 00:56:38,490 Op die buite rand van hierdie ding, daar is letters A tot Z, 902 00:56:38,490 --> 00:56:40,340 hoewel hulle in lukrake volgorde, 903 00:56:40,340 --> 00:56:42,880 en aan die binnekant, is daar eintlik 'n paar nommers 904 00:56:42,880 --> 00:56:46,620 so dat jy met hierdie ring soort van draai die buitekant, maar nie die binnekant 905 00:56:46,620 --> 00:56:49,140 ten einde te reël om getalle met letters. 906 00:56:49,140 --> 00:56:53,020 Uit 'n fliek genaamd A Christmas Story, sal jy sien dat min Ralphie 907 00:56:53,020 --> 00:56:58,000 was so gretig om uit te vind wat Little Orphan Annie se geheime boodskap aan hom was 908 00:56:58,000 --> 00:57:02,570 wat gekommunikeer word, dink ek, in die vorm van numeriese boodskappe op 'n Graankoshouer 909 00:57:02,570 --> 00:57:07,220 en jy het al die klein kaarte te versamel wat gekom het in die graan boks, 910 00:57:07,220 --> 00:57:09,770 jy het om hulle te pos, jy het om terug te kry die geheime dekodeerder ring 911 00:57:09,770 --> 00:57:13,910 sodat jy kan uiteindelik uitvind wat die kartering tussen letters en nommers 912 00:57:13,910 --> 00:57:15,550 of briewe en briewe. 913 00:57:15,550 --> 00:57:19,520 Hoe kan ons in 'n rekenaar gaan oor die implementering van of verteenwoordigend van dinge soos hierdie? 914 00:57:19,520 --> 00:57:22,560 Ons moet 'n manier van uitdrukking van onsself 'n bietjie meer buigsaam 915 00:57:22,560 --> 00:57:25,080 as ons veranderlikes tot dusver toegelaat het. 916 00:57:25,080 --> 00:57:29,000 Ons ints het, het ons karakters het, het ons het vlotte en dubbels en 'n paar ander, 917 00:57:29,000 --> 00:57:34,200 maar dit is individuele stukke van die geheue wat nie regtig ons in staat stel om dinge uit te druk 918 00:57:34,200 --> 00:57:36,440 soos woorde en sinne en frases. 919 00:57:36,440 --> 00:57:38,630 Inderdaad, het ons sulke dinge stringe genoem, 920 00:57:38,630 --> 00:57:42,660 maar ons belowe dat dit eintlik net 'n vereenvoudiging in die CS50 biblioteek 921 00:57:42,660 --> 00:57:45,540 dat ons van voorneme is om terug te skil. 922 00:57:45,540 --> 00:57:47,500 En so laat ons begin wat om hier te doen. 923 00:57:47,500 --> 00:57:49,840 Laat my gaan voort en 'n lêer oop te maak - 924 00:57:49,840 --> 00:57:54,100 al hierdie lêers is beskikbaar, soos gewoonlik, online - sogenaamde array.c 925 00:57:54,100 --> 00:57:58,960 'n probleem wat nie verband hou met stringe op te los, maar dit verf 'n prentjie hier 926 00:57:58,960 --> 00:58:01,520 van hoe ons kan gebruik om iets wat 'n skikking genoem word. 927 00:58:01,520 --> 00:58:04,050 >> 'N skikking is 'n data tipe. 928 00:58:04,050 --> 00:58:10,730 Dit is 'n tipe van 'n veranderlike van spesies wat het verskeie kleiner datatipes binnekant van dit 929 00:58:10,730 --> 00:58:12,680 rug aan rug Terug na. 930 00:58:12,680 --> 00:58:16,980 So byvoorbeeld, as ons wou 'n klein program wat gee jou quiz gemiddeld te skryf 931 00:58:16,980 --> 00:58:19,780 vir 'n kursus soos 50 wat 2 vasvrae, 932 00:58:19,780 --> 00:58:23,450 kan jy baie maklik skryf hierdie program selfs op grond van sommige van verlede week se materiaal 933 00:58:23,450 --> 00:58:28,830 getint en 'n paar van die veranderlikes deur gebruik te maak: int quiz1, int quiz2. 934 00:58:28,830 --> 00:58:30,550 En dit is redelik eenvoudig. 935 00:58:30,550 --> 00:58:33,500 Dit is miskien 10, 20 lyne van kode-max 'n program te implementeer 936 00:58:33,500 --> 00:58:38,940 wat vir die gebruiker vra vir 2 quiz tellings en dan bere hul gemiddelde 937 00:58:38,940 --> 00:58:42,020 voeg hulle saam, deel deur 2 en dan die druk van die resultate. 938 00:58:42,020 --> 00:58:46,400 Ons kan waarskynlik doen redelik geredelik nou na 'n paar minute. 939 00:58:46,400 --> 00:58:49,450 Maar die probleem is dat veronderstel dat 50 het 3 vasvrae of 4. 940 00:58:49,450 --> 00:58:52,830 Veronderstel dat jy wou om dieselfde program te gebruik vir 'n klas wat weekliks vasvrae. 941 00:58:52,830 --> 00:58:55,100 Dink na oor 'n klas wat weekliks vasvrae. 942 00:58:55,100 --> 00:58:58,840 As daar 16 of so weke in 'n semester, nou jy het 16 veranderlikes: 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 Sodra jy begin sien hierdie oortolligheid, kopieer en plak van die kode, 945 00:59:06,870 --> 00:59:09,810 dit moet begin te maak jy wens daar was 'n beter manier. 946 00:59:09,810 --> 00:59:13,610 En gelukkig, daar is as gevolg van skikkings. So laat ons dit doen. 947 00:59:13,610 --> 00:59:16,700 Eerste, laat my stel 'n baie eenvoudige ding wat ons nie gebruik het tot dusver, 948 00:59:16,700 --> 00:59:18,820 maar jy sien dit soms in die kode. 949 00:59:18,820 --> 00:59:21,270 >> Dit is wat algemeen bekend as 'n konstante. 950 00:59:21,270 --> 00:59:24,410 So dit is 'n konstante in die sin dat hierdie waarde verander nooit. 951 00:59:24,410 --> 00:59:26,450 Die menslike konvensie wanneer die skep van 'n konstante 952 00:59:26,450 --> 00:59:30,420 is alle hoofletters net so dat dit regtig staan ​​uit in jou kode te gebruik, 953 00:59:30,420 --> 00:59:34,270 en die spesiale sleutelwoord wat jy gebruik in C # define. 954 00:59:34,270 --> 00:59:39,970 So sê ons # definieer, dan 'n spasie, dan die woord wat jy wil gebruik vir die konstante se naam 955 00:59:39,970 --> 00:59:41,730 en dan die waarde van die konstante. 956 00:59:41,730 --> 00:59:44,710 Let op dit is verskillend van die toeken van iets aan 'n veranderlike. 957 00:59:44,710 --> 00:59:46,430 Daar is geen gelykaan - teken, daar is geen kommapunt. 958 00:59:46,430 --> 00:59:49,140 Dit is wat algemeen bekend is as 'n preprocessor richtlijn, 959 00:59:49,140 --> 00:59:50,840 maar meer op dat 'n ander tyd. 960 00:59:50,840 --> 00:59:56,350 Vir nou, dit skep 'n onveranderlike waarde genoem vasvrae 961 00:59:56,350 --> 00:59:58,290 wie se werklike numeriese waarde is 2. 962 00:59:58,290 --> 01:00:02,180 So waar jy sien vasvrae, vasvrae, vasvrae regdeur hierdie lêer, 963 01:00:02,180 --> 01:00:04,230 dit is net die nommer 2. 964 01:00:04,230 --> 01:00:06,550 As ek kyk na die belangrikste nou, laat ons sien hoe dit werk. 965 01:00:06,550 --> 01:00:09,770 Die eerste dit lyk 'n bietjie kripties, maar dit is al die dinge van week 1. 966 01:00:09,770 --> 01:00:12,210 Vra die gebruiker vir grade. Hoe doen ons dit? 967 01:00:12,210 --> 01:00:17,350 In lyn 22 - dit is werklik die sappige deel - Ek verklaar 'n float 968 01:00:17,350 --> 01:00:23,240 maar nie net 'n enkele float. Ek verklaar nie, maar eerder 'n skikking van die swaai-punt waardes. 969 01:00:23,240 --> 01:00:27,700 Daardie veranderlike genoem gaan word grade, soos hier geïmpliseer, 970 01:00:27,700 --> 01:00:31,420 maar die enigste stuk van nuwe sintaks dan is hierdie vierkantige hakies. 971 01:00:31,420 --> 01:00:37,280 Die feit dat ek float grade en dan oop bracket en dan 'n nommer het gesê - 972 01:00:37,280 --> 01:00:40,980 agterkom as dit is 'n konstante, dit is net soos ons dit gedoen het - 973 01:00:40,980 --> 01:00:46,840 dit beteken, "Hey rekenaar, gee my 2 dryf en laat gesamentlik hulle noem grade." 974 01:00:46,840 --> 01:00:51,780 >> Dit is in teenstelling met 'n veel meer moeisame proses soos hierdie: float voorraad1; 975 01:00:51,780 --> 01:00:54,580 dryf grade2; en so meer. 976 01:00:54,580 --> 01:00:58,310 So 'n skikking stel ons in staat om hierdie idee te implementeer nie, maar veel minder morsig, 977 01:00:58,310 --> 01:01:04,560 in so 'n manier dat ons kan 1 reël van die kode in plaas van skryf, sê, 16 vir 'n 16-week semester. 978 01:01:04,560 --> 01:01:09,060 Ek wou nie om hard-kode 2, want as jy dink oor dit nou logies, 979 01:01:09,060 --> 01:01:12,560 veronderstel volgende jaar CS50 veranderinge aan 3 plaas vasvrae 980 01:01:12,560 --> 01:01:15,010 en ek het die getal 2 hier, ek het die nommer 2, 981 01:01:15,010 --> 01:01:17,210 Ek het die nommer 2, die getal 2. 982 01:01:17,210 --> 01:01:19,890 Dit baie geduld en baie maklik om te skroef 983 01:01:19,890 --> 01:01:26,550 en per ongeluk verander 1 waarde tot 3 en mis 'n ander waarde van 2. 984 01:01:26,550 --> 01:01:30,660 So ek gaan hierdie weg te plaas abstrakte en gebruik hierdie konstante dat, 985 01:01:30,660 --> 01:01:32,520 soos sy naam suggereer, verander nooit nie. 986 01:01:32,520 --> 01:01:35,870 En nou maak nie saak of ons het verskillende vasvrae hierdie jaar of volgende, 987 01:01:35,870 --> 01:01:39,380 Ek het net om dit te verander in 'n plek hier by die top. 988 01:01:39,380 --> 01:01:41,230 So dit is al 'n konstante is. 989 01:01:41,230 --> 01:01:47,100 Intussen het die nuwe konseptuele kenmerk is dié van 'n skikking. 990 01:01:47,100 --> 01:01:55,030 So die vierkantige hakies gee my hierdie baie vlotte en laat my noem hulle gesamentlik grade hier. 991 01:01:55,030 --> 01:01:56,720 So nou, laat ons sien wat ek gaan om dit te doen. 992 01:01:56,720 --> 01:01:59,220 Hier in lyn 24 is die begin van 'n lus. 993 01:01:59,220 --> 01:02:03,380 >> Dit is regtig niks fancy. Dit is net die gebruik van vasvrae in plaas van 'n harde-gekodeerde nommer. 994 01:02:03,380 --> 01:02:06,740 Maar daar is niks intellektueel verskillende daar van verlede week. 995 01:02:06,740 --> 01:02:11,650 Dit is net printf, so printf ("Quiz #% d van% d:") 996 01:02:11,650 --> 01:02:16,670 want ek wil net uit te druk gee my quiz nommer 1 van 2 en dan 2 van 2. 997 01:02:16,670 --> 01:02:18,480 So, dit is 'n suiwer estetiese ding. 998 01:02:18,480 --> 01:02:21,000 Maar die interessante deel is nou in lyn 27. 999 01:02:21,000 --> 01:02:27,840 Ten einde te vul in een van die twee plekhouers met 'n swaai-punt waarde, 1000 01:02:27,840 --> 01:02:29,640 gebruik jy weer tussen vierkantige hakies. 1001 01:02:29,640 --> 01:02:35,170 In hierdie geval, ek gebruik i omdat dit vir lus het begin met i gelykstaande aan watter waarde, glo? 1002 01:02:35,170 --> 01:02:36,670 [Student] 0. >> [Malan] 0. 1003 01:02:36,670 --> 01:02:40,990 So op die eerste iterasie van hierdie lus, is dit asof ek dit in die kode, 1004 01:02:40,990 --> 01:02:46,310 maar op die tweede iterasie van hierdie lus, is dit asof ek dit in my kode. 1005 01:02:46,310 --> 01:02:49,970 Maar die feit dat ek 'n veranderlike is die gebruik is volmaak, want soos die naam aandui, 1006 01:02:49,970 --> 01:02:52,600 dit wissel sy waarde op elke iterasie, 1007 01:02:52,600 --> 01:02:55,900 so ek vul hierdie skikking een plek op 'n slag. 1008 01:02:55,900 --> 01:02:57,380 Wat beteken hierdie skikking lyk? 1009 01:02:57,380 --> 01:03:01,570 Die rede waarom ek die super eenvoudige reghoek op die skerm getrek hier voor was vir hierdie rede. 1010 01:03:01,570 --> 01:03:05,590 'N skikking is net 'n stuk van die geheue, gevolg deur nog 'n stuk van die geheue 1011 01:03:05,590 --> 01:03:08,570 gevolg deur nog 'n stuk van die geheue en so meer. 1012 01:03:08,570 --> 01:03:13,120 So as my skikking van grootte 2 in hierdie geval hier, al wat ek sou doen 1013 01:03:13,120 --> 01:03:20,200 deur te tik in my quiz tellings soos hier - ek het 100 op hierdie een en dan het ek 'n 99 op hierdie een - 1014 01:03:20,200 --> 01:03:24,970 dan is die geheue kan selfs nie gebruik word nie, want ek het net die rekenaar gevra 1015 01:03:24,970 --> 01:03:26,840 vir 'n verskeidenheid van grootte 2. 1016 01:03:26,840 --> 01:03:28,600 Hierdie vierkante is steeds daar, reg? 1017 01:03:28,600 --> 01:03:32,670 Jy het nog steeds 2 GB RAM, selfs as jy net vra vir 2 dryf. 1018 01:03:32,670 --> 01:03:36,840 Dus is die idee agter skikkings is dat die rekenaar net neem 'n stuk van die geheue 1019 01:03:36,840 --> 01:03:41,340 en verdeeld dan kleiner stukke rug aan rug Terug na. 1020 01:03:41,340 --> 01:03:43,310 En so het dit is al 'n skikking is. 1021 01:03:43,310 --> 01:03:47,350 >> Dit is 'n aangrensende stuk van die geheue binnekant van wat jy kan dinge. 1022 01:03:47,350 --> 01:03:50,700 Dit gebeur dan doen net 'n paar vervelige rekenkunde. 1023 01:03:50,700 --> 01:03:54,640 As ek scroll down hier, dit is waar ek dan itereer oor die skikking. 1024 01:03:54,640 --> 01:03:58,020 Ek kom met die opsomming van al die waardes in die skikking, 1025 01:03:58,020 --> 01:04:02,470 en dan gebruik ek die ronde funksie hier om werklik te doen die som gedeel deur vasvrae. 1026 01:04:02,470 --> 01:04:06,320 Maar laat my beweeg my hand wat as 'n soort van genoeg rekenkundige vir nou. 1027 01:04:06,320 --> 01:04:08,370 Maar al wat vir my doen uiteindelik die berekening van 'n gemiddelde. 1028 01:04:08,370 --> 01:04:13,580 So eerste quiz plus tweede quiz gedeel deur 2 en dan druk dit uit as 'n int. 1029 01:04:13,580 --> 01:04:17,280 Maar laat ons nou die oorgang na 'n ander voorbeeld genoem string1, 1030 01:04:17,280 --> 01:04:20,700 wat verf 'n soortgelyke prentjie, maar met behulp van toue. 1031 01:04:20,700 --> 01:04:23,940 Laat my gaan voort en vereenvoudig hierdie vir net 'n oomblik. 1032 01:04:23,940 --> 01:04:27,090 Die inkeping vir nou vergewe. 1033 01:04:27,090 --> 01:04:30,870 Kennisgewing in lyn 19 van hierdie voorbeeld, ek kry 'n string van die gebruiker. 1034 01:04:30,870 --> 01:04:34,640 Maar let op wat ek volgende gaan doen in reëls 22 en verder. 1035 01:04:34,640 --> 01:04:41,250 Ek eintlik iterating van i tot - en dit is 'n nuwe truuk - strlen, string lengte. 1036 01:04:41,250 --> 01:04:44,880 Dit is 'n funksie wat kom met C dat as jy verby dit 'n string, 1037 01:04:44,880 --> 01:04:47,730 dit vir jou vertel hoeveel karakters in daardie string is. Dis al. 1038 01:04:47,730 --> 01:04:51,550 En die feit dat dit is strlen in plaas van string lengte is net omdat dit is meer bondig. 1039 01:04:51,550 --> 01:04:55,100 Dertig jaar gelede het mense graag dinge so bondig as moontlik te skryf, 1040 01:04:55,100 --> 01:04:57,630 so ons het aangehou dat die konvensie hier. 1041 01:04:57,630 --> 01:05:00,660 i + + net beteken dat ek in elke iterasie inkrementeer. 1042 01:05:00,660 --> 01:05:02,990 En nou is dit agterkom, wat is baie interessant. 1043 01:05:02,990 --> 01:05:09,180 In lyn 24, sê ek, "Computer, gee my 'n karakter, 8 bisse, en noem dit c." 1044 01:05:09,180 --> 01:05:12,630 Maar wat is dit op die regterkant sê? 1045 01:05:13,490 --> 01:05:16,530 In Engels, wat beteken dat verteenwoordig? 1046 01:05:16,530 --> 01:05:18,730 [Student] Die eerste karakter in die skikking. 1047 01:05:18,730 --> 01:05:20,790 Presies. Gee my die eerste karakter in die skikking. 1048 01:05:20,790 --> 01:05:24,090 Of, meer algemeen, gee my die met karakter in die skikking. 1049 01:05:24,090 --> 01:05:26,100 En besef dit is belangrik om nou dat as die rekenaar wetenskaplikes, 1050 01:05:26,100 --> 01:05:27,890 ons eintlik tel van 0. 1051 01:05:27,890 --> 01:05:29,720 >> Jy hoef nie die diskresie nou te begin om dit te doen. 1052 01:05:29,720 --> 01:05:34,160 Nou het jy om op te tree in ooreenstemming met die rekenaar se verwagtinge en tel van 0 1053 01:05:34,160 --> 01:05:38,180 want [0] gaan na die eerste karakter in 'n string, 1054 01:05:38,180 --> 01:05:42,150 [1] gaan om die tweede te wees, [2] gaan die derde wees, en so meer. 1055 01:05:42,150 --> 01:05:49,720 So hierdie program, as ek dit stel, is dit weer string1, so maak string1, 1056 01:05:49,720 --> 01:05:54,670 en nou is ek loop string1 in my terminale venster. 1057 01:05:54,670 --> 01:05:58,330 Dit is wag vir insette, so ek gaan in te tik Dawid: Kom, 1058 01:05:58,330 --> 01:06:02,540 en nou is dit druk David almal op verskillende lyne, want kennis wat ek doen. 1059 01:06:02,540 --> 01:06:05,820 Ek druk 'n karakter op 'n tyd. 1060 01:06:05,820 --> 01:06:10,100 Ons sal nie vandag in detail gaan op hierdie, maar ek verwyder 'n oomblik gelede hierdie tjek hier. 1061 01:06:10,100 --> 01:06:15,480 Dit blyk dat indien die gebruiker hang, opponerende, of net verward, 1062 01:06:15,480 --> 01:06:20,210 jy kan eintlik nie 'n string van sommige lengte te gee. 1063 01:06:20,210 --> 01:06:22,860 As jy druk die verkeerde sleutel op die sleutelbord, kan jy nie tou op alle gee, 1064 01:06:22,860 --> 01:06:26,950 of as jy kwaadwillige, kan jy probeer om te plak in 'n GB waarde van 'n opstel 1065 01:06:26,950 --> 01:06:29,290 om die string te vul, en indien die rekenaar loop uit van die geheue, 1066 01:06:29,290 --> 01:06:32,710 dit blyk dat ons gaan om terug te kry hierdie spesiale waarde genoem NULL. 1067 01:06:32,710 --> 01:06:35,580 So vir nou, weet net dat daar is hierdie spesiale waarde genoem NULL 1068 01:06:35,580 --> 01:06:39,580 wat ons sal toelaat om te kyk wanneer ons uit geheue, onder andere. 1069 01:06:39,580 --> 01:06:45,630 Maar as Ek maak nou string2, let op 'n verskil hier. 1070 01:06:45,630 --> 01:06:48,210 Kennisgewing een verskil hier met string2. 1071 01:06:48,210 --> 01:06:51,340 Met string2 vir lus is 'n bietjie anders. 1072 01:06:51,340 --> 01:06:55,010 >> Laat my verwyder die NULLs sodat ons kan praat oor die ander tyd. 1073 01:06:55,010 --> 01:06:57,800 Wat is daar anders oor die loop hierdie tyd? 1074 01:06:59,620 --> 01:07:01,670 Ek kan gaan terug na die vorige voorbeeld. 1075 01:07:01,670 --> 01:07:08,580 So dit is weergawe 2, hierdie is 'n weergawe 1. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 Die strlen oproep is waar? 1078 01:07:16,660 --> 01:07:18,860 Dit is in die eerste deel van die for-lus. 1079 01:07:18,860 --> 01:07:21,830 Enige gedagtes waarom ek om dit te doen? Ja. 1080 01:07:21,830 --> 01:07:24,560 [Student] So jy noem dit nie die funksie om elke keer. 1081 01:07:24,560 --> 01:07:26,440 [Malan] So ons noem dit nie die funksie om elke keer. Presies. 1082 01:07:26,440 --> 01:07:28,300 Onthou vir loops dat hulle is super eenvoudige 1083 01:07:28,300 --> 01:07:31,770 sodra jy soort van verstaan ​​dat dit die inisialisering, die toestand en die update. 1084 01:07:31,770 --> 01:07:34,750 Die probleem is dat die toestand op elke iterasie van die lus gebeur. 1085 01:07:34,750 --> 01:07:40,010 En so in hierdie voorbeeld hier, wat is sleg oor die feit dat hierdie is my toestand? 1086 01:07:40,010 --> 01:07:41,830 [Student] Jy vra strlen. 1087 01:07:41,830 --> 01:07:44,340 [Malan] Jy vra strlen weer en weer en weer. 1088 01:07:44,340 --> 01:07:47,410 Maar sodra ek het getik in Dawid, die lengte van die string is 5, 1089 01:07:47,410 --> 01:07:49,650 en dit is nie van plan te verander op elke iterasie van die lus 1090 01:07:49,650 --> 01:07:51,670 want die tou is nog steeds D-'n-v-i-d. 1091 01:07:51,670 --> 01:07:55,320 So, dit is 'n wenk wat gaan 'n toenemend belangrike idee 1092 01:07:55,320 --> 01:08:00,410 bekend as 'n ontwerp besluit waar maak net nie die rekenaar onnodige werk doen. 1093 01:08:00,410 --> 01:08:03,920 >> Net soos 'n sneak preview van pset2, pset2 in die standaard uitgawe 1094 01:08:03,920 --> 01:08:07,030 gaan jou uit te daag om eintlik 'n aantal getalle te implementeer, 1095 01:08:07,030 --> 01:08:10,410 n aantal van enkripsie-algoritmes, sodat jy kan beide enkripteer 1096 01:08:10,410 --> 01:08:13,840 en decrypt geheime boodskappe baie soos die een Ralphie daar gedekodeer. 1097 01:08:13,840 --> 01:08:16,810 In die hacker uitgawe van pset2, gaan ons 'n bietjie verder gaan. 1098 01:08:16,810 --> 01:08:19,649 Ons gaan u 'n lêer aan die hand van 'n werklike rekenaar stelsel 1099 01:08:19,649 --> 01:08:23,479 wat 'n hele klomp van gebruikersnaam en werklike geïnkripteer wagwoorde, 1100 01:08:23,479 --> 01:08:26,939 en die uitdaging vir die hacker uitgawe gaan wees om die wagwoorde te kraak 1101 01:08:26,939 --> 01:08:33,200 en uit te vind wat kriptografie of wat geheim is gebruik om werklik daardie wagwoorde te genereer. 1102 01:08:33,200 --> 01:08:36,109 En ons gaan om dit te doen deur gebruik te maak van 'n nuwe funksie van C 1103 01:08:36,109 --> 01:08:40,630 dat Ek gee jou net 'n demo van bekend as command-line argumente. 1104 01:08:40,630 --> 01:08:44,229 Dit blyk, soos sommige van julle mag gesien het in die artikel of in handboeke, 1105 01:08:44,229 --> 01:08:48,260 hoof nie altyd leemte in hakies. 1106 01:08:48,260 --> 01:08:52,430 Dit blyk dat die hoof kan ook geskryf word soos hierdie, met twee argumente, 1107 01:08:52,430 --> 01:08:56,870 argc en bevat SPASIES, waar argc is die aantal woorde 1108 01:08:56,870 --> 01:09:00,020 wat jy intik na die program se naam op jou command line 1109 01:09:00,020 --> 01:09:03,420 en bevat SPASIES is die werklike woorde. 1110 01:09:03,420 --> 01:09:07,540 En as die vierkantige hakies dui, bevat SPASIES is blykbaar 'n skikking. 1111 01:09:07,540 --> 01:09:12,210 Dit gaan om 'n string na 'n string na 'n string in die geheue. 1112 01:09:12,210 --> 01:09:16,010 >> So, wat gaan ons in staat wees om te doen nie begin met pset 2 is iets soos hierdie. 1113 01:09:16,010 --> 01:09:21,350 As Ek maak argv1, wat is 'n voorbeeld sal ons kom terug na op Maandag, en voer dit uit, 1114 01:09:21,350 --> 01:09:23,370 agterkom dat dit lyk nie iets om nog te doen. 1115 01:09:23,370 --> 01:09:25,490 Hy druk net sy eie naam. 1116 01:09:25,490 --> 01:09:31,479 Maar as ek sê totsiens klas, kennis dat hierdie program glo iterate 1117 01:09:31,479 --> 01:09:35,479 oor elk van die woorde wat op die instruksielyn getik is. 1118 01:09:35,479 --> 01:09:41,630 En die wyse waarop ons sal toegang verkry na die woorde wat deur die gebruiker ingetik op die instruksielyn 1119 01:09:41,630 --> 01:09:49,160 is deur die verandering van hoof begin hierdie naweek van int main (void) hoof (argc, bevat SPASIES) om na int 1120 01:09:49,160 --> 01:09:52,050 en sal dus gebore word command-line argumente. 1121 01:09:52,050 --> 01:09:57,100 En as jy regtig gesofistikeerde op hierdie, sal jy in staat wees om werklik trippy programme te kan skryf 1122 01:09:57,100 --> 01:09:59,610 soos hierdie een hier, wat gaan bo en buite 1123 01:09:59,610 --> 01:10:03,940 sommige van die funksie het ons tot dusver gedoen het, maar almal baie kragtige. 1124 01:10:03,940 --> 01:10:08,950 >> So ons sal verlaat met hierdie op die skerm, en ons sal sien dat jy op Maandag. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]