PROFESOR: Entón, o calendario para esta semana, que moito non. Pero espero moito, moi útil e relevantes para vós esa semana. Pero nós imos gastar preto de 15, 20 minutos só falando rapidamente sobre a lista de enlace. Listas de enlaces van ser cuberto no quiz. Entón, talvez sería moi útil para aprender un pouco sobre o que é. Nós imos pasar a gran maioría da sección de hoxe pasando por riba cuestionario cero problemas prácticos. E entón nós imos gardar quizais 20, 30 minutos ao final para preguntas remanentes alguén ten. E, a continuación, o último cinco minutos, eu vou a darse unha bomba de discurso ao quiz. Todos vostedes caras queren estar aquí para iso. Porque vai ser un bo momento. Todo ben, entón algúns materiais na lista de enlace. Como están normalmente é estruturada Ten o que se chama no, non? Ten isto chamadas nós, que son estruturas. Vou pasar por riba de como crear un nó no seguinte foto. Pero esencialmente todos conectados listas é son datos que foi amarre xuntos vía punteiros. E así a vantaxe que temos de usar unha lista ligada máis, quizais, como unha matriz, é o feito de que, nunha matriz precisa dun bloque contiguo de memoria todos no mesmo lugar, un despois do outro, para poder ter que. Tendo en conta que a lista ligada, podería teñen pequenos anacos aleatorios de memoria todo o seu ordenador amarre xuntos por punteiros. E, deste xeito poden acceder a información que vén un despois do outro, despois o outro sen necesidade de só un enorme anaco de memoria no seu ordenador en algún lugar. E por iso este é un dos principais razóns polas que usan lista de ligazóns. En segundo lugar, é moi fácil de dinamicamente cambiar o tamaño da lista de ligazóns porque na matriz, cando declarar unha matriz, ten un certo valor definido. Digamos que eu quería crear un conxunto de 10 números enteiros. Eu crear unha matriz de 10 enteiros, e é iso. É 10. Non sei o que facer despois diso. Se eu quixese facelo 11, non pode facelo. Se eu queira marcar 9, non pode facelo. Tendo en conta que, nunha lista de ligazóns, pode engadir e borrar e introducir onde quere. Pode redimensionar dinamicamente o estruturar aquí, a súa estrutura de datos. E iso nos dá unha morea máis flexibilidade engadida que normalmente non ten con matrices. Calquera confuso sobre a base estrutura de como unha lista de ligazóns é ou porque temos que usar un sobre unha matriz? Si, nós imos pasar por riba en detalle como realmente crear un. Pero esta é só unha especie de o sentido xeral agora. Legal. E así matrices son amarre xuntos desas encantadoras pequenas cousas chamados de nós. Todo o que un nodo é un tipo de estrutura. Teña en conta que, un struct é se quería para crear un determinado tipo de variable C en que xa non existir, vostede, como un programador, realmente crear iso só. E así, este tipo de datos estrutura é denominada no, de feito foi creado por nós, para que non existe dentro C por si só. E a forma que crear un é que ten a cabeceira de typedef struct, que informa o compilador que eu son a piques de crear un struct. Imos nomea-la "nó". E dentro imos para declarar unha variable en, que vai almacenar un valor. E entón nós tamén imos ter un punteiro chamado "next" que apunta ao seguinte nó na lista ligazón. E entón rematar este off por só repetindo nodo novo para o compilador sabe, OK iso é o fin da miña struct. E así, deste xeito, estamos especie de crear unha matriz pequena bonito tipo de cousas cun valor e cun punteiro. E pode liga-los todos xunto cos punteiros. Así que todos eles poden ser tipo amarre xuntos nunha cadea. Legal. Podes escoitar que un pouco mellor? Audiencia: É. PROFESOR: Todo ben. Así, o xeito que, como podedes ver, unha lista de ligazóns típico é estruturado é que ten unha cabeza. Ten o valor de cabeza que non é sendo apuntada por calquera outro punteiro. Pero vai a apuntar, ou referencia outro nodo. O nodo despois vai referenciar o nó despois diso, e así por diante e así por diante ata que, finalmente, acadar o fin da súa lista de enlace. E só non vai ter un punteiro alí. E así, pensar como, nunha corrente, ou mesmo se algún de vós fixestes, eu non sei, como con froitas contornos cando era pequeno. Faría reunir los e usalos en torno do seu pescozo. Creo que é o mesmo. Tes esas pequenas cousas que pode encadear que apuntan a un despois, un despois do ela, e así por diante e así por diante ata que teña unha cadea dunha estrutura de datos que pode usar como sexa. Así, a forma que este fariamos tipicamente inserir ou eliminar calquera nodo dun enlace lista é moi diferente dependendo de onde ese nó é. Así, por exemplo, porque punteiros son sempre apuntando para un valor específico, cando eliminar ou inserir un nó, quere estar seguro de que o punteiro é todo apuntando para as cousas certas. Entón, se quería introducir potencialmente un novo nodo co valor dun dentro dun enlace clasificada lista, todos sabemos aquí a partir da imaxe que vai ir entre cabeza e dous, non? Porque encaixa ben alí. Pero o xeito no que nós faría iso é primeiro dereferencing o punteiro da cabeza e mandar que para un. Pero chegamos a un problema aquí. Calquera pode ver cal é o problema é si fósemos primeiro dereference o punteiro de cabeza a un? O problema pode nos atopamos se intentamos para engadir este á fronte da nosa matriz? Audiencia: [inaudível] Profesor: Exactamente. Polo tanto, temos aquí un punteiro que foi xa que apunta desde a cabeza ata dous. Pero se se librar dese punteiro, ten sinala-lo para un, agora temos ningunha idea onde ir para atopar dous. Porque, como dixen antes, ten un peza xigante de memoria no seu ordenador. Todos estes nodos podía ser intercaladas aleatoriamente en calquera lugar no seu ordenador. E non sabe como proceder para atopar isto. E por iso ten que ter punteiros apuntando para todo nós ao final. Ou ben se accidentalmente dereference un sen primeiro asignación un valor en primeiro lugar, é só vai perder todo despois. Entón, o que nós estamos indo a facer é, faría primeiro quere crear un punteiro en o no que quere inserir. Sinala-lo para onde quere inserir-lo para, e entón despois podería apuntar cabeza cara atrás a un. Isto ten sentido a todo o mundo aquí? Gran. Pense nisso como só como unha cadea. Se engade unha cadea, é unha especie de intuitivo como ía sobre como inserir iso. OK, de xeito que é realmente moi máis curto do que eu penso que sería, un discurso de cinco minutos sobre listas de enlaces. Só así vostedes teñen a idea básica do que o que é. Aquí temos o calendario para cuestionario cero. Non deixe que isto o intimide. Sei que é un monte de información. Parece moi asustado. É tamén unha chea de, I pensar, tipo CSC de termos. Cousas como cadeas hexadecimais, punteiros, alocações de memoria dinámica son termos que soan moi asustado. Pero nós estamos indo para rompe-las abaixo, facer algúns problemas de práctica para que todos está preparado para esta proba. Cantos de vostedes teñen xa comezou a estudar? OK, vostedes probablemente quere para comezar a comezar sobre iso, porque a proba é mañá. Ou xoves para algúns de vós. É, polo que estamos indo a ir sobre algúns problemas prácticos. Se vós todos queren tomar unha folla de papel, un lapis. Nós imos só pasar o gran maioría da sección de hoxe pasando por riba algúns dos que entón vostedes teñen unha idea do que esperar no quiz. Aceptar. Un par de loxística detalles, así como, para calquera que non foi a de que enlace alí, se vai para cs50.yale.edu, na parte de diante Nesta páxina hai un enlace que di "sobre Quiz Cero". Ligazón leva ata alí. Se aínda non leu, le-o. Porque lle di realmente importante información sobre o quiz. Vou tirar esta fóra de que só porque, fisicamente, se vós non saben onde para ir, imos ter problemas. E por iso, se o seu pasado en termos con A de N, ir ao auditorio da escola de dereito. E se os seus últimos comeza con P a Z, ir Davies Auditorium. E iso só se aplica para persoas na sección de mércores. Se está tomando o quiz sobre Xoves, vai para SSS 114 onde a súa charla normalmente é. Audiencia: [inaudível] PROFESOR O a Z, vai para ir ao auditorio Davies. Vou cambiar isto, certo? Oh, si, que acaba de fallar automaticamente. Oh yeah, iso é o que Christa. Si, meu mal. Si, O a Z, vai para ir Davies Auditorio. Vou corrixir isto xa que eu cargar. Si. E, a continuación, tamén algo importante á mente é que o mércores, se está oficialmente matriculados na sección mércores ten que tomar o seu exame o mércores. E se está matriculado en xoves, ten que tomar o seu exame xoves. E é durante o horario de clase. Onde, eu creo que é como 1:00 para 02:15 aos mércores e 2:30 - 03:45 aos xoves. Se ten un conflitos irreconciliables, Desculpas de Dean son o único, por desgraza, podemos tomar. Porque tivemos un gran maioría das solicitudes cambiar de mércores para xoves. Que non pode honrar a menos temos unha proposta do Dean. Aceptar. Entón, antes de comezar a facer unha tanto dos problemas da práctica, Eu só vou pasar por riba Consellos útiles de Andy para o éxito. Vós, cando estuda, o que realmente quere practicar escribir código a man. A primeira vez que eu tomou un quiz CS, eu non tiña código escrito a man práctica antes e foi moi chocante en como era difícil. Cando vostedes non entrar no costume de escribir todo, ven moi claro, sendo capaz de ter completada automaticamente corchetes correo comas alí. Cando escribe para fóra a man, ás veces é moi, moi fácil esquecer un punto e coma, ou se esqueza de pechar un soporte, ou se esqueza de pechar dous puntos, ou algo así. Entón, cando escribir o código a man, é unha sensación moi diferente. Entón vostedes, cando se está a traballar a través de algúns dos problemas da práctica, sería bo para realmente practicar hoxe. Ou mañá, supoño, se está respondendo ao cuestionario o xoves. En segundo lugar, temos a última, como, val da práctica de oito anos quizzes liña. Cuestionario deste ano será, probablemente, moi, moi semellante a todos eles. Son todos moi semellantes. Vostede especie de entrar no estilo do tipo de preguntas que pedimos, o tipo de funcións que imos escribir-lo en, etcétera, etcétera. Polo tanto, tome os quizzes práctica, especialmente baixo restricións de tempo. 75 minutos para facer a proba é non unha morea de espazo de tempo. É moi, moito tempo. E así vós realmente queren para asegurarse de que vostedes son o hábito de escribir código a man rapidamente. Porque non quere que o primeiro tempo de ver un quiz que a lonxitude estar no seu quiz. Vostedes realmente quere estar seguro que practica de antemán. En cuarto lugar, que pretende revisar o charla e sección de diapositivas. Non ten de memorizar cousas. En realidade, todo o mundo ten dereito a un unha folla de notas de papel branco, adiante e de atrás. Podedes escribir ou escribir. Se cre que ten que memorizar algo, poñelo nesa folla. Eu asegura que, non quere ser preso no medio dese cuestionario sendo así, oh si, cal é o tempo de execución deste tipo contra ese tipo. Basta colocar-lo para abaixo e copialo directamente da súa folla de nota. Entón pode realmente só usar a súa cerebro para pensar sobre os problemas en vez de ter que lembrar feitos. E así realmente aproveitar de calquera información de nicho Que pensas que necesita memorizar, plop-lo para abaixo na folla de avaliación. OK, dúbidas loxística sobre o quiz antes de comezar a algúns problemas do quiz practicar? Si? Audiencia: Non tiven a oportunidade mirar para o exame [inaudível] pero é o que vai ser aplicación na maior parte, ou se hai tamén vai ser, como, cuestións de coñecementos? PROFESOR: É moito. Así, o xeito que eu describiría o quiz é-- engada algúns problemas prácticos que puxei de todo cuestionarios. Pero vai ver que hai dous principais tipos de preguntas que van pedir-lle. Un deles é un detalle nivel moi baixo de cousas. Nós imos dar-lle un pequeno anaco de código e dicir, hai un erro aquí? O que sería a impresión aquí fóra? Que este código producir, etcétera. Entón Información detallada sobre o moi baixo nivel. E por outra banda, teremos moito alto nivel preguntas baseadas no coñecemento. Pode explicar o que o diferenza entre unha busca binaria e unha procura linear é? Por que queremos usar un sobre o outro? Quizais, o que é o GDB? Por que queremos usar GDB? Nivel máis alto, máis fundamental preguntas entendemento. Entón, vai ver unha mestura de os dous no seu quiz. Calquera outra cousa antes de nós ir directo para el? Aceptar. Audiencia: Máis un. PROFESOR: Oh, máis un. Desculpe. Audiencia: É, está todo ben. Entón está dicindo é 75 minutos moi curto, como é improbable que vai rematar? Ou, como, 75 minutos é o mesmo tempo como nós necesitariamos se fósemos apropiadamente preparado? PROFESOR: OK, entón o proba é un reto. É en definitiva un desafío. Vai atopar-se en curto tempo. Probablemente vai bater, como 10, 15 minutos para ir, e ser como, merda. Teño moito que facer. E iso é totalmente bo. Todo o mundo vai se sentir do mesmo xeito. Só ten que estar moi consciente do canto tempo ten. E é por iso que eu digo a vostede caras fan as probas de práctica. Porque realmente dá un gran sentido do que a proba vai ser así. Entón, se atopa-se ser capaz de rematar a práctica quizzes nunha boa cantidade de tempo, pode pasear-se ben, entón non terá un problema o mércores ou xoves. Legal. Entón, se todos wants-- creo a maioría das persoas teñen follas de papel fóra xa. Vou esencialmente só darlle exemplos de preguntas, dar a vostedes, tipo, un uns minutos para facelas. E nós falaremos sobre como unha clase o que as respostas a son. Polo tanto, este é un moi típica pregunta pronto imos preguntar-lle, só a conversión números entre bases distintas. Binarios, como podedes recall, é a base dous. Decimal é base 10, ou o que como o ser humano normalmente interpretar. Hexadecimal é base 16, que é cero a través de nove así como da a F. Polo tanto, hai catro números Eu son pedindo a vostedes para converter aquí. Vou che dar gusto, de tres a catro minutos para pensar en como iríamos sobre como solucionar este. Audiencia: Temos permiso calculadoras? PROFESOR: Non vai Debe calculadoras, si. Creo que ademais de base, penso eu, é todos vostedes serán invitados a facer. E só entón eu medio que ten un sentido de cando todo o mundo está feito, ollar para arriba, onda, eu non sei, sorrir, ollar feliz se está feito. Si. Quizais máis uns minutos. OK, imos trae-lo. Vou co propósito de dar a vostedes menos tempo que probablemente precisa facer algúns destes problemas, simplemente porque quero estar seguro de que obtemos a través de unha chea de problemas. Non te preocupes se non ten a oportunidade de rematar. Totalmente OK, sempre que ten unha idea de como ir sobre iso. Entón, imos adiante e facer o primeiro. Entón, primeiro, será que alguén quere me dicir en binario, o que cada un destes números representan en termos dos seus valores? Si? Audiencia: Dous ao potencia cero, 2-1. Profesor: Exactamente. So. Correcto, entón tipicamente cando estamos na base 10 todos estes representan son, como, 10 á base de cero, non? Iso é o lugar do seu un. Todo o seu lugar 10 do IS-IS 10 elevado á potencia dun. Lugar que é de 10 100 á potencia de dous. O que queira que está na base de vai que ver con exactamente o mesmo, só cunha base diferente. Entón binario, todo o que é é a base dous. Vas para converter todo o díxitos en dous para calquera poder dese díxito. E así, neste sentido, pode ter un xeito máis doado de poder engadir-se ou sumar todos os números en orde para converter en base 10. Entón, alguén quere me dicir o que o resposta á primeira é na base dez? Audiencia: Dous, [inaudível] PROFESOR: Yeah. Audiencia: 42. PROFESOR: 42, alí vai. Así, a forma que temos esta resposta foi de facendo dous a primeira, que é dous. Dous terceiro, que é oito. Ademais, dous para o quinto, o que é o que sobra. Vostede resumín los e é 42. Alguén está confuso sobre como temos que? Así adición de base, como Dixen, ten que estar OK. Se non, así, podemos practicar iso tamén. Pero está todo ben. Legal. Alguén quere me dar o responder á segunda tamén? 50? Bo. Calquera confuso sobre como temos que quere? Cool, eu vou ter a respostas sobre o seguinte diapositiva. Non te preocupes se Debe copia-lo para abaixo. OK, entón hexadecimal é un pouco máis complicado. pero eu vou amosar para vós un atallo para saber como facelo. Entón hexadecimal, como lembre, todo o que é ter 16 anos. E por nós, como seres humanos en realidade non ten 16 números para representar que, nós ir de cero a nove, que o noso primeiro 10 valores, e entón nós facemos A a F, que son os próximos seis valores. E así, o xeito máis doado de ir de calquera número binario en hexadecimal é división las en metades. E así calquera número binario imos dar- probablemente vai ter oito díxitos. Pode simplemente romper Los no medio. Así, o primeiro um-- un un, un un, un, un, un un. Kind of creo que, vostede sabe, debuxe unha barra ou unha coma entre eles. E pode só converter directamente o que quere este é o primeiro número de hexadecimal, e todo o que aquí é a o segundo de hexadecimal. Entón lembre de notación común, o que valores hexadecimais comezar? Audiencia: Cero. PROFESOR: 0 X. Entón, nós sabemos que en calquera momento pedímoslle para converter calquera número para hexadecimal, ou cando ves calquera número que comeza con 0 X, vostede sabe que é un valor hexadecimal. E entón vai ser invitado a determinar o que estes dous díxitos son. E a forma de facelo, calculando que a metade e calculando que a metade. Así, neste exemplo, o sería un, un, un, un ser? Que o valor que sería iso? Iso sería F, non? Iso sería 15. Polo tanto, este sería F. One, un, un, un aquí tamén é F. Polo tanto, un, un, un, un, un, un, un, un en hexadecimal, todo isto é 0xFF. Por mor desa metade representada F, o valor de 15, e esa metade representada F, o valor 15. Porque lembre, estamos contador de cero a nove. Un é como 10, B é como 11, F é 15. Isto ten sentido para todo o mundo como temos de binario para hexadecimal? Audiencia: E así como chegamos 15 dende o un, un, un, un? PROFESOR: Si, este é binario, non? Imaxina isto é só un número binario. Entón tes dous ao orde cero, que é un. Audiencia: Oh, Aceptar. Entón só suman-lo. PROFESOR: Si, e logo só totais que fora. Isto é todo o que é. Audiencia: Aceptar. PROFESOR: Aceptar. Audiencia: Entón vai de par en decimal para hexadecimal? PROFESOR: Esta é a xeito máis doado de facelo, si. Non vai a decimal porque decimal só ten cero a nove. Somos só unha especie de dividir iso en dúas. Audiencia: [inaudível] usando decimal para atopar o que corresponde ata en hexadecimal. PROFESOR: Eu quero dicir, é calculando usando matemática básica. Audiencia: É. PROFESOR: Si, moi ben. É un pouco confuso. Pero só sei que pode dividir o que quere este valor é en só metades. Mira, o que é isto en binario? Que número é ese? Será algo de cero a F. Aquí tamén será algo de cero a F. E entón pode simplemente poñer aqueles dous alí mesmo. Audiencia: Aceptar. PROFESOR: Yep. Aceptar. Entón vostedes queren proba o seguinte, entón? Cero, un, cero un, un, cero, un cero. Vou dar a vostedes como 30 segundos, sempre que probablemente non sabía o truco para como facelo antes. OK, ninguén quere recibir un agasallo un tiro? 0x5A. PROFESOR: 0x5A. 5-A. Bo. Entón, iso aquí sería ser-- quere para dicir como conseguiu iso? En primeiro lugar, como chegou a cinco? Audiencia: Por cero, un, cero, é un de cinco. PROFESOR: Será que todos comprendan por iso que cero, un, cero, un é cinco? Ten un aquí. Non ten nada en dous para a primeira. En dous para o segundo, ten un, que é catro. Entón engade o catro máis a un, ten cinco. Todo o mundo é bo? Aceptar. E entón o que este sería e por que? O que fai un número corresponden a? Audiencia: 10. PROFESOR: E o que esta na base de dous? Audiencia: [inaudível] Profesor: Exactamente. Polo tanto, este segundo valor aquí sería 0x5A. Todos bo de como converter? É moito máis sinxelo do que pensa que é. Eu só quero estar seguro sabe consellos útiles e trucos de como facelo. Audiencia: Por que só dividir Lo no medio así? Só ten que ser como, OK, eu estou indo só para se preocupan estes primeiros [inaudível]? PROFESOR: Por que é realmente o xeito valores hexadecimais son representados. 0 X, o que significa, en realidade, máis que dicirlle que é un número hexadecimal. E iso representa sempre os catro primeiros díxitos. E iso representa sempre os catro últimos díxitos. E así estes dous díxitos só corresponden a diferentes anacos. Audiencia: Entón imos always-- PROFESOR: Está sempre se ve oito bits de valor. Audiencia: É que só desexa unha cousa aquí é que unha cousa de novo? PROFESOR: Isto é só un cousa en ordenadores, si. Audiencia: Aceptar. Impresionante. PROFESOR: Tamén, polo tanto, neste exemplo nós convertido de binario para decimal, e de binario para hexadecimal. Vós queredes estar seguro de que vostede tamén practicar a suceder o contrario. Entón, se eu che dei 0xff, podería deseñar isto para fóra no binario, non? Converter F en binario, que é un, un, un, un, F converter en binario, que é un, un, un, un. Así, podemos pedirlle para facer o contrario. Entón decimal para binario, ou hexadecimal para binario. Entón quere facer se sabe para os dous lados. Nós probablemente imos facerlle unha combinación dos dous. Si, ten unha pregunta? Podo see-- é bo? Audiencia: É. PROFESOR: Aceptar. Eu son bo para borrar isto? Gran. Todo ben, entón respostas aquí, se alguén É curioso, máis tarde, e se confunden. Aceptar. Audiencia: Será que iso importa se colocarmos nosas cartas en Capitol minúsculas? PROFESOR: Fai xa en hexadecimal, por convención, todos os caracteres son maiúsculas. Entón, de A a F son será maiúsculas. Se pór unha minúscula un, eu non sei se nós sería necesariamente marcalo mal. Pero, en teoría, iso non é tecnicamente como debería telo. Polo tanto, todos eles deben ser maiúsculas. Si, boa pregunta. Aceptar. En canto á segunda cuestión. Considero esta linda programa aquí. Eu vou facer a pregunta, Vou volver este. Entón, en primeiro lugar, o que está dentro do estándar io.h que é de interese para o programa? En segundo lugar, o que fai baleiro significar en liña de tres? E en terceiro lugar, o que fai retornar cero desde principal, como liña seis, xeralmente significan? Se vós queredes escribir os abaixo, xa que eu teño que volver para o foto só para que poida ver o código. Este é un exemplo de como, quizais un maior cuestión nivel onde pedímoslle que as cousas significan nun programa. Todos bo para min volver ao diapositiva? OK, legal. Entón, eu vou dar a vostedes como quizais tres minutos a ollar a este rápido real. OK, entón que é como razoablemente fácil, conceptualmente. Alguén quere me dicir o que é primeiro por dentro hash incluíndo noso arquivo de biblioteca io.h estándar? Por que necesitamos desa biblioteca incluído para este programa? Que aquí é que imos ter del para? Si? Audiencia: É que cando poñer ese printf? Profesor: Exactamente. Entón printf, en calquera momento tomar unha entrada do usuario e imprimir algo para a pantalla, que é a entrada estándar, biblioteca de saída. Pense nisso que maneira-- entrada, saída. Eu teño unha saída? Si, eu fago. Entón eu sei que vou sempre precisa da biblioteca estandarizar i.o. Entón printf é a función por que necesitamos para acceder e inclúen o hashtag biblioteca i.o defecto. Aceptar. En segundo lugar, o que significa baleiro? Temos a int main (void), o que fai invalidar aquí dicir aquí na liña de tres? Si, na parte de atrás. Audiencia: [inaudível] Profesor: Exactamente. Entón lembre, aprendemos comezando coa nosa pset que realmente pode especificar na liña de comandos argumentos que o programa, que función principal, toma como, o usuario, chamalo. Se temos en branco, o que significa que podería simplemente executar o programa directamente sen os argumentos de liña de comandos. Todos clara sobre iso? Aceptar. E, por último, por que nós se preocupe en facer esta remuneración cero cousa aquí? Por que temos ata un int main? Por que non podemos só ter void main baleiro? Si? Audiencia: Só para que poidamos asegúrese de que o programa é saír con éxito, conforme oposición ao caso foi contado. E sabemos que iso é un tipo de erro. PROFESOR: Si, exactamente. Esta é só unha moi cousa convencional que nós facemos, é que só a finais de seu programa, só para asegurarse que a súa función principal está a ser executado correctamente, sempre queremos facer o retorno cero. Aínda que poidamos necesariamente non ve que impreso en calquera lugar. Porque, como programadores, xa sabe, se ten moitas liñas diferentes de código e non sabe onde estes van mal, e un erro ocorre, quere asegúrese de que obteña este erro. E así tipicamente se algo sae mal, teremos un retorno de só un para garantir que sabemos que é. Entón, se ves un retorno cero, que tipicamente significa que o seu programa é realizado con éxito. Bo? Legal. OK, segundo programa aquí. Considero isto. E se vostedes ver un flotar, podedes probablemente ter unha boa idea do que Estou a piques de pedir-lle. Así, cando este programa executa, como se pode ver, Estou declarando un flotador dentro da miña función principal. Estou nomeando-o "responder", e eu estou definindo que igual a un dividido por 10. Estou imprimindo, a un casa decimal, que float. E entón eu estou volvendo cero. Así, cando a execución do programa, creo que volta a ganancioso agora, este programa amosa 0.0. Como todos sabemos, espero que todos sabe, un dividido por 10 non é un 0.00, é 0,1. Pero explicar por que este programa pensa que 1 dividido por 10 impresións para 0,1 outro que 0,1? Vou dar a vostedes quizais como 30 segundos para pensar só rapidamente sobre iso e eu vou volver para o programa. Aceptar. Calquera quere darlle un tiro? En tres frases ou menos, porque normalmente somos indo para restrinxir as respostas para tres frases ou menos así que non só regurgitar cousas aleatorias no seu quiz. Si, tomar un tiro. Audiencia: Entón eu creo que hai esa cousa chamada, como, [inaudível] Polo tanto, pode haber, por exemplo, pode haber, como, 0,09, que onde imprimir o primeiro díxitos, que sería para 0.0? PROFESOR: Close, non completamente. Christabell? Audiencia: Está dividindo unha 10, e son ambos enteiros. E así o camiño que vai para almacena-lo é como un enteiro. E así o número enteiro máis próximo sería 0.0. E así que é 0,1. PROFESOR: Si, iso é moi bo. Esa é a resposta correcta. Polo tanto, este é un moi confuso concepto a unha morea de nenos. E eu realmente quero estar seguro de que iso é reforzado na cabeza de todos. Entón, o que chamamos flotante punto de imprecisión, onde a razón pola que moitas os seus programas en ganancioso non funcionou inicialmente era porque se esqueceu de lanzar a súa variábel. Entón, o que dixo Christabell era enteiramente correcta. Un flotador é inherentemente imprecisa. Porque nun ordenador, non temos unha cantidade finita de bits de memoria podemos utilizar para representar números. Así, por exemplo, este ID CS50 é-- Creo que é un ordenador de 64 bits. Un flotador só pode ser representada por unha cantidade finita deses bits. E así 0,1 con ceros infinitas, que foi de 0,1 é, non? Pero non podemos realmente almacenar este número no noso ordenador. Nós simplemente non temos memoria suficiente para facelo. E así, a aproximación máis próxima de o que está almacenado na memoria é, en realidade, algo así como 0,000 algo, algo, algo, algo. Que, unha vez que truncar el, arredonda abaixo a 0,0. E así, este exemplo é só un que demostra moitas cuestións temos sempre que estamos tentando facer incorrectamente matemáticas sen lanzar como un enteiro distinto. Entón, só tes que ser cauteloso de que isto ocorre. En probas, se nós dámoslle unha bloque de código e é como, o que imprime ao final? E se é algún valor aleatorio vostede caras deben saber por que isto está a suceder. Si? Audiencia: Truncate é se librar de todo despois dun certo punto? [Inaudível] PROFESOR: É, entón, en realidade, este é un exemplo moi malo, porque todo o que realmente 0,100 truncaria ata 0,1. Pero se fose realizar ele-- non Teña en conta que, porque o ano pasado correu-lo nun programa diferente. Eles correron lo en algo chamado o CS50 Appliance, que é diferente do ID. Isto foi un sistema de 32 bits, eu creo. E entón había números diferentes. Pero, esencialmente, só sei que todo o concepto de truncagem e como simplemente corta as cousas fóra. E así se rounds-- Audiencia: sen redondeo. Profesor: Exactamente. Si. Legal. Ola, na parte de atrás. Nós só estamos indo sobre algúns Revisar o cuestionario preguntas. Todo ben. Por iso, considero un programa diferente aquí. Vou dar a vostedes un uns minutos para ler sobre iso. Isto é algo que foi por moito recentemente, que eu creo que estourou unha morea de ti mente dos homes. Pero imos falar polo que de novo só para asegurarse de que entende-lo completamente. Aceptar. Aceptar. Alguén precisa de máis tempo para ler este código? Aceptar. Así, paréceme que neste programa son a creación de dúas secuencias usando GetString. Unha chamados s e un chamado t. E se son iguais é igual a un para o outro, debe imprimir "Vostede escriba o mesmo. " Pero elsewise, sería imprimir: "Vostede ingresaran cousas distintas ", non? Parece moi, moi sinxelo. Pero, con todo, se realmente tentar escribir este programa, parece que mesmo cando entrada as mesmas secuencias exactas, aínda imprime: "Vostede ingresaran cousas distintas " Alguén quere dar unha tiro en por que este programa sempre responde que as entradas son diferentes, mesmo cando as propias palabras son as mesmas? Entón, se eu fose para input-- David amor para usar un exemplo como nai, non? Minúsculas M-O-M de S, T é igual a minúsculas M-O-M. Se eu execute iso mediante que o código, por que imprimir "escribiu cousas distintas?" Alguén precisa de máis tempo para pensar sobre iso? OK, eu creo que estamos ben. Si? Audiencia: OK, entón iso é algo sobre onde se garda na memoria, non? PROFESOR: Yep. Audiencia: Onde é como, este cadea s se garda a memoria spot-- Estou inventando isto-- é cero. PROFESOR: Correcto. Audiencia: E corda t almacénase no lugar de memoria, como, 167, e, a continuación cero non é igual a 167. Profesor: Exactamente. OK, entón lembre que esta incrible revelación explicamos para vós a semana pasada, que cordas non existen realmente? Cando creamos algo chamado corda estamos, en realidade, creando algo chamado de char estrela. Que todo isto é un punteiro para unha cadea ou unha matriz de caracteres. E así, neste exemplo, se eu foron a entrada H-O-H a forma que o meu ordenador sería almacena-lo é dentro barra invertida memoria cero, non? Estes catro caracteres, caracteres, sería almacenado en algún lugar. E entón estes catro caracteres, barra invertida cero, almacénanse noutro lugar, non? Eu non teño ningunha idea de onde os enderezos son, están en algún lugar no meu ordenador. Pero eu non sei exactamente onde eles están. Cando crear unha secuencia s, todo o que é realmente é un punteiro para o comezar desa secuencia. E cando eu crear este valor t, todo o que é un punteiro para aquí. E así, cando estás a para equiparar e comproba a ver se s é igual é igual a t, o ordenador é realmente só retornando a vostede a dirección deste m eo enderezo que m. E porque son dous pezas separadas de datos que son almacenados en dous diferentes enderezos no seu ordenador, ordenador non vai recoñece-los como o mesmo. Alguén quere dar un tiro no que nós tería que facer se queriamos para corrixir iso e ter un programa en execución correcta no seu canto? Pense nisso por un par de segundos. O que necesitamos cambiar a obter este programa de traballo do xeito que queremos que funcione? Si, quero levar unha facada nel? Audiencia: Podemos intentar cancelar o punteiro e comprobar a través da matriz? PROFESOR: Esta é unha forma de facelo. Entón, cal é o seu nome? Sinto moito, me lembra. CEE: CEE. PROFESOR: Si, entón o que Zee suxerida sería absolutamente traballar. Non? Poderiamos cancelar o punteiro e realmente ir e acceso os datos físicos dentro aquí. E podemos só comparar a pantalla enteira. Podemos dicir, OK, punteiro, dáme o que está dentro aquí. El retornaría un m. E eu diría, punteiro, dáme o que está dentro aquí. Voltar un m. Será que os xogo? Si. A continuación, seguir adiante. Seguimos a comprobar os dous enteiro cordas todo o camiño ata o final para ver se estas son iguais, Todos os valores son iguais. E, se todos os valores son iguais, entón sabemos as cordas son certas. Absolutamente, iso é como nós o faría? Alguén confuso sobre nada diso? Todo o concepto de como as cadeas son realmente só punteiros, e como non hai realmente? E por iso que recibín erros como a nosa forma de obtelo? Porque eu asegura a vostedes, punteiros e distribución de cordas e memoria van vir cara arriba. Si? Audiencia: [inaudível] dereference Lo, que acaba de publicar unha estrela [inaudível] PROFESOR: Correcto. Así, para un medio de punteiro derererence para ir ao enderezo do punteiro e obtención dos datos, o valor aí. E a forma de facelo é punteiro estrela. Non confunda iso. Audiencia: [inaudível]. PROFESOR: Yeah. Audiencia: Entón pode só escribir se estrela s igual iguais estrela t. PROFESOR: Ben, non. Non. Audiencia: Iso non é bo o suficiente, non? PROFESOR: Non é, porque é que comprobar só a primeira letra. Probablemente vai a necesita dalgún tipo de bucle que percorre cada personaxe en ambas as cordas. Si. Entón, se quería só comprobar a ver no caso de que comezaron coa mesma cousa, podes facer se, estrela s é igual a estrela t. Entón vostede sabe que polo menos eles comezou co mesmo personaxe. Si? Audiencia: Entón, o camiño vostede que sería como un incorporado lazo for ou punteiro? PROFESOR: Yeah. Practicamente só un loop for. Lembre, David na clase mencionada o azucre sintático libre? E tiña que moi cousa confusa da estrela t máis un, onde integraría a través de e mover o punteiro? O xeito máis doado de facer este é só t i. Entón é só unha matriz. A forma que tería un para loop que foi de cero a i, onde I é a lonxitude da cadea, podería só escribir que, no canto de facer a punteiro todo, cousa de referencia. Entón, estas cousas son exactamente equivalente no seu ordenador. Vostedes probablemente non Debe saber que, pero é bo para só un tipo de ten na parte de atrás da súa mente. Só sei que o ordenador recoñece distintos bloques de código como o mesmo. Porque este é só moito máis do usuario agradable para nós para presenta-lo como se fose unha matriz. É só máis fácil. Audiencia: Entón usar strlen a gustar, get-- PROFESOR: Yeah. Audiencia: Aceptar. PROFESOR: Podería usar strlen ou, se non strlen pode só facer-se ata que bateu barra invertida cero para ambos. Ou ía funcionar. Si. Audiencia: Entón é eliminar a referencia a cada único personaxe se está de feito escribir este código, podería só facer t soportes i como coa estrela na fronte del? PROFESOR: Si, é igual a equals s soporte i, e, a continuación, perder i movemento down up ata que bateu o final. Si, iso é o que faría. E eu vou realmente ter unha próxima exemplo cando nós realmente escribir strlen para que vostedes han tipo de comezar a xogar con el un pouco. Así é todo claro só en memoria, cordas, punteiros, enderezos de calidade? Algúns conceptos de nivel máis alto que vontade de certo necesidade de saber sobre o quiz mañá. Todo ben. Bo. Yep. OK, entón unha cousa que nós imos tamén pedir ti, como facemos todos os anos nun cuestionario, é, supoña que teña esquecido (que parece que estamos a esquecer de facer anualmente) en que ficheiro de cabeceira strlen é declarada. E por iso temos que reescribir-lo nós mesmos. Aquí está a lista de directrices que podemos presentar-lle caras onde comeza a asumir que s a cadea non será nulo. Pode asumir que s terminou cunha barra invertida cero. Entón vostede sabe que é o que que vai acabar con. E, por exemplo, que o lonxitude da Ola sería de cinco anos. Así, pode asumir que Ola será cinco, H-E-G-L-S. Non ten que asumir que o backside cero de todo sobre o longo. Esta última cousa aquí, non facer preocuparse integer overflow. Alguén se lembra o integer overflow é? Audiencia: vai máis alá da lonxitude do [inaudível]. PROFESOR: Si, pode explicar un pouco, o que significa isto? Audiencia: Entón, eu creo que vai volver por exemplo truncando anteriormente. Pero se ten só tantos números que supera o número de bits que realmente pode atribuílo la que será só unha especie de corte. PROFESOR: Si, entón nun típico ordenador, cantos bits que temos? Audiencia: 32? PROFESOR: Si, 32, á dereita. E así que é, que, catro millóns, dous millóns? Catro millóns, ata catro millóns enteiros positivos, non? Dous millóns negativo, dous millóns de positivo, Depende de como quere facelo. E entón basicamente podemos ter enteiros suficientes que poden ir ata de dous a 31 menos 1, non? Porque unha vez que se loita dous a 32, non ter esa cantidade de memoria no noso ordenador. E así, en teoría, eu podería vir cun número que é, tipo, dous para o 46º. É un número enorme-ass, pero teoricamente podería. E o estourido de forma enteiro é se tentar crear un número enteiro que vai máis aló do que seu ordenador é capaz de almacenar. E así vostedes para Neste exemplo non teñen preocuparse nós, dándolle un xigante cadea que é de dous para os carácteres 32ª de lonxitude. Iso sería realmente significan. Todo ben, entón eu só vou dar vostedes a estrutura de base do presente. Vai crear un función chamada int strlen onde Un pase en, unha estrela char, ou corda, punteiro para a cadea chamada s. Todo ben, todo o mundo que copiar abaixo. Legal. Oops-- doutro xeito. Polo tanto, este é como unha especie de peza máis difícil de problema, entón eu vou dar a vostedes quizais cinco a seis minutos para o tipo de brainstorming e escribir esta función fóra. Audiencia: Non facer conta para [inaudível] non hai que usar enteiro? PROFESOR: Non, non. Vou dar a vostedes unha información. Un loop while pode ser moi útil aquí. Si. Aquí está doces. Doces tamén estará dispoñible para o quiz, eu creo. Entón vós vai ser todo azucrado ata mañá. Pode i-- conseguiu. Audiencia: Aceptar. PROFESOR: Yeah. Quizais máis de 30 segundos ou menos. Todo ben, se é non fixo, non se preocupe. Nós imos pasar por iso xuntos. Aceptar. Entón, eu estou indo só para o deseño do estrutura básica para esta función aquí. Int strlen. En primeiro lugar, será que alguén quere dicir me o que iso significa int? Necesitamos ter nesta función. Audiencia: strlen [inaudível]. Profesor: Exactamente. Entón o que ocorre aquí, necesitamos volver un enteiro. E, conforme especificado no spec, queremos return-- Vai a el rapaces, só vai manter. É todo de bo. Comer todo, entón eu non teño para levalo de volta, en realidade. O int só significa que é estará retornando un enteiro. ¿Que é este carácter estrela s? Que significa iso? Audiencia: Like, o que está a ser introducido en. Profesor: Exactamente. E o que é case o mesmo como char estrela? Audiencia: String? Profesor: Exactamente. Entón, todo o que estamos facendo é dando este un punteiro para unha cadea. Aceptar. Legal. Ademais, non se esqueza, se esquecer para darlle eses soportes, non se esqueza de escribir-los só. Porque, en teoría, o código incorrecto se esquecer de escribilos. Só sempre prestar atención. Como, cousas pequenas que non entende cando está programando no seu portátil, porque o seu portátil fai por ti? Non se esqueza, cando está escribindo coa man. Si? Audiencia: Pero como incorrecta? Como podemos obter todo o problema mal? PROFESOR: Non, non. Non se preocupe. En realidade, é teoricamente posible para que poida obter todos os puntos sobre unha cuestión aínda que o seu código será nunca se executan na vida real. Eu sugiro que non tente para que isto ocorre. Por exemplo, como se todo que está aquí é certo, pero esquece unha coma ou un soporte, seu código non vai realmente funcionar. Pero podemos ser misericordioso. Si? Audiencia: Ten que comentar a nosa caligrafía? PROFESOR: Non, non, non se preocupa iso. Sen comentar. Estilo debe ser bo. Como, non smush todo nunha liña. Non vai ser feliz con vostede, se fai iso. Alguén quere dáme a primeira liña? Consello, é moi fácil. Si? Audiencia: Int, n é igual a cero. Pode configurar balcón. PROFESOR: Entón, nós queremos algún unha especie de contador, non? Eu só vou nomealo "contar" por unha cuestión de lexibilidade. O que queremos para define-la igual a? Audiencia: Cero. PROFESOR: Yep. Punto e coma. Tamén punto e coma deseño moi estrañas. Só a práctica de facelo. Entón, nós queremos ter primeiro un contador tipo int. Porque quero contar-se como moitos caracteres ou letras en esta cadea, non? Primeiro paso moi fácil. OK, quizais un pouco máis complexo Agora, como é que imos facelo? Alguén quere dáme a liña de código que pode ser capaz de axudar circuíto a través de calquera que é isto? Si, alma valente na parte de atrás? Audiencia: OK, por iso, mentres punto asteriscos, o si, estrela de s, non é igual a cero, a continuación, facer algo? PROFESOR: Isto é moi, moi preto. Realmente preto. Entón eu vou para resolver dúas cousas con iso. Primeiro de todo, non é exactamente cero. Que é iso? É o terminador nulo, que é invertida de cero. Entón, son diferentes en termos de como están almacenados. Entón está realmente preto. E en segundo lugar, non queremos só mover o punteiro. Queremos realmente acceder aos valores, non? E así como podemos facelo? Moi fácil. Non pense sobre punteiros, non pensa sobre memorias. De volta á segunda semana do curso. Audiencia: [inaudível]. PROFESOR: A partir de, lembra? Cales son cordas? Como son almacenados na memoria? Audiencia: Están levantadas. PROFESOR: Son levantadas. Entón, como imos acceder cada personaxe dentro? Audiencia: [inaudível]. Profesor: Exactamente. Entón o que pasa dentro while-- aquí? S de - Audiencia: I. PROFESOR: Oh, eu non existe, non é? Audiencia: Oh, conte? PROFESOR: Podemos só usar conta, non podemos? Audiencia: Sentímolo, eu o chamei i. PROFESOR: Si, é todo de bo. Temos unha variable-se aquí que é xa foi declarado como o noso balcón. Entón, por que non só usar ese para percorrer o loop while? Isto ten sentido? Así, mentres s de count-- alguén quere para me dar o que pasa despois aquí? Audiencia: É non é igual. PROFESOR: Non é igual, non? É o estrondo iguais, signo de admiración é igual, todo o que vós queredes chamalo non equal-- Audiencia: [inaudível]. PROFESOR: Yeah. Teña en conta que comiñas simples é para un char, comiñas dobres son para unha cadea. Teña coidado ao usalos. Entón, cando estamos mirando a través de o array, o último carácter, sabemos que non queremos que sexa invertida a cero. Así, mentres. Non estamos no fin da cadea. O que queremos facer dentro? Audiencia: Queremos engadir á balcón para que conta plus plus? Profesor: Exactamente. Entón aquí imos facer contar, conta plus plus. Falta unha liña. Estamos case alí. O que estamos esquecendo de facer? Audiencia: Volvendo a cero? PROFESOR: Quere volver cero? Audiencia: Non, retornando para strlen. Espera. PROFESOR: Cal é almacenado? Audiencia: Conta. Conta. Profesor: Exactamente. Entón aquí imos volver conta. Porque o que somos facendo aquí ultimately-- temos unha variable de contador que é vai incrementar a través da nosa cadea. Nós imos seguir, seguir ir en torno e arredor neste loop. E mentres non estamos a finais deste cadea, que é o terminador nulo. E cada vez que nós atravesamos Lo, estamos engadindo ao noso balcón. E imos máis aló ao longo desta matriz. E, ao final, xa que bateu o terminador nulo, sabemos, oh, podemos romper, voltar a conta. Temos a nosa strlen. Será que todo o mundo chegar como este implementado? Mentres loops-- Sei que non ten feito moito con eles, pero son normalmente moi, moi útil se Non sei o que está parando condición ten necesariamente que ser. Pregunta? Audiencia: Podemos escribir nulo coa condición de tempo? PROFESOR: Aínda? É, polo tanto, neste problema que tiven que caras asumir que s non será nulo. Porque lembre, en teoría, se eu che dei un punteiro que era demasiado grande de memoria, que lle daría o nulo, non? Iso é o que o operativo sistema faría. Entón, se eu non lle dixo para asumir s sería nulo, ten que comprobar. Entón aquí, faría, se s é igual a é igual a cero, volver un. Algo así. Audiencia: [inaudível] cero. PROFESOR: OK, eu vou dicir vostede por que non podemos facelo. Porque recorda na memoria, ben, aquí. Imos aquí. Ten bloques xigantes memoria de todos con reixas que almacenan os valores diferentes, non? E así todo o é-- para unha cadea exemplo, se queremos entrada Ola, sería H-E-G-L-S barra invertida cero, non? E entón, quen sabe, como chou cousas que son aquí despois. Nós realmente non sei o que está aí. E por iso, se fose facer no canto de barra invertida cero, null, non pode ser nulo. Porque só pode significar algunhas outras cousas aleatorias que non pertencen na súa cadea. E así, o xeito que sempre coñecemos unha secuencia termina cunha barra invertida é cero. E así que é sempre como nós comprobar a ver o final dunha secuencia de carácteres. Null, todo o que significa que se ten un punteiro inexistente, en primeiro lugar, ou a súa memoria é tan grande que non pode devolve-lo, el sería nulo. Polo tanto, moito coidado ao diferenciar a diferenza entre nula ea barra invertida cero. Si. Todos OK con iso? Aceptar. Así que tiven que vostedes escribir strlen. Viabilizar tamén poderiamos preguntar-lle escribir out A a I, lembre que "Atwoa" ou o que vostedes queren chamalo? Esa función en Vigenère e César, que convértese nun valor ASCII para un enteiro? Isto tamén ven en cuestionarios pasados das funcións que xa lle pediu para escribir. Practicamente calquera función que xa usou e é moi fácil escribir-se, sensores de gusto é inferior, é superior, a inferior, a parte superior. Funcións que converten un secuencia de minúsculas para maiúsculas. Todos sabemos como facelo, non? É moi sinxelo. Só quero estar seguro de que vostede can-- é o mesmo proceso de pensamento. Acaba de facer unha iteración través e cambiar as cousas. Quere contar ou cando virar as cousas de forma diferente. Quere suggest-- I Non sei se imos para pedirlle que memorizar o que o capital Un ou Z de capital, ou minúsculas Un minúsculas z están en ASCII, pero quere suxerir quizais por escrito, que establece, en caso o que facemos. Só vós ter unha referencia. Como maiúscula é, o que, 197? E entón minúsculas é como 50 algo. 65, si, alí vai. Entón, só sei moi ben o diferenza entre eles é de 32. Isto é moi importante. Si. Eu son bo niso? Aceptar. Audiencia: Poderiamos teoricamente escribir algún destes abaixo tamén na nosa little-- PROFESOR: Vostede teoricamente podería só copiar a función abaixo. Iso é certo. Audiencia: Non [inaudível]. PROFESOR: Vostedes teñen unha folla. Vostedes teñen unha folla de nota. Pode escribilo. Pode escribilo. Podes facer o que quere con el. Si. Entón, en teoría, se quere, ir. Audiencia: [inaudível] pero nós realmente non necesariamente que lembrar o valor, podemos só usar a parte superior ou funcións inferior, non? PROFESOR: Yeah. Pero se nós demos-lle unha pregunta que di que escribir para superior, entón precisas para escribilo. Entón podedes supor que caras teñen acceso a todas as funcións, pero se quere empregar para superior ou inferior, o que tamén ten que facer? Audiencia: [inaudível] usar CS50 [inaudível] PROFESOR: É CS50.h? Teña coidado alí. Así, a parte superior, a inferior, é superior, sexa inferior, funcións que implican manipulación de cadea son todo dentro de un ou outro a ASCII ou dentro da biblioteca matemática ou dentro da biblioteca cadea. Entón, se vostedes usalos funcións, teña coidado de lembrar para incluír este cabeceira. Por iso, se cadra tamén algo que pretende incluír na súa folla, o que son a cabeceira? Cales son as bibliotecas está a usar? Que funcións son dentro desas bibliotecas? É importante. Si? Audiencia: Poderiamos só policial fóra e facer hashtag a través do absolutamente cada letra que xa visto como sobre todas as cuestións? PROFESOR: Podería. Non sei o quão feliz estaremos ao grao que proba cando cada peza de código é dúas veces máis longo, xa que ten que ser. Non sei, nós puidemos sacar un punto para o estilo. Pero, en teoría, o seu código sería correcto. Vostedes poderían policial fóra e basta incluír todo. Iso é bo de máis, si. Audiencia: [inaudível]. PROFESOR: Yeah. Quere suxerir non facelo aínda. Si. Audiencia: Cool. PROFESOR: Boa pregunta. Audiencia: Entón, o peor escenario. PROFESOR: O peor caso. Se esquece totalmente, podería facelo. Si. Yep, o código é logo alí. Eu usei n no canto de conta, pero, vostede sabe, calquera que sexa o seu barco flota. Audiencia: Espérase, polo que non tería que hashtag incluír porque somos comezando o int? PROFESOR: Si, eu só asumir que nós nos pediu para escribir a función. Se quere ser seguro, probablemente podería poñelas alí. Pero eu simplemente non se incomodou, si. Eu non sei se precisa de biblioteca para iso. Porque non está realmente a impresión algo ou nada, non? Si, eu non sei se precisa dunha biblioteca. Aceptar. Este tamén é un pouco máis longo as liñas de manipulación de memoria. Este tipo de bocado complicado. Pense sobre iso. Ten unha función chamada func. Eu podería ter chamado el o que sexa, pero eu escollo para nomea-la func. Teño o enriba do meu principal. Teña en conta que, quere ter unha función tras o seu principal, quere estar seguro de que inclúen o prototipo do cume. Pero, neste caso, foi tan curta que eu sentín que eu podería só inclui-lo na parte superior da páxina. Non precisaba ter o prototipo, porque xa está escrito anteriormente. Entón todo o que eu estou facendo na miña función principal está creando enteiro x é igual a 10. Estou chamando miña función func, e, a continuación, imprimir algo. E, a continuación, que, de feito, o que func está facendo. Vós queredes pensar por iso. Porque é un pouco complicado. É moi, moi complicado, en realidade. Pensar co que este programa sería outputting. Vou dar a vostedes dous minutos. Boas discusións? Audiencia: É. PROFESOR: Yeah. Todo ben, entón que é complicado por unha razón. E é por iso que eu quixen traer esta a atención de todos. Alguén quere me dar unha suxestión, un intento? O que isto imprimir? Totalmente ben se está mal. Si? Audiencia: Creo que é 100 e logo 10 en dúas liñas separadas. PROFESOR: E a 10? Alguén ten algunha outra suposicións? Si? Audiencia: Quizais só 10, porque func non está retornando nada? PROFESOR: OK, entón nós ten palpite número un que suporía número é dous indo só para imprimir 10. Alguén ten algunha outra suposicións? Aceptar. Entón, imos camiñar por este, non? Sempre que incorporarse unha peza de código, non basta ollar para el e ser como, ah, iso é tanta cousa! Estou tan confuso! Como, acougar. Só sei que podería só ollar a través de código liña por liña. Isto é todo o que é. É como ler un libro. Así, con calquera función, sempre comezan en principal. Entón, nós estamos indo a comezan en void main int, mesmo o programa de xa parten, non? Comezar no no baleiro principal. Int x é igual a 10. Entón, eu vou borrar iso. Vou chamar a memoria só para ti caras pode tipo de ver o que está pasando. Teña en conta que aquí temos a nosa pila? Ata aquí temos o noso amontoar nalgún lugar por aquí. Pila crece, non? E dentro do conxunto, ten a corrente eléctrica, así como funciona todos os tubos principais variables locais. Entón, aquí, int x igual a 10. Dentro da nosa función principal somos a creación dunha variable chamada x. Estamos establecendo que igual a 10. Aquí tes algunhas x, e está definindo que igual a 10, á dereita, dentro principal. Todo o mundo é bo? Función. Entón, agora, dentro do noso principal función, estamos chamando a función que escribimos anteriormente. Entón, nós estamos agora entrar na segunda función. Nós imos crear outro variable int x é igual a 100. O que está pasando aquí na pila? Que pasa cando chamar un función que crea novas variables? Que pasa aquí na pila? Audiencia: [inaudível] pilas enriba? PROFESOR: Yeah. Por iso, en realidade, crea unha copia. E que tipo de pilas na parte superior. Pense no stack-- unha pila de libros, unha pila de nada. Piles na parte superior, primeiro na última a fóra, último a entrar, primeiro en saír. Por iso, vai crear un x aquí. Isto vai ter todas as variables funcs. Gran. Polo tanto, agora temos dous x diferentes que representan dúas cousas moi diferentes. Entón nós imos para imprimir a número enteiro de x. Entón, imos imprimir 100, non? Porque aquí é 100. Entón esta é a primeira cousa que está indo a imprimir. Como esta función devolve nada, agora esa función, esta liña no principal está feito. Todos bo comigo ata agora? Entón, nós estamos agora a través de dous dos tres liñas de nosa función principal. Agora imos para a terceira liña. Estamos indo para printf. ¿Que é este x dentro principal? O que isto supón? O valor é x agora? Audiencia: 100. PROFESOR: É 100? Audiencia: Still 10. PROFESOR: Still 10. Si. Porque lembre, no prazo de nosa func, x é igual a 100. Pero se volvemos atrás a nosa función principal, variable que é almacenado nunha lugar diferente na nosa pila. Entón, agora temos que volver ao pila principal, rede de variables locais. E aquí onde x é igual a 10. E así imos imprimir 10. Entón, ela estaba absolutamente certo. Nós imos ter a saída de 100 e 10. Si? Audiencia: Cando malloc, é o heap ou do conxunto que é [inaudível]? PROFESOR: Cando malloc, está tomando memoria do heap ea súa distribución. De xeito que non ten para xogar con nada diso. Entón eu creo que a maior takeaway aquí é algo chamado ámbito. Para aqueles de vostedes que estaban en a sesión de revisión na noite pasada, Falamos un pouco sobre iso. Ámbito define como e cando existan as súas variables. Ou no que enmarca facer existir súas variables. Practicamente a regra xeral é, o seu variables-- se crealos dentro braces-- rizado existen soamente dentro desas claves. Así, por exemplo, na nosa función de func, ve estas dúas chaves. Se está creando calquera cousa dentro del, posibilidades son todo o que está facendo é a creación dunha pila e que o almacenamento de alí. Mesmo na principal. Isto é só almacenado dentro do principal. Ademais, quere ser moi, moi coidado aquí. Porque ámbito tamén presta Se a diferentes exemplos. Así, por exemplo para unha loop, para int i é igual a 0. I é menor que, eu non sei, 10. I plus plus. E ten o código para dentro del, non? Onde é que esta variable, i, en realidade, só existen? Só dentro do seu loop for. Entón Aposto que moitos de vostedes teñen probablemente atopou este erro cando está facendo co seu programa Serie de exercicios. Cantos de vostedes intentaron utilizar i fóra dun loop e tiña un erro? Como unha enteiros sen referencia ou algo así? A razón pola que isto ocorre é porque está aquí creando algo que só existe dentro do seu loop for. E se tentar usalo, eu non realmente existe fóra del. Entón, basicamente, un ordenador dicindo, eu Non sei o que está falando. Todo o que sei é que eu era un aquí, pero agora xa non é. Entón, se eu fose para crear un loop for a dentro, non? E eu vou crear outra, como int j, e telo facer o que quere. E ten un código dentro que loop, j só existe aquí. Pero iso tamén hai dentro de min. E así j só existe dentro deste loop for, Considerando i existe na cousa toda. Todo o mundo é clara? O mesmo con instrucións condicionais se quere crear algo. Mesmo con loops mentres que se quere crear algo. Isto é algo a ser moi, moi coidado. Polo tanto, este foi realmente un bo problema no sentido de que demostrou dúas cousas. El demostrou por primeira vez, o ámbito de aplicación. E demostrou tamén a distribución de memoria. Porque vostedes deben saber que funcións crecer cara arriba na pila. E que cando chamar funcións, está creando esencialmente unha nova pila de memoria. Isto é moi diferente do o que a súa memoria de rede é. Si. Ufa! Todos OK sobre iso? Iso foi confuso. Moi bos temas para pasar por riba, porque probablemente está indo para obter un complicado cousas como esta no cuestionario. Si. Legal. Vou poñer chegar nun 100 A liña 10 e despois o outro. Si, moi bo. OK, agora vostedes van comezar a oportunidade de ser os ATs. Comeza a responder a todas a encantador correos electrónicos que ás veces teño. Entón, Dear Andi, vexo Creo que ten algo pasando de malo co meu compilador. Estou seguro de que o meu código está correcto, pero eu sigo recibindo un fallo de segmento cada vez que eu corro. Qué está a pasar? Por favor, axuden, moito amor. Se vós ten algo como que como respondería? Estes son realmente moi común preguntas que vai pedir para ti. É que, nós imos dar-lle un escenario, imos dar o mellor palpite sobre o que está pasando. Alguén ten unha facada en o que está pasando? Si? Audiencia: Quizais o desreferenciado null, algo así como o punteiro está a apuntar cara algo nulo. PROFESOR: Si, iso sería un exemplo cando iso acontecería. Pero cal é a imaxe máis grande do que está pasando aquí? Audiencia: É que estás para acceder a memoria que non está debería ter acceso? Profesor: Exactamente. Entón, pense dun fallo seg, un off límites, área restrinxida na memoria que non debe estar tocando. Entón, basicamente cando estás para index-- coma vostede declarou un matriz de cero a nove. Pero tentar tocar que 10 valor, non ten acceso a iso. Porque non declarou el. E para que o seu ordenador está indo ollar para iso ser así, uh oh, estás ir fóra dos límites do índice. Vou darlle un fallo de segmento. Debería como segmento, non? Un segmento extra, a culpa é cando se trata de romper algo e non debería estar alí. Fallo de segmentación é en calquera momento tentar tocar as cousas que non debe estar tocando. Así, exemplos comúns son un índice. Por suposto, se está tentando tarifas que era nulo, que tamén funcionaría ben. Se o punteiro estaba tentando tocar cousas que non deben tocar, que tamén podería funcionar tan ben. Máis tipicamente vai ver iso nunha matriz. Todo o mundo é bo? Audiencia: Entón se quere para acceder ao punto 10 e só hai un límite de nove ou algo así. PROFESOR: Si, exactamente. Moi bonito. Legal. Estimado Andi. Entón temos estes marabillosos cousas chamado tipos. Se Unir sort-- como nós serra no exemplo cando David fixo todo cousa en class-- polo que se é moito máis rápido que calquera dos outros tipos, por que incomoda mesmo sabendo calquera dos outros tipos? ¿Que é esta cuestión realmente pregunta-lle? Cal é a tres word-- Audiencia: Cal é o trade-off? Profesor: Exactamente. Iso é o que a cuestión está pedindo. Cal é o trade-off entre Merge sort versos doutros tipos? Audiencia: Toma memoria, non? PROFESOR: Vostede explicar que un pouco máis? Primeiro imos explicar tenda directa. Como é que merge sort traballar? Audiencia: El funciona por dividindo todo na metade e, a continuación, colocar-lo xuntos e realocando lo en orde, como cada vez que mesturar os sets. PROFESOR: Moi bonito. Entón, podo chamar iso, pero sería leve o meu cinco minutos para sacala. Olle novo para os diapositivas sección onde nós Cubrimos merge sort. Exactamente. Así, a forma Unir obras de clasificación é el divide as cousas pola metade, e el só mira para o primeiros valores de todos eles e clasifica só iso. Crea continuamente novas matrices e pon as cousas máis e máis en orde. E así, mentres que é moi, moi rápido, porque it's-- vostede sabe, unha investigación binaria é log n de n. Está creando tantos matrices diferentes que é utilizando unha cantidade enorme de memoria. E así, mentres el é máis rápido, o trade-off aquí é que está a usar máis memoria. E así, suxestión, tipos e investigacións foron cubertas moito máis este ano que foron os anos anteriores. Vostedes deberían ver que reflectido, en consecuencia, o quiz. Eu sempre gastar tempo indo sobre o que todos os distintos tipos son, como busca binaria, como o traballo de procura lineal. Como quizais pseudocódigo codificar os para fóra. Cales son os tempos de execución? Algo así como tempos de execución é moi doado de copiar abaixo nunha folla de nota, non? É realmente difícil cando está no medio da proba e ten que descubrir iso. Pega o para abaixo. Eu asegura que é vai ter que saber iso. Cales son as vantaxes e inconvenientes? No peor dos casos, os mellores escenarios para todos eles, moi coñecer. Si? Audiencia: Non necesitamos sabe codificar merge sort? Como, necesitamos Teña en conta que o recursiva? PROFESOR: Eu dubido moito, só porque é como moi complicada. Pero non se pode implacable se pedirte para usar pseudocódigo-lo. Si. Si, vale, máis unha. Isto pode vir enriba en vostede última peza nun pouco. Si? Será que todo o mundo escoitou isto? OK, entón practicamente primeiro todo, que tipo de programa sería dándolle unha saída como esta? Lembre pedimos que aprenda sobre este novo tipo de ferramenta de depuración? Cal era o seu nome? Valgrind, dereita Era un programa onde podería chamar que podía manter o control de toda a memoria que está usando no seu programa e estaba a ocorrer. Entón, se ten algo, como, definitivamente perdido, 40 bytes nun bloque. Probablemente non está lembrando-se para liberalo la. Porque se está a usar bytes de memoria, isto significa que un acceso esa memoria, pero non foi capaz de liberar. Entón quere facer Asegúrese de que tamén é usando free-- que é un function-- para liberar todos da memoria redistribuídos por malloc. Legal. Polo tanto, este slide, eu vou telo instalado. Está en todas partes en unha serie de conferencias, en moitos diapositivas sección. Realmente quere estar seguro só sabe de todo isto. Tanto na súa folla de nota ou se quere lembra-lo, Sinto-se libre para. Isto é realmente, realmente, realmente importante. Tamén un moi bo pregunta que podemos pedir. Por que mirar Selección sort-- en Selección sort-- todos os tempos de execución son n ao cadrado. Independentemente de como a lista trata vostede como, entón por que é sort-- Selección Vou dar a vostedes 30 segundo pensar sobre iso. Porque é unha especie de confundir. Trátase de algún pensamento conceptual. Por que os tempos de execución sexa o mesmo en ambos os peores e os mellores escenarios? Si? Audiencia: Por cada especie Selección posición ou espazo neste pequeno conxunto cousa ou o que quere. Así, mentres que no mellor escenario, aínda que sexa perfectamente ordenados, aínda tería que ser como, OK, un. O primeiro lugar eu teño un. E pasar por todos eles. OK, é o menor. E entón el vai de novo e é como, OK, dous é a menor de todas as cousas. Pero aínda ten que comprobar todos e cada un. PROFESOR: Yeah. Así, por exemplo, imos só dicir Temos unha lista, xa clasificado, unha matriz de un a cinco. O xeito que tipo de selección é que pasa por, el verifica estes dous. A continuación, el verifica os dous. E, a continuación, el verifica e verifica. El mantén a verificación de todos eles, independentemente de haber ou non é realmente clasificada. Porque iso é simplemente o xeito no que o tipo funciona. E así que esta cuestión é como unha cuestión conceptual imos pedir. Onde en primeiro lugar, ten saber que tipo de Selección é, á dereita, para poder para responder á pregunta. Ten que ser capaz de entender conceptualmente o que está pasando. E entón podes aplicala lo e pensar, OK imos só imaxinar peor escenario. Están todos en orde decrecente. Como iso afectaría isto? O que se está a orde ascendente? Se xa está clasificado? Como iso afectaría os tempos de execución? E, a continuación, tipo Selección, notará que en realidade non importa. Porque está comprobando toda a valores, independentemente do que está pasando. E así as cousas boas para lembrar. Porque algúns tipos difiren doutros e que a mellor e os peores escenarios afectaría todos eles. Eu estou indo a realmente bater tipo porque iso vai estar no quiz. Si. Aceptar. Hai seis minutos do final. Podo tomar tres minutos de preguntas. Eu tamén pode colgar en torno a como 20 minutos despois sección se quere facer preguntas tamén. Alguén só ten realmente breve dúbidas ou cuestións conceptuais son pouco claras sobre a dereita agora? Si? Audiencia: Pode falar un pouco pouco sobre os operadores bit a bit? PROFESOR: Yeah. Así, os operadores bit a bit son algo que probablemente pode só querer poñer na súa folla. Entón quickly-- Non quero para ir moi a fondo porque Harvard, na súa revisión sesión, cubriuse o moi ben. Operador bit a bit, hai cinco deles, non? Non é iso, que é x ou función, hai comercial, que é o e. Pipe, que é o or. E entón tes os dous distintos tipos de quendas. Se eu lle dou dous valores, se Eu doulle, como, un e un. Que tería que ser valorada como? Se eu lle der certo e certo, certo? E canto verdadeiro ou falso? Aínda verdade, non? Porque hai un ou. Nós probablemente lle vai dar números. Entón lembre, un é igual a realidade, o cero é igual a false. E nós pode darlle estas cousas e pedir-lle para nos dicir o que pasa. Harvard cobre dentro do primeiro 10 minutos de sesión de estudo moi, moi ben. Entón vostedes queren facer se ollar cara atrás sobre o tema. Audiencia: É pisa5 será a proba? PROFESOR: Non. Nin sequera ollar para pisa5 agora. É difícil. Só non se molestas mesmo buscando pisa5. Con todo, como algúns consellos e suxestións, I quere suxerir que comece pisa5 así que o cuestionario é longo. Este será o máis difícil semana, pero despois vostedes será pasado que nos outeiros de verde e crías rolando, e está todo ben. Esta clase recibe significativa máis fácil despois do quinto pset. Horario de atención: Audiencia son domingo, luns? PROFESOR: Si, entón o horario de oficina será o domingo para o luns ao pset. O horario de oficina esta noite, esencialmente, só será crítica ao quiz. Se alguén quere vir e preguntar o TAS unha pregunta, nós imos estar alí. Vou levar quizais unha pregunta se alguén ten unha pregunta? Si? Audiencia: Cando está nós que definen, [inaudível] se dixo estrela nó e, a continuación, ao lado, fai o ordenador automaticamente entender que é referíndose a outro punteiro? PROFESOR: Non. Audiencia: Ten que relink iso [inaudível]? PROFESOR: Entón, basicamente, o struct dun nodo é, marca, é como se crear o nodo e entón tes un punteiro chamado seguinte. Todo o que está facendo é tendo a estrutura alí. Ten que asignar ese punteiro en algún lugar. Así, os ordenadores non fai sabe o que está facendo aínda. Vostede realmente ten que atribuílo cando está creando a súa lista ligada. E iso é o que principalmente pset 5 será conectado. Así, non se preocupa nada diso agora. Audiencia: Entón non precisamos concentrarse máis na lista de enlace, só o deseño xeral? PROFESOR: Só practicamente pilas, colas, listas de enlaces, árbores, táboas de hash. Só ten que ser capaz de saber o que son. Non imos pedir desexa algo específica porque realmente non teño feito un pset que o cobre nada diso aínda. Así, nos últimos dous minutos antes Eu define-lo libre para matar este quiz. Moi ben, como, pense sobre como agora vostedes viñeron nesta clase. Recordo cando dúas semanas desta clase, algúns de vostedes pasar tres horas de auga escribir. Canto tempo tardaría a xente a escribiren auga agora? 30 segundos, quizais? Debería canto vostedes aprenderon. CS é un asunto moi, moi difícil. Non hai dúbida de que. É difícil, é por iso que ninguén estuda. É moi difícil. E é totalmente bo. E eu estou realmente orgulloso que todo o mundo xa fixo ata agora. Serie de exercicios non son fáciles. Eles levan unha morea de tempo. Vostedes, eu nunca vou pedirlle para escribir o xogo de 15 ou Vigenère no pset. Non é necesario só pirar con iso. Todo o que estamos a probar aquí é avaliar seu coñecemento conceptual, así como algunhas das súas habilidades básicas de codificación. O ensaio está concibida para ser realmente reto. Como, el está deseñado para que non queda 100. Tamén está deseñado para ti, probablemente, non ser capaz de rematar en 75 minutos. E iso é totalmente bo. Eu son un estudante de min mesmo. Eu sei, eu odio cando eu ando fóra dun quiz ser como, merda. Iso foi realmente difícil. Probablemente, o que vai happen-- e iso é totalmente bo, Eu digo a vostedes agora. Os medios sobre isto non son elevados en todo. E para aqueles de vostedes que foron quedando, como, trios nos seus conxuntos de problemas, iso non significa que é indo para obter un 60 por cento nesta clase. Se recibe un 60% no cuestionario, que non fai Quere dicir que vai obter unha D nesta clase. Vemos, especialmente I, para aqueles de vostedes na miña sección, Vexo o quão duro vostedes están todos a traballar. E eu manter o control do que iso. Vostedes van estar ben. Non hai memoria institucional felicidade ao final do semestre. Porque todos os nenos de Harvard están dicindo os seus amigos, oh, vai estar ben. Ninguén está dicindo a vostedes que aquí. Entón eu teño que dicir a vostedes que aquí. Vostedes van estar ben. Estou tan orgullosa de todos vostedes. A proba será difícil. Estude para el, e despois só xoga-lo fóra. Prepare-se para aprender cousas novas. E comer doces. Temos teñen lotes de doces. Teña unha boa noite de sono. Non non durmir, porque iso sería moi malo. CS é unha morea de lóxica. Se non durmir, non pode funcionar, eo seu cerebro non pode funcionar. E eu vou estar aquí ao seguinte 20 minutos se alguén quere ir ao redor. Vostedes están indo para matalo. Boa sorte.