1 00:00:00,000 --> 00:00:10,920 >> [Música tocando] 2 00:00:10,920 --> 00:00:14,680 >> DAVID J MALAN: Tudo bem, boas-vindas de volta ao CS50. 3 00:00:14,680 --> 00:00:16,500 Este é o início de duas semanas. 4 00:00:16,500 --> 00:00:18,940 A palavra de um de nossos amigos no campus - 5 00:00:18,940 --> 00:00:22,620 se você estiver interessado, possivelmente, seja agora ou em um futuro mandato 6 00:00:22,620 --> 00:00:25,670 mesmo, uma vez mais confortável, o ensino alunos do ensino médio um pouco 7 00:00:25,670 --> 00:00:27,680 algo sobre ciência da computação, fazer a cabeça para que URL. 8 00:00:27,680 --> 00:00:32,360 Eles têm particular necessidade agora de professores, especialmente se você tiver 9 00:00:32,360 --> 00:00:34,700 teve alguma exposição à ciência da computação. 10 00:00:34,700 --> 00:00:38,060 >> Então, lembro que da última vez, nós introduzimos alguns tipos de dados, e em C 11 00:00:38,060 --> 00:00:40,590 Você pode ter começado a receber o seu mãos sujas com estes, assim, tanto 12 00:00:40,590 --> 00:00:41,940 em um conjunto de problemas. 13 00:00:41,940 --> 00:00:43,230 E nós tivemos um char. 14 00:00:43,230 --> 00:00:49,100 Portanto, em termos um tanto técnicos, o que é um char como você sabe que hoje em dia? 15 00:00:49,100 --> 00:00:51,050 >> Portanto, é um personagem, mas vamos ser mais preciso momento. 16 00:00:51,050 --> 00:00:53,735 O que queremos dizer com caráter ou indivíduo de char? 17 00:00:53,735 --> 00:00:56,700 18 00:00:56,700 --> 00:00:59,500 Um personagem não-numérico - 19 00:00:59,500 --> 00:01:00,670 portanto, não necessariamente. 20 00:01:00,670 --> 00:01:04,580 Acontece que os números pares, mesmo pontuação e letras são 21 00:01:04,580 --> 00:01:06,980 representado com estes dados tipo conhecido como um char. 22 00:01:06,980 --> 00:01:09,440 Portanto, não é necessariamente alfabética. 23 00:01:09,440 --> 00:01:11,100 Sim? 24 00:01:11,100 --> 00:01:12,275 >> Portanto, é um caractere ASCII. 25 00:01:12,275 --> 00:01:15,510 Então, se você acha que volta para semana zero, quando tivemos o nosso byte de voluntários 26 00:01:15,510 --> 00:01:19,150 chegar e quer manter suas mãos para cima ou não é tudo, eles representavam bits. 27 00:01:19,150 --> 00:01:22,450 Mas coletivamente como um grupo de oito, que representou um byte. 28 00:01:22,450 --> 00:01:26,030 E introduziu a noção de ASCII naquela palestra, que é simplesmente uma 29 00:01:26,030 --> 00:01:28,170 mapeamento entre números e letras. 30 00:01:28,170 --> 00:01:32,010 E usa ASCII, como os seres humanos implícitas, oito bits 31 00:01:32,010 --> 00:01:33,660 para representar um personagem. 32 00:01:33,660 --> 00:01:36,890 >> Então, nesse sentido, se oito bits pode cada um assumir um dos dois valores - 33 00:01:36,890 --> 00:01:38,010 zero ou um - 34 00:01:38,010 --> 00:01:40,280 Isso significa que há duas possibilidades para essa pessoa - 35 00:01:40,280 --> 00:01:41,230 zero ou um - 36 00:01:41,230 --> 00:01:44,070 dois para essa pessoa, dois para este pessoa, de dois para um presente. 37 00:01:44,070 --> 00:01:47,450 Assim, um total de duas vezes duas vezes duas vezes dois vezes dois - 38 00:01:47,450 --> 00:01:49,700 para dois o oitavo lugar no total. 39 00:01:49,700 --> 00:01:54,320 Portanto, há um número total de caracteres 256 possível que você puder 40 00:01:54,320 --> 00:01:55,750 representar com oito bits. 41 00:01:55,750 --> 00:01:59,210 >> Agora, aqueles de vocês que falam da Ásia línguas pode saber que há mais 42 00:01:59,210 --> 00:02:02,620 personagens do mundo do que apenas As e Bs e Cs e Ds. 43 00:02:02,620 --> 00:02:06,130 E, de fato, ASCII não é suficiente para um monte de línguas do mundo. 44 00:02:06,130 --> 00:02:07,760 Mas mais sobre isso outra hora. 45 00:02:07,760 --> 00:02:11,240 Por enquanto, sabemos que em C, se você quiser para representar uma carta, um pedaço de 46 00:02:11,240 --> 00:02:15,780 pontuação, ou apenas algo caráter na natureza, nós usamos um char. 47 00:02:15,780 --> 00:02:18,240 E é um byte ou oito bits. 48 00:02:18,240 --> 00:02:19,690 >> Como cerca de um int? 49 00:02:19,690 --> 00:02:20,780 Bem, um int é um inteiro. 50 00:02:20,780 --> 00:02:23,175 Quantos bits, se você se lembra, é um número inteiro tipicamente? 51 00:02:23,175 --> 00:02:25,930 52 00:02:25,930 --> 00:02:27,512 Recordação alguém? 53 00:02:27,512 --> 00:02:29,600 Por isso, é tipicamente 32. 54 00:02:29,600 --> 00:02:32,120 Na verdade, depende do computador que você está usando. 55 00:02:32,120 --> 00:02:35,770 Porém, no aparelho e, em muitos computadores, é de 32 bits ou quatro 56 00:02:35,770 --> 00:02:37,140 bytes - oito vezes quatro. 57 00:02:37,140 --> 00:02:39,790 E ints são apenas utilizados para o armazenamento de números, ou negativas, 58 00:02:39,790 --> 00:02:41,610 positivo ou zero. 59 00:02:41,610 --> 00:02:45,250 >> E se você tem 32 bits e você só se preocupam com números positivos, pode 60 00:02:45,250 --> 00:02:48,960 qualquer um estádio quantos possível inteiros de um computador pode representar desde 61 00:02:48,960 --> 00:02:51,820 zerar em cima? 62 00:02:51,820 --> 00:02:56,130 Portanto, seria de dois a 32, o qual é de aproximadamente quatro bilhões. 63 00:02:56,130 --> 00:02:59,720 Então, essas potências de dois vão ser temas recorrentes em Ciência da Computação. 64 00:02:59,720 --> 00:03:03,930 Como veremos, eles são bastante conveniente para trabalhar com o mesmo, se não é muito 65 00:03:03,930 --> 00:03:05,790 fácil de fazer as contas na cabeça de alguém. 66 00:03:05,790 --> 00:03:07,000 >> Então, vamos dizer cerca de quatro bilhões. 67 00:03:07,000 --> 00:03:08,620 Agora, um longo - 68 00:03:08,620 --> 00:03:09,770 você pode tipo de suposição. 69 00:03:09,770 --> 00:03:10,480 É mais do que um int. 70 00:03:10,480 --> 00:03:12,440 Quantos bits? 71 00:03:12,440 --> 00:03:14,250 Então, 64 bits ou oito bytes. 72 00:03:14,250 --> 00:03:17,480 Isto apenas significa que você pode representar até números maiores, maior positivo ou 73 00:03:17,480 --> 00:03:19,160 maiores números negativos. 74 00:03:19,160 --> 00:03:20,060 >> E quanto a flutuar? 75 00:03:20,060 --> 00:03:22,260 Isso é um ponto flutuante valor de 32 bits. 76 00:03:22,260 --> 00:03:25,180 Este é apenas um número real, algo com um ponto decimal. 77 00:03:25,180 --> 00:03:30,100 Mas, se em vez precisamos de mais lugares depois do ponto decimal ou você quer 78 00:03:30,100 --> 00:03:33,720 representar um número maior com alguns fração depois dele, você pode usar um 79 00:03:33,720 --> 00:03:36,260 dupla, que é de 64 bits. 80 00:03:36,260 --> 00:03:38,240 >> Mas há uma interessante takeaway aqui. 81 00:03:38,240 --> 00:03:42,890 Então, se ints são limitados por 32 bits e Mesmo muito longos são limitados por 64 82 00:03:42,890 --> 00:03:46,180 pedaços, esse tipo de levanta a questão: E se você realmente quer contar 83 00:03:46,180 --> 00:03:48,790 superior a 4 bilhões para um int? 84 00:03:48,790 --> 00:03:50,330 Bem, você acabou de usar um longo. 85 00:03:50,330 --> 00:03:54,200 Mas e se você quiser contar superior de dois a 64, mais ou menos? 86 00:03:54,200 --> 00:03:55,810 >> Agora, isso é um número enorme. 87 00:03:55,810 --> 00:03:59,250 Mas, eventualmente, você pode realmente se preocupam com esses tipos de valores, 88 00:03:59,250 --> 00:04:03,070 especialmente se você estiver usando um banco de dados e começando a recolher lotes e lotes 89 00:04:03,070 --> 00:04:06,190 e um monte de dados e atribuição exclusiva números para cada pedaço de dados. 90 00:04:06,190 --> 00:04:07,430 Então nós meio que temos um problema. 91 00:04:07,430 --> 00:04:10,700 E da mesma forma, com ponto flutuante valores - flutuadores ou duplos - 92 00:04:10,700 --> 00:04:14,290 Se você só tem um número finito de pedaços, quantos números totais pudeste 93 00:04:14,290 --> 00:04:16,980 possivelmente representa? 94 00:04:16,980 --> 00:04:19,540 >> Bem, é menos claro quando você envolver um ponto decimal. 95 00:04:19,540 --> 00:04:20,899 Mas é certamente finito. 96 00:04:20,899 --> 00:04:24,390 Se você tem um número finito de bits, um número finito de seres humanos, um finito 97 00:04:24,390 --> 00:04:27,350 número de lâmpadas, certamente você pode representam apenas um número finito de 98 00:04:27,350 --> 00:04:28,510 valores de ponto flutuante. 99 00:04:28,510 --> 00:04:33,170 Mas quantos números reais são as suas no mundo? 100 00:04:33,170 --> 00:04:33,680 Há um infinito. 101 00:04:33,680 --> 00:04:37,280 Então, isso é um tipo de problema, porque nós não tem uma quantidade infinita de 102 00:04:37,280 --> 00:04:39,970 memória RAM ou dentro de nossos computadores. 103 00:04:39,970 --> 00:04:41,780 Então, algumas coisas difíceis podem acontecer. 104 00:04:41,780 --> 00:04:43,900 >> Então vamos em frente e tentar para expressar isso aqui. 105 00:04:43,900 --> 00:04:46,240 Deixe-me ir em frente e abrir gedit. 106 00:04:46,240 --> 00:04:50,360 Eu estou indo para ir em frente e salvar um arquivo chamado de "floats0.c" apenas para ser 107 00:04:50,360 --> 00:04:54,630 consistente com um exemplo que é disponível on-line, se você gostaria. 108 00:04:54,630 --> 00:04:58,080 E eu estou indo para ir em frente e defini-lo como segue - 109 00:04:58,080 --> 00:05:01,540 Eu estou indo para ir em frente e dizer, int void main, como costumamos fazer. 110 00:05:01,540 --> 00:05:07,190 >> E então neste programa, eu vou declaro-me uma bóia, para a 32-bit 111 00:05:07,190 --> 00:05:09,700 variável chamada f, arbitrariamente. 112 00:05:09,700 --> 00:05:13,910 E então eu estou indo para armazenar nele Eu não sei, um décimo, para 0,1. 113 00:05:13,910 --> 00:05:16,590 Então eu vou para expressar que, como um dividida por 10, que é perfeitamente 114 00:05:16,590 --> 00:05:17,790 legítimo em C. 115 00:05:17,790 --> 00:05:20,460 >> E, em seguida, na segunda linha, simplesmente pretende imprimir esse valor. 116 00:05:20,460 --> 00:05:22,950 Então lembro que podemos usar o familiar printf. 117 00:05:22,950 --> 00:05:25,420 Nós não queremos usar% i para um int. 118 00:05:25,420 --> 00:05:28,360 Queremos usar% f para um float. 119 00:05:28,360 --> 00:05:33,080 E então eu vou fazer barra invertida n, próxima citação, vírgula, f, ponto e vírgula. 120 00:05:33,080 --> 00:05:34,400 >> Então aqui está o meu programa. 121 00:05:34,400 --> 00:05:35,820 Já existe um bug. 122 00:05:35,820 --> 00:05:38,640 Alguém para quem esta clicado já quero apontar pelo menos 123 00:05:38,640 --> 00:05:40,220 um bug que eu fiz? 124 00:05:40,220 --> 00:05:42,470 Sim? 125 00:05:42,470 --> 00:05:42,800 Sim. 126 00:05:42,800 --> 00:05:47,860 Esqueci "# include" no topo, eles sintoma de que se eu tentar 127 00:05:47,860 --> 00:05:50,490 compilar este vai ser que o compilador vai gritar comigo, 128 00:05:50,490 --> 00:05:52,770 dizendo símbolo indefinido ou algo nesse sentido. 129 00:05:52,770 --> 00:05:55,360 Ele não entender alguma coisa como printf. 130 00:05:55,360 --> 00:05:59,380 >> Então, eu vou fazer "# include ", Salve o arquivo. 131 00:05:59,380 --> 00:06:00,400 E agora está na melhor forma. 132 00:06:00,400 --> 00:06:02,690 Mas eu também estou indo para apontar fora um detalhe novo hoje. 133 00:06:02,690 --> 00:06:08,620 Além de especificar lugar titulares como%% f i% s, você pode 134 00:06:08,620 --> 00:06:12,320 por vezes, influenciar o comportamento desse espaço reservado. 135 00:06:12,320 --> 00:06:15,540 Por exemplo, no caso de um flutuante valor do ponto, se eu só quero 136 00:06:15,540 --> 00:06:22,200 para exibir uma casa decimal após a período, eu posso realmente fazer 0.1f. 137 00:06:22,200 --> 00:06:26,830 Portanto, em outras palavras, separar o f e o sinal de porcentagem com 0,1, apenas 138 00:06:26,830 --> 00:06:30,200 dizendo printf, você pode ter um todo monte de números após o decimal 139 00:06:30,200 --> 00:06:30,930 apontar para mim. 140 00:06:30,930 --> 00:06:32,870 Mas eu só quero ver um deles. 141 00:06:32,870 --> 00:06:36,280 >> Então, eu estou indo para ir em frente agora e salvar Neste programa, entrar em meu terminal 142 00:06:36,280 --> 00:06:41,870 janela, e eu estou indo para ir em frente e tipo fazer flutuar 0, entrar. 143 00:06:41,870 --> 00:06:44,930 Eu vejo que a linha um tanto enigmática que vai começar a fazer mais sentido como nós 144 00:06:44,930 --> 00:06:46,900 provocá-lo para além desta semana e na próxima. 145 00:06:46,900 --> 00:06:50,480 Agora eu estou indo para ir em frente e executar folga zero. 146 00:06:50,480 --> 00:06:52,020 E, caramba. 147 00:06:52,020 --> 00:06:54,880 >> Portanto, não há outro bug aqui por algum motivo. 148 00:06:54,880 --> 00:07:02,490 Tenho certeza de que um décimo ou um dividido por 10, não é 0.0. 149 00:07:02,490 --> 00:07:04,590 Talvez eu só não estou procurando em dígitos suficientes. 150 00:07:04,590 --> 00:07:08,580 Então, por que não eu digo dois 0,2 ver dois casas decimais em vez de apenas um. 151 00:07:08,580 --> 00:07:11,810 Deixe-me voltar para a janela do meu terminal aqui e bater um par de vezes para 152 00:07:11,810 --> 00:07:12,840 ver a minha história. 153 00:07:12,840 --> 00:07:15,910 Não fazer flutuar a zero novamente, e, em seguida, novamente. 154 00:07:15,910 --> 00:07:17,730 E agora entrar. 155 00:07:17,730 --> 00:07:20,000 >> E agora eu tenho certeza que isso é errado. 156 00:07:20,000 --> 00:07:23,030 E eu poderia fazer três e quatro, e eu sou provavelmente vai continuar vendo zeros. 157 00:07:23,030 --> 00:07:24,880 Então, onde está o erro? 158 00:07:24,880 --> 00:07:27,910 Uma dividido por 10 deve ser de 0,1. 159 00:07:27,910 --> 00:07:30,310 Alguém quer dar uma facada em que a questão fundamental é? 160 00:07:30,310 --> 00:07:32,400 Sim? 161 00:07:32,400 --> 00:07:33,420 Eles são ambos inteiros. 162 00:07:33,420 --> 00:07:33,920 Então o quê? 163 00:07:33,920 --> 00:07:37,820 Assim, com um dividido por 10, que é o que eu faço na aritmética. 164 00:07:37,820 --> 00:07:41,185 E eu fico 0,1. 165 00:07:41,185 --> 00:07:41,660 >> Sim. 166 00:07:41,660 --> 00:07:43,240 E assim é de fato essa questão. 167 00:07:43,240 --> 00:07:46,700 Quando você toma um inteiro em um computador e dividi-lo por outro inteiro, 168 00:07:46,700 --> 00:07:50,430 o computador, por padrão vai supor que você quer um inteiro. 169 00:07:50,430 --> 00:07:54,620 O problema no entanto, é claro, é 0.1 que não é um número inteiro. 170 00:07:54,620 --> 00:07:55,680 É um número real. 171 00:07:55,680 --> 00:07:59,610 E assim que o computador faz por default é apenas joga fora 172 00:07:59,610 --> 00:08:01,070 tudo depois do ponto decimal. 173 00:08:01,070 --> 00:08:03,380 Não arredondar para baixo ou para cima, por si só. 174 00:08:03,380 --> 00:08:06,480 Ele só joga fora tudo depois do ponto decimal. 175 00:08:06,480 --> 00:08:07,430 E agora que faz sentido. 176 00:08:07,430 --> 00:08:09,740 Porque agora estamos claramente deixou com zero. 177 00:08:09,740 --> 00:08:10,250 >> Mas espere um minuto. 178 00:08:10,250 --> 00:08:11,840 Eu não estou vendo um zero a int. 179 00:08:11,840 --> 00:08:14,910 Na verdade, estou vendo 0,00. 180 00:08:14,910 --> 00:08:16,340 Então, como posso conciliar isso agora? 181 00:08:16,340 --> 00:08:22,850 Se um dividido por 10 é igual a zero, mas estou vendo 0,00, onde está recebendo 182 00:08:22,850 --> 00:08:24,250 convertidos de volta para um número real? 183 00:08:24,250 --> 00:08:25,500 Sim. 184 00:08:25,500 --> 00:08:29,850 185 00:08:29,850 --> 00:08:30,630 Exatamente. 186 00:08:30,630 --> 00:08:35,600 >> Então, aqui em linha de cinco, quando eu realmente armazenar a 0,1, que é então 187 00:08:35,600 --> 00:08:39,549 truncado para zero, para dentro de um flutuador, que é efectivamente equivalentes aos 188 00:08:39,549 --> 00:08:42,100 armazená-lo não como um int, mas, de fato, como um float. 189 00:08:42,100 --> 00:08:46,540 Além disso, estou em seguida, usando printf para explicitamente imprimir esse número para dois 190 00:08:46,540 --> 00:08:49,740 casas decimais, embora não não pode realmente ser qualquer. 191 00:08:49,740 --> 00:08:51,020 >> Portanto, este tipo de merda, né? 192 00:08:51,020 --> 00:08:53,640 Aparentemente, você não pode fazer matemática, pelo menos neste nível de 193 00:08:53,640 --> 00:08:55,600 precisão, em um computador. 194 00:08:55,600 --> 00:08:56,930 Mas, certamente, há uma solução. 195 00:08:56,930 --> 00:09:00,410 Qual é a solução mais simples que poderia talvez fazer, mesmo que apenas intuitivamente aqui para 196 00:09:00,410 --> 00:09:01,130 resolver isso? 197 00:09:01,130 --> 00:09:02,380 Sim? 198 00:09:02,380 --> 00:09:04,700 199 00:09:04,700 --> 00:09:06,574 Transforme os números inteiros em - 200 00:09:06,574 --> 00:09:06,976 sim. 201 00:09:06,976 --> 00:09:10,420 Mesmo se eu não tenho certeza o que é realmente está acontecendo aqui, se 202 00:09:10,420 --> 00:09:13,440 fundamentalmente tem a ver com esses dois estar inteiros, bem, por que não eu 203 00:09:13,440 --> 00:09:18,230 fazer que 10.0, tornando este 1.0, salve novamente o arquivo. 204 00:09:18,230 --> 00:09:20,990 Deixe-me voltar até a inferior e recompilar. 205 00:09:20,990 --> 00:09:23,030 Deixe-me agora reprise. 206 00:09:23,030 --> 00:09:23,420 E lá - 207 00:09:23,420 --> 00:09:27,690 agora, eu tenho o meu de um décimo representada como 0,10. 208 00:09:27,690 --> 00:09:28,420 >> Tudo bem. 209 00:09:28,420 --> 00:09:29,220 Então, isso não é ruim. 210 00:09:29,220 --> 00:09:31,730 E deixe-me apontar um outro caminho poderíamos ter resolvido isso. 211 00:09:31,730 --> 00:09:35,580 Deixe-me realmente rolar de volta no tempo quando tivemos isso como um 212 00:09:35,580 --> 00:09:36,680 décimo de um momento atrás. 213 00:09:36,680 --> 00:09:40,800 E deixe-me ir em frente e salve este arquivo como um nome de arquivo diferente, só para 214 00:09:40,800 --> 00:09:41,750 ter um pouco de checkpoint. 215 00:09:41,750 --> 00:09:43,450 Então essa foi uma versão. 216 00:09:43,450 --> 00:09:45,520 E agora deixe-me ir em frente e fazer mais uma versão. 217 00:09:45,520 --> 00:09:48,540 Vamos chamar esta versão dois zero indexado. 218 00:09:48,540 --> 00:09:51,280 >> E eu vou fazer, em vez isso - você sabe o quê? 219 00:09:51,280 --> 00:09:54,400 Adicionando ponto de zero funciona neste caso. 220 00:09:54,400 --> 00:09:56,060 Mas suponha que alguém fosse uma variável. 221 00:09:56,060 --> 00:09:57,680 Suposto 10 eram uma variável. 222 00:09:57,680 --> 00:10:00,680 Em outras palavras, suponha que eu não podia apenas embutir 0,0 no final 223 00:10:00,680 --> 00:10:02,340 desta expressão aritmética. 224 00:10:02,340 --> 00:10:05,820 Bem, eu posso realmente fazer alguma coisa em parênteses chamada de elenco. 225 00:10:05,820 --> 00:10:11,920 Posso lançar esse inteiro 10 para um float, e posso lançar aquele inteiro para um 226 00:10:11,920 --> 00:10:12,800 flutuar, bem. 227 00:10:12,800 --> 00:10:17,190 Em seguida, a matemática que vai ser feito é efectivamente dividido por 1,0 10.0, 228 00:10:17,190 --> 00:10:19,250 cujo resultado vai em f como antes. 229 00:10:19,250 --> 00:10:26,130 Então, se eu recompilar este como fazer carros alegóricos 2, e agora flutua dois, fico com a mesma 230 00:10:26,130 --> 00:10:27,020 responder, também. 231 00:10:27,020 --> 00:10:29,640 >> Portanto, este é um exemplo bastante artificial, para resolver este problema 232 00:10:29,640 --> 00:10:31,400 através da introdução de fundição. 233 00:10:31,400 --> 00:10:34,410 Mas, em geral, fundição vai ser uma coisa poderosa, especialmente para 234 00:10:34,410 --> 00:10:38,180 problema de definir dois em uma semana, quando você deseja converter um tipo de dados para 235 00:10:38,180 --> 00:10:41,800 outro que, no final do dia são representados da mesma maneira. 236 00:10:41,800 --> 00:10:44,970 No final do dia, a cada coisa que falamos até agora é 237 00:10:44,970 --> 00:10:46,710 apenas inteiros debaixo do capô. 238 00:10:46,710 --> 00:10:48,950 Ou se isso é muito baixo nível para você, eles são apenas números 239 00:10:48,950 --> 00:10:49,750 debaixo do capô. 240 00:10:49,750 --> 00:10:52,850 Mesmo os personagens, mais uma vez, lembre-se de semana zero, são números 241 00:10:52,850 --> 00:10:53,990 debaixo do capô. 242 00:10:53,990 --> 00:10:57,240 >> O que quer dizer, podemos converter entre tipos diferentes de números se 243 00:10:57,240 --> 00:10:58,060 eles são apenas bits. 244 00:10:58,060 --> 00:11:01,020 Podemos converter entre os números e as cartas se eles são apenas 245 00:11:01,020 --> 00:11:02,580 bits, e vice-versa. 246 00:11:02,580 --> 00:11:07,170 Fundição E desta forma é um mecanismo na programação que permite à força 247 00:11:07,170 --> 00:11:10,970 mudar de um tipo de dados para outro. 248 00:11:10,970 --> 00:11:14,570 Infelizmente, isto não é tão simples como eu teria gostado. 249 00:11:14,570 --> 00:11:19,220 >> Eu vou voltar em carros alegóricos 1, o que foi o mais simples, 250 00:11:19,220 --> 00:11:22,830 um simples, com 0,0 adicionada a cada um. 251 00:11:22,830 --> 00:11:25,260 E assim como uma reciclagem rápida, deixe-me ir em frente e recompilar 252 00:11:25,260 --> 00:11:27,670 isso, fazer carros alegóricos 2 - 253 00:11:27,670 --> 00:11:30,300 desculpe, isso é fazer carros alegóricos 1. 254 00:11:30,300 --> 00:11:32,050 E agora vamos executar carros alegóricos 1. 255 00:11:32,050 --> 00:11:34,810 E, no fundo, observe que eu realmente obter 0,1. 256 00:11:34,810 --> 00:11:36,165 Então, problema resolvido. 257 00:11:36,165 --> 00:11:37,280 >> Mas ainda não. 258 00:11:37,280 --> 00:11:40,000 Agora estou indo para obter um pouco curioso, e eu vou voltar para o meu 259 00:11:40,000 --> 00:11:41,620 instrução printf e dizer, você sabe o quê? 260 00:11:41,620 --> 00:11:44,090 Eu gostaria de confirmar que este é realmente um décimo. 261 00:11:44,090 --> 00:11:47,890 E eu vou querer ver isso para, digamos, cinco casas decimais. 262 00:11:47,890 --> 00:11:48,570 Não é um problema. 263 00:11:48,570 --> 00:11:52,020 Eu mudar os dois para cinco, Eu recompilar com o make. 264 00:11:52,020 --> 00:11:53,770 Eu reprise como flutua um. 265 00:11:53,770 --> 00:11:54,990 Olhando muito bom. 266 00:11:54,990 --> 00:11:58,570 Meus checagens pode acabar ali, mas Estou ficando um pouco mais aventureiros. 267 00:11:58,570 --> 00:12:00,330 Eu vou mudar 0,5-0,10. 268 00:12:00,330 --> 00:12:03,440 Eu quero ver 10 dígitos depois a casa decimal. 269 00:12:03,440 --> 00:12:09,060 >> E eu estou indo para ir em frente e recompilar isso e uma reprise flutua. 270 00:12:09,060 --> 00:12:13,060 Eu tipo de arrependimento de ter testado esta ainda mais porque a minha matemática não é tão 271 00:12:13,060 --> 00:12:14,320 corrigir mais, ao que parece. 272 00:12:14,320 --> 00:12:15,630 Mas espere um minuto, talvez isso é apenas um acaso. 273 00:12:15,630 --> 00:12:17,810 Talvez o computador está agindo um pouco estranho. 274 00:12:17,810 --> 00:12:21,810 Deixe-me ir em frente e fazer 20 pontos decimais e tranquilizar-me que eu sei 275 00:12:21,810 --> 00:12:22,540 como fazer a matemática. 276 00:12:22,540 --> 00:12:23,460 Eu sei como programar. 277 00:12:23,460 --> 00:12:26,960 Fazer carros alegóricos 1, recompilar, e dane-se. 278 00:12:26,960 --> 00:12:31,110 Isso é realmente, realmente ficando longe da marca. 279 00:12:31,110 --> 00:12:32,490 >> Então o que está acontecendo aqui? 280 00:12:32,490 --> 00:12:36,050 Intuitivamente, baseado em nossas suposições anteriormente sobre o tamanho dos tipos de dados, 281 00:12:36,050 --> 00:12:38,040 o que deve estar acontecendo aqui debaixo do capô? 282 00:12:38,040 --> 00:12:39,290 Sim? 283 00:12:39,290 --> 00:12:43,000 284 00:12:43,000 --> 00:12:43,590 Exatamente. 285 00:12:43,590 --> 00:12:46,480 Se você quer isso muita precisão, e isso é um pedaço de um monte de precisão - 286 00:12:46,480 --> 00:12:48,770 20 números depois do ponto decimal. 287 00:12:48,770 --> 00:12:51,990 Você não pode representar uma número arbitrário, a menos que você tem um 288 00:12:51,990 --> 00:12:52,930 um número arbitrário de bits. 289 00:12:52,930 --> 00:12:54,190 Mas não o fazemos. 290 00:12:54,190 --> 00:12:57,200 Para um float, só temos 32 bits. 291 00:12:57,200 --> 00:13:02,260 >> Então, se apenas 32 bits podem ser permutados numa caminho - tal como os nossos seres humanos em, fase 292 00:13:02,260 --> 00:13:05,780 mãos para cima ou para baixo - em um número finito de maneiras, só há um número finito 293 00:13:05,780 --> 00:13:08,640 de números reais pode representar com esses bits. 294 00:13:08,640 --> 00:13:10,500 E para que o computador eventualmente vai ter que 295 00:13:10,500 --> 00:13:11,730 começar a cortar cantos. 296 00:13:11,730 --> 00:13:15,500 O computador pode esconder os detalhes de nós por um pouco de tempo. 297 00:13:15,500 --> 00:13:18,880 Mas se começarmos a cutucar os números e procurando cada vez mais longe no 298 00:13:18,880 --> 00:13:23,220 números de fuga no número inteiro, então começamos a ver que é 299 00:13:23,220 --> 00:13:26,480 realmente aproximar a idéia de um décimo. 300 00:13:26,480 --> 00:13:29,860 >> E assim se vê, tragicamente, não há um número infinito de números 301 00:13:29,860 --> 00:13:35,060 não pode representar exactamente numa computador, pelo menos, com um número finito 302 00:13:35,060 --> 00:13:38,030 número de bits, uma finita quantidade de RAM. 303 00:13:38,030 --> 00:13:41,210 Agora, infelizmente, isso às vezes tem consequências no mundo real. 304 00:13:41,210 --> 00:13:45,980 Se as pessoas não chegam a apreciar este ou tipo de exame para concedido o fato 305 00:13:45,980 --> 00:13:48,310 que seu computador irá apenas fazer o que eles dizem que ele faça e não 306 00:13:48,310 --> 00:13:51,430 compreender estes subjacente detalhes de representação - 307 00:13:51,430 --> 00:13:55,290 que, francamente, em algumas línguas são escondido do utilizador, ao contrário em C - 308 00:13:55,290 --> 00:13:56,500 algumas coisas ruins podem acontecer. 309 00:13:56,500 --> 00:13:58,650 >> E o que eu pensei que iria fazer é dar um passo atrás. 310 00:13:58,650 --> 00:14:00,420 E trata-se de um vídeo de oito minutos. 311 00:14:00,420 --> 00:14:04,200 Foi ao ar há alguns anos, e dá insights sobre o que realmente pode ir 312 00:14:04,200 --> 00:14:09,290 errado quando você subestima estes tipos de detalhes, mesmo no tudo muito 313 00:14:09,290 --> 00:14:10,080 mundo real. 314 00:14:10,080 --> 00:14:12,965 Se pudéssemos diminuir as luzes por alguns minutos. 315 00:14:12,965 --> 00:14:14,360 >> COLUNA 1: Voltamos agora à engenharia 316 00:14:14,360 --> 00:14:17,160 desastres na Modern Marvels. 317 00:14:17,160 --> 00:14:18,680 >> Computadores - 318 00:14:18,680 --> 00:14:21,340 todos nós temos vindo a aceitar a problemas, muitas vezes frustrantes 319 00:14:21,340 --> 00:14:23,170 que ir com eles. 320 00:14:23,170 --> 00:14:27,570 Bugs, vírus e falhas de software são pequenos preços para pagar o 321 00:14:27,570 --> 00:14:28,960 conveniência. 322 00:14:28,960 --> 00:14:32,040 Mas, na alta tecnologia e de alta velocidade militar e programa espacial 323 00:14:32,040 --> 00:14:38,650 aplicações, o menor problema podem ser ampliados em desastre. 324 00:14:38,650 --> 00:14:44,480 >> Em 4 de junho de 1996, os cientistas preparados para lançar um foguete não tripulado Ariane 5. 325 00:14:44,480 --> 00:14:48,700 Ele estava transportando satélites científicos concebidos para estabelecer precisamente como 326 00:14:48,700 --> 00:14:53,250 o campo magnético da Terra interage com ventos solares. 327 00:14:53,250 --> 00:14:57,540 O foguete foi construído para o Europeu Agência Espacial e decolou de sua 328 00:14:57,540 --> 00:14:59,906 facilidade na costa da Guiana Francesa. 329 00:14:59,906 --> 00:15:03,660 >> JACK Ganssle: Em cerca de 37 segundo em o vôo, que notou pela primeira vez 330 00:15:03,660 --> 00:15:04,910 algo estava errado. 331 00:15:04,910 --> 00:15:08,130 Os bicos foram girando em uma maneira que eles realmente não deveria. 332 00:15:08,130 --> 00:15:12,380 Cerca de 40 segundos de vôo, claramente que o veículo estava em apuros. 333 00:15:12,380 --> 00:15:14,400 E isso é quando eles fizeram uma decisão de destruí-lo. 334 00:15:14,400 --> 00:15:18,520 O oficial de segurança gama, com tremenda coragem, apertou o botão, 335 00:15:18,520 --> 00:15:23,900 explodiu o foguete antes que ele pudesse tornar-se um perigo para a segurança pública. 336 00:15:23,900 --> 00:15:27,810 >> COLUNA 1: Esta foi a viagem inaugural do Ariane 5, e sua destruição 337 00:15:27,810 --> 00:15:32,020 ocorreu por causa de uma falha incorporado no software do foguete. 338 00:15:32,020 --> 00:15:33,980 >> JACK Ganssle: O problema no Ariane foi que havia um número 339 00:15:33,980 --> 00:15:36,390 que os 64 bits necessários para expressar. 340 00:15:36,390 --> 00:15:39,420 E eles queriam converter para um número de 16 bits. 341 00:15:39,420 --> 00:15:43,130 Eles assumido que o número nunca foi vai ser muito grande, que a maioria dos 342 00:15:43,130 --> 00:15:46,810 esses dígitos no 64-bit número foram zeros. 343 00:15:46,810 --> 00:15:48,270 Eles estavam errados. 344 00:15:48,270 --> 00:15:51,380 >> COLUNA 1: A incapacidade de um software programa para aceitar o tipo de 345 00:15:51,380 --> 00:15:55,350 número gerado pelo outro era na raiz da falha. 346 00:15:55,350 --> 00:15:59,970 O desenvolvimento de software tornou-se uma muito parte caro da nova tecnologia. 347 00:15:59,970 --> 00:16:03,980 O foguete Ariane 4 tinha sido muito bem sucedido, tanto do software 348 00:16:03,980 --> 00:16:07,480 criada por ele, também era usado no Ariane 5. 349 00:16:07,480 --> 00:16:11,980 >> PHILIP COYLE: O problema básico era que o Ariane 5 foi mais rápido, 350 00:16:11,980 --> 00:16:13,720 acelerados mais rápido. 351 00:16:13,720 --> 00:16:17,250 E o software não tinha representaram isso. 352 00:16:17,250 --> 00:16:20,770 >> COLUNA 1: A destruição do foguete foi um enorme desastre financeiro, 353 00:16:20,770 --> 00:16:24,200 tudo devido a um erro de software minuto. 354 00:16:24,200 --> 00:16:27,820 Mas esta não foi a primeira vez que dados problemas de conversão havia atormentado moderno 355 00:16:27,820 --> 00:16:30,620 tecnologia do foguete. 356 00:16:30,620 --> 00:16:34,480 >> JACK Ganssle: Em 1991, com o início da primeira Guerra do Golfo, o Patriot 357 00:16:34,480 --> 00:16:38,610 míssil experimentou um tipo semelhante de um problema de conversão de número. 358 00:16:38,610 --> 00:16:44,910 Como resultado, 28 soldados americanos foram mortos e cerca de 100 ficaram feridas 359 00:16:44,910 --> 00:16:48,600 quando o Patriot, que deveria para proteger contra Scuds entrada, 360 00:16:48,600 --> 00:16:51,630 não conseguiu disparar um míssil. 361 00:16:51,630 --> 00:16:55,110 >> COLUNA 1: Quando o Iraque invadiu o Kuwait e America lançou Tempestade no Deserto em 362 00:16:55,110 --> 00:17:00,570 início de 1991, as baterias de mísseis Patriot foram destacados para proteger a Arábia Saudita 363 00:17:00,570 --> 00:17:04,760 e Israel de Scud iraquiano ataques de mísseis. 364 00:17:04,760 --> 00:17:09,720 O Patriot é um de médio alcance EUA sistema superfície-ar fabricados por 365 00:17:09,720 --> 00:17:11,569 a empresa Raytheon. 366 00:17:11,569 --> 00:17:16,410 >> Theodore Postol: O tamanho do Patriot próprio interceptor é de aproximadamente 367 00:17:16,410 --> 00:17:17,710 20 metros de comprimento. 368 00:17:17,710 --> 00:17:20,800 E pesa cerca de 2000 quilos. 369 00:17:20,800 --> 00:17:22,940 E ele carrega uma ogiva de cerca de - 370 00:17:22,940 --> 00:17:24,905 Eu acho que é cerca de 150 quilos. 371 00:17:24,905 --> 00:17:31,030 E a própria ogiva é um alto explosivo que tem 372 00:17:31,030 --> 00:17:33,270 fragmentos em torno dele. 373 00:17:33,270 --> 00:17:37,490 O invólucro da ogiva é concebido agir como chumbo grosso. 374 00:17:37,490 --> 00:17:40,720 >> COLUNA 1: Os mísseis são realizadas quatro por recipiente e são transportados 375 00:17:40,720 --> 00:17:43,050 por um semi-reboque. 376 00:17:43,050 --> 00:17:47,490 >> PHILIP COYLE: The Patriot anti-míssil sistema volta a 377 00:17:47,490 --> 00:17:50,710 menos de 20 anos. 378 00:17:50,710 --> 00:17:54,350 Ele foi originalmente concebido como um míssil de defesa aérea para 379 00:17:54,350 --> 00:17:56,190 abater aviões inimigos. 380 00:17:56,190 --> 00:18:02,490 Na primeira Guerra do Golfo, quando a guerra veio, o Exército queria usá-lo 381 00:18:02,490 --> 00:18:05,535 para abater Scuds, e não aviões. 382 00:18:05,535 --> 00:18:09,310 A força aérea iraquiana não era tanto de um problema. 383 00:18:09,310 --> 00:18:12,450 Mas o Exército estava preocupado com Scuds. 384 00:18:12,450 --> 00:18:15,950 E assim eles tentaram atualizar o Patriot. 385 00:18:15,950 --> 00:18:18,750 >> COLUNA 1: Interceptar um míssil inimigo viajando a mach cinco era 386 00:18:18,750 --> 00:18:20,890 vai ser bastante difícil. 387 00:18:20,890 --> 00:18:25,590 Mas quando o Patriot foi levado às pressas para serviço, o Exército não estava ciente de um 388 00:18:25,590 --> 00:18:31,710 Modificação do Iraque, que fez sua Scuds quase impossível de bater. 389 00:18:31,710 --> 00:18:35,240 >> Theodore Postol: O que aconteceu são os que foram Scuds 390 00:18:35,240 --> 00:18:36,570 chegando eram instáveis. 391 00:18:36,570 --> 00:18:37,532 Eles estavam balançando. 392 00:18:37,532 --> 00:18:43,220 A razão para isso era que os iraquianos, em a fim de obter 600 km de uma 393 00:18:43,220 --> 00:18:47,530 Míssil de 300 quilômetros de alcance, tomou peso fora da ogiva da frente. 394 00:18:47,530 --> 00:18:49,290 Eles fizeram a ogiva mais leve. 395 00:18:49,290 --> 00:18:53,110 Portanto, agora o Patriot está tentando para vir ao Scud. 396 00:18:53,110 --> 00:18:56,470 E, na maioria das vezes, a esmagadora maior parte do tempo, seria apenas 397 00:18:56,470 --> 00:18:58,730 voar pelo Scud. 398 00:18:58,730 --> 00:19:01,760 >> COLUNA 1: Uma vez que o sistema Patriot operadores perceberam o Patriot perdeu 399 00:19:01,760 --> 00:19:06,690 seu alvo, eles detonaram os Patriots ogiva, para evitar possíveis 400 00:19:06,690 --> 00:19:10,300 baixas se fosse permitido a cair no chão. 401 00:19:10,300 --> 00:19:14,540 >> Theodore Postol: Isso foi o que mais as pessoas viam como grandes bolas de fogo no céu 402 00:19:14,540 --> 00:19:20,350 e incompreendido como intercepta Scud de ogivas. 403 00:19:20,350 --> 00:19:23,320 >> COLUNA 1: Embora na noite céus Patriotas parecia ser sucesso 404 00:19:23,320 --> 00:19:27,530 destruindo Scuds, em Dhahran lá poderia haver engano quanto à sua 405 00:19:27,530 --> 00:19:29,140 desempenho. 406 00:19:29,140 --> 00:19:34,180 Lá, o sistema de radar do Patriot perdido o controle de um Scud de entrada e nunca 407 00:19:34,180 --> 00:19:36,380 lançado devido a uma falha do software. 408 00:19:36,380 --> 00:19:39,890 409 00:19:39,890 --> 00:19:42,700 >> Foi a israelenses que descobriu que quanto maior for o sistema 410 00:19:42,700 --> 00:19:48,020 foi, quanto maior for o tempo de discrepância tornou-se devido a um relógio 411 00:19:48,020 --> 00:19:50,470 incorporado no computador do sistema. 412 00:19:50,470 --> 00:19:54,640 >> JACK Ganssle: Cerca de duas semanas antes da tragédia em Dhahran, os israelenses 413 00:19:54,640 --> 00:19:58,440 relatado para o Departamento de Defesa que o sistema estava a perder tempo. 414 00:19:58,440 --> 00:20:01,280 Depois de cerca de oito horas de funcionamento, eles notaram que o sistema é 415 00:20:01,280 --> 00:20:03,530 tornando-se visivelmente menos precisas. 416 00:20:03,530 --> 00:20:07,710 O Departamento de Defesa respondeu contando todas as baterias Patriot 417 00:20:07,710 --> 00:20:10,500 Para não deixar os sistemas por um longo período de tempo. 418 00:20:10,500 --> 00:20:12,430 Eles nunca disseram que há muito tempo era. 419 00:20:12,430 --> 00:20:13,330 Oito horas? 420 00:20:13,330 --> 00:20:13,810 10 horas? 421 00:20:13,810 --> 00:20:14,990 1000 horas? 422 00:20:14,990 --> 00:20:17,150 Ninguém sabia. 423 00:20:17,150 --> 00:20:20,220 >> COLUNA 1: A bateria Patriot estacionado no quartel em Dhahran 424 00:20:20,220 --> 00:20:24,660 e o seu relógio interno tinha sido danificado em mais de 100 horas na noite de 425 00:20:24,660 --> 00:20:27,470 25 de fevereiro. 426 00:20:27,470 --> 00:20:31,770 >> JACK Ganssle: É seguido o tempo para uma precisão de cerca de um décimo de segundo. 427 00:20:31,770 --> 00:20:34,480 Agora, um décimo de segundo é um Número interessante, porque ele não pode ser 428 00:20:34,480 --> 00:20:39,940 expresso em binário exactamente, o que significa ele não pode ser expressa em exactamente 429 00:20:39,940 --> 00:20:42,500 qualquer computador digital moderno. 430 00:20:42,500 --> 00:20:46,920 É difícil de acreditar, mas usar isso como um exemplo. 431 00:20:46,920 --> 00:20:49,000 Vamos pegar o número de um terço. 432 00:20:49,000 --> 00:20:53,150 Um terceiro não pode ser expressa em decimal exatamente. 433 00:20:53,150 --> 00:20:57,500 Um terço está indo 0,333 on para o infinito. 434 00:20:57,500 --> 00:21:02,270 Não há nenhuma maneira de fazer isso com precisão absoluta em decimal. 435 00:21:02,270 --> 00:21:05,370 Isso é exatamente o mesmo tipo de problema que aconteceu no Patriot. 436 00:21:05,370 --> 00:21:09,880 Quanto mais tempo o sistema funcionou, o o pior erro de tempo se tornou. 437 00:21:09,880 --> 00:21:13,840 >> COLUNA 1: Depois de 100 horas de funcionamento, o erro em tempo foi apenas 438 00:21:13,840 --> 00:21:16,140 cerca de um terço de um segundo. 439 00:21:16,140 --> 00:21:20,800 Mas em termos de direcionamento de um míssil viajando a mach cinco, que resultou em 440 00:21:20,800 --> 00:21:24,410 um erro de rastreamento de mais de 600 metros. 441 00:21:24,410 --> 00:21:27,670 Seria um erro fatal para os soldados em Dhahran. 442 00:21:27,670 --> 00:21:33,450 >> Theodore Postol: O que aconteceu é um Scud lançamento foi detectado no início de 443 00:21:33,450 --> 00:21:34,280 satélites de alerta. 444 00:21:34,280 --> 00:21:38,550 E eles sabiam que o Scud estava chegando em sua direção geral. 445 00:21:38,550 --> 00:21:41,000 Eles não sabiam de onde vinha. 446 00:21:41,000 --> 00:21:43,900 >> COLUNA 1: Era agora ao radar componente do sistema Patriota 447 00:21:43,900 --> 00:21:48,910 defender Dhahran para localizar e manter o controle do míssil inimigo de entrada. 448 00:21:48,910 --> 00:21:50,580 >> JACK Ganssle: O radar era muito inteligente. 449 00:21:50,580 --> 00:21:53,770 Seria realmente seguir a posição de o Scud e então prever onde 450 00:21:53,770 --> 00:21:57,160 seria provavelmente a próxima vez o radar enviou um pulso para fora. 451 00:21:57,160 --> 00:21:58,870 Que foi chamado no portão range. 452 00:21:58,870 --> 00:22:04,020 >> Theodore Postol: Então, uma vez que o Patriot decide passou tempo suficiente para ir 453 00:22:04,020 --> 00:22:09,420 para trás e verificar o próximo local para este objeto detectado, ele vai voltar. 454 00:22:09,420 --> 00:22:14,450 Assim, quando se voltou para o mal lugar, em seguida, vê nenhum objeto. 455 00:22:14,450 --> 00:22:18,200 E ele decide que não havia nenhum objeto, era uma detecção falsa, e 456 00:22:18,200 --> 00:22:19,680 Gotas da pista. 457 00:22:19,680 --> 00:22:22,970 >> COLUNA 1: O Scud entrada desaparecido da tela do radar, e 458 00:22:22,970 --> 00:22:26,050 segundos depois, ele bateu para o quartel. 459 00:22:26,050 --> 00:22:31,950 O Scud matou 28 e foi o último demitido durante a primeira Guerra do Golfo. 460 00:22:31,950 --> 00:22:37,700 Tragicamente, o software atualizado chegou em Dhahran no dia seguinte. 461 00:22:37,700 --> 00:22:41,800 A falha de software tinha sido fixada, fechando um capítulo na conturbada 462 00:22:41,800 --> 00:22:43,690 história do míssil Patriot. 463 00:22:43,690 --> 00:22:46,780 464 00:22:46,780 --> 00:22:50,710 >> Patriot é na verdade um acrônimo faseada para rastreamento Matriz 465 00:22:50,710 --> 00:22:51,960 Interceptar da meta. 466 00:22:51,960 --> 00:22:54,650 467 00:22:54,650 --> 00:23:00,840 >> DAVID J MALAN: Tudo bem, então um moderando exemplo, para ter certeza. 468 00:23:00,840 --> 00:23:03,430 E, felizmente, estes de nível inferior erros não são algo que nós vamos 469 00:23:03,430 --> 00:23:06,220 normalmente tem que apreciar, certamente não com as nossas 470 00:23:06,220 --> 00:23:07,360 primórdios dos programas. 471 00:23:07,360 --> 00:23:10,450 Em vez disso, a maioria dos erros que você vai encontro será lógico na natureza, 472 00:23:10,450 --> 00:23:12,900 sintáctica na qual a natureza código simplesmente não funciona direito. 473 00:23:12,900 --> 00:23:14,140 E você sabe disso muito rápido. 474 00:23:14,140 --> 00:23:16,850 >> Mas particularmente quando chegarmos ao final do semestre, que vai 475 00:23:16,850 --> 00:23:20,620 tornar-se mais e mais de uma possibilidade de pensar muito sobre o projeto 476 00:23:20,620 --> 00:23:22,960 dos seus programas e subjacentes representação 477 00:23:22,960 --> 00:23:24,520 há, também, dos dados. 478 00:23:24,520 --> 00:23:28,010 Por exemplo, vamos apresentar MySQL, que é um motor de banco de dados populares 479 00:23:28,010 --> 00:23:30,850 que você pode usar com sites de armazenar dados no back-end. 480 00:23:30,850 --> 00:23:34,630 E você vai ter que começar a decidir a o final do semestre, não só o que 481 00:23:34,630 --> 00:23:38,790 tipos de dados ao longo destas linhas para usar mas exatamente quantos bits de usar, 482 00:23:38,790 --> 00:23:42,740 se deseja ou não que para armazenar datas como as datas e horários como vezes, e também 483 00:23:42,740 --> 00:23:46,890 coisas como o tamanho que você deseja que o IDs únicos para ser, digamos, os usuários 484 00:23:46,890 --> 00:23:47,680 em seu banco de dados. 485 00:23:47,680 --> 00:23:51,210 >> Na verdade, se algum de vocês já tiveram Facebook é responsável por algum tempo, 486 00:23:51,210 --> 00:23:53,680 e você sabe como ter acesso para o seu ID do usuário - 487 00:23:53,680 --> 00:23:57,930 que, por vezes, mostra-se em sua URL do perfil a menos que você tenha escolhido um 488 00:23:57,930 --> 00:24:02,070 apelido para o URL, ou se você É usado Facebook Graph API, o 489 00:24:02,070 --> 00:24:05,510 API disponível publicamente pelo qual você Facebook pode pedir para dados brutos - 490 00:24:05,510 --> 00:24:07,580 você pode ver o seu ID é numérico. 491 00:24:07,580 --> 00:24:10,880 E há alguns anos, essencialmente Facebook tinha a alteração da utilização 492 00:24:10,880 --> 00:24:15,980 o equivalente à utilização de ints longo tempo porque ao longo do tempo que os usuários vêm 493 00:24:15,980 --> 00:24:19,780 e vão criar muitas contas de e contas falsas, mesmo que de forma muito fácil 494 00:24:19,780 --> 00:24:24,630 foram capazes de esgotar algo como um 4 bilhões possível valor como um int. 495 00:24:24,630 --> 00:24:28,340 >> Então mais sobre esses tipos de questões na estrada, também. 496 00:24:28,340 --> 00:24:30,750 Tudo bem, de modo que estava lançando. 497 00:24:30,750 --> 00:24:31,670 Essa foi a imprecisão. 498 00:24:31,670 --> 00:24:32,730 Um casal de anúncios rápidos. 499 00:24:32,730 --> 00:24:35,710 Então seções começar formalmente no próximo Domingo, segunda, terça-feira. 500 00:24:35,710 --> 00:24:39,080 Você vai ouvir via e-mail no final desta semana como a sua atribuição seção. 501 00:24:39,080 --> 00:24:42,570 E você também aqui nesse ponto como para mudar sua seção se o seu 502 00:24:42,570 --> 00:24:45,660 cronograma agora mudou ou o seu nível de conforto agora mudou. 503 00:24:45,660 --> 00:24:49,380 Enquanto isso, P-set e um hacker de um são devido esta quinta-feira com a opção de 504 00:24:49,380 --> 00:24:52,450 estender esse prazo por o especificações a sexta-feira 505 00:24:52,450 --> 00:24:53,830 de uma maneira típica. 506 00:24:53,830 --> 00:24:57,500 >> Perceba que acompanha o problema especificações definidas estão as instruções sobre 507 00:24:57,500 --> 00:25:02,770 como usar o aparelho CS50, fazer, bem como algumas ferramentas específicas CS50 508 00:25:02,770 --> 00:25:06,540 como o estilo dos anos 50, o que pode fornecer com feedback dinamicamente no 509 00:25:06,540 --> 00:25:10,230 qualidade do seu estilo de código e também verificar 50, que pode fornecer 510 00:25:10,230 --> 00:25:13,160 feedback dinâmico quanto à sua correção do código. 511 00:25:13,160 --> 00:25:16,850 Perdoe que ainda estamos passando fora algumas dobras com cheque 50. 512 00:25:16,850 --> 00:25:21,490 Alguns de seus colegas que se iniciam em torno de quatro horas na sexta-feira à noite, quando 513 00:25:21,490 --> 00:25:25,130 a especificação subiu ter notado desde então alguns bugs que estamos trabalhando 514 00:25:25,130 --> 00:25:29,010 através de e desculpas para quem experimentou frustrações desnecessárias. 515 00:25:29,010 --> 00:25:30,340 A culpa é minha. 516 00:25:30,340 --> 00:25:34,080 Mas vamos acompanhar o CS50 discutir quando isso for resolvido. 517 00:25:34,080 --> 00:25:35,700 >> Assim, uma palavra sobre os próprios pontuações. 518 00:25:35,700 --> 00:25:38,990 Então vai ser uma semana ou duas antes de você começar a receber feedback sobre conjuntos de problemas 519 00:25:38,990 --> 00:25:40,640 porque você ainda não tem um companheiro de ensino. 520 00:25:40,640 --> 00:25:44,510 E mesmo assim, vamos começar a avaliar o problema C coloca diante de nós 521 00:25:44,510 --> 00:25:46,970 voltar e avaliar zero para que você obtenha mais relevante 522 00:25:46,970 --> 00:25:48,150 feedback mais rapidamente. 523 00:25:48,150 --> 00:25:51,870 Mas, em geral por o currículo, CS50 conjuntos de problemas são avaliados ao longo do 524 00:25:51,870 --> 00:25:53,580 seguindo quatro eixos - 525 00:25:53,580 --> 00:25:55,760 escopo, correção, design e estilo. 526 00:25:55,760 --> 00:25:59,210 >> Âmbito vai ser um número tipicamente entre zero e cinco que 527 00:25:59,210 --> 00:26:01,830 captura quanto da pedaço que mordeu. 528 00:26:01,830 --> 00:26:03,750 Normalmente, você quer que isso seja cinco. 529 00:26:03,750 --> 00:26:05,300 Você pelo menos tentou de tudo. 530 00:26:05,300 --> 00:26:09,330 E notem que é um fator multiplicativo fazendo de modo que apenas uma parte da 531 00:26:09,330 --> 00:26:12,520 conjunto de problemas não é a melhor estratégia. 532 00:26:12,520 --> 00:26:15,610 >> Enquanto isso, o mais evidente é a importância da correção - 533 00:26:15,610 --> 00:26:18,620 apenas é o seu programa correto com respeitar a especificação? 534 00:26:18,620 --> 00:26:21,510 Este é ponderada mais deliberadamente fortemente do que os outros dois eixos de um 535 00:26:21,510 --> 00:26:24,450 fator de três, porque reconhecemos que normalmente você vai gastar 536 00:26:24,450 --> 00:26:28,600 muito mais tempo perseguindo alguns bugs, obtenção de seu código para funcionar, então você 537 00:26:28,600 --> 00:26:31,540 estão recuando e escolhendo nomes de variáveis ​​adequadas e as 538 00:26:31,540 --> 00:26:33,800 procura, que está na outra extremidade do espectro de modelo. 539 00:26:33,800 --> 00:26:36,160 >> Isso não quer dizer que o estilo não é importante, e nós vamos pregar sobre isso 540 00:26:36,160 --> 00:26:37,920 tempo, tanto em palestras e seções. 541 00:26:37,920 --> 00:26:40,520 Estilo refere à estética do seu código. 542 00:26:40,520 --> 00:26:43,980 Já escolheu variáveis ​​bem-nomeados que são curtos, mas pouco 543 00:26:43,980 --> 00:26:44,680 descritivo? 544 00:26:44,680 --> 00:26:47,840 É o código recuado como você já viu em palestra e de uma forma consistente 545 00:26:47,840 --> 00:26:49,070 com estilo dos anos 50? 546 00:26:49,070 --> 00:26:51,220 >> Por último é o projeto certo lá no meio. 547 00:26:51,220 --> 00:26:54,090 Design é o mais difícil uma para colocar um dedo sobre porque é muito mais 548 00:26:54,090 --> 00:26:55,000 subjetiva. 549 00:26:55,000 --> 00:26:58,610 Mas é, talvez, o mais importante de os três eixos, em termos de pedagógico 550 00:26:58,610 --> 00:27:02,050 valor ao longo do tempo e que este será oportunidade do companheiro de ensino para 551 00:27:02,050 --> 00:27:04,110 fornecer feedback qualitativo. 552 00:27:04,110 --> 00:27:08,100 De fato, em CS50, embora nós temos estas fórmulas e pontuações, no final 553 00:27:08,100 --> 00:27:11,350 do dia, estes são muito deliberadamente muito pequenos baldes - valores de ponto 554 00:27:11,350 --> 00:27:13,460 entre zero e três e zero e cinco. 555 00:27:13,460 --> 00:27:17,800 Nós não tente desenhar linhas muito grossas entre conjuntos de problemas ou entre 556 00:27:17,800 --> 00:27:21,490 alunos, mas sim focar tanto quanto pudermos sobre qualitativa, longhand 557 00:27:21,490 --> 00:27:25,490 feedback, ou digitado ou verbal de seu companheiro de ensino particular, 558 00:27:25,490 --> 00:27:27,050 você vai conhecer muito bem. 559 00:27:27,050 --> 00:27:32,340 >> Mas, em geral, são os pesos que os vários eixos terá. 560 00:27:32,340 --> 00:27:35,480 Enquanto isso, também, é importante ter em mente que você não deve presumir que uma 561 00:27:35,480 --> 00:27:38,870 três em cada cinco é de 60% e portanto, cerca de falhar. 562 00:27:38,870 --> 00:27:41,410 Três é deliberadamente feito para ser espécie de meio do caminho bom. 563 00:27:41,410 --> 00:27:43,480 Se você estiver recebendo trios no início do semestre, que é 564 00:27:43,480 --> 00:27:46,340 na verdade deveria ser uma boa lugar para começar. 565 00:27:46,340 --> 00:27:50,510 Se você estiver recebendo twos, feiras, há definitivamente um trabalho para pagar um pouco 566 00:27:50,510 --> 00:27:53,250 mais atenção, para tirar proveito de seções e horário de expediente. 567 00:27:53,250 --> 00:27:54,590 >> Se você estiver recebendo fours e cinco anos, ótimo. 568 00:27:54,590 --> 00:27:57,430 Mas, realmente, nós esperamos ver trajetórias entre os estudantes - muito 569 00:27:57,430 --> 00:28:00,575 individualizada por aluno, mas a partir o semestre aqui em uma espécie de 570 00:28:00,575 --> 00:28:04,100 os dois para os três gama mas terminando aqui na faixa de 4-5. 571 00:28:04,100 --> 00:28:05,440 Isso é o que estamos realmente procurando. 572 00:28:05,440 --> 00:28:09,590 E tenha em mente que o delta você expõe semana entre zero e semana 573 00:28:09,590 --> 00:28:12,170 12 quando eu estou fazendo notas. 574 00:28:12,170 --> 00:28:16,380 Não importa para nós absolutamente como você justo no início se o seu 575 00:28:16,380 --> 00:28:19,330 trajetória é de fato ascendente e forte. 576 00:28:19,330 --> 00:28:24,000 >> Honestidade acadêmica - então deixe-me colocar no meu voz mais grave por apenas um momento. 577 00:28:24,000 --> 00:28:28,510 Portanto, este curso tem a distinção de enviando mais alunos do que qualquer outra 578 00:28:28,510 --> 00:28:30,950 na história da placa do anúncio, eu acredito. 579 00:28:30,950 --> 00:28:34,220 Temos uma espécie de contagem perdido neste ponto de quantas vezes isso acontece. 580 00:28:34,220 --> 00:28:37,090 E isso não é porque os alunos em 50 são mais desonesto do que o seu 581 00:28:37,090 --> 00:28:38,690 colegas em outros lugares. 582 00:28:38,690 --> 00:28:42,800 Mas perceber, também, que são muito bons em detectar este tipo de coisa. 583 00:28:42,800 --> 00:28:45,920 >> E essa é a vantagem que um aula de ciência da computação tem em que 584 00:28:45,920 --> 00:28:49,110 pode e nós comparar todos os alunos problema conjuntos de pares contra todos 585 00:28:49,110 --> 00:28:51,470 outro, não só este ano mas todos os anos anteriores. 586 00:28:51,470 --> 00:28:55,080 Temos a capacidade, como alunos em a classe, a Google e encontrar o código 587 00:28:55,080 --> 00:28:57,440 em sites como o github e fóruns de discussão. 588 00:28:57,440 --> 00:29:00,840 Não há absolutamente soluções para o CS50 p-define flutuando por aí. 589 00:29:00,840 --> 00:29:02,710 Mas se você pode encontrá-los, nós podemos encontrá-los. 590 00:29:02,710 --> 00:29:07,130 E tudo isso é muito automatizado e fácil e triste para nós encontrar. 591 00:29:07,130 --> 00:29:10,990 >> Mas eu quero enfatizar, também, que o política de honestidade acadêmica do curso é 592 00:29:10,990 --> 00:29:13,960 muito para ser muito o oposto do que o espírito. 593 00:29:13,960 --> 00:29:17,506 Na verdade, este ano temos reformulada coisas no currículo para ser isso, dot 594 00:29:17,506 --> 00:29:19,790 dot dot, com mais detalhes no programa. 595 00:29:19,790 --> 00:29:22,860 Mas o tema principal do curso realmente deve ser razoável. 596 00:29:22,860 --> 00:29:26,160 Reconhecemos que há uma significativa quantidade de pedagógico 597 00:29:26,160 --> 00:29:30,550 valor em colaborar, de alguma forma, com os colegas, em que você 598 00:29:30,550 --> 00:29:33,700 duas ou três ou mais são situando-se em um quadro branco 599 00:29:33,700 --> 00:29:35,670 quadro de comunicações, de modo a falar, suas idéias - 600 00:29:35,670 --> 00:29:39,480 escrever pseudocódigo em fotos, diagramação que deve ser Mario se 601 00:29:39,480 --> 00:29:41,350 você fosse escrever pela primeira vez em pseudocódigo. 602 00:29:41,350 --> 00:29:43,240 Qual deve ser o algoritmo guloso - 603 00:29:43,240 --> 00:29:46,100 como deve comportar-se por define um problema? 604 00:29:46,100 --> 00:29:50,440 >> E assim perceber que o comportamento que sugerimos é muito 605 00:29:50,440 --> 00:29:51,470 muito nesse sentido. 606 00:29:51,470 --> 00:29:53,890 E no programa, você verá uma grupo inteiro de balas sob a 607 00:29:53,890 --> 00:29:57,740 categoria razoável e não razoável categoria que ajuda a nos ajudar 608 00:29:57,740 --> 00:30:00,740 você envolver sua mente em torno de onde nós desenhar a linha. 609 00:30:00,740 --> 00:30:04,340 E, em geral, uma regra de ouro decente é que, se você está lutando para resolver 610 00:30:04,340 --> 00:30:07,990 algum bug e seu amigo ou colega está sentado ao seu lado, é 611 00:30:07,990 --> 00:30:11,530 razoável para que você possa mostrar-lhe seu código e dizer: ei, você pode ajudar 612 00:30:11,530 --> 00:30:13,700 me descobrir o que está acontecendo de errado aqui? 613 00:30:13,700 --> 00:30:17,110 >> Nós não costumam abraçar no lado oposto. 614 00:30:17,110 --> 00:30:20,730 Não é a resposta correta para o seu amigo ou colega aqui para dizer, oh, 615 00:30:20,730 --> 00:30:22,510 basta olhar para o meu e figura lo a partir daí. 616 00:30:22,510 --> 00:30:24,400 Isso é uma espécie de irracional. 617 00:30:24,400 --> 00:30:27,750 Mas ter alguém, um outro cérebro, outro par de olhos olhar 618 00:30:27,750 --> 00:30:31,620 sua tela ou olhar para o código e dizer, você tem certeza que quer 619 00:30:31,620 --> 00:30:32,760 ter um loop aqui? 620 00:30:32,760 --> 00:30:34,800 Ou você tem certeza que quer que ponto e vírgula aqui? 621 00:30:34,800 --> 00:30:37,090 Ou oh, essa mensagem de erro significa isso. 622 00:30:37,090 --> 00:30:39,580 Aqueles que são muito razoáveis ​​e comportamentos incentivado. 623 00:30:39,580 --> 00:30:44,010 >> Os casos a que estava se referindo a mais cedo se resumem a quando os alunos são 624 00:30:44,010 --> 00:30:47,350 tarde da noite fazendo mau juízo decisões e e-mail o seu código de 625 00:30:47,350 --> 00:30:50,130 alguém ou apenas dizendo, aqui, é no Dropbox ou 626 00:30:50,130 --> 00:30:51,610 Pesquisando tarde da noite. 627 00:30:51,610 --> 00:30:54,880 E por isso gostaria de incentivar e imploro, se você tem aqueles inevitável 628 00:30:54,880 --> 00:30:58,450 momentos de stress, você está esbarrando contra o prazo, você não tem fim 629 00:30:58,450 --> 00:31:01,490 dia, uma vez que já é sexta-feira em que ponto, e-mail cabeças do curso ou 630 00:31:01,490 --> 00:31:02,330 me diretamente. 631 00:31:02,330 --> 00:31:04,790 Dizer, escutar, eu estou no meu ponto de ruptura aqui. 632 00:31:04,790 --> 00:31:06,660 Vamos ter uma conversa e descobrir isso. 633 00:31:06,660 --> 00:31:10,400 Recorrendo à web ou algum outro não comportamento razoável nunca é o 634 00:31:10,400 --> 00:31:13,070 solução, e muitos de seus colegas não estão mais aqui 635 00:31:13,070 --> 00:31:15,150 campus por causa dessa falta de bom senso. 636 00:31:15,150 --> 00:31:17,840 Mas é muito fácil de contornar essa linha. 637 00:31:17,840 --> 00:31:22,950 >> E aqui está uma pequena imagem para animá lo a partir Reddit modo que agora 638 00:31:22,950 --> 00:31:25,720 tudo estará OK. 639 00:31:25,720 --> 00:31:30,210 >> Assim, uma rápida recapitulação, em seguida, de onde paramos. 640 00:31:30,210 --> 00:31:33,690 Então, na semana passada, lembro que nós introduzimos condições, não no risco 641 00:31:33,690 --> 00:31:34,880 mas desta vez em C. 642 00:31:34,880 --> 00:31:38,300 E havia alguma nova sintaxe, mas realmente nenhuma idéia nova, por si só. 643 00:31:38,300 --> 00:31:42,630 Tivemos expressões booleanas que pudéssemos ou em conjunto com duas verticais 644 00:31:42,630 --> 00:31:46,490 bares ou e junto com dois ampersands, dizendo que tanto a esquerda 645 00:31:46,490 --> 00:31:49,990 eo direito deve ser verdade para este a ser executado. 646 00:31:49,990 --> 00:31:53,150 Então nós tivemos switches, que olhou em breve, mas eu proponho são realmente 647 00:31:53,150 --> 00:31:56,830 apenas sintaxe diferente para alcançar o mesmo tipo de objetivo se você sabe em 648 00:31:56,830 --> 00:31:59,270 avançar o que seus casos vão ser. 649 00:31:59,270 --> 00:32:00,160 >> Olhamos para loops. 650 00:32:00,160 --> 00:32:03,340 Um loop for é talvez a mais comum, ou, pelo menos, aquele que pessoas 651 00:32:03,340 --> 00:32:05,330 geralmente atingem para instintivamente. 652 00:32:05,330 --> 00:32:08,240 Mesmo que ele parece um pouco enigmática, você vai ver muitos, muitos exemplos deste 653 00:32:08,240 --> 00:32:11,590 em pouco tempo, como você tem já na semana passada. 654 00:32:11,590 --> 00:32:14,280 While pode similarmente alcançar a mesma coisa. 655 00:32:14,280 --> 00:32:17,550 Mas se você quiser fazer alguma incrementação ou actualização de 656 00:32:17,550 --> 00:32:20,230 Os valores da variável, você tem que fazê-lo manualmente mais do que o 657 00:32:20,230 --> 00:32:22,440 loop for antes permite. 658 00:32:22,440 --> 00:32:25,310 E depois há o do-while, o que nos permite fazer algo em 659 00:32:25,310 --> 00:32:28,460 menos uma vez, enquanto algo o resto é verdadeiro. 660 00:32:28,460 --> 00:32:31,550 E isto é particularmente bom para programas ou para jogos onde você quer 661 00:32:31,550 --> 00:32:33,810 para avisar o usuário para algo pelo menos uma vez. 662 00:32:33,810 --> 00:32:37,110 E então, se ele ou ela não cooperar, você pode querer fazê-lo 663 00:32:37,110 --> 00:32:38,420 uma e outra vez. 664 00:32:38,420 --> 00:32:41,270 >> Com variáveis, entretanto, tivemos linhas de um código como este, o que poderia 665 00:32:41,270 --> 00:32:41,950 ser duas linhas. 666 00:32:41,950 --> 00:32:44,830 Você pode declarar um int chamado contador, ponto e vírgula. 667 00:32:44,830 --> 00:32:47,660 Ou você pode simplesmente declarar e defini-lo, por assim dizer. 668 00:32:47,660 --> 00:32:49,950 Dá-se um valor, ao mesmo tempo. 669 00:32:49,950 --> 00:32:51,890 >> E então, finalmente, falamos sobre as funções. 670 00:32:51,890 --> 00:32:54,270 E este foi um bom exemplo de no sentido de que ela ilustra 671 00:32:54,270 --> 00:32:55,840 dois tipos de funções. 672 00:32:55,840 --> 00:32:59,030 Uma é GetString (), a qual, novamente, recebe uma string do usuário. 673 00:32:59,030 --> 00:33:02,040 Mas GetString () é bem interessante, medida em que usei, 674 00:33:02,040 --> 00:33:05,620 porque sempre usado com algo sobre o lado esquerdo de um 675 00:33:05,620 --> 00:33:06,600 sinal de igual. 676 00:33:06,600 --> 00:33:09,830 Isto quer dizer que GetString () retorna um valor. 677 00:33:09,830 --> 00:33:11,970 Ele retorna, é claro, uma string. 678 00:33:11,970 --> 00:33:15,130 E em seguida, no lado esquerdo, estamos simplesmente salvar essa string dentro de um 679 00:33:15,130 --> 00:33:16,580 variável chamada nome. 680 00:33:16,580 --> 00:33:21,100 >> Isto é diferente, em certo sentido, a partir printf printf porque, pelo menos em nosso 681 00:33:21,100 --> 00:33:23,540 uso aqui, não retorna nada. 682 00:33:23,540 --> 00:33:24,960 Como um aparte, ele faz algo de retorno. 683 00:33:24,960 --> 00:33:26,380 Nós simplesmente não ligo para o que ele é. 684 00:33:26,380 --> 00:33:29,090 Mas ele tem o que é chamado efeito colateral. 685 00:33:29,090 --> 00:33:31,840 E o que é efeito colateral em cada caso que já vimos até agora? 686 00:33:31,840 --> 00:33:34,720 O que printf fazer? 687 00:33:34,720 --> 00:33:37,780 Ela imprime algo na tela, apresenta texto ou números ou algo 688 00:33:37,780 --> 00:33:38,380 no ecrã. 689 00:33:38,380 --> 00:33:41,170 E isso é apenas considerado um efeito colateral porque não está realmente entregando 690 00:33:41,170 --> 00:33:41,900 lo de volta para mim. 691 00:33:41,900 --> 00:33:44,770 Não é uma resposta dentro de uma caixa preta que eu possa, em seguida, 692 00:33:44,770 --> 00:33:46,130 chegar em e agarrar. 693 00:33:46,130 --> 00:33:49,160 É apenas fazendo isso por conta própria, muito como Colton estava ligado a este 694 00:33:49,160 --> 00:33:52,560 caixa-preta, na semana passada, e ele de alguma forma magicamente estava desenhando no quadro 695 00:33:52,560 --> 00:33:54,500 sem me realmente envolvidos. 696 00:33:54,500 --> 00:33:55,560 Isso seria um efeito colateral. 697 00:33:55,560 --> 00:33:59,100 Mas se eu realmente tinha que chegar de volta em aqui e dizer, oh, aqui é a string 698 00:33:59,100 --> 00:34:02,040 do utilizador, que faria ser um valor de retorno. 699 00:34:02,040 --> 00:34:05,650 >> E, até agora, temos funções utilizadas apenas que outras pessoas escreveram. 700 00:34:05,650 --> 00:34:09,219 Mas podemos realmente fazer estes tipos de coisas que nós mesmos. 701 00:34:09,219 --> 00:34:12,730 Então, eu estou indo para ir para o CS50 aparelho novo. 702 00:34:12,730 --> 00:34:16,020 Deixe-me fechar a aba que tinha aberto há pouco. 703 00:34:16,020 --> 00:34:18,530 E deixe-me ir em frente e criar um novo arquivo. 704 00:34:18,530 --> 00:34:22,400 E eu estou indo para ir em frente e chamar isso de uma positive.c. 705 00:34:22,400 --> 00:34:24,770 Então, eu quero fazer alguma coisa com números positivos aqui. 706 00:34:24,770 --> 00:34:27,219 Então, eu estou indo para ir em frente e fazer int - 707 00:34:27,219 --> 00:34:28,000 sorry - 708 00:34:28,000 --> 00:34:31,840 # Include. 709 00:34:31,840 --> 00:34:34,280 Não vamos fazer o mesmo erro como antes. 710 00:34:34,280 --> 00:34:40,020 Int main (void), open encaracolado cinta, cinta fechado encaracolado. 711 00:34:40,020 --> 00:34:41,639 >> E agora eu quero fazer o seguinte. 712 00:34:41,639 --> 00:34:44,600 Eu quero escrever um programa que insiste em que o usuário dá 713 00:34:44,600 --> 00:34:46,770 me um inteiro positivo. 714 00:34:46,770 --> 00:34:50,969 Portanto, não há função GetPositiveInt na biblioteca CS50. 715 00:34:50,969 --> 00:34:52,610 Há apenas GetInt (). 716 00:34:52,610 --> 00:34:55,790 Mas tudo bem, porque eu tenho a construções com o qual eu posso impor uma 717 00:34:55,790 --> 00:34:59,360 pouco mais restrição nesse valor. 718 00:34:59,360 --> 00:35:00,990 Eu poderia fazer algo assim. 719 00:35:00,990 --> 00:35:02,780 >> Assim int n - 720 00:35:02,780 --> 00:35:04,920 e se você está digitando junto, basta perceber Eu vou voltar e 721 00:35:04,920 --> 00:35:06,430 mudar algumas coisas em um instante - 722 00:35:06,430 --> 00:35:09,960 assim int n é igual GetInt (). 723 00:35:09,960 --> 00:35:11,780 E que vai colocar um int dentro do n. 724 00:35:11,780 --> 00:35:13,830 E deixe-me ser uma mais descritivo. 725 00:35:13,830 --> 00:35:23,270 Deixe-me dizer algo como exijo que você me dá um inteiro positivo. 726 00:35:23,270 --> 00:35:23,550 >> Tudo bem. 727 00:35:23,550 --> 00:35:25,250 Então, basta um pouco de instruções. 728 00:35:25,250 --> 00:35:26,270 E agora o que eu posso fazer? 729 00:35:26,270 --> 00:35:29,840 Bem, eu já sei da minha simples condições ou ramificações, assim como eu 730 00:35:29,840 --> 00:35:36,100 teve em risco, eu poderia dizer algo como se n é inferior ou igual a 731 00:35:36,100 --> 00:35:44,460 zero, então eu quero fazer alguma coisa procura, que não é positivo. 732 00:35:44,460 --> 00:35:45,560 E então eu poderia fazer - 733 00:35:45,560 --> 00:35:47,310 OK, mas eu realmente quero começar esse int. 734 00:35:47,310 --> 00:35:52,020 Para que eu pudesse ir até aqui e eu poderia tipo de cópia deste e travessão isso. 735 00:35:52,020 --> 00:35:52,570 E, em seguida, OK. 736 00:35:52,570 --> 00:35:56,990 Assim, se n é inferior ou igual a zero fazer isso. 737 00:35:56,990 --> 00:35:58,900 >> Agora, se o usuário não cooperar? 738 00:35:58,900 --> 00:36:01,560 Bem, então eu vou pedir isso aqui. 739 00:36:01,560 --> 00:36:03,130 E então eu entro aqui e aqui e aqui. 740 00:36:03,130 --> 00:36:06,420 Assim, este não é claramente a solução, certo? 741 00:36:06,420 --> 00:36:07,810 Porque não há fim à vista. 742 00:36:07,810 --> 00:36:13,100 Se eu quiser exigir que o usuário dá me um inteiro positivo, eu posso 743 00:36:13,100 --> 00:36:14,150 realmente obter o int. 744 00:36:14,150 --> 00:36:15,620 Posso, então, verificar que int. 745 00:36:15,620 --> 00:36:18,570 Mas, então, eu quero verificá-lo novamente e verificá-lo novamente e verifique novamente. 746 00:36:18,570 --> 00:36:21,680 Então, obviamente, o que é o melhor construir estar usando aqui? 747 00:36:21,680 --> 00:36:22,840 Tudo bem, então uma espécie de loop. 748 00:36:22,840 --> 00:36:25,430 >> Então, eu estou indo para se livrar de quase toda esta. 749 00:36:25,430 --> 00:36:27,320 E eu quero começar este int, pelo menos uma vez. 750 00:36:27,320 --> 00:36:28,890 Então, eu vou dizer que fazer - 751 00:36:28,890 --> 00:36:32,110 e eu vou voltar para o enquanto em apenas um momento - 752 00:36:32,110 --> 00:36:33,050 agora, fazer o quê? 753 00:36:33,050 --> 00:36:35,860 Eu vou fazer int n fica GetInt (). 754 00:36:35,860 --> 00:36:36,080 OK. 755 00:36:36,080 --> 00:36:37,250 Então, isso é muito bom. 756 00:36:37,250 --> 00:36:39,750 E agora, como costumam fazer Eu quero fazer isso? 757 00:36:39,750 --> 00:36:45,770 >> Deixe-me colocar o printf dentro do loop para que eu possa exigir uma e outra vez, 758 00:36:45,770 --> 00:36:46,740 se for necessário. 759 00:36:46,740 --> 00:36:49,720 E o que eu quero isso enquanto condição de fazer? 760 00:36:49,720 --> 00:36:53,870 Eu quero continuar fazendo isso enquanto o que é o caso? 761 00:36:53,870 --> 00:36:54,125 Sim. 762 00:36:54,125 --> 00:36:55,390 N é inferior a ou igual a zero. 763 00:36:55,390 --> 00:36:58,180 Então, já, temos significativamente limpo este código para cima. 764 00:36:58,180 --> 00:37:00,700 Nós emprestado construir uma forma muito simples - o do-while. 765 00:37:00,700 --> 00:37:04,690 Eu roubei apenas as linhas importantes de código que eu comecei a copiar e 766 00:37:04,690 --> 00:37:05,960 colar, o que não era sábio. 767 00:37:05,960 --> 00:37:09,790 E agora eu vou colar na verdade isso aqui e fazê-lo apenas uma vez. 768 00:37:09,790 --> 00:37:12,990 >> E agora o que eu quero fazer no o fim deste programa? 769 00:37:12,990 --> 00:37:16,810 Eu só vou dizer uma coisa simples gosto, obrigado pela - e 770 00:37:16,810 --> 00:37:18,980 Farei% i para int - 771 00:37:18,980 --> 00:37:23,270 barra invertida n, vírgula e, em seguida, conecte n, ponto e vírgula. 772 00:37:23,270 --> 00:37:23,910 >> Tudo bem. 773 00:37:23,910 --> 00:37:27,290 Então vamos ver o que acontece agora quando eu executar este programa. 774 00:37:27,290 --> 00:37:30,600 Eu estou indo para ir em frente e fazem positiva. 775 00:37:30,600 --> 00:37:30,880 Droga. 776 00:37:30,880 --> 00:37:31,600 Alguns erros. 777 00:37:31,600 --> 00:37:32,960 Então deixe-me ir de volta para o primeiro. 778 00:37:32,960 --> 00:37:34,020 Não trabalhar com eles para trás. 779 00:37:34,020 --> 00:37:37,000 Trabalhar com eles de cima para baixo para que não cascata e só 780 00:37:37,000 --> 00:37:38,630 uma coisa estar errada. 781 00:37:38,630 --> 00:37:42,532 Declaração implícita de função GetInt (). 782 00:37:42,532 --> 00:37:43,020 Sim. 783 00:37:43,020 --> 00:37:44,420 Então não foi o suficiente. 784 00:37:44,420 --> 00:37:46,760 Eu meio que cometeu o mesmo erro, mas um pouco diferente desta vez. 785 00:37:46,760 --> 00:37:51,940 Eu preciso não só incluir stdio.h, mas Também cs50.h, que inclui o 786 00:37:51,940 --> 00:37:56,770 chamados declarações de obter int, que ensinar o aparelho, ou ensina 787 00:37:56,770 --> 00:37:58,760 C que GetInt () é. 788 00:37:58,760 --> 00:37:59,550 >> Então deixe-me salve. 789 00:37:59,550 --> 00:38:02,040 Eu vou ignorar os outros erros porque eu vou esperar que eles são 790 00:38:02,040 --> 00:38:05,210 de alguma forma relacionado com o erro Eu já fixadas. 791 00:38:05,210 --> 00:38:08,710 Então deixe-me ir em frente e recompilar com fazer positivo, Enter. 792 00:38:08,710 --> 00:38:09,020 Droga. 793 00:38:09,020 --> 00:38:09,985 Três erros, ainda. 794 00:38:09,985 --> 00:38:12,650 Deixe-me ir até o primeiro. 795 00:38:12,650 --> 00:38:14,320 N variáveis ​​não utilizadas. 796 00:38:14,320 --> 00:38:15,850 Não vi isso antes. 797 00:38:15,850 --> 00:38:17,200 E isto, também, é um pouco enigmática. 798 00:38:17,200 --> 00:38:18,850 Esta é a saída do compilador. 799 00:38:18,850 --> 00:38:23,610 E o que essa linha destaque lá - positive.c :9:13 - 800 00:38:23,610 --> 00:38:28,960 está dizendo, ele está dizendo na linha nove positive.c, no caráter 13, 801 00:38:28,960 --> 00:38:31,510 13 coluna, cometi este erro. 802 00:38:31,510 --> 00:38:34,230 >> E, em particular, está dizendo me não utilizado n variável. 803 00:38:34,230 --> 00:38:35,790 Então vamos ver - 804 00:38:35,790 --> 00:38:37,150 linha nove. 805 00:38:37,150 --> 00:38:40,430 Estou utilizando n no sentido de que Eu estou dando-lhe um valor. 806 00:38:40,430 --> 00:38:44,200 Mas o que o compilador não gosto é que eu não estou aparentemente usá-lo. 807 00:38:44,200 --> 00:38:45,560 Mas espere um minuto, eu estou usando ele. 808 00:38:45,560 --> 00:38:48,170 Na linha 11, eu estou usando aqui. 809 00:38:48,170 --> 00:38:52,430 Mas se eu rolar mais em positive.c :11 - 810 00:38:52,430 --> 00:38:56,230 para a linha 11, 12 caracteres, o compilador está me dizendo, o uso de 811 00:38:56,230 --> 00:38:58,670 não declarado identificador n. 812 00:38:58,670 --> 00:39:02,760 >> Meios Então não declaradas que tenho não especificados como um 813 00:39:02,760 --> 00:39:04,970 variável com um tipo de dados. 814 00:39:04,970 --> 00:39:05,500 Mas espere um minuto. 815 00:39:05,500 --> 00:39:09,150 Eu fiz exatamente isso em linha de nove. 816 00:39:09,150 --> 00:39:11,100 Então, alguém está realmente confuso. 817 00:39:11,100 --> 00:39:14,900 É eu ou o compilador porque em linha nove, mais uma vez, eu estou declarando um 818 00:39:14,900 --> 00:39:18,650 int n, e eu estou atribuindo-lhe o retornar o valor de GetInt (). 819 00:39:18,650 --> 00:39:22,930 Então eu estou usando essa variável n em linha 11 e verificar se o seu valor for inferior 820 00:39:22,930 --> 00:39:24,050 que ou igual a zero. 821 00:39:24,050 --> 00:39:27,430 Mas isso, aparentemente, é ruim e quebrado por quê? 822 00:39:27,430 --> 00:39:30,630 823 00:39:30,630 --> 00:39:32,490 Diga isso de novo? 824 00:39:32,490 --> 00:39:35,690 >> Ah, eu tenho que declarar n antes entrar no circuito. 825 00:39:35,690 --> 00:39:36,370 Mas por quê? 826 00:39:36,370 --> 00:39:39,830 Quero dizer, nós apenas propôs um pouco atrás, que não há problema em declarar variáveis 827 00:39:39,830 --> 00:39:43,600 tudo em uma linha e, em seguida, atribuir-lhes algum valor. 828 00:39:43,600 --> 00:39:46,790 Uma variável global - vamos voltar a idéia de que em apenas um momento. 829 00:39:46,790 --> 00:39:48,690 Por que você quer me colocar para fora do loop? 830 00:39:48,690 --> 00:40:03,170 831 00:40:03,170 --> 00:40:03,830 É. 832 00:40:03,830 --> 00:40:06,780 Exatamente. 833 00:40:06,780 --> 00:40:09,610 >> Assim, embora, um pouco contra-intuitivo, deixe-me resumir. 834 00:40:09,610 --> 00:40:13,510 Quando você declarar n dentro do bloco de fazer lá - 835 00:40:13,510 --> 00:40:16,320 especificamente dentro de essas chaves - 836 00:40:16,320 --> 00:40:19,210 essa variável n tem o que é chamado de escopo - 837 00:40:19,210 --> 00:40:23,210 alheios ao nosso sistema de pontuação no é claro -, mas tem um escopo que é 838 00:40:23,210 --> 00:40:25,190 limita-se às chaves. 839 00:40:25,190 --> 00:40:28,460 Em outras palavras, normalmente se você declarar uma variável dentro de um conjunto de 840 00:40:28,460 --> 00:40:33,370 chaves, essa variável só existe dentro dessas chaves. 841 00:40:33,370 --> 00:40:37,320 Assim, por si só que a lógica, embora Eu tenho declarado n em linha nove, que 842 00:40:37,320 --> 00:40:41,910 essencialmente desaparece do escopo, desaparece da memória, por assim dizer, 843 00:40:41,910 --> 00:40:43,370 no momento em que eu bati linha 11. 844 00:40:43,370 --> 00:40:47,370 Devido linha 11, infelizmente, é fora dessas chaves. 845 00:40:47,370 --> 00:40:51,540 >> Então, eu, infelizmente, não pode corrigir isso voltar para o que eu fiz antes. 846 00:40:51,540 --> 00:40:53,370 Você pode fazer isso em primeiro lugar. 847 00:40:53,370 --> 00:40:56,370 Mas o que não está você agora fazendo ciclicamente? 848 00:40:56,370 --> 00:40:58,260 Você, obviamente, não ficando o int ciclicamente. 849 00:40:58,260 --> 00:41:01,320 Assim, podemos deixar o GetInt (), e nós deve deixar o GetInt () dentro do 850 00:41:01,320 --> 00:41:04,420 laço, porque isso é o que queremos importunar o usuário para uma e outra vez. 851 00:41:04,420 --> 00:41:08,660 Mas isso é suficiente para ir até a linha de, digamos, seis. 852 00:41:08,660 --> 00:41:10,150 Int n, ponto e vírgula. 853 00:41:10,150 --> 00:41:12,990 Não dê a ela um valor ainda porque você não precisa ainda. 854 00:41:12,990 --> 00:41:16,220 >> Mas agora aqui, o aviso - este Seria um erro muito fácil. 855 00:41:16,220 --> 00:41:19,440 Eu não quero que a minha sombra anterior declaração de n. 856 00:41:19,440 --> 00:41:22,830 Eu quero usar o que n realmente existe. 857 00:41:22,830 --> 00:41:25,780 E agora na linha 10, I atribuir um valor n. 858 00:41:25,780 --> 00:41:28,580 Mas, na linha seis, eu declaro n. 859 00:41:28,580 --> 00:41:32,940 E assim eu posso ou não posso usá-lo na linha 12 agora? 860 00:41:32,940 --> 00:41:37,120 Eu posso, porque, entre os quais encaracolado chaves é n declarou agora? 861 00:41:37,120 --> 00:41:38,770 A única aqui na linha cinco. 862 00:41:38,770 --> 00:41:40,330 Para um aqui na linha 14. 863 00:41:40,330 --> 00:41:49,770 Então, se agora eu diminuir o zoom, salvar esse arquivo, vá voltar para dentro e execute make positivo, 864 00:41:49,770 --> 00:41:50,820 compilado neste momento. 865 00:41:50,820 --> 00:41:51,940 Então, isso é já o progresso. 866 00:41:51,940 --> 00:41:53,640 Slash. . / Positivo, Enter. 867 00:41:53,640 --> 00:41:56,060 >> Eu exijo que você me dá um número inteiro positivo. 868 00:41:56,060 --> 00:41:57,750 Negativo 1. 869 00:41:57,750 --> 00:41:59,020 Negativo 2. 870 00:41:59,020 --> 00:42:00,680 Negativo 3. 871 00:42:00,680 --> 00:42:01,760 Zero. 872 00:42:01,760 --> 00:42:03,000 Uma. 873 00:42:03,000 --> 00:42:05,130 E obrigada por aquele é que está agora impresso. 874 00:42:05,130 --> 00:42:07,400 >> Deixe-me tentar outra coisa, por curiosidade. 875 00:42:07,400 --> 00:42:09,600 Estou sendo dito para introduzir um número inteiro. 876 00:42:09,600 --> 00:42:12,870 Mas e se eu digitar em vez de cordeiro? 877 00:42:12,870 --> 00:42:14,460 Então, agora você ver um prompt diferente - 878 00:42:14,460 --> 00:42:15,350 tente novamente. 879 00:42:15,350 --> 00:42:17,670 Mas em nenhum lugar no meu código eu escrever tente novamente. 880 00:42:17,670 --> 00:42:22,320 Então, onde, presumivelmente, isso é repetir solicitar vindo, você diria? 881 00:42:22,320 --> 00:42:23,540 Sim, a partir de GetInt () em si. 882 00:42:23,540 --> 00:42:26,650 Então, uma das coisas que o pessoal da CS50 faz para você, pelo menos nestes primeiros 883 00:42:26,650 --> 00:42:30,400 semanas, é que nós escrevemos uma certa quantidade de erro de verificação para assegurar que se 884 00:42:30,400 --> 00:42:34,260 você chama GetInt (), pelo menos você vai voltar um int do usuário. 885 00:42:34,260 --> 00:42:35,460 Você não terá uma string. 886 00:42:35,460 --> 00:42:36,440 Você não terá um char. 887 00:42:36,440 --> 00:42:39,660 Você não vai conseguir alguma coisa mais completo. 888 00:42:39,660 --> 00:42:40,510 Você receberá um int. 889 00:42:40,510 --> 00:42:41,890 >> Agora, ele pode não ser positivo. 890 00:42:41,890 --> 00:42:42,770 Pode não ser negativo. 891 00:42:42,770 --> 00:42:44,550 Nós não fazemos nenhuma garantia em torno disso. 892 00:42:44,550 --> 00:42:48,960 Mas vai incomodar o usuário para tentar novamente, repetir, repetir até que ele ou ela realmente 893 00:42:48,960 --> 00:42:49,810 coopera. 894 00:42:49,810 --> 00:42:53,085 Da mesma forma, se eu fizer 1,23, que não é um int. 895 00:42:53,085 --> 00:42:58,400 Mas se eu digitar, por exemplo, 50 anos, que me dá um valor que eu queria. 896 00:42:58,400 --> 00:42:59,050 >> Tudo bem. 897 00:42:59,050 --> 00:43:01,380 Então, não é mau. 898 00:43:01,380 --> 00:43:04,780 Qualquer dúvida sobre o que acabou de fazer? 899 00:43:04,780 --> 00:43:07,930 O principal argumento a ser, para ser claro, não tanto o circuito, o que temos visto 900 00:43:07,930 --> 00:43:10,880 antes mesmo que nós não temos realmente usei, mas a questão do escopo, onde 901 00:43:10,880 --> 00:43:17,045 As variáveis ​​podem ser apenas só pode ser usado dentro de algum escopo especificado. 902 00:43:17,045 --> 00:43:19,830 >> Tudo bem, deixe-me abordar a sugestão que você fez anteriormente, a de um 903 00:43:19,830 --> 00:43:20,860 variável global. 904 00:43:20,860 --> 00:43:24,880 Como um aparte, verifica-se que um outro solução para este problema, mas 905 00:43:24,880 --> 00:43:28,880 tipicamente uma solução incorreta ou uma solução mal concebido, é 906 00:43:28,880 --> 00:43:31,670 declarar a variável como o que é chamado de uma variável global. 907 00:43:31,670 --> 00:43:34,610 Agora eu sou o tipo de violar a minha definição de alcance, porque há 908 00:43:34,610 --> 00:43:37,680 há chaves no topo ea parte inferior de um arquivo. 909 00:43:37,680 --> 00:43:40,190 Mas a implicação de que que é já em linha de quatro, 910 00:43:40,190 --> 00:43:41,710 n é uma variável global. 911 00:43:41,710 --> 00:43:44,460 E como o nome indica, é apenas acessível em qualquer lugar. 912 00:43:44,460 --> 00:43:45,790 >> Zero realmente tem estes. 913 00:43:45,790 --> 00:43:48,650 Se você usou uma variável, você deve se lembrar você tivesse que escolher se é para 914 00:43:48,650 --> 00:43:50,780 esse sprite ou para todos os sprites. 915 00:43:50,780 --> 00:43:54,270 Bem, todos os sprites é apenas a mais clara maneira de dizer global. 916 00:43:54,270 --> 00:43:55,520 Sim? 917 00:43:55,520 --> 00:44:09,690 918 00:44:09,690 --> 00:44:10,990 Ah, muito boa pergunta. 919 00:44:10,990 --> 00:44:14,310 >> Então, lembro que na primeira versão do meu código, quando eu incorretamente 920 00:44:14,310 --> 00:44:17,700 n declarados e definidos na linha de nove - 921 00:44:17,700 --> 00:44:19,980 Eu declarei-o como uma variável e eu dei-lhe um valor com 922 00:44:19,980 --> 00:44:21,160 o operador de atribuição - 923 00:44:21,160 --> 00:44:22,520 isso me deu dois erros. 924 00:44:22,520 --> 00:44:26,560 Um deles, o facto de n não foi utilizado, e dois, que na linha 11 925 00:44:26,560 --> 00:44:27,770 ele só não foi declarado. 926 00:44:27,770 --> 00:44:31,120 Então, o primeiro que eu não fiz endereço na época. 927 00:44:31,120 --> 00:44:35,130 Não é estritamente um erro para declarar uma variável, mas não usá-lo. 928 00:44:35,130 --> 00:44:38,540 Mas uma das coisas que fizemos em o aparelho CS50, deliberadamente, 929 00:44:38,540 --> 00:44:43,340 pedagogicamente, é que já acionei a expectativas do compilador para fazer 930 00:44:43,340 --> 00:44:46,970 certeza de que você está fazendo as coisas e não apenas corretamente, mas realmente corretamente. 931 00:44:46,970 --> 00:44:51,520 >> Porque se você está declarando uma variável como n e nunca usá-lo, ou usá-lo 932 00:44:51,520 --> 00:44:53,700 corretamente, então o que que ele está fazendo lá? 933 00:44:53,700 --> 00:44:55,650 Ele realmente não serve para nada. 934 00:44:55,650 --> 00:44:58,980 E é muito fácil com o tempo, se você não configurar o seu próprio computador em 935 00:44:58,980 --> 00:45:01,960 Desta forma, apenas para ter um código que tem pequenos remanescentes aqui, restos lá. 936 00:45:01,960 --> 00:45:04,390 E, em seguida, meses mais tarde você olhar para trás e você gosta, porque é que esta linha de 937 00:45:04,390 --> 00:45:05,060 Código de lá? 938 00:45:05,060 --> 00:45:07,940 E se não há nenhuma boa razão, não beneficia você ou seus colegas 939 00:45:07,940 --> 00:45:10,650 no caminho para ter a tropeçar então. 940 00:45:10,650 --> 00:45:12,540 >> Como um aparte, onde é que vem? 941 00:45:12,540 --> 00:45:16,410 Bem, lembre-se que cada vez que compilar programa, todo este material é 942 00:45:16,410 --> 00:45:17,380 sendo impresso. 943 00:45:17,380 --> 00:45:18,350 Então, vamos voltar a isso. 944 00:45:18,350 --> 00:45:22,230 Mas, novamente, fazer é um utilitário que automatiza o processo de compilação de 945 00:45:22,230 --> 00:45:24,830 executar o compilador real chamado bumbum. 946 00:45:24,830 --> 00:45:27,650 Essa coisa, vamos finalmente ver, tem a ver com a depuração com uma especial 947 00:45:27,650 --> 00:45:29,060 programa chamado o depurador. 948 00:45:29,060 --> 00:45:32,150 Isso tem a ver com a otimização do código - mais sobre isso no futuro. 949 00:45:32,150 --> 00:45:33,620 Std = c99 - 950 00:45:33,620 --> 00:45:37,870 isto significa apenas usar a versão de 1999 de C. C tem sido em torno ainda mais do que 951 00:45:37,870 --> 00:45:40,830 isso, mas eles fizeram algum bom mudanças mais 10 anos. 952 00:45:40,830 --> 00:45:42,690 >> E aqui está os relevantes. 953 00:45:42,690 --> 00:45:45,880 Estamos dizendo fazer qualquer coisa que anteriormente teria sido um aviso 954 00:45:45,880 --> 00:45:48,560 um erro impedindo o estudante de compilação. 955 00:45:48,560 --> 00:45:51,400 E os meios de parede fazer isso por um todo monte de coisas, não 956 00:45:51,400 --> 00:45:53,060 apenas relacionada a variáveis. 957 00:45:53,060 --> 00:45:54,700 E, em seguida, deixe-me ir para no final da linha. 958 00:45:54,700 --> 00:45:56,430 E isso, também, que vai finalmente voltar. 959 00:45:56,430 --> 00:45:59,040 Isto é, obviamente, o nome o arquivo que estou compilando. 960 00:45:59,040 --> 00:46:02,160 Isso lembra o nome do arquivo Estou a saída como o nome 961 00:46:02,160 --> 00:46:04,070 do meu programa executável. 962 00:46:04,070 --> 00:46:08,970 Este-lcs50 significa apenas usar o CS50 biblioteca, e todos os zeros e uns que 963 00:46:08,970 --> 00:46:12,390 o pessoal escreveu e compilou mais cedo este ano, integrar 964 00:46:12,390 --> 00:46:13,490 los em meu programa. 965 00:46:13,490 --> 00:46:16,130 >> E ninguém sabe o que-lm é? 966 00:46:16,130 --> 00:46:18,150 É a biblioteca de matemática, que é só lá mesmo se você estiver 967 00:46:18,150 --> 00:46:19,320 não fazer qualquer matemática. 968 00:46:19,320 --> 00:46:22,620 É apenas fornecido automaticamente para nós por fazer. 969 00:46:22,620 --> 00:46:26,540 >> Bem, deixe-me fazer um outro exemplo aqui, abrindo um novo arquivo. 970 00:46:26,540 --> 00:46:30,560 E deixe-me salvar esta como string.c. 971 00:46:30,560 --> 00:46:37,980 Acontece que, como falamos de dados tipos de hoje, há ainda mais 972 00:46:37,980 --> 00:46:40,630 acontecendo debaixo do capô do que vimos até agora. 973 00:46:40,630 --> 00:46:42,290 Então deixe-me rapidamente fazer um programa rápido. 974 00:46:42,290 --> 00:46:44,510 Incluir stdio.h. 975 00:46:44,510 --> 00:46:45,730 E eu vou guardar. 976 00:46:45,730 --> 00:46:48,110 E você sabe, não me deixe fazer o mesmo erro outra vez e outra vez. 977 00:46:48,110 --> 00:46:50,540 Incluir cs50.h. 978 00:46:50,540 --> 00:46:54,870 E deixe-me ir em frente agora e fazer int main (void). 979 00:46:54,870 --> 00:46:58,790 >> E agora eu simplesmente quer fazer um programa que faz isso - declarar uma string 980 00:46:58,790 --> 00:47:03,610 chamado s e obter uma string a partir do utilizador. 981 00:47:03,610 --> 00:47:05,820 E deixe-me fazer uma pequena instruções aqui - 982 00:47:05,820 --> 00:47:09,960 por favor me dê uma string - assim o usuário sabe o que fazer. 983 00:47:09,960 --> 00:47:13,190 E então aqui abaixo deste, Eu quero fazer o seguinte - 984 00:47:13,190 --> 00:47:16,060 para int i recebe zero. 985 00:47:16,060 --> 00:47:18,580 Mais uma vez, os cientistas da computação tipicamente começar a contar do zero, mas poderíamos 986 00:47:18,580 --> 00:47:20,340 fazer que um se realmente queria. 987 00:47:20,340 --> 00:47:27,240 Agora eu vou fazer i é menos do que o comprimento da corda de s. 988 00:47:27,240 --> 00:47:28,430 Então strlen - 989 00:47:28,430 --> 00:47:29,510 S-T-R-G-E-N - 990 00:47:29,510 --> 00:47:31,650 novamente, é conciso, porque é mais fácil para escrever, mesmo que seja um 991 00:47:31,650 --> 00:47:32,590 pouco enigmática. 992 00:47:32,590 --> 00:47:35,290 >> Essa é uma função que não usei antes, mas, literalmente, faz isso - 993 00:47:35,290 --> 00:47:37,810 voltará para mim um número que representa o comprimento da corda 994 00:47:37,810 --> 00:47:38,690 que o usuário digitou. 995 00:47:38,690 --> 00:47:41,740 Se digitou Olá, retornaria cinco, porque há cinco 996 00:47:41,740 --> 00:47:42,890 Olá letras. 997 00:47:42,890 --> 00:47:45,390 Então, em cada iteração este loop, i plus plus. 998 00:47:45,390 --> 00:47:49,170 Então, novamente, um padrão de construção, mesmo se você não está muito confortável demais ou 999 00:47:49,170 --> 00:47:50,420 familiarizado com ele ainda. 1000 00:47:50,420 --> 00:47:53,220 >> Mas, agora, em cada iteração deste loop, perceber o que eu vou fazer. 1001 00:47:53,220 --> 00:47:56,690 Eu quero ir em frente e imprimir um único personagem - 1002 00:47:56,690 --> 00:47:59,940 para% c barra invertida n em uma nova linha. 1003 00:47:59,940 --> 00:48:00,990 E então, você sabe o que eu quero fazer? 1004 00:48:00,990 --> 00:48:05,090 Seja qual for a palavra que o usuário digita no, como Olá, eu quero imprimir 1005 00:48:05,090 --> 00:48:09,530 H-E-L-L-O, um caractere por linha. 1006 00:48:09,530 --> 00:48:13,080 Em outras palavras, eu quero chegar ao caracteres individuais em uma string, 1007 00:48:13,080 --> 00:48:16,770 em que até agora tem apenas uma string foi uma seqüência de caracteres. 1008 00:48:16,770 --> 00:48:21,690 >> E não é que eu posso fazer s, suporte i, próximo suporte, feche 1009 00:48:21,690 --> 00:48:23,580 parênteses, ponto e vírgula. 1010 00:48:23,580 --> 00:48:25,640 E eu tenho que fazer mais uma coisa. 1011 00:48:25,640 --> 00:48:30,570 É em um arquivo chamado string.h que strlen é declarada. 1012 00:48:30,570 --> 00:48:33,190 Então, se eu quiser usar essa função, Eu preciso dizer ao compilador, 1013 00:48:33,190 --> 00:48:34,450 esperar para usá-lo. 1014 00:48:34,450 --> 00:48:37,040 Agora, deixe-me ir em frente e fazer o programa chamado string. 1015 00:48:37,040 --> 00:48:39,150 Dot, Slash, string. 1016 00:48:39,150 --> 00:48:40,130 >> Por favor me dê uma corda. 1017 00:48:40,130 --> 00:48:40,900 Eu vou em frente e digitá-lo. 1018 00:48:40,900 --> 00:48:43,040 Olá, em todas as tampas, Enter. 1019 00:48:43,040 --> 00:48:47,390 E agora percebe que eu imprimi este um caractere após o outro. 1020 00:48:47,390 --> 00:48:51,450 Assim, o novo detalhe aqui é que uma string, no fim do dia, pode ser 1021 00:48:51,450 --> 00:48:54,810 acessado por meio de sua pessoa caracteres através da introdução da praça 1022 00:48:54,810 --> 00:48:55,840 notação suporte. 1023 00:48:55,840 --> 00:48:59,090 E isso é porque a corda por baixo a capa é realmente uma seqüência de 1024 00:48:59,090 --> 00:48:59,810 caracteres. 1025 00:48:59,810 --> 00:49:02,010 Mas o que é interessante sobre eles é na memória RAM do seu computador - 1026 00:49:02,010 --> 00:49:05,300 Mac, PC, seja ele qual for - são literalmente de costas para trás - 1027 00:49:05,300 --> 00:49:06,225 H-E-L-L-S - 1028 00:49:06,225 --> 00:49:09,920 no individual, adjacente bytes de memória. 1029 00:49:09,920 --> 00:49:13,210 >> Então, se você deseja obter na oitava tais byte, que neste circuito seria 1030 00:49:13,210 --> 00:49:16,900 suporte zero, um suporte, suporte de dois, suporte de três, quatro suporte - 1031 00:49:16,900 --> 00:49:18,890 que é de zero indexados até cinco - 1032 00:49:18,890 --> 00:49:23,330 que irá imprimir H-E-L-L-O em sua própria linha. 1033 00:49:23,330 --> 00:49:26,320 >> Agora, como um teaser, deixe-me mostrar-lhe o os tipos de coisas que você vai, eventualmente, ser 1034 00:49:26,320 --> 00:49:31,950 capaz de entender, pelo menos com um pouco de perto olhando. 1035 00:49:31,950 --> 00:49:35,610 Por um lado, o que incluiu hoje no exemplos, se você quiser, é realmente 1036 00:49:35,610 --> 00:49:38,300 um dos primeiros jailbreaks para o iPhone. 1037 00:49:38,300 --> 00:49:40,800 O jailbreak significa quebrar o telefone assim você pode realmente usá-lo em um 1038 00:49:40,800 --> 00:49:43,380 diferente transportador ou install seu próprio software. 1039 00:49:43,380 --> 00:49:45,660 E você vai perceber isso parece completamente enigmático, o mais provável. 1040 00:49:45,660 --> 00:49:46,520 Mas olhe para isso. 1041 00:49:46,520 --> 00:49:50,420 O iPhone foi aparentemente rachado com um loop for, se um estado, uma pessoa 1042 00:49:50,420 --> 00:49:52,580 condição, um monte de funções não vi. 1043 00:49:52,580 --> 00:49:54,230 >> E mais uma vez, você não vai a primeira vista, provavelmente, 1044 00:49:54,230 --> 00:49:55,620 entender como isso está funcionando. 1045 00:49:55,620 --> 00:49:58,940 Mas tudo o que nós meio que tomar para concedido em nossas vidas modernas 1046 00:49:58,940 --> 00:50:02,040 na verdade tende a reduzir ainda a alguns desses fundamentos que estivemos 1047 00:50:02,040 --> 00:50:02,820 olhando. 1048 00:50:02,820 --> 00:50:06,680 Deixe-me ir em frente e abrir uma outro programa, holloway.c. 1049 00:50:06,680 --> 00:50:08,970 Então, isso também é algo que você realmente não deve saber. 1050 00:50:08,970 --> 00:50:12,440 Mesmo nenhum dos funcionários ou eu poderia provavelmente descobrir isso olhando 1051 00:50:12,440 --> 00:50:15,450 porque este era o código de alguém que foi submetido ao que é 1052 00:50:15,450 --> 00:50:19,630 historicamente conhecido como um ofuscado C concurso, onde você escreve um programa 1053 00:50:19,630 --> 00:50:24,670 que compila e executa, mas é tão maldita críptica nenhum ser humano pode compreender o que 1054 00:50:24,670 --> 00:50:27,530 ele vai fazer até eles realmente executá-lo. 1055 00:50:27,530 --> 00:50:29,940 >> Então, na verdade, se você olhar para esta código, eu vejo um interruptor. 1056 00:50:29,940 --> 00:50:30,870 Vejo principal. 1057 00:50:30,870 --> 00:50:33,800 Eu vejo esses colchetes implicando algum tipo de uma matriz. 1058 00:50:33,800 --> 00:50:35,970 Alguém quer adivinhar o que este programa realmente 1059 00:50:35,970 --> 00:50:37,220 faz se eu executar Holloway? 1060 00:50:37,220 --> 00:50:39,940 1061 00:50:39,940 --> 00:50:40,750 Sim. 1062 00:50:40,750 --> 00:50:43,050 OK. 1063 00:50:43,050 --> 00:50:44,690 Bem feito. 1064 00:50:44,690 --> 00:50:48,090 Assim, apenas o pessoal e eu não consigo descobrir o que essas coisas fazem. 1065 00:50:48,090 --> 00:50:51,670 >> E agora, por último, deixe-me ir em frente e abrir um outro programa. 1066 00:50:51,670 --> 00:50:53,440 Este - 1067 00:50:53,440 --> 00:50:55,550 mais uma vez, nós vamos fazer o código-fonte disponível on-line - este é apenas 1068 00:50:55,550 --> 00:50:57,480 tipo de bonito de se olhar. 1069 00:50:57,480 --> 00:50:59,750 Tudo o que eles fizeram é acertar o barra de espaço um pouco. 1070 00:50:59,750 --> 00:51:01,320 Mas este é o código real. 1071 00:51:01,320 --> 00:51:04,790 Então, se você acha que é bonito, se nós realmente executar no prompt, 1072 00:51:04,790 --> 00:51:08,970 eventualmente, você vai ver como nós pode fazer coisas como esta. 1073 00:51:08,970 --> 00:51:14,008 >> Então, vamos deixá-lo nessa nota e vê-lo na quarta-feira. 1074 00:51:14,008 --> 00:51:18,440 >> [Música tocando] 1075 00:51:18,440 --> 00:51:23,380 >> COLUNA 2: Na próxima CS50, o TFS encenar um motim. 1076 00:51:23,380 --> 00:51:24,112 >> COLUNA 3: Aqui está ele. 1077 00:51:24,112 --> 00:51:25,362 Pegue-o! 1078 00:51:25,362 --> 00:51:29,912 1079 00:51:29,912 --> 00:51:32,074 >> [Música tocando]