[Powered by Google Translate] Problema Secció 2 set: Edició Hacker Rob Bowden, Universitat de Harvard Això és CS50. CS50.TV Per tant, sóc Rob. Sóc estudiant d'últim any en Kirkland. Aquest és el meu tercer any TFing CS50. És la primera vegada que estem canviant de la secció tradicional conferència-estil, on només una mica del que va succeir en opinió conferència i després vostès fer preguntes, ara a ser molt més basat en problemes, on utilitzem els espais, i - Oh, així que la idea és anar a l'enllaç que et vaig enviar i després vas a estar en el meu espai. ¿Ningú té un ordinador portàtil? Bé. Així que farem servir això, i estarem fent els problemes de viure en la secció i discutir-les i esbrinar el que està malament i jo podria tirar una mica del seu codi, i jo podria parlar de les seves idees. Llavors, ¿algú ha tingut problemes? Pots xatejar en el costat, jo no sé si tindrem raó per a això. Ara, com el supersección anterior, si estigués en aquesta classe, ja saps de què es tracta. En tots els conjunts P que serà aquestes seccions. Llavors P-set 2, plec de condicions, suposo que el vaig veure a P-1 joc ja. Però podem veure P-set 2 per el que anem a anar sobre l'actualitat. I veuràs una secció de preguntes. Així que això serà en tots els P-sèries, hi haurà una secció de preguntes. Fins ara hem dit: "Penseu en això una oportunitat per practicar". No se li va demanar que presentés aquest programa. La idea és que aquests se suposa que el tipus d'ajuda a començar amb el conjunt de problemes. Suposo que en l'edició de Hacker, molts d'ells se suposa que són només coses noves i interessants d'aprendre. Potser no siguin directament aplicables al conjunt de problemes. I en aquest moment no haurem de sotmetre'ls, però en teoria, per conjunts de problemes posteriors, és possible que els presenti, i per tant vostè pot venir a la secció o mirar la secció per obtenir les respostes, o simplement pots aconseguir pel seu compte si vostè no té ganes de gaudir de la meva presència. Així que el - Crec que aquesta és la primera. Oh. A més, en aquestes seccions de preguntes ja us hem farà preguntes sobre els pantalons curts. Així que suposo que, en teoria, se suposa que has de veure això abans d'arribar a la secció, però està bé si no ho fa, anirem sobre ells de totes maneres. Així que podem començar amb aquestes: "Com un bucle while difereixen d'un bucle do-while? Quan és l'últim particularment útil? " Així que algú té alguna - [Estudiant] El do-while sempre s'executarà almenys una vegada. Sí Així que aquesta és la diferència. Un bucle while - I'Ll fes-ho aquí - bucle while, tenim la condició aquí mateix, mentre que un document while, vostè no té una condició fins que arribem fins aquí. I així, quan el programa s'executa, i es posa al bucle while, immediatament es comprova si es compleix aquesta condició. Si aquesta condició no és cert, s'acaba de saltar el bucle complet. Do-while, ja que el programa s'està executant, es posa al "fer". Res succeeix en aquest moment, només continua executant. Després quan arriba el "temps", si la condició és veritable, que va a teixir per enrere i fer-ho de nou i una i altra vegada fins que la condició no és veritable i llavors només es concreta. Per tant, la diferència és, aquesta pot passar directament des del principi. Això necessàriament s'executa una vegada i després pot executar més vegades si la condició segueix sent cert. De manera que el bucle mentre que només ho farà un cop, o - el bucle while - no hagi de fer-ho en absolut, ja que quan arribem a ell, si la condició és falsa, només haurem de passar directament sobre ell. Atès que el do-while, ho anem a executar un cop, necessàriament. Llavors, quan arribem a la condició, comprovem si és cert o fals. Si és cert, anem a fer-ho de nou, i si és fals, només haurem de seguir endavant. Per això, quan és aquest últim particularment útil? Així que puc dir que en la totalitat dels 4 anys, 3 anys, el que sigui, que he estat programant, he utilitzat aquest, igual que, menys de 10 vegades. I, probablement, cinc d'ells estan en CS50 quan estem introduint do-while. Així que quan vostè utilitza do-while? Quan és el - si? [Estudiant] Quan vostè està tractant d'obtenir l'entrada de l'usuari, o alguna cosa que vulgueu comprovar - Si. Així que do-while bucles, entrada d'usuari és el gran. És per això que en els conjunts de problemes primer d'un parell, quan vulguis fer l'usuari, com, "Dóna'm una cadena," no es pot continuar fins que arribi aquesta cadena. I pel que, necessàriament, han de demanar la cadena d'almenys una vegada. Però si contesten alguna cosa dolent, llavors vostè necessita per teixir per enrere i tornar a preguntar. Però més enllà de l'entrada de l'usuari, és molt rar que em trobo amb un cas on vull bucle "almenys una vegada", però possiblement més. Preguntes o -? Algú ha utilitzat un bucle do-while en un altre lloc? Bé. Així que el següent és: "Què identificador no declarat solen indicar si emesa per so metàl · lic? " Llavors, quin tipus de codi podria escriure per obtenir 'identificador no declarat? [Estudiant] Que x = 2? Així que només puc intentar aquí, x = 2. Anem a executar aquest - oh, no faci clic. Així que aquí tenim - tots els drets. "L'ús de x identificador no declarat". Així que aquest és l'identificador no declarat, una variable. Sovint es diu una variable d'un identificador. Així que potser no sap que és en realitat una variable, i no sap el que és. Així que és un identificador. Llavors, per què està declarat? Si. Així que per ser clars sobre la terminologia, la declaració d'una variable és quan vostè diu "x int" o "S String", el que sigui. La inicialització de la variable, o l'assignació de la variable, és quan vostè diu "x = 2". Així que podem fer això en passos separats, int x, x = 2, i fins que - podem tenir un munt de coses aquí - però fins aquesta línia passa, x segueix sense inicialitzar, però ha estat declarat. I, llavors, òbviament, pot fer-ho en una línia, i ara estem declarant i la inicialització. Preguntes? I finalment, "Per què no és el xifrat César molt segur?" Així que primer, algú vol dir el que el xifrat César és? [Estudiant] Caesar Cipher és just que assigni, pot canviar cada lletra, un cert nombre de cartes repassar i tornar una altra vegada, i no és molt segur, ja que només hi ha 26 opcions possibles i només cal provar cada un d'ells fins que ho aconsegueixis. Oh. Per tant, he de repetir? El xifrat César, és - És a dir, se li tracta amb ell sobre els problemes que vostè - o suposo que l'edició estàndard del conjunt de problemes que no està en l'edició hacker. Així que en l'edició estàndard per al conjunt de problemes, s'obté un missatge com: "Hola, món" i també té un nombre com 6, i es pren aquest missatge, i cada personatge individual, el gira per sis posicions en l'alfabet. Així que la 'h' es convertiria en hola h-i-j-k-l-m-n. Així que la primera lletra serà n. Fem el mateix amb el correu. Si tenim una, diguem, z o alguna cosa així, llavors ens emboliqui el retorn a 'A'. Però cada personatge té un cicle de 6 caràcters més endavant en l'alfabet, i no és molt segur ja que només hi ha 26 possibilitats de quantes maneres es pot embolicar una sola lletra. Així que vostè pot provar tot 26 d'ells i, presumiblement, d'un missatge bastant llarg, només 1 dels 26 possibles coses serà llegible, i el llegible serà el missatge original. Així que no és una molt bona manera de xifrar qualsevol cosa. Sense relació amb aquests pantalons curts, "Què és una funció?" Llavors, què és una funció? Sí [Estudiant] És com un tros de codi que es pot trucar per anar a través i després obtenir el valor de retorn del que sigui. Si. Així que vaig a contestar també respondre a la següent - o per repetició també acaba de respondre a la següent. Podeu utilitzar les funcions en lloc de simplement copiar i enganxar el codi una i altra vegada. Només cal fer aquest codi, el va posar en una succió, i llavors es podria simplement cridar a la funció en tot el que has estat copiant i enganxant. Així funcions són útils. Així que ara anem a resoldre problemes reals. La primera d'elles. Així que la idea de la primera és, se li passa una cadena, i tot i la - o és el que diu tot en minúscules? No diu en minúscules. De manera que el missatge pot ser qualsevol cosa, i - oh no. Ho fa. "Per simplificar, es pot suposar que l'usuari només va a introduir lletres minúscules i espais." Així que li passi un missatge amb només lletres minúscules i després alternar entre el capital i minúscules - Podem canviar la cadena a ser capital i minúscules, alternant. Així que abans de donar-li un segon per bussejar fins i tot en el problema, ¿Què és el primer que hem de fer? Oh, què acabo de fer clic a? Oh, m'acaba de fer clic en un e-mail aquí. Així que el primer que hem de fer - estic buscant a la persona equivocada? És això part d'aquest? No, aquests són encara allà, però. Bé, encara és aquí. Ara no podem assumir -? Sí Aquí no podem suposar que és només minúscules i espais. Així que ara hem de lluitar amb el fet que les cartes poden ser el que vulguem que siguin. Així que el primer que volem fer és entendre el missatge. Només hem d'aconseguir una cadena, string s = GetString, està bé. Ara bé, aquest problema, hi ha un parell de formes de fer-ho. Però anem a voler utilitzar operadors bit a bit aquí. Hi ha persones que no es trobaven al supersección, o alguna cosa, i no sé el que són operadors bit a bit? O com es relacionen amb ASCII d'alguna manera? [Estudiant] jo no era a la supersección, però sé el que són operadors bit a bit. Bé. Així que no he d'anar a través dels fonaments d'ells, però t'ho explico el que anem a voler utilitzar aquí. Així que 'A': Representació binària del capital A, el nombre és 65. Jo només vaig a mirar - 41 serà 01000001. Així que ha de ser del 65 en decimal, de manera que aquesta és la representació binària del caràcter de capital A. Ara, la representació binària de la minúscula 'a' serà el mateix, gairebé. És això - 6, sí. Això és correcte. Així el capital binari Un minúscules, binari 'a'. Així notar que la diferència entre A i A 'a' és aquest únic bit. I això passa a ser el bit 32, el bit que representa el número 32. I això té sentit ja que A és 65; 'a' és 97. La diferència entre ells és de 32. Així que ara que sabem que podem passar de l'A a la 'a' mitjançant l'adopció d'un i bit a bit que ORing, amb - que s'assembla a un 1. Aquest és un O-lògic, amb 00100000, i que va a donar-nos 'a'. I que podem obtenir de la 'a' a la A, bit a bit AND amb 11, 0 en aquest lloc, 11111. Així que això, llavors ens donarà exactament el que 'a' era, però s'anul · len aquest bit individual, pel que tindrem 01000001, jo no sé si he explicat bé. Però aquesta tècnica de bit a bit ORing arribar des de la capital a minúscules, i bit a bit AND per obtenir de minúscules a capital no és exclusiva d'A Totes les lletres, K vs K, Z vs z, tots ells són només va a diferir en aquest únic bit. I perquè pugui usar això per canviar de qualsevol lletra minúscula a qualsevol lletra majúscula i viceversa. Bé. Així que una manera fàcil d'aconseguir d'això - així que en comptes d'haver de escriure qualsevol cosa 1011111 és - una manera fàcil de representar aquest número, i això no és una que vaig anar al supersección, però titlla (~) és un altre operador bit a bit. El que ~ fa és que analitza la representació de bits. Prenguem qualsevol nombre. Això és només un nombre binari, i ho ~ fa és que només inverteix tots els bits. Així que aquest va ser un 1, ara un 0, és a dir un 0, ara un 1, 010100. Així que això és tot ~ no. Així que 32 serà el nombre - desfer-se d'això - així que 32 serà el nombre 00100000, i així d'aquesta ~ serà aquest nombre aquí que jo AND 'a' amb. Tothom veu això? Això és bastant comú, com quan es vol esbrinar per les coses que més tard podríem estar veient, quan volem veure si - o volem que tot, cada bit individual excepte per 1 es tendeix a fer ~ de la part que nosaltres no volem establir. Així que no volem que el conjunt de 32 bits, per la qual cosa és de ~ 32. Bé. Així que podem usar tots els que són aquí. Molt bé, així que està bé si no estàs fet, que a poc a poc es va apropar junts, o caminar sobre això, així que - a través d'això. Caminar a través d'això. Així que tenim la nostra cadena, i volem un bucle sobre cada personatge en aquesta cadena i fer alguna cosa amb ella. Llavors, com fem un bucle sobre una corda? Què hem de fer servir? Jo no ho faré aquí. Si. Així que tinc el meu Iterador, i ell ho va dir, però com puc saber quants caràcters es troben a la corda? Strlen (s), llavors i + +. Així que el que hem fet aquí no és la millor manera de fer les coses. Algú sap per què? Com que vostè està comprovant l'idioma de la cadena cada vegada. Així que anem a voler moure strlen, podria dir aquí, int longitud = strlen (s), i després fer i > 1 bit. Podria ser més d'1 bit, sempre que tots els bits de sota d'aquesta posició són els mateixos. Així que necessitem almenys 26 caràcters - o, hi ha 26 caràcters. Així que necessitem almenys 26 números per representar la diferència - La diferència entre A i, 'a' ha de ser de com a mínim 26 o en cas contrari no hauria representat tots els números de capital. Això vol dir que A, si comencem a 1, que utilitzarà tots aquests bits, tots aquests primers 5 bits per representar tot a la Z. És per això que el següent bit o bit d'això, el següent bit és el que ha optat per distingir entre A i A '.' Per això també, en la taula ASCII, hi ha 5 símbols que separen les lletres majúscules de les minúscules. Atès que aquests són els símbols, l'extra 5 que porta a col · lació el 32 és la diferència entre ells. [Estudiant] Així que podem fer-ho, perquè ASCII està dissenyat d'aquesta manera. Sí Però ASCII - la diferència també podria ser tant d'aquests bits. Igual que, si A fos 10000001, i 'a' és 11100001 - m'oblidi, el que sigui. Però si fos així, aleshores podeu usar 'a' - A. És que ara la diferència entre A i A 'a' és encara aquests 2 bits. Crec que ha escrit 48. És 32 + 64? Jo crec que és? Encara seria 2 bits de cada caràcter,, com, Z i Z, K i k, encara tindrien els mateixos bits exactes establerts excepció dels 2 bits. Així que, mentre que sempre és cert, independentment de que teniu ASCII o algun altre sistema, mentre que només hi ha un nombre fix de bits que són diferents per a cada personatge, després que funciona bé. És només que el 32 es va crear perquè és el primer que podríem utilitzar. >> Cool. Jo tendeixo a preferir, en cas que no hem vist, si el bloc és més que una sola línia, vostè pot desfer-se de les claus, així que tendeixo a preferir fer-ho. A més, vostè sap el que pot fer coses com s [i] + = 1? També pot fer s [i] = 32 AND bit a bit. I bit a bit OR = 32. A més, compten mod 2 == 0. Així que recordi que - no ho vaig a escriure - qualsevol valor diferent de zero és veritable i 0 és fals. Així que "si mod compte 2 == 0" és el mateix que dir "si no compten mod 2". Probablement m'acaba d'invertir les línies i li va dir: "si el recompte mod 2, realitzar les OR 1, més la hi AND 1 ", de manera que no necessitava el" no ". Però això funciona igual de bé. I què més puc fer aquí? Se'ls pot combinar amb ternari si volia, però després que acabés de fer les coses més desordenat i probablement més difícil de llegir, així que no farem això. Algú té algun suggeriment? ¿Això és tot el problema vaig demanar? Oh yeah. Així que desfer d'aquestes línies buides, ara anem a imprimir f,% s és el de les cadenes, Anem a imprimir f, s. Ara anem a executar. He fet alguna cosa malament? Això és un \ ", vull un n. Bé. Ara anem a executar. Probablement vaig a cridar a mi. Strlen està en string.h. Així que això és el bo de Clang és que li diu el que es troba, en lloc de GCC que només diu: "Escolta, et vas oblidar d'alguna cosa, no sé el que era." Però això em dirà: "Vosaltres pensasteis que inclogui string.h". Així que no em demanarà res, de manera que no està dient res. Però farem amb el seu exemple, "thanks 4 the add". Això es veu molt bé. Visca. Així que tornant al seu principal, jo gairebé mai ho fan. És opcional. I principal és l'única funció per a la qual és opcional. Si no torna res de principal, se suposa que la intenció de tornar 0. Preguntes? Bé. Així que ara el segon problema. "Recordeu que en la segona conferència 2 setmanes d'intercanvi de valors que les variables de 2 'en passar aquests dos variables a una funció (encara que hagi estat convocada swap) no és exactament funciona, si més no sense 'punters' ". I fer cas omís dels punters fins que arribem a ells. Volem intercanviar dues variables, no estem utilitzant una funció per fer-ho. Encara farem en principal com es diu. Però per utilitzar aquests 2 variables, no volem utilitzar una variable temporal. Hi ha dues maneres de fer això. Es pot fer ús dels seus operadors binaris tradicionals. Així que algú sap una manera ràpida i bruta de fer això? En realitat, pot trigar un minut de pensar. Si tinc - Vaig a posar el problema a dalt com l'hi pregunten. Així que si tinc dues variables, A, que és simplement un enter que em donen, i B suma variable, que és un altre nombre enter que em donen. Així que si tinc aquestes 2 variables, ara vull intercanviar-les. El tradicional, usant els seus operadors binaris regulars, és a dir, com +, -, ÷. No bitwise operadors que actuen en binari. Així que usant -, +, ÷, i tots aquests. Podríem canviar fent alguna cosa com a = a + b, i b = a - b, a = a - b. Per tant, el seny xec, i després veurem per què funciona. Diguem que a = 7, b = 3, llavors a + b serà 10. Així que ara estem establint a = 10, i després fem b = a - b. Així que estem fent b = a - b, que serà 7, i b = a - b de nou, oa = a - b. Que serà de 10 - 7, que és 3. Així que ara, amb raó, era "un '7, b tenia 3 anys, i ara és de 7 i b 'a' és 3. Perquè tipus de sentit, 'a' és la combinació dels números 2. En aquest moment, "a" és la combinació, i llavors estem restant el b original, i llavors estem restant el que va ser l'original "a." Però això no funciona per a tots els nombres. Per veure això, considerem un sistema, de manera que normalment passa sencers com 32 bits. Treballarem en una cosa que és només com 4 bits. Espero arribar a un bon exemple en aquests moments. Així que, ho sé, això serà fàcil. Diguem que els nostres 2 números són 1111 i 1111, pel que estem en binari en aquests moments. En dècimes reals, si vostè vol pensar d'aquesta manera, a. = 15 i b = 15 I el que esperem, després que els swap - que ni tan sols han de ser els mateixos números, però ho vaig fer d'aquesta manera. Fem que ells no els mateixos números. Farem 1111 i 0001. Així que a = 15 i b = 1. Després de canviar-los, esperem que 'a' igual a 1 i b per ser 15. Per tant el primer pas és a = a + b. Els nostres números són només 4 bits d'ample, de manera que 'un', que és 1111, + b, que és 0001, acabarà sent 10000, però només tenim 4 bits. Així que ara a = 0. I ara volem fixar b = a - b - de fet, segueix funcionant a la perfecció. a = a - veurem si això funciona perfectament - b. Així llavors b = 0 - 1, que encara seria 15, i llavors a = a - b, que seria 1. Potser això funciona. Sento que hi ha una raó que no funciona amb regularitat. D'acord, de manera que treballar en el cas que no funciona amb operacions binàries regulars, i vaig a buscar - Vaig a buscar a Google per veure si això és cert. Per això volem fer-ho mitjançant operadors bit a bit, i la clau aquí és XOR. Per tant, la introducció de XOR (^) si vostè no ho ha vist encara. És, de nou, un operador bit a bit pel que actua poc a poc, i és - Si vostè té els bits 0 i 1, llavors això serà 1. Si vostè té els bits 1 i 0, que serà 1, té els bits 0 i 0 serà 0, i si vostè té els bits 1 i 1 serà 0. Així que és com OR. Si qualsevol dels bits són veritables, és 1, però a diferència d'O, no poden ser els dos bits que són veritables. O hauria aquest ser 1, XOR tindria aquest ser 0. Així que anem a voler utilitzar XOR aquí. Penseu en això per un minut, vaig a Google. Bé, no es pot llegir que, estic actualment a la pàgina XOR algorisme d'intercanvi. Esperem que això explica per què no puc - Aquest és exactament l'algoritme que acabem de fer. Segueixo sense veure per què - Tinc que acaba de recollir un mal exemple, però aquest cas on 'a' passar a convertir-se en 0, després d'arribar a 5 bits, de manera que ara 'a' és 0, això és el que es diu "desbordament sencer". Segons Viquipèdia, "A diferència de la permuta XOR, aquesta modificació requereix que fa servir alguns mètodes per garantir que x + i no causa un desbordament de sencer. " Així que aquest té problemes, el que va ser desbordament de sencer, però vaig fer alguna cosa malament. No estic segur. Vaig a tractar d'arribar a un altre. [Estudiant] Bé, no és de desbordament de sencers quan vostè està tractant de posar un nombre a allà més gran que la quantitat de bits que s'han assignat? Si. Disposem de 4 bits. Això és - teníem 4 bits, que a continuació, intenta afegir 1 a la mateixa, de manera que acabem amb 5 bits. Però el cinquè bit només es talla, sí. En realitat, might - [Estudiant] Això et generarà un error, o ha de - que llançaria un error? No Així que no hi ha error. En arribar al nivell d'acoblament, una mica especial en algun lloc s'estableix que deia que hi havia un excés de capacitat, però en C quin tipus de només no s'ocupen d'això. Segur que no pot ocupar-se'n a menys que utilitzi les instruccions especials de muntatge en C. Pensem intercanvi XOR. I crec que l'article de Wikipedia també podria haver estat dient que - Per tant, també va plantejar l'aritmètica modular, així que suposo que era, en teoria, fer aritmètica modular quan vaig dir que el 0 - 1 és 15 de nou. Així que en realitat podria - en un processador regular que Fa 0 - 1 = 15. Ja que acaben en 0, es resta 1, de manera que llavors, només s'embolica de nou cap 1111. Així que aquest algorisme podria funcionar, el a + b, el a - b, b - a, que podria estar bé. Però hi ha alguns processadors que no ho fan, pel que no estaria bé en aquells específics. Intercanvi XOR funciona en qualsevol processador. Bé. La idea és que se suposa que ha de ser el mateix, però. On estem utilitzant XOR per aconseguir d'alguna manera la informació de tots dos en 1 de les variables, i després extreure la informació de les variables individuals de nou. Així que algú té idees / resposta? [Resposta Estudiantil, inintel · ligible] Així que això hauria de funcionar, i també, XOR és commutativa. Independentment de quin ordre aquests 2 nombres resulten ser a aquí, Aquest resultat serà el mateix. Així que a ^ b és b ^ a. Vostè també pot veure aquest escrit com una ^ = b, b = a ^, a ^ = b de nou. Així que això és el correcte, i veure per què això funciona, pensi en els bits. L'ús d'un nombre més aviat petit, diguem 11001, i 01100. Així que això és 'a', el que és b. Així que a ^ = b. Serem la creació 'a' = a la XOR d'aquestes 2 coses. Així 1 ^ 0 és 1; 1 ^ 1 és 0; 0 ^ 1 és 1, i 0 ^ 0 és 0; 1 ^ 0 és 1. Així que 'a,' si ens fixem en el nombre decimal, que serà - no veuràs molt de la relació entre l'original 'a' i el nou 'a,' però mirant als bits, 'a' és ara com una malla de la informació tant de l'original 'a' i b de l'original. Així que si prenem b ^ a, veiem que anem a acabar en l'original 'a'. I si prenem l'original 'a' ^ el nou 'a,' veiem que acabem al b original. Així que (a ^ b) ^ b = l'original 'a.' I (a ^ b) ^ a = b original. No és - una altra forma de veure això és una cosa en si XOR és sempre 0. Així 1101 ^ 1101, tots els bits serà el mateix. Així que mai serà un cas en què 1 és un 0 i l'altre és 1. Així que això és 0000. El mateix amb això. (A ^ b) ^ b és com un ^ (b ^ b). (B ^ b) serà 0, a ^ 0 és només serà "a", ja que tots els bits són 0. Així que els únics que estaran on 'a' va ser originalment un 1 - tenia uns. I la mateixa idea aquí, jo estic bastant segur que és també commutativa. Si. Jo he dit abans que era commutativa. El ^ 'a,' i és associativa, així que ara (b ^ a) ^ a. I podem fer b ^ (a ^ a). I així, una vegada més, obtenim el b original. Així que 'a' és ara la combinació de 'A' i B junts. Amb el nostre nou combo 'a' diem b = combo 'a' ^ b l'original, obtenim l'original 'a.' I ara un combo = 'a' ^ b del nou, que era l'original - o el que és ara el que era 'a' o b. Aquest és el cas aquí. Això és = b, b edat. Així que ara tot està en l'ordre canviat. Si en realitat es veia en els bits, b = a ^ b, serà XOR aquests 2, i la resposta serà això, i llavors a = a ^ b es XORing aquests 2 i la resposta és la següent. Preguntes? Bé. Així que l'últim és una cosa molt més difícil. [Estudiant] Crec que té un dubte sobre això. >> Oh, ho sento. [Estudiant] Què és realment més ràpid? Si utilitza aquest XOR, o és si es declara una nova variable? Llavors, què és més ràpid, es declara una nova variable o utilitzar XOR a canviar? La resposta és, amb tota probabilitat, una variable temporal. I és que una vegada que es compila sota - de manera que en el nivell d'acoblament, no hi ha tal cosa com variables locals o variables temporals o de qualsevol d'aquestes coses. Són com - no hi ha memòria, i hi ha registres. Els registres són on les coses estan passant activament. No afegiu 2 coses a la memòria, afegir 2 coses en els registres. I portar coses de la memòria en els registres per després afegir, i llavors vostè pot tornar a posar-los en la memòria, però tota l'acció succeeix en els registres. Així que quan vostè està utilitzant l'enfocament variable temporal, en general el que passa és aquests 2 números ja són als registres. I després, a partir d'aquest moment, després d'haver-los canviat, només vaig a començar a utilitzar l'altre registre. En qualsevol lloc on havia estat utilitzant b, només es farà servir el registre que ja estava emmagatzemant 'a'. Per tant, no necessita fer res per fer realitat l'intercanvi. Sí? [Estudiant] Però també requereix més memòria, no? Només seran més memòria si cal emmagatzemar aquesta variable temporal. Com si després usa aquesta variable temporal de nou en algun lloc, llavors - o s'assigna alguna cosa a aquesta variable temporal. Així que si en algun moment en el temps 'a,' b en temperatura tenen valors diferents o alguna cosa així, llavors tindrà posicions diferents en la memòria, però és cert que hi ha moltes variables locals que només existeixen en registres. En aquest cas, mai s'ha posat en la memòria, i per això mai està perdent la memòria. Bé. L'última pregunta és una mica més. Així que aquí, en aquest aparell CS50, hi ha un diccionari. I la raó d'això és perquè [? B66] és un corrector ortogràfic en què estarà escrivint utilitzant taules hash o tracta o alguna estructura de dades. Vostè estarà escrivint un corrector ortogràfic, i vostè estarà usant aquest diccionari per fer-ho. Però per aquest problema, només anem a mirar cap amunt per veure si una paraula està al diccionari. Així que en lloc d'emmagatzemar tot el diccionari d'alguna estructura de dades i mirant per sobre de tot un document per veure si alguna cosa està malament escrit, només volem trobar una paraula. Així que només pot escanejar a través de tot el diccionari i si no es troba la paraula en el diccionari sencer, llavors no hi era. Si escanejar a través de tot el diccionari i veig la paraula, llavors estem bé, que el trobem. Aquí diu que volem començar a buscar al carrer de maneig d'arxius de funció, ja que volem llegir el diccionari, però vaig a donar la recepta aquí pel que fa a les funcions que ha de pensar. Vaig a escriure sobre Spaces. Així que els principals que hauríeu mirar f s'obre i després, inevitablement, f tancat, que anirà al final del seu programa, i f f exploració. També pot utilitzar f llegir, però és probable que no vulgui ja que - vostè no acabi sobre de necessitar això. F exploració f és el que vas a utilitzar per escanejar a un diccionari. I el que no és necessari codificar la solució, només tracte i com pseudocodi de la forma a una solució, i després anem a parlar-ne. I, de fet, ja que ja et va donar aquests, si vas a qualsevol terminal o intèrpret d'ordres del seu aparell, Jo - Jo sòl - si vostè no ha vist encara, no sé si ho has fet a classe, però l'home, de manera que les pàgines de manual, són molt útils per observar gairebé qualsevol funció. Així que puc fer, com, f home, escaneig f. Aquesta és ara la informació sobre la família f exploració de les funcions. Jo també podria fer f home, obert, i que em donarà els detalls d'això. Així que si vostè sap quina és la funció que està utilitzant, o que vostè està llegint el codi i veus alguna funció i vostè és com, "Què fa això?" Només l'home que la funció de nom. Hi ha un parell d'exemples rars on és possible que hagi de dir agrada. man 2 que el nom de la funció, o man 3 que el nom de la funció, però només has de fer que l'home si el nom de la funció no li passi a treballar per primera vegada. [Estudiant] Així que m'estic llegint el manual per obrir, però encara estic confós sobre com usar-lo i el programa. Bé. Moltes de les pàgines del manual són menys que útils. Són més útils si ja saben el que fan i després només ha de recordar l'ordre dels arguments o alguna cosa així. O se li pot donar un panorama general, però alguns d'ells són molt aclaparador. Com f exploració f, també. Et dóna la informació per a totes aquestes funcions, i una línia que passa per aquí per dir, "F exploració f llegeix des del punt cadena o un rierol." Però f obrir-la. Així que, com fem servir f obert? La idea d'un programa que ha de fer l'arxiu d'E / S que primer ha d'obrir l'arxiu que volem fer les coses amb, i inevitablement, llegir coses d'aquest arxiu i fer coses amb ells. F obert és el que fem servir per obrir el fitxer. El que tornem, i un arxiu volem obrir, ens dóna la - aquí es diu "/ user / share / dict / words". Aquest és el fitxer que voleu obrir, i volem obrir - hem de especificar explícitament si volem obrir per llegir o si volem obrir-lo a escriure. Hi ha un parell de combinacions i aquestes coses, però volem obrir aquest per a la lectura. Volem llegir des del fitxer. Llavors, què fa aquest canvi? Es torna un arxiu d'estrella (*), i només vaig a mostrar tot en la variable f, de manera *, de nou, és un punter, però no volem fer front als punters. Vostè pot pensar en com f, f és ara la variable que s'utilitzarà per representar l'arxiu. Així que si vostè vol llegir l'arxiu, llegeix de f. Per tancar el fitxer, tanca f. Així que al final del programa, quan inevitablement vol tancar l'arxiu, què hem de fer? Volem tancar f. Així que ara la funció d'últim arxiu que voldrem utilitzar és l'escaneig f, f f exploració. I el que fa és que analitza l'arxiu a la recerca d'un patró que correspongui. Quant a la pàgina del manual aquí, veiem que f int f exploració, ignorar el valor retornat de moment. El primer argument és el corrent * arxiu, de manera que el primer argument que anem a voler passar és f. Estem explorant sobre f. El segon argument és una cadena de format. Et donaré una cadena de format en aquests moments. Crec que ens va passar a dir: 127S \ n, que molt d'això és innecessari. La idea del que aquesta cadena de format és, és que es pugui imaginar f exploració com l'oposat a la f impressió. Així impressió f, f impressió que també utilitzen aquest tipus de paràmetre de format, però en f impressió del que estem fent és - donem una ullada a un equivalent. Així imprimir f, i de fet hi ha també f impressió f, on el primer argument serà f. Si imprimiu f, podríem dir alguna cosa com, "print 127S \ n" i després, si li passem una mica de corda, que voleu imprimir aquesta cadena i després una nova línia. Què significa 127, estic bastant segur, però mai m'he limitat a ella, Ni tan sols hauria de dir '127 'al f impressió, però el que significa és imprimir els primers 127 caràcters. Així que estic bastant segur que és així. Vostè pot buscar a Google per això. Però en la següent estic gairebé segur que significa això. Així que això és imprimir els primers 127 caràcters, seguit d'una nova línia. F exploració f ara, en lloc de mirar a una variable i d'imprimir, que va a veure una mica de corda, i emmagatzemar el patró en la variable. Utilitzarem realment f exploració en un exemple diferent. Així que anem a dir que vam tenir algun tipus int x = 4, i volíem crear una cadena feta de - va voler crear la cadena que era com, aquest vindrà molt més tard, una cosa que és com 4.jpg. Així que això podria ser un programa on tindrà comptador suma, Resumint contrarestar i, i desitja estalviar un munt d'imatges. Així que vostè vol estalviar i.jpg, on i és una mica iteració del bucle. Llavors, com fem perquè aquesta cadena JPEG? Si vols imprimir 4.jpg, podríem dir f impressió, d.jpg%, i llavors s'imprimeix perquè JPEG. Però si volem salvar el 4.jpg cadena, utilitzem f exploració. Així que la cadena es - en realitat ens puc - caràcter, char s, anirem 100. Així que m'acaba de declarar algun arranjament de 100 caràcters, i això és el que estem inevitablement va a emmagatzemar aquesta JPEG polz Així que farem servir f escanejat i el format, com diríem d.jpg% per tal d'imprimir 4.jpg, el format d'aquest serà d.jpg%. Així que el format és d.jpg%, el que vol reemplaçar amb% d és x, i ara hem de guardar aquesta cadena en algun lloc. I on anem a emmagatzemar aquesta cadena està a la matriu s. Així que després d'aquesta línia de codi, s, si imprimim f, s% s de la variable, que voleu imprimir 4.jpg. Llavors f exploració f és la mateixa que scan f, excepte que ara veu cap al arxiu per la qual cosa per emmagatzemar en s. Això és el que l'últim argument serà. Volem guardar - "família f Scan d'exploracions funcions mentre d'acord amb el format que va tractar a continuació. Si s'emmagatzemen en els punts d'ubicació podria tornar - " No, pot ser bo. Deixa pensar per un segon. Així exploració f no ho fa - què diables és la funció que fa això? Així exploració f no es prendrà un enter i fer punt jpg. Va a [murmura]. Guardar variable int en cadena int C. Què és aquesta variable, o el que és aquesta funció es diu? Sí Això és - si. Així que el que es defineix a vostè abans era s f impressió, que - que té molt més sentit, per què em va dir que era molt més semblant f impressió. Scan f és encara una espècie de f impressió, però f s d'impressió es va a escanejar i substitueixi les variables i ara s'emmagatzemen en una cadena. En lloc d'imprimir, l'emmagatzema en una cadena. Així que ignora que del tot. Vostè encara pot pensar en l'especificador de format com el de f impressió. Així que ara, si volíem fer el 4.jpg, faríem f s d'impressió, x d'això. Llavors, què està fent exploració f - Quin era la teva pregunta serà? [Estudiant] Estic confós sobre el que estem tractant de fer aquí amb que JPEG. Es pot explicar que un cop més? Així que aquesta va ser - és menys relevent d'exploració f f ara, amb sort, s'unirà de nou en algun tipus de camí. Però el que inicialment tenia la intenció de mostrar era - és en realitat directament relacionats amb aquests [? F5] Vas a estar usant f s d'impressió, on, diguem que tenim 100 imatges, i vols llegir la imatge 1.jpg, 2.jpg, 3.jpg. Així que per fer això, ha de f obert, i llavors vostè ha de passar a la cadena que voleu obrir. Així que ens agradaria obrir 1.jpg, amb la finalitat de crear la cadena que és 1.jpg, fem s f impressió de% d.jpg--no ho vam fer per int i = 0. i <40, i + +. Així impressora% s f d.jpg d'i. Així que després d'aquesta línia, ara la variable o l'arranjament s va a 1.jpg. O 0.jpg, 1.jpg, 2.jpg. Per això es pot obrir, al seu torn, cada imatge per llegir. Així que això és el que es imprimir f fa. Veus el que es imprimir f està fent ara? [Estudiant] Bé, pel que està prenent - crea una cadena, something.jpg, a continuació, el guarda. Sí Crea - aquesta és una altra cadena de format, igual que f f escaneig i d'impressió, on s'insereix totes les variables en el segon argument, podria ser s en lloc de i. Potser - vull dir, aquest és el cas. Però sigui quin sigui l'ordre dels arguments és. Es va a introduir totes les variables en la cadena de format i després emmagatzemar al nostre buffer, l'anomenem un buffer, que és on s'està emmagatzemant la cadena. Així que estem emmagatzemant dins de la cadena s amb el format correcte,% d d'haver estat substituït per 4. [Estudiant] Per tant, si fem això, és la variable f només serà reassignat? Sí Així que hem de tancar la f original abans de fer això. Però - i després també, si no hi hagués un f obrir aquí, llavors hauríem de dir - Si. Però seria obrir un centenar d'arxius diferents. [Estudiant] No obstant això, no seria capaç d'accedir o - bé. Bé. Així exploració f, f exploració f, és una espècie de la mateixa idea, però en comptes de, en lloc d'emmagatzemar-se en una cadena, és més com estàs ara repassant una punxada i una coincidència de patrons en contra d'aquesta cadena i emmagatzemar els resultats en variables. Vostè pot utilitzar f exploració per analitzar per alguna cosa així 4.jpg i emmagatzemar el nombre sencer en 4 x int suma. Això és el que es pot utilitzar per exploració f. F f exploració farà que en la línia d'ordres. En realitat estic bastant segur que això és el que la biblioteca CS50 fa. Així que quan vostè diu, "get int," és escanejat f-ing sobre - f exploració és la manera com rep la entrada de l'usuari. F f exploració que farà el mateix però usant un arxiu a escanejar de nou. Així que aquí estem explorant sobre aquest arxiu. El patró que estem tractant de coincidir amb alguna cadena que és de 127 caràcters de longitud seguit d'una nova línia Així que estic bastant segur que podríem fins i tot a dir "match s", ja que al diccionari passa que tenim, no està garantit que la paraula és llarga, i f f exploració, crec, no s'aturarà davant la nova línia no importa què. Però anem a incloure la nova línia en el partit, i - [Estudiant] Si no incloem la nova línia, no ho trobaria parts d'una paraula? It - totes - vegeu el diccionari - Així, al diccionari, es tracta de totes les nostres paraules. Cada un està en una nova línia. F L'anàlisi es va a recollir aquesta paraula. Si no incloem la nova línia, llavors és possible que la següent exploració f només llegirà la nova línia. Però fins i tot llavors només nova línia passarà per alt la nova línia. Però mai obtindrem part d'una paraula, ja que sempre estem llegint a una nova línia, no importa el que passi. [Estudiant] Però el que a trobar la paraula "Cissa," com Cissa. Va a trobar això, i dir que és una coincidència? Així que aquí estem - es llegeix en - això és realment un bon punt. Mai estem usant la corrent - la paraula que estem buscant és l'argument de comandament de primera línia. Així cadena, paraula = argv 1. Així que la cadena que estem buscant és argv 1. No estem buscant una paraula en absolut en la nostra f exploració. El que estàvem fent amb l'exploració f està aconseguint cada paraula al diccionari, i després una vegada que tinguem aquesta paraula que farem servir strcmp per comparar. Anem a comparar la nostra paraula i el que acabem de llegir polz Per tant, inevitablement, anem a acabar fent un munt d'exploració fs fins que dóna la casualitat que f exploració tornarà - ha de retornar un, el temps que ha coincidit amb una nova paraula, i tornarà una altra cosa tan aviat com s'han aconseguit arribar a la paraula. Estem llegint el diccionari sencer, emmagatzemar línia a línia cada paraula en la variable s. Llavors estem comparant paraula amb s, i si la comparació == 0, strcmp passa a portar 0 si un partit es va fer. Així que si ho va ser de 0, llavors podem imprimir f, aparellat, o paraula al diccionari, o el que vostè desitgi imprimir f. I llavors - que no volen f tancar una i altra vegada. Aquest és el tipus de coses que volem fer, i no estem només a la recerca de la paraula en el diccionari. Així que podríem fer això, si volguéssim buscar el seu patró, Cissa, com vas dir abans, si volguéssim buscar aquest patró, llavors seria fallar en el cas perquè això no és realment una paraula, sinó una de les paraules en el diccionari que passa a tenir-hi. Pel que correspondria amb aquesta paraula, però aquest subconjunt de la paraula no és una paraula en si. Però aquesta no és la forma en què s'estigui utilitzant, estem llegint en cada paraula i després comparar la paraula que tenim amb aquesta paraula. Així que sempre estem comparant paraules completes. Em poden enviar les solucions finalitzades després. Aquesta és una espècie de prop la resposta correcta, crec. [Comentari Estudiant, inintel · ligible] Oh, puc desfer-me d'això abans? Char s, crec que va dir 127 - se m'oblida el que és el més gran. Farem 128, de manera que ara s és prou llarg. No cal imprimir res. També voldrem tenir a prop al nostre arxiu, i que ha de ser sobre la resposta correcta. CS50.TV