COLUNA 1: Tudo bem. Bem-vindo de volta. Esta é a Semana Duas das CS50, e nós temos até agora foi o uso de funções, mas em grande medida tomada para concedido. Nós usamos printf que tem a efeito colateral de impressão as coisas na tela. Nós usamos get-int, se flutuar. Mas e se você realmente deseja criar suas próprias funções, como alguns dos você já deve ter começado a fazer por Problem Set One, embora não é estritamente necessário? Bem, vamos em frente e revisitar esse problema de apenas pedindo ao usuário para o seu nome e a impressão algo na tela, mas tenta fatorar alguns da comunhão que temos visto no nosso código até agora. Então, por que eu quero dizer o seguinte. Eu estou indo para ir em frente e criar um novo programa, basta ligar para ele HELLO.C como de costume. Eu estou indo para ir em frente e dar-me incluir io.h padrão no topo. Vou também dar-me preventivamente a biblioteca de modo a que CS50 Eu não me gritou pelo compilador. E agora eu estou indo para ir em frente e declarar int, principal, nula. E então, aqui, é aqui que eu quero para começar a terceirizar funcionalidade para alguma outra função que eu mesmo sou vai escrever, mas que não existem atualmente. Por exemplo, suponha que eu queria escrever uma função que me permite imprimir Olá, vírgula, e então o nome de algum usuário. Ao invés de continuar a fazer printf Olá,% s, não seria bom se havia apenas uma função chamada não printf, mas o nome de impressão? Portanto, em outras palavras, eu quero ser capaz de escrever um programa que faz um pouco algo como isto. Primeiro, eu vou dizer o printf nome, levando, assim, o usuário me dar o seu nome, e então eu sou vai usar as cordas s familiares para declarar uma string. Dê-me uma variável do tipo string, chamá-lo s, e loja em que o resultado da chamada obter string. Mas, agora, nas últimas semanas, eu teria um pouco tediosamente feito Olá,% s / n. E, em outras palavras, temos visto esta exemplo, um monte de vezes, e é um trivial exemplo, porque há apenas uma linha de código para que ele não é realmente um grande negócio para ficar digitando novamente. Mas suponhamos que esta linha de código na verdade, estavam se tornando um fardo, e não é uma linha de código, mas é 10 linhas de código de um par de semanas a partir de agora, e você está apenas cansado de copiar e colar ou redigitação esse mesmo código. Não seria bom ao invés de fazer printf Olá,% s e assim por diante, Não seria bom se houvesse apenas uma função chamada nome de impressão que recebe um argumento - em outras palavras, é preciso entrada - e, em seguida, ponto e vírgula. Então essa função, não seria Seria bom se que existia? Então eu não teria que se preocupar com printf que é, o que% se todos estas complexidades que sejam nem tudo o que interessante. Eles são úteis. Assim, o nome de impressão, infelizmente, não foi inventou cerca de 40 anos mais atrás. Ninguém pensou em escrevê-lo. Mas essa é a beleza de ter um linguagem de programação, assim como no Do zero, você pode definir blocos personalizados, para em C e mais qualquer língua, pode definir a sua própria funcionalidade, pode você definir suas próprias funções. Portanto, apesar de chegarmos principal automaticamente de graça, podemos declarar nossas próprias funções. Então, eu vou fazer algum espaço aqui em cima, e eu vou declarar meu própria função que vai procurar um pouco estranho no começo, mas nós vamos chegar de volta a este antes do tempo. Eu vou dizer nula, assim indicando que essa função faz algo, tem um efeito secundário, mas não devolver algo para mim no mesma forma que se int ou obter corda em si faz. E eu vou dar a este uma função nome do nome de impressão, e eu vou especificar que esse cara vai levar uma string, e eu vou ligar para que nome string. Eu poderia chamá-lo de qualquer coisa que eu quiser, mas eu quero o meu código para ser auto-documentado. Em outras palavras, se um de vocês fosse abrir este arquivo e lê-lo, você poderia tipo de inferir a partir do nome que entrada o papel que deveria desempenhar. E agora abaixo disso, eu vou abrir crespos e encaracolados cinta cinta fechada, e assim perceber que eu tenho seguido o mesmo padrão em linhas de quatro a sete como Eu tenho acompanhado de uma boa semana, além de agora entre, digamos, nove linhas e 14 que compõem principal. Em outras palavras, imprimir o nome é uma outra função. Agora, o compilador não vai saber chamar essa coisa automaticamente porque eu literalmente inventou, mas vai saber ainda para chamar principal automaticamente, e então, naturalmente, em linha 13, eu estou chamando minha própria função. E porque eu tenho declarado que a função se na linha quatro, antes principal, isso vai ensinar o compilador o orçamento, fecha aspas ", nome print" significa eo que ele deve fazer. Então, eu sou uma espécie de dar-lhe um novo costume bloquear no contexto de, digamos, zero. Então, aqui, eu posso colocar isso muito comum ou padrão recorrente de código guardo escrita em sala de aula, printf Olá% s,% s / n "- o que eu quero colocar aqui? S? Então, eu quero colocar o nome neste contexto. Então, observe um pouco de uma dicotomia aqui. Porque eu estou declarando minha própria função e eu tenho um pouco arbitrariamente chamado que imprimir o nome, e porque eu tenho especificado entre parênteses que esta função recebe um argumento, o tipo de que é uma string - por isso é uma palavra ou frase, ou algo assim - e Eu estou chamando esse nome argumento, que significa que a única variável que está em escopo, por assim dizer, é o nome. S só existe entre o que dois chaves, é claro? Bem, na verdade, assim como a linha 10 através de 14, então apenas como na segunda-feira não pode usar S, mas o que posso fazer é passar S em nome de impressão. Imprimir o nome só acontece para dar-lhe um alias, um sinônimo, um apelido, chamando-o de nome, e agora usá-lo nesta linha. Então, agora deixe-me guardar este, zoom out. Deixe-me ir em frente e fazer Olá. Parece bom. Não cuspir erros. . / Olá Enter. Qual é o meu nome? David. E Olá David. Assim, nem tudo o que emocionante, mas só de pensar agora. Você agora tem o mesmo ingrediente como fizemos em risco a fazer nossas próprias funções. Mas há um pouco de uma pegadinha. Suponha que eu realmente não tinha pensado isso através de e eu realmente sem realmente pensar sobre isso escreveu essa função aqui. Sente perfeitamente razoável. Em risco, não há noção de localização em seus scripts. Você poderia colocar uma aqui em cima, aqui em cima, um aqui, e isso pode começar a a parecer um pouco confuso se você não fizer isso colocá-lo perfeitamente, mas não importa onde fisicamente os roteiros estavam na tela. Infelizmente em C - e esta é diferente linguagens como Java e Python e outros que você pode estar familiarizado com - infelizmente, em C, a ordem não importa, porque o que é relógio vai acontecer agora. A função padrão que está acontecendo para executar, é claro, a principal. Principal vai chamar o nome de impressão em A linha de oito, mas, infelizmente, a compilador não vai nem saber que o nome de impressão Existe até chegar a linha 11, que, infelizmente, é vai ser tarde demais. Então, vamos fazer fazer Olá. E agora, dois erros malditos gerada. Então, agora deixe-me ir até a própria primeiro, como sempre devemos fazer, e notar que ele está gritando para mim, "Declaração implícita da função imprimir o nome. " Então, temos visto essa mensagem antes, declaração implícita de função. Quando vimos esse tipo de erro? Quando eu não incluí uma biblioteca. Se eu esqueci cs50.h e eu iria ficar gritou para obter corda ou obter int. Mas, neste caso, esta função de impressão nome não está na biblioteca, certo? É, literalmente, neste arquivo, de modo o que é realmente o problema? Bem, infelizmente, em C, é preciso que você tão incrivelmente literalmente que se você quero uma função chamada nome de impressão para existe, você tem que implementar essa função no topo de sua código para que ele seja acessível para baixar funções, mas, francamente, que se torna desleixado muito rapidamente. Pessoalmente, eu gosto de colocar principal em primeiro lugar porque, então, é muito claro o que isso programa faz à primeira vista. E mais, você pode entrar no canto estranho casos em que se quer chamar x y mas y poderia chamar x, você só fisicamente não pode realmente colocar um por cima do outro. Mas acontece que em C, pode-se resolver isso de maneira muito simples. Eu vou colocar um pouco de espaço até aqui, e eu só vou preventivamente, embora um pouco redundante, vai ensinar a compilador que existe uma função chamou o nome de impressão, é preciso uma string, e eu vou chamar ele nomear ponto e vírgula. Portanto, este agora na linha de quatro, o que nós não tenha visto antes, é uma declaração de um nome de função de impressão, mas é só uma promessa de que esta função eventualmente ser definida, eventualmente ser implementado. Este agora posso deixar sozinho, porque agora esta é a definição, o implementação, uma espécie de última milha da implementação deste função particular. Então, francamente, é estúpido, é chato, mas este é o caminho é C, e é porque leva muito literalmente e, como um computador, francamente deveria, só faz exatamente o que você diga a ele fazer, e para que ordem é importante. Portanto, manter isso em mente e, novamente, começar a perceber a recorrência de padrões. As probabilidades são que você vai, se você não tiver já, começar a encontrar mensagens como este, que à primeira vista parecem completamente enigmática, mas se você começar a olhar para estas palavras-chave como "Declaração implícita", a menção de um função neste caso - e, francamente, você às vezes até ficar um pouco verde símbolo cenoura que lhe diz onde o problema é provavelmente - você pode começar a trabalhar o seu caminho através de ainda mensagens de erro invisível. Qualquer dúvida sobre como escrever o seu própria função desta forma? Vamos fazer algo que é um pouco mais convincente. Ao invés de apenas fazer algo que tem um efeito colateral de impressão, deixe-me ir em frente e salvar um novo arquivo, e nós vamos chamar este positive.c, mesmo que seja vai ser um pouco diferente contra a última vez. E desta vez, eu quero voltar a implementar exemplo positive.C da última vez, que é forçar o usuário a dar me um inteiro positivo. Mas eu tinha que usar get int última vez. Não teria sido bom se houvesse uma função chamada obter int positivo que eu poderia simplesmente terceirizar essa pedaço de funcionalidade para? Assim, a diferença aqui é que nós vamos implementar obter int positivo, mas ao contrário Nome impressão que teve um efeito colateral - é não devolver algo para mim como um número ou uma string - se int positivo é, naturalmente, vai voltar, espero, um int positivo. Então, vamos fazer isso. Incluir cs50.h, incluem Standard io.h. Int void main. E agora aqui, eu estou indo para ir em frente e digamos que int, chamá-lo de n, é igual a obter int positivo. E, assim como obter int já existe porque o pessoal escreveu, eu vou assumir para o momento em que obtenha int positivo existe, e agora eu vou para ir em frente e dizer printf, obrigado pela% i / n ", n. Portanto, agora se eu compilar esse programa, o que que vai acontecer no meu terminal janela na parte inferior da tela? Eu vou provavelmente obter esse mesmo erro de antes. Então, vamos tentar isso. Faça positiva. E mais uma vez, declaração implícita da função, obter int positivo. Assim, podemos resolver isso em um par de formas. Eu vou mantê-lo simples e apenas coloquei minha declaração aqui e obtenha int positivo. Eu preciso da assinatura so-called. A assinatura refere-se apenas para a estética do primeira linha do programa. Então, o que deve obter positivo int retorno? Assim, um int. Quero dizer, idealmente, seria voltar algo como int positiva, mas que não existe. Nós não vimos que, entre os nossos dados tipos, por isso temos de lidar com o fato de que temos muito poucos tipos de dados para trabalhar. Mas podemos retornar um int e apenas confiar que vai ser positivo. Vai ser chamado obter int positivo. E agora, como sobre os seus argumentos? Leva qualquer entrada? Será que ele precisa de qualquer entrada? Por isso, não precisa saber nada de antemão. Obter corda não, se int não. Printf faz - ele precisa ter algum entrada passou para ele - eo nome de impressão precisava de alguma entrada, mas se int positivo não. Então eu vou explicitamente dizer o vazio compilador. Vácuo é a ausência de qualquer outra coisa. Então vazio não significa nada está acontecendo dentro desses parênteses, ponto e vírgula. E agora, no fundo do meu arquivo - e novamente, estou apenas sendo gentil de anal aqui colocando principal no topo, o que é uma boa prática, pois desta forma, sempre que você ou alguém abre o arquivo, o funcionalidade é logo ali. Você pode mergulhar a partir de uma praça. Então agora eu vou duplicar isto, ficar vazio int positivo, mas eu não sou vai bater um ponto e vírgula agora. Eu vou abrir chaves, e agora eu preciso tomar emprestado algumas idéias de segunda-feira. Então, como você se lembra, fizemos algo como fazer o seguinte enquanto algo que era verdade. E o que foi que eu fiz? Eu fiz algo parecido com dar me um inteiro positivo, pouco mais de um prompt. Eu poderia usar todas as palavras que eu quero. E então eu usei o quê? Int n é igual a ficar int, sem argumentos para isso. E notar a diferença. Quando você chamar uma função, quando você usa uma função, você não colocar em vazio. Você só faz isso quando declarar um função, ensinando o compilador que ele deve esperar. Então você não precisa colocar anular lá mesmo. E agora, o que era a minha condição? Bem, n não é igual ao positivo, mas isso é apenas pseudo-código. Então, como posso expressar isso de forma mais limpa? Assim, a menos que ou igual a zero. Então, novamente, observe que você pode fazer inferior ou igual a. Mesmo que seja dois separados símbolos, você pode fazê-lo em o seu teclado como tal. Mas ainda há um bug que Fiz asneira última vez também. Eu tenho que declarar - exatamente. Eu tenho que declarar n fora do loop. Então eu preciso colocar n aqui em cima, e eu não quero voltar a declará-lo aqui para que eu não obter uma nova variável. Eu só quero atribuir um valor aqui. E agora eu não estou bem feito aqui. Deixe-me chegar à frente de mim e fingir que sou feito. Tornar-se positivo, e agora há um novo erro. Controle atinge final função não-vazio. Então nova mensagem de erro, mas se você tipo de desmembrar cada uma das palavras, provavelmente aponta para o que está errado. Controlar. Controle significa apenas que a ordem de operações em um programa. O computador está no controle e algo deu errado. Portanto, chega ao fim do uma função não-vazio. Que função é aparentemente referindo? Que função é não-vazio? Portanto, obter int positivo, e um pouco confuso em que o bem, é uma espécie de vazio. Ele tem uma especificação de vazio para a sua argumentos, mas a sua saída vai ser do tipo n. Assim, a palavra da esquerda é o assim chamado tipo de retorno. A palavra no interior aqui é O zero ou mais argumentos que a função recebe. Então o que eu preciso fazer? Neste ponto, no meu código, linha 21, onde prompt piscando agora é que eu tem um int positivo dentro da variável chamada n. Como faço para devolvê-lo ao principal? Literalmente. Retornar n vírgula. Portanto, assim como Colton voltou um pedaço de papel com uma resposta para me soltando aquele pedaço de papel no little black caixa sobre a mesa, para fazer isso em código, você, literalmente, basta escrever, o retorno n, e é como se fosse Colton entregando-me alguma coisa física. Neste caso, o que está acontecendo é obter int positivo vai devolver o que é provavelmente positivo inteiro para quem? Onde é que esse valor acabar? Isso acaba nesta variável, n, e então vamos continuar com a linha de nove. Assim, em outras palavras, a fim de operações, este programa começa execução, eo compilador percebe, oh, você quer a biblioteca? Deixe-me ir agarrar o que está dentro disso. Oh, você quer a biblioteca IO padrão? Deixe-me ir agarrar o que está dentro disso. O que faz o compilador dizer para si mesmo quando atinge quatro linhas? Oh, você prometeu para implementar o função chamada ficar positivo, mas vamos voltar a isso mais tarde, algo nesse sentido. Int void main significa apenas aqui as entranhas do meu programa. Linha sete é apenas uma chaveta. Linha de oito está dizendo à esquerda, dar me 32 bits para um inteiro, chamá-lo de n. No lado direito, é dizendo se int positivo. Agora vamos fazer uma pausa nessa história, porque agora Eu não manter em movimento o meu cursor para baixo. Meu cursor agora se põe aqui porque agora começar int positivo executa. Int n é declarada. Faça o seguinte. Printf me dá um número inteiro positivo. Obter um int do usuário, armazená-lo em n, e talvez fazer isso de novo e de novo. Este ciclo significa que este código pode executar cima e para baixo como este novamente e de novo, mas quando o utilizador finalmente coopera e me dá um positivo int, eu bati em linha de 21, altura em que o número é entregue de volta, e que uma devo destacar agora? Nine. Controlo, por assim dizer, retorna para alinhar nove. Essa é a linha que está agora no comando. Então, isso é o que está acontecendo desta vez sob o capô, mas quando usamos funções como printf ou até obter corda que alguém escreveu para você, o controle estava sendo entregue para outra pessoa da linha de código por linha por linha. É só que não podia vê-lo e nós realmente não poderia representá-lo neste programa, porque ele está em algum outro arquivo no disco rígido sem o conhecimento de nós. Então, vamos realmente compilar e executar isso agora. Faça positiva. Compilar, isso é progresso. . / Positivo. Dê-me um número inteiro positivo. Vamos ser difícil. Negativo 1. Zero. Vamos dar-lhe 50. Obrigado pela 50, e assim por controle já retornou. Qualquer dúvida, então, sobre isso? Sim? [Inaudível]. Diga novamente. Oh, boa pergunta. Assim, você pode notar um paralelo aqui que Eu sou o tipo de corte de um canto. Na linha 12, eu estou dizendo que, se int positivo retorna um int, mas por esse mesmo lógica, agora lógico que em linha seis, eu estou dizendo que os principais retornos um int, mas o que temos nunca tinha em qualquer um de nossos programas? Nós nunca tivemos menção de esta palavra-chave retorno. Assim, verifica-se que em C, pelo menos a versão que estamos usando feito em 1999, tecnicamente, este é passa automaticamente para você. Toda vez que você implementar um programa e você implementar uma função chamada principal, que a função retornará zero padrão, se você não dizer o contrário, e zero é apenas uma convenção. O mundo retorna zero, assim, indicando que está tudo bem, efetivamente nos deixando com quatro bilhões possíveis coisas que podem dar errado para que se voltarmos um, que pode significar um código que significa que este coisa deu errado. Nós poderíamos voltar dois, o que significa essa outra coisa deu errado. Poderíamos voltar quatro bilhões, o que significa essa outra coisa deu errado. E se você agora pensar sobre o seu próprio PC ou Mac, você deve se lembrar que às vezes você recebe mensagens de erro enigmáticas do software que você está utilizando e, às vezes, tem um humano descrição amigável, mas há frequentemente um código ou um número na tela? Se isso não vêm à mente, apenas manter um olho para fora para ele. Isso é geralmente o que estes códigos está se referindo. Eles estão incluídos no Microsoft Word e outros programas, de modo que, se você apresentar uma relatório de bug com a empresa, você pode dizer-lhes, oh, eu tenho o número do erro 45. E algum programador de volta na empresa pode olhar que em sua código e dizer, oh, isso é porque eu fiz esse bug e é por isso que o usuário tenho essa mensagem. Mas, francamente, é um pouco distracção e um pouco entediante para Conclui-se que, pelo menos, no nosso primeiros programas, por isso temos foi omiti-lo. Mas todo esse tempo, cada um de seu funções principal secretamente tinha essa linha adicionada automaticamente para você pelo compilador, apenas por convenção poupar algum tempo. [Inaudível]. Você não precisa incluí-la no principal. Isso é bom. Você precisa incluí-lo se você fosse implementação de uma função como essa. Caso contrário, a função plana fora não iria funcionar. Mas, no principal, não é necessário. Em uma semana ou duas, vamos começar a receber em que o hábito, uma vez que pretende iniciar significando erros. Pergunta muito boa. Pausa verbal tão rápido para mencionar que nesta sexta-feira, que não vai ter almoço per se, mas vamos ter um jantar com alguns dos alunos e funcionários. Se você gostaria de se juntar a nós, sinta-se livre para ir para cs50.net/rsvp. 06:00 desta sexta-feira. O espaço é, como sempre, limitado, mas vamos continuar a fazê-los em um quase semanalmente se o espaço se esgota nesta semana. Assim, o suspense que paramos em Segunda-feira era que as cordas pode realmente ser indexado em, que significa apenas que você pode começar no primeiro caractere, o segundo personagem, o terceiro personagem e assim por diante, porque você pode efetivamente pensar em uma string, como Olá, como neste caso, de cinco letras dentro de caixas. E você pode obter em cada um desses caixas com o que fizemos sintaxe apresentar na segunda-feira? Esses colchetes em seu teclado. Isso significava apenas ir até o local zero. Começamos a contar do zero, então o suporte de zero significa h, suporte de um significa e, e assim por diante. E assim o tempo todo quando nós estivemos usando cordas e digitar "Olá" e "mundo" e outras coisas em tela, ele foi armazenado em caixas como esta. E dar um palpite. O que é que cada caixa de representar fisicamente dentro do seu computador? [Inaudível]. Desculpe? Caracteres. Assim, um personagem, certamente, no caso de cordas, e um personagem é apenas oito bits ou um byte. Então você provavelmente tem pelo menos vagamente familiarizado com o fato de que o seu computador tem memória. Tem dois tipos de memória, pelo menos. Um deles é o disco rígido onde você salvar coisas de forma permanente, e isso é tipicamente grande, por isso você pode ter filmes música e assim por diante. Então você tem um outro tipo de memória chamada RAM, R-A-M, Random Access Memória, e este é o tipo de memória que é usado quando o computador é funcionando, mas se você perder o poder ou a sua bateria morre, tudo o que está armazenado na RAM desaparece se você perder o poder completamente, porque não é persistente. Você normalmente tem, nos dias de hoje, um show dele, dois shows, talvez mais. E a cabeça de RAM é que ela é muito muito mais rápido do que os discos rígidos ou até mesmo drives de estado sólido nos dias de hoje, mas é geralmente mais caro por isso você tem menos. Então, a conversa de hoje realmente se refere para a memória RAM, que tipo de memória que só existe enquanto há poder sendo alimentada em seu computador. Então, quando você digitar H-E-L-L-O, Enter o teclado, o H vai numa byte de memória RAM, o E está indo em outro byte de RAM, como é o resto da palavra. Então, lembro que fomos capazes para fazer última vez foi esta. Deixe-me ir em frente e abrir o arquivo que chamamos string.c, e recordar que ele parecia um pouco algo como isto. Permitam-me, na verdade, reverter e mudar é exatamente o que parecia, comprimento da corda de s. Então olhe para o programa aqui. Nós incluímos a biblioteca CS50 assim que podemos usar se string. Nós incluímos io.h padrão por isso podemos usar printf. Por que nós incluímos string.h? Isso era novo na segunda-feira. Então, nós queríamos comprimento da corda. Str Comp. As pessoas decidiram há alguns anos, vamos ser apenas sucinto. Em vez de chamá-lo "comprimento da corda" vamos chamá-lo de "str Comp" e deixar o figura mundial que fora, e por isso é que temos acesso com string.h. Este é familiar. Este é familiar. Este é familiar. Isto é um pouco novo. Na linha 22 - e vamos voltar para isso, mas agora sei - e você só sei que este tenha leia a documentação ou se você já sabia C - obter corda, por vezes, pode estragar. Se o usuário é realmente contraditório ou cooperante e ele ou ela só não digitar nada no teclado ou tipos tanto no teclado que ele domina a memória do computador, em teoria, obter corda poderia retornar algo diferente de um seqüência de caracteres. Poderia retornar um valor especial chamado NULL em todas as tampas, N-L-L-L, e esta é apenas um chamado valor sentinela. É um valor especial que significa algo de ruim aconteceu neste caso. É a ausência de uma sequência. Então nulo Estou verificando simplesmente para que, Resumindo, str Leng e outras funções que vêm com C, se eles esperam uma corda, mas você passá-los a ausência de uma string, se você passar eles NULL, o computador ou o programa só vai falhar completamente. Ele vai travar. Ele vai vomitar alguma mensagem de erro. Coisas ruins vão acontecer. Assim, mesmo que este ainda é não bem definido - isso vai fazer mais sentido em uma semana ou dois - na linha 22, este é apenas um exemplo de auto verificação de erros defensivos apenas no caso de um tempo fora de um milhão de algo der errado, a menos o meu programa não irá falhar. Então, se s não é igual a algo ruim, Eu tenho esse loop for, e isso foi onde tivemos que outro nova peça de sintaxe. Eu tenho um loop de iteração zero até o comprimento do s. E então aqui, eu era uma impressão de fora s suporte de i, mas por que eu uso% c todos repente, em vez de% s até que s é uma string? É um personagem, não é? S é uma string, mas s suporte de alguma coisa, s suporte i, onde i é zero ou um ou dois, isso é um indivíduo caractere na cadeia, e assim por que, printf precisa de ser informada de que é na verdade um personagem que esperar. E então lembro, o que fez isso programa realmente faz? Impresso-lo em colunas. Sim, exatamente. Ela só imprimiu a palavra que eu digitar uma coluna, um caractere por linha. Então vamos ver isso de novo. Então faça string. Compilado OK. . / String. Deixe-me digitar H-E-L-L-O, Enter e na verdade eu entendo, um por linha. Então deixe-me fazer uma otimização aqui. Se você pensar sobre isso, especialmente se você já programou antes, há sem dúvida, uma ineficiência na linha 24. Em outras palavras, não é necessariamente o melhor design. Simples, pelo menos uma vez você lembre-se que str Comp é, mas é fazendo burrice potencialmente. O que pode ser isso? [Inaudível]. Exatamente. É verificando o comprimento do s a cada momento, mesmo que H-E-L-L-O sempre vai ser de cinco caracteres. Cada vez que através desta malha, a cinco não está a mudar. Eu poderia estar incrementando i, mas o que é o comprimento do s em cada iteração deste loop? É cinco, é cinco, que é cinco, e ainda estou perguntando isso, no entanto pergunta de novo e de novo e de novo. Agora, francamente, o computador é tão maldita rápido, ninguém vai notar uma diferença de, neste caso, mas estes tipos de decisões de design pobre pode começar a somar se o próprio compilador não tentar corrigir isso para você que que normalmente não faria, pelo pelo menos no interior do aparelho. Então eu vou fazer isso. Eu estou indo para adicionar uma vírgula depois minha primeira variável, i. Eu vou me dar outro variável, chamando-n, apenas por convenção para números, e então eu estou vai atribuir n o valor de cadeia comprimento do s. E então eu vou mudar minha condição de ser o que? Eu vou mudar a minha condição para quando eu for menor que n. Então, agora, quantas vezes sou eu verificar o comprimento do s? Certa vez, mas é OK para verificar i contra n uma e outra vez, porque agora os Os valores não estão realmente mudando. Agora, por enquanto, só sei que quando você chamar uma função, há um pouco de em cima, não o suficiente para desanimá-lo realmente sempre de utilizar as funções, mas certamente quando há uma linha de código assim - e as linhas vai ficar mais interessante antes do tempo - onde há uma oportunidade para pensar, se eu Digite este código, quantas vezes ele vai executar? Você vai começar a ver ao longo do tempo a desempenho de seus programas podem de fato mudar. Na verdade, um dos problemas define temos feito no ano passado, envolve implementação, como você deve se lembrar de semana zero, um corretor ortográfico, mas uma corretor ortográfico que é projetado para suportar um dicionário de 150 mil mais palavras que dão a vocês. Você teria que escrever um código que carrega essas palavras na memória RAM, assim em caixas como vimos na tela de um momento atrás, e, em seguida, tão rápido quanto você pode, você precisa ser capaz de responder a uma questão da forma, é esta palavra incorreto? É esta palavra incorreta? É esta palavra incorreta? E, em algo parecido com isso que nós temos feito no ano passado se transformou em, embora em uma base opt-in opcional, um competição do tipo, em que o alunos que usam o menos RAM e menos tempo, menos ciclos de CPU, acabam borbulhando para o início de um pequeno placa do líder ou a classificação que colocou em página inicial do curso, como já feito nos últimos anos. Assim, mais uma vez, totalmente opcional, mas esta fala às oportunidades de design que estão à frente quando começamos construção no topo de algumas destas blocos de construção básicos. Então deixe-me voltar a este diagrama para apenas um momento e revelar um pouco algo mais. Este fato é uma string, e temos tido vantagem de algumas bibliotecas io.h padrão que tem - Printf. Printf, entre outras coisas. cs50.h, que se int e obter cadeia e assim por diante, string.h, que teve str Comp. Mas acontece que há ainda um outro. Francamente, há muitas e muitas cabeçalho arquivos que declarar funções para as bibliotecas, mas isso é ctype.h realmente vai ser um pouco vantajoso, porque eu vou para ir em frente e implementar um outro programa aqui. Deixe-me ir em frente e abrir mão de algo Eu escrevi antes chamado capitalize.c, e vamos dar uma olhada em como isso funciona. Repare que eu estou usando, nesta versão dele, três arquivos familiares. Observe que, na linha 18, eu sou obter uma linha de texto. Observe na linha 21, eu estou afirmando que o seguinte código vai capitalizar s, o que o usuário digitou , e como eu estou fazendo isso? Bem, eu estou tomando - lição aprendida da última vez - Estou declarando i e n e iteração sobre os caracteres na string. E então o que é esse bloco de código na linha 24 a 27 fazer em termos leigos? Minúsculas carta de volta. Exatamente. Se s suporte i - por isso, se o i-th caractere de s, que é de algum caractere na string, é maior do que ou igual a um e minúsculas - lembrar que a dupla comercial significam e - e o mesmo personagem, s suporte i, é inferior ou igual a z minúsculas, isso significa que é um A ou um b ou c ou ponto, ponto, ponto ou z, o que significa é minúscula. O que eu quero fazer nesse caso? Bem, eu posso fazer isso um pouco enigmaticamente, mas vamos provocar este apart. Eu vou ligar para o printf, imprime% c porque eu quero reimprimir este personagem na tela. Estou passando então a ter suporte s i, o i-th personagem s, e depois porque estou fazendo este pequeno truque aqui, minúsculas Um capital de menos? O que é que vai dar me, de um modo geral? [Inaudível]. Exatamente. Eu realmente não me lembro - que foi de 65 para o capital A. Eu realmente não lembre-se que é um minúsculo, mas não importa. O computador sabe. Assim dizendo, minúsculas a menos maiúsculo, é estranho ser subtraindo um char de outro, mas quais são chars debaixo do capô? Eles são apenas números. Então o que esses números são, deixar que o computador lembre-se que em vez de o-me humana. Então minúsculas uma capital menos um é vai me dar a diferença. Ele passa a ser de 32, e que seria o caso de minúsculas b e de capital B e assim por diante. Ele permanece consistente, felizmente. Então, eu estou dizendo essencialmente, tomar o letra minúscula, subtrair off que diferença de padrão, e que efetivamente mudanças s suporte de i minúsculas, é claro, maiúscula, sem que eu realmente ter que pensar sobre ou lembre-se, o que eram aqueles números falamos sobre quando os oito voluntários surgiu no palco? Agora, enquanto isso, no mais, se não é uma letra minúscula, conforme determinado pela linha 24, apenas imprimi-lo. Eu só quero tocar a caracteres que eram na verdade originalmente minúsculas. Então, vamos ver isso. Faça capitalizar. Compilado, OK. . / Capitalizar. E deixe-me digitar H-E-L-L-O em letras minúsculas, Enter. E perceber que ele é convertido em letras maiúsculas. Deixe-me fazer isso de novo com uma palavra diferente. Que tal D-A-V-I-D com o primeiro D capitalizados como um nome tipicamente é? Enter. Observe ainda é correta. Ele só emitido o primeiro inalterada D via que qualquer outra construção. Portanto, tenha em mente, então, um algumas coisas aqui. Um, se você quiser conferir dois condições de uma só vez, você pode e eles juntos, como prevíamos. Você pode comparar personagens dessa maneira e tratar eficazmente personagens como números, mas, francamente, isso é tão maldita críptica eu nunca vou me lembrar Como chegar a esta a partir do zero sem raciocinar com ele por um bom um pouco de tempo. Não teria sido bom se alguém lá fora, escreveu uma função chamada é inferior ao que poderia responder por mim verdadeira ou falsa, este personagem é minúscula? Bem, felizmente, quem escreveu ctype.h fez exatamente isso. Deixe-me ir até aqui e adicionar ctype para c tipos, e agora deixe-me ir até aqui e reescrever esta linha como se segue. Então, se ele é chamado é menor, eu afirmo, s suporte de i, então eu vou apagar estas duas linhas completamente. Então agora alguém, eu estou esperando, escreveu uma função chamada é menor, e é Acontece que eles fizeram e declararam lo dentro de ctype.h. E agora eu vou sair da linha 27 sozinho, eu vou deixá-linha 31 sozinho, mas perceber o quanto eu tenho reforçou-se o meu código. É agora mais limpo. É menos difícil olhar através porque agora a função, além disso, é tão maravilhosamente nomeado apenas faz o que diz. Então agora eu estou indo para salvar este. Vou diminuir o zoom. E assim como em risco você poderia ter Booleanos, valores booleanos verdadeiro ou falsa, isso é exatamente o que é efetivamente reduzir retornos. Deixe-me recompilar. Deixe-me re-run. E agora vamos tentar novamente, H-E-L-L-S, Enter. Isso é muito bom. E tente novamente, certifique-se I não estragar alguma coisa. Isso é capitalizado também. Mas isso não é bom o suficiente, porque o outra coisa que eu nunca vou lembre-se se eu não trabalhar com ele realmente cuidadosamente sobre, digamos, o papel é essa linha maldita. Não seria bom se houvesse uma função chamada para superior? Bem, acontece lá fora está em ctype.h bem. Eu estou indo para ir em frente e escrever - deixe-me trazer a linha de volta. Em vez disso aqui, deixe-me ir em frente e digo, substituir o% c da resultado de chamar esta função para superior do i-th caráter de s. E agora percebe que está ficando um pouco equilibrado. Eu tenho que manter o controle de quantas parênteses eu abria e fechava. Então, agora é ainda mais limpo. Agora, este programa está ficando melhor e melhor projetado, sem dúvida, porque é muito, muito mais legível, mas não é nenhuma vamos corrigir. Faça capitalizar. . / Capitalizar. H-E-L-L-S. Vamos executá-lo novamente, D-V-A-I-D. OK, então ainda estamos em boa forma. Mas agora a superior. Proponho que há mais uma refinamento nós poderíamos fazer isso seria muito bom, que poderia realmente apertar se esse código e realmente nos dão cinco de cinco para o projeto, por exemplo. O que seria bom para se livrar? Bem, olha como maldito longo deste bloco de código é apenas para fazer algo simples. Agora, como um aparte, como você pode ter visto na seção de super esse passado fim de semana, você não precisa rigorosamente o chaves quando você só tem uma linha de código, mesmo que propusemos mantê-los de modo que ele faz muito mais clara, como em forma de U de zero blocos, o que está dentro do ramo. Mas não seria bom se a superior, quando dada a sua entrada, transformou-o em maiúsculas, se não é, e qual seria ser maravilhoso, no caso oposto, se já é maiúsculo? Apenas passá-lo através e deixá-lo sozinho. Então talvez seja isso. Eu poderia tentar e só espero que ele, mas deixe-me introduzir uma outra coisa. Em vez de usar esta built-in do terminal janela aqui em baixo, lembre-se que este ícone quadrado preto dá-lhe uma maior janela de terminal que eu posso encher tela, se eu quiser? Então não é que eles são uma espécie de estranho nomeado, mas não há essas coisas chamadas man pages, páginas de manual, o homem para breve, e posso aceder a estes por digitando man - o que eu gostaria de escrever? Homem superior. E agora perceber se existe uma funcionar no interior do computador, em Neste caso, o aparelho, que é apenas o sistema operacional Linux, que vai para me dar um conjunto um tanto enigmática de saída, mas você vai encontrar ao longo do tempo que ele sempre está formatado praticamente o mesmo assim que você começar a se acostumar com isso. Observe na parte superior para cima, e é aparentemente a mesma documentação para diminuir. Quem escreveu que estava cortando alguns cantos e colocar tudo em uma página. Propósito destas "coisas em vida é a de converter um carta a maiúsculas ou minúsculas. Observe que em sinopse, a página man está me ensinando que arquivo eu tenho para incluir a usar esta coisa. Ele está me dando as assinaturas para estes funções, ambos, até mesmo embora agora só se preocupam com um. Aqui é agora uma descrição. Para superior converte a letra c em maiúsculas, se possível. Ainda não é instrutivo, mas deixe-me agora olhar abaixo do valor de troca, a coisa que é entregue de volta. Assim, o valor que é retornado do carta ou c convertido se o conversão não foi possível. O que é c? O caráter original. O personagem original e sabemos pelo que, de novo, indo até à sinopse, e quem escreveu isso função apenas decidiu que a entrada para a parte superior e inferior é apenas arbitrariamente vai ser chamado c. Eles poderiam ter chamado mais nada eles querem, mas eles mantiveram simples como c. Então, eu consultei a página do manual. Esta frase me garantiu que, se não é uma letra minúscula, é vai me dar de volta c, o que é perfeita, o que significa que pode se livrar de minha condição de pessoa. Então deixe-me voltar para o Gedit, e agora deixe-me fazer isso. Vou copiar a minha instrução printf. Eu estou indo para ir em frente e à direita dentro o loop de impressão para fora, e obter Livrem-se agora toda essa construção se. Não era uma má idéia, e foi muito muito correto e consistente com tudo o que tenho pregado, Mas não é necessário. Assim que você perceber alguma biblioteca função de que existe alguém escreveu, ou talvez você escreveu em outro lugar o arquivo, você pode usá-lo e realmente começar a apertar o código. E quando eu digo coisas como bom estilo, o fato de que essa pessoa chamada funcionar a superior, ou anteriormente é inferior é incrivelmente úteis porque eles são muito descritivo. Você não gostaria de chamar as funções x e y e z, os quais têm muito, muito menor significado. Qualquer dúvida sobre essa série de melhorias? Então, basta dizer que um dos delivery é mesmo como o seu próprio problema set - talvez um conjunto de problemas, mas certamente P definir dois e para a frente, mesmo quando se está correto não necessariamente significa que eles são perfeitos apenas ou ainda particularmente bem desenhado. Esse é o outro eixo para começar a pensar. Portanto, esta foi uma seqüência dentro de sua memória do computador, mas se você tiver um grupo inteiro de personagens como H-E-L-L-O dentro de RAM, e suponha que em seu programa de chamar obter cadeia várias vezes de tal forma que você chamar obter seqüência de uma vez, então você chamar obter corda novamente. Bem, o que vai acontecer ao longo do tempo? Em outras palavras, se você tem uma linha de código, embora fora de contexto, como string s fica - vamos fazer isso. String nome é igual obter string. Então suponho que essa linha de código se destina pedir ao usuário para o seu nome. Esta próxima linha de código é utilizado para pedir o usuário para a sua escola, e esta linha seguinte, e assim por diante. Suponha que continuo a perguntar o utilizador para outro e outra e outra string. Eles vão ficar na memória ao mesmo tempo. Um não vai espancar o outro. A escola não é substituir o outro. Mas onde eles fazem tudo acabar na memória? Bem, se começarmos a desenhar na tela, que podemos usar essa coisa aqui como um quadro-negro, se esse preto retângulo representa o meu computador de memória, eu vou começar a arbitrariamente dividindo-o em quadrados pequenos, cada um dos quais representa um byte de memória. Francamente, se você tem um gigabyte de RAM nos dias de hoje, você tem um bilhão de bytes de memória em seu computador, de modo um bilhão dessas praças. Então, basta dizer que, este não é realmente a escala. Mas poderíamos ficar tirando todos esses claramente não escala quadrados, e este representa coletivamente memória do meu computador. Agora vamos fazer ponto, ponto, ponto. Portanto, em outras palavras, quando eu agora levar o usuário com a corda get me dar uma string, o que acontece? Se o usuário digita em "Olá", que termina -se em H-E-L-L-S. Mas suponha que o então o usuário tipos de - na verdade, eu não deveria ter feito Olá, porque nós estamos pedindo los por seus nomes. Então, vamos voltar se eu posso fazer isso. Então, se eu digitar D-A-V-I-D para o meu nome, mas lembro que a segunda linha de código foi obter a cadeia novamente para obter a sua escola. Onde é que a palavra que o usuário tipos em indo para ir junto? Bem, talvez ele vai entrar em H-A-R-V-A-R-D. Assim, mesmo que eu tenho desenhado como duas linhas, este é apenas um monte de bytes em sua RAM do computador. Há um problema agora, porque agora se eu sou usando RAM neste muito razoável mas uma espécie de forma ingênua, o que pode aparentemente não distinguir? Onde começa um e onde termina um, certo? Eles são o tipo de borrar juntos. Assim, verifica-se que o computador não faz isso. Deixe-me realmente rolar de volta no tempo a poucos personagens, e ao invés de Harvard vai imediatamente após o nome do usuário, o usuário realmente fica, por trás das cenas, um personagem especial inserido pela computador para ele ou ela. / 0, também conhecido como o personagem nul annoyingly chamado N-U-L, nem N-L-L-L, mas você escrevê-lo como / 0. É que todos os bits zero é um marcador de entre a primeira palavra que o utilizador digitado eo segundo. Então Harvard realmente agora termina como essa seqüência de caracteres e um mais / 0. Assim, em outras palavras, fazendo com que estes valores sentinela, de oito a zero contígua pedaços, agora você pode começar a distinguir um personagem de outro. Então, todo esse tempo que estava "Olá" é na verdade, "Olá" com a / 0, e entretanto, pode muito bem ser um pouco mais memória RAM no interior do computador. Deixe-me fazer uma outra coisa agora. Acontece que todas essas praças temos vindo a desenhar, eles são, sim, cordas, mas mais geralmente, essas coisas são matrizes. Uma matriz é apenas um pedaço de memória que está de volta para fazer a volta para trás, e você normalmente usa uma matriz por meio desta notação colchete. Então, vamos ver estes um pouco ao longo do tempo, mas deixe-me ir em frente e abrir, vamos chamá-lo as idades. E observe o que podemos fazer com estes mesmos truques, um pouco pouco mais de sintaxe aqui. Assim, na linha 17 deste programa - Na verdade, deixe-me executar o programa primeiro para que possamos ver o que essa coisa faz. Deixe-me chamar para fazer as idades compilar este programa. As idades. /. Quantas pessoas estão na sala? Chamá-lo de três. Idade da primeira pessoa? 18, 19 e 20. E agora um pouco ridícula, eu só fizeram um programa que idades os três pessoas. Portanto, há claramente uma oportunidade por alguma aritmética diversão aqui. Felizmente, a matemática está correta. 18 foi para 19, 19 foram a 20 e assim por diante. Mas o que realmente significava ser ilustrativo aqui é a forma como estamos armazenando idades dessas três pessoas. Deixe-me aproximar o que está acontecendo aqui. Então, primeiro, estas primeiras linhas devem estar recebendo bastante familiar. Estou apenas alertando o usuário para a número de pessoas na sala. Então eu estou usando obter int e fazer enquanto a fazer isso de novo e de novo e de novo. Nós vimos que o padrão anterior, mas linha 27 é novo e bastante útil, e se tornará cada vez mais útil. Observe que o que é diferente em linha 27 é que me parece ser declarar um int chamados idades, mas esperar. Não são apenas as idades int. Há esses colchetes, dentro da qual é n. Assim, o suporte n neste contexto, não dentro de uma instrução printf aqui, mas nessa única linha 27, esta linha está dizendo, me n ints dar, cada um dos quais é do tipo int. Portanto, este é um balde, por assim dizer, de, neste caso, três inteiros de volta ao volta para trás para que eu efetivamente tem três variáveis. A alternativa, ser claro, seria este. Se eu quisesse o primeiro aluno idade, eu poderia fazer isso. Se eu quisesse o segundo aluno idade que eu poderia fazer isso. Se eu quisesse o terceiro aluno idade, eu poderia fazer isso. E Deus me livre que precisamos de todo mundo idade nesta sala - Quero dizer, este é um pedaço de um monte de cópia, colar de novo e de novo e de novo. E mais uma vez eu compilar este programa, se outro aluno caminha sobre a daquela porta, agora meu número de variáveis ​​está incorreto. Então, o que é agradável sobre uma matriz é como Assim que você começar a sentir-se copiando e colando, as probabilidades são que é não é a melhor abordagem. Uma matriz é dinâmica potencialmente. Eu não sei com antecedência quantas pessoas vão estar na sala, mas eu sei que eu preciso n delas, e eu vou descobrir n quando chegar a hora. Esta linha de código significa que agora, me dê um pedaço de memória que se parece com isso onde o número de caixas na tela é inteiramente dependente do que n o usuário digitou dentro Então, agora o resto do programa é realmente muito semelhante ao que apenas fiz com os personagens. Repare que eu tenho um loop começando na linha 30. Então, logo depois que eu pegar o array, I iteração de y é igual a zero em até n. Eu só tenho este printf instrutivo mensagem dizendo, dá-me a idade de pessoa #% i, então o número um, número dois, número três. E por que eu fiz isso? Francamente, os seres humanos preferem contar de um em até enquanto cientistas da computação, zerar em cima. cientistas da computação não vai usar esse tipo de programa, por isso estamos vai apenas começar a contar em um como pessoas normais. E agora, em linha 33, observe a ligeiramente diferente pedaço de sintaxe. O i-th idade em que a variável do tipo matriz é indo para obter um int. E agora, finalmente, este é apenas aritmética aqui. Decidi em um circuito separado para reivindicar algum tempo passa, e agora neste circuito separado, estas linhas de executar. Um ano a partir de agora, a pessoa i será i anos de idade, mas observe este não é o variável i. Isto agora é% i para int. E notem como o primeiro espaço reservado, I plug-in i + 1, então contamos como uma pessoa normal. E, em seguida, para o valor de sua idade, para i anos de idade, eu tomo as idades suporte i - e por que eu estou fazendo mais um aqui? Eles só envelhecido. É a minha escolha estúpida de programas. Eles só envelheceu um ano. Eu poderia digitar qualquer número que Na verdade, eu quero lá. Então, qual é, na verdade, todos a relevância aqui? Bem, deixe-me realmente rolar para trás aqui e pintar um quadro do que está por vir. O que vamos fazer com o nosso próximo Problema Set Two é imiscuir-se no mundo da criptografia. Portanto, esta é uma cadeia de caracteres, de modo a seqüência de vários caracteres, eo que que isso diz? Não é na versão on-line dos slides. Então, eu afirmo que isto equivale a isso, uma propaganda estúpida de muitos anos há que possa realmente recordar uma das suas origens. Portanto, este é um exemplo de criptografia ou criptografia. Acontece que, se você quiser na verdade, enviar informações ou partes informações com alguém de forma segura, como uma mensagem como essa, você pode embaralhar as cartas. Mas, normalmente, as palavras são não mexidos aleatoriamente. Eles estão permutados, de alguma forma ou alterados de alguma forma para que - oops. Isso é um spoiler divertido para a próxima vez. Assim, você pode mapear o que é, aparentemente, O para B. Observe que alinha capitalização-wise. Aparentemente, r torna-se e. Aparentemente F-H-E-R torna-se S-L-R-E. Assim verifica-se que há um mapeamento, e em Neste caso, há um muito estúpido mapeamento se alguém descobri-lo? Isso é algo chamado Rot 13, Rodar 13. É o mais estúpido de criptografia mecanismos, porque literalmente acrescenta 13 a cada uma das letras, estúpido no sentido de que se você apenas ter um pouco de tempo livre em suas mãos e um lápis, ou você simplesmente acha que através de sua cabeça, você pode tentar todos os acréscimos possíveis - um, dois, três, ponto, ponto, ponto, de 25 para apenas rodar o alfabeto inteiro, e Eventualmente, você vai descobrir que esta é uma mensagem. Então, se você fez algo parecido com isso em escola primária passando mensagens para o seu melhor amigo, se a sua escola primária professor simplesmente ler através da mensagem e ataque de força bruta a solução, você pode ter começado uma resposta por isso. Agora, é claro, no mundo real, criptografia é mais sofisticada. Este é um trecho do texto de um sistema de computador que tem nomes de usuário e senhas, como quase todos da nossa fazer, e isso é o que sua senha pode olha como se armazenado em seu disco dirigir, mas de forma criptografada. Esta não é apenas uma rotação de letras, A é B e B é C. Esta é muito mais sofisticado, mas usa o que é geralmente conhecido como chave secreta criptografia. A imagem diz o seguinte história com alguns ícones. No lado esquerdo, o que nós temos vamos chamar de texto simples. No mundo da criptografia, plain texto é apenas a mensagem original escrito em Inglês ou Francês ou qualquer outra língua qualquer. Se você quiser criptografar isso, vamos passar lo através de um cadeado pictoricamente, assim de algum tipo de algoritmo, algumas funções ou programa que alguém escreveu que embaralha as cartas espero complicatedly mais do que apenas a adição de 13 para cada um deles. O que você sair desse processo no meio lá é chamado cyphertext. Assim uma espécie de palavra sexy. Significa apenas que é o criptografado versão do texto simples. E somente se você tiver o mesmo segredo, 13 ou menos 13, você é capaz de decifrar uma mensagem como essa. Assim, no Conjunto de Problemas Dois, entre as coisas você vai fazer se no Hacker Edition, você terá que escrever código para quebrar essas senhas, descobrir o que eram e como eram criptografado, embora nós dar-lhe um pouco de orientação ao longo do caminho. Na Standard Edition, introduzimos um par de cifras, a criptografia mecanismos, um chamado César, um chamado Vigenere, que ainda estão cifras de rotação, onde se torna um algo, B torna-se algo, mas você tem que fazê-lo por meio de programação porque há de fato vai ser um segredo chave envolvidos, que normalmente é um número ou uma palavra-chave que só o remetente eo destinatário destes mensagens devem entender. Agora, isso tem realmente encarnações no mundo real. Este, por exemplo, é pouco órfão Anel decodificador secreto de Annie, e você pode realmente implementar essas cifras de rotação - Um torna-se algo, B torna-se alguma coisa - com um par de rodas, uma no lado de fora, uma no lado de dentro de tal forma que se você girar a roda ou o anel, você pode realmente alinhar o cartas com letras diferentes, obtenção de um código secreto. E assim como o gancho para hoje, o que eu pensei que eu iria fazer é um pouco de retrocesso que, se você ligar a TV em 24 de dezembro, você pode assistir a filme ad nauseum para 24 horas em uma fila. Mas, por hoje, eu vou abri-lo aqui e nos dar apenas dois minutos de História de Natal pedagogicamente relevantes com um pouco de sujeito chamado Ralphie. [REPRODUÇÃO] -Que seja conhecido por toda a gente que Ralph Parker é nomeado membro da Orphan Annie pequena segredo círculo e tem o direito de todos as honras e benefícios ocorrendo ao mesmo. -Assinado, Little Orphan Annie. Referendado, Pierre Andre em tinta. Honras e benefícios já com a idade de nove anos. [GRITANDO ON RADIO] Vamos, vamos logo com isso. Eu não preciso de tudo o que cerca de jazz contrabandistas e piratas. -Ouça amanhã à noite para o concluindo aventura do preto navio pirata. Agora, é hora de segredo de Annie Mensagem para vocês, membros de The Secret Circle. Lembre-se, crianças. Apenas os membros do Círculo Secreto de Annie pode decodificar mensagem secreta de Annie. Lembre-se, Annie está dependendo de você. Defina os seus pinos para B2. Aqui está a mensagem. 12, 11, 2 - -Estou no meu primeiro encontro secreto. -25, 14, 11, 18, 16 - -Pierre estava em grande voz hoje à noite. Eu poderia dizer que a mensagem de hoje à noite foi muito importante. -3, 25. Essa é uma mensagem de Annie se. Lembre-se, não diga a ninguém. -90 Segundos depois, estou na única sala na casa onde um menino de nove anos poderia sentar em privacidade e decodificação. Aha, B. Eu fui para o outro. E. A primeira palavra é "ser". S. Ele estava chegando mais fácil agora. U. 25. Isso é R. -Vamos lá, Ralphie. Eu tenho que ir. -Eu vou estar bem para baixo, Ma. Mirabolantes. -T. O. Certifique-se. Certifique-se de quê? Qual foi a Little Orphan Annie está tentando dizer? Certifique-se de quê? -Ralphie, Randy tem que ir. Quer fazer o favor de sair? -Tudo bem, mãe. Eu estarei fora. -Eu estava ficando mais perto agora. A tensão era terrível. O que foi? O destino do planeta pode pendurar na balança. -Ralphie, go gotta de Randy. -Eu vou estar bem para fora para crying out loud. -Quase lá. Meus dedos voaram. Minha mente estava em uma armadilha de aço. Todos os poros vibrou. Era quase clara. Sim, sim, sim, sim, sim. -Certifique-se de beber o seu Ovomaltine. Ovomaltine? Um comercial porcaria? Filho da puta. [FIM REPRODUÇÃO DE VÍDEO] COLUNA 1: Este é CS50, e que será Problem Set Two. Vejo vocês na próxima semana. COLUNA 2: Na próxima CS50, isso acontece. COLUNA 1: Então, um tema que não tem olhou até agora é a de ponteiros de função. Agora, um ponteiro de função é apenas o endereço de um público função, mas muito parecido - filho de um -