PROFESSOR: Então, a agenda para esta semana, que muita coisa não. Mas espero muito, muito útil e relevantes para vocês essa semana. Mas nós vamos gastar cerca de 15, 20 minutos apenas falando rapidamente sobre a lista de link. Listas de links vão ser coberto no quiz. Então, talvez seria muito útil para aprender um pouco sobre o que é. Nós vamos passar a grande maioria da seção de hoje passando por cima questionário zero problemas práticos. E então nós vamos salvar talvez 20, 30 minutos no final para quaisquer questões remanescentes alguém tem. E, em seguida, o último cinco minutos, eu vou a dar-se uma bomba de discurso para o quiz. Todos vocês caras querem estar aqui para isso. Porque ele vai ser um bom momento. Tudo bem, então alguns materiais na lista de link. Como eles estão normalmente é estruturada Você tem o que é chamado de nó, certo? Você tem essas coisas chamadas nodos, que são estruturas. Eu vou passar por cima de como criar um nó no próximo slide. Mas essencialmente todos ligados listas é são dados que tem sido amarrados juntos via ponteiros. E assim a vantagem que temos de usar uma lista ligada mais, talvez, como uma matriz, é o facto de, em uma matriz você precisa de um bloco contíguo de memória todos no mesmo lugar, um após o outro, para ser capaz de ter que. Considerando que a lista ligada, você poderia têm pequenos pedaços aleatórios de memória todo o seu computador amarrados juntos por ponteiros. E, desta forma você podem acessar informações que vem um após o outro, depois a outra sem a necessidade de apenas um enorme pedaço de memória em seu computador em algum lugar. E por isso este é um dos principais razões pelas quais usamos lista de links. Em segundo lugar, é muito fácil de dinamicamente redimensionar a lista de links porque na matriz, quando você declarar uma matriz, você tem um certo valor definido. Digamos que eu queria criar um conjunto de 10 números inteiros. Eu criar uma matriz de 10 inteiros, e é isso. É 10. Eu não sei o que fazer depois disso. Se eu quisesse fazê-lo 11, não pode fazê-lo. Se eu quiser marcar 9, não pode fazê-lo. Considerando que, em uma lista de links, você pode adicionar e apagar e inserir onde quiser. Você pode redimensionar dinamicamente o seu estruturar aqui, sua estrutura de dados. E isso nos dá um monte mais flexibilidade adicionada que normalmente não tem com matrizes. Qualquer um confuso sobre a base estrutura de como uma lista de links é ou porque nós temos que usar um sobre uma matriz? Sim, nós vamos passar por cima em detalhe como realmente criar um. Mas esta é apenas uma espécie de o sentido geral agora. Legal. E assim matrizes são amarrados juntos dessas encantadoras pequenas coisas chamados de nós. Tudo o que um nó é um tipo de estrutura. Lembre-se, um struct é se você queria para criar um determinado tipo de variável C em que já não existir, você, como um programador, pode realmente criar isso sozinho. E assim, este tipo de dados estrutura é denominada nó, na verdade foi criado por nós, para que não existe dentro C por si só. E a maneira que você criar um é que você tem o cabeçalho de typedef struct, que informa o compilador que eu sou prestes a criar um struct. Vamos nomeá-la "nó". E dentro vamos para declarar uma variável em, que vai armazenar um valor. E então nós também vamos ter um ponteiro chamado "next" que aponta para o próximo nó na lista link. E então você terminar esse off por apenas repetindo nó novamente para o compilador sabe, OK isso é o fim da minha struct. E assim, desta forma, estamos espécie de criar uma matriz pequena bonito tipo de coisa com um valor e com um ponteiro. E você pode ligá-los todos juntamente com os ponteiros. Assim que todos eles podem ser tipo amarrados juntos em uma cadeia. Legal. Você pode ouvir que um pouco melhor? AUDIÊNCIA: É. PROFESSOR: Tudo bem. Assim, a maneira que, como vocês podem ver, uma lista de links típico é estruturado é que você tem uma cabeça. Você tem o valor de cabeça que não é sendo apontada por qualquer outro ponteiro. Mas está indo para apontar, ou referência, o outro nó. O nó depois vai referenciar o nó depois disso, e assim por diante e assim por diante até que, eventualmente, acertar o fim da sua lista de link. E você só não vai ter um ponteiro lá. E assim, pensar como, em uma corrente, ou mesmo se algum de vocês fizeram, eu não sei, como com frutas Contornos quando você era pequeno. Você faria reuni-los e usá-los em torno de seu pescoço. Acho que é exatamente a mesma coisa. Você tem essas pequenas coisas que você pode encadear que apontam para um depois, um após o ela, e assim por diante e assim por diante até que você tenha uma cadeia de uma estrutura de dados que você pode usar como quiser. Assim, a maneira que este faríamos tipicamente inserir ou excluir qualquer nó de um link lista é muito diferente dependendo de onde esse nó é. Assim, por exemplo, porque ponteiros são sempre apontando para um valor específico, quando você excluir ou inserir um nó, você quer ter certeza de que o ponteiro é tudo apontando para as coisas certas. Então, se você queria inserir potencialmente um novo nó com o valor de um dentro de um link classificada lista, todos nós sabemos aqui a partir da imagem que vai ir entre cabeça e dois, certo? Porque se encaixa bem ali. Mas a maneira em que nós faria isso é primeiro dereferencing o ponteiro da cabeça e mandar que para um. Mas chegamos a um problema aqui. Qualquer pessoa pode ver qual é o problema é se nós fôssemos primeiro dereference o ponteiro de cabeça para um? O problema pode nos deparamos se tentarmos para adicionar este à frente da nossa matriz? AUDIÊNCIA: [inaudível] Professor: Exatamente. Portanto, temos aqui um ponteiro que foi uma vez que aponta desde a cabeça até dois. Mas se você se livrar desse ponteiro, você apontá-lo para um, agora temos nenhuma idéia onde ir para encontrar dois. Porque, como eu disse antes, você tem um pedaço gigante de memória em seu computador. Todos estes nodos podia ser intercaladas aleatoriamente em qualquer lugar em seu computador. E você não sabe como proceder para encontrar isso. E por isso você precisa ter ponteiros apontando para todos os nós no final. Ou então se você acidentalmente dereference um sem primeiro atribuição um valor em primeiro lugar, você é só vai perder tudo depois. Então, o que nós estamos indo para fazer é, você faria primeiro quer criar um ponteiro em o nó que você deseja inserir. Apontá-lo para onde você deseja inseri-lo para, e então depois você poderia apontar cabeça para trás a um. Isso faz sentido para todo mundo aqui? Ótimo. Pense nisso como apenas como uma cadeia. Se você adicionar uma cadeia, é uma espécie de intuitivo como você iria sobre como inserir isso. OK, de modo que é realmente muito mais curto do que eu pensei que seria, um discurso de cinco minutos sobre listas de links. Só assim vocês têm a idéia básica do que o que é. Aqui temos a agenda para questionário zero. Não deixe que isso o intimide. Eu sei que é um monte de informações. Ele parece muito assustador. É também um monte de, I pensar, tipo CSC de termos. Coisas como cadeias hexadecimais, ponteiros, alocações de memória dinâmica são termos que soam muito assustadores. Mas nós estamos indo para quebrá-las para baixo, fazer alguns problemas de prática para que vocês todos estão prontos para este teste. Quantos de vocês têm já começou a estudar? OK, vocês provavelmente quer para começar a começar sobre isso, porque o teste é amanhã. Ou quinta-feira para alguns de vocês. É, por isso estamos indo para ir sobre alguns problemas práticos. Se vocês todos querem tomar uma folha de papel, um lápis. Nós vamos apenas passar o grande maioria da seção de hoje passando por cima alguns dos que então vocês têm uma idéia do que esperar no quiz. ESTÁ BEM. Um par de logística detalhes, bem como, para qualquer um que não tem sido a de que link lá, se você vai para cs50.yale.edu, na parte da frente Nesta página há um link que diz "sobre Quiz Zero". Link leva você até lá. Se você ainda não leu, leia-o. Porque lhe diz realmente importante informações sobre o quiz. Eu vou puxar esta fora de que só porque, fisicamente, se vocês não sabem onde para ir, vamos ter problemas. E por isso, se o seu passado em termos com A de N, ir para o auditório da escola de direito. E se os seus últimos começa com P a Z, ir para Davies Auditorium. E isso só se aplica para pessoas na seção de quarta-feira. Se você está tomando o quiz sobre Quinta-feira, você vai para SSS 114 onde sua palestra normalmente é. AUDIÊNCIA: [inaudível] PROFESSOR: O a Z, você vai para ir para o auditório Davies. Eu vou mudar isso, certo? Oh, sim, você acabou de falhar automaticamente. Oh yeah, é isso que você Christa. Sim, meu mau. Sim, O a Z, você vai para ir para Davies Auditório. Eu vou corrigir isso uma vez que eu carregar. Sim. E, em seguida, também algo importante à mente é que quarta-feira, se você está oficialmente matriculados na seção quarta-feira, você deve tomar o seu teste na quarta-feira. E se você estiver matriculado em quinta-feira, você deve tomar o seu teste quinta-feira. E é durante o horário de aula. Onde, eu acho que é como 1:00 para 02:15 às quartas-feiras e 2:30 - 03:45 Nas quintas feiras. Se você tiver um conflitos irreconciliáveis, Desculpas de Dean são a única coisa, infelizmente, podemos tomar. Porque nós tivemos um grande maioria das solicitações mudar de quarta-feira para quinta-feira. Que não pode honrar a menos temos um pedido do Dean. ESTÁ BEM. Então, antes de começar a fazer uma par dos problemas da prática, Eu só vou passar por cima Dicas úteis de Andy para o sucesso. Vocês, quando você estuda, você realmente quer praticar escrever código à mão. A primeira vez que eu tomou um quiz CS, eu não tinha código escrito à mão prática antes e foi extremamente chocante em como era difícil. Quando vocês não entrar no hábito de digitar tudo, ele vem muito naturalmente, sendo capaz de ter completada automaticamente colchetes e-vírgulas lá. Quando você escreve para fora à mão, às vezes é muito, muito fácil esquecer um ponto e vírgula, ou se esqueça de fechar um suporte, ou se esqueça de fechar dois pontos, ou algo assim. Então, quando você escrever o código à mão, é uma sensação muito diferente. Então vocês, quando você está trabalhando através de alguns dos problemas da prática, seria bom para realmente praticar hoje. Ou amanhã, suponho, se você estiver respondendo ao questionário na quinta-feira. Em segundo lugar, temos a última, como, vale da prática de oito anos quizzes online. Questionário deste ano será, provavelmente, muito, muito semelhante a todos eles. Eles são todos muito semelhantes. Você espécie de entrar no estilo do tipo de perguntas que pedimos, o tipo de funções que vamos escrevê-lo em, et cetera, et cetera. Portanto, tome os quizzes prática, especialmente sob restrições de tempo. 75 minutos para fazer o teste é não um monte de espaço de tempo. É muito, muito tempo. E assim vocês realmente querem para certificar-se de que vocês são o hábito da escrita código à mão rapidamente. Porque você não quer que o primeiro tempo de ver um quiz do que o comprimento estar em seu quiz. Vocês realmente quer ter a certeza que você pratica de antemão. Em quarto lugar, que pretende rever o palestra e seção de slides. Você não tem de memorizar coisas. Na verdade, todo mundo tem direito a um uma folha de notas de papel branco, frente e verso. Vocês podem digitar ou escrever. Se você achar que precisa de memorizar qualquer coisa, colocá-la nessa folha. Eu garanto que você, você não quer ser preso no meio desse questionário sendo assim, oh sim, qual é o tempo de execução deste tipo contra esse tipo. Basta colocá-lo para baixo e copiá-lo diretamente da sua folha da nota. Então você pode realmente só usar a sua cérebro para pensar sobre os problemas em vez de ter de lembrar fatos. E assim realmente tirar proveito de quaisquer detalhes de nicho que você acha que precisa de memorizar, plop-lo para baixo na folha de avaliação. OK, dúvidas logisticamente sobre o quiz antes de começar a alguns problemas do quiz praticar? Sim? AUDIÊNCIA: Eu não tive a chance olhar para o teste [inaudível] mas é ele que vai ser aplicação na maior parte, ou se há também vai ser, como, questões de conhecimentos? PROFESSOR: É muito. Assim, a maneira que eu teria descrito o quiz é-- eu coloquei alguns problemas práticos que eu puxei de todos os questionários. Mas você vai ver que há dois principais tipos de perguntas que vão pedir-lhe. Um deles é um detalhe nível muito baixo de coisas. Nós vamos dar-lhe um pequeno pedaço de código e dizer, há um erro aqui? O que seria a impressão aqui fora? O que este código produzir, et cetera. Então Informações detalhadas sobre o muito baixo nível. E por outro lado, teremos muito alto nível perguntas baseadas no conhecimento. Pode explicar o que o diferença entre uma pesquisa binária e uma busca linear é? Por que nós queremos usar um sobre o outro? Talvez, o que é o GDB? Por que nós queremos usar GDB? Nível mais alto, mais fundamental perguntas entendimento. Então, você vai ver uma mistura de os dois em seu quiz. Qualquer outra coisa antes de nós ir direto para ele? ESTÁ BEM. AUDIÊNCIA: Mais um. PROFESSOR: Oh, mais um. Desculpe. AUDIÊNCIA: É, está tudo certo. Então você está dizendo é 75 minutos muito curto, como é improvável que vai terminar? Ou, como, 75 minutos é exatamente o mesmo tempo como nós precisaríamos se fôssemos apropriadamente preparado? PROFESSOR: OK, então o teste é um desafio. É definitivamente um desafio. Você vai encontrar-se em curto tempo. Você provavelmente está indo bater, como 10, 15 minutos para ir, e ser como, merda. Tenho muito o que fazer. E isso é totalmente bom. Todo mundo vai se sentir da mesma maneira. Basta estar muito consciente do quanto tempo você tem. E é por isso que eu digo a você caras fazem os testes de prática. Porque ele realmente dá um grande senso do que o teste vai ser assim. Então, se você encontrar-se ser capaz de terminar a prática quizzes em uma boa quantidade de tempo, você pode passear-se bem, então você não terá um problema na quarta-feira ou quinta-feira. Legal. Então, se todos wants-- eu acho a maioria das pessoas têm folhas de papel fora já. Vou essencialmente apenas dar-lhe exemplos de perguntas, dar a vocês, tipo, um alguns minutos para fazê-las. E nós falaremos sobre como uma classe o que as respostas para elas são. Portanto, este é um muito típica pergunta cedo nós vamos perguntar-lhe, apenas a conversão números entre bases diferentes. Binários, como vocês podem recall, é a base dois. Decimal é base 10, ou o que nós como os seres humanos normalmente interpretar. Hexadecimal é base 16, que é zero através de nove bem como de A a F. Portanto, há quatro números Eu sou pedindo a vocês para converter aqui. Vou te dar gosto, de três a quatro minutos para pensar em como iríamos sobre como resolver este. AUDIÊNCIA: Nós temos permissão calculadoras? PROFESSOR: Você não vai precisa calculadoras, sim. Eu acho que além de base, penso eu, é todos vocês serão convidados a fazer. E só então eu meio que tem um senso de quando todo mundo está feito, olhar para cima, onda, eu não sei, sorrir, olhar feliz se você está feito. Sim. Talvez mais alguns minutos. OK, vamos trazê-lo. Eu vou com o propósito de dar a vocês menos tempo do que você provavelmente precisará fazer alguns destes problemas, simplesmente porque eu quero ter certeza de que obtemos através de um monte de problemas. Então não se preocupe se você não tem a chance de terminar. Totalmente OK, desde que você tem uma idéia de como ir sobre isso. Então, vamos em frente e fazer o primeiro. Então, primeiro, será que alguém quer me dizer em binário, o que cada um destes algarismos representam em termos de seus valores? Sim? AUDIÊNCIA: Dois ao potência zero, 2-1. Professor: Exatamente. Assim. Certo, então tipicamente quando estamos na base 10 todos estes representam são, como, 10 para a base do zero, certo? Isso é o lugar de seu um. Todo o seu lugar 10 do IS-IS 10 elevado à potência de um. Lugar que você é de 10 100 para a potência de dois. O que quer que você está na base de vai a ver com exatamente a mesma coisa, apenas com uma base diferente. Então binário, tudo o que é é a base dois. Você está indo para converter todo o dígitos em dois para qualquer poder desse dígito. E assim, neste sentido, pode ter uma maneira mais fácil de ser capaz de adicionar-se ou somar todos os números em ordem para converter em base 10. Então, alguém quer me dizer o que o resposta à primeira é na base dez? AUDIÊNCIA: Dois, [inaudível] PROFESSOR: Yeah. AUDIÊNCIA: 42. PROFESSOR: 42, lá você vai. Assim, a maneira que temos esta resposta foi de fazendo dois a primeira, que é dois. Mais dois o terceiro, que é oito. Além disso, dois para o quinto, o que é o que sobra. Você resumi-los e é 42. Alguém está confuso sobre como temos que? Assim adição de base, tal como Eu disse, você deve estar OK. Se não, bem, podemos praticar isso também. Mas está tudo bem. Legal. Alguém quer me dar o responder à segunda também? 50? Boa. Qualquer um confuso sobre como temos que quer? Cool, eu vou ter a respostas sobre o próximo slide. Então não se preocupe se você precisa copiá-lo para baixo. OK, então hexadecimal é um pouco mais complicado. mas eu vou mostrar para vocês um atalho para saber como fazê-lo. Então hexadecimal, como você lembre-se, tudo o que é ter 16 anos. E porque nós, como seres humanos na verdade não tem 16 números para representar que, nós ir de zero a nove, que o nosso primeiro 10 valores, e então nós fazemos A a F, que são os próximos seis valores. E assim, a maneira mais fácil de ir de qualquer número binário em hexadecimal é dividi-las em metades. E assim qualquer número binário nós vamos dar- provavelmente você vai ter oito dígitos. Você pode simplesmente quebrar -los no meio. Assim, o primeiro um-- um um, um um, um, um, um um. Kind of acho que, você sabe, desenhe uma barra ou uma vírgula entre eles. E você pode apenas converter diretamente o que quer este é o primeiro número de hexadecimal, e tudo o que aqui é a o segundo de hexadecimal. Então lembre-se de notação comum, o que valores hexadecimais começar? AUDIÊNCIA: Zero. PROFESSOR: 0 X. Então, nós sabemos que a qualquer momento pedimos-lhe para converter qualquer número para hexadecimal, ou quando você ver qualquer número que começa com 0 X, você sabe que é um valor hexadecimal. E então você vai ser convidado a determinar o que esses dois dígitos são. E a maneira de fazer isso, calculando que metade e calculando que a metade. Assim, neste exemplo, o seria um, um, um, um ser? Qual o valor que seria isso? Isso seria F, certo? Isso seria 15. Portanto, este seria F. One, um, um, um aqui também é F. Portanto, um, um, um, um, um, um, um, um em hexadecimal, tudo isso é 0xFF. Por causa dessa metade representada F, o valor de 15, e essa metade representada F, o valor 15. Porque lembre-se, estamos contagem de zero a nove. Um é como 10, B é como 11, F é 15. Isso faz sentido para todo mundo como temos de binário para hexadecimal? AUDIÊNCIA: E assim como nós chegamos 15 a partir do um, um, um, um? PROFESSOR: Sim, este é binário, certo? Imagine isto é apenas um número binário. Então você tem dois para o ordem zero, que é um. AUDIÊNCIA: Oh, OK. Então você só somam-lo. PROFESSOR: Sim, e em seguida, você só totais que fora. Isso é tudo o que é. AUDIÊNCIA: OK. PROFESSOR: OK. AUDIÊNCIA: Então você vai de binário em decimal para hexadecimal? PROFESSOR: Essa é a maneira mais fácil de fazê-lo, sim. Você não está indo para decimal porque decimal só tem zero a nove. Nós somos apenas uma espécie de dividir isso em duas. AUDIÊNCIA: [inaudível] usando decimal para encontrar o que corresponde até em hexadecimal. PROFESSOR: Eu quero dizer, você é calculando usando matemática básica. AUDIÊNCIA: É. PROFESSOR: Sim, muito bem. É um pouco confuso. Mas só sei que você pode dividir o que quer este valor é em apenas metades. Olha, o que é isto em binário? Que número é esse? Vai ser algo de zero a F. Aqui também vai ser algo de zero a F. E então você pode simplesmente colocá aqueles dois ali mesmo. AUDIÊNCIA: OK. PROFESSOR: Yep. ESTÁ BEM. Então vocês querem tente o próximo, então? Zero, um, zero um, um, zero, um zero. Eu vou dar a vocês como 30 segundos, desde que você provavelmente não sabia o truque para como fazer isso mais cedo. OK, ninguém quer receber um presente um tiro? 0x5A. PROFESSOR: 0x5A. 5-A. Boa. Então, isso aqui seria ser-- você quer para nos dizer como você conseguiu isso? Em primeiro lugar, como você chegou a cinco? AUDIÊNCIA: Porque zero, um, zero, é um de cinco. PROFESSOR: Será que todos compreendam por isso que zero, um, zero, um é cinco? Você tem um aqui. Você não tem nada em dois para o primeiro. Em dois para o segundo, tem um, que é quatro. Então você adiciona o quatro mais a um, você tem cinco. Todo mundo é bom? ESTÁ BEM. E então o que este seria e por quê? O que faz um número correspondem a? AUDIÊNCIA: 10. PROFESSOR: E o que esta na base de dois? AUDIÊNCIA: [inaudível] Professor: Exatamente. Portanto, este segundo valor aqui seria 0x5A. Todo mundo bom de como converter? É muito mais simples do que você pensa que é. Eu só quero ter certeza você sabe dicas úteis e truques de como fazer isso. AUDIÊNCIA: Por que você apenas dividir -lo no meio assim? Basta ser como, OK, eu estou indo só para se preocupam com estes primeiros [inaudível]? PROFESSOR: Porque isso é realmente o maneira valores hexadecimais são representados. 0 X, o que significa, na verdade, nada mais do que dizer-lhe que é um número hexadecimal. E isso representa sempre os quatro primeiros dígitos. E isso representa sempre os quatro últimos dígitos. E assim estes dois dígitos apenas correspondem a diferentes pedaços. AUDIÊNCIA: Então vamos always-- PROFESSOR: Você está sempre vai ficar oito bits de valor. AUDIÊNCIA: É que apenas gosta de uma coisa aqui ou que uma coisa tudo de novo? PROFESSOR: Isso é apenas um coisa em computadores, sim. AUDIÊNCIA: OK. Fantástica. PROFESSOR: Também, portanto, neste exemplo nós convertido de binário para decimal, e de binário para hexadecimal. Vocês querem ter certeza de que você também praticar acontecendo o contrário. Então, se eu te dei 0xff, você poderia desenhar isso para fora no binário, certo? Você converter F em binário, que é um, um, um, um, F converter em binário, que é um, um, um, um. Assim, podemos lhe pedir para fazer o contrário. Então decimal para binário, ou hexadecimal para binário. Então você quer fazer se você sabe para os dois lados. Nós provavelmente vamos fazer-lhe uma combinação dos dois. Sim, você tem uma pergunta? Eu posso see-- você é bom? AUDIÊNCIA: É. PROFESSOR: OK. Eu sou bom para apagar isso? Ótimo. Tudo bem, então respostas aqui, se alguém É curioso, mais tarde, e se confundem. ESTÁ BEM. AUDIÊNCIA: Será que isso importa se colocarmos nossas cartas em Capitol ou minúsculas? PROFESSOR: Ele faz, porque em hexadecimal, por convenção, todos os caracteres são maiúsculas. Então, de A a F são vai ser maiúsculas. Se você colocar uma minúscula um, eu não sei se nós seria necessariamente marcá-lo errado. Mas, teoricamente, isso não é tecnicamente como você deveria tê-lo. Portanto, todos eles devem ser maiúsculas. Sim, boa pergunta. ESTÁ BEM. Quanto à segunda questão. Considere esta linda programa aqui. Eu vou fazer a pergunta, Eu vou voltar este. Então, em primeiro lugar, o que está dentro do padrão io.h que é de interesse para o programa? Em segundo lugar, o que faz vazio significar em linha de três? E em terceiro lugar, o que faz retornar zero a partir principal, como linha seis, geralmente significam? Se vocês querem escrever os para baixo, uma vez que eu tenho que voltar para o slide só assim você pode ver o código. Este é um exemplo de, como, talvez um maior questão nível onde pedimos-lhe que as coisas significam em um programa. Todo mundo bom para mim voltar para o slide? OK legal. Então, eu vou dar a vocês como talvez três minutos a olhar para este rápido real. OK, então este é como razoavelmente fácil, conceitualmente. Alguém quer me dizer o que é primeiro por dentro de hash incluindo nosso arquivo de biblioteca io.h padrão? Por que precisamos dessa biblioteca incluído para este programa? O que aqui é que vamos precisar dele para? Sim? AUDIÊNCIA: É que, quando você colocar esse printf? Professor: Exatamente. Então printf, a qualquer momento você tomar uma entrada do usuário e imprimir algo para a tela, que é a entrada padrão, biblioteca de saída. Pense nisso que maneira-- entrada, saída. Eu tenho uma saída? Sim. Então eu sei que eu estou indo sempre precisa da biblioteca padronizar i.o. Então printf é a função por que precisamos para acessar e incluem o hashtag biblioteca i.o padrão. ESTÁ BEM. Em segundo lugar, o que significa vazio? Temos a int main (void), o que faz invalidar aqui dizer aqui na linha de três? Sim, na parte de trás. AUDIÊNCIA: [inaudível] Professor: Exatamente. Então lembre-se, nós aprendemos começando com a nossa pset que você pode realmente especificar linha de comando argumentos que o programa, que você função principal, toma como você, o usuário, chame-o. Se temos vazio, o que significa que você poderia simplesmente executar o programa diretamente sem quaisquer argumentos de linha de comando. Todos clara sobre isso? ESTÁ BEM. E, por último, por que nós se preocupar em fazer esta remuneração zero coisa aqui? Por que temos até um int main? Por que não podemos apenas ter void main vazio? Sim? AUDIÊNCIA: Apenas para que possamos certifique-se de que o programa é sair com sucesso, conforme oposição ao caso foi contado. E nós sabemos que isso é um tipo diferente de erro. PROFESSOR: Sim, exatamente. Esta é apenas uma muito coisa convencional que nós fazemos, é que apenas no final de seu programa, apenas para se certificar que a sua função principal está sendo executado corretamente, nós sempre queremos fazer o retorno zero. Embora possamos necessariamente não vê que impresso em qualquer lugar. Porque, como programadores, você sabe, se você tem muitas linhas diferentes de código e você não sabe onde estes estão indo errado, e se um erro acontece, você quer certifique-se de que você obtenha esse erro. E assim tipicamente se algo der errado, teremos um retorno de apenas um para garantir que nós sabemos que é. Então, se você ver um retorno zero, que tipicamente significa que o seu programa é executado com êxito. Boa? Legal. OK, segundo programa aqui. Considere isso. E se vocês ver um flutuar, vocês podem provavelmente ter uma boa idéia do que Estou prestes a pedir-lhe. Assim, quando este programa executa, como você pode ver, Eu estou declarando um flutuador dentro da minha função principal. Estou nomeando-o "responder", e eu estou definindo que igual a um dividido por 10. Eu estou imprimindo, a um casa decimal, que float. E então eu estou retornando zero. Assim, quando a execução do programa, acho que volta para ganancioso agora, este programa imprime 0.0. Como todos sabemos, espero que todos nós sabe, um dividido por 10 não é um 0.00, é 0,1. Mas explicar por que este programa pensa que 1 dividido por 10 impressões para 0,1 outro do que 0,1? Eu vou dar a vocês talvez como 30 segundos para pensar apenas rapidamente sobre isso e eu vou voltar para o programa. ESTÁ BEM. Qualquer um quer dar-lhe um tiro? Em três frases ou menos, porque normalmente nós somos indo para restringir todas as respostas para três frases ou menos assim você não apenas regurgitar coisas aleatórias em seu quiz. Sim, tomar um tiro. AUDIÊNCIA: Então eu acho que há essa coisa chamada, como, [inaudível] Portanto, pode haver, por exemplo, pode haver, como, 0,09, que onde você imprimir a primeira dígitos, que seria para 0.0? PROFESSOR: Close, não completamente. Christabell? AUDIÊNCIA: Você está dividindo um e 10, e eles são ambos inteiros. E assim o caminho que ele vai para armazená-lo é como um inteiro. E assim o número inteiro mais próximo seria 0.0. E assim que é 0,1. PROFESSOR: Sim, isso é muito bom. Essa é a resposta certa. Portanto, este é um muito confuso conceito para um monte de crianças. E eu realmente quero ter certeza de que isso é reforçado na cabeça de todos. Então, o que nós chamamos flutuante ponto de imprecisão, onde a razão pela qual muitas os seus programas em ganancioso não funcionou inicialmente era porque você se esqueceu de lançar sua variável. Então, o que disse Christabell era inteiramente correta. Um flutuador é inerentemente imprecisa. Porque em um computador, certo, temos uma quantidade finita de bits de memória podemos usar para representar números. Assim, por exemplo, este ID CS50 é-- Eu acho que é um computador de 64 bits. Um flutuador só pode ser representada por uma quantidade finita desses bits. E assim 0,1 com zeros infinitas, que foi de 0,1 é, certo? Mas não podemos realmente armazenar esse número em nosso computador. Nós simplesmente não temos memória suficiente para fazê-lo. E assim, a aproximação mais próxima de o que está armazenado na memória é, na verdade, algo como 0,000 alguma coisa, alguma coisa, alguma coisa, alguma coisa. Que, uma vez que você truncar ele, arredonda para baixo a 0,0. E assim, este exemplo é apenas um que demonstra muitas questões temos sempre que estamos tentando fazer incorretamente matemática sem lançar como um inteiro diferente. Então, basta ser cauteloso de que isso aconteça. Em testes, se nós damos-lhe uma bloco de código e é como, o que imprime no final? E se é algum valor aleatório você caras devem saber por que isso está acontecendo. Sim? AUDIÊNCIA: Truncate é se livrar de tudo depois de um certo ponto? [INAUDÍVEL] PROFESSOR: É, então, na verdade, este é um exemplo muito ruim, porque tudo o que realmente 0,100 truncaria até 0,1. Mas se você fosse executar ele-- eu não lembre-se, porque no ano passado eles correu-lo em um programa diferente. Eles correram-lo em algo chamado o CS50 Appliance, que é diferente do ID. Isso foi um sistema de 32 bits, eu acho. E então havia números diferentes. Mas, essencialmente, só sei que todo o conceito de truncagem e como ele simplesmente corta as coisas fora. E assim se rounds-- AUDIÊNCIA: sem arredondamento. Professor: Exatamente. Sim. Legal. Oi, na parte de trás. Nós apenas estamos indo sobre alguns Revisar o questionário perguntas. Tudo certo. Por isso, considero um programa diferente aqui. Eu vou dar a vocês um alguns minutos para ler sobre isso. Isso é algo que foi por muito recentemente, que eu acho que explodiu um monte de você mentes dos homens. Mas vamos falar por isso novamente apenas para se certificar de que você entendê-lo completamente. ESTÁ BEM. ESTÁ BEM. Alguém precisa de mais tempo para leia este código? ESTÁ BEM. Assim, parece-me que neste programa eu sou a criação de duas seqüências usando GetString. Uma chamados s e um chamado t. E se eles são iguais é igual a um para o outro, ele deve imprimir "Você digite a mesma coisa. " Mas elsewise, seria imprimir: "Você digitado coisas diferentes ", certo? Parece muito, muito simples. Mas, no entanto, se eu realmente tentar escrever este programa, parece que mesmo quando eu entrada as mesmas seqüências exatas, ele ainda imprime: "Você digitado coisas diferentes! " Alguém quer dar uma tiro em por que este programa sempre responde que as entradas são diferentes, mesmo quando as próprias palavras são as mesmas? Então, se eu fosse para input-- David amor para usar um exemplo como mãe, certo? Minúsculas M-O-M de S, T é igual a minúsculas M-O-M. Se eu corri isso através de que o código, por que ele imprimir "você digitou coisas diferentes?" Alguém precisa de mais tempo para pensar sobre isso? OK, eu acho que estamos bem. Sim? AUDIÊNCIA: OK, então isso é algo sobre onde ele é armazenado na memória, certo? PROFESSOR: Yep. AUDIÊNCIA: Onde é como, se este string s é armazenada a memória spot-- Eu estou inventando isto-- é zero. PROFESSOR: Certo. AUDIÊNCIA: E corda t é armazenado no local de memória, como, 167, e, em seguida zero não é igual a 167. Professor: Exatamente. OK, então lembre-se esta incrível revelação explicamos para vocês na semana passada, que cordas não existem realmente? Quando criamos algo chamado corda estamos, na realidade, criando algo chamado de char estrela. Que tudo isso é um ponteiro para uma cadeia ou para uma matriz de caracteres. E assim, neste exemplo, se eu foram a entrada H-O-H a maneira que o meu computador seria armazená-lo é dentro de barra invertida memória zero, certo? Esses quatro caracteres, caracteres, seria armazenado em algum lugar. E então estes quatro caracteres, barra invertida zero, são armazenados em outro lugar, certo? Eu não tenho nenhuma idéia de onde os endereços são, eles estão em algum lugar no meu computador. Mas eu não sei exatamente onde eles estão. Quando eu criar uma seqüência s, tudo o que é realmente é um ponteiro para o começar dessa seqüência. E quando eu criar este valor t, tudo o que é um ponteiro para aqui. E assim, quando você está tentando para equiparar e verifique para ver se s é igual é igual a t, o computador é realmente apenas retornando a você o endereço deste m eo endereço do que m. E porque eles são dois peças separadas de dados que são armazenados em dois diferentes endereços em seu computador, seu computador nunca vai reconhecê-los como sendo o mesmo. Alguém quer dar um tiro em que nós teria que fazer se queríamos para corrigir isso e ter um programa em execução correta ao invés? Pense nisso por um par de segundos. O que precisamos mudar para obter este programa de funcionamento do jeito que queremos que ele funcione? Sim, quero levar uma facada nele? AUDIÊNCIA: Podemos tentar cancelar o ponteiro e verificar através da matriz? PROFESSOR: Essa é uma maneira de fazê-lo. Então, qual é o seu nome? Sinto muito, me lembre. Zee: Zee. PROFESSOR: Sim, então o que Zee sugerida seria absolutamente trabalhar. Certo? Poderíamos cancelar o ponteiro e realmente ir e acesso os dados físicos dentro de aqui. E nós podemos apenas comparar a tela inteira. Podemos dizer, OK, ponteiro, dá-me o que está dentro aqui. Ele retornaria um m. E eu diria, ponteiro, dá-me o que está dentro aqui. Retornar um m. Será que aqueles jogo? Sim. Em seguida, seguir em frente. Continuamos a verificar os dois inteiro cordas todo o caminho até o final e ver se estas forem iguais, Se todos os valores são iguais. E, se todos os valores são iguais, então nós sabemos as cordas são verdadeiras. Absolutamente, isso é como nós o faria? Alguém confuso sobre nada disso? Todo o conceito de como as strings são realmente apenas ponteiros, e como eles não existem realmente? E por isso que recebo erros como a nossa forma de obtê-lo? Porque eu garanto a vocês, ponteiros e alocação de cordas e memória vão vir para cima. Sim? AUDIÊNCIA: [inaudível] dereference -lo, você acabou de colocar uma estrela [inaudível] PROFESSOR: Certo. Assim, para um meio de ponteiro derererence para ir para o endereço do ponteiro e obtenção dos dados, o valor aí. E a maneira de fazer isso é ponteiro estrela. Não confunda isso. AUDIÊNCIA: [inaudível]. PROFESSOR: Yeah. AUDIÊNCIA: Então você pode apenas escrever se estrela s igual iguais estrela t. PROFESSOR: Bem, não. Não. AUDIÊNCIA: Isso não é bom o suficiente, certo? PROFESSOR: Não é, porque você é que verifica somente a primeira letra. Você provavelmente está indo para precisa de algum tipo de um loop que percorre cada personagem em ambas as cordas. Sim. Então, se você queria apenas verificar para ver se eles começaram com a mesma coisa, você pode fazer se, estrela s é igual a estrela t. Então você sabe que pelo menos eles começou com o mesmo personagem. Sim? AUDIÊNCIA: Então, o caminho você que seria como um incorporado laço for ou ponteiro? PROFESSOR: Yeah. Praticamente apenas um loop for. Lembre-se, David na classe mencionada o açúcar sintático livre? E ele tinha isso muito coisa confusa da estrela t mais um, onde integraria através de e mover o ponteiro? A maneira mais fácil de fazer este é apenas t de i. Então é só uma matriz. A maneira que você teria um para loop que correu de zero a i, onde I é o comprimento da string, você poderia apenas escrever que, em vez de fazer a ponteiro todo, coisa de referência. Então, essas coisas são exatamente equivalente em seu computador. Vocês provavelmente não precisa saber que, mas é bom para apenas um tipo de tem na parte de trás de sua mente. Só sei que o computador reconhece diferentes blocos de código como a mesma coisa. Porque este é apenas muito mais do usuário amigável para nós para apresentá-lo como se fosse uma matriz. É apenas mais fácil. AUDIÊNCIA: Então usar strlen a gostar, get-- PROFESSOR: Yeah. AUDIÊNCIA: OK. PROFESSOR: Você poderia usar strlen ou, se você não tinha strlen você pode apenas fazer-se até que você bateu barra invertida zero para ambos. Ou iria funcionar. Sim. AUDIÊNCIA: Então é excluir a referência a cada único personagem se estivesse de fato escrever este código, poderia apenas fazer t suportes i como com a estrela na frente dele? PROFESSOR: Sim, é igual a equals s suporte i, e, em seguida, mantê-i movimento down up até que você bateu o fim. Sim, isso é o que você faria. E eu vou realmente ter uma próxima exemplo de quando nós realmente escrever strlen para que vocês irão tipo de começar a brincar com ele um pouco. Assim é todo claro apenas em memória, cordas, ponteiros, endereços de qualidade? Alguns conceitos de nível mais alto que você vontade com certeza necessidade de saber sobre o quiz amanhã. Tudo certo. Boa. Sim. OK, então uma coisa que nós vamos também pedir você, como fazemos todos os anos em um questionário, é, suponha que você tenha esquecido (que parece que estamos a esquecer de fazer anualmente) em que arquivo de cabeçalho strlen é declarada. E por isso temos de reescrevê-lo nós mesmos. Aqui está uma lista de diretrizes que podemos apresentar-lhe caras onde você começa a assumir que s a cadeia não será nulo. Você pode assumir que s será terminou com uma barra invertida zero. Então você sabe que é o que que vai acabar com. E, por exemplo, que o comprimento da Olá seria de cinco anos. Assim, você pode assumir que Olá será cinco, H-E-G-L-S. Você não tem que assumir que o backside zero de contas relativas ao comprimento. Esta última coisa aqui, não fazer se preocupar com integer overflow. Alguém se lembra o integer overflow é? AUDIÊNCIA: vai além da comprimento do [inaudível]. PROFESSOR: Sim, você pode explicar um pouco, o que isso significa? AUDIÊNCIA: Então, eu acho que ele vai voltar para o exemplo truncando anteriormente. Mas se você tem apenas tantos números que excede o número de bits que você realmente pode atribuí-la que será apenas uma espécie de cortar. PROFESSOR: Sim, então em um típico computador, quantos bits que nós temos? AUDIÊNCIA: 32? PROFESSOR: Sim, 32, à direita. E assim que é, que, quatro bilhões, dois bilhões? Quatro bilhões, até quatro bilhões inteiros positivos, certo? Dois bilhões negativo, dois bilhões de positivo, Depende de como você deseja fazê-lo. E então basicamente nós podemos ter inteiros suficientes que podem ir até de dois a 31 menos 1, certo? Porque uma vez que nós batemos dois a 32, nós não ter essa quantidade de memória em nosso computador. E assim, teoricamente, eu poderia vir com um número que é, tipo, dois para o 46º. É um número enorme-ass, mas teoricamente você poderia. E o estouro de forma inteiro é se você tentar criar um número inteiro que vai além do que seu computador é capaz de armazenar. E assim vocês para Neste exemplo não têm se preocupar com nós, dando-lhe um gigante string que é de dois para os caracteres 32ª grandes. Isso seria realmente significam. Tudo bem, então eu só vou dar vocês a estrutura de base do presente. Você vai criar um função chamada int strlen onde Um passe em, uma estrela char, ou corda, ponteiro para a string chamada s. Tudo bem, todo mundo que copiar para baixo. Legal. Oops-- outra maneira. Portanto, este é como uma espécie de peça mais difícil de problema, então eu vou dar a vocês talvez cinco a seis minutos para o tipo de brainstorming e escrever esta função fora. AUDIÊNCIA: Nós não fazer conta para [inaudível], não temos de usar inteiro? PROFESSOR: Não, você não. Eu vou dar a vocês uma dica. Um loop while pode ser muito útil aqui. Sim. Aqui está doces. Doces também estará disponível para o quiz, eu acho. Então vocês vai ser tudo açucarado até amanhã. Pode i-- você conseguiu. AUDIÊNCIA: OK. PROFESSOR: Yeah. Talvez mais de 30 segundos ou menos. Tudo bem, se você é não feito, não se preocupe. Nós vamos passar por isso juntos. ESTÁ BEM. Então, eu estou indo apenas para o layout do estrutura básica para esta função aqui. Int strlen. Em primeiro lugar, será que alguém quer dizer me o que isso significa int? Precisamos ter nesta função. AUDIÊNCIA: STRLEN [inaudível]. Professor: Exatamente. Então o que acontece aqui, precisamos voltar um inteiro. E, conforme especificado no spec, queremos return-- Vá para ele rapazes, só vai manter. Está tudo bom. Comer tudo, então eu não tenho para levá-lo de volta, na verdade. O int apenas significa que você é vai estar retornando um inteiro. O que é este caractere estrela s? O que isso significa? AUDIÊNCIA: Like, o que está a ser introduzido em. Professor: Exatamente. E o que é quase o mesma coisa como char estrela? AUDIÊNCIA: String? Professor: Exatamente. Então, tudo o que estamos fazendo é dando este um ponteiro para uma string. ESTÁ BEM. Legal. Além disso, não se esqueça, se esquecermos para dar-lhe esses suportes, não se esqueça de escrever-los sozinho. Porque, teoricamente, o código é incorreto se você esquecer de escrevê-los. Apenas sempre prestar atenção. Como, coisas pequenas que você não percebe quando você está programando em seu laptop, porque o seu laptop faz isso por você? Não se esqueça, quando você está escrevendo com a mão. Sim? AUDIÊNCIA: Mas como incorreta? Como, podemos obter todo o problema errado? PROFESSOR: Não, não. Não se preocupe. Na verdade, é teoricamente possível para que você possa obter todos os pontos sobre uma questão mesmo que seu código será nunca são executados na vida real. Eu sugiro que você não tente para que isso aconteça. Por exemplo, como se tudo que está aqui é certo, mas você esquecer uma vírgula ou um suporte, seu código não vai realmente funcionar. Mas podemos ser misericordioso. Sim? AUDIÊNCIA: Você tem que comentar sobre a nossa caligrafia? PROFESSOR: Não, não, não se preocupa com isso. Sem comentar. Estilo deve ser bom. Como, não smush tudo em uma linha. Nós não vai ser feliz com você, se você fizer isso. Alguém quer dá-me a primeira linha? Dica, é muito fácil. Sim? AUDIÊNCIA: Int, n é igual a zero. Basta configurar balcão. PROFESSOR: Então, nós queremos algum uma espécie de contador, certo? Eu só vou nomeá-lo "contar" por uma questão de legibilidade. O que nós queremos para defini-la igual a? AUDIÊNCIA: Zero. PROFESSOR: Yep. Ponto e vírgula. É também ponto e vírgula desenho muito estranhas. Apenas a prática de fazer isso. Então, nós queremos ter primeiro um contador do tipo int. Porque eu quero contar-se como muitos caracteres ou letras são em esta cadeia, certo? Primeiro passo muito fácil. OK, talvez um pouco mais complexo Agora, como é que vamos fazê-lo? Alguém quer dá-me a linha de código que pode ser capaz de ajudar circuito através de quaisquer que é isso? Sim, alma corajosa na parte de trás? AUDIÊNCIA: OK, por isso, enquanto ponto asteriscos, o sim, estrela de s, não é igual a zero, em seguida, fazer alguma coisa? PROFESSOR: Isso é muito, muito perto. Muito próximo. Então eu vou para resolver duas coisas com isso. Primeiro de tudo, não é exatamente zero. O que é isso? É o terminador nulo, que é invertida de zero. Então, eles são diferentes em termos de como eles estão armazenados. Então você está realmente perto. E em segundo lugar, não queremos apenas mover o ponteiro. Queremos realmente acessar os valores, certo? E assim como podemos fazer isso? Muito fácil. Não pense sobre ponteiros, não pensam sobre memórias. De volta para a segunda semana do curso. AUDIÊNCIA: [inaudível]. PROFESSOR: A partir de, lembra? Quais são cordas? Como eles são armazenados na memória? AUDIÊNCIA: Eles estão levantadas. PROFESSOR: Eles são levantadas. Então, como vamos acessar cada personagem dentro? AUDIÊNCIA: [inaudível]. Professor: Exatamente. Então o que se passa dentro while-- aqui? S de - AUDIÊNCIA: I. PROFESSOR: Oh, eu não existe, não é? AUDIÊNCIA: Oh, conte? PROFESSOR: Nós podemos apenas usar contagem, não podemos? AUDIÊNCIA: Desculpe, eu o chamei i. PROFESSOR: Sim, é tudo de bom. Nós temos uma variável-se aqui que é já foi declarado como o nosso balcão. Então, por que nós não apenas utilizar esse para percorrer o loop while? Isso faz sentido? Assim, enquanto s de count-- alguém quer para me dar o que acontece depois aqui? AUDIÊNCIA: É não é igual. PROFESSOR: Não é igual, certo? É o estrondo iguais, ponto de exclamação é igual, tudo o que vocês querem chamá-lo não equal-- AUDIÊNCIA: [inaudível]. PROFESSOR: Yeah. Lembre-se aspas simples é para um char, aspas duplas são para uma string. Tenha cuidado ao usá-los. Então, quando nós estamos olhando através de o array, o último caractere, sabemos que não queremos que seja invertida a zero. Assim, enquanto. Nós não estamos no fim da cadeia. O que nós queremos fazer dentro? AUDIÊNCIA: Nós queremos adicionar ao balcão para que ele conta plus plus? Professor: Exatamente. Então aqui nós vamos fazer contar, contagem plus plus. Faltando mais uma linha. Estamos quase lá. O que estamos esquecendo de fazer? AUDIÊNCIA: Voltando a zero? PROFESSOR: Você quer retornar zero? AUDIÊNCIA: Não, retornando para strlen. Aguarde. PROFESSOR: Qual é armazenado em? AUDIÊNCIA: Contagem. Contagem. Professor: Exatamente. Então aqui nós vamos voltar contagem. Porque o que nós somos fazendo aqui ultimately-- temos uma variável de contador que é vai incrementar através da nossa cadeia. Nós vamos continuar, continuar ir, em torno e ao redor neste loop. E enquanto não estamos no final deste string, que é o terminador nulo. E toda vez que nós atravessamos -lo, estamos adicionando ao nosso balcão. E vamos mais longe ao longo desta matriz. E, no final, uma vez que bateu o terminador nulo, sabemos, oh, nós podemos quebrar, retornar a contagem. Nós temos nossa strlen. Será que todo mundo chegar como este foi implementado? Enquanto loops-- Eu sei que não tem feito muito com eles, mas eles são normalmente muito, muito útil se você Não sei o que você está parando condição tem necessariamente de ser. Questão? AUDIÊNCIA: Podemos escrever nulo com a condição de tempo? PROFESSOR: Embora? É, portanto, neste problema que tive você caras assumir que s não vai ser nulo. Porque lembre-se, teoricamente, se eu te dei um ponteiro que era demasiado grande de memória, que lhe daria o nulo, certo? Isso é o que o operacional sistema faria. Então, se eu não lhe disse para assumir s seria nulo, você precisa verificar. Então aqui, você faria, se s é igual a é igual a zero, retornar um. Algo como isso. AUDIÊNCIA: [inaudível] zero. PROFESSOR: OK, eu vou dizer você por que não podemos fazer isso. Porque lembre-se na memória, bem, aqui. Vamos aqui. Você tem blocos gigantes memória de todos com grades que armazenam valores diferentes, certo? E assim todo o é-- para uma string exemplo, se quisermos entrada Olá, seria H-E-G-L-S barra invertida zero, certo? E então, quem sabe, como aleatório coisas que são aqui depois. Nós realmente não sei o que está lá. E por isso, se você fosse fazer em vez de barra invertida zero, null, ele não pode ser nulo. Porque ele só pode significar algumas outras coisas aleatórias que não pertencem em sua string. E assim, a maneira que nós sempre sabemos que uma seqüência termina com uma barra invertida é zero. E assim que é sempre como nós verificar para ver o fim de uma seqüência de caracteres. Null, tudo o que significa é que se você tem um ponteiro inexistente, em primeiro lugar, ou se a sua memória é tão grande que você não pode devolvê-lo, então ele seria nulo. Portanto, muito cuidado ao diferenciar a diferença entre nula e a barra invertida zero. Sim. Todos OK com isso? ESTÁ BEM. Então eu tive que vocês escrever strlen. Viabilizar também poderíamos perguntar-lhe escrever out A a I, lembre-se que "Atwoa" ou o que vocês querem chamá-lo? Essa função em Vigenere e César, que converte um valor ASCII para um inteiro? Isso também vem em questionários passados das funções que já lhe pediu para escrever. Praticamente qualquer função que você já usou e é muito fácil escrever-se, sensores de gosto é inferior, é superior, a inferior, a parte superior. Funções que convertem um seqüência de minúsculas para maiúsculas. Todos nós sabemos como fazer isso, certo? É muito fácil. Só quero ter certeza de que você can-- é o mesmo processo de pensamento. Você acabou de fazer uma iteração através e você mudar as coisas. Você quer contar ou quando você virar as coisas de forma diferente. Gostaria suggest-- I Não sei se vamos para pedir-lhe para memorizar o que o capital Um ou Z de capital, ou minúsculas Um ou minúsculas z estão em ASCII, mas gostaria de sugerir talvez por escrito, que estabelece, em caso nós fazemos. Só para vocês ter uma referência. Como maiúsculo é, o que, 197? E então minúsculas é como 50 algo. 65, sim, lá você vai. Então, só sei muito bem o diferença entre eles é de 32. Isso é muito importante. Sim. Eu sou bom nisso? ESTÁ BEM. AUDIÊNCIA: Poderíamos teoricamente escrever algum destes para baixo também em nosso little-- PROFESSOR: Você teoricamente poderia apenas copiar a função para baixo. Isso é verdade. AUDIÊNCIA: Não [inaudível]. PROFESSOR: Vocês têm uma folha. Vocês têm uma folha de nota. Você pode escrevê-lo. Você pode escrevê-lo. Você pode fazer o que quiser com ele. Sim. Então, teoricamente, se você quiser, ir para. AUDIÊNCIA: [inaudível] mas nós realmente não necessariamente precisa se lembrar o valor, nós podemos apenas usar para a parte superior ou a funções inferior, certo? PROFESSOR: Yeah. Mas se nós demos-lhe uma pergunta que diz que escrever para superior, então você precisa para escrevê-lo. Então vocês podem supor que você caras têm acesso a todas as funções, mas se você deseja usar para superior ou inferior, o que você também tem que fazer? AUDIÊNCIA: [inaudível] usar CS50 [inaudível] PROFESSOR: É CS50.h? Tenha cuidado lá. Assim, a parte superior, a inferior, é superior, seja inferior, funções que envolvem manipulação de cadeia são tudo dentro de um ou outro a Ascii ou dentro da biblioteca matemática ou dentro da biblioteca string. Então, se vocês usá-los funções, tenha cuidado para lembrar para incluir esse cabeçalho. Por isso, talvez também algo que você pretende incluir na sua folha, o que são o cabeçalho? Quais são as bibliotecas você está usando? Que funções são dentro dessas bibliotecas? É importante. Sim? AUDIÊNCIA: Poderíamos apenas policial fora e fazer hashtag através do absolutamente cada letra que já visto como sobre todas as questões? PROFESSOR: Você poderia. Eu não sei o quão feliz vamos estar ao grau que teste quando cada pedaço de código é duas vezes mais longo, uma vez que precisa de ser. Eu não sei, nós pudemos tirar um ponto para o estilo. Mas, teoricamente, o seu código seria certo. Vocês poderiam policial fora e basta incluir tudo. Isso é bom demais, sim. AUDIÊNCIA: [inaudível]. PROFESSOR: Yeah. Gostaria de sugerir não fazer isso embora. Sim. AUDIÊNCIA: Cool. PROFESSOR: Boa pergunta. AUDIÊNCIA: Então, o pior cenário. PROFESSOR: O pior caso. Se você esquecer totalmente, você poderia fazer isso. Sim. Yep, o código é logo ali. Eu usei n em vez de contagem, mas, você sabe, qualquer que seja o seu barco flutua. AUDIÊNCIA: Espera, por isso, não teria que hashtag incluir porque somos começando no int? PROFESSOR: Sim, eu apenas assumi que nós nos pediu para escrever a função. Se você quiser ser seguro, você provavelmente poderia colocá-lo lá. Mas eu simplesmente não se incomodou, sim. Eu nem sei se você precisar de alguma biblioteca para isso. Porque você não está realmente a impressão qualquer coisa ou nada, certo? Sim, eu não sei se você precisa de uma biblioteca. ESTÁ BEM. Este também é um pouco mais longo as linhas de manipulação de memória. Este tipo de bocado complicado. Pense sobre isso. Você tem uma função chamada func. Eu poderia ter chamado ele o que for, mas eu escolho para nomeá-la func. Eu tenho-o acima do meu principal. Lembre-se, você quer ter uma função após o seu principal, você quer ter a certeza de que incluem o protótipo do topo. Mas, neste caso, foi tão curta que eu senti que eu poderia apenas incluí-lo no topo da página. Eu não precisava ter o protótipo, porque já está escrito acima. Então tudo que eu estou fazendo na minha função principal está criando inteiro x é igual a 10. Eu estou chamando minha função func, e, em seguida, imprimir algo. E, em seguida, que, na verdade, o que func está fazendo. Vocês querem pensar por isso. Porque é um pouco complicado. É muito, muito complicado, na verdade. Pensar com o que este programa seria outputting. Eu vou dar a vocês dois minutos. Boas discussões? AUDIÊNCIA: É. PROFESSOR: Yeah. Tudo bem, então este é complicado por uma razão. E é por isso que eu quis trazer esta a atenção de todos. Alguém quer me dar uma sugestão, uma tentativa? O que isso imprimir? Totalmente bem se você estiver errado. Sim? AUDIÊNCIA: Eu acho que é 100 e em seguida, 10 em duas linhas separadas. PROFESSOR: E a 10? Alguém tem alguma outras suposições? Sim? AUDIÊNCIA: Talvez apenas 10, porque func não está retornando nada? PROFESSOR: OK, então nós tem palpite número um que é suposto número é dois indo só para imprimir 10. Alguém tem alguma outras suposições? ESTÁ BEM. Então, vamos caminhar por este, certo? Sempre que você pegar um pedaço de código, não basta olhar para ele e ser como, ah, isso é tanta coisa! Estou tão confuso! Como, se acalmar. Só sei que você poderia apenas olhar através de código linha por linha. Isso é tudo o que é. É como ler um livro. Assim, com qualquer função, nós sempre começam em principal. Então, nós estamos indo para começam em void main int, até mesmo o programa de já partem, certo? Comece no no vazio principal. Int x é igual a 10. Então, eu vou apagar isso. Vou chamar a memória só para você caras pode tipo de ver o que está acontecendo. Lembre-se aqui que temos a nossa pilha? Até aqui temos o nosso amontoar em algum lugar por aqui. Pilha cresce, certo? E dentro da pilha, você tem a corrente eléctrica, assim como funcionar todos os canos principais variáveis ​​locais. Então, aqui, int x igual a 10. Dentro da nossa função principal nós somos a criação de uma variável chamada x. Estamos estabelecendo que igual a 10. Aqui você tem algumas x, e você está definindo que igual a 10, à direita, dentro principal. Todo mundo é bom? Função. Então, agora, dentro do nosso principal função, estamos chamando a função que escrevemos acima. Então, nós estamos agora entrar na segunda função. Nós vamos criar outro variável int x é igual a 100. O que está acontecendo aqui na pilha? O que acontece quando você chamar um função que cria novas variáveis? O que acontece aqui na pilha? AUDIÊNCIA: [inaudível] pilhas em cima? PROFESSOR: Yeah. Por isso, na verdade, cria uma cópia. E que tipo de pilhas na parte superior. Pense no stack-- uma pilha de livros, uma pilha de nada. Piles no topo, primeiro na última para fora, último a entrar, primeiro a sair. Por isso, vai criar um x aqui. Isso vai ter todas as variáveis ​​funcs. Ótimo. Portanto, agora temos dois x diferentes que representam duas coisas muito diferentes. Então nós vamos para imprimir a número inteiro de x. Então, vamos imprimir 100, certo? Porque aqui é 100. Então essa é a primeira coisa que está indo para imprimir. Como esta função retorna nada, agora essa função, essa linha no principal é feito. Todos bom comigo até agora? Então, nós estamos agora através de dois dos três linhas de nossa função principal. Agora nós estamos indo para a terceira linha. Nós estamos indo para printf. O que é este x dentro principal? O que isso representa? O valor é x agora? AUDIÊNCIA: 100. PROFESSOR: É 100? AUDIÊNCIA: Still 10. PROFESSOR: Still 10. Sim. Porque lembre-se, no prazo de nossa func, x é igual a 100. Mas se voltarmos para trás a nossa função principal, variável que é armazenado numa lugar diferente em nosso stack. Então, agora temos de voltar para o pilha principal, rede de variáveis ​​locais. E aqui que x é igual a 10. E assim nós vamos imprimir 10. Então, ela estava absolutamente certo. Nós vamos ter a saída de 100 e 10. Sim? AUDIÊNCIA: Quando você malloc, é o heap ou da pilha que é [inaudível]? PROFESSOR: Quando você malloc, você está tomando memória do heap e respectiva distribuição. De modo que você não tem para mexer com nada disso. Então eu acho que a maior takeaway aqui é algo chamado escopo. Para aqueles de vocês que estavam em a sessão de revisão na noite passada, Conversamos um pouco sobre isso. Âmbito define como e quando existirem as suas variáveis. Ou dentro do que emoldura fazer existir suas variáveis. Praticamente a regra geral é, o seu variables-- se você criá-los dentro braces-- encaracolado eles existem somente dentro dessas chaves. Assim, por exemplo, na nossa função de func, você vê essas duas chaves. Se você estiver criando qualquer coisa dentro dele, chances são tudo que você está fazendo é a criação de uma pilha e que o armazenamento de lá. Mesma coisa na principal. Isso é apenas armazenado dentro do principal. Além disso, você quer ser muito, muito cuidado aqui. Porque escopo também empresta -se a diferentes exemplos. Assim, por exemplo para uma loop, para int i é igual a 0. I é menor do que, eu não sei, 10. I plus plus. E você tem o código para dentro dele, certo? Onde é que esta variável, i, na verdade, só existem? Só dentro de seu loop for. Então Aposto que muitos de vocês têm provavelmente encontrou este erro quando você está fazendo em seus programas Série de Exercícios. Quantos de vocês têm tentado usar i fora de um loop e tinha um erro? Como uma inteiros sem referência ou algo assim? A razão pela qual isso acontece é porque você está aqui criando algo que só existe dentro de seu loop for. E se você tentar usá-lo, eu não realmente existe fora dele. Então, basicamente, um computador dizendo, eu Não sei o que você está falando. Tudo o que sei é que eu era um aqui, mas agora já não é. Então, se eu fosse para criar um loop for para dentro, certo? E eu vou criar uma outra, como int j, e tê-lo fazer o que quer. E você tem um código dentro de que loop, j só existe aqui. Mas isso também existe dentro de mim. E assim j só existe dentro deste loop for, Considerando i existe na coisa toda. Todo mundo é clara? A mesma coisa com instruções condicionais se você quiser criar qualquer coisa. Mesma coisa com loops enquanto que se você deseja criar alguma coisa. Isso é algo a ser muito, muito cuidado. Portanto, este foi realmente um bom problema no sentido de que ele demonstrou duas coisas. Ele demonstrou pela primeira vez, o escopo. E demonstrou também a alocação de memória. Porque vocês devem saber que funções crescer para cima na pilha. E que quando você chamar funções, você está criando essencialmente uma nova pilha de memória. Isso é muito diferente do o que sua memória de rede é. Sim. Ufa! Todos OK sobre isso? Isso foi confuso. Muito bons temas para passar por cima, porque provavelmente você está indo para obter algum complicado coisas como essa no questionário. Sim. Legal. Eu vou colocar você chegar em um 100 A linha 10 e depois no outro. Sim, muito bom. OK, agora vocês vão começar a chance de ser os ATs. Você começa a responder a todas a adorável e-mails que eu às vezes tenho. Então, Dear Andi, vejo Acho que tem algo acontecendo de errado com o meu compilador. Tenho certeza de que meu código está correto, mas eu continuo recebendo uma falha de segmentação toda vez que eu corro. O que está acontecendo? Por favor, ajudem, muito amor. Se vocês tem algo como que como você responderia? Estes são realmente muito comum perguntas que vai pedir para você. É se, nós vamos dar-lhe um cenário, vamos nos dar o seu melhor palpite sobre o que está acontecendo. Alguém tem uma facada em o que está acontecendo? Sim? AUDIÊNCIA: Talvez o desreferenciado null, algo como o ponteiro está apontando para algo nulo. PROFESSOR: Sim, isso seria um exemplo de quando isso aconteceria. Mas qual é a imagem maior do que está acontecendo aqui? AUDIÊNCIA: É que você está tentando para acessar a memória que você não está deveria ter acesso? Professor: Exatamente. Então, pense de uma falha seg, um off limites, área restrita na memória que você não deve estar tocando. Então, basicamente quando você está tentando para index-- como por exemplo, você declarou um matriz de zero a nove. Mas você tentar tocar que 10 valor, você não tem acesso a isso. Porque você não declarou ele. E para que o seu computador está indo olhar para isso ser assim, uh oh, você está tentando ir fora dos limites do índice. eu vou te dar uma falha de segmentação. Pense em como segmento, certo? Um segmento extra, a culpa é quando você tenta quebrar algo e você não deveria estar lá. Falha de segmentação é a qualquer momento você tentar tocar as coisas que você não deve estar tocando. Assim, exemplos comuns são um índice. Claro, se você está tentando ao toque que era nulo, que também funcionaria bem. Se o ponteiro estava tentando tocar coisas que não devem tocar, que também poderia funcionar tão bem. Mais tipicamente você vai ver isso em uma matriz. Todo mundo é bom? AUDIÊNCIA: Então se você quiser para acessar o ponto 10 e só há um limite de nove ou algo assim. PROFESSOR: Sim, exatamente. Basicamente. Legal. Caro Andi. Então temos estes maravilhosos coisas chamado tipos. Se Mesclar sort-- como nós serra no exemplo quando David fez todo coisa em class-- por isso, se é muito mais rápido do que qualquer um dos outros tipos, por que incomoda mesmo sabendo qualquer um dos outros tipos? O que é esta questão realmente perguntando-lhe? Qual é a três word-- AUDIÊNCIA: Qual é o trade-off? Professor: Exatamente. Isso é o que a questão está pedindo. Qual é o trade-off entre Merge sort versos quaisquer outros tipos? AUDIÊNCIA: Toma memória, certo? PROFESSOR: Você explicar que um pouco mais? Primeiro vamos explicar loja direta. Como é que merge sort trabalhar? AUDIÊNCIA: Então ele funciona por dividindo tudo em metade e, em seguida, colocá-lo juntos e realocando-lo em ordem, como cada vez que você mesclar os sets. PROFESSOR: Muito bonito. Então, eu posso chamar isso, mas seria leve-me cinco minutos para retirá-la. Olhe novamente para os slides seção onde nós cobrimos merge sort. Exatamente. Assim, a maneira Mesclar obras de classificação é ele divide as coisas pela metade, e então ele só olha para o primeiros valores de todos eles e classifica só isso. Cria continuamente novas matrizes e coloca as coisas mais e mais em ordem. E assim, enquanto que é muito, muito rápido, porque it's-- você sabe, uma pesquisa binária é log n de n. Você está criando tantos matrizes diferentes que você é utilizando uma quantidade enorme de memória. E assim, enquanto ele é mais rápido, o trade-off aqui é que você está usando mais memória. E assim, sugestão, tipos e pesquisas foram cobertas muito mais este ano do que têm sido nos anos anteriores. Vocês deveriam ver que refletido, consequentemente, o quiz. Eu definitivamente gastar tempo indo sobre o que todos os diferentes tipos são, como busca binária, como o trabalho de busca linear. Como talvez pseudocódigo codificar os para fora. Quais são os tempos de execução? Algo como tempos de execução é muito fácil de copiar para baixo em uma folha de nota, certo? É realmente difícil quando você está no meio do ensaio e você tem que descobrir isso. Copie-o para baixo. Eu garanto que você é vai precisar de saber isso. Quais são as vantagens e desvantagens? Na pior das hipóteses, os melhores cenários para todos eles, muito conhecer. Sim? AUDIÊNCIA: Não precisamos sabe codificar merge sort? Como, precisamos lembre-se o recursiva? PROFESSOR: Eu duvido muito, apenas porque é como bastante complicada. Mas não pode ser impraticável se pedir-lhe para usar pseudocódigo-lo. Sim. Sim, OK, mais uma. Isso pode ter vindo acima em você última peça em um pouco. Sim? Será que todo mundo ouviu isso? OK, então praticamente primeiro tudo, que tipo de programa seria dando-lhe uma saída como esta? Lembre-pedimos que você aprenda sobre este novo tipo de ferramenta de depuração? Qual era o nome dele? Valgrind, direita Era um programa onde você poderia chamar que podia manter o controle de toda a memória que você está usando em seu programa e estava acontecendo. Então, se você tem alguma coisa, como, definitivamente perdido, 40 bytes em um bloco. Provavelmente você não está lembrando-se para libertá-la. Porque se você estiver usando bytes de memória, isso significa que você acessou essa memória, mas você não foi capaz de libertar. Então você quer fazer Certifique-se de que você também é usando free-- que é um function-- para libertar todos da memória redistribuídos por malloc. Legal. Portanto, este slide, eu vou tê-lo instalado. Está em toda parte em uma série de palestras, em muitos slides seção. Você realmente quer ter a certeza você só sabe de tudo isso. Quer na sua folha de nota ou se você quer memorizá-lo, sinta-se livre para. Isso é realmente, realmente, realmente importante. Também um muito bom pergunta que podemos pedir. Por que olhar Seleção sort-- em Seleção sort-- todos os tempos de execução são n ao quadrado. Independentemente de como a lista trata de você como, então por que é sort-- Seleção Eu vou dar a vocês 30 segundo pensar sobre isso. Porque é uma espécie de confundir. Trata-se de algum pensamento conceitual. Por que os tempos de execução seja o mesmo em ambos os piores e os melhores cenários? Sim? AUDIÊNCIA: Porque cada espécie Seleção posição ou espaço neste pequeno conjunto coisa ou o que quer. Assim, mesmo no melhor cenário, mesmo que seja perfeitamente ordenados, ele ainda teria que ser como, OK, um. No meu primeiro lugar eu tenho um. E passar por todos eles. OK, é o menor. E então ele vai novamente e é como, OK, dois é a menor de todas as coisas. Mas ele ainda tem que verificar todos e cada um. PROFESSOR: Yeah. Assim, por exemplo, vamos apenas dizer Temos uma lista, já classificado, uma matriz de um a cinco. A maneira que os tipos de seleção é que ele passa por, ele verifica estes dois. Em seguida, ele verifica os dois. E, em seguida, ele verifica e verifica. Ele mantém a verificação de todos eles, independentemente de haver ou não ele é realmente classificada. Porque isso é simplesmente a forma como o tipo funciona. E assim que esta questão é como uma questão conceitual vamos pedir. Onde em primeiro lugar, você saber que tipo de Selecção é, para a direita, para poder para responder à pergunta. Você tem que ser capaz de entender conceitualmente o que está acontecendo. E então você pode aplicá-lo e pensar, OK vamos apenas imaginar pior cenário. Eles estão todos em ordem decrescente. Como isso afetaria isso? O que se está a ordem ascendente? Se ele já está classificado? Como isso afetaria os tempos de execução? E, em seguida, tipo Seleção, você notará que na verdade não importa. Porque você está verificando toda a valores, independentemente do que está acontecendo. E assim as coisas boas para se lembrar. Porque alguns tipos diferem de outros e qual a melhor e os piores cenários afetaria todos eles. Eu estou indo para realmente bater em tipos porque isso vai estar no quiz. Sim. ESTÁ BEM. Há seis minutos do fim. Eu posso tomar três minutos de perguntas. Eu também pode pendurar em torno de como 20 minutos após secção se você quiser fazer perguntas também. Alguém só tem realmente breve dúvidas ou questões conceituais eles são pouco claras sobre a direita agora? Sim? AUDIÊNCIA: Você pode falar um pouco pouco sobre os operadores bit a bit? PROFESSOR: Yeah. Assim, os operadores bit a bit são algo que você provavelmente pode apenas querer colocar na sua folha. Então quickly-- Eu não quero para ir muito a fundo porque Harvard, em sua revisão sessão, cobriu-o muito bem. Operador bit a bit, há cinco deles, certo? Não é isso, que é x ou função, há comercial, que é o e. Pipe, que é o or. E então você tem os dois diferentes tipos de turnos. Se eu lhe dou dois valores, se Eu dou-lhe, como, um e um. O que teria que ser avaliada como? Se eu lhe der certo e verdadeiro, verdade? E quanto verdadeiro ou falso? Ainda verdade, certo? Porque há um ou. Nós provavelmente vai lhe dar números. Então lembre-se, um é igual a verdade, o zero é igual a false. E nós pode dar-lhe estas coisas e pedir-lhe para nos dizer o que acontece. Harvard cobre dentro do primeiro 10 minutos de sua sessão de estudo muito, muito bem. Então vocês querem fazer se você olhar para trás sobre isso. AUDIÊNCIA: É pisa5 vai ser no teste? PROFESSOR: Não. Nem sequer olhar para pisa5 agora. É difícil. Apenas não se incomodam mesmo olhando para pisa5. No entanto, como algumas dicas e sugestões, I gostaria de sugerir que você comece pisa5 assim que o questionário é longo. Este será o mais difícil semana, mas depois vocês será passado que nas colinas de verde e filhotes rolando, e está tudo bem. Esta classe recebe significativa mais fácil após o quinto pset. Horário de atendimento: AUDIÊNCIA são domingo, segunda-feira? PROFESSOR: Sim, então o horário de expediente será o domingo para segunda-feira para o pset. O horário de expediente hoje à noite, essencialmente, só vai ser crítica para o quiz. Se alguém quer vir e perguntar o TAs uma pergunta, nós vamos estar lá. Vou levar talvez mais uma pergunta se alguém tem uma pergunta? Sim? AUDIÊNCIA: Quando você está nós que definem, [inaudível] se você disser estrela nó e, em seguida, ao lado, faz o computador automaticamente entender que você é referindo-se a um outro ponteiro? PROFESSOR: Não. AUDIÊNCIA: Você tem que relink isso [inaudível]? PROFESSOR: Então, basicamente, o struct de um nó é, recorde, é como se você criar o nó e então você tem um ponteiro chamado seguinte. Tudo o que você está fazendo é tendo a estrutura lá. Você tem que atribuir esse ponteiro em algum lugar. Assim, os computadores não faz sabe o que está fazendo ainda. Você realmente tem que atribuí-lo quando você está criando sua lista ligada. E é isso que principalmente pset 5 será ligado. Assim, não se preocupa com nada disso agora. AUDIÊNCIA: Então nós não precisamos concentrar demais na lista de link, apenas a concepção geral? PROFESSOR: Apenas praticamente pilhas, filas, listas de links, árvores, tabelas de hash. Basta ser capaz de saber o que são. Nós não vamos pedir você gosta de alguma coisa específica porque nós realmente não tenho feito um pset que o cobre nada disso ainda. Assim, nos últimos dois minutos antes Eu defini-lo livre para matar este quiz. Muito bonito, como, pense sobre como agora vocês vieram nesta classe. Eu me lembro quando duas semanas desta classe, alguns de vocês passar três horas de água escrever. Quanto tempo demoraria as pessoas a escreverem água agora? 30 segundos, talvez? Pense em quanto vocês aprenderam. CS é um assunto muito, muito difícil. Não há dúvida de que. É difícil, é por isso que ninguém estuda. É muito difícil. E é totalmente bom. E eu estou realmente orgulhoso que todo mundo já fez isso até agora. Série de Exercícios não são fáceis. Eles levam um monte de tempo. Vocês, eu nunca vou pedir-lhe para escrever o jogo de 15 ou Vigenere no pset. Não há necessidade de apenas pirar com isso. Tudo o que estamos testando aqui é avaliar seu conhecimento conceitual, bem como algumas de suas habilidades básicas de codificação. O ensaio é concebido para ser realmente desafiadora. Como, ele é projetado para você não ficar 100. Ele também é projetado para você, provavelmente, não ser capaz de terminar em 75 minutos. E isso é totalmente bom. Eu sou um estudante de mim mesmo. Eu sei, eu odeio quando eu ando fora de um quiz ser como, merda. Isso foi realmente difícil. Provavelmente, o que vai happen-- e isso é totalmente bom, Eu estou dizendo a vocês agora. Os meios sobre essas coisas não são elevados em todos os. E para aqueles de vocês que foram ficando, como, trios em seus conjuntos de problemas, isso não significa que você é indo para obter um 60 por cento nesta classe. Se você receber 60% no questionário, que não faz Quer dizer que você vai obter uma D nesta classe. Vemos, especialmente I, para aqueles de vocês na minha seção, Eu vejo o quão duro vocês estão todos trabalhando. E eu manter o controle do que isso. Vocês vão ficar bem. Não há nenhuma memória institucional felicidade no final do semestre. Porque todas as crianças de Harvard estão dizendo seus amigos, oh, você vai ficar bem. Ninguém está dizendo a vocês que aqui. Então eu tenho que dizer a vocês que aqui. Vocês vão ficar bem. Estou tão orgulhosa de todos vocês. O teste vai ser difícil. Estude para ele, e depois apenas jogá-lo fora. Prepare-se para aprender coisas novas. E comer doces. Temos têm lotes de doces. Tenha uma boa noite de sono. Não não dormir, porque isso seria muito ruim. CS é um monte de lógica. Se você não dorme, você não pode funcionar, e seu cérebro não pode funcionar. E eu vou estar aqui para o próximo 20 minutos se alguém quiser ficar em volta. Vocês estão indo para matá-lo. Boa sorte.