1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [MÚSICA DE JOGO] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 DAVID J. MALAN: Tudo bem. 5 00:00:12,660 --> 00:00:15,590 Este é CS50, e esta é o início da semana dois. 6 00:00:15,590 --> 00:00:19,120 Então, vamos começar hoje com um bug. 7 00:00:19,120 --> 00:00:20,974 Um bug, é claro, é uma erro em um programa, 8 00:00:20,974 --> 00:00:22,890 e você vai ter muito familiarizados com o conceito 9 00:00:22,890 --> 00:00:26,050 Se você nunca programou antes. pset0 e agora pset1. 10 00:00:26,050 --> 00:00:29,280 Mas vamos considerar algo um pouco simples à primeira vista. 11 00:00:29,280 --> 00:00:32,189 Este programa aqui que eu jogou em conjunto com antecedência, 12 00:00:32,189 --> 00:00:37,280 e eu afirmo que este deve imprimir 10 estrelas na tela usando printf, 13 00:00:37,280 --> 00:00:41,020 mas, aparentemente, com erros de alguma forma. 14 00:00:41,020 --> 00:00:45,370 >> Dado que a especificação que deve imprimir 10 estrelas, 15 00:00:45,370 --> 00:00:50,230 mas não faz aparentemente, o você teria a pretensão é o bug? 16 00:00:50,230 --> 00:00:52,004 Sim? 17 00:00:52,004 --> 00:00:54,420 Portanto, é um fora por um erro, eo que você quer dizer com isso? 18 00:00:54,420 --> 00:01:00,991 19 00:01:00,991 --> 00:01:01,490 Está bem. 20 00:01:01,490 --> 00:01:09,820 21 00:01:09,820 --> 00:01:10,410 Excelente. 22 00:01:10,410 --> 00:01:13,930 Então, nós temos um determinado valor igual a zero para iniciar i, 23 00:01:13,930 --> 00:01:18,399 e que tenha especificado um valor de n de 10, mas temos usado menos do que ou igual a. 24 00:01:18,399 --> 00:01:21,190 E a razão que este é duas personagens e não apenas um símbolo, 25 00:01:21,190 --> 00:01:22,630 como em um livro de matemática, é que você não tem 26 00:01:22,630 --> 00:01:24,880 uma forma de expressar o um equivalente de caracteres. 27 00:01:24,880 --> 00:01:28,450 >> Então isso significa que menos de, mas se você começar a contar do zero, 28 00:01:28,450 --> 00:01:31,690 mas você contar todo o caminho para cima através e igual a 10, 29 00:01:31,690 --> 00:01:34,170 você está, naturalmente, vai contar 11 coisas no total. 30 00:01:34,170 --> 00:01:35,900 E assim você vai imprimir 11 estrelas. 31 00:01:35,900 --> 00:01:37,990 Então, o que pode ser uma solução para isso? 32 00:01:37,990 --> 00:01:39,970 Sim? 33 00:01:39,970 --> 00:01:43,980 >> Então, basta ajustar a menos de ou igual a ser um pouco menos do que, 34 00:01:43,980 --> 00:01:46,250 e há, eu afirmo, talvez uma outra solução, também. 35 00:01:46,250 --> 00:01:47,210 O que pode mais que você faz? 36 00:01:47,210 --> 00:01:48,590 Sim? 37 00:01:48,590 --> 00:01:53,660 >> Então comece igualando-o a 1, e deixar a menos do que ou igual a. 38 00:01:53,660 --> 00:01:56,187 E, sinceramente, eu teria a pretensão que, para um ser humano típico, 39 00:01:56,187 --> 00:01:57,770 esta é provavelmente mais simples. 40 00:01:57,770 --> 00:02:00,280 Comece a contar em 1 e contar-se a 10. 41 00:02:00,280 --> 00:02:01,690 Essencialmente fazer o que você quer dizer. 42 00:02:01,690 --> 00:02:04,010 >> Mas a realidade é, em programação, como vimos, 43 00:02:04,010 --> 00:02:07,598 cientistas da computação e programadores geralmente não começar a contar do zero. 44 00:02:07,598 --> 00:02:09,389 E isso é bom uma vez você se acostumar com isso. 45 00:02:09,389 --> 00:02:12,640 A sua condição irá geralmente ser algo como menos de. 46 00:02:12,640 --> 00:02:14,910 Então simplesmente uma lógica erro que poderíamos agora 47 00:02:14,910 --> 00:02:17,990 corrigir e, finalmente, recompilar isso e obter apenas 10. 48 00:02:17,990 --> 00:02:19,610 >> Bem como sobre este erro aqui? 49 00:02:19,610 --> 00:02:24,200 Aqui, mais uma vez, afirmo que tenho uma meta de impressão 10 stars-- 50 00:02:24,200 --> 00:02:28,140 um por linha neste momento, mas isso não acontece. 51 00:02:28,140 --> 00:02:30,940 Antes de propor o que a correção é, o que faz isso 52 00:02:30,940 --> 00:02:34,640 imprimir visualmente, se eu fosse para compilar e executar este programa que você acha? 53 00:02:34,640 --> 00:02:35,140 Sim? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Star. 56 00:02:38,860 --> 00:02:41,690 Então, todas as estrelas no mesma linha é o que eu ouvi, 57 00:02:41,690 --> 00:02:43,391 e, em seguida, o caractere de nova linha. 58 00:02:43,391 --> 00:02:44,140 Então, vamos tentar isso. 59 00:02:44,140 --> 00:02:48,710 Então faça de buggy-1, entrar, e eu vejo o comando clang 60 00:02:48,710 --> 00:02:50,090 que falamos pela última vez. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, e na verdade eu vejo todas as 10 estrelas na mesma linha, mesmo que eu reclamo 62 00:02:55,180 --> 00:02:58,690 na minha especificação apenas um comentário em cima o código que eu pretendia fazer um por 63 00:02:58,690 --> 00:02:59,230 linha. 64 00:02:59,230 --> 00:03:00,580 Mas isso parece certo. 65 00:03:00,580 --> 00:03:04,620 >> Agora linha 15 parece que eu sou a impressão de uma estrela, e depois a linha 16 66 00:03:04,620 --> 00:03:06,620 parece que eu sou impressão um caractere de nova linha, 67 00:03:06,620 --> 00:03:09,560 e ambos estão tão recuados Estou dentro do loop de forma clara. 68 00:03:09,560 --> 00:03:13,610 Então, eu não deveria estar fazendo estrela, novo linha, estrela, nova linha, estrela, nova linha? 69 00:03:13,610 --> 00:03:14,110 Sim? 70 00:03:14,110 --> 00:03:18,430 71 00:03:18,430 --> 00:03:21,240 >> Sim, ao contrário de uma linguagem como Python, se você está familiarizado, 72 00:03:21,240 --> 00:03:23,540 reentrância não faz importa para o computador. 73 00:03:23,540 --> 00:03:25,280 Isso só importa para o ser humano. 74 00:03:25,280 --> 00:03:29,860 Então linhas enquanto que aqui eu inventei 15 e 16-- que parece bonito, 75 00:03:29,860 --> 00:03:31,330 mas o computador não liga. 76 00:03:31,330 --> 00:03:34,640 O computador se preocupa com realmente ter chaves 77 00:03:34,640 --> 00:03:36,310 em torno destas linhas de código. 78 00:03:36,310 --> 00:03:39,520 >> Assim que é clear-- assim como em Scratch-- que essas duas linhas de código 79 00:03:39,520 --> 00:03:40,450 deve ser executado. 80 00:03:40,450 --> 00:03:44,390 Como um daqueles quebra-zero amarelo pedaços de novo e de novo e de novo. 81 00:03:44,390 --> 00:03:50,920 >> Portanto, agora se eu re-executar esta program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 Eu tenho um erro agora. 83 00:03:51,770 --> 00:03:54,212 O que eu esqueci de fazer? 84 00:03:54,212 --> 00:03:55,420 Sim, então eu não compilá-lo. 85 00:03:55,420 --> 00:03:56,740 Então faça de buggy-2. 86 00:03:56,740 --> 00:03:59,840 Nenhum arquivo porque eu não fiz realmente compilar a segunda versão. 87 00:03:59,840 --> 00:04:04,860 Então agora interessante não declarado não variable-- 2. 88 00:04:04,860 --> 00:04:05,510 Estamos fazendo 1. 89 00:04:05,510 --> 00:04:11,050 Faça de buggy-1-- ./buggy-1-- e agora cada um deles está na mesma linha. 90 00:04:11,050 --> 00:04:13,880 >> Agora há uma exceção para esta suposta alegação de mina 91 00:04:13,880 --> 00:04:15,520 que você precisa dessas chaves. 92 00:04:15,520 --> 00:04:20,160 Quando é realmente ok-- se você tiver notado na seção ou textbooks-- 93 00:04:20,160 --> 00:04:22,130 omitir as chaves? 94 00:04:22,130 --> 00:04:22,630 Sim? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Exatamente. 97 00:04:26,870 --> 00:04:28,940 Quando há apenas uma linha de código que você 98 00:04:28,940 --> 00:04:32,830 quer para ser associado com a laço como no nosso primeiro exemplo. 99 00:04:32,830 --> 00:04:36,380 É perfeitamente legítimo omitir as chaves 100 00:04:36,380 --> 00:04:40,310 apenas como uma espécie de conveniência do compilador para você. 101 00:04:40,310 --> 00:04:40,810 Sim? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Boa pergunta. 104 00:04:43,930 --> 00:04:45,500 Seria considerado um erro de estilo? 105 00:04:45,500 --> 00:04:49,340 Gostaríamos promote-- como em CS50 guia de estilo, a URL para a qual 106 00:04:49,340 --> 00:04:51,926 em que é sempre pset1-- usar as chaves. 107 00:04:51,926 --> 00:04:53,550 Certamente, se você é novo na programação. 108 00:04:53,550 --> 00:04:56,800 A realidade é que não estamos vai proibi-lo 109 00:04:56,800 --> 00:04:58,680 de fazer essas conveniências. 110 00:04:58,680 --> 00:05:00,846 Mas se você está apenas começando para o balanço das coisas, 111 00:05:00,846 --> 00:05:04,020 absolutamente justo sempre usar o encaracolado chaves até você pegar o jeito dele. 112 00:05:04,020 --> 00:05:04,640 Boa pergunta. 113 00:05:04,640 --> 00:05:05,320 >> Tudo certo. 114 00:05:05,320 --> 00:05:07,660 Para que então era um bug. 115 00:05:07,660 --> 00:05:09,190 Pelo menos em uma coisa bastante simples. 116 00:05:09,190 --> 00:05:11,260 E ainda você pode pensar que isso é bastante rudimentar, certo? 117 00:05:11,260 --> 00:05:13,635 Esta é uma espécie da primeira semana de olhar para a linguagem 118 00:05:13,635 --> 00:05:14,890 como, ver os seus erros nele. 119 00:05:14,890 --> 00:05:17,250 Mas a realidade estes são realmente representativo 120 00:05:17,250 --> 00:05:20,310 de alguns problemas bastante assustadoras que podem surgir no mundo real. 121 00:05:20,310 --> 00:05:23,530 >> Então, alguns de vocês podem se lembrar se você seguir de notícias de tecnologia, 122 00:05:23,530 --> 00:05:25,740 ou talvez até mesmo pego vento desta em fevereiro 123 00:05:25,740 --> 00:05:29,434 do ano passado que a Apple tinha fez um pouco de um erro em ambos iOS, 124 00:05:29,434 --> 00:05:31,350 o sistema operacional em seus telefones, e também 125 00:05:31,350 --> 00:05:34,220 Mac OS, o sistema operacional em seus desktops e laptops. 126 00:05:34,220 --> 00:05:36,480 E você viu essas manchetes como esta. 127 00:05:36,480 --> 00:05:41,120 E depois disso, a Apple prometeu para corrigir esse bug, 128 00:05:41,120 --> 00:05:45,950 e muito rapidamente fez corrigi-lo no iOS, mas, em seguida, em última análise, fixa-lo no Mac OS 129 00:05:45,950 --> 00:05:46,810 bem. 130 00:05:46,810 --> 00:05:50,370 >> Agora nenhuma dessas manchetes sozinho realmente revelam que o problema subjacente era, 131 00:05:50,370 --> 00:05:55,640 mas o erro foi finalmente reduzida para um bug no SSL, Secure Sockets Layer. 132 00:05:55,640 --> 00:05:57,390 E short longo da história, este é o software 133 00:05:57,390 --> 00:06:01,030 que os nossos navegadores e outros software usado para fazer o quê? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Se eu disse que é SSL envolvido, sempre que você 136 00:06:06,860 --> 00:06:13,920 visitar uma URL que começa com HTTPS, então o que pode estar relacionado com SSL? 137 00:06:13,920 --> 00:06:14,580 Criptografia. 138 00:06:14,580 --> 00:06:16,470 Então vamos falar sobre isso nos próximos dias. 139 00:06:16,470 --> 00:06:18,750 Criptografia, a arte de codificação de informação. 140 00:06:18,750 --> 00:06:22,200 >> Mas short longo da história, a Apple há algum tempo atrás havia cometido um erro 141 00:06:22,200 --> 00:06:25,970 na implementação da SSL, o software que implementa, em última análise 142 00:06:25,970 --> 00:06:30,120 URLs como HTTPS ou max conexões lá também. 143 00:06:30,120 --> 00:06:32,850 O resultado disso é que o seu conexões poderia potencialmente 144 00:06:32,850 --> 00:06:33,920 ser interceptado. 145 00:06:33,920 --> 00:06:37,130 E eram os seus contatos não necessariamente encriptada 146 00:06:37,130 --> 00:06:40,350 se você tinha algum bandido no meio você eo site de destino que 147 00:06:40,350 --> 00:06:42,170 soube tirar proveito disso. 148 00:06:42,170 --> 00:06:45,090 >> Agora, a Apple, em última análise postada Uma correção para esse fim, 149 00:06:45,090 --> 00:06:46,920 ea descrição de sua correção foi isso. 150 00:06:46,920 --> 00:06:49,878 Transporte seguro não conseguiu validar a autenticidade da conexão. 151 00:06:49,878 --> 00:06:52,920 A questão foi abordada por restaurando passos de validação desaparecidas. 152 00:06:52,920 --> 00:06:57,250 >> Portanto, esta é uma explicação muito ondulado mão para simplesmente dizer que errou. 153 00:06:57,250 --> 00:07:00,920 Há, literalmente, um linha de código que foi de buggy 154 00:07:00,920 --> 00:07:05,130 na implementação da SSL, e se você ir online e pesquisa para este 155 00:07:05,130 --> 00:07:07,210 você pode realmente encontrar o código-fonte original. 156 00:07:07,210 --> 00:07:11,960 Por exemplo, esta é uma captura de tela apenas uma porção de um ficheiro bastante grande, 157 00:07:11,960 --> 00:07:15,965 mas esta é uma função chamada aparentemente SSL verificar a troca de chaves do servidor sinal. 158 00:07:15,965 --> 00:07:17,840 E ele tem um monte de argumentos e insumos. 159 00:07:17,840 --> 00:07:20,298 E nós não estamos indo para se concentrar muito sobre a minúcia lá, 160 00:07:20,298 --> 00:07:24,390 mas se você se concentrar no código dentro de que na extremidade superior function-- vamos 161 00:07:24,390 --> 00:07:25,590 ampliar isso. 162 00:07:25,590 --> 00:07:28,140 Você já deve suspeitar que o erro pode 163 00:07:28,140 --> 00:07:31,230 ser mesmo se você não tem idéia em última análise, o que você está olhando. 164 00:07:31,230 --> 00:07:35,924 Há uma espécie de anomalia aqui, que é o que? 165 00:07:35,924 --> 00:07:38,940 >> Sim, eu realmente não gosto o olhar de dois empreendedores falhar. 166 00:07:38,940 --> 00:07:42,060 Francamente, eu não sei realmente o que Goto falhar meios, mas tendo dois deles 167 00:07:42,060 --> 00:07:42,810 back to back. 168 00:07:42,810 --> 00:07:45,290 Isso meio que me esfrega intelectualmente o caminho errado, 169 00:07:45,290 --> 00:07:48,910 e, na verdade, se aumentar o zoom em apenas aquelas linhas, este é C. 170 00:07:48,910 --> 00:07:52,220 >> Então, um monte de código da Apple está-se escrito em C, 171 00:07:52,220 --> 00:07:55,780 e isso, aparentemente, é realmente equivalent-- 172 00:07:55,780 --> 00:07:59,060 não para que muito em recuo versão, mas se você reconhecer o fato 173 00:07:59,060 --> 00:08:02,560 que não há chaves, o que A Apple realmente escreveu foi o código que parece 174 00:08:02,560 --> 00:08:03,540 assim. 175 00:08:03,540 --> 00:08:07,080 Então eu ampliada para fora e eu só fixa o recuo no sentido 176 00:08:07,080 --> 00:08:10,690 que, se não há chaves, que Ir à segunda falha que está em amarelo 177 00:08:10,690 --> 00:08:12,500 vai executar, não importa o quê. 178 00:08:12,500 --> 00:08:15,540 Não é associado com o se a condição acima dela. 179 00:08:15,540 --> 00:08:19,590 >> Assim mesmo, novamente, se você não muito entender o que isso poderia 180 00:08:19,590 --> 00:08:23,230 estar fazendo, sei que cada um deles conditions-- cada uma destas linhas 181 00:08:23,230 --> 00:08:26,180 é um passo muito importante no processo de verificação 182 00:08:26,180 --> 00:08:28,350 se seus dados são de fato criptografado. 183 00:08:28,350 --> 00:08:31,710 Assim, saltando um desses passos, não é a melhor idéia. 184 00:08:31,710 --> 00:08:34,840 >> Mas porque temos esta segunda empreendedores falham em amarelo, 185 00:08:34,840 --> 00:08:36,840 e porque, uma vez que tipo de esteticamente 186 00:08:36,840 --> 00:08:40,480 movê-lo para a esquerda, onde ele logicamente é, no momento, o que 187 00:08:40,480 --> 00:08:43,230 que isso significa para a linha de código abaixo que segundo Goto 188 00:08:43,230 --> 00:08:46,480 deixar que você acha? 189 00:08:46,480 --> 00:08:48,860 Ele sempre vai ser ignorada. 190 00:08:48,860 --> 00:08:52,100 Então gotos são geralmente desaprovado por razões que não vai realmente entrar, 191 00:08:52,100 --> 00:08:54,940 e mesmo em CS50 não tendem para ensinar esta Goto declaração, 192 00:08:54,940 --> 00:08:58,130 mas você pode pensar em Goto falhar no sentido de ir de salto 193 00:08:58,130 --> 00:08:59,600 a outra parte do código. 194 00:08:59,600 --> 00:09:03,120 >> Em outras palavras pular esta última linha completamente, 195 00:09:03,120 --> 00:09:07,420 e de modo que o resultado desta burro simples erro que foi apenas 196 00:09:07,420 --> 00:09:10,330 um resultado provavelmente alguém copiando e colando um também 197 00:09:10,330 --> 00:09:14,150 muitas vezes é que o inteiro segurança do iOS e Mac OS 198 00:09:14,150 --> 00:09:18,240 era vulnerável à interceptação por bandidos por algum tempo. 199 00:09:18,240 --> 00:09:19,940 Até que a Apple finalmente resolveu esse. 200 00:09:19,940 --> 00:09:23,100 >> Agora, se alguns de vocês são realmente executando versões antigas do iOS ou Mac OS, 201 00:09:23,100 --> 00:09:27,250 você pode ir para gotofail.com que é um site que alguém configurar 202 00:09:27,250 --> 00:09:29,190 para determinar essencialmente programaticamente 203 00:09:29,190 --> 00:09:30,980 Se o seu computador ainda está vulnerável. 204 00:09:30,980 --> 00:09:33,600 E, francamente, se for, provavelmente é uma boa idéia 205 00:09:33,600 --> 00:09:36,870 para atualizar seu telefone ou seu Mac neste momento. 206 00:09:36,870 --> 00:09:40,120 Mas lá, apenas prova de quão uma apreciação destes nível mais baixo 207 00:09:40,120 --> 00:09:42,400 detalhes e bastante idéias simples pode realmente 208 00:09:42,400 --> 00:09:44,590 traduzir-se em decisões e os problemas que 209 00:09:44,590 --> 00:09:47,320 affected-- neste caso-- milhões de pessoas. 210 00:09:47,320 --> 00:09:49,107 >> Agora, uma palavra sobre a administração. 211 00:09:49,107 --> 00:09:50,690 Seção terá início no próximo domingo. 212 00:09:50,690 --> 00:09:53,360 Você receberá um e-mail pelo fim de semana sobre a seção, em que ponto 213 00:09:53,360 --> 00:09:55,290 o processo de ressecção começará se você tiver 214 00:09:55,290 --> 00:09:56,998 percebi que você tem agora alguns novos conflitos. 215 00:09:56,998 --> 00:10:00,180 Então, isso acontece todos os anos, e nós acomodará nos dias que virão. 216 00:10:00,180 --> 00:10:02,430 >> Escritório horas-- fazer manter um olho nesse horário aqui. 217 00:10:02,430 --> 00:10:05,100 Muda um pouco esta semana, especialmente a hora de início 218 00:10:05,100 --> 00:10:08,180 ea localização, assim que consultar que antes de ir para o horário de expediente 219 00:10:08,180 --> 00:10:09,520 qualquer um dos próximos quatro noites. 220 00:10:09,520 --> 00:10:12,680 E agora uma palavra sobre a avaliação, particularmente como você mergulhar no problema 221 00:10:12,680 --> 00:10:14,350 define um e além. 222 00:10:14,350 --> 00:10:17,070 >> Assim, segundo a especificação, estes são geralmente 223 00:10:17,070 --> 00:10:20,360 Os eixos podemos avaliar o seu trabalho. 224 00:10:20,360 --> 00:10:23,170 Escopo refere-se ao que medida seus implementos código 225 00:10:23,170 --> 00:10:25,690 os recursos necessários pela nossa especificação. 226 00:10:25,690 --> 00:10:28,290 Em outras palavras, quanto um conjunto de peças que você fez morder. 227 00:10:28,290 --> 00:10:30,440 Você fez um terço do mesmo, uma metade, a 100% do mesmo. 228 00:10:30,440 --> 00:10:33,000 Mesmo que isso não é correto, quanto é que você tentar? 229 00:10:33,000 --> 00:10:35,290 Assim que capta o nível do esforço e da quantidade 230 00:10:35,290 --> 00:10:38,260 para que você mordeu a problemas problema do aparelho. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- este, para que ponto, é o seu código 232 00:10:40,690 --> 00:10:43,150 consistente com nossa especificações e livres de erros. 233 00:10:43,150 --> 00:10:44,770 Assim é que funciona corretamente? 234 00:10:44,770 --> 00:10:48,700 Se dermos alguma entrada, não é nos dar o resultado que esperamos? 235 00:10:48,700 --> 00:10:52,570 Desígnio de agora este é o primeiro de os particularmente qualitativas 236 00:10:52,570 --> 00:10:56,180 ou os que exigem o julgamento humano. 237 00:10:56,180 --> 00:10:59,690 E, de fato, é por isso que temos uma equipe de tantos companheiros de ensino e curso 238 00:10:59,690 --> 00:11:00,350 assistentes. 239 00:11:00,350 --> 00:11:03,480 Até que ponto a sua código escrito bem? 240 00:11:03,480 --> 00:11:05,810 >> E mais uma vez este é um muito avaliação qualitativa 241 00:11:05,810 --> 00:11:09,100 que irá trabalhar com você em bidirecional nas próximas semanas. 242 00:11:09,100 --> 00:11:12,060 De modo que quando você não conseguir pontuação apenas numérico, mas também 243 00:11:12,060 --> 00:11:16,682 um partituras escritas, ou feedback digitado, ou feedback escrito em palavras em inglês. 244 00:11:16,682 --> 00:11:19,640 Isso é o que vamos usar para levá-lo para realmente escrever um código melhor. 245 00:11:19,640 --> 00:11:23,320 E na palestra e seção, vamos tentar para apontar out-- tão frequentemente como nós posso-- 246 00:11:23,320 --> 00:11:26,420 o que faz um programa não só correcto e funcionalmente boa, 247 00:11:26,420 --> 00:11:28,200 mas também bem desenhado. 248 00:11:28,200 --> 00:11:31,850 O mais eficiente que pode ser, ou mesmo a mais bela que pode ser. 249 00:11:31,850 --> 00:11:33,100 >> O que nos leva ao estilo. 250 00:11:33,100 --> 00:11:36,876 Estilo em última análise é um juízo estético. 251 00:11:36,876 --> 00:11:38,750 Você escolheu bem nomes para as variáveis? 252 00:11:38,750 --> 00:11:40,330 Você recuado o código corretamente? 253 00:11:40,330 --> 00:11:44,010 Será que uma boa aparência e, portanto, é mais fácil para outro ser humano 254 00:11:44,010 --> 00:11:46,550 a ler o seu respectivo de sua correção. 255 00:11:46,550 --> 00:11:50,300 >> Agora geralmente por o plano de estudos, marcamos essas coisas em uma escala de cinco pontos. 256 00:11:50,300 --> 00:11:53,640 E deixe-me martelar a ponto que é de facto um bom três. 257 00:11:53,640 --> 00:11:55,550 Muito rapidamente que o pessoal do começar a fazer aritmética. 258 00:11:55,550 --> 00:11:58,133 Quando chegar a três de cinco na correção por algum pset 259 00:11:58,133 --> 00:12:02,040 e eles acham que nada, eu vou para 60% o qual é essencialmente um D ou um E. 260 00:12:02,040 --> 00:12:03,980 >> Essa não é a maneira que nós pensar nesses números. 261 00:12:03,980 --> 00:12:06,880 A três é realmente bom, eo que nós em geral esperam que no início 262 00:12:06,880 --> 00:12:09,820 do termo é que, se você está recebendo um bando de three's-- talvez um par 263 00:12:09,820 --> 00:12:12,540 de feiras, um par de fours-- ou um par de pares, um par de fours-- 264 00:12:12,540 --> 00:12:13,748 isso é um bom lugar para começar. 265 00:12:13,748 --> 00:12:16,320 E enquanto vemos uma trajetória ascendente ao longo do tempo, 266 00:12:16,320 --> 00:12:18,540 você está em um lugar particularmente bom. 267 00:12:18,540 --> 00:12:20,752 >> A fórmula que usamos para coisas de peso é essencialmente 268 00:12:20,752 --> 00:12:22,710 este acordo com o plano de estudos, o que significa apenas que nós 269 00:12:22,710 --> 00:12:24,750 dar mais peso à correção. 270 00:12:24,750 --> 00:12:27,930 Porque é muito frequentemente correção que leva mais tempo. 271 00:12:27,930 --> 00:12:28,760 Confie em mim agora. 272 00:12:28,760 --> 00:12:31,190 Você vai find-- pelo menos em que um pset-- 273 00:12:31,190 --> 00:12:36,790 gastar 90% do seu tempo trabalhando em 10% do problema. 274 00:12:36,790 --> 00:12:39,320 >> E tudo o tipo de obras com exceção de um ou dois erros, 275 00:12:39,320 --> 00:12:41,570 e esses são os erros que mantê-lo até tarde da noite. 276 00:12:41,570 --> 00:12:43,380 Aqueles são os que espécie de escapar de você. 277 00:12:43,380 --> 00:12:45,560 Mas depois de dormir sobre ele, ou a participar de horário de expediente 278 00:12:45,560 --> 00:12:48,844 ou fazer perguntas on-line, é quando você chegar a essa meta de 100%, 279 00:12:48,844 --> 00:12:50,760 e é por isso que o peso CORREÇÃO mais. 280 00:12:50,760 --> 00:12:54,102 Projete um pouco menos, e estilo um pouco menos do que isso. 281 00:12:54,102 --> 00:12:56,060 Mas tenha em estilo mente-- É talvez a mais fácil 282 00:12:56,060 --> 00:12:58,890 destes para morder de acordo com o guia de estilo. 283 00:12:58,890 --> 00:13:01,580 >> E agora, a mais grave nota na honestidade acadêmica. 284 00:13:01,580 --> 00:13:05,000 CS50 tem a infeliz distinção de sendo o maior produtor de placa do anúncio 285 00:13:05,000 --> 00:13:07,330 casos, quase todos os anos historicamente. 286 00:13:07,330 --> 00:13:11,012 Isto não é porque os alunos trapacear em CS50 mais do que qualquer outra classe, 287 00:13:11,012 --> 00:13:13,720 mas porque pela natureza do trabalho, o fato de que é eletrônico, 288 00:13:13,720 --> 00:13:16,636 o fato de que nós olhamos para ele, e o fato de que são cientistas da computação, 289 00:13:16,636 --> 00:13:20,570 Eu posso dizer que, infelizmente, são muito bons em detectar isso. 290 00:13:20,570 --> 00:13:22,710 >> Então, o que isso significa em termos reais? 291 00:13:22,710 --> 00:13:24,820 Por isso, conforme o plano de estudos, filosofia do curso 292 00:13:24,820 --> 00:13:28,090 realmente se resume a ser razoável. 293 00:13:28,090 --> 00:13:31,684 Existe essa linha entre fazendo seu trabalho por conta própria 294 00:13:31,684 --> 00:13:34,100 e obter um pouco de ajuda razoável de um amigo, 295 00:13:34,100 --> 00:13:38,020 e definitivas fazendo esse trabalho para o seu amigo, ou enviar-lhe o seu código 296 00:13:38,020 --> 00:13:41,080 de modo que ele ou ela pode simplesmente pegar ou pegar emprestado certo. 297 00:13:41,080 --> 00:13:43,580 E que cruza a linha que tirado da classe. 298 00:13:43,580 --> 00:13:45,410 >> Veja, o plano de estudos em última instância, para as linhas 299 00:13:45,410 --> 00:13:48,209 que traçamos como sendo razoável e comportamento irracional, 300 00:13:48,209 --> 00:13:50,000 mas realmente ferver até a essência 301 00:13:50,000 --> 00:13:53,980 do seu trabalho a necessidade de ser o seu próprio no final. 302 00:13:53,980 --> 00:13:56,230 Agora, com o que disse, há uma heurística. 303 00:13:56,230 --> 00:13:58,980 Porque, como você pode imagine-- do horário de expediente e os recursos visuais 304 00:13:58,980 --> 00:14:01,060 e os videos que mostrado assim far-- CS50 305 00:14:01,060 --> 00:14:04,530 é de fato a intenção de ser tão colaborativo e como cooperativa e como sociais 306 00:14:04,530 --> 00:14:06,450 quanto possível. 307 00:14:06,450 --> 00:14:08,570 Como colaboração, pois é rigorosa. 308 00:14:08,570 --> 00:14:11,314 >> Mas, com isso dito, a heurística, como você verá no currículo, 309 00:14:11,314 --> 00:14:12,980 é que quando você está tendo algum problema. 310 00:14:12,980 --> 00:14:16,470 Você tem algum bug no código que você não pode resolver, é razoável para você 311 00:14:16,470 --> 00:14:18,039 para mostrar o código para outra pessoa. 312 00:14:18,039 --> 00:14:21,080 Um amigo até mesmo na classe, um amigo sentado ao seu lado no horário de expediente, 313 00:14:21,080 --> 00:14:22,680 ou um membro do pessoal. 314 00:14:22,680 --> 00:14:25,810 Mas eles não podem mostrar seu código para você. 315 00:14:25,810 --> 00:14:27,710 >> Em outras palavras, um responder à sua pergunta-- 316 00:14:27,710 --> 00:14:29,940 Preciso ajudar-- não é oh, aqui está o meu código. 317 00:14:29,940 --> 00:14:32,440 Dê uma olhada neste e deduzir a partir dela o que quiser. 318 00:14:32,440 --> 00:14:34,580 Agora, é claro, não há uma maneira claramente ao jogo 319 00:14:34,580 --> 00:14:37,760 este sistema em que eu vou lhe mostrar meu código antes de ter uma causa. 320 00:14:37,760 --> 00:14:40,150 Você me mostrar o meu código antes de ter uma causa. 321 00:14:40,150 --> 00:14:45,870 Mas veja o programa novamente para o pequenos detalhes de onde essa linha é. 322 00:14:45,870 --> 00:14:50,606 >> Só agora pintar o quadro e compartilhar mais transparente possível 323 00:14:50,606 --> 00:14:53,480 onde estamos, nos últimos anos, este é o número de casos de placa do anúncio 324 00:14:53,480 --> 00:14:56,260 CS50 que teve mais Nos últimos sete anos. 325 00:14:56,260 --> 00:14:58,717 Com 14 casos neste outono mais recente. 326 00:14:58,717 --> 00:15:01,300 Em termos dos alunos envolvidos, que era há 20 alguns alunos ímpares 327 00:15:01,300 --> 00:15:02,490 no outono passado. 328 00:15:02,490 --> 00:15:05,670 Houve um pico de 33 alunos há alguns anos. 329 00:15:05,670 --> 00:15:08,830 Muitos dos quais, infelizmente, são não está mais aqui no campus. 330 00:15:08,830 --> 00:15:13,100 >> Os alunos envolvidos como uma percentagem do classe historicamente variou de 0% 331 00:15:13,100 --> 00:15:17,300 para 5,3%, que é só para dizer isto é, anualmente, um desafio. 332 00:15:17,300 --> 00:15:20,390 E para esse fim, o que nós queremos fazer é transmitir uma 333 00:15:20,390 --> 00:15:24,310 que apenas dd-- FYI-- comparar a uma justiça para os alunos que 334 00:15:24,310 --> 00:15:26,520 estão seguindo a linha de acordo. 335 00:15:26,520 --> 00:15:29,620 Fazemos comparar todos os atuais submissões contra todas as missões passadas 336 00:15:29,620 --> 00:15:30,840 dos últimos muitos anos. 337 00:15:30,840 --> 00:15:33,620 >> Sabemos também como a Google ao redor e encontrar repositórios de código 338 00:15:33,620 --> 00:15:36,360 on-line, fóruns de discussão online, sites de emprego on-line. 339 00:15:36,360 --> 00:15:41,580 Se um aluno pode encontrá-lo, nós podemos seguramente encontrá-lo tanto quanto nós com pesar fazer. 340 00:15:41,580 --> 00:15:45,330 Então, o que você vai ver no programa porém, é esta cláusula arrependimento. 341 00:15:45,330 --> 00:15:47,500 Eu posso certamente apreciar, e todos nós tem 342 00:15:47,500 --> 00:15:50,870 equipe ter feito o curso como este, ou um esta-se ao longo do tempo, 343 00:15:50,870 --> 00:15:53,997 certamente sabe o que é como quando vida fica no caminho quando você tem 344 00:15:53,997 --> 00:15:56,080 alguns tarde da noite deadline-- não só nesta classe, 345 00:15:56,080 --> 00:15:58,660 mas another-- quando você está completamente exaustos, estressados, 346 00:15:58,660 --> 00:16:00,659 têm um número excessivo de outras coisas para fazer. 347 00:16:00,659 --> 00:16:03,660 Você vai fazer em algum momento da vida, certamente, um mau, talvez tarde 348 00:16:03,660 --> 00:16:04,620 decisão noite. 349 00:16:04,620 --> 00:16:06,520 >> Então, por o plano de estudos, existe esta cláusula, 350 00:16:06,520 --> 00:16:10,629 tal que, se no prazo de 72 horas depois de fazer algum pobre de decisão, você possui até ele 351 00:16:10,629 --> 00:16:12,670 e estender a mão para mim e um dos cabeças do curso 352 00:16:12,670 --> 00:16:14,300 e vamos ter uma conversa. 353 00:16:14,300 --> 00:16:16,220 Nós vamos lidar com as coisas internamente na esperança 354 00:16:16,220 --> 00:16:18,770 de se tornar mais um momento de ensino ou lição de vida, 355 00:16:18,770 --> 00:16:22,120 e não algo com ramificações particularmente drásticas 356 00:16:22,120 --> 00:16:24,570 como você pode ver nestas cartas aqui. 357 00:16:24,570 --> 00:16:26,540 >> Então, isso é um tom muito sério. 358 00:16:26,540 --> 00:16:29,960 Detenhamo-nos para apenas alguns segundos para quebrar a tensão. 359 00:16:29,960 --> 00:16:34,442 >> [MÚSICA DE JOGO] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> DAVID J. MALAN: Tudo bem, Então, como foi que para um segue? 362 00:17:20,250 --> 00:17:22,059 Para tópicos principais de hoje. 363 00:17:22,059 --> 00:17:23,859 O primeiro dos quais é abstracção. 364 00:17:23,859 --> 00:17:26,900 Outro dos quais vai ser o representação de dados, que, francamente, 365 00:17:26,900 --> 00:17:31,640 é realmente uma maneira seca de dizer como podemos ir sobre como resolver problemas e pensar 366 00:17:31,640 --> 00:17:33,250 sobre a resolução de problemas? 367 00:17:33,250 --> 00:17:37,285 Então você já viu em risco, e você tem talvez já visto na pset1 com C 368 00:17:37,285 --> 00:17:39,930 que você não só pode usar funções, como printf 369 00:17:39,930 --> 00:17:42,770 que outras pessoas em ano passado escrevi para você. 370 00:17:42,770 --> 00:17:45,340 Você também pode escrever suas próprias funções. 371 00:17:45,340 --> 00:17:48,440 >> E mesmo que você não pode ter feito isso em C, e, francamente, em pset1 372 00:17:48,440 --> 00:17:51,866 você realmente não precisa escrever a sua porque a própria função problema-- 373 00:17:51,866 --> 00:17:53,990 embora talvez difícil no primeiro glance-- você verá 374 00:17:53,990 --> 00:17:57,910 em última instância, pode ser resolvido com Nem tudo o que muitas linhas de código. 375 00:17:57,910 --> 00:18:01,140 Mas com o que disse, em termos de escrever sua própria função, 376 00:18:01,140 --> 00:18:03,570 perceber que dá C você esta capacidade. 377 00:18:03,570 --> 00:18:06,940 >> Eu estou indo para ir no código-fonte de hoje, que já está disponível on-line, 378 00:18:06,940 --> 00:18:10,900 e eu estou indo para ir em frente e aberto um programa chamado função 0.C, 379 00:18:10,900 --> 00:18:14,620 e em função zero vamos ver algumas coisas. 380 00:18:14,620 --> 00:18:19,160 Em primeiras linhas 18 a 23 é a minha função principal. 381 00:18:19,160 --> 00:18:22,414 E agora que estamos começando a ler código que não está escrevendo no momento, 382 00:18:22,414 --> 00:18:25,080 mas ao invés disso eu tenho escrito com antecedência ou que em um conjunto de problemas 383 00:18:25,080 --> 00:18:27,910 recebêssemos ter foi escrito com antecedência. 384 00:18:27,910 --> 00:18:30,040 Uma boa maneira de começar leitura de código de outra pessoa 385 00:18:30,040 --> 00:18:31,400 é olhar para a função principal. 386 00:18:31,400 --> 00:18:34,420 Descobrir onde essa entrada objetivo é executar o programa, 387 00:18:34,420 --> 00:18:36,580 e depois segui-lo logicamente de lá. 388 00:18:36,580 --> 00:18:40,190 >> Portanto, este programa aparentemente impressões seu nome seguido de dois pontos. 389 00:18:40,190 --> 00:18:42,490 Em seguida, usamos GetString a partir da biblioteca de CS50 390 00:18:42,490 --> 00:18:46,050 para obter uma string, ou uma palavra ou frase do usuário no teclado. 391 00:18:46,050 --> 00:18:48,390 E depois há este coisa printName aqui--. 392 00:18:48,390 --> 00:18:51,420 >> Agora não é um printName função que vem com C. 393 00:18:51,420 --> 00:18:52,970 Não é em io.h. padrão 394 00:18:52,970 --> 00:18:55,570 Não é em CS50.h. 395 00:18:55,570 --> 00:18:57,880 É um pouco no mesmo arquivo. 396 00:18:57,880 --> 00:19:01,000 Observe se eu rolar para baixo Linhas bit-- 25 para 27-- 397 00:19:01,000 --> 00:19:05,330 é apenas uma maneira muito de comentar seu código usando as estrelas e barras. 398 00:19:05,330 --> 00:19:07,320 Este é um sistema multi-linha comentar, e este é apenas 399 00:19:07,320 --> 00:19:10,570 minha descrição em azul de o que esta função faz. 400 00:19:10,570 --> 00:19:14,530 >> Porque nas linhas 28 a 31, Eu escrevi uma função super simples 401 00:19:14,530 --> 00:19:16,280 cujo nome é printName. 402 00:19:16,280 --> 00:19:19,560 Leva quantos argumentos que você diria? 403 00:19:19,560 --> 00:19:25,120 Então, um argument-- porque há um argumento listados dentro dos parênteses. 404 00:19:25,120 --> 00:19:27,000 O tipo de que é String. 405 00:19:27,000 --> 00:19:30,240 O que significa dizer printName é como essa caixa preta 406 00:19:30,240 --> 00:19:32,910 ou função que recebe como entrada um string. 407 00:19:32,910 --> 00:19:35,730 >> E o nome dessa cadeia convenientemente será Nome. 408 00:19:35,730 --> 00:19:37,840 Não é, não N, menos no nome. 409 00:19:37,840 --> 00:19:41,090 Então, o que printName fazer? 410 00:19:41,090 --> 00:19:42,210 É bom simples. 411 00:19:42,210 --> 00:19:45,390 Assim como uma linha de código para o printf, mas, aparentemente, 412 00:19:45,390 --> 00:19:47,950 imprime "Olá", assim e assim. 413 00:19:47,950 --> 00:19:50,070 Onde o modo e de forma vem do argumento. 414 00:19:50,070 --> 00:19:52,300 >> Agora, isso não é uma grande inovação aqui. 415 00:19:52,300 --> 00:19:56,710 Realmente, eu tomei um programa que poderia ter sido escrito com uma linha de código 416 00:19:56,710 --> 00:20:00,190 colocando isso aqui acima, e mudou para algo 417 00:20:00,190 --> 00:20:04,920 que envolve cerca de seis ou sete anos ou menos linhas de código por todo o caminho até aqui. 418 00:20:04,920 --> 00:20:08,190 >> Mas é a prática de um princípio conhecido como abstração. 419 00:20:08,190 --> 00:20:12,550 Tipo de encapsulação no interior de um novo função que tem um nome, e melhor 420 00:20:12,550 --> 00:20:14,590 ainda que o nome literalmente diz que ele faz. 421 00:20:14,590 --> 00:20:16,880 Quero dizer printf-- isso não é particularmente descritiva. 422 00:20:16,880 --> 00:20:18,932 Se eu quiser criar um parte do enigma, ou se eu 423 00:20:18,932 --> 00:20:21,140 deseja criar uma função que imprime o nome de alguém, 424 00:20:21,140 --> 00:20:23,230 a beleza de fazer isso é que eu posso realmente 425 00:20:23,230 --> 00:20:27,170 dar essa função um nome que descreve o que ele faz. 426 00:20:27,170 --> 00:20:29,844 >> Agora que leva, em que uma entrada Eu arbitrariamente chamado nome, 427 00:20:29,844 --> 00:20:32,760 mas isso também é maravilhosamente descritivo em vez de ser um pouco mais 428 00:20:32,760 --> 00:20:36,140 genérico como S. E vazio, por agora, apenas significa 429 00:20:36,140 --> 00:20:38,330 que esta função não entregar-me de volta nada. 430 00:20:38,330 --> 00:20:41,127 Não é como GetString que literalmente me dá de volta a cadeia 431 00:20:41,127 --> 00:20:43,960 como fizemos com os pedaços de papel com seus colegas na semana passada, 432 00:20:43,960 --> 00:20:45,990 mas em vez disso, apenas tem um efeito colateral. 433 00:20:45,990 --> 00:20:48,080 Ela imprime algo na tela. 434 00:20:48,080 --> 00:20:53,880 >> Assim, no final do dia, se eu fazem função de 0, ./function-0, 435 00:20:53,880 --> 00:20:55,450 veremos que ele pede para o meu nome. 436 00:20:55,450 --> 00:20:58,150 Eu digito David, e os tipos meu nome. 437 00:20:58,150 --> 00:21:01,080 Se eu fizer isso de novo com Rob, ele vai dizer "Olá, Rob." 438 00:21:01,080 --> 00:21:04,280 Então, uma idéia simples, mas talvez extrapolar a partir deste mentalmente 439 00:21:04,280 --> 00:21:06,750 que, como seus programas obter um pouco mais complicado, 440 00:21:06,750 --> 00:21:10,290 e você quer escrever um pedaço de código e chamadas que code-- invoke 441 00:21:10,290 --> 00:21:13,270 code-- que por algum descritiva nome como printName, 442 00:21:13,270 --> 00:21:15,600 C faz nos proporcionar essa capacidade. 443 00:21:15,600 --> 00:21:17,660 >> Aqui está outro exemplo simples. 444 00:21:17,660 --> 00:21:22,940 Por exemplo, se eu abrir um arquivo a partir de hoje chamado return.c, 445 00:21:22,940 --> 00:21:24,270 perceber o que eu fiz aqui. 446 00:21:24,270 --> 00:21:26,330 A maior parte dessa função principal é printf. 447 00:21:26,330 --> 00:21:30,360 Eu primeiro arbitrariamente inicializar um variável chamada x para o número 2. 448 00:21:30,360 --> 00:21:34,110 Eu, então, imprimir "x é agora % I "passando o valor de x. 449 00:21:34,110 --> 00:21:35,500 Então, eu só estou dizendo que ele é. 450 00:21:35,500 --> 00:21:37,208 >> Agora eu sou apenas corajosamente afirmando com printf. 451 00:21:37,208 --> 00:21:42,050 Estou cubing que o valor x, e eu sou fazê-lo, chamando uma função 452 00:21:42,050 --> 00:21:45,590 chamado passagem cubo em x como argumento, 453 00:21:45,590 --> 00:21:49,300 e, em seguida, salvar a saída na própria variável, x. 454 00:21:49,300 --> 00:21:51,340 Então, eu estou derrotando o valor de x. 455 00:21:51,340 --> 00:21:53,380 Estou substituindo o valor de x com o que 456 00:21:53,380 --> 00:21:56,510 o resultado da chamada esta função cubo é. 457 00:21:56,510 --> 00:21:59,530 E então eu apenas imprimir algumas material fofo aqui dizendo o que eu fiz. 458 00:21:59,530 --> 00:22:01,600 >> Então, o que é cubo? 459 00:22:01,600 --> 00:22:03,510 Observe o que é fundamentalmente diferente aqui. 460 00:22:03,510 --> 00:22:05,540 Eu dei a função um nome como antes. 461 00:22:05,540 --> 00:22:08,270 Eu especifiquei um nome para um argumento. 462 00:22:08,270 --> 00:22:11,650 Desta vez, ele é chamado de n em vez de nome, mas eu poderia chamá-lo de qualquer coisa que eu quero. 463 00:22:11,650 --> 00:22:12,650 Mas isso é diferente. 464 00:22:12,650 --> 00:22:14,080 Essa coisa do lado esquerdo. 465 00:22:14,080 --> 00:22:16,290 Antes, era o que palavra-chave? 466 00:22:16,290 --> 00:22:16,870 Rapazes. 467 00:22:16,870 --> 00:22:18,580 Agora é obviamente int. 468 00:22:18,580 --> 00:22:20,630 >> Então o que é, talvez, o tirar? 469 00:22:20,630 --> 00:22:24,090 Considerando significa vazios tipo de nada, e que era o caso. 470 00:22:24,090 --> 00:22:25,970 PrintName retornou nada. 471 00:22:25,970 --> 00:22:27,942 Ele fez alguma coisa, mas não me devolver 472 00:22:27,942 --> 00:22:30,650 algo que eu poderia colocar no lado esquerdo de um sinal de igual 473 00:22:30,650 --> 00:22:32,460 como eu fiz aqui na linha 22. 474 00:22:32,460 --> 00:22:36,780 >> Então, se eu digo para a linha 30, o que é isso, provavelmente, o que implica 475 00:22:36,780 --> 00:22:38,610 sobre o cubo faz por mim? 476 00:22:38,610 --> 00:22:41,110 Sim? 477 00:22:41,110 --> 00:22:42,310 Ele retorna um inteiro. 478 00:22:42,310 --> 00:22:44,590 Por isso, me passa para trás, para exemplo, um pedaço de papel 479 00:22:44,590 --> 00:22:46,580 em que se tem escrito a resposta. 480 00:22:46,580 --> 00:22:50,130 2 ao cubo, ou 3 ao cubo, ou 4 cubed-- tudo o que eu passei em, 481 00:22:50,130 --> 00:22:51,540 e como eu implementar isso? 482 00:22:51,540 --> 00:22:54,810 Bem, só n vezes n vezes n É assim que eu poderia um cubo de valor. 483 00:22:54,810 --> 00:22:57,110 Então, novamente, super simples idéia, mas demonstrativa 484 00:22:57,110 --> 00:23:00,100 agora como podemos escrever funções que, na verdade, tinha-nos de volta 485 00:23:00,100 --> 00:23:02,380 valores que possam ser de interesse. 486 00:23:02,380 --> 00:23:05,740 >> Vejamos um último exemplo aqui chamado de função um. 487 00:23:05,740 --> 00:23:08,530 Neste exemplo, ele começa para obter mais atraente. 488 00:23:08,530 --> 00:23:12,400 Assim, em função de um, esta aviso program-- em última instância 489 00:23:12,400 --> 00:23:14,920 chama uma função chamada GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt não é um função na biblioteca CS50, 491 00:23:17,800 --> 00:23:20,400 mas decidimos gostaria que ele existe. 492 00:23:20,400 --> 00:23:24,550 >> Então, se deslocar para baixo no final do arquivo, Observe como eu fui sobre a implementação de 493 00:23:24,550 --> 00:23:26,560 obter int positivo, e eu dizer que é mais atraente 494 00:23:26,560 --> 00:23:28,992 porque este é um decente Número de linhas de código. 495 00:23:28,992 --> 00:23:30,700 Não é apenas um tolo pequeno programa brinquedo. 496 00:23:30,700 --> 00:23:33,870 É realmente tem alguma verificação de erros e fazer algo mais útil. 497 00:23:33,870 --> 00:23:38,470 >> Então, se você não viu o passo a passo vídeos que temos incorporado em pset1, 498 00:23:38,470 --> 00:23:42,350 sei que este é um tipo de laço em C, semelhante em espírito 499 00:23:42,350 --> 00:23:44,270 para os tipos de coisas Raspadinha pode fazer. 500 00:23:44,270 --> 00:23:46,320 E faça diz fazer isso. 501 00:23:46,320 --> 00:23:47,500 Imprima esta fora. 502 00:23:47,500 --> 00:23:51,860 Então vá em frente e obter n-- obter um int e armazená-lo em n, 503 00:23:51,860 --> 00:23:55,760 e continuar fazendo isso de novo e de novo e de de novo, desde que n seja inferior a um. 504 00:23:55,760 --> 00:23:58,720 >> Assim, n vai ser menor do que um somente se o humano não está cooperando. 505 00:23:58,720 --> 00:24:01,980 Se ele ou ela está escrevendo em 0 ou -1 ou -50, 506 00:24:01,980 --> 00:24:04,790 este ciclo vai continuar execução de novo e de novo. 507 00:24:04,790 --> 00:24:07,549 E, finalmente, perceber, eu simplesmente devolver o valor. 508 00:24:07,549 --> 00:24:09,590 Então, agora nós temos uma função que teria sido bom 509 00:24:09,590 --> 00:24:14,040 CS50 se implementaria em CS50.h e CS50.c para você, 510 00:24:14,040 --> 00:24:16,520 mas aqui podemos agora implementar isso nós mesmos. 511 00:24:16,520 --> 00:24:19,230 >> Mas dois comentários sobre alguns detalhes importantes. 512 00:24:19,230 --> 00:24:24,390 Um-- por que eu declarar int n, você acha que, na linha 29 513 00:24:24,390 --> 00:24:27,139 em vez de apenas fazer este aqui, que é 514 00:24:27,139 --> 00:24:28,930 mais consistente com o que fizemos na semana passada? 515 00:24:28,930 --> 00:24:29,430 Sim? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 Um bom pensamento. 518 00:24:35,110 --> 00:24:37,080 Então, se fôssemos para colocá-lo aqui, é como se estivéssemos 519 00:24:37,080 --> 00:24:39,110 manter declarando-o uma e outra vez. 520 00:24:39,110 --> 00:24:42,000 Isso por si só é não problemática, por si só, 521 00:24:42,000 --> 00:24:43,940 porque nós só precisamos o valor de uma vez e, em seguida, 522 00:24:43,940 --> 00:24:45,330 vamos começar um novo de qualquer maneira. 523 00:24:45,330 --> 00:24:45,940 Mas um bom pensamento. 524 00:24:45,940 --> 00:24:46,440 Sim? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Fechar. 527 00:24:53,330 --> 00:24:59,030 Então porque eu tenho declarado n em A linha 29, fora do circuito, 528 00:24:59,030 --> 00:25:01,390 é acessível em todo esta função inteira. 529 00:25:01,390 --> 00:25:05,400 Nem as outras funções porque n ainda está dentro destes crespos 530 00:25:05,400 --> 00:25:06,470 suspensórios aqui. 531 00:25:06,470 --> 00:25:07,940 Assim-- certeza. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Exatamente. 534 00:25:12,940 --> 00:25:14,356 Então, isso é ainda mais direto ao ponto. 535 00:25:14,356 --> 00:25:18,600 Se em vez declarada n aqui na linha 32, 536 00:25:18,600 --> 00:25:22,340 é problemático porque palpite onde mais eu precisar acessá-lo? 537 00:25:22,340 --> 00:25:25,620 Na linha 34, e o simples regra de ouro é 538 00:25:25,620 --> 00:25:30,060 que você só pode usar uma variável dentro das mais recentes chaves 539 00:25:30,060 --> 00:25:31,420 em que você declarou. 540 00:25:31,420 --> 00:25:35,230 >> Infelizmente, linha 34 é uma linha muito tarde, 541 00:25:35,230 --> 00:25:38,560 porque eu já fechado a chaveta na linha 33 542 00:25:38,560 --> 00:25:41,220 que corresponde ao chaveta na linha 30. 543 00:25:41,220 --> 00:25:44,180 E por isso esta é uma maneira de dizer que esta variável int tem como escopo, 544 00:25:44,180 --> 00:25:46,970 por assim dizer, a apenas dentro dessas chaves. 545 00:25:46,970 --> 00:25:48,910 Ele simplesmente não existe fora deles. 546 00:25:48,910 --> 00:25:51,580 >> Então, na verdade, se eu fizer isso errado, deixe-me salvar o código do 547 00:25:51,580 --> 00:25:53,530 pois é-- incorrectamente escrito. 548 00:25:53,530 --> 00:25:57,990 Deixe-me ir em frente e fazem função-1, e erro notice--. 549 00:25:57,990 --> 00:26:03,502 Utilização de identificador de n não declarado na linha 35, que está aqui. 550 00:26:03,502 --> 00:26:05,210 E se rolar para cima ainda, um outro. 551 00:26:05,210 --> 00:26:08,750 Utilização de não declarado identificador n na linha 34. 552 00:26:08,750 --> 00:26:11,200 >> Assim, o compilador, Clang, é de notar que ele só 553 00:26:11,200 --> 00:26:13,720 não existe apesar claramente que ele está lá visualmente. 554 00:26:13,720 --> 00:26:16,090 Assim, uma solução simples é declará-lo lá. 555 00:26:16,090 --> 00:26:18,790 >> Agora deixe-me rolar para o início do processo. 556 00:26:18,790 --> 00:26:21,080 O que salta à vista como ser um pouco diferente 557 00:26:21,080 --> 00:26:23,070 a partir de coisas que olhamos na semana passada? 558 00:26:23,070 --> 00:26:26,990 Não só eu tenho nome, não só Eu tenho alguns afiada inclui em cima, 559 00:26:26,990 --> 00:26:29,340 Eu tenho algo que eu sou chamando um protótipo. 560 00:26:29,340 --> 00:26:36,100 Agora que parece muito semelhante ao que acabamos de ver há pouco na linha 27. 561 00:26:36,100 --> 00:26:39,230 >> Então, vamos inferir a partir de uma diferente mensagem de erro por que eu fiz isso. 562 00:26:39,230 --> 00:26:42,050 Deixe-me ir em frente e excluir essas linhas lá. 563 00:26:42,050 --> 00:26:44,240 E assim, não sabemos nada sobre protótipo. 564 00:26:44,240 --> 00:26:45,430 Refaça esse arquivo. 565 00:26:45,430 --> 00:26:46,890 Faça uma função. 566 00:26:46,890 --> 00:26:48,090 E agora, droga, quatro erros. 567 00:26:48,090 --> 00:26:50,220 Vamos percorrer até o primeiro. 568 00:26:50,220 --> 00:26:55,070 >> Declaração implícita da função obter int positivo é inválida no C99. 569 00:26:55,070 --> 00:26:57,780 C99 significa apenas a 1999 versão da linguagem 570 00:26:57,780 --> 00:26:59,710 C, que é o que estamos de fato usando. 571 00:26:59,710 --> 00:27:01,050 Então o que isso significa? 572 00:27:01,050 --> 00:27:05,250 Bem C-- e mais especificamente C compilers-- são programas muito burro. 573 00:27:05,250 --> 00:27:07,420 Eles só sabem o que você tem disse a eles, e isso é 574 00:27:07,420 --> 00:27:08,960 na verdade temática da semana passada. 575 00:27:08,960 --> 00:27:12,910 >> O problema é que se eu for sobre a implementação de nome aqui, 576 00:27:12,910 --> 00:27:17,640 e eu chamo uma função chamada GetPositiveInt aqui na linha 20, 577 00:27:17,640 --> 00:27:22,520 função que tecnicamente não faz existe até o compilador vê a linha 27. 578 00:27:22,520 --> 00:27:25,450 Infelizmente, o compilador é fazer as coisas top, para baixo, esquerda, direita, 579 00:27:25,450 --> 00:27:29,580 assim porque não viu o implementação de GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 mas vê-lo tentando para usá-lo aqui, 581 00:27:32,400 --> 00:27:35,810 é só ir para bail-- grite você com um erro message-- talvez 582 00:27:35,810 --> 00:27:38,440 enigmático, e na verdade não compilar o arquivo. 583 00:27:38,440 --> 00:27:41,940 >> Assim, uma chamada protótipo até aqui é reconhecidamente redundante. 584 00:27:41,940 --> 00:27:47,870 Literalmente, eu desci aqui e eu copiei e colado isso, e eu colocá-lo aqui. 585 00:27:47,870 --> 00:27:51,020 Vazio seria mais adequada, por isso vamos literalmente copiar e colá-lo desta vez. 586 00:27:51,020 --> 00:27:52,854 Eu literalmente copiado e colado. 587 00:27:52,854 --> 00:27:54,270 Realmente, assim como como uma migalha de pão. 588 00:27:54,270 --> 00:27:56,260 >> Uma pequena pista para o compilador. 589 00:27:56,260 --> 00:27:58,860 Eu não sei o que isso faz ainda, mas eu estou prometendo para você 590 00:27:58,860 --> 00:28:00,260 que existirá eventualmente. 591 00:28:00,260 --> 00:28:04,010 E é por isso que este linha-- em 16-- linha termina com um ponto e vírgula. 592 00:28:04,010 --> 00:28:05,486 É redundante por design. 593 00:28:05,486 --> 00:28:05,986 Sim? 594 00:28:05,986 --> 00:28:11,340 595 00:28:11,340 --> 00:28:14,360 >> Se você não vincular sua biblioteca para o-- oh, boa pergunta. 596 00:28:14,360 --> 00:28:17,350 Afiado inclui inclusões de arquivo de cabeçalho. 597 00:28:17,350 --> 00:28:20,040 Precisa ser-- deve quase estar sempre no topo 598 00:28:20,040 --> 00:28:23,270 do arquivo para um similar-- para exatamente a mesma razão, sim. 599 00:28:23,270 --> 00:28:26,430 Porque na norma io.h é, literalmente, uma linha 600 00:28:26,430 --> 00:28:30,560 desta maneira, mas com a palavra printf, e com seus argumentos e seu tipo de retorno. 601 00:28:30,560 --> 00:28:33,310 E assim fazendo afiada incluem-se aqui, o que você está literalmente fazendo 602 00:28:33,310 --> 00:28:36,380 está copiando e colando o conteúdo de alguém escreveu em cima. 603 00:28:36,380 --> 00:28:39,660 Desse modo cluing seu código para o facto de as funções existem. 604 00:28:39,660 --> 00:28:40,160 Sim? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Absolutamente. 607 00:28:48,260 --> 00:28:51,690 Assim, um muito inteligente e correta solução seria, você sabe o quê? 608 00:28:51,690 --> 00:28:53,760 Eu não sei o que é um protótipo é, mas eu sei 609 00:28:53,760 --> 00:28:56,390 se eu entender que C é apenas mudo e repensa cima para baixo. 610 00:28:56,390 --> 00:28:57,820 Bem, vamos dar-lhe o que ele quer. 611 00:28:57,820 --> 00:29:01,650 Vamos cortar esse código, cole-o superior, e agora empurrar principal abaixo. 612 00:29:01,650 --> 00:29:03,470 Isto também resolveria o problema. 613 00:29:03,470 --> 00:29:07,409 >> Mas você pode facilmente chegar a um cenário em que um precisa chamar B, 614 00:29:07,409 --> 00:29:10,075 e talvez B chama de volta para A. Este é algo chamado recursão, 615 00:29:10,075 --> 00:29:11,370 e vamos voltar a isso. 616 00:29:11,370 --> 00:29:13,911 E isso pode ou não ser um bom coisa, mas você pode definitivamente 617 00:29:13,911 --> 00:29:15,110 quebrar esta solução. 618 00:29:15,110 --> 00:29:17,690 >> E além disso, eu o faria afirmam estilisticamente, 619 00:29:17,690 --> 00:29:20,760 especialmente quando seus programas tornar este longo e isso por muito tempo, 620 00:29:20,760 --> 00:29:23,064 é só super conveniente colocar principal no topo 621 00:29:23,064 --> 00:29:25,730 porque é a coisa mais programadores vão se preocupar. 622 00:29:25,730 --> 00:29:28,150 E por isso é um pouco mais limpo, sem dúvida, fazê-lo da maneira 623 00:29:28,150 --> 00:29:30,380 Originalmente, eu fiz isso mesmo com um protótipo 624 00:29:30,380 --> 00:29:33,396 embora pareça um pouco redundante à primeira vista. 625 00:29:33,396 --> 00:29:33,895 Sim? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Desculpe, você pode falar mais alto? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Se você alternar os locais do implementação eo protótipo? 630 00:29:49,580 --> 00:29:51,270 Então essa é uma boa pergunta. 631 00:29:51,270 --> 00:29:53,780 Se você voltar a declarar esse baixo aqui, vamos ver o que acontece. 632 00:29:53,780 --> 00:29:55,530 Então, se eu colocar isso para baixo aqui, você está dizendo. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Oh, desculpe. 635 00:29:58,360 --> 00:29:58,859 Louder? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Ainda mais alto. 638 00:30:04,011 --> 00:30:04,760 Ah, boa pergunta. 639 00:30:04,760 --> 00:30:05,860 Será que invalida a função? 640 00:30:05,860 --> 00:30:08,901 Sabe, depois de todos esses anos, eu nunca colocar um protótipo depois. 641 00:30:08,901 --> 00:30:13,810 Então vamos fazer fazer a função-1 depois de fazer isso. 642 00:30:13,810 --> 00:30:15,279 >> [Murmurando] 643 00:30:15,279 --> 00:30:16,320 DAVID J. MALAN: Oh, espere. 644 00:30:16,320 --> 00:30:17,944 Nós ainda temos que colocar tudo em cima. 645 00:30:17,944 --> 00:30:21,400 Então, vamos fazer isso aqui em cima, se eu sou entender sua pergunta corretamente. 646 00:30:21,400 --> 00:30:24,700 Estou colocando tudo, inclusive o protótipo acima principal, 647 00:30:24,700 --> 00:30:28,180 mas eu estou colocando o protótipo a seguir à aplicação. 648 00:30:28,180 --> 00:30:33,190 >> Então se eu fizer um, eu estou recebendo volta de um error-- utilizada variável n. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Oh, não. 651 00:30:37,860 --> 00:30:38,360 Obrigado. 652 00:30:38,360 --> 00:30:39,430 Vamos ver, vamos nos livrar disso. 653 00:30:39,430 --> 00:30:41,304 Isso é um bug diferente, então vamos ignorar isso. 654 00:30:41,304 --> 00:30:43,910 Vamos muito rapidamente refazer este. 655 00:30:43,910 --> 00:30:48,100 >> OK, então o argumento dados não utilizado pelo formato de Cordas 656 00:30:48,100 --> 00:30:52,310 n-- oh, isso é porque Mudei para estes aqui. 657 00:30:52,310 --> 00:30:55,885 Tudo bem, nós sabemos qual é a resposta vai para-- tudo bem, aqui vamos nós. 658 00:30:55,885 --> 00:31:00,560 Ah, obrigado pela positiva. 659 00:31:00,560 --> 00:31:03,430 Tudo bem, eu vou corrigir esse código depois-- ignorar esse bug em particular 660 00:31:03,430 --> 00:31:08,300 uma vez que este estava-- funciona é a resposta. 661 00:31:08,300 --> 00:31:11,560 >> Por isso, não substituir o que você acabou de fazer. 662 00:31:11,560 --> 00:31:14,800 Eu suspeito que o compilador é escrito de forma 663 00:31:14,800 --> 00:31:18,420 que ele está ignorando o seu protótipo porque o corpo, por assim dizer, 664 00:31:18,420 --> 00:31:20,922 da função já tiver foram implementados mais acima. 665 00:31:20,922 --> 00:31:23,380 Eu teria que realmente consultar o manual do compilador 666 00:31:23,380 --> 00:31:26,171 para entender se há qualquer outra implicação, mas à primeira vista 667 00:31:26,171 --> 00:31:29,290 apenas por tentar e experimentar, parece haver nenhum impacto. 668 00:31:29,290 --> 00:31:30,730 Boa pergunta. 669 00:31:30,730 --> 00:31:33,660 >> Então, vamos seguir em frente agora, movendo-se longe de efeitos colaterais que 670 00:31:33,660 --> 00:31:36,660 são funções que fazem algo como visualmente na tela com printf, 671 00:31:36,660 --> 00:31:38,090 mas não retorna um valor. 672 00:31:38,090 --> 00:31:41,550 E funções que têm retorno valores como a que acabamos de ver alguns dos. 673 00:31:41,550 --> 00:31:45,350 Já vimos essa noção de espaço, e vamos ver isso de novo e de novo. 674 00:31:45,350 --> 00:31:47,210 Mas, por agora, mais uma vez, use a regra de ouro 675 00:31:47,210 --> 00:31:51,410 uma variável que só pode ser usado dentro dos mais recentemente inaugurado 676 00:31:51,410 --> 00:31:54,350 e chaves fechadas como nós vi nesse exemplo particular. 677 00:31:54,350 --> 00:31:56,910 >> E, como você disse, existe uma ability-- 678 00:31:56,910 --> 00:32:00,040 você poderia resolver alguns desses problemas colocando uma variável global 679 00:32:00,040 --> 00:32:01,290 no topo de um arquivo. 680 00:32:01,290 --> 00:32:03,630 Mas, em quase todos os casos teríamos que desaprovam, 681 00:32:03,630 --> 00:32:06,170 e na verdade nem mesmo ir em que a solução para agora. 682 00:32:06,170 --> 00:32:09,890 Então, por agora, o takeaway é que variáveis ​​têm essa noção de escopo. 683 00:32:09,890 --> 00:32:13,430 >> Mas agora vamos olhar para outro via seca de realmente olhar 684 00:32:13,430 --> 00:32:15,810 em algum bem interessante detalhes de implementação. 685 00:32:15,810 --> 00:32:17,810 Como podemos representar informações. 686 00:32:17,810 --> 00:32:20,370 E nós já olhou para este na primeira semana de aula. 687 00:32:20,370 --> 00:32:23,320 Olhando para os binários e lembrando-nos de decimal. 688 00:32:23,320 --> 00:32:28,310 >> Mas lembre-se de na semana passada que C tem diferentes tipos de dados e cachos mais, 689 00:32:28,310 --> 00:32:30,600 mas as mais úteis por enquanto pode ser estes. 690 00:32:30,600 --> 00:32:36,030 Um char, ou caráter, o que acontece a ser um byte, ou oito bits total. 691 00:32:36,030 --> 00:32:40,060 E isso quer dizer que o tamanho de um char é apenas um byte. 692 00:32:40,060 --> 00:32:45,370 Um byte tem oito bits, então isto significa que podemos representar quantos caracteres. 693 00:32:45,370 --> 00:32:47,320 Quantas cartas ou símbolos do teclado 694 00:32:47,320 --> 00:32:49,210 se temos um byte ou oito bits. 695 00:32:49,210 --> 00:32:51,546 Pense de volta a semana zero. 696 00:32:51,546 --> 00:32:53,420 Se você tem oito bits, quantos valores totais 697 00:32:53,420 --> 00:32:55,503 você pode representar com padrões de zeros e uns? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 Um-- mais do que isso. 700 00:33:00,260 --> 00:33:03,490 Assim, 256 total, se você comece a contar a partir de zero. 701 00:33:03,490 --> 00:33:07,120 Então se você tem oito bits-- isso, se nós tivemos nossas lâmpadas binários aqui de novo, 702 00:33:07,120 --> 00:33:12,180 podemos transformar essas lâmpadas em e fora em qualquer um dos 256 padrões únicos. 703 00:33:12,180 --> 00:33:13,640 >> Agora isso é um pouco problemático. 704 00:33:13,640 --> 00:33:16,857 Não tanto para Inglês e línguas românicas, mas certamente 705 00:33:16,857 --> 00:33:19,190 quando você introduz, por instância, idiomas asiáticos, que 706 00:33:19,190 --> 00:33:22,580 têm muito mais símbolos do que como 26 letras do alfabeto. 707 00:33:22,580 --> 00:33:24,390 Na verdade, talvez seja necessário mais do que um byte. 708 00:33:24,390 --> 00:33:28,240 E, felizmente, em últimos anos tem sociedade 709 00:33:28,240 --> 00:33:31,040 outros padrões adotados que usam mais do que um byte por carga. 710 00:33:31,040 --> 00:33:34,210 >> Mas, por enquanto, em C, o padrão é apenas um byte ou oito bits. 711 00:33:34,210 --> 00:33:38,195 Um inteiro, entretanto, é de quatro bytes, também conhecida como 32 bits. 712 00:33:38,195 --> 00:33:41,320 O que significa que é o maior possível número que pode representar com um int 713 00:33:41,320 --> 00:33:41,820 aparentemente? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Com um bilhão. 716 00:33:45,050 --> 00:33:46,760 Portanto, é de quatro bilhões mais ou menos. 717 00:33:46,760 --> 00:33:49,840 2 à potência 32th, se não assumem números negativos 718 00:33:49,840 --> 00:33:52,530 e só usar todos positivos números, é de quatro bilhões 719 00:33:52,530 --> 00:33:53,730 mais ou menos possibilidades. 720 00:33:53,730 --> 00:33:57,890 Uma flutuação, por sua vez, é um tipo diferente do tipo de dados em C. Ainda é um número, 721 00:33:57,890 --> 00:33:58,990 mas é um número real. 722 00:33:58,990 --> 00:34:00,660 Algo com um ponto decimal. 723 00:34:00,660 --> 00:34:03,000 E verifica-se que C também utiliza quatro bytes 724 00:34:03,000 --> 00:34:05,340 para representar valores de ponto flutuante. 725 00:34:05,340 --> 00:34:09,420 >> Infelizmente quantos flutuante valores dos pontos existem no mundo? 726 00:34:09,420 --> 00:34:11,582 Quantos números reais existem? 727 00:34:11,582 --> 00:34:13,540 Há um infinito número, e para que o assunto 728 00:34:13,540 --> 00:34:15,164 há um número infinito de números inteiros. 729 00:34:15,164 --> 00:34:18,070 Por isso, já é meio cavando um buraco nos aqui. 730 00:34:18,070 --> 00:34:21,780 Pelas quais, aparentemente, em computers-- em menos programas escritos em C em eles-- 731 00:34:21,780 --> 00:34:24,110 só pode contar além de quatro bilhões mais ou menos, 732 00:34:24,110 --> 00:34:26,260 e valores de ponto flutuante só pode, aparentemente, 733 00:34:26,260 --> 00:34:28,330 ter alguma quantidade finita de precisão. 734 00:34:28,330 --> 00:34:30,810 Apenas tantos dígitos após o ponto decimal. 735 00:34:30,810 --> 00:34:32,822 >> Porque, é claro, se você só tem 32 bits, 736 00:34:32,822 --> 00:34:36,030 Eu não sei como vamos proceder para representando Números de reais provavelmente 737 00:34:36,030 --> 00:34:37,409 com diferentes tipos de padrões. 738 00:34:37,409 --> 00:34:40,030 Mas há certamente uma finita número de tais padrões, 739 00:34:40,030 --> 00:34:41,830 por isso, também aqui, isso é problemático. 740 00:34:41,830 --> 00:34:43,710 >> Agora podemos evitar o problema um pouco. 741 00:34:43,710 --> 00:34:45,710 Se você não usar um carro alegórico, você poderia usar um duplo 742 00:34:45,710 --> 00:34:50,230 em C, o que lhe dá oito bytes, que é a maneira mais padrões possíveis de zeros 743 00:34:50,230 --> 00:34:50,730 e uns. 744 00:34:50,730 --> 00:34:55,199 Mas ainda é finita, o que está acontecendo a ser problemático se você escrever software 745 00:34:55,199 --> 00:34:57,670 para gráficos ou de fantasia fórmulas matemáticas. 746 00:34:57,670 --> 00:35:00,410 Então você pode realmente querem contar-se maior do que isso. 747 00:35:00,410 --> 00:35:05,640 A named-- longo long-- estupidamente também é de oito bytes, ou 64 bits, 748 00:35:05,640 --> 00:35:10,260 e este é o dobro do tempo como um int, e é para um valor inteiro longo. 749 00:35:10,260 --> 00:35:15,655 >> Fact-- Fun se um int é de quatro bytes, quanto tempo é um tempo em C normalmente? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 Também quatro bytes, mas um long long é de oito bytes, 752 00:35:21,560 --> 00:35:23,050 e isso é por razões históricas. 753 00:35:23,050 --> 00:35:26,450 >> Mas o takeaway agora É justo que os dados têm 754 00:35:26,450 --> 00:35:29,625 para ser representado em um Computador-- que é um dispositivo físico com eletricidade, 755 00:35:29,625 --> 00:35:32,190 é geralmente condução esses zeros e ones-- 756 00:35:32,190 --> 00:35:34,320 com quantidades finitas de precisão. 757 00:35:34,320 --> 00:35:35,620 Então, qual é o problema, então? 758 00:35:35,620 --> 00:35:37,480 >> Bem, há um problema de integer overflow. 759 00:35:37,480 --> 00:35:39,780 Não apenas em C, mas em computadores em geral. 760 00:35:39,780 --> 00:35:42,590 Por exemplo, se esta é um byte a pena uma bit-- 761 00:35:42,590 --> 00:35:45,120 por isso, se este é de oito bit-- tudo dos quais são o número um. 762 00:35:45,120 --> 00:35:47,300 Que número é esse representando se assumirmos 763 00:35:47,300 --> 00:35:50,730 é todos os valores positivos em binário? 764 00:35:50,730 --> 00:35:54,410 >> 255, e não é 256, porque zero é o número mais baixo. 765 00:35:54,410 --> 00:35:56,760 Assim, 255 é o maior um, mas o problema 766 00:35:56,760 --> 00:36:00,330 é supor que eu queria incrementar esta variável que 767 00:36:00,330 --> 00:36:04,030 está usando oito bits total se eu quiser incrementá-lo. 768 00:36:04,030 --> 00:36:07,160 >> Bem assim que eu adicionar um um para todos estes, 769 00:36:07,160 --> 00:36:10,500 talvez você possa imaginar visually-- apenas como levar a um usando decimals-- 770 00:36:10,500 --> 00:36:12,300 alguma coisa vai fluir para a esquerda. 771 00:36:12,300 --> 00:36:15,590 E, de fato, se eu adicionar o número um para isso, o que acontece em binário 772 00:36:15,590 --> 00:36:17,670 é que ele transborda de volta para zero. 773 00:36:17,670 --> 00:36:21,730 >> Então, se você apenas não use-- um int, mas um único byte de contagem inteiros 774 00:36:21,730 --> 00:36:27,170 de um programa, por default-- logo você começa a 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 vem depois de 255, o que provavelmente não é o que é 776 00:36:32,710 --> 00:36:34,790 um usuário vai esperar. 777 00:36:34,790 --> 00:36:39,620 >> Agora, entretanto, no mundo de ponto flutuante, você também tem um problema semelhante. 778 00:36:39,620 --> 00:36:42,670 Não tanto com o maior number-- embora isso ainda é um problema. 779 00:36:42,670 --> 00:36:45,360 Mas, com o valor de precisão que você pode representar. 780 00:36:45,360 --> 00:36:49,490 Então, vamos dar uma olhada neste exemplo Também aqui a partir code-- fonte de hoje 781 00:36:49,490 --> 00:36:52,070 flutuar-0.c. 782 00:36:52,070 --> 00:36:54,280 >> E note que é um super programa simples que 783 00:36:54,280 --> 00:36:56,580 deve, aparentemente, imprimir o valor? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 O que você apostar que isso vai imprimir mesmo que não haja um pouco de nova sintaxe 786 00:37:04,110 --> 00:37:05,540 aqui? 787 00:37:05,540 --> 00:37:06,700 Portanto, esperamos que 0,1. 788 00:37:06,700 --> 00:37:10,000 Assim, o equivalente a um décimo porque eu estou fazendo 1 dividido por 10. 789 00:37:10,000 --> 00:37:12,430 Eu estou armazenando a resposta em uma variável chamada f. 790 00:37:12,430 --> 00:37:15,850 Essa variável é do tipo float, que é uma palavra-chave que acabou de propor existiu. 791 00:37:15,850 --> 00:37:18,910 >> Nós não vimos isso antes, mas esta é uma espécie de uma maneira pura em printf 792 00:37:18,910 --> 00:37:22,110 especifique quantos dígitos você quero ver depois de um ponto decimal. 793 00:37:22,110 --> 00:37:25,020 Portanto, esta notação significa apenas que aqui é um espaço reservado. 794 00:37:25,020 --> 00:37:27,900 É para um ponto flutuante valor, e oh, a propósito, 795 00:37:27,900 --> 00:37:31,389 mostram que com o ponto decimal com um número depois do ponto decimal. 796 00:37:31,389 --> 00:37:33,180 Então esse é o número de algarismos significativos, 797 00:37:33,180 --> 00:37:34,650 por assim dizer, que você pode querer. 798 00:37:34,650 --> 00:37:40,450 >> Então deixe-me ir em frente e fazer fazer bóia-0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 e, aparentemente, 1 dividido por 10 é de 0,0. 800 00:37:46,660 --> 00:37:47,760 Agora, por que é isso? 801 00:37:47,760 --> 00:37:51,380 >> Bem novamente, o computador está a tomar me literalmente, e eu escrevi um 802 00:37:51,380 --> 00:37:56,680 e escrevi 10, e dar um palpite que é o tipo de dados assumida por aqueles dois 803 00:37:56,680 --> 00:37:58,440 valores? 804 00:37:58,440 --> 00:38:00,970 Um int, é tecnicamente algo um pouco diferente. 805 00:38:00,970 --> 00:38:04,150 É tipicamente um longo, mas é em última análise, um valor integral. 806 00:38:04,150 --> 00:38:06,030 Não é um valor de ponto flutuante. 807 00:38:06,030 --> 00:38:09,456 >> O que significa dizer que, se este é um int e este é um int, 808 00:38:09,456 --> 00:38:11,830 o problema é que o computador não têm a capacidade 809 00:38:11,830 --> 00:38:13,680 até mesmo para armazenar esse ponto decimal. 810 00:38:13,680 --> 00:38:16,430 Então, quando você faz uma dividida por 10 usando números inteiros 811 00:38:16,430 --> 00:38:20,950 tanto para o numerador eo denominador, a resposta deve ser 0,1. 812 00:38:20,950 --> 00:38:24,930 Mas porque o Computador-- esses são integers-- 813 00:38:24,930 --> 00:38:27,430 não sabe o que fazer com o 0.1. 814 00:38:27,430 --> 00:38:30,010 >> Então, o que está claramente a fazer? 815 00:38:30,010 --> 00:38:33,120 É só jogá-la fora, eo que eu estou vendo, em última instância 816 00:38:33,120 --> 00:38:38,830 é de 0,0 só porque eu insisti que printf me mostrar um ponto decimal. 817 00:38:38,830 --> 00:38:41,740 Mas o problema é que se dividir um número inteiro de um número inteiro, 818 00:38:41,740 --> 00:38:44,347 você vai get-- por definição C-- de um inteiro. 819 00:38:44,347 --> 00:38:46,680 E não vai fazer algo agradável e convenientemente 820 00:38:46,680 --> 00:38:49,040 como em volta dele até o mais próxima de um para cima ou para baixo. 821 00:38:49,040 --> 00:38:51,860 Vai truncar tudo após o decimal. 822 00:38:51,860 --> 00:38:54,030 >> Então, só de forma intuitiva, o que é provavelmente uma correção? 823 00:38:54,030 --> 00:38:55,351 Qual é a solução mais simples aqui? 824 00:38:55,351 --> 00:38:55,850 Sim? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Exatamente. 827 00:39:01,100 --> 00:39:04,200 Por que nós não apenas tratá-los como valores de ponto flutuante de forma eficaz 828 00:39:04,200 --> 00:39:05,860 transformando-os em carros alegóricos ou duplos. 829 00:39:05,860 --> 00:39:10,500 E agora, se eu faço carros alegóricos-0, ou se eu compilar bóias-1, 830 00:39:10,500 --> 00:39:12,570 o qual é idêntico ao o que estava proposto. 831 00:39:12,570 --> 00:39:16,400 E agora eu faço carros alegóricos-0, agora eu tenho o meu 0.1. 832 00:39:16,400 --> 00:39:17,234 >> Agora isso é incrível. 833 00:39:17,234 --> 00:39:19,441 Mas agora eu vou fazer algo um pouco diferente. 834 00:39:19,441 --> 00:39:22,280 Estou curioso para ver o que é realmente acontecendo debaixo do capô, 835 00:39:22,280 --> 00:39:26,050 e eu estou indo para imprimir esta para 28 casas decimais. 836 00:39:26,050 --> 00:39:29,730 Eu quero muito ver 0.1000-- um infinite-- 837 00:39:29,730 --> 00:39:32,710 [Inaudível] 27 zeros depois que 0,1. 838 00:39:32,710 --> 00:39:34,740 >> Bem, vamos ver se isso é o que eu realmente obter. 839 00:39:34,740 --> 00:39:39,430 Faça mesmo arquivo bóias-0. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Vamos ampliar a resposta dramática. 842 00:39:44,380 --> 00:39:49,980 Todo esse tempo, você tem pensado 1 dividido por 10 é de 10%, ou 0.1. 843 00:39:49,980 --> 00:39:50,810 Não é. 844 00:39:50,810 --> 00:39:53,210 Pelo menos, desde que o computador de causa. 845 00:39:53,210 --> 00:39:57,060 >> Agora why-- OK, isso é completa lie 1 10 é dividido por 0,1. 846 00:39:57,060 --> 00:39:59,710 Mas isso não é why-- o takeaway hoje. 847 00:39:59,710 --> 00:40:04,010 Então, por que o computador pensa, ao contrário de todos nós na sala, 848 00:40:04,010 --> 00:40:06,870 1 que é dividido em 10 na verdade esse valor louco? 849 00:40:06,870 --> 00:40:10,620 Qual é o computador que faz aparentemente? 850 00:40:10,620 --> 00:40:12,490 O que é isso? 851 00:40:12,490 --> 00:40:13,785 >> Não é transbordar, per se. 852 00:40:13,785 --> 00:40:15,910 Overflow é tipicamente quando você envolver em torno de um valor. 853 00:40:15,910 --> 00:40:18,970 É essa questão da imprecisão em um valor de ponto flutuante 854 00:40:18,970 --> 00:40:22,220 onde você só tem 32 ou talvez até 64 bits. 855 00:40:22,220 --> 00:40:25,230 Mas se há um infinito número de Números de reais 856 00:40:25,230 --> 00:40:27,940 números com pontos decimais e números thereafter-- certamente 857 00:40:27,940 --> 00:40:29,380 você não pode representar todos eles. 858 00:40:29,380 --> 00:40:32,870 Assim, o computador tem dado nós a correspondência mais próxima 859 00:40:32,870 --> 00:40:37,090 para o valor que pode representar usando esse muitos bits para o valor que eu realmente quero, 860 00:40:37,090 --> 00:40:38,690 que é de 0,1. 861 00:40:38,690 --> 00:40:40,685 >> Infelizmente, se começar a fazer contas, ou você 862 00:40:40,685 --> 00:40:44,360 iniciar envolvendo esses tipos de flutuante valores de pontuação na programs-- importante 863 00:40:44,360 --> 00:40:46,770 software financeiro, militar nada software-- 864 00:40:46,770 --> 00:40:49,090 onde a percepção é provavelmente muito importante. 865 00:40:49,090 --> 00:40:51,520 E você começar a adicionar números como este, e começo 866 00:40:51,520 --> 00:40:54,050 executando o software com realmente grandes entradas 867 00:40:54,050 --> 00:40:56,890 ou por muitas horas ou lotes de dias ou muitos anos, 868 00:40:56,890 --> 00:41:01,060 esses pequenos erros pequenos certamente pode aumentar com o tempo. 869 00:41:01,060 --> 00:41:04,252 >> Agora, como um aparte, se você já visto Superman 3 ou Office Space 870 00:41:04,252 --> 00:41:05,960 e você deve se lembrar como esses caras roubaram 871 00:41:05,960 --> 00:41:08,668 um monte de dinheiro com seu computador usando os valores de ponto flutuante 872 00:41:08,668 --> 00:41:11,290 e adicionando-se o pouco remanescentes, espero que esse filme 873 00:41:11,290 --> 00:41:12,390 agora faz mais sentido. 874 00:41:12,390 --> 00:41:14,930 Isto é o que eles estavam aludindo nesse filme. 875 00:41:14,930 --> 00:41:16,710 O facto de a maioria empresas não olharia 876 00:41:16,710 --> 00:41:18,600 depois de um certo número de casas decimais, 877 00:41:18,600 --> 00:41:20,009 mas essas são frações de centavos. 878 00:41:20,009 --> 00:41:22,550 Então você começa a somá-los, você começar a fazer um monte de dinheiro 879 00:41:22,550 --> 00:41:23,424 em sua conta bancária. 880 00:41:23,424 --> 00:41:25,160 Então esse é o espaço de escritórios explicou. 881 00:41:25,160 --> 00:41:28,220 >> Agora, infelizmente, além de Office Space, há 882 00:41:28,220 --> 00:41:31,794 são algumas legitimamente preocupante e impactos significativos 883 00:41:31,794 --> 00:41:33,710 desses tipos de decisões de design subjacentes, 884 00:41:33,710 --> 00:41:35,990 e de fato uma das razões usamos C no decurso 885 00:41:35,990 --> 00:41:39,640 é por isso que você realmente tem esse terreno o entendimento de como funcionam os computadores, 886 00:41:39,640 --> 00:41:42,440 como o software funciona, e não tomar nada como garantido. 887 00:41:42,440 --> 00:41:45,820 >> E, de fato, infelizmente, mesmo com que compreensão fundamental, 888 00:41:45,820 --> 00:41:47,370 nós seres humanos cometem erros. 889 00:41:47,370 --> 00:41:51,310 E o que eu pensei que eu iria partilhar é este vídeo de oito minuto aqui feita 890 00:41:51,310 --> 00:41:56,980 a partir de um episódio de Modern Marvels, que é um espetáculo educativo sobre como as coisas funcionam 891 00:41:56,980 --> 00:42:00,370 que pinta duas imagens de quando um uso indevido 892 00:42:00,370 --> 00:42:02,540 e compreensão de valores de ponto flutuante 893 00:42:02,540 --> 00:42:05,610 levou a alguma significativo resultados infelizes. 894 00:42:05,610 --> 00:42:06,363 Vamos dar uma olhada. 895 00:42:06,363 --> 00:42:07,029 [REPRODUÇÃO] 896 00:42:07,029 --> 00:42:11,290 -Nós Agora voltar a "Engenharia Desastres "na Modern Marvels. 897 00:42:11,290 --> 00:42:12,940 Computadores. 898 00:42:12,940 --> 00:42:15,580 Todos nós temos vindo a aceitar a problemas muitas vezes frustrantes que 899 00:42:15,580 --> 00:42:20,960 ficou com eles-- bugs, vírus, e glitches-- software para pequenos preços 900 00:42:20,960 --> 00:42:23,100 para pagar a conveniência. 901 00:42:23,100 --> 00:42:27,770 Mas, na alta tecnologia e alta velocidade aplicações do programa espacial militar e, 902 00:42:27,770 --> 00:42:32,780 o menor problema pode ser ampliada em desastre. 903 00:42:32,780 --> 00:42:38,880 >> Em 4 de junho de 1996, os cientistas preparado para lançar um foguete Ariane 5 não tripulado. 904 00:42:38,880 --> 00:42:41,190 Ele estava carregando científica satélites projetados 905 00:42:41,190 --> 00:42:44,570 para estabelecer com precisão a forma como o Interage campo magnético da Terra 906 00:42:44,570 --> 00:42:47,380 com ventos solares. 907 00:42:47,380 --> 00:42:50,580 O foguete foi construído por a Agência Espacial Europeia, 908 00:42:50,580 --> 00:42:54,400 e decolou de sua instalação na costa da Guiana Francesa. 909 00:42:54,400 --> 00:42:57,520 >> -At Cerca de 37 segundos em o vôo, eles primeiro 910 00:42:57,520 --> 00:42:59,070 notado que algo estava acontecendo de errado. 911 00:42:59,070 --> 00:43:02,240 Que os bicos foram giratório de uma forma que realmente não deveria. 912 00:43:02,240 --> 00:43:06,550 Cerca de 40 segundos de vôo, claramente o veículo estava com problemas, 913 00:43:06,550 --> 00:43:08,820 e é aí que eles fizeram a decisão de destruí-lo. 914 00:43:08,820 --> 00:43:12,370 O oficial de segurança da escala, com coragem tremenda, apertou o botão 915 00:43:12,370 --> 00:43:18,030 e explodiu o foguete antes que ele pudesse tornar-se um perigo para a segurança pública. 916 00:43:18,030 --> 00:43:21,010 >> -Foi A donzela viagem do Ariane 5, 917 00:43:21,010 --> 00:43:23,920 e sua destruição levou colocar por causa da falha 918 00:43:23,920 --> 00:43:25,932 embutido no software do foguete. 919 00:43:25,932 --> 00:43:27,640 -The Problema na Ariane foi que não 920 00:43:27,640 --> 00:43:30,500 foi um número que é necessária 64 bits para expressar, 921 00:43:30,500 --> 00:43:33,560 e eles queriam converter para um número de 16 bits. 922 00:43:33,560 --> 00:43:36,820 Eles assumiram que o número nunca ia ser muito grande. 923 00:43:36,820 --> 00:43:40,940 Que a maioria dos dígitos em o número de 64 bits foram zeros. 924 00:43:40,940 --> 00:43:42,450 Eles estavam errados. 925 00:43:42,450 --> 00:43:45,000 >> -The Incapacidade de um programa de software para aceitar 926 00:43:45,000 --> 00:43:49,460 o tipo de número gerado pela outra está na raiz da falha. 927 00:43:49,460 --> 00:43:54,260 O desenvolvimento de software tornou-se uma parte muito cara de nova tecnologia. 928 00:43:54,260 --> 00:43:57,060 O Ariane 4 foguete tinha sido muito bem sucedida. 929 00:43:57,060 --> 00:44:01,600 Assim, grande parte do software criado para Ele também foi usado no Ariane 5. 930 00:44:01,600 --> 00:44:04,790 >> -The Problema básico era que o Ariane 5. 931 00:44:04,790 --> 00:44:11,200 Foi faster-- acelerou mais rápido, e o software não tinha contabilizado isso. 932 00:44:11,200 --> 00:44:14,910 >> -The Destruição do foguete foi um enorme desastre financeiro. 933 00:44:14,910 --> 00:44:18,630 Tudo devido a um erro de software minuto. 934 00:44:18,630 --> 00:44:21,160 Mas este não foi o primeiro problemas de conversão de dados de tempo 935 00:44:21,160 --> 00:44:24,770 havia atormentado a tecnologia de foguetes moderna. 936 00:44:24,770 --> 00:44:28,020 >> -Em 1991, com o início da primeira Guerra do Golfo, 937 00:44:28,020 --> 00:44:30,540 o míssil Patriot experimentado um tipo semelhante 938 00:44:30,540 --> 00:44:32,465 conversão de um problema número. 939 00:44:32,465 --> 00:44:36,760 E, como resultado 28 pessoas-- 28 Soldiers-- americanos foram mortos, 940 00:44:36,760 --> 00:44:39,010 e cerca de cem ficaram feridas. 941 00:44:39,010 --> 00:44:42,830 Quando o Patriot, que deveria para proteger contra Scuds recebidas, 942 00:44:42,830 --> 00:44:45,780 não conseguiu disparar um míssil. 943 00:44:45,780 --> 00:44:51,610 >> -Quando O Iraque invadiu o Kuwait, e na América lançou Desert Storm no início de 1991, 944 00:44:51,610 --> 00:44:55,720 Baterias de mísseis Patriot foram implantados para proteger a Arábia Saudita e Israel 945 00:44:55,720 --> 00:44:59,180 de ataques de mísseis Scud iraquianos. 946 00:44:59,180 --> 00:45:03,080 O Patriot é um médio alcance US superfície-ar do sistema 947 00:45:03,080 --> 00:45:06,530 fabricado pela empresa Raytheon. 948 00:45:06,530 --> 00:45:09,500 >> -The Tamanho do Patriot interceptor itself-- 949 00:45:09,500 --> 00:45:14,705 é cerca de cerca de 20 metros de comprimento, e pesa cerca de 2000 libras. 950 00:45:14,705 --> 00:45:19,090 E ele carrega uma ogiva de cerca, Eu acho que é cerca de 150 quilos. 951 00:45:19,090 --> 00:45:23,880 E a própria ogiva é um alto explosivo, que 952 00:45:23,880 --> 00:45:26,700 tem fragmentos em torno dele. 953 00:45:26,700 --> 00:45:31,630 Assim, o invólucro da ogiva projetado para agir como um chumbo grosso. 954 00:45:31,630 --> 00:45:34,040 >> -As Mísseis são realizados quatro por recipiente, 955 00:45:34,040 --> 00:45:37,170 e são transportados por um semi-reboque. 956 00:45:37,170 --> 00:45:44,880 >> -O Sistema Patriot anti-míssil remonta, pelo menos, 20 anos. 957 00:45:44,880 --> 00:45:48,380 Ele foi originalmente projetado como um míssil de defesa aérea 958 00:45:48,380 --> 00:45:50,810 para abater aviões inimigos. 959 00:45:50,810 --> 00:45:54,410 Na primeira Guerra do Golfo quando que a guerra veio, 960 00:45:54,410 --> 00:45:59,650 o Exército queria usá-lo para abater Scuds, e não aviões. 961 00:45:59,650 --> 00:46:03,580 A Força Aérea iraquiana foi não tanto de um problema, 962 00:46:03,580 --> 00:46:06,590 mas o Exército estava preocupado com Scuds. 963 00:46:06,590 --> 00:46:10,120 E assim eles tentaram atualizar o Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting Um inimigo míssil viajando a Mach 5 965 00:46:12,740 --> 00:46:15,670 ia ser bastante difícil. 966 00:46:15,670 --> 00:46:18,440 Mas quando o Patriot foi levado às pressas em serviço, 967 00:46:18,440 --> 00:46:22,580 o Exército não tinha conhecimento de uma modificação do Iraque, que 968 00:46:22,580 --> 00:46:25,880 fizeram suas scuds quase impossível a ele. 969 00:46:25,880 --> 00:46:30,690 >> O que aconteceu é que os Scuds estavam chegando eram instáveis. 970 00:46:30,690 --> 00:46:32,000 Eles estavam bambas. 971 00:46:32,000 --> 00:46:37,210 A razão para isso foi o Iraqis-- a fim de obter 600 quilômetros para fora 972 00:46:37,210 --> 00:46:41,680 de uma gama missile-- 300 quilômetros levou peso de ogiva frente, 973 00:46:41,680 --> 00:46:43,340 e feitos a ogiva isqueiro. 974 00:46:43,340 --> 00:46:48,490 Portanto, agora o Patriot está tentando vir no Scud, e na maioria das tempo-- 975 00:46:48,490 --> 00:46:52,880 a esmagadora maioria do tempo-- seria apenas voar pelo Scud. 976 00:46:52,880 --> 00:46:57,120 >> -Depois Os operadores do sistema Patriot percebeu que o Patriot errou seu alvo, 977 00:46:57,120 --> 00:47:01,630 eles detonaram ogiva do Patriot para evitar possíveis acidentes se ele 978 00:47:01,630 --> 00:47:04,440 Deixou-se cair ao chão. 979 00:47:04,440 --> 00:47:08,700 >> Isso foi o que a maioria das pessoas viu como grandes bolas de fogo no céu, 980 00:47:08,700 --> 00:47:14,180 e entendido como intercepta de ogivas Scud. 981 00:47:14,180 --> 00:47:18,020 >> -Embora Nos céus noturnos, Patriots parecia estar a destruir sucesso 982 00:47:18,020 --> 00:47:23,280 Scuds, em Dhahran poderia haver Não se engane sobre o seu desempenho. 983 00:47:23,280 --> 00:47:27,930 Há sistema de radar do Patriot perdeu o controle de um Scud entrada 984 00:47:27,930 --> 00:47:30,260 e nunca lançado devido a uma falha de software. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Foram os israelenses que descobriram que quanto maior for o sistema foi ligado, 987 00:47:38,880 --> 00:47:41,130 quanto maior a discrepância de tempo se tornou. 988 00:47:41,130 --> 00:47:44,770 Devido a um relógio incorporado no computador do sistema. 989 00:47:44,770 --> 00:47:48,190 >> -Acerca Duas semanas antes a tragédia em Dhahran, 990 00:47:48,190 --> 00:47:50,720 os israelenses relataram a o Departamento de Defesa 991 00:47:50,720 --> 00:47:52,410 que o sistema estava perdendo tempo. 992 00:47:52,410 --> 00:47:54,410 Depois de cerca de oito horas de correr, eles notaram 993 00:47:54,410 --> 00:47:57,690 que tornar-se o sistema de visivelmente menos preciso. 994 00:47:57,690 --> 00:48:01,850 O Departamento de Defesa respondeu contando todas as baterias Patriot 995 00:48:01,850 --> 00:48:04,800 para não deixar os sistemas por um longo período de tempo. 996 00:48:04,800 --> 00:48:06,980 Eles nunca disseram que há muito tempo era. 997 00:48:06,980 --> 00:48:09,140 8 horas, 10 horas, de mil horas. 998 00:48:09,140 --> 00:48:11,300 Ninguém sabia. 999 00:48:11,300 --> 00:48:13,320 >> -The Bateria Patriot estacionada no quartel 1000 00:48:13,320 --> 00:48:18,310 em Dhahran e sua falha interna relógio estava com mais de 100 horas 1001 00:48:18,310 --> 00:48:21,520 na noite de 25 de fevereiro. 1002 00:48:21,520 --> 00:48:25,792 >> -It Monitorados o tempo com uma precisão de cerca de um décimo de segundo. 1003 00:48:25,792 --> 00:48:27,950 Agora, um décimo de segundo é um número interessante 1004 00:48:27,950 --> 00:48:31,850 , porque não pode ser expressa em binário exatamente, o que 1005 00:48:31,850 --> 00:48:36,500 , significa que não pode ser expresso exactamente em qualquer computador digital moderno. 1006 00:48:36,500 --> 00:48:41,070 É difícil de acreditar, mas usar isso como um exemplo. 1007 00:48:41,070 --> 00:48:43,420 >> Vamos dar o número de um terço. 1008 00:48:43,420 --> 00:48:47,330 Um terceiro não pode ser expressa em decimal exatamente. 1009 00:48:47,330 --> 00:48:52,060 Um terço é 0,333 passa para o infinito. 1010 00:48:52,060 --> 00:48:56,420 Não há nenhuma maneira de fazer isso com precisão absoluta em um decimal. 1011 00:48:56,420 --> 00:48:59,530 Esse é exatamente o tipo de problema que aconteceu no Patriot. 1012 00:48:59,530 --> 00:49:04,040 Quanto mais tempo o sistema funcionou, o tornou-se pior do erro de tempo. 1013 00:49:04,040 --> 00:49:08,840 >> -Depois 100 horas de operação, o erro no tempo foi apenas cerca de um terço 1014 00:49:08,840 --> 00:49:10,440 de um segundo. 1015 00:49:10,440 --> 00:49:14,150 Mas em termos de direcionamento de um míssil viajando a Mach 5, 1016 00:49:14,150 --> 00:49:18,560 que resultou num rastreio de erro de mais de 600 metros. 1017 00:49:18,560 --> 00:49:21,870 Seria um erro fatal para os soldados em Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> O que aconteceu é o lançamento de um Scud foi detectada por satélites de alerta precoce, 1019 00:49:28,455 --> 00:49:32,710 e sabiam que um Scud estava chegando em sua direção geral. 1020 00:49:32,710 --> 00:49:35,150 Eles não sabiam de onde vinha. 1021 00:49:35,150 --> 00:49:38,210 Era agora ao radar componente do sistema Patriot 1022 00:49:38,210 --> 00:49:43,150 defender Dhahran para localizar e manter o controle do míssil inimigo de entrada. 1023 00:49:43,150 --> 00:49:44,561 >> -The Radar era muito inteligente. 1024 00:49:44,561 --> 00:49:46,560 Seria realmente rastrear a posição do Scud 1025 00:49:46,560 --> 00:49:48,930 e, em seguida, prever onde provavelmente seria 1026 00:49:48,930 --> 00:49:51,380 a próxima vez que o radar enviou um pulso para fora. 1027 00:49:51,380 --> 00:49:53,040 Isso foi chamado ao portão intervalo. 1028 00:49:53,040 --> 00:49:57,620 >> -Então Uma vez que o Patriot decide tem tempo suficiente 1029 00:49:57,620 --> 00:50:02,400 passado para voltar e verificar a próxima localização para este objeto detectado 1030 00:50:02,400 --> 00:50:03,550 ele vai voltar. 1031 00:50:03,550 --> 00:50:07,820 Assim, quando se voltou para o mal lugar, em seguida, vê nenhum objeto. 1032 00:50:07,820 --> 00:50:10,360 E ele decide que não havia nenhum objeto. 1033 00:50:10,360 --> 00:50:13,630 Que havia uma falsa detecção e ele cai na pista. 1034 00:50:13,630 --> 00:50:16,970 >> -The Entrada Scud desaparecido da tela do radar, 1035 00:50:16,970 --> 00:50:20,200 e segundos mais tarde, ele se chocou contra o quartel. 1036 00:50:20,200 --> 00:50:22,570 O Scud matou 28. 1037 00:50:22,570 --> 00:50:26,110 Foi o último demitido durante a primeira Guerra do Golfo. 1038 00:50:26,110 --> 00:50:31,920 Tragicamente, o software atualizado chegou na madrugada do dia seguinte. 1039 00:50:31,920 --> 00:50:34,870 A falha de software teve sido fixado, o fechamento 1040 00:50:34,870 --> 00:50:39,150 um capítulo na conturbada história do míssil Patriot. 1041 00:50:39,150 --> 00:50:40,030 >> [FIM REPRODUÇÃO DE VÍDEO] 1042 00:50:40,030 --> 00:50:41,488 >> DAVID J. MALAN: Isso é tudo para CS50. 1043 00:50:41,488 --> 00:50:42,820 Vamos vê-lo na quarta-feira. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [MÚSICA DE JOGO] 1046 00:50:50,370 --> 00:54:23,446