[MÚSICA DE JOGO] DAVID J. MALAN: Tudo bem. Este é CS50, e esta é o início da semana dois. Então, vamos começar hoje com um bug. Um bug, é claro, é uma erro em um programa, e você vai ter muito familiarizados com o conceito Se você nunca programou antes. pset0 e agora pset1. Mas vamos considerar algo um pouco simples à primeira vista. Este programa aqui que eu jogou em conjunto com antecedência, e eu afirmo que este deve imprimir 10 estrelas na tela usando printf, mas, aparentemente, com erros de alguma forma. Dado que a especificação que deve imprimir 10 estrelas, mas não faz aparentemente, o você teria a pretensão é o bug? Sim? Portanto, é um fora por um erro, eo que você quer dizer com isso? Está bem. Excelente. Então, nós temos um determinado valor igual a zero para iniciar i, e que tenha especificado um valor de n de 10, mas temos usado menos do que ou igual a. E a razão que este é duas personagens e não apenas um símbolo, como em um livro de matemática, é que você não tem uma forma de expressar o um equivalente de caracteres. Então isso significa que menos de, mas se você começar a contar do zero, mas você contar todo o caminho para cima através e igual a 10, você está, naturalmente, vai contar 11 coisas no total. E assim você vai imprimir 11 estrelas. Então, o que pode ser uma solução para isso? Sim? Então, basta ajustar a menos de ou igual a ser um pouco menos do que, e há, eu afirmo, talvez uma outra solução, também. O que pode mais que você faz? Sim? Então comece igualando-o a 1, e deixar a menos do que ou igual a. E, sinceramente, eu teria a pretensão que, para um ser humano típico, esta é provavelmente mais simples. Comece a contar em 1 e contar-se a 10. Essencialmente fazer o que você quer dizer. Mas a realidade é, em programação, como vimos, cientistas da computação e programadores geralmente não começar a contar do zero. E isso é bom uma vez você se acostumar com isso. A sua condição irá geralmente ser algo como menos de. Então simplesmente uma lógica erro que poderíamos agora corrigir e, finalmente, recompilar isso e obter apenas 10. Bem como sobre este erro aqui? Aqui, mais uma vez, afirmo que tenho uma meta de impressão 10 stars-- um por linha neste momento, mas isso não acontece. Antes de propor o que a correção é, o que faz isso imprimir visualmente, se eu fosse para compilar e executar este programa que você acha? Sim? Star. Então, todas as estrelas no mesma linha é o que eu ouvi, e, em seguida, o caractere de nova linha. Então, vamos tentar isso. Então faça de buggy-1, entrar, e eu vejo o comando clang que falamos pela última vez. ./buggy-1, e na verdade eu vejo todas as 10 estrelas na mesma linha, mesmo que eu reclamo na minha especificação apenas um comentário em cima o código que eu pretendia fazer um por linha. Mas isso parece certo. Agora linha 15 parece que eu sou a impressão de uma estrela, e depois a linha 16 parece que eu sou impressão um caractere de nova linha, e ambos estão tão recuados Estou dentro do loop de forma clara. Então, eu não deveria estar fazendo estrela, novo linha, estrela, nova linha, estrela, nova linha? Sim? Sim, ao contrário de uma linguagem como Python, se você está familiarizado, reentrância não faz importa para o computador. Isso só importa para o ser humano. Então linhas enquanto que aqui eu inventei 15 e 16-- que parece bonito, mas o computador não liga. O computador se preocupa com realmente ter chaves em torno destas linhas de código. Assim que é clear-- assim como em Scratch-- que essas duas linhas de código deve ser executado. Como um daqueles quebra-zero amarelo pedaços de novo e de novo e de novo. Portanto, agora se eu re-executar esta program-- ./buggy-2-- Hm. Eu tenho um erro agora. O que eu esqueci de fazer? Sim, então eu não compilá-lo. Então faça de buggy-2. Nenhum arquivo porque eu não fiz realmente compilar a segunda versão. Então agora interessante não declarado não variable-- 2. Estamos fazendo 1. Faça de buggy-1-- ./buggy-1-- e agora cada um deles está na mesma linha. Agora há uma exceção para esta suposta alegação de mina que você precisa dessas chaves. Quando é realmente ok-- se você tiver notado na seção ou textbooks-- omitir as chaves? Sim? Exatamente. Quando há apenas uma linha de código que você quer para ser associado com a laço como no nosso primeiro exemplo. É perfeitamente legítimo omitir as chaves apenas como uma espécie de conveniência do compilador para você. Sim? Boa pergunta. Seria considerado um erro de estilo? Gostaríamos promote-- como em CS50 guia de estilo, a URL para a qual em que é sempre pset1-- usar as chaves. Certamente, se você é novo na programação. A realidade é que não estamos vai proibi-lo de fazer essas conveniências. Mas se você está apenas começando para o balanço das coisas, absolutamente justo sempre usar o encaracolado chaves até você pegar o jeito dele. Boa pergunta. Tudo certo. Para que então era um bug. Pelo menos em uma coisa bastante simples. E ainda você pode pensar que isso é bastante rudimentar, certo? Esta é uma espécie da primeira semana de olhar para a linguagem como, ver os seus erros nele. Mas a realidade estes são realmente representativo de alguns problemas bastante assustadoras que podem surgir no mundo real. Então, alguns de vocês podem se lembrar se você seguir de notícias de tecnologia, ou talvez até mesmo pego vento desta em fevereiro do ano passado que a Apple tinha fez um pouco de um erro em ambos iOS, o sistema operacional em seus telefones, e também Mac OS, o sistema operacional em seus desktops e laptops. E você viu essas manchetes como esta. E depois disso, a Apple prometeu para corrigir esse bug, e muito rapidamente fez corrigi-lo no iOS, mas, em seguida, em última análise, fixa-lo no Mac OS bem. Agora nenhuma dessas manchetes sozinho realmente revelam que o problema subjacente era, mas o erro foi finalmente reduzida para um bug no SSL, Secure Sockets Layer. E short longo da história, este é o software que os nossos navegadores e outros software usado para fazer o quê? Se eu disse que é SSL envolvido, sempre que você visitar uma URL que começa com HTTPS, então o que pode estar relacionado com SSL? Criptografia. Então vamos falar sobre isso nos próximos dias. Criptografia, a arte de codificação de informação. Mas short longo da história, a Apple há algum tempo atrás havia cometido um erro na implementação da SSL, o software que implementa, em última análise URLs como HTTPS ou max conexões lá também. O resultado disso é que o seu conexões poderia potencialmente ser interceptado. E eram os seus contatos não necessariamente encriptada se você tinha algum bandido no meio você eo site de destino que soube tirar proveito disso. Agora, a Apple, em última análise postada Uma correção para esse fim, ea descrição de sua correção foi isso. Transporte seguro não conseguiu validar a autenticidade da conexão. A questão foi abordada por restaurando passos de validação desaparecidas. Portanto, esta é uma explicação muito ondulado mão para simplesmente dizer que errou. Há, literalmente, um linha de código que foi de buggy na implementação da SSL, e se você ir online e pesquisa para este você pode realmente encontrar o código-fonte original. Por exemplo, esta é uma captura de tela apenas uma porção de um ficheiro bastante grande, mas esta é uma função chamada aparentemente SSL verificar a troca de chaves do servidor sinal. E ele tem um monte de argumentos e insumos. E nós não estamos indo para se concentrar muito sobre a minúcia lá, mas se você se concentrar no código dentro de que na extremidade superior function-- vamos ampliar isso. Você já deve suspeitar que o erro pode ser mesmo se você não tem idéia em última análise, o que você está olhando. Há uma espécie de anomalia aqui, que é o que? Sim, eu realmente não gosto o olhar de dois empreendedores falhar. Francamente, eu não sei realmente o que Goto falhar meios, mas tendo dois deles back to back. Isso meio que me esfrega intelectualmente o caminho errado, e, na verdade, se aumentar o zoom em apenas aquelas linhas, este é C. Então, um monte de código da Apple está-se escrito em C, e isso, aparentemente, é realmente equivalent-- não para que muito em recuo versão, mas se você reconhecer o fato que não há chaves, o que A Apple realmente escreveu foi o código que parece assim. Então eu ampliada para fora e eu só fixa o recuo no sentido que, se não há chaves, que Ir à segunda falha que está em amarelo vai executar, não importa o quê. Não é associado com o se a condição acima dela. Assim mesmo, novamente, se você não muito entender o que isso poderia estar fazendo, sei que cada um deles conditions-- cada uma destas linhas é um passo muito importante no processo de verificação se seus dados são de fato criptografado. Assim, saltando um desses passos, não é a melhor idéia. Mas porque temos esta segunda empreendedores falham em amarelo, e porque, uma vez que tipo de esteticamente movê-lo para a esquerda, onde ele logicamente é, no momento, o que que isso significa para a linha de código abaixo que segundo Goto deixar que você acha? Ele sempre vai ser ignorada. Então gotos são geralmente desaprovado por razões que não vai realmente entrar, e mesmo em CS50 não tendem para ensinar esta Goto declaração, mas você pode pensar em Goto falhar no sentido de ir de salto a outra parte do código. Em outras palavras pular esta última linha completamente, e de modo que o resultado desta burro simples erro que foi apenas um resultado provavelmente alguém copiando e colando um também muitas vezes é que o inteiro segurança do iOS e Mac OS era vulnerável à interceptação por bandidos por algum tempo. Até que a Apple finalmente resolveu esse. Agora, se alguns de vocês são realmente executando versões antigas do iOS ou Mac OS, você pode ir para gotofail.com que é um site que alguém configurar para determinar essencialmente programaticamente Se o seu computador ainda está vulnerável. E, francamente, se for, provavelmente é uma boa idéia para atualizar seu telefone ou seu Mac neste momento. Mas lá, apenas prova de quão uma apreciação destes nível mais baixo detalhes e bastante idéias simples pode realmente traduzir-se em decisões e os problemas que affected-- neste caso-- milhões de pessoas. Agora, uma palavra sobre a administração. Seção terá início no próximo domingo. Você receberá um e-mail pelo fim de semana sobre a seção, em que ponto o processo de ressecção começará se você tiver percebi que você tem agora alguns novos conflitos. Então, isso acontece todos os anos, e nós acomodará nos dias que virão. Escritório horas-- fazer manter um olho nesse horário aqui. Muda um pouco esta semana, especialmente a hora de início ea localização, assim que consultar que antes de ir para o horário de expediente qualquer um dos próximos quatro noites. E agora uma palavra sobre a avaliação, particularmente como você mergulhar no problema define um e além. Assim, segundo a especificação, estes são geralmente Os eixos podemos avaliar o seu trabalho. Escopo refere-se ao que medida seus implementos código os recursos necessários pela nossa especificação. Em outras palavras, quanto um conjunto de peças que você fez morder. Você fez um terço do mesmo, uma metade, a 100% do mesmo. Mesmo que isso não é correto, quanto é que você tentar? Assim que capta o nível do esforço e da quantidade para que você mordeu a problemas problema do aparelho. Correctness-- este, para que ponto, é o seu código consistente com nossa especificações e livres de erros. Assim é que funciona corretamente? Se dermos alguma entrada, não é nos dar o resultado que esperamos? Desígnio de agora este é o primeiro de os particularmente qualitativas ou os que exigem o julgamento humano. E, de fato, é por isso que temos uma equipe de tantos companheiros de ensino e curso assistentes. Até que ponto a sua código escrito bem? E mais uma vez este é um muito avaliação qualitativa que irá trabalhar com você em bidirecional nas próximas semanas. De modo que quando você não conseguir pontuação apenas numérico, mas também um partituras escritas, ou feedback digitado, ou feedback escrito em palavras em inglês. Isso é o que vamos usar para levá-lo para realmente escrever um código melhor. E na palestra e seção, vamos tentar para apontar out-- tão frequentemente como nós posso-- o que faz um programa não só correcto e funcionalmente boa, mas também bem desenhado. O mais eficiente que pode ser, ou mesmo a mais bela que pode ser. O que nos leva ao estilo. Estilo em última análise é um juízo estético. Você escolheu bem nomes para as variáveis? Você recuado o código corretamente? Será que uma boa aparência e, portanto, é mais fácil para outro ser humano a ler o seu respectivo de sua correção. Agora geralmente por o plano de estudos, marcamos essas coisas em uma escala de cinco pontos. E deixe-me martelar a ponto que é de facto um bom três. Muito rapidamente que o pessoal do começar a fazer aritmética. Quando chegar a três de cinco na correção por algum pset e eles acham que nada, eu vou para 60% o qual é essencialmente um D ou um E. Essa não é a maneira que nós pensar nesses números. A três é realmente bom, eo que nós em geral esperam que no início do termo é que, se você está recebendo um bando de three's-- talvez um par de feiras, um par de fours-- ou um par de pares, um par de fours-- isso é um bom lugar para começar. E enquanto vemos uma trajetória ascendente ao longo do tempo, você está em um lugar particularmente bom. A fórmula que usamos para coisas de peso é essencialmente este acordo com o plano de estudos, o que significa apenas que nós dar mais peso à correção. Porque é muito frequentemente correção que leva mais tempo. Confie em mim agora. Você vai find-- pelo menos em que um pset-- gastar 90% do seu tempo trabalhando em 10% do problema. E tudo o tipo de obras com exceção de um ou dois erros, e esses são os erros que mantê-lo até tarde da noite. Aqueles são os que espécie de escapar de você. Mas depois de dormir sobre ele, ou a participar de horário de expediente ou fazer perguntas on-line, é quando você chegar a essa meta de 100%, e é por isso que o peso CORREÇÃO mais. Projete um pouco menos, e estilo um pouco menos do que isso. Mas tenha em estilo mente-- É talvez a mais fácil destes para morder de acordo com o guia de estilo. E agora, a mais grave nota na honestidade acadêmica. CS50 tem a infeliz distinção de sendo o maior produtor de placa do anúncio casos, quase todos os anos historicamente. Isto não é porque os alunos trapacear em CS50 mais do que qualquer outra classe, mas porque pela natureza do trabalho, o fato de que é eletrônico, o fato de que nós olhamos para ele, e o fato de que são cientistas da computação, Eu posso dizer que, infelizmente, são muito bons em detectar isso. Então, o que isso significa em termos reais? Por isso, conforme o plano de estudos, filosofia do curso realmente se resume a ser razoável. Existe essa linha entre fazendo seu trabalho por conta própria e obter um pouco de ajuda razoável de um amigo, e definitivas fazendo esse trabalho para o seu amigo, ou enviar-lhe o seu código de modo que ele ou ela pode simplesmente pegar ou pegar emprestado certo. E que cruza a linha que tirado da classe. Veja, o plano de estudos em última instância, para as linhas que traçamos como sendo razoável e comportamento irracional, mas realmente ferver até a essência do seu trabalho a necessidade de ser o seu próprio no final. Agora, com o que disse, há uma heurística. Porque, como você pode imagine-- do horário de expediente e os recursos visuais e os videos que mostrado assim far-- CS50 é de fato a intenção de ser tão colaborativo e como cooperativa e como sociais quanto possível. Como colaboração, pois é rigorosa. Mas, com isso dito, a heurística, como você verá no currículo, é que quando você está tendo algum problema. Você tem algum bug no código que você não pode resolver, é razoável para você para mostrar o código para outra pessoa. Um amigo até mesmo na classe, um amigo sentado ao seu lado no horário de expediente, ou um membro do pessoal. Mas eles não podem mostrar seu código para você. Em outras palavras, um responder à sua pergunta-- Preciso ajudar-- não é oh, aqui está o meu código. Dê uma olhada neste e deduzir a partir dela o que quiser. Agora, é claro, não há uma maneira claramente ao jogo este sistema em que eu vou lhe mostrar meu código antes de ter uma causa. Você me mostrar o meu código antes de ter uma causa. Mas veja o programa novamente para o pequenos detalhes de onde essa linha é. Só agora pintar o quadro e compartilhar mais transparente possível onde estamos, nos últimos anos, este é o número de casos de placa do anúncio CS50 que teve mais Nos últimos sete anos. Com 14 casos neste outono mais recente. Em termos dos alunos envolvidos, que era há 20 alguns alunos ímpares no outono passado. Houve um pico de 33 alunos há alguns anos. Muitos dos quais, infelizmente, são não está mais aqui no campus. Os alunos envolvidos como uma percentagem do classe historicamente variou de 0% para 5,3%, que é só para dizer isto é, anualmente, um desafio. E para esse fim, o que nós queremos fazer é transmitir uma que apenas dd-- FYI-- comparar a uma justiça para os alunos que estão seguindo a linha de acordo. Fazemos comparar todos os atuais submissões contra todas as missões passadas dos últimos muitos anos. Sabemos também como a Google ao redor e encontrar repositórios de código on-line, fóruns de discussão online, sites de emprego on-line. Se um aluno pode encontrá-lo, nós podemos seguramente encontrá-lo tanto quanto nós com pesar fazer. Então, o que você vai ver no programa porém, é esta cláusula arrependimento. Eu posso certamente apreciar, e todos nós tem equipe ter feito o curso como este, ou um esta-se ao longo do tempo, certamente sabe o que é como quando vida fica no caminho quando você tem alguns tarde da noite deadline-- não só nesta classe, mas another-- quando você está completamente exaustos, estressados, têm um número excessivo de outras coisas para fazer. Você vai fazer em algum momento da vida, certamente, um mau, talvez tarde decisão noite. Então, por o plano de estudos, existe esta cláusula, tal que, se no prazo de 72 horas depois de fazer algum pobre de decisão, você possui até ele e estender a mão para mim e um dos cabeças do curso e vamos ter uma conversa. Nós vamos lidar com as coisas internamente na esperança de se tornar mais um momento de ensino ou lição de vida, e não algo com ramificações particularmente drásticas como você pode ver nestas cartas aqui. Então, isso é um tom muito sério. Detenhamo-nos para apenas alguns segundos para quebrar a tensão. [MÚSICA DE JOGO] DAVID J. MALAN: Tudo bem, Então, como foi que para um segue? Para tópicos principais de hoje. O primeiro dos quais é abstracção. Outro dos quais vai ser o representação de dados, que, francamente, é realmente uma maneira seca de dizer como podemos ir sobre como resolver problemas e pensar sobre a resolução de problemas? Então você já viu em risco, e você tem talvez já visto na pset1 com C que você não só pode usar funções, como printf que outras pessoas em ano passado escrevi para você. Você também pode escrever suas próprias funções. E mesmo que você não pode ter feito isso em C, e, francamente, em pset1 você realmente não precisa escrever a sua porque a própria função problema-- embora talvez difícil no primeiro glance-- você verá em última instância, pode ser resolvido com Nem tudo o que muitas linhas de código. Mas com o que disse, em termos de escrever sua própria função, perceber que dá C você esta capacidade. Eu estou indo para ir no código-fonte de hoje, que já está disponível on-line, e eu estou indo para ir em frente e aberto um programa chamado função 0.C, e em função zero vamos ver algumas coisas. Em primeiras linhas 18 a 23 é a minha função principal. E agora que estamos começando a ler código que não está escrevendo no momento, mas ao invés disso eu tenho escrito com antecedência ou que em um conjunto de problemas recebêssemos ter foi escrito com antecedência. Uma boa maneira de começar leitura de código de outra pessoa é olhar para a função principal. Descobrir onde essa entrada objetivo é executar o programa, e depois segui-lo logicamente de lá. Portanto, este programa aparentemente impressões seu nome seguido de dois pontos. Em seguida, usamos GetString a partir da biblioteca de CS50 para obter uma string, ou uma palavra ou frase do usuário no teclado. E depois há este coisa printName aqui--. Agora não é um printName função que vem com C. Não é em io.h. padrão Não é em CS50.h. É um pouco no mesmo arquivo. Observe se eu rolar para baixo Linhas bit-- 25 para 27-- é apenas uma maneira muito de comentar seu código usando as estrelas e barras. Este é um sistema multi-linha comentar, e este é apenas minha descrição em azul de o que esta função faz. Porque nas linhas 28 a 31, Eu escrevi uma função super simples cujo nome é printName. Leva quantos argumentos que você diria? Então, um argument-- porque há um argumento listados dentro dos parênteses. O tipo de que é String. O que significa dizer printName é como essa caixa preta ou função que recebe como entrada um string. E o nome dessa cadeia convenientemente será Nome. Não é, não N, menos no nome. Então, o que printName fazer? É bom simples. Assim como uma linha de código para o printf, mas, aparentemente, imprime "Olá", assim e assim. Onde o modo e de forma vem do argumento. Agora, isso não é uma grande inovação aqui. Realmente, eu tomei um programa que poderia ter sido escrito com uma linha de código colocando isso aqui acima, e mudou para algo que envolve cerca de seis ou sete anos ou menos linhas de código por todo o caminho até aqui. Mas é a prática de um princípio conhecido como abstração. Tipo de encapsulação no interior de um novo função que tem um nome, e melhor ainda que o nome literalmente diz que ele faz. Quero dizer printf-- isso não é particularmente descritiva. Se eu quiser criar um parte do enigma, ou se eu deseja criar uma função que imprime o nome de alguém, a beleza de fazer isso é que eu posso realmente dar essa função um nome que descreve o que ele faz. Agora que leva, em que uma entrada Eu arbitrariamente chamado nome, mas isso também é maravilhosamente descritivo em vez de ser um pouco mais genérico como S. E vazio, por agora, apenas significa que esta função não entregar-me de volta nada. Não é como GetString que literalmente me dá de volta a cadeia como fizemos com os pedaços de papel com seus colegas na semana passada, mas em vez disso, apenas tem um efeito colateral. Ela imprime algo na tela. Assim, no final do dia, se eu fazem função de 0, ./function-0, veremos que ele pede para o meu nome. Eu digito David, e os tipos meu nome. Se eu fizer isso de novo com Rob, ele vai dizer "Olá, Rob." Então, uma idéia simples, mas talvez extrapolar a partir deste mentalmente que, como seus programas obter um pouco mais complicado, e você quer escrever um pedaço de código e chamadas que code-- invoke code-- que por algum descritiva nome como printName, C faz nos proporcionar essa capacidade. Aqui está outro exemplo simples. Por exemplo, se eu abrir um arquivo a partir de hoje chamado return.c, perceber o que eu fiz aqui. A maior parte dessa função principal é printf. Eu primeiro arbitrariamente inicializar um variável chamada x para o número 2. Eu, então, imprimir "x é agora % I "passando o valor de x. Então, eu só estou dizendo que ele é. Agora eu sou apenas corajosamente afirmando com printf. Estou cubing que o valor x, e eu sou fazê-lo, chamando uma função chamado passagem cubo em x como argumento, e, em seguida, salvar a saída na própria variável, x. Então, eu estou derrotando o valor de x. Estou substituindo o valor de x com o que o resultado da chamada esta função cubo é. E então eu apenas imprimir algumas material fofo aqui dizendo o que eu fiz. Então, o que é cubo? Observe o que é fundamentalmente diferente aqui. Eu dei a função um nome como antes. Eu especifiquei um nome para um argumento. Desta vez, ele é chamado de n em vez de nome, mas eu poderia chamá-lo de qualquer coisa que eu quero. Mas isso é diferente. Essa coisa do lado esquerdo. Antes, era o que palavra-chave? Rapazes. Agora é obviamente int. Então o que é, talvez, o tirar? Considerando significa vazios tipo de nada, e que era o caso. PrintName retornou nada. Ele fez alguma coisa, mas não me devolver algo que eu poderia colocar no lado esquerdo de um sinal de igual como eu fiz aqui na linha 22. Então, se eu digo para a linha 30, o que é isso, provavelmente, o que implica sobre o cubo faz por mim? Sim? Ele retorna um inteiro. Por isso, me passa para trás, para exemplo, um pedaço de papel em que se tem escrito a resposta. 2 ao cubo, ou 3 ao cubo, ou 4 cubed-- tudo o que eu passei em, e como eu implementar isso? Bem, só n vezes n vezes n É assim que eu poderia um cubo de valor. Então, novamente, super simples idéia, mas demonstrativa agora como podemos escrever funções que, na verdade, tinha-nos de volta valores que possam ser de interesse. Vejamos um último exemplo aqui chamado de função um. Neste exemplo, ele começa para obter mais atraente. Assim, em função de um, esta aviso program-- em última instância chama uma função chamada GetPositiveInt. GetPositiveInt não é um função na biblioteca CS50, mas decidimos gostaria que ele existe. Então, se deslocar para baixo no final do arquivo, Observe como eu fui sobre a implementação de obter int positivo, e eu dizer que é mais atraente porque este é um decente Número de linhas de código. Não é apenas um tolo pequeno programa brinquedo. É realmente tem alguma verificação de erros e fazer algo mais útil. Então, se você não viu o passo a passo vídeos que temos incorporado em pset1, sei que este é um tipo de laço em C, semelhante em espírito para os tipos de coisas Raspadinha pode fazer. E faça diz fazer isso. Imprima esta fora. Então vá em frente e obter n-- obter um int e armazená-lo em n, e continuar fazendo isso de novo e de novo e de de novo, desde que n seja inferior a um. Assim, n vai ser menor do que um somente se o humano não está cooperando. Se ele ou ela está escrevendo em 0 ou -1 ou -50, este ciclo vai continuar execução de novo e de novo. E, finalmente, perceber, eu simplesmente devolver o valor. Então, agora nós temos uma função que teria sido bom CS50 se implementaria em CS50.h e CS50.c para você, mas aqui podemos agora implementar isso nós mesmos. Mas dois comentários sobre alguns detalhes importantes. Um-- por que eu declarar int n, você acha que, na linha 29 em vez de apenas fazer este aqui, que é mais consistente com o que fizemos na semana passada? Sim? Um bom pensamento. Então, se fôssemos para colocá-lo aqui, é como se estivéssemos manter declarando-o uma e outra vez. Isso por si só é não problemática, por si só, porque nós só precisamos o valor de uma vez e, em seguida, vamos começar um novo de qualquer maneira. Mas um bom pensamento. Sim? Fechar. Então porque eu tenho declarado n em A linha 29, fora do circuito, é acessível em todo esta função inteira. Nem as outras funções porque n ainda está dentro destes crespos suspensórios aqui. Assim-- certeza. Exatamente. Então, isso é ainda mais direto ao ponto. Se em vez declarada n aqui na linha 32, é problemático porque palpite onde mais eu precisar acessá-lo? Na linha 34, e o simples regra de ouro é que você só pode usar uma variável dentro das mais recentes chaves em que você declarou. Infelizmente, linha 34 é uma linha muito tarde, porque eu já fechado a chaveta na linha 33 que corresponde ao chaveta na linha 30. E por isso esta é uma maneira de dizer que esta variável int tem como escopo, por assim dizer, a apenas dentro dessas chaves. Ele simplesmente não existe fora deles. Então, na verdade, se eu fizer isso errado, deixe-me salvar o código do pois é-- incorrectamente escrito. Deixe-me ir em frente e fazem função-1, e erro notice--. Utilização de identificador de n não declarado na linha 35, que está aqui. E se rolar para cima ainda, um outro. Utilização de não declarado identificador n na linha 34. Assim, o compilador, Clang, é de notar que ele só não existe apesar claramente que ele está lá visualmente. Assim, uma solução simples é declará-lo lá. Agora deixe-me rolar para o início do processo. O que salta à vista como ser um pouco diferente a partir de coisas que olhamos na semana passada? Não só eu tenho nome, não só Eu tenho alguns afiada inclui em cima, Eu tenho algo que eu sou chamando um protótipo. Agora que parece muito semelhante ao que acabamos de ver há pouco na linha 27. Então, vamos inferir a partir de uma diferente mensagem de erro por que eu fiz isso. Deixe-me ir em frente e excluir essas linhas lá. E assim, não sabemos nada sobre protótipo. Refaça esse arquivo. Faça uma função. E agora, droga, quatro erros. Vamos percorrer até o primeiro. Declaração implícita da função obter int positivo é inválida no C99. C99 significa apenas a 1999 versão da linguagem C, que é o que estamos de fato usando. Então o que isso significa? Bem C-- e mais especificamente C compilers-- são programas muito burro. Eles só sabem o que você tem disse a eles, e isso é na verdade temática da semana passada. O problema é que se eu for sobre a implementação de nome aqui, e eu chamo uma função chamada GetPositiveInt aqui na linha 20, função que tecnicamente não faz existe até o compilador vê a linha 27. Infelizmente, o compilador é fazer as coisas top, para baixo, esquerda, direita, assim porque não viu o implementação de GetPositiveInt, mas vê-lo tentando para usá-lo aqui, é só ir para bail-- grite você com um erro message-- talvez enigmático, e na verdade não compilar o arquivo. Assim, uma chamada protótipo até aqui é reconhecidamente redundante. Literalmente, eu desci aqui e eu copiei e colado isso, e eu colocá-lo aqui. Vazio seria mais adequada, por isso vamos literalmente copiar e colá-lo desta vez. Eu literalmente copiado e colado. Realmente, assim como como uma migalha de pão. Uma pequena pista para o compilador. Eu não sei o que isso faz ainda, mas eu estou prometendo para você que existirá eventualmente. E é por isso que este linha-- em 16-- linha termina com um ponto e vírgula. É redundante por design. Sim? Se você não vincular sua biblioteca para o-- oh, boa pergunta. Afiado inclui inclusões de arquivo de cabeçalho. Precisa ser-- deve quase estar sempre no topo do arquivo para um similar-- para exatamente a mesma razão, sim. Porque na norma io.h é, literalmente, uma linha desta maneira, mas com a palavra printf, e com seus argumentos e seu tipo de retorno. E assim fazendo afiada incluem-se aqui, o que você está literalmente fazendo está copiando e colando o conteúdo de alguém escreveu em cima. Desse modo cluing seu código para o facto de as funções existem. Sim? Absolutamente. Assim, um muito inteligente e correta solução seria, você sabe o quê? Eu não sei o que é um protótipo é, mas eu sei se eu entender que C é apenas mudo e repensa cima para baixo. Bem, vamos dar-lhe o que ele quer. Vamos cortar esse código, cole-o superior, e agora empurrar principal abaixo. Isto também resolveria o problema. Mas você pode facilmente chegar a um cenário em que um precisa chamar B, e talvez B chama de volta para A. Este é algo chamado recursão, e vamos voltar a isso. E isso pode ou não ser um bom coisa, mas você pode definitivamente quebrar esta solução. E além disso, eu o faria afirmam estilisticamente, especialmente quando seus programas tornar este longo e isso por muito tempo, é só super conveniente colocar principal no topo porque é a coisa mais programadores vão se preocupar. E por isso é um pouco mais limpo, sem dúvida, fazê-lo da maneira Originalmente, eu fiz isso mesmo com um protótipo embora pareça um pouco redundante à primeira vista. Sim? Desculpe, você pode falar mais alto? Se você alternar os locais do implementação eo protótipo? Então essa é uma boa pergunta. Se você voltar a declarar esse baixo aqui, vamos ver o que acontece. Então, se eu colocar isso para baixo aqui, você está dizendo. Oh, desculpe. Louder? Ainda mais alto. Ah, boa pergunta. Será que invalida a função? Sabe, depois de todos esses anos, eu nunca colocar um protótipo depois. Então vamos fazer fazer a função-1 depois de fazer isso. [Murmurando] DAVID J. MALAN: Oh, espere. Nós ainda temos que colocar tudo em cima. Então, vamos fazer isso aqui em cima, se eu sou entender sua pergunta corretamente. Estou colocando tudo, inclusive o protótipo acima principal, mas eu estou colocando o protótipo a seguir à aplicação. Então se eu fizer um, eu estou recebendo volta de um error-- utilizada variável n. Oh, não. Obrigado. Vamos ver, vamos nos livrar disso. Isso é um bug diferente, então vamos ignorar isso. Vamos muito rapidamente refazer este. OK, então o argumento dados não utilizado pelo formato de Cordas n-- oh, isso é porque Mudei para estes aqui. Tudo bem, nós sabemos qual é a resposta vai para-- tudo bem, aqui vamos nós. Ah, obrigado pela positiva. Tudo bem, eu vou corrigir esse código depois-- ignorar esse bug em particular uma vez que este estava-- funciona é a resposta. Por isso, não substituir o que você acabou de fazer. Eu suspeito que o compilador é escrito de forma que ele está ignorando o seu protótipo porque o corpo, por assim dizer, da função já tiver foram implementados mais acima. Eu teria que realmente consultar o manual do compilador para entender se há qualquer outra implicação, mas à primeira vista apenas por tentar e experimentar, parece haver nenhum impacto. Boa pergunta. Então, vamos seguir em frente agora, movendo-se longe de efeitos colaterais que são funções que fazem algo como visualmente na tela com printf, mas não retorna um valor. E funções que têm retorno valores como a que acabamos de ver alguns dos. Já vimos essa noção de espaço, e vamos ver isso de novo e de novo. Mas, por agora, mais uma vez, use a regra de ouro uma variável que só pode ser usado dentro dos mais recentemente inaugurado e chaves fechadas como nós vi nesse exemplo particular. E, como você disse, existe uma ability-- você poderia resolver alguns desses problemas colocando uma variável global no topo de um arquivo. Mas, em quase todos os casos teríamos que desaprovam, e na verdade nem mesmo ir em que a solução para agora. Então, por agora, o takeaway é que variáveis ​​têm essa noção de escopo. Mas agora vamos olhar para outro via seca de realmente olhar em algum bem interessante detalhes de implementação. Como podemos representar informações. E nós já olhou para este na primeira semana de aula. Olhando para os binários e lembrando-nos de decimal. Mas lembre-se de na semana passada que C tem diferentes tipos de dados e cachos mais, mas as mais úteis por enquanto pode ser estes. Um char, ou caráter, o que acontece a ser um byte, ou oito bits total. E isso quer dizer que o tamanho de um char é apenas um byte. Um byte tem oito bits, então isto significa que podemos representar quantos caracteres. Quantas cartas ou símbolos do teclado se temos um byte ou oito bits. Pense de volta a semana zero. Se você tem oito bits, quantos valores totais você pode representar com padrões de zeros e uns? Um-- mais do que isso. Assim, 256 total, se você comece a contar a partir de zero. Então se você tem oito bits-- isso, se nós tivemos nossas lâmpadas binários aqui de novo, podemos transformar essas lâmpadas em e fora em qualquer um dos 256 padrões únicos. Agora isso é um pouco problemático. Não tanto para Inglês e línguas românicas, mas certamente quando você introduz, por instância, idiomas asiáticos, que têm muito mais símbolos do que como 26 letras do alfabeto. Na verdade, talvez seja necessário mais do que um byte. E, felizmente, em últimos anos tem sociedade outros padrões adotados que usam mais do que um byte por carga. Mas, por enquanto, em C, o padrão é apenas um byte ou oito bits. Um inteiro, entretanto, é de quatro bytes, também conhecida como 32 bits. O que significa que é o maior possível número que pode representar com um int aparentemente? Com um bilhão. Portanto, é de quatro bilhões mais ou menos. 2 à potência 32th, se não assumem números negativos e só usar todos positivos números, é de quatro bilhões mais ou menos possibilidades. Uma flutuação, por sua vez, é um tipo diferente do tipo de dados em C. Ainda é um número, mas é um número real. Algo com um ponto decimal. E verifica-se que C também utiliza quatro bytes para representar valores de ponto flutuante. Infelizmente quantos flutuante valores dos pontos existem no mundo? Quantos números reais existem? Há um infinito número, e para que o assunto há um número infinito de números inteiros. Por isso, já é meio cavando um buraco nos aqui. Pelas quais, aparentemente, em computers-- em menos programas escritos em C em eles-- só pode contar além de quatro bilhões mais ou menos, e valores de ponto flutuante só pode, aparentemente, ter alguma quantidade finita de precisão. Apenas tantos dígitos após o ponto decimal. Porque, é claro, se você só tem 32 bits, Eu não sei como vamos proceder para representando Números de reais provavelmente com diferentes tipos de padrões. Mas há certamente uma finita número de tais padrões, por isso, também aqui, isso é problemático. Agora podemos evitar o problema um pouco. Se você não usar um carro alegórico, você poderia usar um duplo em C, o que lhe dá oito bytes, que é a maneira mais padrões possíveis de zeros e uns. Mas ainda é finita, o que está acontecendo a ser problemático se você escrever software para gráficos ou de fantasia fórmulas matemáticas. Então você pode realmente querem contar-se maior do que isso. A named-- longo long-- estupidamente também é de oito bytes, ou 64 bits, e este é o dobro do tempo como um int, e é para um valor inteiro longo. Fact-- Fun se um int é de quatro bytes, quanto tempo é um tempo em C normalmente? Também quatro bytes, mas um long long é de oito bytes, e isso é por razões históricas. Mas o takeaway agora É justo que os dados têm para ser representado em um Computador-- que é um dispositivo físico com eletricidade, é geralmente condução esses zeros e ones-- com quantidades finitas de precisão. Então, qual é o problema, então? Bem, há um problema de integer overflow. Não apenas em C, mas em computadores em geral. Por exemplo, se esta é um byte a pena uma bit-- por isso, se este é de oito bit-- tudo dos quais são o número um. Que número é esse representando se assumirmos é todos os valores positivos em binário? 255, e não é 256, porque zero é o número mais baixo. Assim, 255 é o maior um, mas o problema é supor que eu queria incrementar esta variável que está usando oito bits total se eu quiser incrementá-lo. Bem assim que eu adicionar um um para todos estes, talvez você possa imaginar visually-- apenas como levar a um usando decimals-- alguma coisa vai fluir para a esquerda. E, de fato, se eu adicionar o número um para isso, o que acontece em binário é que ele transborda de volta para zero. Então, se você apenas não use-- um int, mas um único byte de contagem inteiros de um programa, por default-- logo você começa a 250, 251, 252, 253, 254, 255-- 0 vem depois de 255, o que provavelmente não é o que é um usuário vai esperar. Agora, entretanto, no mundo de ponto flutuante, você também tem um problema semelhante. Não tanto com o maior number-- embora isso ainda é um problema. Mas, com o valor de precisão que você pode representar. Então, vamos dar uma olhada neste exemplo Também aqui a partir code-- fonte de hoje flutuar-0.c. E note que é um super programa simples que deve, aparentemente, imprimir o valor? O que você apostar que isso vai imprimir mesmo que não haja um pouco de nova sintaxe aqui? Portanto, esperamos que 0,1. Assim, o equivalente a um décimo porque eu estou fazendo 1 dividido por 10. Eu estou armazenando a resposta em uma variável chamada f. Essa variável é do tipo float, que é uma palavra-chave que acabou de propor existiu. Nós não vimos isso antes, mas esta é uma espécie de uma maneira pura em printf especifique quantos dígitos você quero ver depois de um ponto decimal. Portanto, esta notação significa apenas que aqui é um espaço reservado. É para um ponto flutuante valor, e oh, a propósito, mostram que com o ponto decimal com um número depois do ponto decimal. Então esse é o número de algarismos significativos, por assim dizer, que você pode querer. Então deixe-me ir em frente e fazer fazer bóia-0, ./float-0, e, aparentemente, 1 dividido por 10 é de 0,0. Agora, por que é isso? Bem novamente, o computador está a tomar me literalmente, e eu escrevi um e escrevi 10, e dar um palpite que é o tipo de dados assumida por aqueles dois valores? Um int, é tecnicamente algo um pouco diferente. É tipicamente um longo, mas é em última análise, um valor integral. Não é um valor de ponto flutuante. O que significa dizer que, se este é um int e este é um int, o problema é que o computador não têm a capacidade até mesmo para armazenar esse ponto decimal. Então, quando você faz uma dividida por 10 usando números inteiros tanto para o numerador eo denominador, a resposta deve ser 0,1. Mas porque o Computador-- esses são integers-- não sabe o que fazer com o 0.1. Então, o que está claramente a fazer? É só jogá-la fora, eo que eu estou vendo, em última instância é de 0,0 só porque eu insisti que printf me mostrar um ponto decimal. Mas o problema é que se dividir um número inteiro de um número inteiro, você vai get-- por definição C-- de um inteiro. E não vai fazer algo agradável e convenientemente como em volta dele até o mais próxima de um para cima ou para baixo. Vai truncar tudo após o decimal. Então, só de forma intuitiva, o que é provavelmente uma correção? Qual é a solução mais simples aqui? Sim? Exatamente. Por que nós não apenas tratá-los como valores de ponto flutuante de forma eficaz transformando-os em carros alegóricos ou duplos. E agora, se eu faço carros alegóricos-0, ou se eu compilar bóias-1, o qual é idêntico ao o que estava proposto. E agora eu faço carros alegóricos-0, agora eu tenho o meu 0.1. Agora isso é incrível. Mas agora eu vou fazer algo um pouco diferente. Estou curioso para ver o que é realmente acontecendo debaixo do capô, e eu estou indo para imprimir esta para 28 casas decimais. Eu quero muito ver 0.1000-- um infinite-- [Inaudível] 27 zeros depois que 0,1. Bem, vamos ver se isso é o que eu realmente obter. Faça mesmo arquivo bóias-0. ./floats-0. Vamos ampliar a resposta dramática. Todo esse tempo, você tem pensado 1 dividido por 10 é de 10%, ou 0.1. Não é. Pelo menos, desde que o computador de causa. Agora why-- OK, isso é completa lie 1 10 é dividido por 0,1. Mas isso não é why-- o takeaway hoje. Então, por que o computador pensa, ao contrário de todos nós na sala, 1 que é dividido em 10 na verdade esse valor louco? Qual é o computador que faz aparentemente? O que é isso? Não é transbordar, per se. Overflow é tipicamente quando você envolver em torno de um valor. É essa questão da imprecisão em um valor de ponto flutuante onde você só tem 32 ou talvez até 64 bits. Mas se há um infinito número de Números de reais números com pontos decimais e números thereafter-- certamente você não pode representar todos eles. Assim, o computador tem dado nós a correspondência mais próxima para o valor que pode representar usando esse muitos bits para o valor que eu realmente quero, que é de 0,1. Infelizmente, se começar a fazer contas, ou você iniciar envolvendo esses tipos de flutuante valores de pontuação na programs-- importante software financeiro, militar nada software-- onde a percepção é provavelmente muito importante. E você começar a adicionar números como este, e começo executando o software com realmente grandes entradas ou por muitas horas ou lotes de dias ou muitos anos, esses pequenos erros pequenos certamente pode aumentar com o tempo. Agora, como um aparte, se você já visto Superman 3 ou Office Space e você deve se lembrar como esses caras roubaram um monte de dinheiro com seu computador usando os valores de ponto flutuante e adicionando-se o pouco remanescentes, espero que esse filme agora faz mais sentido. Isto é o que eles estavam aludindo nesse filme. O facto de a maioria empresas não olharia depois de um certo número de casas decimais, mas essas são frações de centavos. Então você começa a somá-los, você começar a fazer um monte de dinheiro em sua conta bancária. Então esse é o espaço de escritórios explicou. Agora, infelizmente, além de Office Space, há são algumas legitimamente preocupante e impactos significativos desses tipos de decisões de design subjacentes, e de fato uma das razões usamos C no decurso é por isso que você realmente tem esse terreno o entendimento de como funcionam os computadores, como o software funciona, e não tomar nada como garantido. E, de fato, infelizmente, mesmo com que compreensão fundamental, nós seres humanos cometem erros. E o que eu pensei que eu iria partilhar é este vídeo de oito minuto aqui feita a partir de um episódio de Modern Marvels, que é um espetáculo educativo sobre como as coisas funcionam que pinta duas imagens de quando um uso indevido e compreensão de valores de ponto flutuante levou a alguma significativo resultados infelizes. Vamos dar uma olhada. [REPRODUÇÃO] -Nós Agora voltar a "Engenharia Desastres "na Modern Marvels. Computadores. Todos nós temos vindo a aceitar a problemas muitas vezes frustrantes que ficou com eles-- bugs, vírus, e glitches-- software para pequenos preços para pagar a conveniência. Mas, na alta tecnologia e alta velocidade aplicações do programa espacial militar e, o menor problema pode ser ampliada em desastre. Em 4 de junho de 1996, os cientistas preparado para lançar um foguete Ariane 5 não tripulado. Ele estava carregando científica satélites projetados para estabelecer com precisão a forma como o Interage campo magnético da Terra com ventos solares. O foguete foi construído por a Agência Espacial Europeia, e decolou de sua instalação na costa da Guiana Francesa. -At Cerca de 37 segundos em o vôo, eles primeiro notado que algo estava acontecendo de errado. Que os bicos foram giratório de uma forma que realmente não deveria. Cerca de 40 segundos de vôo, claramente o veículo estava com problemas, e é aí que eles fizeram a decisão de destruí-lo. O oficial de segurança da escala, com coragem tremenda, apertou o botão e explodiu o foguete antes que ele pudesse tornar-se um perigo para a segurança pública. -Foi A donzela viagem do Ariane 5, e sua destruição levou colocar por causa da falha embutido no software do foguete. -The Problema na Ariane foi que não foi um número que é necessária 64 bits para expressar, e eles queriam converter para um número de 16 bits. Eles assumiram que o número nunca ia ser muito grande. Que a maioria dos dígitos em o número de 64 bits foram zeros. Eles estavam errados. -The Incapacidade de um programa de software para aceitar o tipo de número gerado pela outra está na raiz da falha. O desenvolvimento de software tornou-se uma parte muito cara de nova tecnologia. O Ariane 4 foguete tinha sido muito bem sucedida. Assim, grande parte do software criado para Ele também foi usado no Ariane 5. -The Problema básico era que o Ariane 5. Foi faster-- acelerou mais rápido, e o software não tinha contabilizado isso. -The Destruição do foguete foi um enorme desastre financeiro. Tudo devido a um erro de software minuto. Mas este não foi o primeiro problemas de conversão de dados de tempo havia atormentado a tecnologia de foguetes moderna. -Em 1991, com o início da primeira Guerra do Golfo, o míssil Patriot experimentado um tipo semelhante conversão de um problema número. E, como resultado 28 pessoas-- 28 Soldiers-- americanos foram mortos, e cerca de cem ficaram feridas. Quando o Patriot, que deveria para proteger contra Scuds recebidas, não conseguiu disparar um míssil. -Quando O Iraque invadiu o Kuwait, e na América lançou Desert Storm no início de 1991, Baterias de mísseis Patriot foram implantados para proteger a Arábia Saudita e Israel de ataques de mísseis Scud iraquianos. O Patriot é um médio alcance US superfície-ar do sistema fabricado pela empresa Raytheon. -The Tamanho do Patriot interceptor itself-- é cerca de cerca de 20 metros de comprimento, e pesa cerca de 2000 libras. E ele carrega uma ogiva de cerca, Eu acho que é cerca de 150 quilos. E a própria ogiva é um alto explosivo, que tem fragmentos em torno dele. Assim, o invólucro da ogiva projetado para agir como um chumbo grosso. -As Mísseis são realizados quatro por recipiente, e são transportados por um semi-reboque. -O Sistema Patriot anti-míssil remonta, pelo menos, 20 anos. Ele foi originalmente projetado como um míssil de defesa aérea para abater aviões inimigos. Na primeira Guerra do Golfo quando que a guerra veio, o Exército queria usá-lo para abater Scuds, e não aviões. A Força Aérea iraquiana foi não tanto de um problema, mas o Exército estava preocupado com Scuds. E assim eles tentaram atualizar o Patriot. -Intercepting Um inimigo míssil viajando a Mach 5 ia ser bastante difícil. Mas quando o Patriot foi levado às pressas em serviço, o Exército não tinha conhecimento de uma modificação do Iraque, que fizeram suas scuds quase impossível a ele. O que aconteceu é que os Scuds estavam chegando eram instáveis. Eles estavam bambas. A razão para isso foi o Iraqis-- a fim de obter 600 quilômetros para fora de uma gama missile-- 300 quilômetros levou peso de ogiva frente, e feitos a ogiva isqueiro. Portanto, agora o Patriot está tentando vir no Scud, e na maioria das tempo-- a esmagadora maioria do tempo-- seria apenas voar pelo Scud. -Depois Os operadores do sistema Patriot percebeu que o Patriot errou seu alvo, eles detonaram ogiva do Patriot para evitar possíveis acidentes se ele Deixou-se cair ao chão. Isso foi o que a maioria das pessoas viu como grandes bolas de fogo no céu, e entendido como intercepta de ogivas Scud. -Embora Nos céus noturnos, Patriots parecia estar a destruir sucesso Scuds, em Dhahran poderia haver Não se engane sobre o seu desempenho. Há sistema de radar do Patriot perdeu o controle de um Scud entrada e nunca lançado devido a uma falha de software. Foram os israelenses que descobriram que quanto maior for o sistema foi ligado, quanto maior a discrepância de tempo se tornou. Devido a um relógio incorporado no computador do sistema. -Acerca Duas semanas antes a tragédia em Dhahran, os israelenses relataram a o Departamento de Defesa que o sistema estava perdendo tempo. Depois de cerca de oito horas de correr, eles notaram que tornar-se o sistema de visivelmente menos preciso. O Departamento de Defesa respondeu contando todas as baterias Patriot para não deixar os sistemas por um longo período de tempo. Eles nunca disseram que há muito tempo era. 8 horas, 10 horas, de mil horas. Ninguém sabia. -The Bateria Patriot estacionada no quartel em Dhahran e sua falha interna relógio estava com mais de 100 horas na noite de 25 de fevereiro. -It Monitorados o tempo com uma precisão de cerca de um décimo de segundo. Agora, um décimo de segundo é um número interessante , porque não pode ser expressa em binário exatamente, o que , significa que não pode ser expresso exactamente em qualquer computador digital moderno. É difícil de acreditar, mas usar isso como um exemplo. Vamos dar o número de um terço. Um terceiro não pode ser expressa em decimal exatamente. Um terço é 0,333 passa para o infinito. Não há nenhuma maneira de fazer isso com precisão absoluta em um decimal. Esse é exatamente o tipo de problema que aconteceu no Patriot. Quanto mais tempo o sistema funcionou, o tornou-se pior do erro de tempo. -Depois 100 horas de operação, o erro no tempo foi apenas cerca de um terço de um segundo. Mas em termos de direcionamento de um míssil viajando a Mach 5, que resultou num rastreio de erro de mais de 600 metros. Seria um erro fatal para os soldados em Dhahran. O que aconteceu é o lançamento de um Scud foi detectada por satélites de alerta precoce, e sabiam que um Scud estava chegando em sua direção geral. Eles não sabiam de onde vinha. Era agora ao radar componente do sistema Patriot defender Dhahran para localizar e manter o controle do míssil inimigo de entrada. -The Radar era muito inteligente. Seria realmente rastrear a posição do Scud e, em seguida, prever onde provavelmente seria a próxima vez que o radar enviou um pulso para fora. Isso foi chamado ao portão intervalo. -Então Uma vez que o Patriot decide tem tempo suficiente passado para voltar e verificar a próxima localização para este objeto detectado ele vai voltar. Assim, quando se voltou para o mal lugar, em seguida, vê nenhum objeto. E ele decide que não havia nenhum objeto. Que havia uma falsa detecção e ele cai na pista. -The Entrada Scud desaparecido da tela do radar, e segundos mais tarde, ele se chocou contra o quartel. O Scud matou 28. Foi o último demitido durante a primeira Guerra do Golfo. Tragicamente, o software atualizado chegou na madrugada do dia seguinte. A falha de software teve sido fixado, o fechamento um capítulo na conturbada história do míssil Patriot. [FIM REPRODUÇÃO DE VÍDEO] DAVID J. MALAN: Isso é tudo para CS50. Vamos vê-lo na quarta-feira. [MÚSICA DE JOGO]