1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> David Malan: Alle reg, welkom terug. 3 00:00:12,580 --> 00:00:13,290 Dit is CS50. 4 00:00:13,290 --> 00:00:15,130 Dit is die begin van die week sewe. 5 00:00:15,130 --> 00:00:18,890 So dit was 'n rukkie, so het ek gedink ons ​​wil neem 'n warrelwind-toer waar ons 6 00:00:18,890 --> 00:00:20,760 opgehou het en waar ons nou gaan. 7 00:00:20,760 --> 00:00:23,310 >> So hierdie ding hier kan hê veroorsaak dat sommige angs by die eerste. 8 00:00:23,310 --> 00:00:27,680 Maar hopelik, jy begin om te acclimatiseren wat hierdie dui hier - 9 00:00:27,680 --> 00:00:32,670 ster wat 'n wyser, wat net wat, in meer leketaal? 10 00:00:32,670 --> 00:00:33,400 So dit is 'n adres. 11 00:00:33,400 --> 00:00:35,490 >> So dit is die adres van iets in die geheue. 12 00:00:35,490 --> 00:00:38,260 En ons het begin om te skil terug die lae 'n Paar weke gelede het dinge soos 13 00:00:38,260 --> 00:00:41,800 GetString en ander sulke funksies al hierdie tyd is terug 14 00:00:41,800 --> 00:00:46,010 adresse van die dinge wat in die geheue, soos die adres van die eerste karakter in 15 00:00:46,010 --> 00:00:46,990 'n ry. 16 00:00:46,990 --> 00:00:50,360 >> So het ons ook bekendgestel valgrind, wat jy begin om te gebruik vir hierdie probleem 17 00:00:50,360 --> 00:00:53,380 stel, veral vir die volgende probleem stel as well. 18 00:00:53,380 --> 00:00:54,980 En valgrind doen wat vir ons? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Dit gaan vir die geheue lekkasies, en dit ook tjeks vir die misbruik van die geheue. 21 00:01:01,020 --> 00:01:05,890 >> Dit kan met 'n paar waarskynlikheid, spoor indien jou kode gaan geheue te raak 22 00:01:05,890 --> 00:01:07,100 dat dit moet net nie. 23 00:01:07,100 --> 00:01:10,410 So nie noodwendig 'n lek, maar as jy gaan verder as die grense van 'n paar 24 00:01:10,410 --> 00:01:14,730 skikking, en jy eintlik loop valgrind en veroorsaak dat die gedrag terwyl 25 00:01:14,730 --> 00:01:17,870 valgrind loop in jou program is hardloop binnekant van dit, sal jy 26 00:01:17,870 --> 00:01:21,460 boodskappe soos hierdie - "ongeldig skryf van grootte 4, "wat herinner aan 'n paar 27 00:01:21,460 --> 00:01:25,880 weke gelede het beteken dat ek per ongeluk gehad graag op een int te ver 28 00:01:25,880 --> 00:01:27,250 buite die grense van 'n skikking. 29 00:01:27,250 --> 00:01:30,790 En so groot 4 beteken hier om die grootte van daardie spesifieke int. 30 00:01:30,790 --> 00:01:35,260 >> So neem gerusstelling in die feit dat valgrind se uitset, die formaat daarvan, 31 00:01:35,260 --> 00:01:36,170 is net gruwelike. 32 00:01:36,170 --> 00:01:40,180 Dit is regtig moeilik om te sien deur middel van die gemors vir die interessante inligting. 33 00:01:40,180 --> 00:01:42,910 So wat ons hier gedoen het, is net uittreksel 'n paar van die paar meer 34 00:01:42,910 --> 00:01:43,850 interessante lyne. 35 00:01:43,850 --> 00:01:46,760 Maar besef dat 80% van valgrind se uitset gaan 'n bietjie van 'n wees 36 00:01:46,760 --> 00:01:47,650 afleiding. 37 00:01:47,650 --> 00:01:52,820 >> Kyk net vir patrone soos hierdie - ongeldig reg, ongeldig te lees, 40 grepe 38 00:01:52,820 --> 00:01:56,690 en 'n paar aantal blokke is beslis verloor het, sleutelwoorde soos dit. 39 00:01:56,690 --> 00:02:01,920 En wat jy sal hopelik sien, is 'n paar soort spoor van wat die funksie 40 00:02:01,920 --> 00:02:03,340 fout is eintlik in 41 00:02:03,340 --> 00:02:07,195 In hierdie geval is hier, in watter lyn van my-kode was die fout glo? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 in 'n lêer genaamd memory.c, wat die voorbeeld wat ons speel met 44 00:02:14,130 --> 00:02:14,890 in die tyd. 45 00:02:14,890 --> 00:02:16,460 So is dit waarskynlik nie in malloc. 46 00:02:16,460 --> 00:02:18,630 Dit was waarskynlik in my kode plaas. 47 00:02:18,630 --> 00:02:20,910 So ons sal sien dit weer en weer voor lank. 48 00:02:20,910 --> 00:02:24,080 >> So Wikipediabespreking, dit het in 'n paar vorms tot dusver. 49 00:02:24,080 --> 00:02:26,410 Ons het gesien sscanf kortliks. 50 00:02:26,410 --> 00:02:28,330 Dit was iets wat 'n aantal jy duik in in jou 51 00:02:28,330 --> 00:02:29,535 voorbereidings vir die toets. 52 00:02:29,535 --> 00:02:33,130 En Wikipediabespreking is eintlik wat die CS50 Biblioteek se al met behulp van onder die 53 00:02:33,130 --> 00:02:36,560 kap vir 'n geruime tyd in orde insette te kry van die gebruiker. 54 00:02:36,560 --> 00:02:40,420 >> Byvoorbeeld, as ek oorskuif na die CS50 toestel hier, laat my oop te maak 'n 55 00:02:40,420 --> 00:02:45,315 byvoorbeeld vandag dat is genoem Wikipediabespreking-0.C En dit is super eenvoudig. 56 00:02:45,315 --> 00:02:46,590 Dit is net 'n paar reëls van die kode. 57 00:02:46,590 --> 00:02:50,880 Maar dit bewys regtig hoe getint is besig om al hierdie tyd. 58 00:02:50,880 --> 00:02:54,710 >> In hierdie program hier, in lyn 16 , Kennis dat ek verklaar 'n int. 59 00:02:54,710 --> 00:02:57,270 Sodat daar geen wysers, niks magies is daar net 'n int. 60 00:02:57,270 --> 00:03:00,330 Dan in lyn 17, het ek gevra om die gebruiker vir 'n aantal, asseblief. 61 00:03:00,330 --> 00:03:02,930 Toe ek in die laat 18, ek gebruik Wikipediabespreking hier. 62 00:03:02,930 --> 00:03:06,910 En ek verskaf, soort van soos printf, wat verwag ek quote 63 00:03:06,910 --> 00:03:08,110 unquote persent i. 64 00:03:08,110 --> 00:03:10,920 >> So persent i, natuurlik, dui op 'n int. 65 00:03:10,920 --> 00:03:14,580 Maar let op wat die tweede argument te Wikipediabespreking is. 66 00:03:14,580 --> 00:03:17,350 Hoe sou jy die tweede argument na die komma? 67 00:03:17,350 --> 00:03:19,450 Wat is dit? 68 00:03:19,450 --> 00:03:20,670 >> Dit is die adres van x. 69 00:03:20,670 --> 00:03:25,490 So, dit is nuttig, want deur die verskaffing Wikipediabespreking met die adres van x, wat beteken 70 00:03:25,490 --> 00:03:29,560 wat bemagtig daardie funksie te doen? 71 00:03:29,560 --> 00:03:33,010 Nie net daar gaan nie, maar ook doen wat? 72 00:03:33,010 --> 00:03:34,060 >> Maak 'n verandering om dit te. 73 00:03:34,060 --> 00:03:38,080 Want jy kan daar gaan, is dit soort van soos 'n kaart na 'n plek in die geheue. 74 00:03:38,080 --> 00:03:41,900 En so lank as wat jy voorsien Wikipediabespreking, of enige funksie met so 'n kaart, wat 75 00:03:41,900 --> 00:03:45,840 funksie kan daarheen te gaan, en nie net kyk na die waarde, maar dit kan ook 76 00:03:45,840 --> 00:03:49,670 verander dat die waarde, wat nuttig is wanneer die doel in die lewe van Wikipediabespreking is om te 77 00:03:49,670 --> 00:03:53,060 scan insette van die gebruiker, spesifiek vanaf die sleutelbord. 78 00:03:53,060 --> 00:03:57,830 En die f dui formaat, net soos printf, die f dui op 'n formaat 79 00:03:57,830 --> 00:03:58,930 string wat jy wil druk. 80 00:03:58,930 --> 00:04:04,430 >> Dus, in kort, hierdie lyn 18 net sê, probeer om 'n int van die gebruiker se te lees 81 00:04:04,430 --> 00:04:10,420 sleutelbord en stoor dit binnekant van x, by alles adres x gebeur om te lewe op. 82 00:04:10,420 --> 00:04:14,860 En dan laastens, lyn 19 net sê, Dankie vir die int, in hierdie geval. 83 00:04:14,860 --> 00:04:15,940 >> So laat my gaan voort en maak dit. 84 00:04:15,940 --> 00:04:18,570 So maak Wikipediabespreking 0. 85 00:04:18,570 --> 00:04:20,130 Laat my gaan voort en zoom in 86 00:04:20,130 --> 00:04:22,960 Ek sal gaan en uit te voer dit met kolle streep Wikipediabespreking 0. 87 00:04:22,960 --> 00:04:24,020 Nommer, asseblief? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Dankie vir die 50. 90 00:04:25,730 --> 00:04:27,270 So dit is baie eenvoudig. 91 00:04:27,270 --> 00:04:28,160 >> Nou wat is dit nie te doen? 92 00:04:28,160 --> 00:04:29,940 Dit is nie besig met 'n hele klomp foutkontroles. 93 00:04:29,940 --> 00:04:33,000 Byvoorbeeld, as ek saam nie, en ek tik nie in 'n nommer, maar 94 00:04:33,000 --> 00:04:37,860 plaas ek skryf iets soos "Hallo," dit is net 'n soort van die vreemde. 95 00:04:37,860 --> 00:04:41,130 En so het een van die dinge wat die CS50 biblioteek is vir ons doen vir 'n paar 96 00:04:41,130 --> 00:04:43,440 tyd is dat reprompting en reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Die weer probeer frase herroep was in cs50.c, en dit is die rede dat getint in 98 00:04:49,320 --> 00:04:51,670 die CS50 biblioteek is eintlik 'n hele n klomp van die lyne lank nie, want ons is 99 00:04:51,670 --> 00:04:53,190 kontrole vir dom dinge soos hierdie. 100 00:04:53,190 --> 00:04:55,730 Het die gebruiker nie gee nie ons, in werklikheid, 'n int? 101 00:04:55,730 --> 00:04:57,910 Het hy of sy gee vir ons iets soos 'n alfabetiese brief? 102 00:04:57,910 --> 00:05:01,410 As dit so is, wil ons op te spoor dat en gil op hulle. 103 00:05:01,410 --> 00:05:03,915 >> Maar dinge meer interessant in die volgende voorbeeld. 104 00:05:03,915 --> 00:05:09,840 As ek gaan na Wikipediabespreking-1.c, wat is die een ding wat fundamenteel verander in 105 00:05:09,840 --> 00:05:11,135 die volgende voorbeeld? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Ek gebruik char *, natuurlik, in plaas van int. 108 00:05:16,010 --> 00:05:19,210 >> So, dit is interessant, want char *, onthou, is eintlik net die 109 00:05:19,210 --> 00:05:20,190 dieselfde ding as string. 110 00:05:20,190 --> 00:05:23,840 So dit voel miskien is dit 'n super eenvoudige implementering van GetString. 111 00:05:23,840 --> 00:05:26,010 Maar ek het geskil terug die laag van die CS50 biblioteek, so ek is 112 00:05:26,010 --> 00:05:27,550 noem hierdie char * nou. 113 00:05:27,550 --> 00:05:30,070 So laat ons sien waar, indien enige plek, ons verkeerd gaan. 114 00:05:30,070 --> 00:05:30,840 >> Line 17 - 115 00:05:30,840 --> 00:05:33,950 Ek sê weer, gee asseblief vir my iets, in hierdie geval, 'n string. 116 00:05:33,950 --> 00:05:37,940 En dan in die volgende lyn, ek noem Wikipediabespreking, weer, gee dit 'n formaat kode, 117 00:05:37,940 --> 00:05:39,310 maar hierdie keer persent s. 118 00:05:39,310 --> 00:05:41,900 En dan is dit tyd, ek is gee dit buffer. 119 00:05:41,900 --> 00:05:43,550 >> Nou sien, ek is nie die gebruik van die ampersand. 120 00:05:43,550 --> 00:05:47,120 Maar hoekom is dit waarskynlik OK hier? 121 00:05:47,120 --> 00:05:49,760 Want wat is buffer reeds? 122 00:05:49,760 --> 00:05:50,770 Dit is reeds 'n wyser. 123 00:05:50,770 --> 00:05:51,650 Dit is reeds 'n adres. 124 00:05:51,650 --> 00:05:54,510 >> En laat ons die woord "verwar," laat my noem dit net s, byvoorbeeld, vir 125 00:05:54,510 --> 00:05:55,050 eenvoud. 126 00:05:55,050 --> 00:05:58,250 Maar ek het dit genoem buffer, want in algemeen in programme, as jy 'n 127 00:05:58,250 --> 00:06:02,130 stuk van die geheue, wat 'n string regtig net is, kan jy noem dit 'n buffer. 128 00:06:02,130 --> 00:06:04,460 Dit is 'n plek om inligting te stoor. 129 00:06:04,460 --> 00:06:07,400 >> Soortgelyk aan dinge soos YouTube, wanneer hulle buffer, om so te praat, wat 130 00:06:07,400 --> 00:06:10,270 beteken net dit stukkies is die aflaai van die internet en stoor dit in 'n 131 00:06:10,270 --> 00:06:14,160 plaaslike skikking, 'n plaaslike stuk van die geheue, sodat wat jy kan kyk hoe dit later sonder 132 00:06:14,160 --> 00:06:16,830 dit draai of hang op jy, terwyl speel terug. 133 00:06:16,830 --> 00:06:20,930 >> So is daar 'n probleem hier al is, want ek sê vir Wikipediabespreking, verwag 'n 134 00:06:20,930 --> 00:06:22,320 string van die gebruiker. 135 00:06:22,320 --> 00:06:24,410 Hier is die adres van 'n stuk van die geheue. 136 00:06:24,410 --> 00:06:26,180 Sit dit string daar. 137 00:06:26,180 --> 00:06:31,230 Hoekom is dit gebonde gee ons moeilikheid, al is? 138 00:06:31,230 --> 00:06:33,490 >> Wat is dit? 139 00:06:33,490 --> 00:06:35,510 Ek is toegelaat om toegang te verkry dat 'n deel van die geheue? 140 00:06:35,510 --> 00:06:36,250 Jy weet, ek weet nie. 141 00:06:36,250 --> 00:06:39,210 Omdat het buffer geïnisialiseer na iets? 142 00:06:39,210 --> 00:06:39,820 Nie regtig nie. 143 00:06:39,820 --> 00:06:43,090 En so het dit is wat ons het 'n beroep 'n gemors waarde, wat 144 00:06:43,090 --> 00:06:44,040 is nie 'n formele woord. 145 00:06:44,040 --> 00:06:49,200 Dit beteken net ons het nie 'n idee wat stukkies is binnekant van die vier grepe 146 00:06:49,200 --> 00:06:51,240 Ek het toegeken as buffer. 147 00:06:51,240 --> 00:06:52,450 >> Ek het nie geroep malloc. 148 00:06:52,450 --> 00:06:53,940 Ek het beslis nie genoem GetString. 149 00:06:53,940 --> 00:06:56,380 So wie weet wat is eintlik binnekant van buffer? 150 00:06:56,380 --> 00:07:00,550 En tog vertel Wikipediabespreking blindelings, daar gaan en sit alles wat die gebruiker getik. 151 00:07:00,550 --> 00:07:04,460 >> So, wat is geneig om te veroorsaak in ons kode as ons loop dit? 152 00:07:04,460 --> 00:07:05,700 Waarskynlik 'n segfault. 153 00:07:05,700 --> 00:07:07,970 Miskien nie, maar waarskynlik 'n segfault. 154 00:07:07,970 --> 00:07:10,620 En ek sê miskien nie want soms jy dit doen, soms 155 00:07:10,620 --> 00:07:11,380 jy kry nie 'n segfault. 156 00:07:11,380 --> 00:07:14,280 Soms kry jy net gelukkig is, maar dit is tog gaan wees 157 00:07:14,280 --> 00:07:15,340 'n fout in die program. 158 00:07:15,340 --> 00:07:17,060 >> So laat my gaan voort en stel hierdie. 159 00:07:17,060 --> 00:07:18,280 Ek gaan om dit te doen die ou skool manier. 160 00:07:18,280 --> 00:07:23,825 So klang stamp 0, Wikipediabespreking-1, Wikipediabespreking-1.c, Tik. 161 00:07:23,825 --> 00:07:24,720 Oeps, te oud skool. 162 00:07:24,720 --> 00:07:26,550 Kom ons kyk. 163 00:07:26,550 --> 00:07:28,440 Waar het ek gaan? 164 00:07:28,440 --> 00:07:29,700 O, char * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Ag, dankie - 167 00:07:35,130 --> 00:07:36,930 Red, OK - 168 00:07:36,930 --> 00:07:37,690 baie ou skool. 169 00:07:37,690 --> 00:07:38,900 Alle reg, dit was 'n ruk. 170 00:07:38,900 --> 00:07:41,720 >> So ek het net die lêer gestoor na maak dat tydelike 171 00:07:41,720 --> 00:07:42,700 verander 'n oomblik gelede. 172 00:07:42,700 --> 00:07:46,090 En nou het Ek dit saamgestel hand met klang. 173 00:07:46,090 --> 00:07:49,500 En nou is ek gaan om voort te gaan en hardloop Wikipediabespreking-1, Tik. 174 00:07:49,500 --> 00:07:50,290 String asseblief. 175 00:07:50,290 --> 00:07:51,600 Ek sal tik in "hallo." 176 00:07:51,600 --> 00:07:54,070 >> En nou, hier is waar, eerlik, printf kan 'n bietjie irriterend. 177 00:07:54,070 --> 00:07:56,020 Dit is eintlik nie van plan om segfault in hierdie geval. 178 00:07:56,020 --> 00:07:59,860 Printf is 'n bietjie spesiale want dit is so super algemeen gebruik word wat 179 00:07:59,860 --> 00:08:03,570 wese printf doen ons 'n guns en besef, 180 00:08:03,570 --> 00:08:04,830 dit is nie 'n geldige wyser. 181 00:08:04,830 --> 00:08:09,080 Laat my toe om dit op myself om net te druk in hakies nul, selfs 182 00:08:09,080 --> 00:08:13,340 al is dit nie noodwendig wat ons onsself verwag. 183 00:08:13,340 --> 00:08:16,940 >> So kan ons regtig nie maklik oorreed om 'n segfault met hierdie, maar dit is duidelik hierdie 184 00:08:16,940 --> 00:08:18,600 is nie die gedrag wat ek wou hê. 185 00:08:18,600 --> 00:08:19,800 So, wat is die eenvoudige oplossing? 186 00:08:19,800 --> 00:08:25,650 Wel, in Wikipediabespreking-2, laat my stel voor dat in plaas van werklik net die toekenning van 'n 187 00:08:25,650 --> 00:08:30,100 char *, laat my 'n bietjie slimmer oor hierdie, en laat my buffer toeken 188 00:08:30,100 --> 00:08:32,940 as 'n reeks van 16 karakters. 189 00:08:32,940 --> 00:08:34,200 >> So ek kan dit doen in 'n paar maniere. 190 00:08:34,200 --> 00:08:35,610 Ek kan absoluut gebruik malloc. 191 00:08:35,610 --> 00:08:38,980 Maar ek kan terug gaan na week twee wanneer Ek het net nodig om 'n hele klomp van die 192 00:08:38,980 --> 00:08:39,620 karakters. 193 00:08:39,620 --> 00:08:40,860 Dit is net 'n skikking. 194 00:08:40,860 --> 00:08:44,870 So laat my plaas herdefinieer buffer om 'n skikking van 16 karakters. 195 00:08:44,870 --> 00:08:47,340 >> En nou, toe ek slaag buffer in - 196 00:08:47,340 --> 00:08:49,940 en dit is iets wat ons nie praat in week twee - 197 00:08:49,940 --> 00:08:53,730 maar jy kan hanteer 'n verskeidenheid as al is dit 'n adres. 198 00:08:53,730 --> 00:08:56,390 Tegnies, soos ons gesien het, hulle is 'n bietjie anders. 199 00:08:56,390 --> 00:09:01,290 Maar Wikipediabespreking sal nie omgee as jy verby dit die naam van 'n skikking, want wat 200 00:09:01,290 --> 00:09:05,030 Klang sal vir ons kan doen is in wese behandel die naam van die skikking as die 201 00:09:05,030 --> 00:09:08,280 adres van die stuk van 16 grepe. 202 00:09:08,280 --> 00:09:09,550 >> So dit is beter. 203 00:09:09,550 --> 00:09:12,110 Dit beteken nou dat ek kan hopelik doen die volgende. 204 00:09:12,110 --> 00:09:16,800 Laat my zoom uit vir 'n oomblik en doen maak Wikipediabespreking-2, saamgestel OK. 205 00:09:16,800 --> 00:09:19,390 Nou laat my streep Wikipediabespreking-2 doen gekry het. 206 00:09:19,390 --> 00:09:22,430 String asseblief. "Hello." En dit was dit tyd om te werk. 207 00:09:22,430 --> 00:09:26,020 >> Maar kan iemand stel 'n scenario waarin dit kan nog steeds nie werk nie? 208 00:09:26,020 --> 00:09:28,550 Ja? 209 00:09:28,550 --> 00:09:30,640 Iets meer as 16 karakters. 210 00:09:30,640 --> 00:09:32,020 En eintlik, kan ons 'n bietjie meer presies. 211 00:09:32,020 --> 00:09:36,540 Iets meer as 15 karakters, want regtig ons moet in gedagte hou 212 00:09:36,540 --> 00:09:39,920 dat ons moet besef dat agteroorskuisstreep nul implisiet aan die einde van die tou, 213 00:09:39,920 --> 00:09:42,950 Dit is 'n eenkant Wikipediabespreking tipies sorg vir ons. 214 00:09:42,950 --> 00:09:46,210 >> So laat my so iets doen - 215 00:09:46,210 --> 00:09:48,040 Soms kan ons net laat dit soos dit. 216 00:09:48,040 --> 00:09:50,630 OK, so ons het nou veroorsaak ons segmentering skuld. 217 00:09:50,630 --> 00:09:51,000 Hoekom? 218 00:09:51,000 --> 00:09:54,940 Omdat ek getik tot meer as 15 karakters, en so het ons het eintlik 219 00:09:54,940 --> 00:09:58,280 aangeraak geheue dat ek eintlik moet nie. 220 00:09:58,280 --> 00:10:00,180 >> So, wat is regtig die oplossing hier? 221 00:10:00,180 --> 00:10:02,210 Wel, wat as ons het 'n langer tou? 222 00:10:02,210 --> 00:10:03,960 Wel, ons het miskien maak dit 32 grepe. 223 00:10:03,960 --> 00:10:05,160 Wel, wat as dit is nie lank genoeg? 224 00:10:05,160 --> 00:10:06,040 Hoe oor 64 grepe? 225 00:10:06,040 --> 00:10:07,080 Wat as dit is nie lank genoeg? 226 00:10:07,080 --> 00:10:09,640 Hoe oor die 128 of 200 grepe? 227 00:10:09,640 --> 00:10:12,660 Wat is werklik die oplossing hier in die algemene geval, as ons nie weet in 228 00:10:12,660 --> 00:10:14,460 bevorder wat die gebruiker gaan om te tik? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Dit is net 'n soort van 'n groot pyn in die gat, om eerlik te wees, wat is die rede waarom die 231 00:10:23,050 --> 00:10:29,050 CS50 biblioteek het 'n paar dosyn lyne van kode wat gesamentlik implementeer 232 00:10:29,050 --> 00:10:32,390 GetString string in 'n manier wat ons nie doen nie het om vooraf te weet wat die 233 00:10:32,390 --> 00:10:33,430 gebruiker gaan tik. 234 00:10:33,430 --> 00:10:37,370 In die besonder, as jy kyk terug op cs50.c van twee weke gelede, sal jy sien 235 00:10:37,370 --> 00:10:40,480 dat GetString nie eintlik gebruik nie Wikipediabespreking op hierdie manier. 236 00:10:40,480 --> 00:10:43,720 Inteendeel, dit lees een karakter op 'n tyd. 237 00:10:43,720 --> 00:10:46,010 >> Omdat die een nice ding oor lees 'n karakter is wat ons kan 238 00:10:46,010 --> 00:10:48,490 waarborg ons altyd ten minste een kar. 239 00:10:48,490 --> 00:10:51,740 Ek kan net verklaar dat 'n kar, en dan neem hierdie werklik baba stappe om net 240 00:10:51,740 --> 00:10:54,380 lees 'n karakter in 'n tyd vanaf die sleutelbord. 241 00:10:54,380 --> 00:10:58,240 En dan, wat jy sal sien GetString doen, is om elke keer as dit loop uit, 242 00:10:58,240 --> 00:11:02,280 sê, 16 grepe van die geheue, is dit gebruik malloc, of 'n neef daarvan, te 243 00:11:02,280 --> 00:11:06,810 ken meer geheue, die kopiëring van die ou geheue in die nuwe, en dan kruip 244 00:11:06,810 --> 00:11:09,900 saam, om een ​​karakter op 'n tyd, en wanneer dit loop uit van daardie 245 00:11:09,900 --> 00:11:13,370 stuk van die geheue, gooi dit weg, spel 'n groter deel van die geheue, afskrifte van ou 246 00:11:13,370 --> 00:11:14,750 in 'n nuwe, en herhaal. 247 00:11:14,750 --> 00:11:18,480 En dit is werklik 'n pyn om werklik implementeer iets so eenvoudig soos 248 00:11:18,480 --> 00:11:19,710 om insette van 'n gebruiker. 249 00:11:19,710 --> 00:11:21,090 >> So jy kan gebruik Wikipediabespreking. 250 00:11:21,090 --> 00:11:22,430 Jy kan gebruik om ander soortgelyke funksies. 251 00:11:22,430 --> 00:11:25,420 En 'n baie handboeke en aanlyn voorbeelde te doen, maar hulle is almal 252 00:11:25,420 --> 00:11:27,210 kwesbaar vir probleme soos hierdie. 253 00:11:27,210 --> 00:11:29,550 En uiteindelik, kry 'n segfault is 'n soort van irriterende. 254 00:11:29,550 --> 00:11:30,680 Dit is nie goed vir die gebruiker. 255 00:11:30,680 --> 00:11:33,560 >> Maar in die ergste geval, doen wat dit fundamenteel sit jou 256 00:11:33,560 --> 00:11:37,160 kode aan die risiko van? 257 00:11:37,160 --> 00:11:39,250 'N soort van aanval, moontlik. 258 00:11:39,250 --> 00:11:41,680 Ons het gepraat oor een so 'n aanval - oorstroom die stapel. 259 00:11:41,680 --> 00:11:44,660 Maar in die algemeen, as jy toegelaat word om te oorloop 'n buffer, soos ons gedoen het 'n 260 00:11:44,660 --> 00:11:48,070 n paar weke gelede, met net skryf meer as "hallo" op die stapel, het jy 261 00:11:48,070 --> 00:11:52,330 kan inderdaad oor te neem, potensieel, 'n rekenaar, of ten minste kry op data wat 262 00:11:52,330 --> 00:11:53,510 behoort nie aan jou. 263 00:11:53,510 --> 00:11:55,970 >> Dus, in kort, dit is hoekom ons 'n die opleiding wiele. 264 00:11:55,970 --> 00:11:59,090 Maar nou, het ons begin om hulle af te neem, as ons programme nie meer nodig het nie, 265 00:11:59,090 --> 00:12:00,610 noodwendig nie, die insette van die gebruiker. 266 00:12:00,610 --> 00:12:03,960 Maar in die geval van die probleem wat ses, jou insette sal kom uit 'n groot 267 00:12:03,960 --> 00:12:07,520 woordeboek lêer met 150 paar vreemd duisend woorde. 268 00:12:07,520 --> 00:12:10,330 >> So sal jy nie hoef te bekommer oor die gebruiker se arbitrêre insette. 269 00:12:10,330 --> 00:12:13,720 Ons sal jou 'n paar aannames oor die lêer. 270 00:12:13,720 --> 00:12:20,340 Enige vrae oor verwysings of Wikipediabespreking of toevoer van die gebruiker in die algemeen? 271 00:12:20,340 --> 00:12:24,450 >> Alle reg, so 'n vinnige kyk dan op 'n sleep onderwerp van twee weke gelede. 272 00:12:24,450 --> 00:12:28,590 En dit was die idee van 'n struct. 273 00:12:28,590 --> 00:12:34,180 Nie dat - die idee van 'n struct, wat was wat? 274 00:12:34,180 --> 00:12:35,430 Wat het struct vir ons kan doen? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definieer - 277 00:12:39,860 --> 00:12:41,710 jammer? 278 00:12:41,710 --> 00:12:42,820 Definieer 'n veranderlike tipe. 279 00:12:42,820 --> 00:12:44,410 So soort van. 280 00:12:44,410 --> 00:12:46,180 Ons is eintlik die kombinasie van twee onderwerpe. 281 00:12:46,180 --> 00:12:49,510 So met typedef, onthou dat ons kan verklaar 'n tipe van ons eie, soos 'n 282 00:12:49,510 --> 00:12:51,500 sinoniem, soos string vir char *. 283 00:12:51,500 --> 00:12:56,200 Maar met behulp van typedef en struct, kan ons skep werklik ons ​​eie data strukture. 284 00:12:56,200 --> 00:12:59,600 >> Byvoorbeeld, as ek gaan terug na gedit hier vir 'n oomblik, en ek gaan voort 285 00:12:59,600 --> 00:13:08,230 en iets te doen, laat my red hierdie as, kom ons sê, structs.c 286 00:13:08,230 --> 00:13:10,840 tydelik, is ek net gaan om voort te gaan en sluit 287 00:13:10,840 --> 00:13:14,360 standardio.h, int main nietig. 288 00:13:14,360 --> 00:13:18,960 En dan in hier, veronderstel dat ek wil hê 'n program wat winkels te skryf 289 00:13:18,960 --> 00:13:21,840 meer studente uit verskeie huise, byvoorbeeld. 290 00:13:21,840 --> 00:13:24,430 So dit is soos 'n registrarial databasis van 'n soort. 291 00:13:24,430 --> 00:13:29,550 >> So as ek nodig het om die naam een ​​student, het ek kon doen nie iets soos char * naam, 292 00:13:29,550 --> 00:13:31,570 en ek sal so iets doen - 293 00:13:31,570 --> 00:13:34,410 eintlik, laat ons gebruik maak van die CS50 biblioteek vir net 'n oomblik dit 'n te maak 294 00:13:34,410 --> 00:13:38,380 bietjie eenvoudiger, sodat ons kan leen diegene dekades van reëls van die kode. 295 00:13:38,380 --> 00:13:39,340 En laat ons net hou dit eenvoudig. 296 00:13:39,340 --> 00:13:42,610 Ons sal dit string hou, en nou GetString. 297 00:13:42,610 --> 00:13:47,420 >> So ek eis nou dat ek die naam het gestoor van 'n paar student, en die huis van 298 00:13:47,420 --> 00:13:50,240 'n student, net die gebruik van veranderlikes soos ons gedoen het en in een week. 299 00:13:50,240 --> 00:13:52,370 Maar dink ek nou wil ondersteun veelvuldige studente. 300 00:13:52,370 --> 00:13:58,460 Alle reg, sodat my instink is om te doen string NAME2 kry GetString, string 301 00:13:58,460 --> 00:14:01,370 house2 kry GetString. 302 00:14:01,370 --> 00:14:05,850 En dan is ons derde student, Kom ons doen name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Alle reg, so hierdie is hopelik treffende jy as soort van dom, 304 00:14:09,170 --> 00:14:11,580 Omdat hierdie proses is nog nooit werklik gaan eindig, en dit is net gaan om te 305 00:14:11,580 --> 00:14:13,130 maak my kode lyk erger en erger en erger. 306 00:14:13,130 --> 00:14:14,810 Maar ons opgelos dit ook in week twee. 307 00:14:14,810 --> 00:14:19,450 Wat was ons relatief skoon oplossing toe ons moes verskeie veranderlikes van die 308 00:14:19,450 --> 00:14:23,580 dieselfde data tipe wat almal verband hou, maar Ons wou nie hierdie gruwelike gemors 309 00:14:23,580 --> 00:14:26,870 van die gelyknamige veranderlikes? 310 00:14:26,870 --> 00:14:30,060 Wat het ons gedoen plaas? 311 00:14:30,060 --> 00:14:31,260 >> So ek dink ek het 'n paar plekke. 312 00:14:31,260 --> 00:14:32,590 Ons het 'n skikking. 313 00:14:32,590 --> 00:14:37,110 As jy wil verskeie gevalle van iets, waarom nie ons skoon te maak dit alles 314 00:14:37,110 --> 00:14:39,540 en net sê, gee my verskeidenheid name genoem? 315 00:14:39,540 --> 00:14:41,640 >> En vir nou, laat ons hard kode 3. 316 00:14:41,640 --> 00:14:44,450 En dan gee my 'n skikking om genoem huise, en laat my vir 317 00:14:44,450 --> 00:14:45,800 nou hard kode 3. 318 00:14:45,800 --> 00:14:49,220 En ek het op groot skaal skoongemaak die gemors wat ek nou net gemaak het. 319 00:14:49,220 --> 00:14:52,400 Nou, ek het nog steeds hard gekodeer 3, maar selfs die 3 kan dinamiese kom uit die 320 00:14:52,400 --> 00:14:54,350 gebruiker, of bevat SPASIES, of die wil. 321 00:14:54,350 --> 00:14:55,720 So dit is reeds skoner. 322 00:14:55,720 --> 00:15:00,100 >> Maar wat is irriterend oor hierdie is dat Nou, selfs al is 'n naam is een of ander manier 323 00:15:00,100 --> 00:15:02,280 fundamenteel gekoppel aan 'n student se huis - 324 00:15:02,280 --> 00:15:04,720 dit is 'n student wat ek regtig wil stel - 325 00:15:04,720 --> 00:15:08,080 Ek het nou twee skikkings wat parallel in die sin dat hulle die 326 00:15:08,080 --> 00:15:13,930 dieselfde grootte, en name bracket 0 vermoedelik kaarte te huise bracket 0, 327 00:15:13,930 --> 00:15:16,600 en name bracket 1 kaarte om huise bracket 1. 328 00:15:16,600 --> 00:15:19,280 Met ander woorde, dat die student lewens in daardie huis, en dat ander student 329 00:15:19,280 --> 00:15:20,530 lewens in daardie ander huis. 330 00:15:20,530 --> 00:15:23,720 Maar seker dit kan wees gedoen word selfs meer skoon. 331 00:15:23,720 --> 00:15:24,990 >> Wel, kan dit, in werklikheid. 332 00:15:24,990 --> 00:15:28,730 En laat my gaan voort en oop up structs.h, en jy sal 333 00:15:28,730 --> 00:15:31,130 kyk na hierdie idee hier. 334 00:15:31,130 --> 00:15:34,905 Let daarop dat ek gebruik typedef, as jy verwys na 'n oomblik gelede te verklaar ons 335 00:15:34,905 --> 00:15:35,570 eie data tipe. 336 00:15:35,570 --> 00:15:39,660 Maar ek het ook die gebruik van hierdie ander navraag genoem struct wat gee my 'n nuwe 337 00:15:39,660 --> 00:15:40,790 data struktuur. 338 00:15:40,790 --> 00:15:43,980 >> En hierdie data struktuur Ek eis gaan twee dinge te hê binnekant van 339 00:15:43,980 --> 00:15:47,060 dit - 'n string genoem naam, en 'n string genoem huis. 340 00:15:47,060 --> 00:15:49,820 En die naam wat ek gaan gee om hierdie data struktuur gaan 341 00:15:49,820 --> 00:15:51,005 genoem te word student. 342 00:15:51,005 --> 00:15:54,030 Ek kon noem dit iets wat ek wil hê, maar dit semanties maak 343 00:15:54,030 --> 00:15:55,810 sin vir my in my gedagtes. 344 00:15:55,810 --> 00:15:59,160 >> So nou, as ek oop te maak 'n beter weergawe van die program het ek begin skryf 345 00:15:59,160 --> 00:16:00,390 daar is, laat my gaan na die top. 346 00:16:00,390 --> 00:16:03,190 En daar is 'n paar meer reëls van die kode hier, maar laat my fokus vir 347 00:16:03,190 --> 00:16:04,160 die oomblik op die een. 348 00:16:04,160 --> 00:16:07,790 Ek het verklaar dat 'n konstante sogenaamde studente en hard gekodeer 3 vir nou. 349 00:16:07,790 --> 00:16:11,110 Maar nou, let op hoe skoon my kode begin te kry. 350 00:16:11,110 --> 00:16:15,030 >> In lyn 22, verklaar ek skikking van die studente. 351 00:16:15,030 --> 00:16:18,760 En sien dat student is blykbaar nou 'n data tipe. 352 00:16:18,760 --> 00:16:23,360 Want op die top van hierdie lêer, let Ek het ingesluit dat die kop lêer 353 00:16:23,360 --> 00:16:24,820 dat ek opgetrek net 'n oomblik gelede. 354 00:16:24,820 --> 00:16:28,820 En dat header lêer eenvoudig moes hierdie definisie van 'n student. 355 00:16:28,820 --> 00:16:32,470 >> So nou, ek het my eie persoonlike data tipe wat die skrywers van C jaar 356 00:16:32,470 --> 00:16:33,890 gelede nie dink vooruit. 357 00:16:33,890 --> 00:16:34,570 Maar geen probleem nie. 358 00:16:34,570 --> 00:16:35,870 Ek kan dit self. 359 00:16:35,870 --> 00:16:39,050 So dit is 'n skikking met die naam studente, elk van wie se lede 360 00:16:39,050 --> 00:16:41,100 is 'n student struktuur. 361 00:16:41,100 --> 00:16:44,270 En ek wil drie van dié in die skikking. 362 00:16:44,270 --> 00:16:46,030 >> En nou, wat doen die res van hierdie program? 363 00:16:46,030 --> 00:16:47,550 Ek nodig het om iets 'n bietjie arbitrêr. 364 00:16:47,550 --> 00:16:51,450 So van online 24 af, Ek Itereer van 0 tot 3. 365 00:16:51,450 --> 00:16:54,000 Ek vra dan die gebruiker vir die student se naam. 366 00:16:54,000 --> 00:16:56,110 En dan gebruik ek GetString as tevore. 367 00:16:56,110 --> 00:16:59,410 Dan vra ek vir die student se huis, en ek gebruik GetString as tevore. 368 00:16:59,410 --> 00:17:01,780 >> Maar kennisgewing - effens nuwe stuk van sintaksis - 369 00:17:01,780 --> 00:17:07,010 Ek kan nog indeks tot die i-de student, Maar hoe kry ek by die spesifieke data 370 00:17:07,010 --> 00:17:08,354 gebied binnekant van die struct? 371 00:17:08,354 --> 00:17:11,770 Wel, wat is blykbaar die nuwe stuk van die sintaksis? 372 00:17:11,770 --> 00:17:13,339 Dis net die dot operateur. 373 00:17:13,339 --> 00:17:14,510 >> Ons het regtig nie gesien voor. 374 00:17:14,510 --> 00:17:17,819 Jy het gesien dat dit in pset vyf as jy het duik in reeds met bitmap lêers. 375 00:17:17,819 --> 00:17:22,372 Maar die dot beteken net binne hierdie struct of meer velde, gee dot 376 00:17:22,372 --> 00:17:24,510 naam, of gee my dot huis. 377 00:17:24,510 --> 00:17:28,690 Dit beteken gaan binnekant van die struct en kry die spesifieke velde. 378 00:17:28,690 --> 00:17:30,200 >> Wat beteken die res van hierdie program? 379 00:17:30,200 --> 00:17:31,190 Dit is nie al wat sexy. 380 00:17:31,190 --> 00:17:34,640 Let daarop dat ek Itereer van 0 tot 3 weer en ek het net skep 'n Engelse 381 00:17:34,640 --> 00:17:40,500 woorde soos so en so is in so 'en so 'n huis, verby in dot naam uit 382 00:17:40,500 --> 00:17:43,320 die i-de student en hul huis so goed. 383 00:17:43,320 --> 00:17:47,560 >> En dan laastens, nou gaan ons begin om te kry anale oor hierdie, nou dat ons 384 00:17:47,560 --> 00:17:49,580 vertroud is met wat malloc en ander funksies is 385 00:17:49,580 --> 00:17:50,570 doen al hierdie tyd. 386 00:17:50,570 --> 00:17:54,220 Hoekom het ek albei naam te bevry en die huis, selfs al het ek 387 00:17:54,220 --> 00:17:56,960 het nie bel malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString het. 389 00:17:58,020 --> 00:18:00,930 En dit was die vuil klein geheim 'n paar weke, maar GetString het 390 00:18:00,930 --> 00:18:03,530 is lekkende geheue oor die hele plaas al semester tot dusver. 391 00:18:03,530 --> 00:18:05,990 En valgrand sal uiteindelik openbaar dit aan ons. 392 00:18:05,990 --> 00:18:10,730 >> Maar dit is nie 'n groot deal, want ek weet dat ek kan eenvoudig bevry die naam 393 00:18:10,730 --> 00:18:15,750 en die huis, al is tegnies, te wees super, super veilig, sou ek wees 394 00:18:15,750 --> 00:18:17,890 doen 'n paar fout kontrole hier. 395 00:18:17,890 --> 00:18:19,040 Wat is jou instink wat jy vertel? 396 00:18:19,040 --> 00:18:22,480 Wat moet ek beheer word vir voordat ek bevry wat is 'n 397 00:18:22,480 --> 00:18:25,470 string, aka wat 'n kar *? 398 00:18:25,470 --> 00:18:33,460 >> Ek moet regtig beheer word indien die studente bracket i dot naam nie 399 00:18:33,460 --> 00:18:34,840 gelyk null. 400 00:18:34,840 --> 00:18:40,400 Dan sal dit OK om voort te gaan en gratis dat pointer, en dieselfde of die ander 401 00:18:40,400 --> 00:18:41,160 een so goed. 402 00:18:41,160 --> 00:18:46,860 Indien studente bracket i dot huis is nie gelyk aan nul, dit nou sal beskerm 403 00:18:46,860 --> 00:18:52,520 teen die hoek saak waarin GetString terug iets soos null. 404 00:18:52,520 --> 00:18:57,310 En ons het 'n oomblik gelede, printf sal beskerm ons hier by sê maar net 405 00:18:57,310 --> 00:18:58,990 nul, is wat gaan om te kyk vreemd. 406 00:18:58,990 --> 00:19:02,340 Maar ten minste sal dit nie segfault, soos ons gesien het. 407 00:19:02,340 --> 00:19:05,990 >> Wel, laat ek doen 'n ander ding hier. structs-0 is 'n soort van 'n stupid program 408 00:19:05,990 --> 00:19:09,700 omdat ek in al hierdie data, en dan dit verlore raak sodra die program eindig. 409 00:19:09,700 --> 00:19:10,940 Maar laat my gaan voort en doen dit. 410 00:19:10,940 --> 00:19:12,830 Laat my toe om die terminale venster 'n bietjie groter. 411 00:19:12,830 --> 00:19:17,000 Laat my toe om structs-1, wat is 'n nuwe weergawe van hierdie. 412 00:19:17,000 --> 00:19:18,520 >> Ek sal vergroot in 'n bietjie. 413 00:19:18,520 --> 00:19:21,620 En nou, laat ek hardloop dot streep structs-1. 414 00:19:21,620 --> 00:19:22,590 Student se naam - 415 00:19:22,590 --> 00:19:31,500 David Mather, laat ons doen Rob Kirkland, Kom ons doen Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Wat interessant is, is nou kennisgewing - 417 00:19:33,650 --> 00:19:35,540 en ek weet net dit, want Ek het die program - 418 00:19:35,540 --> 00:19:38,930 daar is 'n lêer nou op my huidige gids genoem students.csv. 419 00:19:38,930 --> 00:19:40,420 Sommige van julle mag dalk gesien het dit in die werklike wêreld. 420 00:19:40,420 --> 00:19:42,980 >> Wat is 'n CSV-lêer? 421 00:19:42,980 --> 00:19:44,170 Komma geskei waardes. 422 00:19:44,170 --> 00:19:46,670 Dit is soort van soos 'n arm man se weergawe van 'n Excel-lêer. 423 00:19:46,670 --> 00:19:50,580 Dit is 'n tafel van die rye en kolomme wat jy kan maak in 'n program soos Excel, 424 00:19:50,580 --> 00:19:51,800 of nommers op 'n Mac. 425 00:19:51,800 --> 00:19:55,180 >> En as ek dit oopmaak van die lêer hier op gedit, kennisgewing - en die nommers is nie daar nie. 426 00:19:55,180 --> 00:19:57,360 Dit is net gedit vertel my lyn nommers. 427 00:19:57,360 --> 00:19:59,740 Let op die eerste lyn van hierdie lêer is David en Mather. 428 00:19:59,740 --> 00:20:01,450 Die volgende reël is Rob komma Kirkland. 429 00:20:01,450 --> 00:20:04,170 En die derde lyn is Lauren komma Leverett. 430 00:20:04,170 --> 00:20:05,480 >> So wat het ek geskep het? 431 00:20:05,480 --> 00:20:09,580 Ek het nou geskryf het 'n C program wat effektief te kan genereer sigblaaie 432 00:20:09,580 --> 00:20:11,840 wat oopgemaak kan word in 'n program soos Excel. 433 00:20:11,840 --> 00:20:15,520 Nie alles wat dwingende 'n stel data, maar as jy het veel groter stukke 434 00:20:15,520 --> 00:20:18,440 data wat jy eintlik wil manipuleer en maak grafieke van en die 435 00:20:18,440 --> 00:20:21,260 hou nie, is dit dalk een manier waarop data te skep. 436 00:20:21,260 --> 00:20:25,370 Verder, CSVs is eintlik super algemene net vir die berging van eenvoudige data - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finansies, byvoorbeeld, as jy voorraadkwotasies via hul sogenaamde 438 00:20:28,940 --> 00:20:33,180 API, die gratis diens wat kan jy kry huidige up-to-die-date voorraad 439 00:20:33,180 --> 00:20:35,650 kwotasies vir maatskappye, het hulle gee die data terug in die 440 00:20:35,650 --> 00:20:37,800 super eenvoudige CSV formaat. 441 00:20:37,800 --> 00:20:39,380 >> So hoe het ons dit doen? 442 00:20:39,380 --> 00:20:42,530 Wel, sien, die meeste van hierdie program se byna dieselfde. 443 00:20:42,530 --> 00:20:46,870 Maar let hier, eerder as gedrukte die studente uit, on line 35 444 00:20:46,870 --> 00:20:51,040 af, ek beweer dat ek die is spaar studente te skyf, so spaar 'n lêer. 445 00:20:51,040 --> 00:20:53,630 >> So sien ek 'n lêer * is verklaar - 446 00:20:53,630 --> 00:20:57,260 Nou, dit is 'n soort van 'n anomalie in C. Vir watter rede ook al, lêer is al pette, 447 00:20:57,260 --> 00:21:00,690 Dit is nie soos die meeste ander data tipes in C. Maar dit is 'n ingeboude 448 00:21:00,690 --> 00:21:02,320 data tipe, lêer *. 449 00:21:02,320 --> 00:21:05,900 En ek verklaar 'n verwysing na 'n lêer, is hoe jy kan dink dat. 450 00:21:05,900 --> 00:21:08,070 >> fopen beteken oop lêer. 451 00:21:08,070 --> 00:21:09,470 Wat lêer wil jy oop te maak? 452 00:21:09,470 --> 00:21:12,620 Ek wil 'n lêer oop te maak wat ek wil arbitrêr noem students.csv. 453 00:21:12,620 --> 00:21:14,480 Ek kan noem dat enigiets wat ek wil. 454 00:21:14,480 --> 00:21:15,200 >> En dan 'n raaiskoot. 455 00:21:15,200 --> 00:21:18,960 Wat beteken die tweede argument te fopen waarskynlik beteken? 456 00:21:18,960 --> 00:21:21,480 Reg, w vir skryf, kan wees r vir lees. 457 00:21:21,480 --> 00:21:24,120 Daar is 'n vir append as jy wil rye en nie by te voeg 458 00:21:24,120 --> 00:21:25,200 vervang die hele ding. 459 00:21:25,200 --> 00:21:28,005 >> Maar ek wil net hierdie lêer te skep een keer, so ek sal gebruik quote unquote w. 460 00:21:28,005 --> 00:21:31,880 En ek weet dat net van dit gelees die dokumentasie, of die man bladsy. 461 00:21:31,880 --> 00:21:35,100 Indien lêer is nie nietig nie - met ander woorde, asof niks verkeerd geloop het daar - 462 00:21:35,100 --> 00:21:37,820 laat my Itereer oor die studente van 0 tot 3. 463 00:21:37,820 --> 00:21:40,410 >> En nou sien daar is iets ooit so effens verskillende 464 00:21:40,410 --> 00:21:42,110 oor die lyn 41 hier. 465 00:21:42,110 --> 00:21:42,960 Dit is nie printf. 466 00:21:42,960 --> 00:21:46,530 Dit is fprintf vir die lêer printf. 467 00:21:46,530 --> 00:21:47,790 So dit gaan skryf in te dien. 468 00:21:47,790 --> 00:21:48,860 Watter lêer? 469 00:21:48,860 --> 00:21:53,630 Die een wie se wyser wat jy spesifiseer as die eerste argument. 470 00:21:53,630 --> 00:21:55,940 >> Dan sal ons spesifiseer 'n formaat string. 471 00:21:55,940 --> 00:21:59,660 Dan sal ons presies weet wat ons wil string plug in vir die eerste persent s, en 472 00:21:59,660 --> 00:22:04,320 dan nog 'n veranderlike of die tweede persent s. 473 00:22:04,320 --> 00:22:06,760 Toe ons naby die lêer met fclose. 474 00:22:06,760 --> 00:22:09,380 As ek bevry van die geheue soos voorheen, al is Ek moet gaan terug in en voeg 475 00:22:09,380 --> 00:22:10,540 'n paar tjeks vir null. 476 00:22:10,540 --> 00:22:12,090 >> En dit is dit. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose gee my die vermoë om teks lêers te skep. 478 00:22:16,960 --> 00:22:19,640 Nou, sien jy in probleem stel vyf, wat behels die beelde, sal jy gebruik word 479 00:22:19,640 --> 00:22:20,990 binêre lêers plaas. 480 00:22:20,990 --> 00:22:24,200 Maar fundamenteel, die idee is dieselfde, selfs al is die funksies sal jy 481 00:22:24,200 --> 00:22:28,710 sien, is 'n bietjie anders. 482 00:22:28,710 --> 00:22:32,580 >> So warrelwind-toer, maar jy sal kry al te bekend is met die lêer I/O-- 483 00:22:32,580 --> 00:22:34,960 toevoer en afvoer - met pset vyf. 484 00:22:34,960 --> 00:22:38,607 En enige vrae oor die aanvanklike basiese beginsels hier? 485 00:22:38,607 --> 00:22:39,857 Ja? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Wat gebeur as jy probeer om 'n nul waarde te bevry? 488 00:22:43,710 --> 00:22:48,880 Ek glo nie, tensy gratis gekry het 'n bietjie meer gebruiker-vriendelike, jy kan 489 00:22:48,880 --> 00:22:49,890 potensieel segfault. 490 00:22:49,890 --> 00:22:54,160 Om dit nul is sleg, want ek doen nie glo gratis pla om te kyk vir jou, 491 00:22:54,160 --> 00:22:57,330 want dit sou moontlik wees om 'n vermorsing van die tyd vir dit self te doen vir 492 00:22:57,330 --> 00:22:59,022 almal in die wêreld. 493 00:22:59,022 --> 00:23:00,590 Goeie vraag, al is. 494 00:23:00,590 --> 00:23:04,300 >> Alle reg, sodat hierdie soort van kry ons 'n interessante onderwerp. 495 00:23:04,300 --> 00:23:07,010 Die tema van die probleem stel vyf is forensiese ondersoeke. 496 00:23:07,010 --> 00:23:08,420 Ten minste is dit 'n gedeelte van die probleem stel. 497 00:23:08,420 --> 00:23:12,030 Forensiese algemeen verwys na die herstel van inligting wat kan of 498 00:23:12,030 --> 00:23:14,110 mag gewees het nie verwyder doelbewus. 499 00:23:14,110 --> 00:23:18,680 En so het ek gedink ek wil gee jou 'n vinnige voorsmakie van wat werklik aan die gang al 500 00:23:18,680 --> 00:23:21,230 hierdie tyd onder die kap van jou rekenaar. 501 00:23:21,230 --> 00:23:23,960 >> Byvoorbeeld, as jy die binnekant van jou laptop of jou rekenaar 'n 502 00:23:23,960 --> 00:23:28,040 hardeskyf, dit is óf 'n meganiese toestel wat eintlik draai - 503 00:23:28,040 --> 00:23:31,650 daar is omsendbrief dinge genoem borde wat graag heel Kyk wat ek 504 00:23:31,650 --> 00:23:34,540 moes net op die skerm hier, al dit is al hoe meer ou skool. 505 00:23:34,540 --> 00:23:37,370 Dit is 'n drie-en-'n-half-duim hardeskyf. 506 00:23:37,370 --> 00:23:40,070 En drie en 'n half duim verwys van met die ding wanneer jy dit installeer 507 00:23:40,070 --> 00:23:40,890 in 'n rekenaar. 508 00:23:40,890 --> 00:23:44,890 >> Baie van julle ouens in jou skootrekenaars nou het vaste-toestand dryf, of SSDs, 509 00:23:44,890 --> 00:23:46,260 wat geen bewegende dele. 510 00:23:46,260 --> 00:23:49,170 Hulle is meer soos geheue en minder soos hierdie meganiese toestelle. 511 00:23:49,170 --> 00:23:51,450 Maar die idees is nog steeds dieselfde, seker as dit verband hou 512 00:23:51,450 --> 00:23:52,790 om probleme op te stel vyf. 513 00:23:52,790 --> 00:23:57,400 >> En as jy dink oor die nou 'n hardeskyf verteenwoordig 'n sirkel, wat 514 00:23:57,400 --> 00:23:58,930 Ek sal trek soos hierdie hier. 515 00:23:58,930 --> 00:24:02,290 As jy 'n lêer op jou rekenaar, of dit nou 'n SSD, of in 516 00:24:02,290 --> 00:24:06,610 hierdie geval, 'n ouer skool hardeskyf, die lêer bestaan ​​uit verskeie stukkies. 517 00:24:06,610 --> 00:24:10,510 Kom ons sê dat dit is die 0 en 1, 'n hele klomp van 0'e en 1'e. 518 00:24:10,510 --> 00:24:11,660 So dit is my hele hardeskyf. 519 00:24:11,660 --> 00:24:13,225 Dit is blykbaar 'n redelik groot lêer. 520 00:24:13,225 --> 00:24:18,080 En dit is die gebruik van die 0e en 1e op daardie gedeelte van die fisiese skinkbord. 521 00:24:18,080 --> 00:24:19,750 >> Wel, wat is dat die fisiese gedeelte? 522 00:24:19,750 --> 00:24:25,310 Wel, dit blyk dat op 'n hardeskyf, ten minste van hierdie tipe, is daar 523 00:24:25,310 --> 00:24:27,340 hierdie klein bietjie magnetiese deeltjies. 524 00:24:27,340 --> 00:24:32,630 En hulle in wese het noord en Suid-pale met hulle, so dat as jy 525 00:24:32,630 --> 00:24:35,710 draai een van daardie magnetiese deeltjies hierdie manier, kan jy sê dat dit 526 00:24:35,710 --> 00:24:36,720 verteenwoordig 'n 1. 527 00:24:36,720 --> 00:24:39,340 En as dit onderstebo suid na noorde, kan jy sê dat dit 528 00:24:39,340 --> 00:24:40,390 wat 'n 0. 529 00:24:40,390 --> 00:24:43,660 >> So in die werklike fisiese wêreld, wat hoe jy kan verteenwoordig iets in 530 00:24:43,660 --> 00:24:45,670 binêre toestand van die 0 en 'n 1. 531 00:24:45,670 --> 00:24:46,720 So dit is al 'n lêer is. 532 00:24:46,720 --> 00:24:49,300 Daar is 'n hele klomp van die magnetiese deeltjies wat hulle op hierdie manier of 533 00:24:49,300 --> 00:24:51,920 hierdie manier, die skep van patrone van 0'e en 1'e. 534 00:24:51,920 --> 00:24:56,760 >> Maar dit blyk uit wanneer jy 'n lêer stoor, Sommige inligting is apart gestoor word. 535 00:24:56,760 --> 00:25:00,000 So dit is 'n klein tafel, 'n gids, om so te spreek. 536 00:25:00,000 --> 00:25:05,810 En Ek sal hierdie kolom naam noem, en Ek bel hierdie kolom plek. 537 00:25:05,810 --> 00:25:08,850 >> En ek gaan om te sê, veronderstel dit is my CV. 538 00:25:08,850 --> 00:25:14,050 My resume.doc gestoor word op plek, kom ons sê 123. 539 00:25:14,050 --> 00:25:15,390 Ek het altyd gaan vir dat die getal. 540 00:25:15,390 --> 00:25:18,810 Maar is dit voldoende om te sê dat net soos in die geheue, kan jy 'n hardeskyf 541 00:25:18,810 --> 00:25:22,350 dit is 'n GB of 200 GB of 'n terabyte, en jy kan 542 00:25:22,350 --> 00:25:23,750 Nommer al die grepe. 543 00:25:23,750 --> 00:25:26,480 Jy kan Nommer al die stukke van 8 stukkies. 544 00:25:26,480 --> 00:25:29,030 >> So sal ons sê dat hierdie is plek 123. 545 00:25:29,030 --> 00:25:32,070 So hierdie gids binnekant van my bedryfstelsel stelsel onthou dat my 546 00:25:32,070 --> 00:25:34,250 CV is by die plek 123. 547 00:25:34,250 --> 00:25:36,850 Maar dit raak interessant wanneer jy 'n lêer verwyder. 548 00:25:36,850 --> 00:25:37,820 >> So byvoorbeeld - 549 00:25:37,820 --> 00:25:40,790 en gelukkig, die meeste van die wêreld het gevang op hierdie - wat gebeur wanneer 550 00:25:40,790 --> 00:25:45,040 jy sleep 'n lêer op jou Mac OS asblik of jou Windows Recycle Bin? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Wat is die doel om dit te doen? 553 00:25:50,510 --> 00:25:53,860 Dit is natuurlik om ontslae te raak van die lêer, maar wat nie die daad van sleep en 554 00:25:53,860 --> 00:25:57,550 val in jou asblik of jou Recycle Bin doen op 'n rekenaar? 555 00:25:57,550 --> 00:25:59,230 >> Absoluut niks nie, regtig. 556 00:25:59,230 --> 00:26:00,320 Dit is net soos 'n gids. 557 00:26:00,320 --> 00:26:01,800 Dit is 'n spesiale gids, om seker te wees. 558 00:26:01,800 --> 00:26:04,460 Maar dit maak nie eintlik verwyder die lêer? 559 00:26:04,460 --> 00:26:06,780 >> Wel, nee, want sommige van julle waarskynlik gewees het soos, ag damn, jy het nie 560 00:26:06,780 --> 00:26:07,420 beteken dat te doen. 561 00:26:07,420 --> 00:26:09,130 Sodat jy dubbel kliek op die Asblik of Recycle Bin. 562 00:26:09,130 --> 00:26:11,630 Jy het rondom steek en jy het verhaal die lêer net deur dit te sleep 563 00:26:11,630 --> 00:26:12,110 daar uit. 564 00:26:12,110 --> 00:26:14,420 So duidelik, is dit nie noodwendig om dit te verwyder. 565 00:26:14,420 --> 00:26:15,990 >> OK, jy is slimmer as dit. 566 00:26:15,990 --> 00:26:18,860 Jy weet dat net sleep dit in die Asblik of Recycle Bin beteken nie 567 00:26:18,860 --> 00:26:19,930 jy die leegmaak van die asblik. 568 00:26:19,930 --> 00:26:24,110 So jy gaan na die spyskaart, en jy sê: Leë asblik of leë asblik. 569 00:26:24,110 --> 00:26:25,360 Dan wat gebeur? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Ja, so dit is meer so verwyder. 572 00:26:32,530 --> 00:26:37,660 Maar al wat gebeur is nie. 573 00:26:37,660 --> 00:26:45,350 Die rekenaar vergeet waar resume.doc was. 574 00:26:45,350 --> 00:26:47,400 >> Maar wat het nie verander nie glo in die prentjie? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Die stukkies, die 0e en 1e dat ek beweer is op die terrein van 'n fisiese aspek van 577 00:26:55,570 --> 00:26:56,280 die hardeware. 578 00:26:56,280 --> 00:26:57,110 Hulle is nog steeds daar. 579 00:26:57,110 --> 00:26:58,930 Dis net die rekenaar vergeet wat hulle is. 580 00:26:58,930 --> 00:27:03,160 >> So is dit in wese bevry die lêer se stukkies so dat hulle kan hergebruik word. 581 00:27:03,160 --> 00:27:06,940 Maar dit is nie totdat jy meer lêers, en meer lêers, en meer lêers 582 00:27:06,940 --> 00:27:12,150 probabilistically, diegene 0e en 1e, die magnetiese deeltjies, hergebruik kry, 583 00:27:12,150 --> 00:27:16,220 onderstebo of regterkant, vir ander lêers, 0e en 1e. 584 00:27:16,220 --> 00:27:17,980 >> So jy het die venster van die tyd. 585 00:27:17,980 --> 00:27:19,860 En dit is nie van voorspelbare lengte, regtig. 586 00:27:19,860 --> 00:27:22,240 Dit hang af van die grootte van jou harde ry en hoeveel lêers wat jy het en 587 00:27:22,240 --> 00:27:23,490 hoe vinnig jy maak nuwes. 588 00:27:23,490 --> 00:27:27,050 Maar daar is die venster van die tyd gedurende wat die lêer is nog steeds perfek 589 00:27:27,050 --> 00:27:27,770 verhaalbaar is nie. 590 00:27:27,770 --> 00:27:31,050 >> So as jy ooit gebruik programme soos McAfee of Norton om te probeer om te herstel 591 00:27:31,050 --> 00:27:35,680 data, is al wat hulle doen probeer om herstel van hierdie sogenaamde gids te 592 00:27:35,680 --> 00:27:37,340 uit te vind waar jy die lêer was. 593 00:27:37,340 --> 00:27:40,605 En soms Norton en sal sê: lêer is 93% verhaal. 594 00:27:40,605 --> 00:27:42,020 Wel, wat beteken dit? 595 00:27:42,020 --> 00:27:45,690 Dit beteken net dat 'n ander lêer toevallig beland met behulp van, sê, 596 00:27:45,690 --> 00:27:48,920 daardie stukkies uit jou oorspronklike lêer. 597 00:27:48,920 --> 00:27:51,950 >> So, wat werklik betrokke is in die herstel van data? 598 00:27:51,950 --> 00:27:55,720 Wel, as jy nie iets soos Norton pre-geïnstalleer op jou rekenaar, 599 00:27:55,720 --> 00:27:59,510 die beste wat jy kan doen, is soms kyk aan die hele hardeskyf op soek na 600 00:27:59,510 --> 00:28:00,510 patrone van stukkies. 601 00:28:00,510 --> 00:28:05,350 En een van die temas van die probleem stel vyf is dat jy sal soek op die 602 00:28:05,350 --> 00:28:09,570 ekwivalent van 'n hardeskyf, 'n forensiese beeld van 'n kompakte flits kaart van 'n 603 00:28:09,570 --> 00:28:13,660 digitale kamera, op soek na die 0s en 1s wat tipies, met 'n hoë 604 00:28:13,660 --> 00:28:16,720 waarskynlikheid, verteenwoordig die begin van 'n JPEG beeld. 605 00:28:16,720 --> 00:28:21,120 >> En julle kan herstel die beelde deur aanvaarding, as ek sien hierdie patroon van 606 00:28:21,120 --> 00:28:24,380 stukkies van die forensiese beeld, met hoë waarskynlikheid, dat die punte 607 00:28:24,380 --> 00:28:25,650 die begin van 'n JPEG. 608 00:28:25,650 --> 00:28:29,520 En as ek sien dieselfde patroon weer dat die punte waarskynlik die begin van 609 00:28:29,520 --> 00:28:32,440 'n ander JPEG, en 'n ander JPEG, en 'n ander JPEG. 610 00:28:32,440 --> 00:28:34,970 En dit is tipies hoe data herstel sal werk. 611 00:28:34,970 --> 00:28:37,870 Wat is lekker om oor JPEG is selfs al die lêer formaat self is ietwat 612 00:28:37,870 --> 00:28:44,400 kompleks, die begin van elke sodanige lêer is eintlik redelik identifiseerbare 613 00:28:44,400 --> 00:28:47,370 en eenvoudig, soos jy sal sien, As jy nie reeds het. 614 00:28:47,370 --> 00:28:50,270 >> So kom ons neem 'n nader kyk onder die kap as om presies wat was 615 00:28:50,270 --> 00:28:53,360 gaan op, en wat hierdie 0e en 1e is, te gee jou 'n bietjie meer van 'n 616 00:28:53,360 --> 00:28:55,330 konteks vir hierdie besondere uitdaging. 617 00:28:55,330 --> 00:28:55,510 >> [Video speel] 618 00:28:55,510 --> 00:28:58,700 >> -Waar jou rekenaar stoor mees van sy permanente data. 619 00:28:58,700 --> 00:29:03,390 Om dit te doen, die data reis van RAM saam met sagteware seine wat vertel 620 00:29:03,390 --> 00:29:06,110 die hardeskyf hoe die data te stoor. 621 00:29:06,110 --> 00:29:09,410 Die harde skyf kringe vertaal daardie seine in spanning 622 00:29:09,410 --> 00:29:10,870 skommelinge. 623 00:29:10,870 --> 00:29:14,970 Hierdie, op sy beurt, beheer oor die hardeskyf se bewegende dele, 'n paar van die min 624 00:29:14,970 --> 00:29:17,910 bewegende dele het in die moderne rekenaar. 625 00:29:17,910 --> 00:29:22,130 >> Sommige van die seine beheer oor 'n motor wat draai metaal-bedekte borde. 626 00:29:22,130 --> 00:29:25,470 Jou data is eintlik gestoor op hierdie borde. 627 00:29:25,470 --> 00:29:28,610 Ander seine beweeg die lees / skryf koppe te lees of 628 00:29:28,610 --> 00:29:30,710 skryf data op die borde. 629 00:29:30,710 --> 00:29:35,450 Dit masjinerie so akkuraat is dat 'n mens hare kan selfs nie slaag tussen die 630 00:29:35,450 --> 00:29:37,280 koppe en draai borde. 631 00:29:37,280 --> 00:29:40,316 Tog, dit werk al by geweldige spoed. 632 00:29:40,316 --> 00:29:40,660 >> [Einde video-vertoning] 633 00:29:40,660 --> 00:29:42,190 >> David Malan: Zoom in 'n bietjie dieper nou na wat 634 00:29:42,190 --> 00:29:44,360 eintlik op die borde. 635 00:29:44,360 --> 00:29:44,720 >> [Video speel] 636 00:29:44,720 --> 00:29:47,660 >> -Kom ons kyk na wat ons net sien in slow motion. 637 00:29:47,660 --> 00:29:51,710 Wanneer 'n kort pols van elektrisiteit gestuur word aan die lees / skryf hoof, as flips 638 00:29:51,710 --> 00:29:54,650 op 'n klein elektromagnetiese vir 'n fraksie van 'n sekonde. 639 00:29:54,650 --> 00:29:58,970 Die Magnet skep 'n gebied, wat verander die polariteit van 'n klein, klein 640 00:29:58,970 --> 00:30:02,850 gedeelte van die metaal deeltjies wat rok elke skottel oppervlak. 641 00:30:02,850 --> 00:30:05,940 >> 'N patroon reeks van hierdie klein, gehef-up areas op die skyf 642 00:30:05,940 --> 00:30:08,470 verteenwoordig 'n enkele bietjie data in die binêre getal 643 00:30:08,470 --> 00:30:10,530 stelsel wat gebruik word deur rekenaars. 644 00:30:10,530 --> 00:30:13,775 Nou, as die huidige gestuur is een manier deur die lees / skryf kop, die gebied 645 00:30:13,775 --> 00:30:15,970 gepolariseer is in een rigting. 646 00:30:15,970 --> 00:30:17,950 As die huidige gestuur word in die teenoorgestelde rigting, die 647 00:30:17,950 --> 00:30:19,930 polarisasie omgekeer word. 648 00:30:19,930 --> 00:30:22,370 >> Hoe jy data van die hardeskyf? 649 00:30:22,370 --> 00:30:24,090 Net reverse die proses. 650 00:30:24,090 --> 00:30:26,550 So dit is die deeltjies op die skyf wat kry die stroom in die 651 00:30:26,550 --> 00:30:27,960 lees / skryf kop beweeg. 652 00:30:27,960 --> 00:30:30,700 Saam miljoene van hierdie gemagnetiseerde segmente, en 653 00:30:30,700 --> 00:30:32,160 jy het 'n lêer. 654 00:30:32,160 --> 00:30:36,060 >> Nou, die stukke van 'n enkele lêer word versprei oor 'n stasie se 655 00:30:36,060 --> 00:30:39,970 borde, soort van soos die gemors papiere op jou lessenaar. 656 00:30:39,970 --> 00:30:43,500 So 'n spesiale ekstra lêer hou van waar alles is. 657 00:30:43,500 --> 00:30:45,985 Moet nie jy wens jy het iets soos dit? 658 00:30:45,985 --> 00:30:46,470 >> [Einde video-vertoning] 659 00:30:46,470 --> 00:30:47,820 >> David Malan: OK, waarskynlik nie. 660 00:30:47,820 --> 00:30:52,070 So hoeveel van julle ouens grootgeword het met hierdie? 661 00:30:52,070 --> 00:30:53,970 OK, so dit is al hoe minder hande elke jaar. 662 00:30:53,970 --> 00:30:56,550 Maar ek is bly jy is ten minste vertroud saam met hulle, want dit en ons eie 663 00:30:56,550 --> 00:31:00,520 boek demo, ongelukkig, is om te sterf 'n baie stadige dood hier van bekendheid. 664 00:31:00,520 --> 00:31:04,010 >> Maar dit is wat ek, ten minste, terug in hoë skool, wat gebruik word gebruik vir rugsteun. 665 00:31:04,010 --> 00:31:08,110 Dit was wonderlik, want jy kon slaan 1,4 megagrepe op 666 00:31:08,110 --> 00:31:08,930 hierdie spesifieke skyf. 667 00:31:08,930 --> 00:31:12,260 En dit was die hoë digtheid weergawe, soos aangedui deur die HD, wat 668 00:31:12,260 --> 00:31:14,240 beteken voor vandag se HD videos. 669 00:31:14,240 --> 00:31:16,400 >> Standard digtheid was 800 kilogrepe. 670 00:31:16,400 --> 00:31:18,640 En voor dit, was daar 400 kilogrepe skywe. 671 00:31:18,640 --> 00:31:23,120 En voor dit, was daar 5 en 1/4 duim-skywe, wat was werklik floppy, 672 00:31:23,120 --> 00:31:25,680 en 'n bietjie wyer en langer as hierdie dinge hier. 673 00:31:25,680 --> 00:31:29,150 Maar jy kan eintlik sien die sogenaamde floppy aspek van hierdie skywe. 674 00:31:29,150 --> 00:31:32,630 >> En funksioneel, hulle is eintlik redelik soortgelyk aan hardeskywe van ten 675 00:31:32,630 --> 00:31:33,570 minste hierdie tipe. 676 00:31:33,570 --> 00:31:37,270 Weereens, SSDs in nuwer rekenaars werk 'n bietjie anders. 677 00:31:37,270 --> 00:31:41,530 Maar as jy beweeg dat min metaal blad jy kan eintlik sien 'n klein koekie, 678 00:31:41,530 --> 00:31:42,560 of bord. 679 00:31:42,560 --> 00:31:43,830 >> Dit is nie 'n metaal soos hierdie een. 680 00:31:43,830 --> 00:31:46,000 Hierdie een is eintlik 'n paar goedkoper plastiese materiaal. 681 00:31:46,000 --> 00:31:46,750 En jy kan soort dit wikkel. 682 00:31:46,750 --> 00:31:50,310 En jy het net trully afgevee sommige aantal stukkies of magnetiese deeltjies 683 00:31:50,310 --> 00:31:51,220 van hierdie skyf. 684 00:31:51,220 --> 00:31:52,710 >> So gelukkig, daar is niks op dit. 685 00:31:52,710 --> 00:31:55,790 As die ding in die pad - en dek jou oë en dié van jou naaste - 686 00:31:55,790 --> 00:31:58,865 jy kan net soort van trek hierdie hele skede af soos dit. 687 00:31:58,865 --> 00:32:01,900 Maar daar is 'n bietjie lente, so wees bewus van wat met jou oë. 688 00:32:01,900 --> 00:32:03,620 So nou het jy werklik 'n slapskyf. 689 00:32:03,620 --> 00:32:07,090 >> En wat is merkwaardig van hierdie is dat in so veel as dit is 'n 690 00:32:07,090 --> 00:32:10,830 kleinskaalse voorstelling van 'n groter hardeskyf, hierdie dinge is super, 691 00:32:10,830 --> 00:32:11,590 super eenvoudig. 692 00:32:11,590 --> 00:32:15,170 As jy knyp die onderkant van dit, nou dat dat metal ding is af, en skil 693 00:32:15,170 --> 00:32:20,990 hulle oop te maak, al is daar is twee stukke gevoel en die sogenaamde diskette 694 00:32:20,990 --> 00:32:22,930 met 'n stukkie van die metaal aan die binnekant. 695 00:32:22,930 --> 00:32:25,990 >> En daar gaan die helfte van my skyf se inhoud. 696 00:32:25,990 --> 00:32:27,540 Daar gaan 'n ander helfte van hulle. 697 00:32:27,540 --> 00:32:31,375 Maar dit is al wat spin binne van jou rekenaar in weleer. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> En weer na hierdie in perspektief te stel, hoe groot is die meeste van jou 700 00:32:38,310 --> 00:32:39,560 hard dryf deesdae? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 GB, 'n terabyte, miskien in 'n rekenaar, 2 teragrepe, 3 703 00:32:46,230 --> 00:32:47,630 teragrepe, 4 teragrepe, reg? 704 00:32:47,630 --> 00:32:52,480 Dit is een megabyte, gee of neem, wat kan selfs nie pas 'n tipiese MP3 705 00:32:52,480 --> 00:32:55,310 meer hierdie dae, of 'n soortgelyke musiek lêer. 706 00:32:55,310 --> 00:32:59,500 >> So 'n bietjie aandenking vir jou vandag, en ook om te help kontekstualiseer wat 707 00:32:59,500 --> 00:33:03,570 neem ons as vanselfsprekend aanvaar nou in probleem stel vyf. 708 00:33:03,570 --> 00:33:04,820 So dit is joune om te hou. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 So laat my oorgang na waar sal wees spandeer die volgende pset as well. 711 00:33:13,370 --> 00:33:18,470 So het ons nou 'hierdie bladsy vir - o, 'n paar van die aankondiging vinnig. 712 00:33:18,470 --> 00:33:21,730 >> Hierdie Vrydag, as jy wil graag aansluit by CS50 vir middagete, gaan na die gewone plek, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 En finale projek - 715 00:33:25,100 --> 00:33:28,520 so per die leerplan, het ons gepos word om die finale projek spesifikasie reeds. 716 00:33:28,520 --> 00:33:31,410 Besef dat dit beteken nie dat dit is as gevolg van veral gou. 717 00:33:31,410 --> 00:33:33,990 Dit opgelaai, regtig, net om te kry julle ouens te dink oor dit. 718 00:33:33,990 --> 00:33:37,620 En inderdaad, 'n super beduidende persentasie van julle sal aanpak word 719 00:33:37,620 --> 00:33:40,780 finale projekte op materiaal wat ons het nie eens gekry het om in die klas, 720 00:33:40,780 --> 00:33:42,730 maar sal so vroeg as volgende week. 721 00:33:42,730 --> 00:33:45,530 >> Kennisgewing, al is, dat die spec oproepe vir 'n paar verskillende komponente van die 722 00:33:45,530 --> 00:33:46,190 finale projek. 723 00:33:46,190 --> 00:33:49,590 Die eerste, in 'n paar weke, is 'n pre-voorstel, 'n mooi gemaklik e-pos aan 724 00:33:49,590 --> 00:33:52,760 jou TF om hom te vertel of wat jy dink oor vir jou projek, met 725 00:33:52,760 --> 00:33:53,650 geen verbintenis. 726 00:33:53,650 --> 00:33:56,710 Voorstel sal wees om jou spesifieke toewyding, sê, hier, dit is wat 727 00:33:56,710 --> 00:33:57,770 Ek wil graag om te doen vir my projek. 728 00:33:57,770 --> 00:33:58,250 Wat dink jy? 729 00:33:58,250 --> 00:33:58,650 Te groot? 730 00:33:58,650 --> 00:33:59,145 Te klein? 731 00:33:59,145 --> 00:34:00,330 Is dit hanteerbaar? 732 00:34:00,330 --> 00:34:02,230 En jy sien die spec vir meer besonderhede. 733 00:34:02,230 --> 00:34:05,060 >> Paar weke daarna is die status verslag, wat 'n soortgelyke 734 00:34:05,060 --> 00:34:08,260 gemaklik e-pos aan jou TF te sê presies hoe ver agter jy is in jou finale 735 00:34:08,260 --> 00:34:12,360 projek se implementering, gevolg deur die CS50 Hackathon waaraan almal 736 00:34:12,360 --> 00:34:17,520 is genooi, wat sal 'n geleentheid wees vanaf 20:00 op een aand tot 07:00 737 00:34:17,520 --> 00:34:19,150 IS die volgende oggend. 738 00:34:19,150 --> 00:34:22,560 Pizza, as ek mag genoem het in week nul, wil gedien word op 09:00, 739 00:34:22,560 --> 00:34:24,120 Chinese kos by 01:00. 740 00:34:24,120 --> 00:34:27,929 En as jy nog wakker op 05:00, ons sal jou neem na IHOP vir ontbyt. 741 00:34:27,929 --> 00:34:31,310 >> So het die Hackathon is een van die meer onvergeetlike ervaring in die klas. 742 00:34:31,310 --> 00:34:35,290 Toe het die implementering verskuldig is, en dan die klimaks CS50 Fair. 743 00:34:35,290 --> 00:34:38,070 Meer besonderhede oor al hierdie in die komende weke. 744 00:34:38,070 --> 00:34:40,739 >> Maar laat ons gaan terug na iets wat ou skool - 745 00:34:40,739 --> 00:34:41,920 weer, 'n skikking. 746 00:34:41,920 --> 00:34:45,040 So 'n skikking was lekker, want dit los probleme soos ons gesien het net 'n 747 00:34:45,040 --> 00:34:49,290 oomblik gelede met student strukture om 'n bietjie buite beheer as ons 748 00:34:49,290 --> 00:34:52,405 wil student een student twee te hê, student drie, student dot dot dot, 749 00:34:52,405 --> 00:34:54,400 'n arbitrêre aantal studente. 750 00:34:54,400 --> 00:34:58,850 >> So skikkings, 'n paar weke gelede, toegeslaan en opgelos almal van ons probleme nie 751 00:34:58,850 --> 00:35:03,340 weet vooraf hoe baie dinge van 'n soort wat ons dalk wil. 752 00:35:03,340 --> 00:35:07,390 En ons het gesien dat structs ons kan help verder organiseer ons kode en hou 753 00:35:07,390 --> 00:35:11,660 konseptueel soortgelyke veranderlikes, soos 'n naam en 'n huis saam, sodat ons 754 00:35:11,660 --> 00:35:15,570 kan behandel hulle as een entiteit, binne waarvan daar kleiner stukke. 755 00:35:15,570 --> 00:35:17,810 >> Maar skikkings het 'n paar nadele. 756 00:35:17,810 --> 00:35:19,780 Wat is 'n paar van die nadele ons teëgekom het 757 00:35:19,780 --> 00:35:22,320 met skikkings tot dusver? 758 00:35:22,320 --> 00:35:23,450 Wat is dit? 759 00:35:23,450 --> 00:35:28,130 Vaste grootte - so selfs al sou jy in staat wees om geheue vir 'n te ken 760 00:35:28,130 --> 00:35:32,310 skikking, as jy weet hoe baie studente jy het, hoeveel karakters jy 761 00:35:32,310 --> 00:35:35,460 van die gebruiker, wanneer jy toegeken die skikking, het soort wat jy geverf 762 00:35:35,460 --> 00:35:36,740 jouself in 'n hoek. 763 00:35:36,740 --> 00:35:40,600 >> Want jy kan nie voeg nuwe elemente in die middel van 'n skikking. 764 00:35:40,600 --> 00:35:43,660 Jy kan nie voeg meer elemente aan die einde van 'n skikking. 765 00:35:43,660 --> 00:35:47,750 Regtig, jy het 'n beroep op die skep van 'n hele nuwe skikking, soos ons bespreek het, 766 00:35:47,750 --> 00:35:49,320 kopiëring van die ou na die nuwe. 767 00:35:49,320 --> 00:35:52,610 En weer, dit is die hoofpyn wat GetString hanteer vir jou. 768 00:35:52,610 --> 00:35:56,170 >> Maar weereens, kan jy nie eens voeg iets wat in die middel van die skikking 769 00:35:56,170 --> 00:35:58,200 indien die koers is nie heeltemal gevul. 770 00:35:58,200 --> 00:36:03,010 Byvoorbeeld, as die reeks hier van grootte ses het net vyf dinge in dit, 771 00:36:03,010 --> 00:36:06,080 Wel, jy kan net ryg iets op die einde. 772 00:36:06,080 --> 00:36:08,200 Maar wat as jy iets wil voeg in die middel van die 773 00:36:08,200 --> 00:36:11,280 skikking, selfs al is dit dalk ' Vyf van die ses dinge in dit? 774 00:36:11,280 --> 00:36:14,250 >> Wel, wat ons doen wanneer ons al van ons menslike vrywilligers op die verhoog in 775 00:36:14,250 --> 00:36:15,110 weke verlede? 776 00:36:15,110 --> 00:36:18,710 As ons wou iemand hier te plaas, óf hierdie mense hoe om dit te beweeg 777 00:36:18,710 --> 00:36:22,540 manier, of hierdie mense hoe om dit te beweeg manier, en dit was baie duur. 778 00:36:22,540 --> 00:36:26,950 Die verskuiwing van mense binne 'n verskeidenheid beland optel en kos 779 00:36:26,950 --> 00:36:31,240 ons tyd, daarom is baie van ons n geruite hardloop tye soos voeg soort, vir 780 00:36:31,240 --> 00:36:32,550 Byvoorbeeld, in die ergste geval. 781 00:36:32,550 --> 00:36:36,520 So skikkings is groot, maar jy het om te vooraf weet hoe groot jy wil hê hulle. 782 00:36:36,520 --> 00:36:38,030 >> So OK, hier is 'n oplossing. 783 00:36:38,030 --> 00:36:43,860 As ek weet nie vooruit hoeveel studente kan ek het, en ek weet wanneer 784 00:36:43,860 --> 00:36:47,870 Ek het besluit om, al is, ek is vas met wat baie studente, hoekom ek nie net altyd 785 00:36:47,870 --> 00:36:51,740 ken twee keer soveel ruimte as ek kan dink dat ek nodig? 786 00:36:51,740 --> 00:36:54,450 Is dit nie 'n redelike oplossing? 787 00:36:54,450 --> 00:36:58,240 >> Realisties, dink ek nie dat ons gaan meer as 50 slots nodig 788 00:36:58,240 --> 00:37:02,190 in 'n skikking vir 'n medium-grootte klas, So laat ons net rond. 789 00:37:02,190 --> 00:37:07,040 Ek sal 100 slots in my skikking, net sodat ons kan beslis die 790 00:37:07,040 --> 00:37:10,330 aantal studente verwag ek te wees in 'n medium-grootte klas. 791 00:37:10,330 --> 00:37:14,320 So hoekom nie net rond en ken meer geheue, tipies, vir 'n verskeidenheid 792 00:37:14,320 --> 00:37:16,290 as jy dink jy kan selfs nodig? 793 00:37:16,290 --> 00:37:20,190 Wat is dit eenvoudig agterstoot om die idee? 794 00:37:20,190 --> 00:37:21,440 >> Jy is net mors geheue. 795 00:37:21,440 --> 00:37:25,350 Letterlik elke program wat jy skryf dan Miskien is die gebruik twee keer soveel geheue soos 796 00:37:25,350 --> 00:37:26,680 jy werklik nodig het. 797 00:37:26,680 --> 00:37:28,990 En dit is net nie voel soos 'n veral elegante oplossing. 798 00:37:28,990 --> 00:37:31,990 Verder, dit verminder net die waarskynlikheid van 'n probleem. 799 00:37:31,990 --> 00:37:35,300 As jy toevallig 'n gewilde kursus te hê een semester en jy het 101 800 00:37:35,300 --> 00:37:39,610 studente, die program is nog steeds fundamenteel in die gesig staar dieselfde probleem. 801 00:37:39,610 --> 00:37:44,280 >> So gelukkig is, is daar 'n oplossing te hierdie advertensie al ons probleme in die vorm 802 00:37:44,280 --> 00:37:46,790 van data strukture wat meer kompleks as dié 803 00:37:46,790 --> 00:37:47,970 het ons tot dusver gesien het. 804 00:37:47,970 --> 00:37:50,530 Hierdie, ek eis, is 'n gekoppelde lys. 805 00:37:50,530 --> 00:37:51,920 Hierdie is 'n lys van die nommers - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, en 34 - 807 00:37:54,970 --> 00:38:00,120 wat reeds met mekaar verbind is deur middel van wat ek geteken as pyle. 808 00:38:00,120 --> 00:38:03,580 >> Met ander woorde, as ek wou te verteenwoordig 'n skikking, kon ek doen 809 00:38:03,580 --> 00:38:04,910 iets soos hierdie. 810 00:38:04,910 --> 00:38:07,310 En ek sal dit op die oorhoofse in net 'n oomblik. 811 00:38:07,310 --> 00:38:09,970 Ek kon doen nie - 812 00:38:09,970 --> 00:38:12,520 hallo, alles reg. 813 00:38:12,520 --> 00:38:14,470 Staan. 814 00:38:14,470 --> 00:38:17,360 Nuwe rekenaar hier, duidelik - 815 00:38:17,360 --> 00:38:18,090 alles reg. 816 00:38:18,090 --> 00:38:21,730 >> So as ek hierdie getalle in verskeidenheid - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 nie noodwendig volgens skaal. 819 00:38:30,530 --> 00:38:33,730 Alle reg, so hier is my verskeidenheid - 820 00:38:33,730 --> 00:38:34,980 O my God. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Alle reg, so hier is my skikking. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh my god. 825 00:38:45,050 --> 00:38:48,820 >> [Gelag] 826 00:38:48,820 --> 00:38:49,440 >> David Malan: voorgee. 827 00:38:49,440 --> 00:38:52,330 Dit is te veel moeite om terug te gaan en op te los, so daar - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 So het ons hierdie reeks 9, 17, 22, 26, en 34. 830 00:38:57,650 --> 00:39:00,260 Vir dié van julle kan sien die verleentheid fout wat ek nou net gemaak het, 831 00:39:00,260 --> 00:39:00,830 daar is dit. 832 00:39:00,830 --> 00:39:04,490 >> So ek beweer dat dit 'n baie doeltreffende oplossing. 833 00:39:04,490 --> 00:39:07,310 Ek het toegeken soveel as ints Ek nodig het - een, twee, drie, 834 00:39:07,310 --> 00:39:09,100 vier, vyf of ses - 835 00:39:09,100 --> 00:39:11,660 en ek het dan gestoor die nommers binnekant van die skikking. 836 00:39:11,660 --> 00:39:15,220 Maar dink nie, dan wil ek voeg 'n waarde soos die nommer 8? 837 00:39:15,220 --> 00:39:16,100 Wel, waar dit gaan? 838 00:39:16,100 --> 00:39:18,530 Dink ek wil in te voeg 'n aantal soos 20. 839 00:39:18,530 --> 00:39:19,790 Wel, waar dit gaan? 840 00:39:19,790 --> 00:39:23,160 Iewers in die middel, of die getal 35 het om te gaan 841 00:39:23,160 --> 00:39:24,010 iewers aan die einde. 842 00:39:24,010 --> 00:39:25,320 Maar ek is al uit die ruimte. 843 00:39:25,320 --> 00:39:29,120 >> En so is dit 'n fundamentele uitdaging van skikkings wat nie is die oplossing. 844 00:39:29,120 --> 00:39:32,280 Ek beweer dat 'n oomblik gelede, GetString hierdie probleem oplos. 845 00:39:32,280 --> 00:39:37,380 As jy wil 'n sesde nommer in te voeg in hierdie skikking, wat ten minste een 846 00:39:37,380 --> 00:39:40,090 oplossing wat jy kan terugval op vir seker, net soos ons met GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Wat is dit? 849 00:39:46,030 --> 00:39:48,190 >> Wel, maak dit groter is makliker gesê as gedaan. 850 00:39:48,190 --> 00:39:52,810 Ons kan nie noodwendig maak die skikking groter, maar wat kan ons doen? 851 00:39:52,810 --> 00:39:56,570 Maak 'n nuwe skikking wat groter is, van die grootte 6, of dalk grootte 10, as ons wil 852 00:39:56,570 --> 00:40:00,490 om voor dinge te kry, en dan kopieer die ou verskeidenheid in die nuwe, en dan 853 00:40:00,490 --> 00:40:01,680 bevry die ou skikking. 854 00:40:01,680 --> 00:40:05,770 >> Maar wat is die loop van die tyd nou van die proses? 855 00:40:05,770 --> 00:40:09,870 Dit is 'n groot O van N, omdat die kopiëring gaan kos jou 'n paar eenhede 856 00:40:09,870 --> 00:40:13,480 tyd, so nie so ideaal as ons moet ken 'n nuwe skikking, wat gaan 857 00:40:13,480 --> 00:40:15,610 twee keer soveel verbruik geheue tydelik. 858 00:40:15,610 --> 00:40:16,660 Kopieer ou in 'n nuwe - 859 00:40:16,660 --> 00:40:18,800 Ek bedoel, dit is net 'n hoofpyn, wat is, weer, hoekom het ons geskryf 860 00:40:18,800 --> 00:40:19,920 GetString vir jou. 861 00:40:19,920 --> 00:40:21,380 >> So wat kan ons plaas doen? 862 00:40:21,380 --> 00:40:25,000 Wel, wat as ons data struktuur eintlik het gapings in dit? 863 00:40:25,000 --> 00:40:30,790 Veronderstel dat ek ontspan my doelwit om aangrensende stukke van die geheue, waar 9 864 00:40:30,790 --> 00:40:34,500 is reg langs tot 17, wat reg langs tot 22, en so aan. 865 00:40:34,500 --> 00:40:39,570 >> En veronderstel dat 9 kan wees hier in Geheue, en 17 kan hier asseblief In geheue, 866 00:40:39,570 --> 00:40:40,990 en 22 kan hier wees oor in die geheue. 867 00:40:40,990 --> 00:40:43,610 Met ander woorde, ek het nie nodig om hulle selfs tot meer terug. 868 00:40:43,610 --> 00:40:47,850 Ek het net een of ander manier ryg n naald deur middel van elkeen van hierdie getalle, of elke 869 00:40:47,850 --> 00:40:51,010 van hierdie nodes, as ons bel die reghoeke as ek het hulle getrek, te 870 00:40:51,010 --> 00:40:55,670 onthou hoe om te kry tot die laaste so knoop van die eerste. 871 00:40:55,670 --> 00:40:59,940 >> So, wat is die ontwikkeling rig Ons het onlangs gesien waarmee ek 872 00:40:59,940 --> 00:41:03,030 kan daardie draad te implementeer, of getrek hier, met wat ek kan 873 00:41:03,030 --> 00:41:05,430 implementeer die pyle? 874 00:41:05,430 --> 00:41:06,500 So wysers, reg? 875 00:41:06,500 --> 00:41:09,560 As ek ken nie net 'n int, maar 'n knoop - en deur 876 00:41:09,560 --> 00:41:10,810 knoop, ek het net bedoel houer. 877 00:41:10,810 --> 00:41:12,900 En visueel, ek bedoel 'n reghoek. 878 00:41:12,900 --> 00:41:16,420 So 'n knoop moet glo twee waardes te bevat - 879 00:41:16,420 --> 00:41:21,490 die int self, en dan, soos geïmpliseer deur die onderste helfte van die reghoek, 880 00:41:21,490 --> 00:41:23,010 genoeg ruimte vir 'n int. 881 00:41:23,010 --> 00:41:26,130 >> So dink net voor hier, hoe groot is hierdie knoop, hierdie 882 00:41:26,130 --> 00:41:27,170 houer in die vraag? 883 00:41:27,170 --> 00:41:29,250 Hoeveel grepe vir die int? 884 00:41:29,250 --> 00:41:31,310 Vermoedelik 4, al is dit dieselfde as gewoonlik. 885 00:41:31,310 --> 00:41:33,270 En dan hoeveel bytes vir die wyser? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 So hierdie houer, of die node, is gaan 'n 8-byte struktuur wees. 888 00:41:37,940 --> 00:41:41,760 O ja, en dit is 'n gelukkige toeval dat Ons het net het hierdie idee van 889 00:41:41,760 --> 00:41:44,400 'n struct, of 'n C-struktuur. 890 00:41:44,400 --> 00:41:48,890 >> So ek beweer dat ek wil 'n stap te neem na hierdie meer gesofistikeerde 891 00:41:48,890 --> 00:41:52,560 implementering van 'n lys van getalle, 'n gekoppel lys van getalle, ek moet 'n om te doen 892 00:41:52,560 --> 00:41:56,920 bietjie meer dink aan die voorkant en verklaar nie net 'n int, maar 'n struct 893 00:41:56,920 --> 00:41:58,620 wat ek sal noem, konvensionele hier, knoop. 894 00:41:58,620 --> 00:42:01,630 Ons kon noem dit iets is wat ons wil hê nie, maar knoop gaan wees tematiese in 'n baie 895 00:42:01,630 --> 00:42:03,560 van die dinge wat ons begin kyk na nou. 896 00:42:03,560 --> 00:42:06,480 >> Binnekant van die knoop is 'n int n. 897 00:42:06,480 --> 00:42:09,350 En dan is dit sintaksis, 'n bietjie vreemd op die eerste oogopslag - 898 00:42:09,350 --> 00:42:12,960 struct node * langs. 899 00:42:12,960 --> 00:42:16,900 Wel picturaal, wat is dit? 900 00:42:16,900 --> 00:42:21,000 Dit is die onderste helfte van die reghoek wat ons gesien 901 00:42:21,000 --> 00:42:22,730 net 'n oomblik gelede. 902 00:42:22,730 --> 00:42:27,600 >> Maar hoekom ek sê struct node * eerder as om net knoop *? 903 00:42:27,600 --> 00:42:31,370 Want as dit wyser wys by 'n ander knoop, dit is net die 904 00:42:31,370 --> 00:42:32,760 adres van 'n knoop. 905 00:42:32,760 --> 00:42:35,630 Dit is in ooreenstemming met wat ons het bespreek oor die wysers tot dusver. 906 00:42:35,630 --> 00:42:39,690 Maar hoekom, as ek beweer hierdie struktuur is genoem knoop, moet ek struct om te sê 907 00:42:39,690 --> 00:42:42,660 node binnekant hier? 908 00:42:42,660 --> 00:42:43,190 >> Presies. 909 00:42:43,190 --> 00:42:46,490 Dit is soort van 'n dom werklikheid van C. Die typedef, om so te praat, het nie 910 00:42:46,490 --> 00:42:47,220 gebeur het nie. 911 00:42:47,220 --> 00:42:48,510 C is super letterlik. 912 00:42:48,510 --> 00:42:51,050 Dit lui die kode bo na onder, van links na regs. 913 00:42:51,050 --> 00:42:54,930 En totdat dit treffers wat op die kommapunt Bottom line, raai wat nie 914 00:42:54,930 --> 00:42:57,590 bestaan ​​as 'n data tipe? 915 00:42:57,590 --> 00:42:59,060 Knoop, kwotasie unquote knoop. 916 00:42:59,060 --> 00:43:03,050 >> Maar as gevolg van die meer verbose verklaring wat ek gedoen het op die eerste lyn - 917 00:43:03,050 --> 00:43:05,340 typedef struct knoop - 918 00:43:05,340 --> 00:43:08,790 want dit het eerste gekom, voordat die krulhakies, dit is soort van soos 919 00:43:08,790 --> 00:43:11,800 pre-opvoeding klang dat jy weet wat, gee my 'n struct 920 00:43:11,800 --> 00:43:13,570 genoem struct knoop. 921 00:43:13,570 --> 00:43:16,270 Eerlik, ek hou nie van 'n beroep dinge struct knoop, struct knoop al 922 00:43:16,270 --> 00:43:17,090 Dwarsdeur my kode. 923 00:43:17,090 --> 00:43:20,660 Maar ek sal net gebruik om dit een keer, net binne, sodat ek kan effektief 924 00:43:20,660 --> 00:43:25,010 skep 'n soort van omsendbrief verwys, nie 'n verwysing na myself per se nie, maar 'n 925 00:43:25,010 --> 00:43:29,400 wyser na 'n ander van 'n identiese tipe. 926 00:43:29,400 --> 00:43:32,330 >> So dit blyk dat op 'n data struktuur soos hierdie, daar is 'n paar 927 00:43:32,330 --> 00:43:34,470 bedrywighede wat dalk van belang is vir ons. 928 00:43:34,470 --> 00:43:37,460 Ons wil dalk te voeg in 'n lys soos hierdie. 929 00:43:37,460 --> 00:43:39,850 Ons mag dalk wil om te verwyder uit 'n lys soos hierdie. 930 00:43:39,850 --> 00:43:43,490 Ons wil dalk die lys vir 'n te soek waarde, of meer algemeen, deurkruis. 931 00:43:43,490 --> 00:43:46,410 En deurkruis is net 'n fancy manier sê begin aan die linkerkant en beweeg al 932 00:43:46,410 --> 00:43:47,650 die pad na regs. 933 00:43:47,650 --> 00:43:52,640 >> En kennis, selfs met hierdie effens meer gesofistikeerde data struktuur, laat 934 00:43:52,640 --> 00:43:56,510 my voor dat ons 'n paar van kan leen die idees van die afgelope twee weke en 935 00:43:56,510 --> 00:43:58,410 implementering van 'n funksie genoem soek soos hierdie. 936 00:43:58,410 --> 00:44:01,360 Dit gaan om terug te keer waar of vals is, wat aandui, ja of 937 00:44:01,360 --> 00:44:03,390 Nee, n is in die lys. 938 00:44:03,390 --> 00:44:05,960 Die tweede argument is 'n wyser aan die lys self, so 'n 939 00:44:05,960 --> 00:44:07,920 wyser na 'n knoop. 940 00:44:07,920 --> 00:44:10,350 >> Al wat ek gaan doen dan is verklaar 'n tydelike veranderlike. 941 00:44:10,350 --> 00:44:12,730 Ons noem dit ptr deur konvensie, vir wyser. 942 00:44:12,730 --> 00:44:15,220 En ek gee dit gelyk is aan die die begin van die lys. 943 00:44:15,220 --> 00:44:16,680 >> En nou op die while loop. 944 00:44:16,680 --> 00:44:20,640 So lank as wat wyser is nie gelyk aan nul, ek gaan om te kyk. 945 00:44:20,640 --> 00:44:24,520 Is wyser pyl n gelyk aan die n wat in geslaag is? 946 00:44:24,520 --> 00:44:26,410 En wag 'n minuut - nuwe stukkie van die sintaksis. 947 00:44:26,410 --> 00:44:29,324 Wat is pyl al van 'n skielike? 948 00:44:29,324 --> 00:44:30,574 Ja? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Presies. 951 00:44:34,810 --> 00:44:38,860 So, terwyl 'n paar minute gelede, ons gebruik die dot-notasie iets om toegang te verkry 952 00:44:38,860 --> 00:44:43,080 binnekant van 'n die struct, as die veranderlike jy is nie die struct 953 00:44:43,080 --> 00:44:47,420 self nie, maar 'n verwysing na 'n struct, gelukkig, 'n stukkie van die sintaksis wat 954 00:44:47,420 --> 00:44:48,620 Ten slotte maak intuïtief sin. 955 00:44:48,620 --> 00:44:52,360 Die pyl beteken die wyser om te volg, soos ons pyle tipies beteken 956 00:44:52,360 --> 00:44:56,570 picturaal, en gaan data gebied binne. 957 00:44:56,570 --> 00:44:59,700 So pyl is dieselfde ding as dot, maar jy dit gebruik wanneer jy 'n muis. 958 00:44:59,700 --> 00:45:05,270 >> So net om dan vat, as die n veld binnekant van die struct genoem wyser 959 00:45:05,270 --> 00:45:07,760 gelyk is gelyk aan n, terug waar. 960 00:45:07,760 --> 00:45:11,970 Anders, hierdie lyn hier - wyser gelyk wyser volgende. 961 00:45:11,970 --> 00:45:17,540 So wat dit doen, kennisgewing, is as ek is tans te wys op die struct 962 00:45:17,540 --> 00:45:21,430 met 9, en 9 is nie die aantal Ek is op soek na - dink ek is op soek na 963 00:45:21,430 --> 00:45:22,830 vir n gelyk aan 50 - 964 00:45:22,830 --> 00:45:25,930 Ek gaan my tydelike wyser te werk om nie te wys op hierdie node 965 00:45:25,930 --> 00:45:31,190 nie, maar wyser pyl volgende, wat gaan my sit hier. 966 00:45:31,190 --> 00:45:34,270 >> Nou, ek besef is 'n warrelwind inleiding. 967 00:45:34,270 --> 00:45:37,380 Op Woensdag, sal ons werklik te doen om hierdie met 'n paar mense en met 'n paar meer 968 00:45:37,380 --> 00:45:38,900 kode teen 'n stadiger tempo. 969 00:45:38,900 --> 00:45:42,990 Maar besef, ons is nou die maak van ons data meer komplekse strukture sodat ons 970 00:45:42,990 --> 00:45:45,780 algoritmes kan kry meer doeltreffend, wat gaan wees vereiste vir 971 00:45:45,780 --> 00:45:50,500 pset ses, toe ons laai in, weer, dié 150,000 woorde nie, maar moet dit doen 972 00:45:50,500 --> 00:45:55,650 doeltreffend en ideaal, skep 'n program wat loop vir ons gebruikers nie in 973 00:45:55,650 --> 00:46:00,460 lineêre, nie in N-kwadraat, maar in konstante tyd, in die ideale. 974 00:46:00,460 --> 00:46:02,300 >> Ons sal sien dat jy op Woensdag. 975 00:46:02,300 --> 00:46:07,240 >> Spreker: By die volgende CS50, David vergeet sy basis geval. 976 00:46:07,240 --> 00:46:12,770 >> David Malan: En dit is hoe jy stuur SMS-boodskappe met C. Wat die - 977 00:46:12,770 --> 00:46:14,020 >> [Verskeie SMS-boodskap Kennisgewingsklanke] 978 00:46:14,020 --> 00:46:19,734