DAVID MALAN: Tudo bem. Portanto, esta é CS50, e este é agora o início da semana três. Então, até agora, nós temos se escrever programas em C que olhar um pouco algo parecido com isso aqui. Então, nós temos um par de afiado inclui, na parte superior. Temos int, principal, nula e então alguma coisa para fazer no meio, algum pedaço de código dentro dessa função. Mas chave tem sido o facto de que temos dito vazio aqui. Então, vazio, todo esse tempo, especifica que este programa, quando executado, só pode ser executado por meio de seu nome. Você não pode digitar quaisquer outras palavras ou números após o nome do programa quando executá-lo. Assim, por exemplo, se o programa foram compilados em um arquivo chamado Olá, você poderia fazer ./hello, mas é isso. A única maneira que você poderia contribuir para este programa é chamando uma função. Por exemplo, qual a função temos vindo a utilizar até agora para obter entrada do usuário? AUDIÊNCIA: Obter string. DAVID MALAN: Para obter corda, ou obter int, ou você já viu outros, mesmo se você não tê-los usado ainda, como obter muito, muito e afins. Mas suponha que realmente quer começar escrever programas que são pouco mais versátil, e, francamente, um pouco mais como os comandos que você recebido, espero, um pouco acostumado. Como cd espaço Dropbox. Isto, é claro, as alterações seu diretório, assumindo você está na casa de John Harvard diretório, em sua pasta Dropbox. Enquanto isso, um comando como este cria um novo diretório chamado pset2, como você já pode ter ou em breve para o problema de definir dois. Adicione Olá, é claro, é um comando que constrói um programa chamado Olá a partir de um arquivo chamado Olá ponto c. E em cada um desses casos, agora, nós tivemos proporcionam uma discussão sobre o chamado linha de comando, o prompt piscando, para que make sabe o que construir, e assim por que sabe o que mkdir pasta para criar, e para que cd sabe onde você quer ir. Mas até agora, continuamos a dizer que o principal, a função padrão, tem uma expressão vazia dentro desses parênteses, o que significa que ele não pode tomar quaisquer argumentos. Então, a partir de hoje, o que vamos fazer é, vamos começar apoiar coisas como esta mesmo. Na verdade, neste caso, o que lhe não costumam digitar manualmente, Faça vem fazendo isso para nós, não há um, mas de um, dois, três adicional cordas após o programa de chamada clang. Então, como vamos conseguir isso? Bem, a partir de hoje, nos casos em que queremos para fornecer entrada através do chamado de linha de comando, vamos começar a adicionar aqui o que está em yellow-- substituindo vazio com int argc vírgula corda argv suporte aberto fechar parêntesis. Agora isto é interessante por um par de razões. Um deles, que vai deixar-nos escrever programas que são um pouco mais dinâmico. Mas, mais convincente, que vai abrir agora uma conversa a respeito de o que matrizes podem realmente ser utilizado, para o que uma string realmente é debaixo do capô, até a próxima semana, quando começamos mergulho no mais profundo de como a máquina está fazendo todo esse trabalho material. Mas, por agora, vamos desenhar, talvez, uma foto. Quando você escreve um programa com principal declarada desta forma, de tal modo que principal recebe dois argumentos, um int e-- que tipo de dados é o segundo argumento? AUDIÊNCIA: Array. DAVID MALAN: Array. Portanto, parece à primeira vista como se fosse um corda, mas observar os colchetes. Lembre-se da última vez que introduziu a noção de uma matriz. E matrizes usar colchetes em um par de contextos. Você pode usar o quadrado suportes para ir em uma matriz e obter um elemento particular, como suporte 0 ou suporte de uma ou suporte 2. Mas vimos, ainda que brevemente, na semana passada que você também usar esses colchetes para declarar o tamanho de uma matriz, Se você sabe de antemão quantos ints ou como cadeias de muitos ou o que você realmente querem. Então não é que há um terceiro contexto aqui que não tem nenhum número dentro dos colchetes. Quando você especificar, como eu tenho aqui, o nome de algo como argv, que é apenas uma maneira elegante de dizendo argumento vetor, que é outra maneira extravagante de dizendo uma matriz de argumentos, suporte aberto fechar parêntesis apenas significa que você não precisa necessariamente saber com antecedência como grande a matriz vai ser, mas você sabe que vai ser um array. Então, se você não sabe o número não colocá-lo lá dentro, para suporte aberto fechar parêntesis significa que argv não é uma string, mas um conjunto de cordas. Então, sintaticamente, se você acho que volta na semana passada, é muito semelhante a dizer algo como int idades suporte aberto, e em seguida, depois disso algo. Então o que isso parece? Vamos realmente tirar uma foto. Então, quando você executar este programa com principal tendo dois argumentos definido dentro desses parênteses, é essencialmente têm pelo menos dois pedaços de memória entregue a você debaixo do capô. Um deles, como eu vou desenha como este retângulo, vai ser chamado argc. E assim como uma rápida recapitulação, qual é o tipo de argc dados? Portanto, é um int. Assim, um número vai para ir em turnos argc-- que representa o número de argumentos. Enquanto isso, eu desenhei argv como uma matriz. E eu realmente não sei quanto tempo vai ser, portanto, para fins de hoje dot dot dot. Pode ficar de algum tempo. Mas eu tenho mostrado aqui pelo menos quatro retângulos. Assim, argv um pedaço de memória que armazena string string cadeia dot dot dot, e argc é apenas um pedaço de memória para um número inteiro. Então, agora, vamos ser um pouco mais preciso. Se, quando eu tenho cordas Nesta matriz, chamado argv, quero chegar a eles individualmente, assim como na semana passada, vamos usar a notação como suporte argv 0 para obter a primeira coisa que um array. Argv suporte 1 para obter a segundo lugar, e assim por diante. A chave aqui é que ainda estamos 0 indexed-- ainda estamos contando a partir de 0. Então agora vamos realmente colocar alguma coisa nesse sentido. Se eu fosse para compilar um programa chamado Olá a partir de um arquivo chamado Olá ponto c, e então eu executar esse programa com ponto barra Olá, o que é que o meu computador, meu laptop, parecer debaixo do capô no momento em que executar dot reduzir Olá e pressione Enter? Bem, este é, talvez, o que poderíamos descrever como o conteúdo de seu computador de memória, ou memória de acesso aleatório RAM--. Em outras palavras, o computador, de alguma forma para que você passe de mágica, coloca o número 1 em argc, AKA argcount, e põe literalmente a string ./hello em argv suporte 0. Eu não tenho idéia, francamente, o que é no suporte argv 1 ou 2 ou 3, porque, se o usuário não tem digitado nada além ./hello, vamos supor que estes são valores de lixo mais prováveis, por assim dizer. Esses pedaços de memória existem, mas não cabe a nós de olhar para eles, porque o argcount é um só. Agora, enquanto isso, se eu escrever executar outro programa, cd, que é mais adequadamente um comando, em seu espaço de piscar cd prompt-- Dropbox-- quando eu corro que, efetivamente, quando o programa é executado cd, argc, dentro da memória do meu computador, é para o mais breve segundo o número 2. E, em seguida, o suporte tem argv cd, suporte argv 1 tem Dropbox, e depois, claro, o comando conclui, então tudo isso de memória essencialmente vai embora e é usado para outra coisa. E é por isso que eu digo apenas uma fração de segundo. Enquanto isso, se fizermos mkdir pset2, o quadro é quase o mesmo, mas com diferentes strings dentro argv. Se eu fizer clang traço Olá Olá ponto c, a mesma idéia. Mais material é preenchido para argv e argc, é claro, é 4. Assim, em outras palavras, mesmo que essa matriz pode ser dot dot dot, de algum de comprimento variável, por assim dizer, você sempre sabe onde o fim de tudo é, pois argc vai dizer em que ponto você tem que parar olhando para elementos em argv. Você só pode olhar para quatro no total, neste caso. Então, vamos agora dar uma olhada, talvez, um programa simples. Um que apenas diz Olá para alguém como Zamyla. Então, eu afirmo que vou escrever um programa em apenas um momento, através do qual eu poderia fazer ./hello espaço Zamyla, e então eu quero meu programa para imprimir algo super-simples, como "Olá, Zamyla." Agora, no passado nós usamos getString. Portanto, no passado, mesmo se você é novo em programação, chances são que você pode preparar uma programa que usa getString e então usa printf para dizer oi para Zamyla. Mas não vamos usar GetString neste momento. Deixe-me em vez de ir para o Appliant e que incluem padrão S dot h. Deixe-me também incluem CS50 ponto h. Agora int main, e agora eu sou não vai fazer vazio hoje. Em vez disso, eu vou fazer int argc corda argv suporte aberto fechar parêntesis, não especificar um número. E agora, aqui está o meu chamado para fazer. O que eu vou fazer agora é, eu sou vai fazer um pouco de um salto de fé, Eu vou assumir que o usuário do vai usar este programa corretamente, e eu estou indo simplesmente para fazer printf Olá,% sn. Portanto, nada de novo nisso. Mas eu quero agora colocar qualquer palavra que o tipos de usuários após o nome do programa. Então, se eu fizer ./hello espaço Zamyla, I quer de alguma forma programática acesso entre aspas "Zamyla." então eu pode ir para o meu argumento vetor, minha matriz de strings, e se o comando, de novo, foi ./hello espaço Zamyla, o número que eu quero para colocar em argv aqui? AUDIÊNCIA: 1. DAVID MALAN: 1, porque suporte 0 despeja vai ser o nome do programa, como vimos. Então suporte 1 é a primeira palavra que eu, o usuário, digitou. Eu estou indo para ir em frente e salve este. Eu estou indo para ir para minha pasta onde eu tenho este arquivo. Eu vou fazer fazer Olá 3. OK da Comp IO. ./hello Zamyla Enter. O que eu fiz de errado? Eu fui pego de surpresa me por um momento lá. O que eu fiz de errado? AUDIÊNCIA: Nome. DAVID MALAN: O arquivo de realmente chamado hello3.c. E eu fiz isso apenas para consistência, porque nós tiveram ola.c de no passado no código em linha. Então vamos corrigir isso ./hello suporte traço 3 Zamyla. Enter. E agora temos Olá, Zamyla. Enquanto isso, eu posso mudar isso ser Rob, ou realmente qualquer outra palavra. Mas vamos considerar um caso de canto. O que você poderia esperar que acontecerá se Não digite o nome de quem quer que seja? AUDIÊNCIA: Error. DAVID MALAN: um erro de alguma sorte, talvez. Vamos ver. Enter. Null. Então printf está realmente sendo um pouco de proteção de nós aqui, e, literalmente, imprimir parêntese aberto null, mas as coisas ainda piores podem acontecer. E só para demonstrar algo que você absolutamente não deve fazer, vamos entrar aqui e começar a picar ao redor. Certo? Se eu sei que a imagem memória é essencialmente isso, argv faixa 1 tem Zamyla, argv suporte 0 tem ./hello, ou ./hello-3. O que é da classe 2? Então, eu posso responder a essa questionar-me, certo? Eu posso apenas mudar o 1 para a 2. Agora eu posso recompilar Olá 3, ./hello3 Vamos ampliar e pressione Enter. Whoops. Sem aspas. Interessante. Então, isso é bem legal para ver o que mais está aqui. Então o que mais está dentro do meu laptop? Vamos salvá-lo com suporte 3. Faça hello3, ./hello-3. Curioso. E agora vamos realmente bold-- 50. Então, isso é realmente profundo mergulho na memória do meu computador. 50 em índices. Então faça Olá 3 ./hello-3. Curioso. Tudo bem, agora eu sou apenas vai conseguir imprudente. Vamos para 5000. Tudo certo. Então deixe-me recompilar. Faça hello3, ./hello-3. Está bem. Agora alguns de vocês, não pode ser uma lâmpada a sair. Como muitos de vocês têm visto esta mensagem antes? Está bem. Então, por quê? Odds é-- e há diferentes coisas que podem causar isso, e é óbvio que está em boa company-- temos claramente causou o que é chamado uma falha de segmentação. E short longo da história para hoje, eu ter tocado um segmento de memória que eu não deveria ter. Sempre que um segmento significa apenas um pedaço de memória que eu não deveria ter. Agora, o computador garante que, se I executar ./helloZamyla que eu posso tocar argv ser suporte 0 e argv suporte 1. Mas argc é o valor 2, isso significa que eu sou só allowed-- é uma espécie de honra system-- tocar suporte 0 e suporte 1. Se eu ir mais longe, há absolutamente vai ser memória lá. Minha RAM existe fisicamente no computador. Mas quem sabe o que está lá? Na verdade, eu estou correndo múltipla programas de uma só vez. Eu poderia ter seen-- se eu não estivesse fazendo isso no Appliant mas no meu Mac ou PC-- eu poderia ter visto o conteúdo de um e-mail. Eu poderia ter visto um instante Mensagem Eu recentemente enviou. Qualquer coisa que possa ser persistente em torno da memória podia ter sido acedido por meio de esta notação colchete arbitrária. Ou, pior ainda, você pode ter encontrou uma das minhas senhas que eu recentemente digitada, que uma programa tinha armazenado na memória de forma para me autenticar e em seguida, apenas um tipo de esquerda que na memória RAM até que eu parei esse programa. E, de fato, este é um dos o perigo e um dos poderes de usar uma linguagem como C. Você tem acesso irrestrito a todo o conteúdo da memória de um programa, eo que bandidos podem mesmo fazer nessas cases-- especialmente quando começa a programação web até o final do semestre, vamos revisitar este topic-- é bisbilhotar, potencialmente, alguém é o computador de memória e encontrar tais coisas curiosas como vimos lá. Ou pior ainda, as senhas que ele ou ela pode usar para fazer coisas ruins. Então, claramente, que eu não deveria ter feito isso, porque coisas estranhas começam a acontecer. Na verdade, este é um programa que deixa de funcionar. Isto seria equivalente a do Mac OS ou Windows uma janela de programa simplesmente desaparecer. Ocorreu um erro inesperado. No ambiente de linha de comando podemos ver algo como isso. Mas é por isso, é que eu estou simplesmente tocando memória que não pertence a mim. Então vamos defender contra este um pouco de uma maneira diferente olhando para este programa. Assim, mais uma vez, o esqueleto que vimos earlier-- e tenho destaque desta vez int. E todo esse tempo principal tem na verdade, retornou um valor. Mesmo que na maior parte do nosso palestra exemplos que jamais usados retornar nada na principal. Acabamos de escrever printf perto chaveta e é isso. Mas de graça, o que o compilador feito para você, efetivamente, está retornando 0 para você. Acontece out-- e é um pouco counterintuitive-- que 0 é bom. Isso não significa falso em si. 0 é bom, e qualquer não-0 valor, o mundo decidiu, pode significar um erro. Então, se você já mexeu alguma coisa no seu computador, ou um programa acaba de morrer em você e que você tenha obtido alguma janela errada na tela, dizendo erro negativo 49 ou erro 23-- alguns value-- arbitrária que é por um programador-codificado um valor como negativo ou positivo 49 23 para representar qualquer número, ouso dizer, de 4 bilhões de coisas possíveis que pode dar errado em um programa. Então, como eu poderia ter vantagem deste a mim mesmo? Bem, deixe-me abrir um programa que eu escrevi antes, e bisbilhotar online chamado Olá 4. E é quase idêntico, exceto que o seu tem um pouco de verificação de erros. Neste caso, eu novamente declarada principal como tendo dois argumentos, mas desta vez, na linha 17, a notificação Eu estou fazendo um pouco de verificação de sanidade. Estou fazendo-se de que argc é igual é igual a 2. Porque se for, que significa que eu posso com segurança tocar não só suporte 0, mas suporte 1. E eu vou em frente e imprimir, neste caso, Zamyla ou Rob ou qualquer palavra que eu digitei. E agora só para conseguir um pouco mais adequada, Vou voltar explicitamente 0 para indicar que tudo está bem. Nada de ruim aconteceu. Mas por convenção, eu vou retornar 1, ou francamente qualquer valor diferente de 0, se algo desse errado. Agora, o usuário não vai realmente perceber o que está acontecendo. Na verdade, se eu entrar nesse diretório, nós zoom in e fazem Olá 4, ./hello-4 Zamyla se comporta como eu esperava. Mas se eu, em vez não digite nada, nada parece acontecer, mas não falha. E se eu não fazer algo como Rob é um inspetor na partilha Thayer-- informações arbitrária. Mas aviso, argv 1, 2, 3, 4, e 5 agora deve existir na memória. Isso, também, não o que é meu programa de espera, porque eu tenho verificado se argc é igual é igual a 2 ou não. Então, eu estou agora a defesa contra isso. Agora, como um aparte, que o programmer-- ou melhor, o users-- nunca ver que 0 ou 1, mas utilizando uma ferramenta chamada Debugger, ou outras ferramentas, como veremos antes tempo, você o programador pode realmente ver o que pode ser acontecendo de errado dentro de seu programa. Então, qualquer dúvida sobre argc? Sim. AUDIÊNCIA: Eu vi onde eles não tiveram o personagem, [inaudível] apenas disse corda estrela d, como asterisco vírgula. Eles são equivalentes aqui? DAVID MALAN: Eles são. Então a questão é, você tem programas ocasionalmente vistos assim que não fazem dizem suporte seqüência argv mas dizer algo como carvão suporte estrela argv. E há ainda outro variantes que você pode ver. Eles são de fato equivalentes. Por agora, temos estes tipo de rodinhas sobre a forma de cadeia no CS50 biblioteca, mas em pouco mais de uma semana ou então nós vamos remover esse obstrução totalmente e efectivamente olhar para o que o carvão ea estrela são, e como os que dizem respeito à memória representação mais geral. Então, vamos voltar a isso. Outras perguntas sobre nossa argv ou argc? Sim. AUDIÊNCIA: Por que voltar um erro [inaudível]? DAVID MALAN: Por que fez isso retornar um erro only-- oh! No caso anterior, quando foram futzing volta com a memória, por que ele só retornará um erro quando eu realmente digitou um número grande? A resposta curta é que apenas teve sorte. De um modo geral, um computador aloca memória em pedaços, e ele me deu um pedaço grande o suficiente que Eu fui embora, sem ser notado, de suporte de tocar 2, o suporte 3, suporte de 50, mas assim que eu empurrei a minha sorte, eu fui além do limites do bloco de memória o sistema operacional tinha me dado. E foi aí que ele apertado para baixo e disse: não. Erro de segmentação. Sim. AUDIÊNCIA: Como funciona o computador saber o valor de argc? DAVID MALAN: Como é que o computador sabe o valor de argc? Quando você executa um programa, esse programa, pela natureza do pedido de piscar, é entregue a matriz de palavras que foram digitadas no prompt, que era digitado no prompt. E assim é o seu funcionamento sistema que essencialmente preenche os argumentos de principais para você. Então esse é um dos serviços que você recebe, mais ou menos secretamente debaixo da capa de um sistema operativo. Outras questões? Sim. AUDIÊNCIA: O que dump de memória significa? DAVID MALAN: O que dump de memória significa? Então essa é uma boa pergunta. E deixe-me voltar para este diretório aqui. E você vai perceber que Eu tenho um novo arquivo lá. É, na verdade chamado de núcleo, e é na verdade, normalmente um arquivo de tamanho decente. Isso é essencialmente um instantâneo de o conteúdo da memória do meu programa ou RAM quando caiu. E isso vai ser útil, potencialmente, diagnosticamente, uma vez que se fala em uma palestra futuro e seção sobre a depuração, porque você pode realmente fazer o equivalente a uma autópsia digitais nesse arquivo para ajudar a descobrir o que você fez de errado em seu programa. Sim. AUDIÊNCIA: É argc um comando no si mesmo, ou você pode nomeá-lo de alguma coisa? DAVID MALAN: Boa pergunta. Argc é um comando, em si, ou você pode chamá-lo de alguma coisa? Definitivamente não é um comando. É simplesmente uma variável de nome ou o nome de um argumento, e de modo absolutamente nós poderia chamar este foo, poderíamos chamar este bar, que tendem ser o go-to palavras que um computador cientista vai. Mas, por convenção, usamos argc e argv. Mas isso é apenas um ser humano convenção, nada mais. Tudo certo. Assim acaba, eu estive contando um pouco de lie-- branco e, francamente, no futuro, você verá temos vindo a dizer outras mentiras brancas. Mas, por agora, vamos para descascar um destes. Neste caso aqui, quando eu anteriormente correu um programa como ./hello ou ./hello-3 Zamyla, tivemos o conteúdo do meu memória do computador procurando mais ou menos como este. Mas lembre-se que uma string é. O que dissemos há uma semana que um corda realmente é debaixo do capô? AUDIÊNCIA: matriz de caracteres. DAVID MALAN: É uma matriz de caracteres, certo? Assim, poderíamos ter uma matriz de cadeias, mas, por sua vez, uma cadeia é um array de caracteres. Então, se eu realmente quero ser anal quando eu tirar esta foto, Eu realmente deveria estar chegando um pouco mais assim, pelo que, em cada uma delas índices de minha matriz argv, não é em si toda uma série que está em uma matriz. E agora a mentira estamos dizendo hoje é que a imagem não olha como esta. Na verdade, os pequenos quadrados são normalmente fora dos grandes retângulos Lá. Mas vamos voltar a isso em pouco tempo. Mas isso é ./hello barra invertida 0, que sendo o caractere especial que demarca o fim de uma seqüência de caracteres, e nós temos outro depois Nome do Zamyla. Então o que isso significa? Bem, deixe-me ir em frente e abre-se dois outros exemplos que estão disponíveis online. Um é chamado argv1.c e o outro é argv2. É um programa super-simples que é diferente de programas anteriores em que agora eu estou usando argc e argv aqui. E agora eu estou integrando-se com um loop na linha 18, a partir de i = 0 em até ARGC. E o que é que eu vou fazer com esta linha de código aqui? Em Inglês. Isto, obviamente, demonstra a utilização de argc. Mas em Inglês, o que faz que fazer se eu executar este programa? Sim? AUDIÊNCIA: Vai imprimir o seu tela quantas vezes quiser. DAVID MALAN: Exatamente. Então o que palavras I digite na linha de comando, é vai regurgitar los para mim um por linha. Então, vamos seguir em frente e fazer isso. Deixe-me ir para o meu diretório e fazem ./argv1 argv1. E agora, vamos mantê-lo simples. Vamos fazer nada em primeiro lugar. Ele fez imprimir uma coisa, e que é de facto o nome do programa, porque é na faixa 0. Se eu agora dizer foo, que vai fazer aqueles dois, e se eu disser bar foo, ele vai dizer essas três coisas. Agora que é um pouco interessante, talvez. Mas lembre-se que argv é uma matriz de strings, mas uma string é um array de caracteres, para que possamos levar as coisas acima de um entalhe e aplicar esse básica lógica e tornar o código que parece um pouco mais crítico, na verdade. Mas por ter um aninhada loop, algo semelhante para o que você pode se lembrar de Mario, por exemplo, se você fez isso desta forma. Então agora notar na linha 19, eu sou novamente a iteração sobre os meus argumentos, de 0 a até ARGC. E agora, em linha 21-- estou empréstimo de um truque de última week-- Estou verificando o que é o comprimento de suporte argv i. Eu sou armazenar essa resposta no n. E então eu estou integrando a partir de j em até n, onde j é inicializado a 0. Então, convenção para a contagem. Uma vez que você usou i, se você tem um loop aninhado, você não pode usar i novamente, caso contrário você vai espancar, potencialmente, o valor fora do loop interno. Então, eu estou usando j por convenção. Podemos usar k. Se você tiver mais de k, você provavelmente tem muito assentamento, normalmente. Mas agora, observe minha printf A linha é um pouco diferente. Eu não estou imprimindo% s, estou imprimir c%, o que, evidentemente, é um espaço reservado para um char. E agora observe esta sintaxe. Novo. Nós não vimos isso antes. Mas, logicamente, isso significa apenas obter a seqüência om em argv e obter o j o quê? AUDIÊNCIA: Personagem. DAVID MALAN: Personagem em que seqüência. Então, usando colchetes seguido por colchetes, este é o mergulho primeiro em cadeias de argv, e, em seguida, o segundo colchetes com j é mergulhar nos personagens de que determinada seqüência em argv. E então, apenas para uma boa medida, Estou imprimindo uma nova linha aqui. Então, agora deixe-me ir em frente e abrir uma janela um pouco maior assim que nós podemos ver isso em ação. Deixe-me ir para essa pasta. E agora fazem argv-2-- whoops-- fazer argv-2, ./argv 2. Enter. E é um pouco difícil ler verticalmente, mas isso é na verdade o nome do programa, seguido por uma linha em branco. Agora deixe-me ir em frente e fazer foo. Da mesma forma difícil de ler, mas é na verdade imprimir um caractere por linha. E se eu fizer bar, é agora imprimir os linha por linha. Assim, o takeaway aqui não é tanto que, wow, olhar para este novo truque onde você pode obter o conteúdo de caracteres específicos de uma matriz, mas como estamos tomando estes básico idéias como a indexação em uma matriz, e, em seguida, a indexação numa matriz que estava nessa matriz, e apenas aplicar as mesmas idéias para exemplos ligeiramente mais sofisticados. Mas o básico realmente não tem alterado, mesmo desde a semana passada. Agora, esta é uma espécie de oportuna, em que, lembre-se, na semana de zero jogamos com uma agenda telefônica como esta. E mesmo que este é, obviamente, peças físicas do papel, você pode tipo de pensar uma lista telefônica como uma matriz. Certamente, se você fosse para reimplementar este peças desses pedaços de papel em um computador, provavelmente você usaria algo como uma matriz para armazenar todos aqueles nomes e números de um todo o caminho a Z. Então, isso é bom, porque permite-nos uma oportunidade, talvez, para pensar em como você pode realmente implementar algo parecido. Tal como acontece com uma série de portas aqui. Então, se eu could-- precisamos de uma voluntários que se aproximasse. Vamos ver. Uma face desconhecida talvez, rosto desconhecido, talvez. Como sobre a laranja? Aqui. Camisa laranja, vamos lá para cima. Vamos em frente agora e movimento estas portas para o lado, movê-los para fora do caminho por um momento. Qual o seu nome? AJAY: DAVID MALAN: Ajay. David. Prazer em conhecê-lo. Tudo certo. Portanto, temos por trás dessas seis portas digitalmente no screen-- Ou melhor, sete portas no screen-- um monte de números. E eu lhe disse nada em advance-- acordo? AJAY: Nada de antecedência. DAVID MALAN: Tudo o que eu quero que você faça agora é encontrar para mim, e para nós, realmente, o número 50, um passo de cada vez. AJAY: Número 50? DAVID MALAN: O número 50. E você pode revelar o que está por trás de cada uma destas portas simplesmente tocando-o com um dedo. Caramba. [Risos] [Aplausos] Muito bem feito. Está bem. Temos um lindo presente prêmio para você aqui. Sua escolha de filmes que discutido na semana passada. AJAY: Oh, cara. Oh, eu nunca vi Spaceballs. DAVID MALAN: Spaceballs. Tudo certo. Portanto, mantenha em apenas um momento. How-- vamos fazer isso um moment-- ensinável como é que você vai fazer sobre encontrar o número 50? AJAY: Eu escolhi aleatoriamente. DAVID MALAN: Então você escolheu aleatoriamente e teve sorte. AJAY: Sim. DAVID MALAN: OK. Excelente. Então, agora, se você não tivesse tido sorte, o que mais poderia ter acontecido por trás dessas portas? Então, se eu ir em frente e revelar esses números aqui, eles realmente estão em ordem aleatória. E o melhor que você pode ter feito, francamente, é de, em última instância, no pior dos casos, verificando todos eles. Então você tem super-sorte, o que Não é o que chamaria de um algoritmo. Sim, parabéns. Mas agora let's-- humor mim, se pudesse. Vamos para este guia aqui. E aqui estão os números em clara o que parece ser uma ordem aleatória, e eles foram. Mas agora, se eu ao invés reivindicação que por trás dessas portas são números que são classificados. O objetivo agora é também encontrar-nos no número 50. Mas fazê-lo através de algoritmos e diga-nos como você está indo com isso. E se você encontrá-la, você a manter o filme. Você não encontrá-lo, dar-lhe de volta. AJAY: Então, eu vou dar uma olhada nas extremidades em primeiro lugar, para determinar se there's-- [Risos e aplausos] DAVID MALAN: Aqui está. Vamos dar uma olhada em um dos antecessores de Ajay, Sean, que não foi tão sortudo. OK, assim que sua tarefa aqui, Sean, é o seguinte. Eu escondi atrás destes portas do número sete, mas escondido em algumas dessas portas também são outros números não-negativos. E seu objetivo é pensar desta linha superior de números como apenas uma matriz. Somos apenas uma sequência de peças de papel com os números por trás delas. E seu objetivo é, usando apenas o topo matriz aqui, encontrar-me o número sete. E nós estamos indo em seguida para criticar como você vai fazer sobre isso. Encontre-nos o número sete, por favor. No. 5, 19, 13. Não é uma pergunta capciosa. 1. Neste ponto, sua pontuação não é muito bom, então você pode muito bem continuar. 3. Vá em frente. Francamente, eu não posso ajudar, mas pergunto o que você está mesmo pensando. SEAN: Eu posso tirar apenas o topo de linha. DAVID MALAN: Somente a linha superior. Então você tem três esquerda. Então, encontrar-me 7. [Audiência GRITOS SUGESTÕES] Assim, esses dois eram incrível por razões muito diferentes. Portanto, este é o lugar onde nós parou um instante atrás, ea introspecção chave aqui foi estas portas tinham números atrás deles, que foram classificadas, o ideal takeaway para que é que você pode fazer fundamentalmente melhor Nesta segunda example-- e, de fato, que foi de Sean primeira tentativa com números aleatórios assim como antes-- mas assim como esses números são classificadas, muito parecido com o livro de telefone, o que você pode, obviamente, fazer? Ou como você pode aproveitar esse conhecimento? Sim. AUDIÊNCIA: Você vai no meio do caminho [inaudível]. DAVID MALAN: Yeah. Exatamente. Então instinto inicial de Ajay foi para verificar as extremidades, se bem me lembro, e então nós meio que acabado o exemplo rapidamente. Mas se começamos a fazer isso mais metodicamente ao longo destas linhas, mas começando talvez no meio, porque eles estão ordenados, assim que revelam a número 16, que, portanto, sabe-- e vamos fazer exatamente que-- nós portanto, saber que 50, no caso de hoje, tem que ser para a direita. Assim como na semana zero quando que rasgou o livro de telefone pela metade e jogou metade do problema de distância, mesma idéia aqui. Podemos jogar nesta parte do problema de distância. E, provavelmente, o que você pode fazer através de algoritmos, quando você sabe que 50 deve ser para a direita, se é em qualquer lugar, é tentar lá, no meio das restantes portas. Naturalmente, 50 é maior de 42, para que possamos jogar este remanescente trimestre do problema de distância, e, finalmente, identificar algo como 50. Mas, assim como com o lista telefônica, esses números foram dadas a nós já em ordem de classificação, o que nos deixa com a questão, como você fazer as coisas em ordem de classificação? E, francamente, a que custo? É uma coisa para ser entregou o livro de telefone e impressionar seus amigos por encontrar um número de telefone muito rapidamente, certo? Rasgar 32 páginas para encontrar um pessoa de 4 mil milhões de páginas, dissemos foi um exemplo extremo. Mas quanto tempo demorou Verizon para ordenar que o livro de telefone? Quanto tempo demorou para nós para classificar estes sete números? Essa é uma pergunta que nós temos até agora completamente ignorado. Então, vamos responder a essa pergunta agora. E estamos todos de filmes agora, mas temos algumas bolas de stress. Se, digamos, oito voluntários Não me importaria se juntar a nós aqui em cima? Vamos em frente e fazer, como sobre vocês quatro, três de vocês aqui? Veja algumas caras novas. E os quatro de lá? E agora-- não vamos viés aqui-- e número oito ali no final. Vamos lá para cima. Tudo certo. Então o que temos aqui para cada um de vocês é um número. Se você gostaria de ir em frente, pegue este número. Qual o seu nome? ARTIE: Artie. DAVID MALAN: Artie, ok. Você é o número 1. AMIN: Amin. DAVID MALAN: Amin. David. Você é o número 2. E vá em frente, como eu entrego que as folhas de papel, alinham-se na frente da música está na mesma ordem como se ali. ANDY: Oi, Andy. DAVID MALAN: Andy, é bom te ver. Número 3. JACOB: Jacob. DAVID MALAN: Jacob, número 4. Bem-vindo a bordo. GRANT: Grant. DAVID MALAN: Grant. Número 5. ALANNA: Alanna. DAVID MALAN: Alanna, número 6. FRANCES: Frances. DAVID MALAN: Frances, número 7. E? RACHEL: Rachel. DAVID MALAN: Rachel, número 8. Tudo certo. Vá em frente e obter-se, por esta ordem. Deixe-me colocar um remanescente música ficar no lugar. Onde é que você precisa de um suporte? Está bem. Vá em frente e basta colocar os seus números onde o público pode vê-los em, a música estar voltado para fora. E espero que, o nosso primeiro verificação de sanidade aqui-- 4, 2, 6. Oh-oh. Espere um minuto. Não temos um 8. Preciso de despejá-lo do o exemplo de alguma forma. No. Não, isso é OK. Vamos ver. Nós podemos fazer isso. Estar por. Lá vamos nós. Correto. Tudo certo. Então, agora temos 8, 1, 3 7, 5. Está bem. Excelente. Portanto, a questão em apreço é, em que custo, e via o que o método, podemos realmente resolver esses números aqui para que possamos tipo de trabalho para trás, em última instância, e decide-- é realmente impressionante, é realmente eficiente, que eu possa dividir e conquistar um livro de telefone? Será que é realmente eficiente que Posso dividir e conquistar essas peças digitais de papel no tabuleiro, se talvez isso vai custar-nos fortuna no tempo ou ciclos de energia ou de CPU para realmente obter os nossos dados em alguma ordem de classificação? Então, vamos fazer essa pergunta. Então, em primeiro lugar, estes números são em ordem aleatória praticamente, e eu vou propor um algoritmo, ou processo pelo qual podemos classificar essas pessoas. Vou abordar esta muito ingenuamente. E eu vou reconhecer que é uma espécie de um monte para mim envolver minha mente em torno da dados inteiros definir de uma vez. Mas você sabe o quê? Eu vou fazer alguns correções marginais muito simples. 4 e 2 estão fora de ordem, se o objetivo é ir de um a até 8. Então você sabe o quê? Eu vou ter você caras trocar, se você mudar fisicamente posições e os pedaços de papel. Agora, 4 e 6, estes são, em ordem. Vou deixar os ser. 6 e 8, aqueles estão em ordem. Indo para deixá-los ser. 8 e1, fora de ordem. Se vocês dois não se importaria de trocar. Agora 8 e 3, se vocês poderiam trocar. 8 e 7, se vocês poderiam trocar. E 8 e 5, se vocês poderiam trocar. Agora, eu estou pronto? Não, obviamente não. Mas eu fiz o situação melhor, certo? Qual era o seu nome, número 8? RACHEL: Rachel. DAVID MALAN: Então Rachel tem efetivamente borbulhava muito longe, todo o caminho para o fim de minha matriz de números aqui. E assim que é o tipo de problema resolvido. Agora, claramente, duas ainda precisa mover um pouco, e 4 e 6 e 1. Mas parece-me ter obtido um pouco mais perto da solução. Então, vamos aplicar esta mesma heurística ingênuo novamente. 2 e 4, OK. 4 e 6, OK. 6 e 1, mm-mm. Vamos trocar. 6 e 3, mm-mm. Vamos trocar. 6 e 7 é OK. 7 e 5, Nope. Vamos trocar. E agora 7 e 8. E qual é o seu nome? FRANCES: Frances. DAVID MALAN: Frances. Portanto, agora é em Frances mesmo uma melhor posição, porque agora 7 e 8 estão corretamente borbulhou até o topo. Então, 2 e 4, OK. 4 e 1, troca de let. 4 e 3, troca de let. 4 e 6, você está OK. 6 e 5, troca de let. E agora esses caras são bons. Estamos quase lá. 2 e 1, fora de ordem, então trocar. E agora deixe-me fazer um teste de sanidade. 2 e 3, 3 e 4, 4 e 5, 5 e 6, 6 e 7, 8. OK, então estamos a fazer. Mas a que preço eu fiz classificar esses números aqui? Bem, quantos passos eu fiz potencialmente levar ao classificar essas pessoas? Bem, vamos voltar a essa pergunta. Mas, francamente, se você tem um pouco entediado, que é tipo de revelar em que isso não era talvez o algoritmo mais eficiente. E, de fato, francamente, eu estou suando ainda mais andando para trás e para frente. Isso não me sinto particularmente eficiente. Então, vamos tentar outra coisa. Se vocês poderiam redefinir vos a estes oito valores. Bom trabalho. Vamos dar uma olhada digitalmente, para apenas um momento antes de tentar outra coisa, com o que acabara de acontecer. Até aqui, você está prestes a ver uma visualização destes oito seres humanos qual azul e vermelho barras representam números. O mais alto do bar, quanto maior o número. Quanto mais curto o bar, quanto menor for o número. E o que você vai ver é em aleatoriamente mais do que oito deles. Você vai ver essas barras sendo classificado por esse mesmo algoritmo, ou um conjunto de instruções, o qual vamos chamar doravante bubble sort. Então, observe, a cada segundo ou assim, dois bares estão acendendo em vermelho, estão a ser comparados pelo computador. E então, se o grande bar eo pequeno bar estão fora de ordem, eles estão sendo trocados por mim. Agora isso é incrivelmente entediante para assistir a este, certamente, por muito tempo, mas observar o takeaway-- grandes bares que se deslocam para a direita, pequenos bares que se deslocam para a esquerda. Vamos abortar esse processo e acelerar o processo ser muito mais rápido, para que possamos ter uma noção de alto nível que, de fato, bubble sort está fazendo. Na verdade, ele está borbulhando até a lado direito da lista, ou a matriz, as barras maiores. E, inversamente, os pequenos bares estão borbulhando seu caminho para a esquerda, embora a um ritmo mais rápido do que já fez. Então, mais difícil de ver com os seres humanos, mas visualmente que é de fato o que estava acontecendo. Mas vamos tentar uma fundamentalmente abordagem diferente agora. Vamos tentar um diferente algoritmo pelo qual temos que caras começam nestes originais posições, o que foi esta ordem. E vamos em frente agora. E eu vou fazer alguma coisa ainda mais simples, certo? Em retrospecto, a troca de pares novamente e, novamente, quase um pouco inteligente. Vamos fazer as coisas ainda mais ingenuamente, onde se deseja classificar essas pessoas, deixe-me continuar a procurar para o elemento mais pequeno. Então, agora, é o 4 menor número que eu já vi. Vou me lembrar disso. Não, dois é melhor, e lembre-se disso. 1 é ainda mais reduzida. 3, 7, 5. Está bem. Um-- qual é o seu nome? ARTIE: Artie. DAVID MALAN: Artie. Então, Artie, vá em frente. Eu vou puxá-lo para fora da linha. Se você pudesse voltar aqui. E eu preciso para fazer o quarto para ele. Temos um ponto de decisão aqui. Como podemos dar espaço para Artie aqui no início, onde o número 1 pertence? AUDIÊNCIA: Shift. DAVID MALAN: OK, nós poderia mudar todos. Mas propor uma otimização. Isso parece um pouco chato para mim pedir quatro pessoas para mover todo o caminho. O que mais eu poderia fazer? AUDIÊNCIA: mudá-los. DAVID MALAN: mudá-los. E qual é o seu nome? JACOB: Jacob. DAVID MALAN: Jacob, mover. Muito mais eficiente apenas de ter Locais de swap Jacob com Artie, em oposição a forçar todas essas quatro pessoas, muito obrigado, a sua posição correta. O que é agradável sobre Artie agora, ele está em sua posição correta. Vamos fazer isso de novo. 2, que é o menor número que eu já vi. 3, 7, 5. Está bem. 2 é definitivamente o menor. Não tem que fazer nenhum trabalho. Vamos fazer isso de novo. 6. Menor? 8. Não. 4? Ooh. Que eu me lembre 4. 3. Que eu me lembre 3. 7, 5. O menor número que eu tenho visto nesta passagem é 3. Se você vem para fora. Onde é que vamos colocá-lo? E qual o seu nome? ALANNA: Alanna. DAVID MALAN: Alanna, estamos vai ter que despejá-lo. Mas isso é mais eficiente, apenas para trocar duas pessoas, do que ter várias pessoas realmente contornar over. Agora vamos fazer isso de novo. Vou selecionar 4, então vamos lá para fora. E quem é que vai mudar? Número 8, é claro. Se eu agora encontrar o número 5, vem para fora. Número 8 vai ficar despejados novamente. Estou indo agora para encontrar o número 6 no lugar. 7 no lugar. 8 no lugar. O que acabamos de fazer agora é algo chamado de seleção de classificação, e se visualizar isto, é vai se sentir um pouco diferente. Vamos em frente e desta menu aqui, este visualization-- vamos mudar este para-- venha, Firefox. Vamos mudar isso para seleção de classificação. E vamos acelerá-lo como antes, e iniciar a visualização agora. E este algoritmo tenha uma sensação diferente. Em cada iteração, francamente, é ainda mais simples. Eu só estou selecionando o menor elemento. Agora, francamente, eu tenho um pouco de sorte que tempo, na medida em que ordenados super-rápido. Os elementos foram aleatórias. Não é, como veremos, eventualmente, ver, fundamentalmente mais rápido. Mas vamos ver um terceiro e último abordar aqui, como o que está acontecendo. Então, vamos em frente e redefinir vocês uma última vez para ser nesta ordem aqui. E agora, eu vou ser um pouco mais inteligente, apenas para completar nossos algoritmos. Eu vou fazer isso. Eu estou indo para não ir frente e para trás tanto. Francamente, estou cansada de todo esse deslocamento. Eu só vou ter o que eu sou dada no início da lista, e eu estou indo para classificar que ali mesmo. Então aqui estamos nós. Número 4. Eu estou indo para inserir o número 4 em uma lista ordenada. Concluído. Eu reivindico agora, e só para fazer isso mais claro, esta parte da minha lista é ordenada. É uma espécie de um pedido estúpido, mas de fato 4 são classificados em uma lista de tamanho um. Agora, eu vou tomar no número 2. Número 2 agora eu vou inserir no lugar certo. Então onde é que dois pertencem? Obviamente, aqui. Então vá em frente e voltar, se pudesse. E por que não basta ter caras sua música está com você neste momento. E vamos forçar a entrada que você para o início da lista. Então, um pouco mais de trabalho. Eu tive que mudar Jacob ao redor, e qual é o seu nome? AMIN: Amin. DAVID MALAN: Amin. Mas pelo menos eu não fui para trás e para frente. Eu só estou levando as coisas como eu ir. Estou apenas inseri-los no lugar certo. 6, este é realmente muito fácil. Vamos inserir você lá, se você só queria passar um pouco. Número 8, também muito fácil. Bem ali. Caramba. Número 1, não podemos simplesmente trocar com Amin aqui, porque o que está acontecendo para atrapalhar a ordem. Então, temos que ser um pouco mais inteligente. Então, Artie, se pudesse fazer o backup por um momento. Vamos em frente e mudar agora, Ao contrário dos nossos algoritmos anteriores, para dar espaço para Artie aqui no início. Assim, no final do dia, eu sou o tipo de fazendo o que eu queria evitar antes. E assim meu algoritmo é uma espécie de revertido, intelectualmente, do que era originalmente. Eu só estou fazendo o deslocamento em um ponto diferente. Agora estou no 3. Oh, maldito. Temos que fazer mais trabalho de novo. Então, vamos empurrá-lo para fora. Vamos passar 8, 6, 4-- oh Oh-- e 3 vai dar certo lá. Então, pequenas economias menos desta vez. 7, muito trabalho não deve ser feito. Então, se você quiser pop de volta, vamos introduzi-lo. E, por último, 5, se você quer aparecer de volta, nós precisa mudar você, você, você, até cinco está no lugar. Então agora para ver isso em um elevado nível graficamente vamos fazer esse algoritmo visualização de um tempo adicional. Então isso chamaremos de inserção tipo. Vamos executá-lo apenas como rápido, e iniciá-lo aqui. E, também, tem uma sensação diferente. É uma espécie de ficar melhor e melhor, mas nunca é perfeito até eu entrar e lisa essas lacunas. Porque, mais uma vez, eu estou apenas tomando o que Estou a ser dado a partir da esquerda para a direita. Então, eu não tive tanta sorte que tudo foi perfeito. É por isso que tivemos esses pequenos mispositions que nós fixos ao longo do tempo. Então, todos esses algoritmos parecem executado em um pouco diferentes ritmos. Na verdade, o que você diria é o melhor ou o mais rápido até agora? Bubble sort, o primeiro? Tipo de seleção, a segunda? Tipo de inserção, o terceiro? Ouço alguns tipos de seleção. Outros pensamentos? Assim, verifica-se que todos estes algoritmos são fundamentalmente tão eficiente quanto cada outro-- ou, pelo contrário, apenas como ineficiente como o outro, porque podemos fazer fundamentalmente melhor do que todos os três desses algoritmos. E isso é um pouco de uma mentira, também. quando eu digo que o mais eficiente ou como ineficiente, que é, no mínimo, para super-grandes valores de n. Quando temos apenas oito pessoas aqui, ou talvez 50 ou mais barras na tela, você vai absolutamente notar diferenças entre estes três algoritmos. Mas quanto n, o número de pessoas, ou o número de números, ou o número de pessoas no telefone livro, ou o número de páginas da web no banco de dados do Google fica cada vez maior, veremos que todos os três destes algoritmos são realmente muito pobre. E nós podemos fazer fundamentalmente melhor que isso. Vamos dar uma olhada, por fim, em que estes algoritmos pode soar como no contexto de alguns outros bem como por meio do presente visualização aqui que vai nos apresentar a um número de algoritmos. Vamos em frente e parabenizar nossos participantes aqui, os quais classificadas-se muito bem. Se você gostaria de dar um presente de despedida. Você pode manter seus números também. E o que você vai ver, ou melhor, ouvir, agora, é que, como nós colocamos sons a cada uma destas barras e associá-lo com o software, diferentes frequências de som, você pode envolver sua mente mais audioly em torno do que cada uma dessas coisas parece. A primeira das quais é a ordenação por inserção [Tons] Este é bubble sort. [Tons] Tipo de seleção. [Tons] Algo chamado merge sort. [Tons] Tipo Gnome. [Tons] Isso é tudo para CS50. Vamos vê-lo na quarta-feira. NARRADOR: E agora, "Deep Pensamentos ", de Daven Farnham. Por que é um loop? Por que não torná-lo melhor? Eu faria um circuito de cinco. [Risos]