[Música tocando] ANDI Peng: Esta é CS50, e bem-vindo a semana dois de seção. Isto é, na verdade, enquanto semana dois de nossos class-- na verdade, a primeira semana nós tivemos seção. Show de mãos, como muitos de vocês todos veio a seção de super na semana passada? OK, isso é OK. Está ok. Quantos de vocês assistiram Super seção na semana passada? ESTÁ BEM. E vocês fizeram bem no problema definir um? Então, eu estou indo tomá-lo que nós temos um bando de garotos realmente inteligentes nesta classe e as coisas vão ficar bem. ESTÁ BEM. Então first-- Em primeiro lugar, nós apenas estamos indo para brevemente atravesse a agenda para hoje. Vamos falar sobre a logística do curso. Muitos de vocês provavelmente tiver dúvidas sobre como as coisas funcionam neste curso. Vamos respondê-las. Nós vamos brevemente passar por cima de loops em caso algum de vocês perdeu seção de super. Vamos falar sobre o mapeamento de ASCII. Falaremos sobre matrizes, funções, argumentos de linha de comando. E, finalmente, o que vocês provavelmente todos realmente quero estar aqui para aprender sobre, é o seu pset2. Nós vamos ter alguns truques interessantes e dicas para como fazer isso. ESTÁ BEM. Além disso, em segundo lugar, temos lotes de doces aqui. Quem gosta de doces, apenas chegar aqui. Pegue um pouco. Eu tenho um monte. Nós temos uma tonelada no escritório. Eu realmente não quero para comer doces durante todo o dia. Vocês devem comer todos os doces, porque eu o trouxe aqui para vocês. Basta comer doces. Haverá doces cada seção. Então, primeiro, quem sou eu? Meu nome é Andi Peng. Eu sou o chefe de TA CS50 aqui em Yale. E para além que, também eu me ser-- se alguém como-- sua corrida amigo, o seu ombro para chorar. Se a noite antes do seu devido pset, você não tem idéia do que está acontecendo, hit me up. Nós vamos lamentar juntos, et cetera. Só sei que eu estou aqui como um recurso para você como a linha de frente para ajudar você a descobrir como caras para resolver problemas em CS50 e além. Meu email é andi.peng@yale.edu. Eu também vou mandar um indivíduo enviar e-mail com o meu número de telefone nele de modo que nem todo mundo no internet podem ver o meu número de telefone. Sinta-se livre para me ligar a qualquer momento. Sério, meu telefone é geralmente ligadas a minha mão. Eu não posso responder dentro de alguns minutos. Eu posso não responder dentro de algumas horas. Mas posso garantir-lhe, se você me e-mail, se você me chamar, texto mim, vou responder no prazo de 24 horas. Muitas vezes, eu vou responder antes que, porque eu entendo que toda a gente tem alguns problemas, e você quer que as suas respostas a ser respondida muito rapidamente. No entanto, se você chamar me 30 minutos antes que peça que é devido quinta-feira noite-- ser como, Andi, me ajude, Eu não posso dar started-- você que ombro para chorar. Mas pode ser hora de pensar em como não fazer isso da próxima vez. ESTÁ BEM. Oops. Como faço para voltar? Aí vamos nós. Portanto, neste curso, nós temos um tonelada de apoio para todos. Além apenas seções aqui, que você cada semana começa a gastar 90 minutos maravilhosos comigo, temos também o horário de expediente. Quantos de vocês já tem foi para o horário de expediente para obter ajuda? Ótimo. Isso é realmente bom de ver, porque nós temos uma equipe de mais de 45 agências de viagens e CAs treinados para este curso que está aqui para ajudar vocês com seus Série de Exercícios. Segundas-feiras eles estão detidos na TEAL sala de aula em 17 Hill House aqui em Yale. Terças e quintas, eles são mantidos em commons. 8:00-11:00 praticamente todos os dias da semana. Venha, venha para fora. Qualquer problema, não problema-- apenas venha, e então nós vamos ajudá-lo com isso. Em segundo lugar, para além do expediente e seções, temos também calções. Alguém já viu um casal do shorts ou orientações nos vídeos no site? ESTÁ BEM. Então eles são muito, muito útil. Nossa linda produção Harvard equipe lá naquela escola no norte, eles filmado e produzido esses vídeos passo a passo incríveis. Eles vão levá-lo passo a passo através como proceder para resolver um problema. Muitas vezes, se você está confuso sobre um conceito simples, um conceito singular, Dê uma olhada, porque nós provavelmente temos um curto em algum lugar no nosso site. E normalmente é um grande recurso para procurar quando você está primeiro perdido sobre como lidar com um problema. Em terceiro lugar, temos também study50 e reference50. Assim, no estudo 50 site é apenas um link. É, eu acho, study.cs50.net ou algo assim. Basta pesquisar no Google. Temos lotes de lâminas preparadas. Temos lotes de calções e coisas walkthroughs-- todos compilados muito agradável e limpo para vocês todos para percorrer, consulte quaisquer conceitos que você está confuso sobre. Ele provavelmente estaria coberta lá em study50. Reference50-- semelhante. Temos um monte de várias notas prontamente disponíveis para sua disposição. E, por último, temos o que é Discutir chamado CS50, um fórum no qual, se a noite anterior você está fazendo os seus problemas, dizem, Você tem uma pergunta. Entrar e CS50 Discutir. Poste sua pergunta. E, em seguida, um dos hundreds-- talvez, thousands-- de pares tomar esta classe on-line irá fazer login. E talvez alguém pode obter a sua resposta antes de uma lata TA. É essencialmente apenas uma fórum on-line que todos nós podemos utilizar para discutir os nossos problemas. Isso é legal. ESTÁ BEM. Então, conjuntos de problema. Estamos prestes direita no espessura do conjunto de problemas dois. Muitos de nós já tem lutado por um conjunto de problemas. Nós já sabemos que talvez esperando para a última noite para fazer o seu pset não é a coisa mais inteligente a fazer em CS50. Dicas e dicas essencialmente para sucesso são ler todo o spec. Como muitos de vocês já tem ler a especificação para pset 2? ESTÁ BEM. Isso é um valor sólido. Eu sei que vocês provavelmente já reconhecido por agora, as especificações são muito longo. Eles são muito, muito longo. É realmente difícil de ler cada linha de que cuidadosamente palavra por palavra. Você quer apenas roçar para onde ele diz-lhe para fazer algo. Posso garantir que você, não faça isso. Se você fizer isso, você provavelmente está vai perder em algum lugar onde ele diz-lhe como começar um problema ou ele lhe diz o que nome o seu problema ou ela lhe diz, esta é provavelmente a melhor maneira para começar a fazer o seu problema. E então você vai ser perdida. Quando você tenta ler o seu especificação no meio, um monte de importante information-- em que você não está vai ser capaz de realmente acesso. Portanto, leia toda a spec. Tente ler toda a especificação antes de vir para a seção, porque então, quando nós falar sobre o pset, todos nós podemos ter uma idéia do que está acontecendo. Em segundo lugar, este é um conceito que eu vou gostar de referência muito ao longo do semestre do curso. Mas, essencialmente, conhecer-nos a meio caminho, certo? Me, como o seu TA e Jason como curso gerente e SCAZ como seu professor de e David como seu professor e todos os outros ATs adoráveis ​​neste curso, assistentes neste course-- nós faremos nosso melhor para garantir que você está definido para ter sucesso neste curso. Vamos realizar seção. Vamos realizar o horário de expediente. Nós responderemos seu telefone chamadas, responder a seus e-mails, fazer tudo o que pudermos para tornar Certifique-se suas perguntas são respondidas. No entanto, nos ajudar também. Encontre-nos no meio do caminho. Se você vem para o horário de expediente não ter ido para a secção, não tendo visto as palestras, não tendo idéia do que está acontecendo, seja como, me ajude. Eu vou ser como, bem, eu sinto muito. Pode ser o momento para emprestar que ombro para chorar, porque eu não tenho certeza o que posso fazer para ajudá-lo se você não tentar, pelo menos, ajuda -se um pouco no início. Encontre-nos no meio do caminho. Você sabe, por favor, venha preparado para responder e obter pronto para se engajar no material. Isso torna as coisas muito mais mais fácil para todos os envolvidos. Sim, isso é muito bonito isso. Grading. Assim, no plano de estudos, é bastante em profundidade a respeito de como nós grau. Mas, essencialmente, a repartição neste é de 50% de sua nota serão os quais, Série de Exercícios é lindo, porque é isso onde você está gastando a vasta maioria de seu tempo no curso. Quizzes 40%, e sua projeto final será de 10%. Haverá dois questionários durante todo o curso do semestre. Eu acho que as horas e datas são também listado no plano de estudos. A maneira que nós vamos ser grading seus Série de Exercícios é que temos essencialmente quatro valores que atribui a cada grau. Temos um valor de escopo, exatidão, design e estilo. Então, como você pode ver, esse é o tipo da nossa fórmula de cálculo Série de Exercícios. Três damos mais peso para correção, porque, obviamente, o seu treinador deve ser a testar para os casos que nós queremos que ele para testar. Vocês todos têm check50 à sua disposição. É uma função muito útil que vocês podem tudo carregar o seu código para os nossos servidores, onde vamos verificar isso para você. E você já viu aqueles frowny rostos, caras do smiley. Eles são realmente, realmente útil. Por favor, não ser a estudante que gosta de tentativas para codificar em todas as respostas para elas. Eu definitivamente vi um pset onde alguém viu todos os valores de check50 e eles simplesmente codificado em-- se este número, imprimir este número. Se esse número, imprimir esse número. Não faça isso. Mesmo que tecnicamente check50 está correto, a sua maneira de resolver o problema não é correto. Então, basta usar check50 com moderação. Mas também certificar-se de que você entender como ele está funcionando, o programa está a funcionar Além de check50, porque não podemos testar todas as possível caso de check50. Nós vamos estar testando alguns deles. O design é essencial, como bem desenhado é o seu código? Se você é copiar-colar múltipla linhas de código muitos, muitas vezes. Talvez você não tem bastante o melhor design em seu código. Talvez seja hora de acrescentar que loop. Essencialmente, aqui é apenas tudo sobre a tentar fazer o seu código, tentando escrever seu código de forma tão eficiente possível, para que o seu programa é executado o mais rápido possível. Por último, temos estilo. Então, o estilo é uma espécie de arbitrário, termo subjetivo. Eu sei que nós temos oficialmente um guia de estilo para 50 CS50, onde ele diz que, oh, você deve ter um espaço aqui. Você deve tipo de formato seu código dessa maneira. Você deve nomear as coisas desta forma. Eu realmente não me importo, per se, como você escolhe o estilo do seu código, apenas contanto que você fique consistente. Por exemplo, se você gosta de deixar um espaço após o seu quatro antes de seu ciclo de quatro, apenas fazer isso o tempo todo. Não tipo de fazê-lo. Não fazê-lo outras vezes. Se você gosta de manter encaracolado espaço chaves de uma certa maneira, apenas sempre fazê-lo dessa forma. Não tipo de fazê-lo em algum lugar aqui e em algum lugar não existe. Quando estamos classificação, é realmente difícil se eu não tenho idéia de como você está formatando seu código, as coisas são loucas e fora de lugar. Se você apenas mantê-lo consistente, é muito mais fácil para mim como o maior para ser capaz de ler o seu código. É muito mais fácil para você como um estudante para ser capaz de olhar através de seu código e ver o que há de errado com que cortar porque há questões. O estilo é uma das coisas mais fáceis vocês podem fazer para obter escores completa. Essencialmente, se você só se preocupam, se você pagar cinco minutos de atenção ao seu código a cada semana, você deve estar recebendo pontos de estilo completos. Por último, temos o que é chamado o multiplicador do escopo. Scope-- Eu sei que é um grande palavra, especialmente nesta classe. Mas alcance, tudo o que meios é que você está tentando as Série de Exercícios para o melhor de sua capacidade. Se você virar em três dos seus quatro problemas e nem sequer tentar o última, provavelmente você está vai perder alguns pontos em escopo. Mesmo se você acabou de começar o problema, fazer o seu melhor para atravessá-la. Mesmo se ele não funcionar, transformá-lo em, pois que mostra e demonstra para nós que você está tentando, que você tentou o conjunto de problemas com o melhor de sua capacidade. E então nós podemos dar-lhe todos os pontos de escopo. Scope também é muito importante para quando nós falar sobre o menor gota pontuação pset. Assim, ao longo do curso do semestre, vocês têm nove Série de Exercícios. E nós vamos realmente estar caindo a menor pontuação fora daqueles nove, mas somente se você tem pontos de escopo completo. Então, se você transformar em um pset incompleta, infelizmente, não podemos deixar que um, porque o seu âmbito de aplicação Os pontos não foram concluídas. Assim, mesmo se você tiver a terrível semana onde você está morrendo e você está doente ou o seu cão morre, o seu gato morre, e você está sobrecarregado com a lição de casa, apenas tentar o pset. Fazê-lo com o melhor de sua capacidade. Se isso não funcionar, não importa. Basta ligá-lo em. Pelo menos podemos dar você aponta para o esforço. Um esforço para nesta classe. Pelo menos gota pontuação mais baixa para o esforço. Então sim. Isso é muito bonito isso. Alguém tem perguntas para agora sobre como nós grau na classe? Ou qualquer um desses? Qualquer um destes tão far-- seções, o horário de expediente? Legal. ESTÁ BEM. Portanto, este é um assunto que não um realmente gosta de falar sobre. Eu realmente não gosto de falar sobre isso. Vocês realmente não quero para me ouvir falar sobre isso. Mas, infelizmente, todos nós tem que falar sobre isso. David passou 20 minutos a palestra falando sobre isso. E esse é o assunto de honestidade acadêmica. Então, nós todos aqui têm provavelmente escrito um ensaio em algum momento da nossa carreira Yale. Nós provavelmente já conquistou uma palestra onde temos foi dito para não plagiar nosso ensaio, porque esse trabalho não é nossa. Em ciência da computação, temos o mesmo tipo de conceito. Todo o trabalho que você enviar, todo o código que você escreve deve ser o código que você escreveu. Não deve ser o código que você tem copiado de outro lugar. Não deve ser um código que você já pesquisei e se estatelou no e você realmente não sei se funciona. Você meio que tem um senso de o que está fazendo, mas não realmente. Quando em dúvida, essencialmente, é só ser razoável. Em nosso programa, temos toda uma lista de coisas vemos como razoável contra não razoável. Por exemplo, razoável é você e seu amigo discutir qual o melhor caminho a percorrer logicamente sobre como resolver um problema. Isso é bastante razoável. O que não seria razoável é se você caras se reuniram, digitou o mesmo código, e virou-se no mesmo código. Isso não é razoável. Mesma coisa, tipo de um ensaio. Se você quiser discutir com seu amigo, hey, é isso que eu quero escrever sobre. Estas são as etapas que eu quero tomar para escrever sobre isso, ótimo. Isso é maravilhoso. Por favor, colaborar uns com os outros. Se vocês começar escrevendo a mesma coisa, transformar, no mesmo ensaio, que é menos OK. Assim, quando em dúvida, apenas não fazê-lo. Aqui, em CS50, temos roteiros que correm para automatizar a testar não só a correção do seu código, mas também a singularidade de seu código. Então, por favor não nos coloquem na posição de ter de submeter o seu caso para EXCOMM. Por favor, só para toda a gente, vamos apenas tornar esta uma experiência maravilhosa. Todo mundo aprende melhor, todos nós somos mais felizes, e nós são todos criados para ter sucesso neste curso. Algo que é muito único sobre esta classe que eu acho que todo mundo deve realmente prestar atenção é que temos que é chamado de arrependimento cláusula no nosso programa. Então, basicamente, no prazo de 72 horas, se Você acredita que você tenha feito algo você não está realmente certo foi adequado, por favor, venha para nós. Prometemos-lhe que dentro de 72 horas vamos lidar com o caso nos sem se referir a uma maior autoridade na administração. Portanto, se você vir a mim e dizer: Andi, hey, eu realmente sinto muito, mas eu acho que há algumas linhas no meu código de ontem à noite que eu meio que pesquisei, saiu de Pilha Overflow, copiar e colar, e eu estou muito, muito triste sobre isso, deixe-me saber. Por favor, não apenas deixá-lo apodrecer e só espero que eu pegá-lo. Vamos pegá-lo. Apenas venha para mim. Deixe-me saber dentro de 72 horas. Vamos descobrir uma solução. E nós prometemos que não vamos referir-se a autoridades universitárias essencialmente. Portanto, é no seu melhor interesse para ser apenas honesto com todos envolvida no curso. ESTÁ BEM. ESTÁ BEM. Então, agora, rapidamente, antes Eu seguir em frente, qualquer um tiver dúvidas sobre logística sobre a forma como os cursos que estamos indo para executar, como seções estão indo a correr, nada disso? ESTÁ BEM. Sim. AUDIÊNCIA: [inaudível]? ANDI Peng: Sim. Então quizzes-- quantos de vocês são na seção segunda / quarta-feira? Quantos de vocês estão em terça-feira / quinta-feira? OK, por isso é uma fração sólida aqui. Assim, a maneira que nós funcionamos que em Yale é que nós vão ter dois separados quizzes-- um para cada section-- que serão tomadas durante a aula. Eu acho que é de outubro de final de outubro, algo assim, como uma semana do quiz. É, por isso só vir para a aula. Nessa segunda-feira ou quarta-feira, você vai fazer o teste. Nessa terça-feira ou quinta-feira, você vai fazer um teste diferente. Mas o mesmo material será coberto. Sim. Boa pergunta. Sim. AUDIÊNCIA: Onde nós ir para verificar nossas notas? ANDI Peng: Sim. Então eu vou estar enviando um e-mail qualquer que seja a cada semana quando os questionários são graded-- ou, pesaroso, quando Série de Exercícios são classificados. Série de Exercícios são geralmente girado ao meio-dia ou na sexta-feira. Então, eu prometo que vou tentar levá-los de volta para você pelo meio-dia da sexta-feira seguinte. Sempre que eu grau um pset, eu enviarei uma notificação sobre o livro de notas que lhe diz a sua pontuação pode ser visto online. Tão certo, esta semana, depois que eu nivelamento de acabamento Série de Exercícios da semana passada, vocês vão receber um e-mail notificação dizendo a você, hey este é o lugar onde você ir para ver suas notas. E você pode ver todos repartição das suas notas. Você pode ver os comentários. Oh, coisa rápida também. A seção de comentários na grande livro é onde eu provavelmente vou passam a maior parte do meu tempo de classificação. Então, uma coisa que é realmente importante quando vocês estão vendo suas notas em seus Série de Exercícios é não só olhando no escore físico mas também tendo tempo para realmente ler meus comentários. Muitas vezes, que lhe dá um feedback de como você está resolvendo um problema. Se você precisa fazer algo um pouco melhor, crítica construtiva é normalmente melhor dado naqueles seção de comentários. Então, por favor, por favor, eu vou para passar o tempo escrevendo comentários. Por favor, eu realmente aprecio isso se vocês iria ler esses comentários. ESTÁ BEM. Legal. Tudo certo. Então, vamos começar a falar e apenas rever rapidamente parte do material a partir de semana de zero apenas por isso estamos na página da direita para começando problemas desta semana. Assim, o loop while é um um dos três tipos de malhas discutimos anteriormente nesta classe. Um loop while essencialmente está escrito na sintaxe em que, quando uma determinada condição, fazer isso várias vezes, certo? Pense nisso neste gráfico aqui. Você está indo para começar em uma determinado ponto em seu código. Você vai entrar na condição de loop se-- Eu não sabe-- x é inferior a um. Se isso for verdade, você está indo para executar o corpo do loop. E você vai continuar fazendo que mais uma vez, de novo, de novo, mais e over-- que é por isso que é um loop-- até que sua condição torna-se falsa. Assim, deste modo, um loop while é uma das maneiras mais simples para escrever qualquer tipo de condição que precisa repetir mais e mais e mais. Basta ter cuidado sempre que você está escrevendo qualquer tipo de laço que você tem uma condição de saída como bem como uma atualização para o que quer que é para que o loop não faz apenas correr mais e mais infinitamente. Em qualquer caso, você está indo para querer certificar-se que você está mudando algum aspecto da seu código ou no final do ciclo apenas para se certificar de que você tem uma maneira para progredir no sentido da condição que pretende reunir-se para final. Isso faz sentido para todo mundo? Nós apenas não quero estar apanhados nesta espiral onde que ir ao redor e ao redor e não há nenhuma maneira de quebrar o ciclo. E cada laço essencialmente tem uma maneira de fazer isso. ESTÁ BEM. Em segundo lugar, muitos de vocês Série de Exercícios em seus Mario provavelmente teve de contratar este tipo de loop. Ele é chamado um loop Do While. Primeiro de tudo, alguém pode me dizer qual a diferença entre um fazer while e um loop while é? Sim. AUDIÊNCIA: O loop Do While é executado em primeiro [inaudível]. ANDI Peng: Sim, exatamente. Assim, um loop Do While sempre faz tudo o que está dentro do fazer, dentro dos colchetes lá e faz essa condição antes de verificar as-- sorry, faz esse código antes verificando a condição. E isso é especialmente relevante para nós aqui nesta classe, porque na maioria das vezes vamos querer pedir o usuário por algum tipo de entrada. E então, dependendo a entrada que eles nos dão, então podemos avaliar, oh, fazer precisamos levá-los novamente? Assim, no Mario, se o usuário lhe deu uma altura negativo, por exemplo, você está indo para a primeira linha e fazer tudo o que está dentro. Então você está indo para verificar enquanto. Você sabe, é negativo 1, que é um número positivo? Se não for, eu estou indo para ir volta e repita o tumulto e repita e repetir e repetir até que eles finalmente, dar-lhe um número que você gosta, que todos nós podemos empregar no nosso código. É muito importante para essencialmente qualquer entrada do usuário. Posso garantir-lhe qualquer tempo num pset onde pedimos-lhe para introduzir qualquer tipo de código, nós somos provavelmente vai dar-lhe um caso de teste em que nós somos vai dar-lhe alguma coisa ruim é isso vai tentar quebrar seu código. Se tentarmos pedir-lhe para introduzir um inteiro, podemos apenas dar-lhe uma corda e ver como você lidaria com isso. Se nós lhes pedimos que empregam uma idade, podemos dar-lhe um número negativo para ver como você lidaria com isso. Apenas certifique-se que vocês estão testando para casos em que você não obter o melhor entrada, vamos apenas dizer. E um loop Do While é muitas vezes a melhor maneira de projetar seu código para que atende a esse escopo. ESTÁ BEM. ESTÁ BEM. Portanto, esta é provavelmente a mais laço complexo dos três que nós olhamos até agora. E parece muito assustador no começo. Mas eu garanto que você, uma vez que vocês pegar o jeito de como usar um loop for, é uma das coisas mais úteis, a maioria das ferramentas úteis em seu arsenal para avançar nesta classe. Assim, por exemplo, em arranhões, tivemos este bloco muito simples que disse apenas repita esta certo Frases determinado número de vezes. By the way, SAJ-- isso é SCAZ Andi Jason. Nós muitas vezes assinar a nossa e-mails SAJ. Se dissermos SAJ, não seja confuso. Isso é apenas nós. Assim, em risco, fomos capazes de ter um bloco que disse, repita Eu amo SAJ! 10 vezes. Muito simples. A lógica por trás disso é uma muito, muito simples, certo? Eu quero ir primeiro através do primeiro tempo e ver que, pela segunda vez e ver que, pela terceira vez, etc. e assim por diante, até chegar a 10. E a maneira que representamos que em código é apenas através de um loop for simples. Assim, para, você está indo para declarar sua variável aqui, neste caso, com um int. Nós estamos indo para nomeá-la i. Nós vamos inicializá-lo a 0. E a edição de parada é vai ser i é menos do que 10. E a atualização vai ser i ++. E dentro do loop, ele vai a executar até que, eventualmente, atinge o final do condition-- onde caso, ele vai quebrar o loop. Deve haver coisas que você caras têm todo o tipo de visto antes e tinha que fazer para o seu problema definido. Alguém tem alguma dúvida sobre loops agora? ESTÁ BEM. Ótimo. ESTÁ BEM. Portanto, para aqueles de vocês que têm leia a especificação pset para esta semana sabemos que estamos indo ter que empregar algo chamado ASCII e tabela ASCII. Então David em palestra passaram brevemente como os computadores essentially-- tudo é codificado em um computador em binário, em zeros e uns. E a maneira que os computadores são capazes para armazenar os valores diferentes, além a zeros e uns são através de mapeamento esses números para representar outros dígitos ou essencialmente outros personagens. Portanto, neste caso, um ASCII mesa-- tudo que faz É personagens mapa, ou caracteres, para números. Assim, o arquivo de código fonte em seu Computador-- que vê, hey, um monte de zeros e uns, zeros e uns, zeros e uns. Isso é o que armazenado na memória real do computador. Mas quando nós, humanos, quer comunicar com o computador, nós want-- dizer, por exemplo, se eu quero a maiúsculas A, Eu vou precisar de alguma forma de dizer ao computador, oh, quando eu digitar letras maiúsculas A, quero dizer esta representação em binário. E assim a nossa forma de fazer isso é jogou um coisa arbitrária chamado uma tabela ASCII, onde nós, como seres humanos, como programadores, há algum tempo, decidimos que arbitrariamente estavam indo para atribuir esses números Os valores para esses personagens. Então vocês pode google isso on-line. Eu acho que há um link para ele no seu pset-- apenas um mapa da tabela ASCII, ASCII mesa. Ele só traduz binário números em caracteres. E isso vai ser muito útil para o seu conjunto de problemas quando tu quiseres calcular qualquer coisa ou se você deseja exibir certa caracteres ou números inteiros ou manipular certos personagens. Vai ser muito importante que todos vocês sabem como navegar uma tabela ASCII. Assim, por exemplo, a letra maiúscula A é representado pelo número 65. E a uma minúscula é representado por 97. Por isso, é importante saber que o diferença entre os dois valores é 32. Muitas vezes, se você precisa converter de um para o outro, a diferença é de 32. E não se preocupe se você é do tipo de confuso sobre isso em primeiro lugar. Nós falaremos sobre como iríamos em empregar este código real. ESTÁ BEM. Portanto, para aqueles de vocês com laptops fora, sinta-se livre para puxar para cima uma tabela ASCII, porque estes, provavelmente, exigem vocês para fazer referência o que os personagens estão. ESTÁ BEM. Então, sabendo que certos caracteres Roteiro para determinados números, se eu fosse para executar apenas o primeiro linha de que code-- o printf um, minúsculas, um sinal de menos maiúscula A. Alguém tem um palpite sobre o que seria imprimindo da tela agora? Então, primeiro de tudo, o que faz minúsculas a representar? Qual é o número que codificado na tabela ASCII. Desculpa? AUDIÊNCIA: 97? ANDI Peng: 97, ótimo. E o que é maiúsculo? AUDIÊNCIA: 65. ANDI Peng: Então, o que é 97 menos 65? AUDIÊNCIA: 32. ANDI Peng: OK. Então, o que vocês acham que vai acontecer quando eu entrada que linha de código em meu computador? AUDIÊNCIA: [inaudível]. ANDI Peng: Desculpe, fale. Não se preocupe. Este é um muito seguro ambiente, menos a câmera. Estamos todos indo a-- não se preocupe. Apenas vamos todos fingir é só nos refrigeração nesta sala. Não se preocupe. Nenhuma pergunta é muito estúpido. Nenhuma resposta é uma resposta estúpida. Eu provavelmente vou cometer erros no curso do meu ensino. Sério, gente, apenas deixar escapar para fora. Seja confiante em si mesmo, sabe? Então, o que foi isso? Quem disse que a última resposta? ESTÁ BEM. Gritar que bons e claros. AUDIÊNCIA: 32? ANDI Peng: 32. OK, vamos executar este código e ver se é isso que acontece. ESTÁ BEM. Então, como vocês podem tipo de ver, a notação típica tenho configurar aqui para saber como iria empregar qualquer tipo de programa em nosso computador. Nós temos nossa função principal dentro da nossa função principal. Eu só vou copiar e cole esta linha de código. Também deve ter cuidado quando você caras estão copiando e colando código. Às vezes, certos operadores não colar mais corretamente. Nesse caso, a menos sinal era na verdade um traço. E assim o computador não buscá-lo. Então eu tive que ir para trás e redigitar fisicamente isso. Basta ter cuidado quando vocês estão fazendo isso. ESTÁ BEM. Nós estamos indo para executar este aqui. Então, nós estamos indo para o nosso cd em section2. Eu chamei este asciimath programa. Então lembre-se, quando executar qualquer programa, queremos primeiro compilá-lo executando-o através do nosso make. E então nós queremos realmente executado o programa fazendo dot-slash. Então, nós estamos indo para ./asciimath. Certo, lá vamos nós. E nós vemos 32. Bem feito. Você merece um pedaço de doce. Doces para você. Desculpe. Tudo certo. ESTÁ BEM. Assim nós podemos voltar ao nosso exemplo aqui. Aah, não. Aah. ESTÁ BEM. Eu só vou mantê-lo assim. ESTÁ BEM. ESTÁ BEM. Então, como vocês podem ver, nós podemos fazer um monte de coisas muito interessantes, um monte de coisas muito legal, um monte de coisas muito complicadas envolvendo Caracteres ASCII e números. Depois de descer para a linha de cinco, isso é um monte de seguir adiante. Nós não estamos indo para ir através da secção. Sinta-se livre para, se você puder, raciocinar em papel primeiro sobre o que deve estar acontecendo quando você introduzir tal uma seqüência de valores. Por exemplo, em que a última linha, temos z-- que representa um certo number-- A-- o que representa também uma certos number-- mais 1 modulos 26 além de um minúsculas. Se vocês manter a leitura através destes, você pode ver um padrão surgem em como estamos manipulando o código. Bastante, altamente sugerir após a secção todos vocês caras ir em frente e entrada aqueles tudo em seu computador e ver que tipo de números estão saindo e raciocínio através porque aqueles são acontecendo, porque para os seus Série de Exercícios que vai ser muito importante para você entender por que certas coisas estão acontecendo. Todos esses slides será online. Assim, não preocupações sobre a tentativa de fisicamente copiar as notas. On-line de tudo. Isso por si só seção será online. Todo o meu código-fonte que Estou executando será online. Sim. Será que você ainda tiver alguma dúvida? AUDIÊNCIA: Qual é modulos? ANDI Peng: OK. Então modulo é um operador que vai ser muito importante para pset das suas caras Aqui. Assim, a maneira que os operadores no C e no trabalho de programação é que você tem o que é chamado a símbolo de divisão e o símbolo módulo, que é como o sinal de porcentagem. Assim, em C, quando você faz um inteiro dividido por um número inteiro com uma barra, C tem uma tendência para deseja cortar off todos os pontos decimais, quer porque um número inteiro para converter em um inteiro. Não vai querer ser um duplo com um monte de casas decimais após tudo isso. Então, se eu fizer 3 dividido por 2, vai para cortar a 0,5 e apenas dar-lhe um. Então, isso é algo a ser muito cuidado quando você estiver fazer qualquer tipo de matemática na programação, é que os números que você começa podem não ser os números que você estava pensando, é por isso que o arredondamento em sua última pset é tão importante. Modulo dá-lhe o resto. Assim, por exemplo, se eu fiz 3 modulo 2-- tão 3 por cento sinal 2-- que lhe daria o resto desse. Então 3 dividido por 2 é de 1,5. É um resto de 1. Seria dar-lhe o 1, que é o restante de que. Então, quando vocês estão se movendo através da tabela ASCII, modulo vai acabar por ser algo que é muito importante, e vamos discutir isso mais tarde. ESTÁ BEM. Portanto, algo que é bastante, muito novo e bastante original que temos discutido nesta semana é o conceito do que é uma matriz. Então matriz é o primeiro tipo de estrutura de dados que vamos encontrar nesta classe. Toda a estrutura de dados está é algum tipo de arbitrariedade, literalmente coisas como estrutura que nós, como os programadores criaram, que nós colocamos no nosso código que pode conter outros pedaços de código. Portanto, neste sentido, uma array-- pense nisso como um armário de arquivo, onde se você abrir diferente prateleiras de seu armário de arquivo, você pode acessar coisas diferentes. Na memória, uma matriz é apenas a fazer a mesma coisa em seu computador. Você pode ter diferentes nós blocks-- chamá-los indices-- de uma matriz. É como um bloco, uma prateleira de memória que criamos dentro de seu computador que você pode introduzir certas coisas em diferentes espaços. Assim, com uma matriz, você sempre tem que specify-- você tem que especificar declarar um matriz no seguinte formato. Você vai primeiro especificar o tipo de dados que você quer criar da matriz. Se eu quiser um array de inteiros, Eu vou colocar int ali. Se eu quero uma matriz de strings, Eu vou colocar cordas lá, o nome de sua matriz, e, em seguida, você vai ter colchetes. E dentro dos colchetes, você é vai ter o tamanho de sua matriz. Algo que é realmente importante para manter em mente ao criar matrizes é que, uma vez que você criar um array, que tamanho não pode mudar. Então, se você sabe que agora você tem uma matriz de tamanho 10, você sabe que eu vou ter 10 células dentro de 10 ou índices dentro desta gama, e isso nunca vai para expandir ou diminuir não importa o que, e que não há Atualmente apenas 10 blocos de espaço alocados em sua memória que pode armazenar até 10 coisas do que quer que você colocou. Assim, deste modo, um tipo de dados de matriz, a estrutura de dados que é uma matriz é muito diferente de alguns outros nós vamos fazer a cobertura mais tarde neste curso. Sim. Por exemplo, se você queria criar uma matriz de tamanho 3 que contidos variáveis ​​de integer-- oh, desculpa, de temperature-- e temperatura, de é claro, é um número inteiro. Então, nós criaríamos int, que é o Tipo de dados do que queremos para armazenar. Vamos chamar esta temperaturas por uma questão de nomenclatura de nomeação algo que todos nós entendemos. E nós vamos ter colchetes. E queremos três números. Então, nós estamos indo para colocar três no interior do mesmo. Algo que é realmente importante manter em mente é que as matrizes são indexados zero. Tudo o que significa é que você começar com o índice de 0, e você corre para cima através da tamanho da matriz menos 1. Assim, por exemplo aqui, tenho uma matriz de tamanho 3. Vai poder para prender três valores. Mas os números que themselves-- número, a matriz, esse índice, a matriz, são de 0 a 2. Portanto, rapazes, ser muito, muito cuidado quando você está passando por seus problemas definidos ea criação de qualquer tipo de matriz, porque muitas das vezes é realmente, realmente fácil esquecer isso. Na verdade, eu não tenho o índice de 3, que actualmente apenas tem o índice de 2. E se você tentar aceder ao índice de terceira, que vai ser o que é chamado o terminador nulo. Ele não vai, na verdade, existem na matriz. E o computador é não vai gostar disso. Portanto, tenha cuidado sempre você está acessando as coisas apenas para garantir que você lembre- que as matrizes são zero-indexado. ESTÁ BEM. Assim, o primeiro exemplo é apenas uma maneira de criar uma matriz. O segundo exemplo, eu tenho abaixo é apenas uma maneira separada de criar o que é o mesmo dados estrutura que temos apenas introduzido. Então, ao invés de fisicamente executando através de e colocando em temperatura de 0 é igual a qualquer outra coisa, temperatura 1 é igual a qualquer que seja, temperatura 2 equals qualquer que seja, eu poderia realmente apenas criar tudo isso diretamente em uma linha em temperatura entre colchetes é igual. E note, neste caso, você não precisa para especificar o tamanho da sua matriz é, porque o computador vai passar e ver que não há três elementos nessas chaves. E vai saber, OK, Eu preciso de uma matriz de tamanho 3. Você não está indo a necessidade de introduzi-lo da seguinte maneira. E também, sim, de que maneira. Alguém tem perguntas a respeito de como nós fazemos matrizes ou como a estrutura de uma matriz funciona? Sim. AUDIÊNCIA: [inaudível]? ANDI Peng: Sim, exatamente. Então, se você fosse para declarar e inicializar uma matriz o seguinte método, que é a segunda forma, você pode apenas deixá-los. E o computador automaticamente sabe que precisa contar quantos elementos são nessas chaves, separados por vírgulas. Então, aqui eles vêem 65, 87, 30. Assim, o computador sabe, oh, há três inteiros. Eu sei que para criar um nome de matriz temperatura com três elementos nele. Boa pergunta. Sim. AUDIÊNCIA: Não é possível criar uma matriz com diferentes tipos de dados que poderiam ser celebrados isso? Por exemplo, com números inteiros [inaudível]? ANDI Peng: Para efeitos desta classe, não, no momento. Quando você cria um conjunto de dados estruturar como uma matriz, você está dizendo a computador, hey, eu preciso de você para alocar este muito memória no meu disco rígido, sendo cada célula um certo número de bits. Lembre-se que aprendemos na semana zero que dados diferente tipos têm tamanhos diferentes? Assim, por exemplo, uma cadeia é uma quantidade diferente de espaço do que um char, que é uma quantidade diferente de espaço a partir de um número inteiro. E por isso, se você não especificar e você misturar e combinar que tipos de variáveis você tem, o computador de vai ser muito confuso. E ele não vai saber a quantidade de memória para te dar. Assim, para efeitos do direito Agora, os computadores só podem reconhecer um tipo de uma matriz. Boa pergunta. ESTÁ BEM. Então, naturalmente, o segunda pergunta que temos é, bem, agora que nós criamos um array e nós colocamos todas essas coisas na matriz, como é que vamos vai ser capaz de acessá-lo? Assim, a estrutura típica que sempre acessar uma matriz é a nossa linda para loop. Eu prometo a vocês que nós vamos ser vendo um monte de este companheiro aqui. Essencialmente, sempre que quiser para valores de entrada em uma matriz ou se você quiser acessá-los, o melhor maneira de fazer isso é um loop for, porque em um loop for, você sei quantas vezes você é vai querer correr pela matriz, porque você tem uma edição de parada, certo? E cada vez que você executa através, você pode acessar um elemento diferente da matriz. E também, esta é uma razão pela qual normalmente nós começamos nosso loops com o valor 0, porque quando você acessar arrays, você pode acessar o índice zero. E assim um paralelo muito bem. Vocês podem ter queria escrever para int i é igual a 1. i é menos do que ou igual a 3. Mas ele não iria funcionar tão bem aqui, porque você só têm elementos de 0, 1, e 2. E por isso, se você fosse começar o i no elemento 1, 2 e 3, você vai acabar sendo executado fora dos limites de sua matriz, e coisas ruins vão acontecer. Então, eu espero que vocês ver o segue de por que nas classes anteriores estávamos ensinando a vocês como executar e formatar um loop for do jeito que estávamos. É porque, agora nós temos transitou em matrizes, Você pode ver porque os empresta 0 -se muito bem para o acesso. Então, a nossa forma de fazer isso é isso-- eu sou apenas imprimi-lo aqui por causa de imprimi-los. Mas eu tenho o meu espaço reservado, vírgula. E o acessando real parte está acontecendo. O nome da matriz foi chamado de temperatura. Portanto, é de temperatura eo i-ésimo elemento da matriz. Assim como o loop for percorre, ele vai começar a 0. Vai para imprimir o Índice 0 desta matriz. Em seguida, ele vai para imprimir para fora do primeiro elemento. Em seguida, ele vai para imprimir a segunda. E então nós vamos quebrar. É clara sobre todos como isso está acontecendo? Ótimo. Tudo certo. Portanto, temos aqui uma maneira de dizendo: se não quiser para codificar me em-- como o programador. Eu não queria realmente fisicamente colocar em cada elemento individual desta matriz. Se eu quisesse, em vez têm os valores de entrada do usuário, qual é a melhor maneira de fazer isso? Bem, aqui eu criei esta função adorável, em que eu possa declarar uma matriz. Então vamos int scores-- apenas dizer que nós queremos fazer uma matriz que continha as notas de todos os 18 dos alunos aqui nesta seção. Eu acho que nós temos um pouco mais de 18 crianças de hoje. Mas por causa do exemplo, vamos supor que tivemos 18. Gostaria de criar um nome de matriz com escores Tipo int, porque pontuações, é claro, são números. E eu vou ter 18 em colchetes, porque é assim que muitos estudantes I quero ser capaz de armazenar dezenas de. E a maneira que eu preencher a matriz é que eu tinha executá-lo através de um loop for, de Claro que, com 0 sendo meu índice 0. E, sendo, em seguida, com 18 meu parar edição, porque não há 18 elementos na matriz. E então eu vou fazer printf, Enter marcar para student-- yada yada yada. Alguém pode me dizer por que aqui estou imprimir i + 1 e não eu? É uma espécie de um truque pergunta, não realmente. Na verdade, não fisicamente afetar o funcionamento do código. Sim. AUDIÊNCIA: [inaudível] 0? ANDI Peng: Sim, exatamente. É um pouco estranho dizer, hey, você é o estudante 0 nesta classe. É um pouco estranho. Então, nós, como seres humanos, realmente não gosto para pensar em como os computadores pensam. Assim, mesmo que no computador, é armazenar valores no 0-th índice, quando nós somos seres humanos, nós realmente não gostam de se referir a nós mesmos como zero. Então, quando eu apenas imprimi que, Eu estou indo para imprimir e adicionar 1 apenas por uma questão de clareza. Então, quando eu imprimir, eu vou ser capaz de imprimir os alunos de 1 a 18. Na verdade, não ter impacto a execução de código de qualquer forma, do jeito que eu imprimir. Mas tenha cuidado quando você estiver na verdade, o acesso a matriz. Quando você ver as pontuações i, notar aqui que eu sou realmente acessar o índice 0 e não o mais 0-- 1 ou 1 + 1, Neste caso, o índice assim que ele é realmente clara. Está todo mundo tipo de OK em como isso está sendo executado através e com todos os índices que eu sou colocar um valor para a matriz e criar uma matriz com 18 números que o usuário está indo para entrada? ESTÁ BEM. Legal. ESTÁ BEM. Passamos agora em algo que é bastante relevante para esta peça, bem definido. Eu sei que na palestra, David-- desculpe, você tinha uma pergunta? AUDIÊNCIA: você pode aumentá-la? ANDI Peng: Sim, então eu tentei. Mas eu não sei. Por alguma razão, este versão do PowerPoint não é realmente trabalhar bem com o visor. Então, nós apenas estamos indo para mantê-lo assim. Todos estes serão enviados online. Desculpe, rapazes. Sim. ESTÁ BEM. Por isso, também pode ter cordas. Então, se vocês realmente notice-- I sabe Rob passou por cima este em que palestra que ele fez-- uma string é realmente apenas um array de caracteres, se você pensar sobre isso, certo? Uma seqüência de caracteres é um nome ou um frase ou uma palavra, certo? Se eu fosse para criar uma cadeia com o nome Andi-- apenas o meu nome, A-N-D-I. Você pensaria que isso fosse apenas uma variável. Mas, na verdade, ele é discriminado em apenas uma matriz de caracteres. Então, ele tem um caráter de um armazenado em um valor de matriz. Ele tem um caráter de n armazenado no segundo índice e assim por diante e assim por diante. Assim, de tal maneira, que realmente tem esse tipo de estrutura definida em colocar para nossas cordas. Então, aqui, se eu fosse para a entrada palavra "comer" - assim palavra é igual a cadeia obter string. Se eu fosse para introduzir a palavra "comer", que é fisicamente o caminho que o meu computador está armazenando essa seqüência em minha memória. E se eu queria correr por aquela e de impressão que out-- assim para em i é igual a zero, lembre-se, em palestra, que coberto algo que é chamado de strlen, ou o comprimento da corda. Porque eu realmente não saber o quão grande é a matriz de qualquer inputting-- do usuário Por exemplo, I introduzido a palavra "comer", e eu sei que é três caracteres, certo? Então, eu poderia colocar em um de três lá e tudo vai ficar bem. Mas se o seu algo a entrada do usuário que é um número diferente de valores, você está indo para não ser capaz de realmente sabe que quando você programar o seu código. Assim, a maneira que lidamos com casos de teste assim é que temos algo chamada strlen, que é apenas uma função que lhe diz quanto tempo uma string é. Então strlen da palavra. Minha palavra é comer. n é igual a strlen da palavra. Alguém pode me dizer o que valor, na verdade, é logo ali? O que n representando direita Agora, neste exemplo, se eu tivesse de comer? AUDIÊNCIA: 3. ANDI Peng: 3, exatamente. Portanto, temos para int i é igual a zero, n é igual a 3, essencialmente. E eu vai correr até que seja menos do que 3i ++. E está indo para ir essencialmente através de e fazer a mesma coisa. Vai para imprimir cada valor e dar-lhe E-A-T. É só denotando uma maneira diferente de escrevê-lo. Isso vai ser muito útil. Sim. AUDIÊNCIA: Qual é os benefícios de colocar o n é igual a palavra strlen interior que loop [inaudível]? ANDI Peng: Sim. Então, se eu fosse a-- dizer, por exemplo, se eu fosse para fazer isso e, em seguida, fazer-- oop-- que, no meu código, seria na verdade, estar fazendo como a mesma coisa. No entanto, a maneira que David explicou ele durante a palestra, se algum de vocês lembre-se, foi a de que, como os seres humanos, como programadores, nós realmente tentamos programar nossa código, de modo que o nosso computador tem para trabalhar o mínimo possível, de modo que o nosso código é muito eficiente. Então, se eu tivesse que lá, o que que aconteceria através do meu loop é que eu iria primeiro declarar uma variável i chamado vai ser 0. Vou verificar, oh, o que é a strlen de palavra? Oh, o strlen é 3. Então é i menos de três? Sim. Eu vou correr. E então a segunda vez de volta ao redor o laço, eu estou indo para incrementar i. i vai ser um. E eu vai verificar, oh, mas qual é a strlen da palavra? Oh, é três. E isso parece tipo de desperdício, cada vez que você executar através do laço, estar verificando a função, mesmo que os strlen de palavra nunca realmente muda? Portanto, é energia extra para um computador. Quando você começar a falar sobre as coisas que são bilhões e bilhões e milhares de milhões de lugares longo, imagine o seu computador ter que ir fisicamente através de e verificar todos os que a cada momento. É por isso que, para fazer apenas por uma questão de eficiência, nós só tendem a fazer isso, pois desta forma estamos apenas chamando a função uma vez no início, e que cada vez que passa por isso está acontecendo para armazenar o valor 3 lá, que você não tem que verificar continuamente o tempo todo. Sim. AUDIÊNCIA: Desculpe. Apenas [inaudível]. Poderia você int n é igual a strlen e colocá- que acima do lado de fora do loop também? ANDI Peng: Sim. Você poderia fazer isso, absolutamente. A razão pela qual nós temos isso aqui é porque a forma como um laço para obras é que ele é chamado de variável local no sentido que tudo o que você é criando dentro do loop for só existe dentro do loop for. Assim, a variável i only existe nesses suportes. E aqui as variáveis ​​de n também só existe nesses suportes. Então, se você fosse usar strlen de palavra várias vezes para baixo abaixo, absolutamente a melhor maneira de fazer isso seria declará-la até o topo assim você não tem que fazer isso uma vez. Sim. AUDIÊNCIA: Por que você tem um nova linha após a cento vendo se você quer colocar tudo as letras ao lado dele separam? ANDI Peng: Oh, eu queria imprimi-los todos em cada linha. Não importa. Sim, é uma formatação. Essa é uma boa pergunta. Sim, se eu quisesse imprimir tudo em apenas uma linha, Eu não teria o traço no. ESTÁ BEM. Todo mundo é bom? ESTÁ BEM. Legal. Então eu acho que eu falei o suficiente. A vez de vocês para ser executado através do código e me diga o que está errado aqui. Onde está o erro? Então, como você pode ver, eu tenho declarado nova matriz do tipo string classe chamada. E eu tenho entrado Sam, Jess, e Kim para ele. E eu estou tentando imprimir todos os elementos da matriz. Alguém pode me dizer por que isso vai me dar problemas? Eu vou dar a vocês 10 segundos para pensar sobre isso. ESTÁ BEM. Sim? AUDIÊNCIA: É o centro esquerda igual a 3 ou [inaudível]? ANDI PENG: Certo. Então, quantas vezes é que isso realmente indo para percorrer este ciclo? AUDIÊNCIA: Four. ANDI Peng: Exatamente. Vai por quatro vezes. Vai percorrer a 0, 1, 2, e 3, porque o seu elemento é i é inferior ou igual a 3. Ele não vai parar quando é 2. Vai mantê- indo até atingir 3. E, como sabemos, só há três elementos na nossa matriz real. Se tentarmos acessar a quarta elemento ou o índice de 3, você está indo bater em algum lugar na memória que não existe. É chamado o terminador nulo. Nada vai estar lá. O seu computador não vai estar muito feliz com você. Sim. Alguém tem perguntas sobre por que estava acontecendo? Essa é uma área comum para evitar. Sim. AUDIÊNCIA: Não faz o primeiro deslize também têm uma seqüência de 2? ANDI Peng: Não. Assim, essencialmente, quando você está fazendo uma matriz, esse direito colchete Há, que number-- todos ele está dizendo a você é como muitos elementos que eu tenho. Não está realmente dizendo me os índices de nada. Portanto, neste caso, eu sei que eu quero para escrever com três lugares, com três lugares físicos para segure o que eu quero segurar. É por isso que o número três está lá. No entanto, se eu queria para realmente acessá-lo, se eu queria dizer, printf número suporte de classe, em seguida, você está indo para realmente colocar o índice física lá. Sim, boa pergunta. AUDIÊNCIA: Então é o físico índice deveria ser [inaudível]? ANDI Peng: Eu sinto muito. Você pode falar um pouco? AUDIÊNCIA: Então é o índice físico [Inaudível] cada uma das caixas? [Inaudível]? ANDI Peng: Sim. Então, eu vou voltar para a direita aqui. Pense bem aqui. Nós temos uma matriz de tamanho 3. Há três lugares, como, espaços reservados físicos em aqui. Mas eles são nomeados 0, 1 e 2. Então, se eu quisesse acessá-los, a maneira que eu acessá-los é printf de tudo o que eu queria aqui. Você teria que imprimir o nome dele, porque, então, o computador sabe, oh, eu preciso olhar nessa matriz para o índice 0. Sim. Mas o tamanho não muda. O tamanho é 3, independentemente de como você rotulá-los. ESTÁ BEM. Todo mundo é bom? AUDIÊNCIA: Então, toda vez que eu [inaudível]? ANDI Peng: OK. Portanto, neste caso, nós realmente não chegar a ele neste momento em curso. Mas saiba que um string-- como eu disse antes, uma string é essencialmente um conjunto de caracteres. Então, se eu criar uma matriz de cordas, eu meio que tenho uma matriz de matriz de caracteres, certo? Portanto, neste caso, porque eu tem uma matriz de strings, se você fosse para introduzir uma palavra muito longa, que ainda ocupa apenas um espaço, porque essa é a uma string. Mas se você tivesse que pensar em os personagens dessa matriz, em seguida, que está ocupando muito mais caracteres do que qualquer uma das outras palavras estamos. Não é realmente importante para agora. Mas isso é apenas em geral como ele está trabalhando. ESTÁ BEM. Então, isso é algo que eu vou deixar você fazer muito ao longo do semestre. Eu preciso descansar minha voz. Vocês precisam para estimular a si mesmos. Muitos de vocês provavelmente tenho que dormir agora. Eu estou introduzindo problemas aleatórios onde nós, como uma classe ou você com um parceiro próximo a você está indo para passar alguns minutos discutindo sobre como nós iríamos sobre como resolver ou a criação de um programa como este. Então, agora, queremos para criar um program-- vamos chamá-lo upper.c-- que converte uma palavra em minúsculas para uma classe alta maiúscula string--, desculpe. Palavra em cordas, desculpe, é sinônimo. Eu estou indo para alterá-los para significar a mesma coisa. Sim. Pegue um par de minutos. Ele não tem de ser escrito em qualquer língua. Apenas em código ou pseudocode logicamente como iríamos mesmo vai fazer sobre tal problema. Sim. [SIDE CONVERSA] Notei também que vocês can-- Eu meio que já ver o programa. Eu acho que a minha falta de modo apresentador é um problema. Mas está tudo bem. [SIDE CONVERSA] Sim, por favor, rapazes. Venha pegar doces. Venha pegar doces. AUDIÊNCIA: Sim! [SIDE CONVERSA] ANDI Peng: Também, sim, Eu vou começar a atirar doces em pessoas que não respondem a perguntas. Portanto, você deve todas as perguntas de resposta. Ou eu suponho que as pessoas que não responder a perguntas. Sim, outra maneira ao redor. [SIDE CONVERSA] AUDIÊNCIA: [inaudível] ANDI Peng: Sim. Sim. [SIDE CONVERSA] Tudo bem, pessoal. Tome-se, como, mais 10 segundos. [SIDE CONVERSA] OK pessoal. Então, antes de começar a tentar realmente escrever fisicamente código, um bom hábito para se desenvolver é que nós queremos primeiro tipo de razão logicamente como iríamos fazê-lo. Você quer ter a certeza, antes de você fisicamente começar a tentar codificar em Mario, que você faça Certifique-se de que você tem o seu pseudocódigo. Que está levando-o através o que você precisa para criar assim que, quando você fisicamente escrever o seu programa mais tarde, você é mais capaz de detectar erros no seu código e coisas assim. Então vamos apenas começar por-- em Inglês, em pseudocódigo, será que alguém quer dar me uma explicação genérica de como iria fazer isso? Sim. AUDIÊNCIA: [inaudível]. ANDI Peng: Claro, não se preocupe. AUDIÊNCIA: Você pode pedir para ele ou pedir alguém para obter corda 1-- sim, corda, e depois-- ANDI Peng: Sim, por isso este é um bom começo. Eu vou começar a digitar, desculpe, como você fala. Assim-- AUDIÊNCIA: --o minúsculas números são mais elevados, certo? Ou as letras minúsculas têm números elevados? ANDI Peng: Exatamente. AUDIÊNCIA: Então subtraímos 32 a partir de qualquer [inaudível]. ANDI Peng: Grande. Então nós meio que tem um sentido geral de como trabalhar sobre este problema. Sabendo que nós meio que aprendeu a forma física que as cordas são armazenadas na memória, o que você faz já sei que você está indo provavelmente tem que escrever em seu código a fim de percorrer a cadeia? AUDIÊNCIA: Para loop. ANDI Peng: Um laço for, exatamente. Ótimo. Então nós meio que temos um genérico pseudocódigo escrito esse tipo de está dando você observa sobre como você moveria sobre como resolver o problema. Agora que você tem isso, você pode referenciá-lo para mais tarde quando você está tentando realmente escrever seu código. Assim, podemos realmente ir aqui. E eu tenho uma função chamada upper.c-- lá ele é-- de apenas um modelo em branco agora que vocês estão indo para me ajudar a descobrir sobre como escrever esta linha de não code-- linha de código. Vai ser várias linhas de código. Ao iniciar qualquer tipo de pset em branco, o que é a primeira coisa que eu preciso se lembrar de fazer? AUDIÊNCIA: [inaudível]. ANDI Peng: Grande Yep. Incluir. stdio.h. Muitas vezes este é um dos Os erros mais fáceis pessoas vai fazer quando eles estão escrevendo, é que eles vão se esqueça de incluir um biblioteca importante que eles precisam. Então, se é o horário de expediente e você fica tipo, Eu não sei por que meu código não funciona. Você pode me dizer por que ele não está funcionando? Vamos dizer que você # include? Você deve # incluir isso. ESTÁ BEM. Então, nós temos o padrão de E / S aqui. É que a única biblioteca nós vamos precisar aqui? O que mais é que vamos fazer? Desculpe. Alguém acabou de gritar para fora? AUDIÊNCIA: [inaudível]. ANDI Peng: Lá você vai. ESTÁ BEM. E como faço para ir sobre como iniciar qualquer tipo da função, qualquer tipo de função principal dentro do nosso programa? Int principal. ESTÁ BEM. O que faço para colocar aqui dentro? Qual é a primeira coisa que você quer fazer? Se queremos obter um seqüência do usuário, o que vamos ter para fazer nesta primeira linha? Desculpe, vocês só sentem livre para falar e voz alta. Apenas gritar o que quer. AUDIÊNCIA: Peça ao usuário? ANDI Peng: Como podemos fazer isso? Ask-- sou eu que vou escrever "perguntar ao usuário"? AUDIÊNCIA: Printf. ANDI Peng: OK. Printf. O que eu quero para printf? AUDIÊNCIA: Tipo em alguma coisa. ANDI Peng: Como isso? Gente, fingir que eu sou um computador. Fisicamente me contar cada passo que eu preciso para digitar aqui? Estou fazendo algo errado? Devo ter escrito alguma coisa? AUDIÊNCIA: Você precisa de aspas. ANDI Peng: Eu preciso de citações? ESTÁ BEM. ESTÁ BEM. AUDIÊNCIA: E, em seguida, nova linha. Ponto e vírgula. ANDI Peng: Semicolon? ESTÁ BEM. Boa. AUDIÊNCIA: E talvez especificar que você o quer em minúsculas? ANDI Peng: Grande. Vocês riem de mim esquecendo de colocar um ponto e vírgula. Eu garanto que você em algum lugar no decurso da presente classe, você vai se esqueça de colocar um ponto e vírgula, e levará três horas para descobrir por que seu código não está funcionando. Já aconteceu com todos nós. Ele provavelmente vai acontecer com você. Obter um bom hábito de usar ponto e vírgula. ESTÁ BEM. AUDIÊNCIA: Você quer para fazer a barra invertida em? ANDI Peng: Claro. Você quer fazer a barra invertida em? AUDIÊNCIA: Sim. ANDI Peng: Grande. ESTÁ BEM. O que eu faço agora? AUDIÊNCIA: Get string. ANDI Peng: Obter string. Então o que eu escreva? Alguém? AUDIÊNCIA: String s. ANDI Peng: String s. AUDIÊNCIA: GetString. ANDI Peng: Alguém, você pode me dizer onde esta função GetString está vindo? AUDIÊNCIA: string.h. ANDI Peng: string.h? Você acha que é de string.h? AUDIÊNCIA: [inaudível]. ANDI Peng: Lá você vai. É a partir CS50.h. Se você está sempre confuso sobre onde um arquivo de biblioteca é um arquivo de cabeçalho ou seja, google literalmente string.h, e eu vou te dizer quais são todas as funções que estão em string.h. ESTÁ BEM. Portanto, agora que eu criei uma seqüência e eu tenho solicitar ao usuário que, Eu armazenado em uma variável s nomeados, o que eu preciso fazer agora? AUDIÊNCIA: Verifique se é em letras minúsculas. ANDI Peng: Desculpe? AUDIÊNCIA: Verifique se é em letras minúsculas. ANDI Peng: Tudo bem, vamos fazer isso. Como faço isso? Na verdade, para os fins da classe agora, nós apenas estamos indo para assumir que tudo que a entrada que já está em minúsculas. Se você queria verificar, você faria basta adicionar uma declaração condicional que verifiquei, que percorreu cada elemento de matriz única e verificado se ele é entre certos valores. Eu esqueço o que o número de valores de são minúsculas. Você pode procurá-lo na tabela ASCII. Mas sim, isso é um ponto muito bom. Mas agora, nós apenas estamos indo para assumir que todas as cordas que entrada estão em minúsculas. ESTÁ BEM. Então, como eu iria sobre este problema vem depois? AUDIÊNCIA: Para loop. ANDI Peng: Para loop? ESTÁ BEM. Diga-me o que escrever. AUDIÊNCIA: Para int i é igual a 0. ANDI Peng: OK. AUDIÊNCIA: Oh, na verdade, então você fazer uma vírgula e fazer n é igual a strlen. ANDI Peng: coisa tão importante que eu acho que ela percebeu aqui é que nós não têm a dizer int n a segunda vez que fez isso. Só sei que em um de loop quando você está declarando: você realmente não precisa do int de a segunda vez que você faz uma variável. Você pode dizer n strlen. AUDIÊNCIA: De s. ANDI Peng: s. ESTÁ BEM. AUDIÊNCIA: Então um ponto e vírgula. ANDI Peng: Claro. AUDIÊNCIA: E então [inaudível] n. Então i ++. ANDI Peng: Grande. Tudo certo. O que queremos dentro deste loop for agora? Lembre-se, se nós estamos indo para ser executado através uma corda e executado através de uma matriz, queremos verificar as coisas nele. O que vamos precisar? Este é o tipo de parte complicada agora. Alguém tem um palpite? ESTÁ BEM. Então, em primeiro lugar, como é que vamos mesmo acessar? Como nós ainda primeiro cheque ou acessar um elemento na matriz? Como fazemos isso? Qual é a notação que usamos para fazer isso? Qual é o nome desse array chamado? É chamado de s, certo? Lembre-se, qualquer seqüência de caracteres é sempre uma matriz. Suporte de forma s i, certo? Porque esse é o valor atual ou valor de índice que estamos verificando. E nós estamos indo para definir que a igualdade de a-- queremos um valor minúsculas, certo? Queremos transformar essa lower-- desculpe, queremos uma maiúscula. Queremos transformar a minúscula valor em um maiúsculas. E assim como-- Sinto muito, qual é o seu nome? AUDIÊNCIA: Heidi. ANDI Peng: Desculpe? AUDIÊNCIA: Heidi. ANDI Peng: Heidi. Como disse Heidi Inicialmente, estamos, provavelmente, vai precisar as-- estamos provavelmente vai ter que subtrair 32 a partir de qualquer charc que é, certo? Porque em um ASCII tabela, a diferença entre uma letra minúscula e uma letra maiúscula é de 32. Então, quando nós estamos fazendo isso, estamos, provavelmente, vai querer subtrair 32, certo? Então, nós vamos fazer s i. Será que todo mundo entender por que eu fiz isso? Porque agora, em nossa matriz, estamos verificando o índice 0, certo? E no índice de 0 a corda, que é o primeiro caractere. E esse personagem que vamos para supor que é minúscula. Se queremos torná-lo maiúscula, nós tem que subtrair 32 a partir de seu valor, porque em nosso ASCII mesa, é assim que nós obtê-lo correspondente à próxima valor que torna maiúscula. Será que todo mundo entende isso? Sim. AUDIÊNCIA: Poderia você também não minúsculas um minus-- ANDI Peng: Sim, o que é realmente muito bom. Eu vou voltar a isso pergunta depois fazemos isso. Sim. E então se eu quiser veja o que está acontecendo, Eu provavelmente vou deseja imprimir, certo? Alguém me diga o que Quero imprimir aqui. AUDIÊNCIA: por cento printf c barra invertida [inaudível]. Esse é o valor de [inaudível] s i. ANDI Peng: s i, desculpe? AUDIÊNCIA: [inaudível]. ANDI Peng: Eu não sei. O que você acha? AUDIÊNCIA: Bem, eu wouldn't-- Eu acho que eu não teria bring-- Eu iria levá-la para fora do dentro, porque [inaudível]. ANDI Peng: Oh, você teria feito isso? AUDIÊNCIA: É. ANDI Peng: Vamos deixar do jeito que é, e eu vou explicar porque mais tarde. Lembre-se, mesmo quando você tem um local reservado, você quer colocar parênteses em torno dele. Tudo certo. Portanto, este deve ser uma função sólida aqui. Vamos executá-lo e ver se ele compila. Faça superior. Uh oh. Isso não parece muito bom. Por que isto está acontecendo? Como acontece com qualquer erro, você quer ir para trás e para começar com o primeiro, porque normalmente provoca um erro lotes de outros erros depois. Aqui vemos upper.c: 18: 25, que diz me neste programa chamado upper.c, na linha 18, implicitamente declarando erro biblioteca de funções com o tipo strlen blah unassigned--, eu não sei o que está acontecendo depois disso. Tudo o que está me dizendo agora é que algo está acontecendo a strlen. E o computador está confusa, porque é como, eu não sei o que strlen é? O que significa que, provavelmente, dizer-lhe que está faltando? AUDIÊNCIA: Você está perdendo [inaudível]. ANDI Peng: Você está certo. Exatamente. Portanto, este é o lugar onde é importante certificar-se que todas as funções que você usa no seu código está tendo o cabeçalho correto arquivo para a biblioteca, ou então você vai obter lotes de erros e seu código não vai para saber o que está acontecendo. Então, nós estamos indo para incluir string.h aqui. Agora, quando tenta compilar superior. Compilar corretamente. Vamos executar este programa. Então digitar algo em letras minúsculas. O que vocês querem escrever? Grito para fora algo. Tudo bem, Charly acabou de entrar. Nós vamos digitar o nome de Charly. Charly em letras minúsculas. E espero que, esperançosamente, este é vai gritar e cuspir Charly em letras maiúsculas. Uhul! que todo mundo entender como Eu fui sobre como resolver isso? A maneira que eu puder manipular usando números inteiros algo que para resolver Eu quero fazer em cordas, porque os caracteres e inteiros pode ser referenciado da mesma forma, porque de mapeamento ASCII. Então, para voltar ao seu ponto, se eu queria colocar aqui em vez de 32 A maiúsculo menos minúsculas apenas como um que, que funcionaria igualmente bem, porque isso é simplesmente o diferença entre estes dois valores. Se eu quiser fazer esta charly novamente--. Ah não. Eu acho que nós fomos pelo caminho errado, certo? AUDIÊNCIA: [inaudível] um minúsculas. ANDI Peng: Lá você vai. Sim. E fora cospe charly. Portanto, tenha cuidado quando você está subtraindo valores para lembrar qual é maior do que o outro. Por exemplo, aqui eu esqueci que é, na verdade, uma minúscula maior do que A. maiúsculas Então, quando eu tentou subtrair-los para o outro lado ao redor, eu tenho 32 negativo. E meu computador era como, Eu não sei o que é. É probabilidade apenas algumas aleatória valor que não é muito boa. E assim se certificar de que você é subtraindo no comprimento correcto para encontrar o personagem que você deseja. ESTÁ BEM. Alguém está confuso sobre como nós foi sobre como escrever esta função? ESTÁ BEM. Então, na verdade, uma função já existe na biblioteca chamada ctype.h. Chamado ctype.h da biblioteca. Esta função é, na verdade já escrito para você. Chama-se a superior. E assim, para fins de este pset, você está indo para descobrir que você realmente quer usar muitas das funções contidas dentro da biblioteca ctype. Para cima, para baixar, é superior, é lower-- aqueles são todos funções que você vai ser capaz de usar muito, muito rapidamente em seu próprio código que faz exatamente o que isso faz. Nós escrevemos para fora como converter uma cadeia para maiúsculas. Mas este é realmente o código que alguém tem escrito e que você pode acessar através de uma função diferente. Sim? AUDIÊNCIA: Então você acabou de copiar um está lá e fazê-lo para cada carta? ANDI Peng: Sim, porque eu não fazer se preocupam com os valores de um. Eu só me importo que a diferença entre eles é de 32, certo? A diferença entre letras minúsculas b maiúsculas e B também é 32. E a diferença entre C e maiúsculas C é sempre 32. Eu só tenho que se preocupam com o diferença entre os dois, porque todas as cartas seguem o mesmo padrão, certo? Se eu tiver a diferença entre um deles, Eu sei o que a diferença entre todos eles é. Boa pergunta. Sim. Todo mundo é bom? ESTÁ BEM. Oop. ESTÁ BEM. Então, um outro conceito que é vai ser muito útil como você continuar a desenvolver seu código é essa idéia da criação de funções ou abstração. Então, agora, todos nós temos tomado álgebra. Em álgebra, você é ensinado que não há esta coisa maravilhosa chamada uma função máquina, onde se entrada de um tipo de número, ele é executado através desta função maravilhosa e fora aparece uma saída diferente, certo? No código, a mesma coisa acontece em qualquer tipo de função. Para que eu pudesse fisicamente escrever no meu corpo do meu código uma declaração principal que realmente faz qualquer que seja o corpo do código está fazendo. Mas fora isso, eu também posso escrever muitas funções diferentes que fazer muitas coisas diferentes. Por exemplo, nós já começou a usar alguns deles. Que é um Printf-- função que outra pessoa já escrito que podemos chamar no nosso código. Para upper-- neste caso, upper-- é outra função temos escrito que nós pode chamar no nosso código. E então eu acho que por isso que fazer temos até funções? Por que nós não apenas plop-lo todos na mesma linha de código? Isso torna mais fácil para todos. Bem, o raciocínio por trás disso é, antes de tudo, da organização. É realmente irritante ir por meio de código de alguém e uma função como printf. Se vocês realmente sabia o que o função printf implicou a escrever, é, tipo, 1.000 linhas de código. Se cada vez que eu queria para printf alguma coisa, Eu tinha que escrever 1,000 linhas de código, que seria muito chato de ler, certo? É por isso que nós temos apenas criou esta função abstrato que já temos alguém outra pessoa escreveu em outro lugar. E cada vez que precisar usá-lo em nosso código, nós apenas temos que dizer printf. E que é capaz de utilizar a função alguém tenha escrito no nosso código. Ela torna mais fácil organizacionalmente de ler o código. Em segundo lugar, é a simplificação. Ele simplifica os passos que temos a tomar para resolver o nosso problema. Printf, funções como printf, funções como a superior são todas as coisas que nos permitem simplificar o nosso código para baixo por isso é mais fácil. Ea última coisa é a capacidade de reutilização. Assim, o fato de que temos uma função chamada printf que podemos chamar de muitos diferente vezes e permite que seja reutilizável. Se eu fosse escrever printf, Eu só escrevê-lo uma vez. Ele só existe na medida em que um só lugar. Se eu quisesse fazer isso de novo, eu faria tem que copiar e colar tudo isso em minha segunda linha de código. É por isso que se criarmos uma função que existe fora do nosso principal, podemos simplesmente invocar -lo e reutilizá-la sempre precisamos de modo que é muito mais fácil para nós, como programas de escrever. Assim, a maneira que nós realmente escrever uma função é muito semelhante, certo? Este é o tipo do primeiro caso em que nós vamos ver um take função em um estilo diferente do nosso void main int. Neste caso, se eu quisesse escrever uma função chamada q, certo? E o valor int aqui é tudo a dizer-me, o que eu quero isso funcionar para voltar para mim? Se eu quiser cubo um número inteiro, Vou deseja introduzir. Estes são os parâmetros. Eu estou indo para entradas um valor do tipo int. E eu vou voltar outro tipo de valor int. E aqui, como você pode ver, tudo o que eu estou fazendo é cubing qualquer que seja a minha entrada é como a minha saída e devolvê-lo. Então, tudo isso faz é função toma algum tipo de número inteiro. Ele multiplica por si só duas vezes de modo que em cubos efeito. E, em seguida, ele retorna o que quer que a saída é. Portanto, neste caso, é duas linhas de código que tínhamos de escrever extra. Mas se nós queria chamar sobre isso várias vezes, é muito mais fácil de escrever que um linha aqui que é no cubo de tem que passar por várias vezes. Assim, a maneira que, essencialmente, qualquer formatação para qualquer tipo de função vai existir é como aqui. Então nós temos o nome da função. Neste caso, ele é chamado cubo. E nós nomeá-lo porque cubo é fácil de lembrar. Você pode nomeá-lo quadrados e ele pode realmente ser em cubos. Não importa. Apenas um nome que você está atribuindo a sua função. Este aqui, int, é a tipo do parâmetro que você precisa. Então, o que faz esta função precisa, a fim de operar? Bem, ele precisa de uma entrada. Eu nomeei-entrada. Você pode nomeá-lo o que quiser. Mas eu preciso de algo do tipo int. Ele vai realmente executar o que está dentro de aqui, o corpo da função. E, em seguida, o tipo de retorno aqui mesmo, este int-- tudo isso está me dizendo é que esta função é vai voltar para mim em int. Por isso, vai levar em um int, e ele vai lhe dar de volta um int. Será que todo mundo entender como o formatação desse tipo funciona? Legal. ESTÁ BEM. Portanto, não se preocupe se isso parece um pouco direito abstrato agora. Isso é algo que nós vamos falar sobre. Vamos mergulhar no mais profundo mais tarde no curso. A maneira que qualquer tipo de nível superior abstração destas coisas trabalho é que, em memória, em seu computador, tudo é armazenado neste tipo de pilha, eu vou dizer. Então, lá em cima no topo. Eu não sei se você vocês podem ver que bem. Vou tentar fazer zoom. Aqui, na parte superior, nós ter o texto físico do que o computador é interpreting-- todos os zeros e uns que existe dentro do nosso computador. E então temos o inicializado dados de dados e não inicializadas, o que chamamos de variáveis ​​globais. Assim, as variáveis ​​que existem em todos os programas e em toda a sua totalidade, essencialmente, código. Não se preocupe se vocês são tipo de claro a este respeito. Ele realmente não importa agora. E então nós temos o que é chamado de uma pilha de uma pilha. Pense em uma pilha literalmente como apenas como uma pilha de coisas, uma pilha de diferente coisas que estão sendo empurrados em cima um do outro que armazenar os diversos variáveis ​​e sintaxe em seu código. E, em seguida, aqui na parte inferior, nós temos as variáveis ​​de ambiente do que você está executando dentro apenas a sua pequena linha de código. E nós apenas estamos indo para zoom no da parte real da pilha. Então, aqui mesmo, se fôssemos para aumentar em apenas nesta área da pilha, este é o que parece. E isso é realmente muito importante quando vocês falam sobre funções, porque aviso de que o memória do seu computador é armazenar as variáveis e as funções e os parâmetros de ambos seu função e suas principais variáveis em lugares diferentes. Então, agora, a principal é a função real que você está executando em um código. Você seus parâmetros armazenados aqui e suas variáveis ​​locais armazenados aqui. Variável local significa apenas que qualquer variável que existe apenas dentro dessa função. E em cima disso, você tem esse função separada chamada cubo. Você tem que é parâmetros bem como os moradores locais. E a razão que você pode veja aqui é que o que acontece quando cubo leva numa valor de sua função principal é que, na verdade, ele está copiando que acabou. Então, se eu queria cubo 2 e 8 de regresso, que 2 na verdade, é introduzido como um parâmetro e está copiado de forma que você tem isso já existente em dois lugares diferentes na memória. E você tem que ter muito cuidado em lembrança de que um daqueles na verdade você está manipulando. E um exemplo do que aconteceu que seria muito, muito ruim existe aqui. Então aqui, eu tenho, em teoria, um programa aqui, uma função principal que eu estou declarando um int x é igual a 1. Eu estou declarando outro int y é igual a 2. E então eu estou funcionando- através desta função chamado swap, onde eu supor que ele está trocando os dois valores. E então eu vou imprimi-los, certo? Isso é o que eu quero que este programa para fazer. Então, vamos descer e dar uma olhada. Então, se eu realmente escrever um diferente função, como você pode ver, nós temos nossa principal função aqui. E então temos o nosso segunda função aqui. Void swap. Vazio significa apenas que é não vai retornar nada. O nome da função é chamado swap, e é indo a duas variáveis ​​de entrada, e um int int b, a partir de sua função [inaudível]. Então, basicamente aqui, nós somos X e Y que passa para esta função. E se fôssemos criar isto-- assim que nós queremos para criar um valor temporário, certo? Vamos atribuir isso a um. E então um vai agora igual b. E b vai estar de volta onde o valor temporário foi, que é um, porque quando você quiser trocar coisas, você não pode simplesmente gostar trocá-los. Você tem que manter um fora para que ele se lembra o que é isso, porque uma vez você trocar um, você esquece o que esse valor original, certo? Portanto, em teoria, este programa deve funcionar, certo? Se eu quisesse trocar o dois, eles devem trocar. Então, vamos executá-lo e ver se funciona. Então, como vocês podem ver, x Era uma vez um e y era uma vez dois. E se eu imprimi-lo, X ainda é 1 e y é 2. Hmm, este programa não parece ser funcionando da maneira que eu quero que ele funcione. Alguém quer tomar um tiro em adivinhando porque isso estava acontecendo? Tem a ver com a forma como que as coisas são diferentes armazenados em locais diferentes na memória. ESTÁ BEM. Então vocês não têm que se preocupar muito sobre isso agora. Mas sei que o cubo dos locais variáveis ​​foram a e b, porque aqui na nossa função, temos declarou a e b como as variáveis ​​que existem dentro do cubo, que a função. Mas como você pode ver, os parâmetros que ele está tomando em estavam sendo armazenados aqui. Mas não estávamos realmente retornando nada. Nós não estávamos realmente mudando xe y. Nós estávamos apenas mudando a e b. Nós tinha copiado x e y em algo chamado a e b. Mas nós nunca realmente manipulado x e y si. Vocês estão vendo como isso está acontecendo? É que nós simplesmente copiou acabou, mas nós não, na verdade, mantido o controle de onde eles estavam na memória. E agora o computador está procurando, oh, eu tenho executar essa coisa meio esta função encantadora. Mas, x e y são ainda x e y. Nada aconteceu com -los por causa do fato que esses parâmetros e variáveis ​​locais são armazenados em uma diferente colocar na memória. E este é um de nível superior conceito que vamos começar a ver mais tarde no curso. Mas só sei que este é um problema que pode acontecer e que nós vamos descobrir maneiras de como lidar com isso mais tarde no curso. ESTÁ BEM. Tudo certo. Assim, o último conceito que estamos realmente vai cobrir que vai ser útil para o pset esta semana são o que são chamados argumentos de linha de comando. Então Rob em sua palestra atravessou tipo de brevemente sobre como esses trabalhos. Essencialmente sabe que quando você está escrevendo como uma função principal, quando escreveu funções antes no passado, tivemos void main int. E a razão que tivemos lá vazio foi porque os nossos programas não precisa os valores de entrada para executar, certo? Quando eu corri Mario, eu não precisava para realmente basta digitar algo quando eu corri Mario. Eu poderia pedir ao utilizador mais tarde. Mas isto não será sempre o caso. Por exemplo, neste O problema de semana define, você vai ser pedido que, em Além de executar o seu programa, você vai querer entrada certas coisas em linha reta como você executar o seu programa. Então, a nossa forma de fazer isso é chamado um argumento de linha de comando, que é como um argumento você pode inserir diretamente como você está tentando executar o programa. Assim, a notação para isso, é bastante complexo para o futuro, mas realmente não é tão difícil. Então int main-- que é apenas a sua função principal. Em argc vírgula suportes seqüência argv. Então, tudo o que está dizendo é que este int argc-- tudo o que está dizendo a você é que aqueles são o número de argumentos do computador deve esperar. Então, uma coisa que é realmente importante para manter o controle de é o nome físico do seu programa conta como um daqueles argumentos. Então, se eu queria ter meu programa executar mais uma linha de comando adicional argumento, eu sou realmente vai ter dois. Argc realmente vai ser dois. E então seqüência argv bracket-- tudo o que está fazendo, isso está me dando uma matriz de cadeias que é indo apenas para exibir e armazenar o que todos estes argumentos linha de comando são. Assim, por exemplo, se eu quisesse ter essa programa, ./copy infile outfile, certo? Isso é apenas um típico comando Linux. O que realmente é argc? Quantos argumentos de linha de comando estão lá realmente nisso? Tudo isso faz é fazer uma cópia do um infile do nome de um arquivo e ele copia para outro arquivo, certo? Isso é tudo isso está fazendo. Como você pode ver, eu estou fazendo isso em uma linha sem realmente precisar do programa. Qual é a nossa argc neste caso? Quantos argumentos que nós temos? AUDIÊNCIA: Três? ANDI Peng: Temos três, exatamente. Portanto, é muito intuitiva para só acho que é apenas o infile e outfile o. Mas sei que o nome físico do programa que você está executando conta como uma. Portanto, neste caso, argc é, na verdade, três. Que tal, o que é argv 0? Lembre-se, todo o Argumentos da linha de comando foram armazenados em uma matriz de cadeias. Então, se eu tentar acessá-lo, o que seria argv suporte 0 dá-me? AUDIÊNCIA: [inaudível]. ANDI Peng: Exatamente. Ele me daria o ponto cortar cópia, porque é isso o elemento 0, o primeiro elemento da minha matriz. E sobre argv 1? AUDIÊNCIA: INFILE. ANDI Peng: INFILE, exatamente. E sobre argv 2? AUDIÊNCIA: OutFile. ANDI Peng: OutFile. Isto é um pouco complicado agora. O que vocês acham argv 3 vai estar me dando se eu tentasse imprimir isso? AUDIÊNCIA: [inaudível]? ANDI Peng: Será que você tem uma mão acima? Sim. AUDIÊNCIA: Uma alternativa. ANDI Peng: Exatamente. Então lembre-se de uma conferência que tem no final de uma corrida algo chamado um terminador nulo? Nós vamos chegar a esta também mais adiante, na classe. Mas sabemos que na notação, a forma como o computador sabe que é o fim da matriz é que ele coloca algo chamado um nulo terminator ou um traço zero. Então, se você tentar acessar argv 3, você está indo bater esse traço 0. Isto é ainda mais de uma pergunta capciosa. E sobre argv 4? Portanto, este é terminador nulo passado, passado dos limites da nossa matriz. O que você acha que vai acontecer quando tentamos fazer isso? AUDIÊNCIA: [inaudível]? ANDI Peng: Desculpe? Digamos que um pouco mais alto? AUDIÊNCIA: [inaudível]. ANDI Peng: Sim. Que é o nome do área que você provavelmente vai conseguir. Mas saiba que argv 4-- que permite o acesso lugares em seu computador de memória que você realmente não deve ser comovente, porque agora você sabe o que é argv. Você sabe que é uma matriz de tamanho 3 que tem dot cópia, infile e outfile. Se você tentar ir tão além que que você é passado o terminador nulo, seu computador tem, provavelmente, armazenado algo em argv 4. E você realmente não deve ser permitido o acesso às argv 4, porque você tem um arquivo armário e você só está permitiu o acesso a esses três prateleiras. Mas se você tentar chegar muito além a plataforma de onde você está autorizado, você vai começar a brincar com outras coisas na memória do computador. Isso vai ser muito, muito ruim. Então, só sei que. Tenha muito cuidado para que você não basta começar aleatoriamente acessar elementos em uma matriz que não estavam em o que você queria criar. Sim. ESTÁ BEM. Então, vamos fazer outro exemplo do terminal aqui. ESTÁ BEM. Então Rob rapidamente em palestra no outro dia fui através deste exemplo, onde ele teve int main int argc argv cadeia colchetes, o que está me dizendo que eu sou vai ter argumentos de linha de comando. Ele tem, se é igual a argc é igual a 2-- lembre-se, é igual a igual significa comparação. Se for igual a 2, então eu sou indo para imprimir Olá, qualquer que seja o primeiro elemento da matriz é. Impressão Else, Olá mundo. O que é que isto vai essencialmente acontecer? Alguém pode explicar apenas em Inglês o que este programa está fazendo? Sim. AUDIÊNCIA: Se alguém digitou em um comando e disse que seu primeiro e último nome, ele não vai apenas imprimir o primeiro e dizer: Olá, seja qual for o seu primeiro nome é. ANDI Peng: OK, vamos executá-lo. Assim, por exemplo, se eu fosse fazer esse arquivo fazer Olá Olá a-- a-- o que você me quer de entrada? AUDIÊNCIA: Primeiro e último nome. ANDI Peng: Primeiro e último nome? Espaços? AUDIÊNCIA: É. ANDI Peng: Pode alguém dizer- me agora, o que é argc? Apenas para a direita lá? OPA, desculpe. Deixe-me voltar. Quantos argumentos de linha de comando é-- vocês não podem realmente ver. Mas eu vou tentar fazer zoom. Estou tentando. Sim, há três, certo? É barra dot Olá, é Andi, e é Peng. Então, o que vocês acham que esta programa vai ser imprimir? Oh. Oh, desculpe. Nome errado. Ele está imprimindo, Olá mundo. Alguém quer explicar por que isso está acontecendo? Sim? AUDIÊNCIA: [inaudível]. ANDI Peng: Exatamente. Então, aqui, são condicionais é, se argc é igual é igual a 2. Assim, apenas no caso em que há dois argumentos de linha de comando. Então eu estou indo para imprimir, Olá, seja ele qual for. Mas mais, eu vou imprimir apenas, Olá mundo. Assim que alguém quer para me dar um exemplo de como eu seria capaz de realmente obtê-lo para imprimir o valor de argv 1? O que eu teria a entrada aqui? Só uma coisa, certo? Porque o Olá ponto para já conta como o primeiro argumento. Eu só tenho mais uma. Então dot Olá se eu só faço Andi. Olá, Andi. Será que todo mundo entender por que isso está acontecendo? Sim. AUDIÊNCIA: Então, o espaço entre a linha-- comando é [inaudível]? ANDI Peng: Não. Assim, o espaço em uma linha de comando argumento, x, para dizer a seu computador que este é o começo de uma nova sequência. Então seqüência argv aqui-- ele lojas todos os seus argumentos de linha de comandos em cordas. E assim o espaço na linha de comando argument-- tudo o que faz é dizer-lhe, isto é, no final de uma cadeia e é hora de seguir em frente para outro. Sim. Isso é muito importante para seu pset, porque você é vai ser testar estes. Então, alguém tem dúvidas sobre este assunto? OK legal. Sim? AUDIÊNCIA: Então a razão que você faria colocar inteiro argumento calc vez de [inaudível] seria quando quiser para digitar informações adicionais para [Inaudível]? ANDI Peng: Sim, exatamente. Alguns programas exigem que você a entrada de um argumento de linha de comando que entra e que usa isso. Sim. AUDIÊNCIA: Então, o que se [inaudível]? ANDI Peng: Bem, o que eu tenho em seguida, a alteração na minha programa? AUDIÊNCIA: Apenas 3. ANDI Peng: Por que é que acontecendo, que você acha? AUDIÊNCIA: Porque o [inaudível]. AUDIÊNCIA: Você teria que alterá-lo para 2 [inaudível]. AUDIÊNCIA: 1 e 2. ANDI Peng: 1 e 2, exatamente. Portanto, neste caso, você provavelmente quer ter dois printf statements-- um impresso que 1 e argv o que impresso argv 2. Aqui. Eu posso realmente fazer isso rápido real. Ai está. Oh. Não é o que você queria. Mas se vocês mexer com a formatação, ele vai sair. Sim. Legal. Eu sei que estamos um pouco curto no tempo. Mas eu estou indo só para passar rapidamente um alguns minutos passando por atenciosa-- AUDIÊNCIA: Você tem dois minutos. ANDI Peng: Eu tenho dois minutos? Obrigado. Algumas dicas PSet rápido. Portanto, para este pset, eu recomendo, como eu disse, todos poderão ler o spec. Você vai estar escrevendo um três programs-- chamado initials.c, um chamado caesar.c, um chamado vigenere.c. Algumas dicas importantes que vocês realmente querem para se manter em tão mente-- há essa função chamado atoi-- como eu gosto de dizer, a trois. Claro se isso é na verdade, como você diz. Mas tudo o que está fazendo, está introduzindo. Converte uma string para um int. Assim, um representa ASCII para i inteiro. É apenas a conversão ASCII valores para valores inteiros. Então lembre-se argv, a matriz que armazena todos os seus comandos de linha arguments-- ele armazena-los todos como strings. E por isso, se você quer ser capaz de ter um deles tornar-se um número inteiro, você vai ter para usar esse valor aqui. Modulo, como nós cobrimos mais cedo na aula hoje, permite que você tenha o resto do que você tem. Então, se temos realmente, realmente grandes números em Caesar, E se tivermos o fim de uma série de Vigenere? Como você está indo para ser capaz para conseguir que a envolver em torno de? Se eu acertar z e eu quero -lo para voltar a um, como eu vou chegar que para embrulhar ao redor? Provavelmente vai querer usar modulo em algum lugar. Em segundo lugar, navegar ao redor sua biblioteca. ctype.h. Essa é uma nova biblioteca que temos. Você vai encontrar um monte de muito, muito isupper funções no útil, islower, toupper, tolower, isalpha, et cetera. Todas as funções que serão muito úteis quando você está tentando descobrir, é uma letra minúscula esse personagem? Como faço para converter este string para um maiúscula? Todas estas coisas vão ser muito, muito útil para o seu pset. ESTÁ BEM. O horário de expediente hoje à noite são 8:00 às 11:00 na sala de aula TEAL amanhã bem como quarta-feira e quinta-feira. Horário de atendimento estão em commons. Sugiro que você caras tudo começar imediatamente, porque você não quer ser que miúdo que quinta-feira tem problemas submeter o seu pset e é como, eu não sei o que fazer. Eu comecei, eu terminei, eu submetidos. Tente dar-se algum espaço, por causa dos problemas de código sempre ocorrer. Você quer ter a certeza que você dá a si mesmo uma grande quantidade de tempo para ser capaz para completar as Série de Exercícios. Legal. Vou ficar por aqui. AUDIÊNCIA: É isso on-line já? ANDI Peng: Eu não sei se é on-line já, mas vai ser. Vou ficar por aqui, se alguém tem dúvidas já. Obrigado por ter vindo.