[Música tocando] COLUNA 1: Este é CS50 e este é o início da semana dois. Então, vamos mergulhar direita em algo que é buggy, por assim dizer. Então, aqui é CS50 IDE e não tenho puxado para cima com antecedência este screen-- maldita isto. Alerta de spoiler. Tudo certo. Eu puxado até esta tela aqui, que tem um programa muito simples. Se rolar para baixo, a maioria isso é apenas comenta, mas aqui em linhas 13 através 17 temos um programa. É sintaticamente válido, o que significa se Eu compilá-lo, ele irá compilar e executar, mas é buggy. Este programa afirma nos comentários em cima que deve imprimir 10 estrelas, mas isso não acontece. E com base em sua experiência, ou logo para ser experiência com C, você pode discernir logicamente por que isso é, de fato, com erros? Sim? AUDIÊNCIA: Ele vai de zero a 10. Isso é 11 iterações. COLUNA 1: Yeah. Então, ele vai de zero -se através de e igual a 10, que, naturalmente, é de 11 iterações. Então, ele vai de impressão, de fato, 11 estrelas. Assim, a convenção de ciência da computação na maioria das linguagens de programação é, de fato, apenas para começar a contar em zero, mas contar até, mas não através do valor que você realmente se preocupam. Agora, isso é uma coisa que Demora um pouco para se acostumar e até mesmo risco, concebido como é para os não programadores ou não computador cientistas e para crianças em grande parte, é projectado para ter você começar a contar geralmente em um. E isso é bom. Você pode absolutamente começar a contar em um caso que é mais confortável. E contar até e através de 10, mas você vai perceber particularmente esta semana e para além de que só assim muitas coisas na programação 0 supor que é o primeiro dígitos com que você conta, que você está indo encontrá-lo mais fácil apenas para chegar a este hábito de partida e contagem de zero até ao valor você se preocupa agora do vamos embora. Então, isso tem que. Mudamos o menor ou equivale a pouco menos de. Vamos dar uma olhada um segundo exemplo aqui. Assim, este programa também afirma na sua comenta-se superior que deve imprimir dez estrelas, mas isso não acontece. Qual é o bug aqui? Então, what-- e muito, vamos ser claros. 10 estrelas. Um por linha, mas isso não acontece. Então, na verdade, deixe-me ir em frente e compilar um presente, porque é um pouco menos limpar com base nessa descrição. Deixe-me ir para o nosso diretório de origem. Faça buggy de uma barra de ponto, um buggy. OK, eu vejo 11 estrelas, que ainda é problemático, mas também tudo está em uma linha. Qual é o problema aqui? Sim. AUDIÊNCIA: [inaudível]. COLUNA 1: Yeah. Portanto, esta é uma sutileza que você pode lembro-me fazer uma breve referência. Mesmo que tudo parece consideravelmente, e é bem recuado, e que tipo de olhares como Risco- em que a linha 16 e 17 são, de fato, recuada sob que para loop. Isso é irrelevante. O computador não faz conhecer ou ver o espaço em branco. O espaço em branco é apenas para nós seres humanos, estilisticamente. O computador não sabe quando você tem chaves, o que seria, na verdade, corrigir esse problema. Então, se nós realmente fomos em e explicitamente colocar nesses chaves que iria corrigir esse problema deixando claro para o compilador que eu realmente deseja executar duas linhas de código novo, e mais uma vez, e novamente. Mas qual é a explicação fundamental? Certo? Nós não estritamente precisa encaracolado chaves o tempo todo, mesmo que provavelmente é melhor prática para entrar esse hábito de qualquer maneira ainda que acrescente dois caracteres em seu código. porque? AUDIÊNCIA: [inaudível]? COLUNA 1: Sim modo que é outra solução completamente. Certo? Especialmente se, à primeira vista você não fizer isso realmente aprecio o que está acontecendo. Bem, certamente poderíamos apenas fazer duas coisas ao mesmo tempo e apenas evitar o problema completamente. E isso é bom, mas agora, para fins de hoje, o que é a explicação para o erro? Por que todas essas estrelas em uma linha? Sim? AUDIÊNCIA: Parece que se você tem uma linha de código, você pode fazê-lo sem aqueles. COLUNA 1: Exatamente. Esta é apenas uma convenção humana. As pessoas percebem que é um pouco chato ou tedioso ter de colocar chaves tudo do tempo, se tudo que você quer fazer é executar uma linha de código. Assim, decidiu alguns seres humanos tempo que isso é bom. Se você quiser colocar todo o seu ciclo em apenas que uma linha como esta, que é muito bem com o single ponto e vírgula no final. Mas você só pode fazer uma tal linha sem as chaves. Assim, quando guia de estilo CS50 como você irá apontar para, você verá que geralmente é bom hábito para chegar a este até que você esteja extraviada bastante confortável a partir desses tipos de convenções e fazer sua própria coisa. Enquanto você é auto-consistente. E vamos falar mais sobre estilo um pouco mais tarde hoje. Então, deixe-me abrir um outro programa. Claro, devemos 10 consertar isso também. Deixe-me ir em frente e escrever uma verdadeira programa rápido que eu chamasse, vamos dizer, laço dot C. Então, laço ponto C. E em malha ponto C eu vou ter, incluir E / S padrão ponto H int void main. E agora vamos fazer, de fato, um loop. Então, 4 int i recebe zero. I é menor do que, digamos, 50. I plus, plus. E então aqui vamos vá em frente e não imprimir F. E então eu quero imprimir I e uma nova linha, ponto e vírgula. E isso deve imprimir toda a números de zero até 50? Alguns cabeça acena com a cabeça. Algumas Nos. Qual é o erro já? Qual é o erro fácil que eu fiz? Sim. AUDIÊNCIA: [inaudível]. COLUNA 1: Yeah. Assim, mesmo que parece como este é o que eu pretendo, Eu lembro que também é apenas um caractere ASCII. Então, se eu disser, print "I." Ele vai literalmente imprimir I. Então, se eu quer plug-in um espaço reservado valor eu realmente preciso fazer isso e, em seguida, o plug-in valor de I dinamicamente. Caso contrário, eu estou indo só para ganha 50 I está na tela. Então, deixe-me ir em frente e fazer este loop, executá-lo, e, de fato, temos tudo o caminho até a 49. E se eu rolar para trás no tempo que eu vejo o número zero no início. Bem, e se eu meio que estragar tudo? E se eu faço isso? Só porque eu não estou pensando. O que é este programa. Uma vez que está compilado e executado, vai fazer logicamente? AUDIÊNCIA: Nada. COLUNA 1: Nada. Por que é que? AUDIÊNCIA: Eu é projetado para zero. Assim, a condição é falsa. COLUNA 1: Sim, exatamente. Todo o código está correto, sintaticamente. Isso vai compilar, este código será executado, mas não é vai fazer nada de útil porque eu inicializar I a zero. Em seguida, verificar, é que mais de 50? Obviamente, não, não é. Assim, o laço nunca executa em tudo. O que se fizermos algo um pouco mais imprudente? Então, o que se fizermos como int I recebe zero. E agora deixe-me usar o tempo loop, que foi outra condição. E enquanto eu digo, enquanto eu for maior do que ou igual a zero, e, em seguida, aqui I vá em frente e salvar o arquivo, fazer loop. E eu estou prestes a executá-lo. O que é que eu vou ver isso tempo com um loop while? Sim. AUDIÊNCIA: um loop infinito? COLUNA 1: Um loop infinito? Sim, e por quê? AUDIÊNCIA: Porque é sempre zero. COLUNA 1: Yeah. Então, eu é inicializado como zero. Claro que é sempre maior que ou igual a 0, como resultado. Então, eu estou indo só para ver isso infinitamente. E agora, este surgiu uma vez ou duas vezes a cabeça do curso. O que acontece quando você tem um loop infinito? AUDIÊNCIA: Controle C. COLUNA 1: Yeah. Assim Controlo C acabará por responder. Infelizmente, temos impressa milhões e milhões de zeros já e de modo que o computador tenha meio que tenho à minha frente. Então, ele vai ignorar me para um pouco. Mas se você simplesmente pressione Control C alguns vezes em seu teclado Mac ou PC, eventualmente, ele deve, de fato, terminar. E se não, vamos mostrar-lhe algumas técnicas antes de tempo onde você pode realmente à força matar programas, bem como em Windows e Mac OS, se for necessário. Mas vamos tentar outra coisa. Vamos realmente incrementar I. É isso ainda vai ser infinito? Deixe-me executar este. E agora você pode tipo de veja o que está acontecendo. Isto, também, é um loop infinito. Mas isso é um pouco de uma pergunta capciosa. Será que isso vai imprimir números de sempre? AUDIÊNCIA: Não. COLUNA 1: Não. Por quê? Eu ouvi algumas nsa aqui. Someone-- Sim. AUDIÊNCIA: Você não tem suficiente bits para realmente continuar. COLUNA 1: Tudo bem. Então, eu não tenho o suficiente bits para continuar. Então, o que vai acontecer? Ele só vai parar? AUDIÊNCIA: Em algum momento ele vai fechar as-- COLUNA 1: Ele vai fechar o baixo loop, mas por quê? O que vai acontecer no final de suas fronteiras? Sim? AUDIÊNCIA: A Ronda de volta para números negativos. COLUNA 1: Para números negativos, ou se estivéssemos apenas tratar positivo, zero, pelo menos. Então, sim, absolutamente. Lembre-se que vimos da última vez que se você incrementar seus bocados um muitas vezes, e você Lá na frente estouro a capacidade de seu int ou qualquer que seja o tipo de dados é, você é vai envolver em torno de, provavelmente, dois números negativos. Ou se você especificar que o seu intervalo só deve ser positivo, que você pode fazer, mas nós não temos visto isso ainda, você pode acabar, pelo menos, de volta ao zero. Embora, na verdade, sim. Neste caso, negativo números, em cujo caso o ciclo vai terminar porque não é, de fato, maior do que ou igual a zero se ele é negativo. Assim, infelizmente, como longo teríamos que esperar? Agora estamos até o que, 2000000-ish? Somos como 2 bilhões, nós vamos ter que esperar até que possamos realmente ver este sintoma. Mas podemos vê-lo um pouco mais rápido, maybe-- vamos ver se podemos interromper. Vamos. Mesmo os menus estão aparecendo lentamente. Tudo certo. Então, vamos voltar para que em pouco tempo. É um bom tempo-- droga, filhotes de cachorro. É um bom momento para alguns anúncios. Então, se você pode gostar se envolver em YHack, que é um evento sendo patrocinado por nossos amigos em Yale. E, de fato, alguns do curso de TFs em Yale estão envolvidos com isso. YHack é uma organização internacional hack-a-thon hospedado e mantido por em Yale, que reúne 1.500 como hackers ocupados e criativos todos pelo mundo. Se este for de interesse, dê uma olhada aqui. Se ela é muito brevemente no tela, dê uma olhada nas lâminas de hoje para o URL para yhack.org. Assim, também alguns anúncios rápidos. Então, oficialmente seções vai começar próxima semana aqui e New Haven. Tenha em mente que você estará recebendo um e-mail mais tarde neste fim de semana mais provável. É preciso um longo tempo CS50 para a seção, Dadas todas as pessoas na classe e todos se movimentando. E todos os Fellows Ensino ' horários também estão solidificando ainda, mas fique atento para um e-mail e, se necessário ser, você pode voltar a seção de lá depois. Study.cs50.net. Assim, mesmo se você é um participante constante em seções, perceber que quase todos dos recursos que usamos em seções estão disponíveis ao público em CS50 Estudar neste URL aqui. Então, se você jamais gostaria de re avaliação material da seção, ou leia mais à frente, ou você não pode fazer-lhe algum semana, perceber que os porta-amostras, e problemas, e definições, e mais estão todos lá também. Horário de atendimento retomar hoje, e amanhã, e quarta-feira, e quinta-feira verifique o curso de site para o agendamento. E também, lançando agora hoje é CS50 Discutir. Então, se e quando você tem perguntas para o outro ou para o pessoal do curso, e estão trabalhando em geral em algum conjunto de problemas, perceber que você não necessariamente tem que voltar para o ser humano próxima de você. Se não há ninguém lá, você pode chegar até nós e colegas Discutir online via CS50. Assim, esta é uma discussão placa para o curso, e perceber que esta é talvez o melhor lugar para começar quando você tem perguntas quando fora do horário de expediente em particular. Refeições pré-arranca esta semana também. No Fire and Ice [Inaudível] em New Haven. Dê uma olhada no campo de site a fim de RSVP. Primeiro a chegar, primeiro a servir para isso. Se você não receber nesta semana vamos fazer estes mais toda sexta-feira durante o período. OK, e agora uma palavra sobre classificação. Particularmente à medida que entramos problema definir um, que está fora esta semana, e conjunto de problemas e, posteriormente, de dois. Como é que vamos avaliar conjuntos P e avaliar a qualidade dos mesmos? Então, é de quatro eixos que usamos em CS50, e são esses quatro aqui. Scope, que captura em um numérico base apenas quanto do conjunto P que você enfrentar. É corresponde aproximadamente com esforço, e é a nossa maneira de capturar se você tentar metade do P definir, de todo o conjunto P. Este é um passo fácil de obter perfeito pontuações em se você faz, de fato, tente todos os aspectos do conjunto P. Portanto, manter isso em mente. A exatidão é exatamente isso. Será que o seu trabalho de código como a especificação e como solução de amostra dos funcionários sugerem que o seu código deve, de fato, trabalhar. Confira 50, se você ainda não conheceu-lo no entanto, está em P definir uma especificação e geralmente dar-lhe respostas sim / não quanto a saber se o seu código está correto. Pelo menos até agora como nós estamos indo para avaliá-lo com base nos testes que corremos dentro desse programa. O design é muito mais subjetivo. Este é o quão bem escrito é o seu código. E isso é algo que você vai ficar melhor no longo do tempo, e isso é algo que vamos fornecer feedback mais qualitativa sobre. E pelo design eu poderia significa antes de tempo você pode ser tentado em algum P definido para fazer algo loopingly, mas para ter talvez três, ou quatro, ou cinco voltas dianteiras aninhadas ou enquanto aninhado laços. Que, geralmente, deve fazer você começar a encolher e geralmente seria considerada má concepção. E você vai começar a ver na classe e fora da classe boas maneiras de fazer as coisas, más maneiras de fazer as coisas que tudo pode ser correta, mas não necessariamente bem desenhado. Como escrever um ensaio. Você pode ser capaz de colocar palavras em um página que são gramaticalmente correta, mas o ensaio ou a tese de que eles estão em é apenas completamente incoerente ou pouco convincente. E, de modo que pode ser o análogo no mundo escrito do design ruim ou bom. E estilo, também, é bastante subjetiva. Mas pelo menos nós esperamos consistência. Este é o quão bonito é o seu código. As coisas estão bem recuado? São as variáveis ​​de bem nomeado / São todos de seus parênteses e colchetes alinhadas como deveriam ser? Nós temos um guia de estilo como CS50 o conjunto de problema irá apontar no. Aqueles são mais confortável bem-vindo ao desviar-se de que desde que você auto-consistente. E isto, também, é uma lição vamos reforçar na seção. Então, se tudo isso era um pouco rápido, perceber o conjunto P e seções vou entrar em mais profundidade antes de tempo. Mas geralmente, temos muito poucos baldes para CS50. Pontuações são geralmente em uma escala de um a três, ou um a cinco. Estamos literally-- e eu não posso dizer esta suficiente na primeira semana. Três é bom. Assim, mesmo que, sim, três de cinco normalmente, matematicamente, pode ser um 60 por cento ou menos como um D. Três é, na verdade, bom. E, de fato, esperamos a maioria dos alunos da turma para começar o prazo em torno dois, ou três, e quatro. Provavelmente não tantos fives. Não são muitas queridos. Mas em geral para iniciar em esse ponto doce na curva de modo que à medida que o tempo avança, há realmente espaço para, e oportunidades para progressão superior. Então, por favor não igualam três com 60%. É muito mais abstrato do que isso. A fórmula com a qual calculamos graus é a seguinte ponderação. A exatidão vale mais. Projeto vale a pena um pouco menos. Estilo vale um pouco menos. E esta geralmente capta a quantidade de tempo que vai ficar em cada desses eixos apenas para a direita. Estilo é super fácil, deve ser super rápida, mas é um hábito fácil para ficar com preguiça sobre. Correção pode demorar -lhe a maior parte do tempo. Perseguindo algum poder bug tomar essa hora extra ou mais, e assim, a pontuação em última análise, que capta. E assim, agora, uma palavra mais grave. Uma vez que tem o CS50 distinção, para melhor ou para pior, de ser talvez melhor familiarizado com as questões de acadêmico honestidade do que a maioria qualquer outro curso. E, de fato, é do meu conhecimento que nós enviar mais estudantes, infelizmente, por razões disciplinares a cada ano como resultado. Assim, no interesse da plena divulgação, vamos falar brevemente sobre o que se passa na CS50, eo que você pode fazer, eo que você pode estar atentos. Então, aqui desde 2007, quando Eu herdei o curso, é o número de casos placa do anúncio. Conselho Ad é disciplinar da Harvard corpo, ou agora a honra Counsel, à qual os casos são referidos quando alunos fazer alguma coisa que o curso de syllabus considera razoável. Não há nenhum padrão real, aqui, eu diria. Ele flutua ao longo do anos, mas geralmente este é o número de casos que são referidos. O número de alunos que estão envolvidos? É também varia. Normalmente, último ano para o exemplo, 29 alunos em Harvard Ad foram Embarcado, por assim dizer. 29 deles estudantes atuais, Dois deles estudantes anteriores, que estavam colaborando de alguma forma perversa. E, em seguida, em termos de porcentagem, normalmente é cerca de 3% da classe que, infelizmente, faz esse tipo de decisão. Então, no ano passado foi de 3,5% do corpo estudantil da CS50 que foi Ad Embarcado, por assim dizer. Então, o que tudo isso significa? E o que é que vamos realmente fazer? Assim, para a divulgação completa, nós absolutamente, como cientistas da computação, tem ferramentas de software à nossa disposição e é muito fácil para nós, para ser justo, que de outros colegas que não são cruzar estas linhas para atravessar comparar cada apresentação deste ano contra cada apresentação durante os últimos oito anos. Software faz isso. E, finalmente, é olhos humanos que decidem se ou não para se referir alguns importa para posterior adjudicação, mas o software certamente ajuda. E isso, francamente, é por isso que eu acho que temos um número tão grande em CS50. Não é porque CS50 estudantes ou estudantes CS mais geralmente são menos honestos do que quaisquer outros estudantes, é só temos a ferramentas e as técnicas com o qual a tomar esta primeira passagem. Mas nós manter um olho em todas estas coisas assim, mais uma vez, no interesse da reconhecendo o trabalho que está sendo colocado na por um super maioria da classe. E a política do curso na honestidade acadêmica, mesmo que seja um grupo de parágrafos por muito tempo com um monte de balas que são esperançosamente bastante legível, ele realmente não se resumem a ser razoável. E a melhor regra de ouro que oferecemos no âmbito do programa é isso, a essência de todo o trabalho que você submeter-se a este curso deve ser o seu próprio. E, de fato, em quase todos os casos encaminhados para medidas disciplinares foi por causa de algum aluno uma tarde noite tipicamente virou o seu código sobre outright para um colega de classe, que, então, adotou- na sua totalidade ou significativamente dos mesmos. Mas realmente, isso é OK. E, de fato, no escritório horas, os pedaços de papel te foi dado se você veio de escritório horas na semana passada incentiva tanto. Você está absolutamente bem vinda e encorajada para discutir conjuntos de problemas com os colegas. Para ajudar uns aos outros quando tropeço. Mas geralmente a regra de ouro deve ser este ", quando você está pedindo por ajuda, você pode mostrar o seu código para os outros, mas você não pode ver as deles. " Então, em outras palavras, se eu sou lutando com algum conjunto P e eu estou sentado lá no Jantar salão, ou na biblioteca, ou na sala de aula tentando encontrar alguma falha, Eu certamente posso mostrar meu código na minha tela para a pessoa sentada ao lado para mim, certamente a equipe, mas também um colega de classe. Mas se a solução que meu colega oferece é, oh, aqui basta dar uma olhada no que Eu fiz, que cruza a linha. E eu ousaria dizer que é geralmente uma coisa razoável para a maioria das pessoas de detectar muito facilmente a linha de. E assim, ver o plano de estudos para mais detalhes. E agora um dos mais aspectos controversos CS50 de programa que eu pensei que eu falaria na conclusão aqui é a chamada cláusula de arrependimento. Então, aqui está toda a cópia fina. Mas em geral, temos visto nos últimos mais de 8 anos que, de facto, quase todas de CS50 casos de desonestidade acadêmica ter sido o resultado de apenas pobres tornando tarde da noite de decisão. O resultado do estresse, o resultado de falta de alimentação, falta de sono, muitas séries P, muitos prazos, muitos compromissos. Estresse construindo em um 2:00, 03:00 AM, 4:00, com um prazo iminente. A maioria dos estudantes nestes casos que acaba de fazer más decisões que poderia muito bem se arrepender do manhã seguinte, se não minutos mais tarde, mas até o ano passado não houve válvula de liberação que esses alunos poderiam realmente abrir para realmente resolver o problema de frente, sem medo de ser iniciado a partir da faculdade completamente. E, de fato, nós introduzimos esta cláusula arrependimento no ano passado, que diz que, se no prazo 72 horas, três dias, de atravessar alguma linha prescrito no currículo você vem para a frente a um do curso de cabeças e nós vamos ter uma conversa sobre isso. Há ainda haver algum resultado, ao contrário do que é Foi relatado que o contrário. Há ainda algum resultado que é acionável pelo curso, geralmente zerar um conjunto P ou tomar alguma outra ação, mas vamos, de fato, segurá-lo nós mesmos e não referem-se que eram mais elevados do resultado pode ser muito mais graves. E, de fato, para compartilhar o que aconteceu no ano passado, em oito anos, e agora nove anos, de ensinar este curso e depois de mexer com vários botões, transformando vários mostradores sobre o passado vários anos sobre a honestidade acadêmica, e vendo por dados nenhuma aparentes impacto, mesmo de discursos como este, este foi mãos a melhor coisa nós introduzimos pedagogicamente em oito anos, juntamente estas linhas em CS50. 19 estudantes vieram para a frente nos termos desta cláusula no ano passado. Nós não tomou nenhuma ação para sete desses alunos, a determinação de que eram desnecessariamente preocupado. Eles não tinham, de fato, atravessada uma linha, mas foi um bom bate-papo ter, no entanto. Nós zerado 11 dos escores que foram submetidos. E em um caso pedimos uma estudante para fazer um conjunto de problemas. Mas mais convincente, Sinceramente, com essas 19 bate-papos, que era muito mais do que eu Espera-se que têm, cada um deles 10 minutos para talvez uma hora de duração, também trouxe à luz uma série de questões sobre questões familiares, questões amigo, problemas de saúde mental que, em seguida, contratado, com a bênção, residente do estudante reitor, ou amigos, ou qualquer outro número de recursos de suporte. Assim que este foi de longe um dos melhores usos do nosso tempo e um dos melhores intervenções. Com isso dito, não tinha entrada na taxa de detecção de desonestidade acadêmica em geral. E ouso dizer, este subconjunto de estudantes no ano passado era que um grupo demográfico anteriormente nunca se identificou antes e nunca tinha ligado antes. E assim, estes foram maravilhosas histórias de sucesso mesmo que eles foram trazidos à luz em menos de circunstâncias ideais. Portanto, manter isso em mente como você faz, talvez, algum pobre decisão mesmo tarde da noite, que há tanto tempo recurso como o estudante nessa situação possui-se e vir para a frente para que possamos ter esse tipo de bate-papo e lidar com ele de uma maneira que é educacional, e, em seguida podemos colocá-lo atrás de nós no dia seguinte. Assim, sem mais delongas, assumir a borda fora desta conversa, a razão que os filhotes estão se é apenas para quebrar o gelo por um momento. E, infelizmente, eles são todos dormiremos, mas o que deveria acontecer aqui era todo mundo deveria para impressionar e tipo de relaxar depois dessa conversa muito pesado. Mas, aparentemente, eu coloquei os filhotes de cachorro para dormir. Mas se você vai para CS50 de filhotes site Slash, você pode vê-los durante todo o dia. Particularmente talvez 2:00, ou 03:00 ou 04:00 à noite para ver um pouco de alívio do estresse lá. Assim que é cortar filhotes. Tudo certo. Não foi divertido? ESTÁ BEM. Então, de volta a algum computador ciência, se eu puder. Então, lembre-se que a última vez que começou olhando não apenas a principal, que era a função padrão, o quando bandeira verde clicado equivalente, mas nós também começou brevemente escrevendo algumas de nossas próprias funções. E até agora, nenhuma destas funções têm sido particularmente grande ou carne. Você vai entrar aqueles maior funções, provavelmente, definir P 2, P ajuste 3, definitivamente P ajustou 4 em diante. Agora a maioria de seus programas, Se nem todos eles, certamente, para P conjunto 1 pode ser feito inteiramente em principal. Se o seu programa só é cinco linhas, 10 linhas, mesmo 20 linhas de comprimento, perfeitamente razoável para escrevê-lo tudo em principal e não para complicar mais seu código, mas o que estamos fazendo hoje e daí em diante está tentando também introduzir algumas boas técnicas de design para que, como seu código fica mais complicada e como os problemas você quiser resolver fica mais difícil e mais interessante que você tem, mais ou menos, as ferramentas em sua caixa de ferramentas com as quais para projetar boas soluções para aqueles. Então, vamos dar uma rápida olhada para trás, este programa da minha última semana, o que foi funções de zero ponto C. E notar que, muito simplesmente, parece que este com dois funções, principal e nome de impressão. E o pensamento de volta ou talvez engenharia reversa de hoje, qual foi a motivação para a introdução de uma função na linha 28 chamados, nome de impressão? Ou o que era este um exemplo de em termos de um princípio ou takeaway, se você o faria. Alguns murmúrios. O quê? Sim decomposição de modo funcional é uma espécie de maneira elegante de dizer, decompor seu programa em suas partes constituintes e então usar essas peças para montar um todo. Então, isso também é apenas um tipo de um bocado já, mas esta é talvez até um melhor exemplo de algo chamado apenas de abstração. Certo? Abstração vai ser um dos temas recorrentes em CS50 e também de ciência da computação mais uma vez que é geralmente uma técnica com a qual você pode resolver problemas de forma mais eficaz, porque você pode escrever soluções mais intuitivamente e de uma forma que dimensiona e é compreensível por outras pessoas. O que quero dizer com isso? Então, sem dúvida, é muito mais legível a olhar para um programa como este, Super curta que seja. Quando você vê na linha 22 que não há uma função chamada, nome de impressão. Esse nome só diz o que ele faz. Essa função aparentemente leva de entrada entre os parênteses, e, aparentemente, faz alguma coisa, presumivelmente imprime o nome. E assim, embora nós poderia ter absolutamente feito o que fizemos há uma semana, o que foi apenas tomar esta linha de código real, livrar-se deste, e obter livrar de tudo isso junto, que tipo de abstraída a noção de impressão de um nome. Eu não me importo se você estiver usando print def. Eu não me importo se você tem um S cento e uma barra invertida N. Estes são detalhes incrivelmente arcanos. O que eu me importo com como um programador está a imprimir um nome. E assim, qual a melhor maneira de fazer isso que por chamar uma função, o nome de impressão? E assim, essa foi uma das motivações para fazer algo assim. Tornando o código mais legível, mais reutilizável, e também auto descritiva. Agora, vamos dar uma olhada em outro exemplo, que foi uma funções, que tivemos aqui. Então, este é talvez ainda mais atraente porque, neste caso, Eu não quero começar apenas um int. Eu quero começar um int positivo. E verifica-se para obter um positivo int você tem que fazer um monte de trabalho braçal. Certo? Não é uma simples linha chamar como nome de impressão foi, que é reconhecidamente menos convincente. Para obter um int positivo, logically-- deixe-me rolar para trás para baixo para esconder isso. O que tens de fazer? Como todas as ferramentas que temos no momento são coisas como print def da Standard Biblioteca e também da biblioteca CS50 temos Obter Int, e Get Float, Obter Longo Longo, Get String, mas o único, Germano, agora é Obter Int. Assim, se a única ferramenta que você tem em sua caixa de ferramentas é Obter Int, como nós vamos sobre a implementação de -lo para obter int positivo? AUDIÊNCIA: Criar um log e verifique em que a entrada se deram era positivo ou não. COLUNA 1: Perfect. Exatamente. Outra ferramenta que temos em nosso caixa de ferramentas a partir de uma ou duas semanas atrás é apenas a construção de loop. E então, sim, se usarmos um tempo loop, ou um loop Do While ou um fore loop de nós poderia provavelmente começar afastado com qualquer daqueles de alguma forma. Podemos implementar a noção de get int positivo apenas usando Obter Int, e depois é só manter chamando- novamente e manter importunando o usuário até que ele ou ela realmente nos dá o que queremos. E agora, esta abstração do processo de conseguir um int positivo em uma função chamada Obter positiva Int é um pouco mais convincente, porque olha para isto. Estes são como 10 mais linhas de código que estão envolvidos na obtenção de um int positivo, e eu realmente não me importo como você faz isso. Tudo que me importa é que você pode fazê-lo, e então eu tenho escondidas todos estes detalhes por trás de um função chamada Get positiva int que, de fato, tem esse loop Do While. E ver na semana passada para a sintaxe lá, mas ele apenas declara N, e ela mostra o instruções para o utilizador. Ele chama Obter Int e, em seguida, ele verifica essa condição de novo, e de novo, e de novo até que o usuário coopera. Então, agora, algumas verificações de sanidade. Para aqueles familiarizados talvez com alguma programação, por que é N declarou, por que eu crio N fora do loop Do While? Por que é na linha 29 e não em como 33, por exemplo. AUDIÊNCIA: Porque quando você declará-la fora, tipo do mais, a maior scope-- COLUNA 1: Boa. AUDIÊNCIA: -e se você declarar -lo dentro do loop, [inaudível] porque ele não sabe sobre ele. COLUNA 1: Exatamente. Se eu puder simplify-- é uma questão de escopo. Eo alcance refere-se ao contexto em que uma variável existe ou é utilizável. E a regra agradável de ouro aqui é que geralmente quando você declarar ou criar uma variável que você só pode usá-lo dentro dos mais próximos abraçando chaves. Então, o que isso significa? Se eu, ao contrário, desfazer isso e ir com algo que se sente um pouco mais simples. Certo? Linha 32 apenas parece mais limpo para mim agora. Eu estou fazendo as duas coisas ao uma vez e em seguida atribuindo a mão direita para a mão esquerda. O problema agora com base em que a definição de escopo N se que pode ser utilizado em linhas 31 e 32 dentro deste loop, mas onde por essa definição pode não ser usado? Em linha quê? Sim. AUDIÊNCIA: 35. COLUNA 1: 35. Definitivamente não 35. E também onde mais? AUDIÊNCIA: 34. COLUNA 1: Mesmo 34 é problemático porque é fora das chaves. E assim, de fato, vamos ver o que acontece. Certo? Isso pode parecer um pouco intuitiva ou talvez não, mas vamos ver o que o compilador tem a dizer quando nós entramos em diretório de origem de hoje. Faça uma função. Oh meu Deus. Bem, eu finalmente terminei que, por sinal. Tudo certo. E qual é o problema aqui? Muito arcano para olhar. Mas aqui está o que eu typed-- fazer a função de um. Aqui está o que fazer induzido, que é realmente usando o compilador clang com algumas destas bandeiras que vamos ver novamente em breve. E, novamente, sempre olhar no primeiro erro, porque ele só poderia ter uma cascata efeito sem significado em outras linhas. Então, o que isto significa é que o problema é em função 1.c. É na linha 32. E é na coluna, ou caráter, 13. Então, quando seu editor de texto que pode ajudá-lo a identificar onde o problema está. Então, se eu vá para cima, o que é linha 32? Isso é de fato um presente que já está em destaque n variável direito aqui-- não utilizado. Mas não é não utilizado. Eu estou usando-o. Mas o compilador de confuso, porque ela só existe dentro deste âmbito. E por isso não posso usá-lo aqui. Eu não posso usá-lo aqui. E o compilador, portanto, não se importa que eu estou tentando. Parece ser não utilizado no seu âmbito actual. Assim, podemos ampliar o escopo fazendo exatamente o que nós começamos com-- int n. E mesmo que isso não acontece olhar tão elegante, talvez, e nós estamos tomando uma linha extra aqui, agora é no escopo em todos os lugares. Então, vamos tentar novamente. Então, faça uma função. Agradável. E agora, se eu se eu executar a função um, vamos dar-lhe negativa de 10, 1 negativo, 0, 1, e de fato funciona. Portanto, não há outra solução aqui. Você sabe o que? E se eu realmente estou lutando com isso? Eu não sei onde o n é suposto ir. Você sabe o que? Eu só vou colocar tudo o forma na parte superior do meu arquivo aqui. O que isso faz, você acha? Sim? AUDIÊNCIA: [inaudível]. COLUNA 1: Yeah. Então eu fiz isso global, por assim dizer. Se você tem uma variável que está fora todas as suas funções que é permitido, eo código deve compilar, e n agora vai ser acessível não só em get int positivo, mas também no que main-- é um pouco preocupante porque não há já um n no principal, de modo mais em que em apenas um moment-- mas isso seria considerado um mau desenho. Tudo certo. Se você tem que recorrer a algo como, oh, eu vou apenas coloque-o aqui porque o código parece compilar geralmente não é a melhor prática. Em vez disso você quer escolher o mais estreito possível escopo para suas variáveis, o que significaria indo com nosso projeto inicial, que está bem aqui. Agora, como um aparte, se você tinha uma forma idêntica-nomeado variável aqui, o caminho c iria lidar com isto-- embora isso não irá acontecer também often-- é que este ainda é perfeitamente bem aqui. Mas esta definição de n na linha de 22 vai apagar a uma global. Portanto, este será um trabalho dentro principal, e o global vai realmente se aplicam quando você está em obter int positiva Mas mais sobre isso outra vez, mas apenas Para os curiosos. Assim, em breve, vamos corrigir isso aqui. Agora vamos desmembrar duas outras peças antes de olharmos para uma última linha de código neste programa. Obter int positivo. No lado da mão esquerda de sua palavra é a palavra int. O que significa isso que você acha? Até agora temos visto principalmente vazio. Sim? AUDIÊNCIA: É o tipo de variável que você está perguntando sobre. COLUNA 1: Sim, é o tipo de, deixe-me não dizer variável, mas o tipo de valor que eu estou pedindo para voltar. E, de fato, isso é intuitivo aqui, eu espero. Certo? Se você deseja obter um int positivo, o que é você quer o function-- como o nosso voluntários da semana passada para entregar-lhe um pedaço de volta de papel com um int sobre ele? E assim temos especificado que o chamado tipo de retorno dessa função é obter int positivo. Se não quer que ele retornar nada, você diz vazio. Se você quer que ele retorne uma corda, você diz string. Se você quer que ele retorne uma bóia, você diz float. Mas o único que se aplica aqui logicamente, porque eu estou usando get int, mesmo que eu estou restringindo-a a valores positivos, é retornar um int. Assim, ao contrário, o que significa que há um vazio entre parênteses? O que fazem os parênteses geralmente definem? Sim? AUDIÊNCIA: Significa que a função de na verdade não consegui-lo. COLUNA 1: significa que a função de não realmente recebendo o quê? AUDIÊNCIA: Uma entrada. COLUNA 1: Uma entrada, que seja. Então, de fato, se parêntese aqui você especificar vazio, isso apenas significa que eu não quero qualquer entrada. Eu vou lidar com o problema sozinho. E, de fato, você não tem que obter int dizer nada de positivo. Você acabou de dizer, obter int positivo, e que função irá sair e fazer a sua coisa. Mas houve um pequeno truque que eu tenho foi jogar aqui esse tempo todo para garantir que este código compila. Observe que int-- obter positivo int void-- é na linha 27. Mas por algum motivo aparentemente estranho é também aqui em cima na linha 16. E apenas para uma boa medida Vou repetir este por isso é perfeitamente idênticos. E eu disse protótipo com um pequeno comentário de uma linha. O que acontece se eu excluir que, E Agora execute novamente fazer a função 1, digite. Whoops. Espere um minuto. Onde está o meu guia? Huh? Estar por. Faça uma função. Aí vamos nós. ESTÁ BEM. Não havia salva-lo corretamente. Então, eu acho que há um pouco bug aqui onde eu não sou vendo o nome da guia no momento. Então, o que está acontecendo aqui? Declaração implícita de função obter int positivo é inválida no C99. Então, confundindo novamente. Então, qual é este indicativo de? Bem, acontece que C é muito estúpido. Bem, é a programação linguagem, ou melhor, o compilador é. Ele só sabe o que você tem ensinou-lo, e isso só é vai saber algo se você ensinou isso antes. Em outras palavras, em principal no momento, eu sou tentando chamar uma função chamado obter int positivo. Mas o compilador não vai a notar que obter int positivo existe até a linha 26. E assim que o compilador faz é apenas erros, logo que ele fica para a linha 17, dizendo declaração implícita de obter int positivo, o que é apenas uma maneira elegante de dizer, eu não sei sabe o que é ficar int positivo ainda. Outras linguagens como Java e Python e Ruby pode olhar para frente. C não. E assim a nossa forma de corrigir esta é uma de duas maneiras. Qualquer um dos dois, se o problema é que começa int positivo não tenha sido visto antes, Bem, deixe-me apenas movê-lo até o topo. Isso seria corrigir esse problema. Mas, geralmente, é considerado melhor técnica para colocar a sua principal função no muito superior, de modo que um ser humano de ler o seu código sabe o que o programa faz, porque principal não está enterrado tudo a maneira na parte inferior ou no meio. É no topo. De modo que não se sente ideal. E você pode realmente começar em situações onde se as chamadas uma função outro, o que chama outro, você pode entrar em um problema onde não pode ir por cima do outro, de forma lógica. Não é apenas possível. E assim o caminho para o trabalho de contornar isso é apenas tomar a assinatura da função, por assim speak-- a primeira linha onde é declared-- e apenas copiar, colá-lo no topo, mas não com braces-- encaracolado apenas com um ponto e vírgula. É como uma pequena dica do que está por vir. E, de fato, todo este tempo quando nós tenho visto coisas como io.h padrão e cs50.h, semelhantemente, nos dot h arquivos estão lá outros protótipos. E vamos ver que em pouco tempo. Assim, em breve, quando você tem um programa em um arquivo com várias funções além de principal, você quase sempre quer declará-los apenas por meio do seu primeiro linha, seguido por um ponto e vírgula, no topo do arquivo. Isso foi um monte de uma vez. Alguma pergunta? Alguma pergunta? Tudo certo. Então, vamos seguir em frente, em seguida, para algo como tosse. Oh. Quão apropriado. Tudo certo. Tosse. Então aqui é um c implementação de um programa que fizemos no outro dia em Arranhão que muito simplesmente apenas diz tosse, tosse, tosse. Tudo certo. E alguém disse há poucos dias atrás que há uma maneira de limpar este código já. Tudo certo? Assim que você está copiando e colando provavelmente ruim design. Pelo menos uma vez chegarmos a quatro ou cinco ou 20 tosses, ele se sente mal prática. Nós apenas manter cópia, colando. Qual é a solução óbvia a limpeza deste programa acima? AUDIÊNCIA: Laço. COLUNA 1: Yeah. Portanto, use um loop. E podemos usar um laço para, um tempo ciclo, qualquer número de abordagens. E, de fato, é o que o que fazemos na versão um aqui. Já em vez reescrito na versão de um cough.c ser apenas tosse no prazo de um ciclo-a. Tudo bem, mas há uma oportunidade agora de tipo de início para projetar este um pouco mais como a lição que ensinou um momento atrás, que é isto-- supor que eu queria para criar uma função chamada tosse, vamos considerar por um momento o que vai olhar como. Então, se eu quiser algo a tossir, eu só preciso usar impressão f dentro da função. E, de fato eu sou. E, de fato, tudo isso hora, em qualquer tempo que você está imprimindo a algo o ecrã, um programador chamaria isso de um efeito colateral. Não é entregando-me volta a alguém um valor. Ele me está tomando alguma ação que pode ser visualmente óbvia. Mas essa tosse função, ele voltar qualquer coisa com base na sua primeira linha? Não, porque seu tipo de retorno é nula, o que significa apenas ele não está me dando nada em troca. Ele poderia estar fazendo algo visualmente, mas ela não me entregando cópia de um pedaço de papel como na semana passada. Será que ela precisa de qualquer entrada? Não. E por isso é vazio aqui também. Portanto, esta também é uma espécie de over-engenharia esse problema. Certo? Eu fiz o programa mais complexas, mais linhas de código, Eu não fiz isso qualquer esta mais funcional, mas seria um trampolim, talvez, para uma mais ampla contexto com o código de mais complicado. Mas o que sobre isso? O que eu done-- apenas olhando para este sem olhar para o comentário no topo da file-- o que tem Eu fundamentalmente feito aqui com a minha tosse implementação que é diferente? Sim, na parte de trás? AUDIÊNCIA: Torná-lo para que você possa têm um caráter desligar. COLUNA 1: Yeah. Então, este se sente tipo de Nice. Certo? É como a adição de um recurso para o seu ou a sua função de programa, neste caso. Ainda não retorna nada. Ele pode ter um efeito colateral visual, porque ele está chamando de impressão f. Mas agora eu tenho parametrizada a função, a qual significa que eu tenha especificado tomadas entrada do tipo int e chamá-lo n, mas eu poderia chamá-lo de qualquer coisa que eu quero. Na verdade, ele poderia ser apenas vezes para ser ainda mais explícito. E então eu só poderia mudar isso aqui. Mas o ponto é que esta é a forma como eu criar uma função que recebe de entrada. E se você se lembra lançando talvez por meio on-line em um dos walk-throughs, o quarto e último exemplo tosse, você vai notar aqui que eu generalizada meu código tipo further-- de abstraída la ainda mais. Como tosse e espirro, ambos são sobre como dizer algo ou fazer algum tipo de som. Guardar o seria correspondente bloco de rascunho. E assim que eu fiz nesta versão, que nós podemos apenas olhar para, é a tosse é apenas como dizer, [COUGH], tosse, e, entretanto, é espirros como dizer, [Achoo]. E então eu generalizada a implementação dos por agora a implementar esta função genérica, dizer, o que é interessante para fins de hoje só porque ainda não tem um tipo de retorno. Mas quantas entradas é que tem? AUDIÊNCIA: Dois. COLUNA 1: Two. E por isso, se você quiser tomar em dois argumentos, apenas separe-as com uma vírgula. E se você quiser, em seguida, chamar essa função, perceber que você só chamar digamos, citações, fecha aspas, para o primeiro argumento, comum n, para o segundo argumento. Então, novamente, só temos agora o blocos de construção para que possamos realmente implementar algumas das nossas próprias funções. Tudo certo. Quaisquer perguntas sobre estes? Então agora vamos descascar uma camada em caso afirmativo. E o objetivo, em última análise, é conjunto de problemas da próxima semana vai ser em cryptogrophy-- técnica de codificação da informação. E especificamente, as informações terá que criptografar ou descriptografar vai ser texto. E assim por esse tipo de convites a questão hoje, como bem, o que está acontecendo debaixo do capô com texto ASCII além da semana zero, E como podemos realmente começar a manipulá-lo? Então aqui é o nome do Zamyla. E em texto, que pode ser introduzido em como a função seqüência de get. E a partir de agora, quando você vê um string como isto-- Z-A-M-Y-L-A-- começar a pensar nisso como se cada desses personagens está em uma caixa de sua própria. E, de fato, em uma semana ou assim é tempo, cada uma destas caixas vai representar muito especificamente um bloco de memory-- uma mordida de memória. Assim, cada uma dessas cartas, em última análise, irá representar 8 bits. E nós vamos realmente ver o que está acontecendo por baixo do capô em meu computador. Mas para não basta só de olhar para Zamyla através desta lente, em que cada um de essas cartas é em sua própria caixa. E bem o suficiente em C que pudermos acesso a cada uma destas caixas directamente. Então, se você deseja obter a primeira letra do seu nome, super fácil no C. Se você deseja obter a última carta, super fácil, bem com um novo pedaço de sintaxe. Então, eu estou indo para ir em frente para CS50 IDE e abrir a seqüência de zero ponto C. E aqui neste exemplo, existem um par de coisas novas acontecendo. Então, primeiro na linha 19, nós temos visto essa seqüência get antes--. Então, assim como uma verificação de sanidade rápida, se alguém poderia oferecer-se verbalmente explicação de um leigo de o que está acontecendo na linha 19. Como apenas traduzir isso em Inglês que um companheiro de quarto em não CS50 pode entender. Sim. AUDIÊNCIA: Tenha a entrada do usuário um corda e armazená-lo em uma variável s. COLUNA 1: Boa. Ter a entrada do usuário uma string e armazená-lo em uma variável s. Isso é ótimo. Assim, no lado direito lado, que chamamos de cadeia get. Que retorna um valor que não se atribuiu do lado direito para a esquerda mão- lado em uma variável chamada s que é projetado para armazenar uma string. Exatamente. Então, agora a linha de 22, por o comentário na linha 21, obviamente que imprime cadeia um caractere por linha. Mas como? Então, primeiro de tudo, eu inicializar a 0. E então como é que vamos chegar a o fim do nome de Zamyla? Bem, no final de O nome de Zamyla, eu poderia digite manualmente o último caractere o seu nome de algum modo, ou o número do mesmo. Certo? Se voltarmos aqui-- Z-A-M-L-- Y-L-A-- para que eu pudesse digitar. Qual é o índice de A última carta de Zamyla? Se esta é 0-- falando como um programmer-- 0, 1, 2, 3, 4, 5, Eu heard-- assim, de fato, a última letra em nome de Zamyla é o sexto, mas se contarmos a partir de 0, que vai ser o número 5. Portanto, manter isso em mente aqui. Acontece lá fora é uma função em C chamada strlen, e volta no dia e até hoje ainda, um monte de programadores optar por sincronizar nomes para a sua funções que soam como as palavras eles estão tentando dizer. Então strlen é comprimento da corda. E então o que faria comprimento da corda de S voltar quando Zamyla é a entrada? AUDIÊNCIA: Five. COLUNA 1: Z-A-H-Y-G. Six. Certo? Qual é o comprimento do nome de Zamyla? Certo? E, assim, na realidade, seis letras. Certo? E então o que é que isso significa para o nosso loop? Nós estamos indo para ir de 0 até seis, que vai nos dar cinco iterações. O que fazemos em cada iteração? Bem, por cento C, alguém adivinhou o outro dia, significa um espaço reservado para o quê? AUDIÊNCIA: Char. COLUNA 1: Apenas um char. Assim, um único character-- não vários personagens, como uma string. E então aqui está a nova linha que temos de imprimir. E então aqui está a nova sintaxe. Se você quiser imprimir o i-th caractere na seqüência S, por assim dizer, você pode simplesmente dizer o nome da cadeia de S, e, em seguida, abrir colchete, e depois fechou colchete, com um i o meio. E é tipo de Nice, em que que tipo de parece um quadrado assim como as praças em que Zamyla de caracteres existir em que imagem lá. Então, se eu realmente executar este Agora, vamos ver o que acontece. Faça corda 0 dot barra seqüência 0, e então eu sou vai digitar o nome de Zamyla. Não há nenhuma linha, porque eu não fiz utilizar impressão f, mas isso é bom. Eu só sei o que fazer. E, de fato, ele imprime O nome de Zamyla, um por linha. Agora vamos ser um pouco imprudente. Suponha que eu não sabia sobre strlen e eu pensei, tudo bem, ninguém vai ter um nomear como maior do que 50 caracteres. Vamos em frente e recompilar este e executá-lo novamente, e em seguida, digite Zamyla mais uma vez. Logicamente, o que é a programa vai tentar imprimir? Z-A-H-Y-L-A, em seguida, como 45 desconhecidos bytes de memória. E, de fato, vamos voltar a esta idéia de memória. Mas logicamente, se O nome de Zamyla é este longo, de acordo com a imagem aqui, o que estamos dizendo é manter a impressão, continuar a imprimir, mantenha impressão, continuar a imprimir, mantenha a impressão, todo o caminho para o caráter 50, que quem sabe o que vai acontecer. Então vamos realmente dar uma olhada. Vamos digitar Zamyla. Interessante. Nós tivemos muita sorte. Apenas um monte de espaço em branco. Oh. Há um caráter descolados. Parece como uma espécie de pergunta estranha marcar lá, mas não é o nome do Zamyla. Vamos ficar muito imprudente. Como sobre nós imprimir 500 blocos para o desconhecido? Vamos em frente e fazer isso bem e, em seguida, re-run. E em tela cheia, porque vamos precisamos ver mais espaço. Zamyla. Teve sorte novamente. Ousamos obter mais imprudente? Vamos mais imprudente. 50.000 caracteres. Este não é o mais certamente uma boa idéia. Tudo certo. Faça corda 0. Esta será a nossa última demonstração. Zamyla. Ugh. Ugh. ESTÁ BEM. Assim, a minha memória é realmente vazio agora, que na verdade é tipo de conveniente. O que eu estou tentando obter a-- tudo bem. E agora eu estou indo só para obter imprudente. 500.000. Make-- de tela cheia de deixá-lo. Enter. Zamyla. Aí vamos nós. Eu não tenho nenhuma idéia do que isso é, mas soa ruim. Tudo certo. E, de fato, em breve, se você está entre os poucos afortunados em horário de expediente e no conjunto de problemas um, você pode muito bem encontrar esse. Falha de segmentação realmente faz tem um significado bem definido. Isso significa algum tipo de erro relativa a um segmento de memória. E, em termos leigos, isso significa que nós tocamos memory-- usamos RAM no meu computador que eu não deveria ter tido acesso a. E é isso que é ao mesmo tempo poderoso e também perigoso sobre C é que você realmente têm acesso irrestrito para a totalidade da memória do seu programa ou bytes de memória RAM ou, mais especificamente. Assim, mesmo que o nome de Zamyla é de apenas seis caracteres, Eu ainda posso ir a qualquer lugar na memória que eu quero. E como um aparte, se você tiver já leu algum artigo ao longo dos anos sobre alguns servidor ou algum programa ficar rachado ou hackeado que é aproveitado algo chamado um estouro de buffer exploit que nós vamos realmente falar em poucas semanas, que é geralmente referindo-se a alguma forma enganar um computador para ir bem além das fronteiras da memória que deve ter, e encontrar algo suculento em que um memory-- senha, talvez, uma maneira de contornar alguns número de série verificar, ou apenas geralmente capaz para enganar o computador está executando código que não foi pretendido. Mas vamos voltar a realidade para apenas um momento onde este programa foi implementado com strlen, e introduzir uma coisa aqui em cima. O que há de novo entre estas três linhas principais? Então cadeia dot h. Acontece lá fora é essa biblioteca chamada Cadeia Dot H, ou a Biblioteca String, cujo arquivo de cabeçalho, por assim dizer, é string dot h que me dá acesso a esta função strlen. Se eu omitir que, o compilador é vai gritar comigo de alguma forma. Mas você sabe o quê? Agora vamos realmente diferenciada. Na linha 22, há algo tipo de inefficient-- mal projetado, arguably-- sobre esta linha de código. Pense de volta a como for-loop são implementadas e quais os passos acontecer de novo e e novamente novamente-- a inicialização, a condição, de que o código é executada, então o incremento ou a alteração, em seguida, a condição, em seguida, o código, em seguida, a alteração, então a condição, em seguida, o código, em seguida, a alteração, e assim por diante. Então, o que pode ser um pouco preocupante ou mal feito aqui? Sim, no azul. AUDIÊNCIA: strlen é chamado muitas, muitas vezes. COLUNA 1: Yeah. Assim, é chamado strlen muitas vezes, mas o que é o comprimento do nome de Zamyla o primeira vez que o loop é executado? AUDIÊNCIA: Six. COLUNA 1: Six. Bem, qual é o comprimento de seu nome a segunda vez que o código é executado? AUDIÊNCIA: Six. COLUNA 1: Tudo bem. Ainda é seis. Certo? O nome de Zarla não tem mudado, mesmo que eu estou procurando em apenas parte das letras em seu nome. E assim o fato de que eu sou efetivamente fazendo esta pergunta, o que é o comprimento de Zamyla, qual é o comprimento de Zamyla, qual é o comprimento de Zamyla, seis vezes separadas, ou sete, mesmo, é simplesmente estúpido, porque isso é imutável essa resposta. E então o que eu poderia realmente fazer é isto-- em seqüência um Eu tenho uma versão um pouco melhor aqui. Há-- seqüência whoops-- dois que eu tenho uma versão ligeiramente melhor em que Eu faço isto-- em vez de apenas i inicializar a 0, também com uma vírgula declarar uma segunda variável chamada n-- Eu não tenho que dizer int novamente. Eu não deveria, na verdade. Mas eu digo n. E então eu inicializar a n o strlen de n, de modo que agora quantas vezes é que strlen são executados no total? Só uma vez. E então é isso que queremos dizer anteriormente sobre melhor design. Na verdade, uma vez que seu código está correto, indo para trás e pensar através, estou usando tão pouco memória ou como alguns segundos ou milissegundos de tempo de computador como possível implementar algum problema? E eu estou indo para rolar se e apenas mencionar que há essa menção de null nesta versão, mas vamos voltar a isso em pouco tempo. Porque, por enquanto, vamos dar uma olhada para onde isso vai nos levar. Então, um, verifica-se que agora que temos a capacidade olhar para caracteres individuais, podemos alavancar algo a partir da semana 0 que era muito misterioso e tipo de desinteressante no momento. Mas agora, e especialmente quando nós chegar à criptografia em uma semana, ele vai ser muito poderosa. Acontece que com algum ints e carros alegóricos de dados types-- e caracteres e strings e outra coisas- alguns deles pode ser facilmente convertido para o outro. Por exemplo, quando nós falamos sobre ASCII algum tempo aqui está ago-- a letras maiúsculas A através M, ponto, ponto, dot-- dissemos que há um mapeamento entre estas letras e números. E, de fato, ele é válido para letras minúsculas assim. Minúsculas um é 97, o capital é de 65 um. E há um número em ASCII, que é apenas esse mapeamento sistema para todas essas outras letras. Então, o que isso significa? Bem, eu estou indo para ir em frente e aberto se verdadeira rapidamente algo chamado ASCII 0, a maioria dos quais é comentários. E novamente on-line você pode sempre olhar através dos comentários. E vejam o que isso vai fazer. Então, ele tem uma função principal. Eu tenho-codificado os números apenas para agora, porque eu sei o que estou fazendo. Eu sei o que eu quero ver aqui. E eu tenho inicializado I a 65. E eu estou contando-se através de 26 cartas total. E o que é que eu vou imprimir uma linha de cada vez se você pode interpretar esta linha destacada? O que será impresso? Sim. AUDIÊNCIA: Você vai para imprimir a carta que corresponde ao mapa da valor letra e valor inteiro? COLUNA 1: Exatamente. Vou imprimir a letra correspondente ao valor inteiro, e vice-versa, como se segue. Bem, este, alguém disse anteriormente, é apenas um espaço reservado para um char. Ainda é. Isto, é claro, é um marcador de posição para um não int-- uma nova linha. E agora observe, meu primeiro valor que Estou ligando para esse espaço reservado não é apenas I. estou dizendo, em parênteses, char I, que o caractere é parenthetical dizendo o compilador, tratar I não como o que é, o que é um número. Tratá-lo como um personagem real. Considerando que o segundo valor que eu estou conectando em-- I-- deve ser apenas um número. Então, se eu compilar este program-- por isso este é fazer ASCII 0, dot ASCII barra 0-- acabei de receber esta pequena carta acessível que mostra-me todo o possível mapeamentos sem ter que pensar que ou através de descobrir isso por conta própria. E eu também estou imprimindo, observe as letras minúsculas, porque algumas linhas depois, eu também imprimir este mapeamento bem, que é apenas para dizer que uma vez que você entender o que está acontecendo por baixo o capô, você pode converter automaticamente e para trás. E, de fato, se algum de vocês nunca fez isso na escola primária ou ouviu falar de alguém miticamente tomar uma nota e passá-la para o seu ou a amiga na sala de aula, mas você mexidos o letras de A como B torna-se, B e C se torna, ou algo assim mais complicado do que isso, bem, como é que você vai fazer sobre implementação que como um miúdo? Bem, você só tipo de saber A torna-se B, B torna-se C, mas matematicamente, o que foi que o garoto está fazendo? O que você estava adicionando a cada letra? Efetivamente, 1. Então, quando você mudar de A para B, que é tipo de como a mudança de 65-66, que matematicamente significa apenas adicionar 1. E por isso, se você fosse para implementar que pouca técnica fraudulenta para seu professor no código, você pode fazer exatamente isso apenas por adição de uma única letra juntos. Assim, em pouco tempo, estamos vai ver como nós pode tirar proveito disso para realmente disputa genuína e desembaralhar informações. Entretanto, sabemos que nós começamos a introdução de um par de outras bibliotecas aqui-- a seqüência de um hoje. E um site muito útil esperamos que você vai encontrar é chamado reference.cs50.net, que o corpo docente têm juntos, de modo que se você quiser olhar para cima trabalhos como strlen, você pode começar a digitar o nome da função, clique strlen lá, e, em seguida, uma explicação menos confortável vai aparecer. Ou se você quer que o oficial Explicação baseado em Linux, você pode clicar mais confortável no canto superior direito, e vai apresentar a mesma informação, mas em termos mais complexos. Isso é um recurso útil para realmente saber tudo o que faz. Da próxima vez que vamos Dê uma olhada Ovomaltine e mais, e introduzir- para o mundo da criptografia. Antes disso, vamos ver você ainda esta semana. E agora, Colton Ogden. Te vejo na quarta-feira. [Música tocando] [Música tocando] COLUNA 1: O que o [BLEEP] está fazendo? COLUNA 1: Eu estou comendo a minha sobremesa? Como você comê-lo? Com suas mãos? [Música tocando]