1 00:00:00,000 --> 00:00:02,670 [Powered by Google Translate] Artikel Problem Stel 2: Hacker Edition 2 00:00:02,670 --> 00:00:04,910 Rob Bowden, Harvard Universiteit 3 00:00:04,910 --> 00:00:07,410 Dit is CS50. CS50.TV 4 00:00:07,410 --> 00:00:15,770 So, ek is Rob. Ek is 'n senior in Kirkland. Dit is my derde jaar TFing CS50. 5 00:00:15,770 --> 00:00:22,220 Dit is die eerste keer dat ons is besig om te verander van die tradisionele lesing-styl artikel, 6 00:00:22,220 --> 00:00:25,610 waar ons net 'n soort van hersiening wat gebeur het in die lesing en dan julle vra vrae, 7 00:00:25,610 --> 00:00:32,250 nou na 'n baie meer probleem-gebaseerde, waar ons Gebruik spasies, en - 8 00:00:32,250 --> 00:00:37,410 O, so die idee is om te gaan na die skakel Ek het julle gestuur, en dan sal jy in my ruimte. 9 00:00:37,410 --> 00:00:42,410 Is daar iemand wat nie 'n laptop? Okay. 10 00:00:42,410 --> 00:00:47,050 So ons gaan om te word deur gebruik te maak van hierdie, en ons gaan om te doen probleme woon in artikel 11 00:00:47,050 --> 00:00:50,740 en bespreek hulle en die uitzoeken wat verkeerd is 12 00:00:50,740 --> 00:00:56,390 en ek kan trek sommige van die kode, en ek kan bespreek jou idees. 13 00:00:56,390 --> 00:01:02,140 So het almal het probleme? 14 00:01:02,140 --> 00:01:07,000 Jy kan chat op die kant, ek weet nie of ons sal rede vir daardie. 15 00:01:07,000 --> 00:01:12,270 Nou, soos die vorige supersection, as jy was op daardie klas, jy weet wat dit gaan. 16 00:01:12,270 --> 00:01:19,200 Op alle P stelle daar gaan wees hierdie afdelings. 17 00:01:19,200 --> 00:01:22,550 So P-set 2, spesifikasies, ek dink jy het dit gesien op P-set 1. 18 00:01:22,550 --> 00:01:27,400 Maar ons kan kyk na P-set 2 vir die wat ons gaan om te gaan oor vandag. 19 00:01:27,400 --> 00:01:29,460 En jy sal sien 'n gedeelte van die vrae. 20 00:01:29,460 --> 00:01:37,530 Sodat dit sal wees in al die P-stelle, daar sal 'n gedeelte van die vrae. 21 00:01:37,530 --> 00:01:41,340 Tot dusver het ons gesê, "Beskou dit 'n geleentheid om te oefen." 22 00:01:41,340 --> 00:01:44,940 Jy sal nie gevra word om hierdie program in te dien. 23 00:01:44,940 --> 00:01:48,480 Die idee is dat dit veronderstel is om te soort van help om te begin met die probleem stel. 24 00:01:48,480 --> 00:01:53,220 Ek dink op die Hacker uitgawe, word 'n baie van hulle veronderstel is om te wees net nuwe, interessante dinge om te leer. 25 00:01:53,220 --> 00:01:58,590 Hulle mag nie direk van toepassing is op die probleem stel. 26 00:01:58,590 --> 00:02:01,810 , En nou is ons nie met u dit stuur, maar in teorie, 27 00:02:01,810 --> 00:02:07,480 vir later probleem stelle, kan jy stuur hulle, en dus kan jy óf artikel 28 00:02:07,480 --> 00:02:10,380 of kyk na die artikel om die antwoorde te kry, of jy kan net kry hulle op jou eie 29 00:02:10,380 --> 00:02:16,350 As jy voel nie soos my teenwoordigheid geniet. 30 00:02:16,350 --> 00:02:21,010 Sodat die - ek dink dit is die eerste een. 31 00:02:21,010 --> 00:02:29,280 Oh. Ook onder hierdie afdelings van die vrae wat ons ook vra jy vrae oor die kortbroek. 32 00:02:29,280 --> 00:02:33,440 So ek dink, in teorie, jy veronderstel is om dit te kyk voordat hulle artikel, 33 00:02:33,440 --> 00:02:38,550 maar dit is goed as jy dit nie doen nie, ons gaan oor hulle in elk geval. 34 00:02:38,550 --> 00:02:42,590 Sodat ons kan begin met hierdie: "Hoe verskil 'n while lus van 'n do-while lus? 35 00:02:42,590 --> 00:02:46,210 Wanneer is die laaste veral nuttig? " 36 00:02:46,210 --> 00:02:49,390 So iemand enige? 37 00:02:49,390 --> 00:02:52,730 [Studente] Die do-while lus sal altyd ten minste een keer uit te voer. 38 00:02:52,730 --> 00:03:02,950 Ja. So wat is die verskil. 'N while lus - I'll doen dit net hier - terwyl loop, het ons die toestand 39 00:03:02,950 --> 00:03:19,760 reg hier, terwyl 'n doen-terwyl jy nie 'n voorwaarde tot kry ons hier af. 40 00:03:19,760 --> 00:03:24,130 En ja, wanneer jou program se uitvoer, en dit kry na die while lus, 41 00:03:24,130 --> 00:03:26,380 dit kontroleer of dit onmiddellik as hierdie toestand is waar. 42 00:03:26,380 --> 00:03:30,710 As daardie toestand is nie waar nie, dit sal net slaan oor die lus heeltemal. 43 00:03:30,710 --> 00:03:34,390 Do-while lus, as die program uitvoer, dit raak aan die "doen." 44 00:03:34,390 --> 00:03:37,920 Niks gebeur op hierdie punt, gaan net voort uitvoering. 45 00:03:37,920 --> 00:03:42,690 Dan wanneer dit treffers die "ruk," as die toestand waar, sal dit loop terug en doen dit weer 46 00:03:42,690 --> 00:03:46,730 en weer en weer totdat die toestand is nie waar nie en dan net val deur. 47 00:03:46,730 --> 00:03:50,600 Dus, die verskil is dat hierdie reg van die begin af kan slaan. 48 00:03:50,600 --> 00:03:56,770 Dit voer noodwendig een keer en dan kan uitvoer meer as die toestand is nog steeds waar. 49 00:03:56,770 --> 00:04:03,720 So sal die while lus net doen dit een keer, of - die while lus - kan ons nie nodig het om dit te doen nie, 50 00:04:03,720 --> 00:04:07,900 sedert sodra ons kry om dit, indien die toestand vals is, sal ons net reg slaan oor dit. 51 00:04:07,900 --> 00:04:11,770 AANGESIEN dat die do-while lus, sal ons dit uit te voer een keer, noodwendig nie. 52 00:04:11,770 --> 00:04:14,560 Dan, wanneer kry ons aan die voorwaarde, ons kyk of dit waar of vals is. 53 00:04:14,560 --> 00:04:19,790 As dit waar is, sal ons doen dit weer, indien dit onwaar is, sal ons net verder gaan. 54 00:04:19,790 --> 00:04:24,680 So wanneer die laaste is veral nuttig? 55 00:04:24,680 --> 00:04:31,190 Sodat ek kan sê dat in die geheel van die 4 jaar, 3 jaar, wat ook al, 56 00:04:31,190 --> 00:04:38,780 dat ek programmering, het ek gebruik gemaak van hierdie, soos, onder 10 keer. 57 00:04:38,780 --> 00:04:43,140 En waarskynlik 5 van hulle is in CS50 wanneer ons die invoering van do-while loops. 58 00:04:43,140 --> 00:04:47,510 So wanneer het jy do-while loops gebruik? 59 00:04:47,510 --> 00:04:49,510 Wanneer is die - ja? 60 00:04:49,510 --> 00:04:53,180 [Studente] As jy probeer om toevoer van die gebruiker, of iets te kry wat jy wil om te kyk - 61 00:04:53,180 --> 00:04:59,700 Ja. So do-while loops, toevoer van die gebruiker is die groot een. 62 00:04:59,700 --> 00:05:03,160 Dit is die rede waarom op die probleem vir die eerste paar stelle, wanneer jy wil die gebruiker te vra, soos, 63 00:05:03,160 --> 00:05:08,520 "Gee my 'n string," jy kan nie voortgaan nie totdat jy daardie string. 64 00:05:08,520 --> 00:05:12,980 En julle, noodwendig nie, moet ten minste een keer te vra vir die string. 65 00:05:12,980 --> 00:05:16,950 Maar dan as hulle iets sleg beantwoord, dan moet jy nodig het om te loop terug en vra weer. 66 00:05:16,950 --> 00:05:20,810 Maar anders as die toevoer van die gebruiker, dit is baie selde dat ek 'n geval teëkom 67 00:05:20,810 --> 00:05:27,170 waar ek wil loop "ten minste een keer", maar moontlik meer. 68 00:05:27,170 --> 00:05:33,370 Vrae of? Het iemand 'n do-while lus nêrens anders gebruik? 69 00:05:33,370 --> 00:05:36,780 Okay. So die volgende een: "Wat het swart identifiseerder 70 00:05:36,780 --> 00:05:43,310 gewoonlik 'n aanduiding of outputted deur kletteren? " 71 00:05:43,310 --> 00:05:47,380 So, watter soort van die kode kon ek skryf te kry "onverklaarde identifiseerder?" 72 00:05:47,380 --> 00:05:49,550 [Studente] dat x = 2? 73 00:05:49,550 --> 00:05:52,650 Sodat ons net kan probeer om dit hier, x = 2. 74 00:05:52,650 --> 00:06:04,830 Ons sal hardloop - oh, ek het dit nie op nie. So hier is ons kry - alles reg. 75 00:06:04,830 --> 00:06:07,100 "Gebruik van onverklaarde identifiseerder x." 76 00:06:07,100 --> 00:06:11,610 So dit is die onverklaarde identifiseer, 'n veranderlike. 77 00:06:11,610 --> 00:06:13,910 Sal dit dikwels noem 'n veranderlike 'n identifiseerder. 78 00:06:13,910 --> 00:06:17,300 Sodat dit dalk nie weet dat dit eintlik 'n veranderlike, dit nie weet wat dit is. 79 00:06:17,300 --> 00:06:19,380 So dit is 'n identifiseerder. 80 00:06:19,380 --> 00:06:26,060 So hoekom is dit receptie.Niet aangemelde? Ja. 81 00:06:26,060 --> 00:06:32,190 So te wees nie duidelik op terminologie, die verklaring van 'n veranderlike 82 00:06:32,190 --> 00:06:37,360 is wanneer jy sê "int x," of "string y," wat ook al. 83 00:06:37,360 --> 00:06:41,910 Die inisialisering van die veranderlike, of die opdrag van die veranderlike, 84 00:06:41,910 --> 00:06:44,510 is wanneer jy sê "x = 2." 85 00:06:44,510 --> 00:06:52,950 Sodat ons dit kan doen in afsonderlike stappe, int x, x = 2, en totdat ons kan 'n klomp dinge hier - 86 00:06:52,950 --> 00:07:00,350 maar totdat hierdie lyn gebeur, is nog steeds x geïnitialiseerd, maar dit verklaar is. 87 00:07:00,350 --> 00:07:06,760 En so kan ons natuurlik doen dit in 1 lyn, en nou is ons verklaar en inisialisering. 88 00:07:06,760 --> 00:07:10,730 Vrae? 89 00:07:10,730 --> 00:07:18,390 En uiteindelik, "Hoekom is die keiser Cipher nie baie veilig nie?" 90 00:07:18,390 --> 00:07:23,830 So die eerste, nie almal wil sê wat die keiser Cipher is? 91 00:07:23,830 --> 00:07:28,100 [Studente] Caesar Cipher is net dat jy die kaart, jy skuif elke brief, 92 00:07:28,100 --> 00:07:34,420 'n sekere aantal van die briewe gaan verby, en beweeg terug oor, en dit is nie baie veilig nie, want 93 00:07:34,420 --> 00:07:42,260 daar is net 26 moontlike opsies en jy het om te probeer om elke 1 van diegene totdat jy dit kry. 94 00:07:42,260 --> 00:07:45,470 Oh. Dus, moet ek herhaal? 95 00:07:45,470 --> 00:07:51,600 Die keiser Cipher, it's - ek bedoel, jy handel met dit op die probleme wat jy 96 00:07:51,600 --> 00:07:56,110 of ek dink die standaard uitgawe van die probleem stel wat is nie op die hacker uitgawe. 97 00:07:56,110 --> 00:08:01,550 So op die standaard uitgawe vir die probleem wat gestel is, kry jy 'n boodskap soos "Hello, world," 98 00:08:01,550 --> 00:08:08,410 en jy ook 'n getal soos 6, en neem jy die boodskap, en elke individuele karakter, 99 00:08:08,410 --> 00:08:11,310 jy draai dit met 6 posisies in die alfabet. 100 00:08:11,310 --> 00:08:16,560 So die "h" in Hello sou h-i-j-k-l-m-n. 101 00:08:16,560 --> 00:08:19,600 Dus is die eerste brief sou wees. Ons doen dieselfde ding met e. 102 00:08:19,600 --> 00:08:23,530 As ons 'n wil, z of iets, dan is ons terug draai om 'n. " 103 00:08:23,530 --> 00:08:29,280 Maar elke karakter kry gery 6 karakters later in die alfabet, en dit is nie baie veilig 104 00:08:29,280 --> 00:08:35,440 want daar is slegs 26 moontlikhede vir hoe baie maniere waarop jy kan 'n enkele letter draai. 105 00:08:35,440 --> 00:08:42,919 Sodat jy kan net probeer om al 26 van hulle en, vermoedelik, vir 'n lang genoeg boodskap, 106 00:08:42,919 --> 00:08:46,860 slegs 1 van daardie moontlike 26 dinge gaan leesbaar wees, 107 00:08:46,860 --> 00:08:50,300 en die leesbare een gaan na die oorspronklike boodskap te wees. 108 00:08:50,300 --> 00:08:56,240 So dit is nie 'n baie goeie manier om van die versleutelen van enigiets op alle. 109 00:08:56,240 --> 00:08:59,070 Onverwant aan dié kortbroek, "Wat is 'n funksie?" 110 00:08:59,070 --> 00:09:03,370 So, wat is 'n funksie? Ja. 111 00:09:03,370 --> 00:09:11,640 [Studente] Dit is soos 'n aparte stukkie van die kode wat jy kan bel deur te gaan en dan kry die terugkeer waarde van watter. 112 00:09:11,640 --> 00:09:18,160 Ja. So ek sal dit beantwoord deur ook die beantwoording van die volgende - of herhaling deur ook net die beantwoording van die volgende een. 113 00:09:18,160 --> 00:09:22,410 Jy kan gebruik om funksies in plaas van net kopieer en plak van die kode oor en oor weer. 114 00:09:22,410 --> 00:09:27,200 Neem dat die kode, sit dit in 'n fuction, en dan kan jy net noem die funksie 115 00:09:27,200 --> 00:09:29,870 waar jy is kopieer en plak. 116 00:09:29,870 --> 00:09:33,350 So funksies is nuttig. 117 00:09:33,350 --> 00:09:35,860 So nou het ons sal doen om werklike probleme. 118 00:09:35,860 --> 00:09:46,490 Die eerste een. Dus is die idee van die eerste een is, het jy dit slaag 'n string, en ongeag van die - 119 00:09:46,490 --> 00:09:52,060 of sê dit kleinletter? Dit sê nie alle kleinletters. 120 00:09:52,060 --> 00:09:57,730 So kan die boodskap enigiets wees, en - oh no. Dit doen nie. 121 00:09:57,730 --> 00:10:01,610 "Vir eenvoud, kan u aanvaar dat die gebruiker sal net insette klein letters en spasies." 122 00:10:01,610 --> 00:10:08,180 So ons gaan dit 'n boodskap met slegs kleinletters en dan het ons afwissel 123 00:10:08,180 --> 00:10:15,450 tussen hoofletters en klein - ons verander om die string te hoofletters en klein te wees, afgewissel. 124 00:10:15,450 --> 00:10:22,920 So voordat ons gee jou 'n tweede selfs duik in die probleem, 125 00:10:22,920 --> 00:10:32,420 Wat is die eerste ding wat ons nodig het om te doen? 126 00:10:32,420 --> 00:10:36,900 O, wat het ek net op? O, ek het net op 'n e-pos hier gekliek. 127 00:10:36,900 --> 00:10:42,870 Dus is die eerste ding wat ons nodig het om te doen - ek is op soek op die verkeerde een? 128 00:10:42,870 --> 00:10:49,320 Is dit deel van hierdie een? 129 00:10:49,320 --> 00:10:51,320 Nee, dit is nog steeds daar, al is. 130 00:10:51,320 --> 00:10:55,160 Okay, nog steeds hier. 131 00:10:55,160 --> 00:11:03,160 Nou kan ons nie aanvaar? Ja. Hier kan ons nie aanvaar dat dit is slegs onderkasletters en spasies. 132 00:11:03,160 --> 00:11:07,770 So nou het ons te doen met die feit dat die letters kan wees wat ons wil hê hulle moet wees. 133 00:11:07,770 --> 00:11:11,910 En so is die eerste ding wat ons wil doen is net die boodskap kry. 134 00:11:11,910 --> 00:11:19,790 Ons het net nodig het om 'n string te kry, string s = GetString, okay. 135 00:11:19,790 --> 00:11:24,890 Nou is hierdie probleem, daar is 'n paar van die maniere om dit te doen. 136 00:11:24,890 --> 00:11:29,840 Maar ons gaan om te wil bis-operateurs om hier te gebruik. 137 00:11:29,840 --> 00:11:35,280 Is daar mense wat óf was nie by die supersection, 138 00:11:35,280 --> 00:11:37,480 of iets, en nie weet wat bis operateurs is? 139 00:11:37,480 --> 00:11:41,710 Of hoe hulle op enige manier verband hou met ASCII? 140 00:11:41,710 --> 00:11:45,650 [Studente] Ek was nie by die supersection, maar ek weet wat bis operateurs is. 141 00:11:45,650 --> 00:11:49,560 Okay. Ek het dit so is dan nie oor die basiese beginsels van hulle om te gaan, maar ek sal verduidelik 142 00:11:49,560 --> 00:11:51,830 wat gaan ons hier wil gebruik. 143 00:11:51,830 --> 00:11:59,680 So 'A': Binêre voorstelling van kapitaal A, die nommer is 65. 144 00:11:59,680 --> 00:12:07,560 Ek gaan net om na te kyk - 41 gaan wees 01.000.001. 145 00:12:07,560 --> 00:12:14,170 So dit moet 65 in desimale, so dit is die binêre voorstelling van die karakter kapitaal A. 146 00:12:14,170 --> 00:12:19,440 Nou, die binêre voorstelling van die karakter onderkas 'a' 147 00:12:19,440 --> 00:12:33,350 gaan dieselfde ding, amper. Is dat - 6, ja. Dit is reg. 148 00:12:33,350 --> 00:12:37,670 So binêre kapitaal A, binêre kleinletter 'n. " 149 00:12:37,670 --> 00:12:43,940 So opmerk dat die verskil tussen A en 'a' is hierdie enkele bietjie. 150 00:12:43,940 --> 00:12:49,440 En dit gebeur aan die 32 bit, die bietjie wat die getal 32. 151 00:12:49,440 --> 00:12:53,910 En dit maak sin, aangesien 'n 65, 'a' is 97. 152 00:12:53,910 --> 00:12:56,610 Die verskil tussen hulle is 32. 153 00:12:56,610 --> 00:13:03,770 So nou weet ons dat ons kan omskep van A tot 'n "deur die neem van 'n 154 00:13:03,770 --> 00:13:09,710 en bis ORing dit, met wat lyk soos 'n 1. 155 00:13:09,710 --> 00:13:20,900 Dit is 'n bis of, met 00100000, en dat sal gee ons 'n. " 156 00:13:20,900 --> 00:13:26,850 En ons kan kry van 'n "A bis ANDing 157 00:13:26,850 --> 00:13:33,700 11, 0 in daardie plek, 11.111. 158 00:13:33,700 --> 00:13:43,840 So, dit sal dan gee ons presies wat 'n "was nie, maar kanselleer hierdie individuele bietjie, 159 00:13:43,840 --> 00:13:50,070 so ons sal moet 01000001, ek weet nie of ek reg getel het. 160 00:13:50,070 --> 00:13:56,750 Maar hierdie tegniek van bis-ORing te kry van kapitaal te onderkas, 161 00:13:56,750 --> 00:14:02,080 en bis-ANDing van kleinletters tot kapitaal te kry, is nie eksklusief aan A. 162 00:14:02,080 --> 00:14:06,510 Al die briewe, K vs k, Z vs z, 163 00:14:06,510 --> 00:14:10,080 almal van hulle is net deur hierdie enkele bietjie gaan verskil. 164 00:14:10,080 --> 00:14:16,290 En sodat jy kan gebruik om dit te verander van 'n kleinletter 'n hoofletter en vice versa. 165 00:14:16,290 --> 00:14:26,670 Okay. So 'n maklike manier om uit hierdie - in plaas van om te 166 00:14:26,670 --> 00:14:32,170 skryf watter 1011111 is - 'n maklike manier om hierdie getal te verteenwoordig, en dit is nie een 167 00:14:32,170 --> 00:14:39,710 wat ek gegaan het oor in die supersection, maar tilde (~) is 'n ander bis operateur. 168 00:14:39,710 --> 00:14:42,520 Wat ~ doen lyk dit by die bietjie verteenwoordiging. 169 00:14:42,520 --> 00:14:45,630 Kom ons neem 'n aantal. 170 00:14:45,630 --> 00:14:53,130 Dit is net 'n binêre getal, en wat ~ nie is dit net al die stukkies flips. 171 00:14:53,130 --> 00:15:00,630 So dit was 'n 1, nou 'n 0, hierdie is 'n 0, nou 1, 010.100. 172 00:15:00,630 --> 00:15:08,320 So dit is al wat ~ nie. So 32 gaan die nommer - ontslae te raak van daardie - 173 00:15:08,320 --> 00:15:23,320 so 32 gaan na die aantal 00.100.000, en so ~ van hierdie gaan wees 174 00:15:23,320 --> 00:15:29,980 hierdie nommer hier dat ek 'n "met ANDed. 175 00:15:29,980 --> 00:15:35,600 Nie almal sien dat? Dit is redelik algemeen, soos wanneer jy wil om uit te vind 176 00:15:35,600 --> 00:15:40,740 vir later dinge wat ons kan sien, wanneer ons wil om te sien of - 177 00:15:40,740 --> 00:15:44,710 of ons wil alles, elke bietjie stel, behalwe vir 1 178 00:15:44,710 --> 00:15:47,910 jy is geneig om te doen ~ van die bietjie dat ons nie wil hê. 179 00:15:47,910 --> 00:15:53,090 Sodat ons nie wil hê dat die 32 bit stel, sodat ons nie ~ 32. 180 00:15:53,090 --> 00:15:57,790 Okay. Sodat ons kan gebruik maak van al van diegene hier. 181 00:15:57,790 --> 00:16:03,000 Alle reg, sodat dit is goed as jy nie doen nie, sal ons stadig loop oor saam, 182 00:16:03,000 --> 00:16:11,870 of loop oor hierdie, so - deur middel van hierdie. Loop deur middel van hierdie. 183 00:16:11,870 --> 00:16:20,790 So ons het ons string, en ons wil loop oor elke karakter in die string en iets doen om dit te. 184 00:16:20,790 --> 00:16:26,710 So, hoe doen ons loop oor 'n string? Wat moet ons gebruik? 185 00:16:26,710 --> 00:16:30,980 Ek is nie van plan om dit te doen hier. Ja. 186 00:16:30,980 --> 00:16:42,940 So ek het my Iterator, en hy het gesê dit, maar hoe weet ek hoeveel karakters is in die tou? 187 00:16:42,940 --> 00:16:47,030 Strlen (s), dan sal ek + +. 188 00:16:47,030 --> 00:16:49,860 So, wat ek hier gedoen het is nie die beste manier van dinge doen. 189 00:16:49,860 --> 00:16:51,860 Is daar iemand weet hoekom? 190 00:16:51,860 --> 00:16:55,290 Omdat jy die beheer van die taal van die string elke enkele keer. 191 00:16:55,290 --> 00:17:06,859 So ons gaan wil strlen om te beweeg, ek kon sê hier, int lengte = strlen (s), 192 00:17:06,859 --> 00:17:11,900 en dan moet ek 00:17:20,410 Ek kan ook doen int i = 0, lengte = strlen (s). 194 00:17:20,410 --> 00:17:25,010 En so het dit is 'n bietjie beter, aangesien ek nou het die omvang beperk 195 00:17:25,010 --> 00:17:29,150 van die veranderlike lengte te verklaar net hierdie "" loop, in plaas van dit voor 196 00:17:29,150 --> 00:17:34,990 en dat dit bestaan ​​altyd, en in die geval dat jy nie vang waarom dit is sleg, 197 00:17:34,990 --> 00:17:39,410 of waarom die oorspronklike was sleg, it's - begin by die for-lus. 198 00:17:39,410 --> 00:17:43,380 Ek sien die toestand. I 00:17:46,790 So die lengte van s, laat ons werk met "hallo" die hele tyd. 200 00:17:46,790 --> 00:17:49,670 So, die lengte van s, h-e-l-l-o. Lengte is 5. 201 00:17:49,670 --> 00:17:57,580 So i = 0, lengte is 5, so ek is nie <5, so die lus gaan voort. 202 00:17:57,580 --> 00:18:02,750 Dan gaan ons weer. Ons maak seker die toestand. I 00:18:08,390 So laat ons gaan die lengte van Hello. H-e-l-l-o. Dit is 5, ek is nie <5, so ons weer voortgaan. 204 00:18:08,390 --> 00:18:13,330 So ons is bereken, het ons hallo is toe, vir elke iterasie van die lus, 205 00:18:13,330 --> 00:18:17,380 selfs gedink dit gaan nooit verander nie, dit is altyd gaan wees 5. 206 00:18:17,380 --> 00:18:22,530 Sodat ons onthou net 5 voor te stel, en nou is alles is beter. 207 00:18:22,530 --> 00:18:24,990 So iterating oor die hele string. 208 00:18:24,990 --> 00:18:31,470 Wat wil ons vir elke karakter van die string te doen? 209 00:18:31,470 --> 00:18:38,510 [Student praat, onverstaanbaar] 210 00:18:38,510 --> 00:18:47,000 Ja. So, as die karakter is 'n nie-alfabetiese, dan het ons wil net daaroor te slaan. 211 00:18:47,000 --> 00:18:52,300 Omdat ons net omgee oor die alfabetiese letters, ons kan nie 'n aantal kapitaliseer. 212 00:18:52,300 --> 00:19:10,850 So, hoe kan ons dit doen? Sodat ons toestand, so as ons iets wil hê - kyk of dit alfabetiese. 213 00:19:10,850 --> 00:19:14,060 So, hoe gaan ons dit doen? 214 00:19:14,060 --> 00:19:18,720 [Studente] Jy kan nie net gebruik maak van die funksie is alfa. 215 00:19:18,720 --> 00:19:23,160 Is dit ingesluit in enige van hierdie, of enige sluit soos, char.h of iets? 216 00:19:23,160 --> 00:19:32,710 Laat ons nie gebruik maak van die alfa-funksie, en die eksplisiete gebruik - sodat ons s [i], 217 00:19:32,710 --> 00:19:40,460 wat is die agtste karakter van s, onthou dat 'n string is 'n verskeidenheid van die karakters, 218 00:19:40,460 --> 00:19:43,180 sodat die agtste karakter van s. 219 00:19:43,180 --> 00:19:49,280 Nou, as dit is 'n hoofletter, ons weet dit het om te wees in 'n spesifieke reeks. 220 00:19:49,280 --> 00:19:54,370 En wat is wat wissel? 221 00:19:54,370 --> 00:20:07,860 Ja. So as [i] is ≥ 65, en s [i] ≤ 90, wat moet ek doen plaas? 222 00:20:07,860 --> 00:20:18,470 Ja. So jy moet absoluut nooit eens die ASCII-waardes van enigiets ooit nodig hê om te weet. 223 00:20:18,470 --> 00:20:25,640 Nooit dink van die nommers 65, 90, 97 en 102, of wat dit ookal is. 224 00:20:25,640 --> 00:20:32,470 Jy hoef nie - 112 - jy hoef nie dié by om te weet? Wat verkeerd is. 225 00:20:32,470 --> 00:20:41,940 Gebruik slegs die enkel-kwotasie karakters, enkel aanhaling konstantes. So 'A' en minder as 90 is "Z." 226 00:20:41,940 --> 00:20:47,930 En dit is aansienlik beter - Ek sou nie weet uit die top van my kop dat Z is 90. 227 00:20:47,930 --> 00:20:52,690 Ek weet uit die top van my kop dat 'Z' is die hoofstad Z. 228 00:20:52,690 --> 00:21:02,100 So lank as wat dit is in die reeks van kapitaal A tot kapitaal Z, of ons kan kyk vir onderkasletters, 229 00:21:02,100 --> 00:21:17,010 Of as dit in die reeks ≥ 'a' en ≤ z. 230 00:21:17,010 --> 00:21:19,010 So dit is ons toestand. 231 00:21:19,010 --> 00:21:22,520 Die styl waar hierdie dinge te sit wissel. 232 00:21:22,520 --> 00:21:29,520 Ek sal dit doen soos hierdie. 233 00:21:29,520 --> 00:21:31,520 Nou, doen wat ons wil om dit te doen? 234 00:21:31,520 --> 00:21:39,530 Ons weet dat hierdie brief is 'n karakter, 'n alfabetiese karakter. 235 00:21:39,530 --> 00:21:46,270 Sodat ons nodig het om te wissel tussen of dit nou 'n hoofletter of 'n kleinletter. 236 00:21:46,270 --> 00:21:48,820 Hoe hou ons die spoor van watter een ons dit wil hê? 237 00:21:48,820 --> 00:21:55,520 [Student stemme, onverstaanbaar] 238 00:21:55,520 --> 00:21:59,150 So ja, maar laat my gaan. 239 00:21:59,150 --> 00:22:04,910 Module 0-2 is gesê, was 'n voorstel uitgegooi, en ek stem saam met wat. 240 00:22:04,910 --> 00:22:11,780 Behalwe kennis dat, soos - is dit die geval? Ja. 241 00:22:11,780 --> 00:22:18,270 Dit is elke ander een, maar ons kan nie module 2 van i, of i mod 2, aangesien 242 00:22:18,270 --> 00:22:22,950 Let op dat E kapitaal en 'a' is kleinletter? Maar daar is 'n ruimte wat skeiding tussen hulle? 243 00:22:22,950 --> 00:22:27,150 So het hulle gaan na dieselfde mod 2, maar hulle is verskillende gevalle. 244 00:22:27,150 --> 00:22:29,150 [Student vraag, onverstaanbaar] 245 00:22:29,150 --> 00:22:34,690 Ja. So ons is maar net gaan om 'n telling te hou. 246 00:22:34,690 --> 00:22:38,730 Ons kan dit ook doen wat hier as ons wou, wat dalk 'n bietjie lomp 247 00:22:38,730 --> 00:22:41,300 in die vir lus verklarings; Ek sal dit hier. 248 00:22:41,300 --> 00:22:48,840 So int tel = begin by 0. 249 00:22:48,840 --> 00:22:54,070 En so nou, ek gaan om te tel hoeveel alfabetiese karakters wat ons gehad het. 250 00:22:54,070 --> 00:22:59,550 Sodat ons onvermydelik gaan tel + + aangesien ons nog 'n alfabetiese karakter. 251 00:22:59,550 --> 00:23:09,130 Maar, so nou wat jy sê as reken mod 2. 252 00:23:09,130 --> 00:23:12,590 So, wat as reken mod 2? Oh. Ek sal doen == 0 vir nou. 253 00:23:12,590 --> 00:23:21,740 Ons sal ook gaan oor dat. So as reken mod 2 == 0, wat dan? 254 00:23:21,740 --> 00:23:27,830 [Studente antwoord, onverstaanbaar] 255 00:23:27,830 --> 00:23:32,750 Daarom wil ons dit aan die einde hoofletters. 256 00:23:32,750 --> 00:23:37,520 Daar is 2 gevalle, hoofletters en kleinletters is die 2 gevalle. 257 00:23:37,520 --> 00:23:40,990 So as ons in klein letters is wat ons nodig het om te maak dit n hoofletter. 258 00:23:40,990 --> 00:23:43,710 As dit is hoofletters ons hoef nie iets te doen. 259 00:23:43,710 --> 00:23:50,760 Maar, daar is 'n manier - shouldn't het gedraai - 260 00:23:50,760 --> 00:23:54,800 dat ons nie eens nodig het om te kyk of dit hoofletters of klein? 261 00:23:54,800 --> 00:24:02,240 Wat kan ons doen om altyd seker maak dat ons altyd eindig op hoofletters? 262 00:24:02,240 --> 00:24:07,830 So let op wat ons gedoen het vir kleinletter 'a', wat as ons het dit gedoen presies dieselfde ding na 'n hoofletter A? 263 00:24:07,830 --> 00:24:11,900 Is hoofletter 'n verandering, of nie die waarde verander? 264 00:24:11,900 --> 00:24:23,100 Ja. So 'n hoofletter bis ANDed met ~ 32 gaan dat dieselfde hoofletters karakter 265 00:24:23,100 --> 00:24:29,220 omdat die 32ste bietjie vir enige hoofletters karakter is nie ingestel. 266 00:24:29,220 --> 00:24:40,920 So as ons wil hê die karakter s [i], wil ons dit onderkas of hoofletters te bring. 267 00:24:40,920 --> 00:24:46,890 So as dit was klein letters, dit is nou hoofletters, al was dit hoofletters, is dit nog hoofletters, en dit is dit. 268 00:24:46,890 --> 00:24:54,290 Ek sê dit in die supersection: Jy kan 32 as jy wil, maar ek is geneig om te verkies om te doen 'a' - 'n, 269 00:24:54,290 --> 00:25:01,150 in plaas van net plain 32, want dit kan enige ander bietjie. 270 00:25:01,150 --> 00:25:03,610 Na afloop van die 32-bis, kan dit enige van hierdie, of sou ons nie genoeg 271 00:25:03,610 --> 00:25:05,840 getalle al die karakters voor te stel. 272 00:25:05,840 --> 00:25:09,110 So as jy die 32-bis, kan dit die 64 bit wees, kan dit die 128 bit. 273 00:25:09,110 --> 00:25:13,990 Enige van daardie stukkies kan die bietjie wat onderskei tussen hoofletters en kleinletters. 274 00:25:13,990 --> 00:25:18,350 Sou ek nie nodig het om te weet dat dit is die 32 bit. 275 00:25:18,350 --> 00:25:27,130 Ek kan dit gebruik om 'n "- die bietjie wat verskil tussen die twee te kry 276 00:25:27,130 --> 00:25:33,000 sonder om staat te maak op die magie getal wat is 32. 277 00:25:33,000 --> 00:25:38,770 En so moet julle nou, anders tel was vreemd, en so wat ek wil om dit te doen? 278 00:25:38,770 --> 00:25:43,920 [Student antwoorde, onverstaanbaar] 279 00:25:43,920 --> 00:25:45,920 [Studente] Wat is dit? 280 00:25:45,920 --> 00:25:49,850 Ek sal dit doen in 1 sekonde. 281 00:25:49,850 --> 00:25:55,690 So nou as ek wil - ek wil om seker te maak die karakter nou onderkasletters, 282 00:25:55,690 --> 00:26:04,140 en daarom kan ek of deur 32, en 32 betekenis 'a' - A. 283 00:26:04,140 --> 00:26:06,510 Maar kennisgewing, deur dieselfde redenasie as die vorige een, dat, indien 284 00:26:06,510 --> 00:26:11,670 die brief was reeds klein letters, dan ORing deur 32 hou dit net klein letters. 285 00:26:11,670 --> 00:26:16,220 Dit het nie verander nie die oorspronklike karakter. 286 00:26:16,220 --> 00:26:19,910 Maar nou het ek nie gesê: "As dit is klein letters, vergeet dit te vermy, 287 00:26:19,910 --> 00:26:23,650 as dit is hoofletters, dan is dit verander. " 288 00:26:23,650 --> 00:26:26,900 Dit is baie meer gerieflik om dit te doen. 289 00:26:26,900 --> 00:26:33,190 [Studente] Sou dat die strategie van die aftrekking van die hoofletters van die kleinletter werk as dit nie was 32? 290 00:26:33,190 --> 00:26:35,330 As dit was, soos 34 of iets? 291 00:26:35,330 --> 00:26:41,840 So, wat jy nodig het om te weet dat die verskil tussen die 2? >> 1 bit. 292 00:26:41,840 --> 00:26:49,840 Dit kan meer as 1 bietjie, so lank as wat al die stukkies onder hierdie posisie is dieselfde. 293 00:26:49,840 --> 00:26:58,500 So ons moet ten minste 26 karakters - of, daar is 26 karakters. 294 00:26:58,500 --> 00:27:04,590 So ons moet ten minste 26 nommers die verskil te stel - 295 00:27:04,590 --> 00:27:07,650 Die verskil tussen A en 'a' het ten minste 26, 296 00:27:07,650 --> 00:27:10,760 of anders sou ons nie verteenwoordig al die hoofstad. 297 00:27:10,760 --> 00:27:18,630 Dit beteken dat A, as ons begin by 1, dit gaan al hierdie stukkies te gebruik, 298 00:27:18,630 --> 00:27:23,900 almal van hierdie eerste 5 stukkies, alles voor te stel deur middel van Z. 299 00:27:23,900 --> 00:27:32,170 Dit is die rede waarom die volgende bietjie, of dit bietjie, die volgende bietjie is die een wat gekies het om te onderskei tussen A en 'n. " 300 00:27:32,170 --> 00:27:40,930 Dit is ook die rede waarom, in ASCII tabel, is daar 5 simbole skei hoofletters van kleinletters. 301 00:27:40,930 --> 00:27:49,050 Sedert dit is die simbole, die ekstra 5 wat bring die 32 synde die verskil tussen hulle. 302 00:27:49,050 --> 00:27:51,840 [Studente] Sodat ons kan dit doen, want ASCII is ontwerp dat die pad. 303 00:27:51,840 --> 00:27:57,280 Ja. Maar ASCII - die verskil kan ook beide van hierdie stukkies. 304 00:27:57,280 --> 00:28:12,040 Soos, as A 10000001, en 'a' is 11100001 - ek vergeet, wat ook al. 305 00:28:12,040 --> 00:28:18,100 Maar as dit was, dan kon ons nog steeds gebruik 'a' - A. 306 00:28:18,100 --> 00:28:22,650 Dit is nou net die verskil tussen A en 'a' is nog steeds hierdie 2 stukkies. 307 00:28:22,650 --> 00:28:32,240 Ek dink dat dit 48 geskryf. Is dit 32 + 64? Ek dink dit is? 308 00:28:32,240 --> 00:28:40,160 Sou dit nog steeds 2 stukkies, elke enkele karakter, soos, Z en z, K en k, 309 00:28:40,160 --> 00:28:45,160 sou hulle nog steeds presies dieselfde stukkies wat behalwe vir die 2 stukkies. 310 00:28:45,160 --> 00:28:48,870 So lank as wat dit is altyd waar is, ongeag van as ons die gebruik van ASCII of 'n ander stelsel, 311 00:28:48,870 --> 00:28:53,050 so lank as wat daar is net 'n sekere aantal bisse wat is verskillend vir elke karakter, 312 00:28:53,050 --> 00:28:55,050 dan is dit werk goed. 313 00:28:55,050 --> 00:29:06,110 Dit is net dat 32 opgestel is, want dit is die eerste een wat ons kan moontlik gebruik. >> Cool. 314 00:29:06,110 --> 00:29:14,520 Ek is geneig om te verkies, in geval jy nie gesien het nie, as die blok is slegs 'n enkele lyn, 315 00:29:14,520 --> 00:29:24,280 jy kan ontslae te raak van die kode tussen krulhakies, so ek is geneig om te verkies om dit te doen. 316 00:29:24,280 --> 00:29:34,010 Ook, jy weet hoe ons die dinge kan doen soos s [i] + = 1? 317 00:29:34,010 --> 00:29:41,090 Jy kan ook 's [i] bis EN = 32. 318 00:29:41,090 --> 00:29:46,400 En bis OF = 32. 319 00:29:46,400 --> 00:29:51,490 , Tel ook mod 2 == 0. 320 00:29:51,490 --> 00:30:00,900 So onthou dat - Ek sal dit nie skryf nie - enige nie-nul waarde is waaragtig en 0 is vals. 321 00:30:00,900 --> 00:30:07,880 So "as reken mod 2 == 0" is dieselfde as om te sê "indien nie tel mod 2." 322 00:30:07,880 --> 00:30:11,580 Ek sou dit waarskynlik net omgekeer die lyne en gesê, "as reken mod 2, 323 00:30:11,580 --> 00:30:15,350 doen of 1, anders die EN 1, "sodat ek het nie nodig om die" nie. " 324 00:30:15,350 --> 00:30:18,650 Maar dit werk net so goed. 325 00:30:18,650 --> 00:30:25,660 En wat anders kan ek hier doen? 326 00:30:25,660 --> 00:30:29,060 Jy kan kombineer hulle met 'n drieledige as jy wou, maar dan wil net maak dinge Messier 327 00:30:29,060 --> 00:30:33,770 en waarskynlik meer moeilik om te lees, sodat ons nie sal doen nie. 328 00:30:33,770 --> 00:30:37,330 Iemand enige ander voorstelle? 329 00:30:37,330 --> 00:30:41,580 Is dat al die probleem gevra vir? O ja. 330 00:30:41,580 --> 00:30:51,070 So ontslae te raak van hierdie leë lyne, nou sal ons druk f,% s om die een vir Strykers, 331 00:30:51,070 --> 00:30:56,620 Ons sal druk f, s. 332 00:30:56,620 --> 00:30:59,330 Laat ons nou loop dit. Het ek iets verkeerd doen? 333 00:30:59,330 --> 00:31:03,200 Dit is 'n \ "; Ek wil 'n. 334 00:31:03,200 --> 00:31:07,840 Okay. Nou sal ons voer dit uit. Dit sal waarskynlik op my skreeu. 335 00:31:07,840 --> 00:31:11,250 Strlen is in string.h. 336 00:31:11,250 --> 00:31:14,290 So, dit is die nice ding oor die geratel is dit vir jou vertel wat dit is in, 337 00:31:14,290 --> 00:31:19,140 in plaas van GCC wat net sê, "Hey, jy iets vergeet, ek weet nie wat dit was nie." 338 00:31:19,140 --> 00:31:29,220 Maar dit sal my vertel, "Jy bedoel string.h in te sluit." 339 00:31:29,220 --> 00:31:32,130 So ek het nie gevra vir enigiets nie, so dit is nie iets te sê nie. 340 00:31:32,130 --> 00:31:42,540 Maar ons sal vir hulle 'n voorbeeld te doen, "thanks 4 the add". 341 00:31:42,540 --> 00:31:47,880 Dit lyk reg. Hoera. 342 00:31:47,880 --> 00:31:52,370 So om terug te keer na jou hoof, ek het byna nooit doen nie. 343 00:31:52,370 --> 00:31:57,110 Dit is opsioneel. En die belangrikste is die enigste funksie waarvoor dit ontwerp is opsioneel. 344 00:31:57,110 --> 00:32:07,140 As jy nie iets uit die hoof terug, is dit veronderstel dat jy bedoel 0 om terug te keer. 345 00:32:07,140 --> 00:32:13,070 Vrae? 346 00:32:13,070 --> 00:32:20,980 Okay. So nou die tweede probleem. 347 00:32:20,980 --> 00:32:24,810 "Herroep van week 2 se tweede lesing dat die uitruiling van 2 veranderlikes se waardes deur ' 348 00:32:24,810 --> 00:32:30,780 die 2 veranderlikes na 'n funksie (selfs al genoem swap) nie presies nie werk nie, ten minste nie sonder 'wysers. " 349 00:32:30,780 --> 00:32:37,020 En ignoreer verwysings totdat ons vir hulle. 350 00:32:37,020 --> 00:32:40,070 Ons wil 2 veranderlikes te ruil, maar ons is nie die gebruik van 'n funksie om dit te doen. 351 00:32:40,070 --> 00:32:43,410 Ons is nog steeds gaan om dit te doen in die hoof soos dit sê. 352 00:32:43,410 --> 00:32:48,360 Maar die 2 veranderlikes te gebruik, doen ons nie wil hê dat 'n tydelike veranderlike te gebruik. 353 00:32:48,360 --> 00:32:50,770 Daar is 2 maniere om dit te doen. 354 00:32:50,770 --> 00:32:56,310 Jy kan dit doen deur gebruik te maak van jou tradisionele binêre operateurs. 355 00:32:56,310 --> 00:33:00,180 So ken niemand 'n vinnige en vuil manier om dit te doen? 356 00:33:00,180 --> 00:33:07,650 Dit kan eintlik 'n minuut van denke. As wat ek het - 357 00:33:07,650 --> 00:33:12,130 Ek sal die probleem soos hulle vra. So as ek het 2 veranderlikes, A, wat net 'n heelgetal 358 00:33:12,130 --> 00:33:17,800 dat hulle my gee, en som veranderlike B, wat is 'n ander heelgetal wat ek gegee het. 359 00:33:17,800 --> 00:33:22,700 So as ek het hierdie 2 veranderlikes, nou ek wil om dit te ruil. 360 00:33:22,700 --> 00:33:31,550 Die tradisionele, deur gebruik te maak van jou gereelde binêre operateurs, ek bedoel, soos +, -, ÷. 361 00:33:31,550 --> 00:33:36,630 Nie bis-operateurs wat optree op binêre. 362 00:33:36,630 --> 00:33:39,600 Sodat die gebruik van - +, ÷, en al daardie. 363 00:33:39,600 --> 00:33:52,980 Ons kan ruil deur om iets te doen soos a = a + b en b = a - b, a = a - b. 364 00:33:52,980 --> 00:34:04,260 So, gesonde verstand gaan, en dan sal ons sien waarom dit werk. 365 00:34:04,260 --> 00:34:13,320 Kom ons sê 'n = 7, b = 3, dan is a + b gaan wees 10. 366 00:34:13,320 --> 00:34:18,820 Sodat ons nou die opstel van 'n = 10, en dan is ons besig b = a - b. 367 00:34:18,820 --> 00:34:30,250 So ons doen b = a - b, wat gaan wees 7, en b = a - b weer 368 00:34:30,250 --> 00:34:38,650 of 'n = a - b. Wat gaan wees 10 - 7 wat is 3. 369 00:34:38,650 --> 00:34:44,850 So nou, korrek, "het 'n" 7, b 3, en b is nou 7 en 'a' is 3. 370 00:34:44,850 --> 00:34:48,679 So daardie soort van sin maak, 'a' is die kombinasie van die 2 getalle. 371 00:34:48,679 --> 00:34:53,000 Op hierdie punt, 'a' is die kombinasie, en dan is ons af te trek uit die oorspronklike b, 372 00:34:53,000 --> 00:34:56,860 en dan is ons af te trek uit wat was die oorspronklike 'n. " 373 00:34:56,860 --> 00:35:01,150 Maar dit werk nie vir alle getalle. 374 00:35:01,150 --> 00:35:08,880 Om dit te sien, laat ons kyk na 'n stelsel, sodat ons gewoonlik dink van heelgetalle as 32 stukkies. 375 00:35:08,880 --> 00:35:13,050 Kom ons werk op iets wat net soos 4 stukkies. 376 00:35:13,050 --> 00:35:15,450 Hopelik sal ek kom nou met 'n goeie voorbeeld. 377 00:35:15,450 --> 00:35:18,680 So, ek weet, dit sal maklik wees. 378 00:35:18,680 --> 00:35:26,720 Kom ons sê dat ons 2 nommers is 1111, en 1111, so ons is nou in binêre. 379 00:35:26,720 --> 00:35:34,630 In die werklike desimale, as jy wil om te dink dat dit so 'n = 15 en b = 15. 380 00:35:34,630 --> 00:35:37,630 En so het ons verwag dat, nadat ons ruil hulle hulle nie eens nie om die dieselfde nommers te wees, 381 00:35:37,630 --> 00:35:41,140 maar ek het dit op hierdie manier. 382 00:35:41,140 --> 00:35:47,100 Kom ons maak hulle nie dieselfde getalle. Kom ons doen 1111 en 0001. 383 00:35:47,100 --> 00:35:51,860 So 'n = 15 en b = 1. 384 00:35:51,860 --> 00:35:57,670 Nadat ons hulle ruil, verwag ons 'a' te wees 1 en b te wees 15. 385 00:35:57,670 --> 00:36:01,780 So ons eerste stap is om 'n = a + b. 386 00:36:01,780 --> 00:36:08,770 Ons getalle is slegs 4 bisse wyd, so 'n, wat 1111 + b, wat is 0001, 387 00:36:08,770 --> 00:36:16,780 gaan uiteindelik 'n 10.000, maar ons het net 4 stukkies. 388 00:36:16,780 --> 00:36:22,540 So nou a = 0. 389 00:36:22,540 --> 00:36:34,080 En nou is ons wil te stel b = a - b - eintlik, dit nog steeds werk perfek. 390 00:36:34,080 --> 00:36:39,630 a = a - b - laat ons kyk of dit werk perfek. 391 00:36:39,630 --> 00:36:53,720 So dan b = 0 - 1, wat nog steeds 15, en dan 'n = a - b, wat sou wees 1. 392 00:36:53,720 --> 00:36:56,210 Miskien is dit werk. 393 00:36:56,210 --> 00:36:59,020 Ek voel daar is 'n rede waarom dit nie werk nie gebruik van gereelde. 394 00:36:59,020 --> 00:37:06,400 Okay, so werk op die aanname dat dit nie werk met gereelde binêre operasies, 395 00:37:06,400 --> 00:37:15,040 en Ek sal kyk vir - Ek sal Google om te sien of dit waar is. 396 00:37:15,040 --> 00:37:23,490 So ons wil om dit te doen deur gebruik te maak van bis-operateurs, en die idee hier is XOR. 397 00:37:23,490 --> 00:37:28,780 So, die bekendstelling van XOR (^) indien jy dit nog nie gesien het nie. 398 00:37:28,780 --> 00:37:34,610 Dit is weer 'n bis-operateur, sodat dit bietjie bietjie, en it's optree - 399 00:37:34,610 --> 00:37:39,910 As jy die stukkies 0 en 1, dan is dit sal wees 1. 400 00:37:39,910 --> 00:37:45,230 As jy die stukkies 1 en 0, sal dit 1, het jy die stukkies 0 en 0 dit sal wees 0, 401 00:37:45,230 --> 00:37:47,640 en as jy die stukkies 1 en 1 is dit sal 0. 402 00:37:47,640 --> 00:37:56,180 So dit is soos of. As een van die stukkies is waar, dit is 1, maar in teenstelling, is dit kan nie albei wees stukkies wat waar is. 403 00:37:56,180 --> 00:37:59,320 OF sou dit wees 1, sou XOR dit 0. 404 00:37:59,320 --> 00:38:02,250 So ons gaan wil XOR hier te gebruik. 405 00:38:02,250 --> 00:38:09,960 Te dink oor dit vir 'n minuut, ek gaan na Google. 406 00:38:09,960 --> 00:38:16,230 Wel, jy kan nie lees dat, ek is tans op die XOR swap algoritme bladsy. 407 00:38:16,230 --> 00:38:21,340 Hopelik sal dit verduidelik waarom ek can't - 408 00:38:21,340 --> 00:38:34,190 Dit is presies die algoritme wat ons nou net gedoen het. 409 00:38:34,190 --> 00:38:37,330 Ek sien nog steeds nie waarom - ek moet net opgetel het 'n slegte voorbeeld, 410 00:38:37,330 --> 00:38:44,940 maar hierdie geval waar "'n" gebeur om 0, nadat hy na 5 stukkies, so nou 'a' is 0, 411 00:38:44,940 --> 00:38:48,730 dit is wat genoem word "integer oorloop." 412 00:38:48,730 --> 00:38:54,370 Volgens Wikipedia, "In teenstelling met die XOR swap hierdie variasie vereis dat dit gebruik 'n paar metodes 413 00:38:54,370 --> 00:38:59,780 om te verseker dat x + y veroorsaak nie 'n heelgetal oorloop. " 414 00:38:59,780 --> 00:39:08,350 Sodat hierdie probleme het, dit was integer oorloop, maar ek iets verkeerd gedoen het. 415 00:39:08,350 --> 00:39:10,520 Ek is nie seker nie. Ek sal probeer om vorendag te kom met 'n ander een. 416 00:39:10,520 --> 00:39:13,640 [Studente] Wel, is nie integer oorloop wanneer jy probeer om 'n aantal daar te stel 417 00:39:13,640 --> 00:39:16,640 groter is as die bedrag van die stukkies wat jy het toegeken? 418 00:39:16,640 --> 00:39:23,730 Ja. Ons het 4 stukkies. That's - ons het 4 bisse, ons dan probeer om 1 te voeg, sodat ons met 5 stukkies. 419 00:39:23,730 --> 00:39:26,690 Maar die vyfde bietjie net kry afgesny, ja. 420 00:39:26,690 --> 00:39:28,970 Dit kan eintlik - 421 00:39:28,970 --> 00:39:33,010 [Studente] Beteken dit gooi jy 'n fout, of is dit - sou dit gooi 'n fout? 422 00:39:33,010 --> 00:39:40,720 No daar is dus nie 'n fout nie. Wanneer jy by die gemeente vlak, 'n spesiale bietjie 423 00:39:40,720 --> 00:39:47,020 iewers is ingestel dat het gesê daar was 'n oorloop, maar in C wat jy soort van net gaan nie met dit. 424 00:39:47,020 --> 00:39:55,160 Jy eintlik nie kan hanteer nie, tensy jy gebruik 'n spesiale vergadering instruksies in C. 425 00:39:55,160 --> 00:39:58,110 Laat se dink oor XOR ruil. 426 00:39:58,110 --> 00:40:02,220 En ek dink ook die Wikipedia artikel kon gewees het, sê dat - 427 00:40:02,220 --> 00:40:07,310 So is dit ook laat optrek modulêre rekenkunde, so ek dink ek was, in teorie, modulêre rekenkunde te doen 428 00:40:07,310 --> 00:40:11,160 wanneer ek sê dat 0 - 1 is 15 weer. 429 00:40:11,160 --> 00:40:15,410 So wat kan eintlik op 'n gereelde verwerker wat nie 0 - 1 = 15. 430 00:40:15,410 --> 00:40:20,430 Aangesien ons beland op 0, ons trek 1, So hang dit dan vou net terug om te 1111. 431 00:40:20,430 --> 00:40:28,930 So hierdie algoritme kan eintlik werk, die a + b, die a - b, b - a, wat dalk goed wees. 432 00:40:28,930 --> 00:40:34,030 Maar daar is 'n paar verwerkers wat dit nie doen nie, en so sou dit nie goed wees in daardie spesifieke kinders. 433 00:40:34,030 --> 00:40:39,880 XOR swap sal werk op enige verwerker. Okay. 434 00:40:39,880 --> 00:40:42,280 Die idee is dat dit veronderstel is om dieselfde te wees, al is. 435 00:40:42,280 --> 00:40:50,120 Waar ons gebruik XOR om die een of ander manier kry die inligting van beide in 1 van die veranderlikes, 436 00:40:50,120 --> 00:40:54,120 en dan trek uit die inligting van die individuele veranderlikes weer. 437 00:40:54,120 --> 00:41:04,330 So nie almal idees / die antwoord? 438 00:41:04,330 --> 00:41:14,540 [Student antwoord, onverstaanbaar] 439 00:41:14,540 --> 00:41:22,220 So dit moet werk, en ook XOR is kommutatiewe. 440 00:41:22,220 --> 00:41:27,620 Ongeag van watter volgorde hierdie 2 nommers gebeur om hier te wees, 441 00:41:27,620 --> 00:41:30,100 die resultaat gaan dieselfde te wees. 442 00:41:30,100 --> 00:41:35,800 So 'n ^ b is b ^ a. 443 00:41:35,800 --> 00:41:51,860 Jy kan sien dit ook geskryf as 'n ^ = b, b ^ = a, a ^ = b weer. 444 00:41:51,860 --> 00:42:00,200 So, dit is reg, en om te sien waarom dit werk, dink van die stukkies. 445 00:42:00,200 --> 00:42:10,400 Deur gebruik te maak van 'n kleinerige, kom ons sê 11.001 en 01.100. 446 00:42:10,400 --> 00:42:12,790 So, dit is 'n ", dit is 'n b. 447 00:42:12,790 --> 00:42:15,540 So 'n ^ = b. 448 00:42:15,540 --> 00:42:22,380 Ons gaan opstel van 'a' = die XOR van hierdie 2 dinge. 449 00:42:22,380 --> 00:42:32,920 So 1 ^ 0 1 1 ^ 1 0 0 ^ 1 is 1, en 0 ^ 0 0 1 ^ 0 is 1. 450 00:42:32,920 --> 00:42:37,380 So 'n, "as jy kyk na die desimale getal, is dit gaan wees - 451 00:42:37,380 --> 00:42:41,160 jy gaan nie veel van 'n verhouding tussen die oorspronklike "'n" en die nuwe om te sien 'n " 452 00:42:41,160 --> 00:42:45,600 maar kyk na die stukkies, 'a' is nou soos 'n maas van die inligting 453 00:42:45,600 --> 00:42:49,970 van beide die oorspronklike "'n" en die oorspronklike b. 454 00:42:49,970 --> 00:42:57,930 So as ons b ^ n, sien ons dat ons sal eindig by die oorspronklike 'n. " 455 00:42:57,930 --> 00:43:08,910 En as ons die oorspronklike 'a' ^ die nuwe "," sien ons ons uiteindelik by die oorspronklike b. 456 00:43:08,910 --> 00:43:18,380 So (a ^ b) ^ b = die oorspronklike. " 457 00:43:18,380 --> 00:43:27,910 En (a ^ b) ^ a = die oorspronklike b. 458 00:43:27,910 --> 00:43:37,010 Daar is nog 'n manier om te sien dit is niks XOR self is altyd 0. 459 00:43:37,010 --> 00:43:45,020 So 1101 ^ 1101, word al die stukkies gaan dieselfde te wees. 460 00:43:45,020 --> 00:43:47,920 Daar is dus nie gaan om 'n geval waar 1 is 'n 0 en die ander is 1. 461 00:43:47,920 --> 00:43:51,080 So dit is 0000. 462 00:43:51,080 --> 00:43:57,240 Dieselfde met hierdie. (A ^ b) ^ b is soos 'n ^ (b ^ b). 463 00:43:57,240 --> 00:44:03,680 (B ^ b) gaan wees 0, a ^ 0 is net gaan om te wees "," omdat al die stukkies 0. 464 00:44:03,680 --> 00:44:08,050 So moes die enigstes wat gaan wees waar 'a' was oorspronklik 'n 1 - kinders. 465 00:44:08,050 --> 00:44:12,070 En dieselfde idee hier, ek is redelik seker dat dit is ook kommutatiewe. 466 00:44:12,070 --> 00:44:17,590 Ja. Ek het sê Voor dit was kommutatiewe. 467 00:44:17,590 --> 00:44:24,680 Die ^ a, en dit is assosiatiewe, so nou (b ^) ^ a. 468 00:44:24,680 --> 00:44:28,970 En ons kan doen b ^ (a ^ a). 469 00:44:28,970 --> 00:44:31,540 En so kry ons weer die oorspronklike b. 470 00:44:31,540 --> 00:44:37,120 So 'a' is nou die kombinasie van 'A' en B saam. 471 00:44:37,120 --> 00:44:49,660 Met behulp van ons nuwe combo 'sê ons b = combo 'n "^ die oorspronklike b, kry ons die oorspronklike" a. " 472 00:44:49,660 --> 00:45:05,170 En nou 'n = combo 'a' die nuwe b, wat was die oorspronklike - of wat is nou wat was 'n "of b. 473 00:45:05,170 --> 00:45:13,620 Dit is hierdie geval. Dit is = b, oud b. 474 00:45:13,620 --> 00:45:16,550 So nou is alles terug in die omgeruil einde. 475 00:45:16,550 --> 00:45:22,960 As ons eintlik kyk na die stukkies, b = a ^ b, gaan hierdie 2 XOR, 476 00:45:22,960 --> 00:45:33,920 en die antwoord gaan wees hierdie, en dan 'n = a ^ b XORing hierdie 2 en die antwoord is. 477 00:45:33,920 --> 00:45:41,090 Vrae? Okay. So is die laaste een is 'n bietjie aansienlik moeiliker. 478 00:45:41,090 --> 00:45:43,180 [Studente] Ek dink hy het 'n vraag oor dit. >> Oh, jammer. 479 00:45:43,180 --> 00:45:49,380 [Studente] Wat is eintlik vinniger? As jy hierdie XOR, of is dit as jy 'n nuwe veranderlike verklaar? 480 00:45:49,380 --> 00:45:55,190 So, wat is eintlik vinniger, 'n nuwe veranderlike te verklaar of die gebruik van XOR te ruil? 481 00:45:55,190 --> 00:45:59,600 Die antwoord is, in alle waarskynlikheid, 'n tydelike veranderlike. 482 00:45:59,600 --> 00:46:05,780 En dit is, want sodra dit saamgestel af - so by die vergadering vlak, 483 00:46:05,780 --> 00:46:12,320 daar is geen sodanige ding as plaaslike veranderlikes of enige tydelike veranderlikes of enige van hierdie dinge nie. 484 00:46:12,320 --> 00:46:16,060 Hulle hou net - daar is geheue, en daar is registers. 485 00:46:16,060 --> 00:46:20,920 Registers is waar dinge is aktief gebeur. 486 00:46:20,920 --> 00:46:24,750 Jy voeg nie 2 dinge in die geheue, voeg jy 2 dinge in die registers. 487 00:46:24,750 --> 00:46:28,160 En jy bring dinge van die geheue in registers te voeg dit dan, 488 00:46:28,160 --> 00:46:33,180 en dan kan jy sit hulle terug in die geheue, maar al die aksie gebeur in registers. 489 00:46:33,180 --> 00:46:38,750 So wanneer jy die tydelike veranderlike benadering gebruik, gewoonlik wat gebeur is 490 00:46:38,750 --> 00:46:42,810 hierdie 2 nommers is reeds in registers. 491 00:46:42,810 --> 00:46:46,570 En dan vanaf daardie punt op, nadat jy hulle het verruil, 492 00:46:46,570 --> 00:46:51,540 dit sal net begin met behulp van die ander register. 493 00:46:51,540 --> 00:46:56,510 Oral waar jy het al met behulp van b, dit sal net gebruik maak van die register wat reeds die stoor van 'n. " 494 00:46:56,510 --> 00:47:02,180 Sodat dit nie nodig om enigiets te doen om werklik te doen om die ruiltransaksie. Ja? 495 00:47:02,180 --> 00:47:05,690 [Studente] Maar dit neem ook meer geheue, reg? 496 00:47:05,690 --> 00:47:10,280 Dit sal net meer geheue as dit nodig dat tydelike veranderlike te stoor. 497 00:47:10,280 --> 00:47:14,830 Soos as jy later dat tydelike veranderlike gebruik weer iewers, 498 00:47:14,830 --> 00:47:18,920 dan of jy iets wys dat tydelike veranderlike. 499 00:47:18,920 --> 00:47:24,630 So as by enige punt in die tyd 'n, "B in temp duidelike waardes of iets, 500 00:47:24,630 --> 00:47:30,680 dan is dit gaan afsonderlike plekke te hê in die geheue, maar dit is waar dat 501 00:47:30,680 --> 00:47:34,800 Daar is baie plaaslike veranderlikes wat slegs bestaan ​​in registers. 502 00:47:34,800 --> 00:47:44,370 In welke geval, dit was nog nooit in die geheue, en sodat jy nooit mors geheue. 503 00:47:44,370 --> 00:47:58,620 Okay. Laaste vraag is 'n bietjie meer. 504 00:47:58,620 --> 00:48:04,850 So hier, in hierdie CS50 toestel, daar is 'n woordeboek. 505 00:48:04,850 --> 00:48:12,390 En die rede hiervoor is omdat [B66?] Is 'n speltoetser waar jy skryf 506 00:48:12,390 --> 00:48:15,780 gebruik hash tabelle of probeer of 'n data struktuur. 507 00:48:15,780 --> 00:48:22,660 Jy gaan om te skryf van 'n speltoetser, en jy gaan word met behulp van hierdie woordeboek om dit te doen. 508 00:48:22,660 --> 00:48:28,280 Maar vir hierdie probleem, ons is net gaan om te kyk om te sien as 'n enkele woord in die woordeboek. 509 00:48:28,280 --> 00:48:31,250 So in plaas van die stoor van die hele woordeboek in sommige data struktuur 510 00:48:31,250 --> 00:48:35,180 en dan soek oor 'n hele dokument te sien as daar iets is verkeerd gespel, 511 00:48:35,180 --> 00:48:38,490 ons wil net 1 woord te vind. Sodat ons kan net scan oor die hele woordeboek 512 00:48:38,490 --> 00:48:44,300 en as ons nog nooit die woord in die hele woordeboek, dan was dit nie daar nie. 513 00:48:44,300 --> 00:48:52,150 As ons scan oor die hele woordeboek en doen die woord, dan is ons goed, ons het dit gevind. 514 00:48:52,150 --> 00:48:56,580 Dit sê hier dat ons wil om te begin soek na C se lêer-hantering funksie, 515 00:48:56,580 --> 00:48:59,930 want ons wil die woordeboek te lees, 516 00:48:59,930 --> 00:49:07,680 maar Ek sal die wenk hier watter funksies jy moet dink. 517 00:49:07,680 --> 00:49:11,510 Ek skryf hulle op Ruimtes. 518 00:49:11,510 --> 00:49:20,490 Dus is die belangrikste wat jy sal wil hê om te kyk na f oop en dan, onvermydelik, f gesluit, 519 00:49:20,490 --> 00:49:26,540 wat sal gaan aan die einde van jou program, en f scan f. 520 00:49:26,540 --> 00:49:31,060 Jy kan ook gebruik om f lees, maar jy sal waarskynlik wil nie 521 00:49:31,060 --> 00:49:34,200 want dit - jy uiteindelik nie nodig dat. 522 00:49:34,200 --> 00:49:41,880 F scan f is wat jy gaan word met behulp van die woordeboek te scan. 523 00:49:41,880 --> 00:49:46,370 En sodat jy nie nodig het om die oplossing te kodeer, net probeer en soos pseudo-kode jou pad 524 00:49:46,370 --> 00:50:05,200 'n oplossing, en dan sal ons bespreek dit. 525 00:50:05,200 --> 00:50:14,110 En eintlik, aangesien ek reeds u hierdie het, as jy gaan in 'n terminale of jou toestel se dop, 526 00:50:14,110 --> 00:50:18,250 Ek wil - ek gewoonlik - as jy nog nie gesien het nie, ek weet nie as jy in die klas gedoen het, 527 00:50:18,250 --> 00:50:23,490 maar die mens, so die man bladsye, is baie handig vir die soek op pretty much enige funksie. 528 00:50:23,490 --> 00:50:27,330 Sodat ek dit kan doen, soos, man f, scan f. 529 00:50:27,330 --> 00:50:32,300 Dit is nou die inligting oor die scan f familie van funksies. 530 00:50:32,300 --> 00:50:37,070 Ek kon dit ook doen man f, oop, en dat sal gee my die besonderhede van daardie. 531 00:50:37,070 --> 00:50:40,750 So as jy weet watter funksie wat jy gebruik, of jy lees kode 532 00:50:40,750 --> 00:50:43,000 en jy sien 'n paar funksie en jy soos, "Wat doen dit?" 533 00:50:43,000 --> 00:50:45,280 Regverdige wat funksie naam bysit. 534 00:50:45,280 --> 00:50:47,340 Daar is 'n paar weird voorbeelde waar jy kan hê om te sê 535 00:50:47,340 --> 00:50:51,620 wil. man 2 dat funksie naam, of 'n mens 3 daardie funksie naam, 536 00:50:51,620 --> 00:50:58,230 maar jy het om dit te doen as die mens funksie naam nie gebeur nie die eerste keer om te werk. 537 00:50:58,230 --> 00:51:03,010 [Studente] Dus is ek die lees van die man bladsy vir 'n oop, maar ek is nog steeds verward oor hoe dit en die program te gebruik. 538 00:51:03,010 --> 00:51:06,170 Okay. 'N baie van die man bladsye is minder as nuttig. 539 00:51:06,170 --> 00:51:08,470 Hulle is meer nuttig wees as jy reeds weet wat hulle doen 540 00:51:08,470 --> 00:51:12,670 en dan sal jy net nodig het om die volgorde van die argumente of iets om te onthou. 541 00:51:12,670 --> 00:51:17,640 Of hulle kan gee jou 'n algemene oorsig, maar sommige van hulle is baie oorweldigend. 542 00:51:17,640 --> 00:51:22,220 Soos f f scan, ook. Dit gee jou die inligting vir almal van hierdie funksies, 543 00:51:22,220 --> 00:51:28,120 en 1 lyn sit hier gebeur om te sê, "F scan f lees van die string of stroom." 544 00:51:28,120 --> 00:51:32,360 Maar f oopmaak. So, hoe sou ons gebruik f oop? 545 00:51:32,360 --> 00:51:38,470 Die idee van 'n program wat nodig is om lêer te doen I / O is dat 546 00:51:38,470 --> 00:51:45,070 moet jy eers die lêer oop te maak wat jy wil dinge om te doen met, en onvermydelik, 547 00:51:45,070 --> 00:51:51,220 lees dinge uit daardie lêer en doen dinge saam met hulle. 548 00:51:51,220 --> 00:51:55,350 F oop is wat ons gebruik om die lêer oop te maak. 549 00:51:55,350 --> 00:52:04,190 Die ding wat ons terug te kry, so what lêer wil ons oop te maak, dit gee ons die 550 00:52:04,190 --> 00:52:11,970 hier is dit sê "/ user / share / dict / woorde." 551 00:52:11,970 --> 00:52:16,740 Dit is die lêer wat ons wil hê om oop te maak, en ons wil om dit oop te maak - 552 00:52:16,740 --> 00:52:21,440 het ons uitdruklik spesifiseer of ons wil oop te maak om dit te lees of as ons wil oopmaak om dit te skryf. 553 00:52:21,440 --> 00:52:26,490 Daar is 'n paar kombinasies en stuff, maar ons wil dit oop te maak om te lees nie. 554 00:52:26,490 --> 00:52:29,380 Ons wil om te lees van die lêer. 555 00:52:29,380 --> 00:52:34,290 So, wat doen hierdie opgawe? Dit gee 'n lêer ster (*), 556 00:52:34,290 --> 00:52:37,260 en ek sal net alles in die veranderlike f, so * wys, 557 00:52:37,260 --> 00:52:40,840 weer, dit is 'n wyser nie, maar ons wil nie om te gaan met wysers. 558 00:52:40,840 --> 00:52:46,470 Jy kan dink van f, f nou is die veranderlike wat jy gaan gebruik om die lêer te verteenwoordig. 559 00:52:46,470 --> 00:52:49,850 So as jy wil om te lees van die lêer, jy lees van f. 560 00:52:49,850 --> 00:52:54,820 As jy wil om die lêer te sluit, jy die venster van f. 561 00:52:54,820 --> 00:53:00,350 So aan die einde van die program wanneer ons wil noodwendig die lêer te sluit, wat moet ons doen? 562 00:53:00,350 --> 00:53:06,750 Ons wil hê dat f te sluit. 563 00:53:06,750 --> 00:53:12,600 Dus nou die laaste lêer funksie wat ons gaan wil gebruik is scan f, f scan f. 564 00:53:12,600 --> 00:53:20,930 En wat beteken dit is om dit skanderings oor die lêer soek vir 'n patroon aan te pas. 565 00:53:20,930 --> 00:53:39,100 Op soek na die man bladsy hier, sien ons int f scan f, ignoreer die terugkeer waarde vir nou. 566 00:53:39,100 --> 00:53:45,230 Die eerste argument is die lêer * stroom, so die eerste argument wat ons gaan om te wil om te slaag is f. 567 00:53:45,230 --> 00:53:47,900 Ons skandering oor f. 568 00:53:47,900 --> 00:53:53,680 Die tweede argument is 'n formaat string. 569 00:53:53,680 --> 00:53:58,310 Ek sal aan julle 'n formaat string right now. 570 00:53:58,310 --> 00:54:05,180 Ek dink ons ​​gebeur om te sê, 127s \ n, 'n baie van wat is onnodig. 571 00:54:05,180 --> 00:54:12,490 Die idee van wat formaat string is, is dat jy kan dink van scan f as die teenoorgestelde van die gedrukte f. 572 00:54:12,490 --> 00:54:17,160 So druk f, print f ons ook hierdie tipe van formaat parameter gebruik, 573 00:54:17,160 --> 00:54:25,000 maar in die gedrukte f wat ons doen is - laat ons kyk na 'n ekwivalente. 574 00:54:25,000 --> 00:54:32,550 So druk f, en daar is eintlik ook f print f, waar die eerste argument gaan wees f. 575 00:54:32,550 --> 00:54:40,980 Wanneer jy druk f, kan ons sê iets soos, "print 127s \ n" en dan as ons slaag dit 'n string, 576 00:54:40,980 --> 00:54:44,050 dit gaan hierdie string en dan 'n nuwe lyn te druk. 577 00:54:44,050 --> 00:54:49,690 Watter 127 middel, ek is redelik seker, maar ek het nog nooit beperk myself om dit te, 578 00:54:49,690 --> 00:54:52,470 Jy sal selfs nie nodig '127 'om te sê in die gedrukte f, 579 00:54:52,470 --> 00:54:57,090 maar wat dit beteken, is druk van die eerste 127 karakters. 580 00:54:57,090 --> 00:54:59,350 So ek is redelik seker dat dit die geval is. Jy kan Google vir daardie. 581 00:54:59,350 --> 00:55:03,000 Maar in die volgende een ek is amper positiewe beteken dit dat. 582 00:55:03,000 --> 00:55:08,880 So is dit druk van die eerste 127 karakters, gevolg deur 'n nuwe lyn. 583 00:55:08,880 --> 00:55:14,680 F scan f nou, in plaas van op soek na 'n veranderlike en druk dit, 584 00:55:14,680 --> 00:55:22,620 dit gaan om te kyk na 'n paar string, en die patroon in die veranderlike te stoor. 585 00:55:22,620 --> 00:55:26,360 Kom ons eintlik gebruik scan f in 'n ander voorbeeld. 586 00:55:26,360 --> 00:55:31,670 So laat ons sê ons het 'n paar int x = 4, 587 00:55:31,670 --> 00:55:41,110 en ons wou 'n string te skep - wou die string te skep 588 00:55:41,110 --> 00:55:44,250 dit was soos, dit sal kom veel later, 589 00:55:44,250 --> 00:55:49,020 iets wat net soos 4.jpg. 590 00:55:49,020 --> 00:55:51,870 So, dit kan 'n program waar jy som counter, 591 00:55:51,870 --> 00:55:56,420 som teen i, en jy wil 'n klomp van die beelde op te slaan. 592 00:55:56,420 --> 00:56:02,430 So jy wil i.JPG, waar ek is 'n paar iterasie van jou lus te red. 593 00:56:02,430 --> 00:56:05,500 So hoe maak ons ​​hierdie string vir daardie JPEG? 594 00:56:05,500 --> 00:56:11,720 As jy wou 4.jpg te druk, kan ons net sê print f,% d.jpg, 595 00:56:11,720 --> 00:56:14,410 en dan sal dit druk vir daardie JPEG. 596 00:56:14,410 --> 00:56:20,050 Maar as ons wil hê die string 4.jpg te red, gebruik ons ​​scan f. 597 00:56:20,050 --> 00:56:30,860 So string s - eintlik het ons can't - karakter, char s, laat ons gaan 100. 598 00:56:30,860 --> 00:56:35,400 So het ek net n verskeidenheid van 100 karakters verklaar, 599 00:56:35,400 --> 00:56:39,830 en dit is wat ons onvermydelik gaan word stoor wat JPEG. 600 00:56:39,830 --> 00:56:47,920 So ons gaan scan f te gebruik, en die formaat, hoe sou ons sê% d.jpg 601 00:56:47,920 --> 00:56:54,980 ten einde te druk 4.jpg, is die formaat van hierdie gaan na% d.jpg wees. 602 00:56:54,980 --> 00:57:04,020 So is die formaat is% d.jpg, wat ons wil te vervang met% d x, 603 00:57:04,020 --> 00:57:06,590 en nou het ons nodig dat die string om iewers te stoor. 604 00:57:06,590 --> 00:57:12,500 En waar ons gaan hierdie string te slaan is in die skikking is. 605 00:57:12,500 --> 00:57:21,640 So na hierdie lyn van kode, s, as ons druk f,% s van die veranderlike s, 606 00:57:21,640 --> 00:57:26,280 dit gaan 4.jpg te druk. 607 00:57:26,280 --> 00:57:38,930 So f scan f is dieselfde as scan f, behalwe dit is nou op soek na oor hierdie lêer 608 00:57:38,930 --> 00:57:43,600 vir wat op te slaan in s. 609 00:57:43,600 --> 00:57:46,160 Dit is wat die laaste argument gaan wees. 610 00:57:46,160 --> 00:57:54,170 Ons wil op te slaan - "Scan f familie van funksies skanderings in beide volgens die formaat soos hieronder probeer. 611 00:57:54,170 --> 00:58:02,450 Indien enige gestoor word in die plek wat jy kan terugkeer " 612 00:58:02,450 --> 00:58:12,910 Nee, kan ons goed wees. Laat my dink vir 'n tweede. 613 00:58:12,910 --> 00:58:26,350 So scan f doen nie - wat die heck is die funksie wat beteken dat? 614 00:58:26,350 --> 00:58:31,650 So scan f is nie van plan om 'n heelgetal te neem en dot jpg doen. 615 00:58:31,650 --> 00:58:43,490 Dit gaan [mompel]. 616 00:58:43,490 --> 00:58:49,360 Hou int veranderlike in string int C. 617 00:58:49,360 --> 00:58:55,940 Wat is hierdie veranderlike, of wat is hierdie funksie genoem? 618 00:58:55,940 --> 00:59:04,950 Ja. That's - ja. So, wat ek was te definieer aan jou was tevore s print f, 619 00:59:04,950 --> 00:59:09,820 wat - dit maak baie meer sin, hoekom ek gesê het dit was veel meer soos print f. 620 00:59:09,820 --> 00:59:14,700 Scan f is nog steeds soort soos print f, maar s print f gaan om dit te scan 621 00:59:14,700 --> 00:59:17,510 en vervang die veranderlikes en stoor dit nou in 'n string. 622 00:59:17,510 --> 00:59:19,620 In plaas daarvan om dit te druk, stoor dit in 'n string. 623 00:59:19,620 --> 00:59:25,070 Sodat heeltemal ignoreer. Jy kan nog steeds dink van die formaat specific as soos wat druk f. 624 00:59:25,070 --> 00:59:34,510 So nou, as ons wou 4.jpg ding om te doen, sal ons se druk f doen, x van hierdie. 625 00:59:34,510 --> 00:59:38,520 So, wat scan f doen - wat is jou vraag gaan wees? 626 00:59:38,520 --> 00:59:40,820 [Studente] Ek is net verward oor wat ons probeer om te doen reg hier 627 00:59:40,820 --> 00:59:43,450 met wat JPEG. Kan jy verduidelik dat 1 meer tyd? 628 00:59:43,450 --> 00:59:52,710 So dit was - dit is minder relevant f scan f nou, hopelik, sal dit bind terug in 'n soort van manier. 629 00:59:52,710 --> 01:00:02,240 Maar wat ek aanvanklik voornemens is om te wys - dit is eintlik direk relevant is vir dit? F5] 630 01:00:02,240 --> 01:00:08,520 Jy gaan word met behulp van s print f, waar, sê ons het 100 beelde, 631 01:00:08,520 --> 01:00:13,630 en jy wil image 1.jpg 2.jpg 3.jpg te lees. 632 01:00:13,630 --> 01:00:21,520 Dus, ten einde dit te doen, moet jy te f oop, en dan moet jy om te slaag in die string wat jy wil oopmaak. 633 01:00:21,520 --> 01:00:30,020 So sou ons wil oopmaak 1.jpg, ten einde te maak van die string wat 1.jpg, 634 01:00:30,020 --> 01:00:37,660 ons doen is druk f% d.jpg-ons het dit nie doen vir int i = 0. 635 01:00:37,660 --> 01:00:46,580 i <40, i + +. 636 01:00:46,580 --> 01:00:51,130 So s print f% d.jpg i. 637 01:00:51,130 --> 01:00:56,320 So na hierdie lyn, nou die veranderlike of die skikking gaan tot 1.jpg. 638 01:00:56,320 --> 01:01:10,610 Of, 0.jpg, 1.jpg, 2.jpg. En so kan ons oopmaak, op sy beurt, elke beeld vir lees. 639 01:01:10,610 --> 01:01:19,550 So dit is wat s druk f doen. Wil jy sien wat s druk f nou doen? 640 01:01:19,550 --> 01:01:25,720 [Studente] Okay, so dit neem - dit skep 'n string, something.jpg, en dan slaan dit. 641 01:01:25,720 --> 01:01:30,360 Ja. Dit skep - dit is 'n ander formaat string, net soos scan f en print f, 642 01:01:30,360 --> 01:01:37,530 waar dit inserts al die veranderlikes in die tweede argument, kan wees is in teenstelling met die i. 643 01:01:37,530 --> 01:01:42,280 Miskien - ek bedoel, wat die geval is. Maar ongeag die volgorde van die argumente is. 644 01:01:42,280 --> 01:01:45,440 Dit gaan al die veranderlikes in te voeg in die formaat string 645 01:01:45,440 --> 01:01:52,250 en dan slaan in ons buffer, ons noem dat 'n buffer, dit is waar ons die stoor van die string. 646 01:01:52,250 --> 01:02:00,750 So ons is binnekant van s stoor die korrek-geformateerde string,% d is vervang met 4. 647 01:02:00,750 --> 01:02:08,080 [Studente] So as ons dit gedoen het, is die veranderlike f net oorgeplaas gaan word? 648 01:02:08,080 --> 01:02:18,110 Ja. Dus moet ons die oorspronklike f sluit voor om dit te doen. 649 01:02:18,110 --> 01:02:22,810 Maar - en dan ook, as daar nie 'n f oopmaak hier, dan sou ons nodig om te sê - 650 01:02:22,810 --> 01:02:29,280 Ja. Maar dit sou 'n honderd verskillende lêers oopmaak. 651 01:02:29,280 --> 01:02:37,360 [Studente] Maar ons sal nie in staat wees om toegang te verkry of - okay. 652 01:02:37,360 --> 01:02:44,230 Okay. So scan f, f scan f, is 'n soort van die dieselfde idee, 653 01:02:44,230 --> 01:02:53,610 maar in plaas van, in plaas van die stoor dit in 'n string, dit is meer soos jy nou is 654 01:02:53,610 --> 01:03:02,420 gaan oor 'n angel en patroon wat ooreenstem teen daardie tou en die stoor van die resultate in veranderlikes. 655 01:03:02,420 --> 01:03:11,290 Jy kan scan f gebruik om oor iets soos 4.jpg, te ontleed en die heelgetal 4 stoor in die som int x. 656 01:03:11,290 --> 01:03:13,430 Dit is wat ons kan scan f gebruik vir. 657 01:03:13,430 --> 01:03:16,300 F scan f gaan om dit te doen op die command line. 658 01:03:16,300 --> 01:03:19,200 Ek is eintlik redelik seker dat dit is wat die CS50 biblioteek doen. 659 01:03:19,200 --> 01:03:29,050 So wanneer jy sê, "kry int," dit is scan f-ing oor scan f is die manier waarop jy die toevoer van die gebruiker. 660 01:03:29,050 --> 01:03:34,670 F scan f gaan dieselfde ding te doen nie, maar met behulp van 'n lêer te scan oor. 661 01:03:34,670 --> 01:03:41,090 So hier is ons skandering oor hierdie lêer. 662 01:03:41,090 --> 01:03:45,460 Die patroon wat ons probeer om aan te pas is 'n string wat is 127 karakters lank wees 663 01:03:45,460 --> 01:03:48,100 gevolg deur 'n nuwe lyn 664 01:03:48,100 --> 01:03:54,770 So ek is redelik seker dat ons kan selfs net sê "pas s," want in die woordeboek 665 01:03:54,770 --> 01:03:57,770 ons gebeur het, is ons gewaarborg geen woord is so lank, 666 01:03:57,770 --> 01:04:03,310 en ook scan f f, dink ek, sal ophou nie saak wat by die nuwe lyn. 667 01:04:03,310 --> 01:04:06,970 Maar ons sal die nuwe lyn in die wedstryd, en - 668 01:04:06,970 --> 01:04:13,960 [Studente] As ons nie die nuwe lyn, sal dit nie vind nie dele van 'n woord? 669 01:04:13,960 --> 01:04:22,900 Dit - elke - op soek na die woordeboek - 670 01:04:22,900 --> 01:04:26,200 Dus, in die woordeboek, dit is al ons woorde. 671 01:04:26,200 --> 01:04:30,500 Elkeen is op 'n nuwe reël. 672 01:04:30,500 --> 01:04:32,510 Die scan f gaan om hierdie woord te kies. 673 01:04:32,510 --> 01:04:38,750 As ons nie die nuwe lyn, dan is dit moontlik dat die volgende scan f sal net lees die nuwe lyn. 674 01:04:38,750 --> 01:04:44,180 Maar met inbegrip van nuwe lyn sal dan net ignoreer die nuwe lyn. 675 01:04:44,180 --> 01:04:49,440 Maar ons sal nooit deel van 'n woord, want ons is altyd lees tot 'n nuwe reël, maak nie saak wat. 676 01:04:49,440 --> 01:04:54,530 [Studente] Maar wat as jy soek vir die woord "cissa," soos cissa. 677 01:04:54,530 --> 01:04:57,380 Sal dit vind dat, en sê dit is 'n wedstryd? 678 01:04:57,380 --> 01:05:05,110 So hier is ons - dit sal lees in - dit is eintlik 'n goeie punt. 679 01:05:05,110 --> 01:05:10,660 Ons is nooit deur gebruik te maak van die huidige - die woord wat ons soek is die eerste command line argument. 680 01:05:10,660 --> 01:05:16,460 So string, woord = bevat SPASIES 1. 681 01:05:16,460 --> 01:05:20,020 Sodat die string wat ons soek is bevat SPASIES 1. 682 01:05:20,020 --> 01:05:23,290 Ons is nie op soek vir 'n woord op almal in ons scan f. 683 01:05:23,290 --> 01:05:28,030 Wat ons doen met die scan f is om elke woord in die woordeboek, 684 01:05:28,030 --> 01:05:34,320 en dan weer ons het dat die woord wat ons gaan strcmp te gebruik om hulle te vergelyk. 685 01:05:34,320 --> 01:05:39,210 Ons gaan ons woord te vergelyk en wat ons nou net gelees. 686 01:05:39,210 --> 01:05:45,110 So onvermydelik, gaan ons aan die einde om 'n klomp van die scan fs 687 01:05:45,110 --> 01:05:52,130 totdat dit gebeur net so dat scan f sal terugkeer - 688 01:05:52,130 --> 01:05:54,800 dit sal terugkeer, so lank as dit 'n nuwe woord wat ooreenstem, 689 01:05:54,800 --> 01:06:01,360 en dit sal iets anders terug sodra dit in gebreke gebly het om die woord te pas. 690 01:06:01,360 --> 01:06:08,440 Ons lees oor die hele woordeboek, berging reël vir reël elke woord in die veranderlike s. 691 01:06:08,440 --> 01:06:17,240 Dan is ons vergelyk woord met s, en indien die vergelyking == 0, 692 01:06:17,240 --> 01:06:21,650 strcmp gebeur 0 te bring as 'n wedstryd gemaak. 693 01:06:21,650 --> 01:06:31,510 So as dit was 0, dan kan ons druk f, ooreenstem, 694 01:06:31,510 --> 01:06:35,370 of 'n woord in die woordeboek, of wat jy wil f te druk. 695 01:06:35,370 --> 01:06:41,450 En dan - ons wil nie f sluit oor en oor weer. 696 01:06:41,450 --> 01:06:50,410 Dit is die soort van ding wat ons wil doen, en ons is nie net op soek na die woord in die woordeboek. 697 01:06:50,410 --> 01:06:56,660 Sodat ons kon doen nie, as ons wou om te kyk vir hul patroon, cissa, soos jy gesê het voor, 698 01:06:56,660 --> 01:07:00,260 as ons wil om te kyk vir daardie patroon, dan sou dit nie in die geval 699 01:07:00,260 --> 01:07:08,010 want dis nie eintlik 'n woord nie, maar een van die woorde in die woordeboek gebeur wat daarin te hê. 700 01:07:08,010 --> 01:07:13,560 Sodat dit sou ooreenstem met hierdie woord nie, maar hierdie subset van die woord is nie 'n woord self. 701 01:07:13,560 --> 01:07:17,250 Maar dit is nie hoe ons dit gebruik, ons lees in elke woord 702 01:07:17,250 --> 01:07:19,740 en dan die woord wat ons met die woord te vergelyk. 703 01:07:19,740 --> 01:07:25,780 Sodat ons altyd volle woorde te vergelyk. 704 01:07:25,780 --> 01:07:29,620 Ek kan die uitstuur van die oplossings later gefinaliseer. 705 01:07:29,620 --> 01:07:32,050 Dit is 'n soort van byna die regte antwoord, dink ek. 706 01:07:32,050 --> 01:07:34,720 [Student kommentaar, onverstaanbaar] 707 01:07:34,720 --> 01:07:40,870 O, ek het ontslae te raak van daardie voor? Char s, ek dink ons ​​het gesê 127 - ek vergeet wat die grootste is. 708 01:07:40,870 --> 01:07:44,100 Ons sal net doen 128, so nou is is lank genoeg. 709 01:07:44,100 --> 01:07:46,570 Ons hoef nie enigiets te druk. 710 01:07:46,570 --> 01:07:56,440 Ons ook gaan om te wil hê ons lêer te sluit, en wat behoort te wees oor die korrekte antwoord. 711 01:07:56,440 --> 01:07:59,440 CS50.TV