[Powered by Google Translate] DAVID J. MALAN: Tudo bem. Este é CS50, e este é o fim da segunda semana. Se você esperar para estar com fome volta a esta hora amanhã, saiba que nós estamos indo a convocação de amanhã como um pequeno grupo, quinta-feira, 1:15 PM. Há essa URL aqui se você gostaria de RSVP. O espaço é limitado, portanto, por favor, perdoe se o formulário foi preenchido pelo tempo que você preencher isso. Outra URL no entanto, que pode ser de interesse é esse. Assim, em apenas cerca de um mês, o curso vai ser disponibilizado tudo o mais amplamente através de EDX, através do qual as pessoas na Internet será capaz de acompanhar, participar no curso bastante activa, na verdade. Eles vão estar usando o aparelho CS50 e CS50 Discutir e na maioria das diversas ferramentas de software que já foram usando este semestre. E uma das iniciativas que gostaria de assumir como uma experiência este ano é para ver o quanto de conteúdo que pode se traduzir em outras línguas faladas e línguas escritas. Então, se você pode ter interesse em participar neste projecto, em que vamos fornecer transcrições em inglês e legendas para o seu curso palestras e shorts e seminários e seções e similares - se você falar fluentemente ou escrever fluentemente outra língua, teríamos amo para acoplá-lo neste projeto, em que você toma em um ou mais dos vídeos, traduzindo-os em uma língua que você conhece muito bem. Para dar-lhe um sentido de interface, não há essa interface de usuário baseada na web que nós vamos usar que irá criar, essencialmente, uma interface de usuário como este. Isso foi me ensinando alguns Halloween atrás. E no lado direito, em preto ao lado destes carimbos de tempo, você vai ver as várias coisas que saíram da minha boca naquele dia. E então abaixo, você será capaz de traduzir para outra língua. Exactamente o que é o mapeamento entre, neste caso, Inglês e, digamos, espanhol. Então, é realmente uma ferramenta muito amigável. Você pode retroceder e avançar muito rapidamente com atalhos de teclado. Então, se você gostaria de participar nesta experiência e ter suas palavras visto e lido por potencialmente milhares de pessoas lá fora, por favor, me sinto livre para participar. Agora uma palavra sobre o gatinho de segunda-feira, para que não nos enviou um excedente mensagem assustadora. Fazer perceber que, como o horário de expediente sugerir e como seções sugerem, o projeto do curso é muito de ter alunos a colaborar e falando para trabalhar com conjuntos de problemas e os problemas juntos. E realmente a linha se resume a, mais uma vez, o trabalho que, em última análise deverá apresentar deve ser o seu próprio. E por isso é, muito sinceramente - em horário de expediente, é totalmente normal - É totalmente de se esperar, mesmo - para estar conversando com algumas amigos ao seu lado. Se ele ou ela está lutando com algum tema, e você é como, oh, bem vamos me dar-lhe um vislumbre de alguma linha de código que eu escrevi. Isso é bom. Isso acontece. E isso é muito favorável, eu acho que, com o processo de aprendizagem. Onde a linha, mais uma vez, fica cruzada é quando a cabeça é inclinada por cima da espécie aqui para segundo longe demais ou minutos para que realmente a ter apenas foi uma oportunidade de desbloqueio para o seu amigo. E, certamente, quando as coisas ficam trocadas via e-mail e Dropbox e semelhante, há também o é a linha. Então, por todos os meios, se sentir confortável e se sentir encorajados a conversar com amigos e colegas sobre Série de Exercícios e muito mais. E só percebe que o que em última análise, apresentar deve ser realmente a produto de sua criação e não outra pessoa. Assim, na mesma linha de criaturas peluches, você pode conheço esse cara aqui. Portanto, este é um filme terrivelmente brega de anos atrás. Alguém aqui viu Spaceballs? Tudo bem. Assim, um bom número aqui. Então esta é a nossa maneira maravilhosamente acadêmica de introduzir finalmente hoje a noção de criptografia. E assim um dos problemas de domínio específico para pset 2, que virá amanhã à noite tarde, é mergulhar no mundo da criptografia, o que é a arte de criptografia ou codificação da informação. E esta última instância, para o mundo da segurança. Agora mais segurança para nós vem na forma de mecanismos muito mundanas. Todos nós temos nomes de usuário e senhas. E todos nós temos nomes de usuários e senhas muito ruins, mais provável. Se sua senha é a mesma em vários sites, que provavelmente não é a melhor idéia, como discutiremos em direção ao fim do semestre. Se sua senha é escrito em uma nota - não é brincadeira - em seu monitor, que também não é necessariamente o melhor projeto, mas bastante comum fenômeno. E se você não está usando criptografia para criptografar suas senhas, elas são particularmente vulneráveis. Então, se você acha que está sendo super inteligente por ter uma palavra oculta documento em algum lugar no seu disco rígido que tem todas as suas senhas, mas ele está em uma pasta que ninguém vai procurar, isso também não é muito mecanismo seguro. E então o que pset 2 irá introduzir é esta arte de criptografia e lutando informações para que coisas como senhas são tudo o mais seguro. De forma a motivar este problema muito no mundo real com um muito não do mundo real cenário, deixe-me apresentá-lo a um dos nossos clipes favoritos aqui deste filme, Spaceballs. [REPRODUÇÃO] -Helmet, você demônio, o que está acontecendo? O que você está fazendo com a minha filha? -Permita-me apresentar o cirurgião plástico brilhante jovem, o Dr. Philip Schlotkin, o homem maior nariz em todo o universo e Beverly Hills. -Sua Alteza. -Nariz trabalho? Não estou entendendo. Ela já tinha um trabalho nariz. Foi um presente de 16 doce. -Não, não é o que você pensa. É muito, muito pior. Se você não me dá a combinação do escudo de ar, o Dr. Schlotkin vontade dar a sua filha de volta seu velho nariz. -Não! De onde você tirou isso? -Tudo bem. Eu vou dizer. Eu vou dizer. -Não, papai, não. Você não deve. -Está bem, minha querida. Eu vou sentir falta do seu nariz novo. Mas eu não vou dizer-lhes a combinação, não importa o quê. -Muito bem. Dr. Schlotkin, faça o seu pior. -O prazer é meu. -Não! Espere, espere. Eu vou dizer. Eu vou dizer. -Eu sabia que ele iria trabalhar. Tudo bem, dê para mim. -A combinação é um. -One. -One. -Two. -Two. -Two. -Três -Três. -Três. -Quatro. -Quatro. -Quatro. Cinco -Cinco. -Cinco. -Assim, a combinação é um, dois, três, quatro, cinco. Essa é a combinação mais estúpida que eu já ouvi na minha vida. Esse é o tipo de coisa que um idiota teria em sua bagagem. -Obrigado, sua Alteza. -O que você fez? -Eu desliguei a parede. -Não, você não fez. Você desligou o filme todo. -Eu devo ter pressionado o botão errado. -Bem, colocá-lo de volta. Coloque o filme novamente. -Sim, senhor. Sim, senhor. -Vamos, Erna. Venha, Gretchen. É claro que você sabe que eu ainda vou ter de cobrá-lo por isso. -Bem, isso funcionou? Onde está o portão? -Funcionou, senhor. Nós temos a combinação. -Grande. Agora podemos tomar todas último suspiro de ar fresco do planeta Druidia. Qual é a combinação? -Um, dois, três, quatro, cinco. -Um, dois, três, quatro, cinco? -Sim. -Isso é incrível. Eu tenho a mesma combinação na minha bagagem. Prepare Spaceball 1 para partida imediata. -Sim, senhor. -E mudar a combinação na minha bagagem. -Ai! [REPRODUÇÃO FIM] DAVID J. MALAN: Um filme surpreendente que você deve ver agora tudo. Assim, no contexto aqui é que, com dados inseguras vem uma oportunidade para criptografá-lo e para embaralhar-lo. E de modo que este, por exemplo, é um exemplo de uma mensagem encriptada. Isso realmente diz algo em Inglês. Mas não é claramente totalmente óbvio. E vamos fechar o círculo hoje a separar o que este segredo mensagem aqui é. Mas no mundo real dos computadores, as coisas nem sequer olhar como eles pudessem ser frases em inglês. Por exemplo, este é o que você pode encontrar em um padrão do Linux ou Mac ou Unix computador em um arquivo que foi uma vez chamado de arquivo de senha. Hoje em dia, ele foi transferido para outros lugares. Mas se você olhar no lugar certo em um sistema, você vai ver não só o seu nome de usuário ou a de outras pessoas sobre o sistema, mas você vai ver um versão criptografada de sua senha. De fato, a cripta palavra ali sugere que as seguintes coisas são criptografados. E esta série de letras aparentemente aleatórias e personagens e números e assim por diante pode ser decifrada apenas por geralmente sabendo algum segredo - uma palavra secreta, um número secreto. E assim, de fato, a arte de criptografia, em última análise resume-se a confiança de alguns tipo e saber algo que alguém não faz. Vamos explorar isso em detalhes um pouco mais hoje e no pset para vir. E agora uma palavra sobre passa / falha. Assim, principalmente, como alguns de vocês já mergulhou pset 1, o aparelho, e um mundo muito novo para si, percebeu que as frustrações e dificuldades confusão e apenas técnica são de se esperar. Especialmente com o pset primeiro, onde há tanta coisa nova, apenas começando familiarizado com ls e cd e todos estes comandos arcanos em um novo ambiente. E isso é separado do material real e própria programação. Assim, perceber, também, que há certamente expediente que existem como a estrutura de suporte. Seções começam no próximo domingo. Mas o mais importante, se você está se sentindo só que este não é o mundo para você, perceba que ele realmente é apenas levar tempo. E se não fosse por essa oportunidade há anos para me de tomar uma classe aprovação / reprovação, honestamente, eu nunca teria sequer pôs os pés na sala de aula. E você pode mudar isso até, digamos, a segunda-feira quinta do curso. Então, se você está na borda agora, perceber que, em vez de cabeça em algum outro águas completamente, que certamente considerar apenas mudando de aprovação / reprovação. Novamente, não há realmente esta cultura aqui em Harvard de levar as coisas passa / falha uma vez que todos realmente quer alcançar ou overachieve. Mas, francamente, esta é uma ótima maneira de tentar algo que talvez não ser familiar para você. E você vai acabar fazendo, na maioria dos casos, bastante finos, talvez para sua grande surpresa. E, em termos mais concretos, o que eu acho que passa / falha geralmente faz, especialmente no que você pode ter experimentado com pset 0, se você colocar em 10 horas, 15 horas, 25 horas em alguns pset - e você está apenas batendo sua cabeça contra a parede, e está ficando super tarde, à noite, mas você tomou o pset como 90% do caminho, você sabe que você simplesmente não consegue descobrir uma coisa - passa / falha realmente leva a borda fora de uma classe como este, onde você pode classificar de dizer felizmente tudo bem, eu sei que não é perfeito. Mas eu trabalhei pra caramba sobre isso. Estou muito feliz com o local onde ele foi parar. E que vão atender as expectativas de aprovação / reprovação. Assim que manter isso em mente. Tudo bem. Então, aqueles de vocês que têm se esforçado para usar a Universidade de Harvard Wi-Fi saber que há um SSID CS50, uma conexão Wi-Fi por aí que você poderia ter melhor sorte para. É um pouco irônico que a senha para isso - se você gostaria de experimentar ligação a este para melhores velocidades e deixe-nos saber se não é melhor - é um, dois, três, quatro, cinco, todo o caminho até oito por oito é mais seguro do que cinco. Então, se você precisa da senha de acesso Wi-Fi, conecte-se sem fio CS50 aqui. Um, dois, três, quatro, cinco, seis, sete, oito. E pós em CS50 Discutir se você ainda tiver problemas intermitentes de conectividade, e vamos deixar que os poderes que conhece para este espaço. Tudo bem. Então, um teaser rápido, especialmente para aqueles de vocês que são meninos ou meninas de fãs de todas as coisas da Apple. O que eu retirado de alguns anos atrás era este arquivo aqui, ilock.c, apenas para tipo de tornar mais concreto e mais complexa alguns dos mais básicos C programas que tenho escrito. Então eu abri o arquivo, ilock.c. Ele está disponível na página de palestras para hoje. No lado esquerdo, você verá uma longa lista de funções. Assim, o sujeito que escreveu este escreveu um monte de funções, mais do que apenas principal. Ele usou um monte de bibliotecas aqui. E se começarmos a percorrer, o que isto realmente é é o próprio primeiro, eu acredito, crack para o iPhone original. Quando você queria fazer o jailbreak do iPhone original, o que significa untether -os da AT & T e, na verdade, instalar um software especial sobre ele e fazer as coisas que a Apple não quer que as pessoas fazem - Bem, alguém teve tempo para descobrir exatamente como eles poderiam explorar falhas de software, erros, bugs, no software da Apple. E assim nasceu ilock.c. Que se você compilou em um computador e instalá-lo em um iPhone que foi conectado ao computador através de, por exemplo, um cabo USB, este lhe daria privilégios administrativos ou de raiz no seu iPhone e deixá-lo fazer muito bem o que quiser. E assim houve este gato fascinante e rato entre a Apple e o resto do mundo, em particular no que se, como muitas empresas, tentar bloquear suas coisas para baixo assim que você só pode fazer com ele o que eles pretendem. Mas, graças a pessoas como esta e sua compreensão de baixo nível detalhes e, neste caso, de programação C e um monte de as construções familiares que já começou a jogar com, você é realmente capaz de alavancar o hardware de uma maneira que achar melhor e não necessariamente uma entidade corporativa. Assim, por exemplo, eu não tenho idéia do que tudo isso está fazendo. Mas GetVersion soa bastante simples. E parece que essa é uma função que a pessoa escreveu. Tomar algum tipo de número inteiro como argumento, não retorna nada, mas parece loop com um laço e um aqui se a condição, se a condição, quebrar, e de alguma forma se relaciona com números de versão. Se rolar - mesmo que muitas destas palavras-chave vai ser novo, e há uma série de funções no aqui nunca vimos e talvez nunca mais ver o curso do semestre - no final do dia, ele segue as mesmas regras e lógica que temos sido jogando com até agora. Portanto, este é velho demais para quebrar seu iPhone ou 3s 4s ou 5s em breve, estes dias, mas sei que está tudo muito derivado deste mundo que temos mergulhou. Então, vamos dar uma olhada em um exemplo um pouco mais simples. Este, apenas para se aquecer com uma sintaxe e também alguns outros dados tipo que temos falado, mas realmente não tenho visto em C. Portanto, este é um arquivo chamado positive1.c. E por os comentários no topo, isso só exige que o usuário fornecer um número positivo. Então, é um exemplo de um loop do-tempo, o que é bom para o usuário interativo programas em que você precisa dizer ao usuário para fazer alguma coisa. E se eles não cooperarem, você gritar com eles ou rejeitar a sua entrada. O caso em questão, eu vou fazer linhas 19 a 24, desde que o usuário tem Não me dado um número positivo. Agora esse detalhe aqui na linha 18, por que eu declarar n acima de toda essa construção de loop em vez de ao lado da linha 22, onde eu realmente importa para obter n? Sim? [Inaudível] DAVID J. MALAN: Sim, então essa questão do escopo. E em termos de leigo, o que âmbito se refere? Sim? [Inaudível] DAVID J. MALAN: Você pode falar um pouco mais alto? COLUNA 1: Onde você pode acessar uma variável particular. DAVID J. MALAN: Perfect. Onde você pode acessar uma determinada variável. E, geralmente, a regra de ouro até agora tem sido a de que o alcance de algumas variável é definida pelos aparelhos mais recentes encaracolados que você já viu. E por isso, neste caso, se eu cometi o erro de declarar n na linha 22, que a linha iria trabalhar. Gostaria de obter um int, e gostaria de colocá-lo em que n variável na linha 22. Mas qual linha de código que agora não tem idéia do que eu estou falando? Assim, 25, e verifica-se 24, bem como, porque, neste caso, ele está fora das chaves. Então, um pouco de incômodo, mas muito fácil de resolver, simplesmente declarando a variável fora da própria função. Agora vamos ver mais tarde hoje, você pode ir um passo além. E você pode até ficar um pouco preguiçoso - e isso não está a ser recomendado, em geral - mas você pode até ficar com preguiça e colocar uma variável globalmente, por assim dizer, não dentro de uma função, e não dentro de um laço, mas o arquivo em si, fora de todas as funções que você escreveu, como eu fiz aqui na linha 15. Mas este é geralmente desaprovado. Mas que esta é uma solução, por vezes, a outros problemas, como veremos eventualmente ver. Então, por agora, vamos deixá-lo assim. Mas vamos ver se podemos reescrever isso só para começar a expressar-nos um pouco diferente. Portanto, este programa, só para ficar claro, é positive1. Deixe-me ir à frente e aqui na minha janela de terminal fazer positive1, Enter. Compila, tudo bem. Eu vou correr positive1, pressione Enter. Eu exijo que você me dê um número inteiro positivo. Eu vou dizer -1. Isso não funcionou. 0, 99, que parece funcionar. Talvez não o teste mais rigoroso. Mas pelo menos é um teste de sanidade bom que estamos no caminho certo. Então, agora deixe-me ir em frente e abra a versão dois deste. E o que é diferente já? Ele implementa a mesma coisa. Mas o que está pulando fora tão claramente diferente desta vez? Sim, assim que este bool em verde. Gedit tem destaque na palavra-chave deste verde conhecida como bool, que é um tipo de dados. Ele não vem construído em a todas as versões de C. Você precisa incluir um biblioteca específica. No nosso caso, incluí a biblioteca para que CS50 ter acesso a bool. Mas, na linha 18, parece que temos um valor booleano aqui chamado agradecido. Então, eu poderia ter chamado este nada. Mas eu liguei para ele grato apenas para transmitir algum tipo de significado semântico. Portanto, inicialmente na linha 18, eu não sou aparentemente grato porque o Valor booleano grato é inicializado como false na linha 18. E então parece que eu fiz aqui em linhas de 21 a 23 é que eu acabei de tipo de reescrita minha lógica. Portanto, não funcionalmente diferente. Mas, na linha 22, agora, posso verificar se o int o usuário tenha fornecido é maior do que 0, então eu simplesmente alterar o valor de grato a verdade. E por que eu faria isso? Porque, na linha 25, aparentemente, eu estou indo para verificar uma condição. Faça isso loop while grato é falsa. Então eu proponho isso como uma alternativa para uma versão porque é pelo menos um pouco mais intuitivo, talvez. É um pouco mais fundamentada em Inglês. Então faça o seguinte enquanto você não está grato ou agradecido enquanto é falso. E desta vez, também, eu aparentemente não se importa lembrar que o usuário digitou no aviso, porque não há nenhuma variável n. Então, na verdade, eu - uma pequena mentira lá. Funcionalmente, o programa é um pouco diferente, uma vez que chegar ao fundo da porque eu não estou lembrando o que n é. Mas eu queria demonstrar aqui também que mesmo que temos visto e GetInt GetString ser utilizado no lado da mão direita de um sinal de igual modo que, até agora, lembrarmos o valor, tecnicamente, isso não é estritamente necessário. Se por qualquer motivo você simplesmente não se importam para salvar o valor, você só quer para verificar o valor, observe que podemos simplesmente escrever isso como GetInt aberto paren, paren perto. Essa função vai retornar um valor, como temos vindo a dizer. Vai lhe dar de volta um int. E se você acha que mentalmente de isso acontecer, quando eu digitar 99, GetInt devolve o número 99. E assim, conceitualmente, é como se o meu código eram, na verdade isso. Então, se 99 é de fato maior que 0, então grato se torna verdade. Então percebe ooh linha 25, estamos a fazer porque eu sou grato agora. E na linha 26, nós simplesmente dizer, obrigado pela inteiro positivo, o que quer que passou a ser. Agora vamos fazer açúcar sintático ligeiro aqui, por assim dizer. Vamos ver se conseguimos limpar essa linha 25 com essa variação terceira e última em positive3. Então, observe a única diferença agora é que linha de código? Sim, então 25. E nós não temos realmente visto esse truque ainda. Mas fez ver o ponto de exclamação na segunda-feira, o que denota o quê? Então, não, negação ou. Então, ter um valor booleano e virar o seu valor. Verdade torna-se falsa. Falso se torna verdadeiro. Então isso, eu gostaria de propor, é até um pouco mais intuitiva de um modo de escrever o código, porque eu ainda inicializar grato a falso. Eu continuo a fazer o seguinte. Eu defini grato a verdade quando chegar a hora. Mas agora você pode realmente apenas traduzir este código verbalmente esquerda para a direita, enquanto não agradecido. Porque bang, ou ponto de exclamação, denota a noção de não, então enquanto Não agradecido. Então, novamente, não introduziram novos conceitos em si. Nós conversamos sobre Booleanos para trás quando nós tocamos com o Scratch. Mas percebo agora podemos apenas começar a escrever o nosso código em muitas maneiras diferentes. Assim, especialmente no pset1, se você é uma espécie de luta para descobrir a maneira de escrever um programa, a probabilidade de que você está com sorte porque não vai ser qualquer número de soluções que você pode acontecer em cima. Por exemplo, este é apenas três, mesmo para o mais simples dos programas. Tudo bem. E agora recordar na segunda-feira, que deixou esta nota com valores de retorno. Assim, para a primeira vez, nós escrevemos um programa que não tem apenas principal, também tem sua própria função personalizada que eu escrevi aqui. Assim, na linha 31 a 34, eu implementei uma função cubo. Não é complexo. É apenas uma vezes vezes um, neste caso. Mas o que é importante sobre o que é que eu estou tendo de entrada na forma de um e Estou retornando a produção na forma de vezes vezes um. Então agora eu tenho a capacidade, tanto como eu costumava fazer com printf sozinho, para chamar esta função chamando a função cubo. E a função cubo leva algum entrada. E a função cubo retorna alguma saída. E assim por contraste, printf apenas fiz algo. Ele não retornou qualquer coisa que importava - mesmo que, como um de lado, ele faz retornar um valor. Você geralmente só ignorá-lo. Printf apenas fiz algo. Ele tinha um efeito colateral de impressão à tela. Em contraste aqui, temos a função de cubo, que na verdade, retorna algo. Portanto, esta é geralmente - para aqueles familiarizados com isso, é uma idéia bastante simples. Mas, para os menos familiarizados com esta idéia de passar em insumos e obter saídas de volta, vamos tentar apenas algo simples super. Alguém está confortável chegando no palco brevemente? Você tem que estar confortável com uma câmera em você, também. Sim. Ok, qual é o seu nome? KEN: Ken. DAVID J. MALAN: Ken. Tudo bem, Ken. Vamos para cima. Então Ken vai ser uma função do tipo aqui. E vamos em frente e fazer isso. Vamos pegar um pouco de fantasia. Prazer em conhecê lo. Bem-vindo ao centro do palco. Tudo bem. Vamos bater este botão aqui. Tudo bem. Então aqui você tem um quadro moderno. E o que eu sou é a função principal, por exemplo. E eu não tenho um iPad na mão. Eu realmente não me lembro como - bem, na verdade, não posso dizer isso. Eu realmente não tenho boa caligrafia. E assim, portanto, eu quero que você imprimir algo na tela para mim. Então, eu estou sendo o programa principal. E eu vou ter que dizer isso por escrito na minha zero frango e em seguida, passando-lhe uma entrada. Assim como boba que este exercício é, a noção de funções e chamar um função e retornar uma função na verdade se resume a isso. Estou principal. Acabo de escrever printf ("algo") na tela. Estou executar esse programa. E logo que printf é chamado, ele tem um argumento - ou um parâmetro, às vezes - entre aspas duplas. Aqui é que o argumento. Estou passando-a para Ken. Agora ele é uma caixa preta escrito algum número de anos que, aparentemente, só sabe como imprimir coisas na tela. Então, execute. Isso não é ruim. Então, muito bom. Então, agora é feito Ken execução. Será que ele precisa me dar nada em troca? Portanto, não que temos visto até agora. Mais uma vez, printf faz realmente retornar um número. Mas vamos ignorar que, por agora, porque nunca usei. Então é isso para Ken. E agora principal volta a executar - principal assume o controle do programa novamente, porque essa linha de código, printf, é feita a execução. E nós vamos sobre nosso modo de executar o que quer que as outras linhas estão lá. Tudo bem. Então, agora vamos tentar um exemplo um pouco diferente. E este tempo aqui, vamos primeiro limpar a tela aqui. E desta vez, vamos fazer a função de cubagem. Mas, desta vez, espero um valor de saída. Então, vamos em frente e fazer isso. Então agora eu tenho uma linha de código que diz que x = cubo (x). Então, na verdade vamos - a linha de código, recall, se parece com isso. x = cubo (x). Então, como é que isto vai funcionar? Então, vamos em frente e dar-lhe uma tela branca novamente. E eu vou escrever agora para baixo o valor de x, que neste momento tempo passa a ser, digamos, 2, para mantê-lo simples. Então, eu tenho escrito em um pedaço de papel o valor de 2, qual é o meu valor x. Eu entregá-lo a Ken. KEN: E eu só escrever a resposta? DAVID J. MALAN: Sim, vamos apenas escrever a resposta. Okay. E agora ele tem de voltar-me algo. Então - perfeito. Segue agradável. Então, agora ele me dá de volta o valor de 8, neste caso. E o que eu faço com ele? Bem, na verdade, vamos ver. Obter este direito. O que eu vou fazer com ele? Agora eu vou levar esse valor e, na verdade, armazená-lo naqueles mesmos bits na memória. Mas aviso, eu sou o tipo de luta aqui. Eu estou um pouco confuso, porque onde eu realmente escrever o valor de x? Porque o que eu acabei de fazer é fisicamente mão Ken um pedaço de papel que tinha o valor 2, que foi x. E, de fato, isso é precisamente o que acontece. Assim, verifica-se que quando você chamar uma função, e você passa um argumento como "Olá mundo" ou você passa um argumento como 2, geralmente, você está passando uma cópia do argumento. E assim como eu escrevi o número 2 aqui e entregou-a a Ken, o que deve significa que eu ainda tenho uma cópia do 2 valor em algum lugar. Porque na verdade, agora que eu comecei de volta o valor 8, eu preciso voltar no RAM e realmente escrever 8, onde uma vez eu tive o número 2. Então lembre-se visualmente essa noção de passagem em literalmente uma cópia do valor. Ken faz sua coisa, me dá de volta algo - neste caso, um valor como 8. E então eu tenho que fazer alguma coisa com esse valor, se eu quer mantê-lo por perto. Então, tudo isso será muito familiar antes do tempo. Muito obrigado por esta demo aqui, Ken. Tudo bem. Muito bem feito. Então, vamos ver como é que, em última análise relaciona-se com algumas das funções chamada que estamos fazendo aqui. Então deixe-me ir em frente e nos trazer de volta ao exemplo cubagem aqui. E perceber que, se queremos realmente começar a tomar isso ainda mais, vamos ter que estar atentos ao fato de que o número x que está sendo passado aqui é diferente do que realmente está sendo passado para a função. Então, novamente, este passou por cópia vai tornar-se bastante Germano em apenas um momento. Então, vamos dar uma olhada em algo que não funciona muito bem certo ainda. Eu estou indo para ir em frente e abrir um exemplo de buggy terceiro, que é falho por natureza. E ele é chamado buggy3, e implementa uma função de troca. Portanto, temos aqui uma função principal que x e y arbitrariamente inicializado para 1 e 2, respectivamente. Nós poderíamos usar GetInt, mas só precisamos de um exercício simples. Então é codificado como 1 e 2. Em linhas 21 e 22, que, aparentemente, imprimir x e y, um por linha. Em seguida, na linha 23, eu afirmo que estou trocando estes valores, ponto, ponto, ponto. Eu aparentemente chamar uma função na linha 24 chamado de swap que leva dois argumentos. É totalmente legítimo para as funções de tomar dois argumentos. Temos visto printf fazê-lo já. Assim, aparentemente, tem de permuta x e y. E, como o próprio nome sugere, eu espero que ele vai trocar esses dois valores. Então eu reclamar na linha 25, trocados. E I reimprimir x e y com base no pressuposto de que eles de fato foram trocados. Mas se eu realmente executar este programa - deixe-me abrir uma janela de terminal. Deixe-me fazer buggy3. Como o nome sugere, este não vai acabar bem. Porque quando eu pressione Enter, observe que x é 1. y é 2. E ainda, ao final do programa, eles ainda são, na verdade, a mesma coisa. Assim, com base na demonstração apenas agora com Ken, o que está realmente acontecendo? Bem, vamos mergulhar nesta função swap. É super curto. É apenas algumas linhas de código longo. Mas qual é o problema fundamental, baseado na história simples contada aqui com Ken? Por que a troca de partido? [Inaudível] Exatamente. Então, nós estamos armazenando a uma cópia, e não a própria variável. Em outras palavras, troca aparentemente tem dois argumentos, um int. E é arbitrariamente chamado a e b. E aqui em cima, eu passei em X e Y, que são, respectivamente, 1 e 2. Mas eu não estou literalmente passando x. Eu não estou literalmente passando y. Estou passando uma cópia de x e uma cópia do y. É como se quase como se você copiado e colado em trocar os valores que você quer que ele realmente manipular. Então, se esse é o caso, quando eu, o programa, iniciar a execução linha 35, depois 36 - quando eu chegar à linha 37, neste ponto da história, o que é o valor de uma? Neste ponto da história, linha 37, que é o valor de um, neste ponto? Por isso, deve ser apenas uma. Certo? Como x foi passado como o primeiro argumento. E essa função apenas arbitrariamente está chamando seu primeiro argumento, a. Da mesma forma é y, o segundo argumento. E está apenas arbitrariamente chamar a b segundo argumento. Agora essa dicotomia é, na verdade, bastante simples explicou. Pense sobre isso. Nenhum de nós conheceu a pessoa que escreveu printf. Assim, certamente, ele ou ela não tem idéia do que nossas variáveis ​​30 anos mais tarde vão a ser chamado. Então, tem que haver uma distinção entre o que você chama de variáveis ​​em funções que você está escrevendo e que vocês chamam de variáveis ​​em funções que você está chamada ou usando. Portanto, em outras palavras, eu escrevi minhas variáveis ​​como x e y. Mas, se alguém tinha escrito a função swap, ele ou ela certamente não sei o que meus variáveis ​​vão ser chamados. Então percebe que é por isso que você tem essa dualidade de nomes. Tecnicamente, eu poderia fazer isso por coincidência. Mas eles ainda ser passado como cópias. Seria apenas pura coincidência esteticamente se essa pessoa que escreveu troca tinha usado os mesmos nomes. Tudo bem. Portanto, neste ponto da história, linha 37, um é um. b é 2. E agora devo proceder para trocá-los. Bem, primeiro de tudo, deixe-me realmente fazer isso muito mais simples. Eu não sei o que essas três linhas de código foram fazendo. Deixe-me fazer isso. b recebe um. obtém um b. Concluído. Por que isso é quebrado, logicamente? É o tipo da coisa intuitiva, certo? Assim, torna-se um b. E torna-se um b. Mas o problema é que, assim como a linha 37 é executada, o que é o valor de a e b? O mesmo, 1. Porque você já derrotado, por assim dizer, você mudou b para igualar um. Portanto, uma vez linha 37 é executado, isso é ótimo. Você agora tem duas cópias do número 1 dentro desta função. Então quando você diz na linha 38, um fica b, bem, você é do tipo de rosca. Porque você está apenas a atribuição de 1 a 1. Você meio que perdi o valor que você se preocupava. Assim, na versão original do presente, observe o que eu fiz. Eu em vez teve uma terceira linha de código que era assim. Eu declaro uma variável temporária - tmp é um nome muito comum para uma variável temporária. É um int porque tem que coincidir com o que eu quero fazer uma cópia. Eu armazenar uma cópia de um dentro de tmp. Portanto, uma vez linha 37 foi executado, o valor de a é - sanidade rápido check - 1. O valor de b é 2. E o valor do tmp também é 1. Então agora eu executar a linha 38. Assim, uma vez linha 38 é executado, uma toma o valor de b. E b foi 2. Assim, é agora um 2. Então, neste ponto da história, um é de 2, b é 2, tmp e é 1. Então, agora, logicamente, nós podemos apenas valor tmp plop de em b. E estamos a fazer. Então nós resolvemos esse problema. Infelizmente, quando eu executar este programa sob esta forma, que na verdade não trocar quaisquer valores. Mas, para ser claro, por quê? Corrigi o problema lógico de um momento atrás. Mas, novamente, se eu executar este programa, X e Y permanecem inalteradas até o final de execução do programa. [Inaudível] DAVID J. MALAN: Então nós não retornaram nada. Então, isso é verdade. Mas acontece que há um pouco de um problema aqui, porque, até agora, o única coisa que tenho sido capaz de voltar é uma coisa. E esta é uma restrição de C. Você só pode retornar um valor realmente, caso em que, eu sou o tipo de preso aqui porque eu poderia retornar o novo valor de x ou que eu poderia voltar a novo valor de y. Mas eu quero os dois de volta. Então, retornando não é a solução simples aqui. Mas o problema fundamental é por quê? O que nós realmente trocados? a e b. Mas a e b são cópias de x e y, o que significa que apenas fez tudo isso trabalhar - só passou uns três minutos falando sobre a troca função e todas estas três variáveis. E isso é ótimo, perfeitamente correto em isolamento. Mas e âmbito de b é só nestas linhas aqui. Então, tal como um loop, se você declarar um inteiro i para dentro da loop - da mesma forma, se você está dentro de declarar a e b de uma função que você escreveu, eles são apenas válido dentro dessa função. O que significa que, logo que swap é feito execução e nós vamos de linha de 24 a linha 25, x e y não foram alteradas de forma alguma. Você desperdiçou apenas um monte de tempo a troca de cópias de variáveis. Assim, verifica-se que a solução para isso é, na verdade, não óbvia. Não é bem suficiente para retornar valores porque nós podemos retornar apenas um valor. E eu realmente quero trocar x e y ao mesmo tempo. Então, vamos voltar a isso. Mas, por agora, perceber que a questão fundamental deriva do fato de que a e b são cópias. E eles estão em seu próprio escopo. Bem, vamos tentar resolver isso de alguma forma. Deixe-me realmente rolar de volta aqui e abrir-se, digamos, uma quarta variante disso, buggy4. E o que sobre isso? Este é um problema semelhante, mas mais simples de olhar antes de tomar uma facada resolvê-lo. Este programa é chamado de incremento. E aparentemente inicializa um inteiro x 1 em linha 18. Eu, então, afirmar que x é 1. Eu, então, afirmam incrementando, ponto, ponto, ponto. Eu, então, chamar incremento. Mas, então, em linhas 22 e 23, eu afirmo que tem sido incrementado. Eu reivindico x é agora o que quer que seja, 2 presumivelmente. Mas este programa é buggy. Qual é o problema? Sim? [Inaudível] DAVID J. MALAN: Exatamente. Então x foi declarada, obviamente, na linha 18. Que está dentro de chaves principais de. Portanto, a resposta simples é que, bem, x existe aqui. Ela não existe na linha 32. Portanto, este programa realmente não vai nem compilar. O compilador, quando eu tentar compilar esse código, vai gritar comigo sobre alguns identificador não declarado ou alguma coisa nesse sentido. Na verdade, vamos tentar. Esta é fazer buggy4. Não é. Use de x identificador não declarado na linha 32. E, na verdade, vamos ser mais explícito aqui hoje para que esta seja útil em horário de expediente e em casa. Observe que é um pouco enigmática escrita. Mas o fato de que Clang tem gritado, dizendo buggy4.c: 32:5, é realmente útil. Isso significa que o erro está na linha 32 na posição de cinco caracteres. Então, um, dois, três, quatro, cinco. Isso é, de fato, onde está o problema. E também para manter em mente na hora de escritório e em casa, tenho sorte aqui. Eu tenho um erro. Vai ser relativamente fácil de corrigir. Mas se você receber uma tela cheia de mensagens de erro esmagadora, mais uma vez, perceber que o mais inferior pode ser apenas sintomático da os de nível superior. Então, sempre perseguir seus erros a partir de cima para baixo. Porque não pode ser apenas um efeito em cadeia que está sugerindo que você tem problemas de maneira mais do que você realmente faz. Então, como poderíamos corrigir isso se meu objetivo é incrementar x? O que é isso? Okay. Assim, podemos fazer x global. Vamos pegar o atalho que eu avisei sobre a anterior. Mas que diabo, só precisamos de uma solução rápida. Então vamos apenas dizer int x aqui. Isso faz x global. Então, agora principal tem acesso a ele. E incremento tem acesso a ele. E então deixe-me ir em frente e compile isso agora. Faça buggy4, Enter. Parece compilar. Vamos correr buggy4, e parece realmente funcionar. Agora, esta é uma dessas coisas - faça o que eu digo, não o que eu faço, como eu acabei de fazer aqui. Porque, em geral, os nossos programas vão ficar muito mais interessante e muito mais do que isso. E se a sua solução para os problemas da vida é apenas ah, colocar todo o variáveis ​​no topo do seu arquivo, muito rapidamente fazer programas de obter terrivelmente difícil de gerir. Fica mais difícil de pensar em novos nomes de variáveis. Fica mais difícil de entender o que está fazendo o que variável. E assim, em geral, isto não é uma boa solução. Então, vamos fazer isso melhor. Nós não queremos usar uma variável global aqui. Eu quero incrementar x. Então, eu poderia, obviamente - no final do dia, é uma espécie de uma história boba, porque acabamos de fazer isso. Mas se eu não sabia sobre esse operador, ou eu não tinha permissão para mudá-lo em principal em si, de que outra forma eu poderia implementar Ken aqui, este tempo de cubo, mas não para incrementar? Como faço para mudar esta coisa aqui? Sim. [Inaudível] DAVID J. MALAN: Ok, muito bom. Então, por que não eu passar em x? E então, em vez de devolvê-lo, por que não eu só faço retorno x + 1? Agora, mais algumas coisas têm que mudar aqui. Eu estou no caminho certo. O que mais eu preciso para ajustar? Alguém. Sim? [Inaudível] DAVID J. MALAN: Eu preciso alterar o tipo de retorno de incremento porque não está vazio. Vazio não significa nada está sendo devolvido. Mas, claramente, agora é. Então, isso precisa mudar para int para ser coerente com o que Na verdade, estou voltando. Agora outra coisa ainda é de buggy aqui. Sim? [Inaudível] DAVID J. MALAN: Então eu preciso incrementar x? [Inaudível] DAVID J. MALAN: Ah, então eu preciso passar x. Então eu preciso fazer isso aqui. Assim, o protótipo, eu tenho que mudar isso aqui. Portanto, este tem de se tornar um int. Isso tem de se tornar - hmm. Na verdade, tenho um bug aqui. Vamos corrigir isso primeiro. O que isso realmente deve ser? Então, ele tem que ser uma coisa int. Poderia ser x. Mas, francamente, se você começar a chamar toda a sua x variáveis, que vai começar menos e menos claro qual é qual. Então vamos escolher arbitrariamente uma convenção de nomenclatura diferente para o meu funções auxiliares, as funções que estou escrevendo. Vamos chamar-lhe um. Ou poderíamos chamá-lo - vamos chamá-lo even_number ser ainda mais explícito. Então eu tenho que devolver qualquer que seja o número é acrescido de 1. E agora eu tenho que mudar uma coisa aqui e um outra coisa aqui. O que eu tenho que mudar na linha 21 em primeiro lugar? Eu tenho que atribuir a x. Então eu não posso apenas chamar x incremento. Preciso lembrar a resposta, alterando o valor de x em o lado esquerdo. E mesmo que x é agora à esquerda e à direita, que é totalmente bom porque o lado direito é executado primeiro, então, é se jogou na esquerda coisa mão, x, neste caso. E então, finalmente, este é um reparo fácil agora. Este deve apenas combinar o que há lá embaixo. Número int. Tudo bem. Então, um monte de mudanças para uma função muito estúpido. Mas representante das coisas que nós vamos cada vez mais quer fazer. Então faça buggy4. Eu estraguei tudo em algum lugar. Oh, meu Deus. Cinco erros em, tipo, um programa de seis linha. Então, o que há de errado na linha 18, o personagem de 5? Tudo bem. Então eu tenho que declarar este int. Tudo bem. Então vamos ver, um monte de outros erros. Oh meu deus. 19, 18, 21. Mas, novamente, vamos limpar a tela - L controle aqui - e re-run Clang. Então, cinco problemas que na verdade é apenas uma. Então, agora vamos executar buggy4, Enter. Ufa. x foi incrementado corretamente. Tudo bem. Qualquer dúvida sobre como incrementar números? Sim? SPEAKER 2: Por que é que você pode simplesmente mudar para o número x na variável nomear e ele vai saber o que você quer dizer? DAVID J. MALAN: Boa pergunta. Como é que eu posso simplesmente mudar para o número x eo programa vai saber imediatamente? Então, novamente, pensar nele como essa abstração. Então, se eu sou principal e Ken é incremental, francamente, eu não me importo o que Ken chama seu iPad. Eu não ligo para o que ele chama de nada que tenha a ver com a sua implementação essa funcionalidade. Portanto, este é um detalhe de implementação que eu, principal, não tem que se preocupar. E assim simplesmente mudar consistentemente dentro da função, número aqui e número aqui, é tudo o que preciso tanto tempo como eu recompilar. É uma espécie de gosto, se você pensar - muitos de nós, aqueles de vocês com motorista licenças que já percorridos, ou se você mesmo conduzido em um carro - a maioria de nós não tem idéia de como um carro funciona debaixo do capô. E, literalmente, se você abrir o capô, a maioria de nós - eu incluído - não estão indo para realmente saber o que estamos olhando. Tipo de como você pode se sentir com coisas como esta agora. Mas nós realmente não precisa se preocupar como o carro funciona. Nós não temos de cuidar o que todos os bastões e pistões e cabos dentro de o carro está realmente fazendo. Portanto, algo como o que vocês chamam o pistão não importa aqui neste caso. Mesma idéia. Sim? [Inaudível] DAVID J. MALAN: Se houvesse mais usos do momento xa variável atrás, você, programador, teria que mudar todos os lugares. Ou você pode literalmente fazer menu Arquivo, e, em seguida, localizar / substituir, algo assim. Mas você vai ter que fazer essas mudanças mesmo. Você tem que ser consistente. [Inaudível] DAVID J. MALAN: Uma ordem particular, como aqui? Se este era int outro número? Sim. Assim ordem importa quando você está chamando a função. Então, se eu estivesse chamando incremento aqui com algo vírgula alguma coisa, há um mapeamento direto. A primeira variável, o que é chamado, é feita uma cópia do primeiro argumento aqui. Desculpe, isso não deve ser um parêntese. O segundo argumento linhas acima com o segundo. Assim, a ordem, sim, importa. Tudo bem. Desculpe eu levei um longo caminho para chegar lá. Outras perguntas? Tudo bem. Então vamos ver se não podemos pintar uma imagem do que está realmente acontecendo aqui debaixo do capô, por assim dizer. Portanto, este é um retângulo que pode representar a memória do seu computador. Assim, mesmo se você não tem idéia de como funciona a memória ou como funciona a memória RAM, pelo menos assumir que você tem cachos de que estes dias. Você tem megabytes dele. Você tem gigabytes de-lo. E sabemos de zero semana que um byte é exatamente o que? 8 bits. Certo, então oito zeros e uns. Então, se o seu computador tem um giga de RAM, dois GB de RAM estes dias, você tem um bilhão ou 2 bilhões de bytes de memória, ou cerca de 8 bilhões ou 16000000000 bits, dentro do seu computador. Agora, ao contrário do exemplo Willy pouco Woolly, não é partículas magnéticas tipicamente mais. Cada vez mais, em laptops, pelo menos, é drives de estado sólido, os SSDs, que apenas não têm partes móveis. É tudo eletrônico. É tudo de eletricidade baseada. Então, acho que, no entanto, deste retângulo como apenas representando um ou dois gigabytes de memória que você tem. Portanto, é um pedaço da memória. Agora, o mundo da informática tem a sorte de pedaços particionadas fora de memória para fazer coisas diferentes. Assim, por exemplo, se esta é a RAM do computador - como sugerido pela retângulo lá - Acontece que, por convenção, no topo de sua memória RAM, de modo para falar, é geralmente o que é chamado de um segmento de texto. Esses são os zeros e uns que você compilados. Então, quando nós olhamos debaixo do capô o que a.out é, tudo os zeros e uns - quando você executar um programa, esses zeros e uns são carregados a partir do seu disco rígido unidade em algo chamado memória RAM. E na RAM, são colocadas no topo. Agora, entretanto, você tem outras coisas. Dados inicializados, dados não inicializados. Esses dois trechos de memória referem-se a variáveis ​​globais, que você não costuma usar. Mas, às vezes, se você fizer isso, eles acabam se lá também. Depois, há algumas outras coisas. Variáveis ​​de ambiente, que não vai passar muito tempo. Mas, então, duas coisas importantes que voltará ao longo deste pilha semestre, e heap. Assim, a maioria da memória do seu computador é reservado ao executar um programa para algo chamado de pilha e algo chamado de pilha. E nós não vamos falar sobre a pilha de hoje, mas vamos falar sobre a pilha. E a pilha é destinado a conjurar o visual de como a sala de jantar bandejas de refeição em Mather casa, ou onde quer que você esteja, onde o refeitório equipe limpá-los todos os dias. Eles empilhá-los do chão para cima. E da mesma forma na memória, não é essa idéia de colocar algo em um empilhar, colocar algo em uma pilha, colocar algo em uma pilha. E o que queremos dizer com isso? Bem, vamos zoom e apenas a metade inferior da imagem, do seu computador RAM, a propor o seguinte. Acontece que quando você executar um programa como a.out ou Olá, seja qual for do programa é que você escreveu, novamente, os zeros e uns são carregados a partir do disco rígido - o que é armazenamento a longo prazo, permanece lá mesmo quando você puxar a ficha - carregado na memória RAM. RAM é mais rápida do que os discos rígidos. É menor do que os discos rígidos. Mas é onde os programas ao vivo, enquanto você está executando-os. Então você clicar duas vezes um programa em um Mac ou um PC - é carregado de disco rígido para a RAM. Assim como é carregado na memória RAM, os zeros e uns ir no topo forma, o o chamado segmento de texto. Mas então, logo que o programa realmente começa a correr, o principal função é chamada. E principal, como vimos, muitas vezes tem variáveis ​​locais. E tem ints e cordas e caractere e semelhantes. Portanto, se seu programa que você escreveu ou o programa que você tem clicado duas vezes usou algumas variáveis ​​dentro do principal, eles acabam no fundo de sua pilha de memória, por assim dizer. Agora, mais concretamente, o que isso realmente significa? Isto apenas significa que se fôssemos a contar as coisas - se estivéssemos indo para o número de bytes de RAM no computador, observe que este pode ser o número zero byte. Este pode ser o número de bytes de um, dois, três, quatro, cinco, seis, todos o caminho até gosta - 2000000000 seria todo o caminho até lá em cima. Portanto, em outras palavras, quando falamos de memória RAM ou em termos de bytes, Significa apenas que alguém decidiu o que cada número de os pedaços de memória. Assim, quando você precisar de 32 bits para um inteiro, ou você precisa de 8 bits para um char, quando eles acabam na memória? Bem conceitualmente, eles só acabam no fim desta coisa chamada a pilha. Mas o que é interessante agora é quando chama uma função principal. Suponha que uma função chamada foo, apenas o nome de uma arbitrária. O que acontece é principal está na parte inferior desta pilha de memória. Foo agora é colocar em cima do principal na memória. Assim, todas as variáveis ​​locais que foo tenha acabar tipo de conceitualmente acima aqueles em principal. Se foo chama outra função chamada bar, essas variáveis ​​acabam aqui. Se a barra de chama outra coisa, aqui, aqui, aqui. Então, o que é interessante sobre a execução de um programa é que, como você chamar funções, e como essas funções chamar funções, e como essas funções chamar funções, você construir esta pilha de funções na memória. E apenas uma vez a função retorna você começar a que a memória de volta. Portanto, uma das maneiras mais fáceis de ficar sem memória em um programa de computador é escrever funções que nunca retornam. Assim, por exemplo, vamos demonstrar tanto com uma programa intencionalmente buggy. Deixe-me ir em frente e fazer # include, int main (void). E eu vou fazer enquanto (2> 1), o que provavelmente não irá nunca mudar em nós. E deixe-me ir em frente agora e fazer printf. Na verdade, isso vai ser menos interessante visualmente. Vamos fazer isso. Para int (i = 0; i> 0). Vamos fazer este erro, i + +. E não vamos printf aqui. Vamos praticar o que eu estava pregando. Vamos ter um método aqui. Refrão vazio, e vamos dizer int i. E então eu vou dizer, printf - oh, vamos fazer isso mais interessante. Não vamos realmente imprimir nada. Vamos fazer isso. Coro (i). Tudo bem. Portanto, este é buggy por que? Eu estou fazendo isso como eu ir, porque o programa não faz nada de interesse. Mas esse não é o objetivo. O objetivo é escrever um programa que tem como principal função faz o que, aparentemente? Se identificar. E, na verdade, nós não precisamos do loop. Vamos mesmo simplificar este só para não perder de vista realmente a bug fundamental. Chamadas principais coro a cantar alguma coro. Então eu fiz algo estúpido, e eu tinha coro chamada coro porque eu assumi alguém estava indo para implementá-lo talvez. E agora isso não vai compilar ainda. Eu preciso fazer o quê? Eu preciso do protótipo, lembre-se. Então, eu preciso ter-se aqui coro void (int i);. Então, agora, se eu descer aqui - Na verdade, vamos usar a janela maior. Vamos em frente e fazer coro. Vamos em frente e fazer coro. Utilização de declarante não identificado i. Ah, isso foi estúpido. Nós não precisamos do argumento. Vamos fazer isso. O Wish nós tinha começado dessa maneira. Teria sido um programa muito mais fácil escrever. Então lá. Agora vamos para a minha janela de terminal, re-run Clang. E aqui vamos nós. Isso foi muito rápido. O que realmente aconteceu, entretanto? Bem, agora eu vou adicionar a linha de impressão, para que possamos ver. Então deixe-me dizer printf, vamos dizer, eu estou aqui. Ok, não variáveis, vamos deixá-lo assim. Deixe-me voltar a correr fazer. Deixe-me re-run coro. E vamos. Continue indo. Como um aparte, por que ainda não caiu ainda? A falha de segmentação aconteceu super rápido antes. [Inaudível] DAVID J. MALAN: Exatamente. Então, é preciso tempo para imprimir. Ele só tem mais trabalho por parte do computador. E aí está. Falha de segmentação. Então, observe o quão rápido os programas executados. Se você não está imprimindo nada, super rápido. Mas ainda tenho essa falha de segmentação, porque o que estava acontecendo? Bem, se você pensar sobre como a memória do seu computador é colocado para fora, esta passa a ser principal. Mas aqui - vamos chamar este coro, e vamos chamar esse refrão. E agora, se eu fizer minha estética certo, isso só vai dizer coro, coro, coro, coro, coro, coro, coro, ad nauseum. E, finalmente, o que vai acontecer? Se o panorama é literalmente isso, o que acontece apenas conceitualmente? As derrapagens pilha a pilha. Ou pior, você só superado tudo, incluindo o segmento de texto, que é os zeros e uns que representam o seu programa. Em suma, este é apenas super, super-ruim. Certo? Seu programa entrou em uma espiral fora de controle. Você está usando a memória muito mais do que você queria tudo por causa de um estúpido erro, neste caso. Ou, neste caso, uma função muito deliberadamente feito ligando-se. Agora, isso não é de todo ruim. Funções que chamam-se, na verdade, tem um grande poder quando você usá-lo corretamente. Eu não tenho usado corretamente aqui. Então isso não é de todo ruim. Mas o fato de que eu nunca realmente parar de chamar a mim mesmo é fundamental fraqueza aqui deste programa. Então para onde estamos indo com tudo isso? Bem, o que está realmente acontecendo? Quando eu chamo a função de incremento, como estávamos fazendo nesses exemplos, Eu tenho um valor como uma que eu passar dentro Eu passar em uma cópia do número um. Então acontece o seguinte. Então vamos para o exemplo de incremento. E esse cara por aqui. Então aqui é o que está realmente acontecendo. Quando liguei incremento, e eu passar em x, pictoricamente o que é acontecendo aqui é esta - se eu tiver o valor de um armazenados aqui, e eu realmente chamar incremento, que agora é chamado coro - Sim, isso é me jogando fora aqui. Então, vamos chamar este incremento. E nós não sabemos o que esta função próximo vai ser. Então o que está realmente acontecendo é aqui em algum lugar no principal, eu tenho um pedaço de memória que armazena o número 1. Quando eu chamo incremento, estou usando outro pedaço de memória, mas agora eu tem a cópia de 1. Quando eu incrementar esse valor, este torna-se 2 - horrivelmente escrito no tela aqui. Mas então, o que acontece logo retorna incremento? Esta memória só fica transferido de volta para o sistema operacional, o que significa que todos os que você fez não é nada útil. O que foi originalmente contido no principal ainda é realmente lá. Então para onde estamos indo com isso? Bem, acontece que na memória que você tem esta de volta para trás seqüência de bytes que você pode colocar coisas dentro E acontece que já vimos algo que envolve a colocação de as coisas de volta para trás, para trás, para trás. O que é uma cadeia, com base em uma semana e agora de duas semanas? Então, é apenas uma coleção de personagens. Então não é que, assim como você pode colocar números na memória, da mesma forma que você pode colocar personagens na memória. E quando começamos a colocar personagens na memória de volta para trás para voltar ao para trás, verifica-se que o uso mais simples das coisas como um loop ou um loop while, podemos iterar - da esquerda para a direita sobre os caracteres de uma string - e começar massageando-os em personagens completamente diferentes. Um pode se tornar B. B pode se tornar C. Assim que, finalmente, podemos tomar uma Frase em Inglês que realmente faz sentido e converter cada um dos letras uma a uma, caminhando através da memória do nosso computador para a esquerda para direito à verdade criptografar. Portanto, vamos ter a nossa pausa de cinco minutos aqui, e quando voltarmos, vamos iniciar este processo de codificação de informações. Tudo bem. Então, antes de mergulhar em alguns criptografia e essas coisas chamadas de matrizes, deixe-me pausa para todas as perguntas, porque eu sinto como se eu realmente tipo de confusa alguns dos esses temas. Então vamos corrigir agora, se pudermos. Então, nós apenas conversamos sobre valores de retorno. Nós conversamos sobre argumentos. E nós falamos sobre esta noção, que nós vamos voltar para nas próximas semanas vir, de ver a memória como um monte deles empilhados bandejas, por assim dizer. De baixo para cima, de tal forma que cada bandeja que será colocado na pilha representa uma função que está sendo chamado. Alguma pergunta? Assim como sobre - deixe-me tentar fazer uma pergunta. Eu mantenho estragar isso, mas agora é - vocês já todos vimos o rosto do menino. Então, nós vamos voltar a isso. Então deixe-me fazer uma pergunta aqui. Deixe-me simplificar isso volta ao que era antes de alguns dos nossos mais cedo Q & A. E o fato de que o incremento tem parêntese aberto, número int, fechada parênteses. O que o número int representa? [Inaudível] DAVID J. MALAN: Um argumento. Ok, mas o que é um argumento? [Inaudível] DAVID J. MALAN: Desculpe, mas o que é isso? SPEAKER 3: Algo que você passa dentro DAVID J. MALAN: Okay. Então, alguma coisa que você passa dentro E, mais geralmente, é apenas a entrada. Se você está escrevendo uma função e finalidade dessa função na vida é fazer algo um pouco diferente cada vez que você usá-lo, então a única maneira de que isso aconteça realmente parece ser o de fornecer-lo com entrada de forma que pode fazer algo diferente com que a entrada de cada vez. Então, você precisa especificar duas coisas quando leva uma função entradas. Você precisa especificar o nome que você quiser dar para que a entrada, apenas para sua própria conveniência para que você possa consultá-lo na função que você se está escrevendo, como eu fiz aqui na linha 32. Mas você também precisa especificar o tipo porque C é uma linguagem de programação que apenas exige que se você quiser uma variável, você tem que dizer ao computador o tipo de dados que é, em grande parte, para que ele saiba quantos bits para alocar para essa variável. Porque pode ser seis - desculpe, isso não vai ser seis. Pode ser 16. Ele pode ser 8. Ele pode ser de 32, até 64. Mas o computador precisa saber. Agora, a int no lado esquerdo representa o que, por outro lado? [Inaudível] DAVID J. MALAN: O que é isso? [Inaudível] DAVID J. MALAN: O tipo de função e, mais especificamente, o tipo de sua saída. Direito. Assim, enquanto que a única coisa entre parênteses representa sua entrada, se houver, o coisa para a esquerda representa sua saída. E, neste caso, o incremento aparentemente retorna um int. E assim int é o tipo de retorno desta função. O que significa retornar? Literalmente, você usa a palavra-chave return. E então, se o que você está voltando para a direita da palavra-chave é uma inteiro, então isso é realmente consistente com o que prometeram. Você não poderia fazer algo assim - Olá mundo, - porque essa é uma string. Obviamente, não é um número inteiro. Assim, em breve, a carga é realmente em nós, o programador, para ser específico como ao que estamos voltando e, em seguida, realmente ir sobre a devolver. E depois de fazer um pouco mais claro o contexto - lá está ele de novo. O contexto - grande surpresa em apenas um momento. O contexto aqui agora é que a memória do computador é, novamente, uma gigabyte, dois gigabytes, o que for. Talvez seja mais. Talvez seja menos. Mas o computador vê-lo como tendo diferentes seções. Algo vai lá em baixo. Outra coisa vai lá em cima. Coisas diferentes vai no meio. E hoje, nós só começar a contar esta história. Mas vamos voltar a esse tempo acabou. Por enquanto, a única lembrança que realmente importa é o segmento de texto pois que apenas representa os zeros e uns Clang que tem emitido. Então, quando você executar um comando no teclado como a.out, ou dupla clicar em um ícone no Mac OS ou Windows, o programa é carregado a partir do disco rígido dirigir na RAM. E está se estatelou no topo da RAM do seu computador, por assim dizer. Agora, entretanto, como o programa começa a ser executado e principal é chamado no programa que você escreveu ou o programa Microsoft ou a Apple escreveu, qualquer um de seus variáveis ​​locais acabam lá no fundo da memória de seu computador. Mas se principal chama outra função que em si tem variáveis ​​ou argumentos, eles acabam por cima. E se essa função chama alguma coisa, eles acabam acima dela, acima dele, acima dele. E apenas uma vez uma função de execução é feita é que a pilha de tabuleiros, de modo para falar, começa a ficar mais e mais. E isso é o que então, em poucas palavras, explica por que, quando você chamar cubo - ou você chamar incremento - você está passando em uma cópia do valor. E o que isso significa pictoricamente é que você está literalmente escrito o número 1 na outra parte da memória, mudando de que 1 a 2, no caso de incremento - ou de um 8, no caso do cubo - e, em seguida, que a memória atirar fora, logo que o incremento ou o cubo função retorna. Pergunta. [Inaudível] DAVID J. MALAN: Onde - variáveis ​​globais são armazenados em que é atualmente chamado os dados inicializados ou dados não inicializados. A diferença é, se você tem uma variável global, e lhe atribui imediatamente um valor com o sinal de igual, ele acaba no topo lá. E se você acabou de dizer int x vírgula e sem valor, acaba um pouco inferior na RAM simplesmente por convenção. Outras questões. Tudo bem. Portanto, esta imagem vai voltar como temos mais poderoso com o que podemos fazer com o computador. Mas, por agora, vamos ter uma breve introdução à criptografia, um tipo específico de criptografia que não resolve todos os problemas do mundo, mas não resolve alguns deles. Neste caso aqui, temos uma coisa chamada criptografia de chave secreta. E criptografia de chave secreta, como o nome sugere, deriva a sua segurança a partir de um segredo. Assim, por exemplo, se você está de volta na escola e você está passando uma carta de amor pouco segredo para o menino ou a menina que você está esmagando - se você queria passar isso através da audiência, você provavelmente não iria escrever tal nota em Inglês ou qualquer que seja sua língua nativa é, em vez disso, você pode criptografá-la. Ou você pode apenas enviar-lhes uma mensagem de texto estes dias. Mas você pode realmente passar-lhes uma nota ao longo da sala de aula. E fazê-lo de forma segura, de tal forma que os seus amigos e do professor não sei o que você está escrevendo, você pode chegar a uma bastante simples algoritmo - jovem que você pode ser - apenas para embaralhar as palavras. Então, em vez de escrever um, você pode escrever B. Em vez de B, você pode escrever C. Em vez de C, você pode escrever D, e assim por diante. Ou você pode vir com uma tradução mais sofisticado de cartas de letras diferentes. Mas o problema é o menino ou menina a quem você está enviando esta nota precisa saber alguma coisa. Que é o que, obviamente? Como, o que é o seu segredo. Como, o que é que o mapeamento entre As e Bs e Cs e Ds? É apenas a adição de um, por assim dizer, para cada uma das cartas para ir de A para B, de B para C? O que é mais complexa do que a? Assim, você e sua paixão precisa ter essa informação em segredo. Mas há um tipo de catch-22 aqui. Se esta é a primeira vez que você está enviando esta carta de amor através do classe, como é que o menino ou a menina vai saber o que o segredo é mesmo? Assim chave secreta de criptografia não resolve todos os problemas do mundo. E não há, na verdade, uma relação que nós vamos voltar a direção final do semestre. Da mesma forma, não têm nenhum de nós provavelmente já enviou um - da mesma forma, não a maioria de nós conhece alguém que trabalha, por exemplo, a Amazon.com. E, no entanto, muitos de nós provavelmente já comprou coisas na Amazon.com. E nós fomos ensinados a supor que estes e-commerce transações são seguras. Certo? A URL provavelmente diz https. Há talvez um pouco bobo ícone de cadeado em algum lugar. Há algum tipo de criptografia de proteger suas informações de cartão de crédito entre você e Amazon.com. E, no entanto, se a criptografia envolve saber algum segredo, e ainda assim eu não Conhece alguém na Amazon, e eu certamente não dispostos qualquer tipo de segredo com alguém na Amazônia, como é o meu computador ou o meu navegador fazendo isso? Bem, acontece que há outros tipos de criptografia de um total que resolvem esse problema. Mas por hoje, vamos nos concentrar na simples, onde você pode organizar em avançar para saber algum segredo, como mais um ou algum mapeamento entre As e Bs. E o processo de criptografia envolve geralmente a este. Você tem algum texto simples, representado aqui na esquerda. Executá-lo através de algum tipo de algoritmo ou procedimento para encriptar. Talvez seja só um se torna B, B se torna C. E então você acabar com texto cifrado. Enquanto isso, uma vez que a sua paixão recebe a nota secreta, ele ou ela tem para depois decifrá-lo por geralmente revertendo esse algoritmo de modo a obter apoiar o texto simples. Agora há encarnações físicas deste. Por exemplo, isto é um anel descodificador pouco segredo. E este é um anel no sentido de que não há dois mostradores aqui. Na periferia fora desta coisa, há letras de A a Z, embora eles estão em ordem aleatória. E no interior, há realmente alguns números, tais que, com esta anel, você pode transformar o tipo de fora, mas não dentro da, a fim de alinhar números com letras. E no clipe que você está prestes a ver - alguns dos quais você pode ter visto 24/7 em torno da temporada de Natal de um filme chamado Uma História de Natal. Você vai ver que Ralphie pouco estava tão ansioso para descobrir o que pequeno órfão Mensagem secreta de Annie foi a ele que tinha sido comunicado, acho que, no forma de mensagens numéricos em uma caixa de série. E você tinha que acumular todos os cartões pequenos que vieram na caixa de cereal. Você tinha que enviá-los dentro Você tinha que voltar o anel decodificador secreto, de modo que você pode finalmente descobrir o que é o mapeamento entre letras e números, ou cartas e cartas. Então, eu dar-lhe este pequeno clipe de A História de Natal para motivar pset 2 e nossa discussão, em um momento, de matrizes. Portanto, temos aqui Ralphie. [REPRODUÇÃO] -Ser-lo conhecido a toda a gente que Ralph Parker é nomeado membro da Orphan Annie Pouco Secret Circle e tem direito a todos as honras e benefícios que ocorrem ao mesmo. -Assinado, Little Orphan Annie. Referendado, Pierre Andre! Em tinta! Honras e benefícios, já com a idade de nove. Vamos lá, vamos em frente. Eu não preciso de jazz que cerca de contrabandistas e piratas. Ouça-noite de amanhã para a aventura de conclusão do The Black Navio de pirata. Agora é hora de mensagem secreta de Annie por vocês, membros do Círculo Secreto. Lembre-se, as crianças, apenas membros do Secret Circle Annie pode decodificar Mensagem secreta de Annie. Lembre-se, Annie está dependendo de você. Defina suas pinos para B2. Aqui é a mensagem. 12, 11 - -Eu estou na minha primeira reunião secreta. -14, 11, 18, 16 - -Pierre estava em noite grande voz. Eu poderia dizer que a mensagem desta noite era realmente importante. -3, 25. Essa é uma mensagem de Annie se. Lembre-se, não diga a ninguém. -90 Segundos depois, eu estou na sala só 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. Estava vindo mais fácil agora. U. -Oh, vamos lá, Ralphie. Eu tenho que ir. -Eu vou estar bem para baixo, ma. -Gee Whiz. -T, O. Certifique-se. Certifique-se de que? Qual foi Little Orphan Annie está tentando dizer? Certifique-se de que? -Ralphie! Randy tem que ir. Quer fazer o favor de sair? -Tudo bem, ma. Eu estarei fora. -Eu estava ficando mais perto agora. A tensão era terrível. O que foi? O destino do planeta pode estar em equilíbrio. -Ralphie! Randy tem que ir. -Eu vou estar bem para fora, pelo amor de Deus. -Nossa, quase lá. Meus dedos voaram. Minha mente era uma armadilha de aço. Todos os poros vibrou. Era quase claro. Sim, sim, sim, sim. -Certifique-se de beber o seu Ovomaltine. Ovomaltine? Um comercial miserável? Filho da puta. [REPRODUÇÃO FIM] DAVID J. MALAN: Portanto, temos de criptografia. Assim como em um computador podemos ir sobre a implementação ou representando coisas como esta? Bem, precisamos de uma forma de nos expressar um pouco mais flexível do que nossas variáveis, até agora, têm permitido. Tivemos ints. Tivemos caracteres. Nós tivemos carros alegóricos e duplos e alguns outros. Mas essas são peças individuais de memória que realmente não nos permitem expressar coisas como palavras e frases e frases. Na verdade, nós temos chamado cordas tais coisas. Mas prometeu que isso é realmente apenas uma simplificação na CS50 biblioteca que estamos pretendendo descascar. E assim vamos começar a fazer isso aqui. Deixe-me ir em frente e abrir um arquivo - todos esses arquivos estão disponíveis on-line como de costume - array.c chamado para resolver um problema relacionado com cordas, mas que traça um foto aqui de como podemos usar uma coisa chamada matriz. Uma matriz é um tipo de dados. É um tipo de variável, do tipo, que tem vários tipos de dados menores dentro dela de costas para trás, para trás. Assim, por exemplo, se quiser escrever um pequeno programa que lhe dá o seu questionário média para um curso como 50, que tem dois testes, você poderia muito facilmente escrever este programa - baseado mesmo em alguns dos materiais da semana passada - usando GetInt e um par de variáveis. Int quiz1, int quiz2, e é bastante simples. É talvez 10, 20 linhas de código, max, para implementar um programa que pede ao usuário para duas pontuações do questionário e calcula sua média, adicionando- em conjunto, dividindo-se em dois, e em seguida a impressão dos resultados. Nós provavelmente poderia fazer isso muito rapidamente agora, depois de um determinado número de minutos. Mas o problema é que suponho que 50 tinha três ou quatro testes. Suponha que você queria usar o mesmo programa para uma classe que teve testes semanalmente. Pense em uma classe que tem testes semanalmente. Se não há como 16 ou mais semanas, em um semestre, agora você tem 16 variáveis ​​- int quiz1, int quiz2, int quiz3, int quiz4. Assim que você começar a ver essa redundância, esta copiando e colando de código, ele deve começar a fazer você gostaria que houvesse uma maneira melhor. E, felizmente, porque de matrizes, não existe. Então, vamos fazer isso. Primeiro, deixe-me apresentar uma coisa muito simples que não usei até agora, mas você vai ver que, ocasionalmente, em código. Isto é o que é geralmente chamado de uma constante. Então, é uma constante no sentido de que este valor nunca muda. A convenção humana ao criar uma constante é usar todo o capital letras, apenas para que ele realmente se destaca em seu código. E a palavra-chave que você usa em C # é definir. Então, se você diz # define, então, um espaço, então a palavra que você deseja usar para nome da constante, e, em seguida, o valor da constante. Então aviso, isso é diferente de atribuir algo a uma variável. Não há sinal de igual. Não há nenhum ponto e vírgula. Isso é o que é geralmente conhecido como um pré-processador de directiva, mas mais sobre que em outro momento. Por agora, isso cria um valor imutável chamado QUESTIONÁRIOS cujo real valor numérico é 2. Então, em qualquer lugar que você vê testes, questionários, testes ao longo deste arquivo, que é apenas o número 2. Agora, se eu olhar para principal agora, vamos ver como isso funciona. Na primeira, ele parece um pouco enigmática. Mas é tudo a partir de uma semana. Peça ao usuário para notas. Como podemos fazer isso? Bem, na linha 22 - esta é realmente a parte suculenta - Eu declaro uma bóia, mas não apenas um único flutuador. Estou declarando, em vez disso, uma matriz de valores de ponto flutuante. Essa variável vai ser chamado de notas, como implicado aqui. Mas a única peça de nova sintaxe, então são estes colchetes, o fato que eu disse notas float e, em seguida, suporte aberto e, em seguida, um número. Aviso prévio, se este for uma constante, isto é, tal como fizemos isso. Isto significa computador hey, dá-me dois carros alegóricos, e vamos chamar coletivamente los graus. Isto está em contraste com um processo muito mais tedioso como este. Classe1 flutuar, flutuar grade2, e assim por diante. Assim, uma matriz que nos permite implementar esta idéia, mas muito menos messily, em de modo a que podemos escrever uma linha de código, em vez de, digamos, 16 para um 16 semestre semana. Então, eu não queria rígido código-2 porque se você pensar sobre isso agora logicamente - suponho que no próximo ano CS50 alterações 3 quizzes vez. E eu tinha o número 2 aqui. Eu tive o número 2 aqui. Eu tive o número 2 aqui. Eu tive o número 2 aqui. Torna-se muito tedioso e muito fácil de estragar e mudar acidentalmente um valor para 3 e perder algum outro valor de 2. Então, eu estou indo para lugar abstrato isso adiante e usar essa constante que, como seu nome sugere, nunca muda. E agora, não importa se temos diferentes questionários este ano ou no próximo, eu apenas temos que mudar isso em um só lugar, aqui em cima. Então, isso é tudo que é constante. Enquanto isso, o novo recurso conceitual é que de uma matriz. Assim, os colchetes me dar esta flutua muitos e me deixa coletivamente chamá-los de notas aqui. Então agora vamos ver o que eu vou fazer. Aqui, na linha 24 é o início de um laço. Isto é realmente nada extravagante. É só usar questionários em vez de um número codificado. Mas não há nada intelectualmente diferente lá desde a semana passada. Este é apenas printf. Então printf ("quiz número% d de% d"), porque eu só quero imprimir me dar questionário um número de dois e, em seguida, dois a dois. Portanto, esta é puramente uma coisa estética. Mas a parte interessante agora é na linha 27. A fim de preencher um dos dois marcadores de posição com um ponto flutuante valor, você novamente usar colchetes. Neste caso, eu estou usando i porque este loop começou com i igualando qual o valor que, aparentemente? 0. Assim, na primeira iteração do loop, é como se eu escreveu isso no código. Mas na segunda iteração do loop, é como se eu escreveu isso no meu código. Mas o fato de que eu estou usando uma variável é perfeito, porque, como o nome sugere, está variando o seu valor a cada iteração. Então, eu estou preenchendo essa matriz um ponto de cada vez. O que essa matriz se parece? Bem, a razão Eu tirei este rectângulo super simples na tela aqui antes era por este motivo. Uma matriz é apenas um pedaço de memória seguido por outro pedaço de memória, seguido por um outro bloco de memória, e assim por diante. Então, se minha matriz é de tamanho 2, neste caso aqui, tudo o que eu estaria fazendo por digitando na pontuação meus quiz, como aqui. Eu tenho 100 em um presente. E então eu tenho um 99 em um presente. Então, essa memória não pode ser usado até mesmo porque eu só perguntei o computador para uma matriz de tamanho 2. Essas praças ainda estão lá. Certo? Você ainda tem dois gigabytes de memória RAM, mesmo se você estiver apenas pedindo dois carros alegóricos. Assim, a idéia por trás de matrizes é que o computador só tem um pedaço da memória e depois reparte pequenos pedaços de costas para trás, para trás. E para que é tudo uma matriz é. É um pedaço contíguo de memória, dentro do qual você pode colocar as coisas. Agora isso acontecer para depois fazer apenas alguns aritmética chato. Se eu rolar por aqui, este é o lugar onde eu então iterar sobre o array. Eu venho com o somatório de todos os valores na matriz. E então eu uso a função round aqui para realmente fazer o Resumindo dividido por testes. Mas deixe-me acenar a minha mão em que, como espécie de aritmética suficiente por enquanto. Mas tudo o que está fazendo para mim, em última análise é o cálculo de uma média. Então, primeiro teste mais segundo questionário, dividido por 2, e depois imprimir lo como um int. Mas vamos transição agora a um exemplo diferente, chamado string1, que pinta um quadro similar, mas usando cordas. Deixe-me ir em frente e simplificar este apenas por um momento. E perdoa o recuo para agora. Observe na linha 19 deste exemplo, eu recebo uma string do usuário. Mas note o que eu estou fazendo no próximo linhas de 22 em diante. Na verdade, estou repetindo a partir de i-se - e este é um novo truque - strlen comprimento da corda,. Esta é uma função que vem com o C que se você passar uma corda, ele diz quantos personagens estão em que seqüência. Isto é tudo. O fato de que é strlen em vez de comprimento da corda é só porque ele é mais sucinto. 30 anos atrás, as pessoas gostavam de escrever coisas da forma mais sucinta possível. Então, nós temos mantido essa convenção aqui. i + + significa apenas incrementar i em cada iteração. E agora perceber isso, o que é realmente interessante. Assim, na linha 24, eu digo computador, dá-me um personagem, oito bits, e chamá-lo c. Mas o que é isso no lado direito dizendo? Em Inglês, o que isso representa? [Inaudível] DAVID J. MALAN: Exatamente. Dá-me o primeiro caractere na matriz. Ou, mais geralmente, dá-me o caráter i-th na matriz. E perceber que é importante agora que, como cientistas da computação, estamos, na verdade, contagem de 0. Você não tem critério agora para começar a fazer isso. Agora você tem que se comportar de acordo com as expectativas do computador e contar a partir de zero, porque [0] vai ser o primeiro caractere em uma string. [1] vai ser o segundo. [2] vai ser o terceiro, e assim por diante. Portanto, este programa, se eu compilá-lo - isto é, novamente, string1. Então faça string1. E agora eu corro string1 na minha janela de terminal. Ele está esperando por entrada, então eu vou digitar, por exemplo, David. Enter. E agora ela imprime DAVID tudo em linhas diferentes, porque perceber o que estou fazendo. Estou imprimindo um caráter de cada vez. Agora, não vou entrar em detalhes hoje sobre isso. Mas eu apaguei há pouco esta verificação aqui. Acontece que se o usuário está se comportando mal, contraditório, ou apenas confuso, você pode realmente deixar de dar uma seqüência de algum tempo. Se você bater na tecla errada no teclado, você pode dar nenhuma seqüência em tudo. Ou se você é malicioso, você pode tentar colar no valor de um gigabyte de um ensaio para preencher essa seqüência. E se o computador ficar sem memória, verifica-se que vamos para voltar este valor especial chamado null. Então, por enquanto, só sei que há esse valor especial chamado nula de que nos permitirá verificar quando estamos fora de memória, entre outras coisas. Mas se eu abrir agora string2, notar uma diferença aqui. Observe uma diferença aqui com string2. Com string2, este loop é um pouco diferente. Deixe-me apagar os nulos, para que possamos falar sobre isso outra hora. Mas o que é diferente sobre o laço for desta vez? E eu posso voltar para o exemplo anterior. Então essa é a versão dois. Esta é uma versão. Um, dois, um, dois. Assim, a chamada strlen é onde? É na primeira parte do loop. Todos os pensamentos a respeito de porque eu estou fazendo isso? Sim. [Inaudível] DAVID J. MALAN: Então nós não chamar a função a cada momento. Exatamente. Lembre-se de laços que são super simples, uma vez que tipo de compreender que esta é a inicialização, o condição, e da atualização. O problema é que a condição ocorre em cada iteração do loop. E assim, neste exemplo aqui, o que é ruim sobre o fato que esta é a minha condição? Você está chamando strlen novo e de novo e de novo. Mas uma vez que eu digitei em DAVID, o comprimento da corda que é cinco. E isso não vai mudar em cada iteração do loop, porque o string é ainda D-A-V-I-D. Portanto, esta é uma dica do que vai se tornar um idéia cada vez mais importante conhecida como uma decisão de projeto, onde - apenas não fazer o computador fazer um trabalho desnecessário. Agora, assim como uma prévia de pset 2, pset 2 na edição padrão é vai desafiá-lo para realmente implementar um número de cifras, alguns número de algoritmos de criptografia, de modo que você pode criptografar e descriptografar mensagens secretas, bem como o Ralphie um lá decodificado. Na edição de hacker de pset 2, vamos ir um pouco mais longe. Nós vamos entregar-lhe um arquivo de um sistema de computador que contém um real monte de nomes de usuário e senhas criptografadas reais, eo desafio para a edição de hacker vai ser para quebrar as senhas e figura o que a criptografia ou o segredo foi usado para realmente gerar as senhas. E nós vamos fazer isso usando um novo recurso aqui de C que eu vou dar você apenas uma demo de, conhecido como linha de comando argumentos. Então não é que, como alguns de vocês podem ter visto na seção ou nos livros didáticos, principal nem sempre tem que ser nula entre parênteses. Acontece que principal também pode ser escrito assim, com dois argumentos, argc e argv, onde argc é o número de palavras que você escreva depois o nome do programa na linha de comando. E argv são as palavras reais. E, como os colchetes lá sugerir, argv é, aparentemente, um array. Vai ser uma seqüência, após uma série depois de uma série na memória. Então, o que nós vamos ser capazes de fazer, começando com pset 2, é algo como isto. Se eu fizer argv1, que é um exemplo que vai voltar para segunda-feira, e executar ela, perceberá que ela não parece fazer nada ainda. Ele só imprime seu próprio nome. Mas se eu disser adeus classe, aviso que este programa aparentemente itera sobre cada uma das palavras que foram digitados no prompt. E os meios pelos quais nós vamos ter acesso a palavras que o usuário tem digitado no prompt é mudando principal, a partir deste fim de semana, a partir de int main (void) para int main (argc, argv). E assim vai nascer argumentos de linha de comando. E uma vez que você realmente sofisticado com isso, você vai ser capaz de escrever programas realmente trippy, como este aqui, que vai acima e além algumas das funcionalidades que temos feito até agora, mas todos muito poderoso. Então, vamos deixar isso com isso na tela. E nós vamos vê-lo na segunda-feira.