[Música tocando] ALLISON Buchholtz-AU: Olá a todos. Bem-vindo ao seu primeiro seção oficial CS50. Como você pode, ver isso é seção CS50-like, apenas para puxar para cima a nossa agenda para hoje. Então, quem sou eu, como eu tenho certeza você está se perguntando. Eu sou o seu TF. Eu não sou apenas um estudante aleatório que está representando o seu TF. E eu vou passar por espécie de ter seções fluirá, expectativas que temos, recursos, assim por diante e assim por diante. Nós vamos falar sobre matrizes, ASCII funções, argumentos de linha de comando, e não é aqui, mas Eu também estará ajudando você meio que pensar sua próxima pset para esta semana. O que eu tenho certeza que tudo o que você irá apreciar. Então, primeiro question-- quem sou eu, além de seu TF exuberante aqui. Estou Alison Buchholtz-Au. Este é o meu segundo ano TFing CS50. Eu também TF CS51 na primavera. Você pode ver novamente lá se você decidir tomar. Eu também sou um PAF, portanto, qualquer Freshmen-- e se você não é um calouro, este é o meu terceiro ano como um colega aconselhando. Eu estou muito bem versado em aconselhando-o sobre a vida e cursos dentro CS e não dentro de CS. Eu sou um Concentrador de Ciência Computador. Eu sou um sénior na Adams House, melhor casa. E antes que eu mudei para CS minha Sophomore Spring, Eu estava realmente um engenheiro biomédico. Eu estava indo para ir para a escola Med. Eu estava indo para ser um cirurgião de trauma. E isso tem completamente mudou desde que eu tomei CS50. Fiz o curso Sophomore minha queda. Foi a minha primeira introdução ao CS nunca. Eu era um dos 78% de vocês que tinha zero de experiência chegando, e ele mudou completamente a minha vida. E agora eu estou trabalhando em Microsoft, e sua adorável TF. E CS50 é provavelmente um das melhores experiências que eu tive aqui no Harvard-- tanto tomar a classe e ser capaz de ajudar ensinar os alunos como você. Então, eu estou realmente animado que estamos todos aqui. No caso de você veio em tarde, há doces, que você deve se sentir livre para vir pegar ou enviar alguém para agarrá-lo para você. está certo. Eu não quero comer isso. Meu quarto tem bastante chocolate, por isso vocês deveriam tentar terminar isso. Eu sei que existem 100 peças, mas como, 04:00 na segunda-feira, Acho que todo mundo poderia usar um pouco de açúcar. Então, todos vocês que são oficialmente na minha seção deveria ter começado um e-mail de mim com o meu número de telefone, e-mail address-- sinta-se livre para me adicionar Gchat, sinta-se livre para me adicionar no Facebook, e também para o resto de vocês, você pode enviar-me bem aqui. Existem dois H de. Todo mundo sempre faz como dois L's ou dois c. Dois H das no sobrenome. Caso contrário, ele vai saltar e Eu não estou indo para obter o seu e-mail. Portanto, sinta-se livre para me e-mail, entrar em contato comigo a qualquer momento. Eu não pode voltar a você dentro de 24 minutos, mas prometo voltar para você dentro de 24 horas. Se você me chamar de meia hora antes seu pset é devido, sendo assim, Eu não tenho idéia do que estou fazendo Allison. Me ajude. Eu estou indo para acalmá-lo, mas no final do dia, se você está me chamando de meia hora antes seu pset é devido, sem nada escrito, Eu vou ser como, bem, talvez é hora de usar esse dia de atraso. Então eu vou responder a todas as suas solicitações de forma muito oportuna. Meu telefone é normalmente ligado às minhas mãos. Eu normalmente respondem muito mais rápido do que 24 horas, mas só posso garantia uma resposta de 24 horas. Tudo certo. Então, por que estamos aqui? Além disso, se você tiver dúvidas em qualquer momento, por favor, deixe-me saber. Eu falo muito. Eu falo rápido, mas, por favor sinta-se livre para me interromper. Dá-me espaço para respirar bem. Então seções são um tempo para que nós realmente apenas mergulho em, obter alguns hands-on experiência, a passar por temas que mencionamos em sala de aula ou em materiais de estudo que recomendamos que vocês online. E nós vamos realmente passar por alguns desses recursos em um pouco. Por isso, algumas notas sobre o apoio seção. CS50-- uma das coisas que faz que uma das minhas aulas favoritas é a sensação de que você nunca está sozinho. Temos uma equipe de mais de 100 pessoas que estão aqui para ajudá-lo. Temos o horário de expediente De segunda a quinta-feira. Portanto, há muitas pessoas que amo a classe tanto quanto eu faço e quem são realmente aqui porque eles querem estar aqui. A maioria de nós são estudantes, e este é como uma quinta classe, além para o resto do nosso trabalho. E é um monte de trabalho, mas nós fazemos isso porque nós amamos isso, e que realmente gostam de ensinar-lhe e ajudar a compartilhar o nosso entusiasmo para este assunto e esta classe. Então por favor, aproveite. Venha conversar conosco. Eu ficar sozinha, quando meus alunos não falar comigo, então se você quiser, vir sair comigo. Vai ser ótimo. Assim, a secção é obviamente um de seus maiores coisas. Nós vamos passar por coisas que você aprendeu na aula, fazer alguns breves exemplos quando temos tempo, e, em geral de tipo ter uma idéia sobre as coisas você deve estar pensando sobre para definir o seu problema. Shorts-- quantas pessoas realmente assisti o vídeo do seu zero curto? Alguém me reconhecem? Portanto, estas são muito grandes. Você deve definitivamente assistir aqueles. Um monte de trabalho foi colocado em-los. E eles estão apenas pretende ser bite-size peças para você simplesmente assistir por três ou quatro minutos e obter um uma melhor compreensão do conceito. Caminhe throughs-- como muitas pessoas já assistiram A caminhada de passagem para os anteriores? Zamyla é incrível, né? Tipo, eu desejo que eu era Zamyla vezes. Então, definitivamente usar seus walk-through. Ela vai dividi-la em peças, mordida de tamanho pequeno. E quando você tem estes enormes especificações de seus conjuntos de problemas, isso vai ser muito importante para ser capaz de simplesmente encontrar um lugar para começar a trabalhar lentamente e através dele. Tudo bem, nós também temos Study50, que é study50.harvard.edu, eu acredito. Você pode apenas Google estudar, e ele vai vir para cima. Esta é uma das mais melhores recursos que temos. É PowerPoints com notas e praticar problemas para você com soluções que você pode realmente caminhar. Então, se você quiser mais prática, mais do que nós em seções ou mais que seus conjuntos de problemas, este é realmente um lugar que eu encorajá-lo a ir. Foi construído no verão passado por alguns dos meus bons amigos. E é incrível. De facto, muitas das lâminas que eu vou estar usando para a Secção virá de Study50. Então, um monte de TFs usá-lo. E, finalmente, como eu mencionado, o horário de expediente. Se você está tendo problemas com a lição de casa, você está tendo problemas com um conceito, venha para o horário de expediente. Vá no início da semana, se puder. Saia para o quad, porque é tipo de longe. Ninguém gosta de andar por aí. Mas é a sua vantagem, porque então você está vai ter todos estes TFs, [Inaudível] cercam. E especialmente agora, Apenas uma dica, quintas são muito frio agora em Mather porque seus Série de Exercícios são devido às quintas-feiras. E quer saber usar seus dias de atraso ainda. Então, se você está tendo problemas com conceitos, há muitas TFs que estão lá para ajudá-lo. Então venha para Mather na quinta-feira. Se você quiser me ver, Eu vou estar lá. Eu estou fazendo a minha própria tipicamente lição de casa, porque ninguém quer a minha ajuda. Então venha nos ver. Encontre-nos no meio do caminho. Assim como muitas pessoas já assistiram palestra ou assisti-lo online? Como muitas pessoas foram para Super seção na semana passada? Legal. Isso é realmente um bom número. Quantos de vocês já leram o seu especificação para esta semana, para o seu pset? Ooh, eu estou orgulhoso de vocês! Mais doces para vocês. Bom, então o que queremos dizer "Encontrar-nos a meio caminho", é que a seção é realmente apenas Vai ser super útil para você se você entrar em depois de ter lido o seu especificação para o seu pset. Porque quando eu passar por uma visão geral de coisas que você deve estar olhando para fora, ele não vai fazer tanto sentido se você Não sei o que o seu conjunto de problemas vai ser pedindo que você faça. Se você não vir a seção, obviamente Eu não posso ser tão útil. Eu não vou levá-la pessoalmente se você não vem a minha seção, agora, mas definitivamente você deve. Se não for possível, vê-los online. Eles estão lá por uma razão. Minas vai estar lá. Como você pode observar, estamos a ser gravada, por isso vai estar lá para vocês. Assim, vai lectures-- que é, obviamente, onde você está recebendo o iniciar o seu material aqui. Então, com certeza vou tentar ajudá-lo tanto quanto eu puder, mas eu só posso conhecê-lo tão longe. Você tem que tipo de nos encontrar no meio do caminho. Grading-- assim, todos vocês que recebi um email de mim, você é minha seção oficial. Estarei classificação suas Série de Exercícios. E eu só quero dizer, uma coisa que você deve realmente prestar atenção ao são os comentários. Os comentários são muitas vezes mais útil do que a pontuação real, damos-lhe. E os comentários são realmente onde eu gasto muito do meu tempo quando estou de classificação. Então, eu gostaria de receber se você lê-los. E eles são, na verdade, como você está indo para aprender mais sobre design e estilo e as coisas que são um pouco menos cortada e seca. Então, realmente prestar atenção a essas observações. Se você tiver dúvidas sobre eles, ou perguntas sobre a sua pontuação, por favor, venha falar comigo quer antes seção, Eu provavelmente vou ser pendurado para fora no lobby, ou depois. Se você deseja agendar one-on-one reuniões sobre como você pode ajudar a melhorar mais tarde conjuntos de problemas, é só me avisar. E, em seguida, apenas um par de dicas para vocês. Então, uma das coisas mais importantes Eu sempre salientar a minha seção quando você está aprendendo como fazer o código é para escrever as coisas no papel primeiro. Se você tem um plano de jogo para onde o seu código precisa ir eo que ele precisa fazer e ele é discriminado em pequenos pedaços de pseudocódigo código que você escreveu para fora, você vai ser menos propensos a cometer erros de sintaxe ou criar um loop que se não tem uma outra coisa. Se você sabe onde você está vai global, você está menos propensos a fazer estes minúsculos erros que, por vezes, irá levá-lo hora de corrigir, porque você fica tipo, onde estou faltando nessa faixa? Na mesma nota, por favor, use Style50. Especialmente quando você está indo para o horário de expediente, se seu código é tudo comutada para um lado, é política curso que podemos dizer, corrigi-lo de modo que parece que Style50 diz que deveria, e então nós vamos ajudá-lo. Por isso vai facilitar a sua vida. Isso vai facilitar nossas vidas. Todo mundo está feliz. Todo mundo fica melhores notas. Não é isso que todos nós queremos? Então escreva as coisas no papel antes Você sempre toca seu computador. Falar as coisas a um nível elevado, e certificar-se de que você sabe onde você está indo. E se você não tiver certeza, sentar-se com alguém e caminhar com eles através de passo a passo o que o seu código é suposto fazer. E nove vezes fora de 10, você poderá como, oh, eu esqueci uma condição if ou eu esqueci uma vírgula aqui ou Estou atualizando esta errado variável. Portanto, estas são as minhas dicas para o sucesso. Então, já que cerca de metade do que você olhar como você assistiu seção super, Eu só vou muito brevemente passar por loops, que não estavam na nossa agenda original. Mas eles são realmente importantes. E assim eu vou tipo de velocidade através daqueles antes de entrar em nossa seção real. Antes de eu fazer isso, estão lá qualquer perguntas-- logisticamente, pessoalmente, há qualquer outra coisa que você quer saber sobre mim ou sobre seção ou turma em geral? Tudo bem? OK, legal. Adorável. Então loops-- vocês todos devem reconhecer essas peças a partir do zero. Então loops são basicamente apenas uma maneira de fazer algo um certo número de vezes, alguns repetido ação com base em alguns condicional. Portanto, temos três tipos diferentes. Temos loop for, while e do-while. Assim, para loops-- só temos uma muito disposição geral aqui de um loop. E isso é ótimo para quando você sabe como muitas vezes algo precisa executar. Quando falamos sobre o outros loops, você vai ver por que isso é uma distinção importante. Mas para loops são para algo set. Você sabe que você pode calcular o número ou você sabe o número de vezes que você quer este repetido no início. Então, se você vê aqui, nós ter apenas um tipo geral do quadro esqueleto para um loop aqui. Assim, para-inicialização, este é o lugar onde suas variáveis ​​são inicializados. Com Mario, eu tenho certeza que vocês fizeram algo como int i é igual a 0. É aí que iria acontecer em azul. Você tem a sua condição, o que é o que é verificado a cada vez. Se esta condição for verdadeira, então o resto do código é executado. Em seguida, ele vai correr novamente-- e perguntar. E depois temos de atualização, onde você está atualizando sua variável. Então, mais uma vez, com como Mario, eu tenho certeza vocês fizeram algo como i plus plus. Assim, cada vez que o loop correu, eu tenho atualizado para que quando estávamos verificando-lo contra alguma condição, ele estava mudando. Porque se você só tem uma variável estática, se se executa a primeira vez, é só vai executar infinitamente. Então você tem que ter certeza que você atualizar sua variável corretamente. E também temos apenas uma representação visual lá. Todo mundo bom? Para laçadas. Deveria ter visto estes em sua pset. Legal. Então, aqui é apenas um exemplo fácil. Imprimir Este é CS50! 10 vezes. E assim temos a nossa inicialização, como vemos lá, com int i é igual a 0, para i é menos de 10, e eu plus plus. E vai imprimir que 10 vezes. Assim, enquanto loops-- enquanto loops são grande quando você não faz, necessariamente, tem que saber quantas vezes é vai atualizar no começo. Você apenas tem alguns condição que é verificada. E isso poderia ser algo como while-- vamos dar um exemplo de sua pset. Se Mario, você tenta entrada de um número negativo. Certo? Era para você re-solicitar o seu usuário. Assim, você pode dizer, bem, se as entradas de usuário algo menos do que zero, re-aviso -los. E tenho certeza de que poderia ter foi algo que alguns de vocês usado em seu código. Então é uma coisa simples. Você tem tempo, alguns condicional que está marcada cada vez que o código vai para executar. Se for avaliado como verdadeiro, nós executá-lo. Caso contrário, nós não. E o que é realmente algo importante-- I acho que David falou sobre em lecture-- são as chaves. Qualquer que seja de dentro do chaves é o que é executado. Se você esquecer os suspensórios, que vai apenas ser a linha direta após esse tempo foi executado. Então, se você tem três coisas que são supostamente a acontecer quando este condição for avaliada como verdadeira, e você não tem essas chaves, apenas a primeira coisa que vai acontecer. Portanto, é muito consciente do onde você colocar suas chaves. Se você ficar com Style50, isso vai ajudá-lo definitivamente. Legal. Portanto, esta é uma contagem regressiva de 10 a zero. E como você vê aqui, nós inicializar alguns contador fora dela. Uma coisa que é diferente é não estamos inicializando nossa variável dentro do nosso loop while. É inicializado fora dela. Estamos simplesmente colocando o condição em nosso tempo. Portanto, neste caso, é ao mesmo tempo contagem é maior que zero. E nós imprimir o que a nossa contagem é, e depois que nós diminuiremos nossa variável. E isso é também uma outra coisa a notar. Nossa atualização não acontecer dentro que a primeira parte do loop while. Ela realmente vai acontecer dentro as chaves, o corpo de seu texto. Portanto, enquanto loops---do-while são grandes para validação do usuário. Então, alguns de vocês podem ter também usou isso em seu pset. Você pode dizer, fazer, como, pedir ao usuário para entrada. E então quando, como, o entrada é menor do que algum número. Assim, para um caso explícito com Mario, ele seria fazer printf, insira um número inteiro, e, em seguida, algum inteiro é igual getInt. E então ele vai realmente executar esse código primeiro. Você realmente vai ter algum tipo de número inteiro. E então você poderia dizer que, enquanto número inteiro que é menor do que zero. Então, o que ele vai fazer é que é vai executar pelo menos uma vez. Ele vai verificar a condição. Se a condição é verdade, ele vai correr novamente. Então faça-while são ótimo para validação do usuário, porque você sabe que o código está indo para executar, pelo menos, uma vez, enquanto que com enquanto loops, você não está garantido que é indo para executar uma vez. Ele vai verificar a condição primeiro e depois decidir para executá-lo, enquanto que um do-while será executar o código em primeiro lugar e, em seguida, verificar para ver se você precisa repeti-lo. Será que essa distinção fazer sentido para todos? Está bem. Legal. Portanto, neste caso, este é o tipo do que eu estava falando, esta re-prompts até obter um número positivo. Então, nós sabemos que printf "Digite um número positivo" e, na verdade, pedindo que entrada vai acontecer pelo menos uma vez. Se o usuário estiver mal e mantém digitando um número negativo, que sabe quantas vezes ele vai executar. Mas esse código é garantida para executar pelo menos uma vez. E é por isso que é ótimo para validar a entrada. E você vai usar isso um pouco. Tudo bem, todas as perguntas até agora? Estamos todos bem? Estou falando muito rápido? Nós somos bons? Está bem. Impressionante Então, nós estamos indo para a frente e falar sobre arrays. Legal. Assim, as matrizes são basicamente apenas estruturas de dados que nos permitem armazenar coisas do mesmo tipo. Então, se você tiver uma matriz, que é ou só vai ter ints ou ele só vai ter carros alegóricos ou ele só vai ter caracteres. Você não vai ter um int com um char com um carro alegórico com um casal. Uma coisa. Arrays são apenas um tamanho, ou eles são apenas um tipo. Portanto, temos aqui uma matriz de tamanho três com três números inteiros na mesma. Eles poderiam flutua, mas estamos vai dizer que eles estão inteiros. Então, uma coisa a perceber é que matrizes são um conjunto de tamanho quando você inicializar eles, e eles não são easily-- uma vez que todos são menos confortáveis, você deve apenas pensar neles como não sendo capaz de estender em tamanho. No entanto grande você definir sua matriz, no início, que é o tamanho que vai para ficar, porque as matrizes são blocos contínuos de memória. E quando vocês se em um pouco mais de como a memória é realmente dispostas em discos e na pilha ea pilha, ele vai fazer um pouco mais de sentido. Mas você poderia apenas pensar em como, é apenas uma linha de espaços em seu disco. E você não pode garantir que não há vai ser o espaço livre depois. Você pode inicializar uma matriz de três e, em seguida, talvez você inicializar um outro conjunto de cinco mais tarde, e é logo em seguida. Então, se você fosse para ir mancha passado três em que a primeira matriz, você estaria escrevendo sobre outra coisa. Então matrizes é-- para vocês, apenas considerá-los como um tamanho fixo. Assim, a criação de um array-- você está indo a necessidade de fazer isso um pouco. Assim, da mesma maneira que temos um estrutura geral para o nosso para loops, temos um bom geral estrutura para a nossa matriz. Porque eles são de um tipo, toda a elementos de uma matriz são de um tipo, você precisa para inicializar o que esse tipo é. Então, como você vê aqui, temos uma bom tipo de dados suporte pouco. Então, se nós estamos criando um int matriz, que irão ser int. Se nós estamos criando um char array, que vai ser de char. Se nós estamos criando uma string array, que vai ser string. E, em seguida, o nome da sua matriz, o que você gostaria que fosse. Então talvez seja os resultados dos testes ou talvez é estudantes ou talvez seja doce. Qualquer que você decidir o nome do seu array, que é o que vai ser. E, em seguida, entre parênteses, você vai tem o tamanho que você deseja. Então, nós estamos armazenando 10 alunos ou estamos armazenar 15 tipos de doces? O que não. Assim, em nosso exemplo aqui, estamos criando um array de tamanho três, o que vocês veja aqui à direita. E quando nós primeiro inicializar ele, tudo está definido para zero. Então ele só pensava de como uma lousa em branco. Nós temos todos esses espaços, temos tudo essas caixas poderíamos colocar nossos dados em, mas eles são apenas em branco por enquanto. Portanto, se queremos realmente atribuir-lhes esses valores, fazemo-lo como bem debaixo aqui mostra. Então você tem o que quer que o nome do seu matriz é e, em seguida, o índice que você deseja. Assim, o índice refere-se apenas, como, o slot de que estamos olhando. E uma coisa importante a notar é que arrays são indexados zero. Portanto, se queremos o primeiro espaço na memória da nossa matriz, ela vai ser zero. Se queremos que o segundo, que vai ser um. Se queremos que a terceira, vai ser dois. Assim por diante e assim por diante. Que é também por isso que, convencionalmente, quando fazemos para loops-- eu tenho certeza vocês estavam se perguntando, por que começamos a 0 contra 1? E isso é porque quando nós fazemos a transição em usar matrizes, ele mapeia corretamente. Então, se você quiser iteração em uma matriz, que faz muito mais sentido fazer i é igual a 0, porque nós sabe que corresponderá para o primeiro local de memória. Todo mundo bem com isso? Legal. E, em seguida, na parte inferior aqui é apenas outra maneira de inicializar uma matriz. Você ainda tem o seu tipo de dados eo nome, mas em vez de realmente colocar um tamanho de lá, você pode apenas fazer colchetes vazios. E, em seguida, com estes encaracolado cintas na parte inferior, você pode apenas introduzir os dados que você quer separados por vírgulas. E isso será automaticamente dizer, OK, eu vejo que você tem três coisas nestas chaves. Então, eu sei que eu preciso para alocar três blocos de memória e depois armazená-los. Assim, a primeira versão que você pode usar se você está perguntando o usuário a entrada de valores, de modo que você pode iterar através da matriz e ask-- obter algum int a entrada deles. Se você sabe de antemão os valores, faz muito mais sentido utilizar a segunda forma. Mas na maioria dos casos, você pode não saber que esses valores vão ser. Legal. Alguma outra pergunta? Tudo bem. Então, acessando elements-- assim um das grandes coisas sobre matrizes é que eles são aleatórios acesso, o que significa que você não tem que olhar através de cada bloco. Se você sabe que você quero o que é no bloco dois, você pode apenas dizer, dá-me bloquear dois. E é por isso que estes índices são tão importantes, e é assim que nós realmente acessá-los. Portanto, neste caso, como vimos antes, quando estávamos a atribuição de valores, no único Antes, tínhamos o nome eo índice queríamos acesso, certo? Assim, da mesma forma, isso é tudo que fazer para que realmente puxar para fora de dados. Temos o nome e nós tem o índice que queremos. Portanto, neste caso, o loop aqui em baixo, na parte inferior, qualquer um sabe o que está fazendo, o que seria imprimir? Mmhmm? Exatamente. Então, sim, é só iterar. i é igual a zero-- podemos caminhar através do código apenas rapidamente. i é igual a zero, i é menos de três, neste ponto, certo? Assim que verifica para fora. E nós dizemos: OK, impressão f o que está na temperatura i. i é zero aqui quando nós primeiro iteração, então vamos para este primeiro ponto, e dizemos, OK, 65 é o número que pretende imprimir. Então, ele vai imprimir 65 e depois fazer uma nova linha. i irá atualizar, por isso imprime 87. Ele atualiza novamente, e ele vai imprimir 30. Todos legal? Impressionante. Tudo certo. Então aqui é uma espécie de um coisa que eu estava dizendo como você pode manter o controle de pontuação de alguém e por isso você usaria o primeiro modo de inicialização de em vez de que o segundo caminho. E isso só vai passar. E note que temos uma classe de tamanho 30. E nós estamos inicializando esta matriz de inteiros que é de tamanho 30. E então nós estamos interagindo através e estamos pedindo ao usuário para entrada pontuações para cada um destes e, em seguida, atribuí-lo a um lugar específico na memória em algum lugar nessa matriz. Legal? Isso faz sentido para todos? Mmhmm? Então hashtag definir o tamanho da classe 30 é um pré-processador diretiva, que apenas significa que ele tem gets-- fazer como o processo de compilação. Você pode pensar nisso como uma variável global. A forma como o fazemos é typically-- ele permite que seu código para ser mais facilmente alterado. Então, vamos dizer que o tamanho da classe de repente vai 30-15, se eu não tivesse definido desta forma, eu o faria tem que passar por todo o meu programa e mudar a cada instância de 30-15. Mas com isso, eu tenho que mudar um local, e tudo muda. Se você quiser fazer um hash definir em um caso onde você está mantendo o controle de alguns definir o número de contagens para uma classe ou você está usando um número que vai ser utilizado, tal como, ao longo de um longo programa, é melhor para definir que, no início de modo que, se alguma vez ele muda, você começa para mudar um ponto em vez de 100. Sim? ALUNO: entre fazer isso e apenas declarando [inaudível] lá no topo. ALLISON Buchholtz-AU: Então, tem a ver com efficient-- é uma espécie de fora do escopo o que podemos cobrir nesta seção. Tem a ver mais com a eficiência e como as coisas realmente trabalhar no processo de compilação. Se você quiser realmente saber sobre isso, eu estou feliz em enviar-lhe um e-mail com os recursos sobre o assunto. Hash definir tende a ser preferido para as coisas. E como você codificar mais, você tipo de aprender as nuances de quando você deve usar um mundial contra o hash definir. Mas, por enquanto, você realmente não tem se preocupar com isso é que a resposta curta. Todo mundo bem com isso? E também, se você quiser para usar um hash definir, é realmente importante notar que o nome deve ser em todos os tampões. Nós não estamos apenas fazendo Classe de tamanho para ser dramático. Ele realmente deve ser em todos os tampões. Legal. Qualquer outra coisa lá? Nós somos bons? Adorável. Seja bem-vindo. OK, então eu quero que vocês vejam para isso e ver se você pode encontrar o erro. Vou te dar uma dica. Está em algum lugar em que loop para. Mmhmm? ALUNO: Deve ser menor ou igual a 2. ALLISON: Assim, poderia ser menor ou igual a 2, ou poderia ser inferior a 3. E o que é o raciocínio para isso? Estudante: O [inaudível], 0, 1, 2. ALLISON: Exatamente. Assim, em uma matriz de tamanho n, nós só tem índices de n menos um. Legal. E então podemos ficar realmente louco e obter matrizes multi-dimensionais. Um dos problemas quando eu o levei na minha arrays multi-dimensionais requeridas anos, e eu acho que um deles pode exigir este ano, assim que seja confortável. Esquentar a cabeça com isso agora. Ele vai voltar para assombrá você, mas de uma forma legal. Então você pode realmente só acho de arrays multidimensionais como matrizes de matrizes. Assim, você pode tipo de pensar neste top linha como o primeiro pedaço de memória. E este é o segundo pedaço de memória, ea última linha é o terceiro pedaço de memória. E dentro disso, há uma matriz. Mas, claro, é mais fácil para descrever como este. Então você inicializa-lo da mesma maneira. Este é um personagem conselho de três por três. Então você tem três linhas e três colunas. Estamos representando desta forma. E você acessá-lo a mesma forma, a coluna por linha. E assim 1,1 como vemos aqui. Nós atribuímos um zero, zero, lá em cima. 2,0 e 0,2. Então, você teria apenas que acessar eles-- se alguém já fez álgebra linear, Da mesma forma que você acessar um elemento em um matrice, é a mesma idéia aqui. Assim, você pode relacioná-la de volta à matemática. Você não precisa se preocupar muito muito sobre isso agora. É bom ter uma exposição, para saber que você pode fazê-lo. Você pode criar alguns louco number-- que puder criar matrizes louco é tudo o que eu vou dizer. [Inaudível] Ele fica um pouco louco, mas é muito legal. Impressionante. E então, por isso temos um exemplo aqui. Ele calcula um comprimento de corda. Assim como muitas pessoas sabiam que as cordas que você está usando são apenas conjuntos de caracteres? OK, sim. Então vocês podem pensar que você não tem matrizes usado antes, mas a qualquer momento você usa getString no Biblioteca CSView, você está na verdade, apenas a pedir uma matriz de caracteres. E nós estamos cuidando de tudo que no back-end para você. Mas você estiver usando matrizes desde que você começou. Você só não sabe disso ainda. E sempre que você tem um array de caracteres ou uma matriz que está armazenando uma string, a última coisa que é sempre o que é chamado um terminador nulo, o que é este aqui. E que é no final do cada palavra que você está armazenando. Portanto, se queremos descobrir a comprimento de uma string, podemos dizer, bem, você sabe, o conteúdo desse bloco não é igual ao nosso terminador nulo. Isso significa que há alguma personagem lá que nós realmente se preocupam com isso é parte da palavra. Você aumenta o seu comprimento. E então, quando nós realmente começar a o final da palavra, ele vai terminar e ele vai voltar a nossa comprimento para nós. Mmhmm? ALUNO: Será que o espaço contam como o terminador nulo? ALLISON: Então é um espaço não um terminador nulo. Então se você tem um espaço multiple-- é, na verdade, um valor ASCII específica. Estudante: Qual é a exclamação igual de novo? ALLISON: Então, é isso que você se refere. Se você nunca me ouve em horário de expediente, Eu sempre chamá-lo, como, estrondo igual. Então bang não é. Portanto, este não é igual. Então, se você está tentando ver se algo é falso, você sabe que sempre faz, o que quer que estrondo a variável é, e se é falsa, que avalia a verdade e você pode fazer coisas legais com isso. Mais sobre isso mais tarde. Legal. Tudo de bom lá? Impressionante. Portanto, agora é o tempo dos seus rapazes para trabalhar, já que eu tenho falado. Então, eu quero que você apenas criar uma matriz com os números inteiros de um, dois e três, e, em seguida, tê-los impressos. Você não tem que fazer, como, principal, blah, blah, blah, o que for. Eu só quero que você inicializar a matriz e, em seguida, criar um loop for para imprimi-los out-- ou um loop while, até você. Eu vou dar-lhe um par minutos para trabalhar nisso. Vou descansar minha voz. Se você tiver alguma dúvida, eu estou feliz para vir ao redor e falar com vocês. Sinta-se livre para falar uns com os outros. Obtenha mais doces. Na verdade, eu vou andar por aí com doces. Como é isso? Você quer algum? Qualquer outra pessoa nesta sala quero doces? Você também pode ter mais de um, gente. Pegue um punhado se quiser. Maio também. Todos boa pessoa? Está bem. Além disso, eu estou indo para criar Google uma forma anónima, e vocês podem apenas enviar feedback após cada seção se há algo que você quer melhorar ou algo que você quer fazer. Se eu sou um pouco enérgico para você, eu posso falar mais baixo. Eu vou criar essa e enviar que para todos vocês depois. Tudo certo. Então, vamos começar pequeno. Como poderíamos iniciar nossa matriz? Qual é o tipo de nossa matriz? Um int, certo? OK, então o que você quer para chamar a sua matriz? Int matriz, legal. Tudo bem, então temos int int matriz é igual, eo que nós temos depois disso? Estudante: [inaudível] colchetes. ALLISON: Cintas. E então, dentro das chaves? Uma vírgula dois vírgula três. Legal. Então está tudo bem. Portanto, agora temos nosso loop for. Assim, na primeira parte do nosso loop for, o que temos? ALUNO: i é igual a 0? ALLISON: Então int i é igual a 0, e então o que é a nossa condição? O que eu vai ser menos do que? Menos de três anos, e como nós vamos atualizar i? i plus plus, atualizando-o por um. E então nós vamos ter alguns printf do número inteiro, eo que é que a última parte que é realmente vai dizer o que deve ser a impressão? Seria o nome do array, que é int array, certo? E o que é nos suportes de int array? Eu. [? Então eu?] Chamou meu exemplo, mas lá vai. Não é tão ruim. Todo mundo bom? Legal. Assim, estamos a fazer com as matrizes. Parabéns. Você conseguiu iteração através de todos as-- sim? Estudante: [inaudível] ALLISON: Sim. ALUNO: Eu tenho uma pergunta. Você deveria recuar as chaves? ALLISON: Então as chaves devem alinhar com o loop for, e então tudo dentro das chaves deve ser recuado. ALUNO: OK, se o loop ser recuado? ALLISON: O laço não precisa de ser recuado neste ponto. Se você estivesse no principal, se nós realmente tinha uma função principal aqui, seria recuado da principal. Mas, neste caso, está tudo bem. Sim, pergunta. ALUNO: Você precisa ter os colchetes após exemplo? ALLISON: Sim, se você estiver inicializando-lo dessa forma. Então lembre-se, este é o segundo maneira de inicializar um array onde temos as chaves e, em seguida, o nosso real dados separados por vírgulas dentro. ESTUDANTE: Eu pensei que havia suportes para esse exemplo. ALLISON: Não, eles são chaves. Eles são chaves. Se você está inicializando-lo que a segunda maneira, é suspensórios. Se fôssemos dizer, int example-- se nós só queríamos uma matriz em branco para ints, seria exemplo int três suportes. Os parênteses representam o tamanho. Quando você tem chaves, é os dados reais você está colocando nela dessa maneira. Podemos rolar para trás muito rápido. Então, em um presente, esta é apenas a nossa matriz inicial, a inicialização. E aqui, nós somos individualmente atribuição de pontos para eles, de modo que este representa o índice do nosso array, que é por isso que temos suportes. Mas aqui, se você observar, nós temos deixou nossos suportes sem tamanho, e inicialize-o com o dados reais all-in-one com suspensórios. Estudante: Então por que não temos colchetes neste exemplo? ALLISON: Então, em que parte? Estudante: não iríamos digamos, exemplo int suportes é igual chaves [inaudível] colchetes, por exemplo. ALLISON: Oh, desculpe. Você está certo. Temos suportes lá. Sorry guys, meu mau. Sim, você deve ter entre parênteses após exemplo. Você está absolutamente certo. Estudante: [inaudível] não fazê-lo. ALLISON: Não, você tem que ter suportes, porque caso contrário, é não vai declarar uma matriz. Estudante: [inaudível]. Desculpe por isso. ALLISON: Desculpe, mas você precisa entre parênteses após exemplo. Typo. Boa captura, estrela do ouro para você. Além disso, se você está fazendo uma pergunta, se vocês só iria me dizer seus nomes, Eu adoraria isso. Eu adoraria ser capaz de conhecer todos os seus nomes. Eu não estou indo para o frio chamá-lo, eu realmente quero apenas saber seus nomes. Então, por favor, na verdade, me diga seus nomes. LEAH: Leah. ALLISON: Leah. OK, então eu sei funções no passado em breve eles falaram sobre isso durante a palestra. Assim, as funções são uma espécie de apenas como essas coisas pequenas do tamanho da mordida onde você passar em insumos, algo mágico acontece, e você terá saídas. Legal. Então você realmente usado um Muitos destes já. Obter int, obter corda, impressão f. Estas são todas as funções onde você acabou de chamá-los, há muitas coisas mágicas acontecendo no fundo que você não necessariamente ver, e você terá o que você quer. Ou pelo menos você começa o que você espera que você quer. E, basicamente, o ponto de funções, e um dos principais temas do CS, é quebrar o seu código em partes gerenciáveis. Quando você começar a escrever estes programas muito longos, ou em risco quando você tinha esta grande idéia para um jogo, você precisa ser capaz de quebrá-lo para baixo, como, OK, como faço para começar? Quais são as pequenas peças que eu preciso? Oh, eu preciso perguntar a usuário para alguma coisa. Agora eu preciso imprimir algo. Oh, eu preciso calcular esse valor. E aprender a quebrar o seu código e os grandes problemas que você ter para estes pequenos pedaços e criação de funções é, na verdade, um dos grandes pilares da CS. Assim, você pode pensar em uma função tão como uma caixa preta, uma caixa preta mágica, que você colocar as coisas em e você terá alguma saída. E o resto do programa não precisa saber necessariamente o que está acontecendo dentro dessa caixa preta. Tudo o que interessa é o que entra eo que sai. Legal. Então, por que funciona? Organization-- como eu disse, quando você está lidar com grandes bases de código, como você organiza seu código será muito mais fácil se você usar funções. Porque você vai ser capaz ser, como, OK isso, é o que essa função faz e aqui está o que outro faz. E você pode facilmente ver como todos eles se encaixam. Então, dividindo-o em tudo essas subpartes gerenciáveis. Então simplification-- eu tenho certeza que vocês todos viram isso, como eu disse, com o Scratch. Você tem essa grande idéia, e você é como, como é que todo esse trabalho? Mas se você se aproxima dele fragmentada, você diz, OK, como eu faço um duende flutuam pela tela? Isso é um pouco mais fácil. Então, bom uso da função marcas seu código muito mais fácil de ler. Ela torna mais fácil de depurar que como você entrar em seus conjuntos de problemas posteriores, você vai realmente quer ser capaz de fazer. E eles são também mais fácil para projetar e implementar. Você pode codificar-se uma pequena funcionar de modo relativamente rápido e ter certeza que trabalha contra a tentar para criar todo este programa de longo e, em seguida, tipo de percorrer e ver o que está funcionando eo que não é. E, em seguida, a capacidade de reutilização. Então funções só precisa para ser escritos uma vez, e então você pode usá-los tantas vezes quanto possível. Então, é, assim, em um sentido ecológico. Se você tivesse coisas como impressão f, onde você tinha que escrever a magia que vai por trás de imprimir f cada vez você queria imprimir algo, você seria muito doente e cansado dele até ao final. Uma das coisas que você vai aprender em aulas posteriores CS, ou um dos melhores conselhos que recebo é, se você está copiando e colando código, ele provavelmente deve ser uma função. Se você tem exatamente o mesmo todas as linhas em todo o seu código, se você consignado-los para fora, seu código seria provavelmente ser, tipo, cinco vezes mais curtos e ser muito mais fácil de ler. E, em vez de tentar resolver todos esses lugares diferentes onde as coisas pode dar errado, você tem uma função que você começa a solucionar. E eu prometo, um monte de presente Pode parecer tipo de abstrato agora, mas como você entrar mais tarde e problema mais tarde define, ele vai fazer muito mais sentido e realmente ser levado para casa. Há alguma pergunta sobre as funções até agora? Por que nós estamos usando-os? Eu sei que não tenham obtido no âmago da questão ainda. Assim, a definição de uma function-- tal como matrizes, precisamos de algum tipo de-- este é apenas a saída geral. Portanto, esta é uma função que é só vai cubo alguma entrada. E na próxima página, na verdade, temos todos esses impressionantes pequenas coisas aqui. Assim, todos podem ler que, por curiosidade? Eu sei que o roxo e preto pode ser um pouco difícil. Mas as coisas grandes para sabe-- assim a primeira um aqui é o nosso tipo de retorno. Portanto, este é falar sobre a saída desta função quando, neste caso, que colocar em algum número, o que estamos recebendo é que esse número ao cubo. Por isso, deve ser um int neste caso. Talvez seria uma dupla ou algo mais tarde, mas, neste caso, é um int. Com c, você sempre precisa de um tipo de retorno. Vai ser um int. Vai ser um float. Vai ser um casal. Mas você tem que especificar o que esta função vai retornar. Caso contrário, ele vai gritar com você, e que não irá compilar. Você vai ficar triste, e eu vou estar triste. E não é apenas bom. Está bem. E então temos o nosso nome da função. E como você pode ver aqui, com c há esse paradigma muito consistente. Qual é o seu tipo, qual é o nome, e então alguma outra coisa no final. Então, nós temos o nosso tipo de retorno, o nosso nome da função, e em seguida, temos o nosso cabeçalho com nossa lista de parâmetros. Assim, a lista de parâmetros é, o que é esta função vai levar em? A lista de parâmetros é simplesmente um sinônimo de, quais são as nossas entradas? E, do mesmo modo que nós tem que definir nossa função e dar-lhe um retorno digita, cada um de nossos insumos precisa de ter um tipo associado a ele. Então, nós sabemos que a nossa função pode realmente trabalhar. Portanto, neste caso, temos alguma entrada int. Então, novamente, ele vai ser do tipo eo que você está chamando. E então, como você vê aqui, temos o nosso corpo. Portanto, temos alguma saída int, que é apenas a nossa própria entrada vezes si vezes, que apenas cubos lo. E então voltamos essa saída. Então, como você vê aqui, temos um int vezes um int vezes um int, assim ele retorna um inteiro, que foi declarada lá. Então, tudo é coeso. Tudo está feliz. Sua função será executada. E esta é apenas a coisa geral. Então, sempre tem tipo de retorno, nome, e sua lista de parâmetros. Cada coisa em seu lista de parâmetros, ou de entrada, precisa de ter um tipo associado a ele. E então você tem o seu corpo aqui com o que você quer fazer com a sua entrada. E então, obviamente, você quer retornar algo. Às vezes funciona só vai voltar. Eles realmente não voltar algo para você usar. Mas você tem que voltar de alguma forma. E quando você está fazendo suas próprias funções, podemos entrar nisso um pouco mais profundo. Pessoalmente, se você quiser, há um grande número de coisas diferentes que você pode fazer lá. Todo mundo bom? Qualquer coisa nesta lista que você me quer para passar por cima, que você não entendeu? Todo mundo é bom lá? Legal. Impressionante. OK, então nós estamos colocando tudo isso junto agora. Portanto, temos alguma entrada int cubo, tão este é um programa completo aqui. Até agora, eu tenho tipo de dado você snippets homens que possam estar acontecendo dentro de um programa. Estivemos apenas olhando para as funções. Mas aqui está um programa inteiro. Assim como muitos de vocês se lembram do protótipo palavra da palestra? Legal. Temos um. Qual o seu nome? STEPH: Steph. ALLISON: Steph? OK, impressionante. Então, você se lembra o que é um protótipo? ALUNO: Você diz que [inaudível] antes de realmente lidar com isso. ALLISON: Você se lembra por quê? Estudante: Não. ALLISON: OK. Estrela do ouro. Então, sim, um protótipo que temos de antemão, porque, caso contrário, nosso compilador vai gritar para nós. Ele vai dizer, OK, o que é essa função de cubo? Tipo, você tem literalmente não me disse nada sobre isso. É como quando você entrar em uma sala de aula, e alguém é como, há um quiz hoje. E você é como, você nunca me falou sobre isso. Eu não estou feliz com a gente. O protótipo é basicamente como seu programa dizendo, olha. Cabeça para cima. Não vai ser um quiz sobre o dia de hoje. Não se desespere quando você chegar a ele. Você vai ficar bem. Portanto, tudo o protótipo faz é dizer principal, eu vou usar essa função. Eu prometo que vou definir isso mais tarde. Não se desespere para mim. Apenas compilar e fazer o que eu disser para você. Portanto, temos o protótipo lá apenas para fazer o nosso compilador feliz. E é basicamente uma promessa que você definiu essa função mais tarde e que você não está apenas chamando essa coisa aleatória que não sabe o que você está vai estar fazendo. Portanto, neste caso, temos principal aqui. Nós inicializar algum inteiro x. Isso é dois. Nós estamos indo para imprimir o que é x. Nós vamos cubo x. Como você pode ver, temos a nossa declaração da função aqui que nós falou anteriormente. Vai cubo x, e, em seguida, se lembre-se, a função de cubo, na verdade, retorna um inteiro para nós, que é armazenado em x novamente para que possamos imprimir fora oito, ou cubo x agora. Isso faz sentido para todos? Nós somos bons? Tudo certo. Impressionante. Tudo certo. Quantos de vocês Lembre-se este de modo que este é, basicamente, apenas o seu pilha e seu montão, apenas uma visualização de como a memória é armazenada aqui. Então, nós apenas queremos fazer Certifique-se que você entenda como estas estão representados na memória. Se você tomar aulas de como CS61 e outras coisas mais tarde, você começa a aprender isso muito mais em profundidade, e é muito legal. Eu recomendo fortemente. Mas, por agora, eu vou dar lhe a visão ampla assim você não tem que conhecer o âmago da questão. Assim, o topo apenas um segmento de texto que contém os zeros e uns reais, o binário para isso. E este é usado para armazenar variáveis ​​globais, se tiver algum. Como você se move para baixo, nós tem, como você vê aqui, dados inicializados, não inicializada dados, e depois heap. Então, nós realmente não falar sobre a pilha agora. Nós vamos chegar a isso mais tarde. Por agora, eu estou indo só para onda minhas mãos e ser como, você não precisa saber sobre isso agora. Mas vamos falar um pouco pouco sobre a pilha. Assim, a pilha é where-- temos zoom in. Isto é, na verdade, como o programa nós apenas olhou ocorre na memória. Então o que acontece é que, cada vez que chamar uma função, temos o que é chamado de uma pilha armação, que é um destes. Então parâmetros de principais. Então, essas são as coisas que passamos para principal. Então, eles estão aqui na parte inferior, porque essa é a primeira coisa que nós chamamos. E então chegamos ao principal da locals, e quando dizemos que, queremos dizer as variáveis ​​locais que são armazenados dentro principal. Então moradores aqui seria, como, x é igual a dois no caso presente. Porque que está localizada a principal. Será que todo mundo se lembra escopo, passando por cima que na palestra? Está bem. Assim, apenas as variáveis ​​que são inicializados dentro principal. Então é por isso que temos principal [? vocals. ?] E, em seguida, dentro de principal, que chamamos de cubo. Certo? Então, nós temos outro quadro com os parâmetros do cubo. Portanto, neste caso, o cubo de parâmetros são agora o x que passamos em, os dois que temos passado. E então, os moradores do cubo, que é onde a cubagem real acontece. E depois ele retorna. Então, o que acontece é como cubo realmente faz o que é suposto fazer, ele retorna. Quando ele retorna, este quadro deixa, e sua retornou até principal. E, em seguida, dentro de principal, nós realmente pode imprimi-lo. Então, quando você está retornando alguma coisa, quando a função retorna, é como passar esses valores para o quadro abaixo e, em seguida, sair. E as coisas têm de executar em ordem. E quando você começa a programas maiores, podemos fazer mais frio e mais complicado diagramas. Mas, por agora, este é apenas uma visão geral então você tem uma espécie de compreensão do que acontece quando você está chamando uma função e como isso realmente parece na memória. Legal? Todo mundo bom? Impressionante. Portanto, este é aquele que é apenas tentando trocar coisas. Como podemos ver aqui, temos nosso protótipo da função para que o nosso compilador não gritar com a gente. Temos alguns principal, e nós quero mudar x e y. Eles não fizeram esta demo em palestra, no entanto, têm eles? Eles não têm? Está bem. Então, nós estamos indo para ir sobre este, muito brevemente. Você vai chegar a este exemplo mais em profundidade, penso eu, esta semana. E, em seguida, na próxima semana podemos realmente mergulhar por que isso não funciona. Então nós temos esse vazio função aqui-- swap. Então vazio significa apenas que nada é retornado. E temos de swap int a e int b. E nós temos alguns temporária variável que é a. um é atribuído a b, e, em seguida b é atribuído à temperatura de modo que A e B do Os valores são agora comutada. Mas, reviravolta na história, isso não funciona. E parte do que realmente tem a ver com o fato de que um e B aqui, os que são passadas em aqui, são na verdade cópias de x e y. Então, quando a função realmente retorna, ele muda as cópias, mas não o real x e y do. Assim, uma maneira de pensar sobre isso é isso-- fingir estes são swap. Ok? Assim, em principal, temos x e y inicializado. Mas quando nós realmente ir para cima a estes quadros com swap, estamos passando os valores mais para ele, e eles estão inicializado. E eles só vez ao vivo aqui. Assim, a e b viver aqui. E eles são trocados. Mas quando voltar, nós não fazer qualquer coisa com a e b. uma e b licença com a nossa função. E assim x e y ficar na mesma. Você vai ter mais em como corrigir isso e como realmente lidar com isso mais tarde. Mas é apenas uma coisa ao tipo de manter em mente. Use-o para o futuro. Não se preocupe se isso não fazia todo o sentido do mundo. Eles são cópias é a coisa mais importante. Se você estiver indo para fazer qualquer coisa longe disso, você passou em cópias. Então os originais ficar na mesma. Todo mundo bom? Legal. Assim, os argumentos da linha de comando. Tenho certeza de que no começo vocês todos tinha aquelas grandes, como, vazios principais int. E você é como, fresco OK. Eu realmente não me importo. Este é apenas o que eu tenho que escrever. Mas em seus novos programas, especialmente neste pset, e porque é que há giz no chão? Com a sua próxima pset, você está vai estar vendo isso. Int main, int arg c, corda de arco v, entre parênteses. Assim, a partir do que apenas hoje aprendi, o que nós pensamos que o segundo parâmetro ou que o segundo elemento é aqui? É uma matriz. Qual o tipo de matriz? Matriz de cadeia, sim. Legal. Então é assim que você vai a ser declarar estes agora. Alguém se lembra o que estes significam? Não? Hmm? ALUNO: arg c. ALLISON: Então arg c mantém um contador. É um int. É um número, certo? Então, o que você acha que o número é de? Sim. Assim arg c é o número de cordas que compõem a linha de comando. Então, se fôssemos realmente fazer--, existem exemplos após este, por isso não vou ficar à frente de mim. É um número de cordas que apenas fazer a sua linha de comando. Então, quando você faz, como, dot cortar Mario, isso é uma cadeia que torna-se. Nesta peça, você vai realmente ser alimentando as coisas na linha de comando, como eu tenho certeza que vocês que li a serra spec. Assim, nesses casos, talvez você ter dois ou três argumentos. Vai ser uma coisa útil para usar. E então arg v, como dissemos, é apenas uma matriz de cadeia. Assim que o que efectivamente armazena introduzido na linha de comando. Portanto, temos estes. Você tem alguma barra dot copiar outfile infile. Assim, se arg c é o número de cordas que estamos passando para o comando linha, que é a nossa arg c neste caso? Três. Exatamente. Então, qual é arg v zero? Então, qual é a primeira coisa que temos armazenado? Dot cortar cópia, exatamente. E, em seguida, o segundo seria infile. A terceira seria outfile. Assim que sobre arg v três? Seria nulo, porque isso é o fim da nossa matriz, certo? Legal. E então o que acontece com o sexto? É uma espécie de uma pergunta capciosa. Ish. Não sabemos o que é? É indefinido. Nós não temos idéia do que poderia ser. É tudo o que é direito depois da matriz na memória, e não temos idéia do que é isso. E é perigoso tocar aqueles coisas, porque para tudo o que você sabe, é uma parte da memória que você não deve ser acessar ou nulo. E ele pode fazer coisas malucas. Chama-se sobre-indexação seu vinculados à sua matriz. Não vá para fora dos limites de sua array, ou coisas ruins podem acontecer. Você volta e, assim, as leis da física foram destruídas ou algo assim. Legal. Isso faz sentido para todos? Não é tão ruim. Então, agora, todo mundo é parte favorita, revisão pset. Yay! Está bem. Portanto, para aqueles de vocês que não leu a especificação pset, você está fazendo algum realmente coisas legais com criptografia. Você vai criar uma Ceasar Cifra e uma cifra de Vigenère. Você deve definitivamente ler o especificação para ver como funcionam. E se você está tendo algum problema sobre o que ele realmente deve estar fazendo, por favor, venha falar comigo, enviar e-mail me ou texto me. Eu estou por perto. Assim, existem três principais coisas aqui que nós quero falar about-- só tipo de uma extensão da palestra. Coisas que você pode não saber sobre, dicas e ferramentas úteis. Então, nós vamos fazer uma revisão rápida de ASCII, porque isso vai ser super importante para a cifra do Vigenere. Nós estamos indo para a conversão de entradas de linha de comando, que vai ser muito útil para Caesar Cipher. E então modulo. Legal. Então, ASCII mapeia caracteres para números. Este é um grande quadro. Você deve ter este marcada em algum lugar. Você vai querer isso para o primeiro a médio prazo. Tenho certeza que todo mundo tem esse gráfico em sua folha de médio prazo. Assim, aprendê-la. Adoro. Mantê-lo acessível. Vai ser útil. E tudo isso é uma codificação que mapeia alfabética, numérica, e outros caracteres para números para o nosso computador. Por causa do curso, na final, tudo o que armazenar vai ficar convertido até zeros e uns, por isso precisamos de alguma forma para representar a texto e os personagens que estamos todos acostumados a ver como uma espécie de número. Então, como podemos ver aqui, temos maiúsculas A, que é logo ali. É 65. E minúsculas A é 97. Assim, você pode descobrir out-- como eu disse anteriormente, se você tivesse variedade de múltipla cordas, o que cada um deles possui um terminador nulo. Seria um espaço. Espaço tem a sua própria especial-- Eu esqueço onde ele está aqui. Ah. 32 é o espaço. Então, tudo é mapeado para ele. Portanto, temos de matemática ASCII. Pro tip-- em Vigenere de, você pode ser tentado para converter os números para inteiros, mas é realmente melhor prática para ser capaz de usar o caracteres como este quando você está realmente manipulando-os. Então, se você quiser usar números, você pode. Mas uma melhor forma, ou uma forma que que tendem a gostar de vocês para fazê-lo, É desta forma que você está na verdade, subtraindo caracteres. Então, eu quero que vocês tipo de descobrir estes para fora. Por que você não tentar todos os outro? Então, fazer o primeiro, o um terceiro, quinto e um. Porque eu quero ter certeza de que nós falamos sobre tudo o que precisamos para falar. Eu só vou dizer, um dos coisas importantes a-- oh wait, vocês não vi este. OK assim que fazer os três primeiros. Vamos fazer isso. Porque nós temos que falar sobre modulo. Eu sei. Matemática é difícil. Você pode usar uma calculadora. Está certo. Ou puxar uma tabela ASCII, porque você provavelmente vai querer isso. Legal. Então eu vou caminhar rapidamente vocês através destes. Então, as pessoas têm tabelas ASCII puxado para cima? Qual é a nossa numérico número de minúsculas A? ALUNO: Sete. ALLISON: Então minúsculas A é 97 e maiúsculas A é 65. Então, 97 menos 65? AUDIÊNCIA: 32? ALLISON: 62, sim. Portanto, neste caso, o que seria imprimir? Esse primeiro? Se tivermos por cento d, o que isso indica? ESTUDANTE: Um número. ALLISON: Estamos imprimindo a um número real. Então, nós estamos indo realmente para imprimir 32 aqui. E se isso fosse por cento c, 32 nos daria um espaço. Assim, entendendo que caracteres podem ser impressos tanto como números e conforme os personagens reais é realmente importante, e pagar a atenção para os tipos reais que estamos fazendo aqui. Legal. Assim, para cada um destes outros, o que é que vai ser a impressão? ESTUDANTE: Um personagem. ALLISON: Uma personagem. Legal. Então, se vocês querem saber, você pode trabalhar estes para fora em seu próprio país. Se você está tendo problemas, me e-mail. Mas a segunda só será imprimir uma minúscula b. O terceiro irá imprimir uma maiúscula B. A quarta imprimirá fora uma maiúscula C, ea última será uma minúscula A. E a última um-- na verdade estamos indo para entrar o que esse louco por cento sinal significa que mesmo em um par de slides. Portanto, tente aqueles em seu próprio país. Se você tiver problemas, por favor, venha falar comigo. Se você é tipicamente em Adams corredor D, você provavelmente vai encontrar em torno de mim. Então, atoi. Quantos de vocês já viram isso função ou ouvido falar dele, afinal? Qualquer um? Legal. Então, o que ele realmente significa para ASCII é para inteiro. Então, o que você pode fazer é, com César, para quem lê a especificação, você vai fazer barra ponto César Depois de escrever o seu programa, e, em seguida, você vai entrada de um número que você quer codificar a sua mensagem secreta com. Mas, se nos lembrarmos, toda a nossa insumos são armazenados como strings. Certo? Temos uma variedade arg v isso é tudo o tipo string. Então, se você apenas tentar puxar esse, seria acha que que um ou qualquer número você usou é realmente um personagem. Então você está indo para obter alguns resultados loucos. Então, se você realmente quer transformar isso em um número inteiro que você pode usar para manipular sua palavra ou a sua mensagem, você vai querer usar atoi. atoi apenas converte sua seqüência para um int. Então, se temos uma seqüência de 12, se nós chamamos atoi em 12, ou o que quer que a entrada é, ele vai realmente voltar para você o número inteiro. Não é o caráter ou a seqüência de 12. Que, quando você começa de acrescentar que a números, será muito diferente, porque a cadeia 12 é algum número louco em ASCII, mas o número inteiro 12 é, na verdade, 12, que é o que você quer. Então, você quer ter certeza de usar atoi. Você vai querer esta em César, porque você necessita o int fornecido pela usuário na linha de comando. Mas quando eles colocá-lo no comando linha, ele é armazenado como uma string para começar. Será que isso faz sentido? Você não precisa necessariamente preciso isso para Vigenere. Com Vigenere, como eu disse antes, você deve tentar e usar Matemática ASCII que mais parece este, onde você está, na verdade, usando os caracteres que são dadas a você. Legal. Todos bom lá? Impressionante. Assim módulo. Assim que se você está dado este número enorme de César? Você tem essa idéia de que se você estiver em Z e você está dado um número de dois, isso significa que você need-- Z torna o segundo carta depois de si, certo? Então, você precisa de alguma forma envolver em torno, e modulo é a maneira de fazer isso. Então, tudo que ele faz é dá-lhe o restante da divisão do primeiro número pelo segundo. E temos alguns exemplos para que um pouco mais concreto fazer. Mas, basicamente, você usa modulo quando você quero fazer algo envolvente. Então, se você só quer o números de um a oito, você pode usar em qualquer outro modulo número, e será sempre devolver um número de zero a oito. Assim, alguns examples-- se temos 55 módulo 10, ele apenas dá-lhe o restante do 55 dividido por 10, que seria de 5. E depois de três modulo cinco, Alguém adivinha o que seria isso? Três. Então se você tem um número menor antes o modulo, ele não pode ir na uniformemente. É zero. Então, ele só retorna o próprio número. Assim, oito modulo oito seria? ALUNO: Zero. ALLISON: Zero. Uma vez que ele vai em uniformemente. 16 modulo 15? AUDIÊNCIA: One. ALLISON: Cool. E então este último é apenas para mostrar você- você pode estar se perguntando, OK, qual é a ordem das operações aqui? Será que dividir pela primeira vez? Será que modulo primeiro? Então modulo tem a mesma precedência como a divisão ou multiplicação, e os seus associativo esquerda. Por isso, é da mesma forma. Você sempre faria parênteses, em seguida, multiplicação, divisão, e módulo em ordem da esquerda para a direita. Assim, as regras padrão. Basta colocá-lo na mesma categoria como a divisão e multiplicação. Portanto, neste caso, teríamos tem 1 mais 2 nos dá três. Nós que multiplicar por dois, então temos 6. Nós modulo que por 2, o que nos dá? ESTUDANTE: 0. ALLISON: 0. E, então, adicionar 2, de modo que obter 2 neste último caso. Então modulo-- você está indo definitivamente para estar pensando em maneiras de incorporar que quando você está enrolando em torno do alfabeto. Se você estiver em Z e você precisa mover encaminhar três espaços para chegar a C, há todo esse conceito de enrolar. Então, vou deixá-lo para vocês para descobrir exatamente como você vai usá-lo. Mas definitivamente uma ferramenta útil para o seu pset esta semana. Eu realmente gosto disso. Este é um dos meus favoritos Série de Exercícios. Então, depois de fazê-lo, se você tem amigos, você pode, assim, enviar outro segredo mensagens e se certificar de que funciona. Porque ele vai decifrá-lo ou qualquer coisa. Muita diversão. E isso é o fim da seção. Terminei cedo. Eu ainda tenho 15 minutos com vocês, por isso, se há alguma coisa que você gostaria de passar por cima de mais, eu ficaria feliz em fazer isso. Quaisquer outras perguntas sobre seu pset para aqueles de vocês que já começaram ou ler o spec. Tudo o que nós falamos aproximadamente na última hora e 15 minutos que você gostasse de mim ao tipo de repetição, eu ficaria feliz em. Ou podemos chamá-la, e você pode tudo sair e levar mais doce com você como você vai. Mas se houver algum persistente perguntas, por favor, deixe-me saber. Você também pode vir para cima e falar comigo depois. Eu prometo que eu não mordo. Algo mais? Todo mundo é bom? Sentimento de todos como eles podem lidar com este pset? Você vai ser caras bons. Horário de atendimento estão lá por uma razão. Legal. Tudo bem. Bem, nesse caso, obrigado tudo o que você tanto vindo. Eu espero vê-lo na próxima semana. Haverá mais doces. Pode haver outras coisas legais. E estou ansioso para ficar para conhecer todos vocês este ano.