[MÚSICA DE JOGO] DAVID J. MALAN: Tudo bem. Este é CS50, e esta é o fim da Semana 2. Então, hoje, nós vamos para continuar o nosso olhar a forma como representamos as coisas debaixo do hood-- afastando de números como inteiros e valores de ponto flutuante e concentrando-se em cordas e programas, finalmente, mais interessantes. Mas nós também vamos dar uma olhada em um par de problems-- específica de domínio a primeira das quais vai ser envolvendo criptografia, o arte de codificação da informação, em que você vê acima aqui é um retrato da Rádio Orphan Annie anel decodificador secreto do passado. Este é, na verdade forma muito primitiva e forma para crianças de cryptopgraphy em que este anel tem dois disks-- um dentro e outro fora. E girando um desses, você pode essencialmente alinhar letras como A a Z com outras letras B como através da A. Por outras palavras, você pode literalmente girar o alfabeto, vindo, assim, com um mapeamento a partir de cartas para cartas de modo que, se você queria enviar uma mensagem secreta para alguém como Annie, você poderia escrever para baixo a sua mensagem e, em seguida, gire as letras, em que, se você quer dizer dizer "A", você em vez dizer "B", Quer dizer "B", você, em vez dizer "C" - ou algo um pouco mais inteligente que que-- e depois, em última análise, enquanto Annie tem esse decodificador anel, ela pode decodificar a mensagem. Agora, você deve se lembrar, aliás, que este foi usado em um filme muito famoso que joga ad nauseum durante a época de Natal. Vamos dar uma olhada aqui. RALPHIE PARKER: "Seja conhecido por todos, em resumo que Ralph Parker é nomeado um membro da Little Orphan Annie Segredo Círculo e tem direito a todos os honras e benefícios que ocorrem ao mesmo ". RALPHIE PARKER (narrando): Assinado Little Orphan Annie. Referendado, Pierre Andre! Na tinta. Honras e benefícios, já com a idade de nove anos. [MÚSICA DE JOGO] [RADIO CHATTER] RALPHIE PARKER: Vamos lá. Vamos continuar com ele. Eu não preciso de todo esse jazz sobre contrabandistas e piratas. RADIO LOCUTOR: Ouça amanhã noite para a aventura final do navio pirata Preto. Agora, é hora de Annie Mensagem secreta para os membros da do Círculo Secreto. Lembre-se dos miúdos, apenas membros de Secret Circle de Annie pode decodificar mensagem secreta de Annie. Lembre-se, Annie está dependendo de você. Defina seus pinos para B-2. Aqui está o message-- 12, 11, 2-- RALPHIE PARKER (narrando): I estou no meu primeiro encontro secreto. RADIO LOCUTOR: --25, 14, 11, 18, 16-- RALPHIE PARKER (narrando): Oh, Pierre estava em grande noite de voz. Eu poderia dizer que hoje à noite mensagem era realmente importante. RADIO LOCUTOR: --3, 25. Essa é uma mensagem de Annie a si mesma. Lembre-se, não conte a ninguém. [Ofegante] RALPHIE PARKER (narrando): Noventa segundos depois, eu sou no único quarto no casa onde um menino de nove anos poderia sentar em privacidade e decodificar. Ah. "B." [Risos] RALPHIE PARKER (narrando): Eu fui para o outro. "E." A primeira palavra é "ser". Sim! Ele estava chegando mais fácil agora. "U." [Risos] RANDY PARKER: Ah, vamos lá, Ralphie. Eu tenho que ir! RALPHIE PARKER: Eu vou descer, Ma. Gee Whiz. "T." "O." "Certifique-se com "." Certifique-se de "o quê? Qual foi Little Orphan Annie tentando dizer? "Certifique-se de" o quê? MÃE: Ralphie, Randy tem que ir. Será que você poderia sair? RALPHIE PARKER: Tudo bem, mãe! Vou sair bem! RALPHIE PARKER (narrando): Eu estava ficando mais perto agora. A tensão era terrível. O que foi? O destino do planeta podem estar em jogo. MÃE: Ralphie, Randy tem que ir! RALPHIE PARKER: Eu estarei bem fora, pelo amor de Deus! RALPHIE PARKER (Narrando): Quase lá! Meus dedos voaram! Minha mente estava em uma armadilha de aço. Cada poro vibrou. Era quase claro! Sim! Sim! Sim! Sim! RALPHIE PARKER: "Certifique-se para beber o seu Ovomaltine. " Ovomaltine? Um comercial miserável? [MÚSICA DE JOGO] RALPHIE PARKER: Filho da puta. [Risos] DAVID J. MALAN: Para que, então, é um vislumbre do que a criptografia pode ser para um isto-- beber do passado. Assim, um anúncio rápido. Se você está livre esta Sexta-feira às 13:15 e faria gostaria de se juntar a nós para CS50 almoço, ir para este URL aqui. Primeiro a chegar, primeiro a servir como de costume. Mas com o tempo, vamos ter certeza de que mais quem gostaria de participar Pode programar-wise. Assim cordas. Temos Zamyla-- quem você já reuniu mais provável Na Série 1-- cuja nome está escrito assim. E suponha que você digitou o nome dela em um programa de computador que é usando algo como getString. A fim de recuperar essas teclas, como nós vamos sobre o que representa uma corda, uma palavra, um parágrafo, ou várias letras como estes aqui? Conversamos última vez sobre inteiros e problemas que surgem com integer overflow e valores de ponto flutuante e os problemas que surgir dentro de precisão. Com cordas, nós, pelo menos, ter um pouco mais de flexibilidade porque strings-- apenas no real mundo-- podem ter um comprimento bastante arbitrária. Muito curto, muito longo. Mas, mesmo assim, vamos descobrir que computadores podem, por vezes, sem memória e nem mesmo armazenar uma string grande o suficiente. Mas, por agora, vamos começar a visualizar uma seqüência como algo nessas caixas Aqui. Assim, seis dessas caixas, cada um dos quais representa um caractere ou "char". Então, lembrar que "char" - c-h-a-r-- é um dos tipos de dados embutidos em C. E o que é bom é que você pode usar que tipo de como um bloco de construção, uma peça de quebra-cabeça, se quiser, para formar um maior tipo de dados que vamos continuar para chamar uma "cadeia". Agora, o que é útil pensar sobre sobre coisas como cordas, desta forma? Bem, acontece que pudermos realmente aproveitar essa estrutura para acessar, na verdade, caracteres individuais de uma forma bastante simples. Eu estou indo para ir em frente e criar um arquivo chamado "stringzero.c" mas você pode chamá-lo de tudo o que você gostaria. E no site do curso é Neste exemplo já antes, assim você não precisa escreva tudo. E eu estou indo para a frente e primeiro fazer void main int. E dentro de poucos dias, vamos começar a desmembrar o vazio é aqui, por isso que é int ao lado principal, e assim por diante. Mas, por agora, vamos continuar para copiar e colar isso. Vou declarar uma string chamada s. E eu vou voltar de GetString quaisquer que sejam o usuário digita. Este vai ser um simples programa, nenhuma instrução, Eu só vou cegamente esperar que o usuário saiba o que fazer para mantê-lo simples. E agora eu vou ter um loop for. E dentro do meu loop Estou vai ter int i recebe zero. E i é, novamente, apenas uma convenção, um índice de variável de contagem, mas eu poderia chamar isso o que eu quiser. Eu vou fazer i é menos than-- bem O nome de Zamyla é de seis letras. Então eu vou para o disco código que não para agora. E então i ++. E agora dentro destes crespos chaves eu vou fazer printf, e eu quero imprimir um caractere de cada vez. Então eu vou usar% c para talvez pela primeira vez. E então eu quero imprimir cada personagem em sua própria linha. Então eu vou colocar uma pouco barra invertida n lá. Fechar cotação. E agora eu quero fazer alguma coisa aqui. Quero imprimir o letra específica na seqüência, s, como eu estou interagindo de zero em até seis. Em outras palavras, eu quero imprimir o caráter i'ésima de s. Agora, como posso fazer isso? Bem assim como as caixas em esta representação aqui, tipo, evocar a noção de boxe letras, você pode fazer da mesma forma que sintaticamente em C simplesmente especificando, Quero imprimir s de i'ésima personagem. Usando os colchetes no teclado do seu computador que em um teclado americano são geralmente acima de sua tecla de retorno. Então isso não está certo No entanto, como você deve ter notado. Mas eu estou indo para o tipo de cegamente avançar aqui. E eu vou fazer fazer seqüência 0. Mas antes de eu fazer isso, vamos ver se nós não pode antecipar alguns erros comuns. Será que isso vai compilar? Não, eu estou perdendo um monte de coisas. Bibliotecas ouvi. Assim que arquivos de cabeçalho pode Quero acrescentar aqui? Sim. AUDIÊNCIA: Você precisa E / S padrão [inaudível] DAVID J. MALAN: Excelente. Então eu preciso de I / O padrão. Para quê propósito que eu quero padrão I / O? Para printf. Portanto, incluir stdio.h. E você também propor que incluem a biblioteca CS50 por qual razão? Para ter strings. Então, vamos ver o que Biblioteca de CS50 está fazendo para criar essa noção de uma string. Mas, por enquanto, você pode apenas pensar nisso como um tipo de dados real. Então, que parece estar um pouco limpo. E agora eu estou indo para a frente e de fato fazem seqüência 0. Compilado. Então, isso é bom. Então ./string0 deixe-me aproximar para que possamos ver mais de perto o que está acontecendo. Enter. Z-A-H-Y-L-A entram. E nós temos impresso ao nome de Zamyla. Então, isso é muito bom. Então agora vamos seguir em frente e executar este programa novamente, e digite o nome completo de Daven. Surpresa, surpresa. Enter. Hmm. Nós não imprimiu Daven de primeiro nome completo corretamente. Agora isso deveria ser óbvio em retrospecto por causa do que, tipo, design decisão estúpida? Sim, eu codificado o seis dentro do meu loop for. Agora eu fiz isso só porque Eu sabia o nome de Zamyla ia ser seis letras. Mas, certamente, isso não é uma solução geral. Então não é que nós podemos de forma dinâmica calcular o comprimento de uma corda chamando uma função chamada strlen. Novamente, deliberadamente sucintamente chamado apenas para torná-lo mais conveniente para digitar. Mas isso é sinônimo de obter o comprimento de uma corda. Vou voltar para o meu terminal janela e re-executar o compilador. Mas está gritando comigo. Implicitamente declarando função de biblioteca strlen com tipo unsigned int const-- Estou perdido. Completamente. Então, especialmente como seu olhos começam a revirarem com mensagens de erro como este, o foco honestamente sobre as primeiras palavras. Sabemos que o problema está no linha 8, conforme indicado aqui. E é em corda-0.c. Implicitamente declarando função da biblioteca strlen. Assim que é geralmente vai haver um padrão de mensagens de erro. Implicitamente declarando algo. Então, em suma, que tenho eu parecia ter feito com relação à linha 8, aqui. O que poderia ser a solução ser ainda Se você nunca usou strlen si mesmo? AUDIÊNCIA: Parte de uma biblioteca diferente? DAVID J. MALAN: Parte de uma biblioteca diferente. Por isso, é declarado, por assim dizer. Ele é mencionado em algum arquivo excepto stdio.h e CS50.h. Agora, onde é definida? Para ser honesto, você tem que apenas sei que esta em cima da sua cabeça, ou você Google isso e descobrir. Ou sabem disso, eu abri na CS50 Aparelho usado o programa do terminal, que é apenas o grande, versão para a tela cheia de o que está na parte inferior da janela do gedit. E verifica-se que há uma comando semelhante sucinto, chamado homem de manual, onde se você digitar o nome de uma função e pressione Enter, você vai voltar bastante documentação arcano. É apenas um texto que, geralmente, parece um pouco algo como isto. É um pouco esmagadora à primeira vista. Mas, sinceramente, eu vou deixei meus olhos vidrados e apenas se concentrar na parte Eu me preocupo com o momento. Qual é este. Que parece estruturalmente como algo que eu estou familiarizado. Na verdade, a página de homem, assim para falar, vai dizer no cabeçalho do arquivo que a função como strlen é definido. Então, eu vou voltar agora para gedit. E eu estou indo para ir em frente e adicionar aqui # include e salve o arquivo. Eu estou indo para limpar a tela com Control L Se você estiver se perguntando. E eu vou fazer re-execute string.0, compila neste momento. ./string.0 Zamyla. Isso parecia funcionar Deixe-me ir em frente e execute-a novamente com Davenport. Enter. E que, também, parecia funcionar. Assim, podemos fazer um pouco melhor do que isso, no entanto, podemos começar a arrumar as coisas -se um pouco. E eu vou, na verdade, introduzir uma outra coisa agora. Eu estou indo para ir em frente e salvar esta em um arquivo diferente. E eu vou chamar este string1.c arquivo apenas para ser consistente com o código você vai ser capaz de encontrar online. E vamos focar em exatamente o mesmo código. Acontece que eu tenho sido uma espécie de tomada como certo o fato de que meu laptop, e, por sua vez, o aparelho CS50 tem um monte de memória, um monte de RAM, uma grande quantidade de bytes de espaço em que eu possa armazenar strings. Mas a realidade se eu digitei longo suficientes, e suficiente as teclas digitadas, Eu poderia, em teoria tipo em mais caracteres do que o meu computador fisicamente tem memória para. E isso é problemático. Muito parecido com um int só pode Quantidade de tão elevada, em teoria, você só pode empinar tantos personagens na memória RAM do seu computador ou aleatória Access Memory. Então, eu tinha melhor antecipar este problema, mesmo embora possa ser um raro caso esquina, por assim dizer. Não acontece que, muitas vezes, pode acontecer. E se isso acontecer e eu não antecipar e programa para que, meu programa poderia fazer quem sabe o que. Congelar, travar, reiniciar, o que for. Algo esperado poderia acontecer. Então o que eu vou fazer agora, a partir de agora, na verdade, é antes de eu nunca cegamente usar uma variável como s que foi atribuído o valor de retorno de alguma outra função como getString, Eu vou ter a certeza que o seu valor é válido. Então eu sei que só por ter lido Documentação do CS50 para getString, que em última análise, vamos apontá-lo em, que getString retorna um símbolo especial chamado NULL, N-L-L-L em todos CAPS, se algo der errado. Então, normalmente, ele retorna um string. Mas caso contrário, se ele retorna N-U-L-eu-- vamos finalmente ver o que realmente means-- isso apenas significa algo ruim aconteceu. Agora, isso significa, bem como em risco, Eu posso verificar uma condição aqui em C, Se s não é igual a NULL. Então, se você não vi isso antes, isto significa apenas não é igual. Então, é o oposto do iguais iguais, que, recordam, é diferente da única é igual, o que é atribuição. Então, se s não é igual NULL, só então Eu quero executar estas linhas de código. Assim, em outras palavras, Antes de me aprofundar em cegamente e iniciar a iteração sobre s, e tratando-o como se fosse uma seqüência de personagens, eu vou para a primeira verificação, espere um minuto, é definitivamente não igual a este valor especial, NULL? Porque se for, coisas ruins podem acontecer. E por agora, assumir as coisas que os maus acontecendo significa que seu programa trava, e você não pode necessariamente recuperar. Então, francamente, parece mais feio. é meio confuso agora para olhar. Mas esta se torne mais familiarizado antes do tempo. Mas eu vou propor agora uma outra melhoria. Essa é uma melhoria para correção. Meu programa agora é mais correta, pois No caso raro que a memória não é suficiente existe, eu vou lidar com isso, e eu simplesmente não fazer nada. Eu, pelo menos, não vai falhar. Mas vamos fazer uma versão final aqui. E um arquivo chamado string2.c. Vou colar esse mesmo código só por um momento, e eu estou indo para destacar esta line, 11, aqui, apenas por um momento. Agora, a realidade é que os compiladores inteligentes como Clang poderia consertar isso para nós nos bastidores sem o nosso nunca saber. Mas vamos pensar sobre isso fundamentalmente como um projeto problemático. Esta linha de código, é claro, dizendo: inicializar alguns variável i para 0. Isso é bastante simples. E o que mais uma vez é esta declaração, aqui, i ++, fazendo? Já vimos isso antes, mas nós realmente não falar sobre isso. AUDIÊNCIA: Incrementando i. DAVID J. MALAN: Incrementando i. Assim, a cada iteração através este circuito, cada ciclo, você está incrementando i por um. Por isso, se torna maior e maior, e maior até que o loop termina. Como isso termina? Bem, há este meio condição que usamos antes. Você já viu e em instruções passo a passo no conjunto de P. Mas o que é esta palavra? Faça o seguinte loop para enquanto i é menor do que o quê? AUDIÊNCIA: O comprimento da corda. David J. MALAN: O comprimento da corda. Por isso traduz muito limpa para Inglês nesse sentido. Agora o problema é que toda vez que eu iteração através deste ciclo, em teoria, Eu estou fazendo esta pergunta. É i menor que o comprimento da cadeia de s? É i menor que o comprimento da cadeia de s? Agora é i mudando a cada iteração? É. Devido à ++. Assim, a cada iteração i está ficando maior. Mas é s ficando maior, ou menor, ou mudar em tudo? No. Assim, em termos de design, um dos eixos ao longo do qual tentamos avaliar o código na classe, isso parece meio idiota. Como você está literalmente, em cada iteração deste laço pedindo a mesma maldita pergunta novamente, e de novo, e de novo, e, literalmente, isso nunca vai mudar. Pelo menos, se eu não estou tocando s e tentar mudar o conteúdo de s. Para que eu possa fazer um pouco melhor do que isso. E o que eu vou fazer não é declarar apenas uma variável i, mas uma segunda variável Vou arbitrariamente, mas convencionalmente, chamá-lo de n. Atribuir n igual ao comprimento da corda de s. E então para cá, eu vou fazer um pouco de otimização inteligente, de modo falar, que, no final do dia não mais correta ou não menos correcta é do que antes. Mas é um projeto melhor. No fato de que eu estou usando menos tempo, menos ciclos de CPU, de modo para falar, para responder a mesma pergunta, mas apenas uma vez. Qualquer dúvida sobre que geral princípio da melhoria, dizer, a eficiência de um programa? Sim? AUDIÊNCIA: Por que você usar o [inaudível]? DAVID J. MALAN: Boa pergunta. Então, por que colocar o ++ no final de i em vez de no início do i? Neste caso, tem nenhum impacto funcional. E, em geral, tendem a usar o operador postfix de modo que é um pouco mais claro como para quando a operação está acontecendo. Para quem não conhece, existe uma outra declarações em que você poderia fazer ++ i. Estes são funcionalmente equivalente neste caso porque não há mais nada em torno desse incremento. Mas você pode vir até com casos e linhas de código em que isso faz a diferença. Então, geralmente, não temos até mesmo falar sobre isso. Porque, francamente, ele faz o seu código mais sexy, e uma espécie de vigarista, e menos caracteres. Mas a realidade é que é muito mais difícil, Eu acho que, mesmo para me envolver minha mente em torno de, por vezes, a ordem das operações. Assim como um aparte, se você realmente não gosto disso, mesmo que este é o tipo de sexy procurando, você também pode fazer i + = 1, que é a versão mais feio do mesma idéia para postfix incrementação. Digo isso e você deve fazer o divertimento dele, mas você vai ver como código algo bonito em pouco tempo. [Risos] DAVID J. MALAN: Direito? Sim. Pergunta no meio. AUDIÊNCIA: Você precisa dizer int n? DAVID J. MALAN: Você faz Não precisa dizer int n. Então, porque já dissemos int, você não precisa dizer isso de novo. O problema é que n tem que ser o mesmo tipo de dados, como eu. Então, isso é apenas uma conveniência aqui. Sim. AUDIÊNCIA: Você pode passar por cima da suporte de impressão de caracteres s i de novo? DAVID J. MALAN: Absolutamente. Então,% c, lembrar da última tempo, é apenas um espaço reservado. Significa colocar um char aqui. n invertida, é claro, apenas meio colocar uma quebra de linha aqui. Então, isso só deixa, agora, este pedaço de nova sintaxe. E este é, literalmente dizendo, grab a seqüência de chamada s e ir buscar sua caráter i'ésima, por assim dizer. E eu continuo dizendo caráter i'ésima porque em cada iteração deste circuito é como se estamos imprimindo , em primeiro lugar s suporte 0, como programador poderia dizer. Então é faixa 1, em seguida, s suporte 2, em seguida, 3, 4, em seguida. Mas é claro que é uma variável, então eu apenas expressá-la com i. Chave, porém, é perceber, especialmente se você não ter se aclimatando a este mundo de programação, onde todos nós parecem contar a partir de zero, tem que começa a contar do zero agora. Porque cordas, primeiro caractere, o z em Zamyla é para melhor ou para pior vai viver no número de localização zero. Tudo bem, então deixe-me trazer nos de volta aqui para Zamyla e ver o que realmente está acontecendo por baixo do capô. Portanto, não há essa noção de type casting. Você pode ter, na verdade, jogado com isso já, talvez para o hacker edição do P definido. Mas type casting apenas se refere ao habilidade em C e outras linguagens para converter um tipo de dados para outro. Agora como podemos ver isso muito direta? Então isso, lembre-se, é o começo do alfabeto Inglês. E o contexto, recordar, a partir de como há uma semana é ASCII. A American Standard Code for Information Interchange. Que é apenas um longo caminho de dizer um mapeamento a partir de cartas de números, e de números para letras. Então, de A a M aqui, dot dot ponto, alinhado com, recall, o número decimal 65 em cima. E nós não falamos sobre isso explicitamente, mas certamente há semelhante números às letras minúsculas. E, de fato, existem. O mundo decidiu há alguns anos atrás que um pouco, minúsculas a, vai ser 97. E pouco b vai igual a 98, e assim por diante. E para qualquer outra tecla na seu teclado, há Vai ser um padrão semelhante de bits. Ou equivalentemente, um número decimal. Então, a questão em apreço, então, é como podemos realmente ver esta debaixo do capô? Então, eu estou indo para ir para gedit novamente. E em vez de Tipo este a partir do zero, Eu estou indo para ir em frente e basta abrir mão de algo a partir do código de hoje chamado ASCII zero. E zero ASCII se parece com isso. Então, vamos envolver nossas mentes em torno deste. Então, primeiro, eu comentei o código, que é bom. Porque é literalmente me dizendo o que esperar, apresentar um mapeamento para letras maiúsculas. Agora eu não sei bem o que eu quer dizer com isso, então vamos inferir. Em Inglês, talvez Inglês um pouco techie, o que faz a linha 18 aparecem estar fazendo por nós? Apenas a linha 18. O que é que a indução? O que é que vai começar aqui? AUDIÊNCIA: Um loop. DAVID J. MALAN: Um loop. E quantas vezes é que vai fazer uma iteração? AUDIÊNCIA: [interpondo VOZES] seis vezes. DAVID J. MALAN: não seis vezes. AUDIÊNCIA: 26 vezes. David J. MALAN: 26 vezes. Sim, desculpe. 26 vezes. Por quê? Bem, é um pouco estranho, mas Eu comecei a contar a partir de 65 anos. O que é estranho, mas não é errado. Não é ruim por dizer. E eu estou fazendo isso só porque, para este exemplo, Eu sou o tipo de antecipação que o capital A foi de 65. Agora, isso não é o mais elegante maneira de fazer isso, a espécie de código rígido valores esotéricos que ninguém é sempre esperado para recordar. Mas, por agora, perceber que eu sou fazendo isso através de 65 mais 26. Porque, aparentemente, eu não quero nem para fazer a aritmética na minha cabeça. Então eu vou deixar o compilador fazê-lo. Mas, então, em cada ciclo, cada iteração do circuito, estou incrementando i. Então, agora isso parece um pouco enigmática. Mas devemos ter o básico de construção blocos com que entender isso. % C é apenas um espaço reservado para um char. % I é um espaço reservado para um int. E verifica-se que, ao utilizar este nova sintaxe, este parêntesis, então falar, portanto, um tipo de dados dentro de um parêntesis Eu posso forçar o compilador a tratar i não é um número inteiro, mas como um char. Assim, me mostrando o caráter equivalente a esse número. Agora aqui em baixo, este código é praticamente idêntico. Eu só queria fazer Super explícito o fato de que eu estou começando a 97, o que é minúsculo a. Na acima por mais 26 letras. E eu estou doing-- novamente, lançando i, por assim dizer. Ou type casting i, por assim dizer. A partir de um int para um char. Assim, o resultado final vai ser, francamente, informações que já sabemos. Eu vou fazer ascii-0 não dot-- ponto c. Observe, você provavelmente fez isso erro que eu só fiz acidentalmente. Faça ascii-0. Agora eu vou fazer ./ascii-0. Vou aumentar o zoom, e, infelizmente, vai rolar para fora da tela. Mas vemos um gráfico inteiro onde a mapas a 97, b mapas para 98, e se deslocar para cima ainda mais Um, é claro, mapeia a 65. Então, isso é só para dizer que o que tenho pregado, há essa equivalência, é de facto, o caso na realidade. Assim, uma modificação rápida da presente. Deixe-me abrir ascii-1.c. E perceber isso inteligente, tipo de, a clarificação deste. Esta é ascii-1.c, e perceber essa coisa louca. E isso realmente chega ao coração de que os computadores estão fazendo. Mesmo que nós seres humanos pudéssemos não contam em termos de letters-- Eu não começar a pensar, Tudo bem, então um b, e usá-las para contar objetos físicos. Você pode certamente dizer que eu quero inicializar alguns variável chamada C-- mas eu poderia ter chamado este qualquer coisa-- então c é inicializado ao capital A. Porque no final do dia, o computador não importa o que você está armazenando, ele só se importa como você quer apresentar essa informação. Como você quer que o computador interpretar esse padrão de bits? Então isso não é algo que eu , em geral, recomendo fazer. É realmente apenas um exemplo para saber que você pode absolutamente inicializar um inteiro para um char. Devido ao baixo capô de um char, é claro, é apenas um número de 0 a 255. Assim, você pode certamente colocá-lo dentro de um int. E o que isso também demonstra é que nós pode converter de um tipo para outro, aqui, em última análise, a impressão do mesmo. E, de fato, isso eu vou corrigir online-- era para dizer isso, mais uma vez, aqui. Deixe-me limpar isso on-line, e nós vamos ver em um passo a passo on-line, se necessário, o que se pretende não. Está bem. Assim último exemplo, agora envolvendo A e B e, em seguida, nós vamos levar as coisas acima de um entalhe. Assim, com um e B e c está na capitalização e a equivalência destes, vamos dê uma olhada neste exemplo, aqui. Outro exemplo de código. Vamos abrir um que é já realizados, para que não precisa digitá-lo tudo a partir do zero. E observe, em antecipação estamos usando cabeçalho múltipla arquivos, entre os quais se nosso novo amigo, string.h. Agora isso parece, à primeira vista, um pouco enigmática. Mas vamos ver se não podemos raciocinar através do que está acontecendo aqui. Primeiro eu tenho uma string do usuário, e eu coloquei essa string em uma variável chamados s. Copiar de antes. Na linha 22, sou aparentemente fazendo exatamente o que Eu fiz há pouco, estou interagindo sobre os personagens de s. E os novos truques aqui estão usando comprimento da corda, a otimização menor de armazenar o comprimento da corda em n, Em vez de chamar strlen novamente, e de novo, e de novo. E apenas verificando que i é menor que n. Agora, aqui, as coisas ficam um pouco interessante. Mas é apenas uma aplicação desta mesma idéia nova. O que faz em Inglês s suporte i representa? AUDIÊNCIA: Contando cada caráter [inaudível]. DAVID J. MALAN: Contando cada personagem. E ainda mais sucinta, s suporte i representam o que? Você diria. Não colocá-lo no local aqui. AUDIÊNCIA: Bem-- DAVID J. MALAN: Então, se a palavra é-- se a corda é Zamyla, que starts-- AUDIÊNCIA: --você lidar com os caracteres separately-- DAVID J. MALAN: Good. Exatamente. A notação colchete permite para acessar cada personagem individualmente, então s suporte 0 vai ser o primeiro caractere na string. s suporte 1 vai ser o segundo, e assim por diante. Então, a pergunta que eu estou pedindo, aqui, nesta condição é o quê? O personagem i'ésima de s maior ou igual a um minúsculas? E o que isso significa, aqui, com as duplas e comercial? AUDIÊNCIA (em conjunto): E. DAVID J. MALAN: E. É apenas o equivalente a isso. E não é uma palavra-chave em C, você tem que uso, irritantemente, comercial e comercial. E isso, por outro lado, está a pedir é s de i'ésima caráter inferiores ou iguais para minúsculas z? E mais uma vez, aqui é onde compreender o subjacente implementação de um computador faz sentido. Observe que, apesar de eu ter o dot dot dot lá, Parece que de A a Z em minúsculas são todos os valores de 97 contíguas superior em cima. E mesmo para maiúsculas a partir de 65. Assim, o takeaway, então, é que, em Inglês, como você descreveria que linha 24 está fazendo? Sim? AUDIÊNCIA: No dia 24 é a verificação para ver se cada personagem é uma minúscula. DAVID J. MALAN: É verificar se cada personagem é uma letra minúscula. Assim, mesmo de forma mais sucinta, é o caráter i'ésima de s minúsculas? Isso é tudo o que somos expressar aqui, logicamente, um pouco enigmático, mas em última análise, muito direta. É S de i'ésima letra minúscula? Se assim for, e aqui é onde as coisas ficar um pouco mente dobra só por um momento, se assim for, vá em frente e imprimir um caráter. Portanto, este é apenas um espaço reservado, mas o personagem? Por que estou fazendo s suporte de i menos essa expressão aqui? Bem perceber o padrão aqui. Os números reais não importam tanto. Mas note que 97 é quão longe de 65? AUDIÊNCIA: 32. DAVID J. MALAN: 32. A que distância é de 98 a partir de 66? AUDIÊNCIA: 32. DAVID J. MALAN: Pouco c de grande C? 32. Portanto, há 32 saltos de uma carta para o outro. Então, sinceramente, eu, poderia simplificar este àquele. Mas então eu estou codificação um pouco difícil esta compreensão baixo nível que não é sempre leitor vai entender. Então eu vou generalizar-lo como eu conhecer as letras minúsculas são maiores. Eu sei que as letras maiúsculas são valores menores, ironicamente. Mas esta é efectivamente equivalentes aos dizendo subtrair 32 de s suporte de i. Assim, no âmbito destes letras, se a carta passa a ser, uma minúscula um, e eu subtrair 32, qual o efeito que isso tem, matematicamente, em letras minúsculas de a? AUDIÊNCIA: Capitalizes-- David J. MALAN: Capitalizes ele. E, de fato, é por isso que o nosso programa é chamado de capitalizar zero. Este programa quer capitaliza uma carta, depois de verificar se é na verdade, uma letra minúscula. Caso contrário, na linha 30, o que devo fazer se não é uma letra minúscula que eu sou olhando numa determinada iteração do loop. Basta imprimi-lo. Portanto, não mudar coisas isso não é mesmo minúsculas. Restringir-se a um pouco através pouco z. Agora isso é bastante misterioso. Contudo, no final do dia, esta É assim que, certa vez, teve que implementar coisas. Se eu, em vez aberto capitalizar um, oh graças a Deus. Há uma função chamados a superior que pode fazer tudo o que acabamos de fazer a um nível relativamente baixo. Agora, para superior é interessante porque ele é declarado em um arquivo, e você só saberia disso verificando a documentação, ou sendo dito, por exemplo, em sala de aula, onde ele existe, num ctype.h arquivo chamado. Portanto, este é um novo amigo nosso. E superior faz exatamente o que seu nome sugere. Você pode passar, como argumento, entre estes parênteses, algum personagem. Vou passar no caráter i'ésima de s usando nossa nova notação fantasia envolvendo colchetes. E dar um palpite, que é o retorno valor superior a, aparentemente, vai ser? A letra maiúscula. A letra maiúscula. Então, se eu passar em letras minúsculas a, espero que, por definição de para superior, ele vai retornar um maiúscula A. Caso contrário, se não é uma letra minúscula em primeiro lugar, eu só imprimi-lo. E, de fato, observe a segundo amigo aqui. Não apenas a parte superior existe, mas é mais baixa, o qual na verdade, responde a essa pergunta para mim. Agora quem escreveu essas coisas, 10s de anos atrás, você sabe o quê? Implementado para superior e é baixar usando um código como este. Mas, novamente, consistente com essa idéia de abstrair, tipo, nível mais baixo detalhes de implementação. E de pé sobre os ombros de pessoas que vieram antes de nós, através de funções como a parte superior e inferior é, que maravilhosamente suficiente são bem chamado para dizer o que eles fazem, é um paradigma maravilhoso para adotar. Agora, acontece que se eu ler a página man para, digamos, a parte superior, Eu aprendo algo mais. Assim, o homem toupper. É um pouco esmagadora. Mas aviso, aqui está que a menção de o arquivo de cabeçalho que eu deveria usar. Como um aparte, porque esta é enganosa, a função usa inteiros em vez de caracteres por razões de verificação de erros. Mas vamos talvez venha de volta para que, no futuro. Mas note, aqui, aos convertidos superiores a letra c em maiúsculas, se possível. Então, isso é bastante simples. E agora vamos ser um pouco mais específico. Vamos olhar para a parte do página do manual sobre valor de retorno. O valor retornado é que da carta convertido. Ou c, se a conversão não foi possível, em que c é a entrada original. Que eu sei que a partir daqui, a partir de o argumento para a superior. Então, qual é o takeaway isso? O valor retornado é que da carta convertido, ou c, a letra original, se a conversão não foi possível. O que melhora posso, portanto, fazer o projeto do meu código? Sim? AUDIÊNCIA: Você pode remover o resto. DAVID J. MALAN: eu puder remova a instrução else, e não apenas a instrução else. AUDIÊNCIA: Você pode remover [inaudível]. DAVID J. MALAN: eu puder remover todo o garfo na estrada, o caso mais completo. Então, na verdade, deixe-me abrir a versão final deste, capitalizar-2 e perceber o quão, se você vai, sexy, o código está começando agora, em que eu reduzido de alguns sete ou mais linhas para apenas quatro, a funcionalidade que eu pretendia simplesmente chamando a superior, passando s suporte de i, e impressão para fora, com o espaço reservado% c, que o caráter particular. Agora, sem dúvida, não é um erro, ou, pelo menos, o risco de um erro, neste programa. Então, só para voltar para uma viagem mais cedo, o que devo fazer, provavelmente, também em este programa para torná-lo mais robusto, de modo que não há nenhuma maneira ele pode falhar, mesmo em casos raros? AUDIÊNCIA: Certifique-se de que não é NULL. DAVID J. MALAN: Certifique-se de que não é NULL. Então, realmente, para fazer este super bom, eu deveria fazer algo como: Se s não for nulo, então vá em frente e executar estas linhas de código, que Eu posso então travessão assim, e, em seguida, colocar na minha chave de fechamento. Tão bom subordinação junto das duas idéias. Sim? AUDIÊNCIA: Você poderia usar um loop Do While, em vez disso? DAVID J. MALAN: Could Eu faço um loop Do While? AUDIÊNCIA: --você quer certificar-se que você realmente [inaudível]. DAVID J. MALAN: Could você usa um do tempo? Resposta curta, não. Porque você está prestes a introduzir um outro caso canto. Se a string é de comprimento zero. Se, por exemplo, eu só bater Enter, sem nunca digitando Zamyla. Vou entregá-lo de volta um real corda, como vamos finalmente ver, que tem zero caracteres. Ainda é uma string, é apenas super curto. Mas se você usar um do tempo, você vai cegamente tentar fazer algo com relação a essa seqüência, e nada vai estar lá. AUDIÊNCIA: Bem, se você fez fazer [inaudível] enquanto s-- DAVID J. MALAN: Oh, eu vejo, manter recebendo uma string do usuário. Resposta tão curta, você poderia, e manter importunando lhes dar-lhe uma cadeia que é curta o suficiente para caber na memória. Absolutamente. Eu só não quis. Se eles não me dão a seqüência I quiser, eu vou desistir, eu vou desistir. Mas, absolutamente, para esse efeito, você pode absolutamente fazer isso. Assim, arquivos de cabeçalho da biblioteca que agora estamos familiarizados com são estes, aqui. Padrão I / O, CS50.h, string.h, ctype.h, e há, de fato, outros. Alguns de vocês já descobriram a biblioteca de matemática em math.h. Mas deixe-me apresentar-lhe, agora, a este recurso que o pessoal CS50, Davin, e Rob, e Gabe especial têm juntos. Que em breve ligação em site do curso. É chamado CS50 referência. Que só para lhe dar um rápido gosto disso, funciona como se segue. Deixe-me ir para reference.cs50.net. Você vai ver na mão esquerda o outro uma lista esmagadora de funções que vêm com c. Mas se eu me importo, para o momento, sobre algo como strlen, I pode digitá-lo lá. Ele filtra a lista apenas o que me interessa. Vou clique nele. E agora sobre a esquerda, você vai ver o que nós esperamos é um mais simples, humano explicação amigável de como Esta função funciona. Retorna o comprimento de uma corda. Aqui está um resumo, aqui está como você usá-lo em termos de arquivo de cabeçalho, e em termos do que a função Parece que em termos de seus argumentos. E então, aqui, os retornos o comprimento de uma string. Mas para aqueles de vocês mais confortável, você realmente pode clicar mais confortável, e os conteúdos desta página, agora, vai mudar ser os valores padrão do que você começa usando a página homem. Em outras palavras, CS50 referência é uma simplificação de páginas de manual pela equipe, para os alunos. Particularmente, os menos confortável e no meio, de modo que você não tem que tentar envolvê sua mente em torno, francamente, alguma sintaxe críptica e documentação em algum momento. Portanto, manter isso em mente nos dias que virão. Então, aqui, mais uma vez, é um Zamyla. Vamos agora fazer uma pergunta que é um pouco mais acessível humano. Graças a Chang, que tem sido imprimir mais elefantes sem parar durante os últimos dias. Temos uma oportunidade de dar pelo menos um deles de distância. Se pudéssemos obter apenas um voluntário que se aproximasse para desenhar na tela. E aqui? Vamos lá para cima. Qual é o seu nome? ALEX: Alex. DAVID J. MALAN: Alex. Tudo certo. Alex, vamos lá para cima. Estamos prestes a ver o seu escrita na tela aqui. Tudo bem, prazer em conhecê-lo. ALEX: Nice você conhecê-lo. DAVID J. MALAN: Tudo bem. Assim, o exercício super simples. Bar não é alta para obter um elefante hoje. Você está fazendo o papel de getString. E eu vou apenas dizer-lhe a seqüência de caracteres que você chegou. E suponha que você, getString, foram chamados. E o ser humano, como eu, tem digitei Zamyla, Z-A-H-Y-L-A. Basta ir em frente e escrever Zamyla no tela como se você tivesse conseguido e armazenados em algum lugar na memória. Deixando espaço para o que vai ser várias outro palavras-- tudo bem, continue. [Risos] Então Zamyla, excelente. Então, suponha que você, getString, são chamados novamente. E, portanto, eu lhe fornecer, no teclado, com outro nome, Belinda. Tudo certo. E agora o getString próxima vez é chamado, eu digitar algo como Gabe, L-A-B-E. Você realmente está tomando ao coração de memória de acesso aleatório. Que está atraindo tudo de forma completamente aleatória. Está bem. [Risos] ALEX: Desculpe minha letra é ruim. DAVID J. MALAN: Não, isso é OK. E como sobre Rob, R-O-B. Está bem. Boa. Então, eu não esperava que seria tipo de colocar as coisas desta maneira. Mas podemos fazer este trabalho. Então como é que você vai fazer sobre postura esses caracteres em memória? Em outras palavras, se pensarmos esta tela preta retangular como representando um RAM, ou memória do computador. E lembrar que a RAM é apenas um monte de bytes, e bytes são um monte de bits. E bits são de alguma forma implementado, geralmente com alguma forma de eletricidade em hardware. Então, isso é uma espécie de estratificação nós já conversamos sobre e agora pode tomar para concedido. Como é que você vai fazer sobre decidir onde escrever Rob contra Gabe contra Belinda contra Zamyla? ALEX: Eu só fiz isso no ordenar que você me disse. DAVID J. MALAN: E isso é verdade. Mas o que rege onde você coloca O nome de Belinda eo nome de Gabe? ALEX: Nada? DAVID J. MALAN: [Risos] Assim que funciona, isso é bom. Assim, os computadores são pouco mais ordenada do que isso. E assim quando nós implement-- ficar lá por apenas um moment-- quando nós realmente implementar algo como getString em um computador, Zamyla pode ser colocado para fora praticamente como você fez na tela, não. E o que é fundamental para perceber aqui, o Alex fez, é que há uma espécie de demarcação entre cada uma dessas palavras, certo? Você não escreveu Z-A-H-Y-L-A-B-E-L-I-N-D-A-L-A-B-- em outras palavras, há algum tipo de demarcação que parece ser, de alguma forma, espaçamento aleatório entre estas várias palavras. Mas isso é bom, porque nós, humanos, podemos agora visualizar que estes são quatro cordas diferentes. Não é apenas uma seqüência de muitos personagens. Assim, um computador, então, enquanto isso, pode ter uma string como Zamyla, colocar cada uma dessas cartas dentro de um byte de memória. Mas esse número é muito maior, é claro, do que seis caracteres. Há um monte de RAM. E assim, a partir de agora, este grade de caixas vai para representar o que Alex apenas fiz aqui na tela. E agora, Alex, podemos oferecer-lhe um azul ou um elefante laranja de Chang. ALEX: Vou levar um elefante azul. DAVID J. MALAN: Um elefante azul. Assim, uma grande salva de palmas, se pudéssemos, por Alex aqui. [Aplausos] ALEX: Obrigado. DAVID J. MALAN: Obrigado. Então, o que é estaladiça, muito embora o padrão meio que mudou ao longo do tempo, aqui na placa, havia um demarcação entre as diversas cadeias que Alex tem para nós. Agora, os computadores, francamente, poderia fazer a mesma coisa. Eles poderiam tipo de chape cordas em qualquer lugar na RAM. Até aqui, aqui, aqui em baixo, aqui em baixo. Eles poderiam fazer exatamente isso. Mas, claro, isso é provavelmente não o melhor planejamento. Certo? Se eu ficava perguntando para Alex obter nomes, provavelmente ele tinha colocar um pouco mais aqui, talvez até aqui, aqui, aqui, eventualmente, aqui. Mas, com um pouco mais de planejamento, certamente, poderíamos colocar as coisas de forma mais limpa. E, de fato, é o que um computador faz. Mas o problema é que se a próxima seqüência de eu chegar depois Zamyla é algo como a Belinda, propor onde podemos escrever o letra b com relação a esta rede? Para onde você iria? Para a direita da um, abaixo a z, a seguir a um? Quais seriam seus primeiros instintos ser? AUDIÊNCIA: Abaixo a z. DAVID J. MALAN: Então, abaixo da z. E isso é muito simples, certo? É uma espécie de puro, que é o que fazemos em um teclado quando teclar Enter, ou um e-mail ao fazer uma lista com marcadores das coisas. Mas a realidade é que os computadores tente ser mais eficiente, e empinar certamente tanto dados na memória RAM quanto possível, para que você não perca nenhum bytes. Para que você não perca qualquer imóvel tela. E o problema, porém, é que se, literalmente, colocar a letra b depois de um, como é que vamos sabe onde o nome de Zamyla termina eo nome da Belinda começa? Então, vocês humanos apenas proposto, bem, pressione a tecla Enter, essencialmente. Coloque-o abaixo. Ou até mesmo como Alex fez, basta começar a escrever o seguinte nome abaixo do anterior, e abaixo que um, e em seguida, abaixo dessa. Isso é um sinal visual. Os computadores têm outra sugestão visual, mas é um pouco mais sucinto. É esse personagem mal-cheiroso. 0 barra invertida, o que é talvez reminiscência de barra invertida n, e assim por diante, agora. As seqüências de escape especiais. Barra invertida 0 é o caminho da representando oito bits zero em uma fileira. 0000 0000. A maneira como você expressar que não é atingiu o número zero no teclado, , porque, de facto, que é um carvão ASCII. Parece um número, mas é, na verdade, um número decimal que representa a circular glifo, a fonte circular. Enquanto isso, a barra invertida zero significa, literalmente colocar oito bytes zero aqui para mim. Portanto, este é um tanto arbitrária. Nós poderíamos ter usado qualquer padrão de bits, mas o mundo decidiu alguns anos atrás, que, para representar a extremidade de uma corda na memória, basta colocar um monte de zeros. Como podemos detectar isso. Agora, o que significa que nenhuma carta do alfabeto podem ser representados por zeros. Mas tudo bem, já vimos que estamos usando 65 em em 97 em cima. Nós não chegar a lugar nenhum Perto de todos os zeros. Então Belinda na memória de um computador está realmente indo para ir para lá. Eu desenhei ele em amarelo apenas para chamar a nossa atenção para ele. E notem, também, este é completamente arbitrária. Eu desenhei-a como uma grade. Como, RAM é apenas um objeto físico. Ele não tem necessariamente linhas e colunas, de per si. Ele só tem um monte de bytes implementado em hardware de alguma forma. Mas se depois Belinda I digitado em nome de Gabe, ele vai acabar aqui na memória, e se eu digitei o nome de Daven, por exemplo, ele vai acabar por aqui. E eu posso continuar a escrever ainda mais nomes. Infelizmente, se eu tentar escrever uma super longo nome, Eu poderia, eventualmente, ficar sem memória. Nesse caso, é getString vai retornar NULL, como dissemos. Mas, felizmente, pelo menos neste visuais aqui, nós não conseguimos tão longe. Agora, o que é bom é que esta idéia geral de tratar as coisas como em caixas é representativo de uma característica de C e um monte de línguas, conhecida como uma matriz. Um array é um outro tipo de dados. É uma estrutura de dados, se você quiser. Estrutura, no sentido de que, realmente, tipo de, parecendo uma caixa, pelo menos no olho da sua mente. Uma matriz é um contíguo seqüência de tipos de dados idênticos, volta para trás a volta para trás. Assim, uma corda, em outro palavras, é uma matriz de caracteres. Uma matriz de caracteres. Mas acontece que você pode ter matrizes de cachos de coisas. Na verdade, podemos colocar ainda os números em uma matriz. Assim, a forma na qual vamos começar declarar esses dados estrutura conhecida como uma matriz também vai usar colchetes. Mas esses colchetes vão têm um significado diferente neste contexto. E vamos ver como se segue. Suponha que eu abri -se aqui um novo ficheiro. E eu salve como ages.c. E eu vou guardar isso na minha pasta aqui. E agora eu estou indo para a frente e começar a digitar algo como incluir CS50.h incluem stdio.h, int void main. E então, aqui dentro, eu quero a primeira tem um int chamado idade. E eu vou usar isso para obter um int do usuário para a sua idade. Mas este programa destina-se a ser utilizado por várias pessoas, por qualquer contexto. Eu tenho uma fila de pessoas. Todos eles tem que digitar sua idade para talvez alguns, eu não sei, competição ou evento que eles chegaram para. Portanto, a próxima pessoa, eu preciso de outra variável. Porque se eu só faço idade fica getInt, isso é vai espancar, ou substituir a idade da pessoa anterior. Então, isso não é bom. Então, meu primeiro instinto pode ser, oh, tudo bem, se eu quiser obter várias pessoas da ages-- vamos chamar este idade1, int age2 recebe int, int idade3 recebe getInt. E agora eu vou usar algum código pseudocódigo aqui. Faça alguma coisa com esses números. Vamos deixar para outro dia o que estamos fazendo lá, porque nós só cuidado com o momento cerca de idade1, idade2, idade3. Infelizmente, uma vez que eu compilar este programa e colocá-lo na frente de usuários reais, qual é a má concepção fundamentalmente decisão que parece ter feito? Sim? AUDIÊNCIA: [inaudível] DAVID J. MALAN: Sim, Eu nem sequer tentei para descobrir como muitas idades eu realmente se preocupam? Se eu tiver menos de três pessoas aqui, e, portanto, menos de três séculos, Eu ainda estou esperando cegamente três. Deus me livre quatro pessoas aparecem. Meu programa só não vai mesmo apoiá-los. E assim, este, longa história Resumindo, não é um bom hábito. Certo? Eu estava essencialmente copiando e colando o código e apenas ajustes os nomes das variáveis. E, meu Deus, se você tivesse, não três as idades, mas 10, ou 100, ou até 6500 alunos de graduação, por exemplo. Isso não vai ser particularmente código elegante, ou sustentável. Você vai ter que reescrever o programa de cada vez o número de pessoas muda. Então, felizmente, em nosso atual arquivo ages.c para hoje, temos uma solução mais inteligente. Em primeiro lugar, eu vou pedir o construir usamos algumas vezes, fazei isto enquanto loop, a fim de obter o número de pessoas na sala. Eu estou indo só para incomodar o usuário, mais uma vez e outra vez, até que ele ou ela me dá um valor de n é um inteiro positivo. Eu poderia ter usado, último tempo de obter int positivo. Mas não temos que for real, então eu fui em frente e está implementada essa idéia. Agora aqui, este é o novo truque. Na linha 27, como os comentários na linha 26 sugere, declarar uma matriz em que para armazenar a idade de todos. Então, se você deseja obter, e não um int, não duas interrupções, mas todo um conjunto de inteiros. Especificamente n inteiros, eram n pode ser três, pode ser 100, pode ser 1000. A sintaxe, muito simplesmente, é a por exemplo, que tipo de dados que você quer? O que você deseja chamar que pedaço de memória? O que você deseja chamar a grade que se parece com isso pictoricamente? E entre parênteses aqui, você diz como grande você quer a matriz para ser. E assim, mais cedo, quando eu disse que o sintaxe é um pouco diferente aqui, ainda estamos usando colchetes, mas quando eu estou declarando uma matriz, o número dentro do colchetes meios Qual o tamanho que você deseja que o conjunto estar. Por outro lado, quando estávamos usando s suporte de i há pouco, s, uma string, é de fato uma matriz de caracteres, mas quando você não está declarando uma variável, como aqui com esta palavra-chave, você está simplesmente recebendo um índice específico, um específico elemento dessa matriz. Uma vez que sabemos que, o resto isso é simples. Se o novo Vou primeiro para imprimir qual é a idade da pessoa número i. Onde eu acabei de dizer número um pessoa, pessoa número dois, número três pessoa. E eu só estou fazendo aritmética, de modo que, como pessoas normais, contamos a partir de um para este programa, e não a partir de zero. Então eu chamo getInt, mas eu armazenar a resposta em idades adaptador. Qual é o i-ésimo idade na matriz. Assim, enquanto última vez que estavam tratando essas caixas como caracteres para o nome de Zamyla, e outros. Agora, essas caixas representam 32 bits, ou quatro bytes em que podemos armazenar um int, int, int. Todos os quais, de novo, são o mesmo tipo de dados. Agora eu faço algo bobo, como o tempo passa, apenas para justificar a escrever este programa. E então aqui em baixo, volto a iteração sobre a matriz dizendo daqui a um ano, pessoa número um testamento ser algo anos de idade. E para descobrir o que math-- Quer dizer, isso não é muito complicado arithmetic-- Acabei de adicionar um para sua idade. Só para demonstrar, mais uma vez, este. Assim como eu posso índice em uma seqüência, s, para que eu possa índice em uma matriz de idades, assim há. Então, onde é que isto vai ser nos levando? Então, vamos ver, em última análise, uma Algumas coisas nos dias que virão. Um deles, de todo esse tempo, quando escrever seus próprios programas, como Mario, ganancioso, de crédito. Você foi a digitar o nome o programa e pressionar Enter. E em seguida, obter a entrada do usuário. Com getString, getInt, getLongLong, ou semelhantes. Mas acontece que os suportes C algo chamado de linha de comando argumentos, que vai nos deixar realmente chegar ao ouvir as palavras que você digita, no prompt piscando, após o nome do seu programa. Assim, nos dias que virão, você pode digitar algo como César, ou ./caesar número 13, a partir daí. Vamos ver como isso funciona. Porque, de fato, em conjunto de problemas dois, estamos vai apresentá-lo para uma coisinha reminiscência de Ralphie de desafiar antes da cartografia. A arte de codificação de informações. Isto, de facto, é muito lembra o que Ralphie fez. Este é um exemplo de uma codificação chamado algoritmo rot13, R-S-T 13. O que significa simplesmente girar o letras do alfabeto 13 lugares. E se você fizer isso, você vai ver agora o que é, talvez, uma frase familiar. Mas a forma como vamos usar isto, em última instância, é uma forma mais geral. Em P definir dois, na edição padrão, você vai implementar um par de cifras, um chamado César, um chamado Vigenere. Ambos são rotacional cifras, em que de alguma forma você transformar uma letra em uma letra diferente. E César é super simples. Você pode adicionar um, você adiciona 13, ou algum número até 26. Vigenere faz isso em uma base por carta. Então Vigenere, como você verá na especificação, é mais seguro. Contudo, no final do dia, o que você estará implementando e P definir dois, é a chave que você use tanto para criptografia e descriptografia. Referindo-se ao processo de transformar texto simples, alguma mensagem original, em texto cifra, que é algo encriptado. E depois decodificá-los novamente. Na edição de hacker Enquanto isso, você estará encarregado de algo semelhante em espírito, onde nós vamos dar-lhe um arquivo, a partir de um Linux típico, ou Mac, Unix ou computador chamado Etsy palavra-passe, o qual contém um conjunto bando de nomes de usuários e senhas. E as senhas têm tudo foram criptografados, ou hash, por assim dizer, mais propriamente como você verá na spec. E a edição hacker vai desafiar vós, sendo uma entrada como esta, e quebrar a senha. Ou seja, descobrir o que o senha do ser humano, na verdade, era. Porque, de fato, as senhas são geralmente não são armazenados em claro, e, geralmente, as senhas deve ser difícil de adivinhar. Isso não é frequentemente o caso. E o que eu pensei que ia fazer é Concluo com um par de minutos olhar para um particular má escolha de palavras-passe a partir de um filme que você deve se lembrar com carinho. E se não, você deve alugar. [REPRODUÇÃO] -Helmet, Você diabo, o que está acontecendo? O que você está fazendo com a minha filha? -permitir-Me apresentar o brilhante cirurgião plástico jovem, Doutor Phillip Schlotkin. O maior nariz do homem no trabalho universo inteiro e Beverly Hills. -Seu Alteza. Trabalho -Nose? Eu não entendi. Ela já tinha uma plástica no nariz. Era o seu doce 16 presentes. Não, não é o que você pensa. É muito, muito pior. Se você não me der o combinação com o escudo de ar, médico Schlotkin vai dar o seu filha de volta seu antigo nariz. - [Suspiros] Nooooooooooooo. Onde você conseguiu isso? -Certo. Eu vou te dizer, eu vou dizer. Não, papai, não. Você não deve. -Você Direito meu caro. Vou sentir falta de seu novo nariz. Mas eu não vou dizer-lhes o combinação não importa o quê. -Muito Bem. Doutor Schlotkin, faça o seu pior. O prazer é meu. Não! Espere, espere. Eu vou te dizer. Eu vou te dizer. Eu sabia que ele iria trabalhar. Tudo bem, dê para mim. -The Combinação é um deles. -One. -One. -Dois. -Dois. -Dois. -Três. -Três. -Três. -Quatro. -Quatro. -Quatro. -Cinco. -Cinco. -Cinco. -Então A combinação é um, dois, três, quatro, cinco. Essa é a combinação mais estúpida Eu já ouvi na minha vida. Esse é o tipo de coisa que um idiota teria em sua bagagem. Obrigado, sua Alteza. [CLIQUES REMOTE] -Qual Que você fez? -I Desligado da parede. Não, você não fez, você desligada todo o filme. Deve ter -I apertou o botão errado. Bem, colocá-lo novamente! Coloque o filme de volta! Sim, senhor! Sim, senhor. -Vamos, Arnold. Venha, Gretchen. É claro que você sabe que eu vou tem que cobrá-lo por isso. Bem? Será que isso funciona? Onde está o rei? -It Trabalhou, senhor, têm a combinação. -Grande. Agora podemos tomar cada ú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. -É Incrível. Eu tenho o mesmo combinação em minha bagagem. Prepare Spaceball 1 para partida imediata. Sim, senhor. -E Alterar o combinação em minha bagagem. [Fechamento da porta SOUND] [CLINK de portas CAPACETE QUE BATE] -Ahh. [FIM REPRODUÇÃO DE VÍDEO] DAVID J. MALAN: Isso é tudo para CS50, vamos vê-lo na próxima semana. NARRADOR: E agora, Profundo Pensamentos, por Daven Farnham. Daven FARNHAM: Codificação em C é muito mais difícil do que zero. printf, risco era uma mentira. [Risos SoundBite]