1 00:00:00,000 --> 00:00:02,670 [Powered by Google Translate] Sekcio Problemo Ŝanĝu 2: Hacker Eldono 2 00:00:02,670 --> 00:00:04,910 Rob Bowden, Harvard University 3 00:00:04,910 --> 00:00:07,410 Ĉi tiu estas CS50. CS50.TV 4 00:00:07,410 --> 00:00:15,770 Do, mi estas Rob. Mi estas altranga en Kirkland. Ĉi tiu estas mia tria jaro TFing CS50. 5 00:00:15,770 --> 00:00:22,220 Estas la unua fojo ke ni ŝanĝas al la tradicia-prelego-stilo sekcio, 6 00:00:22,220 --> 00:00:25,610 kie ni simple speco de revizias kio okazis en prelego kaj poste vi infanoj demandojn, 7 00:00:25,610 --> 00:00:32,250 nun esti multe pli problemo bazita, kie ni uzas Spacoj, kaj - 8 00:00:32,250 --> 00:00:37,410 Ho, do la ideo estas iri al ligantaj mi sendis al vi kaj tiam vi estos en mia spaco. 9 00:00:37,410 --> 00:00:42,410 Ĉu iu ne havas la portebla? Okay. 10 00:00:42,410 --> 00:00:47,050 Do ni tuj uzos tion, kaj ni tuj faros problemojn vivi en sekcio 11 00:00:47,050 --> 00:00:50,740 kaj diskutante ilin kaj decidi kio estas erara 12 00:00:50,740 --> 00:00:56,390 kaj mi povus tiri kelkajn el via kodo, kaj mi povus diskuti viajn ideojn. 13 00:00:56,390 --> 00:01:02,140 Do estas neniu havis malfacilaĵojn? 14 00:01:02,140 --> 00:01:07,000 Vi povas babili en la flanko; Mi ne scias se ni havos kialon por tio. 15 00:01:07,000 --> 00:01:12,270 Nun, kiel la antaŭa supersection, se vi estis en tiu klaso, vi scias, kio tio estas pri. 16 00:01:12,270 --> 00:01:19,200 Sur ĉiuj de P aroj tie tuj estos tiuj sekcioj. 17 00:01:19,200 --> 00:01:22,550 Do P-aro 2, specifiloj, specifas, mi supozas ke vi vidis sur P-aro 1 jam. 18 00:01:22,550 --> 00:01:27,400 Sed ni povas rigardi P-aro 2 por kio ni iras al la transiro hodiaŭ. 19 00:01:27,400 --> 00:01:29,460 Kaj vi vidos sekcio de demandoj. 20 00:01:29,460 --> 00:01:37,530 Do tiu estos en ĉiu de la P-aroj, tie estos sekcio de demandoj. 21 00:01:37,530 --> 00:01:41,340 Ĝis nun ni diris, "Pripensu tiun eblon praktiki." 22 00:01:41,340 --> 00:01:44,940 Vi ne estos petita prezenti ĉi tiu programo. 23 00:01:44,940 --> 00:01:48,480 La ideo estas, ke tiuj estas devigataj ia helpi vin komenci kun la problemo aro. 24 00:01:48,480 --> 00:01:53,220 Mi supozas en la Hacker eldono, multe el ili estas devigataj nur esti novaj, interesaj aferoj por lerni. 25 00:01:53,220 --> 00:01:58,590 Ili ne povas esti rekte aplikebla al la problemo aro. 26 00:01:58,590 --> 00:02:01,810 Kaj ĝuste nun ni ne havante vi submetas ilin, sed en teorio, 27 00:02:01,810 --> 00:02:07,480 por posta problemo aroj, vi povus sendi ilin, kaj tiel vi povas ĉu venos al sekcio 28 00:02:07,480 --> 00:02:10,380 aŭ vidi la sekcio por ricevi la respondojn, aŭ vi povas simple preni ilin en via propra 29 00:02:10,380 --> 00:02:16,350 se vi ne sentas kiel ĝuas mian ĉeeston. 30 00:02:16,350 --> 00:02:21,010 Do la - Mi pensas ĉi tiu estas la unua. 31 00:02:21,010 --> 00:02:29,280 Oh. Ankaŭ, sub tiuj sekcioj de demandoj ni ankaŭ vi demandas pri la mallongaj. 32 00:02:29,280 --> 00:02:33,440 Do mi supozas, en teorio, kiun vi devas rigardi tiujn antaŭ veni al sekcio, 33 00:02:33,440 --> 00:02:38,550 sed estas bone se vi ne, ni iros sur ili ĉiuokaze. 34 00:02:38,550 --> 00:02:42,590 Do ni povas starti kun tiuj: "Kiel oni dum buklo diferencas de do-dum buklo? 35 00:02:42,590 --> 00:02:46,210 Kiam estas la lasta aparte utila? " 36 00:02:46,210 --> 00:02:49,390 Do iu havas -? 37 00:02:49,390 --> 00:02:52,730 [Studenta] La do-dum buklo ĉiam ekzekuti almenaŭ unufoje. 38 00:02:52,730 --> 00:03:02,950 Jes. Do tio estas la diferenco. Al dum loop - I'll just fari ĝin ĉi tie - dum buklo, ni havas la kondiĉo 39 00:03:02,950 --> 00:03:19,760 ĉi tie, dum kiu do-tempo, vi ne havas kondiĉo ĝis ni atingos cxi tie. 40 00:03:19,760 --> 00:03:24,130 Kaj tiel, kiam via programo estas ekzekuti, kaj alvenas al la dum ciklo, 41 00:03:24,130 --> 00:03:26,380 ĝin tuj kontrolas se ĉi tiu kondiĉo estas vera. 42 00:03:26,380 --> 00:03:30,710 Se tiu kondiĉo ne estas vera, gxi nur salti super la buklo tute. 43 00:03:30,710 --> 00:03:34,390 Do-dum ciklo, kiel la programo estas ekzekuti, alvenas al la "fari." 44 00:03:34,390 --> 00:03:37,920 Nenio okazas en ĉi tiu punkto, nur daŭrigas ekzekuti. 45 00:03:37,920 --> 00:03:42,690 Tiam kiam batas la "dum", se la kondiĉo estas vera, ĝi devos buklo apogi kaj do denove 46 00:03:42,690 --> 00:03:46,730 kaj denove kaj denove ĝis la kondiĉo ne estas vera kaj tiam simple falas tra. 47 00:03:46,730 --> 00:03:50,600 Do, la diferenco estas, ke tiu povas salti dekstra ekde la komenco. 48 00:03:50,600 --> 00:03:56,770 Ĉi nepre ekzekutas fojon kaj tiam povas ekzekuti pli fojoj se la kondiĉo estas ankoraŭ veraj. 49 00:03:56,770 --> 00:04:03,720 Do la tempo buklo nur fari tion unufoje, aŭ - la dum loop - ni ne bezonas fari ĝin tute ne, 50 00:04:03,720 --> 00:04:07,900 ekde tuj kiam ni atingos ĝin, se la kondiĉo estas malvera, ni simple preteriru rajton super ĝi. 51 00:04:07,900 --> 00:04:11,770 Dum do-dum buklo, ni ekzekuti fojon, nepre. 52 00:04:11,770 --> 00:04:14,560 Tiam, kiam ni atingos la kondiĉo, ni kontrolu ĉu ĝi estas vera aŭ malvera. 53 00:04:14,560 --> 00:04:19,790 Se estas vero, ni tion faros denove; se estas malvera, ni simple daŭrigas tuj. 54 00:04:19,790 --> 00:04:24,680 Do kiam estas la lasta aparte utila? 55 00:04:24,680 --> 00:04:31,190 Do mi povas diri ke en la tuteco de la 4 jaroj, antaŭ 3 jaroj, kion ajn, 56 00:04:31,190 --> 00:04:38,780 ke mi estas programado, mi uzis tiun, kiel, sub 10-foje. 57 00:04:38,780 --> 00:04:43,140 Kaj probable 5 el ili estas en CS50 kiam ni enkondukas do-dum cikloj. 58 00:04:43,140 --> 00:04:47,510 Do kiam vi uzis do-dum bukloj? 59 00:04:47,510 --> 00:04:49,510 Kiam estas la - yeah? 60 00:04:49,510 --> 00:04:53,180 [Studenta] Kiam vi provas atingi uzanto enigo, aŭ io, kion vi volas kontroli - 61 00:04:53,180 --> 00:04:59,700 Yeah. Do do-dum cikloj, uzanto enigo estas la granda unu. 62 00:04:59,700 --> 00:05:03,160 Tial en la unua paro problemo aroj, kiam vi volas demandi al la uzanto, kiel, 63 00:05:03,160 --> 00:05:08,520 "Donu al mi kordoj," vi ne povas pluiri ĝis ili atingi tiun ĉenon. 64 00:05:08,520 --> 00:05:12,980 Kaj tial vi nepre, necese peti la kordoj almenaŭ unufoje. 65 00:05:12,980 --> 00:05:16,950 Sed tiam, se ili respondos io malbona, tiam vi bezonos al buklo dorso kaj demandas denove. 66 00:05:16,950 --> 00:05:20,810 Sed escepte uzanto enigo, estas tre maloftaj, ke mi renkontos kazo 67 00:05:20,810 --> 00:05:27,170 kie mi volas buklo "almenaŭ unufoje" sed eble pli. 68 00:05:27,170 --> 00:05:33,370 Demandoj aŭ -? Ĉu iu uzis do-dum buklo aliloke? 69 00:05:33,370 --> 00:05:36,780 Okay. Do la sekva estas, "Kion nedeklarita ensalutilo 70 00:05:36,780 --> 00:05:43,310 kutime indiki se outputted per clang? " 71 00:05:43,310 --> 00:05:47,380 Do, kian kodon mi povus skribi por ricevi 'nedeklarita ensalutilo? 72 00:05:47,380 --> 00:05:49,550 [Studenta] Tio x = 2? 73 00:05:49,550 --> 00:05:52,650 Do ni povas simple provi ĝin en ĉi tie, x = 2. 74 00:05:52,650 --> 00:06:04,830 Ni kuros ĉi - ho, mi ne alklaku ĝin. Do jen ni alvenas - gxuste. 75 00:06:04,830 --> 00:06:07,100 "Uzo de nedeklarita ensalutilo x." 76 00:06:07,100 --> 00:06:11,610 Do jen la nedeklarita ensalutilo, variablo. 77 00:06:11,610 --> 00:06:13,910 Ĝi ofte nomas variablo identificador. 78 00:06:13,910 --> 00:06:17,300 Do eble ne scias ke estas reale variablo; ne scias kion ĝi estas. 79 00:06:17,300 --> 00:06:19,380 Do temas pri identigilo. 80 00:06:19,380 --> 00:06:26,060 Do kial ĝi ne deklarita? Yeah. 81 00:06:26,060 --> 00:06:32,190 Do esti klara en terminologio, la deklaro de variablo 82 00:06:32,190 --> 00:06:37,360 Estas kiam vi diras "int x," aŭ "string y," kiom. 83 00:06:37,360 --> 00:06:41,910 La inicialización de la variablo, aux la atribuo de la variablo, 84 00:06:41,910 --> 00:06:44,510 Estas kiam vi diras "x = 2." 85 00:06:44,510 --> 00:06:52,950 Do ni povas fari tiujn en apartaj paŝoj, int x, x = 2, kaj ĝis - ni povas havi amason da materialo en ĉi tie - 86 00:06:52,950 --> 00:07:00,350 sed ĝis tiu linio okazas, x estas ankoraŭ uninitialized, sed estis deklarita. 87 00:07:00,350 --> 00:07:06,760 Kaj tiel ni povas evidente fari ĝin en 1 linio, kaj nun ni estas deklari kaj inicializar. 88 00:07:06,760 --> 00:07:10,730 Demandoj? 89 00:07:10,730 --> 00:07:18,390 Kaj fine, "Kial la cezaro Cipher ne tre sekura?" 90 00:07:18,390 --> 00:07:23,830 Do unue, ĉu iu volas diri kion Cezaro Cipher estas? 91 00:07:23,830 --> 00:07:28,100 [Studenta] Cezaro Cipher nur estas ke vi mapo, vi ŝanĝi ĉiun literon, 92 00:07:28,100 --> 00:07:34,420 iu numero de literoj transiru, kaj retiriĝi superflue, kaj ĝi ne estas tre sekura ĉar 93 00:07:34,420 --> 00:07:42,260 ekzistas nur 26 eblaj opcioj kaj vi nur devas provi ĉiu 1 de tiuj ĝis vi ricevas ĝin. 94 00:07:42,260 --> 00:07:45,470 Oh. Do, mi devas ripeti? 95 00:07:45,470 --> 00:07:51,600 Cezaro Cipher, it's - Mi volas diri, vi povas trakti ĝin sur la problemojn ke vi - 96 00:07:51,600 --> 00:07:56,110 aŭ mi supozas la normon eldono de la problemo aro kiu estas ne sur la hacker eldono. 97 00:07:56,110 --> 00:08:01,550 Do en la normo eldono al la problemo aro, vi ricevas mesaĝon kiel, "Saluton, mondo!" 98 00:08:01,550 --> 00:08:08,410 kaj vi ankaux havas numeron kiel 6, kaj vi prenas tiun mesaĝon, kaj ĉiu individua karaktero, 99 00:08:08,410 --> 00:08:11,310 vi turni ĝin per 6 poziciojn en la alfabeto. 100 00:08:11,310 --> 00:08:16,560 Do la 'h' en saluton igus h-i-j-k-l-m-n. 101 00:08:16,560 --> 00:08:19,600 Do la unua litero devus esti n. Ni faros la samon kun e. 102 00:08:19,600 --> 00:08:23,530 Se ni havas, kiel, z aŭ io, tiam ni envolver reen ĉirkaŭe por 'a'. 103 00:08:23,530 --> 00:08:29,280 Sed ĉiu signo ricevas cycled 6 signojn poste en la alfabeto, kaj ĝi ne estas tre sekura 104 00:08:29,280 --> 00:08:35,440 pro tio ke estas nur 26 eblecoj por kiom da manieroj vi povus kovri sola litero. 105 00:08:35,440 --> 00:08:42,919 Do vi povas simple provi ĉiujn 26 el ili kaj, supozeble, dum longa sufiĉas mesaĝo, 106 00:08:42,919 --> 00:08:46,860 nur 1 el tiuj ebla 26 aĵoj tuj estos legeblaj, 107 00:08:46,860 --> 00:08:50,300 kaj la legebla tiu tuj estos la originala mesaĝo. 108 00:08:50,300 --> 00:08:56,240 Do ĝi ne estas tre bona maniero de encrypting ion ajn. 109 00:08:56,240 --> 00:08:59,070 Nerilata al tiuj mallongaj, "Kio estas funkcio?" 110 00:08:59,070 --> 00:09:03,370 Do kio estas funkcio? Jes. 111 00:09:03,370 --> 00:09:11,640 [Studenta] Estas kiel aparta peco de kodo, kiun vi povas nomi iri tra kaj poste la reveno valoro de kiom. 112 00:09:11,640 --> 00:09:18,160 Yeah. Do mi devos respondi ĝin ankaŭ respondante al la sekva - aŭ ripeto de ankaŭ simple respondi al la sekva. 113 00:09:18,160 --> 00:09:22,410 Vi povas uzi funkcioj anstataŭ nur kopii kaj bati kodo denove kaj denove. 114 00:09:22,410 --> 00:09:27,200 Nur prenu ke kodo, metis ĝin en fuction, kaj tiam vi povus simple nomi la funkcion 115 00:09:27,200 --> 00:09:29,870 cxie, kien vi estis kopii kaj bati. 116 00:09:29,870 --> 00:09:33,350 Do funkcioj estas utilaj. 117 00:09:33,350 --> 00:09:35,860 Do nun ni faros realan problemojn. 118 00:09:35,860 --> 00:09:46,490 La unua. Do la ideo de la unua estas, vi pasas ĉenon, kaj sendepende de la - 119 00:09:46,490 --> 00:09:52,060 aŭ faras ĝi diri ĉion minuskla? Li ne diras tutan minuskla. 120 00:09:52,060 --> 00:09:57,730 Do la mesaĝo povas esti ion ajn, kaj - ho ne. Ĝi faras. 121 00:09:57,730 --> 00:10:01,610 "Por simpleco, oni povas supozi ke la uzanto volas nur enigo minuskla literoj kaj spacoj." 122 00:10:01,610 --> 00:10:08,180 Do ni pasi ĝin mesaĝon kun nur minuskla literoj kaj poste ni alternos 123 00:10:08,180 --> 00:10:15,450 inter kapitalo kaj minuskla - ni ŝanĝos la kordo esti ĉefurbo kaj minuskla, alternante. 124 00:10:15,450 --> 00:10:22,920 Do antaŭ ol ni donas al vi duan inkluzive plonĝi en la problemo, 125 00:10:22,920 --> 00:10:32,420 kio estas la unua aĵo kiun ni bezonas por fari? 126 00:10:32,420 --> 00:10:36,900 Ho, kion mi ĵus alklaku? Ho, mi ĵus alklakis retmesaĝon en ĉi tie. 127 00:10:36,900 --> 00:10:42,870 Do la unua afero kiun ni bezonas por fari - mi rigardas la malĝusta unu? 128 00:10:42,870 --> 00:10:49,320 Estas ĉi tiu parto de ĉi tiu? 129 00:10:49,320 --> 00:10:51,320 Ne, tio estas ankoraŭ en tie, though. 130 00:10:51,320 --> 00:10:55,160 Konsentite, ankoraŭ ĉi tie. 131 00:10:55,160 --> 00:11:03,160 Nun ni ne povas supozi -? Jes. Ĉi tie ni ne povas supozi ke ĝi estas nur minuskle kaj spacoj. 132 00:11:03,160 --> 00:11:07,770 Do nun ni devas trakti la fakton ke la literoj povas esti kion ajn ni volas ilin esti. 133 00:11:07,770 --> 00:11:11,910 Kaj tial la unua horo ni volas fari estas simple akiri la mesaĝo. 134 00:11:11,910 --> 00:11:19,790 Ni nur bezonas akiri ĉeno, ĉeno s = GetString, okay. 135 00:11:19,790 --> 00:11:24,890 Nun ĉi tiu problemo, estas kelkaj manieroj de fari tion. 136 00:11:24,890 --> 00:11:29,840 Sed ni tuj volas uzi bitlarĝa operatoroj tie. 137 00:11:29,840 --> 00:11:35,280 Ĉu ekzistas homoj kiuj aŭ jam estis ne je la supersection, 138 00:11:35,280 --> 00:11:37,480 aŭ io, kaj ne scias kion bitlarĝa operatoroj estas? 139 00:11:37,480 --> 00:11:41,710 Aŭ kiel ili rilatas al ASCII iamaniere? 140 00:11:41,710 --> 00:11:45,650 [Studenta] mi ne estis en la supersection, sed mi scias kio bitlarĝa operatoroj estas. 141 00:11:45,650 --> 00:11:49,560 Okay. Tial mi ne devas iri super la fundamentojn de ili, sed mi klarigi 142 00:11:49,560 --> 00:11:51,830 kion ni tuj volas uzi ĉi tie. 143 00:11:51,830 --> 00:11:59,680 Do 'A': Duuma reprezento de kapitalo A, la nombro estas 65. 144 00:11:59,680 --> 00:12:07,560 Mi simple intencas rigardi - 41 tuj estos 01000001. 145 00:12:07,560 --> 00:12:14,170 Por ke estu 65 en dekuma, do ĉi tiu estas la duuma reprezento de la karaktero ĉefurbo A. 146 00:12:14,170 --> 00:12:19,440 Nun, la duuma reprezento de la karaktero minuskla 'a' 147 00:12:19,440 --> 00:12:33,350 tuj estos la sama afero, preskaŭ. Ĉu tio estas - 6, jes. Tio decas. 148 00:12:33,350 --> 00:12:37,670 Do duuma ĉefurbo A, duuma minuskla 'a'. 149 00:12:37,670 --> 00:12:43,940 Do rimarki ke la diferenco inter A kaj 'a' estas cxi tiu sola iom. 150 00:12:43,940 --> 00:12:49,440 Kaj ĉi tio okazas al esti la 32 bito, la bito reprezentas la numeron 32. 151 00:12:49,440 --> 00:12:53,910 Kaj tio faras senson kiam A estas 65; 'a' estas 97. 152 00:12:53,910 --> 00:12:56,610 La diferenco inter ili estas 32. 153 00:12:56,610 --> 00:13:03,770 Do nun ni scias ke ni povas konverti de A al 'a' per prenante A 154 00:13:03,770 --> 00:13:09,710 kaj bitlarĝa ORing ĝin, kun - tio aspektas kiel 1. 155 00:13:09,710 --> 00:13:20,900 Tio ĉi estas bitlarĝa OR, kun 00100000, kaj tiu donos al ni 'a'. 156 00:13:20,900 --> 00:13:26,850 Kaj ni povas preni de 'a' al A per bitlarĝa ANDing 157 00:13:26,850 --> 00:13:33,700 kun 11, 0 en tiu loko, 11111. 158 00:13:33,700 --> 00:13:43,840 Do ĉi estos tiam donu al ni precize kion 'a' estis, sed nuligi tiun individuaj iom, 159 00:13:43,840 --> 00:13:50,070 do ni havos 01000001, mi ne scias se mi rakontas pravas. 160 00:13:50,070 --> 00:13:56,750 Sed ĉi tiu tekniko de bitlarĝa ORing akiri el ĉefurbon al minuskla, 161 00:13:56,750 --> 00:14:02,080 kaj bitlarĝa ANDing akiri el minuskla al ĉefurbo ne estas ekskluziva al A. 162 00:14:02,080 --> 00:14:06,510 Ĉiuj literoj, K vs k, Z vs z, 163 00:14:06,510 --> 00:14:10,080 ĉiuj ili estas ĝuste tuj diferencas de tiu sola iom. 164 00:14:10,080 --> 00:14:16,290 Kaj tiel vi povas uzi tiun ŝanĝi el iu minuskla letero al ajna majusklo kaj inverse. 165 00:14:16,290 --> 00:14:26,670 Okay. Do facilan vojon de prenanta el tiu - tial anstataŭ devi 166 00:14:26,670 --> 00:14:32,170 skribi eksteren ajn 1011111 estas - facila maniero reprezenti tiun numeron, kaj ĉi tiu estas ne unu 167 00:14:32,170 --> 00:14:39,710 ke mi transiris en la supersection, sed supersigno (~) estas alia bitlarĝa operatoro. 168 00:14:39,710 --> 00:14:42,520 Kio ~ faras estas ĝi rigardas la bito prezento. 169 00:14:42,520 --> 00:14:45,630 Ni prenu ajnan nombron. 170 00:14:45,630 --> 00:14:53,130 Tio estas nur iuj duuma nombro, kaj kion ~ tio estas simple klakas ĉiuj bitoj. 171 00:14:53,130 --> 00:15:00,630 Do temas pri 1, nun 0, ĉi tiu estas 0, nun 1, 010100. 172 00:15:00,630 --> 00:15:08,320 Do jen ĉio ~ faras. Do 32 estas tuj estos la nombro - liveri de tiu - 173 00:15:08,320 --> 00:15:23,320 do 32 tuj estos la nombro 00100000, do ~ de tiu tuj estos 174 00:15:23,320 --> 00:15:29,980 tiu nombro tien ke mi ANDed 'a' kun. 175 00:15:29,980 --> 00:15:35,600 Ĉu ĉiuj vidas tion? Ĉi tiu estas bela komuna, kiel kiam vi volas eltrovi 176 00:15:35,600 --> 00:15:40,740 por postaj aferoj kiujn ni povus vidi, kiam ni volas vidi se - 177 00:15:40,740 --> 00:15:44,710 aŭ ni volas ĉiu, ĉiu unuopa bito aro krom 1 178 00:15:44,710 --> 00:15:47,910 vi emas fari ~ de la bito, ke ni ne volas agordi. 179 00:15:47,910 --> 00:15:53,090 Do ni ne volas la 32 bitoj aro, do ni ~ de 32. 180 00:15:53,090 --> 00:15:57,790 Okay. Do ni povas uzi ĉiuj tiuj ĉi tie. 181 00:15:57,790 --> 00:16:03,000 Bone, do ĝi estas bone se vi ne faris, ni malrapide iras super kune, 182 00:16:03,000 --> 00:16:11,870 aŭ marŝi sur ĉi, do - tra ĉi. Marŝi tra ĉi. 183 00:16:11,870 --> 00:16:20,790 Do ni havas nian kordoj, kaj ni volas buklo super ĉiu karaktero en tiu ĉeno kaj faru ion por ĝi. 184 00:16:20,790 --> 00:16:26,710 Do kiel fari ni buklo sur ĉeno? Kion ni uzu? 185 00:16:26,710 --> 00:16:30,980 Mi ne faros tion ĉi tie. Yeah. 186 00:16:30,980 --> 00:16:42,940 Do mi havas mian iterator, kaj li diris tion, sed kiom mi scias, kiom da karakteroj estas en la kordo? 187 00:16:42,940 --> 00:16:47,030 Strlen (j), tiam mi + +. 188 00:16:47,030 --> 00:16:49,860 Do kion mi faris tie ne estas la plej bona maniero fari aferojn. 189 00:16:49,860 --> 00:16:51,860 Ĉu iu scias kial? 190 00:16:51,860 --> 00:16:55,290 Ĉar vi kontroli la lingvon de la kordo ĉiun solan fojon. 191 00:16:55,290 --> 00:17:06,859 Do ni tuj volas movi strlen, mi povus diri tien, int longeco = strlen (j), 192 00:17:06,859 --> 00:17:11,900 kaj do i 00:17:20,410 Mi povus ankaŭ fari int i = 0, longo = strlen (j). 194 00:17:20,410 --> 00:17:25,010 Kaj tiel tio estas iom preferinda, ĉar nun mi limigis la medio 195 00:17:25,010 --> 00:17:29,150 de la variablo longo justaj ĉi 'por' loop, anstataŭ deklari ĝin antaŭ 196 00:17:29,150 --> 00:17:34,990 kaj kiu ĉiam ekzistas, kaj en kazo vi ne kaptis kial tio estas malbona, 197 00:17:34,990 --> 00:17:39,410 aŭ kial la originalo estis malbona, it's - starti je la por buklo. 198 00:17:39,410 --> 00:17:43,380 Mi kontrolis la kondiĉo. Estas i 00:17:46,790 Do la longo de s, ni laboras kun "saluton" la tuta tempo. 200 00:17:46,790 --> 00:17:49,670 Do longo de s, h-kaj-l-l-o. Daŭro estas 5. 201 00:17:49,670 --> 00:17:57,580 Do mi = 0, longo estas 5, do mi estas ne <5, do la ciklo daŭras. 202 00:17:57,580 --> 00:18:02,750 Tiam ni iru denove. Ni kontrolu la kondiĉo. Estas i 00:18:08,390 Do ni kontrolu la longo de saluton. H-kaj-l-l-o. Tio estas 5; i ne estas <5, do ni daŭrigos denove. 204 00:18:08,390 --> 00:18:13,330 Do ni kalkuli, ni rakonti saluton, por ĉiu ripeto de la ciklo, 205 00:18:13,330 --> 00:18:17,380 eĉ pensis ke neniam tuj ŝanĝos; ĝi estas ĉiam tuj estos 5. 206 00:18:17,380 --> 00:18:22,530 Do ni simple memori 5 ĝis fronto, kaj nun ĉio estas pli bona. 207 00:18:22,530 --> 00:18:24,990 Do ripetanta tra la tuta linio. 208 00:18:24,990 --> 00:18:31,470 Kion ni volas fari por ĉiu karaktero de la kordo? 209 00:18:31,470 --> 00:18:38,510 [Studenta parolante, nekomprenebla] 210 00:18:38,510 --> 00:18:47,000 Yeah. Do, se la karaktero estas ne-alfabeta, tiam ni volas nur salti super ĝin. 211 00:18:47,000 --> 00:18:52,300 Ĉar ni nur zorgas pri alfabeta literoj; ni ne povas profiti numero. 212 00:18:52,300 --> 00:19:10,850 Do kiel ni povas fari ĉi tion? Do nia kondiĉo, do se ni volas ion - kontroli se estas alfabeta. 213 00:19:10,850 --> 00:19:14,060 Nu do kiel ni kontrolu ĉi? 214 00:19:14,060 --> 00:19:18,720 [Studenta] Vi povas simple uzi la funkcio estas alfa. 215 00:19:18,720 --> 00:19:23,160 Ĉu tio estas inkluzivita en ĉu de ĉi tiuj, aŭ ajna inkluzivi kiel, char.h aŭ ion? 216 00:19:23,160 --> 00:19:32,710 Ni ne uzas la estas alfa funkcio, kaj uzu la eksplicita - tiel ni havas j [i], 217 00:19:32,710 --> 00:19:40,460 tio estas la oka karaktero de s, memoru ke kordoj estas tabelo de signoj, 218 00:19:40,460 --> 00:19:43,180 do la oka karaktero de s. 219 00:19:43,180 --> 00:19:49,280 Nun, se ĝi estas majusklo, ni scias ke ĝi devas esti en specifa vario. 220 00:19:49,280 --> 00:19:54,370 Kaj kio estas tiu gamo? 221 00:19:54,370 --> 00:20:07,860 Yeah. Do se s [i] estas ≥ 65, kaj s [i] estas ≤ 90, kion mi faru anstataŭ? 222 00:20:07,860 --> 00:20:18,470 Yeah. Do vi devus absolute neniam eĉ bezonas scii la ASCII valoroj de io eterne. 223 00:20:18,470 --> 00:20:25,640 Neniam pensas pri la numeroj 65, 90, 97 kaj 102, aŭ kio ajn ĝi estas. 224 00:20:25,640 --> 00:20:32,470 Vi ne bezonas - 112? - Vi ne bezonas scii tiuj tute ne. Tio estas erara tro. 225 00:20:32,470 --> 00:20:41,940 Nur uzu la simpla citaĵo karakteroj, simpla citaĵo konstantoj. Do 'A' kaj malpli ol 90 estas 'Z.' 226 00:20:41,940 --> 00:20:47,930 Kaj jen estas signife pli bona - mi ne scias ekstere la supro de mia kapo kiun Z estas 90. 227 00:20:47,930 --> 00:20:52,690 Mi scias for la supro de mia kapo, ke 'Z' estas ĉefurbo Z. 228 00:20:52,690 --> 00:21:02,100 Do tiel longe kiel ĉi estas en la rango de ĉefurbo A al ĉefurbo Z, aŭ ni povas kontroli por minuskla, 229 00:21:02,100 --> 00:21:17,010 Aŭ se ĝi estas en la gamo ≥ 'a' kaj ≤ z. 230 00:21:17,010 --> 00:21:19,010 Do jen nia kondiĉo. 231 00:21:19,010 --> 00:21:22,520 La stilo de kie meti tion varias. 232 00:21:22,520 --> 00:21:29,520 Mi faros ĝin kiel ĉi tio. 233 00:21:29,520 --> 00:21:31,520 Nun, kion ni volas fari? 234 00:21:31,520 --> 00:21:39,530 Ni scias ĉi litero estas karaktero, alfabeta karaktero. 235 00:21:39,530 --> 00:21:46,270 Tial oni devas alterni inter se ĉi nun devas esti majuskla litero aŭ minuskla litero. 236 00:21:46,270 --> 00:21:48,820 Kiel ni konservi trako de kiuj oni ni volas ke ĝi estu? 237 00:21:48,820 --> 00:21:55,520 [Studenta voĉoj, nekomprenebla] 238 00:21:55,520 --> 00:21:59,150 Do jes, sed lasu min kontroli. 239 00:21:59,150 --> 00:22:04,910 Modulo 0-2 dirite, estis sugesto elĵetis, kaj mi konsentas kun tio. 240 00:22:04,910 --> 00:22:11,780 Krom avizo kiu, kiel - estas ĉi kazo? Yeah. 241 00:22:11,780 --> 00:22:18,270 Estas ĉiu alia, sed ni ne povas modulo 2 de i, aŭ i mod 2, ekde 242 00:22:18,270 --> 00:22:22,950 rimarki, ke E estas ĉefurbo kaj 'a' estas minuskla? Sed estas spaco disigi ilin? 243 00:22:22,950 --> 00:22:27,150 Do ili tuj estus la sama mod 2, sed ili estas malsamaj kazoj. 244 00:22:27,150 --> 00:22:29,150 [Studenta demando, nekomprenebla] 245 00:22:29,150 --> 00:22:34,690 Yeah. Do ni nur iri gardi grafo. 246 00:22:34,690 --> 00:22:38,730 Ni povus ankaŭ fari tion ĉi tie se ni volis, ke oni eble iom _unwieldy_ 247 00:22:38,730 --> 00:22:41,300 en la por buklo deklaroj, mi metos ĝin ĉi tie. 248 00:22:41,300 --> 00:22:48,840 Do int grafo = startas je 0. 249 00:22:48,840 --> 00:22:54,070 Kaj tial nun, mi tuj rakonti kio alfabeta gravuloj ni havis. 250 00:22:54,070 --> 00:22:59,550 Do ni neeviteble tuj rakontos + + ekde ni trovis alian alfabeta karaktero. 251 00:22:59,550 --> 00:23:09,130 Sed, tial nun vi diras se grafo _mod_ 2. 252 00:23:09,130 --> 00:23:12,590 Do kion se grafo _mod_ 2? Oh. Mi tion faros == 0 por nun. 253 00:23:12,590 --> 00:23:21,740 Ni ankaux iru super tio. Do se grafo _mod_ 2 == 0, tiam kio? 254 00:23:21,740 --> 00:23:27,830 [Studentoj respondo, nekomprenebla] 255 00:23:27,830 --> 00:23:32,750 Do ni volas ke ĝi finos majuskle. 256 00:23:32,750 --> 00:23:37,520 Estas 2 kazoj; majuskla kaj minuskla estas la 2 kazoj. 257 00:23:37,520 --> 00:23:40,990 Do, se ni estas en minuskla ni bezonas por fari ĝin majuskle. 258 00:23:40,990 --> 00:23:43,710 Se ĝi estas majuskla ni ne bezonas fari ion. 259 00:23:43,710 --> 00:23:50,760 Sed, estas tie maniero - shouldn't esti spegulita - 260 00:23:50,760 --> 00:23:54,800 ke ni eĉ ne bezonas por kontroli ĉu ĝi estas majuskla aŭ minuskla? 261 00:23:54,800 --> 00:24:02,240 Kion ni povas fari por ĉiam certiĝu, ke ni ĉiam finas en majuskla? 262 00:24:02,240 --> 00:24:07,830 Do rimarki kion ni faris por minuskla 'a'; kio se ni faris tiun saman ĝusta afero por majuskla A? 263 00:24:07,830 --> 00:24:11,900 Ĉu Majusklaj Ŝanĝo, aŭ faras la valoro ŝanĝo? 264 00:24:11,900 --> 00:24:23,100 Yeah. Do iu majusklo bitlarĝa ANDed kun ~ 32 tuj estos tiu sama majuskla karaktero 265 00:24:23,100 --> 00:24:29,220 ĉar por ajna majuskla karaktero la 32-a bita ne metis. 266 00:24:29,220 --> 00:24:40,920 Do, se ni volas alporti la karaktero s [i], ni volas igi minuskla aŭ majuskla. 267 00:24:40,920 --> 00:24:46,890 Do, se ĝi estis minuskla, nun majuskla, se ĝi estis majuskla, estas ankoraŭ majuskla, kaj tio estas ĝi. 268 00:24:46,890 --> 00:24:54,290 Mi diris tion en la supersection: Vi povas uzi 32 se vi volas, sed mi emas preferi faras 'a' - Al, 269 00:24:54,290 --> 00:25:01,150 anstataŭ nur ordinaraj 32, ĉar ĝi povas esti ajna alia iom. 270 00:25:01,150 --> 00:25:03,610 Post la 32 bitoj, ĝi povas esti iu ajn el tiuj, aŭ ni ne havus sufiĉe 271 00:25:03,610 --> 00:25:05,840 nombroj por reprezenti ĉiujn signojn. 272 00:25:05,840 --> 00:25:09,110 Do, se vi ricevas la 32 bitoj, povus esti la 64 bitoj, povus esti la 128 bit. 273 00:25:09,110 --> 00:25:13,990 Ajna el tiuj bitoj eblus la bita kiu distingas inter majuskla kaj minuskla. 274 00:25:13,990 --> 00:25:18,350 Mi ne bezonas scii ke ĝi estas la 32 bitoj. 275 00:25:18,350 --> 00:25:27,130 Mi povas uzi tiun 'oni' - Al atingi la bito kiu diferencas inter la du 276 00:25:27,130 --> 00:25:33,000 sen bezoni dependi de la magia nombro kiu estas 32. 277 00:25:33,000 --> 00:25:38,770 Kaj tial nun, alie kalkulu estis strange, do kion mi volas fari? 278 00:25:38,770 --> 00:25:43,920 [Studenta respondoj, nekomprenebla] 279 00:25:43,920 --> 00:25:45,920 [Studenta] Kio estas tio? 280 00:25:45,920 --> 00:25:49,850 Mi faros ĝin en 1 sekundo. 281 00:25:49,850 --> 00:25:55,690 Do nun, se mi volas - mi volas certigi la karaktero estas nun minuskla, 282 00:25:55,690 --> 00:26:04,140 kaj do mi povas AŬ de 32, kaj 32 signifo 'a' - A. 283 00:26:04,140 --> 00:26:06,510 Sed avizo, por la sama rezonado kiel la antaŭa, ke se 284 00:26:06,510 --> 00:26:11,670 la letero estis jam minuskla, tiam ORing de 32 nur tenas ĝin minuskle. 285 00:26:11,670 --> 00:26:16,220 Ĝi ne ŝanĝis la originala karaktero. 286 00:26:16,220 --> 00:26:19,910 Sed nun mi ne devas eviti diri, "Se ĝi estas minuskla, simple forgesi pri tio, 287 00:26:19,910 --> 00:26:23,650 se ĝi estas majuskla, do ŝanĝi ĝin. " 288 00:26:23,650 --> 00:26:26,900 Estas multe pli oportuna por fari tion. 289 00:26:26,900 --> 00:26:33,190 [Studenta] Ĉu tio strategio de subtrahanta la majuskla de la minuskla laboro se ne estus 32? 290 00:26:33,190 --> 00:26:35,330 Se ĝi estis, kiel, 34 aŭ ion? 291 00:26:35,330 --> 00:26:41,840 Do, kion vi bezonas scii, ke la diferenco inter la 2 estas -? >> 1 bito. 292 00:26:41,840 --> 00:26:49,840 Ĝi povus esti pli ol 1 bito, dum ĉiuj bitoj sub ĉi pozicio estas la sama. 293 00:26:49,840 --> 00:26:58,500 Do ni bezonas almenaŭ 26 signojn - aŭ, estas 26 signoj. 294 00:26:58,500 --> 00:27:04,590 Do ni bezonas almenaŭ 26 numerojn por reprezenti la diferenco - 295 00:27:04,590 --> 00:27:07,650 La diferenco inter A kaj 'a' devas esti almenaŭ 26, 296 00:27:07,650 --> 00:27:10,760 alie ni ne estus reprezentitaj la tuta ĉefurbo nombroj. 297 00:27:10,760 --> 00:27:18,630 Tio signifas ke A, se ni starti je 1, ĝi tuj uzos ĉiujn el tiuj bitoj, 298 00:27:18,630 --> 00:27:23,900 ĉiuj el tiuj unuaj 5 bitoj, por reprezenti ĉiun tra Z. 299 00:27:23,900 --> 00:27:32,170 Tial la sekvanta bito, aŭ tiun iom, la sekva iom estas ke tio elektita por distingi inter A kaj 'a'. 300 00:27:32,170 --> 00:27:40,930 Tio estas ankaŭ kial, en ASCII tablo estas 5 simboloj disigi majuskloj de minuskla literoj. 301 00:27:40,930 --> 00:27:49,050 Ekde tiuj estas la simboloj, la ekstra 5 kiu kondukas supren la 32 estante la diferenco inter ili. 302 00:27:49,050 --> 00:27:51,840 [Studenta] Do ni povus fari ĝin, ĉar ASCII estas desegnita tiu vojo. 303 00:27:51,840 --> 00:27:57,280 Jes. Sed ASCII - la diferenco povus ankaŭ esti ambaŭ el ĉi tiuj bitoj. 304 00:27:57,280 --> 00:28:12,040 Kiel, se A estis 10000001, kaj 'a' estis 11100001 - Mi forgesas, kion ajn. 305 00:28:12,040 --> 00:28:18,100 Sed se ĝi tion, tiam ni povus ankoraŭ uzi 'a' - A. 306 00:28:18,100 --> 00:28:22,650 Estas nur nun la diferenco inter A kaj 'a' estas ankoraŭ tiuj 2 bitoj. 307 00:28:22,650 --> 00:28:32,240 Mi kredas ĝi estas skribita 48. Ĉu 32 + 64? Mi kredas ke estas? 308 00:28:32,240 --> 00:28:40,160 Estus ankoraŭ 2 bitoj; ĉiu unuopa signo, kiel, Z kaj z, K kaj k, 309 00:28:40,160 --> 00:28:45,160 ili ankoraŭ havas la saman ĝusta bitoj starigis krom tiuj 2 bitoj. 310 00:28:45,160 --> 00:28:48,870 Do dum tiu ĉiam estas vera, sendepende de se ni uzas ASCII aŭ iu alia sistemo, 311 00:28:48,870 --> 00:28:53,050 tiel longe, kiel ekzistas nur aro da bitoj kiu estas malsamaj por ĉiu karaktero, 312 00:28:53,050 --> 00:28:55,050 tiam kiu funkcias bone. 313 00:28:55,050 --> 00:29:06,110 Estas nur ke 32 estis starigita ĉar ĝi estas la unua ni povus uzi. >> Cool. 314 00:29:06,110 --> 00:29:14,520 Mi emas preferi, okaze vi ne vidis, se la bloko estas nur sola linio, 315 00:29:14,520 --> 00:29:24,280 vi povas forigi la frizita krampoj, do mi emas preferi fari ĉi tion. 316 00:29:24,280 --> 00:29:34,010 Ankaŭ, vi scias, kiel ni povas fari aferojn kiel s [i] + = 1? 317 00:29:34,010 --> 00:29:41,090 Vi ankaŭ povas fari j [i] bitlarĝa KAJ = 32. 318 00:29:41,090 --> 00:29:46,400 Kaj bitlarĝa OR = 32. 319 00:29:46,400 --> 00:29:51,490 Ankaŭ, grafo _mod_ 2 == 0. 320 00:29:51,490 --> 00:30:00,900 Do memoru, ke - mi ne skribas ĝin - ĉiu ne-nula valoro estas vera, kaj 0 estas falsaj. 321 00:30:00,900 --> 00:30:07,880 Do "se grafo _mod_ 2 == 0" estas la sama kiel diri "se ne kalkuli _mod_ 2." 322 00:30:07,880 --> 00:30:11,580 Mi verŝajne estus nur renversis la linioj kaj diris, "se grafo mod 2, 323 00:30:11,580 --> 00:30:15,350 ĉu la AŬ 1, alie vi la KAJ 1, "por ke mi ne bezonas la" ne. " 324 00:30:15,350 --> 00:30:18,650 Sed ĉi funkcias same bone. 325 00:30:18,650 --> 00:30:25,660 Kaj kion alian mi povas fari tie? 326 00:30:25,660 --> 00:30:29,060 Vi povus kombini ilin per triargumenta se vi volas, sed tiam tio volas nur fari tion Messier 327 00:30:29,060 --> 00:30:33,770 kaj probable pli malfacile legi, sekve ni ne faros tion. 328 00:30:33,770 --> 00:30:37,330 Iu havas aliajn sugestojn? 329 00:30:37,330 --> 00:30:41,580 Estas ke la tuta problemo petis? Oh jes. 330 00:30:41,580 --> 00:30:51,070 Do forigi tiujn malplenajn liniojn, nun ni presi f,% s esti la unu por kordoj, 331 00:30:51,070 --> 00:30:56,620 Ni presas f, s. 332 00:30:56,620 --> 00:30:59,330 Nun ni ruli ĝin. Ĉu mi faras ion malĝustan? 333 00:30:59,330 --> 00:31:03,200 Tio estas \ "; Mi volas n. 334 00:31:03,200 --> 00:31:07,840 Okay. Nun ni kuros ĝin. Sxanco gxi krias al mi. 335 00:31:07,840 --> 00:31:11,250 Strlen estas en string.h. 336 00:31:11,250 --> 00:31:14,290 Do ĉi tiu estas la bela afero pri Clang estas rakontas al vi kio estas en, 337 00:31:14,290 --> 00:31:19,140 anstataŭ GCC kiu nur diras, "Hej, vi forgesis ion, mi ne scias kion ĝi estas." 338 00:31:19,140 --> 00:31:29,220 Sed ĉi rakontos al mi, "Vi intencis inkluzivi string.h." 339 00:31:29,220 --> 00:31:32,130 Do mi ne instigas por nenio, do ĝi estas ne diras ion ajn. 340 00:31:32,130 --> 00:31:42,540 Sed ni faros lian ekzemplon, "Thanks 4 La add". 341 00:31:42,540 --> 00:31:47,880 Tio aspektas bone. Hura. 342 00:31:47,880 --> 00:31:52,370 Do revenante al via ĉefa, mi preskaŭ neniam faras. 343 00:31:52,370 --> 00:31:57,110 Estas nedeviga. Kaj ĉefaj estas la sola funkcio por kiu estas laŭvola. 344 00:31:57,110 --> 00:32:07,140 Se vi ne revenos ion de ĉefaj, ĝi estas supozas ke vi intencis reveni 0. 345 00:32:07,140 --> 00:32:13,070 Demandoj? 346 00:32:13,070 --> 00:32:20,980 Okay. Do nun la dua problemo. 347 00:32:20,980 --> 00:32:24,810 "Memori de semajno 2 La dua prelego kiun interŝanĝi 2 variabloj 'valoroj por pasi 348 00:32:24,810 --> 00:32:30,780 tiuj 2 variabloj al funkcio (eĉ se nomata swap) ne ĝuste funkcias, almenaŭ ne sen 'punteros.' " 349 00:32:30,780 --> 00:32:37,020 Kaj ignori punteros ĝis ni atingos ilin. 350 00:32:37,020 --> 00:32:40,070 Ni volas interŝanĝi 2 variabloj; ni ne uzas funkcio por fari ĝin. 351 00:32:40,070 --> 00:32:43,410 Ni ankoraŭ faros ĝin en ĉefa ŝatas ĝin diras. 352 00:32:43,410 --> 00:32:48,360 Sed uzi tiujn 2 variabloj, ni ne deziras uzi provizoran variablo. 353 00:32:48,360 --> 00:32:50,770 Estas 2 manieroj por fari tion. 354 00:32:50,770 --> 00:32:56,310 Vi povas fari tion per via tradicia duuma operatoroj. 355 00:32:56,310 --> 00:33:00,180 Do ĉu iu scias rapidan kaj malpuran maniero fari tion? 356 00:33:00,180 --> 00:33:07,650 Eble vere preni momenton de pensado. Se mi havas - 357 00:33:07,650 --> 00:33:12,130 Mi starigis la problemon ĝis kiel ili demandas. Do, se mi havas 2 variabloj, A, kiuj estas nur entjero 358 00:33:12,130 --> 00:33:17,800 ke ili donu al mi, kaj sumo variablo B, kio apartenas al alia entjero kiu mi donis. 359 00:33:17,800 --> 00:33:22,700 Do, se mi havas ĉi tiujn 2 variabloj, nun mi volas interŝanĝi ilin. 360 00:33:22,700 --> 00:33:31,550 La tradicia, uzante viajn regulajn duuma operatoroj, mi volas diri, kiel +, -, ÷. 361 00:33:31,550 --> 00:33:36,630 Ne bitlarĝa operatoroj kiuj agas sur duuma. 362 00:33:36,630 --> 00:33:39,600 Do uzante -, +, ÷, kaj ĉiuj tiuj. 363 00:33:39,600 --> 00:33:52,980 Ni povus interŝanĝi farante iun kiel a = a + b, kaj b = a - b, a = a - b. 364 00:33:52,980 --> 00:34:04,260 Do, prudento kontroli, kaj tiam ni vidos kial tiu verkoj. 365 00:34:04,260 --> 00:34:13,320 Diru al = 7, b = 3, tiam a + b tuj estos 10. 366 00:34:13,320 --> 00:34:18,820 Do ni nun establante = 10, kaj tiam ni faras b = a - b. 367 00:34:18,820 --> 00:34:30,250 Do ni faras b = a - b, kiu tuj estos 7, kaj b = a - b denove, 368 00:34:30,250 --> 00:34:38,650 aŭ a = a - b. Kiu iras al esti 10 - 7 kiu estas 3. 369 00:34:38,650 --> 00:34:44,850 Do nun, ĝuste, 'a' estis 7, b estis 3, kaj nun b estas 7 kaj 'a' estas 3. 370 00:34:44,850 --> 00:34:48,679 Por ke ia havas sencon; 'a' estas la kombino de la 2 nombroj. 371 00:34:48,679 --> 00:34:53,000 Je ĉi tiu punkto, 'a' estas la kombino, kaj tiam ni subtrahanta el la originala b, 372 00:34:53,000 --> 00:34:56,860 kaj poste ni subtrahanta, kio estis la originala 'a'. 373 00:34:56,860 --> 00:35:01,150 Sed ĉi tio ne funkcias por ĉiuj nombroj. 374 00:35:01,150 --> 00:35:08,880 Al vidi ĉi tiu, ni konsideras sistemo, do ni kutime opinias de entjeroj kiel 32 bitoj. 375 00:35:08,880 --> 00:35:13,050 Ni laboras en iu kiu nur kiel 4 bitoj. 376 00:35:13,050 --> 00:35:15,450 Espereble mi venis kun bona ekzemplo nun. 377 00:35:15,450 --> 00:35:18,680 Do, mi scias, ĉi tio estos facila. 378 00:35:18,680 --> 00:35:26,720 Diru nia 2 numeroj estas 1111, kaj 1111, do ni estas en duuma nun. 379 00:35:26,720 --> 00:35:34,630 En reala glitpunktaj nombroj, se vi volas pensi pri tio, ke vojo, = 15 kaj b = 15. 380 00:35:34,630 --> 00:35:37,630 Kaj tial ni atendas, post ni interŝanĝi ilin - ili eĉ ne devas esti la samaj numeroj, 381 00:35:37,630 --> 00:35:41,140 sed mi tion faris tiel. 382 00:35:41,140 --> 00:35:47,100 Ni faru ilin ne la samaj numeroj. Ni do 1111 kaj 0001. 383 00:35:47,100 --> 00:35:51,860 Do al = 15 kaj b = 1. 384 00:35:51,860 --> 00:35:57,670 Post kiam ni interŝanĝi ilin, oni atendus 'a' al esti 1 kaj b esti 15. 385 00:35:57,670 --> 00:36:01,780 Do nia unua paŝo estas a = a + b. 386 00:36:01,780 --> 00:36:08,770 Nia nombroj estas nur 4 bitoj, do 'al,' kiu estas 1111, + b, kiu estas 0001, 387 00:36:08,770 --> 00:36:16,780 tuj finos esti 10000, sed ni nur havas 4 bitoj. 388 00:36:16,780 --> 00:36:22,540 Do nun = 0. 389 00:36:22,540 --> 00:36:34,080 Kaj nun ni volas establi b = a - b - efektive, tiu ankoraŭ laboras ekster perfekte. 390 00:36:34,080 --> 00:36:39,630 a = a - b - ni vidu se ĉi laboras ekster perfekte. 391 00:36:39,630 --> 00:36:53,720 Do tiam b = 0 - 1, kiu estus ankoraŭ 15, kaj tiam a = a - b, kio estus 1. 392 00:36:53,720 --> 00:36:56,210 Eble ĉi tio faras laboron. 393 00:36:56,210 --> 00:36:59,020 Mi sentas ke estas kialo ne funkcias uzante regula. 394 00:36:59,020 --> 00:37:06,400 Konsentite, tiel laborante sur la supozo, ke ĝi ne funkcias kun regulaj duuma operacioj, 395 00:37:06,400 --> 00:37:15,040 kaj mi serĉos - Mi Google por vidi ĉu tiu estas vera. 396 00:37:15,040 --> 00:37:23,490 Do ni volas fari ĝin uzante bitlarĝa operatoroj, kaj la indikon jen _XOR_. 397 00:37:23,490 --> 00:37:28,780 Do, enkondukante _XOR_ (^) se vi ne vidis ĝin ankoraŭ. 398 00:37:28,780 --> 00:37:34,610 Estas, denove, bitlarĝa operatoro tiel agas iom post iom, kaj it's - 399 00:37:34,610 --> 00:37:39,910 Se vi havas la bitojn 0 kaj 1, tiam ĉi tiu estos 1. 400 00:37:39,910 --> 00:37:45,230 Se vi havas la bitoj 1 kaj 0, ĝi estos 1, vi havas la bitojn 0 kaj 0 ĝin estos 0, 401 00:37:45,230 --> 00:37:47,640 kaj se vi havas la bitoj 1 kaj 1 ĝin povos esti 0. 402 00:37:47,640 --> 00:37:56,180 Do estas kiel OR. Se iu el la bitoj estas veraj, estas 1, sed kontraste AŬ, ĝi ne povas esti samtempe bitoj kiuj estas veraj. 403 00:37:56,180 --> 00:37:59,320 AŬ estus ĉi esti 1, XOR havus ĉi esti 0. 404 00:37:59,320 --> 00:38:02,250 Do ni tuj volas uzi _XOR_ tie. 405 00:38:02,250 --> 00:38:09,960 Pensu pri ĝi dum minuto, mi iros al Google. 406 00:38:09,960 --> 00:38:16,230 Nu, vi ne povas legi, ke, mi estas nuntempe en la _XOR_ interŝanĝa algoritmo paĝo. 407 00:38:16,230 --> 00:38:21,340 Espereble ĉi tiu klarigos kial mi can't - 408 00:38:21,340 --> 00:38:34,190 Tiu estas ĝuste la algoritmo kiu ni ĵus faris. 409 00:38:34,190 --> 00:38:37,330 Mi ankoraŭ ne komprenas kial - mi devas ĵus plukis malbona ekzemplo, 410 00:38:37,330 --> 00:38:44,940 sed ĉi kazo kie 'a' okazis igi 0, post alveni al 5 bitoj, tiel nun 'a' estas 0, 411 00:38:44,940 --> 00:38:48,730 tio estas kion oni nomas "entjero superflui". 412 00:38:48,730 --> 00:38:54,370 Laŭ Vikipedio, "Kontraste kun la _XOR_ interŝanĝa, ĉi variado postulas ke ĝi uzas iuj metodoj 413 00:38:54,370 --> 00:38:59,780 por garantii ke x + y ne kaŭzas entjero superflui ". 414 00:38:59,780 --> 00:39:08,350 Do ĉi tio havas problemojn; tio entjera superflui, sed mi faris ion malbonan. 415 00:39:08,350 --> 00:39:10,520 Mi ne estas certa. Mi provos veni supren kun alia. 416 00:39:10,520 --> 00:39:13,640 [Studenta] Nu, ne estas entjero superflui kiam vi provas enmeti numeron tien 417 00:39:13,640 --> 00:39:16,640 pli granda ol la kvanto de bitoj vi destinis? 418 00:39:16,640 --> 00:39:23,730 Yeah. Ni havas 4 bitoj. That's - ni havis 4 bitoj, ni provu aldoni 1 al ĝi, do ni finos kun 5 bitojn. 419 00:39:23,730 --> 00:39:26,690 Sed la kvina iom ĝuste gets ekstermita, jes. 420 00:39:26,690 --> 00:39:28,970 Eble fakte - 421 00:39:28,970 --> 00:39:33,010 [Studenta] Ĉu tiu ĵetu vin eraron, aŭ faras tion - estus ke ĵetu eraro? 422 00:39:33,010 --> 00:39:40,720 No Do ne estas eraro. Kiam vi atingos la asembleo nivelo, speciala bito 423 00:39:40,720 --> 00:39:47,020 ie estas metita kiu diris tie estis superflui, sed en C vi speco de simple ne trakti tion. 424 00:39:47,020 --> 00:39:55,160 Vi vere ne povas trakti ĝin krom se vi uzas specialan asembleon instrukciojn en C. 425 00:39:55,160 --> 00:39:58,110 Ni pripensu _XOR_ interŝanĝa. 426 00:39:58,110 --> 00:40:02,220 Kaj mi kredas ke la Vikipedia artikolo povus havi ankaŭ estas dirante ke - 427 00:40:02,220 --> 00:40:07,310 Do ankaŭ enportis modula aritmetiko, tial mi supozas mi, en teorio, farante modula aritmetiko 428 00:40:07,310 --> 00:40:11,160 kiam mi diras ke 0 - 1 estas 15 denove. 429 00:40:11,160 --> 00:40:15,410 Por ke povus reale - sur regula procesoro kiu faras 0 - 1 = 15. 430 00:40:15,410 --> 00:40:20,430 Ĉar ni finos je 0, ni subtrahi 1, do tiam nur envolvas reen ĉirkaŭe por 1111. 431 00:40:20,430 --> 00:40:28,930 Do ĉi tiu algoritmo povus reale labori, la a + b, la a - b, b - a; ke estu bone. 432 00:40:28,930 --> 00:40:34,030 Sed estas iu procesoroj, kiuj ne faras tion, kaj tiel ne estus bone en tiuj specifaĵoj. 433 00:40:34,030 --> 00:40:39,880 XOR interŝanĝa funkcios sur ĉiu procesoro. Okay. 434 00:40:39,880 --> 00:40:42,280 La ideo estas ke ĝi estas supozitaj esti la samaj, tamen. 435 00:40:42,280 --> 00:40:50,120 Kie ni estas uzanta _XOR_ al iel akiri la informon de ambaŭ en 1 de la variabloj, 436 00:40:50,120 --> 00:40:54,120 kaj poste eltiri la informojn de la individuo variabloj denove. 437 00:40:54,120 --> 00:41:04,330 Do ĉu iu havas ideojn / la respondo? 438 00:41:04,330 --> 00:41:14,540 [Studenta respondo, nekomprenebla] 439 00:41:14,540 --> 00:41:22,220 Do tiu devus funkcii, kaj ankaŭ, XOR estas komuta. 440 00:41:22,220 --> 00:41:27,620 Sendepende de kion ordon tiuj 2 nombroj hazarde estas en ĉi tien, 441 00:41:27,620 --> 00:41:30,100 ĉi tiu rezulto estas tuj estos la sama. 442 00:41:30,100 --> 00:41:35,800 Do al ^ b estas b ^ al. 443 00:41:35,800 --> 00:41:51,860 Vi povus ankaŭ vidas ĉi tion skribita kiel ^ = b, b ^ = a, a ^ = b denove. 444 00:41:51,860 --> 00:42:00,200 Do tio decas, kaj vidi kial ĉi verkoj, pensu pri la bitoj. 445 00:42:00,200 --> 00:42:10,400 Uzante Plej malgranda nombro, diru 11001, kaj 01100. 446 00:42:10,400 --> 00:42:12,790 Do ĉi tiu estas 'a'; ĉi estas b. 447 00:42:12,790 --> 00:42:15,540 Do al ^ = b. 448 00:42:15,540 --> 00:42:22,380 Ni tuj estos opcio 'a' = al la _XOR_ de tiuj 2 aĵoj. 449 00:42:22,380 --> 00:42:32,920 Do 1 ^ 0 estas 1; 1 ^ 1 estas 0; 0 ^ 1 estas 1, kaj 0 ^ 0 estas 0; 1 ^ 0 estas 1. 450 00:42:32,920 --> 00:42:37,380 Do 'a,' se vi rigardas la dekuma numero, ĝi tuj estos - 451 00:42:37,380 --> 00:42:41,160 vi ne tuj vidas multe de rilato inter la originala 'a' kaj la nova 'a,' 452 00:42:41,160 --> 00:42:45,600 sed rigardante la bitoj, 'a' estas nun kiel maŝo de la informo 453 00:42:45,600 --> 00:42:49,970 de ambaŭ la originala 'a' kaj la originala b. 454 00:42:49,970 --> 00:42:57,930 Do, se ni prenas b ^ a, ni vidas ke ni finos la originala 'a'. 455 00:42:57,930 --> 00:43:08,910 Kaj se ni prenas la originala 'a' ^ la nova 'a,' ni vidas ni finos je la originala b. 456 00:43:08,910 --> 00:43:18,380 Do (a ^ b) ^ b = la originala 'a'. 457 00:43:18,380 --> 00:43:27,910 Kaj (a ^ b) ^ a = la originala b. 458 00:43:27,910 --> 00:43:37,010 Estas - alia formo de vidi ĉi estas io _XOR_ mem estas ĉiam 0. 459 00:43:37,010 --> 00:43:45,020 Do 1101 ^ 1101, ĉiuj bitoj tuj estos la sama. 460 00:43:45,020 --> 00:43:47,920 Do neniam tuj estos okazo kie 1 estas 0 kaj la alia estas 1. 461 00:43:47,920 --> 00:43:51,080 Do ĉi tiu estas 0000. 462 00:43:51,080 --> 00:43:57,240 La sama kun tiu. (A ^ b) ^ b estas kiel ^ (b ^ b). 463 00:43:57,240 --> 00:44:03,680 (B ^ b) tuj estos 0; a ^ 0 estas ĝuste tuj estos 'a,' pro tio ke ĉiuj bitoj estas 0. 464 00:44:03,680 --> 00:44:08,050 Do la solaj kiuj tuj esti kie 'a' estis origine 1 - havis aĵoj. 465 00:44:08,050 --> 00:44:12,070 Kaj la sama ideo tie, mi estas bela certa estas ankaŭ komuta. 466 00:44:12,070 --> 00:44:17,590 Yeah. Mi ne diros antaŭ tiu estis komuta. 467 00:44:17,590 --> 00:44:24,680 La ^ 'a', kaj ĝi estas asocieca, do nun (b ^ a) ^ al. 468 00:44:24,680 --> 00:44:28,970 Kaj ni povas fari b ^ (a ^ a). 469 00:44:28,970 --> 00:44:31,540 Kaj tiel denove, ni preni la originalan b. 470 00:44:31,540 --> 00:44:37,120 Do 'a' estas nun la kombino de 'a' kaj b kune. 471 00:44:37,120 --> 00:44:49,660 Uzanta nia nova combo 'a' ni diras b = combo 'a' ^ la originala b, ni preni la originalan 'a'. 472 00:44:49,660 --> 00:45:05,170 Kaj nun al = combo 'a' ^ la nova b, kiu estis la originalo - aŭ kiu estas nun kio estis 'a' aŭ b. 473 00:45:05,170 --> 00:45:13,620 Tio ĉi kazo cxi tie. Jen = b, malnova b. 474 00:45:13,620 --> 00:45:16,550 Do nun ĉiu estas tie en la interŝanĝis ordo. 475 00:45:16,550 --> 00:45:22,960 Se ni efektive rigardis la bitoj, b = a ^ b, tuj disaŭ tiuj 2, 476 00:45:22,960 --> 00:45:33,920 kaj la respondo tuj estos tio, kaj tiam a = a ^ b estas XORing tiuj 2 kaj la respondo estas jena. 477 00:45:33,920 --> 00:45:41,090 Demandoj? Okay. Do la lasta estas iom signife pli malfacila. 478 00:45:41,090 --> 00:45:43,180 [Studenta] Mi kredas li havas demandon pri ĝi. >> Ho, pardonu. 479 00:45:43,180 --> 00:45:49,380 [Studenta] Kio vere rapida? Se vi uzas ĉi _XOR_, aŭ ĉu se vi rakontos nova variablo? 480 00:45:49,380 --> 00:45:55,190 Do kio estas fakte pli rapida, deklarante nova variablo aŭ uzante _XOR_ por interŝanĝi? 481 00:45:55,190 --> 00:45:59,600 La respondo estas, verŝajne portempa variablo. 482 00:45:59,600 --> 00:46:05,780 Kaj tio estas ĉar iam ĝi estas kompilitaj malsupren - tiel en la asembleo nivelo, 483 00:46:05,780 --> 00:46:12,320 ne estas tia afero kiel loka variabloj aŭ ajna temporal variabloj aŭ iu el ĉi aĵoj. 484 00:46:12,320 --> 00:46:16,060 Ili nur volas - estas memoro, kaj ekzistas registroj. 485 00:46:16,060 --> 00:46:20,920 Registroj estas kie aĵoj aktive okazas. 486 00:46:20,920 --> 00:46:24,750 Vi ne aldoni 2 aĵojn en memoro; vi aldonas 2 aĵojn en registroj. 487 00:46:24,750 --> 00:46:28,160 Kaj vi venigos tion for memoro en registroj por poste aldoni ilin, 488 00:46:28,160 --> 00:46:33,180 kaj tiam vi povus meti ilin denove en memoro, sed la tuta agado okazas en registroj. 489 00:46:33,180 --> 00:46:38,750 Do kiam vi uzas la provizora variablo alproksimiĝo, kutime kio okazas estas 490 00:46:38,750 --> 00:46:42,810 tiuj 2 nombroj estas jam en registroj. 491 00:46:42,810 --> 00:46:46,570 Kaj poste de tiu momento, post vi interŝanĝis ilin, 492 00:46:46,570 --> 00:46:51,540 ĝi devos nur ekuzi la alia registro. 493 00:46:51,540 --> 00:46:56,510 Ie ajn vi estis uzanta b, ĝi devos simple aliru la registro kiu jam stoki 'a'. 494 00:46:56,510 --> 00:47:02,180 Do ne bezonas fari ion por reale fari la interŝanĝa. Yeah? 495 00:47:02,180 --> 00:47:05,690 [Studenta] Sed ankaŭ prenas pli memoro, ĉu ne? 496 00:47:05,690 --> 00:47:10,280 Ĝi estos nur preni pli memoro se ĝi bezonas por stoki ke temporal variablo. 497 00:47:10,280 --> 00:47:14,830 Kiel se vi poste uzas tiun temporal variablo denove ie, 498 00:47:14,830 --> 00:47:18,920 tiam - aŭ vi atribuas ion por ke temporal variablo. 499 00:47:18,920 --> 00:47:24,630 Do, se en ajna punkto en tempo 'a,' b en temp havas malsamajn valorojn aŭ ion, 500 00:47:24,630 --> 00:47:30,680 tiam tuj devos distinga lokoj en memoro, sed estas vere, ke 501 00:47:30,680 --> 00:47:34,800 ekzistas multaj lokaj variabloj kiu nur ekzistas en registroj. 502 00:47:34,800 --> 00:47:44,370 En tiu kazo, ĝi estas neniam metas en memoro, kaj tiel vi neniam malŝparas memoro. 503 00:47:44,370 --> 00:47:58,620 Okay. Lasta demando estas iom pli. 504 00:47:58,620 --> 00:48:04,850 Do jen, en ĉi CS50 aparaton, estas vortaro. 505 00:48:04,850 --> 00:48:12,390 Kaj la kialo estas ĉar [?? B66] estas ortografia kontrolilo kie vi povas skribi 506 00:48:12,390 --> 00:48:15,780 uzante hash tabloj aŭ provoj aŭ iu datumstrukturo. 507 00:48:15,780 --> 00:48:22,660 Vi tuj skribos sorĉas Kontrolilo, kaj vi tuj estos uzante ĉi vortaro por fari tion. 508 00:48:22,660 --> 00:48:28,280 Sed por tiu ĉi problemo, ni nur tuj serĉos por vidi se sola vorto estas en la vortaro. 509 00:48:28,280 --> 00:48:31,250 Do anstataŭ gardi la tutan vortaron en iu datumstrukturo 510 00:48:31,250 --> 00:48:35,180 kaj poste rigardis super tutan dokumenton por vidi se io estas misspelled, 511 00:48:35,180 --> 00:48:38,490 ni simple volas trovi 1 vorto. Do ni povas simple skani sur la tuta vortaro 512 00:48:38,490 --> 00:48:44,300 kaj se ni neniam trovas la vorton en la tuta vortaro, tiam ĝi ne estis en tie. 513 00:48:44,300 --> 00:48:52,150 Se ni skani sur la tutan vortaron kaj ne vidi la vorto, tiam ni estas bonaj, ni trovis ĝin. 514 00:48:52,150 --> 00:48:56,580 Ĝi diras tie ke ni volas komenci rigardi C la dosiero-uzado funkcio, 515 00:48:56,580 --> 00:48:59,930 ĉar ni deziras legi la vortaron, 516 00:48:59,930 --> 00:49:07,680 sed mi donos al la aludon cxi tie pri tio, kiu funkcioj vi devus pensi. 517 00:49:07,680 --> 00:49:11,510 Mi skribas ilin sur Spacetoj. 518 00:49:11,510 --> 00:49:20,490 Do la ĉefaj vi volas rigardi estas f malfermita kaj poste, neeviteble, f fermita, 519 00:49:20,490 --> 00:49:26,540 kiuj iros al la fino de via programo, kaj f scan f. 520 00:49:26,540 --> 00:49:31,060 Vi povus ankaŭ uzi f legi, sed vi verŝajne ne volas 521 00:49:31,060 --> 00:49:34,200 ĉar tio - vi ne finas bezoni tio. 522 00:49:34,200 --> 00:49:41,880 F scan f estas kion vi tuj estos uzante skani sur la vortaro. 523 00:49:41,880 --> 00:49:46,370 Kaj tial vi ne bezonas programi ĉe la solvo, nur provu kaj kiel pseŭdo-kodo vian vojon 524 00:49:46,370 --> 00:50:05,200 al solvo, kaj tiam ni diskuti ĝin. 525 00:50:05,200 --> 00:50:14,110 Kaj efektive, kiam mi jam donis al vi tiujn, se vi iros en ajna fina aŭ vian aparaton la ŝelo, 526 00:50:14,110 --> 00:50:18,250 Mi - mi kutime - se vi ne vidis ankoraŭ, mi ne scias se vi faris en klaso, 527 00:50:18,250 --> 00:50:23,490 sed homo, do la viro paĝoj, estas sufiĉe utila por rigardi preskaux neniu funkcio. 528 00:50:23,490 --> 00:50:27,330 Do mi povas fari, kiel, viro f, scan f. 529 00:50:27,330 --> 00:50:32,300 Jen nun la informoj pri la scan f familio de funkcioj. 530 00:50:32,300 --> 00:50:37,070 Mi povus ankaŭ fari viro f, malfermita, kaj ke donos al mi la detalojn pri tio. 531 00:50:37,070 --> 00:50:40,750 Do se vi scias, kio funkcio vi uzas, aŭ vi legas kodo 532 00:50:40,750 --> 00:50:43,000 kaj vi vidos iujn funkcio kaj vi estas kiel, "Kion tio do?" 533 00:50:43,000 --> 00:50:45,280 Justulo tiu funkcio nomo. 534 00:50:45,280 --> 00:50:47,340 Ekzistas kelkaj strangaj ekzemploj kie vi eble devas diri 535 00:50:47,340 --> 00:50:51,620 ŝati. viro 2 kiu funkcio nomo, aŭ viron 3 kiu funkcio nomo, 536 00:50:51,620 --> 00:50:58,230 sed vi nur devas fari tion se viro funkcio nomo ne okazas por labori la unua fojo. 537 00:50:58,230 --> 00:51:03,010 [Studenta] Do mi legis la viro paĝon por malferma, sed mi ankoraŭ konfuzita pri kiel uzi ĝin kaj la programo. 538 00:51:03,010 --> 00:51:06,170 Okay. Multaj de la viro paĝoj estas malpli ol utila. 539 00:51:06,170 --> 00:51:08,470 Ili estas pli utila se vi jam scias, kion ili faras 540 00:51:08,470 --> 00:51:12,670 kaj tiam vi devas nur memori la ordon de la argumentoj aŭ iu. 541 00:51:12,670 --> 00:51:17,640 Aŭ ili povas doni al vi ĝenerala resumo, sed iuj el ili estas tre blindiga. 542 00:51:17,640 --> 00:51:22,220 Kiel f scan f, ankaŭ. Ĝi donas al vi la informo pri ĉiuj tiuj funkcioj, 543 00:51:22,220 --> 00:51:28,120 kaj 1 lineo cxi tie okazas diri "F scan f legas de la kordo punkto aŭ rivereto." 544 00:51:28,120 --> 00:51:32,360 Sed f malfermos. Do, kiel estus ni uzas f malfermitaj? 545 00:51:32,360 --> 00:51:38,470 La ideo de programo kiu bezonas fari dosieron I / O estas ke 546 00:51:38,470 --> 00:51:45,070 vi unue bezonas por malfermi la dosieron vi volas fari tion kun, kaj neeviteble, 547 00:51:45,070 --> 00:51:51,220 legu aferoj de tiu dosiero kaj faru stuff kun ili. 548 00:51:51,220 --> 00:51:55,350 F malfermitaj estas kion ni uzas por malfermi la dosieron. 549 00:51:55,350 --> 00:52:04,190 La aĵo ni reiros, do kio dosieron ni volas malfermi, donas al ni la - 550 00:52:04,190 --> 00:52:11,970 en ĉi tie diras "/ user / share / dict / vortoj." 551 00:52:11,970 --> 00:52:16,740 Ĉi tio estas la dosiero kiun ni volas malfermi, kaj ni volas malfermi ĝin - 552 00:52:16,740 --> 00:52:21,440 ni devas eksplicite specifi se ni volas malfermi ĝin legi aŭ se ni volas malfermi ĝin skribi. 553 00:52:21,440 --> 00:52:26,490 Ekzistas kelkaj kombinoj kaj stuff, sed ni volas malfermi tiun por legi. 554 00:52:26,490 --> 00:52:29,380 Ni volas legi de la dosiero. 555 00:52:29,380 --> 00:52:34,290 Do kio faras ĉi reveno? Denove dosieron stelo (*), 556 00:52:34,290 --> 00:52:37,260 kaj mi ĵus montri ĉion en la variablo f, tiel *, 557 00:52:37,260 --> 00:52:40,840 denove, ĝi estas puntero, sed ni ne volas trakti punteros. 558 00:52:40,840 --> 00:52:46,470 Vi povas pensi de f kiel, f estas nun la variablo vi tuj uzi por reprezenti la dosieron. 559 00:52:46,470 --> 00:52:49,850 Do se vi volas legi de la dosiero, vi legis de f. 560 00:52:49,850 --> 00:52:54,820 Se vi volas fermi la dosieron, vi fermas f. 561 00:52:54,820 --> 00:53:00,350 Do je la fino de la programo, kiam ni neeviteble volas fermi la dosieron, kion ni faru? 562 00:53:00,350 --> 00:53:06,750 Ni volas fermi f. 563 00:53:06,750 --> 00:53:12,600 Do nun la lastan dosieron funkcio kiu ni tuj volas uzi estas scan f, f scan f. 564 00:53:12,600 --> 00:53:20,930 Kaj kion tio faras estas ĝi skanu super la dosiero serĉas mastron por kongrui. 565 00:53:20,930 --> 00:53:39,100 Rigardante la viron paĝo ĉi tie, oni vidas int f scan f, ignori la reveno valoro por nun. 566 00:53:39,100 --> 00:53:45,230 La unua argumento estas la dosiero * rivereto, do la unua argumento nin tuj volas pasi estas f. 567 00:53:45,230 --> 00:53:47,900 Ni balaita super f. 568 00:53:47,900 --> 00:53:53,680 La dua argumento estas formato kordoj. 569 00:53:53,680 --> 00:53:58,310 Mi donos al vi formato kordoj nun. 570 00:53:58,310 --> 00:54:05,180 Mi kredas ke ni okazi diri, 127s \ n, multe de tiu estas nenecesa. 571 00:54:05,180 --> 00:54:12,490 La ideo de kio tiu formato linio estas, estas vi pensus scan f kiel la malo de impreso f. 572 00:54:12,490 --> 00:54:17,160 Do print f, presita f ni ankaŭ uzas tiun tipon de formato parametro, 573 00:54:17,160 --> 00:54:25,000 sed en presita f kion ni faras estas - ni rigardu ekvivalenta. 574 00:54:25,000 --> 00:54:32,550 Do presi f, kaj tie estas reale ankaŭ f print f, kie la unua argumento tuj estos f. 575 00:54:32,550 --> 00:54:40,980 Kiam vi presas f, ni povus diri iun kiel "print 127s \ n" kaj poste, se ni pasas iuj kordoj, 576 00:54:40,980 --> 00:54:44,050 ĝi tuj presi ĉi ŝnuro kaj tiam nova linio. 577 00:54:44,050 --> 00:54:49,690 Kio 127 rimedojn, mi estas bela certa, sed mi neniam limigis min al ĝi, 578 00:54:49,690 --> 00:54:52,470 Vi eĉ ne bezonas diri '127 'en la presita f, 579 00:54:52,470 --> 00:54:57,090 sed kion tio signifas estas presi la unuan 127 signoj. 580 00:54:57,090 --> 00:54:59,350 Do mi sufiĉe certas ke tio estas la kazo. Vi povas Google por tio. 581 00:54:59,350 --> 00:55:03,000 Sed en la sekvanta unu mi preskaux pozitiva signifas tio. 582 00:55:03,000 --> 00:55:08,880 Do ĉi tiu estas presi la unuan 127 signoj, sekvita de nova linio. 583 00:55:08,880 --> 00:55:14,680 F scan f nun, anstataŭ rigardi variablo kaj presi ĝin, 584 00:55:14,680 --> 00:55:22,620 ĝi tuj rigardi iujn kordoj, kaj stoki la ŝablono en la variablo. 585 00:55:22,620 --> 00:55:26,360 Ni efektive uzi scan f en malsama ekzemplo. 586 00:55:26,360 --> 00:55:31,670 Do diru ni havis iuj int, x = 4, 587 00:55:31,670 --> 00:55:41,110 kaj ni volis krei ĉenon el - volis krei la kordo 588 00:55:41,110 --> 00:55:44,250 kiu estis kiel, ĉi venos supren multe poste, 589 00:55:44,250 --> 00:55:49,020 iu kiu estas nur kiel 4.jpg. 590 00:55:49,020 --> 00:55:51,870 Do povas esti tiu programo, kie vi devos sumo vendotablo, 591 00:55:51,870 --> 00:55:56,420 Resume kontraŭstari i, kaj vi volas ŝpari amason da bildoj. 592 00:55:56,420 --> 00:56:02,430 Do vi volas ŝpari i.jpg, kie mi estas iu ripeto de via buklo. 593 00:56:02,430 --> 00:56:05,500 Nu do kiel ni faras ĉi kordoj por ke JPEG? 594 00:56:05,500 --> 00:56:11,720 Se vi volas presi 4.jpg, ni povus simple diri print f,% d.jpg, 595 00:56:11,720 --> 00:56:14,410 kaj tiam estus presi por JPEG. 596 00:56:14,410 --> 00:56:20,050 Sed se ni volas konservi la kordo 4.jpg, ni uzas scan f. 597 00:56:20,050 --> 00:56:30,860 Do string s - fakte ni can't - karaktero, char s, ni iru 100. 598 00:56:30,860 --> 00:56:35,400 Do mi simple deklaras iu tabelo de 100 signoj, 599 00:56:35,400 --> 00:56:39,830 kaj tio kion ni neeviteble tuj estos stokante ke JPEG in 600 00:56:39,830 --> 00:56:47,920 Do ni tuj uzi scan f, kaj la formato, kiel ni dirus% d.jpg 601 00:56:47,920 --> 00:56:54,980 por presi 4.jpg, la formato de tiu tuj estos% d.jpg. 602 00:56:54,980 --> 00:57:04,020 Do la formato estas% d.jpg, kion ni volas anstataŭigi% d kun estas x, 603 00:57:04,020 --> 00:57:06,590 kaj nun ni devas gardi ke kordoj ie. 604 00:57:06,590 --> 00:57:12,500 Kaj kie ni iras por stoki ĉi tiu linio estas en la tabelo s. 605 00:57:12,500 --> 00:57:21,640 Do post tiu linio de kodo, s, se ni presi f,% s de la variablo s, 606 00:57:21,640 --> 00:57:26,280 ĝi tuj presi 4.jpg. 607 00:57:26,280 --> 00:57:38,930 Do f scan f estas la sama kiel skanilo f, krom nun ĝi estas transrigardante la dosiero 608 00:57:38,930 --> 00:57:43,600 por kio stoki en s. 609 00:57:43,600 --> 00:57:46,160 Tion la lasta argumento tuj estos. 610 00:57:46,160 --> 00:57:54,170 Ni volas konservi - "Scan f familio de funkcioj escanea en ambaŭ laŭ formato kiel provis sube. 611 00:57:54,170 --> 00:58:02,450 Se iu estas stokitaj en la loko antaŭ vi povus reveni - " 612 00:58:02,450 --> 00:58:12,910 Ne, ni estu bonaj. Lasu min pensi por sekundo. 613 00:58:12,910 --> 00:58:26,350 Do scan f ne - kion la heck estas la funkcio kiu faras tion? 614 00:58:26,350 --> 00:58:31,650 Do scan f ne tuj prenas entjero kaj faru dot jpg. 615 00:58:31,650 --> 00:58:43,490 Ĝi tuj [mumbles]. 616 00:58:43,490 --> 00:58:49,360 Savi int variablo en kordoj int C. 617 00:58:49,360 --> 00:58:55,940 Kio estas ĉi tiu variablo, aŭ kio estas ĉi tiu funkcio nomita? 618 00:58:55,940 --> 00:59:04,950 Jes. That's - jes. Do kion mi difinanta al vi antaŭe estis s print f, 619 00:59:04,950 --> 00:59:09,820 kiu - kiu faras multe pli sentita, kial mi diris ke estis multe pli kiel presita f. 620 00:59:09,820 --> 00:59:14,700 Scan f estas ankoraŭ ia kiel presita f, sed s print f tuj skani ĝin 621 00:59:14,700 --> 00:59:17,510 kaj anstataŭigi la variabloj kaj nun stoki ĝin en linio. 622 00:59:17,510 --> 00:59:19,620 Anstataŭ videbligi ĝin, stokas ĝin en linio. 623 00:59:19,620 --> 00:59:25,070 Do ignori ke tute. Vi povas ankoraŭ pensi pri la formato specifier kiel kiel tiu de impreso f. 624 00:59:25,070 --> 00:59:34,510 Do nun, se ni volis fari la 4.jpg afero, ni farus s print f, x de ĉi. 625 00:59:34,510 --> 00:59:38,520 Do kio scan f faras - kio via demando tuj estos? 626 00:59:38,520 --> 00:59:40,820 [Studenta] Mi ĵus konfuzita sur kion ni provas fari ĉi tie 627 00:59:40,820 --> 00:59:43,450 kun tiu JPEG. Ĉu vi povas klarigi, ke ankoraŭ 1 tempon? 628 00:59:43,450 --> 00:59:52,710 Do tio - estas malpli Relevent al f scan f nun; espereble, estos ligi reen en ia maniero. 629 00:59:52,710 --> 01:00:02,240 Sed kion mi komence intencis montri estis - tio estas fakte rekte grava por tiuj [?? F5] 630 01:00:02,240 --> 01:00:08,520 Vi tuj uzos s print f, kie, diru ni havas 100 bildoj, 631 01:00:08,520 --> 01:00:13,630 kaj vi volas legi bildo 1.jpg, 2.jpg, 3.jpg. 632 01:00:13,630 --> 01:00:21,520 Do, por fari tion, vi bezonas f malfermita, kaj tiam vi devas pasi en la ĉeno, kiun vi volas malfermi. 633 01:00:21,520 --> 01:00:30,020 Do ni volus malfermi 1.jpg; por krei la kordo, kiu estas 1.jpg, 634 01:00:30,020 --> 01:00:37,660 ni faru s print f de% d.jpg--ni ne faros por int i = 0. 635 01:00:37,660 --> 01:00:46,580 i <40, mi + +. 636 01:00:46,580 --> 01:00:51,130 Do s print f% d.jpg de i. 637 01:00:51,130 --> 01:00:56,320 Do post tiu linio, nun la variablo aŭ la tabelo s tuj 1.jpg. 638 01:00:56,320 --> 01:01:10,610 Aŭ, 0.jpg, 1.jpg, 2.jpg. Kaj tiel ni povas malfermi, siavice, ĉiu bildo por legado. 639 01:01:10,610 --> 01:01:19,550 Do jen kio s presi f faras. Ĉu vi vidas kion s presi f estas nun faras? 640 01:01:19,550 --> 01:01:25,720 [Studenta] Okay, do ĝi estas prenante - ĝi kreas kordoj, something.jpg, kaj poste stokas ĝin. 641 01:01:25,720 --> 01:01:30,360 Jes. Ĝi kreas - tiu ĉi estas alia formato kordoj, kiel skanilo f kaj presita f, 642 01:01:30,360 --> 01:01:37,530 kie enmetas ĉiujn variabloj en la dua argumento, eble s kiel kontraŭ mi. 643 01:01:37,530 --> 01:01:42,280 Eble - mi volas diri, tio estas la kazo. Sed kion ajn la ordo de argumentoj estas. 644 01:01:42,280 --> 01:01:45,440 Ĝi tuj enigi ĉiujn variabloj en la formato kordoj 645 01:01:45,440 --> 01:01:52,250 kaj poste konservi en niajn buffer, ni nomas tion buffer, estas kie ni stoki la kordo. 646 01:01:52,250 --> 01:02:00,750 Do ni estas provizon ene de s la ĝuste formatitan kordoj,% d estinte anstataŭita per 4. 647 01:02:00,750 --> 01:02:08,080 [Studenta] Do, se ni tion faris, estas la variablo f ĵus tuj estos reasignado? 648 01:02:08,080 --> 01:02:18,110 Jes. Do ni devus fermi la originala f antaŭ fari tion. 649 01:02:18,110 --> 01:02:22,810 Sed - kaj tiam ankaŭ, se ne estus f malfermi cxi tie, poste ni bezonus diri - 650 01:02:22,810 --> 01:02:29,280 Yeah. Sed estus malfermi cent malsamajn dosierojn. 651 01:02:29,280 --> 01:02:37,360 [Studenta] Sed ni ne povos aliri aŭ - okay. 652 01:02:37,360 --> 01:02:44,230 Okay. Do scan f, f scan f, estas speco de la sama ideo, 653 01:02:44,230 --> 01:02:53,610 sed anstataŭ, anstataŭe de provizo ĝin en kordoj, ĝi estas pli kiel vi nun 654 01:02:53,610 --> 01:03:02,420 irante sur pikilo kaj ŝablona rekono kontraŭ tiu ŝnuro kaj stokante la rezultoj en variabloj. 655 01:03:02,420 --> 01:03:11,290 Vi povas uzi scan f al analizi super io 4.jpg, kaj stoki la entjero 4 en sumo int x. 656 01:03:11,290 --> 01:03:13,430 Tion ni povas uzi scan f por. 657 01:03:13,430 --> 01:03:16,300 F scan f tuj fari ĉe la komandlinio. 658 01:03:16,300 --> 01:03:19,200 Mi estas vere bela certa ĉi estas kion la CS50 biblioteko faras. 659 01:03:19,200 --> 01:03:29,050 Do kiam vi diras, "get int", ĝi estas scan f-ing super - scan f estas la vojo vi ricevas uzanto enigo. 660 01:03:29,050 --> 01:03:34,670 F scan f tuj faros la samon sed uzante dosieron skani super. 661 01:03:34,670 --> 01:03:41,090 Do jen, ni estas balaita super ĉi tiu dosiero. 662 01:03:41,090 --> 01:03:45,460 La mastro ni provas kongruas estas iuj kordoj kiuj estas 127 signoj longa 663 01:03:45,460 --> 01:03:48,100 sekvata de nova linio 664 01:03:48,100 --> 01:03:54,770 Do mi sufiĉe certas ke ni povus eĉ nur diri "kongruas s," pro tio ke en la vortaro 665 01:03:54,770 --> 01:03:57,770 ni hazarde havas, ni garantias neniu vorto estas tiu longa, 666 01:03:57,770 --> 01:04:03,310 kaj ankaŭ f scan f, mi kredas, estos halti en la nova linio ne gravas. 667 01:04:03,310 --> 01:04:06,970 Sed ni inkludas la nova linio en la partio, kaj - 668 01:04:06,970 --> 01:04:13,960 [Studenta] Se ni ne inkludis la nova linio, ĉu ne trovos partoj de vorto? 669 01:04:13,960 --> 01:04:22,900 It - ĉiu - rigardas la vortaro - 670 01:04:22,900 --> 01:04:26,200 Do en la vortaro, ĉi tiuj estas ĉiuj niaj vortoj. 671 01:04:26,200 --> 01:04:30,500 Ĉiu estas en nova linio. 672 01:04:30,500 --> 01:04:32,510 La tuŝo f tuj reprenos tiun vorton. 673 01:04:32,510 --> 01:04:38,750 Se ni ne inkluzivas la nova linio, tiam ĝi estas ebla, ke la venonta scan f estos nur legi la novan linion. 674 01:04:38,750 --> 01:04:44,180 Sed inkludante nova linio tiam simple ignori la novan linion. 675 01:04:44,180 --> 01:04:49,440 Sed ni neniam akiris parton de vorto, de kiam ni ĉiam legi ĝis nova linio, negrave kion. 676 01:04:49,440 --> 01:04:54,530 [Studenta] Sed kion se vi serĉi la vorton "cissa," kiel cissa. 677 01:04:54,530 --> 01:04:57,380 Ĉu ĝi trovos tion, kaj diri ke estas batalo? 678 01:04:57,380 --> 01:05:05,110 Do jen ni - ĝi estos legita en - tiu ĉi estas vere bona punkto. 679 01:05:05,110 --> 01:05:10,660 Ni neniam uzas la aktuala - la vorto ni serĉas estas la unua komandlinio argumento. 680 01:05:10,660 --> 01:05:16,460 Do kordoj, vorto = argv 1. 681 01:05:16,460 --> 01:05:20,020 Do la kordoj ni serĉas estas argv 1. 682 01:05:20,020 --> 01:05:23,290 Ni ne serĉas vorton tute en nia scan f. 683 01:05:23,290 --> 01:05:28,030 Kion ni faris kun scan f fariĝas ĉiu vorto en la vortaro, 684 01:05:28,030 --> 01:05:34,320 kaj poste unu fojon ni havas tiun vorton ni tuj uzos strcmp kompari ilin. 685 01:05:34,320 --> 01:05:39,210 Ni tuj kompari nia parolo kaj kion ni ĵus legis in 686 01:05:39,210 --> 01:05:45,110 Do neeviteble, ni tuj finos fari aron da scan fs 687 01:05:45,110 --> 01:05:52,130 ĝis ĝi nur tiel okazas ke scan f revenos - 688 01:05:52,130 --> 01:05:54,800 ĝi revenos, kiel longa kiel ĝi parigitaj nova vorto, 689 01:05:54,800 --> 01:06:01,360 kaj ĝi revenos ion alian tiel frue kiel ĝi fiaskis por kongrui la vorto. 690 01:06:01,360 --> 01:06:08,440 Ni legas pri la tuta vortaro, stokante linio por linio ĉiu vorto en la variablo s. 691 01:06:08,440 --> 01:06:17,240 Tiam ni komparas vorto kun s, kaj se la komparo == 0, 692 01:06:17,240 --> 01:06:21,650 strcmp okazas alporti 0 se partio estis farita. 693 01:06:21,650 --> 01:06:31,510 Do, se ĝi estis 0, tiam ni povas presi f, parigitaj, 694 01:06:31,510 --> 01:06:35,370 aŭ vorto estas en la vortaro, aŭ kion ajn vi volas presi f. 695 01:06:35,370 --> 01:06:41,450 Kaj poste - oni ne volas f fermi denove kaj denove. 696 01:06:41,450 --> 01:06:50,410 Tiu estas la tipo de afero ni volas fari, kaj ni ne nur serĉas vorton en la vortaro. 697 01:06:50,410 --> 01:06:56,660 Do ni povus fari tion, se ni volis serĉi ilia modelo, cissa, kiel vi diris antaŭe, 698 01:06:56,660 --> 01:07:00,260 se ni volis serĉi ke ŝablono, tiam maltrafus en la kazo 699 01:07:00,260 --> 01:07:08,010 ĉar tio ne estas vere vorto, sed unu el la vortoj en la vortaro okazas al havi en ĝi. 700 01:07:08,010 --> 01:07:13,560 Do ĝi kongruas tiun vorton, sed ĉi subaro de la vorto ne estas vorto mem. 701 01:07:13,560 --> 01:07:17,250 Sed tio ne estas kiel ni uzas ĝin, ni legas en ĉiu vorto 702 01:07:17,250 --> 01:07:19,740 kaj poste kompari la vorto ni havas kun tiu vorto. 703 01:07:19,740 --> 01:07:25,780 Do ni ĉiam komparas plena vortoj. 704 01:07:25,780 --> 01:07:29,620 Mi povas sendi la finita solvojn poste. 705 01:07:29,620 --> 01:07:32,050 Tio estas speco de preskaŭ la ĝustan respondon, mi kredas. 706 01:07:32,050 --> 01:07:34,720 [Studenta komento, nekomprenebla] 707 01:07:34,720 --> 01:07:40,870 Ho, ĉu mi liveri de tiu antauxe? Char s, mi supozas ke ni diris 127 - Mi forgesas, kion la granda estas. 708 01:07:40,870 --> 01:07:44,100 Ni nur faru 128, do nun s estas suficxe longe. 709 01:07:44,100 --> 01:07:46,570 Ni ne bezonas presi ion. 710 01:07:46,570 --> 01:07:56,440 Ni ankaŭ tuj volis devas fermi nian dosieron, kaj tiu estu pri la ĝusta respondo. 711 01:07:56,440 --> 01:07:59,440 CS50.TV