[Powered by Google Translate] Sekcio Problemo Ŝanĝu 2: Hacker Eldono Rob Bowden, Harvard University Ĉi tiu estas CS50. CS50.TV Do, mi estas Rob. Mi estas altranga en Kirkland. Ĉi tiu estas mia tria jaro TFing CS50. Estas la unua fojo ke ni ŝanĝas al la tradicia-prelego-stilo sekcio, kie ni simple speco de revizias kio okazis en prelego kaj poste vi infanoj demandojn, nun esti multe pli problemo bazita, kie ni uzas Spacoj, kaj - Ho, do la ideo estas iri al ligantaj mi sendis al vi kaj tiam vi estos en mia spaco. Ĉu iu ne havas la portebla? Okay. Do ni tuj uzos tion, kaj ni tuj faros problemojn vivi en sekcio kaj diskutante ilin kaj decidi kio estas erara kaj mi povus tiri kelkajn el via kodo, kaj mi povus diskuti viajn ideojn. Do estas neniu havis malfacilaĵojn? Vi povas babili en la flanko; Mi ne scias se ni havos kialon por tio. Nun, kiel la antaŭa supersection, se vi estis en tiu klaso, vi scias, kio tio estas pri. Sur ĉiuj de P aroj tie tuj estos tiuj sekcioj. Do P-aro 2, specifiloj, specifas, mi supozas ke vi vidis sur P-aro 1 jam. Sed ni povas rigardi P-aro 2 por kio ni iras al la transiro hodiaŭ. Kaj vi vidos sekcio de demandoj. Do tiu estos en ĉiu de la P-aroj, tie estos sekcio de demandoj. Ĝis nun ni diris, "Pripensu tiun eblon praktiki." Vi ne estos petita prezenti ĉi tiu programo. La ideo estas, ke tiuj estas devigataj ia helpi vin komenci kun la problemo aro. Mi supozas en la Hacker eldono, multe el ili estas devigataj nur esti novaj, interesaj aferoj por lerni. Ili ne povas esti rekte aplikebla al la problemo aro. Kaj ĝuste nun ni ne havante vi submetas ilin, sed en teorio, por posta problemo aroj, vi povus sendi ilin, kaj tiel vi povas ĉu venos al sekcio aŭ vidi la sekcio por ricevi la respondojn, aŭ vi povas simple preni ilin en via propra se vi ne sentas kiel ĝuas mian ĉeeston. Do la - Mi pensas ĉi tiu estas la unua. Oh. Ankaŭ, sub tiuj sekcioj de demandoj ni ankaŭ vi demandas pri la mallongaj. Do mi supozas, en teorio, kiun vi devas rigardi tiujn antaŭ veni al sekcio, sed estas bone se vi ne, ni iros sur ili ĉiuokaze. Do ni povas starti kun tiuj: "Kiel oni dum buklo diferencas de do-dum buklo? Kiam estas la lasta aparte utila? " Do iu havas -? [Studenta] La do-dum buklo ĉiam ekzekuti almenaŭ unufoje. Jes. Do tio estas la diferenco. Al dum loop - I'll just fari ĝin ĉi tie - dum buklo, ni havas la kondiĉo ĉi tie, dum kiu do-tempo, vi ne havas kondiĉo ĝis ni atingos cxi tie. Kaj tiel, kiam via programo estas ekzekuti, kaj alvenas al la dum ciklo, ĝin tuj kontrolas se ĉi tiu kondiĉo estas vera. Se tiu kondiĉo ne estas vera, gxi nur salti super la buklo tute. Do-dum ciklo, kiel la programo estas ekzekuti, alvenas al la "fari." Nenio okazas en ĉi tiu punkto, nur daŭrigas ekzekuti. Tiam kiam batas la "dum", se la kondiĉo estas vera, ĝi devos buklo apogi kaj do denove kaj denove kaj denove ĝis la kondiĉo ne estas vera kaj tiam simple falas tra. Do, la diferenco estas, ke tiu povas salti dekstra ekde la komenco. Ĉi nepre ekzekutas fojon kaj tiam povas ekzekuti pli fojoj se la kondiĉo estas ankoraŭ veraj. Do la tempo buklo nur fari tion unufoje, aŭ - la dum loop - ni ne bezonas fari ĝin tute ne, ekde tuj kiam ni atingos ĝin, se la kondiĉo estas malvera, ni simple preteriru rajton super ĝi. Dum do-dum buklo, ni ekzekuti fojon, nepre. Tiam, kiam ni atingos la kondiĉo, ni kontrolu ĉu ĝi estas vera aŭ malvera. Se estas vero, ni tion faros denove; se estas malvera, ni simple daŭrigas tuj. Do kiam estas la lasta aparte utila? Do mi povas diri ke en la tuteco de la 4 jaroj, antaŭ 3 jaroj, kion ajn, ke mi estas programado, mi uzis tiun, kiel, sub 10-foje. Kaj probable 5 el ili estas en CS50 kiam ni enkondukas do-dum cikloj. Do kiam vi uzis do-dum bukloj? Kiam estas la - yeah? [Studenta] Kiam vi provas atingi uzanto enigo, aŭ io, kion vi volas kontroli - Yeah. Do do-dum cikloj, uzanto enigo estas la granda unu. Tial en la unua paro problemo aroj, kiam vi volas demandi al la uzanto, kiel, "Donu al mi kordoj," vi ne povas pluiri ĝis ili atingi tiun ĉenon. Kaj tial vi nepre, necese peti la kordoj almenaŭ unufoje. Sed tiam, se ili respondos io malbona, tiam vi bezonos al buklo dorso kaj demandas denove. Sed escepte uzanto enigo, estas tre maloftaj, ke mi renkontos kazo kie mi volas buklo "almenaŭ unufoje" sed eble pli. Demandoj aŭ -? Ĉu iu uzis do-dum buklo aliloke? Okay. Do la sekva estas, "Kion nedeklarita ensalutilo kutime indiki se outputted per clang? " Do, kian kodon mi povus skribi por ricevi 'nedeklarita ensalutilo? [Studenta] Tio x = 2? Do ni povas simple provi ĝin en ĉi tie, x = 2. Ni kuros ĉi - ho, mi ne alklaku ĝin. Do jen ni alvenas - gxuste. "Uzo de nedeklarita ensalutilo x." Do jen la nedeklarita ensalutilo, variablo. Ĝi ofte nomas variablo identificador. Do eble ne scias ke estas reale variablo; ne scias kion ĝi estas. Do temas pri identigilo. Do kial ĝi ne deklarita? Yeah. Do esti klara en terminologio, la deklaro de variablo Estas kiam vi diras "int x," aŭ "string y," kiom. La inicialización de la variablo, aux la atribuo de la variablo, Estas kiam vi diras "x = 2." Do ni povas fari tiujn en apartaj paŝoj, int x, x = 2, kaj ĝis - ni povas havi amason da materialo en ĉi tie - sed ĝis tiu linio okazas, x estas ankoraŭ uninitialized, sed estis deklarita. Kaj tiel ni povas evidente fari ĝin en 1 linio, kaj nun ni estas deklari kaj inicializar. Demandoj? Kaj fine, "Kial la cezaro Cipher ne tre sekura?" Do unue, ĉu iu volas diri kion Cezaro Cipher estas? [Studenta] Cezaro Cipher nur estas ke vi mapo, vi ŝanĝi ĉiun literon, iu numero de literoj transiru, kaj retiriĝi superflue, kaj ĝi ne estas tre sekura ĉar ekzistas nur 26 eblaj opcioj kaj vi nur devas provi ĉiu 1 de tiuj ĝis vi ricevas ĝin. Oh. Do, mi devas ripeti? Cezaro Cipher, it's - Mi volas diri, vi povas trakti ĝin sur la problemojn ke vi - aŭ mi supozas la normon eldono de la problemo aro kiu estas ne sur la hacker eldono. Do en la normo eldono al la problemo aro, vi ricevas mesaĝon kiel, "Saluton, mondo!" kaj vi ankaux havas numeron kiel 6, kaj vi prenas tiun mesaĝon, kaj ĉiu individua karaktero, vi turni ĝin per 6 poziciojn en la alfabeto. Do la 'h' en saluton igus h-i-j-k-l-m-n. Do la unua litero devus esti n. Ni faros la samon kun e. Se ni havas, kiel, z aŭ io, tiam ni envolver reen ĉirkaŭe por 'a'. Sed ĉiu signo ricevas cycled 6 signojn poste en la alfabeto, kaj ĝi ne estas tre sekura pro tio ke estas nur 26 eblecoj por kiom da manieroj vi povus kovri sola litero. Do vi povas simple provi ĉiujn 26 el ili kaj, supozeble, dum longa sufiĉas mesaĝo, nur 1 el tiuj ebla 26 aĵoj tuj estos legeblaj, kaj la legebla tiu tuj estos la originala mesaĝo. Do ĝi ne estas tre bona maniero de encrypting ion ajn. Nerilata al tiuj mallongaj, "Kio estas funkcio?" Do kio estas funkcio? Jes. [Studenta] Estas kiel aparta peco de kodo, kiun vi povas nomi iri tra kaj poste la reveno valoro de kiom. Yeah. Do mi devos respondi ĝin ankaŭ respondante al la sekva - aŭ ripeto de ankaŭ simple respondi al la sekva. Vi povas uzi funkcioj anstataŭ nur kopii kaj bati kodo denove kaj denove. Nur prenu ke kodo, metis ĝin en fuction, kaj tiam vi povus simple nomi la funkcion cxie, kien vi estis kopii kaj bati. Do funkcioj estas utilaj. Do nun ni faros realan problemojn. La unua. Do la ideo de la unua estas, vi pasas ĉenon, kaj sendepende de la - aŭ faras ĝi diri ĉion minuskla? Li ne diras tutan minuskla. Do la mesaĝo povas esti ion ajn, kaj - ho ne. Ĝi faras. "Por simpleco, oni povas supozi ke la uzanto volas nur enigo minuskla literoj kaj spacoj." Do ni pasi ĝin mesaĝon kun nur minuskla literoj kaj poste ni alternos inter kapitalo kaj minuskla - ni ŝanĝos la kordo esti ĉefurbo kaj minuskla, alternante. Do antaŭ ol ni donas al vi duan inkluzive plonĝi en la problemo, kio estas la unua aĵo kiun ni bezonas por fari? Ho, kion mi ĵus alklaku? Ho, mi ĵus alklakis retmesaĝon en ĉi tie. Do la unua afero kiun ni bezonas por fari - mi rigardas la malĝusta unu? Estas ĉi tiu parto de ĉi tiu? Ne, tio estas ankoraŭ en tie, though. Konsentite, ankoraŭ ĉi tie. Nun ni ne povas supozi -? Jes. Ĉi tie ni ne povas supozi ke ĝi estas nur minuskle kaj spacoj. Do nun ni devas trakti la fakton ke la literoj povas esti kion ajn ni volas ilin esti. Kaj tial la unua horo ni volas fari estas simple akiri la mesaĝo. Ni nur bezonas akiri ĉeno, ĉeno s = GetString, okay. Nun ĉi tiu problemo, estas kelkaj manieroj de fari tion. Sed ni tuj volas uzi bitlarĝa operatoroj tie. Ĉu ekzistas homoj kiuj aŭ jam estis ne je la supersection, aŭ io, kaj ne scias kion bitlarĝa operatoroj estas? Aŭ kiel ili rilatas al ASCII iamaniere? [Studenta] mi ne estis en la supersection, sed mi scias kio bitlarĝa operatoroj estas. Okay. Tial mi ne devas iri super la fundamentojn de ili, sed mi klarigi kion ni tuj volas uzi ĉi tie. Do 'A': Duuma reprezento de kapitalo A, la nombro estas 65. Mi simple intencas rigardi - 41 tuj estos 01000001. Por ke estu 65 en dekuma, do ĉi tiu estas la duuma reprezento de la karaktero ĉefurbo A. Nun, la duuma reprezento de la karaktero minuskla 'a' tuj estos la sama afero, preskaŭ. Ĉu tio estas - 6, jes. Tio decas. Do duuma ĉefurbo A, duuma minuskla 'a'. Do rimarki ke la diferenco inter A kaj 'a' estas cxi tiu sola iom. Kaj ĉi tio okazas al esti la 32 bito, la bito reprezentas la numeron 32. Kaj tio faras senson kiam A estas 65; 'a' estas 97. La diferenco inter ili estas 32. Do nun ni scias ke ni povas konverti de A al 'a' per prenante A kaj bitlarĝa ORing ĝin, kun - tio aspektas kiel 1. Tio ĉi estas bitlarĝa OR, kun 00100000, kaj tiu donos al ni 'a'. Kaj ni povas preni de 'a' al A per bitlarĝa ANDing kun 11, 0 en tiu loko, 11111. Do ĉi estos tiam donu al ni precize kion 'a' estis, sed nuligi tiun individuaj iom, do ni havos 01000001, mi ne scias se mi rakontas pravas. Sed ĉi tiu tekniko de bitlarĝa ORing akiri el ĉefurbon al minuskla, kaj bitlarĝa ANDing akiri el minuskla al ĉefurbo ne estas ekskluziva al A. Ĉiuj literoj, K vs k, Z vs z, ĉiuj ili estas ĝuste tuj diferencas de tiu sola iom. Kaj tiel vi povas uzi tiun ŝanĝi el iu minuskla letero al ajna majusklo kaj inverse. Okay. Do facilan vojon de prenanta el tiu - tial anstataŭ devi skribi eksteren ajn 1011111 estas - facila maniero reprezenti tiun numeron, kaj ĉi tiu estas ne unu ke mi transiris en la supersection, sed supersigno (~) estas alia bitlarĝa operatoro. Kio ~ faras estas ĝi rigardas la bito prezento. Ni prenu ajnan nombron. Tio estas nur iuj duuma nombro, kaj kion ~ tio estas simple klakas ĉiuj bitoj. Do temas pri 1, nun 0, ĉi tiu estas 0, nun 1, 010100. Do jen ĉio ~ faras. Do 32 estas tuj estos la nombro - liveri de tiu - do 32 tuj estos la nombro 00100000, do ~ de tiu tuj estos tiu nombro tien ke mi ANDed 'a' kun. Ĉu ĉiuj vidas tion? Ĉi tiu estas bela komuna, kiel kiam vi volas eltrovi por postaj aferoj kiujn ni povus vidi, kiam ni volas vidi se - aŭ ni volas ĉiu, ĉiu unuopa bito aro krom 1 vi emas fari ~ de la bito, ke ni ne volas agordi. Do ni ne volas la 32 bitoj aro, do ni ~ de 32. Okay. Do ni povas uzi ĉiuj tiuj ĉi tie. Bone, do ĝi estas bone se vi ne faris, ni malrapide iras super kune, aŭ marŝi sur ĉi, do - tra ĉi. Marŝi tra ĉi. Do ni havas nian kordoj, kaj ni volas buklo super ĉiu karaktero en tiu ĉeno kaj faru ion por ĝi. Do kiel fari ni buklo sur ĉeno? Kion ni uzu? Mi ne faros tion ĉi tie. Yeah. Do mi havas mian iterator, kaj li diris tion, sed kiom mi scias, kiom da karakteroj estas en la kordo? Strlen (j), tiam mi + +. Do kion mi faris tie ne estas la plej bona maniero fari aferojn. Ĉu iu scias kial? Ĉar vi kontroli la lingvon de la kordo ĉiun solan fojon. Do ni tuj volas movi strlen, mi povus diri tien, int longeco = strlen (j), kaj do i > 1 bito. Ĝi povus esti pli ol 1 bito, dum ĉiuj bitoj sub ĉi pozicio estas la sama. Do ni bezonas almenaŭ 26 signojn - aŭ, estas 26 signoj. Do ni bezonas almenaŭ 26 numerojn por reprezenti la diferenco - La diferenco inter A kaj 'a' devas esti almenaŭ 26, alie ni ne estus reprezentitaj la tuta ĉefurbo nombroj. Tio signifas ke A, se ni starti je 1, ĝi tuj uzos ĉiujn el tiuj bitoj, ĉiuj el tiuj unuaj 5 bitoj, por reprezenti ĉiun tra Z. Tial la sekvanta bito, aŭ tiun iom, la sekva iom estas ke tio elektita por distingi inter A kaj 'a'. Tio estas ankaŭ kial, en ASCII tablo estas 5 simboloj disigi majuskloj de minuskla literoj. Ekde tiuj estas la simboloj, la ekstra 5 kiu kondukas supren la 32 estante la diferenco inter ili. [Studenta] Do ni povus fari ĝin, ĉar ASCII estas desegnita tiu vojo. Jes. Sed ASCII - la diferenco povus ankaŭ esti ambaŭ el ĉi tiuj bitoj. Kiel, se A estis 10000001, kaj 'a' estis 11100001 - Mi forgesas, kion ajn. Sed se ĝi tion, tiam ni povus ankoraŭ uzi 'a' - A. Estas nur nun la diferenco inter A kaj 'a' estas ankoraŭ tiuj 2 bitoj. Mi kredas ĝi estas skribita 48. Ĉu 32 + 64? Mi kredas ke estas? Estus ankoraŭ 2 bitoj; ĉiu unuopa signo, kiel, Z kaj z, K kaj k, ili ankoraŭ havas la saman ĝusta bitoj starigis krom tiuj 2 bitoj. Do dum tiu ĉiam estas vera, sendepende de se ni uzas ASCII aŭ iu alia sistemo, tiel longe, kiel ekzistas nur aro da bitoj kiu estas malsamaj por ĉiu karaktero, tiam kiu funkcias bone. Estas nur ke 32 estis starigita ĉar ĝi estas la unua ni povus uzi. >> Cool. Mi emas preferi, okaze vi ne vidis, se la bloko estas nur sola linio, vi povas forigi la frizita krampoj, do mi emas preferi fari ĉi tion. Ankaŭ, vi scias, kiel ni povas fari aferojn kiel s [i] + = 1? Vi ankaŭ povas fari j [i] bitlarĝa KAJ = 32. Kaj bitlarĝa OR = 32. Ankaŭ, grafo _mod_ 2 == 0. Do memoru, ke - mi ne skribas ĝin - ĉiu ne-nula valoro estas vera, kaj 0 estas falsaj. Do "se grafo _mod_ 2 == 0" estas la sama kiel diri "se ne kalkuli _mod_ 2." Mi verŝajne estus nur renversis la linioj kaj diris, "se grafo mod 2, ĉu la AŬ 1, alie vi la KAJ 1, "por ke mi ne bezonas la" ne. " Sed ĉi funkcias same bone. Kaj kion alian mi povas fari tie? Vi povus kombini ilin per triargumenta se vi volas, sed tiam tio volas nur fari tion Messier kaj probable pli malfacile legi, sekve ni ne faros tion. Iu havas aliajn sugestojn? Estas ke la tuta problemo petis? Oh jes. Do forigi tiujn malplenajn liniojn, nun ni presi f,% s esti la unu por kordoj, Ni presas f, s. Nun ni ruli ĝin. Ĉu mi faras ion malĝustan? Tio estas \ "; Mi volas n. Okay. Nun ni kuros ĝin. Sxanco gxi krias al mi. Strlen estas en string.h. Do ĉi tiu estas la bela afero pri Clang estas rakontas al vi kio estas en, anstataŭ GCC kiu nur diras, "Hej, vi forgesis ion, mi ne scias kion ĝi estas." Sed ĉi rakontos al mi, "Vi intencis inkluzivi string.h." Do mi ne instigas por nenio, do ĝi estas ne diras ion ajn. Sed ni faros lian ekzemplon, "Thanks 4 La add". Tio aspektas bone. Hura. Do revenante al via ĉefa, mi preskaŭ neniam faras. Estas nedeviga. Kaj ĉefaj estas la sola funkcio por kiu estas laŭvola. Se vi ne revenos ion de ĉefaj, ĝi estas supozas ke vi intencis reveni 0. Demandoj? Okay. Do nun la dua problemo. "Memori de semajno 2 La dua prelego kiun interŝanĝi 2 variabloj 'valoroj por pasi tiuj 2 variabloj al funkcio (eĉ se nomata swap) ne ĝuste funkcias, almenaŭ ne sen 'punteros.' " Kaj ignori punteros ĝis ni atingos ilin. Ni volas interŝanĝi 2 variabloj; ni ne uzas funkcio por fari ĝin. Ni ankoraŭ faros ĝin en ĉefa ŝatas ĝin diras. Sed uzi tiujn 2 variabloj, ni ne deziras uzi provizoran variablo. Estas 2 manieroj por fari tion. Vi povas fari tion per via tradicia duuma operatoroj. Do ĉu iu scias rapidan kaj malpuran maniero fari tion? Eble vere preni momenton de pensado. Se mi havas - Mi starigis la problemon ĝis kiel ili demandas. Do, se mi havas 2 variabloj, A, kiuj estas nur entjero ke ili donu al mi, kaj sumo variablo B, kio apartenas al alia entjero kiu mi donis. Do, se mi havas ĉi tiujn 2 variabloj, nun mi volas interŝanĝi ilin. La tradicia, uzante viajn regulajn duuma operatoroj, mi volas diri, kiel +, -, ÷. Ne bitlarĝa operatoroj kiuj agas sur duuma. Do uzante -, +, ÷, kaj ĉiuj tiuj. Ni povus interŝanĝi farante iun kiel a = a + b, kaj b = a - b, a = a - b. Do, prudento kontroli, kaj tiam ni vidos kial tiu verkoj. Diru al = 7, b = 3, tiam a + b tuj estos 10. Do ni nun establante = 10, kaj tiam ni faras b = a - b. Do ni faras b = a - b, kiu tuj estos 7, kaj b = a - b denove, aŭ a = a - b. Kiu iras al esti 10 - 7 kiu estas 3. Do nun, ĝuste, 'a' estis 7, b estis 3, kaj nun b estas 7 kaj 'a' estas 3. Por ke ia havas sencon; 'a' estas la kombino de la 2 nombroj. Je ĉi tiu punkto, 'a' estas la kombino, kaj tiam ni subtrahanta el la originala b, kaj poste ni subtrahanta, kio estis la originala 'a'. Sed ĉi tio ne funkcias por ĉiuj nombroj. Al vidi ĉi tiu, ni konsideras sistemo, do ni kutime opinias de entjeroj kiel 32 bitoj. Ni laboras en iu kiu nur kiel 4 bitoj. Espereble mi venis kun bona ekzemplo nun. Do, mi scias, ĉi tio estos facila. Diru nia 2 numeroj estas 1111, kaj 1111, do ni estas en duuma nun. En reala glitpunktaj nombroj, se vi volas pensi pri tio, ke vojo, = 15 kaj b = 15. Kaj tial ni atendas, post ni interŝanĝi ilin - ili eĉ ne devas esti la samaj numeroj, sed mi tion faris tiel. Ni faru ilin ne la samaj numeroj. Ni do 1111 kaj 0001. Do al = 15 kaj b = 1. Post kiam ni interŝanĝi ilin, oni atendus 'a' al esti 1 kaj b esti 15. Do nia unua paŝo estas a = a + b. Nia nombroj estas nur 4 bitoj, do 'al,' kiu estas 1111, + b, kiu estas 0001, tuj finos esti 10000, sed ni nur havas 4 bitoj. Do nun = 0. Kaj nun ni volas establi b = a - b - efektive, tiu ankoraŭ laboras ekster perfekte. a = a - b - ni vidu se ĉi laboras ekster perfekte. Do tiam b = 0 - 1, kiu estus ankoraŭ 15, kaj tiam a = a - b, kio estus 1. Eble ĉi tio faras laboron. Mi sentas ke estas kialo ne funkcias uzante regula. Konsentite, tiel laborante sur la supozo, ke ĝi ne funkcias kun regulaj duuma operacioj, kaj mi serĉos - Mi Google por vidi ĉu tiu estas vera. Do ni volas fari ĝin uzante bitlarĝa operatoroj, kaj la indikon jen _XOR_. Do, enkondukante _XOR_ (^) se vi ne vidis ĝin ankoraŭ. Estas, denove, bitlarĝa operatoro tiel agas iom post iom, kaj it's - Se vi havas la bitojn 0 kaj 1, tiam ĉi tiu estos 1. Se vi havas la bitoj 1 kaj 0, ĝi estos 1, vi havas la bitojn 0 kaj 0 ĝin estos 0, kaj se vi havas la bitoj 1 kaj 1 ĝin povos esti 0. 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. AŬ estus ĉi esti 1, XOR havus ĉi esti 0. Do ni tuj volas uzi _XOR_ tie. Pensu pri ĝi dum minuto, mi iros al Google. Nu, vi ne povas legi, ke, mi estas nuntempe en la _XOR_ interŝanĝa algoritmo paĝo. Espereble ĉi tiu klarigos kial mi can't - Tiu estas ĝuste la algoritmo kiu ni ĵus faris. Mi ankoraŭ ne komprenas kial - mi devas ĵus plukis malbona ekzemplo, sed ĉi kazo kie 'a' okazis igi 0, post alveni al 5 bitoj, tiel nun 'a' estas 0, tio estas kion oni nomas "entjero superflui". Laŭ Vikipedio, "Kontraste kun la _XOR_ interŝanĝa, ĉi variado postulas ke ĝi uzas iuj metodoj por garantii ke x + y ne kaŭzas entjero superflui ". Do ĉi tio havas problemojn; tio entjera superflui, sed mi faris ion malbonan. Mi ne estas certa. Mi provos veni supren kun alia. [Studenta] Nu, ne estas entjero superflui kiam vi provas enmeti numeron tien pli granda ol la kvanto de bitoj vi destinis? Yeah. Ni havas 4 bitoj. That's - ni havis 4 bitoj, ni provu aldoni 1 al ĝi, do ni finos kun 5 bitojn. Sed la kvina iom ĝuste gets ekstermita, jes. Eble fakte - [Studenta] Ĉu tiu ĵetu vin eraron, aŭ faras tion - estus ke ĵetu eraro? No Do ne estas eraro. Kiam vi atingos la asembleo nivelo, speciala bito ie estas metita kiu diris tie estis superflui, sed en C vi speco de simple ne trakti tion. Vi vere ne povas trakti ĝin krom se vi uzas specialan asembleon instrukciojn en C. Ni pripensu _XOR_ interŝanĝa. Kaj mi kredas ke la Vikipedia artikolo povus havi ankaŭ estas dirante ke - Do ankaŭ enportis modula aritmetiko, tial mi supozas mi, en teorio, farante modula aritmetiko kiam mi diras ke 0 - 1 estas 15 denove. Por ke povus reale - sur regula procesoro kiu faras 0 - 1 = 15. Ĉar ni finos je 0, ni subtrahi 1, do tiam nur envolvas reen ĉirkaŭe por 1111. Do ĉi tiu algoritmo povus reale labori, la a + b, la a - b, b - a; ke estu bone. Sed estas iu procesoroj, kiuj ne faras tion, kaj tiel ne estus bone en tiuj specifaĵoj. XOR interŝanĝa funkcios sur ĉiu procesoro. Okay. La ideo estas ke ĝi estas supozitaj esti la samaj, tamen. Kie ni estas uzanta _XOR_ al iel akiri la informon de ambaŭ en 1 de la variabloj, kaj poste eltiri la informojn de la individuo variabloj denove. Do ĉu iu havas ideojn / la respondo? [Studenta respondo, nekomprenebla] Do tiu devus funkcii, kaj ankaŭ, XOR estas komuta. Sendepende de kion ordon tiuj 2 nombroj hazarde estas en ĉi tien, ĉi tiu rezulto estas tuj estos la sama. Do al ^ b estas b ^ al. Vi povus ankaŭ vidas ĉi tion skribita kiel ^ = b, b ^ = a, a ^ = b denove. Do tio decas, kaj vidi kial ĉi verkoj, pensu pri la bitoj. Uzante Plej malgranda nombro, diru 11001, kaj 01100. Do ĉi tiu estas 'a'; ĉi estas b. Do al ^ = b. Ni tuj estos opcio 'a' = al la _XOR_ de tiuj 2 aĵoj. Do 1 ^ 0 estas 1; 1 ^ 1 estas 0; 0 ^ 1 estas 1, kaj 0 ^ 0 estas 0; 1 ^ 0 estas 1. Do 'a,' se vi rigardas la dekuma numero, ĝi tuj estos - vi ne tuj vidas multe de rilato inter la originala 'a' kaj la nova 'a,' sed rigardante la bitoj, 'a' estas nun kiel maŝo de la informo de ambaŭ la originala 'a' kaj la originala b. Do, se ni prenas b ^ a, ni vidas ke ni finos la originala 'a'. Kaj se ni prenas la originala 'a' ^ la nova 'a,' ni vidas ni finos je la originala b. Do (a ^ b) ^ b = la originala 'a'. Kaj (a ^ b) ^ a = la originala b. Estas - alia formo de vidi ĉi estas io _XOR_ mem estas ĉiam 0. Do 1101 ^ 1101, ĉiuj bitoj tuj estos la sama. Do neniam tuj estos okazo kie 1 estas 0 kaj la alia estas 1. Do ĉi tiu estas 0000. La sama kun tiu. (A ^ b) ^ b estas kiel ^ (b ^ b). (B ^ b) tuj estos 0; a ^ 0 estas ĝuste tuj estos 'a,' pro tio ke ĉiuj bitoj estas 0. Do la solaj kiuj tuj esti kie 'a' estis origine 1 - havis aĵoj. Kaj la sama ideo tie, mi estas bela certa estas ankaŭ komuta. Yeah. Mi ne diros antaŭ tiu estis komuta. La ^ 'a', kaj ĝi estas asocieca, do nun (b ^ a) ^ al. Kaj ni povas fari b ^ (a ^ a). Kaj tiel denove, ni preni la originalan b. Do 'a' estas nun la kombino de 'a' kaj b kune. Uzanta nia nova combo 'a' ni diras b = combo 'a' ^ la originala b, ni preni la originalan 'a'. Kaj nun al = combo 'a' ^ la nova b, kiu estis la originalo - aŭ kiu estas nun kio estis 'a' aŭ b. Tio ĉi kazo cxi tie. Jen = b, malnova b. Do nun ĉiu estas tie en la interŝanĝis ordo. Se ni efektive rigardis la bitoj, b = a ^ b, tuj disaŭ tiuj 2, kaj la respondo tuj estos tio, kaj tiam a = a ^ b estas XORing tiuj 2 kaj la respondo estas jena. Demandoj? Okay. Do la lasta estas iom signife pli malfacila. [Studenta] Mi kredas li havas demandon pri ĝi. >> Ho, pardonu. [Studenta] Kio vere rapida? Se vi uzas ĉi _XOR_, aŭ ĉu se vi rakontos nova variablo? Do kio estas fakte pli rapida, deklarante nova variablo aŭ uzante _XOR_ por interŝanĝi? La respondo estas, verŝajne portempa variablo. Kaj tio estas ĉar iam ĝi estas kompilitaj malsupren - tiel en la asembleo nivelo, ne estas tia afero kiel loka variabloj aŭ ajna temporal variabloj aŭ iu el ĉi aĵoj. Ili nur volas - estas memoro, kaj ekzistas registroj. Registroj estas kie aĵoj aktive okazas. Vi ne aldoni 2 aĵojn en memoro; vi aldonas 2 aĵojn en registroj. Kaj vi venigos tion for memoro en registroj por poste aldoni ilin, kaj tiam vi povus meti ilin denove en memoro, sed la tuta agado okazas en registroj. Do kiam vi uzas la provizora variablo alproksimiĝo, kutime kio okazas estas tiuj 2 nombroj estas jam en registroj. Kaj poste de tiu momento, post vi interŝanĝis ilin, ĝi devos nur ekuzi la alia registro. Ie ajn vi estis uzanta b, ĝi devos simple aliru la registro kiu jam stoki 'a'. Do ne bezonas fari ion por reale fari la interŝanĝa. Yeah? [Studenta] Sed ankaŭ prenas pli memoro, ĉu ne? Ĝi estos nur preni pli memoro se ĝi bezonas por stoki ke temporal variablo. Kiel se vi poste uzas tiun temporal variablo denove ie, tiam - aŭ vi atribuas ion por ke temporal variablo. Do, se en ajna punkto en tempo 'a,' b en temp havas malsamajn valorojn aŭ ion, tiam tuj devos distinga lokoj en memoro, sed estas vere, ke ekzistas multaj lokaj variabloj kiu nur ekzistas en registroj. En tiu kazo, ĝi estas neniam metas en memoro, kaj tiel vi neniam malŝparas memoro. Okay. Lasta demando estas iom pli. Do jen, en ĉi CS50 aparaton, estas vortaro. Kaj la kialo estas ĉar [?? B66] estas ortografia kontrolilo kie vi povas skribi uzante hash tabloj aŭ provoj aŭ iu datumstrukturo. Vi tuj skribos sorĉas Kontrolilo, kaj vi tuj estos uzante ĉi vortaro por fari tion. Sed por tiu ĉi problemo, ni nur tuj serĉos por vidi se sola vorto estas en la vortaro. Do anstataŭ gardi la tutan vortaron en iu datumstrukturo kaj poste rigardis super tutan dokumenton por vidi se io estas misspelled, ni simple volas trovi 1 vorto. Do ni povas simple skani sur la tuta vortaro kaj se ni neniam trovas la vorton en la tuta vortaro, tiam ĝi ne estis en tie. Se ni skani sur la tutan vortaron kaj ne vidi la vorto, tiam ni estas bonaj, ni trovis ĝin. Ĝi diras tie ke ni volas komenci rigardi C la dosiero-uzado funkcio, ĉar ni deziras legi la vortaron, sed mi donos al la aludon cxi tie pri tio, kiu funkcioj vi devus pensi. Mi skribas ilin sur Spacetoj. Do la ĉefaj vi volas rigardi estas f malfermita kaj poste, neeviteble, f fermita, kiuj iros al la fino de via programo, kaj f scan f. Vi povus ankaŭ uzi f legi, sed vi verŝajne ne volas ĉar tio - vi ne finas bezoni tio. F scan f estas kion vi tuj estos uzante skani sur la vortaro. Kaj tial vi ne bezonas programi ĉe la solvo, nur provu kaj kiel pseŭdo-kodo vian vojon al solvo, kaj tiam ni diskuti ĝin. Kaj efektive, kiam mi jam donis al vi tiujn, se vi iros en ajna fina aŭ vian aparaton la ŝelo, Mi - mi kutime - se vi ne vidis ankoraŭ, mi ne scias se vi faris en klaso, sed homo, do la viro paĝoj, estas sufiĉe utila por rigardi preskaux neniu funkcio. Do mi povas fari, kiel, viro f, scan f. Jen nun la informoj pri la scan f familio de funkcioj. Mi povus ankaŭ fari viro f, malfermita, kaj ke donos al mi la detalojn pri tio. Do se vi scias, kio funkcio vi uzas, aŭ vi legas kodo kaj vi vidos iujn funkcio kaj vi estas kiel, "Kion tio do?" Justulo tiu funkcio nomo. Ekzistas kelkaj strangaj ekzemploj kie vi eble devas diri ŝati. viro 2 kiu funkcio nomo, aŭ viron 3 kiu funkcio nomo, sed vi nur devas fari tion se viro funkcio nomo ne okazas por labori la unua fojo. [Studenta] Do mi legis la viro paĝon por malferma, sed mi ankoraŭ konfuzita pri kiel uzi ĝin kaj la programo. Okay. Multaj de la viro paĝoj estas malpli ol utila. Ili estas pli utila se vi jam scias, kion ili faras kaj tiam vi devas nur memori la ordon de la argumentoj aŭ iu. Aŭ ili povas doni al vi ĝenerala resumo, sed iuj el ili estas tre blindiga. Kiel f scan f, ankaŭ. Ĝi donas al vi la informo pri ĉiuj tiuj funkcioj, kaj 1 lineo cxi tie okazas diri "F scan f legas de la kordo punkto aŭ rivereto." Sed f malfermos. Do, kiel estus ni uzas f malfermitaj? La ideo de programo kiu bezonas fari dosieron I / O estas ke vi unue bezonas por malfermi la dosieron vi volas fari tion kun, kaj neeviteble, legu aferoj de tiu dosiero kaj faru stuff kun ili. F malfermitaj estas kion ni uzas por malfermi la dosieron. La aĵo ni reiros, do kio dosieron ni volas malfermi, donas al ni la - en ĉi tie diras "/ user / share / dict / vortoj." Ĉi tio estas la dosiero kiun ni volas malfermi, kaj ni volas malfermi ĝin - ni devas eksplicite specifi se ni volas malfermi ĝin legi aŭ se ni volas malfermi ĝin skribi. Ekzistas kelkaj kombinoj kaj stuff, sed ni volas malfermi tiun por legi. Ni volas legi de la dosiero. Do kio faras ĉi reveno? Denove dosieron stelo (*), kaj mi ĵus montri ĉion en la variablo f, tiel *, denove, ĝi estas puntero, sed ni ne volas trakti punteros. Vi povas pensi de f kiel, f estas nun la variablo vi tuj uzi por reprezenti la dosieron. Do se vi volas legi de la dosiero, vi legis de f. Se vi volas fermi la dosieron, vi fermas f. Do je la fino de la programo, kiam ni neeviteble volas fermi la dosieron, kion ni faru? Ni volas fermi f. Do nun la lastan dosieron funkcio kiu ni tuj volas uzi estas scan f, f scan f. Kaj kion tio faras estas ĝi skanu super la dosiero serĉas mastron por kongrui. Rigardante la viron paĝo ĉi tie, oni vidas int f scan f, ignori la reveno valoro por nun. La unua argumento estas la dosiero * rivereto, do la unua argumento nin tuj volas pasi estas f. Ni balaita super f. La dua argumento estas formato kordoj. Mi donos al vi formato kordoj nun. Mi kredas ke ni okazi diri, 127s \ n, multe de tiu estas nenecesa. La ideo de kio tiu formato linio estas, estas vi pensus scan f kiel la malo de impreso f. Do print f, presita f ni ankaŭ uzas tiun tipon de formato parametro, sed en presita f kion ni faras estas - ni rigardu ekvivalenta. Do presi f, kaj tie estas reale ankaŭ f print f, kie la unua argumento tuj estos f. Kiam vi presas f, ni povus diri iun kiel "print 127s \ n" kaj poste, se ni pasas iuj kordoj, ĝi tuj presi ĉi ŝnuro kaj tiam nova linio. Kio 127 rimedojn, mi estas bela certa, sed mi neniam limigis min al ĝi, Vi eĉ ne bezonas diri '127 'en la presita f, sed kion tio signifas estas presi la unuan 127 signoj. Do mi sufiĉe certas ke tio estas la kazo. Vi povas Google por tio. Sed en la sekvanta unu mi preskaux pozitiva signifas tio. Do ĉi tiu estas presi la unuan 127 signoj, sekvita de nova linio. F scan f nun, anstataŭ rigardi variablo kaj presi ĝin, ĝi tuj rigardi iujn kordoj, kaj stoki la ŝablono en la variablo. Ni efektive uzi scan f en malsama ekzemplo. Do diru ni havis iuj int, x = 4, kaj ni volis krei ĉenon el - volis krei la kordo kiu estis kiel, ĉi venos supren multe poste, iu kiu estas nur kiel 4.jpg. Do povas esti tiu programo, kie vi devos sumo vendotablo, Resume kontraŭstari i, kaj vi volas ŝpari amason da bildoj. Do vi volas ŝpari i.jpg, kie mi estas iu ripeto de via buklo. Nu do kiel ni faras ĉi kordoj por ke JPEG? Se vi volas presi 4.jpg, ni povus simple diri print f,% d.jpg, kaj tiam estus presi por JPEG. Sed se ni volas konservi la kordo 4.jpg, ni uzas scan f. Do string s - fakte ni can't - karaktero, char s, ni iru 100. Do mi simple deklaras iu tabelo de 100 signoj, kaj tio kion ni neeviteble tuj estos stokante ke JPEG in Do ni tuj uzi scan f, kaj la formato, kiel ni dirus% d.jpg por presi 4.jpg, la formato de tiu tuj estos% d.jpg. Do la formato estas% d.jpg, kion ni volas anstataŭigi% d kun estas x, kaj nun ni devas gardi ke kordoj ie. Kaj kie ni iras por stoki ĉi tiu linio estas en la tabelo s. Do post tiu linio de kodo, s, se ni presi f,% s de la variablo s, ĝi tuj presi 4.jpg. Do f scan f estas la sama kiel skanilo f, krom nun ĝi estas transrigardante la dosiero por kio stoki en s. Tion la lasta argumento tuj estos. Ni volas konservi - "Scan f familio de funkcioj escanea en ambaŭ laŭ formato kiel provis sube. Se iu estas stokitaj en la loko antaŭ vi povus reveni - " Ne, ni estu bonaj. Lasu min pensi por sekundo. Do scan f ne - kion la heck estas la funkcio kiu faras tion? Do scan f ne tuj prenas entjero kaj faru dot jpg. Ĝi tuj [mumbles]. Savi int variablo en kordoj int C. Kio estas ĉi tiu variablo, aŭ kio estas ĉi tiu funkcio nomita? Jes. That's - jes. Do kion mi difinanta al vi antaŭe estis s print f, kiu - kiu faras multe pli sentita, kial mi diris ke estis multe pli kiel presita f. Scan f estas ankoraŭ ia kiel presita f, sed s print f tuj skani ĝin kaj anstataŭigi la variabloj kaj nun stoki ĝin en linio. Anstataŭ videbligi ĝin, stokas ĝin en linio. Do ignori ke tute. Vi povas ankoraŭ pensi pri la formato specifier kiel kiel tiu de impreso f. Do nun, se ni volis fari la 4.jpg afero, ni farus s print f, x de ĉi. Do kio scan f faras - kio via demando tuj estos? [Studenta] Mi ĵus konfuzita sur kion ni provas fari ĉi tie kun tiu JPEG. Ĉu vi povas klarigi, ke ankoraŭ 1 tempon? Do tio - estas malpli Relevent al f scan f nun; espereble, estos ligi reen en ia maniero. Sed kion mi komence intencis montri estis - tio estas fakte rekte grava por tiuj [?? F5] Vi tuj uzos s print f, kie, diru ni havas 100 bildoj, kaj vi volas legi bildo 1.jpg, 2.jpg, 3.jpg. Do, por fari tion, vi bezonas f malfermita, kaj tiam vi devas pasi en la ĉeno, kiun vi volas malfermi. Do ni volus malfermi 1.jpg; por krei la kordo, kiu estas 1.jpg, ni faru s print f de% d.jpg--ni ne faros por int i = 0. i <40, mi + +. Do s print f% d.jpg de i. Do post tiu linio, nun la variablo aŭ la tabelo s tuj 1.jpg. Aŭ, 0.jpg, 1.jpg, 2.jpg. Kaj tiel ni povas malfermi, siavice, ĉiu bildo por legado. Do jen kio s presi f faras. Ĉu vi vidas kion s presi f estas nun faras? [Studenta] Okay, do ĝi estas prenante - ĝi kreas kordoj, something.jpg, kaj poste stokas ĝin. Jes. Ĝi kreas - tiu ĉi estas alia formato kordoj, kiel skanilo f kaj presita f, kie enmetas ĉiujn variabloj en la dua argumento, eble s kiel kontraŭ mi. Eble - mi volas diri, tio estas la kazo. Sed kion ajn la ordo de argumentoj estas. Ĝi tuj enigi ĉiujn variabloj en la formato kordoj kaj poste konservi en niajn buffer, ni nomas tion buffer, estas kie ni stoki la kordo. Do ni estas provizon ene de s la ĝuste formatitan kordoj,% d estinte anstataŭita per 4. [Studenta] Do, se ni tion faris, estas la variablo f ĵus tuj estos reasignado? Jes. Do ni devus fermi la originala f antaŭ fari tion. Sed - kaj tiam ankaŭ, se ne estus f malfermi cxi tie, poste ni bezonus diri - Yeah. Sed estus malfermi cent malsamajn dosierojn. [Studenta] Sed ni ne povos aliri aŭ - okay. Okay. Do scan f, f scan f, estas speco de la sama ideo, sed anstataŭ, anstataŭe de provizo ĝin en kordoj, ĝi estas pli kiel vi nun irante sur pikilo kaj ŝablona rekono kontraŭ tiu ŝnuro kaj stokante la rezultoj en variabloj. Vi povas uzi scan f al analizi super io 4.jpg, kaj stoki la entjero 4 en sumo int x. Tion ni povas uzi scan f por. F scan f tuj fari ĉe la komandlinio. Mi estas vere bela certa ĉi estas kion la CS50 biblioteko faras. Do kiam vi diras, "get int", ĝi estas scan f-ing super - scan f estas la vojo vi ricevas uzanto enigo. F scan f tuj faros la samon sed uzante dosieron skani super. Do jen, ni estas balaita super ĉi tiu dosiero. La mastro ni provas kongruas estas iuj kordoj kiuj estas 127 signoj longa sekvata de nova linio Do mi sufiĉe certas ke ni povus eĉ nur diri "kongruas s," pro tio ke en la vortaro ni hazarde havas, ni garantias neniu vorto estas tiu longa, kaj ankaŭ f scan f, mi kredas, estos halti en la nova linio ne gravas. Sed ni inkludas la nova linio en la partio, kaj - [Studenta] Se ni ne inkludis la nova linio, ĉu ne trovos partoj de vorto? It - ĉiu - rigardas la vortaro - Do en la vortaro, ĉi tiuj estas ĉiuj niaj vortoj. Ĉiu estas en nova linio. La tuŝo f tuj reprenos tiun vorton. Se ni ne inkluzivas la nova linio, tiam ĝi estas ebla, ke la venonta scan f estos nur legi la novan linion. Sed inkludante nova linio tiam simple ignori la novan linion. Sed ni neniam akiris parton de vorto, de kiam ni ĉiam legi ĝis nova linio, negrave kion. [Studenta] Sed kion se vi serĉi la vorton "cissa," kiel cissa. Ĉu ĝi trovos tion, kaj diri ke estas batalo? Do jen ni - ĝi estos legita en - tiu ĉi estas vere bona punkto. Ni neniam uzas la aktuala - la vorto ni serĉas estas la unua komandlinio argumento. Do kordoj, vorto = argv 1. Do la kordoj ni serĉas estas argv 1. Ni ne serĉas vorton tute en nia scan f. Kion ni faris kun scan f fariĝas ĉiu vorto en la vortaro, kaj poste unu fojon ni havas tiun vorton ni tuj uzos strcmp kompari ilin. Ni tuj kompari nia parolo kaj kion ni ĵus legis in Do neeviteble, ni tuj finos fari aron da scan fs ĝis ĝi nur tiel okazas ke scan f revenos - ĝi revenos, kiel longa kiel ĝi parigitaj nova vorto, kaj ĝi revenos ion alian tiel frue kiel ĝi fiaskis por kongrui la vorto. Ni legas pri la tuta vortaro, stokante linio por linio ĉiu vorto en la variablo s. Tiam ni komparas vorto kun s, kaj se la komparo == 0, strcmp okazas alporti 0 se partio estis farita. Do, se ĝi estis 0, tiam ni povas presi f, parigitaj, aŭ vorto estas en la vortaro, aŭ kion ajn vi volas presi f. Kaj poste - oni ne volas f fermi denove kaj denove. Tiu estas la tipo de afero ni volas fari, kaj ni ne nur serĉas vorton en la vortaro. Do ni povus fari tion, se ni volis serĉi ilia modelo, cissa, kiel vi diris antaŭe, se ni volis serĉi ke ŝablono, tiam maltrafus en la kazo ĉar tio ne estas vere vorto, sed unu el la vortoj en la vortaro okazas al havi en ĝi. Do ĝi kongruas tiun vorton, sed ĉi subaro de la vorto ne estas vorto mem. Sed tio ne estas kiel ni uzas ĝin, ni legas en ĉiu vorto kaj poste kompari la vorto ni havas kun tiu vorto. Do ni ĉiam komparas plena vortoj. Mi povas sendi la finita solvojn poste. Tio estas speco de preskaŭ la ĝustan respondon, mi kredas. [Studenta komento, nekomprenebla] Ho, ĉu mi liveri de tiu antauxe? Char s, mi supozas ke ni diris 127 - Mi forgesas, kion la granda estas. Ni nur faru 128, do nun s estas suficxe longe. Ni ne bezonas presi ion. Ni ankaŭ tuj volis devas fermi nian dosieron, kaj tiu estu pri la ĝusta respondo. CS50.TV