1 00:00:00,000 --> 00:00:02,200 [Powered by Google Translate] [Week 3] 2 00:00:02,200 --> 00:00:03,950 [David J. Malan - Harvard University] 3 00:00:03,950 --> 00:00:07,140 [Dit is CS50. - CS50.TV] 4 00:00:07,140 --> 00:00:10,720 Laat me ons te sturen in de richting van waar we gebleven waren vorige keer, 5 00:00:10,720 --> 00:00:13,890 die begon te denken dat een beetje meer dan ongeveer syntaxis 6 00:00:13,890 --> 00:00:17,150 en proberen om een ​​beetje minder na te denken over de minutiae 7 00:00:17,150 --> 00:00:20,630 dat duurt een beetje tijd om te acclimatiseren tot nu toe op het gebied van puntkomma's 8 00:00:20,630 --> 00:00:22,360 en haakjes en accolades, 9 00:00:22,360 --> 00:00:25,630 om te beginnen met het nemen van dingen een beetje op een hoger conceptueel niveau 10 00:00:25,630 --> 00:00:28,800 zodat de problemen die we nu beginnen met het oplossen in de komende paar weken 11 00:00:28,800 --> 00:00:32,340 gaan veel meer te betrekken in het hoger niveau conceptuele problemen 12 00:00:32,340 --> 00:00:36,310 en een beetje minder in de syntactische als je je voeten nat 13 00:00:36,310 --> 00:00:40,090 en uw handen vuil met een aantal van de syntaxis van de afgelopen weken. 14 00:00:40,090 --> 00:00:43,690 >> Dus herinneren dat vorige week hebben we dit idee van een array geïntroduceerd. 15 00:00:43,690 --> 00:00:49,320 En een matrix in het Engels kan worden beschreven als wat? >> [Onverstaanbaar student reactie] 16 00:00:49,320 --> 00:00:51,710 Sorry? 17 00:00:51,710 --> 00:00:54,810 Een verzameling van? >> [Onverstaanbaar student reactie] >> Oke, goed. 18 00:00:54,810 --> 00:00:57,820 Een verzameling van items. Zo zagen we arrays in Scratch. 19 00:00:57,820 --> 00:01:01,880 Als je toevallig om te gebruiken voor PSET 0 een van Scratch zijn lijsten die je dingen kunt slepen 20 00:01:01,880 --> 00:01:05,410 zoals sinaasappels en bananen in een inventaris van soorten, 21 00:01:05,410 --> 00:01:07,100 dat is net zoiets als wat een array is. 22 00:01:07,100 --> 00:01:10,980 En meer technisch, in het kader van een werkelijke computer, 23 00:01:10,980 --> 00:01:14,730 een array is gewoon een aaneengesloten stuk geheugen. 24 00:01:14,730 --> 00:01:18,590 Met andere woorden, je hebt een byte, dan een ander byte, toen nog een byte, toen nog een byte, 25 00:01:18,590 --> 00:01:21,330 en als je naar die bytes te trekken in een foto, 26 00:01:21,330 --> 00:01:24,510 ze zouden terugkomen om rug aan rug aan rug. Dat is wat we bedoelen met aaneengesloten. 27 00:01:24,510 --> 00:01:26,690 >> Dus het is byte nummer 1, dan 2, dan 3. 28 00:01:26,690 --> 00:01:29,680 Het is hier niet zeggen op, hier, hier, hier. 29 00:01:29,680 --> 00:01:33,800 Een array is een aaneengesloten stuk van 0 of meer bytes. 30 00:01:33,800 --> 00:01:36,160 Dus wat zijn ze nuttig voor? 31 00:01:36,160 --> 00:01:40,090 Recall hadden we dit soort gekunstelde voorbeeld van het opslaan van mensen quiz cijfers in een programma 32 00:01:40,090 --> 00:01:42,580 om uw quiz gemiddelde te berekenen voor een aantal cursus, 33 00:01:42,580 --> 00:01:46,780 en herinneren dat we konden schrijven dat programma te starten door te verklaren een variabele quiz1. 34 00:01:46,780 --> 00:01:49,550 Dan kunnen we nog een variabele genaamd quiz2. 35 00:01:49,550 --> 00:01:52,030 Maar dan als er 3 quizzen in deze klasse, quiz4. 36 00:01:52,030 --> 00:01:55,710 Of als er een wekelijkse quiz, zou het quiz5, quiz6, quiz7. 37 00:01:55,710 --> 00:01:58,520 Dus zou je al deze variabelen gedeclareerd binnen van de belangrijkste 38 00:01:58,520 --> 00:02:00,470 of ergens anders in uw programma, 39 00:02:00,470 --> 00:02:03,870 en het probleem met die benadering, eenvoudige maar het is om gewoon kopiëren en plakken en, 40 00:02:03,870 --> 00:02:06,120 is het gewoon heel snel onoverzichtelijk is. 41 00:02:06,120 --> 00:02:09,360 God verhoede je eigenlijk hebt 30 quizzen of 50 quizzen. 42 00:02:09,360 --> 00:02:12,080 Als het als een middelbare school stijl dagelijkse pop quiz, 43 00:02:12,080 --> 00:02:15,910 dan hoef je alleen een belachelijk lange lijst van variabelen wordt verklaard, 44 00:02:15,910 --> 00:02:17,780 en dit gewoon heel snel uit de hand. 45 00:02:17,780 --> 00:02:20,820 Het lelijke is, is het moeilijk te onderhouden, het is zo veel makkelijker om een ​​typfout 46 00:02:20,820 --> 00:02:23,910 als je 1 nummer een typefout gemaakt ergens in uw programma. 47 00:02:23,910 --> 00:02:26,800 >> Dus introduceerden we de notie van een array in plaats daarvan. 48 00:02:26,800 --> 00:02:30,760 En herinneren dat we dit programma uitgevoerd door het doen van een beetje iets als dit. 49 00:02:30,760 --> 00:02:33,950 Laat me gaan naar de Bron van vandaag 3 maandag directory 50 00:02:33,950 --> 00:02:37,160 en open array, die we zagen vorige keer. 51 00:02:37,160 --> 00:02:39,940 En ook al waren er een paar nieuwe C trucs hier, 52 00:02:39,940 --> 00:02:41,920 waaronder het begrip constant, 53 00:02:41,920 --> 00:02:47,140 herinneren dat we meerdere praalwagens in wezen verklaard door het gebruik van de volgende syntaxis: 54 00:02:47,140 --> 00:02:51,750 float, wordt de naam van de variabele, dan gebruikt vierkante haakjes echt voor het eerst 55 00:02:51,750 --> 00:02:55,450 en wat we deden binnenkant van de rechte haken is effectief besteed en een aantal. 56 00:02:55,450 --> 00:02:59,780 Maar in plaats van dat een nummer, zet ik deze geactiveerde woord, quizzen. 57 00:02:59,780 --> 00:03:03,220 En wat was de motivatie voor het aanbrengen van een geactiveerde woord als Quizzen 58 00:03:03,220 --> 00:03:08,170 en vervolgens met behulp van lijn 17 van de truc hier om daadwerkelijk te geven dat een aantal? 59 00:03:08,170 --> 00:03:11,240 Wat was de motivatie er? Ja. 60 00:03:11,240 --> 00:03:13,360 >> [Onverstaanbaar student reactie] >> Precies. 61 00:03:13,360 --> 00:03:16,630 Als we willen dat de waarde 2 te veranderen, we hebben maar om het te veranderen in 1 plaats 62 00:03:16,630 --> 00:03:19,680 want overwegen - Ik weet niet eens meer wat dit programma precies deed, 63 00:03:19,680 --> 00:03:22,040 maar als je gewoon vluchtig door te nemen zie je Quizzes, quizzes. 64 00:03:22,040 --> 00:03:24,720 Je ziet quizzen, hier beneden meer quizzen. 65 00:03:24,720 --> 00:03:28,180 Dus als we niet hadden deze constante, dit gebruik van scherpe definiëren, 66 00:03:28,180 --> 00:03:33,320 wij zouden hebben getypt 2, vervolgens 2, dan 2, dan 2, wat fijn is. Het zou net zo goed. 67 00:03:33,320 --> 00:03:36,220 Maar stel dat volgend jaar hebben we 3 quizzen in CS50. 68 00:03:36,220 --> 00:03:39,190 Dus ik moet gaan en het actualiseren van de code, moet ik het opnieuw compileren, 69 00:03:39,190 --> 00:03:43,820 maar het probleem is als ik iets stoms, zoals ik over het hoofd een vermelding van 2 70 00:03:43,820 --> 00:03:46,750 en vergeet aan te sluiten in 3, kon het hele programma heel goed breken. 71 00:03:46,750 --> 00:03:48,720 Dus we gewoon vragen om problemen. 72 00:03:48,720 --> 00:03:53,170 >> Dus het idee van een constante is alles over factoring enkele stuk van de gegevens, 73 00:03:53,170 --> 00:03:56,070 of het nu een string of een char of een float of wat dan ook, 74 00:03:56,070 --> 00:04:00,070 en verklaren dat een plaats, zodat u makkelijker kan veranderen in de toekomst. 75 00:04:00,070 --> 00:04:03,660 En het is ook, eerlijk gezegd, een beetje makkelijker te lezen, want als je denk maar aan dit nu, 76 00:04:03,660 --> 00:04:07,840 het is quizzen, of we kunnen zelfs een andere naam geven iets als NUMBER_OF_QUIZZES 77 00:04:07,840 --> 00:04:09,430 of iets explicieter. 78 00:04:09,430 --> 00:04:11,830 De code wordt alleen een beetje meer voor de hand in verband met wat hij aan het doen is, 79 00:04:11,830 --> 00:04:15,780 en je vraagt ​​je af wat minder wat nummer 2 zou kunnen overkomen betekenen. 80 00:04:15,780 --> 00:04:18,920 Dus de constante had niets te maken met fundamenteel arrays. 81 00:04:18,920 --> 00:04:22,990 De array werd geïntroduceerd door middel van deze rechte haken. 82 00:04:22,990 --> 00:04:26,610 >> Dus merken dat in lijn 23 hebben we de gebruiker vragen, "Wat waren uw quiz scores?" 83 00:04:26,610 --> 00:04:31,120 Dan hoeven we alleen maar deze lus die blijkbaar vraagt ​​de gebruiker om hun cijfers. Hoe? 84 00:04:31,120 --> 00:04:37,460 Het herhaalt 0-2. En ik zeg 2 omdat quizzen in hoofdletters is momenteel 2. 85 00:04:37,460 --> 00:04:42,310 Dus het itereert van 0 tot 2 en dan drukt # Quiz iets van iets, 86 00:04:42,310 --> 00:04:45,830 en dan gebruikt GetFloat om een ​​waarde van de gebruiker. 87 00:04:45,830 --> 00:04:49,050 Dus merk dit is de enige andere nieuwe stuk van syntax van afgelopen woensdag. 88 00:04:49,050 --> 00:04:53,120 Als je iets wilt opslaan in een bepaalde plaats in die array, 89 00:04:53,120 --> 00:04:55,460 je weer gebruik maken van de vierkante haken. 90 00:04:55,460 --> 00:04:57,030 >> Dus er is een beetje tweedeling hier. 91 00:04:57,030 --> 00:04:59,040 De eerste keer dat u gebruik maken van de vierkante haakjes 92 00:04:59,040 --> 00:05:02,250 je het gebruikt om aan te geven hoe groot je wilt dat de array zijn. 93 00:05:02,250 --> 00:05:06,580 Maar deze volgende context hier, waar we weer in dienst van deze vierkante haakjes 94 00:05:06,580 --> 00:05:10,540 betekent waar in die array wilt u een waarde zetten? 95 00:05:10,540 --> 00:05:13,650 En het onderscheid hier kan worden afgeleid uit de context. 96 00:05:13,650 --> 00:05:17,130 Let hier hebben we een data type, dan hebben we de naam van een variabele, 97 00:05:17,130 --> 00:05:20,770 dan hebben we onze rechte haken met een aantal binnen, puntkomma. Dat is het. 98 00:05:20,770 --> 00:05:22,290 Dus dat is een verklaring. 99 00:05:22,290 --> 00:05:28,390 Het is net alsof we iets als float Voorraad1 gedaan; float Grade2; 100 00:05:28,390 --> 00:05:31,730 maar nogmaals, dit zeer snel vervult, in veel te veel kopiëren, plakken, 101 00:05:31,730 --> 00:05:34,260 dus in plaats daarvan hebben we net vereenvoudigd het als zodanig, 102 00:05:34,260 --> 00:05:38,800 waardoor we voortaan een cijfer dat kan worden opgeslagen op schijf 0 hebben, 103 00:05:38,800 --> 00:05:41,760 we hebben een gehalte dat kan worden opgeslagen op beugel 1 104 00:05:41,760 --> 00:05:46,890 maar wat als ik Goof en, bijvoorbeeld, mijn lus gaat zo ver - 105 00:05:46,890 --> 00:05:48,740 bijvoorbeeld ik deze minder dan of gelijk aan, 106 00:05:48,740 --> 00:05:50,620 die herinneren was de bron van een eerdere bug - 107 00:05:50,620 --> 00:05:55,590 Dit betekent effectief dat er op sommige derde toevallige iteratie van deze lus 108 00:05:55,590 --> 00:06:00,380 Ik gebruik beugel 2. Effectief, kan wat hier gebeurt? Sorry? 109 00:06:00,380 --> 00:06:02,860 [Student] Het zal worden vervangen. >> Gaat het te vervangen? 110 00:06:02,860 --> 00:06:04,520 Wat zou vervangen worden? 111 00:06:04,520 --> 00:06:10,890 Dit is letterlijk zegt te vervangen wat er op locatie 2 met de return waarde van GetFloat. 112 00:06:10,890 --> 00:06:13,690 Maar het probleem is hoe groot is de array op dit punt in het verhaal? 113 00:06:13,690 --> 00:06:17,730 [Onverstaanbaar student response] >> De array is nog steeds slechts van grootte 2 114 00:06:17,730 --> 00:06:22,730 omdat de array, net als elke variabele, werd voor het eerst verklaard, voordat we gebruikten, 115 00:06:22,730 --> 00:06:27,220 en we hier zijn opgegeven als gevolg van deze constante dat ik 2 cijfers die ik ga zetten hebben. 116 00:06:27,220 --> 00:06:29,930 >> Maar vergeet niet, de computer wetenschappers beginnen te tellen vanaf 0. 117 00:06:29,930 --> 00:06:33,620 Dus de eerste locatie in die array een beugel is 0. 118 00:06:33,620 --> 00:06:40,210 De volgende locatie is 1. Dit ding is ooit zo iets te ver naar de zijkant. 119 00:06:40,210 --> 00:06:42,870 Dus met andere woorden, als ik eigenlijk deze array had - 120 00:06:42,870 --> 00:06:46,790 en laat me zien hoe goed dit werkt hier voor ons - 121 00:06:46,790 --> 00:06:52,360 als ik een array die ik heb gewoon getekend als volgt 122 00:06:52,360 --> 00:06:56,750 en ik heb toegewezen ruimte voor 2 elementen, zou ik dit getekend als dit in het geheugen 123 00:06:56,750 --> 00:06:58,020 waar dit grote witte doek is. 124 00:06:58,020 --> 00:07:00,920 Het is gewoon het RAM-geheugen heb ik in mijn computer, een optreden van RAM, 2 optredens van RAM-geheugen, wat dan ook, 125 00:07:00,920 --> 00:07:05,400 maar deze 2 dozen nu individueel vertegenwoordigen een vlotter, 32 bits. 126 00:07:05,400 --> 00:07:10,860 Dus als ik een nummer hier zo zeggen 1,0, dan heb ik hier zet een ander nummer als 3,2 127 00:07:10,860 --> 00:07:15,280 maar dan doe ik beugel 2, dat is net alsof je hier iets. 128 00:07:15,280 --> 00:07:17,820 En als de foto doet vermoeden, is er niets. 129 00:07:17,820 --> 00:07:20,450 Het is een beetje als niemandsland, want ik heb niet gevraagd het besturingssysteem 130 00:07:20,450 --> 00:07:23,550 om me deze derde quiz. 131 00:07:23,550 --> 00:07:26,940 Als ik wilde die derde quiz, ik had had de voorbedachtheid 132 00:07:26,940 --> 00:07:31,700 om het besturingssysteem voor het vragen door te verklaren QUIZZEN te zijn niet 2 133 00:07:31,700 --> 00:07:34,210 maar in plaats daarvan gelijk 3. 134 00:07:34,210 --> 00:07:39,000 >> Dus met andere woorden, het beeld dat we effectief bij de hand ziet er zo uit hier. 135 00:07:39,000 --> 00:07:42,260 Dit is weer niemandsland. We kunnen beter niet proberen te schrijven waarden hier. 136 00:07:42,260 --> 00:07:45,300 Maar nogmaals, omdat de computer wetenschappers tellen vanaf 0, 137 00:07:45,300 --> 00:07:49,520 als we praten over deze locatie in de array, moet dat adres 0 te zijn, 138 00:07:49,520 --> 00:07:53,890 dit wordt verondersteld om je locatiespelden 1 zijn, en dit bestaat niet eens 139 00:07:53,890 --> 00:07:57,380 omdat we alleen gevraagd het besturingssysteem voor 2 dergelijke plaatsen. 140 00:07:57,380 --> 00:08:00,130 Dus degenen onder u met voorafgaande programmeerervaring uit andere talen 141 00:08:00,130 --> 00:08:04,150 zouden weten, dat dit niet altijd het geval is met arrays of dingen genoemd vectoren. 142 00:08:04,150 --> 00:08:06,930 In plaats daarvan kunt u gewoon blijven toevoegen en het toevoegen en het toevoegen van dingen te arrays, 143 00:08:06,930 --> 00:08:10,720 die eerlijk gezegd, hadden we dat vermogen in Scratch en toch hebben we lijken te hebben gegeven hier 144 00:08:10,720 --> 00:08:15,160 want met C u veel explicieter programmeren. 145 00:08:15,160 --> 00:08:17,980 Het is alleen jij en de computer op dit moment, en de computer zal alleen maar doen 146 00:08:17,980 --> 00:08:19,530 wat u aangeeft dat te doen. 147 00:08:19,530 --> 00:08:24,270 Dus als je alleen maar vertellen dat het om u 2 praalwagens door middel van lijn 22 hier, 148 00:08:24,270 --> 00:08:27,640 dat is alles wat je gaat om terug te krijgen van het besturingssysteem: ruimte voor 2. 149 00:08:27,640 --> 00:08:34,049 >> Dus in toenemende mate uw programma's zullen af ​​en toe buggy met betrekking tot arrays. 150 00:08:34,049 --> 00:08:37,520 Dit is gewoon soort van de aard van het beestje waarbij alle van ons zijn feilbaar, 151 00:08:37,520 --> 00:08:42,490 en op een gegeven moment zul je zeer waarschijnlijk index buiten de grenzen van de array. 152 00:08:42,490 --> 00:08:45,980 En dat is gewoon een mooie manier om te zeggen dat je ging in de houder iets 153 00:08:45,980 --> 00:08:49,970 en iets was gewoon te groot van een getal. Je ging verder dan de grenzen van de array. 154 00:08:49,970 --> 00:08:51,530 Maar de kop is nu dit. 155 00:08:51,530 --> 00:08:54,990 De rest van dit programma heeft echt niets fundamenteel te maken met arrays. 156 00:08:54,990 --> 00:08:58,180 Het is allemaal gewoon over een aantal eenvoudige rekenkunde voor het berekenen van gemiddelden. 157 00:08:58,180 --> 00:09:03,200 Dus we hebben hier in deze for loop hier eerst een variabele genaamd bedrag dat we initialiseren op 0. 158 00:09:03,200 --> 00:09:09,020 Dan gaan we weer herhalen van 0 tot 2 en we voegen aan die sommatie variabele 159 00:09:09,020 --> 00:09:12,620 de i-de klasse, dus beugel 0 dan beugel 1. 160 00:09:12,620 --> 00:09:15,130 En dan als je dat zou doen op de lagere school van het gemiddelde berekenen, 161 00:09:15,130 --> 00:09:19,420 we nemen gewoon dat bedrag, deel dit door het totale aantal quizzen, 162 00:09:19,420 --> 00:09:22,520 en dan voor een goede maatregel noemen we een functie hier genoemd ronde. 163 00:09:22,520 --> 00:09:28,580 >> Nu, als een terzijde, wat is de deal met deze haakjes int op lijn 34? 164 00:09:28,580 --> 00:09:31,730 Het zou kunnen zijn al in paragraaf nog niet echt over gesproken formeel hier, 165 00:09:31,730 --> 00:09:35,210 maar wat is dit int in parens waarschijnlijk aan het doen? >> [Onverstaanbaar student reactie] 166 00:09:35,210 --> 00:09:38,500 Ja, dit verwijst naar gieten of typecasting, 167 00:09:38,500 --> 00:09:41,690 wat betekent dat het nemen van een gegevenstype en om te zetten naar een ander. 168 00:09:41,690 --> 00:09:45,400 Je kunt dit niet doen met alle soorten gegevens, want soms het zou een beetje vreemd. 169 00:09:45,400 --> 00:09:49,640 Maar in dit geval, als de retourwaarde van ronde is een float 170 00:09:49,640 --> 00:09:53,880 want tenslotte, ben ik het nemen van een float te delen door een getal zoals 2, 171 00:09:53,880 --> 00:09:55,840 Ik ga terug te krijgen een vlotter. 172 00:09:55,840 --> 00:10:00,760 Maar de lagere school mensen niet echt leuk om te weten dat hun gemiddelde was 93,4 173 00:10:00,760 --> 00:10:04,420 omdat ze zich realiseren dat ze ooit zo dicht bij dat 95 afronding punt. 174 00:10:04,420 --> 00:10:09,540 >> Dus we willen gebruiken in plaats int om iedereen af ​​te ronden op het dichtstbijzijnde int, 175 00:10:09,540 --> 00:10:12,730 die in dit geval gaat 94 met geen punt na. 176 00:10:12,730 --> 00:10:14,530 Dus dat is gewoon een beetje wiskundige truc. 177 00:10:14,530 --> 00:10:17,570 En we zullen terugkomen op dit begrip van het gieten, omdat het zal gevolgen hebben, 178 00:10:17,570 --> 00:10:21,640 als je nog niet hebt ontdekt, voor probleem set 2. 179 00:10:21,640 --> 00:10:25,210 Dus een array, dan kunt u denken aan - het gaat om make me smile de hele dag. 180 00:10:25,210 --> 00:10:27,830 Het lijkt erop dat dit als je een tekening maken van het, 181 00:10:27,830 --> 00:10:31,460 maar de belangrijkste is dat de grootte ook door u gekozen 182 00:10:31,460 --> 00:10:34,050 wanneer u deze bij het besturingssysteem. 183 00:10:34,050 --> 00:10:39,460 Hebt u vragen dan op arrays? Ja. 184 00:10:39,460 --> 00:10:47,080 [Onverstaanbaar student vraag] 185 00:10:47,080 --> 00:10:49,310 Ah, goede vraag. 186 00:10:49,310 --> 00:10:53,150 De vraag is wat er gebeurt met de null 0 in de array? Het bestaat niet in deze context. 187 00:10:53,150 --> 00:10:57,430 Dat bestaat alleen in het kader van strings, die we op het punt om te komen in slechts een moment. 188 00:10:57,430 --> 00:11:02,300 Maar voor een array, zoals in dit geval, alles wat je krijgt is wat je het besturingssysteem vragen. 189 00:11:02,300 --> 00:11:04,050 >> En nog even terzijde, opdat dit niet duidelijk is, 190 00:11:04,050 --> 00:11:07,030 Ik blijf zeggen dat je vraagt ​​het besturingssysteem, vraag het besturingssysteem. 191 00:11:07,030 --> 00:11:10,090 Een besturingssysteem, zoals u waarschijnlijk weet, is Mac OS, Windows, Linux. 192 00:11:10,090 --> 00:11:13,560 Als u belt functies zoals GetFloat 193 00:11:13,560 --> 00:11:19,280 of je bent te verklaren variabelen zoals rangen, 194 00:11:19,280 --> 00:11:23,200 aan het eind van de dag dat u in wezen te vernemen van iemand anders te geven dat u het geheugen 195 00:11:23,200 --> 00:11:25,940 omdat wij als aspirant programmeurs 196 00:11:25,940 --> 00:11:28,800 heb geen idee hoe je nu eigenlijk fysieke toegang tot het geheugen te krijgen. 197 00:11:28,800 --> 00:11:31,100 Maar iemand doet: het besturingssysteem. 198 00:11:31,100 --> 00:11:36,630 Dus naast de presentatie van ons met mooie iconen en menu's en mappen en dergelijke 199 00:11:36,630 --> 00:11:39,050 dat u op uw bureaublad, of een Mac of pc, 200 00:11:39,050 --> 00:11:42,240 besturingssystemen ook doen het lage niveau alledaagse dingen, 201 00:11:42,240 --> 00:11:44,680 de zeer technische zaken van het beheer van de gigabyte 202 00:11:44,680 --> 00:11:48,780 of 2 gigabyte aan geheugen die je hebt, het beheer van de CPU die je hebt, enzovoort. 203 00:11:48,780 --> 00:11:50,170 Dus als u code schrijft, 204 00:11:50,170 --> 00:11:53,900 je echt aansluiten op uw besturingssysteem in die zin. 205 00:11:53,900 --> 00:11:55,720 Ik ga te hebben om dat te minimaliseren. Oke. 206 00:11:55,720 --> 00:11:59,980 >> Andere vragen over arrays? 207 00:12:00,330 --> 00:12:02,520 Nee? Oke. 208 00:12:02,520 --> 00:12:06,680 Dus de overgang van nature uit arrays is eigenlijk een onderwerp dat is een beetje vertrouwd. 209 00:12:06,680 --> 00:12:09,570 En we keken nog zo kort ingegaan op deze laatste keer ook. 210 00:12:09,570 --> 00:12:12,500 Dit was een string voorbeeld van woensdag. 211 00:12:12,500 --> 00:12:15,060 Deze string voorbeeld was een vrij eenvoudig programma, 212 00:12:15,060 --> 00:12:18,120 en ik heb eigenlijk vereenvoudigd door een paar regels voor de doeleinden van vandaag. 213 00:12:18,120 --> 00:12:22,680 Alles wat het doet in de lijn 19 is een snaar van de gebruiker, slaat deze op in een variabele genaamd s. 214 00:12:22,680 --> 00:12:28,670 Toen in lijn 22 verder het is blijkbaar afdrukken die string 1 karakter per regel. 215 00:12:28,670 --> 00:12:30,730 Maar hoe wordt het dit te doen? 216 00:12:30,730 --> 00:12:33,350 We waarbij een variabele i, waarin het gelijk aan 0, 217 00:12:33,350 --> 00:12:35,770 en dit wordt steeds oude gewoonte nu. 218 00:12:35,770 --> 00:12:39,270 We hadden niet gezien tot woensdag, maar u kunt soort afleiden uit de naam 219 00:12:39,270 --> 00:12:44,610 strlen keert precies wat wanneer het gegeven is? De lengte van de tekenreeks. 220 00:12:44,610 --> 00:12:47,940 Dus als ik het doorgeven van een string, quote-unquote DAVID, 221 00:12:47,940 --> 00:12:51,810 het is hopelijk gaat terug naar mij de nummer 5 als gevolg van DAVID. 222 00:12:51,810 --> 00:12:55,600 Dus dat is zijn doel in het leven is om een ​​string, of hard gecodeerd door u 223 00:12:55,600 --> 00:12:58,840 of in dit geval aangesloten als een variabele, als argument, 224 00:12:58,840 --> 00:13:01,980 en het cijfers te komen wat de lengte van die string is. 225 00:13:01,980 --> 00:13:06,470 >> Dus hier nu zijn we lenen een aantal notatie van de vorige quiz voorbeeld. 226 00:13:06,470 --> 00:13:09,390 Dit heeft niets te maken met praalwagens, heeft niets te maken met quizzen, 227 00:13:09,390 --> 00:13:13,100 maar het blijkt dat de leugentje om bestwil we al vertel je sinds week 1 228 00:13:13,100 --> 00:13:16,330 is dat een reeks niet bestaat in C. 229 00:13:16,330 --> 00:13:20,230 Een tekenreeks aan het eind van de dag is eigenlijk alleen een array. 230 00:13:20,230 --> 00:13:25,140 Het is een array van bytes, dus byte, byte, byte, een byte, die recall is slechts 8 bits, 231 00:13:25,140 --> 00:13:28,130 dus stuk van het geheugen, stuk van het geheugen, stuk van het geheugen, stuk van het geheugen. 232 00:13:28,130 --> 00:13:31,210 En de wijze waarop een koord wordt uitgevoerd 233 00:13:31,210 --> 00:13:33,070 is, terwijl de eerste teken hier 234 00:13:33,070 --> 00:13:37,470 dan hier, dan hier, dan hier, rug aan rug aan rug in het geheugen van de computer. 235 00:13:37,470 --> 00:13:42,160 Dus als je wilde spellen een woord als HELLO, zou je er 1 teken H, 236 00:13:42,160 --> 00:13:48,240 dan E, dan L is dan L, dan is O - 5 karakters in totaal - ergens in uw computer RAM-geheugen. 237 00:13:48,240 --> 00:13:52,080 Maar de sleutel detail hier is dat ze zullen terugkomen om rug aan rug aan rug, 238 00:13:52,080 --> 00:13:54,200 naast elkaar. 239 00:13:54,200 --> 00:13:58,820 Toen als ik zeg s [i], wat in het Engels is dit het geven van me? 240 00:14:01,240 --> 00:14:04,550 Wat doet s [i] te vertegenwoordigen in dit geval? Ja. 241 00:14:04,550 --> 00:14:07,800 >> [Student] de i-karakter in de string. >> Precies. De i teken in de string. 242 00:14:07,800 --> 00:14:12,260 Nu, ik zal bij 0 beginnen als per mijn for-lus hier, 243 00:14:12,260 --> 00:14:14,850 maar dat is goed, want alles begint te tellen vanaf 0. 244 00:14:14,850 --> 00:14:19,160 Dus s [0] gaat naar de letter H te vertegenwoordigen in een woord als HELLO, 245 00:14:19,160 --> 00:14:24,530 s [1] wordt een letter als E in een woord vormen zoals HELLO, enzovoort. 246 00:14:24,530 --> 00:14:27,130 En wat we lijken te moeten doen op elke iteratie van deze lus 247 00:14:27,130 --> 00:14:32,780 is het tijdelijk opslaan van de i-teken in een variabele met de naam c, dat is gewoon een char, 248 00:14:32,780 --> 00:14:35,010 en dan gaan we afdrukken van c 249 00:14:35,010 --> 00:14:37,620 zodat aan het eind van de dag wat dit programma doet is het volgende. 250 00:14:37,620 --> 00:14:42,900 Als ik in de source directory en ik maak tekenreeks1 en ik ga je gang en lopen tekenreeks1, 251 00:14:42,900 --> 00:14:51,920 en dan typ ik een woord als HELLO, Enter, alles wat het doet is het afdrukken 1 teken per keer. 252 00:14:51,920 --> 00:14:54,010 >> Dus er is een kans voor verfijning hier. 253 00:14:54,010 --> 00:14:58,150 Ik ben een beetje meer werk te verrichten, ook al is het duidelijker misschien op deze manier, dan nodig is. 254 00:14:58,150 --> 00:15:03,270 Welke regel code hier kan ik waarschijnlijk helemaal weg te gooien? Ja. 255 00:15:03,270 --> 00:15:08,290 Lijn 24. In lijn 24 Ik verklaar een variabele c. 256 00:15:08,290 --> 00:15:14,320 Ik ben het opslaan van de i-karakter van s in, maar dan ga ik met c hier. 257 00:15:14,320 --> 00:15:20,160 Dus ik ben met behulp van c, dus ik voel me alsof ik kan niet gewoon gooien lijn 24 te bereiken. 258 00:15:20,160 --> 00:15:23,850 [Onverstaanbaar student commentaar] >> Precies. 259 00:15:23,850 --> 00:15:26,240 Dus als het gaat om praten over het ontwerp van programma's, 260 00:15:26,240 --> 00:15:30,740 merken deze lichte vereenvoudiging van de code, die is net zo leesbaar, 261 00:15:30,740 --> 00:15:34,680 maar beseffen dat is gewoon een variabele, het data type is een array, 262 00:15:34,680 --> 00:15:38,610 dus s [i] is gewoon om direct terug te keren naar je de i-teken in die string. 263 00:15:38,610 --> 00:15:40,620 En als je wilt afdrukken, is dat prima. 264 00:15:40,620 --> 00:15:43,680 Je hoeft alleen te% c te gebruiken omdat je niet het afdrukken van een string, 265 00:15:43,680 --> 00:15:48,520 u het afdrukken van een teken in een string, en ook dit heeft het effect van het afdrukken van de i-karakter. 266 00:15:48,520 --> 00:15:51,390 En echt herinneren aan de enige verschil met vorige week met het gebruik van printf 267 00:15:51,390 --> 00:15:54,220 is dat terwijl in de weken voorbij zouden we iets doen super eenvoudig 268 00:15:54,220 --> 00:15:58,510 zoals de% s tijdelijke aanduiding gevolgd door de naam van een string hier, 269 00:15:58,510 --> 00:16:01,190 nu zijn we duiken in een beetje dieper onder de motorkap en zeggen: 270 00:16:01,190 --> 00:16:06,090 worden niet afgedrukt de string; daarin afdrukken van de enkel teken. 271 00:16:06,090 --> 00:16:10,570 >> Dus we kunnen iets doen een beetje anders hier, want er is een andere - niet bug 272 00:16:10,570 --> 00:16:14,090 omdat dit programma is goed, maar ik doe iets stoms 273 00:16:14,090 --> 00:16:16,810 die ik noemde kort op woensdag. 274 00:16:16,810 --> 00:16:22,680 Maar terugdenkend, hoe kon dit programma ontwerp nog verder worden verbeterd? Ja. 275 00:16:22,680 --> 00:16:28,280 [Onverstaanbaar student reactie] >> Oh, goed. 276 00:16:28,280 --> 00:16:32,120 Dus herinneren dat we een zogenaamde tweede variabele n laatste keer geïntroduceerd, 277 00:16:32,120 --> 00:16:34,850 dat lijkt te zijn tegenstrijdige onszelf omdat mijn doel een tweede geleden 278 00:16:34,850 --> 00:16:37,380 was gewoon weg te gooien een variabele als onnodig, 279 00:16:37,380 --> 00:16:40,700 maar herinneren dat woensdag eigenlijk we dit deden. 280 00:16:40,700 --> 00:16:46,170 Ik veranderde de for-lus om daadwerkelijk hebben hier een komma, dan is n = strlen, 281 00:16:46,170 --> 00:16:52,120 en dan hier deed ik i 00:16:57,660 Wat is het fundamentele winst die ik bereiken door het veranderen van mijn initialisatie van deze 283 00:16:57,660 --> 00:17:01,590 en mijn voorwaarde om dit nu? >> [Onverstaanbaar student reactie] >> Precies. 284 00:17:01,590 --> 00:17:06,170 Ik ben niet herinneren strlen opnieuw en opnieuw en opnieuw, omdat herinneren hoe de for-lus werken. 285 00:17:06,170 --> 00:17:08,790 Zelfs als ze beginnen te krijgen ingewikkelder ogende, 286 00:17:08,790 --> 00:17:12,480 herinneren dat het ding voor de eerste puntkomma is de initialisatie, die ooit gebeurt. 287 00:17:12,480 --> 00:17:14,359 De toestand is echter in het midden 288 00:17:14,359 --> 00:17:17,710 en dit wordt gecontroleerd elke keer dat je door de lus. 289 00:17:17,710 --> 00:17:22,420 >> Dus het is een soort van dom om te vragen de computer dezelfde vraag opnieuw en opnieuw - 290 00:17:22,420 --> 00:17:25,920 Wat is de lengte van HELLO? Wat is de lengte van HELLO? Wat is de lengte van HELLO? - 291 00:17:25,920 --> 00:17:29,740 want zoals we zullen zien vandaag en op woensdag, is dit zeker gaan om tijd te nemen, 292 00:17:29,740 --> 00:17:34,320 en het is niet een zeer goed gebruik van de tijd, omdat te achterhalen van de lengte van een string 293 00:17:34,320 --> 00:17:37,030 eigenlijk duurt een beetje inspanning. 294 00:17:37,030 --> 00:17:39,760 Het is niet onmiddellijk, want het is in sommige talen. 295 00:17:39,760 --> 00:17:43,920 Dus door het veranderen van deze tot n, de prijs die ik betaal is wat? 296 00:17:43,920 --> 00:17:45,640 We zien een trade-off hier. 297 00:17:45,640 --> 00:17:49,460 Ik kan tijd besparen door niet te vragen hetzelfde verdomde vraag opnieuw en opnieuw, 298 00:17:49,460 --> 00:17:51,740 maar het gaat kosten me iets, wat is wat? 299 00:17:51,740 --> 00:17:55,050 >> [Student] Je verliest een bepaalde hoeveelheid geheugen. >> Precies. Het gaat kosten me wat geheugen. 300 00:17:55,050 --> 00:17:56,670 Dus in dit geval kost het me wat? 301 00:17:56,670 --> 00:18:01,530 Een andere 32 bits omdat n is slechts een int, zoals wordt gesuggereerd door het woord int hier. 302 00:18:01,530 --> 00:18:03,300 Maar is dat goed? 303 00:18:03,300 --> 00:18:05,800 Eerlijk gezegd, dat is waarschijnlijk goed, want als je erover nadenkt, 304 00:18:05,800 --> 00:18:09,030 hoe langer de string is, hoe meer tijd ik ga verspillen 305 00:18:09,030 --> 00:18:11,920 omdat strlen gaat opnieuw en opnieuw en opnieuw gecalled 306 00:18:11,920 --> 00:18:13,520 voor elke iteratie van de lus. 307 00:18:13,520 --> 00:18:18,070 En deze dagen, mijn Mac heeft 2 optredens van RAM-geheugen, deze dagen 4 optredens van RAM-geheugen soms. 308 00:18:18,070 --> 00:18:22,420 Ik denk dat ik kan 4 van die bytes veroorloven om daadwerkelijk versnellen dingen. 309 00:18:22,420 --> 00:18:26,590 Maar dit gaat om een ​​afweging en een thema echt bij de programmering en in de informatica 310 00:18:26,590 --> 00:18:28,320 van nooit echt het krijgen van iets gratis. 311 00:18:28,320 --> 00:18:32,880 Als u iets wilt hier te verbeteren, moet u voor het een of andere manier te betalen in de andere hand. 312 00:18:32,880 --> 00:18:35,880 Ruimte tegen de tijd in dit geval. 313 00:18:35,880 --> 00:18:40,700 >> Dus dit was allemaal in de aanloop naar iets cryptisch als dit, 314 00:18:40,700 --> 00:18:44,070 die, zoals u waarschijnlijk bedacht door nu eigenlijk zegt? 315 00:18:44,070 --> 00:18:47,420 [Onverstaanbaar student reactie] >> Ja, dus dit is, Zorg ervoor dat u uw Ovaltine drinken, 316 00:18:47,420 --> 00:18:52,490 werkelijk gebruik maakt van een algoritme genaamd ROT13, ROT 1-3, 317 00:18:52,490 --> 00:18:55,500 Dit betekent gewoon draaien alle letters 13 plaatsen, 318 00:18:55,500 --> 00:18:58,720 wat betekent dat neemt A dan en voeg 13 tot en ga puntje, puntje, puntje 319 00:18:58,720 --> 00:19:04,640 helemaal naar de 13e letter weg, hetzelfde doen voor B en voor C en D, enzovoort. 320 00:19:04,640 --> 00:19:10,850 En dus als we hier eigenlijk om te zetten dit met behulp van een verschuiving van 13 plaatsen, 321 00:19:10,850 --> 00:19:14,580 komen we terug op wat kleine Ralphie had, die was, Zorg ervoor dat u uw Ovaltine drinken. 322 00:19:14,580 --> 00:19:18,160 Maar nu voor het probleem set 2, in de standaard editie in ieder geval, 323 00:19:18,160 --> 00:19:21,680 je moet soort van doen deze encryptieapparatuur zelf, 324 00:19:21,680 --> 00:19:25,990 en we moeten een of andere manier te nemen in ingang als deze en het of decoderen coderen. 325 00:19:25,990 --> 00:19:29,850 >> Dus welke van deze grondbeginselen soort leidt ons om die kans? 326 00:19:29,850 --> 00:19:32,650 Laten we eens een kijkje nemen op deze derde voorbeeld hier. 327 00:19:32,650 --> 00:19:38,430 In de eerste plaats, het heet ASCII. Wat doet ASCII terug te verwijzen naar? 328 00:19:38,430 --> 00:19:40,460 American Standard Code for Information Interchange, 329 00:19:40,460 --> 00:19:43,850 dat is een heel lange manier om te zeggen wat? Wat is ASCII? 330 00:19:43,850 --> 00:19:47,890 [Onverstaanbaar student reactie] >> Wat is dat? >> [Student] Een speciale tekens. >> Een karakter kaart. 331 00:19:47,890 --> 00:19:51,390 Het is gewoon in kaart nummers om letters, want de wereld is gestandaardiseerd 332 00:19:51,390 --> 00:19:55,380 welke nummers zal vertegenwoordigen wat letters zodat wij allemaal kunnen computers 333 00:19:55,380 --> 00:19:59,340 en onze programma's zijn allemaal gewoon compatibel als het gaat om het afdrukken van dingen op het scherm. 334 00:19:59,340 --> 00:20:04,680 Dus herinneren dat 65 gebeurt te vertegenwoordigen A, 97 gebeurt er vertegenwoordigen een kleine letter. 335 00:20:04,680 --> 00:20:08,510 En dus dit eenvoudige programma is hier ASCII gebruik te maken van dat feit - 336 00:20:08,510 --> 00:20:12,770 dat de wereld weet dat het kapitaal A 65 - en het is gewoon het afdrukken van de kaart brengen. 337 00:20:12,770 --> 00:20:16,320 >> Dus voordat we een duik in deze code, laat me in plaats daarvan open een terminal venster. 338 00:20:16,320 --> 00:20:21,550 Laat me ga je gang en maken ASCII, en dan laten we dit ding lopen alleen maar om de output te verwennen. 339 00:20:21,550 --> 00:20:25,960 En het doet gewoon dit: een echt grote grafiek die gewoon vertelt me ​​al de verschillende codes 340 00:20:25,960 --> 00:20:27,950 voor alle verschillende letters. 341 00:20:27,950 --> 00:20:32,100 Dus een super eenvoudig programma, maar ik hoefde niet te harde code die 52 lijnen van de output: 342 00:20:32,100 --> 00:20:34,860 26 hoofdletters, 26 kleine letters. 343 00:20:34,860 --> 00:20:37,790 In plaats daarvan, ik deed dit programmatisch met een paar lussen. 344 00:20:37,790 --> 00:20:39,720 Let op wat ik hier deed. 345 00:20:39,720 --> 00:20:44,790 Ik herhaald van i is 65 op tot 65 + 26, want ik wilde om uit te printen 26 letters 346 00:20:44,790 --> 00:20:49,860 in het Engels alfabet, i + + op elke iteratie, en nu weer merken. 347 00:20:49,860 --> 00:20:52,540 Het is de herhaling van onze vriend typecasting 348 00:20:52,540 --> 00:20:54,620 waarbij je converteert een gegevenstype naar een ander 349 00:20:54,620 --> 00:20:57,480 want wat wil ik doen in dit programma? 350 00:20:57,480 --> 00:21:02,650 Ik wil numeriek rekenen, want dat is hoe ik ben opgegroeid tellen - 65, 66, 67, enzovoort - 351 00:21:02,650 --> 00:21:04,420 maar ik wil niet alleen de nummers af te drukken. 352 00:21:04,420 --> 00:21:08,030 Ik wil de brief gevolgd door het nummer te drukken. 353 00:21:08,030 --> 00:21:18,640 Ik wil een afdruk: aantal, B: nummer, maar ik kan dit doen met exact dezelfde variabele. 354 00:21:18,640 --> 00:21:21,630 Dus print ik% c als een tijdelijke aanduiding voor een karakter, 355 00:21:21,630 --> 00:21:25,080 % D als een tijdelijke aanduiding voor een cijfer of getal. 356 00:21:25,080 --> 00:21:27,750 Dan wat moet ik aansluiten voor die 2 tijdelijke aanduidingen? 357 00:21:27,750 --> 00:21:33,960 Ik voor het eerst de stekker in het karakter equivalent van i, en dan print ik i zelf. 358 00:21:33,960 --> 00:21:36,400 >> Dus merken dit ook gewoon werkt. 359 00:21:36,400 --> 00:21:39,320 Net zoals ik kan gegoten uit een float naar een int 360 00:21:39,320 --> 00:21:41,750 om te gaan van een reëel getal een integer, 361 00:21:41,750 --> 00:21:46,100 hier kan ik gaan van een int naar een char, dat is een beetje raar - 362 00:21:46,100 --> 00:21:48,680 niet helemaal in kaart op de echte wereld - maar in computers 363 00:21:48,680 --> 00:21:51,140 een char is maar een getal onder de motorkap, 364 00:21:51,140 --> 00:21:53,590 dus we zijn ooit zo expliciet hier op de computer, zeggende: 365 00:21:53,590 --> 00:21:58,920 printf, afdrukken niet i als 65, print het uit als zijn numerieke equivalent. 366 00:21:58,920 --> 00:22:02,110 En het blijkt dat ik technisch niet eens nodig. 367 00:22:02,110 --> 00:22:05,020 Wat ik een moment geleden doen is expliciet casting 368 00:22:05,020 --> 00:22:08,760 door te geven welke data type Ik wil naar van en naar. 369 00:22:08,760 --> 00:22:11,840 Maar merk dat ik al deze tijdelijke aanduiding% c hebben 370 00:22:11,840 --> 00:22:14,930 en die andere% c tijdelijke aanduiding hier. 371 00:22:14,930 --> 00:22:18,880 Ook al is dit niet int, de computer realiseert zich dat een char, 372 00:22:18,880 --> 00:22:21,080 het is gewoon een int onder de kap. 373 00:22:21,080 --> 00:22:25,100 >> Dus als ik echt hercompileren dit en voert u het ASCII-programma, 374 00:22:25,100 --> 00:22:31,210 merken het nog steeds werkt gewoon omdat de computer zich realiseert dat er deze correspondentie. 375 00:22:31,210 --> 00:22:34,870 Nu, het is belangrijker om de expliciete casting te doen in de wereld van praalwagens te ints 376 00:22:34,870 --> 00:22:37,460 omdat er je eigenlijk het maken van een berekende beslissing: 377 00:22:37,460 --> 00:22:40,140 weg te gooien alles na de komma. 378 00:22:40,140 --> 00:22:44,990 Hier is echt niets weg te gooien omdat een karakter is maar een getal, 379 00:22:44,990 --> 00:22:48,220 en een string is gewoon een array van karakters. 380 00:22:48,220 --> 00:22:52,530 Dus toen het tijd werd om de uitvoering van bepaalde encryptie of decryptie komt, 381 00:22:52,530 --> 00:22:56,770 hoe komt het dat we eigenlijk kunnen vertalen zoiets als dit onzin, 382 00:22:56,770 --> 00:22:58,670 Zorg ervoor dat u uw Ovaltine drinken? 383 00:22:58,670 --> 00:23:02,700 Wat als we nu weten - laten we als aanname - dat de sleutel, 384 00:23:02,700 --> 00:23:08,010 het aantal dat we al deze brieven draaien door, is de nummer 13? 385 00:23:08,010 --> 00:23:11,800 Dus gingen we uit de letter B helemaal naar O aan het begin van de zin, 386 00:23:11,800 --> 00:23:14,710 Zorg ervoor dat u uw Ovaltine drinken, want als ik dat doe B 387 00:23:14,710 --> 00:23:19,600 en dan ga ik C, D, E, F, G, H, I, J, K, L, M, N, O, 388 00:23:19,600 --> 00:23:23,760 dat is de reden waarom de encryptie van de letter B wordt O 389 00:23:23,760 --> 00:23:26,570 omdat ik gewoon toegevoegd 13 aan. 390 00:23:26,570 --> 00:23:33,460 >> Dus als ik wil decoderen dit, ik wezen moet O te nemen en toen 13 af te trekken van het. 391 00:23:33,460 --> 00:23:36,880 Of eerlijk gezegd, want er is 26 letters in het alfabet, dit is prachtig symmetrisch, 392 00:23:36,880 --> 00:23:41,260 we kunnen ook gewoon toe te voegen 13 en we nemen contact met de letter B. 393 00:23:41,260 --> 00:23:44,290 Maar hoe ga je over het implementeren iets als dit in Caesar 394 00:23:44,290 --> 00:23:46,600 of echt manipuleren strings in het algemeen? 395 00:23:46,600 --> 00:23:51,380 Als de letter B is welk nummer? 396 00:23:51,380 --> 00:23:55,290 Wat is de letter B? Dus het is 66, toch? 397 00:23:55,290 --> 00:23:59,220 Dus als de letter A is 65 en de letter B is 66, 398 00:23:59,220 --> 00:24:03,940 zo 66, alles wat ik moet doen is het toevoegen 13 aan, en dat geeft me 79. 399 00:24:03,940 --> 00:24:09,150 En als we naar onze kleine cheat sheet, 79 inderdaad kaarten op O. 400 00:24:09,150 --> 00:24:11,290 >> Maar er is een beetje een hoek geval. 401 00:24:11,290 --> 00:24:15,170 Wat is bijvoorbeeld de letter Z? 402 00:24:15,170 --> 00:24:20,180 Als we 66 + 25 helemaal naar het einde van het alfabet, we op 91. 403 00:24:20,180 --> 00:24:24,520 91 + 13 geeft me 104, en wat denk je? 404 00:24:24,520 --> 00:24:29,200 104 niet gelijk een hoofdletter. 405 00:24:29,200 --> 00:24:31,610 Laten we terug gaan naar een klein spiekbriefje. 406 00:24:31,610 --> 00:24:38,070 Als ik dit programma opnieuw uit te voeren in het toestel, merk op dat 104, als ik terug naar de terminal venster, 407 00:24:38,070 --> 00:24:41,800 104 is blijkbaar de kleine letters h. 408 00:24:41,800 --> 00:24:46,400 Dus we moeten een aantal belangrijke truc hier in om ervoor te zorgen dat wanneer we beginnen bij Z 409 00:24:46,400 --> 00:24:50,260 en we voegen 13 tot en met het we willen niet gewoon blijven smeden vooruit naar grotere en grotere aantallen. 410 00:24:50,260 --> 00:24:52,600 Wat doen we echt willen doen? 411 00:24:52,600 --> 00:24:54,570 Je omheen wilt laten lopen. 412 00:24:54,570 --> 00:25:00,250 >> Zo blijkt, zoals je waarschijnlijk al gezien in paragraaf nu of in het probleem set spec zelf 413 00:25:00,250 --> 00:25:05,730 gerealiseerd dat er dit andere operator in C die ook een procentteken, 414 00:25:05,730 --> 00:25:11,020 maar dat we hebben gebruikt% hier om een ​​tijdelijke aanduiding te geven, 415 00:25:11,020 --> 00:25:15,420 weten dat, met name voor probleem set 2, is er ook zoiets als dit: 416 00:25:15,420 --> 00:25:18,990 int x = y% z. 417 00:25:18,990 --> 00:25:22,770 Laat me dit te presenteren als een zeer algemene vorm van deze. 418 00:25:22,770 --> 00:25:25,580 Procent betekent wat in een programmeertaal? >> [Student] Modulo. 419 00:25:25,580 --> 00:25:28,790 Modulo, dat is een mooie manier om te zeggen de rest. 420 00:25:28,790 --> 00:25:31,620 Ook al is er een lichte onderscheid met de definitie daar, 421 00:25:31,620 --> 00:25:37,210 Dit betekent verdelen y door z, maar niet terug het resultaat van deze deling; 422 00:25:37,210 --> 00:25:39,650 in plaats daarvan, de terugkeer van de rest. 423 00:25:39,650 --> 00:25:47,390 >> Als y daadwerkelijk 3 en z is eigenlijk 2, 3 gedeeld door 2 1 met een rest van 1, 424 00:25:47,390 --> 00:25:51,550 dus wat doet x eigenlijk gelijk in dit scenario? 1. 425 00:25:51,550 --> 00:25:54,540 Dit is een dergelijke eenvoudige, laag idee. 426 00:25:54,540 --> 00:25:56,480 Het duurt een beetje tijd om je geest eromheen 427 00:25:56,480 --> 00:25:58,740 want het is waarschijnlijk al een tijdje geleden dat je zelfs moest geven om restanten 428 00:25:58,740 --> 00:26:01,160 en daadwerkelijk gebruik van maken voor iets doelgericht, 429 00:26:01,160 --> 00:26:05,290 maar in dit geval het simpele feit dat u kunt uit een groot aantal gaan als 3 430 00:26:05,290 --> 00:26:08,920 een relatief klein aantal als 2 en wikkelen effectief 431 00:26:08,920 --> 00:26:14,160 door gebruik te maken van de rest op een kleinere waarde als 1 gaat een waardevol truc 432 00:26:14,160 --> 00:26:17,690 die we kunnen gebruiken voor zowel iets als Caesar en dat andere ding Vigenere 433 00:26:17,690 --> 00:26:22,240 in probleem set 2, maar dit gaat om een ​​terugkerend truc loop van het semester zijn. 434 00:26:22,240 --> 00:26:24,880 Dit eenvoudige, simpele idee van alleen het nemen van de rest in het algemeen 435 00:26:24,880 --> 00:26:26,530 gaat ons in staat stellen om rond te wikkelen. 436 00:26:26,530 --> 00:26:31,140 En als we beginnen te spelen meer met arrays, als we beginnen te spelen meer met het geheugen zelf, 437 00:26:31,140 --> 00:26:35,800 dit gaat om meer en meer van een krachtige truc. 438 00:26:35,800 --> 00:26:43,420 >> Dus vragen dan op ASCII of de vertegenwoordiging van strings als arrays? 439 00:26:43,420 --> 00:26:47,430 En we nemen het op 1 inkeping verder. Ja. 440 00:26:47,430 --> 00:26:52,350 [Onverstaanbaar student vraag] >> Goede vraag. 441 00:26:52,350 --> 00:26:55,370 Wat betekent het als een variabele heeft een sterretje in de voorkant van het? 442 00:26:55,370 --> 00:26:57,720 Laat me stellen de beantwoording van deze in detail, 443 00:26:57,720 --> 00:27:00,100 maar verwijst naar een onderwerp bekend als een pointer. 444 00:27:00,100 --> 00:27:03,440 Pointers te maken hebben met het geheugen, en we zijn eigenlijk vandaag 445 00:27:03,440 --> 00:27:06,330 het nemen van de eerste stap in de richting van die discussie, 446 00:27:06,330 --> 00:27:08,600 maar voor nu, laat me doen alsof de ster niet bestaat 447 00:27:08,600 --> 00:27:15,380 en we blijven bellen snaren snaren in plaats van het gebruik van char *, 448 00:27:15,380 --> 00:27:19,530 die heb je waarschijnlijk eerder gezien en ik zal op het scherm zetten in slechts een moment als een teaser. 449 00:27:19,530 --> 00:27:23,010 Dus komen we terug aan die in de weg meer detail dan velen van jullie zullen waarschijnlijk graag. 450 00:27:23,010 --> 00:27:25,760 Uiteindelijk, niet vandaag. Ja. 451 00:27:25,760 --> 00:27:42,810 >> [Onverstaanbaar student vraag] 452 00:27:42,810 --> 00:27:47,080 In welke context moet je het bord voorzien in een karakter? >> [Student] Ja. 453 00:27:47,080 --> 00:27:52,130 Dus door gebrek, wanneer u geen + zet, net positieve getallen aangenomen. 454 00:27:52,130 --> 00:27:55,390 Dus als gewoon schrijven het nummer 1, het is een positief 1. 455 00:27:55,390 --> 00:27:57,710 Als je echt wilt de ontkenning van een waarde op te geven, 456 00:27:57,710 --> 00:28:01,060 je letterlijk op -1 te doen op uw toetsenbord. 457 00:28:01,060 --> 00:28:20,440 Maar dit is waarschijnlijk niet uw vraag. >> [Onverstaanbaar student reactie] 458 00:28:20,440 --> 00:28:22,200 >> Goede vraag. Oke. 459 00:28:22,200 --> 00:28:24,970 Dus dit moet, heb ik begrepen, te doen met een soort van bug je liep in 460 00:28:24,970 --> 00:28:27,640 omdat je het omzetten van een geheel getal naar een personage, 461 00:28:27,640 --> 00:28:29,780 maar een of andere manier negativiteit erbij betrokken, 462 00:28:29,780 --> 00:28:32,380 en zo het karakter kwam net uit munged een of andere manier. 463 00:28:32,380 --> 00:28:36,710 Dus voor nu, laat me een beetje te simpel tot we terugkomen naar dit soort onderwerp. 464 00:28:36,710 --> 00:28:39,570 Voor nu, denk aan dingen op deze manier - en dit is een oversimplificatie. 465 00:28:39,570 --> 00:28:43,500 Maar in de wereld van een geheel getal, heb je hoeveel bits tot uw beschikking? 466 00:28:43,500 --> 00:28:45,190 Je hebt 32 bits. 467 00:28:45,190 --> 00:28:49,030 En tot nu toe hebben we gesproken over het totaal aantal getallen kunt u vormen daarom 468 00:28:49,030 --> 00:28:52,430 is ongeveer 4 miljard in totaal, want je hebt 32 bits, 469 00:28:52,430 --> 00:28:55,100 dus dat is 2 bij de 32, zodat het ongeveer 4 miljard. 470 00:28:55,100 --> 00:28:58,810 Maar we zagen een week of 2 geleden dat je niet echt een bereik van getallen 471 00:28:58,810 --> 00:29:01,240 van 0 op maximaal 4 miljard. 472 00:29:01,240 --> 00:29:06,340 De range loopt in plaats van ongeveer negatief 2 miljard naar positieve 2 miljard. 473 00:29:06,340 --> 00:29:10,990 Maar dit roept dan de vraag, hoe kan je het begrip negatieve 2 miljard vertegenwoordigen 474 00:29:10,990 --> 00:29:13,260 laat staan ​​negatief 1? 475 00:29:13,260 --> 00:29:17,960 Voor nu kunnen we te simpel en gewoon zeggen dat we gaan naar het meest linkse bit te gebruiken 476 00:29:17,960 --> 00:29:22,380 van deze 32 bits, en als het een 1 is een negatief getal 477 00:29:22,380 --> 00:29:25,090 en als het een 0 is het een positief getal. 478 00:29:25,090 --> 00:29:28,570 Het probleem met deze vereenvoudigde weergave van negatieve getallen 479 00:29:28,570 --> 00:29:33,700 is dat als je bewust zijn slim en proberen om uit een teken om te zetten naar een aantal 480 00:29:33,700 --> 00:29:37,190 of vice versa, is er niet zoiets als een negatief karakter. 481 00:29:37,190 --> 00:29:42,550 In de wereld van ASCII, waarvan slechts 8 bits gebruikt, alle 8 van die bits stof, 482 00:29:42,550 --> 00:29:46,810 en de meest linkse bit heeft niets te maken met negativiteit. 483 00:29:46,810 --> 00:29:49,670 En alleen maar om duidelijk, als ik uiterst linkse stukjes zeggen, 484 00:29:49,670 --> 00:29:54,610 herinneren dat wanneer we ons steentje bij-gerelateerde voorbeelden deed in de eerste week 485 00:29:54,610 --> 00:30:02,570 herinneren dat we dingen trok als 1001101, zoiets als dit. 486 00:30:02,570 --> 00:30:07,210 Toen ik de meest linkse bit zeggen, ik heb net letterlijk bedoel de 1 die je helemaal overschrijven naar links. 487 00:30:07,210 --> 00:30:11,910 Dus in de wereld van tekens geen begrip negativiteit, 488 00:30:11,910 --> 00:30:16,360 zodat meest linkse bit heeft eigenlijk iets te maken met ASCII, niets te maken met negativiteit. 489 00:30:16,360 --> 00:30:19,390 >> Dus het klinkt als - en uit de context is het moeilijk om precies te beantwoorden - 490 00:30:19,390 --> 00:30:25,840 maar een of andere manier, is de code verwarrend dat meest linkse bit als vertegenwoordiger van een negatieve waarde 491 00:30:25,840 --> 00:30:29,160 toen was het echt een deel van het karakter in kwestie. 492 00:30:29,160 --> 00:30:32,250 En nogmaals, ik ben te simpel omdat computers daadwerkelijk iets een beetje liefhebber 493 00:30:32,250 --> 00:30:37,080 dan alleen het veranderen van die meest linkse bit een 1 voor een negatief teken ten opzichte van een 0. 494 00:30:37,080 --> 00:30:41,270 Ze in plaats daarvan, als je nieuwsgierig bent naar Google, gebruiken iets typisch genoemd 2's complement, 495 00:30:41,270 --> 00:30:43,830 dat is een beetje meer verfijnd van een aanpak 496 00:30:43,830 --> 00:30:45,490 maar het idee is uiteindelijk hetzelfde. 497 00:30:45,490 --> 00:30:50,530 >> Dus in het kort, het had te maken met het feit dat je een nummer masseren om een ​​teken te 498 00:30:50,530 --> 00:30:53,750 of vice versa, maar de code was niet op de hoogte van het feit 499 00:30:53,750 --> 00:30:56,510 dat een van deze bits had betekenis in de numerieke wereld. 500 00:30:56,510 --> 00:30:59,940 Dat is niet het geval in het karakter wereld. 501 00:30:59,940 --> 00:31:04,270 Maar het klinkt alsof je vast, in welk geval moot nu. Andere vragen. 502 00:31:06,030 --> 00:31:07,110 Oke. 503 00:31:07,110 --> 00:31:11,560 Tot nu toe zijn alle van de programma's die we hebben geschreven genomen inbreng misschien van de gebruiker 504 00:31:11,560 --> 00:31:14,330 in de vorm van functies zoals GetInt, GetString, 505 00:31:14,330 --> 00:31:16,990 of als je al vooruit lezen in verschillende boeken of online referenties, 506 00:31:16,990 --> 00:31:21,390 jullie zelf misschien gebruikte functies, zoals scanf die, eerlijk gezegd, we gebruiken in de CS50 bibliotheek. 507 00:31:21,390 --> 00:31:25,370 Maar in een week of 2, zullen we eigenlijk laten zien hoe de CS50 bibliotheek wordt uitgevoerd 508 00:31:25,370 --> 00:31:27,890 zodat we kunnen nemen die zijwieltjes eraf helemaal. 509 00:31:27,890 --> 00:31:31,340 >> Maar het blijkt dat er een andere manier om input te krijgen van een gebruiker. 510 00:31:31,340 --> 00:31:34,670 In feite hebben we onszelf zijn met behulp van command line argumenten 511 00:31:34,670 --> 00:31:36,500 voor een paar weken nu. 512 00:31:36,500 --> 00:31:41,150 Elke keer als we geen Clang of we hebben gelopen te maken, 513 00:31:41,150 --> 00:31:45,050 We hebben gewoon niet clang getypt, Enter, hebben we niet getypt te maken, op Enter. 514 00:31:45,050 --> 00:31:49,340 Wat hebben we meestal geschreven na het woord clang op onze terminal vensters prompt? 515 00:31:51,110 --> 00:31:52,900 [Student] De bestandsnaam. >> De bestandsnaam, toch? 516 00:31:52,900 --> 00:31:57,560 Hello.c of mario.c of wat dan ook de relevante bestandsnaam is. 517 00:31:57,560 --> 00:32:01,910 En in die zin wat je echt hebt gedaan is dat je beïnvloed het gedrag van Clang 518 00:32:01,910 --> 00:32:05,750 omdat zeker de mensen die schreven Clang had geen idee dat er weinig oud je 519 00:32:05,750 --> 00:32:08,890 ging om een ​​programma mario.c jaar later genoemd schrijven. 520 00:32:08,890 --> 00:32:13,150 Dus je moest naar een of andere manier invloed op het gedrag van dat programma, 521 00:32:13,150 --> 00:32:18,140 en dat programma Clang dat geschreven zodanig dat het invoer accepteren van u 522 00:32:18,140 --> 00:32:23,480 door de toevoeging van woorden op de prompt voor de gebruiker op Enter. 523 00:32:23,480 --> 00:32:27,860 >> Dus het blijkt dat al enige tijd hebben we bijna al onze programma's te verklaren 524 00:32:27,860 --> 00:32:32,840 om te beginnen als deze - int main (void) - en dan hebben we doorgegaan 525 00:32:32,840 --> 00:32:35,110 en begon te schrijven onze code. 526 00:32:35,110 --> 00:32:37,910 En we misschien wat scherp omvat aan de bovenkant van het bestand, 527 00:32:37,910 --> 00:32:40,660 maar bijna al onze programma's tot nu toe zijn begonnen met deze 528 00:32:40,660 --> 00:32:44,200 ook al heb je misschien gezien in doorsnede, in boeken, online referenties 529 00:32:44,200 --> 00:32:46,570 dat dit in feite niet te zijn nietig. 530 00:32:46,570 --> 00:32:55,820 Een andere legitieme vorm om dit te laten nemen is int argc en vervolgens string argv []. 531 00:32:55,820 --> 00:32:57,500 Dus nu wat is dit de vaststelling betekent? 532 00:32:57,500 --> 00:33:01,320 Het blijkt dat argc, dat is een menselijke conventie - je zou kunnen noemen dit foo, 533 00:33:01,320 --> 00:33:03,710 maar het zou gewoon een veel minder duidelijk aan de lezers - 534 00:33:03,710 --> 00:33:09,330 argc is slechts een argument aan de functie genaamd belangrijkste dat staat voor wat? 535 00:33:09,330 --> 00:33:12,450 Wat betekent argc staan ​​voor degenen die bekend zijn? 536 00:33:12,450 --> 00:33:14,980 >> [Onverstaanbaar student reactie] >> Ja, het aantal argumenten of argumenten tellen. 537 00:33:14,980 --> 00:33:16,510 Het is zo simpel als dat. 538 00:33:16,510 --> 00:33:19,160 Hoeveel argumenten werden doorgegeven aan dit programma? 539 00:33:19,160 --> 00:33:20,630 Wat betekent dat? 540 00:33:20,630 --> 00:33:27,090 Als op de opdrachtregel Ik heb zoiets als dit - clang mario.c-- 541 00:33:27,090 --> 00:33:35,440 argc als ik op Enter geraakt zal nemen op een waarde van, ietwat verwarrend, 2. 542 00:33:35,440 --> 00:33:40,150 Dus het blijkt dat argc is argument tellen, 543 00:33:40,150 --> 00:33:46,280 maar historische redenen, wordt de naam van het programma zelf in die tellen. 544 00:33:46,280 --> 00:33:51,950 Dus argc is 2 toen ik schreef clang mario.c. 545 00:33:51,950 --> 00:33:54,290 Wat doet argv bevatten? 546 00:33:54,290 --> 00:33:57,020 Allereerst argv lijkt een snaar maar niet helemaal 547 00:33:57,020 --> 00:33:59,310 omdat vanaf afgelopen woensdag en des te meer vandaag de dag, 548 00:33:59,310 --> 00:34:02,890 deze vierkante haken duiden wat? Dat is een array. 549 00:34:02,890 --> 00:34:07,110 Er is geen nummer in de array, en dat moet intuïtief zinvol 550 00:34:07,110 --> 00:34:10,790 omdat de mensen die schreven Clang jaar geleden had zeker geen idee 551 00:34:10,790 --> 00:34:16,300 hoeveel woorden mensen zoals wij zou typen op de prompt voordat je op Enter. 552 00:34:16,300 --> 00:34:22,280 >> Dus in dit geval hier zijn ze hebben verklaard de functie hoofd als het nemen van een reeks van argumenten, 553 00:34:22,280 --> 00:34:24,590 0 of meer argumenten. 554 00:34:24,590 --> 00:34:26,460 Ze weten niet van tevoren hoeveel het er zijn, 555 00:34:26,460 --> 00:34:29,690 dus er is bewust geen nummer binnenkant van deze vierkante haken. 556 00:34:29,690 --> 00:34:32,750 Maar het feit dat de vierkante haakjes zijn er vertellen de computer, 557 00:34:32,750 --> 00:34:34,639 verwacht een array. 558 00:34:34,639 --> 00:34:37,489 Argv is gewoon verkorte schrijfwijze voor argument vector. 559 00:34:37,489 --> 00:34:39,889 Een vector is een mooie manier om te zeggen array, 560 00:34:39,889 --> 00:34:42,980 en array is een mooie manier om te zeggen een lijst of verzameling. 561 00:34:42,980 --> 00:34:47,360 Dus dit betekent gewoon dat als je schrijft main Vind je deze 562 00:34:47,360 --> 00:34:51,100 in plaats van als hoe we doen het al de afgelopen paar weken, 563 00:34:51,100 --> 00:34:54,699 uw programma heeft nu de macht om command line argumenten te aanvaarden 564 00:34:54,699 --> 00:34:58,520 zodat die niet langer heb je te mario schrijven en dan druk op Enter, 565 00:34:58,520 --> 00:35:01,610 typ in een aantal voor hoeveel blokken hoog je wilt dat de piramide te zijn, 566 00:35:01,610 --> 00:35:03,100 dan druk nogmaals op Enter. 567 00:35:03,100 --> 00:35:07,720 We weten niet eens nodig om GetString gebruiken meer of GetInt of GetFloat voor die kwestie. 568 00:35:07,720 --> 00:35:12,370 We kunnen gewoon verwachten dat de gebruiker in staat om die woorden te typen op de prompt zelf 569 00:35:12,370 --> 00:35:16,850 net als de auteurs van Clang besloten dat het een echt vervelend programma 570 00:35:16,850 --> 00:35:20,550 als om de code te compileren u eerst getypte clang, druk op Enter, 571 00:35:20,550 --> 00:35:24,090 dan zeiden we aan de gebruiker, typt u de naam van het bestand dat u wilt compileren, 572 00:35:24,090 --> 00:35:26,920 dan typen we in mario.c en druk op Enter. 573 00:35:26,920 --> 00:35:29,850 Maar dat is precies wat we hebben gedaan om onze gebruikers de afgelopen paar weken. 574 00:35:29,850 --> 00:35:33,550 We maken gebruik van GetString en we wachten tot het programma draait om hen te vragen om input. 575 00:35:33,550 --> 00:35:36,710 Dat moet niet meer het geval. 576 00:35:36,710 --> 00:35:41,160 >> Dus in dit voorbeeld, hebben we nu string argv, 577 00:35:41,160 --> 00:35:43,390 en ook dit is een oversimplificatie, 578 00:35:43,390 --> 00:35:45,610 zijwieltjes dat zal zeer spoedig loskomen. 579 00:35:45,610 --> 00:35:50,860 Dit is de meer juiste manier van het schrijven van dit alternatieve verklaring van de belangrijkste 580 00:35:50,860 --> 00:35:54,740 want het blijkt dat wat we houden aanroeptekenreeks eigenlijk een ster heeft, 581 00:35:54,740 --> 00:35:58,440 een asterisk in de werkelijke definitie, maar dit ziet er gewoon ingewikkeld, 582 00:35:58,440 --> 00:36:02,600 het is verwarrend in het begin, dus we vereenvoudigen door gewoon het creëren van een synoniem van soorten 583 00:36:02,600 --> 00:36:09,340 in de CS50 bibliotheek die kaarten char * aan deze meer gebruiksvriendelijke woord string. 584 00:36:09,340 --> 00:36:13,180 >> Dus laten we eigenlijk proberen dan. Laat me gaan en open te stellen gedit hier. 585 00:36:13,180 --> 00:36:17,010 Laat me ga je gang en open argv van 1. 586 00:36:17,010 --> 00:36:21,620 Dit programma blijkbaar drukt de argumenten, maar in het Engels termen, 587 00:36:21,620 --> 00:36:26,290 door te kijken naar deze code, dit is wat doen meer in het bijzonder? 588 00:36:26,290 --> 00:36:35,910 Als ik typ in de command a.out foo bar, wordt gedrukt wat in mijn zwart-wit raam? 589 00:36:35,910 --> 00:36:41,260 A.out foo bar, Enter. 590 00:36:43,120 --> 00:36:48,300 Ga je gang. Ja. >> [Onverstaanbaar student reactie] 591 00:36:48,300 --> 00:36:52,730 Goed. Dus a.out, nieuwe lijn, foo, nieuwe lijn, bar, nieuwe lijn. 592 00:36:52,730 --> 00:36:54,980 Hoe komt dat? We kunnen zeker bevestigen in slechts een moment. 593 00:36:54,980 --> 00:36:56,940 Dit is een soort van een pluizige regel code. 594 00:36:56,940 --> 00:36:59,560  Hij drukt gewoon een nieuwe lijn alleen maar om de dingen mooier op het scherm. 595 00:36:59,560 --> 00:37:03,730 Dit is een lus die is van 0 itereren van maximaal argc, 596 00:37:03,730 --> 00:37:07,210 en dit wordt incrementeren op elke iteratie + +. 597 00:37:07,210 --> 00:37:12,270 Dus dit zegt nu afdrukken van een tekenreeks, zoals geïmpliceerd door deze% s. 598 00:37:12,270 --> 00:37:16,460 Argv [i] is vrij veel het zelfde idee van het vorige voorbeeld. 599 00:37:16,460 --> 00:37:19,580 We gebruikten om de variabele s noemen, nu het heet, willekeurig, argv. 600 00:37:19,580 --> 00:37:24,270 Dit betekent dat drukken de i-de argument dat werd getypt op de opdrachtregel, 601 00:37:24,270 --> 00:37:28,690 en dan na dit alles gedaan is, gewoon af te drukken voor een goede maatregel een nieuwe regel. 602 00:37:28,690 --> 00:37:31,600 >> Dus laten we dit zien. Laat me het openstellen van de terminal-venster. 603 00:37:31,600 --> 00:37:37,470 Laat me stellen argv van 1, en nu laat ik argv lopen van 1, Enter. Hmm. Oke. 604 00:37:37,470 --> 00:37:40,850 Laten we lopen foo bar. Interessant. Baz. 605 00:37:40,850 --> 00:37:42,640 En als je ooit hebt afgevraagd waarom ik dit typ, 606 00:37:42,640 --> 00:37:45,010 dit is gewoon ook een domme computer science conventie. 607 00:37:45,010 --> 00:37:48,050 De wereld heeft vaak alleen maar verbale tijdelijke aanduidingen voor woorden. 608 00:37:48,050 --> 00:37:50,090 Dus als je wilt praten over een aantal generieke string, 609 00:37:50,090 --> 00:37:53,250 informatici gewoon de neiging om foo te zeggen wanneer ze behoefte aan een willekeurig woord, 610 00:37:53,250 --> 00:37:55,530 dan zeggen ze bar als ze behoefte aan een tweede willekeurig woord, 611 00:37:55,530 --> 00:37:59,100 dan zeggen ze baz als ze behoefte aan een derde woord, dan zijn ze QHx zeggen als ze behoefte aan een vierde woord, 612 00:37:59,100 --> 00:38:01,520 en dan is er een grote religieuze debat online over wat er na QHx, 613 00:38:01,520 --> 00:38:04,940 zodat u Google dat om erachter te komen wat de ander willekeurig woord zou moeten zijn. 614 00:38:04,940 --> 00:38:07,480 Maar deze hebben geen enkele betekenis, 615 00:38:07,480 --> 00:38:10,100 hoewel foo bar, als je op Google dat, dat betekent een betekenis hebben, 616 00:38:10,100 --> 00:38:12,780 dat deel uitmaakt van de hier etymologie. 617 00:38:12,780 --> 00:38:17,550 >> Dus dit alles wordt dan doet is met afdrukken 1 van deze strings per regel. 618 00:38:17,550 --> 00:38:19,900 Dus als ik in plaats daarvan echter, wilde een beetje liefhebber, 619 00:38:19,900 --> 00:38:22,550 neem aan dat ik niet wilde elke snaar per regel afdrukken; 620 00:38:22,550 --> 00:38:26,220 Ik wilde elk teken af ​​te drukken vanaf elke snaar per regel. 621 00:38:26,220 --> 00:38:28,550 Hoe kon ik in plaats daarvan doen? 622 00:38:28,550 --> 00:38:33,720 Wat heb ik nodig om te veranderen over dit programma als ik wil niet elk woord af te drukken 623 00:38:33,720 --> 00:38:37,290 maar ik wil elk woord letter afdrukken door letter voor letter, 624 00:38:37,290 --> 00:38:40,590 dan is de volgende woord letter voor letter voor letter? 625 00:38:40,590 --> 00:38:43,650 Hoe combineren we deze ideeën tot nu toe? Ja. 626 00:38:43,650 --> 00:38:47,390 [Student]% c. >> Oke. Dus we ergens behoefte aan een% c. 627 00:38:47,390 --> 00:38:50,680 Mooi, want ik wil niet om hele strings af te drukken, wil ik tekens af te drukken. En verder? 628 00:38:50,680 --> 00:38:54,290 >> [Onverstaanbaar student reactie] >> Interessant. 629 00:38:54,290 --> 00:38:56,860 Dus we moeten een soort van tweede dimensie hier nu 630 00:38:56,860 --> 00:39:02,300 omdat denken aan argv als een array, maar het is een array van strings. 631 00:39:02,300 --> 00:39:07,170 Maar vanaf, zoals, 15 minuten geleden, wat is een string? Het is een array van karakters. 632 00:39:07,170 --> 00:39:12,320 Dus echt, argv is een array van een array van karakters, 633 00:39:12,320 --> 00:39:14,870 een array van arrays van karakters. 634 00:39:14,870 --> 00:39:19,170 Dus het blijkt dat we kunnen gebruiken gewoon meer vierkante haken notaties. Dus laten we dit doen. 635 00:39:19,170 --> 00:39:23,650 In het begin van deze lus op lijn 19, ik ga herhalen van i tot en met argc, 636 00:39:23,650 --> 00:39:25,760 maar dan ga ik om dit te doen: 637 00:39:25,760 --> 00:39:27,580 voor - Ik kan nu niet gebruiken i. 638 00:39:27,580 --> 00:39:30,300 Ik moet een andere variabele, want ik wil itereren over de woorden 639 00:39:30,300 --> 00:39:32,640 maar dan ook over de letters in de woorden 640 00:39:32,640 --> 00:39:37,280 dus ik soort van een verticale as en een horizontale as, een soort van conceptueel. 641 00:39:37,280 --> 00:39:43,930 Dus int j 0 krijgt, dan wil ik j doen zolang j kleiner is dan - en ik zal dit opruimen in een beetje. 642 00:39:43,930 --> 00:39:48,410 Hoe kan ik itereren over de letters in een string? We deden dit even geleden. 643 00:39:48,410 --> 00:39:54,670 Strlen van argv [i]. Goed. 644 00:39:54,670 --> 00:39:57,860 En nogmaals, ik maak een beetje inefficiëntie hier door niet het creëren van n of wat dan ook, 645 00:39:57,860 --> 00:39:59,610 maar we zullen terugkeren naar dat. 646 00:39:59,610 --> 00:40:03,270 >> Dus nu j + +. Nu moet ik verder streepje hier. 647 00:40:03,270 --> 00:40:06,950 Wat moet ik nu wilt afdrukken op elke iteratie? 648 00:40:06,950 --> 00:40:09,720 [Onverstaanbaar student reactie] >> Dus [i] geeft me het woord. 649 00:40:09,720 --> 00:40:12,910 [I] [j], als een soort matrix. 650 00:40:12,910 --> 00:40:14,810 Degenen onder jullie met wiskunde-y achtergronden, 651 00:40:14,810 --> 00:40:19,340 we zijn soort van indexering nog dieper in deze matrix of deze array van arrays, 652 00:40:19,340 --> 00:40:21,380 Dit 2-dimensionale structuur. 653 00:40:21,380 --> 00:40:25,070 Dus nu laten we eens kijken wat er hier gebeurt. Laat me open mijn grotere terminal venster. 654 00:40:25,070 --> 00:40:28,170 Laat me herhaling maken van argv van 1. 655 00:40:28,170 --> 00:40:33,090 En ik heb het verpest hier, dat is een goede les, omdat ik te vergeten om dit te doen. 656 00:40:33,090 --> 00:40:37,150 Impliciet verklaren C bibliotheek functie 'strlen' met unsigned type "- 657 00:40:37,150 --> 00:40:40,360 Ik weet niet eens wat de rest van die middelen, maar ik heb dit eerder gezien, 658 00:40:40,360 --> 00:40:42,000 impliciet verklaren. 659 00:40:42,000 --> 00:40:45,540 Wanneer we deze fout te zien, dit is wat meestal betekent? 660 00:40:45,540 --> 00:40:48,520 >> [Onverstaanbaar student antwoord] >> Ik ben een bibliotheek boven. Maar wacht eens even. 661 00:40:48,520 --> 00:40:51,690 Meestal heb ik het verpest, omdat ik vergat de CS50 bibliotheek, maar dat is er. 662 00:40:51,690 --> 00:40:54,480 Meestal heb ik het verpest, want ik ben vergeten standaard I / O. 663 00:40:54,480 --> 00:40:57,960 En eerlijk gezegd, ik weet niet eens nodig. We zijn niet met behulp van GetString vandaag. 664 00:40:57,960 --> 00:40:59,900 Dus wat mis ik? 665 00:40:59,900 --> 00:41:04,860 Er is nog een bibliotheek die nu moeten we af en toe de naam string.h te gebruiken, 666 00:41:04,860 --> 00:41:08,980 en dit is slechts nog een andere bibliotheek die meer functies die niet in de standaard I / O heeft 667 00:41:08,980 --> 00:41:11,640 >> Dus laten we terug gaan naar mijn grote terminal-venster. 668 00:41:11,640 --> 00:41:16,670 Oke. Nu, verdomme, ik denk dat ik verkeerd was. Ik was met behulp van de CS50 bibliotheek. 669 00:41:16,670 --> 00:41:18,460 Dus we kunnen dit oplossen in een van de 2 manieren. 670 00:41:18,460 --> 00:41:21,510 We kunnen de training wielen van dit moment en gewoon doen, 671 00:41:21,510 --> 00:41:26,600 of laten we soort van houden dat vereenvoudiging alleen voor nu, plak deze terug in, 672 00:41:26,600 --> 00:41:30,180 lossen dat probleem, en nu terug naar het terminal-venster. 673 00:41:30,180 --> 00:41:33,080 Dus om duidelijk te zijn, in de CS50 bibliotheek is niet alleen functies, 674 00:41:33,080 --> 00:41:36,920 het is ook het trefwoord string, dat is waarom die fout gebeurde gewoon. 675 00:41:36,920 --> 00:41:43,010 >> Dus hier gaan we dan. I vastgesteld beide library problemen. Enter. Goed. 676 00:41:43,010 --> 00:41:49,250 Argv van 1, foo bar, Enter. Uitstekend. 677 00:41:49,250 --> 00:41:52,830 Dus nu hebben we elke letter van elk woord afgedrukt 1 per regel, 678 00:41:52,830 --> 00:41:55,290 die niet zorgen voor een zeer interessant programma, 679 00:41:55,290 --> 00:41:59,350 maar let nu hebben we de mogelijkheid om niet alleen itereren over woorden 680 00:41:59,350 --> 00:42:04,090 maar ook over afzonderlijke letters in woorden, dat klinkt erg vertrouwd 681 00:42:04,090 --> 00:42:10,330 de eenvoudigste toepassingen zoals scrambling letters in een string als deze zelfs. 682 00:42:10,330 --> 00:42:12,410 Laten we verder gaan en hier nemen onze 5-minuten pauze. 683 00:42:12,410 --> 00:42:14,410 En als we terug komen, zullen we beginnen te praten over de efficiëntie 684 00:42:14,410 --> 00:42:17,670 waarmee we beter kunnen doen deze dingen. 685 00:42:19,370 --> 00:42:21,900 >> Oke. We zijn weer terug. 686 00:42:21,900 --> 00:42:26,970 Dankzij een van onze TFS die speelt veel Bananagrams, 687 00:42:26,970 --> 00:42:30,000 We hebben eigenlijk een hele hoop van chars met ons hier vandaag 688 00:42:30,000 --> 00:42:32,520 fysiek geïncarneerd met deze kleine stukjes plastic, 689 00:42:32,520 --> 00:42:36,910 en laat me voorstellen dat dit lege witte lei hier het RAM-geheugen in mijn computer vertegenwoordigt - 690 00:42:36,910 --> 00:42:39,790 laptop, desktop, wat dan ook - en daar ziet eruit als er veel van 691 00:42:39,790 --> 00:42:44,090 want als we beginnen hakken dit RAM in kleine byte-grootte stukken, 692 00:42:44,090 --> 00:42:48,970 laten we willekeurig zeggen dat iets dat de grootte en dat onscherpe vertegenwoordigt - 693 00:42:48,970 --> 00:42:52,430 daar gaan we, en laten we hier uit te zoomen een beetje - 694 00:42:52,430 --> 00:42:56,120 laten we zeggen iets dat de grootte van een enkele byte vertegenwoordigt. 695 00:42:56,120 --> 00:43:00,400 Dus we kunnen inderdaad past een hele hoop van bytes of tekens binnenkant van dit geheugen, 696 00:43:00,400 --> 00:43:02,860 zoals voorgesteld door de relatieve omvang hier. 697 00:43:02,860 --> 00:43:06,780 >> Zodat nu dat het doel is om geheugen toewijzen voor een tekenreeks. 698 00:43:06,780 --> 00:43:08,680 Hoe werkt dit eigenlijk? 699 00:43:08,680 --> 00:43:11,380 In de programma's die we hebben geschreven, hebben we meestal gebruik gemaakt van GetString, 700 00:43:11,380 --> 00:43:16,300 maar nu, duidelijk, er is een andere kanaal via welke we kunnen input van de gebruiker in argv krijgen 701 00:43:16,300 --> 00:43:18,190 via command line argumenten. 702 00:43:18,190 --> 00:43:20,580 Maar wat er werkelijk aan de hand onder de motorkap? 703 00:43:20,580 --> 00:43:24,920 Het blijkt als we noemen - laten we terug te scrollen naar GetString - de functie GetString 704 00:43:24,920 --> 00:43:28,190 in de CS50 bibliotheek wordt de gebruiker gevraagd een string, 705 00:43:28,190 --> 00:43:30,780 de gebruiker typt in een woord - laten we noemen HELLO het. 706 00:43:30,780 --> 00:43:35,410 En we hebben gezegd voor de afgelopen paar weken dat de return waarde van GetString 707 00:43:35,410 --> 00:43:37,750 in feite een string, als het woord HELLO. 708 00:43:37,750 --> 00:43:39,660 >> Maar wat is getString eigenlijk aan het doen? 709 00:43:39,660 --> 00:43:45,230 Als de gebruiker in HELLO, Enter, wordt GetString uitzoeken, 710 00:43:45,230 --> 00:43:47,930 oke, hoeveel tekens is dit? Dit H-E-L-L-O. 711 00:43:47,930 --> 00:43:52,500 Dus het moet toewijzen aan, die het nodig heeft om het besturingssysteem te vragen - Linux in dit geval - 712 00:43:52,500 --> 00:43:55,410 tenminste 5 bytes op te slaan HELLO. 713 00:43:55,410 --> 00:43:59,570 En wat het gaat dan doen om een ​​keer hij terug die 5 bytes van het besturingssysteem 714 00:43:59,570 --> 00:44:04,120 is de lay-out HELLO rug aan rug aan rug aan rug. 715 00:44:04,120 --> 00:44:11,070 En dus wat er echt terug van GetString is een stuk van de gegevens die er als volgt uitziet. 716 00:44:11,070 --> 00:44:16,850 Maar dit is een beetje onnauwkeurig, omdat het blijkt dat het niet zo eenvoudig 717 00:44:16,850 --> 00:44:20,310 als gewoon opslaan van HELLO in het geheugen van de computer 718 00:44:20,310 --> 00:44:24,140 want stel dat mijn programma dat ik aan het schrijven ben in C roept vervolgens getString weer, 719 00:44:24,140 --> 00:44:28,210 en het volgende woord typt de gebruiker in is Bye, bye. 720 00:44:28,210 --> 00:44:31,300 Nou, ik moet dat woord BYE ergens in het geheugen passen. 721 00:44:31,300 --> 00:44:33,790 Ik kan niet clobber HELLO. 722 00:44:33,790 --> 00:44:37,320 Bijvoorbeeld, ik wil niet dat de computer gewoon beginnen te overschrijven als deze 723 00:44:37,320 --> 00:44:41,400 het oorspronkelijke woord, omdat ik nog steeds kan het woord worden met behulp van HELLO in een variabele 724 00:44:41,400 --> 00:44:43,070 ergens anders in mijn programma. 725 00:44:43,070 --> 00:44:45,900 >> Dus B-Y-E moet nu ergens anders in het geheugen. 726 00:44:45,900 --> 00:44:50,460 Maar de conventie is typisch dat de volgende tekenreeks die u toewijzen 727 00:44:50,460 --> 00:44:54,940 waarschijnlijk, maar niet altijd, zal eindigen bij de eerstvolgende geheugenplaats. 728 00:44:54,940 --> 00:44:57,370 En als ik niet gevraagd het besturingssysteem voor het geheugen 729 00:44:57,370 --> 00:45:01,380 sinds de laatste keer dat ik belde getString, is de kans het woord BYE 730 00:45:01,380 --> 00:45:05,790 gaat naar rechts eindigen na het woord HELLO in het geheugen. 731 00:45:05,790 --> 00:45:10,550 Maar op dit punt kun je misschien zien waar een potentieel probleem zich voordoet. 732 00:45:10,550 --> 00:45:13,310 Omdat de volgende delen van het geheugen, de volgende bytes die waren gewoon vrij - 733 00:45:13,310 --> 00:45:18,230 schone witte lei - in het geheugen van de computer waren direct naast HELLO, 734 00:45:18,230 --> 00:45:23,670 het voelt als de eerste string vroeg ik om kan plotseling veranderen nu 735 00:45:23,670 --> 00:45:26,410 want ik heb in wezen veranderd in HELLOBYE 736 00:45:26,410 --> 00:45:31,310 plaats van andere manier demarcing begin BYE en eind HELLO. 737 00:45:31,310 --> 00:45:33,920 >> Dus het blijkt dat wat er echt aan de hand is onder de motorkap, 738 00:45:33,920 --> 00:45:37,570 die u misschien een glimp hebben opgevangen in online referenties of sectie of boeken 739 00:45:37,570 --> 00:45:41,780 of helemaal niet gewoon nog niet, is dat er eigenlijk een bewuste afbakening 740 00:45:41,780 --> 00:45:45,890 tussen woorden in het geheugen van een computer. 741 00:45:45,890 --> 00:45:52,480 En in feite, in dit geval hier, in plaats van zomaar BYE naast HELLO, 742 00:45:52,480 --> 00:45:58,610 in plaats daarvan, de computer zet een speciaal teken, het speciale nul-karakter, zo te zeggen, 743 00:45:58,610 --> 00:46:03,050 die wordt voorgesteld met een marker met backslash 0. 744 00:46:03,050 --> 00:46:06,700 Dus lang verhaal kort te herinneren dat tekens worden weergegeven in ASCII. 745 00:46:06,700 --> 00:46:09,680 ASCII is gewoon een mapping tussen cijfers en letters, 746 00:46:09,680 --> 00:46:13,870 en de meeste van die brieven beginnen ongeveer 65 voor kapitaal A, 747 00:46:13,870 --> 00:46:19,780 maar het blijkt dat je kan zeker vertegenwoordigen het getal 0 als een geheel getal of in binaire, 748 00:46:19,780 --> 00:46:22,690 en het blijkt dat de wereld lang besloten, lang geleden, "Weet je wat?" 749 00:46:22,690 --> 00:46:27,550 "Let's reserve getal 0 niet overeen geen tekens op het toetsenbord - 750 00:46:27,550 --> 00:46:30,810 "Geen brieven, geen nummers, geen leestekens. 0 is bijzonder." 751 00:46:30,810 --> 00:46:35,830 "Het gaat om de speciale null karakter te zijn, en we gaan om het te schrijven als \ 0." 752 00:46:35,830 --> 00:46:41,170 Het verschil is als we net schreef 0, 0 is een karakter. 753 00:46:41,170 --> 00:46:45,700 Herinneren dat er ASCII codes voor 0, voor 1, 2, 3 754 00:46:45,700 --> 00:46:50,570 omdat het karakter 0 afwijkt van het getal 0. 755 00:46:50,570 --> 00:46:54,270 En je kunt zien dat als je terugkijkt vanaf week 1 bij de eerste hebben we gesproken over ASCII, 756 00:46:54,270 --> 00:46:59,130 0 en 1 en 2 en 3 helemaal tot 9 hun eigen ASCII codes. 757 00:46:59,130 --> 00:47:02,300 Ze zijn niet, toevallig, 0 tot en met 9. Ze zijn erg verschillend. 758 00:47:02,300 --> 00:47:08,770 Dus 0 betekent gewoon "ik speciaal ben," en de \ 0 betekent, letterlijk, "Ik ben niet de 0 karakter." 759 00:47:08,770 --> 00:47:11,360 "Ik ben dit bijzondere waarde, de nul-karakter." 760 00:47:11,360 --> 00:47:16,930 Dus ik echt nodig een andere een van deze want ik kan niet twee keer dezelfde fout maken. 761 00:47:16,930 --> 00:47:21,550 >> Dus na het woord BYE we gaan ook nog een van deze nultekens nodig hebben. 762 00:47:21,550 --> 00:47:27,090 Laat me hier pak mijn pen en laat me snel een ander \ 0 te tekenen 763 00:47:27,090 --> 00:47:30,480 zodat nadat ik heb gevraagd het besturingssysteem voor 2 strings 764 00:47:30,480 --> 00:47:33,270 via GetString gevolgd door nog een oproep naar GetString, 765 00:47:33,270 --> 00:47:35,640 dit is wat is eigenlijk in het geheugen. 766 00:47:35,640 --> 00:47:39,900 Dus als ik terug een string, ik ben echt om weer dat, 767 00:47:39,900 --> 00:47:43,450 en toen ik de volgende snaar te krijgen, ik ben echt om weer dat. 768 00:47:43,450 --> 00:47:47,910 Dus dit is het de vraag, strlen, in de eerste plaats, wat moet daar terug? 769 00:47:47,910 --> 00:47:54,650 Toen ik strlen een beroep doen op de string s en s was het woord HELLO die de gebruiker heeft ingevoerd in, 770 00:47:54,650 --> 00:47:57,800 wat hebben we natuurlijk zeggen dat de lengte van HELLO was een paar minuten geleden? 771 00:47:57,800 --> 00:48:01,290 Het was 5, toch? H-E-L-L-O. En dat is inderdaad hoe strlen werkt. 772 00:48:01,290 --> 00:48:05,670 Retourneert wat een normaal mens zou verwachten de lengte van een string te zijn. 773 00:48:05,670 --> 00:48:11,030 Maar in werkelijkheid, hoe groot is de matrix van karakters die hallo is het opslaan? 774 00:48:11,030 --> 00:48:12,770 Het is eigenlijk 6. 775 00:48:12,770 --> 00:48:15,740 Dus strlen betekent dat feit geen melding aan u. 776 00:48:15,740 --> 00:48:20,300 Maar onder de motorkap van de computer is inderdaad met behulp van 6 bytes op een 5-letter woord op te slaan, 777 00:48:20,300 --> 00:48:22,380 en dit is waar niet uit hoe lang het woord is. 778 00:48:22,380 --> 00:48:26,470 Er is altijd gaat om een ​​speciale null eindigt karakter aan het einde van de string 779 00:48:26,470 --> 00:48:28,800 om de totale lengte demarc. 780 00:48:28,800 --> 00:48:33,430 >> Dus dan kun je nu de persoon uitvoering strlen 20, 30 jaar geleden, 781 00:48:33,430 --> 00:48:35,520 hoe ga je over het implementeren strlen zelf? 782 00:48:35,520 --> 00:48:39,980 Wij gaan ervan uit dat het bestaat, net zoals we voor lief nemen dat printf bestaat, 783 00:48:39,980 --> 00:48:42,850 maar als HELLO is het woord in kwestie 784 00:48:42,850 --> 00:48:45,220 en wat ik heb in het geheugen is iets dat er zo uitziet, 785 00:48:45,220 --> 00:48:48,130 als je moest herimplementeren strlen omdat je werd gevraagd om 786 00:48:48,130 --> 00:48:50,260 of omdat, eerlijk gezegd, wist je niet strlen bestond - 787 00:48:50,260 --> 00:48:54,280 moest je deze rollen op uw eigen - hoe kon u de uitvoering van strlen 788 00:48:54,280 --> 00:48:57,760 wanneer gegeven iets dat er zo uitziet? 789 00:48:57,760 --> 00:49:02,750 Nu we weten dat een string een array is, kunnen we itereren over elk van de afzonderlijke tekens 790 00:49:02,750 --> 00:49:06,320 met behulp van iets als - laten we proberen om dit te doen op de vlieg. 791 00:49:06,320 --> 00:49:12,060 >> Laat me gaan in het apparaat. Laat me maak een nieuw bestand, strlen.c. 792 00:49:12,060 --> 00:49:19,260 Laat me nu ga je gang en doen stdio.h, zodat we toegang hebben tot printf hebben te nemen. 793 00:49:19,260 --> 00:49:25,820 Laat mij int main (void). Oh. Ik doe dit op mijn eigen voor nu dan. [Grinnikt] 794 00:49:25,820 --> 00:49:28,300 Dank u. 795 00:49:28,300 --> 00:49:31,000 Dit is wat ik doe. Oke. 796 00:49:31,000 --> 00:49:34,820 Dus voordat ik me omdraaide op het scherm, typte ik dat allemaal. 797 00:49:34,820 --> 00:49:37,550 En nu, wat ik ga doen is het volgende: 798 00:49:37,550 --> 00:49:40,360 printf ("Geef me een string:") 799 00:49:40,360 --> 00:49:42,700 Dat is gewoon pluizige instructies. 800 00:49:42,700 --> 00:49:45,700 Nu laat me doen string s = GetString. 801 00:49:45,700 --> 00:49:47,260 Ik heb al nodig om een ​​verandering nu te maken. 802 00:49:47,260 --> 00:49:52,740 Ik gebruik de CS50 bibliotheek plotseling, dus laat me ga je gang en typ in cs50.h. 803 00:49:52,740 --> 00:50:00,720 En nu laten we dit doen: printf ("De lengte is:% d, strlen [s] - 804 00:50:00,720 --> 00:50:03,540 en ik ben nog niet klaar. Wat moet ik toevoegen aan dit programma? 805 00:50:03,540 --> 00:50:05,740 >> [Student] string.h. >> String.h. 806 00:50:05,740 --> 00:50:10,800 Dus voor nu, we gebruiken strlen, dus laten we ervoor zorgen dat de compiler weet waar dat is, 807 00:50:10,800 --> 00:50:12,390 dus een beetje gezond verstand te controleren. 808 00:50:12,390 --> 00:50:16,400 Ik krijg een string in lijn 8, en in lijn 9 ben ik het afdrukken van de lengte met% d. 809 00:50:16,400 --> 00:50:19,400 Dus laten we verder gaan en open deze op. 810 00:50:19,400 --> 00:50:23,380 We hebben te maken strlen - stelt okay - 811 00:50:23,380 --> 00:50:30,120 strlen - laat me in te zoomen - Enter, H-E-L-L-O, Enter. De lengte is 5. 812 00:50:30,120 --> 00:50:32,730 >> Oke, dus strlen lijkt te werken, maar de wereld wist dat. 813 00:50:32,730 --> 00:50:37,310 Dus laten we nu strlen onszelf als volgt te implementeren. 814 00:50:37,310 --> 00:50:39,490 Laat me weg te nemen deze bibliotheek. 815 00:50:39,490 --> 00:50:42,590 We hoeven niet langer toegang hebben tot string.h omdat ik wist niet eens dat het bestond. 816 00:50:42,590 --> 00:50:45,970 Maar dat geeft niet, want ik kan implementeren strlen mezelf 817 00:50:45,970 --> 00:50:50,200 en hebben te nemen een string genaamd ingang, 818 00:50:50,200 --> 00:50:53,830 en nu moet ik te achterhalen van de lengte van deze string. 819 00:50:53,830 --> 00:50:55,880 Dus hoe kan ik dit doen? 820 00:50:55,880 --> 00:51:00,190 Wat gebeurt er als ik - laten we eens kijken hoe dit te doen - Wat wil je doen? 821 00:51:00,190 --> 00:51:04,130 >> [Onverstaanbaar student reactie] >> Oke. 822 00:51:04,130 --> 00:51:05,970 Dus we kunnen dit doen in een bos van manieren. Laat me proberen om deze aanpak te nemen. 823 00:51:05,970 --> 00:51:10,220 Ik geef mezelf een int variabele i, dus ik begint bij 0. 824 00:51:10,220 --> 00:51:19,380 En laat ik dit zeggen: terwijl input [i] is niet gelijk aan wat? \ 0. 825 00:51:19,380 --> 00:51:23,480 Zo blijkt, zoals met bij alle tekens bij het schrijven letterlijk ze in een programma, 826 00:51:23,480 --> 00:51:25,940 je moet enkele aanhalingstekens, niet dubbele aanhalingstekens te gebruiken. 827 00:51:25,940 --> 00:51:29,250 Dus als ik de letter a te schrijven, zou ik dat doen, de letter b, zou ik dat doen. 828 00:51:29,250 --> 00:51:33,440 Dit daarentegen zou een string zijn geen eigen karakter. 829 00:51:33,440 --> 00:51:38,470 >> Dus ik wil \ 0 letterlijk. Wat wil ik doen in deze lus? 830 00:51:38,470 --> 00:51:42,650 Eigenlijk, ik heb een andere variabele, dus int length krijgt 0. 831 00:51:42,650 --> 00:51:46,190 Zelfs als je niet zeker waarom we begonnen met de manier waarop we dat deden, 832 00:51:46,190 --> 00:51:50,110 nu dat we gaan op deze weg, wat ik wil doen op lijn 9? 833 00:51:50,110 --> 00:51:55,820 lengte + + en dan hier op lijn 10, het rendement lengte. 834 00:51:55,820 --> 00:51:58,370 Dus hoe is geïmplementeerd strlen? 835 00:51:58,370 --> 00:52:00,550 Het is eigenlijk wel geïmplementeerd als deze. 836 00:52:00,550 --> 00:52:03,470 Misschien is de persoon die een for-lus, misschien een doe while loop - wie weet? 837 00:52:03,470 --> 00:52:05,940 We zouden echt onder de motorkap kijken naar de werkelijke broncode 838 00:52:05,940 --> 00:52:08,520 in sommige bestand met de naam string.c waarschijnlijk. 839 00:52:08,520 --> 00:52:10,480 >> Maar hier laten we nadenken over wat ik doe. 840 00:52:10,480 --> 00:52:13,640 Ik verklaar een variabele genaamd i, waarin het gelijk aan 0. 841 00:52:13,640 --> 00:52:17,520 Ik ben dan te verklaren een andere variabele genaamd lengte, waarin het gelijk aan 0. 842 00:52:17,520 --> 00:52:25,440 Dan zeg ik, terwijl de i-teken in ingang is niet gelijk aan de speciale null karakter, \ 0, 843 00:52:25,440 --> 00:52:27,070 verhogen de lengte. 844 00:52:27,070 --> 00:52:32,550 Maar zodra de i-karakter is dit speciale karakter, wat gebeurt er met de lus? 845 00:52:32,550 --> 00:52:36,540 Het kortsluiting. Het stopt, wat betekent dat we dan onmiddellijk terugkeren lengte. 846 00:52:36,540 --> 00:52:40,740 >> Dus als ik niet verknoeien, laten we verder gaan en ga terug naar mijn terminal venster. 847 00:52:40,740 --> 00:52:43,550 Laat me opnieuw te compileren. En ik heb verpest. 848 00:52:43,550 --> 00:52:46,320 Incompatibele declaratie van functie uit de bibliotheek strlen. 849 00:52:46,320 --> 00:52:48,650 Dus ik probeerde om hier te komen te slim voor mijn eigen bestwil. 850 00:52:48,650 --> 00:52:51,610 De compiler weet dat er eigenlijk een functie genaamd strlen 851 00:52:51,610 --> 00:52:55,290 ook al hebben we niet opgenomen in de bibliotheek. Dat is prima. Het zal wel. 852 00:52:55,290 --> 00:52:58,230 We gaan gewoon om dan samen te werken. Laten we de naam van deze lengte. 853 00:52:58,230 --> 00:53:04,110 Laat mij het gebruik van het hier te veranderen op lengte, en dit zal Clang gelukkiger. 854 00:53:04,110 --> 00:53:08,900 Even terzijde, omdat sommige van deze functies zijn zo darn gemeen - 855 00:53:08,900 --> 00:53:12,390 strlen, prinf - ze daadwerkelijk hebben een soort speciale status. 856 00:53:12,390 --> 00:53:15,310 En zo Clang weet alleen een beetje iets bijzonders over hen. 857 00:53:15,310 --> 00:53:18,760 Dat is altijd niet het geval met de meeste functies, dus dat is waarom we werden uitgescholden. 858 00:53:18,760 --> 00:53:21,350 >> Laat mij nog eens proberen. Gelukkig, het werkte die tijd. 859 00:53:21,350 --> 00:53:23,560 Dus nu laat ik run mijn eigen strlen programma. 860 00:53:23,560 --> 00:53:29,740 Geef me een string: H-E-L-L-O, Enter. En ik heb het verpest. 861 00:53:29,740 --> 00:53:34,750 Waarom? >> [Onverstaanbaar student reactie] >> Precies. 862 00:53:34,750 --> 00:53:39,180 Dus ik heb mezelf hier een heel mooi uitziende oneindige lus 863 00:53:39,180 --> 00:53:42,270 want hoewel ik het verhogen lengte op elke iteratie, 864 00:53:42,270 --> 00:53:47,860 wat ben ik duidelijk niet te doen? Ik ben niet verhogen i. Oke. Gemakkelijke oplossing. Ja? 865 00:53:47,860 --> 00:53:52,430 Oke. Nee Nu zouden we afoul van een aantal andere veel voorkomende fout waar ik moet haken. 866 00:53:52,430 --> 00:53:54,430 En eerlijk gezegd, wordt deze code begint te zien er lelijk uit, 867 00:53:54,430 --> 00:53:56,460 dus nemen we een gooi naar het schoonmaken dit in een moment. 868 00:53:56,460 --> 00:53:58,810 Maar nu ben ik het verhogen zowel de lengte en i. 869 00:53:58,810 --> 00:54:02,630 Eerlijk gezegd, heb ik al hier een kans voor verbetering, maar we komen terug naar dat. 870 00:54:02,630 --> 00:54:05,270 >> Dus nu laten we gewoon zorgen dat we in ieder geval het maken van vooruitgang. 871 00:54:05,270 --> 00:54:08,320 Dit is gebeurd met een paar van jullie, en ik vergat dit te vermelden op voorhand. 872 00:54:08,320 --> 00:54:12,420 Wanneer u het ongeluk van een scenario als dit hebben, hoe dit oplossen 873 00:54:12,420 --> 00:54:15,130 kort van het herstarten van de machine of de computer of het sluiten van het raam? 874 00:54:15,130 --> 00:54:16,860 Het is eigenlijk eenvoudig. 875 00:54:16,860 --> 00:54:21,680 Control-C stuurt deze kleine wortel symbool C, en dat is gewoon beëindigt de meeste programma's. 876 00:54:21,680 --> 00:54:25,990 Als je een echt slecht oneindige lus die is afgedrukt dingen oneindig vele malen, 877 00:54:25,990 --> 00:54:29,960 soms moet je zou kunnen hebben om te slaan Control-C duizend keer om het echt te horen. 878 00:54:29,960 --> 00:54:33,910 Dus juist nu te realiseren, omdat ik niet aan het afdrukken iets, dat was heel eenvoudig. 879 00:54:33,910 --> 00:54:37,970 En technisch gezien, een keer is voldoende, maar ik ongeduldig en ik meestal raak het dat vele malen. 880 00:54:37,970 --> 00:54:43,400 >> Dus strlen. Geef me een string: HELLO. Gaat het dit keer werken? 881 00:54:44,580 --> 00:54:47,490 Oke. Een andere veel voorkomende fout. Moet opnieuw compileren. 882 00:54:47,490 --> 00:54:50,430 Dat was bewust, dat een. Oke. 883 00:54:50,430 --> 00:54:54,260 Dus strlen, H-E-L-L-O, Enter. Uitstekend. 884 00:54:54,260 --> 00:54:55,910 Dus hebben we nu een strlen tot 5. 885 00:54:55,910 --> 00:54:58,100 Dus we hebben letterlijk opnieuw geïmplementeerd dat wiel. 886 00:54:58,100 --> 00:55:02,080 Dus nu laten we dit opruimen, omdat dit niet maakt me onder de indruk 887 00:55:02,080 --> 00:55:04,080 met het ontwerp van mijn code. 888 00:55:04,080 --> 00:55:07,200 Wat kunnen we duidelijk te schakelen in dit programma om dit op te ruimen? 889 00:55:07,200 --> 00:55:11,840 [Onverstaanbaar student reactie] >> Ja. Letterlijk, we behandelen i en lengte identiek. 890 00:55:11,840 --> 00:55:16,440 Dus waarom gaan we niet gewoon slim en zeg, terwijl lengte? 891 00:55:16,440 --> 00:55:20,450 Integendeel, laten we noemen het gewoon lengte te beginnen, initialiseren op 0 892 00:55:20,450 --> 00:55:23,340 omdat standaard de string heeft geen lengte tot we weten wat het is. 893 00:55:23,340 --> 00:55:26,160 >> Nu we dit doen, en nu is dit een vrij elegante programma. 894 00:55:26,160 --> 00:55:28,660 Een variabele. Ik ruimde het op, aangescherpt het op. 895 00:55:28,660 --> 00:55:31,980 Dus nu laten we terug gaan naar mijn terminal-venster. Laten we verder gaan en het uitvoeren van deze. 896 00:55:31,980 --> 00:55:35,670 Maak strlen. Ziet er goed uit. Opnieuw uit te voeren strlen, Enter. 897 00:55:35,670 --> 00:55:40,680 Geef me een string: HELLO, Enter. En het lijkt te werken als 5. 898 00:55:40,680 --> 00:55:45,580 Nu, om duidelijk te zijn, als ik niet had geschreven, bijvoorbeeld, HELLO in 1 string 899 00:55:45,580 --> 00:55:48,840 en dan BYE in een ander, kunnen we zeker meerdere woorden. 900 00:55:48,840 --> 00:55:53,150 Als de uitdrukking die ik eigenlijk wilde typen niet HELLO, maar, bijvoorbeeld, 901 00:55:53,150 --> 00:55:58,920 HELLO WORLD, bericht dat wat we niet hebben is hier deze situatie, toch? 902 00:55:58,920 --> 00:56:00,580 Dat zou suggereren dat dat is 2 snaren. 903 00:56:00,580 --> 00:56:06,060 Je kan zeker hebben spatiebalk karakters, dus als we daadwerkelijk getypt in een langere zin 904 00:56:06,060 --> 00:56:08,390 zoals HELLO WORLD we, wat zou echt in het geheugen 905 00:56:08,390 --> 00:56:12,730 ziet er een beetje iets dergelijks daar. 906 00:56:12,730 --> 00:56:18,910 >> Oke. Hebt u vragen dan over de vertegenwoordiging hier van strings? 907 00:56:18,910 --> 00:56:20,450 Nee? Oke. 908 00:56:20,450 --> 00:56:25,130 Dus ik zei eerder dat het opnieuw bellen strlen op keer opzettelijk zo 909 00:56:25,130 --> 00:56:28,070 is waarschijnlijk niet het beste idee, want je gaat moeten doen een heleboel werk 910 00:56:28,070 --> 00:56:30,280 opnieuw en opnieuw en opnieuw. 911 00:56:30,280 --> 00:56:36,150 Inderdaad, wat voor soort werk is noodzakelijk voor het uitzoeken van de lengte van een string, blijkbaar? 912 00:56:36,150 --> 00:56:40,720 Je moet beginnen bij het begin en dan kijk, kijk, kijk, kijk, kijk 913 00:56:40,720 --> 00:56:44,930 totdat je uiteindelijk zien dat speciaal teken, op welk moment, ah, nu weet ik de lengte. 914 00:56:44,930 --> 00:56:48,040 Dus eerder toen we strlen wordt opnieuw en opnieuw en opnieuw genoemd, 915 00:56:48,040 --> 00:56:52,080 de reden dat ik voorgesteld dat was een soort van dom is omdat, opnieuw, dat string ziet er zo. 916 00:56:52,080 --> 00:56:54,880 Het is niet van plan om elke keer dat u herhalen veranderen door enkele lus, 917 00:56:54,880 --> 00:56:56,890 dus je doet onnodig werk. 918 00:56:56,890 --> 00:57:00,620 Tegelijkertijd moet je weten, als een terzijde, dat compilers zoals Clang deze dagen 919 00:57:00,620 --> 00:57:02,530 zijn ontwikkeld gedurende vele jaren, 920 00:57:02,530 --> 00:57:05,690 en compiler schrijvers, programmeurs, zijn behoorlijk slim. 921 00:57:05,690 --> 00:57:10,170 En zo blijkt dat Clang en andere compilers daadwerkelijk kan erachter te komen dat, 922 00:57:10,170 --> 00:57:13,650 oke, ja, je schreef strlen in uw toestand, 923 00:57:13,650 --> 00:57:17,520 wat betekent technisch dat we zouden noemen opnieuw en opnieuw en opnieuw. 924 00:57:17,520 --> 00:57:21,880 Maar slimme compilers daadwerkelijk kan optimaliseren dat soort slechte beslissingen van gebruikers 925 00:57:21,880 --> 00:57:23,870 uit uw code om dingen te herstellen. 926 00:57:23,870 --> 00:57:27,360 >> Dus gewoon beseffen dat soms de compiler is slimmer dan wij 927 00:57:27,360 --> 00:57:29,210 en zal soort van verborgen onze eigen fouten. 928 00:57:29,210 --> 00:57:31,620 Maar zeker als het gaat om problemen sets en dergelijke, 929 00:57:31,620 --> 00:57:35,340 niet na te denken over de fundamenteel verkeerde ontwerpbeslissingen 930 00:57:35,340 --> 00:57:38,110 potentieel om de eenvoudige reden dat we zouden veel meer werk moeten doen 931 00:57:38,110 --> 00:57:41,330 dan we eigenlijk moeten doen. Maar hoeveel meer werk? 932 00:57:41,330 --> 00:57:44,960 In het geval van HELLO WORLD, laten we beginnen om de grootte van dit probleem te veralgemenen. 933 00:57:44,960 --> 00:57:48,100 Wat is de lengte van het probleem of de omvang van het probleem 934 00:57:48,100 --> 00:57:50,770 wanneer het woord de gebruiker heeft ingevoerd in is HELLO? 935 00:57:50,770 --> 00:57:53,790 Het is blijkbaar 5, misschien 6. Plus of minus 1. Het zal wel. 936 00:57:53,790 --> 00:57:55,680 Het is zo dichtbij we noemen het gewoon 5. 937 00:57:55,680 --> 00:58:00,480 >> Dus wat is de omvang van het probleem hier wanneer het proberen te achterhalen van de lengte van HELLO? 938 00:58:00,480 --> 00:58:06,790 Het is 1, 2, 3, 4, 5, 6 en misschien de laatste karakter, maar generaliseren laten dat als n. 939 00:58:06,790 --> 00:58:10,300 Dus n, alleen de variabele n, is wat informatici zouden in het algemeen gebruik 940 00:58:10,300 --> 00:58:13,890 om de grootte van een probleem, en het probleem te beschrijven bij de hand is hoe lang is HELLO? 941 00:58:13,890 --> 00:58:17,050 Hoeveel tijd kost strlen nemen? 942 00:58:17,050 --> 00:58:21,010 Duurt in de orde van n stappen, waarbij elke stap betekent kijken naar een karakter 943 00:58:21,010 --> 00:58:23,350 kijken naar een karakter, kijken naar een karakter. 944 00:58:23,350 --> 00:58:26,850 En we deze discussie had een tijdje terug, het aantal operaties iets duurt. 945 00:58:26,850 --> 00:58:29,910 De eerste dag van de klas hadden we iedereen onhandig opstaan, 946 00:58:29,910 --> 00:58:32,060 en dan begon iedereen paren uit elkaar 947 00:58:32,060 --> 00:58:35,990 Om daadwerkelijk tellen ideaal hoeveel mensen in de kamer waren. 948 00:58:35,990 --> 00:58:39,860 En we deden ook een ander ding, waarbij als ik in plaats daarvan deed het de oude school weg 949 00:58:39,860 --> 00:58:44,800 van beginnende 1, 2, 3, 4, 5, 6 enzovoort, 950 00:58:44,800 --> 00:58:49,360 dat ook de omvang van het probleem was van grootte n. Er waren n mensen in de kamer. 951 00:58:49,360 --> 00:58:52,010 Maar ik kon versnellen dat, toch? Lagere school stijl die ik kon beginnen te tellen in 2s. 952 00:58:52,010 --> 00:58:55,560 2, 4, 6, 8, 10, 12. En dat voelt zo veel sneller, en het is inderdaad. 953 00:58:55,560 --> 00:59:01,720 Het is letterlijk twee keer zo snel, maar nogmaals, als nog eens 400 mensen liepen in deze kamer 954 00:59:01,720 --> 00:59:08,250 alles in een keer, zouden die algoritmes nog een 400 of misschien 200 stappen. 955 00:59:08,250 --> 00:59:13,310 >> Maar daarentegen, als we echt slim en we in plaats daarvan hebben jullie allemaal tel het dan zelf 956 00:59:13,310 --> 00:59:15,280 herinneren hoe dat algoritme werkt. 957 00:59:15,280 --> 00:59:17,110 Jullie stond op. Laat me snel uit naar deze. 958 00:59:17,110 --> 00:59:20,430 U allen stond op, u gepaarde uit, en dan de helft van jullie ging zitten, 959 00:59:20,430 --> 00:59:22,510 de helft van je ging zitten, de helft van jullie ging zitten, 960 00:59:22,510 --> 00:59:27,350 en op elke iteratie van deze lus van de week 0, hebben we gehalveerd het probleem bij de hand 961 00:59:27,350 --> 00:59:30,040 en ging n / 2, dan n / 4, dan n / 8. 962 00:59:30,040 --> 00:59:35,350 En de implicatie daarvan is dat als er een andere 400 mensen lopen in de kamer, geen big deal, 963 00:59:35,350 --> 00:59:40,120 Het zal ons nog 1 ronde, niet 400 meer rondes, niet 200 meer rondes. 964 00:59:40,120 --> 00:59:43,640 En dus het verhaal vertelden we een tijdje terug moest een beetje iets met dit te doen. 965 00:59:43,640 --> 00:59:47,750 Deze rode lijn hier lineair is, het is recht, en het is gelabeld als n 966 00:59:47,750 --> 00:59:50,250 want de grootte van een probleem wordt, 967 00:59:50,250 --> 00:59:54,690 als je algoritme of programma waarmee je het oplossen ervan duurt n stappen, 968 00:59:54,690 --> 00:59:58,620 we kunnen uitzetten als een rechte lijn waar het meer tijd kost hoe groter de omvang van het probleem. 969 00:59:58,620 --> 01:00:03,280 En de twosies aanpak, tellen 2, 4, 6, 8, nog steeds een rechte lijn, maar een beetje beter. 970 01:00:03,280 --> 01:00:08,440 Het duurt een beetje minder tijd, zodat de gele lijn onder de rode lijn punt voor punt. 971 01:00:08,440 --> 01:00:12,580 >> Maar nog beter was deze heilige graal van wat we genoemd logaritmische tijd 972 01:00:12,580 --> 01:00:14,830 waar zelfs als we weer het aantal mensen verdubbelen in de kamer, 973 01:00:14,830 --> 01:00:18,240 we het dubbele van de grootte van dat telefoonboek vanaf de eerste dag van klasse, 974 01:00:18,240 --> 01:00:22,310 geen big deal, het duurt nog 1 pagina scheur, neemt 1 meer zitten 975 01:00:22,310 --> 01:00:25,550 om een ​​probleem dat twee keer zo groot te lossen. 976 01:00:25,550 --> 01:00:27,460 En dus het gesprek dat we nu om te beginnen met zijn 977 01:00:27,460 --> 01:00:30,380 hoe kunnen we eigenlijk efficiënt problemen op te lossen 978 01:00:30,380 --> 01:00:32,510 als we rekening houden met de eenvoudigste van de problemen zoals deze? 979 01:00:32,510 --> 01:00:36,210 Stel we hebben 8 deuren waarachter een aantal nummers, 980 01:00:36,210 --> 01:00:39,720 en elk van deze getallen niet gesorteerd op enigerlei wijze, 981 01:00:39,720 --> 01:00:42,830 ze zijn gewoon willekeurige getallen achter deze deuren, 982 01:00:42,830 --> 01:00:47,290 en stellen we de vraag hoe ga je over het vinden van het aantal - wie weet - 983 01:00:47,290 --> 01:00:50,250 7 achter deze deuren? 984 01:00:50,250 --> 01:00:53,400 Wat zou u, een mens, doen om mij vinden het getal 7 985 01:00:53,400 --> 01:00:56,810 indien het nogmaals elk van deze zijn deuren en een waarde te zien moet je een deur te openen? 986 01:00:56,810 --> 01:00:59,650 Wat zou je algoritme misschien? 987 01:00:59,650 --> 01:01:05,310 >> [Onverstaanbaar student reactie] >> Dus beginnen met de linker-en een deur openen, opent een deur, een deur openen. 988 01:01:05,310 --> 01:01:08,570 En in het ergste geval, is hoe lang het gaat ons om het nummer 7 vinden? 989 01:01:08,570 --> 01:01:12,800 En nogmaals, ze zijn niet gesorteerd, dus het is niet zo eenvoudig als, nou ja, ik ga naar de 7e deur te openen. 990 01:01:12,800 --> 01:01:15,240 Het kan nemen ons, maximaal, 8 stappen. 991 01:01:15,240 --> 01:01:19,940 In het ergste geval, 7 is willekeurig aan het eind van de lijn van deuren, 992 01:01:19,940 --> 01:01:22,090 dus we kunnen moeten alle n deuren te proberen. 993 01:01:22,090 --> 01:01:24,440 Dus hier weer, lijken we een lineair algoritme hebben. 994 01:01:24,440 --> 01:01:27,030 In feite hebben we dit een paar jaar geleden. 995 01:01:27,030 --> 01:01:29,910 Een van uw voorgangers werd uitgedaagd met juist deze 996 01:01:29,910 --> 01:01:32,050 waar we niet over een digitale versie te hebben, hebben we in plaats daarvan hadden een schoolbord 997 01:01:32,050 --> 01:01:33,780 een paar stukken papier op. 998 01:01:33,780 --> 01:01:36,940 En wat ik dacht dat ik zou doen is een snelle terugblik op hoe dit ging, 999 01:01:36,940 --> 01:01:40,760 een van de beste en misschien wel het meest lastige kansen op het podium 1000 01:01:40,760 --> 01:01:42,530 om een ​​demonstratie te hebben hier op Sanders. 1001 01:01:42,530 --> 01:01:44,000 We hadden 2 rijen getallen. 1002 01:01:44,000 --> 01:01:47,280 We alleen maar te kijken naar wat er gebeurt hier met Sean voor de top van deze rijen. 1003 01:01:47,280 --> 01:01:49,660 Tenzij niemand ooit nog vrijwilligers in CS50, 1004 01:01:49,660 --> 01:01:52,010 we hadden Sean's zegen om dit te houden voor de camera, 1005 01:01:52,010 --> 01:01:54,670 dus hij weet dat honderden mensen zijn dit nu kijken al jaren. 1006 01:01:54,670 --> 01:01:59,500 Maar Sean heeft een geweldige job - of had hij -? Op het daadwerkelijk vinden van een bepaald nummer. 1007 01:01:59,500 --> 01:02:04,570 >> Dus laten we eens kijken hoe hij dit algoritme opgelost, zodat we dit gesprek te hervatten het duurde niet lang 1008 01:02:04,570 --> 01:02:08,300 van hoe we dingen vinden efficiënt. 1009 01:02:08,300 --> 01:02:12,300 [Malan op video] Ik heb verborgen achter deze deuren de nummer 7, 1010 01:02:12,300 --> 01:02:16,710 maar weggestopt in een aantal van deze deuren en de overige niet-negatieve getallen, 1011 01:02:16,710 --> 01:02:19,980 en je doel is om van deze bovenste rij van getallen zien als gewoon een array 1012 01:02:19,980 --> 01:02:22,920 of gewoon een reeks papiertjes met cijfers achter hen 1013 01:02:22,920 --> 01:02:26,960 en je doel is, alleen met behulp van de bovenste rij hier, vind ik het nummer 7. 1014 01:02:26,960 --> 01:02:30,800 En we worden dan gaan kritiek hoe je over te doen. >> Oke. 1015 01:02:30,800 --> 01:02:33,880 [Malan] Vind ons de nummer 7, alsjeblieft. 1016 01:02:36,210 --> 01:02:38,350 [Gelach] 1017 01:02:41,610 --> 01:02:44,460 [Malan] nr. [gelach] 1018 01:02:45,760 --> 01:02:58,080 5, 19, 13, [gelach]. Het is geen strikvraag. 1019 01:03:00,560 --> 01:03:02,390 1. 1020 01:03:04,560 --> 01:03:06,910 [Gelach] 1021 01:03:06,910 --> 01:03:10,760 Op dit punt je score is niet erg goed, dus je kan net zo goed blijven gaan. [Gelach] 1022 01:03:12,490 --> 01:03:14,070 3. 1023 01:03:17,340 --> 01:03:23,480 Ga door. Eerlijk gezegd, ik kan het niet helpen, maar vraag me af wat je nog denkt over. [Gelach] 1024 01:03:25,010 --> 01:03:28,870 Alleen de bovenste rij, dus je hebt 3 links. Dus vind ik 7. 1025 01:03:28,870 --> 01:03:45,360 [Studenten murmelende] 1026 01:03:46,270 --> 01:03:49,870 [Malan] 17. 1027 01:03:49,870 --> 01:03:55,460 [Studenten murmelende] 1028 01:03:56,920 --> 01:04:01,550 [Malan] 7! [Applaus] 1029 01:04:01,550 --> 01:04:06,080 >> Dus op woensdag zullen we duiken in dit en meer geavanceerde algoritmen voor het vinden van dingen. 1030 01:04:06,080 --> 01:04:10,200 Voor nu zullen we laten je met Sean en tot ziens op woensdag. 1031 01:04:11,280 --> 01:04:13,000 [CS50.TV]