[Comentari: Concurs 1] [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Universitat de Harvard] [Aquest és CS50.] [CS50.TV] [Lucas Freitas] Benvinguts tots. Aquesta és una ressenya de prova 1. Així com un descàrrec de responsabilitat, és a dir - vull dir, anem a tractar de cobrir tant material com sigui possible, però això no vol dir que anem a cobrir la totalitat de les coses reflectides a la prova 1. Així que assegureu-vos que vostè també està prenent una ullada a la conferència, seccions, tot el que puguis. Qüestionari 1 serà dimecres dimecres. Així que assegureu-vos d'estudiar. Serà, més o menys, com la primera prova quant al seu format, però que probablement serà molt més difícil. Si més no, l'any passat quan vaig fer 50, vaig pensar que era molt més difícil. Així que estudiar molt. Vaig a cobrir les estructures de dades i la codificació Huffman. Això és una cosa que molta gent pensa que és complex, però vaig a tractar de fer-ho el més fàcil possible. En primer lloc, el que volem que sàpiguen per potser 1 és entendre les descripcions conceptuals de cadascuna de les estructures de dades que presentaré. Això vol dir que vostè no ha de realment implementar una taula hash en el seu concurs 1. No volem que li permet implementar una taula hash sencer, potser anem a tractar perquè s'implementi algunes funcions, les operacions més comuns, però no farem que s'implementi tot. Així que és important que vostè entengui el concepte darrere de cada estructura de dades i també que vostè és capaç de codi en C, només les operacions més comuns que tenen per a cada estructura de dades. I també podrà revisar els punters i estructures, perquè apareixen molt en aquestes estructures de dades. En primer lloc, les llistes enllaçades. Les llistes enllaçades són en realitat molt similars a les matrius, però la diferència entre una llista enllaçada i una matriu, primer de tot, és que una llista enllaçada té una mida molt flexible, mentre que a les matrius el que has de triar una mida molt gran per a la matriu, així que vostè sap que vostè serà capaç d'emmagatzemar totes les dades en la matriu, o has de fer servir malloc per tenir una longitud flexible de la matriu. En les llistes enllaçades és molt fàcil d'obtenir només més elements, posar més elements en la llista enllaçada o treure elements. I, de fet, si vostè no desitja que la llista vinculada a classificar, vostè pot buscar i eliminar elements en temps constant, pel que O (1) vegada, així que és molt convenient. Només has de tenir cura de recordar sempre a malloc i lliure dels nodes, perquè si no ho fa, tindrà pèrdues de memòria. Així llistes vinculades - la definició d'un node és igual que el que tenim aquí. Vaig posar int n, però pot emmagatzemar les dades que desitgi. Així que si voleu emmagatzemar una cadena, que està bé. Per emmagatzemar una estructura, que està bé, un doble, el que vulguis. Acabo de posar int n dels exemples aquí. I vostè té un punter al següent node. Així que, bàsicament, una llista enllaçada té algunes dades, i després apunta al següent node. Si és l'últim element de la llista enllaçada, que va a apuntar a NULL. Així que aquest és un exemple d'una llista enllaçada. Bé, ara anem a veure el que hem de fer si vull inserir un element en una llista enllaçada. En primer lloc, una inserció de la funció serà de tipus void perquè jo no vull tornar res. I em vaig a prendre un int com a argument, perquè vull saber el que vull inserir. Llavors, què és el primer que he de fer? Bé, hauria malloc a nodo_nuevo, pel que és la primera línia. Estic creant un nou node a posar en una llista enllaçada. Llavors, què puc fer? Bé, sabem que a les nostres implementacions de llistes enllaçades a classe, sempre posem el cap com una variable global. Així que el que podem fer és canviar el cap. Puc fer aquest nou node serà el nou cap, i que va a apuntar al capdavant anterior. Com podem fer això? El primer que he de fer és canviar la 'n' al nou node al valor, que va ser passat a la funció. Llavors és nodo_nuevo proper serà el cap. El cap serà nodo_nuevo. Així que és bastant simple. Per eliminar un node, podem fer-ho així - Una manera com podríem fer, és a dir, bé, si volia eliminar, per exemple, 3, el que podria fer és simplement apunt al node anterior al següent node de 3. Així que m'acaba de fer una cosa així. Però quin és el problema de fer això? Tinc una pèrdua de memòria, així que no tenen accés al nombre 3 més. El problema amb això és que jo no seré capaç d'alliberar aquest node. Vaig a tenir pèrdua de memòria i (inintel · ligible) em va a odiar. Així que en comptes de fer això, probablement hauria de tenir un punter temporal. Així que vaig posar temp. Es va a apuntar al node que vull esborrar. I llavors em puc moure els nodes anteriors a punt al següent node del node que vull esborrar. I, finalment, puc alliberar el punter. He de alliberar el punter que he creat allà mateix? Jo no he de, només perquè - la diferència és que aquest node s'ha creat usant malloc, pel que és en el munt, mentre aquest estava declarat com un interruptor NULL a la pila. Així que no he de alliberar-lo. Okay. Així que ara anem a parlar de les piles. Les piles són força senzills. Vam fer piles i cues a la classe simplement utilitzant matrius, però vostè ha d'estar familiaritzat - acaba de ser conscients que també es pot fer piles de cues mitjançant llistes enllaçades també. Així que si vostè té una matriu, el que seria una pila? Una pila, en primer lloc, haurà de tenir una mida. Vostè ha de guardar el que és la mida de la pila que té en aquests moments. I també tindria una matriu, en aquest cas dels nombres, però si vostè vol, pot ser una matriu de cadenes, una matriu d'estructura, qualsevol cosa que desitgis emmagatzemar. Sobre la pila: La diferència entre una pila i una llista enllaçada és que a la pila només té accés l'últim element que es va posar a la pila. Es crida l'última entrada, primera sortida. Igual que vostè té una pila de safates, si vostè posa una safata a la part superior de la pila, has d'eliminar aquesta safata primers a tenir accés a les altres safates. És el mateix amb les piles. Així que si jo vull, per exemple, afegir un element a una pila, què he de fer? Es diu empenta, i és bastant senzill. El primer que has de fer és comprovar si la mida de la pila no és més gran o igual a la capacitat de la pila. Perquè si vostè ja està en plena capacitat, no es pot afegir res més. I llavors, si no és així, només has d'afegir l'element a la pila. I, finalment, incrementar la mida. Així que és bastant senzill. Així que simplement afegir el número 2. I si vull fer esclatar, el que significa que vull treure l'últim element que s'ha afegit i retorna el valor de l'element, la primera cosa que he de comprovar és que la pila no és buida. Perquè si està buit, no puc tornar res. En aquest cas, estic tornant -1. En cas contrari, vaig a disminuir la mida de l'especificació, i tornar els números (s.size). Per què disminuir la mida i després torneu s.size? És perquè, en aquest cas, l'especificació té mida 4, i vull tornar el quart element, no? Però, què és l'índex del quart element? Tres. Ja que la mida - serà 3, no puc tornar s.numbers (s.size) perquè és 3. Així que és només l'índex. Ara cues. Les cues són més o menys la mateixa cosa. L'única diferència és que en comptes de tenir l'última entrada, primera sortida, vostè ha primer que entra, primer que surt. Probablement si vostè està esperant per anar a un concert, que no seria feliç si tingués una pila en lloc d'una cua. En ser l'última persona a arribar seria la primera persona a entrar al concert. Vostè probablement no seria feliç. A la cua, la primera persona a entrar és també la primera persona a sortir. Així que en la definició d'una cua, a més de tenir la mida de la matriu, també cal tenir el cap, que és l'índex del cap de la pila. Així que el primer element en aquests moments. Enqueue és el mateix que l'empenta per a piles. Si vostè era molt ingenu, vostè acaba de dir, bo, jo puc fer exactament el mateix que jo vaig fer per empènyer. Jo només puc comprovar si no és més enllà de la capacitat. Si és així, torneu falsa, en cas contrari només puc exportar el nou valor i després incrementar la mida. Però per què està malament? Vegem aquest exemple. Estic tractant de posar en cua un munt de coses, i després em vaig a treure de la cua i posar en cua. Hi ha un munt d'ordres, però és molt simple. Vaig a posar en cua 5, de manera que afegir 5 i després 7, 1, 4, 6, i després vull treure de la cua alguna cosa, el que significa que em vaig a treure el primer element. Així que em vaig a treure el número 3, no? El primer element. Okay. Ara bé, si jo tracte de posar en cua una mica més, el que va a succeir? D'acord amb la meva aplicació, Anava a posar el següent número de la q.size índex. En aquest cas, la mida és 8, pel que l'índex de 8 estarà aquí en l'última posició. Si tracte de posar en cua 1 aquí, jo estaria d'sobreescriure l'última posició amb el número 1, que és completament equivocat. El que vull fer és embolicar al voltant i veu a la primera posició. Potser vostè acaba de dir, bé, he de comprovar si puc realment posar una mica allà. Si no, jo només dic, oh, la nova capacitat plena és en realitat la capacitat - 1, i no es pot posar un element allà. Però quin és el problema? El problema és que si només Dequeue tot aquí i llavors intento afegir alguna cosa més, seria just dir, així, vostè estava en plena capacitat, que és 0. Així que la seva cua s'ha anat. Vostè ha de embolicar al voltant, i una manera d'embolicar al voltant que vostès apreses en conjunts de processadors i altres visionaris estava usant mod. Pots provar a casa per entendre per què vostè faria q.size + q.head capacitat mod, però si revises aquí, podem veure que funciona. Així, en l'últim exemple, q.size era agost i el cap va ser d'1, perquè va ser aquesta posició aquí de la matriu. Així que serà 8 + 1, 9. Capacitat Mod 9 seria 0. Aniria a l'índex 0. Estarem en la posició correcta. I a continuació, proveu la cua a casa. Algunes coses importants: tractar d'entendre la diferència entre una pila i una cua. A casa, tracti d'obtenir molt familiaritzat amb la implementació de posada en cua, treure de la cua, empenta i pop. I també entendre quan pot utilitzar cada un d'ells. Així que relaxa't durant 10 segons amb un munt de Pokémons. I ara tornarem a les estructures de dades. Taules hash. Un munt de gent estava espantada de les taules hash. en problemes 6, corrector ortogràfic. Les taules hash i tries, molta gent s'espanta d'ells. Ells pensen que són tan difícil d'entendre. Sí? [Rob Bowden] Butlletí de problemes 5. Butlletí de problemes 5, si. Gràcies Rob. Sí Sis era Huff n 'Puff, si. Problemes 5 va ser corrector ortogràfic, i ha hagut d'utilitzar una taula hash o una oportunitat. Molta gent va pensar que eren molt difícils d'entendre, però són en realitat força simple. Què és una taula hash, bàsicament? Una taula hash és un conjunt de llistes enllaçades. L'única diferència entre una matriu i una taula hash és que a la taula hash té alguna cosa que es diu una funció hash. Què és una funció hash? No sé si vostès poden llegir aquí. Aquest és un exemple d'una taula hash. Així es pot veure que té una matriu amb 31 elements. I el que fem en una taula hash es té una funció hash que es va a traduir una clau, cada int a un índex. Si, per exemple, si vull triar per B. Harrison, Jo posaria B. Harrison en les meves funcions de hash, i la funció hash tornaria 24. Així que sé que vull per emmagatzemar B. Harrison en 24. Així que aquesta és la diferència entre simplement tenir un conjunt i amb una taula hash. A la taula hash tindrà una funció que es dirà on emmagatzemar les dades que voleu emmagatzemar. Per a la funció de hash, que vol buscar una funció hash és determinista i ben distribuïda. Com es pot veure aquí, veurà que moltes de les dades que jo volia a la botiga era en realitat 19 en comptes d'usar 31 i 30 i 29, que eren tots de forma gratuïta. Així que la funció hash que vaig usar no estava molt ben distribuïda. Quan diem ben distribuïts, vol dir que volem tenir, més o menys, almenys 1 o 2 per a cada un dels - com, una diferència d'1 o 2 per a cada un dels índexs en les matrius. Vostè vol tenir, més o menys, el mateix nombre d'elements en cada llista enllaçada de la matriu. I és fàcil de comprovar si és vàlid en la taula hash, veure com les taules hash. Llavors arbres. Aquest és un arbre. Arbres en ciències de la computació estan a l'inrevés, per alguna raó. Així que aquí tens l'arrel de l'arbre i després les fulles. Vostè només ha de conèixer la nomenclatura dels pares i el nen. Cada node té els seus nens, que són els nodes que estan sota la matriu. Així, per exemple, 2 serà el pare de 3 i per l'altre nen allà, mentre que el 3 serà el pare de 1 i els altres nens que hi són. I 1 serà un fill de 3, i així successivament. Tenim alguna cosa molt més interessant, es diu un arbre de cerca binària, en la qual tots els valors de la dreta d'un node estaran a la dreta, a la dreta aquí - a la dreta, seran més gran que l'element a l'arrel. Així que si tinc el número 5 aquí, tots els elements de la dreta seran més gran que 5, i al costat esquerre tots els elements seran inferior a 5. Per què és útil? Bé, si jo vull comprovar si el número 7 ja és aquí, per exemple, Acabo d'anar a 5 primer i jo vaig a veure, és 7 més o menys de 5? És més, així que sé que va a haver d'estar a la dreta de l'arbre. Així que tinc molt menys coses a veure. En l'aplicació d'un arbre de cerca binària, el node, només vaig a haver de disposar de dades, així int n; vostè també podria tenir una cadena o qualsevol cosa que volguessis. Només has de tenir cura en la definició del que sigui més gran, el que sigui menor. Així que si vostè tenia cordes, per exemple, es podria definir que totes aquestes coses a la dreta tindran major longitud, l'esquerra tindran longituds inferiors, pel que és realment depèn de tu. Com puc aplicar per trobar BST? El primer que haurem de fer és comprovar si l'arrel és NULL. Si és NULL, vol dir que la cosa no està allà perquè no tenen ni tan sols un arbre, no? Així que torno falsa. En cas contrari, vaig a comprovar si el nombre és més gran que el valor en l'arrel. Vaig a tractar de trobar l'element de la dreta l'arbre. Ja veus que estic fent servir aquí la recursivitat. I després, si és menys, vaig a mirar a l'esquerra. I, finalment, en cas contrari, si no és menys o no major, això significa que és el valor en si. Així que em torno cert. Vostè pot veure aquí que vaig fer servir si, si, si. I recorda, en prova 0, vam tenir un problema que tenia, si, si, si, i que se suposa que trobar la ineficiència, i la ineficiència va ser que va utilitzar si. Hauries d'haver usat si, else if, else if i else. Per tant, he d'utilitzar else if i else if i més aquí? Algú - Sí? [Parlant d'Estudiants, inaudible] És perfecte. Així que està dient que no importa, només perquè la ineficiència que teníem abans va ser que pel fet que, potser, si alguna condició se satisfà, el que ha portat a terme una acció, però després anaves a comprovar totes les altres condicions. Però en aquest cas, va tornar immediatament, pel que no importa. Així que vostè no ha de fer servir else if. I, finalment, parlarem d'intents, que és de tots favorit. Un try és un arbre de matrius. És molt ràpid per buscar valors, sinó que utilitza una gran quantitat de memòria. I és en general per filtrar les paraules, així que quan vostè desitgi implementar, per exemple, no sé, com un llibre de telèfon al seu telèfon i vol ser capaç d'escriure B i només tenen els noms de les persones que tenen B. És molt fàcil d'implementar que l'ús d'un intent, per exemple. Com es defineix un node en una oportunitat? Vostè només ha de tenir un bool que serà is_word. Això representa que l'ús de tots els caràcters abans d'aquest node, que van ser capaços de formar una paraula, i llavors vostè té una matriu de punters a nodes. Pots veure que tenim una sèrie de nodes pare, de manera que el node * array? Sí? Així que anem a veure com funcionarà. Per a la correcció ortogràfica, tenim una sèrie de 27 elements, perquè tenim totes les cartes més l'apòstrof. Abans que aquí només vaig a utilitzar 2 perquè vull ser capaç d'escriure a la pissarra. Okay. Així que aquest és un exemple d'un intent. Si acabo de definir el primer node, vaig a tenir una matriu de 2 elements que són 2 punters a NULL, així que només cal posar 'a' i 'b'. I jo vaig a tenir un bool que diu is_word. Serà fals per al primer, només perquè, abans que vostè no té cap caràcter. Així que una paraula buida no és una paraula. Pel que és fals. Si vull afegir 'a' a aquest diccionari, què hauria de fer? Només vull que malloc un nou node per 'a', i després afegir la seva paraula de veritat. Pel que només representa que l'haver 'a' serà veritat. Té sentit? Llavors, si vull afegir 'ba', hauré de malloc 1 per a 'b', i després vaig a configurar el booleà a false, perquè 'b' per si mateix no és una paraula. Llavors vaig a malloc altre per 'a', de manera que "ba ', i després vaig a crear és una paraula de veritat. Perquè 'ba' és una paraula. I llavors, si vull veure si 'b' es troba en aquest diccionari, Jo només puc anar a la primera, 'b'. Caic, i jo miro és la paraula, i diu falsa. Així que no és una paraula. Si jo vull comprovar 'ba', Vaig a la primera, 'b', i després vaig a la 'a', i veig cert, pel que és una paraula. Té sentit? Un munt de gent es confongui per intents. No? Finalment, la codificació de Huffman. La codificació de Huffman és molt útil per estalviar memòria i comprimir arxius de text, només perquè un munt de vegades que utilitzi 'a' i 'e', ​​per exemple, en els seus documents, però no sé si vostès utilitzar 'q' o 'z' com a molt. Tenir sols 1 byte per a cada caràcter individual, tots i cada un - els 256 caràcters que tenim a la taula ASCII no és molt òptima, només perquè hi ha alguns caràcters que s'utilitzen molt més, pel que és millor fer servir menys memòria per a aquells. Com s'utilitza la codificació de Huffman? Hem de fer un arbre de Huffman.  Un arbre de Huffman té nodes que tenen un símbol que serà com, 'a', 'b', 'c', la carta, la lletra que vostè té, una freqüència que és la freqüència que apareix la paraula en el text, que estigués creant l'arbre de Huffman per, i tot seguit, un node que es va a punt a l'esquerra de l'arbre de Huffman i un altre node que es va a assenyalar a la dreta. Així com un arbre. Com es construeix un arbre de Huffman? Vostè va a escollir als 2 nodes que tenen les freqüències més baixes. Si vostè té un llaç que va a recollir els 2 nodes que tenen els valors ASCII més baixos també. Llavors vostè va a crear un nou arbre dels 2 nodes que tindrà la freqüència combinada en el node principal. I després et vas a treure els 2 fills de la selva i reemplaçar amb els pares. I vostè va a repetir fins que només té 1 arbre al bosc. Així que anem a veure com ho faria un arbre de Huffman per ZAMYLA. Vostè pot veure aquí que totes les lletres tenen freqüència 1 a excepció de 'A', que té la freqüència 2. Així que he creat nodes per a totes les cartes que poso en ordre de valor ASCII i freqüència. Així que si vull crear el primer arbre, serà per 'L' i 'm'. Així que és aquí. La freqüència del parell serà 2 perquè és 1 + 1, llavors el proper 2 amb les freqüències més baixes són 'I' i 'Z'. I després he de ser tots ells - tenen una freqüència de 2. Així que quins són els que tenen el valor ASCII baix per a la pròxima? 'A' i 'L'. Així que crec el nou node, i, finalment, és 4 i 2, pel que 2 estarà a l'esquerra. I aquest és l'arbre de Huffman. Llavors, si vull escriure alguna cosa de text, com en binari per convertir text, utilitzant l'arbre de Huffman és molt fàcil. Per exemple, si jo dic que el pas a l'esquerra és un 0 i movent-se a la dreta hi ha un 1, Què és això d'anar a representar? Així com 1, 1, tan a la dreta, a la dreta, i després 0, de manera que seria l'esquerra L, i després 1, 0, 0. Així 1, 0, de manera que només 1, 0, 'A'. I a continuació, 0, 1, de manera que 'Z'. I a continuació, 1, 0, 0 - no. 0, 0 serà 'I', per mandrós. Així que això és tot per a mi, Rob va a prendre el relleu. [Rob Bowden] Així, la setmana 7 coses. Tenim molt per anar molt ràpid. Operadors bit a bit de desbordament de memòria intermèdia, Biblioteca CS50, a continuació, HTML, HTTP, CSS. En definitiva, com 15 a 20 minuts. Operadors bit a bit. Hi ha 6 d'ells que vostè necessita saber. Bit a bit i bit a bit OR, XOR, desplaçament a l'esquerra, desplaçament a la dreta, i no. Desplaçament a la dreta i no només va veure en la conferència en absolut. Anem a repassar ràpidament aquí, però és bo saber que aquests són els 6 que existeixen. Recordeu que els operadors bit a bit són com quan fas 3 + 4. No està tractant amb el binari de 3 i 4. Amb els operadors bit a bit en realitat s'està tractant amb els bits individuals dels números 3 i 4. Així que el primer que direm és bit a bit no, i tot el que fa és girar tots els bits. Així que aquí, si vostè està escrivint això en C, vostè ho escrigui com ~ 11011 o el que sigui, podria escriure se sent ~ 4, i llavors seria voltejar la representació binària de 4. Així que aquí, ~ d'un nombre binari 1101101 es va a donar la volta exactament tots els de 1 a 0 dels 0 i l'1 de. Com dic allà, l'ús freqüent d'aquesta, i ho veurem en una estona, és com volem arribar a algun nombre on tots els bits són 1, a excepció d'un d'ells. Així que en general és més fàcil expressar el nombre on es troba a què sol bit, i després prendre el ~ de la mateixa, de manera que cada altre bit està establert a excepció d'aquell. Així que això és el que utilitzarem més en una estona. OR bit a bit. Aquí hi ha 2 nombres binaris, i aquests 2 números són prou representativa, ja que representen cada possible combinació de bits que pot ser que hagi d'operar. Aquí, quan or'd cada bit, només anem a comparar directament cap avall. Així que a la banda esquerra tenim un 1 i 1 gen. Quan bit a bit | aquests, què vaig a rebre? Una. Llavors bit a bit | 0 i 1 em donarà? Una. Bit a bit 1 i 0 que serà el mateix, un. Bit a bit 0 | 0 em donarà 0. Així que l'únic cas en el que em surt és 0 en el 0 | 0 cas. I es pot pensar que igual que els seus alcaldes lògiques. Així que si vostè pensa en 1 com a veritable i 0 com a fals, el mateix s'aplica aquí. Tan cert o veritable és veritable, veritable o fals és veritat. Fals o veritable és veritable, fals o fals és l'únic que en realitat és fals. Aquí està l'exemple que vostè ha de saber com un bon exemple de quan es fan servir els operadors bit a bit. Aquí si nosaltres o 'A' majúscula amb OX20, i anem a veure això en un segon, tenim alguna cosa. I si nosaltres o minúscula "a" amb OX20, vam aconseguir alguna cosa. Així que anem a tirar cap amunt la taula ASCII. Okay. Aquí veiem que 'A' és - aquí tenim 'A' és decimal 65. Però aniré amb hexadecimal, que és Ox41. Estic bastant segur que ho vam veure a classe. Crec que hem vist a classe que és bastant fàcil de convertir de hexadecimal a binari. Així que aquí, si vull posar 4 en binari, això és només serà 0100. Aquest és el lloc d'1, el lloc de 2, lloc de 4, així que això és 4. Llavors puc dividir 1 en binari, el que serà 0001. I així, aquesta serà la representació de 'A' en binari. Prenent en minúscula 'a', ara es va a ser Ox61, on, dividint aquests cap amunt en el seu binari, de manera que un 6 - Anem a fer-ho realitat - no hi ha una goma d'esborrar? Esborrany. Ox61. Així dividir 6 en binari serà 0 + 4 + 2 + 0. I la divisió 1 serà 0001. Quant a la diferència entre aquests 2, veiem que l'única diferència entre una minúscula i una 'A' majúscula és això d'un sol bit. Així que tornant a aquí - bé. Tornant a aquí, si ens fixem en el que el bit OX20 és, així que separar OX20 en el seu binari, és 0010, 0000. OX20, l'única part que s'estableix aquest bit és que ens ocupa, amb el canvi entre el capital i minúscules 'a'. Si jo o 'A', que és aquest, 'A', si jo o 'A' amb OX20, Què vaig a rebre? [Estudiant, inaudible] minúscula "a", perquè va a voltejar aquest bit a 1. I si jo o 'a' amb OX20, què vaig a rebre? Canviar a minúscula una, perquè just oring 'a' amb OX20, Jo només seré oring aquesta sol bit a 1, és ja un 1, pel que no importa. Així que arribar 'a' i 'a'. Bit a bit i. Un cop més, podem pensar en això com la nostra contrapart lògica i. A la part esquerra tenim cert i veritable. Serà veritat, i per a tots els casos, fals i vertader o fals i veritable, o fals i fals, cap d'aquestes coses són certes. Així que el que acabem rebent és 1000. Així que ara, aquí, aquí és on m'he utilitzat amb l'operador de confiança no, on vam tenir OX20. Així que això és OX20. Ara el que vull fer, bit a bit ~ de OX20. Això va a voltejar tots els bits. Així que tinc 1101, 1111. I pel que 'A' AND amb ~ OX20 em donarà el que? L'única part que realment hem de pensar és en aquest, ja que, si tots aquests bits s'estableixen a 1, llavors anem a aconseguir exactament el 'A' era, llevat de, possiblement, el que això és poc. Perquè si fos un 1, ara que serà establert en un 0, perquè sigui el que sigui, AND amb això serà 0. Llavors, què és 'A' i ~ OX20 em donarà? [Els alumnes responen, inaudible] I el que és 'a' i - és 'A'. I el que és 'a' i ~ OX20 em donarà? 'A.' Com que aquest és actualment gener 1. Anding amb aquest 0 farà que sigui un 0, i ara anem a obtenir una 'A'. Tots dos són 'A', i per últim però no menys important d'aquest tipus, tenim XOR. És molt semblant o, llevat que significa exclusivament o. Això és com el que se sol pensar en com o en el món real. Així ho fa bé 'x' o 'i', però no ambdós. Aquí 1 ^ 1 serà 0. Perquè és veritat, això és - no funciona tan bé amb la lògica de vertader i fals com a nivell de bits i jo fer, però cert ^ veritable és fals. Perquè només volem tornar true si només un d'ells és cert. Així que 1 ^ 1 és 0. Què passa amb 0 ^ 1? És 1. 1 ^ 0 és 1, 0 ^ 0 és 0. Així que en totes les circumstàncies, 0 bit a bit 0 alguna cosa serà 0. 1 bit a bit o alguna cosa 0 0 1 bit a bit, si és | o ^, serà un 1, i si és i serà 0. I l'únic cas en què 1 bit a bit 1 és 1 no és exclusiva amb o. Això és 0110. Així que aquí ara, usant XOR - així que estem de tornada als 20. 'A' ^ OX20 és aquests 2 bits que estem comparant. Així que un 1 ^ 0 em donarà una què? Un un. 'A' ^ OX20 em donarà? Canviar a minúscula un. 'A' ^ OX20 em donarà? Capital A. Perquè el que sigui que està fent, aquesta operació XOR amb OX20 està invertit efectivament sigui el que és poc. Si això és un 0, ara es convertirà en un 1. Atès que aquest és un 1, 1 ^ 1 és 0. Així que el nostre 'a' s'ha convertit en 'A', i el nostre 'A' s'ha convertit en 'a'. Així XOR és una manera molt convenient de simplement donar la volta al cas. El que desitja és iterar sobre una cadena de lletres i alternar el cas de cada personatge, simplement XOR tot amb OX20. Ara ens queda torn. Desplaçament a l'esquerra és només va a, bàsicament, empènyer tots els números en, o cap a l'esquerra, i introduïu 0 de darrere d'ells. Així que aquí tenim 00.001.101. Anem a empènyer març del 0 per la dreta, i obtenim 01.101.000. En termes no binaris, veiem que el que realment es tracta 13 esquerra amb desplaçament de 3, el que ens dóna 104. Així desplaçament esquerra, veiem aquí, x << i és bàsicament x * 2 ^ i. 13 * 2 ^ 3, 2 ^ 3 és 8, de manera que 13 * 8 és 104. Si només penses en binari, en general, com cada dígit, si partim de la dreta, que és el lloc de l'1, llavors el lloc del 2 i després el lloc del 4. Així empenyent a 0 de la dreta, només estem empenyent les coses que eren al lloc del 4 al lloc del 8, i les coses que eren al lloc del 8 al lloc de la 16. Cada torn només es multiplica per 2. Sí? [Estudiant] Què passa si vas canviar per 5? [Bowden] Si vas canviar per 5 vostè acaba de perdre dígits. Inevitablement, és la mateixa cosa. Igual, els sencers són només 32 bits així que si vostè afegeix 2 realment grans sencers, simplement no cap en un enter. Pel que és el mateix aquí. Si vas canviar per 5, ens tornaríem a perdre aquesta. I això és una cosa del que vull dir amb "més o menys" on si vostè canvia massa, perds bits. Desplaçament a la dreta serà tot el contrari, on anem a empènyer 0 de fora de la final, i per als nostres propòsits, ompli 0 del de l'esquerra. Així que fent això, estem bàsicament revertir el que ja havíem fet. I veiem que els tres de 0 a la dreta només s'han caigut, i hem empès el 1101 fins al final a la dreta. Això està fent 104 3, que és, efectivament, x / 2 ^ I. Així que ara, aquí, és una idea similar. Per què és només aproximadament x / 2 ^ i, i en realitat no x / 2 ^ i? Perquè si jo havia canviat per 4, m'hauria perdut, un 1. Bàsicament, el que pensa de, només cal pensar en la divisió entera en general. Així que, com 5/2 és 2. No és 2,5. És la mateixa idea aquí. En dividir per 2, podem perdre coses estranyes en el camí. Així que ara - això és tot per bit a bit. Això és tot el que necessita saber. Recorda els casos d'ús que vam veure a classe, com una màscara de bits és útil per als operadors bit a bit, o els utilitza per a les màscares de bits. Les lletres majúscules i minúscules, les conversions, és un exemple molt prototípic. Bé, així que els atacs de desbordament de memòria intermèdia. Algú es recorda del que estava malament amb aquesta funció? Avís declarem un arranjament de 12 bytes, 12 caràcters, i després copiem al nostre buffer de 12 caràcters tota la barra de cadena. Llavors quin és el problema aquí? El nombre màgic 12 hauria d'aparèixer gairebé immediatament com - per què 12? Què passa si la barra passa a ser més de 12 caràcters? Què passa si la barra és de milions de caràcters? Aquí la qüestió és memcpy. Si la barra és el temps suficient, s'acaba del tot - 'c', 'c' no li importa que es tractava de només 12 caràcters; 'C' no li importa que no pot cabre que molts bytes. Es sobreescriurà tot sol char, els 12 bytes que hem assignat per a això, i tot el passat a la memòria que en realitat no pertanyen a aquest buffer de manera que la barra de cadena és. Així que aquesta era la imatge que vam veure a classe on tenim la nostra pila creixia. Vostè ha d'estar acostumat a aquestes fotos o familiaritzar-se amb ells de nou. Hem nostra pila creixia, les adreces de memòria comencen a 0 a la part superior i créixer fins agradaria 4000000000 a la part inferior. Tenim la nostra array 'c' en algun lloc de la memòria, llavors tenim el nostre punter al bar just sota d'ella, i després tenim aquest punter guardat a la nostra adreça de retorn i de la pica de la rutina dels pares. Recorda el que la direcció de retorn és? És quan principal crida a una funció foo, crida a una barra de funcions, inevitablement, bar devolucions. Així que quan els rendiments de barres, el que necessiten saber que va a foo, que el va anomenar. Així que la direcció de retorn és la direcció de la funció que ha de tornar a quan es retorna la funció. La raó per la qual és important per als atacs de desbordament de memòria intermèdia és perquè, convenientment, hackers els agrada canviar això remet. En comptes de tornar a foo, vaig a tornar a on el hacker vol que vagi de nou a. I, convenientment, on el hacker sovint vol tornar a és el principi de la memòria intermèdia que teníem originalment. Així que adonar-se, de nou, Little Indian. L'aparell és un exemple d'un sistema indi de Little, de manera que un nombre enter o un punter s'emmagatzema amb els bytes invertits. Així que aquí veiem - és això? Sí Veiem Ox80, OxC0, Ox35, OxO8. Recordeu que els dígits hexadecimals? Nosaltres no invertim els dígits hexadecimals a Little Indian, perquè 2 dígits hexadecimals representen un sol byte, i revertir els bytes. És per això que nosaltres no emmagatzemem, com, 80530CO8. Emmagatzemem, en el seu lloc, cada parell de 2 dígits, començant des de la dreta. Aquesta direcció es refereix a la direcció d'inici del nostre buffer que realment volíem copiar en en el primer lloc. La raó que és útil és perquè, i si l'atacant succeït a, en lloc de tenir una cadena que només era una cadena inofensiva com el seu nom o alguna cosa, I si, en canvi, que la cadena van ser només alguns de codi arbitrari que feien el que volien que fes? Perquè poguessin - no puc pensar en cap codi cool. Podria ser qualsevol cosa, però. Qualsevol codi desastrós. Si volguessin, podrien simplement fer alguna cosa en falles s, però això no tindria sentit. En general, ho fan per hackejar el sistema. Okay. Biblioteca CS50. És a dir, bàsicament, getInt, getString, totes aquelles funcions que li proporciona. Així que tenim char * cadena, i aquesta és l'abstracció que ens van impressionar molt en algun moment durant el semestre. Recordi que una cadena és només un conjunt de caràcters. Així que aquí veiem una versió abreujada de getString. Vostè ha de mirar cap enrere en el que cal recordar com s'aplica realment. Els detalls clau són, notem que obtenim en un sol caràcter alhora de la norma, la qual cosa és el mateix que nosaltres amb el teclat. Així que un sol caràcter alhora, i si aconseguim massa caràcters, pel que si n + 1 és més gran que la capacitat, llavors hem d'augmentar la capacitat de la nostra memòria intermèdia. Així que aquí estem duplicant la mida del nostre buffer. I això segueix endavant, inserim el caràcter en el nostre buffer fins que rebem una nova línia o al final de l'arxiu o el que sigui, en aquest cas, hem acabat amb la cadena i després el veritable getString contreu la memòria, com si ens van donar massa memòria que va a anar cap enrere i reduir una mica. Així que no vam demostrar això, però la idea principal és que ha de llegir en un sol caràcter alhora. No s'acaba de llegir en tota una cosa alhora, causa que la seva memòria intermèdia és només d'una certa mida. Així que si la cadena que intenta introduir a la memòria intermèdia és massa gran, llavors es desbordi. Així que aquí ens prevenim que només la lectura en un sol caràcter alhora i cada vegada més cada vegada que necessitem. Així getInt i les altres funcions de la biblioteca CS50 tendeixen a utilitzar getString en les seves implementacions. Així que vaig posar en relleu les coses importants aquí. Crida getString per obtenir una cadena. Si getString no va tornar a la memòria, recordeu que getString mallocs alguna cosa, així que cada vegada que es diu a getString vostè no ha de (inintel · ligible) gratis aquesta cadena que et donaven. Així que aquí, si no aconseguia malloc alguna cosa, tornem INT_MAX només com una bandera que, bé, no estàvem realment capaços d'obtenir un nombre enter. Vostè ha d'ignorar ho torno a tu, o vostè no ha de tractar això com una entrada vàlida. Finalment, en el cas que van tenir èxit, utilitzem sscanf amb aquesta bandera especial, el que significa, primer que coincideixi amb un nombre enter, llavors coincidir qualsevol caràcter després d'aquest sencer. Així notem que volem que sigui igual a 1. Així que torna sscanf quants partits si van fer amb èxit? Es retornarà 1 si coincideix amb èxit un nombre enter, retornarà 0 si no ha coincidit amb un enter, i ha de tornar 2 si coincideix amb un nombre enter seguit d'una mica de caràcter. Així notem que la recomprobació si igualem qualsevol cosa menys 1. Així que si entrem en 1, 2, 3, C, o 1, 2, 3, X, a continuació, 1, 2, 3 que s'emmagatzema en el nombre sencer, X seria s'emmagatzemen en el caràcter, sscanf tornarien 2, i ens agradaria tornar a intentar, perquè només volem un sencer. Bufar ràpidament a través d'HTML, HTTP, CSS. HyperText Markup Language és l'estructura i la semàntica de la web. Aquí està l'exemple de la conferència on tenim etiquetes HTML. Tenim etiquetes del cap, les etiquetes de cos, tenim exemples d'etiquetes buides on en realitat no tenen un inici i tancament d'etiquetes, només tenim enllaç i la imatge. No hi ha tancament d'imatge de la placa, només hi ha una única etiqueta que porta a terme tot el que l'etiqueta ha de fer. L'enllaç és un exemple, veurem com es vincula a CSS, el guió és un exemple de com es vincula a un JavaScript extern. És bastant senzill, i recorda, HTML no és un llenguatge de programació. En aquest sentit, recorda com es defineixi un formulari o almenys el que això faria? Manera té una acció i un mètode. Els mètodes que vostè només alguna vegada veure són GET i POST. Així s'obté és la versió en la qual ho aconsegueix lloc en la URL. POST és on no es posa a la URL. En el seu lloc, totes les dades del formulari s'insereix més ocult en la petició HTTP. Així que aquí, l'acció defineix on va la petició HTTP. On se'n va és google.com / categoria. Mètode. Recordeu que les diferències entre GET i POST, i, acaba de dir com un exemple, si vol marcar alguna cosa. Vostè mai serà capaç de marcar un URL PAL perquè les dades no està inclòs en l'URL. HTTP, ara, és el Protocol de transferència d'hipertext. El Protocol de transferència d'hipertext, que es pot esperar per transferir HyperText Markup Language, i ho fa. Però també transfereix les imatges que trobi a la web, cap tipus de descàrrega que realitzi comencen com una sol · licitud HTTP. Així que HTTP és només el llenguatge de la World Wide Web. I aquí cal reconèixer aquest tipus d'una sol · licitud HTTP. Aquí HTTP/1.1 al costat només diu que aquesta és la versió del protocol que estic fent servir. És gairebé sempre serà HTTP/1.1, ja ho veuràs. Llavors veiem que aquest va ser GET, sent l'alternativa POST, que es poden veure. I l'adreça que jo estava tractant de visitar era www.google.com/search?q = bla, bla, bla. Així que recordi que aquest, el signe d'interrogació q = bla, bla, bla, és el tipus de coses que s'envia per un formulari. La resposta podria tornar a mi seria alguna cosa com això. Un cop més, començant pel protocol, el qual serà això, seguit pel codi d'estat. Aquí és 200 OK. I, finalment, la pàgina web que en realitat vaig demanar serà seguit. La possible codi d'estat que pot veure, i vostè ha de saber diversos d'ells. 200 OK és probable que hagi vist abans. 403 Forbidden, 404 no trobat, Error 500 Internal Server és en general si vostè va a un lloc web i algun element no funciona o es bloqueja el seu codi PHP, mentre que en l'aparell que tenim que el rectangle ataronjat gran que ve i diu, com, alguna cosa està malament, aquest codi no funciona o de mal aquesta funció. En general, els llocs web no volen el teu permís quines funcions són realment dolent, així que en comptes d'això només et donen 500 errors interns del servidor. TCP / IP és 1 capa sota HTTP. Recordeu que no hi ha Internet fora de la World Wide Web. Igual que si vostè juga un joc en línia que no passa a través d'HTTP, que va a través d'un diferent - que encara està utilitzant l'Internet, però no utilitza HTTP. HTTP és només un exemple de protocol basat en TCP / IP. IP significa literalment Internet Protocol. Cada ordinador té una adreça IP, sinó que són aquestes coses de 4 dígits com 192.168.2.1, o el que sigui, això tendeix a ser un local. Però aquest és el patró d'una adreça IP. Així que el DNS, Domain Name Service, això és el que es tradueix coses com google.com en una adreça IP real. Així que si vostè escriu que l'adreça IP en una adreça URL, que portaria a Google, però que tendeixen a no recordar aquestes coses. Vostè tendeix a recordar google.com en lloc. L'últim que tenim és els ports, en els quals aquesta és la part de TCP IP. TCP fa més. Pensa, com, vostè té el navegador web en funcionament. Potser vostè té alguna aplicació de correu electrònic en funcionament; potser vostè té algun altre programa que utilitza el funcionament d'Internet. Tots ells necessiten tenir accés a Internet, però l'equip només té 1 targeta WiFi o el que sigui. Així que els ports són la forma en què som capaços de dividir com aquestes aplicacions són capaços d'utilitzar Internet. Cada aplicació obté 1 port específic que pugui escoltar en, i per defecte, HTTP utilitza el port 80. Alguns serveis de correu electrònic utilitzen 25. Els números baixos tendeixen a ser reservats. Vostè està en general capaços d'obtenir nombres més alts-un per si mateix. CSS, Cascading Style Sheets. Pàgines web Nosaltres estil amb CSS, no amb HTML. Hi ha 3 llocs que vostè pot posar el seu CSS. Pot ser en línia, entre les etiquetes d'estil, o en un arxiu completament separat i després vinculat polz I aquí és només un exemple de CSS. Vostè ha de reconèixer aquest patró, on el primer exemple és que estem igualant l'etiqueta body, i aquí estem centrant el cos de l'etiqueta. El segon exemple, estem igualant la cosa amb identificador de peu de pàgina, i estem aplicant alguns estils a això. Cal notar que els ID de peu de pàgina de text s'alinea a l'esquerra, mentre que el centre del cos de text-a línia. Peu de pàgina està dins del cos. Serà, en canvi, text-align esquerra, tot i que el cos diu centre text-align. Aquesta és tota la part de connexió en cascada d'ella. Vostè pot tenir - es pot especificar estils per al cos, i llavors les coses en el cos que poden especificar estils més específics, i les coses funcionen com s'espera. Especificadors CSS més específics tenen prioritat. Crec que això és tot. [Ali Nahm] Hola a tots. Si tan sols pogués aconseguir la seva atenció. Sóc Ali i jo vaig a anar a través de PHP i SQL molt ràpid. Així que podem començar. PHP és l'acrònim de PHP: Hypertext Preprocessor. I com tots vostès han de saber, és un llenguatge de script del costat del servidor, i el fem servir per al back-end dels llocs web, i com ho fa un munt dels càlculs, la part de darrere de les escenes. Sintaxi. No és com C, sorpresa, sorpresa. Sempre ha de començar amb ell, si vostè pot veure, el - no puc seguir endavant. Vostè pot veure el que necessita els nous tipus d'aparells ortopèdics i llavors també necessitarà el php?. Això sempre és com cal enquadrar el text PHP, el codi PHP. Per tant, no pot ser només com C, en què tipus de posar-la en primer lloc. Has de sempre envolten. I ara, la sintaxi és important que totes les variables han de començar amb el caràcter $. Que ha de fer quan vostè els està definint, que cal fer-ho quan et refereixes a ells més endavant. Sempre es necessita que $. És el seu nou millor amic, bastant. No - a diferència de C, no cal posar el tipus de tipus de variable que és. Així, mentre que vostè no necessita els $, vostè no ha de posar, com, int x o cadena i, etcètera, etcètera. Així que una lleugera diferència. Com a resultat d'això, vol dir que PHP és un tipus dèbilment. PHP és un llenguatge de tipus feble, i feblement ha introduït variables. En altres paraules, això significa que vostè pot canviar entre els diferents tipus de tipus de variables. Pot emmagatzemar el número 1 com un int, es pot emmagatzemar com una cadena, i es pot emmagatzemar com un flotador, i tot serà que el número 1. Tot i que vostè està emmagatzemant en diferents formes, segueix sent - els tipus de variables segueixen mantenint en el final. Així que si vostè mira aquí, si vostè recorda de PSET 7, molts de vostès probablement tenia problemes amb això. Dos signes d'igual, 3 signes d'igual, 4 signes d'igual. Està bé, no hi ha 4 signes d'igual, però hi ha 2 i 3. Utilitza 2 signes d'igual per comprovar els valors. Es pot comprovar a través de tipus. Així que si vostè pot veure en el primer exemple, Tinc num_string == num_int. Així que el seu int i la seva cadena són tant, tècnicament, 1, però són diferents tipus. No obstant això, per als dobles iguals, encara passarà. No obstant això, per als iguals triples, comprova valor, així com els diferents tipus. Això vol dir que no passarà en aquest segon cas aquí, on s'està utilitzant 3 signes igual al seu lloc. Així que això és una gran diferència, que tots han mostrat ara. String concatenació és una altra cosa de gran abast que pot utilitzar en PHP. És bàsicament aquesta notació de punt a mà, i així és com es pot enllaçar les cadenes juntes. Així que si vostè té gat i tens gos, i vol posar les 2 cadenes juntes, vostè pot utilitzar l'època, i això és una espècie de com funciona. També es pot simplement col · locar un al costat de l'altre, com es pot veure aquí en l'exemple de sota, on he fet cadena 1, espai corda 2. PHP sabrà que ha de substituir com a tal. Arrays. Ara bé, en PHP, hi ha 2 tipus de matrius. Vostè pot tenir matrius regulars, i vostè també pot tenir matrius associatives, i anirem a través d'ells en aquest moment. Matrius regulars són simplement això en C, i pel que té índexs que estan numerades. En aquest moment només crearem una i posar - així que aquesta és la forma de crear una matriu buida, llavors anem a posat en el nombre d'índex 0. Anem a posar el número 6, el valor 6. Es pot veure a la part inferior aquí. D'on està - en el nombre d'índex 1 ens posarem del valor 4, i així que vostè pot veure que hi ha un 6, hi ha un 4, i llavors com que estem imprimint coses, quan intentem i imprimim el valor emmagatzemat en el nombre d'índex 0, llavors veurem el valor 6 imprimir-los. ¿D'acord? Així que això és matrius regulars per a vostè. Una altra manera també es pot afegir coses a les matrius normals ara és que només pot annexar al final. Això vol dir que vostè no ha d'especificar l'índex específic. Pot consultar el nombre i, a continuació, en els claudàtors no hi ha cap índex especificat. I sabrà - PHP sabrà a poc afegir-lo a la final de la llista, el següent lloc lliure. Així es pot veure la 1 a la dreta allà en aquell punt 0, el 2 va ser allà mateix, en el primer acte. El 3 va - s'afegeix allà també. Així que aquest tipus de té sentit. Només estàs constantment afegint que, i després, quan estem fent ressò de l'índex de número 1, s'imprimirà el valor 2. Després tenim les matrius que són matrius associatives. Les matrius associatives, en lloc de tenir índexs numèrics, el que fan és, han índexs que estan per cadena. Es pot veure, en lloc de - Em vaig desfer de tots aquests índexs numèrics, i ara és clave1, key2, key3, i estan entre cometes dobles per significar que són totes les cadenes. Així que podem tenir un exemple d'això. L'exemple d'això és que tenim el tf, i aquest és el nom de l'índex. Ens posarem "Ali", com el nom, en l'índex, les calories consumides, podem posar un int aquesta vegada en lloc d'una cadena, i després als gustos d'índex, podem posar tota una matriu dins d'ella. Així que això és una mena de - és un concepte similar a la forma en què teníem índexs amb els números, però ara podem canviar els índexs d'al voltant de tenir-los com cadenes en lloc. També pot fer això, a més de només fer-ho de forma individual, vostè pot fer-ho tot en un sol tros. Així es pot veure que tf de la matriu, i després ens vam anar a tots vam posar en un joc gegant de claudàtor. Així que pot accelerar les coses. Es tracta més d'una elecció estilística que no. També tenim llaços. En C tenim llaços que funcionen d'aquesta manera. Vam tenir la nostra matriu, i ens vam anar des de l'índex 0 fins al final de la llista, i imprimim tot, oi? Excepte el problema és, per a matrius associatives, no sabem necessàriament els índexs numèrics perquè ara tenim els índexs de les cadenes. Ara fem servir bucles foreach, que, de nou, que va utilitzar amb sort en PSET juliol. Bucles foreach s'acaba de conèixer cada part de la llista. I no ha de saber exactament l'índex numèric que vostè té. Pel que té la sintaxi foreach, així que és foreach, es posa la matriu. Així que el meu matriu s'anomena conjunt de processadors, i després com, la paraula com, i després es posa aquesta variable temporal local que es va a utilitzar només per l'acció específica que sostindrà el concret - una instància o una secció de la matriu. Num PSET celebrarà 1, i després potser es durà a terme el número 6, i després es durà a terme el número 2. Però està garantit que passar per cada valor únic que està en la matriu. Funcions útils que vostè ha de saber en PHP són el requerir, de manera que s'assegura que vostè està incloent alguns arxius, ressò, sortida, buit. Li recomano que miri PSET 7 i mirar aquestes funcions. Podria ser necessari conèixer aquells, així que sens dubte sap el que és, exactament, els que tots estem fent. I ara anem a anar a través d'abast molt ràpidament. En l'abast, PHP és una mena de cosa covard, a diferència de C, de manera que només anem a anar a través d'ell ràpidament. Així que diguem que vam començar en aquesta fletxa que tenim allà. I anem a començar amb $ i. Així que la variable 'i' serà 0, i només seguirem imprimint gran quadre blanc d'allà. Anem a començar amb i0, i després repetirem ella. Així que aquí està el 0. I després anem a incrementar-lo en el bucle per, i després que serà el valor d'1. Un d'ells és menor de 3, pel que passarà a través d'aquest bucle, i després anem a veure-ho imprès de nou. Anem a incrementar de nou a 2, i 2 és menor que 3, pel que et passarà el bucle for, i voleu imprimir la 2. Llavors se li nota que 3 no és menor que 3, així que vas a trencar fora del bucle for. Així que ara que hem acabat i, a continuació, entrarem en AFunction. Okay. Així que cal assenyalar que aquesta variable que hem creat, la variable 'i', no està en l'àmbit local. Això significa que no és local per al bucle, i que la variable que encara pot accedir i canviar després, i encara serà eficaç. Així que si vas a la funció ara, veuràs que també utilitzem la variable 'i', i incrementarem 'i' + +. Es podria pensar que, en un primer moment, en base de C, que és una còpia de la variable 'i'. És una cosa totalment diferent, la qual cosa és correcte. Així que quan imprimim, anem a imprimir 'i' + +, que es va a imprimir que 4, i després anem a - ho sento. Llavors anem a acabar d'aquesta funció, i nosaltres estarem on la fletxa és en aquests moments. Això vol dir que llavors, però, tot i que la funció canvia el valor de 'i', no va canviar fora de la funció, pel fet que la funció té un àmbit d'aplicació separada. Això vol dir que quan ens fem ressò de 'i', no ha canviat en l'àmbit de la funció, i així, anem a imprimir 3 de nou. Diferents coses sobre l'abast en PHP que en C. Ara en PHP i HTML. PHP és usat per fer pàgines web dinàmiques. És una cosa que fa que les coses diferent. Tenim diferent d'HTML. Amb HTML, sempre només tenim la mateixa cosa estàtica, com la forma de Rob va mostrar, mentre que PHP, pot canviar les coses en funció de qui és l'usuari. Així que si tinc això, he, "ha iniciat la sessió com -" i després el nom, i puc canviar el nom. Així que ara el nom és Josep, i té el "Quant a mi", però després també pot canviar el nom a tenir Tommy. I això seria una cosa diferent. Així que també podem canviar les coses diferents sobre ell, i es mostrarà un contingut diferent en funció del nom. Així que PHP pot tipus de canviar el que està passant al seu lloc web. El mateix dic. No obstant això, tingueu en compte que tenen un contingut diferent, tot i que vostè està tècnicament encara accedint aquesta mateixa pàgina web a la superfície. Generació d'HTML. Hi ha 2 maneres diferents que vostè pot fer això. Així que anem a passar per això en aquest moment. La primera manera és, vostè té - si, ho sento. Pel que només té el seu habitual cicle for a PHP, i després li trobo a PHP i trec HTML. Usant el que Rob li va mostrar d'escriptura HTML i després utilitzant la impressió PHP simplement imprimir per a la pàgina web. La forma alternativa és fer-ho com si se separa el PHP i el codi HTML. Així que vostè pot tenir una línia de PHP que s'inicia el bucle for, llavors vostè pot tenir la línia de l'HTML en una cosa separada, i després s'acaba el bucle, de nou, amb un PHP. Així que és una espècie de separar a terme. Al costat esquerre, pot ser que vostè tingui tota la - és només 1 tros de PHP. A la dreta es pot veure que té una línia de PHP, disposa d'una línia d'HTML, i té una línia de PHP de nou. Així que el separa cap a fora en el que estan fent. I se li nota que de qualsevol manera, per a qualsevol d'ells, encara imprimeixen la imatge, la imatge, la imatge, de manera que l'HTML encara s'imprimeix la mateixa manera. I llavors vostè encara veu les 3 imatges apareixen al seu lloc web. Així que és de 2 maneres diferents de fer el mateix. Ara tenim formularis i sol · licituds. Com Rob li va mostrar, hi ha formes d'HTML, i nosaltres simplement brisa a través d'això. Vostè té una acció i té un mètode, i la seva acció amable de la seva part en la qual va a enviar es nota, i el mètode és si que serà un GET o POST. I una petició GET, com va dir Rob, vol dir que vostè va a posar en un formulari i veuràs com un URL, mentre que una petició POST que no veurà en una URL. Així que una lleugera diferència. Tanmateix, una cosa que és una cosa similar és que POST i GET són igualment insegur. Així que vostè pot pensar que només perquè vostè no ho veu a la URL, això significa que el POST és més segur, però encara es pot veure en els teus galetes en la informació que vostè està enviant. Així que no crec que al voltant d'un o de l'altre. Una altra cosa a tenir en compte és que vostè també té variables de secció. Vostès utilitzen això en PSET 7 per obtenir la seva informació de ID d'usuari. El que va passar és que es pot utilitzar aquesta matriu associativa, la $ _SESSION, i després vostè és capaç d'accedir a diferents coses i emmagatzemar les coses diferents a través de les pàgines. L'última cosa és que tenim SQL, Structured Query Language, i aquest és un llenguatge de programació per gestionar bases de dades. Què, exactament, són les bases de dades? Són col · leccions de taules, i cada taula pot tenir el mateix gènere d'objectes. Així que vam tenir una taula d'usuaris en el seu conjunt de processadors finances. I per què són útils? Perquè és una forma d'emmagatzemar permanentment informació. És una forma de seguiment de les coses i la gestió de les coses i de fet de veure que en diferents pàgines i fer el seguiment. Mentre que si vostè acaba de guardar en aquell moment immediat i després usar-lo més tard, vostè no serà capaç d'accedir a qualsevol cosa que t'has estalviat. Tenim 4 coses principals que utilitzem per les ordres SQL. Tenim seleccionar, inserir, eliminar i actualitzar. Aquests són realment importants perquè sàpiguen del seu concurs. Anirem ràpidament sobre Seleccionem aquests moments. Bàsicament, vostè està seleccionant les files d'una base de dades. Així que si tens, aquí - tenim aquestes 2 coses diferents, i volem seleccionar de la taula de classes on impressionant - on a la columna impressionant el valor és 1. Així que vostè pot veure aquí, tenim aquestes 2 coses del nom de la classe, CS50 i Stat110, i comptem amb els identificadors de classe i el lema. Així que volem seleccionar tota aquesta informació. A continuació es pot veure aquí que és una espècie d'escollir d'aquesta columna impressionant, on totes les coses són 1, i després té la classe d'identificació, nom de la classe i el lema que es pot escollir. Com és exactament el que fa això en el codi? Vostè ha de fer servir PHP. Així que és una espècie de com PHP i SQL estan relacionats entre si. Ara tenim el nostre codi, i utilitzarem la nostra funció de consulta com ho vam fer a PSET 7, i que anem a executar la consulta SQL. Llavors tindrem - sempre hem de comprovar si la triple fila igual si és fals. Així que de nou, que desitja comprovar el tipus i el valor, i després, si no funciona, llavors vostè vol demanar disculpes, com de costum, com ho vam fer en PSET juliol. En cas contrari, vostè vol recórrer tot amb aquells útil foreach bucle que ens vam anar de nou. Ara que estem recorrent i hem fet més enllà, suposarem que la nostra consulta passar, ara tenim el nostre bucle foreach. I la primera fila que té, així que aquí està la fila, aquí, sinó que està en caixa. Es va a imprimir tota la informació que s'ha tornat. Així que voleu imprimir a la part inferior "Vols aprendre HTML?" Després es va a anar a la següent fila, perquè està completa la primera bucle for, i pel que també va a imprimir la segona línia de la mateixa, que serà STAT110, trobar tots els moments. Una última cosa és en SQL vulnerabilitats. Sé que David es va referir a això una mica en la conferència. Vostè pot llegir més tard. És realment graciós. Injecció SQL és una mena de cosa difícil. Diguem que vostè acaba d'enganxar aquestes variables a la dreta a la consulta, com es pot veure a la primera línia. Per tant, sembla estar bé, oi? No ets més que posar el nom d'usuari i una contrasenya per a la consulta de SQL, i vostè vol enviar fora i obtenir el que està en la taula de dades. Això sembla bastant simple. Així que diguem que algú posa en, per a la contrasenya, aquest o el text aquí - en realitat hauria d'estar en el quadre vermell. Així que diguem que posen aquesta contrasenya en - que és el que entren. Així que estan posant o "1" = 1. És una mena de contrasenya ximple tenir. Ara anem a reemplaçar en consells, es tingui en compte que en aquesta consulta SQL ara, s'avalua com sempre és cert, perquè se li nota que pots consulta SQL seleccionar tota aquesta informació o simplement pot tenir 1 = 1. Així que sempre es va a avaluar true. Això no va a treballar de veritat, perquè això significa que el hacker pot entrar al sistema. La solució a això és que vostè ha de fer servir el sistema de DOP, el que significa que vostè ha d'utilitzar signes d'interrogació, que és el que vostès utilitzen en PSET 7, on es va a utilitzar un signe d'interrogació en lloc d'en la qual desitja posar alguna cosa, i després et vas a tenir una coma, i després vostè tindrà després, després de la seva cadena, les diferents variables que desitja substituir en el seu signe d'interrogació. Així podràs notar aquí que ara tinc aquests signes d'interrogació vermell. Després vaig posar les variables després de les cadenes, així que sé de substituir en aquest ordre després. Això s'ha d'assegurar que si algú ho fa així, i tenen la o 1 = 1 situació, que s'assegurarà, a la part final, assegureu-vos que en realitat no trencar la consulta SQL. Molt bé, així que això és tot, un remolí de PHP i SQL. Molta sort a tots vostès, i ara a Oregon [Oreoluwatomiwa Babarinsa] Bé tothom. És hora de repassar alguns JavaScript i algunes altres coses molt ràpidament, així que no tenen que fins aquesta nit. JavaScript. Sí JavaScript és una mena de cosa fresca, suposadament. Les coses que realment necessita saber sobre JavaScript, és com Al final del costat del client del que la seva aplicació web estarà fent. Hi ha algunes coses que simplement no vol fer-se càrrec de tot el temps en el costat del servidor. Totes les petites interaccions, destacant una cosa, fer desaparèixer alguna cosa. Segur que no vull haver de parlar amb el seu servidor tot el temps per això. I alguns dels que ni tan sols és possible fer-ho al costat del servidor. És per això que necessitem alguna cosa com JavaScript. Coses interessants sobre JavaScript: és tipus dinàmics. El que això significa és que el seu programa no necessita saber Què, exactament, les variables són quan escrius a terme. Serà només una espècie de figura cap a fora segons s'executa. Altres coses que són millor d'això: És un llenguatge de claudàtor, el que significa que la sintaxi és similar a C i PHP. Vostè no ha de fer molt de la represa quan estàs aprenent JavaScript. Aquí tenim una mica de JavaScript. L'interessant aquí és que, si ens fixem en ell, tenim una mica de JavaScript allà mateix, a l'etiqueta del cap. El que és no és, bàsicament, només cal incloure un arxiu JavaScript. Aquesta és una manera que vostè pot incloure el Javascript al seu programa. A continuació, el segon poc és en realitat una mica de JavaScript inline, molt similar a un estil en línia amb CSS, i només estàs escrivint una mica de codi molt ràpidament allà. JavaScript té arrays. Només una altra manera de mantenir les dades del voltant, molt útil. Molt agradable i fàcil de sintaxi. Utilitzeu claudàtors per accedir a tot i mantenir tot junt. Res massa complex. El millor de JavaScript i llenguatges de scripting en general és que vostè no ha de preocupar sobre mides de matriu. Vostè només pot utilitzar array.length i realitzar un seguiment de la mateixa, i també l'arranjament pot augmentar o disminuir a mesura que ho necessiti. Així que vostè ni tan sols ha de preocupar-se per cap tipus de, oh no, he de assignar més coses, o alguna cosa per l'estil. L'interessant aquí és que JavaScript té alguna cosa que es diu objectes. És un llenguatge orientat a objectes, de manera que el que té és, en essència, una forma d'agrupar dades en conjunt, alguna cosa similar a una estructura, però es pot accedir com una estructura o en una sintaxi de matrius associatives. És bastant simple i el que pot fer amb això és agrupar dades en conjunt si vostè té un munt de dades que està relacionat. Perquè és tot el que necessita per descriure un cotxe, vostè no necessita tenir en un munt de diferents llocs. Vostè només pot enganxar en 1 objecte en JavaScript. Com vostè probablement sap, la iteració és una d'aquestes tasques tedioses. Vostè acaba de fer-ho a través d'una altra vegada. Vostè necessita parlar amb tots els objectes al cotxe, o si ha d'anar a través de tots els elements d'una llista o alguna cosa per l'estil. Així JavaScript té, similar a PHP, una sintaxi foreach. En aquest cas, és una al bucle. Vostè voleu utilitzar aquest només en els objectes. Hi ha alguns problemes que es produeixen si s'utilitza aquest a una matriu. En general, és una d'aquestes coses, però, que és molt útil, perquè s'elimina una gran quantitat de despeses generals perquè vostè no ha de llençar tot el que troba al seu objecte per si mateix. No ha de recordar tots els noms de les tecles. Vostè només una mena d'obtenir de nou en aquesta sintaxi. En això, per, el que desitja recordar que et van a donar volta totes les tecles, d'una manera molt similar a la taula de hash. Si et recordes d'això, quan vol posar en una cadena que podria treure alguna cosa que tindrien un valor associat amb ell. El que pot fer amb això és que es pot dir, d'acord, Vaig posar en un cotxe, i li vaig trucar un Ferrari. Així que vostè pot posar a la cadena de Ferrari de nou més tard, i vostè pot aconseguir això. I vostè pot fer això en un bucle, amb l'en el bucle. Així que més sobre els objectes. La clau d'això cal recordar és que es pot utilitzar l'estructura objecte com sintaxi quan vulguis amb ells, excepte si el que vas a utilitzar com una cadena no és un nom de variable vàlid. Així que si ens fixem en que no tenim clau amb espais. Bé, si hagués de posar object.key, espai, amb, espai, espais, que simplement no tindria sentit sintàcticament. Pel que només pot fer això amb aquest tipus de sintaxi de suport. També Javascript és molt àmbit-savi PHP. Tens 2 maneres d'abordar l'abast. No es pot tenir la var davant d'una variable, i això només significa que és global. Es pot veure des de qualsevol lloc. Fins i tot si anés a posar això en una sentència if, en qualsevol altre lloc en el codi després d'aquest punt es podia veure aquesta variable. Una altra cosa, però, és amb el var limitada per a qualsevol funció que vostè està dins Si no està en una funció, bé, és global. Però si vostè està en una funció que és només visible dins d'aquesta funció. Jo no tinc un exemple, però si. És una d'aquelles coses on vostè pot gestionar les variables que vostè vol ser global, quines són les variables que desitja ser local, però sí que cal anar amb compte amb això, perquè vostè no té el tipus de control de gra fi que es fa en C, on si alguna cosa es declara en un bucle, que va a romandre en aquest bucle. El que realment es preocupen per Javascript per la manipulació pàgines web, no? Vull dir, és per això que estem fent això. Per fer això, fem servir una cosa anomenada DOM. El Document Object Model. Bàsicament, el que fa és que pren tot el seu HTML i models cap a fora en un munt d'objectes que estan niats uns dins dels altres. Comences amb alguna cosa com això. Vostè té, a la dreta per a mi, un munt de codi per aquí que és una mena de - Es podria pensar que seria molt difícil de manipular, perquè estaries va a analitzar a través d'un munt de text i tenir a peça a part coses. I què si no s'ha formatat correctament? Les coses dolentes que succeiria. Així que JavaScript s'encarrega d'això per a vostè, i vostè té una estructura de dades molt bé, com el de l'esquerra, en el qual només té un document, ia l'interior que vostè té alguna cosa que es diu HTML, ia l'interior que té un cap i un cos, i dins d'aquesta cap que tens un títol, etcètera, etcètera, etcètera. Això simplifica la manipulació d'una pàgina web perquè sigui més just, oh, jo només vull parlar amb aquest objecte. Ordenar d'una manera molt similar que parlaria amb un altre objecte que et vas fer. Com he dit, tot el DOM està en l'objecte de document. O és simplement un lloc i després es pot anar dins d'ella per trobar les coses, i vostè pot fer-ho - aquest és el vell estil de fer que, allà dalt, en el qual fer document.getElementById, i després el nom, i com vostè pot dir probablement, això es torna molt difícil de manejar després d'un temps. Així que és probable que no vols fer això. És per això que tenim el següent que parlarem després d'això. La clau aquí és que, d'acord, vostè té tots aquests elements, no? Així que potser pugui canviar el color d'alguna cosa quan es carrega la pàgina. I què? Què passa si el meu usuari fa clic en alguna cosa? Jo vull que faci alguna cosa interessant quan facin clic en alguna cosa. És per això que tenim esdeveniments. Vostè pot, bàsicament, trobar qualsevol element en el seu DOM, i després diuen, escolta. Quan això càrrega o algú fa clic, o quan el ratolí sobre ella, fan alguna cosa amb ell. I el que tenim és, vostè té les funcions que s'encarreguen d'això per a vostè. Aquestes funcions són controladors d'esdeveniments. Què they're - és només una forma elegant de dir, aquesta funció només s'executa quan l'esdeveniment passa. Per tant, controla l'esdeveniment que es produeix. Així és com se li dissenyar un controlador d'esdeveniments. Tinc una mica de botó, i quan fa clic, explota. Així que no feu clic al botó. Aquesta és una manera d'acostar-s'hi, no? Vostè té una etiqueta de botó, i en fer clic vostè té una cadena que diu, oh, per cert, ho faig de l'explosió per a mi. En cas contrari, és com un botó normal que acaba de fer. També es pot fer d'una altra manera, agafant l'element DOM, però anem a guardar que després parlem de jQuery. JQuery: És una llibreria que és cross-browser. Es pot utilitzar en gairebé qualsevol cosa. I només et dóna un munt d'eines per treballar. A causa JavaScript, mentre que de gran abast, no té totes les eines que necessita fora de la caixa per fer front realment una aplicació web és possible que vulgueu fer. Pel que simplifica molt les coses, et dóna un munt de funcions fora de la caixa que normalment ha d'escriure vostè mateix, una i altra vegada i una altra. I només fa les coses molt simples. Vostè també té selectors, que li permeten prendre tots aquests elements de la seva DOM molt més simplement, en lloc d'haver d'utilitzar aquestes trucades de funció molt llargs. Més sobre aquests selectors. Vostè té, allà vostè té, diguem Vull aconseguir un element amb l'ID "roca." Doncs bé, en jQuery, és només $ i després una cadena que té una lliura, i després "roca." És molt simple i molt més ràpida que la forma tradicional de JavaScript d'abordar aquest problema. I vostè té coses similars per a les classes i tipus d'elements. jQuery és - una de les característiques interessants és que més o menys pots comprimir baix de les seves consultes en el seu DOM molt, molt ràpid. Ara estem de tornada a la gestió d'esdeveniments, i això és com manejaria un esdeveniment en jQuery. Així que el que anem aquí és que estem dient, està bé. Tinc una etiqueta script, oi? Així que tinc aquesta línia de JavaScript. El que farem és que direm, està bé. Quan el document estigui llest, el que significa que ha estat carregat el document, anirem a aquesta funció, i que anem a dir, està bé, aquesta funció està realment fent una altra cosa. És, bàsicament, dient: bé, porta-me'n l'element amb l'ID "myid." I a continuació, donar a aquest un gestor de funció que s'executa quan es fa clic. Bàsicament el que fa és, es diu, està bé. La pàgina es carrega, així que vaig al, de trobar aquest element, donar-li aquest controlador d'esdeveniments, i que bàsicament estableix la seva pàgina per a vostè. I així és com es vol pensar en la gestió d'esdeveniments. El que vol és pensar, bé, quan passa alguna cosa, què és el que vull que passi? No vol pensar, bé, jo necessito per assegurar-se que les converses aquesta cosa a aquesta cosa, aquesta cosa, bla, bla, bla, perquè el que vol és parlar cosa en termes d'esdeveniments. Quan això passa, això succeeix. Quan això succeeix, això succeeix. I si les coses es desencadenen altres coses, això és genial. Però no vol tractar de fer complicat codi on vostè està desencadenant múltiples coses alhora, perquè només donarem un mal de cap. Molt bé. Ara podem obtenir la nostra pàgina de controlar esdeveniments, però diguem que el meu usuari fa clic a un botó. Què passa si vull enviar aquesta petició de tornada al servidor, però jo no vull tornar a carregar la pàgina, perquè haver de recarregar una nova pàgina cada vegada que posa una mica avorrit, i per què ho necessito per desplegar la capçalera de nou, i el peu de pàgina de nou, i tots els elements de la pàgina de nou per refrescar la salutació o el temps? Així que és per això que tenim una cosa així com l'Ajax. El que podem fer aquí amb l'Ajax és el que podem dir, està bé, Vull enviar algunes dades al servidor, i vull obtenir una resposta de tornada així que puc actualitzar la meva pàgina, o potser només fer algun càlcul algorítmic que no mostra necessàriament res a l'usuari. Què necessites per fer això? Bé, vostè necessita un URL que necessita parlar. El seu servidor no pot màgicament escoltar en no-res. Vostè necessita tenir un lloc específic que va a enviar aquestes dades a. I també hi ha algunes dades per enviar, o potser és una consulta sense dades. L'únic que vol fer ping de nou al servidor i dir, hey, estic viu, o alguna cosa així. I llavors vostè vol una funció que bàsicament maneja amb èxit. Diguem que vostè torni alguna informació del seu servidor, i desitja canviar el càrrec de l'usuari a la seva pàgina. Així es podrien obtenir la informació de nou, i vostè hauria d'empènyer a la pantalla. El que passa és que quan la pàgina està a punt, es crea un en funció de clic en aquest botó anomenat benvinguda. El que això fa és llavors, quan es prem el botó, parles amb greetings.php, vostè fa una petició POST, i vostè diu, hey, dóna'm una mica de la teva pàgina. Realment no necessitem descriure això, però greetings.php, direm, li dóna l'esquena "hola món". Així que tornem això "hola món", i en cas d'èxit d'aquest, suposant que res surti malament, llavors ens anem a aquest lloc de destinació que hem especificat i només mantenim la resposta allà. I aquesta és una forma molt senzilla de configurar una consulta d'Ajax. Molt ràpidament, Rob espècie d'esmentar això ja, les coses poden anar malament, les coses dolentes poden succeir, pel que desitja que es familiaritzi amb aquests codis de resposta HTTP. El que es tracta són només, com, 200, tot va sortir bé. Una altra cosa, les coses dolentes que va passar. En general és el que vol recordar. Però és bo saber que tots aquests. I, finalment, un cop hem passat per tot això, hem de parlar molt ràpidament sobre el disseny, i després podem deixar que tots vostès es vagin. Disseny. Les coses que vulguis recordar. Feu-vos aquestes preguntes: Qui va a utilitzar això? Què estaran utilitzant per? Què els importa als meus usuaris sobre? El que no els importa? Vostè simplement no vol fer una aplicació i deixar que només creixen i convertir-se en el gegant, que tot el consumeix que ni tan sols es pot acabar. Vols tenir metes discretes i plans i coses que vol tractar. Que sigui sense esforç. Tot això diu, bàsicament, fer més fàcil per a l'usuari per usar-lo, no el converteixen en un gegant de la bombolla de text com aquesta diapositiva és, en realitat. El que vol és que sigui una cosa on és molt fàcil perquè algú vagi en i fan el que volen fer. No vull que hagin de navegar 5 pàgines per arribar a la seva funció principal del seu lloc. Si Google té 5 pàgines abans que fins i tot podria buscar alguna cosa, ningú ho faria servir. I, finalment, prototip de paper, grup focal. Tenir un bon disseny i pràctiques de prova. Només perquè vostè pensa que funciona per a vostè, no vol dir que pensin els altres funciona. Però sí, això és tot. [CS50.TV]