1 00:00:00,000 --> 00:00:00,000 2 00:00:00,000 --> 00:00:00,000 [REPRODUÇÃO DE MÚSICA] 3 00:00:00,000 --> 00:00:13,950 4 00:00:13,950 --> 00:00:16,240 >> DAVID J. MALAN: Tudo bem, isso é CS50. 5 00:00:16,240 --> 00:00:18,010 E esta é uma semana. 6 00:00:18,010 --> 00:00:22,050 Então lembro da última vez na semana zero, nós nos concentramos em pensamento computacional. 7 00:00:22,050 --> 00:00:25,440 E nós a transição de que a Zero, a programação gráfica 8 00:00:25,440 --> 00:00:27,360 linguagem de nossos amigos no Media Lab do MIT. 9 00:00:27,360 --> 00:00:31,730 >> E com o Scratch, que exploramos idéias como funções e condições, 10 00:00:31,730 --> 00:00:35,210 e loops e variáveis, e até mesmo eventos e tópicos, e mais. 11 00:00:35,210 --> 00:00:37,880 E hoje, vamos continuar a usar essas idéias, 12 00:00:37,880 --> 00:00:40,630 e realmente levá-los para concedido, mas traduzi-las 13 00:00:40,630 --> 00:00:44,220 para outro idioma conhecido como C. Agora, C é uma linguagem mais tradicional. 14 00:00:44,220 --> 00:00:46,020 É um nível mais baixo a linguagem, se você quiser. 15 00:00:46,020 --> 00:00:47,300 >> É puramente textual. 16 00:00:47,300 --> 00:00:49,910 E assim, à primeira vista, é tudo vai olhar um pouco críptica 17 00:00:49,910 --> 00:00:51,430 se você nunca programou antes. 18 00:00:51,430 --> 00:00:53,530 Nós vamos ter ponto e vírgula e parênteses, 19 00:00:53,530 --> 00:00:55,150 e chaves, e muito mais. 20 00:00:55,150 --> 00:00:57,240 Mas perceber que, mesmo embora a sintaxe seja 21 00:00:57,240 --> 00:01:00,600 sobre a olhar um pouco familiarizado a maioria de vocês, ver além disso. 22 00:01:00,600 --> 00:01:03,220 E tentar ver as ideias que são, de fato, familiar, 23 00:01:03,220 --> 00:01:06,750 porque aqui na semana um o que começaremos a fazer é comparar, 24 00:01:06,750 --> 00:01:08,980 Inicialmente, Raspe contra C. 25 00:01:08,980 --> 00:01:12,350 >> Assim, por exemplo, recordar que quando implementou o primeiro dos nossos programas 26 00:01:12,350 --> 00:01:16,220 última vez, tivemos um bloco que parecia um pouco algo como isto-- quando 27 00:01:16,220 --> 00:01:19,990 bandeira verde clicado, e depois tivemos Um ou mais peças do puzzle abaixo dela, 28 00:01:19,990 --> 00:01:22,150 neste caso, dizer, Olá mundo. 29 00:01:22,150 --> 00:01:24,870 Então, de fato, em risco, quando eu clico que a bandeira verde 30 00:01:24,870 --> 00:01:27,390 para executar o meu programa, de modo falar, estes são 31 00:01:27,390 --> 00:01:29,520 os blocos que são executadas, ou correr. 32 00:01:29,520 --> 00:01:32,230 E, especificamente, risco disse, Olá, mundo. 33 00:01:32,230 --> 00:01:35,377 >> Agora, eu poderia ter especificado diferentes palavras aqui. 34 00:01:35,377 --> 00:01:37,960 Mas vamos ver que, de fato, muitos destes blocks-- e, na verdade, 35 00:01:37,960 --> 00:01:41,880 C em muitas funções no pode ser parametrizada ou personalizado 36 00:01:41,880 --> 00:01:43,150 para fazer coisas diferentes. 37 00:01:43,150 --> 00:01:45,520 Na verdade, em C se quer converter, agora, 38 00:01:45,520 --> 00:01:47,567 este programa Raspadinha a esta outra língua, 39 00:01:47,567 --> 00:01:49,650 nós estamos indo para escrever um pouco algo como isto. 40 00:01:49,650 --> 00:01:52,540 >> Concedida, há alguma estranha sintaxe há mais provável, int, 41 00:01:52,540 --> 00:01:54,380 e parênteses e sem efeito. 42 00:01:54,380 --> 00:01:57,740 Mas printf-- mesmo que você faria acho que seria apenas impressão. 43 00:01:57,740 --> 00:02:00,120 Mas de impressão significa impressão formatado, como veremos em breve. 44 00:02:00,120 --> 00:02:02,140 Esta literalmente irá imprimir para a tela o que quer 45 00:02:02,140 --> 00:02:05,990 está dentro desses parênteses, que Claro que neste caso é, Olá mundo. 46 00:02:05,990 --> 00:02:09,290 >> Mas você vai notar algumas outras sintaxe, algumas aspas, 47 00:02:09,290 --> 00:02:11,890 que os parênteses no final, o-e-vírgula e semelhantes. 48 00:02:11,890 --> 00:02:15,027 Portanto, há um pouco de sobrecarga, por assim dizer, cognitivamente tanto 49 00:02:15,027 --> 00:02:17,860 e sintaticamente, que vamos ter que lembrar antes de tempo. 50 00:02:17,860 --> 00:02:20,720 Mas perceber que com a prática, isso vai começar a saltar para fora em você. 51 00:02:20,720 --> 00:02:24,920 >> Na verdade, vamos nos concentrar em que um função specifically-- neste caso, 52 00:02:24,920 --> 00:02:26,290 dizer Olá mundo. 53 00:02:26,290 --> 00:02:27,560 Então, digamos que é a função. 54 00:02:27,560 --> 00:02:31,320 Olá, mundo é seu parâmetro, ou argumento, a sua personalização. 55 00:02:31,320 --> 00:02:34,320 >> E a equivalência em C é apenas vai ser esta uma linha aqui, 56 00:02:34,320 --> 00:02:38,710 onde printf é equivalente a, digamos, a string entre aspas duplas, Olá 57 00:02:38,710 --> 00:02:41,470 mundo é equivalente, é claro, para o que está na caixa branca lá. 58 00:02:41,470 --> 00:02:45,680 E a barra invertida n, embora um pouco estranha e ausente a partir do zero, 59 00:02:45,680 --> 00:02:49,380 simplesmente vai ter o efeito que vai ver em um computador, como o meu Mac ou um PC, 60 00:02:49,380 --> 00:02:51,660 de apenas movendo o cursor para a próxima linha. 61 00:02:51,660 --> 00:02:53,970 É como bater Enter no teclado. 62 00:02:53,970 --> 00:02:55,580 >> Então, vamos ver isso de novo antes do tempo. 63 00:02:55,580 --> 00:02:58,640 Mas, primeiro, vamos dar uma olhada neste outro exemplo, no caso de lacetes. 64 00:02:58,640 --> 00:03:02,830 Tivemos esse loop para sempre na última vez, que foi uma série de peças do puzzle 65 00:03:02,830 --> 00:03:05,490 que fez algo literalmente sempre-- neste caso, 66 00:03:05,490 --> 00:03:08,360 dizer Olá mundo, Olá mundo, Olá mundo, Olá mundo. 67 00:03:08,360 --> 00:03:10,350 Portanto, é um loop infinito por design. 68 00:03:10,350 --> 00:03:14,580 >> Em C, se queremos implementar este mesma idéia, poderíamos simplesmente fazer isso. 69 00:03:14,580 --> 00:03:19,570 Enquanto verdade, printf Olá mundo-- agora enquanto, apenas semanticamente, tipo de 70 00:03:19,570 --> 00:03:23,090 evoca a ideia de fazer algo mais uma vez, e de novo, e de novo, 71 00:03:23,090 --> 00:03:23,980 e por quanto tempo? 72 00:03:23,980 --> 00:03:27,990 Bem, lembre-se que true-- verdade é apenas ou um. 73 00:03:27,990 --> 00:03:30,660 >> E verdade é, é claro, sempre verdadeira. 74 00:03:30,660 --> 00:03:33,060 Portanto, é uma espécie de sentido declaração apenas para dizer verdade. 75 00:03:33,060 --> 00:03:36,890 Mas, na verdade, este é deliberada, porque se for verdade é apenas sempre verdadeiro, 76 00:03:36,890 --> 00:03:40,850 que enquanto verdade apenas indica, se um pouco indirectamente, 77 00:03:40,850 --> 00:03:44,070 que as seguintes linhas de código entre essas chaves 78 00:03:44,070 --> 00:03:48,320 deve apenas executar novamente, e novamente, e de novo, e nunca realmente parar. 79 00:03:48,320 --> 00:03:50,230 >> Mas se você quiser que o seu loop para parar, como nós 80 00:03:50,230 --> 00:03:54,500 fez da última vez com algo parecido isso, repita as seguintes 50 vezes, 81 00:03:54,500 --> 00:03:57,700 no C, podemos fazer o mesmo com o que há de chamado de uma palavra-chave para o loop-- 82 00:03:57,700 --> 00:03:59,330 não sendo ao mesmo tempo, mas para. 83 00:03:59,330 --> 00:04:03,290 E então nós temos alguma nova sintaxe aqui, com int i é igual a 0, i inferior a 50, 84 00:04:03,290 --> 00:04:03,880 i ++. 85 00:04:03,880 --> 00:04:05,430 E nós vamos voltar a isso. 86 00:04:05,430 --> 00:04:09,660 Mas isso é simplesmente como iríamos traduzir o conjunto de blocos de raspadinhas 87 00:04:09,660 --> 00:04:13,079 para um conjunto de linhas de código C. 88 00:04:13,079 --> 00:04:14,450 >> Enquanto isso, considere variáveis. 89 00:04:14,450 --> 00:04:16,540 E, na verdade, nós apenas vi um um momento atrás. 90 00:04:16,540 --> 00:04:21,220 E no caso de zero, se queria declarar uma variável chamada i 91 00:04:21,220 --> 00:04:24,590 para i sendo inteiro, apenas um número, e queremos configurá-lo para algum valor, 92 00:04:24,590 --> 00:04:28,410 usaríamos esta laranja bloquear aqui-- definir i a 0. 93 00:04:28,410 --> 00:04:30,800 >> E vamos ver hoje e além, assim como na semana passada, 94 00:04:30,800 --> 00:04:33,850 programadores fazem quase sempre começar a contar a partir de zero, realmente 95 00:04:33,850 --> 00:04:34,950 por convenção. 96 00:04:34,950 --> 00:04:37,250 Mas também porque recolha junto nossa discussão de binário, 97 00:04:37,250 --> 00:04:39,990 o menor número possível representam com qualquer número de bits 98 00:04:39,990 --> 00:04:41,640 é apenas vai ser 0 em si. 99 00:04:41,640 --> 00:04:45,190 E por isso vamos geralmente começam inicializar mesmo nossas variáveis ​​para 0. 100 00:04:45,190 --> 00:04:47,710 >> E em C a fazer o mesmo, vamos dizer int 101 00:04:47,710 --> 00:04:50,110 por inteiro, eu apenas por convenção. 102 00:04:50,110 --> 00:04:53,390 Eu poderia ter chamado esta variável o que eu quiser, assim como em risco. 103 00:04:53,390 --> 00:04:57,770 E então é igual a 0 apenas cessionários o valor 0 da direita 104 00:04:57,770 --> 00:05:01,319 e coloca-lo na variável, ou a recipiente de armazenamento há, no lado esquerdo. 105 00:05:01,319 --> 00:05:04,360 E o ponto e vírgula como vamos see-- e temos visto alguns desses já-- 106 00:05:04,360 --> 00:05:06,530 apenas significa final de pensamento. 107 00:05:06,530 --> 00:05:09,430 Avance para fazer outra coisa nas linhas que se seguem. 108 00:05:09,430 --> 00:05:11,330 >> Agora, o que acontece com expressões booleanas? 109 00:05:11,330 --> 00:05:14,320 Lembre-se que em risco, Estes eram expressões 110 00:05:14,320 --> 00:05:16,740 que são verdadeiras ou perguntas false--, 111 00:05:16,740 --> 00:05:18,910 realmente, que são verdadeiras ou falsas. 112 00:05:18,910 --> 00:05:21,960 Assim, no caso do Scratch, poderíamos fazer uma pergunta simples como este, 113 00:05:21,960 --> 00:05:24,586 é i menos de 50? 114 00:05:24,586 --> 00:05:25,710 Então eu, mais uma vez, é um inteiro. 115 00:05:25,710 --> 00:05:27,210 Talvez nós estamos a usá-lo em um programa de arranhões 116 00:05:27,210 --> 00:05:29,310 manter o controle de uma pontuação ou algo assim. 117 00:05:29,310 --> 00:05:33,810 Portanto, esta sintaxe aqui em Risco Significa apenas que, é i menos de 50? 118 00:05:33,810 --> 00:05:37,330 Bem, felizmente, algo está simples em C. E para traduzir, 119 00:05:37,330 --> 00:05:41,780 isso seria simplesmente dizer i menos de 50, utilizando a chave familiarizados 120 00:05:41,780 --> 00:05:42,850 no seu teclado. 121 00:05:42,850 --> 00:05:45,141 >> Enquanto isso, se você queria dizer algo mais geral, 122 00:05:45,141 --> 00:05:49,890 como, bem, é x menos de y onde cada de X e Y são, eles próprios variáveis? 123 00:05:49,890 --> 00:05:52,280 Nós podemos fazer a mesma coisa no C, desde que nós temos 124 00:05:52,280 --> 00:05:53,942 criou essas variáveis ​​já. 125 00:05:53,942 --> 00:05:55,650 E vamos ver como fazer isso antes do tempo. 126 00:05:55,650 --> 00:05:58,590 Nós simplesmente diria x inferior a y. 127 00:05:58,590 --> 00:06:00,530 >> Então, você está começando a ver algumas semelhanças. 128 00:06:00,530 --> 00:06:03,490 E aquelas pessoas que fizeram Zero eram certamente 129 00:06:03,490 --> 00:06:05,250 inspirado por algumas dessas idéias básicas. 130 00:06:05,250 --> 00:06:10,350 E você vai ver este tipo de sintaxe em muitos languages-- 131 00:06:10,350 --> 00:06:12,160 não apenas zero, não apenas C, mas Python, 132 00:06:12,160 --> 00:06:14,790 e JavaScript, e outras línguas ainda. 133 00:06:14,790 --> 00:06:18,270 >> Vamos considerar uma outra construção de C, a noção de uma condição, 134 00:06:18,270 --> 00:06:20,370 fazendo algo condicionalmente. 135 00:06:20,370 --> 00:06:22,720 Se algo é verdade, fazer isso. 136 00:06:22,720 --> 00:06:24,457 Se alguma coisa é verdade, fazer isso. 137 00:06:24,457 --> 00:06:27,040 É uma espécie de programação equivalente a uma bifurcação na estrada. 138 00:06:27,040 --> 00:06:29,730 Talvez seja uma de duas vias garfo, um garfo de três vias, ou mais. 139 00:06:29,730 --> 00:06:32,800 E em risco, poderíamos ter visto algo assim. 140 00:06:32,800 --> 00:06:34,010 >> Então este é um grande problema. 141 00:06:34,010 --> 00:06:36,750 Mas considere o parente simplicidade da lógica. 142 00:06:36,750 --> 00:06:44,010 Se x é menor que y, em seguida, dizer x é menor do que Y, o resto, se x for maior do que Y, 143 00:06:44,010 --> 00:06:46,230 em seguida, dizer que x é maior que y. 144 00:06:46,230 --> 00:06:48,300 E, em seguida, logicamente, se você acha que volta a arranhar 145 00:06:48,300 --> 00:06:52,610 ou apenas sua própria intuição humana, assim, se x não é maior do que Y, e X 146 00:06:52,610 --> 00:06:57,000 não é menos do que Y, então é claro x vai ser igual a y. 147 00:06:57,000 --> 00:06:59,690 Portanto, neste caso, por assentamento os blocos de raspadinhas, 148 00:06:59,690 --> 00:07:02,580 podemos conseguir um três maneira bifurcação na estrada? 149 00:07:02,580 --> 00:07:04,980 >> Enquanto isso, se quisermos fazer isso em C, é indiscutivelmente 150 00:07:04,980 --> 00:07:08,420 parece um pouco simpler--, pelo menos, uma vez que você se familiarizar com a sintaxe. 151 00:07:08,420 --> 00:07:12,050 Se X for menor que Y, printf x é inferior a y. 152 00:07:12,050 --> 00:07:16,140 Senão, se x for maior do que Y, printf x é maior que y. 153 00:07:16,140 --> 00:07:21,210 Else printf x é igual a y-- e, mais uma vez, com aqueles barra invertida termina logo 154 00:07:21,210 --> 00:07:24,160 para essas novas linhas de modo que se você realmente correu este tipo de programa 155 00:07:24,160 --> 00:07:25,940 seria apenas mover o cursor em última análise, 156 00:07:25,940 --> 00:07:28,100 para a próxima linha da tela. 157 00:07:28,100 --> 00:07:31,270 >> Agora, entretanto risco teve outra recursos mais sofisticados, única 158 00:07:31,270 --> 00:07:34,320 alguns dos quais vamos inicialmente passar para o mundo do C. 159 00:07:34,320 --> 00:07:37,010 E um deles foi chamado de uma lista em risco. 160 00:07:37,010 --> 00:07:39,100 E este foi um especial tipo de variável que 161 00:07:39,100 --> 00:07:42,840 permitiu-lhe armazenar várias coisas na volta, para trás, para trás, para trás. 162 00:07:42,840 --> 00:07:45,540 >> Em C, que não têm listas, de per si, mas algo 163 00:07:45,540 --> 00:07:48,090 que são mais geralmente chamado de matrizes, embora nós vamos 164 00:07:48,090 --> 00:07:50,590 voltar mais tarde este semestre a olhar para algo 165 00:07:50,590 --> 00:07:52,780 chamado de uma lista, ou realmente uma lista ligada. 166 00:07:52,780 --> 00:07:55,510 Mas, por agora, o mais próximo equivalente em C para nós 167 00:07:55,510 --> 00:07:57,345 vai ser algo chamado de uma matriz. 168 00:07:57,345 --> 00:07:59,740 E uma matriz é simplesmente uma tipo especial de variável 169 00:07:59,740 --> 00:08:03,160 que lhe permite armazenar dados para trás, para trás, para trás, para trás. 170 00:08:03,160 --> 00:08:05,840 >> E, de fato, em risco, se queríamos para acessar 171 00:08:05,840 --> 00:08:09,030 o primeiro elemento de uma matriz ou um lista-- e eu vou chamá-lo, 172 00:08:09,030 --> 00:08:13,600 por convenção, argv, o argumento vetor, mas mais sobre isso antes do tempo. 173 00:08:13,600 --> 00:08:17,090 Se eu quiser começar no primeiro elemento de argv, no mundo do Scratch 174 00:08:17,090 --> 00:08:20,930 você realmente faz normalmente começar a contar a partir de 1. 175 00:08:20,930 --> 00:08:22,850 >> E assim eu poderia obter o item 1 da argv. 176 00:08:22,850 --> 00:08:26,310 Isso é apenas como MIT implementado a noção de listas. 177 00:08:26,310 --> 00:08:29,860 Mas em C, eu vou mais simples apenas dizer, argv, 178 00:08:29,860 --> 00:08:32,758 que novamente é o nome do meu lista-- ou para ser claro, uma matriz. 179 00:08:32,758 --> 00:08:34,549 E se eu quiser o primeiro elementos, eu vou 180 00:08:34,549 --> 00:08:37,890 usar colchetes, o que você pode não freqüentemente usado em um teclado. 181 00:08:37,890 --> 00:08:40,150 >> Mas 0 significa apenas, me o primeiro. 182 00:08:40,150 --> 00:08:42,160 Então, de vez em quando e como o tempo passa, vamos 183 00:08:42,160 --> 00:08:44,570 para começar a ver essas dicotomias entre zero e C, 184 00:08:44,570 --> 00:08:46,070 em que zero usa um. 185 00:08:46,070 --> 00:08:47,670 Nós em C usam 0 aqui. 186 00:08:47,670 --> 00:08:49,420 Mas você vai ver rapidamente depois de entender 187 00:08:49,420 --> 00:08:52,920 os fundamentos de cada língua, que essas coisas começam a ficar ainda mais 188 00:08:52,920 --> 00:08:56,860 familiarizados com a prática e prática. 189 00:08:56,860 --> 00:08:59,700 >> Então vamos realmente olhar agora para um programa. 190 00:08:59,700 --> 00:09:04,031 Aqui deve ser o primeiro da nossa C código-fonte de programas completos. 191 00:09:04,031 --> 00:09:06,280 E o programa que vamos para oferecer para consideração 192 00:09:06,280 --> 00:09:09,340 é o que é equivalente para que no início pedaço zero. 193 00:09:09,340 --> 00:09:13,210 >> Então aqui, nós temos o que é sem dúvida, o programa mais simples C 194 00:09:13,210 --> 00:09:15,410 você pode escrever que realmente faz alguma coisa. 195 00:09:15,410 --> 00:09:18,250 Agora, vamos olhar o passado, por agora, tem incluem, 196 00:09:18,250 --> 00:09:21,190 io.h série, e ambos ângulo colchetes, e int e vazia, 197 00:09:21,190 --> 00:09:22,840 e as chaves, e assim por diante. 198 00:09:22,840 --> 00:09:25,390 >> E vamos apenas focar o que, pelo menos, intuitivamente, 199 00:09:25,390 --> 00:09:26,860 pode saltar para fora em você já. 200 00:09:26,860 --> 00:09:30,300 Na verdade, o principal, eu não sei necessariamente sabem o que é isso, 201 00:09:30,300 --> 00:09:34,580 mas muito parecido com zero tinha que quando bandeira verde clicado parte do enigma, 202 00:09:34,580 --> 00:09:39,070 o mesmo acontece com C como linguagem de programação tem uma peça principal de código que 203 00:09:39,070 --> 00:09:43,380 é executado por padrão. E realmente, é, literalmente, vai ser chamado principal. 204 00:09:43,380 --> 00:09:44,720 >> Assim principal é uma função. 205 00:09:44,720 --> 00:09:48,720 E é uma função especial que existe em C que, quando você executar um programa, 206 00:09:48,720 --> 00:09:52,720 é principal que é executado por padrão. No mundo do Scratch, 207 00:09:52,720 --> 00:09:56,970 era geralmente quando a bandeira verde clicado que foi executado por padrão. 208 00:09:56,970 --> 00:10:01,130 >> Enquanto isso, temos visto isso antes, printf ou imprimir formatado, que é 209 00:10:01,130 --> 00:10:05,620 vai ser uma função que vem com C, junto com um monte de outros, 210 00:10:05,620 --> 00:10:10,140 que a vontade de tempo e tempo de novo, a fim de fazer exatamente 211 00:10:10,140 --> 00:10:12,450 como o próprio nome sugere, imprimir algo. 212 00:10:12,450 --> 00:10:13,500 O que queremos imprimir? 213 00:10:13,500 --> 00:10:15,770 Bem, vamos ver que por personagens que encerram 214 00:10:15,770 --> 00:10:18,680 como o mundo these-- Olá, barra invertida n entre aspas duplas, 215 00:10:18,680 --> 00:10:23,040 podemos dizer exatamente printf o que imprimir na tela. 216 00:10:23,040 --> 00:10:26,430 >> Mas, a fim de fazer que, infelizmente 217 00:10:26,430 --> 00:10:30,010 precisa tomar algo que é já enigmática para nós seres humanos, 218 00:10:30,010 --> 00:10:34,510 mas pelo menos é um pouco readable-- afiada incluem, io.h standard, int, 219 00:10:34,510 --> 00:10:39,340 principal, vazio, printf, toda a mágica encantamentos que acabamos de ver na tela. 220 00:10:39,340 --> 00:10:42,470 Mas nós realmente temos que ir mais misterioso ainda. 221 00:10:42,470 --> 00:10:47,140 Primeiro precisamos de traduzir o código que escrever em código de máquina. 222 00:10:47,140 --> 00:10:51,370 E lembro desde a semana passada que as máquinas, pelo menos os que sabemos aqui, 223 00:10:51,370 --> 00:10:54,450 no fim do dia única compreender zeros e uns. 224 00:10:54,450 --> 00:10:58,100 >> E, meu Deus, se tivéssemos de escrever estas zeros e uns que realmente programa, 225 00:10:58,100 --> 00:11:01,260 que seria muito, muito rapidamente levar a diversão fora de qualquer coisa. 226 00:11:01,260 --> 00:11:05,150 Mas acontece que, por semana passada, que esses padrões de zeros e uns 227 00:11:05,150 --> 00:11:06,400 só tem significado especial. 228 00:11:06,400 --> 00:11:08,500 Em certos contextos, eles podem significar números. 229 00:11:08,500 --> 00:11:11,840 >> Em alguns contextos, eles podem significar letras ou cores, ou qualquer número 230 00:11:11,840 --> 00:11:14,710 de outras abstrações lá em cima. 231 00:11:14,710 --> 00:11:18,450 Mas, assim como o seu computador tem uma CPU, Central Processing Unit, 232 00:11:18,450 --> 00:11:20,390 ou o cérebro dentro do seu computador. 233 00:11:20,390 --> 00:11:22,240 É geralmente Intel dentro, porque é isso 234 00:11:22,240 --> 00:11:24,900 uma das maiores empresas que faz CPUs para computadores. 235 00:11:24,900 --> 00:11:28,910 >> Bem, CPUs Intel e outros simplesmente ter decidido antecipadamente 236 00:11:28,910 --> 00:11:33,970 que certos padrões de zeros e queridos deve significar coisas específicas. 237 00:11:33,970 --> 00:11:37,040 Certos padrões de zeros e uns vai significar, imprimir esta para a tela, 238 00:11:37,040 --> 00:11:39,710 ou adicionar esses dois números, ou subtrair esses dois números, 239 00:11:39,710 --> 00:11:43,310 ou mover este pedaço de dados de memória do meu computador aqui, 240 00:11:43,310 --> 00:11:47,870 ou qualquer número de outras nível muito baixo, mas em última análise útil, operações. 241 00:11:47,870 --> 00:11:53,022 Mas, felizmente, nós, humanos, não vão precisar saber esse nível de detalhe. 242 00:11:53,022 --> 00:11:56,230 De fato, assim como da última vez, onde nós abstraída de novo, e de novo, e de novo, 243 00:11:56,230 --> 00:11:58,930 construção de muito baixo nível primitivos como zeros e uns 244 00:11:58,930 --> 00:12:01,160 a conceitos de nível mais alto como números e letras, 245 00:12:01,160 --> 00:12:04,330 e cores, e mais, nós também podemos como programadores 246 00:12:04,330 --> 00:12:07,080 ficar sobre os ombros de outros que vieram antes de nós 247 00:12:07,080 --> 00:12:11,260 e usar o software que outra pessoas têm escrito antes US-- 248 00:12:11,260 --> 00:12:14,340 ou seja, programas chamados compiladores. 249 00:12:14,340 --> 00:12:17,770 >> C é uma linguagem que geralmente é compilado, 250 00:12:17,770 --> 00:12:22,130 o que significa convertido a partir de código fonte para código de máquina. 251 00:12:22,130 --> 00:12:25,230 Em particular, o que isso significa é que, se você tem a sua fonte 252 00:12:25,230 --> 00:12:29,530 código que você mesmo escreve, como nós em breve vai em apenas um momento na tela, 253 00:12:29,530 --> 00:12:33,140 e você quer convertê-lo finalmente, a máquina code-- 254 00:12:33,140 --> 00:12:37,100 esses zeros e uns que apenas o seu Mac ou PC 255 00:12:37,100 --> 00:12:41,230 understands-- você tem um primeiro alimentar esse código-fonte em como 256 00:12:41,230 --> 00:12:46,340 entrada para um especial programa chamado compilador, 257 00:12:46,340 --> 00:12:48,974 a saída dos quais nós deve ver é o código de máquina. 258 00:12:48,974 --> 00:12:51,890 E, de fato, a última vez que nos falamos sobre, realmente, no final do dia, 259 00:12:51,890 --> 00:12:52,610 problema resolvido. 260 00:12:52,610 --> 00:12:53,360 Você tem entradas. 261 00:12:53,360 --> 00:12:54,318 E você tem saídas. 262 00:12:54,318 --> 00:12:56,560 E você tem algum tipo do algoritmo no meio. 263 00:12:56,560 --> 00:12:59,830 >> Algoritmos podem certamente ser implementadas em software, 264 00:12:59,830 --> 00:13:02,900 como vimos com pseudocódigo na semana passada e, como veremos com código real 265 00:13:02,900 --> 00:13:03,490 esta semana. 266 00:13:03,490 --> 00:13:06,430 E assim um compilador realmente apenas tem um conjunto de algoritmos dentro 267 00:13:06,430 --> 00:13:10,060 de que sabe como converter as palavras-chave especiais, 268 00:13:10,060 --> 00:13:12,180 como principal, e printf, e outros que acabamos 269 00:13:12,180 --> 00:13:17,620 viu nos padrões de zeros e aqueles que Intel dentro e outras CPUs 270 00:13:17,620 --> 00:13:20,020 realmente entende. 271 00:13:20,020 --> 00:13:22,460 Então, como fazemos isso? 272 00:13:22,460 --> 00:13:24,470 Onde é que vamos obter um compilador? 273 00:13:24,470 --> 00:13:26,400 >> A maioria de nós aqui tem um Mac ou um PC. 274 00:13:26,400 --> 00:13:29,152 E você está executando o Mac OS, ou Windows ou Linux ou Solaris, 275 00:13:29,152 --> 00:13:30,860 ou qualquer número de outras sistemas operacionais. 276 00:13:30,860 --> 00:13:32,568 E, de fato, poderíamos sair na web 277 00:13:32,568 --> 00:13:35,710 e baixar um compilador para o seu Mac ou PC 278 00:13:35,710 --> 00:13:37,360 para o seu sistema operacional em particular. 279 00:13:37,360 --> 00:13:39,617 Mas todos nós seria em páginas diferentes, por assim dizer. 280 00:13:39,617 --> 00:13:41,450 Nós teríamos um pouco diferentes configurações. 281 00:13:41,450 --> 00:13:43,210 E as coisas não funcionam da mesma forma. 282 00:13:43,210 --> 00:13:45,280 E, de fato, nos dias de hoje muitos de nós não usam 283 00:13:45,280 --> 00:13:47,516 software que é executado somente em nossos laptops. 284 00:13:47,516 --> 00:13:49,390 Em vez disso, usamos algo como um navegador que 285 00:13:49,390 --> 00:13:52,930 nos permite acessar web-based aplicações na nuvem. 286 00:13:52,930 --> 00:13:55,630 E ainda este semestre, vamos fazer exatamente isso. 287 00:13:55,630 --> 00:13:59,660 Vamos escrever aplicações ou software usando code-- não C, 288 00:13:59,660 --> 00:14:02,860 mas outras linguagens como Python e JavaScript-- que são executados na nuvem. 289 00:14:02,860 --> 00:14:05,860 >> E para fazer isso, nós mesmos durante o semestre 290 00:14:05,860 --> 00:14:11,890 vai realmente usar uma base de nuvem ambiente conhecido como CS50 IDE. 291 00:14:11,890 --> 00:14:16,030 Esta é uma programação baseada em web ambiente ou de desenvolvimento integrado 292 00:14:16,030 --> 00:14:20,610 ambiente, IDE, que é construído em cima de alguns software de código aberto chamado Cloud 9. 293 00:14:20,610 --> 00:14:22,966 E nós temos feito algum pedagógica simplificações para ele 294 00:14:22,966 --> 00:14:25,840 de modo a ocultar determinados recursos no as primeiras semanas que não precisa, 295 00:14:25,840 --> 00:14:27,770 Depois que você pode revelá-los e fazer mais 296 00:14:27,770 --> 00:14:29,400 o que quiser com o meio ambiente. 297 00:14:29,400 --> 00:14:32,470 >> E isso nos permite, também, a pré-instalar determinado software. 298 00:14:32,470 --> 00:14:35,330 Coisas como um chamado CS50 biblioteca, que veremos em breve 299 00:14:35,330 --> 00:14:39,210 fornece-nos em C com algum funcionalidade adicional. 300 00:14:39,210 --> 00:14:44,392 Então, se você vai para, em última instância, CS50.io, você será solicitado a efetuar login, 301 00:14:44,392 --> 00:14:46,350 e uma vez que você faz e criar uma conta para livre, 302 00:14:46,350 --> 00:14:52,150 você será capaz de acessar um ambiente que parece bastante como este. 303 00:14:52,150 --> 00:14:53,760 >> Agora, isso está no modo padrão. 304 00:14:53,760 --> 00:14:55,650 Tudo é bom e brilhante na tela. 305 00:14:55,650 --> 00:14:57,941 Muitos de nós têm o hábito de trabalhando em peça CS50 que é 306 00:14:57,941 --> 00:14:59,150 muito tarde para a noite. 307 00:14:59,150 --> 00:15:02,400 E assim alguns de vocês podem preferir transformá-lo em modo noite, por assim dizer. 308 00:15:02,400 --> 00:15:05,550 >> Mas, em última análise, o que você está vamos ver dentro CS50 IDE 309 00:15:05,550 --> 00:15:08,340 é de três areas-- distinta uma área na qual a esquerda 310 00:15:08,340 --> 00:15:12,604 seus arquivos vão ser na nuvem, uma área no canto superior direito 311 00:15:12,604 --> 00:15:14,270 onde o código vai ser editável. 312 00:15:14,270 --> 00:15:16,650 Você vai ser capaz de abrir guias individuais para qualquer programa 313 00:15:16,650 --> 00:15:19,670 que você escrever este semestre dentro desse canto superior direito. 314 00:15:19,670 --> 00:15:23,070 E então mais arcanely, e ainda assim poderosa, 315 00:15:23,070 --> 00:15:26,610 vai ser essa coisa na bottom conhecido como uma janela de terminal. 316 00:15:26,610 --> 00:15:29,450 >> Esta é uma velha escola Interface da Linha de comando, 317 00:15:29,450 --> 00:15:32,240 ou o CLI, que permite executar comandos 318 00:15:32,240 --> 00:15:35,260 na Computador-- neste caso, o computador no cloud-- 319 00:15:35,260 --> 00:15:39,090 para fazer coisas como compilar o código a partir do código fonte para código de máquina, 320 00:15:39,090 --> 00:15:43,600 para executar seus programas, ou para iniciar a sua servidor web, ou para acessar seu banco de dados, 321 00:15:43,600 --> 00:15:47,454 e qualquer número de outras técnicas que vai começar a usar antes do tempo. 322 00:15:47,454 --> 00:15:49,370 Mas para chegar lá, nós estamos vai realmente ter 323 00:15:49,370 --> 00:15:51,240 ir online e começar a jogar. 324 00:15:51,240 --> 00:15:54,399 E para fazer isso, vamos primeiro começar a mexer com a principal, 325 00:15:54,399 --> 00:15:55,940 e escrever a parte principal de um programa. 326 00:15:55,940 --> 00:15:59,170 E vamos usar essa função printf, que temos utilizado anteriormente, 327 00:15:59,170 --> 00:16:01,050 simplesmente para dizer alguma coisa. 328 00:16:01,050 --> 00:16:04,910 >> Então aqui eu já estou dentro de IDE CS50. 329 00:16:04,910 --> 00:16:05,930 Eu tenho registrado com antecedência. 330 00:16:05,930 --> 00:16:07,360 E eu completo exibido na janela. 331 00:16:07,360 --> 00:16:09,670 E assim, em última análise, você também em problemas próximos 332 00:16:09,670 --> 00:16:12,960 vai seguir os passos similares que irá fornecer a documentação online. 333 00:16:12,960 --> 00:16:16,360 Então você não precisa se preocupar com absorvendo cada etapa técnica pouco 334 00:16:16,360 --> 00:16:17,730 o que eu faço aqui hoje. 335 00:16:17,730 --> 00:16:19,222 >> Mas você vai ter uma tela como esta. 336 00:16:19,222 --> 00:16:20,430 Acontece que eu estar no modo de noite. 337 00:16:20,430 --> 00:16:22,944 E você pode iluminar tudo -se desativando o modo de noite. 338 00:16:22,944 --> 00:16:24,860 E no final da dia, você vai ver 339 00:16:24,860 --> 00:16:30,090 estes três principal areas-- o arquivo navegador à esquerda, as guias de código em cima, 340 00:16:30,090 --> 00:16:32,430 e a janela do terminal, na parte inferior. 341 00:16:32,430 --> 00:16:34,890 >> Deixe-me ir em frente e escrever o meu primeiro programa. 342 00:16:34,890 --> 00:16:42,300 Eu estou indo para ir preventivamente para arquivo, Salvar e salvar meu arquivo como hello.c. 343 00:16:42,300 --> 00:16:46,850 Na verdade, por convenção, qualquer que programa gravação que está escrito na linguagem C 344 00:16:46,850 --> 00:16:49,739 deve ser nomeado algo dot c, por convenção. 345 00:16:49,739 --> 00:16:53,030 Então eu vou nomeá-lo hello.c, porque Eu só quero dizer Olá para o mundo. 346 00:16:53,030 --> 00:16:54,820 Agora vou para aumentar fora e clique em Salvar. 347 00:16:54,820 --> 00:16:58,180 E tudo o que tenho aqui agora é um guia em que eu possa começar a escrever código. 348 00:16:58,180 --> 00:16:59,490 >> Isso não vai compilar. 349 00:16:59,490 --> 00:17:00,300 Isso não significa nada. 350 00:17:00,300 --> 00:17:02,750 E por isso mesmo que eu converti isso para zeros e uns, 351 00:17:02,750 --> 00:17:05,390 a CPU vai ter nenhuma idéia do que está acontecendo ao redor. 352 00:17:05,390 --> 00:17:14,170 Mas se eu escrever as linhas que coincidem -se com o ser C conventions-- de C, 353 00:17:14,170 --> 00:17:20,150 novamente, desta language-- com sintaxe como isso, printf Olá mundo-- e não tenho 354 00:17:20,150 --> 00:17:22,210 sentiram confortáveis ​​com fazendo isso ao longo do tempo. 355 00:17:22,210 --> 00:17:24,510 Então eu não acho que fiz quaisquer erros tipográficos. 356 00:17:24,510 --> 00:17:27,910 >> Mas, invariavelmente, o primeiro vez que fizer isso, você vai. 357 00:17:27,910 --> 00:17:31,090 E o que eu estou prestes a fazer muito pode assim não funcionar para você pela primeira vez. 358 00:17:31,090 --> 00:17:33,610 E isso é perfeitamente normal, porque agora você 359 00:17:33,610 --> 00:17:37,662 pode apenas ver um monte de novidade, mas ao longo do tempo uma vez que você se familiarizar 360 00:17:37,662 --> 00:17:39,870 com este ambiente, e esta linguagem, e outros, 361 00:17:39,870 --> 00:17:42,370 você vai começar a ver as coisas que ou são corretas ou incorretas. 362 00:17:42,370 --> 00:17:44,369 >> E é isso que o companheiros de ensino e curso 363 00:17:44,369 --> 00:17:48,780 assistentes ficar tão bom em ao longo do tempo, é detectar erros ou erros em seu código. 364 00:17:48,780 --> 00:17:52,110 Mas afirmam que há há erro neste código. 365 00:17:52,110 --> 00:17:53,990 Então agora eu quero executar este programa. 366 00:17:53,990 --> 00:17:57,440 >> Agora no meu próprio Mac ou PC, estou em o hábito de ícones duplo clique 367 00:17:57,440 --> 00:17:59,350 quando eu quero executar algum programa. 368 00:17:59,350 --> 00:18:01,080 Mas isso não é o modelo aqui. 369 00:18:01,080 --> 00:18:04,570 Neste ambiente, o que é CS50 IDE. 370 00:18:04,570 --> 00:18:07,192 Estamos usando uma operação sistema chamado Linux. 371 00:18:07,192 --> 00:18:09,900 Linux é uma reminiscência de uma outra sistema operacional, geralmente conhecido 372 00:18:09,900 --> 00:18:10,850 como Unix. 373 00:18:10,850 --> 00:18:16,340 E Linux é particularmente conhecido por ter uma linha de comando Ambiente, CLI. 374 00:18:16,340 --> 00:18:20,070 Agora, estamos usando uma específica sabor do Linux chamada Ubuntu. 375 00:18:20,070 --> 00:18:22,770 E Ubuntu é simplesmente uma determinada versão do Linux. 376 00:18:22,770 --> 00:18:27,900 >> Mas estes do Linux nos dias de hoje fazem, na verdade, vêm com interfaces gráficas de usuário. 377 00:18:27,900 --> 00:18:30,360 E o que acontecerá com estar usando aqui é baseado na web. 378 00:18:30,360 --> 00:18:32,735 Portanto, este pode parecer até mesmo um pouco diferente de algo 379 00:18:32,735 --> 00:18:35,310 você mesmo pode ter visto ou executado no passado. 380 00:18:35,310 --> 00:18:37,910 >> Então, eu estou indo para ir em frente agora e faça o seguinte. 381 00:18:37,910 --> 00:18:40,950 Guardei esse arquivo como hello.c. 382 00:18:40,950 --> 00:18:47,350 Eu estou indo para ir em frente e Tipo clanghello.c Então Clang 383 00:18:47,350 --> 00:18:49,850 para a linguagem C é um compilador. 384 00:18:49,850 --> 00:18:51,952 É pré-instalado no CS50 IDE. 385 00:18:51,952 --> 00:18:54,910 E você pode absolutamente fazer download e instalar em seu próprio Mac ou PC. 386 00:18:54,910 --> 00:18:57,910 >> Mas, mais uma vez, você não tem todas a pré-configuração feito para você. 387 00:18:57,910 --> 00:19:00,940 Então, por agora, eu sou apenas vai correr clanghello.c. 388 00:19:00,940 --> 00:19:03,240 E agora perceber esta sintaxe aqui acabará 389 00:19:03,240 --> 00:19:06,930 realizar apenas significa que eu estou em um pasta ou diretório chamado Workspace. 390 00:19:06,930 --> 00:19:11,030 Este sinal de dólar é apenas uma convenção de sentido, digite os comandos aqui. 391 00:19:11,030 --> 00:19:14,560 >> É o que se chama um prompt, basta por convenção é sinal de dólar. 392 00:19:14,560 --> 00:19:19,130 E se eu ir em frente agora e clique Enter, nada parece ter acontecido. 393 00:19:19,130 --> 00:19:20,930 Mas isso é realmente uma coisa boa. 394 00:19:20,930 --> 00:19:23,650 A menos que acontece sobre sua tela, o mais provável 395 00:19:23,650 --> 00:19:26,710 seu código é ser correto, pelo menos sintacticamente. 396 00:19:26,710 --> 00:19:29,120 >> Então, se eu quiser executar este programa, o que eu faço? 397 00:19:29,120 --> 00:19:33,770 Bem, verifica-se que o nome padrão por convenção 398 00:19:33,770 --> 00:19:38,854 para os programas quando você não especificar um nomear para o seu programa é apenas a.out. 399 00:19:38,854 --> 00:19:41,270 E esta sintaxe também, você vai se familiarizar com antes do tempo. 400 00:19:41,270 --> 00:19:47,500 >> Dot cortar apenas significa que, hey, CS50 IDE, executar um programa chamado a.out 401 00:19:47,500 --> 00:19:49,400 que está dentro de meu diretório atual. 402 00:19:49,400 --> 00:19:51,520 Isso ponto significa o diretório atual. 403 00:19:51,520 --> 00:19:55,040 E vamos ver o que outras sequências de caracteres significa antes do tempo. 404 00:19:55,040 --> 00:19:58,430 >> Então, vamos lá, Enter, Olá mundo. 405 00:19:58,430 --> 00:20:00,080 E você vai notar, que o que aconteceu? 406 00:20:00,080 --> 00:20:01,580 Não só imprimir Olá mundo. 407 00:20:01,580 --> 00:20:05,990 É também movido a cursor para a próxima linha. 408 00:20:05,990 --> 00:20:07,160 >> E por que isso? 409 00:20:07,160 --> 00:20:12,400 Qual era o código que escreveu antes que garantir-se que o cursor seria 410 00:20:12,400 --> 00:20:14,882 ir para a próxima linha? 411 00:20:14,882 --> 00:20:16,840 Coisa engraçada sobre um computador é que só vai 412 00:20:16,840 --> 00:20:18,570 para fazer literalmente o que você diga a ele para fazer. 413 00:20:18,570 --> 00:20:26,050 >> Então, se você diga a ele para printf Olá, vírgula, espaço, mundo, perto citações, 414 00:20:26,050 --> 00:20:29,090 é, literalmente, só vai para imprimir esses caracteres. 415 00:20:29,090 --> 00:20:31,980 Mas eu tinha esse caráter especial no final, recall, barra invertida n. 416 00:20:31,980 --> 00:20:34,230 E é isso que garantiu que o personagem passou 417 00:20:34,230 --> 00:20:36,570 para a próxima linha da tela. 418 00:20:36,570 --> 00:20:38,097 >> Na verdade, deixe-me ir e fazer isso. 419 00:20:38,097 --> 00:20:39,430 Deixe-me ir em frente e eliminar este. 420 00:20:39,430 --> 00:20:41,180 Agora, observe que o topo da minha tela há 421 00:20:41,180 --> 00:20:42,890 um pouco de luz vermelha na a guia indicando, 422 00:20:42,890 --> 00:20:45,047 hey, você não salvou seu arquivo. 423 00:20:45,047 --> 00:20:47,880 Então, eu estou indo para ir em frente com o controle S ou o comando S, salve o arquivo. 424 00:20:47,880 --> 00:20:51,130 Agora goes-- fui para um verde moment--. 425 00:20:51,130 --> 00:20:53,760 E agora ele está de volta para apenas a ser um ícone de perto. 426 00:20:53,760 --> 00:21:01,860 >> Se eu agora executar clanghello.c de novo, Enter, barra ponto, a.out, Enter, 427 00:21:01,860 --> 00:21:04,110 você vai ver que ele ainda trabalhava. 428 00:21:04,110 --> 00:21:06,020 Mas é, sem dúvida, um pouco buggy. 429 00:21:06,020 --> 00:21:08,714 Neste momento, o meu trabalho prompt--, e depois que o sinal de dólar, 430 00:21:08,714 --> 00:21:10,880 e depois o meu prompt-- real é tudo na mesma linha. 431 00:21:10,880 --> 00:21:14,540 Então, isso certamente um bug estética, mesmo que isso não é realmente um bug lógico. 432 00:21:14,540 --> 00:21:16,250 >> Então eu vou para desfazer o que eu fiz. 433 00:21:16,250 --> 00:21:18,560 Eu estou indo para executar novamente a.out. 434 00:21:18,560 --> 00:21:22,710 Repare que eu adicionar o newline personagem de volta. 435 00:21:22,710 --> 00:21:24,280 Eu salvou o arquivo. 436 00:21:24,280 --> 00:21:31,630 >> Então, eu estou indo para executar novamente a.out, e- caramba, um erro, um erro que significa erro. 437 00:21:31,630 --> 00:21:35,020 Assim, o erro é que, embora Eu adicionei a barra invertida n lá, 438 00:21:35,020 --> 00:21:41,180 re-salvos, re-correu o programa, o comportamento era a mesma. 439 00:21:41,180 --> 00:21:42,640 Por que isso seria? 440 00:21:42,640 --> 00:21:43,910 >> Eu estou faltando uma etapa, certo? 441 00:21:43,910 --> 00:21:47,620 Esse passo chave no início foi que você tem a-- quando você alterar seu código-fonte, 442 00:21:47,620 --> 00:21:49,610 verifica-se também executar -lo através do compilador 443 00:21:49,610 --> 00:21:51,102 novamente de modo a obter um novo código de máquina. 444 00:21:51,102 --> 00:21:52,810 E o código de máquina, os zeros e uns, 445 00:21:52,810 --> 00:21:56,260 vão ser quase idêntico, mas não perfeitamente assim, porque precisamos, 446 00:21:56,260 --> 00:21:57,510 é claro, que a nova linha. 447 00:21:57,510 --> 00:22:02,640 >> Então, para corrigir isso, eu vou precisar executar novamente clanghello.c, entrar, dot 448 00:22:02,640 --> 00:22:03,800 slash, a.out. 449 00:22:03,800 --> 00:22:08,402 E agora, Olá mundo está de volta para onde eu esperava que fosse. 450 00:22:08,402 --> 00:22:09,610 Então, isso é tudo muito bem e bom. 451 00:22:09,610 --> 00:22:13,150 Mas a.out é um nome muito estúpido para uma programa, mesmo que ele passa a ser, 452 00:22:13,150 --> 00:22:16,530 por razões históricas, o default-- significando saídas de montagem. 453 00:22:16,530 --> 00:22:20,780 >> Mas deixe-me ir em frente aqui e fazer isso de forma diferente. 454 00:22:20,780 --> 00:22:24,760 Eu quero o meu programa Olá mundo para realmente ser chamado Olá. 455 00:22:24,760 --> 00:22:28,320 Então, se fosse um ícone no meu desktop, ele não seria a.out. 456 00:22:28,320 --> 00:22:29,730 Ele seria chamado Olá. 457 00:22:29,730 --> 00:22:33,660 >> Então, para fazer isso, verifica-se que Clang, como muitos programas, 458 00:22:33,660 --> 00:22:37,980 suporta os argumentos da linha de comando, ou bandeiras, ou interruptores, 459 00:22:37,980 --> 00:22:39,600 que simplesmente influenciar o seu comportamento. 460 00:22:39,600 --> 00:22:45,160 Especificamente, Clang suporta um traço o bandeira, que, em seguida, toma uma segunda palavra. 461 00:22:45,160 --> 00:22:48,190 Neste caso, eu vou arbitrariamente, mas razoavelmente, chamá-lo Olá. 462 00:22:48,190 --> 00:22:50,710 Mas eu poderia chamá-lo de qualquer coisa Eu quero, exceto a.out, que 463 00:22:50,710 --> 00:22:52,390 Seria muito além do ponto. 464 00:22:52,390 --> 00:22:55,640 >> E depois é só especificar o nome do arquivo que eu quero para compilar. 465 00:22:55,640 --> 00:22:59,190 Então, agora mesmo que no início do comando ainda tenho Clang, 466 00:22:59,190 --> 00:23:01,410 no final do comando Eu ainda tenho o nome do arquivo, 467 00:23:01,410 --> 00:23:05,520 Agora tenho esses linha de comando argumentos, esses sinalizadores que estão dizendo, 468 00:23:05,520 --> 00:23:11,180 oh, por sinal, output-o, um arquivo chamado Olá, não o a.out padrão. 469 00:23:11,180 --> 00:23:13,810 >> Então, se eu acertar Entre agora, nada parece ter acontecido. 470 00:23:13,810 --> 00:23:17,900 E, ainda, agora eu posso fazer barra dot Olá. 471 00:23:17,900 --> 00:23:19,089 Portanto, é o mesmo programa. 472 00:23:19,089 --> 00:23:21,380 Os zeros e uns são idênticas no final do dia. 473 00:23:21,380 --> 00:23:24,210 >> Mas eles estão em dois diferente a.out files--, 474 00:23:24,210 --> 00:23:26,490 que é a primeira versão e apenas tolamente nomeado, 475 00:23:26,490 --> 00:23:30,250 e agora Olá, que é um tanto nome mais atraente para um programa. 476 00:23:30,250 --> 00:23:33,195 Mas, honestamente, eu nunca estou vai se lembrar isso de novo, 477 00:23:33,195 --> 00:23:34,070 e novamente, e novamente. 478 00:23:34,070 --> 00:23:36,411 E, na verdade, como se escreve programas mais complicados, 479 00:23:36,411 --> 00:23:38,160 os comandos que você está vai ter que escrever 480 00:23:38,160 --> 00:23:40,920 vão ficar ainda ainda mais complicado. 481 00:23:40,920 --> 00:23:41,940 >> E assim não se preocupar. 482 00:23:41,940 --> 00:23:46,220 Acontece que os seres humanos antes nós já perceberam que eles também 483 00:23:46,220 --> 00:23:47,530 tive esse mesmo problema exato. 484 00:23:47,530 --> 00:23:50,900 Eles também não gostava de ter que digitar comandos bastante longos, misterioso, 485 00:23:50,900 --> 00:23:52,200 muito menos se lembrar deles. 486 00:23:52,200 --> 00:23:56,070 E assim os seres humanos antes de nós fizeram outros programas que tornam mais fácil 487 00:23:56,070 --> 00:23:57,670 para compilar o seu software. 488 00:23:57,670 --> 00:24:01,609 >> E, de fato, uma tal programa é chamado Marca. 489 00:24:01,609 --> 00:24:03,150 Então, eu estou indo para ir em frente e fazer isso. 490 00:24:03,150 --> 00:24:05,691 Eu estou indo para desfazer tudo o que eu acabou de fazer da seguinte maneira. 491 00:24:05,691 --> 00:24:07,690 Deixe-me escrever LS. 492 00:24:07,690 --> 00:24:10,980 E você verá três coisas- a.out, e uma estrela, Olá 493 00:24:10,980 --> 00:24:12,810 e uma estrela, e hello.c. 494 00:24:12,810 --> 00:24:14,730 Esperemos que este deve ser um pouco intuitivo, 495 00:24:14,730 --> 00:24:18,220 na medida em que não havia anteriormente nada neste espaço de trabalho. 496 00:24:18,220 --> 00:24:21,240 Não havia nada que eu tinha criado até que começamos a classe. 497 00:24:21,240 --> 00:24:22,840 >> E eu criei hello.c. 498 00:24:22,840 --> 00:24:24,544 Eu, então, compilou, e chamou-a.out. 499 00:24:24,544 --> 00:24:27,460 E então eu compilado-lo novamente ligeiramente diferente e chamou-lhe Olá. 500 00:24:27,460 --> 00:24:32,830 Então, eu tenho três arquivos nesse diretório, nesta pasta chamada Workspace. 501 00:24:32,830 --> 00:24:35,005 Agora, eu posso ver que bem se eu diminuir o zoom na verdade. 502 00:24:35,005 --> 00:24:37,530 >> Se eu aumentar aqui e olhar para esse lado superior direito 503 00:24:37,530 --> 00:24:39,940 canto, como prometido à esquerda lado da tela 504 00:24:39,940 --> 00:24:42,990 é sempre vai mostrar-lhe o que está na sua conta, o que é 505 00:24:42,990 --> 00:24:44,790 dentro de IDE CS50. 506 00:24:44,790 --> 00:24:46,680 E há três arquivos lá. 507 00:24:46,680 --> 00:24:49,070 >> Então, eu quero me livrar de a.out e Olá. 508 00:24:49,070 --> 00:24:51,275 E como você pode imagine intuitivamente, você 509 00:24:51,275 --> 00:24:53,400 poderia tipo de controle clique ou clique direito sobre esta. 510 00:24:53,400 --> 00:24:54,590 E este pequeno menu aparece. 511 00:24:54,590 --> 00:24:57,170 Você pode baixar o arquivo, execute -lo, visualizá-lo, atualizar, renomear, 512 00:24:57,170 --> 00:24:57,700 ou que não. 513 00:24:57,700 --> 00:25:00,260 >> E eu poderia simplesmente apagar, e ia embora. 514 00:25:00,260 --> 00:25:05,260 Mas vamos fazer as coisas com um comando linha por agora, de modo a ficar confortável 515 00:25:05,260 --> 00:25:07,010 com isso, e fazer o seguinte. 516 00:25:07,010 --> 00:25:12,345 Eu estou indo para ir em frente e remover a.out digitando literalmente rma.out. 517 00:25:12,345 --> 00:25:14,890 Acontece que, o comando para remover ou apagar alguma coisa, 518 00:25:14,890 --> 00:25:16,280 não é remover ou apagar. 519 00:25:16,280 --> 00:25:21,260 >> É mais sucintamente RM, apenas para economizar -lhe algumas teclas, e pressione Enter. 520 00:25:21,260 --> 00:25:24,707 Agora vamos ser um pouco enigmaticamente remover a.out arquivo regular. 521 00:25:24,707 --> 00:25:27,040 Eu realmente não sei o que é um arquivo irregular seria ainda. 522 00:25:27,040 --> 00:25:28,660 Mas eu quero removê-lo. 523 00:25:28,660 --> 00:25:30,150 >> Então eu vou para digitar y para sim. 524 00:25:30,150 --> 00:25:31,940 Ou eu poderia escrevê-lo para fora, e pressione Enter. 525 00:25:31,940 --> 00:25:33,440 E, novamente, nada parece acontecer. 526 00:25:33,440 --> 00:25:35,840 Mas isso é, em geral, uma coisa boa. 527 00:25:35,840 --> 00:25:40,490 >> Se eu digitar LS desta vez, o que devo ver? 528 00:25:40,490 --> 00:25:44,930 Felizmente, apenas Olá e hello.c. 529 00:25:44,930 --> 00:25:47,286 Agora, como um aparte, você vai notar esta estrela, asterisco, 530 00:25:47,286 --> 00:25:48,660 isso é no final de meus programas. 531 00:25:48,660 --> 00:25:50,201 E eles também estão aparecendo em verde. 532 00:25:50,201 --> 00:25:53,970 Isso é apenas a maneira da CS50 IDE de cluing-lo para o fato 533 00:25:53,970 --> 00:25:55,280 que isso não é código-fonte. 534 00:25:55,280 --> 00:25:58,880 Isso é um executável, um executável programa que você pode realmente executar 535 00:25:58,880 --> 00:26:01,020 fazendo barra ponto, e então é nome. 536 00:26:01,020 --> 00:26:05,860 >> Agora, deixe-me ir em frente e remover isso, rm Olá, Enter, remover regulares 537 00:26:05,860 --> 00:26:08,010 arquivo Olá, sim. 538 00:26:08,010 --> 00:26:11,180 E agora se eu digitar LS, estamos de volta para hello.c. 539 00:26:11,180 --> 00:26:13,917 Tente não excluir seu código-fonte real. 540 00:26:13,917 --> 00:26:16,250 Mesmo que haja recursos incorporado IDE CS50 onde 541 00:26:16,250 --> 00:26:19,870 você pode passar por seu histórico de revisão e retroceder no tempo, se você acidentalmente 542 00:26:19,870 --> 00:26:23,660 apagar alguma coisa, faça estar atento como por esses avisos sim ou não, 543 00:26:23,660 --> 00:26:25,381 do que você realmente quer fazer. 544 00:26:25,381 --> 00:26:27,380 E se eu for até o topo deixou canto aqui, 545 00:26:27,380 --> 00:26:30,696 tudo o que resta é hello.c. 546 00:26:30,696 --> 00:26:32,570 Portanto, não há cachos de outros comandos que você 547 00:26:32,570 --> 00:26:37,550 pode executar no mundo do Linux, um dos quais é, novamente, Make. 548 00:26:37,550 --> 00:26:40,180 E nós estamos indo fazer meu programa agora como se segue. 549 00:26:40,180 --> 00:26:43,270 >> Em vez de fazer clang, em vez de fazer clang-o, 550 00:26:43,270 --> 00:26:45,860 Vou simplesmente literalmente, tipo, marca Olá. 551 00:26:45,860 --> 00:26:49,630 E agora notar, estou não digitando make hello.c. 552 00:26:49,630 --> 00:26:50,910 Estou digitando make Olá. 553 00:26:50,910 --> 00:26:54,840 >> E este programa Faça esse vem com IDE CS50, e mais 554 00:26:54,840 --> 00:26:57,090 geralmente com Linux, é um programa que é 555 00:26:57,090 --> 00:26:59,120 vai fazer um programa chamado Olá. 556 00:26:59,120 --> 00:27:03,680 E ele vai assumir, por convenção, que se este programa pode ser feita, 557 00:27:03,680 --> 00:27:09,030 que vai ser feita a partir de uma fonte arquivo de código que terminam em c ponto, hello.c. 558 00:27:09,030 --> 00:27:12,210 >> Então, se eu pressione Enter Agora, observe que o comando que é executado 559 00:27:12,210 --> 00:27:14,340 é, na verdade ainda mais antes do que antes. 560 00:27:14,340 --> 00:27:16,670 E isso é porque nós temos IDE CS50 pré-configurado para ter 561 00:27:16,670 --> 00:27:19,878 alguns recursos adicionais construídos em que nós apenas ainda não precisam, mas em breve. 562 00:27:19,878 --> 00:27:23,470 Mas a principal coisa a perceber é agora eu tenho um programa Olá. 563 00:27:23,470 --> 00:27:27,080 >> Se eu digitar LS novamente, eu ter um programa Olá. 564 00:27:27,080 --> 00:27:32,070 E eu posso executá-lo com dot cortar a.out, não, 565 00:27:32,070 --> 00:27:35,590 porque todo o ponto deste exercício foi dot Olá barra. 566 00:27:35,590 --> 00:27:38,089 E agora eu tenho meu programa Olá mundo. 567 00:27:38,089 --> 00:27:39,880 Então, movendo-se para a frente, estamos quase sempre apenas 568 00:27:39,880 --> 00:27:42,088 indo para compilar nossos programas usando o comando make. 569 00:27:42,088 --> 00:27:45,300 E então nós estamos indo para executá-los por dot slash, e o nome do programa. 570 00:27:45,300 --> 00:27:49,610 Mas percebem o que fazem está fazendo por você, não é por si não é um compilador. 571 00:27:49,610 --> 00:27:53,310 É apenas um programa de conveniência que sabe como provocar um compilador 572 00:27:53,310 --> 00:27:56,470 para executar para que você mesmo pode usá-lo. 573 00:27:56,470 --> 00:28:00,220 >> O que existem outros comandos no Linux, e por sua vez o CS50 IDE? 574 00:28:00,220 --> 00:28:03,107 Nós verá logo que há uma comando CD, Change Directory. 575 00:28:03,107 --> 00:28:05,190 Isso permite que você dentro sua interface de linha de comando 576 00:28:05,190 --> 00:28:07,610 para seguir em frente, e para trás, e abrir pastas diferentes 577 00:28:07,610 --> 00:28:08,860 sem usar o mouse. 578 00:28:08,860 --> 00:28:12,470 >> LS que vimos, que significa lista os arquivos no diretório atual. 579 00:28:12,470 --> 00:28:14,650 Faça Dir, você pode provavelmente começar a inferir 580 00:28:14,650 --> 00:28:18,150 o que elas significam agora-- fazer diretório, se você quiser criar uma pasta. 581 00:28:18,150 --> 00:28:21,270 RM para remover, RM Dir para remover directory-- e estes, 582 00:28:21,270 --> 00:28:24,160 mais uma vez, são a linha de comando equivalentes de o que você 583 00:28:24,160 --> 00:28:26,945 poderia fazer em CS50 IDE com o mouse. 584 00:28:26,945 --> 00:28:28,820 Mas você vai encontrar em breve que às vezes é apenas 585 00:28:28,820 --> 00:28:30,610 muito mais rápido que fazer coisas com um teclado, 586 00:28:30,610 --> 00:28:33,690 e, finalmente, uma muito mais poderosa. 587 00:28:33,690 --> 00:28:36,440 >> Mas é difícil argumentar que qualquer coisa que tenho feito até agora 588 00:28:36,440 --> 00:28:39,990 é tudo o que poderoso, quando tudo temos vindo a dizer é, Olá mundo. 589 00:28:39,990 --> 00:28:43,740 E, na verdade, eu codificado a palavras Olá Mundo em meu programa. 590 00:28:43,740 --> 00:28:45,530 Não há dinamismo ainda. 591 00:28:45,530 --> 00:28:49,320 Scratch foi uma ordem de magnitude mais interessante na semana passada. 592 00:28:49,320 --> 00:28:51,220 >> E assim vamos chegar lá. 593 00:28:51,220 --> 00:28:55,310 Vamos dar um passo para que, forma de algumas destas funções. 594 00:28:55,310 --> 00:28:59,470 Assim, não só C vêm com printf, e cachos de outras funções 595 00:28:59,470 --> 00:29:01,850 alguns dos quais vamos ver ao longo do tempo, isso não acontece 596 00:29:01,850 --> 00:29:05,760 torná-lo tão fácil para a direita fora do portão no sentido de obter a entrada do usuário. 597 00:29:05,760 --> 00:29:08,140 >> Na verdade, um dos pontos fracos de linguagens como C, 598 00:29:08,140 --> 00:29:10,140 e até mesmo Java e ainda os outros, é que não faz 599 00:29:10,140 --> 00:29:15,860 torná-lo fácil de obter apenas coisas como inteiros de usuários, ou cordas, palavras, 600 00:29:15,860 --> 00:29:19,970 e frases, deixar as coisas sozinho como valores de ponto ou números reais flutuante 601 00:29:19,970 --> 00:29:23,240 com pontos decimais, e realmente números longos, como veremos em breve. 602 00:29:23,240 --> 00:29:27,000 Portanto, esta lista de funções aqui, estes são como outras peças do risco de quebra-cabeça 603 00:29:27,000 --> 00:29:31,090 que têm pré-instalado no CS50 IDE que usaremos durante algumas semanas 604 00:29:31,090 --> 00:29:34,010 como rodinhas de tipos e eventualmente, levá-los fora, e procurar 605 00:29:34,010 --> 00:29:37,210 por baixo da capa, talvez, em como essas coisas são implementadas. 606 00:29:37,210 --> 00:29:40,460 >> Mas, para isso, vamos realmente escrever um programa. 607 00:29:40,460 --> 00:29:41,770 Deixe-me ir em frente agora. 608 00:29:41,770 --> 00:29:44,750 E eu estou indo para criar um novo arquivo clicando neste pouco mais, 609 00:29:44,750 --> 00:29:45,970 e clicando em Novo arquivo. 610 00:29:45,970 --> 00:29:49,250 >> Eu estou indo para salvar esta próxima um, como, digamos, string.c, 611 00:29:49,250 --> 00:29:50,750 porque eu quero jogar com cordas. 612 00:29:50,750 --> 00:29:53,990 E string em C é apenas uma sequência de caracteres. 613 00:29:53,990 --> 00:29:56,090 Então agora vamos em frente e faça o seguinte. 614 00:29:56,090 --> 00:30:01,204 >> Incluir padrão IO.h-- e verifica-se padrão de IO, 615 00:30:01,204 --> 00:30:03,360 IO significa apenas entrada e saída. 616 00:30:03,360 --> 00:30:05,920 Assim, verifica-se que esta linha aqui é o que 617 00:30:05,920 --> 00:30:08,140 são os EUA vizinha de usar printf. 618 00:30:08,140 --> 00:30:10,410 Printf, é claro, produz uma saída. 619 00:30:10,410 --> 00:30:15,000 Portanto, a fim de usar printf, verifica-se fora você tem que ter esta linha de código 620 00:30:15,000 --> 00:30:16,040 na parte superior do seu arquivo. 621 00:30:16,040 --> 00:30:18,456 >> E vamos voltar ao que que realmente significa antes do tempo. 622 00:30:18,456 --> 00:30:20,400 Acontece que em qualquer programa C que eu escrevo, 623 00:30:20,400 --> 00:30:23,640 Eu tenho que iniciá-lo com código que se parece com isso. 624 00:30:23,640 --> 00:30:26,860 E você notará CS50 IDE, e outro desenvolvimento integrado 625 00:30:26,860 --> 00:30:30,050 ambientes como ele, vão tentar o melhor 626 00:30:30,050 --> 00:30:31,780 eles podem terminar o seu pensamento. 627 00:30:31,780 --> 00:30:35,930 Na verdade, há um momento se eu desfazer o que eu fiz, eu pressione Enter. 628 00:30:35,930 --> 00:30:39,160 >> Eu, então, bateu encaracolados aberta cinta, pressione Enter novamente. 629 00:30:39,160 --> 00:30:40,430 E terminei o meu pensamento. 630 00:30:40,430 --> 00:30:45,140 Ela me deu uma nova linha, recuado não menos por razões estilísticas agradáveis ​​vamos ver. 631 00:30:45,140 --> 00:30:48,559 E então ele automaticamente me deu que chaveta para terminar o meu pensamento. 632 00:30:48,559 --> 00:30:50,600 Agora, nem sempre adivinhar o que você quer fazer. 633 00:30:50,600 --> 00:30:53,620 Mas, em grande parte, ele faz poupar algumas teclas. 634 00:30:53,620 --> 00:30:59,560 Então, há pouco, nós corremos esse program-- Olá, mundo, e então compilou, 635 00:30:59,560 --> 00:31:00,460 e, em seguida, ele correu. 636 00:31:00,460 --> 00:31:01,867 Mas não há dinamismo aqui. 637 00:31:01,867 --> 00:31:03,700 O que se quiséssemos fazer algo diferente? 638 00:31:03,700 --> 00:31:07,630 Bem, o que se eu quisesse realmente obter uma seqüência do usuário? 639 00:31:07,630 --> 00:31:11,250 Vou usar uma peça do puzzle chamado exatamente isso-- obter string. 640 00:31:11,250 --> 00:31:15,860 >> Acontece que em C que, quando você não quer a contribuir para uma parte do enigma, 641 00:31:15,860 --> 00:31:19,360 ou mais propriamente a uma função, literalmente apenas fazer parêntese de abertura, 642 00:31:19,360 --> 00:31:20,430 perto parênteses. 643 00:31:20,430 --> 00:31:25,540 Por isso, é como se houvesse nenhuma caixa branca para digitar em. 644 00:31:25,540 --> 00:31:27,720 O bloco de dizer antes tinha uma pequena caixa branca. 645 00:31:27,720 --> 00:31:29,660 Não temos essa caixa branca agora. 646 00:31:29,660 --> 00:31:33,310 >> Mas quando eu chamo cadeia get, I quer colocar o resultado em algum lugar. 647 00:31:33,310 --> 00:31:37,680 Assim, um paradigma muito comum em C é a chamar uma função, como string de chegar aqui, 648 00:31:37,680 --> 00:31:41,070 e depois armazenar o valor de retorno. 649 00:31:41,070 --> 00:31:44,450 É o resultado de sua esforço em alguma coisa. 650 00:31:44,450 --> 00:31:47,630 >> E qual é a construir na programação, 651 00:31:47,630 --> 00:31:53,450 se em zero ou empresa C, que nós pode usar para realmente armazenar alguma coisa? 652 00:31:53,450 --> 00:31:55,990 Chamou-lhe uma variável, certo? 653 00:31:55,990 --> 00:32:00,320 E em risco, nós realmente não importo com o que estava acontecendo em variáveis. 654 00:32:00,320 --> 00:32:02,170 >> Mas, neste caso, nós realmente fazem. 655 00:32:02,170 --> 00:32:03,719 Eu vou dizer string. 656 00:32:03,719 --> 00:32:05,510 E então eu poderia chamar isso o que eu quiser. 657 00:32:05,510 --> 00:32:08,340 Vou chamá-lo nome, recebe obter string. 658 00:32:08,340 --> 00:32:10,250 >> E agora, mesmo se você estiver um pouco novo para isso, 659 00:32:10,250 --> 00:32:11,984 notar que eu estou faltando alguns detalhes. 660 00:32:11,984 --> 00:32:13,150 Eu estou esquecendo um ponto e vírgula. 661 00:32:13,150 --> 00:32:14,400 Eu preciso terminar este pensamento. 662 00:32:14,400 --> 00:32:17,480 Então, eu vou mover meu cursor, e bater ponto e vírgula lá. 663 00:32:17,480 --> 00:32:19,130 E o que eu fiz? 664 00:32:19,130 --> 00:32:21,440 Nesta linha de código, número 5, no momento, 665 00:32:21,440 --> 00:32:23,799 Eu estou chamando cadeia get sem entradas. 666 00:32:23,799 --> 00:32:26,090 Portanto, não há pouco de branco caixa como o Save bloco tem. 667 00:32:26,090 --> 00:32:28,590 >> Só estou dizendo, hey, computador, me uma corda. 668 00:32:28,590 --> 00:32:31,390 O sinal de igual não é realmente um sinal de igual, per se. 669 00:32:31,390 --> 00:32:33,790 É a atribuição operador, o que significa, 670 00:32:33,790 --> 00:32:37,860 hey, computador, mova o valor da direita para a esquerda. 671 00:32:37,860 --> 00:32:40,480 E na esquerda, eu tenho a seguinte. 672 00:32:40,480 --> 00:32:43,580 >> Hey, computador, dá-me um string-- uma sequência de caracteres. 673 00:32:43,580 --> 00:32:45,637 E chamar esse nome string. 674 00:32:45,637 --> 00:32:47,220 E eu nem sequer têm de chamá-lo Name. 675 00:32:47,220 --> 00:32:49,970 >> Eu poderia chamá-lo, convencionalmente, algo como S, 676 00:32:49,970 --> 00:32:52,900 bem como usamos i para chamar a variável i. 677 00:32:52,900 --> 00:32:54,829 Mas agora eu preciso fazer algo com ele. 678 00:32:54,829 --> 00:32:57,370 Seria muito estúpido para tente compilar este código, executando 679 00:32:57,370 --> 00:32:59,410 este programa, embora Estou recebendo uma corda, 680 00:32:59,410 --> 00:33:01,580 porque ainda é apenas vai dizer Olá mundo. 681 00:33:01,580 --> 00:33:06,140 >> Mas e se eu quero mudar isso. 682 00:33:06,140 --> 00:33:07,940 Por que não fazer isso? 683 00:33:07,940 --> 00:33:11,632 Percent s, vírgula s. 684 00:33:11,632 --> 00:33:13,090 E isso é um pouco enigmática ainda. 685 00:33:13,090 --> 00:33:15,560 >> Então deixe-me fazer o meu variáveis ​​mais clara. 686 00:33:15,560 --> 00:33:17,510 Deixe-me citar essa Nome variável. 687 00:33:17,510 --> 00:33:20,230 E vamos ver se não podemos provocar além o que está acontecendo aqui. 688 00:33:20,230 --> 00:33:22,770 >> Então, na linha de cinco, eu estou recebendo uma string. 689 00:33:22,770 --> 00:33:25,620 E eu estou armazenando essa seqüência, tudo o que o usuário digitou no 690 00:33:25,620 --> 00:33:28,430 no seu teclado, em uma variável chamada nome. 691 00:33:28,430 --> 00:33:30,590 E verifica-se que printf não apenas 692 00:33:30,590 --> 00:33:34,220 receber um argumento em dobro citações, uma entrada entre aspas duplas. 693 00:33:34,220 --> 00:33:39,100 >> Pode demorar duas, ou três, ou mais, tais que o segundo, ou terceiro, ou quarto, 694 00:33:39,100 --> 00:33:42,320 são todos os nomes de variáveis, ou valores especificamente, 695 00:33:42,320 --> 00:33:48,610 que pretende ligar a, dinamicamente, essa cadeia entre aspas. 696 00:33:48,610 --> 00:33:52,110 Em outras palavras, o que Seria errado com isso? 697 00:33:52,110 --> 00:33:57,920 Se eu apenas disse Olá nome, barra invertida n, salvo meu arquivo, compilado meu código, 698 00:33:57,920 --> 00:34:01,660 e correu isso, o que aconteceria? 699 00:34:01,660 --> 00:34:05,139 >> É só vai dizer, Olá citar, literalmente N-A-M-E, 700 00:34:05,139 --> 00:34:07,900 que é uma espécie de idiota, porque não é diferente do mundo. 701 00:34:07,900 --> 00:34:10,400 Então, qualquer coisa entre aspas é o que, literalmente, será impresso. 702 00:34:10,400 --> 00:34:12,520 Então, se eu quiser ter um espaço reservado lá, 703 00:34:12,520 --> 00:34:14,422 Na verdade, eu preciso usar alguma sintaxe especial. 704 00:34:14,422 --> 00:34:17,380 E acontece que se você ler o documentação para a função printf, 705 00:34:17,380 --> 00:34:21,320 ele irá dizer-lhe que se você usar por cento s, 706 00:34:21,320 --> 00:34:23,920 você pode substituir um valor como se segue. 707 00:34:23,920 --> 00:34:27,190 >> Depois de uma vírgula depois disso aspas duplas, você simplesmente 708 00:34:27,190 --> 00:34:29,179 escrever o nome do variável que você quer 709 00:34:29,179 --> 00:34:33,790 para ligar para esse formato código, ou especificador de formato, 710 00:34:33,790 --> 00:34:35,469 por cento s para cordas. 711 00:34:35,469 --> 00:34:39,190 E agora, se eu tenho guardado o meu arquivo, Eu voltar para o meu terminal. 712 00:34:39,190 --> 00:34:42,870 E eu digito Faça String, porque, mais uma vez, o nome do presente 713 00:34:42,870 --> 00:34:45,510 arquivo que eu escolhi antes é string.c. 714 00:34:45,510 --> 00:34:48,510 >> Então eu vou dizer Faça String, entrar. 715 00:34:48,510 --> 00:34:51,550 Oh meu Deus, olhar para todos os erros que já fez. 716 00:34:51,550 --> 00:34:55,540 E isso é-- o quê, isso é realmente como um, sete programa de linha de seis? 717 00:34:55,540 --> 00:34:57,790 Portanto, este é onde ele pode muito rapidamente obter esmagadora. 718 00:34:57,790 --> 00:35:00,890 >> Esta janela de terminal tem agora só regurgitado 719 00:35:00,890 --> 00:35:03,230 um grande número de mensagens de erro. 720 00:35:03,230 --> 00:35:07,560 Certamente, eu não tenho mais de erro mensagens do que eu tenho linhas de código. 721 00:35:07,560 --> 00:35:08,680 Então, o que está acontecendo? 722 00:35:08,680 --> 00:35:10,920 >> Bem, a melhor estratégia para fazer a qualquer momento você 723 00:35:10,920 --> 00:35:13,710 não encontrar uma esmagadora lista de erros como esse, 724 00:35:13,710 --> 00:35:16,690 é rolar para trás, olhar para o comando que acabou de correr que no meu caso 725 00:35:16,690 --> 00:35:18,020 é fazer string. 726 00:35:18,020 --> 00:35:21,630 Olhe para o que tornam o fez, e que é isso comando longo Clang, não é grande coisa lá. 727 00:35:21,630 --> 00:35:22,950 >> Mas o vermelho é ruim. 728 00:35:22,950 --> 00:35:24,750 Verde está tentando ser gentil e prestativa. 729 00:35:24,750 --> 00:35:26,140 Mas ainda é ruim, nesse caso. 730 00:35:26,140 --> 00:35:27,510 Mas onde é ruim? 731 00:35:27,510 --> 00:35:31,450 >> String.c, linha de cinco, de cinco caracteres. 732 00:35:31,450 --> 00:35:32,930 Portanto, esta é apenas uma convenção comum. 733 00:35:32,930 --> 00:35:36,060 Algo cólon algo significa número de linha e número de caracteres. 734 00:35:36,060 --> 00:35:41,080 Erro, o uso de não declarado cadeia do identificador. 735 00:35:41,080 --> 00:35:42,900 Pensou padrão em? 736 00:35:42,900 --> 00:35:45,530 >> Então, infelizmente, Clang está a tentar ser útil. 737 00:35:45,530 --> 00:35:46,850 Mas é errado, neste caso. 738 00:35:46,850 --> 00:35:49,350 Não, Clang, eu não quis dizer IO padrão. 739 00:35:49,350 --> 00:35:51,070 Eu quis dizer que na linha um, sim. 740 00:35:51,070 --> 00:35:53,420 >> Mas a linha cinco é este aqui. 741 00:35:53,420 --> 00:35:57,040 E Clang não entender S-T-R-I-N-L. 742 00:35:57,040 --> 00:36:01,490 É um identificador não declarado, a palavra que nunca viu antes. 743 00:36:01,490 --> 00:36:05,730 E isso é porque C, a linguagem estamos escrevendo código no agora, 744 00:36:05,730 --> 00:36:08,070 não tem variáveis ​​chamadas cordas. 745 00:36:08,070 --> 00:36:11,380 >> Não se trata, por padrão, o suporte algo chamado uma corda. 746 00:36:11,380 --> 00:36:16,750 Isso é um pedaço de CS50 jargão, mas muito convencional. 747 00:36:16,750 --> 00:36:18,600 Mas eu posso corrigir isso como se segue. 748 00:36:18,600 --> 00:36:22,090 >> Se eu adicionar uma linha de código para o início do programa, 749 00:36:22,090 --> 00:36:27,890 incluem CS50.h, que é outro arquivo em algum lugar dentro de CS50 IDE, em algum lugar 750 00:36:27,890 --> 00:36:30,820 no disco rígido, por assim dizer, do sistema operacional Ubuntu 751 00:36:30,820 --> 00:36:33,590 que eu estou correndo, que é o arquivo que é 752 00:36:33,590 --> 00:36:38,740 vai ensinar o funcionamento sistema que uma string é, apenas 753 00:36:38,740 --> 00:36:41,930 como io.h padrão é o arquivo no sistema operacional que é 754 00:36:41,930 --> 00:36:44,430 indo para ensinar-lhe o que printf é. 755 00:36:44,430 --> 00:36:46,810 >> Na verdade, teríamos conseguido uma mensagem muito semelhante 756 00:36:46,810 --> 00:36:50,600 Se Io tinha admitido padrão Io.h e tentou usar printf. 757 00:36:50,600 --> 00:36:53,632 Então, eu estou indo para ir em frente e apenas tomar controle L para limpar a minha tela. 758 00:36:53,632 --> 00:36:56,340 Ou você pode digitar clara e vai apenas limpar a janela de terminal. 759 00:36:56,340 --> 00:36:58,020 Mas você ainda pode rolar de volta no tempo. 760 00:36:58,020 --> 00:37:01,100 >> E eu estou indo para executar novamente Faça cadeia. 761 00:37:01,100 --> 00:37:03,660 Cruzar os dedos desta vez, Enter. 762 00:37:03,660 --> 00:37:05,380 Oh meu Deus, funcionou. 763 00:37:05,380 --> 00:37:09,280 ele me mostra um comando longo críptica que é o que fazem gerado via Clang, 764 00:37:09,280 --> 00:37:10,460 mas nenhuma mensagem de erro. 765 00:37:10,460 --> 00:37:12,460 Então percebe, embora você pode ficar completamente 766 00:37:12,460 --> 00:37:14,480 sobrecarregado com a número de mensagens de erro, 767 00:37:14,480 --> 00:37:17,540 ele só poderia ser esta cascata irritante efeito, onde Clang não entende 768 00:37:17,540 --> 00:37:19,620 uma coisa, o que significa que, em seguida, não entende a palavra seguinte, 769 00:37:19,620 --> 00:37:20,560 ou a linha seguinte. 770 00:37:20,560 --> 00:37:22,850 E por isso só engasga com seu código. 771 00:37:22,850 --> 00:37:24,440 Mas a correção pode ser simples. 772 00:37:24,440 --> 00:37:27,822 E por isso sempre se concentrar no primeira linha de saída. 773 00:37:27,822 --> 00:37:29,530 E se não o fizer compreendê-lo, basta olhar 774 00:37:29,530 --> 00:37:32,480 para palavras-chave que pode ser pistas, e o número da linha, 775 00:37:32,480 --> 00:37:34,650 eo caráter, onde esse erro pode ser. 776 00:37:34,650 --> 00:37:40,328 >> Agora deixe-me ir em frente e digite dot slash, corda, entrar. 777 00:37:40,328 --> 00:37:44,340 Hm, não está dizendo Olá nada. 778 00:37:44,340 --> 00:37:46,210 Por quê? 779 00:37:46,210 --> 00:37:48,170 Bem, lembro, onde está a correr? 780 00:37:48,170 --> 00:37:53,730 >> Ele provavelmente está preso no momento em um loop, se quiserem, na linha seis, 781 00:37:53,730 --> 00:37:56,950 porque Obter Cordas de design, escrito pela equipe CS50, 782 00:37:56,950 --> 00:38:00,350 é literalmente significa apenas sentar lá esperando e esperando, 783 00:38:00,350 --> 00:38:01,850 e à espera de uma cadeia. 784 00:38:01,850 --> 00:38:03,792 Tudo o que quer dizer com cadeia é de entrada humana. 785 00:38:03,792 --> 00:38:04,500 Então você sabe o quê? 786 00:38:04,500 --> 00:38:05,166 Deixe-me ir em frente. 787 00:38:05,166 --> 00:38:08,704 E apenas por um capricho, deixe-me escreva o meu nome, David, entrar. 788 00:38:08,704 --> 00:38:10,120 Agora eu tenho um programa mais dinâmico. 789 00:38:10,120 --> 00:38:11,240 Ele disse, Olá David. 790 00:38:11,240 --> 00:38:16,280 >> Se eu ir em frente e executar isso de novo, deixe-me tentar dizer o nome Zamila, entrar. 791 00:38:16,280 --> 00:38:17,940 E agora temos um programa dinâmico. 792 00:38:17,940 --> 00:38:19,380 Eu não codificado mundo. 793 00:38:19,380 --> 00:38:21,760 Eu não codificado nome, ou Davi, ou Zamila. 794 00:38:21,760 --> 00:38:25,350 >> Agora é muito mais parecido com os programas sabemos, em que se tirar a entrada, 795 00:38:25,350 --> 00:38:27,870 ele produz saída ligeiramente diferente. 796 00:38:27,870 --> 00:38:31,020 Agora, este não é o melhor experiência do usuário, ou UX. 797 00:38:31,020 --> 00:38:33,000 Eu executar o programa. 798 00:38:33,000 --> 00:38:35,830 >> Eu não sei o que eu deveria a fazer, a menos que eu realmente olhar para 799 00:38:35,830 --> 00:38:37,290 ou lembrar o código-fonte. 800 00:38:37,290 --> 00:38:39,640 Então, vamos fazer o usuário experimentar um pouco melhor 801 00:38:39,640 --> 00:38:41,240 com a mais simples das coisas. 802 00:38:41,240 --> 00:38:44,782 Deixe-me voltar a este programa, e simplesmente dizer printf. 803 00:38:44,782 --> 00:38:48,870 >> E deixe-me ir em frente e dizer o nome, cólon, e um espaço e, em seguida, um ponto e vírgula. 804 00:38:48,870 --> 00:38:51,170 E apenas por diversão, sem folga n. 805 00:38:51,170 --> 00:38:52,980 E isso é deliberada, porque eu não quero 806 00:38:52,980 --> 00:38:54,590 a solicitação para mover para a próxima linha. 807 00:38:54,590 --> 00:38:58,800 >> Quero, em vez disso, fazer isso, faça cadeia recompilar o meu código em nova máquina 808 00:38:58,800 --> 00:39:00,980 código dot cortar string. 809 00:39:00,980 --> 00:39:02,460 Ah, isso é muito mais bonita. 810 00:39:02,460 --> 00:39:05,780 Agora eu realmente sei o que o computador quer que eu faça, dar-lhe um nome. 811 00:39:05,780 --> 00:39:10,020 >> Então, eu estou indo para ir em frente e digite em Rob, entrar, e Olá, Rob. 812 00:39:10,020 --> 00:39:13,640 Assim, perceber, esta ainda é, no final do dia, somente um programa de nove linha. 813 00:39:13,640 --> 00:39:15,090 Mas temos tido esses passos de bebê. 814 00:39:15,090 --> 00:39:18,380 >> Nós escrevemos uma linha com a qual estavam familiarizados printf, Olá mundo,. 815 00:39:18,380 --> 00:39:19,980 Em seguida, desfez um pouco disso. 816 00:39:19,980 --> 00:39:21,560 E nós realmente utilizados cadeia get. 817 00:39:21,560 --> 00:39:23,362 E nós jogou esse valor em uma variável. 818 00:39:23,362 --> 00:39:26,070 E, em seguida, fomos em frente e melhorado ainda mais com uma terceira linha. 819 00:39:26,070 --> 00:39:29,220 E este processo iterativo de escrever software é verdadeiramente chave. 820 00:39:29,220 --> 00:39:33,420 Em CS50 e na vida em geral, você geralmente não deve sentar-se, 821 00:39:33,420 --> 00:39:36,800 tem um programa em mente, e tentar escrever a coisa toda de uma vez. 822 00:39:36,800 --> 00:39:40,810 >> Ele vai, inevitavelmente, resultar em forma mais erros do que nós mesmos vimos aqui. 823 00:39:40,810 --> 00:39:44,070 Mesmo eu, até hoje, constantemente fazer outros erros estúpidos, 824 00:39:44,070 --> 00:39:47,480 são erros realmente mais difícil que são mais difíceis de descobrir. 825 00:39:47,480 --> 00:39:52,095 Mas você vai cometer mais erros mais linhas de código que você escreve tudo de uma vez. 826 00:39:52,095 --> 00:39:54,220 E assim esta prática de, escrever um pouco de código 827 00:39:54,220 --> 00:39:57,930 que você está confortável, compilar -lo, executá-lo, testá-lo de modo mais geral, 828 00:39:57,930 --> 00:40:01,370 em seguida, passar on-- assim como mantivemos camadas e camadas na semana passada, 829 00:40:01,370 --> 00:40:04,190 construção de algo muito simples de algo mais complexo, 830 00:40:04,190 --> 00:40:05,200 fazer o mesmo aqui. 831 00:40:05,200 --> 00:40:08,500 Não se sente, e tentar escrever um problema inteiro. 832 00:40:08,500 --> 00:40:10,780 Realmente tomar estes passos de bebê. 833 00:40:10,780 --> 00:40:15,100 >> Agora, cordas não são todos tão útil para si mesmos. 834 00:40:15,100 --> 00:40:18,210 TEREMOS, na verdade, idealmente, como a têm algo mais em nossa caixa de ferramentas. 835 00:40:18,210 --> 00:40:20,990 Então vamos realmente fazer exatamente isso. 836 00:40:20,990 --> 00:40:24,900 >> Deixe-me ir em frente agora e chicote de um programa ligeiramente diferente. 837 00:40:24,900 --> 00:40:28,320 E nós vamos chamar este int.c, por inteiro. 838 00:40:28,320 --> 00:40:30,870 Vou, da mesma forma, incluem CS550.h. 839 00:40:30,870 --> 00:40:33,060 Eu estou indo para incluir padrão IO. 840 00:40:33,060 --> 00:40:36,630 E isso vai ser bastante comum nestes primeiros dias de aula. 841 00:40:36,630 --> 00:40:39,050 >> E eu vou pronto -me com uma função principal. 842 00:40:39,050 --> 00:40:43,370 E agora em vez de começar uma corda, vamos em frente e obter um int. 843 00:40:43,370 --> 00:40:49,285 Vamos chamá-lo i, e chamá-lo chegar int, parens próximos, ponto e vírgula. 844 00:40:49,285 --> 00:40:51,410 E agora vamos fazer algo com ele, printf. 845 00:40:51,410 --> 00:40:56,190 >> Vamos dizer algo como Olá, barra invertida n, vírgula i. 846 00:40:56,190 --> 00:41:00,010 Então, eu estou muito bem imitando o que eu fiz apenas um momento atrás. 847 00:41:00,010 --> 00:41:01,660 Eu tenho um espaço reservado aqui. 848 00:41:01,660 --> 00:41:05,150 Tenho vírgula i aqui, porque eu quero para ligar i em que espaço reservado. 849 00:41:05,150 --> 00:41:07,250 >> Então, vamos em frente e experimentar compilar este programa. 850 00:41:07,250 --> 00:41:10,060 O arquivo é chamado int.c. 851 00:41:10,060 --> 00:41:12,920 Então eu vou dizer, fazer int, entrar. 852 00:41:12,920 --> 00:41:16,420 Oh meu Deus, mas não é grande coisa, certo? 853 00:41:16,420 --> 00:41:17,230 Há um erro. 854 00:41:17,230 --> 00:41:19,810 >> Há um erro sintáctico aqui de tal forma que o programa não pode 855 00:41:19,810 --> 00:41:25,460 ser compilado dentro int.c, linha sete, caráter 27, o formato de erro 856 00:41:25,460 --> 00:41:28,400 especifica tipo char estrela, o que quer que seja. 857 00:41:28,400 --> 00:41:30,020 Mas o tipo de argumento é int. 858 00:41:30,020 --> 00:41:33,110 >> Então, aqui, também, não vamos a-- mesmo que hoje em dia é um monte de material, 859 00:41:33,110 --> 00:41:35,710 nós estamos indo para oprimi-lo com absolutamente todos os recursos do C, 860 00:41:35,710 --> 00:41:38,070 e programação de um modo mais geral, em apenas estas primeiras semanas. 861 00:41:38,070 --> 00:41:40,400 Portanto, há muitas vezes vai ser jargão com o qual você não está familiarizado. 862 00:41:40,400 --> 00:41:43,350 E, de fato, estrela char é algo vamos voltar a 863 00:41:43,350 --> 00:41:44,830 em vez de uma semana ou duas de. 864 00:41:44,830 --> 00:41:47,530 >> Mas, por agora, vamos ver se podemos analisar as palavras que são familiares. 865 00:41:47,530 --> 00:41:50,750 Formatos-- isso ouvimos formato especificador, código de formato antes. 866 00:41:50,750 --> 00:41:51,840 Isso é familiar. 867 00:41:51,840 --> 00:41:53,840 Type-- mas o argumento tem o tipo int. 868 00:41:53,840 --> 00:41:55,980 Espere um minuto, i é um int. 869 00:41:55,980 --> 00:41:59,230 >> Talvez por cento s na verdade, tem algum significado definido. 870 00:41:59,230 --> 00:42:00,230 E, de fato, ele faz. 871 00:42:00,230 --> 00:42:03,101 Um inteiro, se você quiser printf para substituí-lo, 872 00:42:03,101 --> 00:42:05,350 você realmente tem que usar um especificador de formato diferente. 873 00:42:05,350 --> 00:42:06,890 E você não saberia isso a menos que alguém lhe disse, 874 00:42:06,890 --> 00:42:07,973 ou você tinha feito isso antes. 875 00:42:07,973 --> 00:42:10,490 Mas o que é por cento de i pode ser utilizada 876 00:42:10,490 --> 00:42:12,240 em printf para ligar um inteiro. 877 00:42:12,240 --> 00:42:14,920 Você também pode usar cento d para um número inteiro decimal. 878 00:42:14,920 --> 00:42:16,490 Mas eu é agradável e simples aqui. 879 00:42:16,490 --> 00:42:17,590 Então, vamos ir com isso. 880 00:42:17,590 --> 00:42:21,160 >> Agora deixe-me ir em frente e reprise make int, Enter. 881 00:42:21,160 --> 00:42:23,328 Isso é bom, sem erros. 882 00:42:23,328 --> 00:42:27,260 Dot cortar OK int--, má experiência do usuário, porque eu não disse a mim mesmo 883 00:42:27,260 --> 00:42:27,760 o que fazer. 884 00:42:27,760 --> 00:42:28,426 Mas isso é bom. 885 00:42:28,426 --> 00:42:29,480 Eu estou pegando rapidamente. 886 00:42:29,480 --> 00:42:36,260 >> E agora deixe-me ir em frente e digitar David, OK, Zamila, Rob. 887 00:42:36,260 --> 00:42:37,820 OK, então isso é uma coisa boa. 888 00:42:37,820 --> 00:42:41,710 Desta vez, estou usando uma função, uma peça do puzzle, chamado get int. 889 00:42:41,710 --> 00:42:44,230 E acontece out-- e nós vamos ver isso mais tarde no term-- 890 00:42:44,230 --> 00:42:47,730 a equipe CS50 implementou obter seqüência de tal forma 891 00:42:47,730 --> 00:42:50,350 que ele vai só fisicamente obter uma corda para você. 892 00:42:50,350 --> 00:42:54,340 >> Ele implementou get int em de tal forma que ele só irá 893 00:42:54,340 --> 00:42:55,590 obter um número inteiro para você. 894 00:42:55,590 --> 00:42:57,830 E se você, o ser humano, não cooperar, é 895 00:42:57,830 --> 00:43:00,590 literalmente indo só para dizem repetir, repetir, repetir, 896 00:43:00,590 --> 00:43:05,200 literalmente sentado lá looping, até você obrigar com algum número mágico, 897 00:43:05,200 --> 00:43:07,670 como 50, e Olá 50. 898 00:43:07,670 --> 00:43:11,440 >> Ou se executar este novo e digite 42, Olá 42. 899 00:43:11,440 --> 00:43:15,750 E assim a função get int dentro desse enigma 900 00:43:15,750 --> 00:43:19,050 é a lógica suficiente, o pensamento suficiente, de descobrir, o que é uma palavra? 901 00:43:19,050 --> 00:43:20,330 E o que é um número? 902 00:43:20,330 --> 00:43:23,165 Apenas aceitar, em última instância, números. 903 00:43:23,165 --> 00:43:25,690 904 00:43:25,690 --> 00:43:30,230 >> Assim, verifica-se que esta Não é tudo o que expressivo. 905 00:43:30,230 --> 00:43:30,910 tão longe. 906 00:43:30,910 --> 00:43:33,690 Então, yay, última vez que passou muito rapidamente 907 00:43:33,690 --> 00:43:38,320 em jogos de execução, e animação, e obras artísticas em zero. 908 00:43:38,320 --> 00:43:42,260 E aqui, estamos sendo conteúdo com Olá mundo, e Olá 50. 909 00:43:42,260 --> 00:43:43,696 >> Não é tudo o que inspirador. 910 00:43:43,696 --> 00:43:46,070 E, de fato, estes primeiros exemplos vai levar algum tempo 911 00:43:46,070 --> 00:43:47,510 a rampa até em emoção. 912 00:43:47,510 --> 00:43:49,854 Mas temos muito mais controlar agora, na verdade. 913 00:43:49,854 --> 00:43:51,770 E nós estamos indo muito iniciar rapidamente camadas 914 00:43:51,770 --> 00:43:53,870 em cima dessas primitivas básicas. 915 00:43:53,870 --> 00:43:56,370 >> Mas, primeiro, vamos entender quais são as limitações. 916 00:43:56,370 --> 00:43:58,620 Na verdade, uma das coisas Zero não é fácil 917 00:43:58,620 --> 00:44:00,990 vamos fazer é realmente olhar por baixo da capa, 918 00:44:00,990 --> 00:44:03,740 e entender o que é um computador é, o que ele pode fazer, 919 00:44:03,740 --> 00:44:05,250 e quais são as suas limitações. 920 00:44:05,250 --> 00:44:08,580 E, de fato, que a falta de compreensão, potencialmente, a longo prazo 921 00:44:08,580 --> 00:44:12,520 pode levar a nossa própria escrita mistakes-- bugs, escrevendo software inseguro que 922 00:44:12,520 --> 00:44:13,880 for cortada de alguma forma. 923 00:44:13,880 --> 00:44:17,130 >> Então, vamos dar alguns passos em direção a compreender isto um pouco melhor, 924 00:44:17,130 --> 00:44:19,710 forma de, digamos, o exemplo a seguir. 925 00:44:19,710 --> 00:44:23,550 Eu estou indo para ir em frente e implementar rapidinho um programa chamado Adder. 926 00:44:23,550 --> 00:44:25,134 Como, vamos adicionar alguns números juntos. 927 00:44:25,134 --> 00:44:27,800 E eu estou indo para codificar alguns cantos aqui, e simplesmente copiar e colar 928 00:44:27,800 --> 00:44:30,270 onde eu estava antes, apenas para que possamos ir mais cedo. 929 00:44:30,270 --> 00:44:33,090 Então agora eu tenho os princípios básicos de um programa chamado Adder. 930 00:44:33,090 --> 00:44:34,670 >> E vamos em frente e fazer isso. 931 00:44:34,670 --> 00:44:38,680 Eu estou indo para ir em frente e digamos, IntX recebe obter int. 932 00:44:38,680 --> 00:44:39,430 E sabe de uma coisa? 933 00:44:39,430 --> 00:44:40,990 Vamos fazer uma melhor experiência do usuário. 934 00:44:40,990 --> 00:44:45,740 >> Então, vamos apenas dizer que x é e, efetivamente, solicitar ao usuário a dar-nos x. 935 00:44:45,740 --> 00:44:50,600 E, em seguida, deixe-me ir em frente e dizer: printf como sobre y é, desta vez esperando 936 00:44:50,600 --> 00:44:53,140 dois valores a partir do utilizador. 937 00:44:53,140 --> 00:44:59,759 E então vamos apenas ir em frente e digamos, printf, a soma de x e y é. 938 00:44:59,759 --> 00:45:01,300 E agora eu não quero fazer por cento s. 939 00:45:01,300 --> 00:45:09,080 Eu quero fazer por cento i, barra invertida n, e em seguida, conecte valor da soma. 940 00:45:09,080 --> 00:45:10,620 >> Então, como posso fazer sobre isso? 941 00:45:10,620 --> 00:45:11,270 Você sabe o que? 942 00:45:11,270 --> 00:45:12,840 Eu sei como usar variáveis. 943 00:45:12,840 --> 00:45:15,140 Deixe-me apenas declarar um novo, int z. 944 00:45:15,140 --> 00:45:16,770 >> E eu vou dar um palpite aqui. 945 00:45:16,770 --> 00:45:21,470 Se houver sinais iguais nesta linguagem, talvez eu só posso fazer x mais y, 946 00:45:21,470 --> 00:45:23,660 enquanto eu terminar o meu pensou com um ponto e vírgula? 947 00:45:23,660 --> 00:45:28,170 Agora eu posso voltar para cá, conecte z, terminar este pensamento com um ponto e vírgula. 948 00:45:28,170 --> 00:45:33,160 E vamos ver agora, se estes sequências de lines-- x é obter int. 949 00:45:33,160 --> 00:45:34,770 Y é obter int. 950 00:45:34,770 --> 00:45:37,980 >> Adicionar x e y, armazenar o valor em z-- por isso, mais uma vez, lembre-se o sinal de igual 951 00:45:37,980 --> 00:45:38,560 não é igual. 952 00:45:38,560 --> 00:45:41,100 É atribuição da direita para a esquerda. 953 00:45:41,100 --> 00:45:45,180 E vamos imprimir que a soma de X e Y não é literalmente Z, 954 00:45:45,180 --> 00:45:46,830 mas o que está dentro de z. 955 00:45:46,830 --> 00:45:50,090 Então, vamos fazer Adder - agradáveis, sem erros desta vez. 956 00:45:50,090 --> 00:45:53,030 Dot cortar Adder, entrar, x vai ser 1. 957 00:45:53,030 --> 00:45:55,380 >> Y vai ser 2. 958 00:45:55,380 --> 00:45:58,964 E a soma de x e y é 3. 959 00:45:58,964 --> 00:46:00,130 Então, isso é tudo muito bem e bom. 960 00:46:00,130 --> 00:46:03,260 >> Então você pode imaginar que a matemática devem trabalhar em um programa como este. 961 00:46:03,260 --> 00:46:04,040 Mas você sabe o que? 962 00:46:04,040 --> 00:46:06,904 É esta variável, linha 12, mesmo necessário? 963 00:46:06,904 --> 00:46:09,820 Você não precisa adquirir o hábito de apenas armazenar coisas em variáveis 964 00:46:09,820 --> 00:46:10,980 apenas porque você pode. 965 00:46:10,980 --> 00:46:13,550 E, de fato, é geralmente má concepção ponderada 966 00:46:13,550 --> 00:46:18,100 se você estiver criando uma variável, chamado z, neste caso, o armazenamento em algo que, 967 00:46:18,100 --> 00:46:21,390 e, em seguida, imediatamente usá-lo, mas nunca novamente. 968 00:46:21,390 --> 00:46:24,700 Por que dar algo de um nome como z, se você está literalmente 969 00:46:24,700 --> 00:46:26,770 vai usar esse coisa apenas uma vez, e assim 970 00:46:26,770 --> 00:46:29,380 proximal ao local onde você criou -lo em primeiro lugar, 971 00:46:29,380 --> 00:46:31,052 tão perto em termos de linhas de código? 972 00:46:31,052 --> 00:46:31,760 Então você sabe o quê? 973 00:46:31,760 --> 00:46:34,480 Acontece que C é bastante flexível. 974 00:46:34,480 --> 00:46:36,586 Se eu realmente quero plug-in valores aqui, 975 00:46:36,586 --> 00:46:38,210 Eu não precisa declarar uma nova variável. 976 00:46:38,210 --> 00:46:41,680 Eu poderia apenas plug-in x mais y, porque C entende 977 00:46:41,680 --> 00:46:43,390 aritmética e operadores matemáticos. 978 00:46:43,390 --> 00:46:47,140 >> Então, eu posso simplesmente dizer, fazer essa matemática, x mais y, o que quer que esses valores são, 979 00:46:47,140 --> 00:46:50,780 conecte o resultante inteiro para essa cadeia. 980 00:46:50,780 --> 00:46:53,730 Portanto, este pode ser, embora apenas uma linha mais curta, 981 00:46:53,730 --> 00:46:58,480 um projeto melhor, um programa melhor, porque há menos código, portanto, 982 00:46:58,480 --> 00:46:59,921 menos para mim entender. 983 00:46:59,921 --> 00:47:01,920 E também é apenas mais limpo, na medida em que não estamos 984 00:47:01,920 --> 00:47:04,620 introdução de novas palavras, novos símbolos, como z, 985 00:47:04,620 --> 00:47:07,510 mesmo que eles realmente não servem muito de um propósito. 986 00:47:07,510 --> 00:47:12,890 >> Infelizmente, a matemática não é todos os que às vezes confiáveis. 987 00:47:12,890 --> 00:47:15,270 Vamos ir em frente e fazer isso. 988 00:47:15,270 --> 00:47:18,200 Eu estou indo para ir em frente agora e faça o seguinte. 989 00:47:18,200 --> 00:47:27,650 >> Vamos fazer printf, cento i, além de por cento i, será por cento i, barra invertida n. 990 00:47:27,650 --> 00:47:32,240 E eu vou fazer isto-- xyx mais y. 991 00:47:32,240 --> 00:47:34,821 Então eu só vou reescrever esta um pouco diferente aqui. 992 00:47:34,821 --> 00:47:36,320 Deixe-me apenas fazer uma verificação de sanidade rápida. 993 00:47:36,320 --> 00:47:37,986 Mais uma vez, não vamos ficar à frente de nós mesmos. 994 00:47:37,986 --> 00:47:41,420 Faça víbora, ponto barra víbora. 995 00:47:41,420 --> 00:47:44,950 x é 1, y é 2, 1 é mais 2 3. 996 00:47:44,950 --> 00:47:45,870 Então, isso é bom. 997 00:47:45,870 --> 00:47:49,060 Mas vamos complicar isso agora um pouco, e criar um novo arquivo. 998 00:47:49,060 --> 00:47:53,350 >> Eu vou chamar este, dizer, ints, plural para inteiros. 999 00:47:53,350 --> 00:47:55,980 Deixe-me começar de onde eu era um momento atrás. 1000 00:47:55,980 --> 00:47:57,770 Mas agora vamos fazer algumas outras linhas. 1001 00:47:57,770 --> 00:48:03,430 Deixe-me ir em frente e fazer o seguinte, printf, cento i, menos por cento i, 1002 00:48:03,430 --> 00:48:08,959 é por cento i, vírgula x, vírgula yx menos y. 1003 00:48:08,959 --> 00:48:10,750 Então, eu estou fazendo um pouco matemática diferente lá. 1004 00:48:10,750 --> 00:48:11,624 Vamos fazer outro. 1005 00:48:11,624 --> 00:48:16,610 Assim por cento de i vezes por cento i é por cento i, barra invertida n. 1006 00:48:16,610 --> 00:48:21,430 Vamos plug-in x e y, e x vezes y de. 1007 00:48:21,430 --> 00:48:24,530 Vamos usar o asterisco na o computador para vezes. 1008 00:48:24,530 --> 00:48:26,390 >> Você não usa x. X é um nome de variável aqui. 1009 00:48:26,390 --> 00:48:28,270 Você usar a estrela para a multiplicação. 1010 00:48:28,270 --> 00:48:29,020 Vamos fazer mais um. 1011 00:48:29,020 --> 00:48:34,580 Printf por cento eu, dividido por cento de i, é por cento de i, 1012 00:48:34,580 --> 00:48:40,460 n barra invertida. xy dividido por y-- para que você use a barra em C 1013 00:48:40,460 --> 00:48:41,502 para fazer a divisão. 1014 00:48:41,502 --> 00:48:42,460 E vamos fazer um outro. 1015 00:48:42,460 --> 00:48:47,920 1016 00:48:47,920 --> 00:48:55,240 Restante por cento i, divididos por cento de i, é por cento eu. 1017 00:48:55,240 --> 00:48:59,550 xy-- e agora restante é o que sobrou. 1018 00:48:59,550 --> 00:49:02,980 Quando você tentar dividir um denominador dentro de um numerador, 1019 00:49:02,980 --> 00:49:05,570 quanto é deixado ao longo desse você não poderia dividir fora? 1020 00:49:05,570 --> 00:49:07,910 >> Então não há realmente, necessariamente, um símbolo 1021 00:49:07,910 --> 00:49:09,470 nós usamos na escola por isso. 1022 00:49:09,470 --> 00:49:13,830 Mas lá em C. Você pode dizem x modulo y, onde 1023 00:49:13,830 --> 00:49:18,000 este sinal de por cento neste context-- confusa quando você está dentro 1024 00:49:18,000 --> 00:49:20,170 das aspas duplas, dentro de printf, cento 1025 00:49:20,170 --> 00:49:21,830 é utilizado como o especificador de formato. 1026 00:49:21,830 --> 00:49:25,420 >> Quando você usa por cento fora do em que uma expressão matemática, 1027 00:49:25,420 --> 00:49:29,910 é o operador módulo para modular arithmetic-- para os nossos propósitos 1028 00:49:29,910 --> 00:49:33,650 aqui, apenas significa, qual é a restante X dividido pelo y? 1029 00:49:33,650 --> 00:49:36,130 Assim, X dividido pelo y é X Y barra. 1030 00:49:36,130 --> 00:49:38,220 Qual é o resto de x dividido por y? 1031 00:49:38,220 --> 00:49:41,780 É x y mod, como um programador diria. 1032 00:49:41,780 --> 00:49:48,300 >> Então, se eu não cometeu erros aqui, deixe-me vá em frente e fazer ints, plural, agradável, 1033 00:49:48,300 --> 00:49:50,010 e ints do corte do ponto. 1034 00:49:50,010 --> 00:49:55,270 E vamos em frente e fazer, digamos, 1, 10. 1035 00:49:55,270 --> 00:49:58,390 Tudo bem, 1, acrescido de 10 é 11, cheque. 1036 00:49:58,390 --> 00:50:01,240 1 menos 10 é negativo 9, confira. 1037 00:50:01,240 --> 00:50:03,420 >> 1 vezes 10 é 10, cheque. 1038 00:50:03,420 --> 00:50:07,090 1 dividido por 10 é-- OK, vamos pular essa. 1039 00:50:07,090 --> 00:50:09,480 Resto de 1 dividido por 10 é 1. 1040 00:50:09,480 --> 00:50:10,680 Está correto. 1041 00:50:10,680 --> 00:50:12,630 Mas há um bug aqui. 1042 00:50:12,630 --> 00:50:15,390 >> Então, o que eu colocar o meu entregar, não é correto. 1043 00:50:15,390 --> 00:50:16,670 Quero dizer, é próximo de 0. 1044 00:50:16,670 --> 00:50:20,670 1 dividido por 10, você sabe, se estivermos cortar alguns cantos, com certeza, é zero. 1045 00:50:20,670 --> 00:50:28,050 Mas ele realmente deve ser 1/10, 0,1, ou 0,10, 0,1000, ou assim por diante. 1046 00:50:28,050 --> 00:50:30,600 >> Não deve ser realmente zero. 1047 00:50:30,600 --> 00:50:35,990 Bem, verifica-se que o computador está fazendo literalmente o que disse para fazer. 1048 00:50:35,990 --> 00:50:39,460 Estamos fazendo a matemática como x dividido por y. 1049 00:50:39,460 --> 00:50:44,680 E ambos x e y, por as linhas de código anterior, são números inteiros. 1050 00:50:44,680 --> 00:50:50,440 >> Além disso, na linha 15, que são dizendo printf, hey, printf plug-in 1051 00:50:50,440 --> 00:50:54,230 um inteiro, plug-in um número inteiro, ligar um integer-- especificamente 1052 00:50:54,230 --> 00:50:57,580 x, e, em seguida, y, e, em seguida, x dividido por y. x e y são inteiros. 1053 00:50:57,580 --> 00:50:59,060 Nós somos bons lá. 1054 00:50:59,060 --> 00:51:01,250 >> Mas o que é x dividido por x? 1055 00:51:01,250 --> 00:51:06,790 X dividido pelo y deve ser, Matematicamente, 10/01, ou 0,1, 1056 00:51:06,790 --> 00:51:11,600 que é um número real, um número real ter, potencialmente, um ponto decimal. 1057 00:51:11,600 --> 00:51:13,230 Não é um número inteiro. 1058 00:51:13,230 --> 00:51:18,290 >> Mas o que é o mais próximo número inteiro de 10/01, ou 0,1? 1059 00:51:18,290 --> 00:51:21,114 Sim, tipo de é zero. 1060 00:51:21,114 --> 00:51:22,030 0,1 é assim muito. 1061 00:51:22,030 --> 00:51:22,890 E 1 é muito presente. 1062 00:51:22,890 --> 00:51:25,870 Assim, 1/10 está mais perto 0 que é para um. 1063 00:51:25,870 --> 00:51:30,800 >> E então o que C está fazendo por US-- tipo de porque nós dito que a-- 1064 00:51:30,800 --> 00:51:32,600 é truncar esse inteiro. 1065 00:51:32,600 --> 00:51:40,540 É tomar o valor, que novamente é deveria ser algo como 0,1 mil, 1066 00:51:40,540 --> 00:51:41,800 0 e assim por diante. 1067 00:51:41,800 --> 00:51:45,320 E está truncando tudo depois do ponto decimal 1068 00:51:45,320 --> 00:51:47,510 de modo a que tudo isso material, porque não 1069 00:51:47,510 --> 00:51:51,910 cabem na noção de um inteiro, que é apenas um número como negativo 1, 0, 1, 1070 00:51:51,910 --> 00:51:55,830 cima e para baixo, ele joga fora tudo depois do ponto decimal, porque você 1071 00:51:55,830 --> 00:51:59,020 não pode caber um ponto decimal em um número inteiro, por definição. 1072 00:51:59,020 --> 00:52:01,290 >> Portanto, a resposta aqui é zero. 1073 00:52:01,290 --> 00:52:02,600 Então, como podemos corrigir isso? 1074 00:52:02,600 --> 00:52:04,400 Precisamos de uma outra solução em conjunto. 1075 00:52:04,400 --> 00:52:06,880 E nós podemos fazer isso, como se segue. 1076 00:52:06,880 --> 00:52:12,820 >> Deixe-me ir em frente e criar uma nova ficheiro, este chamado floats.c. 1077 00:52:12,820 --> 00:52:16,500 E guardá-lo aqui no mesmo diretório, float.c. 1078 00:52:16,500 --> 00:52:19,360 1079 00:52:19,360 --> 00:52:23,260 E deixe-me ir em frente e copiar alguns de que o código de mais cedo. 1080 00:52:23,260 --> 00:52:27,690 >> Mas em vez de ficar um int, vamos fazer isso. 1081 00:52:27,690 --> 00:52:31,037 Dê-me um valor de ponto flutuante chamado x. onde um ponto flutuante 1082 00:52:31,037 --> 00:52:33,370 valor é apenas literalmente algo com um ponto flutuante. 1083 00:52:33,370 --> 00:52:34,410 Ela pode mover-se para a esquerda, para a direita. 1084 00:52:34,410 --> 00:52:35,530 É um número real. 1085 00:52:35,530 --> 00:52:38,050 >> E deixe-me não chamar obter int, mas chegar float, 1086 00:52:38,050 --> 00:52:41,420 que também estava entre o menu de opções na biblioteca C250. 1087 00:52:41,420 --> 00:52:43,220 Vamos mudar y a uma bóia. 1088 00:52:43,220 --> 00:52:45,000 Portanto, este torna-se obter float. 1089 00:52:45,000 --> 00:52:47,620 >> E agora, nós não queremos para ligar ints. 1090 00:52:47,620 --> 00:52:53,130 Acontece que nós temos que usar cento f para float, por cento f para float, 1091 00:52:53,130 --> 00:52:54,560 e agora salvá-lo. 1092 00:52:54,560 --> 00:53:01,220 E agora, dedos cruzados, fazer flutuadores, agradável, flutuadores do corte de ponto. 1093 00:53:01,220 --> 00:53:04,280 x vai ser um 1. y Vai ser 10 novamente. 1094 00:53:04,280 --> 00:53:08,240 >> E, bom, OK minha disso está correto. 1095 00:53:08,240 --> 00:53:10,240 Eu estava esperando por mais, mas eu esqueci de escrever. 1096 00:53:10,240 --> 00:53:13,250 Então, vamos ir e corrigir este erro lógico. 1097 00:53:13,250 --> 00:53:16,280 >> Vamos em frente e agarrar o seguinte. 1098 00:53:16,280 --> 00:53:18,080 Nós vamos apenas fazer um pouco de copiar e colar. 1099 00:53:18,080 --> 00:53:20,080 E eu vou dizer de menos. 1100 00:53:20,080 --> 00:53:21,890 >> E eu vou dizer vezes. 1101 00:53:21,890 --> 00:53:24,060 E eu vou dizer dividida. 1102 00:53:24,060 --> 00:53:28,240 E eu não vou fazer modulo, que não é tão pertinentes aqui, 1103 00:53:28,240 --> 00:53:33,690 dividido por f, e vezes plus-- OK, vamos fazer isso novamente. 1104 00:53:33,690 --> 00:53:44,210 >> Fazem flutuadores, bóias de barra ponto, e 1, 10, e- agradável, não, OK. 1105 00:53:44,210 --> 00:53:45,250 Então, eu sou um idiota. 1106 00:53:45,250 --> 00:53:47,000 Então, isso é muito comum em ciência da computação 1107 00:53:47,000 --> 00:53:49,780 a cometer erros estúpidos como este. 1108 00:53:49,780 --> 00:53:53,100 >> Para fins pedagógicos, o que eu realmente queria fazer 1109 00:53:53,100 --> 00:53:57,410 foi mudar a ciência aqui para mais, para menos, à época, 1110 00:53:57,410 --> 00:54:01,140 e para dividir, como você espera notado durante este exercício. 1111 00:54:01,140 --> 00:54:04,700 Então agora vamos voltar a compilar este programa, faça flutuadores do corte de ponto. 1112 00:54:04,700 --> 00:54:07,950 >> E pela terceira vez, vamos ver se ele atende às minhas expectativas. 1113 00:54:07,950 --> 00:54:21,480 1, 10, entrar, sim, OK, 1.000, dividido por 10,000, é 0,100000. 1114 00:54:21,480 --> 00:54:24,952 E acontece que nós podemos controlar quantas números são depois desses pontos decimais. 1115 00:54:24,952 --> 00:54:25,660 Nós realmente vai. 1116 00:54:25,660 --> 00:54:26,790 Nós vamos voltar a isso. 1117 00:54:26,790 --> 00:54:28,440 >> Mas agora, de fato, a matemática está correta. 1118 00:54:28,440 --> 00:54:30,090 Então, mais uma vez, qual é o takeaway aqui? 1119 00:54:30,090 --> 00:54:33,050 Acontece que em C, existem não só apenas strings-- e, de fato, 1120 00:54:33,050 --> 00:54:36,120 não há realmente, porque nós adicionar aqueles com a biblioteca CS50. 1121 00:54:36,120 --> 00:54:37,710 Mas não são apenas inteiros. 1122 00:54:37,710 --> 00:54:38,990 >> Há também flutua. 1123 00:54:38,990 --> 00:54:42,810 E verifica-se um monte de outros dados tipos também, que usaremos em pouco tempo. 1124 00:54:42,810 --> 00:54:46,270 Acontece que se você quiser um único caráter, e não uma cadeia de caracteres, 1125 00:54:46,270 --> 00:54:47,610 você pode usar apenas um char. 1126 00:54:47,610 --> 00:54:52,350 >> Acontece que, se você quer um bool, um valor booleano, único verdadeiro ou falso, 1127 00:54:52,350 --> 00:54:56,840 graças à biblioteca CS50, nós temos adicionado a C, o tipo de dados boleano bem. 1128 00:54:56,840 --> 00:54:59,180 Mas também está presente em muitas outras línguas também. 1129 00:54:59,180 --> 00:55:04,130 E acontece que às vezes você precisam de números maiores, em seguida, vêm por padrão 1130 00:55:04,130 --> 00:55:05,210 com ints e carros alegóricos. 1131 00:55:05,210 --> 00:55:10,590 >> E, de fato, um duplo é um número que usa nem 32 bits, mas 64 bits. 1132 00:55:10,590 --> 00:55:14,990 E um longo tempo é um número que usa nem 32, bits, mas 64 bits, 1133 00:55:14,990 --> 00:55:19,190 respectivamente, para ponto flutuante valores e inteiros, respectivamente. 1134 00:55:19,190 --> 00:55:22,780 Então vamos realmente agora ver isso em ação. 1135 00:55:22,780 --> 00:55:26,150 >> Eu estou indo para ir em frente aqui e chicote de um outro programa. 1136 00:55:26,150 --> 00:55:32,020 Aqui, eu estou indo para ir em frente e não incluem CS50.h. 1137 00:55:32,020 --> 00:55:34,910 E deixe-me ir, incluem padrão IO.h. 1138 00:55:34,910 --> 00:55:37,320 >> E você vai notar algo funky está acontecendo aqui. 1139 00:55:37,320 --> 00:55:40,592 Não é codificação de cores as coisas em da mesma forma como fazia antes. 1140 00:55:40,592 --> 00:55:43,550 E ao que parece, isso é porque eu não deram a coisa um nome de arquivo. 1141 00:55:43,550 --> 00:55:47,270 >> Eu vou chamar este sizeof.c, e bateu em Salvar. 1142 00:55:47,270 --> 00:55:51,039 E observe o que acontece com o meu muito código de branco contra esse pano de fundo preto. 1143 00:55:51,039 --> 00:55:52,830 Agora, pelo menos há alguns roxos lá. 1144 00:55:52,830 --> 00:55:54,490 E é sintaxe destacada. 1145 00:55:54,490 --> 00:55:57,700 >> Isso é porque, muito simplesmente, não tenho disse ao IDE que tipo de arquivo 1146 00:55:57,700 --> 00:56:01,060 isso é dando-lhe um nome, e especificamente uma extensão de arquivo. 1147 00:56:01,060 --> 00:56:03,620 Agora, vamos ir em frente e fazer isso. 1148 00:56:03,620 --> 00:56:08,910 Eu estou indo para ir em frente e muito simplesmente imprimir o bool following-- 1149 00:56:08,910 --> 00:56:11,080 é por cento LU. 1150 00:56:11,080 --> 00:56:12,950 >> Nós vamos voltar a que em apenas um momento. 1151 00:56:12,950 --> 00:56:15,840 E então eu vou tamanho de impressão de bool. 1152 00:56:15,840 --> 00:56:18,170 E agora, apenas para economizar -me algum tempo, eu sou 1153 00:56:18,170 --> 00:56:20,280 vai fazer um todo bando deles ao mesmo tempo. 1154 00:56:20,280 --> 00:56:24,620 E, especificamente, eu vou alterar isso para um char e carvão. 1155 00:56:24,620 --> 00:56:27,760 Este, eu vou mudar para um casal e uma de casal. 1156 00:56:27,760 --> 00:56:31,440 >> Este, eu vou mudar a uma bóia e um flutuador. 1157 00:56:31,440 --> 00:56:35,670 Este, eu vou mudar para um int e um int. 1158 00:56:35,670 --> 00:56:38,660 E este, eu vou para mudar para um longo tempo. 1159 00:56:38,660 --> 00:56:40,840 E ainda está tomando um longo tempo, muito tempo. 1160 00:56:40,840 --> 00:56:44,572 >> E então, finalmente, dei me um demasiados, corda. 1161 00:56:44,572 --> 00:56:47,030 Acontece que em C, não há o operador especial chamado 1162 00:56:47,030 --> 00:56:50,260 tamanho do que é, literalmente, vai, quando executado, 1163 00:56:50,260 --> 00:56:52,099 diga-nos o tamanho do cada uma destas variáveis. 1164 00:56:52,099 --> 00:56:53,890 E este é um caminho, agora, podemos ligar de volta 1165 00:56:53,890 --> 00:56:57,140 a discussão da semana passada de dados e de representação. 1166 00:56:57,140 --> 00:57:00,330 >> Deixe-me ir em frente e compilar tamanho de tamanho de ponto de corte. 1167 00:57:00,330 --> 00:57:01,210 E vamos ver. 1168 00:57:01,210 --> 00:57:05,210 Acontece que em C, especificamente em CS50 IDE, 1169 00:57:05,210 --> 00:57:08,170 especificamente na sistema operacional Ubuntu, 1170 00:57:08,170 --> 00:57:11,100 que é um operacional de 64 bits sistema, neste caso, 1171 00:57:11,100 --> 00:57:14,189 um booleano vai usar um byte de espaço. 1172 00:57:14,189 --> 00:57:16,480 É assim que o tamanho é medido, não em bits, mas em bytes. 1173 00:57:16,480 --> 00:57:18,690 E lembrar que um byte é oito bits. 1174 00:57:18,690 --> 00:57:22,030 Assim, um bool, mesmo que você tecnicamente só precisa de um 0 ou 1, 1175 00:57:22,030 --> 00:57:24,092 é um pouco desperdício como temos implementado. 1176 00:57:24,092 --> 00:57:26,800 É realmente vai usar um todo byte-- para que todos os zeros, são talvez 1177 00:57:26,800 --> 00:57:31,050 todos aqueles, ou algo parecido, ou apenas um 1 entre os oito bits. 1178 00:57:31,050 --> 00:57:34,962 >> Um char, por sua vez, usado para um personagem como um caractere ASCII por semana passada, 1179 00:57:34,962 --> 00:57:36,170 vai ser um personagem. 1180 00:57:36,170 --> 00:57:42,340 E que sincroniza-se com a nossa noção de sendo não mais do que 256 bits-- vez, 1181 00:57:42,340 --> 00:57:45,360 sincroniza-se com ele havendo mais de 8 bits, que 1182 00:57:45,360 --> 00:57:47,450 nos dá até 256 valores. 1183 00:57:47,450 --> 00:57:49,680 A dupla vai ser de 8 bytes ou 64 bits. 1184 00:57:49,680 --> 00:57:50,510 >> Um flutuador é 4. 1185 00:57:50,510 --> 00:57:51,690 Um int é de 4. 1186 00:57:51,690 --> 00:57:52,980 Um longo, longo é 8. 1187 00:57:52,980 --> 00:57:54,716 E uma corda é 8. 1188 00:57:54,716 --> 00:57:55,840 Mas não se preocupar com isso. 1189 00:57:55,840 --> 00:57:57,340 Nós vamos descascar essa camada. 1190 00:57:57,340 --> 00:57:59,940 Acontece que, cordas podem ter mais de 8 bytes. 1191 00:57:59,940 --> 00:58:02,310 >> E, de fato, nós escrevemos cordas já, Olá mundo, 1192 00:58:02,310 --> 00:58:03,700 mais de 8 bytes. 1193 00:58:03,700 --> 00:58:06,270 Mas vamos voltar a que em apenas um momento. 1194 00:58:06,270 --> 00:58:09,690 Mas a tomada de distância aqui é o seguinte. 1195 00:58:09,690 --> 00:58:15,320 >> Qualquer computador só tem uma finita quantidade de memória e espaço. 1196 00:58:15,320 --> 00:58:17,860 Você só pode armazenar tantos arquivos no seu Mac ou PC. 1197 00:58:17,860 --> 00:58:23,030 Você só pode armazenar tantos programas em RAM rodando ao mesmo tempo, necessariamente, mesmo 1198 00:58:23,030 --> 00:58:26,360 com a memória virtual, porque você tem uma quantidade finita de RAM. 1199 00:58:26,360 --> 00:58:28,990 >> E só para picture-- se você nunca abriu um laptop 1200 00:58:28,990 --> 00:58:31,300 ou encomendados memória extra para um computador, você 1201 00:58:31,300 --> 00:58:33,670 pode não saber que interior do seu computador 1202 00:58:33,670 --> 00:58:36,590 é algo que se parece um pouco como isso. 1203 00:58:36,590 --> 00:58:40,540 Portanto, esta é apenas uma empresa comum denominado Crucial que faz RAM para computadores. 1204 00:58:40,540 --> 00:58:43,620 E RAM é onde os programas viver enquanto eles estão correndo. 1205 00:58:43,620 --> 00:58:46,630 >> Assim, em todos os Mac ou PC, quando você dobrar clique um programa, e abre, 1206 00:58:46,630 --> 00:58:48,921 e abre algum documento do Word ou algo assim, 1207 00:58:48,921 --> 00:58:51,764 ele armazena-o temporariamente na RAM, memória RAM porque é mais rápido 1208 00:58:51,764 --> 00:58:53,680 do que o seu disco rígido, ou o seu disco de estado sólido. 1209 00:58:53,680 --> 00:58:56,600 Então é só onde os programas ir para viver quando eles estão em execução, 1210 00:58:56,600 --> 00:58:58,060 ou quando os arquivos estão sendo usados. 1211 00:58:58,060 --> 00:59:00,890 >> Então você tem coisas que parecem como este dentro do seu laptop, 1212 00:59:00,890 --> 00:59:03,320 ou coisas um pouco maior dentro da sua área de trabalho. 1213 00:59:03,320 --> 00:59:07,440 Mas a chave é que você só tem um número finito dessas coisas. 1214 00:59:07,440 --> 00:59:11,230 E só há uma quantidade finita de hardware sentado nessa mesa direita 1215 00:59:11,230 --> 00:59:11,730 Aqui. 1216 00:59:11,730 --> 00:59:15,920 >> Então, com certeza, não podemos armazenar números infinitamente longos. 1217 00:59:15,920 --> 00:59:19,030 E, ainda, se você acha que volta para escola, quantos dígitos pode 1218 00:59:19,030 --> 00:59:21,400 você tem à direita de um ponto decimal? 1219 00:59:21,400 --> 00:59:24,680 Para essa matéria, quantos dígitos podem você tem à esquerda do ponto decimal? 1220 00:59:24,680 --> 00:59:26,300 Realmente, infinitamente muitos. 1221 00:59:26,300 --> 00:59:30,840 >> Agora, nós, seres humanos só poderia sabe como se pronuncia milhões, 1222 00:59:30,840 --> 00:59:34,990 e bilhões, trilhões, e quatrilhões, e quintilhões. 1223 00:59:34,990 --> 00:59:39,370 E eu estou empurrando os limites do meu understanding-- ou meu-- eu entendo 1224 00:59:39,370 --> 00:59:41,110 números, mas meu pronúncia dos números. 1225 00:59:41,110 --> 00:59:44,720 Mas eles podem obter infinitamente grande, com infinitos dígitos à esquerda 1226 00:59:44,720 --> 00:59:47,050 ou à direita de um ponto decimal. 1227 00:59:47,050 --> 00:59:50,040 >> Mas os computadores têm apenas um quantidade finita de memória, 1228 00:59:50,040 --> 00:59:53,510 um número finito de transistores, um número finito de lâmpadas no interior. 1229 00:59:53,510 --> 00:59:57,350 Então, o que acontece quando você correr para fora do espaço? 1230 00:59:57,350 --> 00:59:59,620 Em outras palavras, se pensar para trás a semana passada 1231 00:59:59,620 --> 01:00:03,160 quando falamos sobre números -se a ser representado em binário, 1232 01:00:03,160 --> 01:00:05,480 suponha que nós temos este valor de 8 bits aqui. 1233 01:00:05,480 --> 01:00:08,290 >> E nós temos sete 1 e um 0. 1234 01:00:08,290 --> 01:00:10,827 E suponha que queremos para adicionar 1 a este valor. 1235 01:00:10,827 --> 01:00:12,410 Este é um número muito grande agora. 1236 01:00:12,410 --> 01:00:16,610 >> Este é 254, se bem me lembro a matemática da semana passada direita. 1237 01:00:16,610 --> 01:00:19,480 Mas o que se eu mudar 0 que mais à direita de um 1? 1238 01:00:19,480 --> 01:00:22,800 O número inteiro, de Naturalmente, torna-se oito 1s. 1239 01:00:22,800 --> 01:00:24,050 Portanto, ainda é bom. 1240 01:00:24,050 --> 01:00:27,204 >> E que provavelmente representa 255, embora dependendo do contexto 1241 01:00:27,204 --> 01:00:29,120 ele poderia realmente representar um número negativo. 1242 01:00:29,120 --> 01:00:31,240 Mas mais sobre isso outra vez. 1243 01:00:31,240 --> 01:00:34,220 Este parece que é sobre tão alto quanto eu posso contar. 1244 01:00:34,220 --> 01:00:35,290 >> Agora, é apenas 8 bits. 1245 01:00:35,290 --> 01:00:38,170 E o meu Mac, com certeza, tem forma mais de 8 bits de memória. 1246 01:00:38,170 --> 01:00:39,170 Mas ele tem finito. 1247 01:00:39,170 --> 01:00:43,230 Assim, o mesmo argumento se aplica, mesmo que temos mais destes queridos na tela. 1248 01:00:43,230 --> 01:00:47,020 >> Mas o que acontece se você estiver armazenar esse número, 255, 1249 01:00:47,020 --> 01:00:49,290 e você quer contar um pouco mais alto? 1250 01:00:49,290 --> 01:00:51,600 Você quer ir de 255 a 256. 1251 01:00:51,600 --> 01:00:55,800 O problema, é claro, é que se começar a contar do zero como na semana passada, 1252 01:00:55,800 --> 01:00:59,670 você não pode contar como alta como 256, muito menos 257, 1253 01:00:59,670 --> 01:01:02,584 muito menos 258, m porque o que acontece quando você adiciona um 1? 1254 01:01:02,584 --> 01:01:05,000 Se você fizer a escola primária antiga abordagem, você colocar um 1 aqui, 1255 01:01:05,000 --> 01:01:08,150 e, em seguida, 1 mais 1 é 2, mas isso é realmente um zero, você carrega a 1, 1256 01:01:08,150 --> 01:01:09,695 transportar a 1, levar a 1. 1257 01:01:09,695 --> 01:01:12,620 Todas estas coisas, Essas 1, ir para zero. 1258 01:01:12,620 --> 01:01:17,820 E você acabar, sim, como alguém apontou, a 1 sobre o lado esquerdo. 1259 01:01:17,820 --> 01:01:22,540 Mas tudo o que puder realmente ver e caber na memória 1260 01:01:22,540 --> 01:01:27,960 é apenas oito 0 do, o que quer dizer em algum momento, se você, um computador, 1261 01:01:27,960 --> 01:01:32,490 tentou contagem alta o suficiente, você está vai envolver em torno de, ao que parece, 1262 01:01:32,490 --> 01:01:35,850 a zero, ou talvez mesmo negativo números, que são ainda mais baixos do que zero. 1263 01:01:35,850 --> 01:01:37,260 >> E nós pode tipo de ver isso. 1264 01:01:37,260 --> 01:01:39,900 Deixe-me ir em frente e escrever um verdadeiro programa rápido aqui. 1265 01:01:39,900 --> 01:01:43,690 Deixe-me ir em frente e escrever um programa chamado estouro. 1266 01:01:43,690 --> 01:01:49,980 Incluir CS50.h, incluem padrão IO.h-- oh, 1267 01:01:49,980 --> 01:01:51,730 Eu realmente perdi o meu destaque de sintaxe. 1268 01:01:51,730 --> 01:01:54,440 Então, vamos guardá-lo como overflow.c. 1269 01:01:54,440 --> 01:01:57,084 >> E void-- principal agora int e em pouco tempo, vamos 1270 01:01:57,084 --> 01:01:59,500 voltar a explicar por que nós continuar a escrever void main int. 1271 01:01:59,500 --> 01:02:02,080 Mas, por enquanto, vamos apenas fazer -lo, levá-lo para concedido. 1272 01:02:02,080 --> 01:02:06,200 Vamos dar-me um int, e inicialize-o a 0. 1273 01:02:06,200 --> 01:02:11,716 >> Vamos então fazer por int i obter zero-- na verdade, vamos fazer um loop infinito 1274 01:02:11,716 --> 01:02:12,590 e ver o que acontece. 1275 01:02:12,590 --> 01:02:22,440 Enquanto verdade, então vamos imprimir n é por cento i, barra invertida n, plug-in n. 1276 01:02:22,440 --> 01:02:27,200 Mas, agora, vamos fazer n recebe n + 1. 1277 01:02:27,200 --> 01:02:29,660 >> Portanto, em outras palavras, em cada iteração deste ciclo infinito, 1278 01:02:29,660 --> 01:02:32,550 vamos dar o valor de n, e adicionar 1 a ele, e, em seguida, 1279 01:02:32,550 --> 01:02:34,350 armazenar o resultado em N na esquerda. 1280 01:02:34,350 --> 01:02:37,150 E, de fato, vimos a sintaxe um pouco como este, brevemente. 1281 01:02:37,150 --> 01:02:39,730 Um truque legal é, em vez de escrever tudo isso, 1282 01:02:39,730 --> 01:02:42,770 você pode realmente dizer um n mais é igual a 1. 1283 01:02:42,770 --> 01:02:47,480 >> Ou se você realmente quer ser extravagante, você pode dizer n plus plus-e-vírgula. 1284 01:02:47,480 --> 01:02:50,130 Mas estes dois últimos são apenas o que chamaria de açúcar sintático 1285 01:02:50,130 --> 01:02:50,790 para a primeira coisa. 1286 01:02:50,790 --> 01:02:53,456 >> A primeira coisa é mais explícito, totalmente bem, totalmente correta. 1287 01:02:53,456 --> 01:02:55,470 Mas isso é mais comum, eu vou dizer. 1288 01:02:55,470 --> 01:02:57,210 Então, vamos fazer isso por apenas um momento. 1289 01:02:57,210 --> 01:03:01,685 >> Vamos agora fazer estouro, o que soa bastante sinistro, estouro de corte de ponto. 1290 01:03:01,685 --> 01:03:04,380 1291 01:03:04,380 --> 01:03:09,852 Vamos ver, n está ficando muito grande. 1292 01:03:09,852 --> 01:03:11,310 Mas vamos pensar, o quão grande pode n receber? 1293 01:03:11,310 --> 01:03:12,870 >> n é um inteiro. 1294 01:03:12,870 --> 01:03:16,400 Vimos há pouco com o tamanho do exemplo, que é um int quatro bytes. 1295 01:03:16,400 --> 01:03:22,070 Sabemos da semana passada, quatro bytes é 32 bits, pois 8 vezes 4, que tem 32 anos. 1296 01:03:22,070 --> 01:03:23,460 Isso vai ser de 4 bilhões. 1297 01:03:23,460 --> 01:03:25,802 >> E somos até 800.000. 1298 01:03:25,802 --> 01:03:28,510 Isso vai demorar uma eternidade para contar tão alto quanto eu puder. 1299 01:03:28,510 --> 01:03:30,635 Então, eu estou indo para a frente, como você pode em pouco tempo, 1300 01:03:30,635 --> 01:03:34,910 e bateu C-- Controle francamente, Controle C, um monte, onde Controle C geral 1301 01:03:34,910 --> 01:03:36,034 meios cancelar. 1302 01:03:36,034 --> 01:03:38,200 Infelizmente, porque este está sendo executado na nuvem, 1303 01:03:38,200 --> 01:03:41,190 por vezes, a nuvem é cuspindo tanta coisa, 1304 01:03:41,190 --> 01:03:44,180 tanta saída, ele vai demorar um pouco para a minha entrada 1305 01:03:44,180 --> 01:03:45,630 para chegar à nuvem. 1306 01:03:45,630 --> 01:03:49,240 Assim, mesmo que eu bati Controle C alguns segundos atrás, 1307 01:03:49,240 --> 01:03:53,110 este é definitivamente o lado efeito de um loop infinito. 1308 01:03:53,110 --> 01:03:56,070 >> E assim, em tais casos, estamos vai deixar que seja. 1309 01:03:56,070 --> 01:03:59,050 E nós estamos indo para adicionar outro janela de terminal aqui 1310 01:03:59,050 --> 01:04:03,186 com o plus, que naturalmente não faz assim, uma vez que ainda está pensando. 1311 01:04:03,186 --> 01:04:05,310 E vamos em frente e ser um pouco mais razoável. 1312 01:04:05,310 --> 01:04:07,768 >> Eu estou indo para ir em frente e fazer esta única um número finito de vezes. 1313 01:04:07,768 --> 01:04:10,047 Vamos usar um loop for, que aludi anteriormente. 1314 01:04:10,047 --> 01:04:10,630 Vamos fazer isso. 1315 01:04:10,630 --> 01:04:13,430 Dê-me outra variável int i recebe 0. 1316 01:04:13,430 --> 01:04:17,430 i é menor do que, digamos, 64 i ++. 1317 01:04:17,430 --> 01:04:24,010 E agora deixe-me ir em frente e de impressão a n é por cento i, vírgula n. 1318 01:04:24,010 --> 01:04:27,547 E então n-- este ainda é vai levar para sempre. 1319 01:04:27,547 --> 01:04:28,130 Vamos fazer isso. 1320 01:04:28,130 --> 01:04:30,620 >> n recebe n vezes 2. 1321 01:04:30,620 --> 01:04:34,140 Ou poderíamos ser extravagante e fazer vezes é igual a 2. 1322 01:04:34,140 --> 01:04:37,120 Mas vamos apenas dizer que n iguala-se, 2 vezes. 1323 01:04:37,120 --> 01:04:39,321 Em outras palavras, no presente nova versão do programa, 1324 01:04:39,321 --> 01:04:41,820 Eu não quero esperar para sempre de como 800.000 para 4 bilhões. 1325 01:04:41,820 --> 01:04:43,070 Vamos apenas acabar com isso. 1326 01:04:43,070 --> 01:04:44,920 >> Vamos realmente dobrar n cada vez. 1327 01:04:44,920 --> 01:04:47,660 Que, recall, duplicação é a oposto de ter, claro. 1328 01:04:47,660 --> 01:04:50,035 E que na semana passada nós temos algo mais uma vez, e novamente, 1329 01:04:50,035 --> 01:04:52,200 e, novamente, super rápido, duplicação irá certamente 1330 01:04:52,200 --> 01:04:58,080 nos levar de 1 a a maior possível valor que podemos contar até com um int. 1331 01:04:58,080 --> 01:04:59,750 >> Então, vamos fazer exatamente isso. 1332 01:04:59,750 --> 01:05:01,720 E nós vamos voltar a este antes do tempo. 1333 01:05:01,720 --> 01:05:04,180 Mas isso, novamente, é como o bloco de repetição em risco. 1334 01:05:04,180 --> 01:05:05,600 E você vai usar este antes do tempo. 1335 01:05:05,600 --> 01:05:10,170 >> Isto apenas significa contagem de zero até, mas não igual, a 64. 1336 01:05:10,170 --> 01:05:14,285 E em cada iteração deste loop, basta manter incrementando i. 1337 01:05:14,285 --> 01:05:18,990 Então i ++ - e esta construção geral na linha 7 é apenas uma maneira super comum 1338 01:05:18,990 --> 01:05:22,290 de repetir algumas linhas de código, um certo número de vezes. 1339 01:05:22,290 --> 01:05:23,362 Quais linhas de código? 1340 01:05:23,362 --> 01:05:25,570 Estas chaves, como você pode ter adquirida a partir de agora, 1341 01:05:25,570 --> 01:05:26,780 significa, faça o seguinte. 1342 01:05:26,780 --> 01:05:29,510 >> É dentro como zero, quando tem os blocos amarelos 1343 01:05:29,510 --> 01:05:32,680 e outras cores que tipo de abraçar ou abraçar outros blocos. 1344 01:05:32,680 --> 01:05:34,750 Isso é o que esses encaracolado cintas estão fazendo aqui. 1345 01:05:34,750 --> 01:05:40,200 Então, se eu tenho o meu sintaxe direita-- você pode ver o símbolo de cenoura no meio C 1346 01:05:40,200 --> 01:05:42,706 isso é quantas vezes eu estava a tentar resolver este problema. 1347 01:05:42,706 --> 01:05:45,330 Então, vamos livrar-se de que um completamente, e feche a janela. 1348 01:05:45,330 --> 01:05:46,520 E nós vamos usar o novo. 1349 01:05:46,520 --> 01:05:51,980 Faça estouro, Slash dot estouro, Enter, tudo bem, 1350 01:05:51,980 --> 01:05:53,090 parece ruim no começo. 1351 01:05:53,090 --> 01:05:56,200 Mas vamos rolar para trás no tempo, porque eu fiz isso 64 vezes. 1352 01:05:56,200 --> 01:05:58,700 >> E observar pela primeira vez, n é 1. 1353 01:05:58,700 --> 01:06:03,110 Segundo tempo, o símbolo n representa 2, em seguida, 4, depois 8, então com 16 anos. 1354 01:06:03,110 --> 01:06:09,450 E parece que assim Eu chegar a cerca de 1 bilhão, 1355 01:06:09,450 --> 01:06:12,800 se eu dobrá-la novamente, que deveria me dar 2 bilhões. 1356 01:06:12,800 --> 01:06:14,980 Mas acontece, é direito na cúspide. 1357 01:06:14,980 --> 01:06:18,930 >> E assim ele realmente transborda um inteiro de 1 bilhão 1358 01:06:18,930 --> 01:06:23,514 a cerca de 2 negativo bilhões, porque um número inteiro, 1359 01:06:23,514 --> 01:06:25,430 ao contrário do que números foram assumindo na semana passada, 1360 01:06:25,430 --> 01:06:28,397 pode ser tanto positiva como negativa na realidade, e em um computador. 1361 01:06:28,397 --> 01:06:30,730 E assim, pelo menos, um desses bits é eficazmente roubado. 1362 01:06:30,730 --> 01:06:34,190 Então, nós realmente só tem 31 bits, ou 2 mil milhões de valores possíveis. 1363 01:06:34,190 --> 01:06:38,220 >> Mas, por agora, o takeaway é bastante simplesmente, quaisquer que sejam esses números são 1364 01:06:38,220 --> 01:06:42,280 e tudo o que a matemática é, algo ruim acontece, eventualmente, 1365 01:06:42,280 --> 01:06:46,980 porque eventualmente você está tentando permutar os bits de um muitas vezes. 1366 01:06:46,980 --> 01:06:51,060 E você efetivamente ir de tudo 1 de talvez para todos os 0 do, ou talvez 1367 01:06:51,060 --> 01:06:54,260 apenas algum outro padrão que ele Claramente, dependendo do contexto, 1368 01:06:54,260 --> 01:06:56,342 pode ser interpretada como um número negativo. 1369 01:06:56,342 --> 01:06:59,300 E assim parece o mais alto I pode contar neste programa específico 1370 01:06:59,300 --> 01:07:01,210 é apenas a cerca de 1 bilhão. 1371 01:07:01,210 --> 01:07:02,760 Mas há uma solução parcial aqui. 1372 01:07:02,760 --> 01:07:03,480 Você sabe o que? 1373 01:07:03,480 --> 01:07:07,600 >> Deixe-me mudar a partir de um int para um longo tempo. 1374 01:07:07,600 --> 01:07:10,633 E deixe-me ir em frente aqui e dizer-- eu vou ter 1375 01:07:10,633 --> 01:07:12,290 para mudar isso para um sem assinatura longo. 1376 01:07:12,290 --> 01:07:16,860 Ou, vamos ver, eu nunca me lembrar. 1377 01:07:16,860 --> 01:07:19,920 >> Vamos em frente e fazer transbordar. 1378 01:07:19,920 --> 01:07:21,860 Não, não é isso, LLD, obrigado. 1379 01:07:21,860 --> 01:07:23,430 Então, às vezes Clang pode ser útil. 1380 01:07:23,430 --> 01:07:27,550 Eu não me lembro o que o formato especificador foi por um longo tempo. 1381 01:07:27,550 --> 01:07:28,950 >> Mas, na verdade, Clang me disse. 1382 01:07:28,950 --> 01:07:31,570 O verde é uma espécie de bom, ainda significa que você cometeu um erro. 1383 01:07:31,570 --> 01:07:33,190 É supondo que eu quis dizer LLD. 1384 01:07:33,190 --> 01:07:38,750 >> Então deixe-me levá-la é um conselho, um longo longa número decimal, salvar isso. 1385 01:07:38,750 --> 01:07:43,190 E deixe-me executá-lo novamente, dot cortar excesso, Enter. 1386 01:07:43,190 --> 01:07:45,020 E agora o que é legal é isso. 1387 01:07:45,020 --> 01:07:49,140 >> Se eu rolar para trás no tempo, nós ainda começar contando ao mesmo Place-- 1, 2, 4, 1388 01:07:49,140 --> 01:07:50,220 8, 16. 1389 01:07:50,220 --> 01:07:54,860 Aviso, temos todo o caminho até 1 bilhão. 1390 01:07:54,860 --> 01:07:57,070 Mas, então, chegar com segurança ao 2 bilhões. 1391 01:07:57,070 --> 01:08:01,300 >> Então nós começamos a 4 bilhões, em seguida, 8 bilhões, 17 bilhões. 1392 01:08:01,300 --> 01:08:03,340 E nós ir mais alto, e mais alto e mais alto. 1393 01:08:03,340 --> 01:08:05,740 Eventualmente, isso, também, quebras. 1394 01:08:05,740 --> 01:08:09,350 >> Eventualmente, com um longo tempo, que é o valor de 64 bits, não 1395 01:08:09,350 --> 01:08:13,660 um valor de 32 bits, se você contar muito alto, você envolver em torno de 0. 1396 01:08:13,660 --> 01:08:16,410 E, neste caso, nós acontecer acabar com um número negativo. 1397 01:08:16,410 --> 01:08:17,550 >> Portanto, este é um problema. 1398 01:08:17,550 --> 01:08:20,439 E verifica-se que este problema não é tudo o que arcano. 1399 01:08:20,439 --> 01:08:23,060 Mesmo que eu tenha deliberadamente induzida com esses erros, 1400 01:08:23,060 --> 01:08:26,149 verifica-se vemos que tipo de tudo nós, ou pelo menos alguns de nós em torno de fazer. 1401 01:08:26,149 --> 01:08:28,939 >> Assim, em Lego Star Wars, se você já jogou o jogo, 1402 01:08:28,939 --> 01:08:33,830 verifica-se que você pode ir ao redor quebrando as coisas no mundo LEGO, 1403 01:08:33,830 --> 01:08:36,640 e recolha de moedas, essencialmente. 1404 01:08:36,640 --> 01:08:39,200 E se você nunca jogou este jogo maneira muito tempo, 1405 01:08:39,200 --> 01:08:42,630 como este indivíduo não identificado aqui fizeram, o número total 1406 01:08:42,630 --> 01:08:46,700 de moedas que você pode coletar é, ao que parece, 4 bilhões. 1407 01:08:46,700 --> 01:08:48,240 >> Agora, com ele é realmente arredondados. 1408 01:08:48,240 --> 01:08:50,239 Então LEGO estava tentando manter as coisas amigável. 1409 01:08:50,239 --> 01:08:53,779 Eles não fazê-lo exatamente 2 a a 32 de alimentação, por semana passada. 1410 01:08:53,779 --> 01:08:55,310 Mas 4 bilhões é uma razão. 1411 01:08:55,310 --> 01:08:58,979 Parece, com base nessas informações, que LEGO, ea empresa que 1412 01:08:58,979 --> 01:09:02,624 fez este software real, decidiu que o número máximo de moedas 1413 01:09:02,624 --> 01:09:04,540 o utilizador pode acumular é, na verdade, 4 bilhões, 1414 01:09:04,540 --> 01:09:12,069 porque eles escolheram no seu código usar não um longo tempo, aparentemente, 1415 01:09:12,069 --> 01:09:16,140 mas apenas um inteiro, um sem assinatura número inteiro, apenas a um número inteiro positivo, cuja 1416 01:09:16,140 --> 01:09:18,089 valor máximo aproximadamente é isso. 1417 01:09:18,089 --> 01:09:19,380 Bem, aqui está mais um engraçado. 1418 01:09:19,380 --> 01:09:23,500 Assim, no jogo Civilization, que alguns de vocês podem estar familiarizados com 1419 01:09:23,500 --> 01:09:26,660 verifica-se que anos atrás não era um bug neste jogo em que 1420 01:09:26,660 --> 01:09:28,750 se você desempenhou o papel de Gandhi no jogo, 1421 01:09:28,750 --> 01:09:34,020 em vez de ele ser muito pacifista, em vez disso foi incrivelmente, incrivelmente 1422 01:09:34,020 --> 01:09:36,399 agressivo, em algumas circunstâncias. 1423 01:09:36,399 --> 01:09:40,529 Em particular, a forma que a civilização obras é que se você, o jogador, 1424 01:09:40,529 --> 01:09:44,680 adotar a democracia, o seu escore de agressividade fica 1425 01:09:44,680 --> 01:09:48,130 diminuído em dois, de modo menos menos, e depois de menos de menos. 1426 01:09:48,130 --> 01:09:50,569 >> Então você subtrair 2 sua iteração atual. 1427 01:09:50,569 --> 01:09:56,650 Infelizmente, se a sua iteração é inicialmente 1, e você subtrair 2 a partir dele 1428 01:09:56,650 --> 01:09:59,050 depois de adotar a democracia como Gandhi aqui pode 1429 01:09:59,050 --> 01:10:02,200 ter feito, porque ele era muito passive-- 1 na escala de agressividade. 1430 01:10:02,200 --> 01:10:04,830 Mas se ele adota a democracia, em seguida, ele vai de 1 a 1 negativo. 1431 01:10:04,830 --> 01:10:11,470 >> Infelizmente, eles eram usando números não assinados, 1432 01:10:11,470 --> 01:10:15,400 o que significa que eles trataram mesmo negativo números como se fossem positivos. 1433 01:10:15,400 --> 01:10:19,780 E verifica-se que o equivalente positivo do negativo 1, 1434 01:10:19,780 --> 01:10:23,480 em programas de computador típicos, é de 255. 1435 01:10:23,480 --> 01:10:27,250 Então, se Gandhi adota democracia e, portanto, tem 1436 01:10:27,250 --> 01:10:32,470 sua pontuação agressividade diminuiu, ele realmente rola em torno de 255 1437 01:10:32,470 --> 01:10:35,470 e fá-lo o mais caráter agressivo no jogo. 1438 01:10:35,470 --> 01:10:36,930 Então você pode Google-se sobre este assunto. 1439 01:10:36,930 --> 01:10:39,380 E foi, de fato, uma bug de programação acidental, 1440 01:10:39,380 --> 01:10:43,010 mas isso entrou bastante a tradição desde então. 1441 01:10:43,010 --> 01:10:44,360 >> Isso é todo o divertimento e bonito. 1442 01:10:44,360 --> 01:10:47,760 Mais assustador é quando real dispositivos do mundo real, e não jogos, 1443 01:10:47,760 --> 01:10:48,820 ter esses mesmos erros. 1444 01:10:48,820 --> 01:10:54,500 Na verdade, apenas um ano atrás, um artigo veio -se sobre o Boeing 787 Dreamliner. 1445 01:10:54,500 --> 01:10:56,850 >> E o artigo em primeiro olhar lê um pouco misterioso. 1446 01:10:56,850 --> 01:11:01,480 Mas dito isso, um software vulnerabilidade no Boeing 1447 01:11:01,480 --> 01:11:04,790 novo 787 Dreamliner jato tem o potencial para causar pilotos 1448 01:11:04,790 --> 01:11:07,220 perder o controle de da aeronave, eventualmente 1449 01:11:07,220 --> 01:11:11,750 em meados de voo, os funcionários da FAA companhias aéreas advertiu recentemente. 1450 01:11:11,750 --> 01:11:14,520 Foi a determinação que um modelo 787 1451 01:11:14,520 --> 01:11:19,770 avião que tem sido alimentado continuamente durante 248 dias 1452 01:11:19,770 --> 01:11:24,880 pode perder toda a corrente alternada, AC, energia eléctrica devido ao gerador 1453 01:11:24,880 --> 01:11:28,892 unidades de controlo, GCUs, simultaneamente indo para deixar modo de segurança. 1454 01:11:28,892 --> 01:11:29,850 É uma espécie de me perder. 1455 01:11:29,850 --> 01:11:35,390 Mas o memorando afirmou, OK, agora eu tenho que, a condição foi causado por um software 1456 01:11:35,390 --> 01:11:38,590 contador interno para o controle do gerador 1457 01:11:38,590 --> 01:11:44,860 unidades que vai transbordar depois 248 dias de potência contínua. 1458 01:11:44,860 --> 01:11:47,070 Estamos a emissão do presente aviso para evitar a perda 1459 01:11:47,070 --> 01:11:49,300 de todos AC eléctricos poder, o que poderia resultar 1460 01:11:49,300 --> 01:11:50,980 em perda de controle do avião. 1461 01:11:50,980 --> 01:11:55,380 >> Assim, literalmente, existe algum inteiro, ou algum tipo de dados equivalente, 1462 01:11:55,380 --> 01:11:57,960 sendo utilizado em software em um avião real 1463 01:11:57,960 --> 01:12:00,756 que se você manter o seu avião em tempo suficiente, o que, aparentemente, 1464 01:12:00,756 --> 01:12:03,880 pode ser o caso se você está apenas executando -los constantemente e nunca desligar 1465 01:12:03,880 --> 01:12:06,810 o seu avião, ao que parece, ou deixando suas baterias morrer, 1466 01:12:06,810 --> 01:12:09,840 acabará por contar-se, e para cima, e para cima, e para cima, e para cima, e para cima. 1467 01:12:09,840 --> 01:12:12,150 >> E, por natureza, uma quantidade finita de memória 1468 01:12:12,150 --> 01:12:15,880 transbordará, rolando de volta para zero ou algum valor negativo, 1469 01:12:15,880 --> 01:12:19,920 um efeito colateral das quais é a realidade assustadoramente reais 1470 01:12:19,920 --> 01:12:23,970 que o avião pode precisar de ser reiniciado, efetivamente, 1471 01:12:23,970 --> 01:12:27,290 ou pode cair, pior, como ele voa. 1472 01:12:27,290 --> 01:12:29,230 Então, esses tipos de problemas ainda estão entre nós, 1473 01:12:29,230 --> 01:12:33,130 even-- este foi um artigo de 2015, tudo o mais assustador 1474 01:12:33,130 --> 01:12:36,100 quando você não faz, necessariamente, entender, apreciar, ou antecipar 1475 01:12:36,100 --> 01:12:38,640 esses tipos de erros. 1476 01:12:38,640 --> 01:12:42,030 >> Então não é que há uma outra coisa ruim sobre representação de dados. 1477 01:12:42,030 --> 01:12:47,080 Acontece que mesmo os carros alegóricos são tipo de falha, porque flutuadores, também, 1478 01:12:47,080 --> 01:12:51,440 Propus são 32 bits, ou talvez 64 se você usar um casal. 1479 01:12:51,440 --> 01:12:53,070 Mas isso ainda é finito. 1480 01:12:53,070 --> 01:12:57,070 >> E o problema é que se você puder colocar um número infinito de números 1481 01:12:57,070 --> 01:12:59,460 depois do ponto decimal, não há nenhuma maneira que você 1482 01:12:59,460 --> 01:13:02,690 pode representar todos os possíveis números que nós foram ensinados 1483 01:13:02,690 --> 01:13:04,990 no grau escola pode existir no mundo. 1484 01:13:04,990 --> 01:13:08,870 Um computador, essencialmente, tem a escolher um subconjunto desses números 1485 01:13:08,870 --> 01:13:10,200 para representar com precisão. 1486 01:13:10,200 --> 01:13:12,450 >> Agora, o computador pode rodada talvez um pouco, 1487 01:13:12,450 --> 01:13:17,900 e pode permitir-lhe cerca de loja qualquer número que você pode querer. 1488 01:13:17,900 --> 01:13:20,940 Mas só intuitivamente, se você têm um número finito de bits, 1489 01:13:20,940 --> 01:13:24,560 você só pode permutar-los em tantas formas finitas. 1490 01:13:24,560 --> 01:13:26,570 Então você não pode possivelmente têm um número finito 1491 01:13:26,570 --> 01:13:29,880 de permutação de bits, padrões de zeros e uns, 1492 01:13:29,880 --> 01:13:32,940 para representar um infinito número de números, 1493 01:13:32,940 --> 01:13:37,370 o que sugere que computadores podem muito bem ser mentindo para nós às vezes. 1494 01:13:37,370 --> 01:13:38,770 >> Na verdade, vamos fazer isso. 1495 01:13:38,770 --> 01:13:41,239 Deixe-me voltar para IDE CS50. 1496 01:13:41,239 --> 01:13:43,030 Deixe-me ir em frente e criar um pequeno programa 1497 01:13:43,030 --> 01:13:47,940 chamada imprecisão, para mostrar que os computadores são, de fato, imprecisa. 1498 01:13:47,940 --> 01:13:51,910 >> E deixe-me ir em frente e começar com alguns de que o código de antes, 1499 01:13:51,910 --> 01:13:53,830 e agora basta fazer o seguinte. 1500 01:13:53,830 --> 01:14:03,640 Deixe-me ir em frente e fazer printf, cento f, barra invertida n, 1 dividido por 10. 1501 01:14:03,640 --> 01:14:07,430 Em outras palavras, vamos mergulhar no mais profundo a 1/10, como 1 e dividida por 10. 1502 01:14:07,430 --> 01:14:09,760 Certamente, um computador pode representar 1/10. 1503 01:14:09,760 --> 01:14:13,620 >> Então, vamos em frente e fazer imprecisão. 1504 01:14:13,620 --> 01:14:14,390 Vamos ver. 1505 01:14:14,390 --> 01:14:16,210 Format especifica o tipo de casal. 1506 01:14:16,210 --> 01:14:18,160 Mas o argumento tem o tipo int. 1507 01:14:18,160 --> 01:14:19,040 O que está acontecendo? 1508 01:14:19,040 --> 01:14:21,970 >> Oh, interessante, por isso é uma lição aprendida de antes. 1509 01:14:21,970 --> 01:14:26,050 Eu estou dizendo, hey, feira de informática me um flutuador com cento f. 1510 01:14:26,050 --> 01:14:28,200 Mas eu estou dando-lhe 2 ints. 1511 01:14:28,200 --> 01:14:31,120 Assim, ao que parece, posso corrigir isso em um par de formas. 1512 01:14:31,120 --> 01:14:38,430 >> Eu poderia simplesmente transformar um 1.0, e 10 para 10,0, o que, de fato, 1513 01:14:38,430 --> 01:14:42,390 tem o efeito de converter -los em floats-- ainda espero 1514 01:14:42,390 --> 01:14:43,180 o mesmo número. 1515 01:14:43,180 --> 01:14:45,880 Ou se vê que há algo veremos novamente em pouco tempo. 1516 01:14:45,880 --> 01:14:47,170 Você poderia lançar os números. 1517 01:14:47,170 --> 01:14:49,880 >> Você pode, usando este parêntesis expressão, você pode dizer, 1518 01:14:49,880 --> 01:14:52,560 hey, computador, aproveitar esta 10, que sei que é um int. 1519 01:14:52,560 --> 01:14:54,660 Mas tratá-lo, por favor, como se fosse uma bóia. 1520 01:14:54,660 --> 01:14:56,680 Mas isso parece desnecessariamente complexa. 1521 01:14:56,680 --> 01:14:59,040 >> Para os nossos propósitos hoje, vamos apenas literalmente 1522 01:14:59,040 --> 01:15:02,700 fazê-los valores de ponto flutuante com um ponto decimal, como este. 1523 01:15:02,700 --> 01:15:07,060 Deixe-me ir em frente e volte a executar, faça imprecisão, bom, barra dot 1524 01:15:07,060 --> 01:15:08,870 imprecisão, entrar. 1525 01:15:08,870 --> 01:15:10,990 OK, nós estamos olhando bom. 1526 01:15:10,990 --> 01:15:18,194 >> 1 dividida por 10, de acordo com o meu Mac aqui, é, de fato, 0,100 mil. 1527 01:15:18,194 --> 01:15:21,360 Agora, eu fui ensinado na escola há deve ser um número infinito de 0 do. 1528 01:15:21,360 --> 01:15:23,151 Então, vamos pelo menos tentar para ver algumas delas. 1529 01:15:23,151 --> 01:15:26,770 Acontece que printf é um pouco ainda mais extravagante do que temos vindo a utilizar. 1530 01:15:26,770 --> 01:15:30,890 Acontece que você não tem que especificar simplesmente por cento f, ou simplesmente por cento i. 1531 01:15:30,890 --> 01:15:33,830 Você pode realmente especificar algumas opções de controle aqui. 1532 01:15:33,830 --> 01:15:36,470 >> Especificamente, eu estou indo para dizer, hey, printf, 1533 01:15:36,470 --> 01:15:39,660 realmente mostrar-me 10 pontos decimais. 1534 01:15:39,660 --> 01:15:40,820 Portanto, parece um pouco estranho. 1535 01:15:40,820 --> 01:15:42,845 Mas você diz por cento, ponto, quantos números 1536 01:15:42,845 --> 01:15:44,970 você quer ver após o ponto decimal e, em seguida f 1537 01:15:44,970 --> 01:15:48,340 para plana, só porque é o que diz a documentação. 1538 01:15:48,340 --> 01:15:50,080 Deixe-me ir em frente e guardar esse. 1539 01:15:50,080 --> 01:15:52,460 >> E observe também, eu estou recebendo cansado de ter que redigitar as coisas. 1540 01:15:52,460 --> 01:15:55,900 Então, eu estou apenas definir o para cima e seta para baixo em minhas chaves aqui. 1541 01:15:55,900 --> 01:15:58,710 E se eu mantenho-me bater-se, você pode ver todos os comandos 1542 01:15:58,710 --> 01:16:01,090 que eu fiz, ou feita de forma incorreta. 1543 01:16:01,090 --> 01:16:04,630 >> E eu estou indo para ir em frente agora e Não realmente usar que, aparentemente. 1544 01:16:04,630 --> 01:16:11,416 Faça imprecisão, dot cortar imprecision-- assim 1545 01:16:11,416 --> 01:16:13,290 o que foi ensinado na escola primária confere. 1546 01:16:13,290 --> 01:16:19,010 Mesmo se eu imprimi-lo a 10 decimal coloca, de fato, é 0,10000. 1547 01:16:19,010 --> 01:16:19,840 Mas você sabe o que? 1548 01:16:19,840 --> 01:16:21,150 >> Vamos ficar um pouco ganancioso. 1549 01:16:21,150 --> 01:16:23,990 Digamos que, como, mostre-me 55 pontos após o decimal. 1550 01:16:23,990 --> 01:16:26,160 Vamos realmente tomar esta programar para dar uma volta. 1551 01:16:26,160 --> 01:16:31,170 Deixe-me refazê-lo com o make imprecisão, barra ponto, imprecisão. 1552 01:16:31,170 --> 01:16:32,390 >> E aqui vamos nós. 1553 01:16:32,390 --> 01:16:34,420 Sua infância foi uma mentira. 1554 01:16:34,420 --> 01:16:48,410 Aparentemente, 1 dividido por 10 é efectivamente 0.100000000000000005551115123-- 1555 01:16:48,410 --> 01:16:49,740 >> O que está acontecendo? 1556 01:16:49,740 --> 01:16:53,360 Bem, ao que parece, se você tipo de olhar longe o suficiente na subjacente 1557 01:16:53,360 --> 01:16:55,950 representação do presente número, ele realmente 1558 01:16:55,950 --> 01:17:00,400 não é exactamente 10/01, ou 0,1 e um número infinito de zeros. 1559 01:17:00,400 --> 01:17:01,630 Agora, por que isso? 1560 01:17:01,630 --> 01:17:06,250 >> Bem, mesmo que esta é uma simples número para nós seres humanos, 1 dividido por 10, 1561 01:17:06,250 --> 01:17:10,910 ainda é um dos infinitos números que poderíamos imaginar. 1562 01:17:10,910 --> 01:17:14,490 Mas um computador só pode representar um número finito de números assim. 1563 01:17:14,490 --> 01:17:18,710 E assim, de forma eficaz, o que o computador está nos mostrando é o seu mais próximo 1564 01:17:18,710 --> 01:17:22,940 aproximação para o número queremos acreditar é 1/10, 1565 01:17:22,940 --> 01:17:27,760 ou realmente 0,10000 ad infinitum. 1566 01:17:27,760 --> 01:17:30,425 >> Em vez disso, porém, este é tão perto quanto ele pode chegar. 1567 01:17:30,425 --> 01:17:32,300 E, de fato, se você olhar por baixo da capa, 1568 01:17:32,300 --> 01:17:37,050 como estamos aqui examinando 55 dígitos após o decimal, 1569 01:17:37,050 --> 01:17:39,990 realmente vemos que a realidade. 1570 01:17:39,990 --> 01:17:42,610 Agora, como um aparte, se você tiver já viu o movie-- 1571 01:17:42,610 --> 01:17:45,780 a maioria de vocês provavelmente haven't-- mas Superman 3 há alguns anos, 1572 01:17:45,780 --> 01:17:49,500 Richard Pryor essencialmente alavancado este realidade em sua empresa para roubar um monte 1573 01:17:49,500 --> 01:17:53,500 de frações e as frações de centavos, porque o company-- se bem me lembro, 1574 01:17:53,500 --> 01:17:57,210 tem sido um while-- era essencialmente jogando fora tudo o que não se encaixava 1575 01:17:57,210 --> 01:17:58,790 na noção de centavos. 1576 01:17:58,790 --> 01:18:01,480 >> Mas se você somar todos esses minúsculos, minúsculo, minúsculos números mais uma vez, 1577 01:18:01,480 --> 01:18:04,960 e de novo, e de novo, você pode, como em seu caso, fazer uma boa quantia de dinheiro. 1578 01:18:04,960 --> 01:18:08,010 >> Essa mesma ideia foi roubado por uma mais recente, mas ainda agora mais velhos 1579 01:18:08,010 --> 01:18:10,500 filme, chamado Office Space, onde os caras do que o filme, 1580 01:18:10,500 --> 01:18:13,501 fez a mesma coisa, estraguei tudo completamente, acabou com a maneira demasiado 1581 01:18:13,501 --> 01:18:14,666 dinheiro em sua conta bancária. 1582 01:18:14,666 --> 01:18:15,800 Foi tudo muito suspeito. 1583 01:18:15,800 --> 01:18:19,290 Contudo, no final do dia, imprecisão está ao nosso redor. 1584 01:18:19,290 --> 01:18:22,240 >> E que, também, pode ser assustadoramente o caso. 1585 01:18:22,240 --> 01:18:25,590 Acontece que Superman 3 e espaço de escritórios de lado, há 1586 01:18:25,590 --> 01:18:28,460 pode haver algum muito real ramificações mundiais 1587 01:18:28,460 --> 01:18:32,290 das realidades da imprecisa representação de dados 1588 01:18:32,290 --> 01:18:34,770 que mesmo nós, humanos, a este dia não necessariamente 1589 01:18:34,770 --> 01:18:38,230 entender bem como deveríamos, ou lembrar tão frequentemente quanto deveria. 1590 01:18:38,230 --> 01:18:42,950 E, de fato, o clipe seguinte é de uma olhada em alguns mundo muito real 1591 01:18:42,950 --> 01:18:47,730 ramificações do que acontece se você não apreciam a imprecisão que 1592 01:18:47,730 --> 01:18:50,065 pode acontecer em números representação. 1593 01:18:50,065 --> 01:18:51,300 >> [REPRODUÇÃO DE VÍDEO] 1594 01:18:51,300 --> 01:18:55,620 >> -Computadores, Todos nós temos vindo a aceitar os problemas que muitas vezes frustrante 1595 01:18:55,620 --> 01:19:00,310 ir com eles-- erros, vírus, e falhas de software, 1596 01:19:00,310 --> 01:19:03,130 para pequenos preços a pagar para a conveniência. 1597 01:19:03,130 --> 01:19:07,800 Mas, na alta tecnologia e alta velocidade aplicações do programa espacial e militares, 1598 01:19:07,800 --> 01:19:12,800 o menor problema pode ser ampliada para o desastre. 1599 01:19:12,800 --> 01:19:18,900 >> Em 04 de junho de 1996, os cientistas preparados para lançar um não-tripulado Ariane 5 foguete. 1600 01:19:18,900 --> 01:19:21,220 Ele estava carregando científica satélites projetados 1601 01:19:21,220 --> 01:19:24,600 para estabelecer com precisão a forma como o interage campo magnético da Terra 1602 01:19:24,600 --> 01:19:27,410 com ventos solares. 1603 01:19:27,410 --> 01:19:30,800 O foguete foi construído para a Agência Espacial Europeia, 1604 01:19:30,800 --> 01:19:34,370 e decolou de sua instalação na costa da Guiana Francesa. 1605 01:19:34,370 --> 01:19:37,540 >> -No Cerca de 37 segundos para o vôo, eles primeiro 1606 01:19:37,540 --> 01:19:39,270 notado que algo estava acontecendo de errado. 1607 01:19:39,270 --> 01:19:42,250 Os bicos foram girando em uma maneira que eles realmente não deveria. 1608 01:19:42,250 --> 01:19:46,580 Cerca de 40 segundos de vôo, claramente, o veículo estava em apuros. 1609 01:19:46,580 --> 01:19:48,850 >> E isso é quando eles fizeram a decisão de destruí-lo. 1610 01:19:48,850 --> 01:19:52,780 O oficial de segurança gama, com tremenda coragem, apertou o botão, 1611 01:19:52,780 --> 01:19:58,150 explodiu o foguete, antes que pudesse se tornar um perigo para a segurança pública. 1612 01:19:58,150 --> 01:20:01,060 >> -Este Foi o de solteira viagem do Ariane 5. 1613 01:20:01,060 --> 01:20:03,960 E sua destruição levou colocar devido a uma falha 1614 01:20:03,960 --> 01:20:05,822 embutido no software do foguete. 1615 01:20:05,822 --> 01:20:08,280 -O Problema no Ariane foi que havia um número que 1616 01:20:08,280 --> 01:20:10,600 64 bits requerido para expressar. 1617 01:20:10,600 --> 01:20:13,590 E eles queriam converter -lo para um número de 16 bits. 1618 01:20:13,590 --> 01:20:15,610 Eles assumiram que o número nunca ia 1619 01:20:15,610 --> 01:20:20,980 de ser muito grande, que a maior parte daqueles dígitos de um número de 64 bits foram zeros. 1620 01:20:20,980 --> 01:20:22,440 Eles estavam errados. 1621 01:20:22,440 --> 01:20:25,060 >> -O Incapacidade de um programa de software para aceitar 1622 01:20:25,060 --> 01:20:29,510 o tipo de número gerado pela outra estava na origem da falha. 1623 01:20:29,510 --> 01:20:34,350 desenvolvimento de software tornou-se um parte muito cara de nova tecnologia. 1624 01:20:34,350 --> 01:20:38,140 O foguete Ariane têm sido muito bem sucedido, tanto do software 1625 01:20:38,140 --> 01:20:41,550 criado por isso também foi usado no Ariane 5. 1626 01:20:41,550 --> 01:20:47,940 >> -O Problema básico era que a Ariane 5 foi mais rápido, mais rapidamente acelerada. 1627 01:20:47,940 --> 01:20:51,450 E o software não tinha que representaram. 1628 01:20:51,450 --> 01:20:55,060 >> -A Destruição do foguete foi um enorme desastre financeiro, 1629 01:20:55,060 --> 01:20:58,790 tudo devido a um erro de software minuto. 1630 01:20:58,790 --> 01:21:01,210 Mas este não foi o primeiro problemas de conversão de dados de tempos 1631 01:21:01,210 --> 01:21:04,820 havia atormentado a tecnologia de foguetes moderna. 1632 01:21:04,820 --> 01:21:08,050 >> -Em 1991, com o início da primeira Guerra do Golfo, 1633 01:21:08,050 --> 01:21:10,570 o Patriot Missile experimentaram um tipo semelhante 1634 01:21:10,570 --> 01:21:12,800 do problema de conversão de número. 1635 01:21:12,800 --> 01:21:16,090 E, como resultado, 28 pessoas, 28 soldados norte-americanos, 1636 01:21:16,090 --> 01:21:19,080 foram mortos, e cerca de 100 ficaram feridas, 1637 01:21:19,080 --> 01:21:22,780 quando o Patriot, que deveria para proteger contra scuds recebidas, 1638 01:21:22,780 --> 01:21:25,830 não conseguiu disparar um míssil. 1639 01:21:25,830 --> 01:21:31,670 >> -Quando O Iraque invadiu o Kuwait, e América lançou Desert Storm no início de 1991, 1640 01:21:31,670 --> 01:21:35,780 baterias de mísseis Patriot foram implantados para proteger a Arábia Saudita e Israel 1641 01:21:35,780 --> 01:21:39,230 de ataques de mísseis Scud iraquianos. 1642 01:21:39,230 --> 01:21:43,810 O Patriot é um médio alcance US superfície de sistema de ar, fabricado 1643 01:21:43,810 --> 01:21:45,770 pela empresa Raytheon. 1644 01:21:45,770 --> 01:21:52,340 >> -O Tamanho do interceptor Patriot em si é de cerca de cerca de 20 pés de comprimento. 1645 01:21:52,340 --> 01:21:55,230 E pesa cerca de 2.000 libras. 1646 01:21:55,230 --> 01:21:59,320 E carrega uma ogiva de cerca, Eu acho que é mais ou menos 150 libras. 1647 01:21:59,320 --> 01:22:03,930 E é o próprio ogiva um elevado explosivo, que 1648 01:22:03,930 --> 01:22:07,330 tem fragmentos em torno dele. 1649 01:22:07,330 --> 01:22:11,680 O invólucro da ogiva é projetado para agir como chumbo grosso. 1650 01:22:11,680 --> 01:22:14,110 >> -As Mísseis são realizadas quatro por recipiente, 1651 01:22:14,110 --> 01:22:17,130 e são transportados por um semi-reboque. 1652 01:22:17,130 --> 01:22:24,930 >> -O Sistema Patriot anti-míssil remonta pelo menos 20 anos. 1653 01:22:24,930 --> 01:22:28,420 Ele foi originalmente projetado como um míssil de defesa aérea 1654 01:22:28,420 --> 01:22:30,720 para abater aviões inimigos. 1655 01:22:30,720 --> 01:22:34,500 Na primeira Guerra do Golfo, quando a guerra veio, 1656 01:22:34,500 --> 01:22:39,745 o Exército queria usá-lo para abater scuds, não aviões. 1657 01:22:39,745 --> 01:22:43,620 >> A Força Aérea iraquiana foi não tanto de um problema. 1658 01:22:43,620 --> 01:22:46,670 Mas o Exército estava preocupado com scuds. 1659 01:22:46,670 --> 01:22:50,170 E assim eles tentaram atualizar o Patriot. 1660 01:22:50,170 --> 01:22:52,800 >> -Intercepting Um inimigo míssil viajando a Mach 5 1661 01:22:52,800 --> 01:22:55,830 ia ser bastante difícil. 1662 01:22:55,830 --> 01:22:58,490 Mas quando o Patriot foi levado às pressas em serviço, 1663 01:22:58,490 --> 01:23:02,860 o Exército não estava ciente de um modificação iraquiana que fez 1664 01:23:02,860 --> 01:23:05,930 seus scuds quase impossível de bater. 1665 01:23:05,930 --> 01:23:10,740 >> -O Que aconteceu é o que scuds estavam chegando eram instáveis. 1666 01:23:10,740 --> 01:23:11,692 Eles estavam balançando. 1667 01:23:11,692 --> 01:23:14,910 A razão para isso era os iraquianos, a fim 1668 01:23:14,910 --> 01:23:18,280 para obter 600 quilômetros fora de um 300 km 1669 01:23:18,280 --> 01:23:21,700 alcance dos mísseis, tomou peso fora da ogiva frente. 1670 01:23:21,700 --> 01:23:23,390 Eles fizeram a ogiva mais leve. 1671 01:23:23,390 --> 01:23:27,330 >> Portanto, agora o Patriot é tentar chegar ao Scud. 1672 01:23:27,330 --> 01:23:30,230 E a maior parte do tempo, o esmagadora maioria do tempo, 1673 01:23:30,230 --> 01:23:32,940 seria apenas voar pela Scud. 1674 01:23:32,940 --> 01:23:37,260 Uma vez que os operadores do sistema Patriot percebeu que o Patriot errou seu alvo, 1675 01:23:37,260 --> 01:23:41,690 eles detonaram ogiva do Patriot para evitar possíveis acidentes se ele 1676 01:23:41,690 --> 01:23:44,570 Deixou-se cair ao chão. 1677 01:23:44,570 --> 01:23:48,790 >> -Isso Era o que a maioria das pessoas viu, esses grandes bolas de fogo no céu, 1678 01:23:48,790 --> 01:23:54,550 e mal interpretado como intercepta de ogivas Scud. 1679 01:23:54,550 --> 01:23:56,630 >> -embora Na noite céus, Patriots apareceu 1680 01:23:56,630 --> 01:24:00,370 para ser com sucesso destruindo Scuds, em Dhahran, 1681 01:24:00,370 --> 01:24:03,360 pode haver nenhum erro sobre o seu desempenho. 1682 01:24:03,360 --> 01:24:07,970 Lá, sistema de radar do Patriot perdeu a noção de um Scud de entrada, 1683 01:24:07,970 --> 01:24:10,721 e nunca lançado devido a uma falha de software. 1684 01:24:10,721 --> 01:24:14,090 1685 01:24:14,090 --> 01:24:18,940 Foram os israelenses que descoberto pela primeira vez que quanto mais tempo o sistema foi ligado, 1686 01:24:18,940 --> 01:24:22,690 quanto maior for o tempo de discrepância tornou-se, devido a um relógio incorporado 1687 01:24:22,690 --> 01:24:24,810 no computador do sistema. 1688 01:24:24,810 --> 01:24:28,210 >> -Cerca De duas semanas antes a tragédia em Dhahran, 1689 01:24:28,210 --> 01:24:30,770 os israelenses relatado para o Departamento de Defesa 1690 01:24:30,770 --> 01:24:32,590 que o sistema estava perdendo tempo. 1691 01:24:32,590 --> 01:24:35,360 Após cerca de oito horas ou em execução, eles notaram que o sistema 1692 01:24:35,360 --> 01:24:37,720 estava se tornando visivelmente menos precisas. 1693 01:24:37,720 --> 01:24:41,900 O Departamento de Defesa respondeu contando todas as baterias Patriot 1694 01:24:41,900 --> 01:24:44,950 para não deixar os sistemas por um longo período de tempo. 1695 01:24:44,950 --> 01:24:49,160 Eles nunca disseram que um longo tempo foi-- oito horas, 10 horas, 1.000 horas. 1696 01:24:49,160 --> 01:24:51,360 Ninguém sabia. 1697 01:24:51,360 --> 01:24:53,380 >> -A Bateria Patriot estacionados no quartel 1698 01:24:53,380 --> 01:24:58,350 em Dhahran e sua falha interna relógio tinha sido em mais de 100 horas 1699 01:24:58,350 --> 01:25:01,670 na noite de 25 de fevereiro. 1700 01:25:01,670 --> 01:25:05,917 >> -É Monitorado o tempo com uma precisão de cerca de um décimo de segundo. 1701 01:25:05,917 --> 01:25:08,000 Agora, um décimo de segundo é um número interessante, 1702 01:25:08,000 --> 01:25:11,920 porque não pode ser expressa em binário exatamente, o que 1703 01:25:11,920 --> 01:25:16,820 significa que não pode ser expresso exactamente em qualquer computador digital moderno. 1704 01:25:16,820 --> 01:25:18,540 É difícil de acreditar. 1705 01:25:18,540 --> 01:25:21,210 >> Mas usar isso como um exemplo. 1706 01:25:21,210 --> 01:25:23,540 Vamos dar o número de um terço. 1707 01:25:23,540 --> 01:25:27,350 Um terceiro não pode ser expressa em decimal exatamente. 1708 01:25:27,350 --> 01:25:32,080 Um terço é 0,333 acontecendo para o infinito. 1709 01:25:32,080 --> 01:25:36,480 >> Não há nenhuma maneira de fazer isso com a precisão absoluta em decimal. 1710 01:25:36,480 --> 01:25:39,560 Esse é exatamente o tipo de problema que aconteceu no Patriot. 1711 01:25:39,560 --> 01:25:44,100 Quanto mais tempo o sistema funcionou, o pior o erro de tempo se tornou. 1712 01:25:44,100 --> 01:25:48,890 >> -Depois De 100 horas de operação, o erro no tempo foi apenas cerca de um terço 1713 01:25:48,890 --> 01:25:50,600 de um segundo. 1714 01:25:50,600 --> 01:25:54,210 Mas em termos de como alvo um míssil viajando a Mach 5, 1715 01:25:54,210 --> 01:25:58,710 resultou em um acompanhamento de erro de mais de 600 metros. 1716 01:25:58,710 --> 01:26:02,120 Seria um erro fatal para os soldados sobre o que 1717 01:26:02,120 --> 01:26:08,940 aconteceu é o lançamento de um Scud foi detectados por satélites de alerta precoce 1718 01:26:08,940 --> 01:26:12,860 e eles sabiam que o Scud foi vindo em sua direção geral. 1719 01:26:12,860 --> 01:26:15,320 Eles não sabiam de onde vinha. 1720 01:26:15,320 --> 01:26:18,250 >> -Foi Agora à radar componente do sistema Patriota 1721 01:26:18,250 --> 01:26:23,190 defendendo Dhahran para localizar e manter trilha do míssil inimigo de entrada. 1722 01:26:23,190 --> 01:26:24,609 >> -O Radar era muito inteligente. 1723 01:26:24,609 --> 01:26:26,650 Seria, na verdade, rastrear a posição do Scud, 1724 01:26:26,650 --> 01:26:30,350 e, em seguida, prever onde ela provavelmente seria a próxima vez que o radar enviado 1725 01:26:30,350 --> 01:26:31,420 Um pulso para fora. 1726 01:26:31,420 --> 01:26:33,110 Que foi chamado um portão de gama. 1727 01:26:33,110 --> 01:26:37,660 >> -Então, Uma vez que o Patriot decide tempo suficiente tem 1728 01:26:37,660 --> 01:26:42,450 passado para voltar e verificar a próxima localização para este objeto detectado, 1729 01:26:42,450 --> 01:26:43,600 ele vai voltar. 1730 01:26:43,600 --> 01:26:48,650 Assim, quando se voltou para o errado lugar, em seguida, vê nenhum objeto. 1731 01:26:48,650 --> 01:26:52,160 E decide que não houve objeto, ele foi uma falsa detecção, 1732 01:26:52,160 --> 01:26:53,930 e deixa a pista. 1733 01:26:53,930 --> 01:26:57,030 >> -O Scud de entrada desapareceu da tela do radar. 1734 01:26:57,030 --> 01:27:00,260 E segundos depois, se chocou contra o quartel. 1735 01:27:00,260 --> 01:27:06,150 O Scud matou 28, e foi a última um disparou durante a primeira Guerra do Golfo. 1736 01:27:06,150 --> 01:27:11,960 >> Tragicamente, o software atualizado Dhahran chegou no dia seguinte. 1737 01:27:11,960 --> 01:27:14,930 A falha de software teve sido fixada, o fechamento 1738 01:27:14,930 --> 01:27:19,806 um capítulo na conturbada história do míssil Patriot. 1739 01:27:19,806 --> 01:27:20,729 >> [REPRODUÇÃO DE VÍDEO] 1740 01:27:20,729 --> 01:27:23,520 DAVID J. MALAN: Então, isso é tudo para dizem que estas questões de estouro 1741 01:27:23,520 --> 01:27:25,860 e imprecisão são muito reais. 1742 01:27:25,860 --> 01:27:26,920 Então, como nós chegamos aqui? 1743 01:27:26,920 --> 01:27:28,895 Começamos com apenas falando sobre printf. 1744 01:27:28,895 --> 01:27:31,270 Mais uma vez, esta função que imprime algo para a tela, 1745 01:27:31,270 --> 01:27:33,450 e nós introduzidas posteriormente algumas outras funções 1746 01:27:33,450 --> 01:27:34,945 a partir do chamado biblioteca de CS50. 1747 01:27:34,945 --> 01:27:36,910 E nós vamos continuar a veja estes em devido tempo. 1748 01:27:36,910 --> 01:27:40,760 E nós, em particular, usado cadeia get, e obter int, e agora também terá float, 1749 01:27:40,760 --> 01:27:44,410 e ainda outros ainda vamos encontrar e usar-nos antes do tempo. 1750 01:27:44,410 --> 01:27:47,220 >> Mas de vez em quando, tem visto que já uma necessidade 1751 01:27:47,220 --> 01:27:50,520 para armazenar o que essas funções mão para trás? 1752 01:27:50,520 --> 01:27:52,920 Eles nos trás uma cadeia de mão, ou um int ou um float. 1753 01:27:52,920 --> 01:27:56,070 E às vezes é preciso colocar que string, ou int ou float, em algum lugar. 1754 01:27:56,070 --> 01:28:00,100 >> E para armazenar essas coisas, lembre-se apenas como em risco, temos variáveis. 1755 01:28:00,100 --> 01:28:03,260 Mas ao contrário de risco, em C temos tipos reais 1756 01:28:03,260 --> 01:28:05,530 de dados variables-- tipos, mais generally-- 1757 01:28:05,530 --> 01:28:08,640 entre eles, uma corda, um int, um flutuar, e esses outros ainda. 1758 01:28:08,640 --> 01:28:12,321 >> E por isso, quando declarar variáveis ​​em C, vamos ter de declarar os nossos tipos de dados. 1759 01:28:12,321 --> 01:28:14,820 Isso não é algo que vamos tem que fazer mais tarde no semestre 1760 01:28:14,820 --> 01:28:16,810 à medida que a transição para outras línguas. 1761 01:28:16,810 --> 01:28:19,610 Mas, por agora, precisamos para a priori antes, 1762 01:28:19,610 --> 01:28:24,370 explicar ao computador que tipo da variável que queremos nos dar. 1763 01:28:24,370 --> 01:28:27,290 >> Agora, entretanto, para imprimir esses tipos de tipos de dados, 1764 01:28:27,290 --> 01:28:29,570 temos de dizer printf o que esperar. 1765 01:28:29,570 --> 01:28:32,450 E vimos por cento s para cordas, e cento i para inteiros, 1766 01:28:32,450 --> 01:28:33,790 e alguns outros já. 1767 01:28:33,790 --> 01:28:37,237 E esses são apenas requisitos para a apresentação visual 1768 01:28:37,237 --> 01:28:38,070 dessas informações. 1769 01:28:38,070 --> 01:28:42,080 >> E cada um destes pode ser realmente parametrizada ou mexido, de alguma forma, 1770 01:28:42,080 --> 01:28:45,370 se você quiser promover o controle o tipo de saída que você começa. 1771 01:28:45,370 --> 01:28:49,604 E, de fato, verifica-se que não só há barra invertida n para uma nova linha. 1772 01:28:49,604 --> 01:28:52,520 Há mais uma coisa chamada barra invertida r para um retorno de carro, o que 1773 01:28:52,520 --> 01:28:54,360 é mais semelhante a um Máquina de escrever velha escola, 1774 01:28:54,360 --> 01:28:57,690 e também o Windows usado por muitos anos. 1775 01:28:57,690 --> 01:28:59,690 >> Há barra invertida t para guias. 1776 01:28:59,690 --> 01:29:03,170 Acontece que, que se você quiser aspas dentro de uma string, 1777 01:29:03,170 --> 01:29:05,000 Lembre-se que nós usamos duplo aspas 1778 01:29:05,000 --> 01:29:07,900 Citação à esquerda e à direita acaba de nossas cordas até agora. 1779 01:29:07,900 --> 01:29:09,420 Isso parece confundir as coisas. 1780 01:29:09,420 --> 01:29:12,503 >> Se você quiser colocar uma aspa em no meio de uma string-- e, na verdade, 1781 01:29:12,503 --> 01:29:13,670 é confuso para ver. 1782 01:29:13,670 --> 01:29:17,120 E então você tem que escapar, por assim falar, uma aspa com algo 1783 01:29:17,120 --> 01:29:18,860 como, literalmente, barra invertida aspas duplas. 1784 01:29:18,860 --> 01:29:20,230 E há algumas outras ainda. 1785 01:29:20,230 --> 01:29:24,540 E veremos mais desses no uso real em pouco tempo. 1786 01:29:24,540 --> 01:29:27,930 >> Então, vamos agora a transição de de dados e de representação, 1787 01:29:27,930 --> 01:29:30,820 e operadores aritméticos, todos dos quais nos deu algum edifício 1788 01:29:30,820 --> 01:29:32,070 blocos com que a desempenhar. 1789 01:29:32,070 --> 01:29:34,481 Mas agora vamos realmente dar -nos o resto do vocabulário 1790 01:29:34,481 --> 01:29:36,230 que já tinha na semana passada com o Scratch 1791 01:29:36,230 --> 01:29:39,350 dando uma olhada em algum outro construções em C-- não todas elas. 1792 01:29:39,350 --> 01:29:41,680 Mas as idéias que estamos prestes a ver realmente apenas 1793 01:29:41,680 --> 01:29:45,610 enfatizar a tradução do uma língua, risco, para outro, C. 1794 01:29:45,610 --> 01:29:48,470 >> E ao longo do tempo, vamos pegar mais ferramentas para nossa caixa de ferramentas, 1795 01:29:48,470 --> 01:29:49,820 por assim dizer, sintaticamente. 1796 01:29:49,820 --> 01:29:54,190 E, de fato, você verá que as ideias agora são bastante familiares da semana passada. 1797 01:29:54,190 --> 01:29:55,200 Então, vamos fazer isso. 1798 01:29:55,200 --> 01:29:58,870 >> Vamos em frente e chicote de um programa que realmente usa algumas expressões, 1799 01:29:58,870 --> 01:30:00,720 uma expressão booleana. 1800 01:30:00,720 --> 01:30:02,810 Deixe-me ir em frente aqui e criar um novo arquivo. 1801 01:30:02,810 --> 01:30:06,090 Vou chamar este condition.c. 1802 01:30:06,090 --> 01:30:09,350 >> Deixe-me ir em frente e incluem a biblioteca CS50. 1803 01:30:09,350 --> 01:30:12,640 E deixe-me ir em frente e incluem padrão io.h para as nossas funções, 1804 01:30:12,640 --> 01:30:14,690 e printf, e mais, respectivamente. 1805 01:30:14,690 --> 01:30:18,900 Deixe-me dar a mim mesmo que clichê de void main int, cuja explicação que vai 1806 01:30:18,900 --> 01:30:20,360 voltar no futuro. 1807 01:30:20,360 --> 01:30:23,820 >> Agora deixe-me ir em frente e dar me um int via get int. 1808 01:30:23,820 --> 01:30:25,970 Então deixe-me ir em frente e fazer isso. 1809 01:30:25,970 --> 01:30:30,150 Eu quero dizer, se eu é less-- vamos distinguir entre positivo, negativo, 1810 01:30:30,150 --> 01:30:31,260 ou valores iguais a zero. 1811 01:30:31,260 --> 01:30:36,630 >> Então, se eu for menor que zero, deixe-me só tem este programa simplesmente dizer: 1812 01:30:36,630 --> 01:30:42,370 negativo, barra invertida n, outra se i é maior do que zero. 1813 01:30:42,370 --> 01:30:47,030 Agora eu estou, é claro, vai dizer printf positivo, barra invertida n. 1814 01:30:47,030 --> 01:30:50,690 E então outra coisa se-- eu poderia fazer isso. 1815 01:30:50,690 --> 01:30:53,410 >> Eu poderia fazer se eu for igual a 0. 1816 01:30:53,410 --> 01:30:55,840 Mas eu estaria fazendo em menos um erro já. 1817 01:30:55,840 --> 01:30:59,480 Lembre-se que o sinal de igual é não é igual, como nós, seres humanos sabem disso. 1818 01:30:59,480 --> 01:31:01,010 >> Mas é o operador de atribuição. 1819 01:31:01,010 --> 01:31:05,640 E nós não queremos tomar 0 no direita e colocá-lo em i à esquerda. 1820 01:31:05,640 --> 01:31:11,810 Então, para evitar esta confusão, ou talvez uso indevido do sinal de igual, 1821 01:31:11,810 --> 01:31:14,740 os seres humanos decidiram há alguns anos que em muitas linguagens de programação 1822 01:31:14,740 --> 01:31:18,000 quando você quiser verificar a igualdade entre a esquerda ea direita, 1823 01:31:18,000 --> 01:31:19,635 você realmente usa é igual iguais. 1824 01:31:19,635 --> 01:31:21,010 Então você bate o sinal de igual duas vezes. 1825 01:31:21,010 --> 01:31:25,600 Quando você deseja atribuir a partir da direita para a esquerda, você usar um único sinal de igual. 1826 01:31:25,600 --> 01:31:29,360 Para que pudéssemos fazer outra coisa isto-- se i é igual a igual a zero. 1827 01:31:29,360 --> 01:31:31,710 >> Eu poderia, então, ir e abrir os chaves, 1828 01:31:31,710 --> 01:31:36,087 e dizer: printf 0, barra invertida n, feito. 1829 01:31:36,087 --> 01:31:38,170 Mas lembre-se como estes garfos na estrada pode funcionar. 1830 01:31:38,170 --> 01:31:39,836 E, realmente, basta pensar sobre a lógica. 1831 01:31:39,836 --> 01:31:41,510 i é um número. 1832 01:31:41,510 --> 01:31:43,320 É um inteiro, especificamente. 1833 01:31:43,320 --> 01:31:48,600 E isso significa que ele vai ser menos do que 0, ou maior do que 0, ou 0. 1834 01:31:48,600 --> 01:31:51,600 Portanto, não é uma espécie de presente caso padrão implícito. 1835 01:31:51,600 --> 01:31:54,920 >> E assim poderíamos, assim como Zero, dispensar o else if, 1836 01:31:54,920 --> 01:31:55,747 e apenas dizer outra coisa. 1837 01:31:55,747 --> 01:31:57,830 Logicamente, se o programador sabe que só há 1838 01:31:57,830 --> 01:32:01,635 três baldes na qual um cenário pode fall-- o primeiro, 1839 01:32:01,635 --> 01:32:03,510 o segundo, ou terceiro neste case-- não 1840 01:32:03,510 --> 01:32:07,100 incomoda adicionando a precisão adicional e a lógica adicional ali. 1841 01:32:07,100 --> 01:32:09,690 Basta ir em frente com a caso padrão aqui de outra pessoa. 1842 01:32:09,690 --> 01:32:11,950 >> Agora, vamos em frente depois de salvar isso, certifique 1843 01:32:11,950 --> 01:32:15,760 condições dot cortar conditions-- não uma grande interface de usuário, 1844 01:32:15,760 --> 01:32:18,914 porque eu não estou levando o usuário, como mencionei anteriormente. 1845 01:32:18,914 --> 01:32:19,580 Mas isso é bom. 1846 01:32:19,580 --> 01:32:20,454 Vamos mantê-lo simples. 1847 01:32:20,454 --> 01:32:21,890 Vamos tentar o número 42. 1848 01:32:21,890 --> 01:32:23,240 E isso é positivo. 1849 01:32:23,240 --> 01:32:26,120 Vamos tentar o número negativo 42, negativa. 1850 01:32:26,120 --> 01:32:28,244 >> Vamos tentar o valor 0. 1851 01:32:28,244 --> 01:32:29,160 E, na verdade, ele funciona. 1852 01:32:29,160 --> 01:32:33,900 Agora, você verá com problemas antes longos e testar as coisas três vezes, 1853 01:32:33,900 --> 01:32:34,980 provavelmente insuficiente. 1854 01:32:34,980 --> 01:32:37,438 Você provavelmente vai querer testar alguns números maiores, alguns menores 1855 01:32:37,438 --> 01:32:40,520 números, alguns casos de canto, como nós vamos chegar a descrevê-los. 1856 01:32:40,520 --> 01:32:42,500 >> Mas, por agora, este é um programa muito simples. 1857 01:32:42,500 --> 01:32:45,160 E eu tenho certeza que, logicamente, que se divide em três casos. 1858 01:32:45,160 --> 01:32:49,360 E, de fato, embora nós apenas incidiu sobre os potenciais desvantagens 1859 01:32:49,360 --> 01:32:53,480 de imprecisão e inundará, em realidade onde muitos dos problemas do CS50, 1860 01:32:53,480 --> 01:32:56,000 não vamos nos preocupar sobre, todo o tempo, 1861 01:32:56,000 --> 01:32:59,050 esses problemas de estouro e imprecisão, porque, na verdade, em C, 1862 01:32:59,050 --> 01:33:01,889 não é realmente tudo o que fácil de evitar essas coisas. 1863 01:33:01,889 --> 01:33:04,180 Se você deseja contar-se maior, e maior, e maior, 1864 01:33:04,180 --> 01:33:07,510 acontece que existem técnicas que você pode usar, muitas vezes envolvendo coisas chamadas 1865 01:33:07,510 --> 01:33:11,240 bibliotecas, coleções de código, que outras pessoas escreveu que você pode usar, 1866 01:33:11,240 --> 01:33:13,910 e outras linguagens como Java e outros, na verdade, 1867 01:33:13,910 --> 01:33:15,800 torná-lo muito mais fácil contar ainda maior. 1868 01:33:15,800 --> 01:33:19,810 Portanto, é realmente alguns desses perigos uma função da linguagem que você usa. 1869 01:33:19,810 --> 01:33:22,710 E nas próximas semanas, vamos ver o quão perigoso C realmente 1870 01:33:22,710 --> 01:33:24,950 pode ser, se você não usá-lo corretamente. 1871 01:33:24,950 --> 01:33:27,610 Mas a partir daí, e com Python e JavaScript, vai 1872 01:33:27,610 --> 01:33:32,620 nós camada em algumas proteções adicionais, e correr menos desses riscos. 1873 01:33:32,620 --> 01:33:35,820 >> Então, vamos fazer um pouco mais lógica interessante em nosso programa. 1874 01:33:35,820 --> 01:33:39,110 Então deixe-me ir em frente e criar um programa chamado lógico 1875 01:33:39,110 --> 01:33:43,804 só assim eu posso jogar com alguns lógica real, logical.c. 1876 01:33:43,804 --> 01:33:46,870 Eu só vou copiar e colar algum Código de mais cedo, então eu voltar 1877 01:33:46,870 --> 01:33:49,950 a este bom ponto de partida. 1878 01:33:49,950 --> 01:33:53,980 >> Deixe-me desta vez fazer C. de char que eu sou vai dar-lhe um nome de C 1879 01:33:53,980 --> 01:33:58,510 só porque é convencional, obter um personagem do usuário. 1880 01:33:58,510 --> 01:34:00,730 E vamos fingir Estou implementando parte 1881 01:34:00,730 --> 01:34:04,130 desse programa Rm, a retirada programa antes que levou o usuário 1882 01:34:04,130 --> 01:34:05,400 para remover um arquivo. 1883 01:34:05,400 --> 01:34:06,750 Como poderíamos fazer isso? 1884 01:34:06,750 --> 01:34:11,090 >> Quero dizer que, se C é igual a iguais, entre aspas, 1885 01:34:11,090 --> 01:34:16,304 y, então eu vou assumir que o usuário tenha escolhido sim. 1886 01:34:16,304 --> 01:34:17,470 Eu só vou para imprimir sim. 1887 01:34:17,470 --> 01:34:19,440 Se fosse realmente escrever o programa de remoção, 1888 01:34:19,440 --> 01:34:21,420 poderíamos remover o arquivo com mais linhas de código. 1889 01:34:21,420 --> 01:34:22,461 Mas nós vamos mantê-lo simples. 1890 01:34:22,461 --> 01:34:25,950 1891 01:34:25,950 --> 01:34:31,250 >> Else if c é igual a igual n-- e agora aqui, eu vou dizer, 1892 01:34:31,250 --> 01:34:32,980 o usuário deve ter significado nenhum. 1893 01:34:32,980 --> 01:34:34,360 E então outra coisa, você sabe o quê? 1894 01:34:34,360 --> 01:34:36,200 Eu não sei o que mais o usuário vai digitar. 1895 01:34:36,200 --> 01:34:38,533 Então, eu estou indo só para dizer que que é um erro, qualquer que seja 1896 01:34:38,533 --> 01:34:40,070 ele ou ela realmente digitado. 1897 01:34:40,070 --> 01:34:41,180 >> Então, o que está acontecendo aqui? 1898 01:34:41,180 --> 01:34:44,530 Há uma diferença fundamental versus o que eu fiz no passado. 1899 01:34:44,530 --> 01:34:49,300 aspas, aspas duplas, o dobro citações, e, ainda, aspas simples, 1900 01:34:49,300 --> 01:34:50,170 aspas simples. 1901 01:34:50,170 --> 01:34:52,860 Acontece em C, que quando você quer escrever uma corda, 1902 01:34:52,860 --> 01:34:56,680 você usar aspas duplas, assim como nós temos vindo a utilizar todo esse tempo com printf. 1903 01:34:56,680 --> 01:35:02,030 >> Mas se você quer lidar com apenas um caractere único, um chamado char, 1904 01:35:02,030 --> 01:35:03,780 então você realmente usar aspas simples. 1905 01:35:03,780 --> 01:35:05,450 Aqueles de vocês que tenha programado antes, você pode não ter 1906 01:35:05,450 --> 01:35:07,850 tinha que se preocupar com isso distinção em certas línguas. 1907 01:35:07,850 --> 01:35:09,450 Em C, ele não importa. 1908 01:35:09,450 --> 01:35:12,560 E assim quando eu chegar em um char e eu quero comparar esse caractere usando equals 1909 01:35:12,560 --> 01:35:18,350 é igual a alguma carta como y ou n, eu faço, na verdade, precisa ter as aspas simples. 1910 01:35:18,350 --> 01:35:19,770 >> Agora, vamos ir em frente e fazer isso. 1911 01:35:19,770 --> 01:35:26,180 Vamos ir em frente e fazem dot lógicas cortar lógico. 1912 01:35:26,180 --> 01:35:27,305 E agora eu estou sendo solicitado. 1913 01:35:27,305 --> 01:35:30,638 Assim, presumivelmente, uma melhor experiência de usuário seria realmente me dizer o que fazer aqui. 1914 01:35:30,638 --> 01:35:33,030 Mas eu vou apenas cega dizem y para sim, OK, agradável. 1915 01:35:33,030 --> 01:35:35,780 >> Vamos executá-lo novamente, n para nenhuma, agradável. 1916 01:35:35,780 --> 01:35:39,610 Suponha como certas pessoas que conheço, meus tecla Caps Lock está ligado com demasiada frequência. 1917 01:35:39,610 --> 01:35:43,740 Então eu faço o capital Y, entrar, erro. 1918 01:35:43,740 --> 01:35:46,130 OK, não é exatamente o que eu estou esperando. 1919 01:35:46,130 --> 01:35:48,170 Com efeito, o computador está fazendo literalmente o que 1920 01:35:48,170 --> 01:35:51,794 Eu disse-o para verificar se há fazer-- minúsculas n y e minúsculas. 1921 01:35:51,794 --> 01:35:53,960 Este não se sente como bom experiência do usuário, embora. 1922 01:35:53,960 --> 01:35:59,010 Deixe-me pedir e aceitar ambos os casos inferior ou maiúsculas. 1923 01:35:59,010 --> 01:36:02,090 Assim, verifica-se, você pode querer dizer algo como em risco, 1924 01:36:02,090 --> 01:36:08,150 como literal ou C é igual a é igual a de capital único y citado. 1925 01:36:08,150 --> 01:36:11,400 Acontece que, C não tem esta palavra-chave literal ou. 1926 01:36:11,400 --> 01:36:12,880 >> Mas tem duas barras verticais. 1927 01:36:12,880 --> 01:36:15,463 Você tem que segurar a tecla Shift normalmente, se você estiver usando um teclado americano, 1928 01:36:15,463 --> 01:36:18,910 e bateu a barra vertical chave acima de sua tecla de retorno. 1929 01:36:18,910 --> 01:36:22,410 Mas essa barra vertical barra vertical significa ou. 1930 01:36:22,410 --> 01:36:26,220 >> Se, pelo contrário, queríamos a dizer e, como em risco, 1931 01:36:26,220 --> 01:36:28,180 poderíamos fazer comercial e comercial. 1932 01:36:28,180 --> 01:36:31,330 Isso não faz sentido lógico aqui, porque um humano não poderia possivelmente 1933 01:36:31,330 --> 01:36:37,110 digitou tanto y e minúsculas y e capital de Y como o mesmo personagem. 1934 01:36:37,110 --> 01:36:39,470 Assim, ou é o que pretendemos aqui. 1935 01:36:39,470 --> 01:36:46,280 >> Então, se eu fizer isso em ambos os lugares, ou c é igual é igual a de capital N, agora executar novamente, 1936 01:36:46,280 --> 01:36:49,390 tornam lógica, execute novamente lógico. 1937 01:36:49,390 --> 01:36:51,200 Agora, eu posso digitar y. 1938 01:36:51,200 --> 01:36:53,920 E eu posso fazê-lo novamente com capital de Y ou N. de capital 1939 01:36:53,920 --> 01:36:56,630 E eu poderia acrescentar no adicional combinações fixas. 1940 01:36:56,630 --> 01:36:58,810 >> Portanto, esta é uma lógica programa na medida em que agora 1941 01:36:58,810 --> 01:37:01,940 Estou verificando logicamente para Este valor ou esse valor. 1942 01:37:01,940 --> 01:37:06,420 E eu não tenho que, necessariamente, vir para cima com mais dois ifs ou então ifs. 1943 01:37:06,420 --> 01:37:09,960 Eu pode realmente combinam um pouco da Relacionado com lógica em conjunto desta maneira. 1944 01:37:09,960 --> 01:37:11,950 Portanto, este seria melhor concebido de simplesmente 1945 01:37:11,950 --> 01:37:17,490 dizendo, se C é igual a menor caso y, imprimir sim, mais se c é igual a capital de Y, 1946 01:37:17,490 --> 01:37:20,074 imprimir sim, mais se c é igual a lower-- em outras palavras, 1947 01:37:20,074 --> 01:37:21,990 você não tem que ter mais e mais filiais. 1948 01:37:21,990 --> 01:37:28,840 É possível combinar algumas das equivalente Logicamente, como ramos desta forma. 1949 01:37:28,840 --> 01:37:34,150 >> Então, vamos dar uma olhada em apenas um ingrediente final, uma construção final, 1950 01:37:34,150 --> 01:37:34,847 que permite C. 1951 01:37:34,847 --> 01:37:36,930 E nós vamos voltar no futuro, para outros ainda. 1952 01:37:36,930 --> 01:37:41,400 E então nós vamos concluir, olhando por não a correção de code-- 1953 01:37:41,400 --> 01:37:46,070 como obter o código de trabalho-- mas o design de código, e plantar as sementes no início. 1954 01:37:46,070 --> 01:37:51,337 >> Então deixe-me ir em frente e abrir um novo arquivo aqui. 1955 01:37:51,337 --> 01:37:51,920 Você sabe o que? 1956 01:37:51,920 --> 01:37:54,450 Eu estou indo para reimplementar que mesmo programa, 1957 01:37:54,450 --> 01:37:55,940 mas utilizando uma construção diferente. 1958 01:37:55,940 --> 01:38:00,110 >> Então me deixe rapidamente dar-me Acesso para incluir CS50.h 1959 01:38:00,110 --> 01:38:04,150 para a biblioteca de CS50, Io.h padrão para printf. 1960 01:38:04,150 --> 01:38:06,510 Dá-me o meu void main int. 1961 01:38:06,510 --> 01:38:09,310 E então para cá, vamos me ir em frente e fazer isso. 1962 01:38:09,310 --> 01:38:12,010 >> Char c recebe obter char, como antes. 1963 01:38:12,010 --> 01:38:16,770 E eu vou usar uma nova construção agora-- mudar, na qual personagem? 1964 01:38:16,770 --> 01:38:19,820 Então interruptor é tipo como A mudança de um trilhos do trem. 1965 01:38:19,820 --> 01:38:22,070 Ou, na verdade, é uma espécie de uma se mais, se else if, 1966 01:38:22,070 --> 01:38:23,980 mas escrito um pouco diferente. 1967 01:38:23,980 --> 01:38:25,490 >> A chave parece com isso. 1968 01:38:25,490 --> 01:38:29,060 Você tem switch, e então o que caracteres ou número que deseja para olhar, 1969 01:38:29,060 --> 01:38:32,000 em seguida, algumas chaves como em Zero, apenas dizer que fazer essas coisas. 1970 01:38:32,000 --> 01:38:33,480 E então você tem casos diferentes. 1971 01:38:33,480 --> 01:38:34,830 >> Você não usar if e else. 1972 01:38:34,830 --> 01:38:37,050 Você literalmente usar o caso da palavra. 1973 01:38:37,050 --> 01:38:38,790 E você diria algo como isto. 1974 01:38:38,790 --> 01:38:43,820 >> Assim, no caso de um minúsculas Y, ou no caso de um capital Y, 1975 01:38:43,820 --> 01:38:47,350 vá em frente e imprimir sim. 1976 01:38:47,350 --> 01:38:49,020 E, em seguida, sair do switch. 1977 01:38:49,020 --> 01:38:49,580 É isso aí. 1978 01:38:49,580 --> 01:38:50,880 Foram realizadas. 1979 01:38:50,880 --> 01:38:57,270 >> Else if, por assim dizer, minúsculas n, ou de capital N, 1980 01:38:57,270 --> 01:39:02,560 então vá em frente e imprimir sair, não, e, em seguida, quebrar. 1981 01:39:02,560 --> 01:39:08,022 Else-- e este tipo de é o caso padrão indeed-- printf error-- 1982 01:39:08,022 --> 01:39:10,980 e apenas para uma boa medida, embora logicamente esta pausa não é necessário 1983 01:39:10,980 --> 01:39:12,896 porque nós estamos no fim do interruptor de qualquer maneira, 1984 01:39:12,896 --> 01:39:14,520 Agora estou quebrando fora do switch. 1985 01:39:14,520 --> 01:39:16,280 Portanto, este parece um pouco diferente. 1986 01:39:16,280 --> 01:39:18,272 >> Mas, logicamente, é efectivamente equivalente. 1987 01:39:18,272 --> 01:39:19,980 E por que você usaria um sobre o outro? 1988 01:39:19,980 --> 01:39:23,220 Às vezes, apenas preferência pessoal, por vezes, a estética, 1989 01:39:23,220 --> 01:39:25,420 se eu olho para esta Agora, há algo 1990 01:39:25,420 --> 01:39:27,510 a ser dito para o legibilidade deste código. 1991 01:39:27,510 --> 01:39:30,690 Quer dizer, não importa o fato de que este código é novo para muitos de nós no quarto. 1992 01:39:30,690 --> 01:39:33,515 >> Mas é apenas uma espécie de é bonito. 1993 01:39:33,515 --> 01:39:37,760 Você vê minúsculas y, capital de Y, minúsculas n, padrão de capital N, 1994 01:39:37,760 --> 01:39:40,150 ele só tipo de saltos para fora em você de uma maneira 1995 01:39:40,150 --> 01:39:42,200 que, sem dúvida, talvez o exemplo anterior 1996 01:39:42,200 --> 01:39:45,780 com as ifs, e as barras verticais, e os ifs outra pessoa, pode não ter. 1997 01:39:45,780 --> 01:39:51,600 Portanto, esta é realmente uma questão de pessoal escolha, realmente, ou a legibilidade, 1998 01:39:51,600 --> 01:39:52,360 do código. 1999 01:39:52,360 --> 01:39:58,230 >> Mas em termos de funcionalidade, deixe-me vá em frente e fazer um interruptor, barra dot 2000 01:39:58,230 --> 01:40:05,830 switch, e agora digitar y minúsculas, capital de Y, minúsculas n, capital de N, 2001 01:40:05,830 --> 01:40:09,250 David, tente novamente, porque isso é não um único caractere. 2002 01:40:09,250 --> 01:40:12,050 Vamos fazer x, erro, como esperado. 2003 01:40:12,050 --> 01:40:15,640 E, logically-- e isso é algo Gostaria de incentivar em general-- mesmo 2004 01:40:15,640 --> 01:40:17,790 embora estamos apenas arranhando a superfície de algumas destas características. 2005 01:40:17,790 --> 01:40:20,560 >> E isso pode não ser óbvio quando você -se sentar no teclado, 2006 01:40:20,560 --> 01:40:21,370 Como é que isso funciona? 2007 01:40:21,370 --> 01:40:22,240 O que isso faz? 2008 01:40:22,240 --> 01:40:25,630 A bela coisa sobre ter um laptop ou desktop, ou o acesso 2009 01:40:25,630 --> 01:40:29,290 a um computador com um compilador, e com um editor de código como este, 2010 01:40:29,290 --> 01:40:32,990 é quase sempre você pode responder a estas perguntas para si mesmo apenas tentando. 2011 01:40:32,990 --> 01:40:36,570 >> Por exemplo, se o retórico questão em apreço foram, 2012 01:40:36,570 --> 01:40:39,540 o que acontece se você esquecer suas declarações de ruptura? 2013 01:40:39,540 --> 01:40:41,400 Que é realmente um muito comum coisa a fazer, 2014 01:40:41,400 --> 01:40:43,540 porque não parece como você realmente precisa deles. 2015 01:40:43,540 --> 01:40:46,790 Eles realmente não completar o seu pensava como um parêntese ou encaracolado 2016 01:40:46,790 --> 01:40:47,714 cinta faz. 2017 01:40:47,714 --> 01:40:49,630 Vamos ir em frente e recompilar o código e ver. 2018 01:40:49,630 --> 01:40:53,690 Então faça interruptor, interruptor de corte de ponto. 2019 01:40:53,690 --> 01:40:56,435 Vamos escrever em letras minúsculas y, a top case, Enter. 2020 01:40:56,435 --> 01:40:59,390 2021 01:40:59,390 --> 01:41:00,700 Então eu digitei y. 2022 01:41:00,700 --> 01:41:04,420 >> O programa disse que sim, não, de erro, como se estivesse mudando sua mente. 2023 01:41:04,420 --> 01:41:09,280 Mas que tipo de era, porque o que acontece com um interruptor é o primeiro caso que 2024 01:41:09,280 --> 01:41:13,899 jogo significa, essencialmente, hey computador, executar todo o código abaixo dela. 2025 01:41:13,899 --> 01:41:16,690 E se você não diz ruptura, ou não digo ruptura, ou não dizem ruptura, 2026 01:41:16,690 --> 01:41:19,540 o computador vai explodir através de todas as linhas 2027 01:41:19,540 --> 01:41:22,779 e executar todos eles até chega a esse chaveta. 2028 01:41:22,779 --> 01:41:24,320 Assim, os freios são, de fato, necessário. 2029 01:41:24,320 --> 01:41:27,120 Mas um takeaway aqui é, quando Em caso de dúvida, tente algo. 2030 01:41:27,120 --> 01:41:29,510 Talvez salvar seu código em primeiro lugar, ou salvá-lo em um arquivo extra 2031 01:41:29,510 --> 01:41:32,930 se você está realmente preocupado com bagunçar e ter que recuperar 2032 01:41:32,930 --> 01:41:34,430 o trabalho que você sabe que está funcionando. 2033 01:41:34,430 --> 01:41:35,410 >> Mas tentar coisas. 2034 01:41:35,410 --> 01:41:38,074 E não ser tão medo, talvez, do que o computador pode fazer, 2035 01:41:38,074 --> 01:41:39,490 ou que você pode quebrar alguma coisa. 2036 01:41:39,490 --> 01:41:42,790 Você sempre pode voltar a alguma versão anterior. 2037 01:41:42,790 --> 01:41:45,640 >> Então vamos acabar vendo para o desenho de código. 2038 01:41:45,640 --> 01:41:49,020 Nós temos essa capacidade agora de escrever condições e loops de gravação, 2039 01:41:49,020 --> 01:41:50,850 e variáveis, e funções de chamada. 2040 01:41:50,850 --> 01:41:54,590 Então, francamente, estamos espécie de volta ao onde estávamos há uma semana com o Scratch, 2041 01:41:54,590 --> 01:42:00,120 embora com um textuais menos convincentes ambiente do que zero permite. 2042 01:42:00,120 --> 01:42:03,990 >> Mas note a rapidez com que você adquiriu que o vocabulário, mesmo que seja 2043 01:42:03,990 --> 01:42:07,570 vai levar um pouco de tempo para afundar, de modo que agora podemos usar esse vocabulário 2044 01:42:07,570 --> 01:42:10,320 para escrever programas mais interessantes. 2045 01:42:10,320 --> 01:42:12,940 E vamos dar um passo de bebê para que, como se segue. 2046 01:42:12,940 --> 01:42:14,890 Deixe-me ir em frente e criar um novo arquivo aqui. 2047 01:42:14,890 --> 01:42:17,750 >> Vou chamar essa prototype.c, e introduzir 2048 01:42:17,750 --> 01:42:20,954 pela primeira vez, a capacidade para fazer as suas próprias funções. 2049 01:42:20,954 --> 01:42:22,870 Alguns de vocês podem ter feito isso com o Scratch, 2050 01:42:22,870 --> 01:42:25,430 através do qual você pode criar o seu blocos personalizados próprios em zero, 2051 01:42:25,430 --> 01:42:27,892 e, em seguida, arrastá-los para lugar onde quer que você gostaria em C. 2052 01:42:27,892 --> 01:42:30,100 E na maior parte da programação idiomas, você pode fazer exatamente 2053 01:42:30,100 --> 01:42:33,580 isso-- fazer suas próprias funções, se eles já não existem. 2054 01:42:33,580 --> 01:42:38,660 >> Assim, por exemplo, deixe-me ir em frente e incluem CS50.h, e incluir 2055 01:42:38,660 --> 01:42:43,110 padrão io.h, int void main. 2056 01:42:43,110 --> 01:42:46,020 E agora temos uma espaço reservado pronto para ir. 2057 01:42:46,020 --> 01:42:48,550 I manter as coisas de impressão como os nomes das pessoas hoje. 2058 01:42:48,550 --> 01:42:51,910 E que se sente como-- Não seria bom se houver 2059 01:42:51,910 --> 01:42:53,936 eram uma função chamada nome de impressão? 2060 01:42:53,936 --> 01:42:55,060 Eu não tenho de usar printf. 2061 01:42:55,060 --> 01:42:56,976 Eu não tenho a lembrar todos os códigos de formato. 2062 01:42:56,976 --> 01:43:00,050 Por que não eu, ou porque não alguém antes de mim, 2063 01:43:00,050 --> 01:43:02,980 criar uma função chamada de impressão nome, dado algum nome, 2064 01:43:02,980 --> 01:43:03,980 simplesmente imprime-lo para fora? 2065 01:43:03,980 --> 01:43:08,700 >> Em outras palavras, se eu digo, hey, computador, dá-me uma corda 2066 01:43:08,700 --> 01:43:11,870 pedindo ao usuário para tal, via função de cadeia get de CS50. 2067 01:43:11,870 --> 01:43:15,090 Hey, computador, colocar essa string no a variável no lado esquerdo, 2068 01:43:15,090 --> 01:43:16,150 e chamá-lo s. 2069 01:43:16,150 --> 01:43:22,150 E, em seguida, hey computador, vá em frente e imprimir que o nome de pessoa, feito. 2070 01:43:22,150 --> 01:43:26,240 >> Agora, seria bom, porque Neste programa, apropriadamente chamado, 2071 01:43:26,240 --> 01:43:29,170 me diz o que é suposto fazer por meio de nomes daqueles função. 2072 01:43:29,170 --> 01:43:32,930 Deixe-me ir e fazer protótipo, Enter. 2073 01:43:32,930 --> 01:43:34,930 E, infelizmente, isso não vai voar. 2074 01:43:34,930 --> 01:43:39,430 >> Prototype.c, linha 7, personagem 5, de erro, declaração implícita 2075 01:43:39,430 --> 01:43:42,960 da função nome de impressão é inválido na C99, C99 2076 01:43:42,960 --> 01:43:45,130 significa uma versão de C que saiu em 1999. 2077 01:43:45,130 --> 01:43:45,730 Isso é tudo. 2078 01:43:45,730 --> 01:43:48,780 >> Então, eu não sei o que tudo isso significa ainda. 2079 01:43:48,780 --> 01:43:50,810 Mas eu reconheço erro no vermelho. 2080 01:43:50,810 --> 01:43:51,770 Isso é bastante óbvio. 2081 01:43:51,770 --> 01:43:53,769 >> E parece que, com o personagem verde aqui, 2082 01:43:53,769 --> 01:43:57,520 o problema é com o nome de impressão, aberta Paren s, Paren próximos, e vírgula. 2083 01:43:57,520 --> 01:44:01,800 Mas a declaração implícita de função fizemos ver brevemente mais cedo. 2084 01:44:01,800 --> 01:44:04,880 Isto significa, simplesmente, que Clang não sabe o que quero dizer. 2085 01:44:04,880 --> 01:44:09,000 >> Eu usei uma palavra do vocabulário que é nunca vi ou foi ensinado antes. 2086 01:44:09,000 --> 01:44:11,950 E então eu preciso ensiná-lo o que esta função significa. 2087 01:44:11,950 --> 01:44:13,590 Então, eu estou indo para ir em frente e fazer isso. 2088 01:44:13,590 --> 01:44:17,970 >> Eu estou indo para ir em frente e implementar minha própria função chamada Nome Impresso. 2089 01:44:17,970 --> 01:44:24,720 E eu vou dizer, como se segue, que ele faz isso, printf, Olá, cento 2090 01:44:24,720 --> 01:44:27,760 s, barra invertida n, nome, ponto e vírgula. 2091 01:44:27,760 --> 01:44:29,250 Então, o que eu acabei de fazer? 2092 01:44:29,250 --> 01:44:31,325 >> Então não é que, para implementar sua própria função, 2093 01:44:31,325 --> 01:44:33,845 que tipo de emprestar alguns dos a mesma estrutura principal 2094 01:44:33,845 --> 01:44:35,720 que temos sido apenas tida como certa, e eu 2095 01:44:35,720 --> 01:44:37,730 sabe apenas copiando e colar muito bonito o que 2096 01:44:37,730 --> 01:44:39,170 Eu tenho escrito no passado. 2097 01:44:39,170 --> 01:44:40,570 Mas observe o padrão aqui. 2098 01:44:40,570 --> 01:44:43,750 Int, Main, Vazio, vamos desmembrar em pouco tempo o que isso realmente significa. 2099 01:44:43,750 --> 01:44:46,160 >> Mas para hoje, apenas notar o paralelismo. 2100 01:44:46,160 --> 01:44:48,210 Vazio, o nome de impressão, nome de cadeia, por isso há 2101 01:44:48,210 --> 01:44:50,310 uma palavra-chave roxo, que vamos começar 2102 01:44:50,310 --> 01:44:54,067 chamando um tipo de retorno, o nome do a função, e depois a entrada. 2103 01:44:54,067 --> 01:44:56,400 Então, na verdade, podemos destilar este tipo de como na semana passada 2104 01:44:56,400 --> 01:44:59,030 como, este é o nome ou o algoritmo do código estamos 2105 01:44:59,030 --> 01:45:00,761 indo o write-- algoritmo subjacente 2106 01:45:00,761 --> 01:45:02,010 o código que vai escrever. 2107 01:45:02,010 --> 01:45:03,180 >> Esta é a sua entrada. 2108 01:45:03,180 --> 01:45:04,670 Esta é a sua saída. 2109 01:45:04,670 --> 01:45:08,730 Esta função, o nome de impressão, é concebidos para ter uma string chamada nome, 2110 01:45:08,730 --> 01:45:11,350 ou o que quer, como entrada, e em seguida anuladas. 2111 01:45:11,350 --> 01:45:13,904 Ela não retorna nada, como obter corda ou obter int faz. 2112 01:45:13,904 --> 01:45:15,570 Então ele vai me dar algo de volta. 2113 01:45:15,570 --> 01:45:17,960 É só vai ter um efeito secundário, por assim dizer, 2114 01:45:17,960 --> 01:45:19,570 de imprimir o nome de uma pessoa. 2115 01:45:19,570 --> 01:45:22,260 Então, observe, linha 7, I pode chamar o nome de impressão. 2116 01:45:22,260 --> 01:45:25,920 Linha 10, eu posso definir ou implementar nome de impressão. 2117 01:45:25,920 --> 01:45:28,450 Mas, infelizmente, isso não é suficiente. 2118 01:45:28,450 --> 01:45:31,230 >> Deixe-me ir em frente e recompilar isto depois de salvar. 2119 01:45:31,230 --> 01:45:33,910 Whoa, agora, eu fiz isso pior, ao que parece. 2120 01:45:33,910 --> 01:45:37,027 declaração de modo implícito de nome da função de impressão é inválido. 2121 01:45:37,027 --> 01:45:38,360 E, novamente, há mais erros. 2122 01:45:38,360 --> 01:45:41,430 Mas como eu advertiu anteriormente, mesmo se você ficar sobrecarregado com, 2123 01:45:41,430 --> 01:45:44,850 ou um pouco triste ver tantos erros, se concentrar apenas no primeiro 2124 01:45:44,850 --> 01:45:47,500 inicialmente, porque ele só poderia ter tido um efeito em cascata. 2125 01:45:47,500 --> 01:45:51,970 Assim, C, ou mais especificamente Clang, continua a não reconhecer o nome de impressão. 2126 01:45:51,970 --> 01:45:54,580 >> E isso é porque Clang, por design, é uma espécie de idiota. 2127 01:45:54,580 --> 01:45:56,280 Ele só faz o que você diga a ele para fazer. 2128 01:45:56,280 --> 01:46:00,950 E isso só faz isso na ordem em que você diga a ele para fazer. 2129 01:46:00,950 --> 01:46:05,270 >> Então, eu tenho definido principal na linha de quatro, como temos vindo a fazer bastante freqüência. 2130 01:46:05,270 --> 01:46:07,980 Eu defini o nome de impressão na linha 10. 2131 01:46:07,980 --> 01:46:11,793 Mas eu estou tentando usar nome de impressão on-line sete. 2132 01:46:11,793 --> 01:46:13,670 >> É muito cedo, ainda não existe. 2133 01:46:13,670 --> 01:46:19,150 Assim eu poderia ser inteligente, e ser como, OK, então vamos apenas jogar junto, 2134 01:46:19,150 --> 01:46:23,680 e mover nome de impressão para cima aqui, e recompilar. 2135 01:46:23,680 --> 01:46:24,550 Meu Deus. 2136 01:46:24,550 --> 01:46:25,260 Funcionou. 2137 01:46:25,260 --> 01:46:26,670 Era tão simples como isso. 2138 01:46:26,670 --> 01:46:28,120 >> Mas a lógica é exatamente isso. 2139 01:46:28,120 --> 01:46:30,870 Você tem de ensinar o que Clang é definindo a função primeira. 2140 01:46:30,870 --> 01:46:31,920 Em seguida, você pode usá-lo. 2141 01:46:31,920 --> 01:46:33,940 Mas, francamente, este se sente como uma ladeira escorregadia. 2142 01:46:33,940 --> 01:46:35,773 >> Assim, cada vez que eu corro em um problema, eu sou apenas 2143 01:46:35,773 --> 01:46:39,450 vai destacar e copiar o código Eu escrevi, cortá-lo e colá-lo aqui. 2144 01:46:39,450 --> 01:46:41,370 E, com certeza, poderíamos inventar alguns cenários 2145 01:46:41,370 --> 01:46:43,286 onde uma função pode precisa chamar outro. 2146 01:46:43,286 --> 01:46:46,030 E você simplesmente não pode colocar todos os função acima de qualquer outro. 2147 01:46:46,030 --> 01:46:47,930 >> Então não é que há uma solução melhor. 2148 01:46:47,930 --> 01:46:50,100 Nós podemos deixar este ser. 2149 01:46:50,100 --> 01:46:53,677 E, francamente, é geralmente bom, e conveniente, e um bom design 2150 01:46:53,677 --> 01:46:56,760 para colocar principal em primeiro lugar, porque, novamente, principal apenas como quando a bandeira verde clicado, 2151 01:46:56,760 --> 01:46:59,027 que é a função que é executado por padrão. 2152 01:46:59,027 --> 01:47:01,110 Assim, você pode muito bem colocar -lo na parte superior do arquivo 2153 01:47:01,110 --> 01:47:03,560 de modo que quando você ou qualquer outro ser humano olha para o arquivo 2154 01:47:03,560 --> 01:47:06,360 você sabe o que está acontecendo apenas lendo principal em primeiro lugar. 2155 01:47:06,360 --> 01:47:15,360 Então não é que, podemos dizer Clang proativamente, hey, Clang, na linha quatro, 2156 01:47:15,360 --> 01:47:17,940 Eu prometo para implementar uma função chamada impressão 2157 01:47:17,940 --> 01:47:22,600 Nome que leva um nome de cadeia chamada como entrada, e retorna nada, nula. 2158 01:47:22,600 --> 01:47:24,770 E eu vou dar a volta a implementá-lo mais tarde. 2159 01:47:24,770 --> 01:47:25,680 >> Aí vem Principal. 2160 01:47:25,680 --> 01:47:29,130 Principal agora na linha 9 pode usar Imprimir Nome porque Clang 2161 01:47:29,130 --> 01:47:32,600 é confiar em que, eventualmente, ele irá encontrar a definição 2162 01:47:32,600 --> 01:47:34,880 da execução da impressão Name. 2163 01:47:34,880 --> 01:47:37,390 Então, depois de salvar meu arquivo, vamos -me ir em frente e fazer protótipo, 2164 01:47:37,390 --> 01:47:38,498 parece ser bom neste momento. 2165 01:47:38,498 --> 01:47:43,470 Dot cortar, protótipo, deixe-me vá em frente e digite um nome. 2166 01:47:43,470 --> 01:47:48,440 David, Olá David, Zamila, Olá Zamila, e, na verdade, agora ele funciona. 2167 01:47:48,440 --> 01:47:52,200 >> Assim, o ingrediente aqui é que nós temos fez uma função personalizada, como um costume 2168 01:47:52,200 --> 01:47:54,219 bloco zero estamos chamando. 2169 01:47:54,219 --> 01:47:57,010 Mas, ao contrário do risco onde você pode apenas criá-lo e começar a usá-lo, 2170 01:47:57,010 --> 01:47:59,330 agora temos de ser um pouco mais pedante, 2171 01:47:59,330 --> 01:48:03,410 e realmente treinar Clang de usar, ou para esperar. 2172 01:48:03,410 --> 01:48:09,140 Agora, como um aparte, por que todo esse tempo tem temos sido cegamente na fé incluindo 2173 01:48:09,140 --> 01:48:12,170 CS50.h, e incluindo io.h padrão? 2174 01:48:12,170 --> 01:48:15,190 >> Bem, ao que parece, entre algumas outras coisas, 2175 01:48:15,190 --> 01:48:18,550 tudo o que está naqueles dot h arquivos, que acontecerá a ser arquivos. 2176 01:48:18,550 --> 01:48:20,460 Eles são arquivos de cabeçalho, por assim dizer. 2177 01:48:20,460 --> 01:48:23,270 Eles estão ainda escrito em C. Mas eles são um tipo diferente de arquivo. 2178 01:48:23,270 --> 01:48:28,690 >> Por enquanto, você pode muito bem assumir que tudo o que está dentro de CS50.h 2179 01:48:28,690 --> 01:48:33,360 é alguns one-liners como este, não para funções chamadas Nome Impresso, 2180 01:48:33,360 --> 01:48:36,840 mas para obter String, Obter Float, e alguns outros. 2181 01:48:36,840 --> 01:48:41,510 E existem protótipos semelhantes, forros um, dentro de io.h padrão 2182 01:48:41,510 --> 01:48:46,241 para printf, que está agora em minha própria função Imprimir Nome. 2183 01:48:46,241 --> 01:48:49,490 Portanto, em outras palavras, todo este tempo nós temos acaba de ser cegamente copiar e colar 2184 01:48:49,490 --> 01:48:51,780 incluem isso, incluir que, o que está acontecendo? 2185 01:48:51,780 --> 01:48:55,310 Essas são apenas um tipo de pistas para Clang a que funções 2186 01:48:55,310 --> 01:49:00,170 são, de fato, implementada, apenas em outras posições diferentes ficheiros 2187 01:49:00,170 --> 01:49:02,440 em outra parte do sistema. 2188 01:49:02,440 --> 01:49:05,160 >> Então, nós temos implementado nome de impressão. 2189 01:49:05,160 --> 01:49:07,910 Ela tem esse efeito colateral de imprimir algo na tela. 2190 01:49:07,910 --> 01:49:10,170 Mas isso não acontece, na verdade, me dê algo de volta. 2191 01:49:10,170 --> 01:49:12,200 Como é que vamos a implementação de um programa que 2192 01:49:12,200 --> 01:49:14,510 não me dar algo de volta? 2193 01:49:14,510 --> 01:49:15,580 >> Bem, vamos tentar isso. 2194 01:49:15,580 --> 01:49:21,360 Deixe-me ir adiante e implementar um arquivo chamado return.c 2195 01:49:21,360 --> 01:49:24,530 para que possamos demonstrar como algo como Get String, ou obter Int, 2196 01:49:24,530 --> 01:49:27,340 é, na verdade, retornando algo de volta para o usuário. 2197 01:49:27,340 --> 01:49:29,840 Vamos em frente e definir void main int. 2198 01:49:29,840 --> 01:49:33,230 >> E, novamente, no futuro, vamos explicar o que isso int e esse vazio 2199 01:49:33,230 --> 01:49:34,090 é realmente fazendo. 2200 01:49:34,090 --> 01:49:35,840 Mas para hoje, vamos é um dado adquirido. 2201 01:49:35,840 --> 01:49:39,970 Eu estou indo para ir em frente e printf, para uma boa experiência do usuário, x é. 2202 01:49:39,970 --> 01:49:44,360 E então eu vou esperar para o do usuário para me dar x com get int. 2203 01:49:44,360 --> 01:49:48,459 >> E então eu estou indo para ir em frente e imprimir x ao quadrado. 2204 01:49:48,459 --> 01:49:50,500 Então, quando você só tem um teclado, as pessoas comumente 2205 01:49:50,500 --> 01:49:52,600 usar o pouco de cenoura símbolo no teclado 2206 01:49:52,600 --> 01:49:55,330 para representar o poder , ou o expoente. 2207 01:49:55,330 --> 01:49:58,960 Então x ao quadrado está presente i. 2208 01:49:58,960 --> 01:50:00,660 >> E agora eu vou fazer isso. 2209 01:50:00,660 --> 01:50:03,940 Eu poderia apenas fazer-- que é x quadrado? x quadrado é x vezes x. 2210 01:50:03,940 --> 01:50:06,690 >> E nós fizemos isso um pouco tempo atrás já hoje. 2211 01:50:06,690 --> 01:50:08,730 Este não se sente como tudo o que muito progresso. 2212 01:50:08,730 --> 01:50:09,570 Você sabe o que? 2213 01:50:09,570 --> 01:50:13,100 Vamos aproveitar um pouco dessa ideia da última vez de abstração. 2214 01:50:13,100 --> 01:50:16,080 >> Não seria bom se há uma função chamada 2215 01:50:16,080 --> 01:50:18,460 quadrado que faz exatamente isso? 2216 01:50:18,460 --> 01:50:20,640 Ainda, no final do dia, faz a mesma matemática. 2217 01:50:20,640 --> 01:50:22,410 Mas vamos abstrato embora a idéia de tomar 2218 01:50:22,410 --> 01:50:25,280 um número multiplicado pela outra, e apenas dar-lhe um nome, 2219 01:50:25,280 --> 01:50:27,360 como conciliar esse valor. 2220 01:50:27,360 --> 01:50:29,560 >> E, por outras palavras, em C, vamos criar uma função 2221 01:50:29,560 --> 01:50:32,660 chamado de quadrado que faz exatamente isso. 2222 01:50:32,660 --> 01:50:34,600 Vai ser chamado quadrado. 2223 01:50:34,600 --> 01:50:35,790 Ele vai levar um int. 2224 01:50:35,790 --> 01:50:37,820 E nós vamos será apenas chamá-lo n, por padrão. 2225 01:50:37,820 --> 01:50:39,403 >> Mas poderíamos chamá-lo de qualquer coisa que quisermos. 2226 01:50:39,403 --> 01:50:42,900 E tudo o que ele vai fazer, literalmente, é o retorno 2227 01:50:42,900 --> 01:50:45,810 o resultado de n vezes n. 2228 01:50:45,810 --> 01:50:48,980 Mas porque é retornando algo, que 2229 01:50:48,980 --> 01:50:53,690 é a palavra-chave em roxo temos nunca antes visto, I, na linha 11, 2230 01:50:53,690 --> 01:50:55,410 não pode simplesmente dizer nula neste momento. 2231 01:50:55,410 --> 01:51:01,320 >> Vazio, no exemplo que acabamos de ver em vez do nome de impressão, significa apenas, 2232 01:51:01,320 --> 01:51:02,190 faça alguma coisa. 2233 01:51:02,190 --> 01:51:04,170 Mas não me dê algo de volta. 2234 01:51:04,170 --> 01:51:06,790 Neste caso, eu quero para retornar N N vezes, 2235 01:51:06,790 --> 01:51:08,460 ou o que quer que seja, esse número. 2236 01:51:08,460 --> 01:51:12,460 >> Então eu não posso dizer, hey, computador, I retornar nada, o vazio. 2237 01:51:12,460 --> 01:51:16,166 Ele vai voltar, por natureza, um int. 2238 01:51:16,166 --> 01:51:17,790 E então isso é tudo o que está acontecendo aqui. 2239 01:51:17,790 --> 01:51:20,070 >> A entrada ao quadrado vai ser um int. 2240 01:51:20,070 --> 01:51:24,760 E para que possamos usá-lo, tem que tem um nome, N. Vai saída 2241 01:51:24,760 --> 01:51:26,240 um int que não precisa de um nome. 2242 01:51:26,240 --> 01:51:29,590 Podemos deixá-lo ao principal, ou quem quer que seja utilizando-me a lembrar este valor se 2243 01:51:29,590 --> 01:51:31,120 quer com a sua própria variável. 2244 01:51:31,120 --> 01:51:33,230 >> E, mais uma vez, a única nova palavra-chave aqui é Return. 2245 01:51:33,230 --> 01:51:34,480 E eu estou apenas fazendo um pouco de matemática. 2246 01:51:34,480 --> 01:51:41,825 Se eu realmente queria ser desnecessário, Eu poderia dizer do produto int recebe n vezes n. 2247 01:51:41,825 --> 01:51:44,170 >> E então eu poderia dizer, o produto retornar. 2248 01:51:44,170 --> 01:51:47,360 Mas, novamente, para o meu ponto anterior do isso apenas não ser bom design-- 2249 01:51:47,360 --> 01:51:50,060 como, por introduzir um nome, um símbolo, como produto, 2250 01:51:50,060 --> 01:51:51,570 apenas para devolvê-lo imediatamente? 2251 01:51:51,570 --> 01:51:53,670 É um pouco mais limpo, um pouco mais apertado, por isso, 2252 01:51:53,670 --> 01:51:59,380 para falar, só para dizer retorno n vezes n, livrar-se desta linha completamente. 2253 01:51:59,380 --> 01:52:02,860 >> E é apenas menos código para ler, menos oportunidades para erros. 2254 01:52:02,860 --> 01:52:05,180 E vamos ver se este na verdade, trabalha agora. 2255 01:52:05,180 --> 01:52:09,380 Agora, eu estou indo para ir em frente e fazer o retorno. 2256 01:52:09,380 --> 01:52:11,460 >> Uh-oh, declaração implícita da função. 2257 01:52:11,460 --> 01:52:14,080 Eu cometi este erro antes, não é grande coisa. 2258 01:52:14,080 --> 01:52:18,950 Deixe-me apenas digitar ou destacar e copiar, exatamente a mesma função protótipo, 2259 01:52:18,950 --> 01:52:21,342 ou assinatura, da função até aqui. 2260 01:52:21,342 --> 01:52:22,800 Ou eu poderia mover toda a função. 2261 01:52:22,800 --> 01:52:23,841 >> Mas isso é um pouco preguiçoso. 2262 01:52:23,841 --> 01:52:24,870 Portanto, não vamos fazer isso. 2263 01:52:24,870 --> 01:52:27,960 Agora, deixe-me fazer o retorno mais uma vez, ponto de retorno barra. 2264 01:52:27,960 --> 01:52:32,790 >> x é 2. x ao quadrado é 4. x é 3. x ao quadrado é 9. 2265 01:52:32,790 --> 01:52:35,300 E a função parece agora estar funcionando. 2266 01:52:35,300 --> 01:52:36,550 Então, qual é a diferença aqui? 2267 01:52:36,550 --> 01:52:42,520 Eu tenho uma função que é chamado de quadrado, neste caso, que eu pus em uma entrada. 2268 01:52:42,520 --> 01:52:43,830 E eu voltar uma saída. 2269 01:52:43,830 --> 01:52:46,210 E ainda, anteriormente, se Eu abro outro exemplo 2270 01:52:46,210 --> 01:52:51,640 de mais cedo, o que foi chamado prototype.c, 2271 01:52:51,640 --> 01:52:54,770 Eu tinha o nome de impressão, que voltou vazio, por assim dizer, 2272 01:52:54,770 --> 01:52:58,730 Ou ele retornou nada e simplesmente tinha um efeito colateral. 2273 01:52:58,730 --> 01:53:00,230 >> Então, o que está acontecendo aqui? 2274 01:53:00,230 --> 01:53:03,520 Bem, considere a função obter cadeia por apenas um momento. 2275 01:53:03,520 --> 01:53:06,570 Temos vindo a utilizar a função obter seqüência da seguinte maneira. 2276 01:53:06,570 --> 01:53:10,464 >> Tivemos uma função de obter corda, como incluir CS50.h, 2277 01:53:10,464 --> 01:53:16,624 incluem padrão io.h, int, principal, nula. 2278 01:53:16,624 --> 01:53:18,790 E, em seguida, cada vez que eu tenho chamada cadeia get até agora, 2279 01:53:18,790 --> 01:53:23,260 Eu disse algo como, corda s recebe obter corda, porque get string-- 2280 01:53:23,260 --> 01:53:27,880 Vamos chamar essa cadeia get get.c-- -se devolve uma cadeia que posso, então, 2281 01:53:27,880 --> 01:53:32,050 usar, e dizer, Olá, vírgula, por cento s, barra invertida n, s. 2282 01:53:32,050 --> 01:53:35,660 >> Portanto, este é o mesmo exemplo, realmente, que tínhamos antes. 2283 01:53:35,660 --> 01:53:37,920 Portanto, obter seqüência retorna um valor. 2284 01:53:37,920 --> 01:53:41,260 Mas há pouco, seqüência de impressão não retorna um valor. 2285 01:53:41,260 --> 01:53:42,721 Simplesmente tem um efeito colateral. 2286 01:53:42,721 --> 01:53:44,220 Portanto, esta é uma diferença fundamental. 2287 01:53:44,220 --> 01:53:46,710 Nós vimos diferente tipos de funções agora, 2288 01:53:46,710 --> 01:53:49,490 alguns dos quais ter retornado valores, alguns dos quais não. 2289 01:53:49,490 --> 01:53:51,890 Então talvez seja string, ou int ou float. 2290 01:53:51,890 --> 01:53:53,480 Ou talvez seja apenas vazio. 2291 01:53:53,480 --> 01:53:55,710 >> E é a diferença que estas funções que 2292 01:53:55,710 --> 01:53:59,940 obter dados e retornar um valor são realmente trazendo algo de volta para a mesa, 2293 01:53:59,940 --> 01:54:01,110 por assim dizer. 2294 01:54:01,110 --> 01:54:03,710 Então, vamos em frente e olhar para um conjunto final 2295 01:54:03,710 --> 01:54:09,129 de exemplos que dá uma sensação, agora, como podemos, de fato, abstrato melhor, 2296 01:54:09,129 --> 01:54:11,670 e melhor, e melhor, ou mais, e mais, e mais, a fim 2297 01:54:11,670 --> 01:54:13,810 para escrever, em última análise, um código melhor. 2298 01:54:13,810 --> 01:54:16,860 Vamos em frente, e no espírito do Scratch, faça o seguinte. 2299 01:54:16,860 --> 01:54:21,700 >> Deixe-me ir em frente e incluem CS50.h e IO.h. padrão 2300 01:54:21,700 --> 01:54:24,010 Deixe-me ir em frente e dar me um int, principal, nula. 2301 01:54:24,010 --> 01:54:27,380 E deixe-me ir em frente, chame este cough.c. 2302 01:54:27,380 --> 01:54:35,510 >> E deixe-me ir em frente e apenas como zero, imprima a tosse / n. 2303 01:54:35,510 --> 01:54:37,170 E eu quero fazer isso três vezes. 2304 01:54:37,170 --> 01:54:39,670 Então, eu estou, é claro, só vai para copiar e colar três vezes. 2305 01:54:39,670 --> 01:54:46,440 Estou indo agora para fazer tosse tosse barra de ponto. 2306 01:54:46,440 --> 01:54:50,120 Vamos dar-me um pouco mais de espaço aqui, Enter, tosse, tosse, tosse. 2307 01:54:50,120 --> 01:54:53,970 >> Há, obviamente, já um oportunidade de melhoria. 2308 01:54:53,970 --> 01:54:55,679 Copiei e colei algumas vezes hoje. 2309 01:54:55,679 --> 01:54:58,261 Mas isso foi só para que eu não fiz tem que digitar quantos caracteres. 2310 01:54:58,261 --> 01:55:00,250 Eu ainda mudou o que essas linhas de código são. 2311 01:55:00,250 --> 01:55:04,240 >> Estes três linhas são idênticos, que se sente preguiçoso e de fato é, 2312 01:55:04,240 --> 01:55:07,110 e provavelmente não é a abordagem correta. 2313 01:55:07,110 --> 01:55:11,029 Assim, com o ingrediente poderíamos melhorar esse código? 2314 01:55:11,029 --> 01:55:12,570 Não temos de copiar e colar o código. 2315 01:55:12,570 --> 01:55:15,070 >> E, na verdade, quando você sente -se copiar e colar, 2316 01:55:15,070 --> 01:55:17,700 e nem mesmo alterar o código, chances são de que há uma maneira melhor. 2317 01:55:17,700 --> 01:55:19,470 E, na verdade, não existe. 2318 01:55:19,470 --> 01:55:22,510 Deixe-me ir em frente e fazer um loop for, mesmo que a sintaxe não pode 2319 01:55:22,510 --> 01:55:24,570 vem naturalmente ainda. 2320 01:55:24,570 --> 01:55:29,494 >> Faça isso três vezes, simplesmente fazendo o following-- 2321 01:55:29,494 --> 01:55:31,160 E acontece que eu sei que isso a partir da prática. 2322 01:55:31,160 --> 01:55:32,810 Mas temos uma série de exemplos agora. 2323 01:55:32,810 --> 01:55:34,950 E você vai ver on-line mais referências fixas. 2324 01:55:34,950 --> 01:55:37,790 >> Esta é a sintaxe na linha 6, que bem como do risco que se repete 2325 01:55:37,790 --> 01:55:40,090 bloco, repita as seguintes três vezes. 2326 01:55:40,090 --> 01:55:41,340 É um pouco mágico para agora. 2327 01:55:41,340 --> 01:55:43,050 Mas isso vai ficar mais, e mais familiar. 2328 01:55:43,050 --> 01:55:45,050 >> E vai repetir linha de oito por três vezes, 2329 01:55:45,050 --> 01:55:52,390 de modo que se eu re-compilar make tosse, dot cortar tosse, tosse, tosse, tosse. 2330 01:55:52,390 --> 01:55:54,030 Ele ainda funciona da mesma maneira. 2331 01:55:54,030 --> 01:55:55,550 Então, isso é tudo muito bem e bom. 2332 01:55:55,550 --> 01:55:58,200 Mas isso não é muito abstraída. 2333 01:55:58,200 --> 01:55:59,371 >> É perfeitamente correto. 2334 01:55:59,371 --> 01:56:01,370 Mas parece que há poderia ser uma oportunidade, 2335 01:56:01,370 --> 01:56:03,750 como no mundo de Zero, ao tipo de início 2336 01:56:03,750 --> 01:56:07,530 adicionar alguns semântica para que Eu não apenas ter algum laço for, 2337 01:56:07,530 --> 01:56:09,867 e uma função que diz tossir ou não tossir. 2338 01:56:09,867 --> 01:56:10,450 Você sabe o que? 2339 01:56:10,450 --> 01:56:12,620 Deixe-me tentar ser um pouco mais frio do que isso, 2340 01:56:12,620 --> 01:56:16,090 e realmente escrever uma função que tem alguns efeitos colaterais, chamá-lo tossir. 2341 01:56:16,090 --> 01:56:20,830 >> E ela não tem entrada e não retorna nenhum valor como saída. 2342 01:56:20,830 --> 01:56:22,680 Mas você sabe o que ele faz? 2343 01:56:22,680 --> 01:56:29,370 Ele faz isto-- printf, entre aspas, tossir. 2344 01:56:29,370 --> 01:56:32,380 >> E agora aqui em cima, eu vou ir em frente e para int, 2345 01:56:32,380 --> 01:56:36,070 i recebe zero, i inferior a 3, i plus plus. 2346 01:56:36,070 --> 01:56:39,770 Eu estou indo para não fazer printf, que é sem dúvida uma implementação de baixo nível 2347 01:56:39,770 --> 01:56:40,270 detalhe. 2348 01:56:40,270 --> 01:56:41,353 Eu não me importo como tossir. 2349 01:56:41,353 --> 01:56:43,240 Eu só quero usar a função de tosse. 2350 01:56:43,240 --> 01:56:44,840 E eu estou indo só para chamar tosse. 2351 01:56:44,840 --> 01:56:46,204 >> Agora, observe a dicotomia. 2352 01:56:46,204 --> 01:56:49,370 Quando você chamar uma função, se não o fizer quero dar-lhe entradas, totalmente bem. 2353 01:56:49,370 --> 01:56:51,780 Basta fazer o parêntese aberto, perto parêntese, e está feito. 2354 01:56:51,780 --> 01:56:56,271 >> Quando você define uma função, ou declarar um protótipo de função, 2355 01:56:56,271 --> 01:56:58,770 Se você sabe de antemão que não é vai tomar quaisquer argumentos, 2356 01:56:58,770 --> 01:57:01,170 dizer nula naqueles parênteses lá. 2357 01:57:01,170 --> 01:57:05,660 E isso faz certeza de que você não acidentalmente abusar dela. 2358 01:57:05,660 --> 01:57:07,020 Deixe-me ir em frente e fazer tosse. 2359 01:57:07,020 --> 01:57:08,540 E, claro, eu cometi um erro. 2360 01:57:08,540 --> 01:57:10,410 >> Droga, há que declaração implícita. 2361 01:57:10,410 --> 01:57:11,325 Mas isso é bom. 2362 01:57:11,325 --> 01:57:12,590 É um reparo fácil. 2363 01:57:12,590 --> 01:57:18,240 Eu só preciso o protótipo mais acima no meu arquivo do que eu estou realmente utilizá-lo. 2364 01:57:18,240 --> 01:57:20,070 >> Então, agora deixe-me fazer tosse novamente, agradável. 2365 01:57:20,070 --> 01:57:20,790 Agora, ele funciona. 2366 01:57:20,790 --> 01:57:22,930 Adicione tosse, tosse, tosse, tosse. 2367 01:57:22,930 --> 01:57:25,930 Então você pode pensar que estamos realmente pouco mais de engenharia este problema. 2368 01:57:25,930 --> 01:57:26,763 E, de fato, nós somos. 2369 01:57:26,763 --> 01:57:28,870 Este não é um bom candidato de um programa 2370 01:57:28,870 --> 01:57:31,930 no momento de refatoração, e fazer o que é 2371 01:57:31,930 --> 01:57:35,645 chamado de decomposição hierárquica, onde você toma algum código, e em seguida 2372 01:57:35,645 --> 01:57:38,790 você tipo de fator de coisas para fora, assim como atribuir mais semântica para eles, 2373 01:57:38,790 --> 01:57:40,930 e reutilizá-lo em última análise, a longo prazo. 2374 01:57:40,930 --> 01:57:43,490 Mas é um bloco de construção em direção programas mais sofisticados 2375 01:57:43,490 --> 01:57:45,600 que vamos começar escrever em pouco tempo que 2376 01:57:45,600 --> 01:57:50,090 permite-nos ter o vocabulário com o qual a escrever melhor código. 2377 01:57:50,090 --> 01:57:52,920 E, de fato, vamos ver se nós Não se pode generalizar este projecto. 2378 01:57:52,920 --> 01:57:57,984 >> Parece um pouco lame que eu, principal, precisa se preocupar com esse danado para loop, 2379 01:57:57,984 --> 01:57:59,400 e chamando a tosse novamente e novamente. 2380 01:57:59,400 --> 01:58:03,050 Por que não posso apenas dizer tosse, tussa três vezes? 2381 01:58:03,050 --> 01:58:08,170 Em outras palavras, por que não posso apenas dar entrada a tossir e fazer isso? 2382 01:58:08,170 --> 01:58:11,270 >> Por que não posso apenas dizer, em principal tosse três vezes. 2383 01:58:11,270 --> 01:58:13,150 E agora, este é o tipo de mágica. 2384 01:58:13,150 --> 01:58:14,540 É muito iterativo aqui. 2385 01:58:14,540 --> 01:58:15,940 E é, de fato, um pequeno passo. 2386 01:58:15,940 --> 01:58:19,250 >> Mas apenas a capacidade de dizer sobre linha oito, tosse por três vezes, 2387 01:58:19,250 --> 01:58:20,730 é apenas muito mais legível. 2388 01:58:20,730 --> 01:58:24,210 E, além disso, eu não tenho de saber ou cuidado como tosse é implementado. 2389 01:58:24,210 --> 01:58:26,460 E, de facto, no final do prazo e para projetos finais, 2390 01:58:26,460 --> 01:58:29,150 Se você enfrentar um projeto com um colega ou dois colegas, 2391 01:58:29,150 --> 01:58:32,370 você vai perceber que você está indo tem que, ou se quiser, dividir o trabalho. 2392 01:58:32,370 --> 01:58:34,650 >> E você vai querer decidir de antecedência, quem vai fazer o quê, 2393 01:58:34,650 --> 01:58:35,483 e em que peças? 2394 01:58:35,483 --> 01:58:37,520 E não seria bom Se você, por exemplo, 2395 01:58:37,520 --> 01:58:40,100 assumir o comando da escrita principal, feito. 2396 01:58:40,100 --> 01:58:43,470 E seu companheiro de quarto, ou o seu parceiro de um modo mais geral, 2397 01:58:43,470 --> 01:58:45,230 cuida da implementação de tosse. 2398 01:58:45,230 --> 01:58:49,540 >> E essa divisão, estes paredes de abstração, 2399 01:58:49,540 --> 01:58:52,310 ou camadas de abstração se você vai, são super poderoso, 2400 01:58:52,310 --> 01:58:55,480 porque especialmente para maior, mais programas e sistemas complexos, 2401 01:58:55,480 --> 01:59:00,070 ele permite que várias pessoas para construir coisas em conjunto, e, finalmente 2402 01:59:00,070 --> 01:59:02,680 costurar seu trabalho em conjunto desta maneira. 2403 01:59:02,680 --> 01:59:05,332 Mas, é claro, nós precisa agora corrigir tosse. 2404 01:59:05,332 --> 01:59:07,290 Nós precisamos dizer a tosse que, hey, você sabe o quê? 2405 01:59:07,290 --> 01:59:11,230 Você vai precisar de tomar um input-- por isso não vazio, mas int e agora. 2406 01:59:11,230 --> 01:59:15,170 Vamos em frente e colocar em tosse do int. i recebe zero. 2407 01:59:15,170 --> 01:59:16,890 >> i é menos do que o número de vezes. 2408 01:59:16,890 --> 01:59:18,550 Eu disse três antes. 2409 01:59:18,550 --> 01:59:20,420 Mas não é isso que eu quero. 2410 01:59:20,420 --> 01:59:25,520 Eu quero tossir para ser generalizado para suportar qualquer número de iterações. 2411 01:59:25,520 --> 01:59:28,800 >> Então, na verdade, é n que eu quero, tudo o que o usuário diz-me. 2412 01:59:28,800 --> 01:59:31,620 Agora, eu posso ir em frente e dizer tosse impressão. 2413 01:59:31,620 --> 01:59:34,750 E não importa o número de o usuário passa em, 2414 01:59:34,750 --> 01:59:36,890 Vou fazer uma iteração que muitas vezes. 2415 01:59:36,890 --> 01:59:39,160 >> Assim, no final do dia, programa é idêntico. 2416 01:59:39,160 --> 01:59:42,820 Mas observe todas essas coisas Pode até ser em outro arquivo. 2417 01:59:42,820 --> 01:59:45,620 Na verdade, eu não sei no momento, como printf é implementado. 2418 01:59:45,620 --> 01:59:47,980 >> Eu não sei no momento como chegar corda, ou obter int, ou obter flutuador 2419 01:59:47,980 --> 01:59:48,646 são implementadas. 2420 01:59:48,646 --> 01:59:50,930 E eu não quero vê-los na tela do meu. 2421 01:59:50,930 --> 01:59:55,320 Como é, eu estou começando a se concentrar em meu programa, não essas funções. 2422 01:59:55,320 --> 01:59:59,070 >> E assim, de fato, tão logo você começar factoring código como este para fora, 2423 01:59:59,070 --> 02:00:01,397 Nós até podia mover tosse para um arquivo separado? 2424 02:00:01,397 --> 02:00:02,730 Alguém mais poderia implementá-lo. 2425 02:00:02,730 --> 02:00:06,810 E você e seu programa de tornar-se o muito bonito, e muito legível, 2426 02:00:06,810 --> 02:00:10,830 sem dúvida, realmente quatro programa de linha ali. 2427 02:00:10,830 --> 02:00:13,510 >> Então, vamos em frente agora e fazer mais uma mudança. 2428 02:00:13,510 --> 02:00:16,180 Observe que meu protótipo tem de mudar em cima. 2429 02:00:16,180 --> 02:00:18,390 Então deixe-me corrigir isso assim Eu não obter gritou. 2430 02:00:18,390 --> 02:00:22,580 >> Faça tosse, me deixar correr tosse uma vez mais, ainda fazendo a mesma coisa. 2431 02:00:22,580 --> 02:00:26,010 Mas agora, perceber que temos uma ingrediente para uma versão final. 2432 02:00:26,010 --> 02:00:26,940 Você sabe o que? 2433 02:00:26,940 --> 02:00:29,040 Eu não quero apenas tosse, necessariamente. 2434 02:00:29,040 --> 02:00:30,802 Eu quero ter algo mais geral. 2435 02:00:30,802 --> 02:00:31,510 Então você sabe o quê? 2436 02:00:31,510 --> 02:00:32,450 Eu quero fazer isso. 2437 02:00:32,450 --> 02:00:37,140 Quero ter, bem como do risco faz, um bloco por exemplo, mas não apenas 2438 02:00:37,140 --> 02:00:38,680 dizer algo um determinado número de vezes. 2439 02:00:38,680 --> 02:00:41,510 Eu quero dizer uma seqüência muito específica. 2440 02:00:41,510 --> 02:00:43,850 E, portanto, eu não sei quer que ele acabou de dizer tosse. 2441 02:00:43,850 --> 02:00:47,660 Eu quero dizer o que quer string é passado. 2442 02:00:47,660 --> 02:00:49,960 >> Então, observe, eu generalizada isso para que agora 2443 02:00:49,960 --> 02:00:53,110 digamos se sente como um bom nome para isso, como o risco, 2444 02:00:53,110 --> 02:00:55,530 leva dois argumentos, ao contrário zero. 2445 02:00:55,530 --> 02:00:56,570 Um deles é um string. 2446 02:00:56,570 --> 02:00:57,300 Um deles é um int. 2447 02:00:57,300 --> 02:00:58,130 >> E eu poderia mudá-los. 2448 02:00:58,130 --> 02:01:00,713 Eu meio que gosto da idéia de dizem que a corda primeiro, e depois 2449 02:01:00,713 --> 02:01:01,940 quantas vezes posteriores. 2450 02:01:01,940 --> 02:01:03,970 Vazio significa ainda não retorna nada. 2451 02:01:03,970 --> 02:01:06,428 Estes são apenas lado visual efeitos, como com [? Jordan,?] 2452 02:01:06,428 --> 02:01:08,240 um efeito colateral verbal de gritar. 2453 02:01:08,240 --> 02:01:12,630 Ele ainda faz algo n vezes, 0 até, mas não igual a n. 2454 02:01:12,630 --> 02:01:14,540 Isto significa n vezes no total. 2455 02:01:14,540 --> 02:01:16,540 E depois é só imprimir o que quer que essa cadeia é. 2456 02:01:16,540 --> 02:01:19,060 Então, eu realmente generalizada esta linha de código. 2457 02:01:19,060 --> 02:01:22,460 Então, agora, como faço para implementar a função de tosse? 2458 02:01:22,460 --> 02:01:25,520 >> Eu posso fazer tosse vazio. 2459 02:01:25,520 --> 02:01:28,501 E eu ainda posso tomar como muitas vezes você quer a tossir. 2460 02:01:28,501 --> 02:01:29,250 Mas você sabe o que? 2461 02:01:29,250 --> 02:01:31,240 agora eu posso chutar a dizer. 2462 02:01:31,240 --> 02:01:36,540 >> Eu posso chamar dizer com o palavra tosse, passando n. 2463 02:01:36,540 --> 02:01:40,410 E se eu quiser implementar também, apenas por diversão, uma função espirro, 2464 02:01:40,410 --> 02:01:42,290 I pode espirrar um determinado número de vezes. 2465 02:01:42,290 --> 02:01:47,300 E eu posso manter reutilizando n, porque notar que m neste contexto ou extensão 2466 02:01:47,300 --> 02:01:49,470 só existe dentro dessa função. 2467 02:01:49,470 --> 02:01:52,767 >> E n neste contexto apenas existe dentro desta função aqui. 2468 02:01:52,767 --> 02:01:54,600 Então, vamos voltar a estas questões de âmbito. 2469 02:01:54,600 --> 02:02:01,160 E aqui, eu só vou dizer, Achoo e, em seguida n vezes, ponto e vírgula. 2470 02:02:01,160 --> 02:02:04,340 >> E agora, eu só precisa tomar emprestado estas funções assinaturas até aqui. 2471 02:02:04,340 --> 02:02:06,290 Então tosse é correto. 2472 02:02:06,290 --> 02:02:10,090 espirro vazio é correta agora. 2473 02:02:10,090 --> 02:02:12,390 >> E eu ainda só precisa dizer. 2474 02:02:12,390 --> 02:02:18,990 Então eu vou dizer, digamos string s, int n, ponto e vírgula. 2475 02:02:18,990 --> 02:02:22,010 Então, eu tenho mais de engenharia do Parreira fora deste programa. 2476 02:02:22,010 --> 02:02:23,760 >> E isso não faz significa necessariamente que este é 2477 02:02:23,760 --> 02:02:26,343 o que deve fazer quando se escreve mesmo o mais simples dos programas. 2478 02:02:26,343 --> 02:02:29,280 Tome algo que é, obviamente, muito simples, muito curto, 2479 02:02:29,280 --> 02:02:31,800 e re-lo implementar usando maneira muito código. 2480 02:02:31,800 --> 02:02:34,560 Mas você vai realmente ver, e em tempo de olhar para trás sobre estes exemplos, 2481 02:02:34,560 --> 02:02:38,610 e perceber, oh, esses são os passos tomámos para realmente generalizar, 2482 02:02:38,610 --> 02:02:40,797 fatorar algo fora, até ao final do dia 2483 02:02:40,797 --> 02:02:42,380 meu código é realmente muito razoável. 2484 02:02:42,380 --> 02:02:45,960 Porque se eu quiser tossir três vezes, em seguida, espirrar três vezes, 2485 02:02:45,960 --> 02:02:50,420 Eu estou indo simplesmente para executar novamente este, programa fazer tosse, e executar tosse. 2486 02:02:50,420 --> 02:02:53,620 E eu tenho três tosses e três espirra. 2487 02:02:53,620 --> 02:02:55,990 >> E por isso este é um básicos paradigma, se quiserem, 2488 02:02:55,990 --> 02:03:00,110 de como podemos ir sobre na verdade, a implementação de um programa. 2489 02:03:00,110 --> 02:03:03,220 Mas vamos ver agora o que é temos vindo a fazer todo este tempo, 2490 02:03:03,220 --> 02:03:06,940 e que algumas das peças finais estão por trás dessa simples comando. 2491 02:03:06,940 --> 02:03:09,620 No final do dia, temos vindo a utilizar Clang como nosso compilador. 2492 02:03:09,620 --> 02:03:11,494 Temos vindo a escrever fonte código, convertendo- 2493 02:03:11,494 --> 02:03:12,820 via Clang em código de máquina. 2494 02:03:12,820 --> 02:03:15,540 >> E nós temos vindo a utilizar fazer apenas para facilitar nossas combinações de teclas de modo 2495 02:03:15,540 --> 02:03:20,740 que não tem que se lembrar esses encantamentos de si Clang. 2496 02:03:20,740 --> 02:03:22,640 Mas o que é fazer realmente fazendo? 2497 02:03:22,640 --> 02:03:24,750 E, por sua vez, o que é Clang realmente fazendo? 2498 02:03:24,750 --> 02:03:28,790 >> Acontece que, embora tenhamos simplificado a discussão de hoje, dizendo: 2499 02:03:28,790 --> 02:03:33,090 você toma código-fonte, passá-lo como entrada para um compilador, que lhe dá 2500 02:03:33,090 --> 02:03:35,750 saída da máquina código, acontece que há 2501 02:03:35,750 --> 02:03:37,420 algumas etapas diferentes dentro lá. 2502 02:03:37,420 --> 02:03:41,940 E compilação passa a ser o guarda-chuva prazo para todo um conjunto de passos. 2503 02:03:41,940 --> 02:03:43,970 Mas vamos apenas provocá isso muito rapidamente. 2504 02:03:43,970 --> 02:03:48,070 >> Acontece que temos vindo a fazer mais coisas cada vez que eu executar um programa, 2505 02:03:48,070 --> 02:03:50,990 ou cada vez que eu compilar um programa hoje. 2506 02:03:50,990 --> 02:03:55,020 Assim, o pré-processamento refere-se a isto-- qualquer coisa em um programa C, 2507 02:03:55,020 --> 02:03:58,720 como veremos de novo e de novo, que começa com este símbolo de hash, 2508 02:03:58,720 --> 02:04:03,320 ou o símbolo hashtag aqui, significa é um pré-processador diretiva. 2509 02:04:03,320 --> 02:04:07,330 Isso significa que, neste caso, ei computador, fazer algo com esse arquivo 2510 02:04:07,330 --> 02:04:09,430 antes de realmente compilar meu próprio código. 2511 02:04:09,430 --> 02:04:15,220 >> Neste caso, de hash incluem seja, essencialmente, maneira de dizer do C, 2512 02:04:15,220 --> 02:04:19,325 hey computador, ir buscar o conteúdo de CS50.h e colá-los aqui. 2513 02:04:19,325 --> 02:04:22,170 Hey computador, ir buscar o conteúdo de io.h padrão, 2514 02:04:22,170 --> 02:04:24,690 onde quer que seja sobre o disco rígido, colá-lo aqui. 2515 02:04:24,690 --> 02:04:27,390 Então, essas coisas acontecem pela primeira vez durante o pré-processamento. 2516 02:04:27,390 --> 02:04:28,880 >> E Clang faz tudo isso para nós. 2517 02:04:28,880 --> 02:04:30,510 E fá-lo tão danado rápido, você nem sequer 2518 02:04:30,510 --> 02:04:32,000 ver quatro coisas distintas acontecendo. 2519 02:04:32,000 --> 02:04:34,100 Mas essa é a primeira tal passo. 2520 02:04:34,100 --> 02:04:35,560 >> O que realmente acontece em seguida? 2521 02:04:35,560 --> 02:04:38,320 Bem, o próximo oficial passo é a compilação. 2522 02:04:38,320 --> 02:04:40,385 E verifica-se que compilar um programa 2523 02:04:40,385 --> 02:04:44,060 tecnicamente significa que vai de código-fonte, as coisas que tenho 2524 02:04:44,060 --> 02:04:47,890 sido escrito hoje, para algo chamado de código de montagem, algo 2525 02:04:47,890 --> 02:04:49,260 que parece um pouco diferente. 2526 02:04:49,260 --> 02:04:51,050 >> E, de fato, podemos ver isso muito rápido. 2527 02:04:51,050 --> 02:04:53,890 Deixe-me realmente ir para o meu IDE. 2528 02:04:53,890 --> 02:04:58,050 Deixe-me ir em frente e hello.c aberta, que é o primeiro programa com o qual nós 2529 02:04:58,050 --> 02:04:59,120 começou hoje. 2530 02:04:59,120 --> 02:05:04,130 E deixe-me ir em frente e correr Clang um pouco diferente, Clang-s, hello.c, 2531 02:05:04,130 --> 02:05:07,720 que está indo realmente para Dê-me outra hello.s de arquivo. 2532 02:05:07,720 --> 02:05:10,330 >> E nós provavelmente nunca será novamente ver esse tipo de código. 2533 02:05:10,330 --> 02:05:13,030 Se você tomar um nível mais baixo sistemas de classe como CS61, 2534 02:05:13,030 --> 02:05:14,920 você vai ver muito mais deste tipo de código. 2535 02:05:14,920 --> 02:05:17,020 Mas esta é a linguagem assembly. 2536 02:05:17,020 --> 02:05:22,050 Este é X86 linguagem assembly que a CPU que está subjacente 2537 02:05:22,050 --> 02:05:24,460 CS50 IDE realmente entende. 2538 02:05:24,460 --> 02:05:27,060 >> E enigmática como faz olhar, é algo 2539 02:05:27,060 --> 02:05:29,180 o computador entende muito bem. 2540 02:05:29,180 --> 02:05:30,790 Sub Q, isto é um substrato. 2541 02:05:30,790 --> 02:05:31,660 Há movimentos. 2542 02:05:31,660 --> 02:05:35,730 >> Não está chamando de funções aqui, x oring, um movimento, um complemento, um pop, 2543 02:05:35,730 --> 02:05:36,430 um retorno. 2544 02:05:36,430 --> 02:05:38,850 Portanto, há alguns muito instruções de baixo nível 2545 02:05:38,850 --> 02:05:41,280 que CPUs entender que Aludi anteriormente. 2546 02:05:41,280 --> 02:05:43,100 Isso é o que Intel Inside. 2547 02:05:43,100 --> 02:05:45,030 >> Existem padrões de zeros e uns que 2548 02:05:45,030 --> 02:05:51,800 mapear a estes redigido arcanely, mas um pouco bem-nomeado, instruções, 2549 02:05:51,800 --> 02:05:52,780 por assim dizer. 2550 02:05:52,780 --> 02:05:54,780 Isso é o que acontece quando compilar o código. 2551 02:05:54,780 --> 02:05:58,560 Você começa a montagem língua de fora, o que 2552 02:05:58,560 --> 02:06:04,680 significa que o terceiro passo é para montar que o código assembly para, em última análise, 2553 02:06:04,680 --> 02:06:09,080 Máquina de zeros code-- e uns, não os texto que acabamos de ver um momento atrás. 2554 02:06:09,080 --> 02:06:13,370 >> Assim, pré-processamento que isso encontrar e substituir, e algumas outras coisas. 2555 02:06:13,370 --> 02:06:16,430 Compilando leva a sua fonte código de C, o código fonte 2556 02:06:16,430 --> 02:06:18,980 que escreveu, para montagem código que nós apenas olhou. 2557 02:06:18,980 --> 02:06:22,170 Montagem leva que a montagem código para zeros e uns 2558 02:06:22,170 --> 02:06:24,680 que o CPU vai realmente compreender, no final do dia. 2559 02:06:24,680 --> 02:06:27,630 E vinculação é a última etapa que acontece para US-- novamente, 2560 02:06:27,630 --> 02:06:29,830 tão rápido que nem sequer notice-- que diz: 2561 02:06:29,830 --> 02:06:32,460 hey computador, tomar todas os zeros e uns que 2562 02:06:32,460 --> 02:06:36,750 resultou de compilar o código de Davi, e sua principal função neste caso. 2563 02:06:36,750 --> 02:06:39,160 >> E ei computador, ir buscar todos os zeros e uns 2564 02:06:39,160 --> 02:06:42,180 que a equipe CS50 escreveu dentro da biblioteca CS50. 2565 02:06:42,180 --> 02:06:43,440 Misture aqueles com Davi. 2566 02:06:43,440 --> 02:06:46,648 E ei computador, ir buscar todos os zeros e aqueles que alguém escreveu anos 2567 02:06:46,648 --> 02:06:47,470 atrás para printf. 2568 02:06:47,470 --> 02:06:49,880 E adicionar aqueles para o coisa toda, de modo que nós temos 2569 02:06:49,880 --> 02:06:52,870 tenho meus zeros e uns, a zeros e uns do pessoal CS50, 2570 02:06:52,870 --> 02:06:55,370 os zeros e uns, printf e qualquer outra coisa que estamos usando. 2571 02:06:55,370 --> 02:07:00,410 >> Todos eles se combinados em um programa chamado, neste caso, Olá. 2572 02:07:00,410 --> 02:07:03,141 Então, de agora em diante, vamos apenas usar a palavra compilação. 2573 02:07:03,141 --> 02:07:06,390 E vamos tomar como certo que, quando dizemos, compilar seu programa, ou seja, 2574 02:07:06,390 --> 02:07:08,849 hey fazer o pré-processamento, montagem e ligação. 2575 02:07:08,849 --> 02:07:11,890 Mas há realmente algumas coisas suculenta acontecendo lá debaixo do capô. 2576 02:07:11,890 --> 02:07:13,723 E especialmente se você ficar curioso algum tempo, 2577 02:07:13,723 --> 02:07:15,900 você pode começar a picar em torno a este nível inferior. 2578 02:07:15,900 --> 02:07:19,660 Mas, por agora, perceber que entre os tópicos para hoje 2579 02:07:19,660 --> 02:07:23,420 são pura e simplesmente o início de um processo, 2580 02:07:23,420 --> 02:07:26,700 de ficar confortável com algo como Olá mundo. 2581 02:07:26,700 --> 02:07:29,575 Na verdade, a maioria do que fizemos hoje certamente não vai afundar na super rápido. 2582 02:07:29,575 --> 02:07:31,491 E isso vai levar algum tempo, e alguma prática. 2583 02:07:31,491 --> 02:07:33,864 E as probabilidades são, você irá classificar de quer bater o seu teclado 2584 02:07:33,864 --> 02:07:34,780 ou gritar para a tela. 2585 02:07:34,780 --> 02:07:35,880 E tudo isso é OK. 2586 02:07:35,880 --> 02:07:38,320 Embora, talvez tente não fazê-lo na biblioteca tanto. 2587 02:07:38,320 --> 02:07:40,820 >> E, finalmente, você vai ser capazes, porém, de começar 2588 02:07:40,820 --> 02:07:44,580 vendo padrões, tanto no bom código que você escreveu e em erros 2589 02:07:44,580 --> 02:07:45,370 que você fez. 2590 02:07:45,370 --> 02:07:48,965 E muito parecido com o processo de tornando-se um TF ou uma CA é como, 2591 02:07:48,965 --> 02:07:51,590 você vai começar a ficar melhor e melhor ao ver esses padrões, 2592 02:07:51,590 --> 02:07:53,774 e apenas resolver o seu próprios problemas em última instância. 2593 02:07:53,774 --> 02:07:56,940 Nesse meio tempo, haverá uma abundância de nós para dar-lhe suporte, e levá-lo 2594 02:07:56,940 --> 02:07:57,481 através disso. 2595 02:07:57,481 --> 02:07:59,450 E nos write-ups para todos os problemas 2596 02:07:59,450 --> 02:08:01,366 você será guiado através todos os comandos 2597 02:08:01,366 --> 02:08:05,330 que eu certamente sabe de muita prática até agora, 2598 02:08:05,330 --> 02:08:07,380 mas poderia ter voado sobre a cabeça por agora. 2599 02:08:07,380 --> 02:08:08,580 E isso é totalmente bem. 2600 02:08:08,580 --> 02:08:11,230 >> Mas, em última análise, você vai para começar a ver surgir padrões. 2601 02:08:11,230 --> 02:08:14,260 E uma vez que você passar por todo o detalhes estúpidas, como parênteses, 2602 02:08:14,260 --> 02:08:16,710 e chaves, e ponto e vírgula, e as coisas, francamente, 2603 02:08:16,710 --> 02:08:19,360 que não é de modo nenhum intelectualmente interessante. 2604 02:08:19,360 --> 02:08:22,690 E não é o objetivo de tomar qualquer aula introdutória. 2605 02:08:22,690 --> 02:08:24,410 É as idéias que vão importa. 2606 02:08:24,410 --> 02:08:26,659 >> São os loops, eo condições e as funções, 2607 02:08:26,659 --> 02:08:30,552 e mais poderosamente a abstração, eo factoring de código, 2608 02:08:30,552 --> 02:08:33,510 eo bom projeto, eo bom estilo, e, finalmente, a exactidão 2609 02:08:33,510 --> 02:08:37,330 do seu código, que é, em última análise vai importar mais. 2610 02:08:37,330 --> 02:08:40,925 Assim, na próxima semana, iremos tomar estas ideias que vimos pela primeira vez em Risco 2611 02:08:40,925 --> 02:08:42,800 e agora traduzido a C. E vamos começar 2612 02:08:42,800 --> 02:08:45,740 para introduzir o primeiro do domínios do mundo real do curso. 2613 02:08:45,740 --> 02:08:50,140 >> Vamos concentrar-se no mundo da segurança, e mais especificamente criptografia, 2614 02:08:50,140 --> 02:08:51,980 técnica de codificação da informação. 2615 02:08:51,980 --> 02:08:54,000 E entre o primeiro problemas que você mesmo 2616 02:08:54,000 --> 02:08:56,840 vai começar a gravar além jogando com alguma da sintaxe 2617 02:08:56,840 --> 02:08:59,880 e resolver alguns lógica problemas, em última análise, em pouco tempo, 2618 02:08:59,880 --> 02:09:03,960 é realmente lutam, ou criptografar, e, finalmente, desencriptar a informação. 2619 02:09:03,960 --> 02:09:06,470 E tudo o que fizemos Hoje, será bastante baixa 2620 02:09:06,470 --> 02:09:09,190 nível, é apenas vai permitir -nos a tomar um, e um, 2621 02:09:09,190 --> 02:09:13,550 e mais um passo acima na direção escrever o código mais interessante ainda. 2622 02:09:13,550 --> 02:09:15,050 >> Então mais sobre isso na próxima semana. 2623 02:09:15,050 --> 02:09:17,834 2624 02:09:17,834 --> 02:09:18,762 >> [REPRODUÇÃO DE VÍDEO] 2625 02:09:18,762 --> 02:09:19,690 2626 02:09:19,690 --> 02:09:22,006 >> -O Que você pode me dizer sobre a última vez que o viu? 2627 02:09:22,006 --> 02:09:26,041 2628 02:09:26,041 --> 02:09:27,040 -O Que eu posso dizer, realmente? 2629 02:09:27,040 --> 02:09:30,500 2630 02:09:30,500 --> 02:09:35,340 Quero dizer, era como qualquer outra ensaio de pré-produção, 2631 02:09:35,340 --> 02:09:40,510 exceto que não era algo que ele disse no final que ficou comigo. 2632 02:09:40,510 --> 02:09:44,810 2633 02:09:44,810 --> 02:09:46,640 >> -Este Foi CS50. 2634 02:09:46,640 --> 02:09:49,440 2635 02:09:49,440 --> 02:09:52,190 >> -É Um corte de todos, grande trabalho em ensaio. 2636 02:09:52,190 --> 02:09:53,070 >> o almoço de -que? 2637 02:09:53,070 --> 02:09:54,986 >> Sim, você e eu podemos pegar um sanduíche em um pouco. 2638 02:09:54,986 --> 02:09:58,380 Deixe-me apenas interrogar com David muito rapidamente. 2639 02:09:58,380 --> 02:09:59,160 David? 2640 02:09:59,160 --> 02:10:01,260 David? 2641 02:10:01,260 --> 02:10:03,110 >> [FIM DE REPRODUÇÃO]