[Review: Quiz 1] [Alí Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Universidade de Harvard] [Isto é CS50.] [CS50.TV] [Lucas Freitas] Sexan benvidos. Esta é unha revisión para cuestionario 1. Así como un aviso, este é - quero dicir, imos tratar de cubrir tanto material como puido, pero iso non quere dicir que nós imos cubrir todas as cousas que poden ser en cuestionario 1. Entón non se esqueza que tamén dar un ollo a clase, seccións, todo o que se poida. Proba 1 será o mércores, próximo mércores. Entón non deixe de estudar. Vai ser, practicamente, como a primeira proba en canto ao seu formato, pero probablemente vai ser moito máis difícil. Polo menos, o ano pasado, cando eu tirei 50, eu penso que era moito máis difícil. Polo tanto, estudia moito. Eu estou indo cubrir as estruturas de datos e código de Huffman. Isto é algo que unha morea de xente cre que é complexo, pero eu vou tentar facelo tan fácil como puido. Primeiro de todo, o que queremos que vostedes coñecen a proba 1 é comprender as descricións conceptuais de cada unha das estruturas de datos que eu vou presentar. Isto significa que non ten que realmente implementar unha táboa hash no seu cuestionario 1. Non queremos que aplique unha táboa hash enteiro, quizais imos tratar para facer aplicar algunhas funcións, as operacións máis comúns, pero non vai facer vostede aplicar todo. Por iso, é importante que entenda o concepto detrás de cada estrutura de datos e tamén que é capaz de codificar en C, só as operacións máis comúns que teñen a cada estrutura de datos. E tamén ser capaz de analizar os punteiros e estruturas, porque aparecen moi nestas estruturas de datos. En primeiro lugar, as listas ligadas. Listas encadeadas son realmente moi semellantes a arrays, pero a diferenza entre unha lista encadeada e unha matriz, en primeiro lugar, que é unha lista encadeada ten un tamaño moi flexible, mentres que en matrices ten que quere escoller un tamaño moi grande para a matriz, para que vostede sabe que vai ser capaz de almacenar todos os datos en que matriz, ou tes que usar malloc para ter unha lonxitude flexible da matriz. En listas ligadas é moi fácil, é só incorporarse máis elementos, poñer máis elementos na lista ligada ou eliminar elementos. E, de feito, se non quere que a lista ligada a seren clasificados, pode buscar e eliminar elementos en tempo constante, entón A (1) tempo, polo que é moi cómodo. Só ten que ter coidado de lembrar sempre de malloc e free os nós, só porque se non fai iso, vai ter perdas de memoria. Entón listas ligadas - a definición dun nodo é como o que temos aí. Engada int n, pero pode almacenar todos os datos que quere. Entón, se quere gardar unha cadea, está ben. Se desexa almacenar unha estrutura, está todo ben, un dobre, o que quere. Acabo de pór int n para os exemplos aquí. E ten un punteiro ao seguinte nodo. Entón, basicamente, unha lista ligada ten algúns datos, e, a continuación, el apunta ao seguinte nodo. Se é o último elemento da lista ligada, que vai ligar a NULL. Polo tanto, este é un exemplo dunha lista ligada. Ok, entón agora imos ver o que temos que facer se eu queira introducir un elemento nunha lista vinculada. En primeiro lugar, unha inserción de función será do tipo void porque eu non quero voltar nada. E eu vou tomar un int como argumento, porque quero saber o que quero inserir. Entón, cal é o primeiro que debería facer? Ben, eu debería malloc en newNode, de xeito que é a primeira liña. Estou só a creación dun novo nodo para poñer nunha lista encadeada. Entón o que podo facer? Así, sabemos que en nosas implementacións de listas ligadas en clase, poñemos sempre a cabeza como unha variable global. Entón, o que podemos facer é cambiar a cabeza. Eu podo facer esta nova nó ser o novo xefe, e só pode apuntar á cabeza anterior. Como podemos facer isto? O primeiro que teño que facer é cambiar o 'n' o novo nó de valor, que foi pasado para a función. Entón newNode é o seguinte será o cabeza. A cabeza será newNode. Por iso, é moi sinxelo. Para eliminar un nodo, podemos facelo como - Un xeito que nós poderíamos facer isto é, Todo ben, se eu quería borrar, por exemplo, 3, o que eu podería facer é só apuntar o no anterior ao seguinte nodo de 3. Entón, eu só estaba a facer algo así. Pero cal é o problema en facelo? Eu teño un baleirado de memoria, entón eu non teño acceso ao número 3 máis. O problema con isto é que eu non vou ser capaz de liberar aquel nó. Vou ter de baleirado de memoria e (inintelixible) me vai odiar. Entón, en vez de facelo, eu probablemente debería ter un punteiro temporal. Entón eu coloque temporal. El vai apuntar para o nodo que desexa eliminar. E entón eu podo mover os nós anteriores para apuntar ao seguinte nodo do no que desexa eliminar. E, finalmente, podo liberar o punteiro. Teño que liberar o punteiro que eu creei alí? Eu non teño que, só porque - a diferenza é que este nodo foi creada usando malloc, polo que é na pila, mentres que este foi só declarado como un interruptor de NULL na pila. Entón, eu non teño para liberalo la. Okay. Entón, agora imos falar sobre pilas. As pilas son moi sinxelo. Fixemos pilas e colas na clase só usando matrices, pero ten que ser familiar - pode estar en conta que tamén pode facer pilas en filas empregando listas ligadas tamén. Entón se ten unha matriz, o que sería unha pila? Unha pila de, por unha banda, terá que ter un tamaño. Ten que gardar o que é o tamaño da pila que ten agora. E tamén tería un array, neste caso dos números, pero se o desexa, pode ser un array de cordas, unha matriz de struct, calquera cousa que quere gardar. Sobre a pila: A diferenza entre unha pila e unha lista ligada é que na pila só ten acceso ao elemento, que foi posto na pila. Chama-se en último lugar, primeiro en saír. Así como ten unha pila de bandexas, se pór unha bandexa encima da pila, tes que eliminar a bandexa primeiro a ter acceso ás outras bandexas. É o mesmo con Stacks. Entón, se eu queira, por exemplo, engadir un elemento a unha pila, o que debo facer? É chamado de impulso, e é moi sinxelo. O primeiro que tes que facer é comprobar se o tamaño da pila non é maior ou igual á capacidade do conxunto. Porque se xa está en plena capacidade, non pode engadir calquera outra cousa. E, a continuación, se non, só ten que engadir o elemento á pila. E, finalmente, incrementar o tamaño. Por iso, é moi sinxelo. Entón, eu só engadir o número 2. E se eu queira aparecer, o que significa que quero eliminar o último elemento que se engadiu e voltar o valor do elemento, o primeiro que ten que comprobar é que a pila non está baleiro. Porque se está baleiro, non podo voltar nada. Nese caso, estou volvendo -1. Se non, eu vou diminuír o tamaño da especificación, e devolver os números (s.size). Por que eu diminuír o tamaño e, a continuación, regresar s.size? É porque, neste caso, a especificación ten tamaño 4, e quero devolver o cuarto elemento, non? Pero o que é o índice do cuarto elemento? Tres. Dende que eu size - será 3, eu só podo voltar s.numbers (s.size) por que é 3. Entón é só o índice. Agora filas. As colas son practicamente o mesmo. A única diferenza é que en vez de pasar in, first out, tes first in, first out. Probablemente, se está esperando para ir a un concerto, non sería feliz se tivese unha pila en vez de unha fila. Sendo a última persoa a entrar sería o primeiro en entrar no concerto. Probablemente non sería feliz. Na cola, a primeira persoa a entrar é tamén a primeira persoa a saír. Así, na definición dunha cola de, ademais de ter o tamaño da matriz, tamén ten que ter a cabeza, que é o índice para o xefe do conxunto. Así, o primeiro elemento no momento. Enqueue é o mesmo que o impulso para Stacks. Se fose moi inxenuo, que tería só que dicir: ben, eu só podo facer exactamente o mesmo que eu fixen por impulso. Podo só comprobar que non é máis alá da capacidade. Se for, eu return false, se non, eu só podo exportar o novo valor e logo, aumentar o tamaño. Pero por que iso é malo? Vexamos este exemplo. Estou tentando fila unha morea de cousas, e entón eu vou a retirar da cola e na fila. Hai unha morea de comandos, pero é moi sinxelo. Vou fila 5, entón engadir 5 e 7, 1, 4, 6, e entón eu quero desenfileirar algo, o que significa que eu estou indo para eliminar o primeiro elemento. Entón, eu estou indo para eliminar o número 3, non? O primeiro elemento. Okay. Agora, se eu tentar fila outra cousa, o que vai pasar? Segundo a miña implantación, Eu ía poñer o seguinte número na q.size índice. Neste caso, o tamaño é de 8, de xeito que o índice de 8 estará aquí na última posición. Se eu tentar fila un aquí, eu estaría substituíndo a última posición ao número 1, o cal é totalmente incorrecto. O que quero facer é embrulhar arredor e ir á primeira posición. Quizais lle gustaría só de dicir, ben, eu só teño que comprobar se realmente pode poñer algo alí. Se non, eu acabo de dicir, ah, a nova capacidade total é realmente capacidade - 1, e non pode poñer un elemento alí. Pero cal é o problema? O problema é que se eu só desenfileirar todo aquí e despois eu intento engadir algo máis, sería só dicir: ben, estaba en plena capacidade, que é 0. Así, a cola está desaparecido. Ten que participa en torno, e un xeito de involucrar ao redor de que vostedes aprenderon en Serie de exercicios visionarios e outros estaba usando mod. Podes probalo na casa para entender por que faría q.size + q.head capacidade de modificación, pero se comprobar aquí, podemos ver que funciona. Así, no último exemplo, q.size foi de 8 e cabeza foi de 1, porque foi aquí esta posición da matriz. Por iso, será 8 + 1, 9. Mod capacidade de 9 sería 0. Ía ao índice 0. Nós imos estar na posición correcta. E, a continuación, tentar a cola na casa. Algunhas cousas importantes: intente entender a diferenza entre unha pila e unha cola. Xa na casa, para tratar de obter moi familiarizado coa implementación de poñela na fila, dequeue, push e pop. E tamén entendo cando usaría cada unha delas. Entón imos relaxarse ​​por 10 segundos, cunha chea de Pokémons. E agora imos voltar a estruturas de datos. Hash táboas. Moitas persoas estaban con medo de táboas de hash. no conxunto de problemas 6, Corrector Ortográfico. As táboas de hash e intentos, moitas persoas están con medo deles. Eles pensan que é tan difícil de entender. Si? [Rob Bowden] Problema xogo 5. Problema axuste 5, si. Grazas Rob. É. Seis era Huff n 'Puff, si. Problema xogo 5 foi Ortográfico, e tiña que usar unha táboa hash ou un intento. Moita xente pensou que eran super difícil de entender, pero son realmente moi simple. ¿Que é unha táboa hash, basicamente? Unha táboa é un conxunto de listas ligadas. A única diferenza entre unha matriz e unha táboa hash é que na táboa de hash que ten algo chamado de función hash. ¿Que é unha función hash? Non sei se vostedes poden ler aquí. Este é un exemplo dunha táboa de hash. Así, podes ver que ten unha matriz con 31 elementos. E o que facemos nunha táboa hash é ter unha función hash que vai traducir unha clave, cada un int a un índice. Se, por exemplo, se eu queira escoller para B. Harrison, Quere poñer B. Harrison en miñas funcións de hash, ea función de hash retornaría 24. Entón eu sei que quero gardar B. Harrison en 24. Así que esta é a diferenza entre ter só unha matriz e ter unha táboa hash. Na táboa hash terá unha función que vai dicir onde almacenar os datos que quere gardar. Para a función de hash, quere ollar a unha función hash que é determinista e ben distribuída. Como podes ver aquí, ve que unha gran cantidade de datos que eu quería tenda era en realidade 19 en vez de usar o 31 e 30 e 29, que foron todos. Así, a función de hash que usei non era moi ben distribuído. Cando dicimos ben distribuída, isto significa que queremos ter, aproximadamente, polo menos, 1 ou 2 para cada unha das - como, unha diferenza de 1 ou 2 para cada un dos índices das matrices. Quere ter, aproximadamente, o mesmo número de elementos en cada lista encadeada na matriz. E é fácil de comprobar se é válido na táboa de hash, ver como táboas de hash. Entón árbores. Esta é unha árbore. Árbores en ciencia da computación están de cabeza para baixo por algún motivo. Entón, aquí tes a raíz da árbore e, a continuación, as follas. Debe só saber a nomenclatura para os pais eo neno. Cada nodo ten os seus fillos, que son os nós que están por baixo do pai. Así, por exemplo, 2, será o pai para 3 e para a outra neno alí mesmo, mentres 3 será o pai dunha e os outros nenos que están aí. E un será 3 do neno, e así por diante. Temos algo moito máis interesante, chamado dunha árbore de busca binaria, no que todos os valores á dereita dun nodo van estar á dereita, aquí - na dereita, será maior que o elemento da raíz. Entón, se eu teño o número 5 aquí, todos os elementos á dereita será maior que 5, e na parte esquerda todos os elementos que van ser inferior a 5. Por iso é útil? Ben, se eu queira comprobar que o número 7 está aquí, por exemplo, Acaba de ir a 5 primeiro e eu vou ver, é 7 maior ou menor que 5? É máis, entón eu sei que vai ter que ser na parte dereita da árbore. Entón, eu teño moito menos cousas para ollar. Na posta en marcha dunha árbore de busca binaria, o no, eu só vou ter que ter datos, así int n; tamén pode ter unha cadea ou calquera cousa que quería. Só ten que ter coidado en definir o que é máis, o que sexa menor. Entón se tivese cordas, por exemplo, pode definir que todas esas cousas á dereita terá lonxitude maior, a esquerda terá lonxitudes pequenas, polo que é realmente ata. Como podo aplicar para atopar CEST? O primeiro que tes que facer é comprobar que a raíz é NULL. De ser NULL, significa que a cousa non está aí porque non ten nin unha árbore, non? Entón eu voltar false. Se non, eu vou comprobar se o número é maior que o valor da raíz. Vou tentar atopar o elemento á dereita da árbore. Vostede ve que eu estou a usar recursão aquí. E entón ser menos, eu vou ollar para a esquerda. E, finalmente, doutro xeito, se non é menos ou non maior, isto significa que é o propio valor. Entón, eu só retornar true. Podes ver aquí que eu usei, se si, se. E lembre, o cuestionario 0, tivemos un problema que tiña, se si, se, e ten que atopar a ineficiencia, ea ineficiencia foi que usou se. Debería usar se, else if, else if e else. Entón, eu debería usar else if e else if e else aquí? Alguén - É mesmo? [Falando Student, inaudível] É xenial. Entón, ela está dicindo que non importa, só porque a ineficiencia que tiñamos antes foi que, porque, se cadra, se algunha condición foi satisfeita, para que teña realizado unha acción, pero así que ía comprobar as outras condicións. Pero, neste caso, voltou de inmediato, polo que non importa. Entón non ten que empregar else if. E, finalmente, imos falar de intentos, cal é o favorito de todos. O intento é unha árbore de matrices. É moi rápido para buscar valores, pero usa moita memoria. E é, xeralmente, para filtrar as palabras, entón cando pretende levar, por exemplo, eu non sei, como un libro de teléfono no seu teléfono e quere ser capaz de tipo B e só ten os nomes de persoas que teñen B. É moi fácil de implementar que o uso de un intento, por exemplo. Como define un nó nun intento? Vostede só ten que ter un bool que será is_word. Isto representa que o uso de todos os personaxes antes de que o no, que foron capaces de formar unha palabra, e entón vai ter unha matriz de punteiros para os nós. Podes ver que temos un conxunto de nós pai, entón nodo * array? Si? Entón, imos ver como iso vai funcionar. Para a comprobación ortográfica, temos unha matriz de 27 elementos, porque temos todas as letras máis o apóstrofo. Antes aquí eu só vou usar 2, porque quero ser capaz de escribir no cadro. Okay. Polo tanto, este é un exemplo de un intento. Se eu definir o primeiro nodo, eu vou ter unha matriz de dous elementos que son dous punteiros para NULL, entón eu só poñer 'a' e 'b'. E eu vou ter un booleano que di is_word. Vai ser falso para o primeiro, só porque, antes de que non ten ningún carácter. Así, unha palabra baleira non é unha palabra. Polo tanto, é falsa. Se eu queira engadir 'a' a este dicionario, o que eu teño que facer? Eu só que malloc un novo nodo a 'a', e, a continuación, engadir a súa palabra como certa. Por iso, só representa que ter 'a' será verdade. Ten sentido? Entón, se eu queira engadir 'ba', eu vou ter que malloc 1 para 'b', e entón eu vou configurar a booleana como false, porque 'b', por si só non é unha palabra. Entón eu estou indo a malloc outro para 'a', entón 'ba', e entón eu vou montar é unha palabra de verdade. Por 'ba' é unha palabra. E entón, se quero ver se 'b' é neste dicionario, Podo ir ao primeiro, 'b'. Eu baixar, e eu ollar é palabra, e ela di que falsa. Polo tanto, non é unha palabra. Se eu queira revisar 'ba', Vou para o primeiro, 'b', e logo ir a 'a', e eu vexo certo, polo que é unha palabra. Ten sentido? Moitas persoas están confusas coa intentos. Non? Finalmente, codificación Huffman. Codificación de Huffman é moi útil para aforrar memoria e comprimir arquivos de texto, só porque unha morea de veces que usa 'a' e 'e', ​​por exemplo, nos seus documentos, pero eu non sei se vostedes utilizan 'q' ou 'z' tanto. Tendo só 1 byte para cada personaxe, cada - os 256 carácteres que temos na táboa ASCII non é moito mellor, só porque hai algúns personaxes que utiliza moito máis, entón probablemente usar menos memoria para aqueles. Como fago para usar o código de Huffman? Temos que facer unha árbore de Huffman.  Unha árbore de Huffman ten nós que ten un símbolo que será como, 'a', 'b', 'c', a carta, letra que ten, unha frecuencia que é a frecuencia con que a palabra aparece no texto, que estaba creando a árbore de Huffman para, e logo, un nó que vai apuntar á esquerda da árbore Huffman e outro no que vai apuntar á dereita. Así como unha árbore. Como constrúe unha árbore de Huffman? Vai escoller os dous nós que teñen as frecuencias máis baixas. Se tes un lazo que vai escoller os 2 nós que teñen os valores máis baixos, así ASCII. Axiña, vai crear unha nova árbore fóra destas 2 nós que terá a miúdo combinados no nodo pai. E entón está indo para eliminar os dous fillos do bosque e substitúe-los co pai. E vai repetir iso ata que só ten unha árbore no bosque. Entón, imos ver como faría unha árbore Huffman para ZAMYLA. Podes ver aquí que todas as cartas teñen frecuencia 1, excepto a 'A'; que frecuencia 2. Entón, eu criei nós para todas as letras que engada en orde de valor ASCII e frecuencia. Entón, se eu quere crear a primeira árbore, será con 'L' e 'M'. Entón é aquí. A frecuencia do par será 2 por que é 1 + 1, entón o seguinte 2 coas frecuencias máis baixas son 'Y' e 'Z'. E entón eu teño todos eles ser - teñen unha frecuencia de 2. Entón, cales son os que teñen o valor ASCII menor para o seguinte? 'A' e 'L'. Entón eu crear o novo nó, e, por fin, é 4 e 2, entón 2 será do lado esquerdo. E esta é a árbore de Huffman. Entón, se eu quero escribir un texto, como en binario para converter en texto, a través da árbore de Huffman é moi sinxelo. Por exemplo, se eu digo que o cambio para a esquerda é a 0 e movendo á dereita é un 1, Que é o que vai representar? Así como 1, 1, xa que logo, dereita, dereita, e logo, 0, de xeito que sería deixar G, e logo, 1, 0, 0. Entón, 1, 0, así só 1, 0, 'A'. E, a continuación, 0, 1, de xeito que "Z". E, a continuación, 1, 0, 0 - ningún. 0, 0 será 'Y', de xeito preguiceiro. Entón, iso é todo para min, Rob vai asumir. [Rob Bowden] Así, a semana 7 cousas. Temos moito que pasar por riba moi rápido. Operadores bit a bit, buffer overflow, Biblioteca CS50, a continuación, HTML, HTTP, CSS. Todo como en 15 a 20 minutos. Operadores bit a bit. Hai seis deles que precisa saber. Bit a bit e, bit a bit OR, XOR, desprazamento á esquerda, desprazamento cara á dereita, e non. Dereito cambiar e non apenas viu en charla en todo. Nós imos pasar por iso rapidamente aquí, pero é bo saber que estes son os 6 que hai. Lembre que os operadores bit a bit é como cando fai 3 + 4. Non está lidando con o binario de 3 e 4. Con operadores bit a bit en realidade está lidando cos bits individuais dos números 3 e 4. Entón, o primeiro que imos dicir é bit a bit non, e todo o que fai é inverter as bits. Entón, aquí, se está escribindo isto en C, non gravala-lo como ~ 11011 ou calquera outra cousa, podería escribilo como ~ 4, e logo, ía virar a representación binaria de 4. Entón, aquí,-dun número binario 1101101 vai virar exactamente as 1 do que 0 e todo 0, 1 de. Como dixen alí, o uso frecuente desta, e nós imos velo en algo, é coma nós queremos chegar a algún número onde todos os bits son 1, con excepción dun deles. Por iso, é xeralmente máis doado de expresar o número onde só aquel único bit é definido, e, a continuación, tomar o ~ del, entón todos os outros bits defínese, excepto por iso. Entón é iso que nós imos usar un pouco máis. OU bit a bit. Aquí están dous números binarios, e eses 2 números son moi representativo, xa que representan todas as posibles combinación de bits que precisa para operar. Aquí, cando clicaria cada bit, nós só estamos indo a comparar directamente abaixo. Así, na parte esquerda, temos un 1 e un 1. Cando bit a bit | aqueles, que é o que eu vou conseguir? Unha. Logo bit a bit | 0 e 1 que me vai dar? Unha. Bit a bit 1 e 0, será o mesmo, un. Bit a bit 0 | 0 me vai dar 0. Así, o único caso en que eu recibín 0 é o 0 | 0 caso. E pode pensar que, así como os seus alcaldes lóxicas. Entón, se pensar en 1 como certo e 0 como falso, o mesmo se aplica aquí. Tan certo ou certo é certo, verdadeiro ou falso é certo. Falso ou verdadeiro é certo, falso ou falso é o único que é realmente falsa. Aquí está o exemplo que debes saber como un bo exemplo de cando operadores bit a bit son usados. Aquí se ou 'A' maiúsculo con OX20, e imos ollar para iso nun segundo, temos algo. E se nós ou minúsculas 'a' con OX20 temos algo. Entón, imos puxar arriba da táboa ASCII. Okay. Aquí vemos que 'A' é - aquí temos 'A' é decimal 65. Pero eu vou con hexadecimal, que é Ox41. Seguro que xa vimos en clase. Eu creo que nós vimos en clase que é moi doado converter hexadecimal para binario. Entón, aquí, se eu queira poñer 4 en binario, que só será 0100. Este é un lugar de, lugar de 2, 4 do lugar, polo que este é 4. Entón eu podo dividir 1 en binario, que será 0001. E así é que isto vai ser a representación de 'A' en binario. Tendo en minúsculas 'a', é agora será Ox61, onde, dividíndose estes no seu binario, para 6 - Imos realmente facelo - que non hai goma? Eraser. Ox61. Entón, dividindo 6 en binario será 0 + 4 + 2 + 0. E a división 1 será 0001. Mirando para a diferenza entre estes dous, vemos que a única diferenza entre unha letra minúscula e un 'A' maiúsculo é este único bit. Entón, volvendo para aquí - todo ben. Voltar aquí, se miramos para o que o bit é OX20, OX20 así dividindo-se no seu binario, é 0010, 0000. OX20, o único bit que está definido é este pouco que estamos preocupados, coa alternancia entre capitais e minúsculas 'a'. Se eu ou 'A', que é un agasallo, 'A', se eu ou 'A' con OX20, que é o que eu vou conseguir? [Student, inaudível] minúsculas 'a', porque vai virar este bit a 1. E se eu ou 'a' con OX20, que é o que eu vou conseguir? Minúsculas un, porque só ORING 'a' con OX20, Eu só vou ser ORING este único bit a 1, que xa está a 1, polo que non importa. Entón, temos 'a' e 'a'. Bit a bit e. Unha vez máis, podemos pensar niso como a nosa contrapartida lóxica e. Na parte esquerda temos certo e fiel. Vai ser verdade, e para todos os casos, falso e certo ou verdadeiro e falso, ou falso e falsa, ningunha destas cousas son certas. Entón, o que acaba ficando é 1000. Entón, agora, aquí, aquí é onde eu usei o bit a bit de confianza non, onde tivemos OX20. Polo tanto, esta é OX20. Agora o que quero facer, bit a bit ~ de OX20. Isto vai invertir todo bits. Entón, eu teño 1101, 1111. E así 'A' anded con ~ OX20 me vai dar o que? A única parte que realmente necesitamos pensar é un regalo, xa que, se todos eses bits son definidos a 1, entón nós estamos indo a obter exactamente o que 'A' é, agás, quizais, o que é pouco. Por se fose a 1, agora que vai ser definido a 0, porque todo o que iso é, anded con iso será 0. Entón o que é 'A' e ~ OX20 me vai dar? [Os alumnos responden, inaudível] E o que é 'a' e - é 'A'. E o que é 'a' + ~ OX20 me vai dar? 'A.' Porque este é actualmente a 1. Anding con este 0 vai facelo un 0, e agora estamos indo a obter un 'A'. Ambos son 'A', e por último, pero non menos importante deste tipo, temos XOR. É moi parecido, ou, agás que significa exclusivamente ou. Este é parecido co que adoita pensar en como ou no mundo real. Entón quere 'x' ou 'y', pero non ambos. Aquí 1 ^ 1 será 0. Porque a verdadeira, é dicir - non funciona tan ben co lóxico certo e falso como bit a bit e e ou facer, pero é verdade ^ certo é falso. Porque nós só queremos voltar true se só un deles é certo. Así, un ^ 1 é 0. E como a 0 ^ 1? É 1. 1 ^ 0 é de 1, 0 ^ 0 é 0. Así, en todas as circunstancias, bit a bit 0 0 algo será 0. 1 bit a bit algo 0 ou 0 1 bit a bit, se é | ou ^, será a 1, e se é e será 0. E o único caso no que un bit a bit 1 non é un é coa exclusiva ou. Iso é 0110. Entón, aquí, agora, usando XOR - entón estamos de volta a 20. 'A' ^ OX20 é eses 2 bits que estamos comparando. Así, a 1 ^ 0 me vai dar unha cousa? A unha. 'A' ^ OX20 me vai dar? Minúsculas a. 'A' ^ OX20 me vai dar? Capital A. Porque todo o que iso está facendo, este XORing con OX20 é efectivamente lanzando todo o que este bit é. Se este é un 0, el agora vai facer un 1. Xa que este é un 1, 1 ^ 1 é 0. Polo tanto, a nosa 'a' converteuse en 'A', ea nosa 'A' converteuse en 'a'. Entón XOR é un xeito moi cómodo de só lanzando o caso. Só quere iterado sobre unha secuencia de letras e cambiar o caso de cada personaxe, só XOR todo con OX20. Agora nos queda quenda. Desprazamento á esquerda é só vai basicamente empurrar todos os números para, ou á esquerda, e inserir 0 de tras deles. Polo tanto, temos aquí 00001101. Imos empurrar 3 0 do da dereita, e temos 01101000. En termos non binarios, vemos que iso está realmente lidando 13 con 3 desprazouse esquerda, que nos dá 104. Entón desprazamento á esquerda, vemos aquí, x << y é basicamente x * 2 ^ y. 13 * 2 ^ 3, 2 ^ 3 a 8, de xeito que 13 * 8 é 104. Se só pensar en binario, en xeral, como cada un díxito, Se comezar a partir da dereita, é a 1 do lugar, entón a 2 do lugar, entón a 4 do lugar. Entón, empurrando 0 do da dereita, estamos só empurrando as cousas que estaban no 4 do lugar para o 8 de lugar, e as cousas que estaban no 8 de lugar a lugar, a 16 de. Cada quenda só multiplica por 2. Si? [Estudante] Que pasa se desviado por 5? [Bowden] Se desviado por 5, só ía perder díxitos. Inevitablemente, é o mesmo. Como, enteiros son só 32 bits por iso, se engadir dous realmente grandes enteiros, el simplemente non encaixa nun enteiro. Entón, é o mesmo aquí. Se cambiou por 5, teriamos só perder esta. E iso é o tipo de cousas que quero dicir con "máis ou menos", onde se cambiar moito, perde bits. Cambio dereito será o contrario, onde imos enfiar 0 de fóra da final, e para os nosos propósitos, enche 0 do da esquerda. Entón, a facer iso, estamos basicamente desfacer o que xa fixera. E vemos que os tres 0 na dereita acabaron caído, e nós ter empurrado o 1101 todo o camiño para a dereita. Isto fai 104 3, que é, de forma eficaz, x / 2 ^ y. Entón, agora, aquí, é unha idea similar. Por que é só preto de x / 2 ^ y, e en realidade non x / 2 ^ y? Porque se eu cambiara por 4, eu perdería a 1. Basicamente, o que pensar, só pensar en división enteira en xeral. Así, como 5/2 é 2. Non é 2.5. É a mesma idea aquí. Cando dividimos por 2, podemos perder anacos estraños ao longo do camiño. Entón agora - é isto para bit a bit. Isto é todo o que precisa saber. Teña en conta que os casos de uso que vimos en clase, como unha máscara de bits é útil para operadores bit a bit, ou usalos para máscara de bits. As letras maiúsculas e minúsculas, conversións é un exemplo moi prototipo. Ok, entón ataques de buffer overflow. Alguén recorda o que estaba mal con esta función? Lembra que declaramos un array de 12 bytes, 12 caracteres, e logo copiar a nosa memoria intermedia de 12 caracteres de todo o bar cadea. Entón, cal é o problema aquí? O número máxico 12 debe aparecer practicamente inmediatamente como - por que 12? E si bar pasa a ser máis de 12 caracteres? E si bar é millóns de personaxes? Aquí o importante é memcpy. Se a barra é suficiente, ela só vai completamente - 'c', 'c' non lle importa que tiña só 12 carácteres; 'C' non lle importa que non pode caber moitos bytes. Ha substituír só completamente char, os 12 bytes que xa alocados para el, e todo pasado, na memoria que en realidade non pertencen a ese tapón co que o bar cadea é. Polo tanto, esta foi a imaxe que vimos en clase onde temos a nosa pila crecendo. Debe ser usado para estas imaxes ou familiarizado con eles de novo. Temos a nosa pila crecendo, enderezos de memoria comezan en 0 na parte superior e medrar ata gusto 4 millóns na parte inferior. Temos a nosa disposición 'c' nalgún lugar na memoria, entón temos a nosa punteiro para untar dereita por baixo, e entón temos este punteiro cadro gardadas no noso enderezo de retorno e pila da nosa rutina pai. Lembre que o enderezo de retorno é? É cando principal chama unha función foo, chama unha barra de funcións, inevitablemente, untar retorno. Entón, cando a barra de volta, eles precisan saber que vai voltar á foo que o chamou. Así, o enderezo de retorno é o enderezo da función que ten que volver para cando a función devolve. A razón pola que isto é importante para ataques de estourido de buffer é porque, cómodo, hackers quere cambiar o enderezo de retorno. No canto de volver a foo, eu vou volver a onde queira que o hacker queira que eu vaia volver. E, cómodo, onde o hacker miúdo quere volver a é o principio da memoria intermedia que tiña orixinalmente. Entón, teña en conta, de novo, Little Indian. O aparello é un exemplo dun sistema indio pequeno, así un número enteiro ou un punteiro é almacenado cos bytes invertidos. Entón, imos ver - é iso? É. Vemos Ox80, OxC0, Ox35, OxO8. Teña en conta que dos díxitos hexadecimais? Non inverter os díxitos hexadecimais en Little Indian, porque dous díxitos hexadecimais compoñen un único byte, e inverter os bytes. É por iso que non almacenan, como, 80530CO8. Nós almacenar, no seu lugar, cada par de dous díxitos, a partir da dereita. Este enderezo refírese ao enderezo do inicio da nosa memoria intermedia que realmente quería copiar, en primeiro lugar. A razón que é útil porque, o que se o atacante pasou, en vez de ter unha secuencia que era só unha secuencia de como inofensivo, o seu nome ou algo así, E si, ao contrario, esta secuencia foron só algunhas de código arbitrario que fixo todo o que quería facer? Así, eles poderían - Eu non podo pensar en ningún código legal. Podería ser calquera cousa, con todo. Calquera código desastroso. No caso de que quixesen, poderían simplemente facer algo en fallos segmentos, pero iso sería inútil. Eles adoitan facelo para invadir o seu sistema. Okay. Biblioteca CS50. É dicir, basicamente, getInt, getString, todas estas funcións que nós fornecen para ti. Polo tanto, temos de char cadea *, e esa é a abstracción que sorprendeu nalgún momento durante o semestre. Lembre que unha cadea é só un conxunto de caracteres. Entón, imos ver unha versión resumida do getString. Ten que mirar para atrás, el lembrar de como é realmente aplicado. Detalles importantes son, teña en conta que recibimos nun único carácter de cada vez de patrón en, que é como nós escribindo no teclado. Así, un único personaxe de cada vez, e se logramos moitos personaxes, por iso, se n + 1 é maior que a capacidade, entón necesitamos aumentar a capacidade do noso buffer. Entón, aquí estamos dobrando o tamaño do noso buffer. E iso segue a suceder, nós introducir o carácter na nosa memoria intermedia ata que recibamos unha nova liña ou fin de ficheiro ou calquera outra cousa, neste caso, estamos a facer coa corda e logo, o certo getString encolle a memoria, como se nós alocados moita memoria que vai volver e encoller un pouco. Entón, nós non mostran tanto, pero a idea principal é ten que ler nun único personaxe de cada vez. Non pode simplemente ler nunha cousa toda dunha vez, xa que o seu tapón é só dun certo tamaño. Entón, se a cadea que intenta introducir no búfer é moi grande, entón sería rebosar. Entón imos evitar isto por só lendo nun único carácter de cada vez e cada vez maior, sempre que necesites. Entón getInt e as outras funcións da biblioteca CS50 tenden a usar getString nas súas implementacións. Entón, eu destaquei as cousas importantes aquí. El chama getString para obter unha cadea. Se getString non puido volver á memoria, lembre que getString mallocs algo, entón sempre que chamar getString non debe (inintelixible) gratis esa secuencia que ten. Entón, aquí, se el non pode malloc algo, volvemos INT_MAX como só unha bandeira que, hey, nós non estabamos realmente capaz de obter un número enteiro. Debe ignorar o que eu voltar a vostede, ou non debe tratar isto como unha entrada válida. Por último, asumindo que tivo éxito, usamos sscanf con esa bandeira especial, o que significa, en primeiro lugar corresponder a un número enteiro, entón combinar ningún carácter tras ese enteiro. Entón, teña en conta que queremos igual a 1. Retorno Entón sscanf cantos xogos se fixo correctamente? El pode voltar 1 se combinaba con éxito un número enteiro, el pode voltar 0 se non corresponder a un número enteiro, e ha voltar 2 se correspondese un número enteiro seguido por algún personaxe. Entón, teña en conta que tenta de novo se nós quedamos nada, pero 1. Polo tanto, se entrou 1, 2, 3, C, ou 1, 2, 3, X, logo, 1, 2, 3 que se almacenan no número enteiro, X que quedan almacenados no personaxe, sscanf volvería 2, e queremos tentar de novo, porque nós só queremos un enteiro. Golpe rapidamente a través de HTML, HTTP, CSS. HyperText Markup Language é a estrutura ea semántica web. Aquí está o exemplo de clase onde temos as etiquetas HTML. Temos as etiquetas de cabeza, marcas no corpo, temos exemplos de etiquetas baleiras onde nós realmente non teñen un comezo e preto tag, só temos ligazón e imaxe. Non hai tag de imaxe de peche; hai só unha única marca que realiza todo o que a etiqueta debe facer. A ligazón é un exemplo, imos ver como vincular a CSS, o guión é un exemplo de como chamar a un JavaScript externo. É moi sinxelo, e lembre, HTML non é unha linguaxe de programación. Aquí, recordo como definiría dunha ou polo menos o que isto faría? Esa forma ten unha acción e un método. Os métodos que só vai ver son GET e POST. Entón Get é a versión en que a cousa é colocado na URL. POST é onde non colócase na URL. Pola contra, todos os datos do formulario insírese máis oculto na solicitude HTTP. Entón, aquí, a acción define onde a solicitude HTTP vai. Onde vai é google.com / search. Método. Teña en conta que as diferenzas entre GET e POST, e, diga só como un exemplo, se quere marcar algo. Vostede non será capaz de marcar unha URL POST Porque os datos non son incluídos na URL. HTTP, agora, é HyperText Transfer Protocol. O Protocolo de Transferencia de Hipertexto, esperar que transferir HyperText Markup Language, e fai. Pero tamén traslada todas as imaxes que se atopa na web, todas as descargas que fai comezar como unha solicitude HTTP. Entón HTTP é só a linguaxe da World Wide Web E aquí hai que recoñecer que este tipo de unha solicitude HTTP. Aquí HTTP/1.1 no lado só di que é a versión do protocolo que está a usar. É practicamente sempre será HTTP/1.1, como vai ver. Entón vemos que iso era GET, a alternativa de ser POST, que se pode ver. E a URL que eu estaba tentando visitar foi www.google.com/search?q = blah, blah, blah. Entón lembre que este, o punto de interrogación q = bla bla bla, é o tipo de material que é enviado por un formulario. A resposta que podería volver a me sería algo coma isto. Unha vez máis, comezando co protocolo, que será iso, seguido polo código de estado. Aquí é 200 Aceptar. E, finalmente, a páxina web que realmente pedín será seguido. A posible código de estado que se pode ver, e ten que saber varios deles. 200 OK, probablemente xa viu antes. 403 Prohibido, 404 Not Found, Error 500 Internal Server xeralmente é se vai a un sitio web e algo está roto ou os seus accidentes de código PHP, mentres que no aparello, temos que gran caixa de laranxa que vén e di, como, algo está mal, este código non funciona ou iso é malo función. Normalmente sitios non queren que vostede sabe que as funcións son realmente malas, así, no canto van só darlle 500 Internal Server Errors. TCP / IP é unha capa baixo HTTP. Lembre que non hai Internet fóra da World Wide Web Como se xogar un xogo online que non pasa por HTTP, el está pasando por un distinto - aínda está a través da internet, pero el non usa o HTTP. HTTP é só un exemplo de protocolo construído sobre TCP / IP. IP significa Internet Protocol, literalmente. Cada ordenador ten un enderezo IP, que son esas cousas de 4 díxitos como 192.168.2.1, ou o que, que tende a ser un lugar. Pero ese é o patrón dun enderezo IP. Así, o DNS, Domain Name Service, iso é o que se traduce cousas como google.com a un enderezo IP real. Entón, se escribir este enderezo IP nunha URL, que ía leva-lo a Google, pero tende a non lembrar desas cousas. Tende a lembrar google.com no seu lugar. A última cousa que temos é portos, onde esta é a parte TCP IP. TCP fai máis. Pense, como, ter o seu navegador en execución web. Poida que teña algún programa de correo-e está a ser executado; quizais ten algún outro programa que utiliza a Internet en funcionamento. Todos precisan de acceso a Internet, pero o ordenador só ten unha tarxeta Wi-Fi ou o que sexa. Así, os portos son a forma que nós somos capaces de dividir como estas aplicacións son capaces de utilizar a Internet. Cada aplicación obtén unha porta específica que poida escoitar, e, por defecto, HTTP utiliza o porto 80. Algúns servizos de correo-e usar 25. Os de baixa de número tenden a ser reservados. Vostede xeralmente son capaces de obter os con numeración máis alta para si mesmo. CSS, CSS. Páxinas web Nós estilo con CSS, non con HTML. Existen 3 lugares que pode poñer o seu CSS. Pode ser en liña, entre marcas de estilo, ou nun ficheiro separado e logo, completamente ligado dentro E aquí é só un exemplo de CSS. Debe recoñecer ese estándar, onde o primeiro exemplo é que estamos combinando a etiqueta corpo, e aquí estamos centrando a etiqueta body. O segundo exemplo, estamos combinando a cousa ID de rodapé, e estamos aplicando algúns estilos para iso. Teña en conta que o ID de rodapé de texto aliñan á esquerda, mentres aliñan texto corpo central. Rodapé está dentro do corpo. Será, no seu lugar, text-align esquerda, aínda que o corpo di centro text-align. Esta é toda a parte en cascada dela. Pode que - pode especificar estilos para o corpo, e despois as cousas no corpo que pode especificar estilos máis específicos, e as cousas funcionan como esperado. Especificadores CSS máis específicas teñen precedencia. Eu creo que é iso. [Alí Nahm] Hola a todos. Se eu puidese chamar a atención. Estou Alí e eu vou pasar por PHP e SQL moi rápido. Así, podemos comezar. PHP é curto para PHP: Hipertexto Preprocessor. E como todos vostedes deben saber, é unha linguaxe de script do lado do servidor, e usalo para o back-end de sitios web, e como fai unha morea de cálculos, a parte detrás escenas. Sintaxe. Non é como C, sorpresa, sorpresa. El sempre ten que comezar coa, se pode ver, o - eu non podo seguir adiante. Podes ver o que precisa os novos tipos de dispositivos e, a continuación, tamén precisa do? Php. Isto sempre é como ten que enmarcar o texto PHP, seu código PHP. Polo tanto, non pode ser igual a A, onde o tipo de poñelas en primeiro lugar. Debe cercar-lo sempre. E agora, a maior sintaxe é que todas as variables precisas para comezar co caracter $. Debe facelo cando está definíndose os, ten que facelo cando está referíndose a eles máis tarde. Sempre ten que US $. É o seu novo mellor amigo, moi bonito. Non - ao contrario de C, non poñer o tipo de tipo de variable que é. Entón, mentres ten que facer o $, non poñer, como, int x ou y corda, etc, etc. Entón, unha pequena diferenza. Como resultado disto, significa que o PHP é un tipo feblemente. PHP é unha linguaxe de tipo feblemente, e ten variables feblemente ingresaran. Noutras palabras, iso significa que pode cambiar entre os distintos tipos de tipos de variables. Pode almacenar o seu número 1 como un int, pode almacena-lo como unha cadea, e pode almacena-lo como un float, e todo o que vai ser o número 1. Aínda que estea almacenando o en diferentes formas, aínda é - os tipos de variables aínda están sostendo ao final. Entón, se ollar aquí, se lembrar de pset 7, moitos de vós probablemente tivo problemas con iso. Dous sinais iguais, tres signos de igual, 4 sinais igual. Ok, non hai catro signos de igual, pero hai 2 e 3. Podes usar dous signos de igual para comprobar os valores. Pode comprobar en todo tipo. Entón, se pode ver o primeiro exemplo, Teño num_int num_string ==. Polo tanto, a súa int e súa secuencia son ambos, tecnicamente, 1, pero son tipos diferentes. Pero para os dous iguais, aínda vou pasar. Con todo, para os tres iguais, verifica valor, así como os distintos tipos. Isto significa que non vai pasar nese segundo caso aquí, onde está a usar tres signos de igual no seu lugar. Entón, iso é unha gran diferenza que debe todo mostraron agora. Concatenación de cadea é outra cousa poderosa que pode usar en PHP. É basicamente esta a notación de punto a man, e é así que pode conectar cordas xuntos. Entón se ten gato e ten can, e quere poñer as dúas cordas xuntas, pode utilizar o período, e iso é tipo de como funciona. Tamén pode simplemente poñer-los á beira do outro, como podes ver aquí no exemplo de fondo, onde eu eco secuencia 1, corda espazo 2. PHP saberá para substituír-los como tal. Arrays. Agora, en PHP, hai dous tipos de matrices. Pode ter matrices regulares, e tamén pode ter arrays asociativos, e nós imos pasar por eles agora. Matrices regulares son só iso en C, e por iso ten índices que son numerados. Agora estamos indo só para crear un e poñer - entón é así que crear unha matriz baleira, entón imos posto no número de índice 0. Nós imos poñer o número 6, o valor 6. Pode velo na parte inferior aquí. Where 's - polo número de índice 1, imos poñer o número valor 4, e así se pode ver que hai un 6, hai un 4, e entón, como estamos imprimindo cousas, cando tentamos e imprimir o valor almacenado no número de índice 0, entón imos ver o valor 6 sendo impreso. Legal? Entón, iso é matrices regulares para ti. Outra forma que tamén pode engadir cousas para matrices regulares agora é que pode simplemente anexo-los ao final. Isto significa que non ten que especificar o índice específico. Pode ver o número e logo, entre corchetes non hai ningún contido especificado. E vai saber - PHP saberá só engadir lo ao final da lista, o seguinte lugar libre. Así pode ver o 1 alí, naquel 0 spot, o 2 foi a dereita alí no primeiro lugar. O 3 vai - se engade alí tamén. Entón, este tipo de ten sentido. Só está constantemente engadindo-lo, e entón, cando estamos mostrando o índice de número 1, ha imprimir o valor 2. Entón temos matrices que son arrays asociativos. As matrices de asociación, en vez de ter índices numéricos, o que fan é, eles teñen índices que están por cadea. Podes ver, no canto de - Eu me livrei de todos os índices numéricos, e agora é key1, key2, key3, e eles están entre comiñas para significar que están as cadeas. Así, podemos ter un exemplo diso. O exemplo diso é que temos o tf, e iso é o nome do índice. Imos poñer "Alí", como o seu nome, o índice, calorías inxeridas, podemos poñer un int esta vez no canto de unha cadea, e despois para os gustos de índice, podemos poñer unha matriz enteira dentro dela. Polo tanto, esta é unha especie de - é un concepto semellante á forma como tivemos índices con números, pero agora podemos cambiar os índices en torno a para telos como cadeas en vez. Tamén pode facelo, ademais de só facelo individualmente, pode facer todo nun só anaco. Así pode ver que tf deste array, e, entón, poñer-los todos nun conxunto xigante corchete. Así que pode acelerar as cousas. É máis que unha opción estilística que non. Temos tamén loops. En C temos lazos que traballan así. Tivemos a nosa matriz, e fomos de índices 0 ao final da lista, e nós imprimir lo de todo, non? Excepto o problema é que, para arrays asociativos, non necesariamente sabe quen índices numéricos porque agora temos os índices de cordas. Agora usamos loops foreach, que, unha vez máis, ten esperanza usados ​​en pset 7. Loops foreach só vai saber cada parte da lista. E el non ten que saber exactamente o índice numérico que ten. Entón tes a sintaxe foreach, polo que é foreach, se pon a matriz. Así, a miña matriz chámase pset, e despois como, a palabra como, e entón pon esta variable temporal lugar que vai empregar só para a cousa específica que vai soster o específico - unha instancia ou unha sección da matriz. Pset nun vai realizar 1, e entón quizais vai soster o número 6, e logo, que realizará o número 2. Pero está garantido para pasar por cada valor único que está na matriz. Funcións útiles que debes saber en PHP son o esixiren, de xeito que pasa a ser de que está incluíndo determinados arquivos, eco, saída, branco. Eu recomendo que ollar para pset 7 e mirar para esas funcións. Pode ter que saber quen, entón eu sempre sei que, exactamente, os que están a facer. E agora imos pasar por alcance moi rapidamente. En ámbito, o PHP é un tipo de cousa funky, ao contrario de C, e por iso estamos indo só para pasar por iso rapidamente. Entón, digamos que comezamos naquela frecha que temos alí. E imos comezar con $ i. Así, a variable 'i' será 0, e nós só estamos indo a perder imprimir lo na medida en que gran caixa branca por alí. Nós imos comezar con i0, e entón nós estamos indo a representala. Polo tanto, hai a 0. E entón nós estamos indo a incrementa-o co lazo para, e logo, que vai ser o valor de 1. Un deles é menor que 3, entón el vai pasar por iso para loop, e logo, imos velo impreso de novo. Estamos indo a incrementa-lo de novo a 2, e 2 é inferior a 3, polo que vou pasar o loop for, e só pode imprimir a 2. Axiña, vai notar que 3 non sexa inferior a 3, polo que imos saír do loop for. Entón, agora nós saíu, e entón nós estamos indo a ir en AFunction. Okay. Entón tes que ter en conta que esta variable que creamos, a variable 'i', non ten como ámbito localmente. Isto significa que non é lugar para o loop, e esta variable tamén se pode acceder e cambiar despois, e aínda vai ser eficaz. Entón, se vai para a función de agora, vai ver que nós tamén usan o 'i' variable, e imos incrementar 'i' + +. Vostede pensar que, nun primeiro momento, con base en C, que é unha copia do 'i' variable. É unha cousa totalmente diferente, o que é correcto. Entón, cando nós imprimir lo, imos imprimir 'i' + +, que vai imprimir de 4, e logo, imos - desculpe. Entón imos acabar fóra desa función, e nós estamos indo a estar onde a frecha é agora. Isto significa que, a continuación, con todo, aínda que a función cambiou o valor de 'i', non se alterou fóra da función, porque a función ten un ámbito separado. Isto significa que cando nós echo 'i', non cambiou no ámbito da función, e así, logo imos para imprimir 3 novo. Diferentes cousas sobre ámbito en PHP que en C. Agora en PHP e HTML. PHP é usada para facer as páxinas web dinámicas. É algo que fai cousas distintas. Temos que é distinto de HTML. Con HTML, que sempre só ten o mesmo estática, como o xeito no que Rob mostrou, mentres que o PHP, pode cambiar as cousas en base a quen é o usuario. Entón, se eu tivera tanto, eu, "Está dentro do sistema como -" e, a continuación, o nome, e podo cambiar o nome. Entón, agora o nome é José, e ten o "sobre min", pero entón eu tamén podo renomear a ter Tommy. E iso sería unha cousa diferente. Entón nós tamén podemos cambiar as cousas diferentes sobre el, e el vai amosar contido diferente baseado no nome. Entón PHP pode tipo de cambiar o que está a suceder no seu sitio. O mesmo aquí. Aínda así, teña en conta que teñen contido diferente, aínda que está tecnicamente aínda acceder a esta mesma páxina web na superficie. Xerando HTML. Hai 2 xeitos diferentes que pode facelo. Entón, nós imos pasar por iso agora. A primeira forma é, ten - si, moito. Entón acaba de ter o seu estándar para lazo en PHP, e entón ecoar en PHP e HTML echo fóra. Usando o que Rob lle mostrou de script HTML e logo a través da impresión PHP só imprimir lo á páxina web. O camiño alternativo é facelo como se separar o PHP e HTML. Así, pode ter unha liña de PHP que inicia o loop for, entón vostede pode ter a liña de HTML nunha cousa separada, e entón rematar o loop, unha vez máis, cun PHP. Entón, é unha especie de separa-lo para fóra. Na parte esquerda, pode que ten todo o - é só unha peza de PHP. Á dereita, podes ver que ten unha liña de PHP, ten unha liña de HTML, e ten unha liña de PHP de novo. Así, separándose o para fora o que están facendo. E vai ter en conta que de calquera forma, a calquera deles, aínda imprimir a imaxe, a imaxe, a imaxe, de xeito que o HTML aínda é impreso do mesmo xeito. E entón, aínda vai ver as 3 foto aparecen no seu sitio. Polo tanto, é de 2 xeitos diferentes de facer o mesmo. Agora temos formas e solicitudes. Como Rob mostrou ti, hai formas de HTML, e imos só brisa a través deste. Ten unha acción e ten un método, ea súa acción tipo de mostra onde está indo para envialo, eo método é se el será un get ou un POST. E unha solicitude GET, como dixo Rob, significa que está indo a poñer-lo nunha forma e vai ve-lo como un URL, mentres unha solicitude POST non vai ver nunha URL. Entón, unha pequena diferenza. Con todo, unha cousa que é unha cousa semellante é que POST e GET son igualmente inseguro. Así, pode pensar que, só porque non velo na URL, isto significa que o post é máis seguro, pero aínda pode velo nos seus cookies na información que está enviando. Entón, non creo que cerca dun ou doutro. Outra cousa a notar é que tamén ten variables de sección. Vostedes utilizaron esta en pset 7 para obter a súa información de identificación de usuario. O que pasou foi que pode usar esa matriz asociativa, o $ _SESSION, e entón é capaz de acceder cousas distintas e almacenar cousas distintas a través das páxinas. A última cousa é que temos SQL, Structured Query Language, e esta é unha linguaxe de programación para xestionar bases de datos. O que, exactamente, son bases de datos? Son coleccións de táboas, e cada táboa pode ter tipos semellantes de obxectos. Entón tivemos unha mesa de usuarios no seu pset finanzas. E por que son útiles? Porque é unha forma de almacenar permanentemente a información. É un xeito de rastrexar cousas e administrar as cousas e realmente velo en diferentes páxinas e manter o control. Mentres que se só almacena-lo nun momento que inmediato e usalo máis tarde, non será capaz de acceder calquera cousa que salvo. Temos 4 cousas importantes que utilizamos para comandos SQL. Temos select, insert, delete e update. Esas son realmente importante para vostedes para saber para o quiz. Imos rapidamente sobre escolla agora. Basicamente, está escollendo liñas de unha base de datos. Entón, se ten, así aquí - temos estas dúas cousas distintas, e queremos seleccionar da táboa de clases onde incrible - onde na columna incrible o valor é 1. Así pode ver aquí, temos estas dúas cousas do nome da clase, CS50 e Stat110, e temos os IDs de clase eo slogan. Por iso, queremos seleccionar toda esta información. Entón podes ver aquí que é unha especie de escoller desta columna incrible, onde todas as cousas son un, e el ten a clase ID, nome da clase e slogan que pode escoller. Como exactamente facer iso no código? Tes que usar PHP. Entón, este é o tipo de como PHP e SQL son relacionados uns ós outros. Agora temos o noso código, e imos usar a nosa función de consulta como fixemos no pset 7, e nós estamos indo para executar a consulta SQL. Entón nós imos ter - a xente sempre ten que comprobar que o triple igual de liña se falsa. Entón, de novo, quere comprobar o tipo e valor, e logo, se non funciona, entón quere desculparse, como de costume, como fixemos no pset 7. En caso contrario, quere percorrer todo con aqueles accesibles foreach loop que só pasou. Agora que estamos loop e conseguimos gañar, imos supor que a nosa consulta pasou, agora temos o noso loop foreach. E a primeira liña ten, entón aquí está a liña, aquí, é casetonado. Vai imprimir toda a información que chega. Entón, que vai imprimir na parte inferior "Wanna Saber HTML?" Entón está indo a ir á seguinte liña, xa está concluído o primeiro ciclo for, e así, logo que vai imprimir a segunda liña do mesmo, que será STAT110, Buscar todos os momentos. Unha última cousa é sobre as vulnerabilidades de SQL. Sei que David tocou neste un pouco na clase. Podes ler máis tarde. É moi divertido. SQL Injection é un tipo de cousa complicada. Digamos que se ater só estas variables á dereita na súa consulta, como podes ver nesta primeira liña. Así, parece ben, non? Está só poñendo o seu nome de usuario e contrasinal para a consulta SQL, e quere envialo fóra e conseguir todo o que está na súa táboa de datos. Isto parece moi sinxelo. Entón, digamos que alguén pon en, para o contrasinal, este ou texto aquí - realmente debe ser na caixa vermella. Entón, imos dicir que eles puxeron esa contrasinal - que é o que eles entran. Entón, eles están poñendo ou "1" = 1. Unha especie de contrasinal boba de ter. Agora imos substitúe-lo, e vai notar que nesa pesquisa agora, avalía para sempre certo, porque vai ter en conta que podes pesquisa seleccionar toda esta información ou pode só ter 1 = 1. De xeito que sempre vai avaliar a true. Iso non vai realmente funciona, porque iso significa que o hacker pode invadir o seu sistema. A solución para iso é que ten que empregar o sistema de DOP, o que significa que ten que empregar puntos de interrogación, que é o que vostedes usan na pset 7, onde está indo para usar un punto de interrogación no lugar de onde quere poñer algo, e entón vai ter unha coma, e entón vai ter despois, despois da súa secuencia, as distintas variables que quere substituír o seu punto de interrogação. Entón, vai notar que agora eu teño eses puntos de interrogación vermellos. Entón eu coloque as variables tras miñas cordas, entón eu sei que substitúe-los nesa orde despois. Isto pode estar seguro de que, se alguén fai isto así, e eles teñen o ou 1 = 1 situación, que debería asegurarse de que, ao final de volta, asegúrese de que non vai realmente romper a pesquisa en SQL. Ok, entón iso é moi bonito iso, un turbillón de PHP e SQL. Boa sorte para todos vostedes, e agora para Oregon [Oreoluwatomiwa Babarinsa] todos Okay. Tempo para percorrer algunhas JavaScript e algunhas outras cousas moi rapidamente, entón non prendelo lo esta noite. JavaScript. Si JavaScript é unha especie de cousa legal, presuntamente. As cousas que realmente precisa saber sobre Javascript, é máis ou menos como a fin do lado do cliente do que a súa aplicación web estará facendo. Hai algunhas cousas que simplemente non queren coidar de todo o tempo do lado do servidor. Todas as pequenas interaccións, destacando unha cousa, facer algo desaparecer. Realmente non quero ter que falar co seu servidor de todo o tempo para iso. E algúns que nin sequera se pode facer no lado do servidor. É por iso que necesitamos algo como JavaScript. Cousas legais sobre JavaScript: El é ingresaran de forma dinámica. O que isto significa que o seu programa non precisa saber o que, exactamente, as variables son cando escribilo. Vai só unha especie de descubrir como está correndo. Outras cousas que son legais sobre iso: É unha linguaxe de bosquexo, o que significa que a sintaxe é semellante a C e PHP. Non ten que facer moito retraballados cando está a aprender JavaScript. Aquí temos un pouco de JavaScript. Unha cousa interesante aquí é que, se ollar para el, temos un pouco de JavaScript alí na marca de cabeza. Que é, basicamente, só incluír un arquivo JavaScript. Esta é unha maneira que pode incluír JavaScript no seu programa. A continuación, o segundo pouco é realmente algunha JavaScript liña, moi semellante a un estilo en liña co CSS, e está só escribindo algúns códigos moi rápido alí. JavaScript ten arrays. Só outra forma de manter os datos ao redor, moi útil. Moi agradable e doado de sintaxe. Podes usar corchetes para acceder todo e manter todo xunto. Nada moi complexo. O legal sobre Javascript e linguaxes de script en xeral é que non se preocupe con tamaños de matriz. Pode só usar array.length e manter o control do mesmo, e tamén a matriz pode crecer ou encoller como precisa del. Así, non necesita nin se preocupar de calquera tipo de, Oh non, eu teño reservar máis cousas, ou algo así. O legal aquí é que Javascript ten algo chamado obxectos. É unha linguaxe orientada a obxecto, entón o que ten é, esencialmente, un xeito de ti para agrupar datos en conxunto, algo semellante a unha estrutura, pero pode acceder a ela como unha estrutura ou nunha sintaxe de array asociativo. É moi sinxelo e que se pode facer con iso é agrupar datos xuntos se ten unha morea de datos que está relacionado. Por todo o que precisa para describir un coche, non precisa telo en unha morea de diferentes lugares. Pode simplemente poñer-lo nun obxecto en JavaScript. Como probablemente sabe, a iteración é unha desas tarefas tediosas. Só fai iso a través dunha outra vez. Debe falar con todos os obxectos no coche, ou ten que pasar por cada elemento nunha lista ou algo parecido. Entón ten JavaScript, semellante ao PHP, unha sintaxe foreach. Neste caso, é un no loop. Quere usar isto só en obxectos. Hai algúns problemas que se producen se usa isto en matrices. De modo xeral, é unha desas cousas que, con todo, que é moi útil, porque elimina unha chea de sobrecarga porque non ten que tirar todo ao seu obxecto por si mesmo. Non ten que se lembrar de todos os nomes clave. Só tipo de levalos de volta nesta sintaxe. Neste, por, só quere recordar que está a recibir de volta todas as claves, dun xeito moi semellante ao de hash de táboa. Se se lembrar de que, cando ía poñer nunha cadea pode aproveitar algo que ten un valor asociado con el. O que podes facer con isto é que pode dicir, todo ben, Engada nun coche, e eu chamei-lle un Ferrari. Entón pode pór na cadea de Ferrari de novo máis tarde, e pode aproveitar iso. E pode facelo en un loop, co o loop. Entón, só máis sobre obxectos. A principal cousa dende esta hai que lembrar é que pode utilizar o obxecto struct como sintaxe en calquera momento con estes, excepto se o que vai usar como unha cadea non é un nome de variable válida. Entón, se ollar para iso aí, temos clave con espazos. Ben, se fose para poñer object.key, espazo, con, espazo, espazos, que simplemente non tería sentido sintaticamente. Así, só se pode facelo con este tipo de sintaxe soporte. Ademais, JavaScript é moi baixo-wise para PHP. Ten dúas formas de abordar ámbito. Non pode ter o var diante dunha variable, e iso só significa que este é global. Pode velo de calquera lugar. Mesmo se pór isto nunha instrución if, en calquera outro lugar no seu código despois dese punto, podería ver esta variable. Outra cousa, con todo, é a var, está limitada a calquera función que está dentro Se non está nunha función, ben, é global. Pero se está nunha función é só visible dentro desa función. Eu non teño un exemplo, pero, si. É unha desas cousas onde pode xestionar o que as variables que quere ser global, que as variables que quere ser local, pero ten que ter coidado con iso, porque non ten o tipo de control de gran fino que fai en C, onde se algo é declarado en un loop for, só pode ir nese loop for. O único que realmente se preocupan o uso de JavaScript é a manipulación de páxinas web, non? Quero dicir, é por iso que estamos facendo isto. Para iso, usan algo chamado DOM. O Document Object Model. Basicamente o que fai é que leva toda a súa HTML e modelos para fóra en unha morea de obxectos que son aniñados uns dentro dos outros. Comeza con algo así. Ten, por certo, para min, unha morea de código alí fóra, que é unha especie de - Vostede podería pensar que sería moi difícil de manipular, porque estaría analizando a través de unha chea de texto e ter a peza á parte as cousas. E se non foi formatado correctamente? Cousas malas acontecerían. Entón JavaScript coida diso para ti, e terá unha estrutura de datos bo, como a que á miña esquerda, onde só ten un documento, e dentro de que ten algo chamado HTML, e dentro de que ten unha cabeza e un corpo, e dentro desta cabeza que ten un título, etc, etc, etc. Isto simplifica o manexo dunha páxina web para que sexa xusto, Oh, eu só quero falar con ese obxecto. Especie de unha forma moi semellante lle falaría a outro obxecto que fixo a si mesmo. Como dixen, todo o DOM é o obxecto de documento. Ou é só un lugar e entón pode ir dentro del para atopar as cousas, e pode facelo - este é o vello estilo de facelo, alí encima, onde fai document.getElementById, e, a continuación, o nome, e como probablemente pode dicir, isto queda moi pesado despois dun tempo. Entón probablemente non quere facelo. É por iso que temos a próxima cousa que nós imos falar sobre iso máis tarde. O importante aquí é que, todo ben, ten todos estes elementos, non? Entón quizais eu poida cambiar a cor de algo cando a páxina é cargada. Entón o que? E se o meu usuario fai clic en algo? Eu quero que faga algo interesante cando click algo. É por iso que temos eventos. Pode basicamente atopar calquera elemento no seu DOM, e despois dicir, hey. Cando este leva ou alguén fai clic nel, ou cando do rato sobre el, facer algo con el. E o que ten é, ten funcións que lidan con isto para vostede. Estas funcións son manipuladores de eventos. Que eles - que é só un xeito elegante de dicir, esta función só é executada cando o evento ocorre. Entón, el trata sobre o evento que ocorre. Isto é como pór para fóra un manipulador de eventos. Teño algunha tecla, e cando fai clic nel, explota. Polo tanto, non fai clic no botón. Esta é unha forma de abordalo, non? Ten unha marca de botón e preme en que ten unha secuencia que di: Oh, a propósito, eu fago esa cousa estourando para min. Se non, é como un botón estándar, que acaba de facer. Tamén pode facelo doutra forma, agarrando o elemento DOM, pero imos gardar iso despois falamos jQuery. JQuery: É unha biblioteca que é cross-browser. Podes usalo en case calquera cousa. E iso só lle dá unha morea de ferramentas para traballar. Porque JavaScript, mentres poderoso, non ten todas as ferramentas que precisa fóra da caixa para realmente afrontar unha aplicación web que pode querer facer. Así, el simplifica unha morea de cousas, dálle unha morea de funcións fóra da caixa que normalmente ten que escribir mesmo, unha e outra e outra vez. E só fai as cousas moi sinxelo. Tamén ten selectores, que permiten que tirar todos eses elementos de seu DOM moito máis simple, en vez de ter que usar esas chamadas de función moi longos. Máis información sobre estes selectores. Ten, alí enriba ten, digamos Eu quero comezar un elemento con identificador "rock". Ben, en jQuery, que é de só US $ e logo, unha secuencia que teña un quilo, e, a continuación, "rock". É moi sinxelo e moito máis rápido que a forma tradicional de Javascript resolución deste problema. E ten cousas semellantes para as clases e tipos de elementos. jQuery é - un dos recursos interesantes é que pode clasificar de comprimir as súas dúbidas sobre a súa DOM moi, moi rápido. Agora estamos de volta para o tratamento de eventos, e iso é como lidaria con un evento en jQuery. Entón, o que imos aquí é que estamos dicindo, todo ben. Eu teño unha etiqueta script, non? Entón, eu teño esa liña JavaScript. O que imos facer é o que vai dicir, todo ben. Cando o documento estea listo, o que significa que o documento foi cargado, estamos indo a ir a esta función, e imos dicir, todo ben, esta función está realmente facendo outra cousa. É basicamente dicindo, todo ben, mo elemento co ID "myid". E, a continuación, dar a este un manipulador función que se executa cando fai clic sobre el. Basicamente o que isto significa, di, todo ben. A páxina é cargada, polo que estou indo a dentro, atopar este elemento, darlle ese manipulador de eventos, e que basicamente define a súa páxina para ti. E é así que quere pensar sobre a manipulación de eventos. Só quere pensar, todo ben, cando ocorre algo, o que quero que ocorre? Non quere pensar, todo ben, eu teño que seguro que esta cousa fala con esa cousa, esa cousa de bla bla bla, porque só quere falar algo en termos de eventos. Cando isto ocorre, isto ocorre. Cando isto ocorre, o que pasa. E se as cousas desencadear outras cousas, iso é gran. Pero non quere tentar facer código complicado onde está provocando moitas cousas á vez, porque está indo só para dar-se unha dor de cabeza. Todo ben. Agora podemos comezar a nosa páxina de xestionar eventos, pero digamos que o meu usuario fai clic nun botón. E se eu queira enviar a solicitude de volta ao servidor, pero eu non quero volver cargar a páxina, porque ter que volver cargar unha nova páxina cada vez que queda medio entediante, e por que eu teño para tirar abaixo a cabeceira de novo, e de novo o pé, e todos os elementos da páxina de novo só para refrescar o cumprimento ou o tempo? Entón é por iso que temos algo como Ajax. Que podemos facer aquí co Ajax é que podemos dicir, todo ben, Quero enviar algúns datos para o servidor, e quero ter unha resposta de volta para que eu poida actualizar miña páxina, ou que só facer algúns cálculos algorítmicos que non necesariamente amosar nada para o usuario. O que cómpre facer iso? Ben, precisa un URL que precisa para falar. O servidor non pode Magic escoitar da nada. Debe ter un lugar específico que está enviando os datos a. E tamén ten que algúns datos para enviar, ou que sexa unha consulta sen datos. Só quere facer o ping ao servidor e dicir: Ola, eu estou vivo, ou algo parecido. E entón quere unha función que trata basicamente correctamente. Imos dicir que recibir de volta unha información do seu servidor, e quere cambiar o título do usuario na súa páxina. Así, terá a información de volta, e que tería que empurrar para a pantalla. O que pasa é que cando a páxina está listo, crear un en función de click para este botón chamado saúdo. O que isto fai é entón, cando este botón é presionado, fala con greetings.php, fai unha solicitude POST, e di, hey, me algo da súa páxina. Nós realmente non precisa describir iso, pero greetings.php, imos só dicir, dá de volta "Ola mundo". Así que volvemos este "Ola mundo", e no éxito deste, asumindo nada sae mal, entón só tes que ir a este lugar de destino que especificamos e se ater só a resposta alí. E esta é un xeito moi sinxelo de configurar unha consulta Ajax. Moi rapidamente, Rob tipo de mencionado iso xa, as cousas poden dar mal, cousas malas poden ocorrer, así que quere para familiarizado con estes códigos de resposta HTTP. ¿Qué son estes son só, como, 200, todo foi ben. Outra cousa, as cousas malas aconteceron. En xeral, é a cousa que quere lembrar. Pero é bo saber que todos estes. E, finalmente, unha vez que xa pasou por todo iso, necesitamos falar moi rápido sobre o proxecto, e entón podemos deixar que todos saír. Proxecto. Cousas que quere lembrar. Pregunta a si mesmo estas preguntas: Quen vai usar isto? Que van usalo para? O que os meus usuarios se preocupan? Que non se preocupan? Só non quere facer unha aplicación e deixar só crecer e tornar-se este xigante, que todo consome cousa que non pode mesmo acabar. Quere ter obxectivos distintos plans e cousas que quere abordar. Facelo sen esforzo. Todo iso, di, basicamente, facer máis doado para o usuario a usala, non facelo unha burbulla xigante de texto como este slide é, en realidade. Só quere que sexa algo que é moi doado para alguén para ir en e facer o que eles queren facer. Non quere que eles teñan a navegar 5 páxinas para chegar ao seu principal función do seu sitio. O Google tiña 5 páxinas antes que puidese buscar algo, ninguén ía usalo. E, por último, o prototipo de papel, grupo focal. Teña un bo deseño e prácticas de proba. Só porque pensas que funciona para vostede, non significa que os outros pensan que funciona. Pero si, é iso. [CS50.TV]