1 00:00:08,119 --> 00:00:11,630 [Powered by Google Translate] DAVID J. MALAN: Tudo bem, isso é CS50, e este é o 2 00:00:11,630 --> 00:00:14,790 início de duas semanas. 3 00:00:14,790 --> 00:00:16,300 Obrigado. 4 00:00:16,300 --> 00:00:19,000 Vamos começar aqui com um telefonema. 5 00:00:19,000 --> 00:00:30,005 Estou prestes a marcar 617-BUG-CS50. 6 00:00:30,005 --> 00:00:31,230 CS50: Este é CS50. 7 00:00:31,230 --> 00:00:33,930 Para Menino Shuttle, pressione 1. 8 00:00:33,930 --> 00:00:36,660 Para começar de novo, pressione 9. 9 00:00:36,660 --> 00:00:38,180 DAVID J. MALAN: Então ele disse para o menino Shuttle, pressione 1. 10 00:00:38,180 --> 00:00:41,560 Então, nós estamos indo para pressionar 1. 11 00:00:41,560 --> 00:00:43,230 CS50: Qual é a sua origem? 12 00:00:43,230 --> 00:00:45,340 Para quad, pressione 1. 13 00:00:45,340 --> 00:00:47,080 Mather, pressione 2. 14 00:00:47,080 --> 00:00:49,240 Boylston, pressione 3. 15 00:00:49,240 --> 00:00:51,280 Lamont, pressione 4. 16 00:00:51,280 --> 00:00:53,210 Mem Hall, pressione 5. 17 00:00:53,210 --> 00:00:55,660 Para começar de novo, prima 0. 18 00:00:55,660 --> 00:00:59,590 DAVID J. MALAN: Vamos pressionar 1 para o quad. 19 00:00:59,590 --> 00:01:03,610 CS50: próximo ônibus deixa isso muito minuto a 1:10 PM, e 20 00:01:03,610 --> 00:01:09,820 em seguida, às 1:20 PM, 1:30, 1:40 PM. 21 00:01:09,820 --> 00:01:12,030 Este é CS50. 22 00:01:12,030 --> 00:01:15,570 >> DAVID J. MALAN: Então esta é a voz do CS50. 23 00:01:15,570 --> 00:01:18,030 E é um exemplo dos tipos de projetos finais, para 24 00:01:18,030 --> 00:01:19,500 exemplo, você pode morder para 25 00:01:19,500 --> 00:01:20,600 o fim do semestre. 26 00:01:20,600 --> 00:01:23,840 Por exemplo, que existe shuttleboy.cs50.net - 27 00:01:23,840 --> 00:01:28,200 na verdade, um projeto que escrevi pela primeira vez depois de tomar CS51 28 00:01:28,200 --> 00:01:29,740 quando eu era estudante de graduação. 29 00:01:29,740 --> 00:01:32,250 E a inspiração aqui era naquela época, tudo o que eles tinham era 30 00:01:32,250 --> 00:01:34,320 os horários de ônibus impressos de ônibus, e não havia 31 00:01:34,320 --> 00:01:35,970 noção de olhar as coisas online. 32 00:01:35,970 --> 00:01:38,730 E assim eu espécie de pomba em um fim de semana, filtrado através da 33 00:01:38,730 --> 00:01:41,460 impresso, cronograma e portou para um programa de computador. 34 00:01:41,460 --> 00:01:43,790 Na altura, o programa de computador aconteceu ser escrito 35 00:01:43,790 --> 00:01:47,110 em C. E você, na verdade, ele correu por Boy Shuttle digitando em um 36 00:01:47,110 --> 00:01:48,600 piscando prompt como temos vindo a fazer até agora. 37 00:01:48,600 --> 00:01:50,450 Mas ao longo dos anos, tem evoluído em um instante 38 00:01:50,450 --> 00:01:51,390 mensagens bot. 39 00:01:51,390 --> 00:01:53,970 Ele evoluiu mais recentemente para este site, em um 40 00:01:53,970 --> 00:01:57,720 SMS ferramenta baseada, bem como para esta ferramenta baseada em voz. 41 00:01:57,720 --> 00:02:00,170 E esta é a dica para os tipos de coisas que você pode 42 00:02:00,170 --> 00:02:02,380 fazer por si mesmo até o final do semestre. 43 00:02:02,380 --> 00:02:05,490 >> Por exemplo, lá, a versão SMS do Menino Shuttle acontece 44 00:02:05,490 --> 00:02:06,510 para operar como segue. 45 00:02:06,510 --> 00:02:10,880 Se, no seu telefone celular, enviar uma mensagem de texto para 41411 e 46 00:02:10,880 --> 00:02:14,300 em seguida, enviar o sboy símbolo especial, para o menino de Transporte 47 00:02:14,300 --> 00:02:18,350 seguido de A e B, onde A é uma origem e B é um 48 00:02:18,350 --> 00:02:19,070 destino - 49 00:02:19,070 --> 00:02:21,030 por exemplo, Boylston Espaço Quad - 50 00:02:21,030 --> 00:02:23,330 o que você deve voltar dentro de alguns segundos é um texto 51 00:02:23,330 --> 00:02:25,820 mensagem do Menino Shuttle dizer exatamente quando o 52 00:02:25,820 --> 00:02:28,990 próximos ônibus são poucos, de que o ponto A, que vai 53 00:02:28,990 --> 00:02:29,640 ponto B. 54 00:02:29,640 --> 00:02:32,510 E este é um exemplo mais geral do que é conhecido como 55 00:02:32,510 --> 00:02:33,920 utilizando uma API. 56 00:02:33,920 --> 00:02:36,930 >> Assim, por exemplo, este aqui é apenas shuttleboy.cs50.net, o 57 00:02:36,930 --> 00:02:39,300 encarnação web-based real deste. 58 00:02:39,300 --> 00:02:42,480 Mas os dados que sublinha este e outros aplicativos que CS50 59 00:02:42,480 --> 00:02:45,560 desenvolveu são todos expostos a todos aqui na forma 60 00:02:45,560 --> 00:02:49,340 de APIs, interfaces de programação de aplicativos. 61 00:02:49,340 --> 00:02:52,220 E isso é apenas uma maneira elegante de dizer que as pessoas gostam em nós 62 00:02:52,220 --> 00:02:56,010 a Internet e outros de ter passado algum tempo a criar 63 00:02:56,010 --> 00:02:59,970 software que você pode usar para pegar os dados de nós e 64 00:02:59,970 --> 00:03:02,510 em seguida, construir seus próprios aplicativos em cima 65 00:03:02,510 --> 00:03:03,840 de que o conjunto de dados. 66 00:03:03,840 --> 00:03:06,610 Assim, por exemplo, este Shuttle página da API do menino aqui, que 67 00:03:06,610 --> 00:03:09,390 passa a ser no manual CS50, essencialmente documentos 68 00:03:09,390 --> 00:03:13,080 como você pode ir em pedir CS50 servidores de dados. 69 00:03:13,080 --> 00:03:16,240 Por exemplo, se você está familiarizado com arquivos CSV, vírgula 70 00:03:16,240 --> 00:03:18,940 valores separados, estes são apenas uma espécie de rápida e suja 71 00:03:18,940 --> 00:03:20,310 Excel-como arquivos. 72 00:03:20,310 --> 00:03:23,110 Então você pode perguntar Boy Shuttle para todos os dados em toda a 73 00:03:23,110 --> 00:03:25,090 casas e coordena seus GPS, e você vai ter 74 00:03:25,090 --> 00:03:27,300 volta, essencialmente, uma planilha assim que 75 00:03:27,300 --> 00:03:30,820 então você pode ler em um programa de sua preferência e, em seguida 76 00:03:30,820 --> 00:03:33,250 gerar resultados, como Menino Shuttle si 77 00:03:33,250 --> 00:03:34,160 passa a ser fazer. 78 00:03:34,160 --> 00:03:37,030 Para aqueles mais familiares, representações mais modernas de dados 79 00:03:37,030 --> 00:03:39,420 incluem JSON, JavaScript Object Notation. 80 00:03:39,420 --> 00:03:40,620 Alguma coisa vai voltar para você direção 81 00:03:40,620 --> 00:03:41,720 o fim do semestre. 82 00:03:41,720 --> 00:03:45,440 >> Mas, novamente, esta é apenas uma das várias APIs do próprio CS50. 83 00:03:45,440 --> 00:03:48,320 E a coisa excitante é agora, nestes dias, Facebook e 84 00:03:48,320 --> 00:03:51,110 Twitter e Google e praticamente todos os site popular para fora 85 00:03:51,110 --> 00:03:54,130 lá tem algum tipo de API, o que significa que se você ler o 86 00:03:54,130 --> 00:03:56,620 documentação em seu site, que você se inscrever para uma 87 00:03:56,620 --> 00:03:59,980 conta, você pode então começar a escrever software em cima de 88 00:03:59,980 --> 00:04:03,680 quaisquer ferramentas ou dados da empresa que fornece. 89 00:04:03,680 --> 00:04:06,210 E assim um de nossos companheiros de ensino próprios um par de anos para trás 90 00:04:06,210 --> 00:04:07,620 escreveu uma versão para Mac deste. 91 00:04:07,620 --> 00:04:10,990 Então, no link intitulado Mac aqui no canto superior esquerdo, você pode realmente 92 00:04:10,990 --> 00:04:13,940 download de um Mac OS Widget que executa em seu próprio Mac para fazer o 93 00:04:13,940 --> 00:04:15,040 mesmos tipos de coisas. 94 00:04:15,040 --> 00:04:17,970 Então, é tudo sobre a construção em cima de conjuntos de dados como estes. 95 00:04:17,970 --> 00:04:21,839 Mas mais sobre isso no final do semestre. 96 00:04:21,839 --> 00:04:25,780 >> Então, vamos mergulhar em rápido real a um bug, apenas para obter o tipo de 97 00:04:25,780 --> 00:04:27,990 coisas aquecido hoje, e pensar no passado em alguns dos 98 00:04:27,990 --> 00:04:29,660 coisas que olhou para a semana passada. 99 00:04:29,660 --> 00:04:32,840 Em particular, deixe-me ir em frente e puxe-se, por exemplo, 100 00:04:32,840 --> 00:04:34,080 Neste exemplo aqui. 101 00:04:34,080 --> 00:04:37,500 Buggy1.c, este está disponível no site do curso se você 102 00:04:37,500 --> 00:04:40,250 gostaria de baixá-lo e picar em torno de si. 103 00:04:40,250 --> 00:04:43,520 Mas vamos zoom aqui neste programa bastante curta, e apenas 104 00:04:43,520 --> 00:04:46,550 uma recapitulação super-rápido de alguns dos blocos básicos de construção que 105 00:04:46,550 --> 00:04:48,880 realmente estamos indo apenas para começar a tomar para concedido. 106 00:04:48,880 --> 00:04:51,860 >> Então, as coisas azuis, nas linhas 1 a 9, são apenas 107 00:04:51,860 --> 00:04:53,670 perguntas softball. 108 00:04:53,670 --> 00:04:54,590 Então, essas são apenas comentários. 109 00:04:54,590 --> 00:04:56,230 Eles não têm nenhum significado funcional. 110 00:04:56,230 --> 00:04:58,460 Mas eles são comentários no sentido de que eles são notas que 111 00:04:58,460 --> 00:05:02,010 Eu, o ser humano, feito para mim para que na aula e depois 112 00:05:02,010 --> 00:05:04,340 palestra, eu consigo me lembrar o que este programa 113 00:05:04,340 --> 00:05:07,120 faz sem ter que lê-lo linha por linha e 114 00:05:07,120 --> 00:05:08,990 recriando a história em minha mente. 115 00:05:08,990 --> 00:05:11,000 Além disso, se eu entregar esse programa para outra pessoa como 116 00:05:11,000 --> 00:05:14,420 você, é muito mais clara para você, por causa de comentários como este, 117 00:05:14,420 --> 00:05:16,680 o que o programa está realmente fazendo, ou pelo menos o que o 118 00:05:16,680 --> 00:05:18,210 programa deveria estar fazendo. 119 00:05:18,210 --> 00:05:20,760 Se é ou não é correto é outra questão. 120 00:05:20,760 --> 00:05:25,040 Agora, em C, com comentários de várias linhas, recordar que na linha 121 00:05:25,040 --> 00:05:27,880 aqui é o símbolo mágico, / *. 122 00:05:27,880 --> 00:05:30,380 Isso significa que aqui vem o início de um comentário. 123 00:05:30,380 --> 00:05:34,560 E nada mais importa, até você chegar ao final de terminação, 124 00:05:34,560 --> 00:05:36,700 que é * /, o oposto. 125 00:05:36,700 --> 00:05:39,120 Então o fato de que eu tenho 80-algumas estrelas estranhas aqui de 126 00:05:39,120 --> 00:05:41,550 esquerda para a direita é realmente apenas um detalhe estético. 127 00:05:41,550 --> 00:05:43,370 Não tem nenhum significado funcional. 128 00:05:43,370 --> 00:05:44,490 >> Agora, que tal linha 11? 129 00:05:44,490 --> 00:05:46,940 O que isso faz em termos leigos? 130 00:05:51,560 --> 00:05:52,540 O que é isso? 131 00:05:52,540 --> 00:05:54,280 AUDIÊNCIA: Inclui o padrão. 132 00:05:54,280 --> 00:05:54,740 DAVID J. MALAN: OK, ótimo. 133 00:05:54,740 --> 00:05:57,500 Por isso inclui a biblioteca stdio.h. 134 00:05:57,500 --> 00:05:58,230 Então, o que isso significa? 135 00:05:58,230 --> 00:06:01,570 Bem, dentro desse arquivo, stdio.h, são um monte de 136 00:06:01,570 --> 00:06:03,320 declarações de função - 137 00:06:03,320 --> 00:06:05,290 isto é, o código que alguém escreveu. 138 00:06:05,290 --> 00:06:08,160 E um exemplo perfeito de uma função que é declarada no 139 00:06:08,160 --> 00:06:10,250 stdio.h é - 140 00:06:10,250 --> 00:06:11,980 que favorito até agora? 141 00:06:11,980 --> 00:06:14,300 Assim printf, uma das mais comuns de usar, certamente 142 00:06:14,300 --> 00:06:15,840 no início, a partir dessa biblioteca é ali. 143 00:06:15,840 --> 00:06:19,290 Se eu excluir essa linha de código, Clang vai gritar 144 00:06:19,290 --> 00:06:22,550 para mim algo sobre o uso de um símbolo não declarado. 145 00:06:22,550 --> 00:06:24,930 Algo não declarado é, provavelmente, a palavra-chave, pois 146 00:06:24,930 --> 00:06:27,770 não ter informado ao compilador o printf parece 147 00:06:27,770 --> 00:06:29,230 como se não incluir essa linha. 148 00:06:29,230 --> 00:06:31,830 E mais para a Terra, realmente, o que essa linha está dizendo é 149 00:06:31,830 --> 00:06:34,890 abrir esse arquivo, stdio.h, onde quer que seja sobre a do servidor 150 00:06:34,890 --> 00:06:38,200 disco rígido, ou disco rígido do aparelho, e copiar-colar-lo 151 00:06:38,200 --> 00:06:40,240 ali em meu arquivo, sem a minha 152 00:06:40,240 --> 00:06:41,730 ter que fazer isso manualmente. 153 00:06:41,730 --> 00:06:44,420 >> Agora, uma vez que temos aqui em baixo a principal, em pouco tempo vamos começar 154 00:06:44,420 --> 00:06:46,900 provocando separar o que int e que o vazio é. 155 00:06:46,900 --> 00:06:48,430 Mas, por agora, vamos olhar para as três linhas 156 00:06:48,430 --> 00:06:50,350 no prazo de 15 a 17. 157 00:06:50,350 --> 00:06:52,250 Este aqui eu reivindico como buggy. 158 00:06:52,250 --> 00:06:54,900 Linha 7 em meus comentários diz "Se imprimir 10 159 00:06:54,900 --> 00:06:59,410 asteriscos, mas não. "Por que isso não imprimir, de fato, 160 00:06:59,410 --> 00:07:01,097 10 dessas estrelas? 161 00:07:01,097 --> 00:07:02,347 AUDIÊNCIA: [inaudível]. 162 00:07:05,210 --> 00:07:05,800 DAVID J. MALAN: Exatamente. 163 00:07:05,800 --> 00:07:08,720 Então, observe que estamos começando a contar a partir de 0. 164 00:07:08,720 --> 00:07:10,780 E isso é realmente uma convenção na programação e 165 00:07:10,780 --> 00:07:13,230 ciência da computação em geral, começando a contar 166 00:07:13,230 --> 00:07:14,610 a partir de 0 em vez de 1. 167 00:07:14,610 --> 00:07:16,690 E este realmente só deriva do fato de que, para 168 00:07:16,690 --> 00:07:18,940 exemplo, quando tivemos oito pessoas no palco, quando 169 00:07:18,940 --> 00:07:20,680 ninguém estava levantando a mão, eles foram 170 00:07:20,680 --> 00:07:22,340 todos os zeros de forma eficaz. 171 00:07:22,340 --> 00:07:24,260 E por isso é apenas uma espécie de convenção computador assim, 172 00:07:24,260 --> 00:07:26,030 portanto, para iniciar a contagem de 0. 173 00:07:26,030 --> 00:07:29,130 Se esse é o menor número que pode representar em binário. 174 00:07:29,130 --> 00:07:32,270 >> Então aqui nós começamos inicializar i a 0. 175 00:07:32,270 --> 00:07:34,230 Nós criamos i igual a 0. 176 00:07:34,230 --> 00:07:37,780 Mas então eu cometi este erro aqui, dizendo que eu é menor ou 177 00:07:37,780 --> 00:07:38,820 igual a 10. 178 00:07:38,820 --> 00:07:41,700 Mas se você acha que, por meio, se eu começar em 0 e então eu vou 179 00:07:41,700 --> 00:07:46,410 até 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, eu estou indo realmente para 180 00:07:46,410 --> 00:07:49,980 imprimir 11 estrelas para a tela, porque eu tenho ido até 181 00:07:49,980 --> 00:07:52,410 a e igual a 10. 182 00:07:52,410 --> 00:07:55,090 Assim, a correção fácil aqui, então é o que? 183 00:07:55,090 --> 00:07:56,070 AUDIÊNCIA: [inaudível]. 184 00:07:56,070 --> 00:07:57,350 DAVID J. MALAN: Apenas alterá-lo para menos. 185 00:07:57,350 --> 00:07:59,700 Se você realmente quiser, você pode fazer isso. 186 00:07:59,700 --> 00:08:01,370 Mas, em geral, que é desaprovada. 187 00:08:01,370 --> 00:08:04,020 E assim começa a contar a partir de 0 é apenas algo que você deve 188 00:08:04,020 --> 00:08:05,510 normalmente se acostumar. 189 00:08:05,510 --> 00:08:07,810 Agora, o que dizer de toda essa construção em si? 190 00:08:07,810 --> 00:08:10,640 Esta linha 15 demarks um loop. 191 00:08:10,640 --> 00:08:12,510 Assim, para não é uma função. 192 00:08:12,510 --> 00:08:13,640 É apenas uma declaração. 193 00:08:13,640 --> 00:08:16,180 É uma construção de loop, como vimos no Scratch. 194 00:08:16,180 --> 00:08:17,600 E tem três partes. 195 00:08:17,600 --> 00:08:19,740 Note-se que há a primeira parte a 196 00:08:19,740 --> 00:08:21,350 à esquerda do ponto e vírgula. 197 00:08:21,350 --> 00:08:24,200 Há a parte do meio, entre as duas vírgulas. 198 00:08:24,200 --> 00:08:26,250 E depois há a parte da mão direita para a direita 199 00:08:26,250 --> 00:08:27,640 do ponto e vírgula segundo. 200 00:08:27,640 --> 00:08:31,822 Agora, o primeiro deles faz o quê? 201 00:08:31,822 --> 00:08:33,679 AUDIÊNCIA: [inaudível]. 202 00:08:33,679 --> 00:08:34,270 DAVID J. MALAN: Volta lá? 203 00:08:34,270 --> 00:08:34,816 Sim? 204 00:08:34,816 --> 00:08:35,980 AUDIÊNCIA: Inicialização. 205 00:08:35,980 --> 00:08:36,850 >> DAVID J. MALAN: Inicialização. 206 00:08:36,850 --> 00:08:37,840 Então, o que isso significa? 207 00:08:37,840 --> 00:08:40,690 Declaramos uma variável chamada i. 208 00:08:40,690 --> 00:08:43,840 Ele é do tipo int, porque eu especifiquei int i. 209 00:08:43,840 --> 00:08:46,470 E estou inicializando i como o valor de 0. 210 00:08:46,470 --> 00:08:47,730 Então, o que isso realmente dizendo? 211 00:08:47,730 --> 00:08:50,680 É efetivamente dizendo ao computador hey, dá-me o suficiente 212 00:08:50,680 --> 00:08:53,660 memória RAM, o suficiente, para atender um número, e depois colocar o 213 00:08:53,660 --> 00:08:56,130 número 0, em que pedaço de memória RAM. 214 00:08:56,130 --> 00:08:59,100 E como um aparte, quão grande é um int normalmente, pelo menos dentro 215 00:08:59,100 --> 00:09:00,280 do aparelho? 216 00:09:00,280 --> 00:09:01,000 AUDIÊNCIA: 32 bits. 217 00:09:01,000 --> 00:09:01,670 DAVID J. MALAN: 32 bits. 218 00:09:01,670 --> 00:09:04,890 Então isso significa que me dar 32 bits, também conhecido como 4 bytes, 219 00:09:04,890 --> 00:09:07,250 e colocar o valor 0 na mesma, o que é muito fácil, porque 220 00:09:07,250 --> 00:09:09,110 Significa apenas que definir todos os bits a 0. 221 00:09:09,110 --> 00:09:11,690 >> Então, agora, a segunda parte aqui é a condição. 222 00:09:11,690 --> 00:09:14,590 E a condição de, como o nome sugere, é o que é verificado 223 00:09:14,590 --> 00:09:18,100 de novo e de novo e de novo para saber se é verdadeiro ou falso. 224 00:09:18,100 --> 00:09:21,410 Portanto, este é apenas dizer fazer as seguintes linhas de código - 225 00:09:21,410 --> 00:09:23,950 ou seja, linha 16, porque essa é a única recuado 226 00:09:23,950 --> 00:09:24,820 embaixo - 227 00:09:24,820 --> 00:09:26,980 desde que i seja inferior a 10. 228 00:09:26,980 --> 00:09:30,520 E depois de cada iteração através deste circuito, faça o 229 00:09:30,520 --> 00:09:33,840 incrementação, o que neste caso é a i + +. 230 00:09:33,840 --> 00:09:35,580 Agora, isto não tem de ser i + +. 231 00:09:35,580 --> 00:09:37,610 Pode ser i -. 232 00:09:37,610 --> 00:09:39,860 Mas se eu fizesse isso, o que está acontecendo o comportamento 233 00:09:39,860 --> 00:09:41,370 ser deste programa? 234 00:09:41,370 --> 00:09:42,290 AUDIÊNCIA: Vai ser um loop infinito. 235 00:09:42,290 --> 00:09:44,060 DAVID J. MALAN: Vai ser uma espécie de loop infinito, 236 00:09:44,060 --> 00:09:47,720 a não ser que tenha sorte depois de 2 bilhões negativo ou assim. 237 00:09:47,720 --> 00:09:51,320 Talvez as coisas vão envolver, apenas pela natureza do finito 238 00:09:51,320 --> 00:09:53,930 número de bits que foram afectados por um int. 239 00:09:53,930 --> 00:09:56,270 Mas é, certamente, vai repetir muito mais do que 10 e 240 00:09:56,270 --> 00:09:58,630 certamente mais de 11 vezes aqui. 241 00:09:58,630 --> 00:10:02,240 >> E agora, como um aparte, perceber que i + + e i - 242 00:10:02,240 --> 00:10:04,420 são realmente apenas açúcar sintático. 243 00:10:04,420 --> 00:10:07,210 É apenas notação abreviada para o que é um pouco mais 244 00:10:07,210 --> 00:10:08,720 explicitamente escrito da seguinte forma: 245 00:10:08,720 --> 00:10:11,200 i = i + 1. 246 00:10:11,200 --> 00:10:13,460 Isso é idêntico ao i + +. 247 00:10:13,460 --> 00:10:15,860 É apenas uma espécie de aparência mais bonita para dizer i + +. 248 00:10:15,860 --> 00:10:17,490 É mais sucinta, mais legível. 249 00:10:17,490 --> 00:10:19,030 E assim a maioria das pessoas que, em vez. 250 00:10:19,030 --> 00:10:21,840 Mas esta é idêntica funcionalmente 251 00:10:21,840 --> 00:10:22,900 o que acabamos de ver. 252 00:10:22,900 --> 00:10:27,770 Assim, em breve, a solução rápida aqui é só para dizer iteração i 253 00:10:27,770 --> 00:10:30,690 desde 0 por todo o caminho até menos do que 10. 254 00:10:30,690 --> 00:10:32,700 E então nós vamos realmente obter 10 estrelas. 255 00:10:32,700 --> 00:10:33,430 >> Então, vamos tentar isso. 256 00:10:33,430 --> 00:10:35,310 Deixe-me abrir o terminal na parte inferior. 257 00:10:35,310 --> 00:10:37,420 Deixe-me ir para o diretório que esta está dentro 258 00:10:37,420 --> 00:10:40,030 E eu vou compilá-lo manualmente com Clang por agora. 259 00:10:40,030 --> 00:10:44,880 E eu estou indo para compilar isto como buggy1.c, Enter. 260 00:10:44,880 --> 00:10:50,280 E agora buggy1, por que não há tal arquivo ou diretório 261 00:10:50,280 --> 00:10:52,026 buggy1 chamado? 262 00:10:52,026 --> 00:10:53,850 AUDIÊNCIA: [inaudível]. 263 00:10:53,850 --> 00:10:54,240 DAVID J. MALAN: Yeah. 264 00:10:54,240 --> 00:10:55,420 Portanto, é na verdade chamado a.out. 265 00:10:55,420 --> 00:10:57,480 Então, se você apenas recordar executar Clang, onde é o Clang 266 00:10:57,480 --> 00:11:00,420 compilador, e você não especificar o nome que você deseja 267 00:11:00,420 --> 00:11:03,550 dar ao seu programa, que vai para o padrão para a.out. 268 00:11:03,550 --> 00:11:05,030 Então, na verdade, se eu faço ls - 269 00:11:05,030 --> 00:11:05,510 oops. 270 00:11:05,510 --> 00:11:07,680 E eu didn't - a questão em preto-e-branco alguns dos 271 00:11:07,680 --> 00:11:08,840 você enfrentou foi corrigido. 272 00:11:08,840 --> 00:11:10,670 Mas deixe-me fazer isso. 273 00:11:10,670 --> 00:11:14,570 Há que ter a.out no lado da mão esquerda lá. 274 00:11:14,570 --> 00:11:17,360 Então temos que correr a.out em vez de buggy1. 275 00:11:17,360 --> 00:11:19,140 >> Então deixe-me ir em frente e fazer isso. 276 00:11:19,140 --> 00:11:22,840 . A.out /, Enter. 277 00:11:22,840 --> 00:11:26,160 E eu, aparentemente, não fazer o que? 278 00:11:26,160 --> 00:11:26,620 AUDIÊNCIA: Salvar. 279 00:11:26,620 --> 00:11:27,390 DAVID J. MALAN: Salvar o meu arquivo. 280 00:11:27,390 --> 00:11:31,520 De modo que é facilmente resolvido por bater S de controle, ou vai 281 00:11:31,520 --> 00:11:33,450 Arquivo, Salvar, como na maioria dos programas. 282 00:11:33,450 --> 00:11:36,360 Deixe-me ir aqui em baixo, limpar a tela, execute-o novamente. 283 00:11:36,360 --> 00:11:37,960 E ainda há um bug. 284 00:11:37,960 --> 00:11:41,618 Então o que está acontecendo - 285 00:11:41,618 --> 00:11:42,980 AUDIÊNCIA: Você não compilar. 286 00:11:42,980 --> 00:11:44,040 DAVID J. MALAN: Ah, bom. 287 00:11:44,040 --> 00:11:45,010 Eu não compilá-lo. 288 00:11:45,010 --> 00:11:47,250 Como um idiota, eu estou olhando para o código para ver o que está errado. 289 00:11:47,250 --> 00:11:51,275 Então buggy1.c bumbum, agora a.out. 290 00:11:51,275 --> 00:11:52,640 E ufa, salva. 291 00:11:52,640 --> 00:11:55,090 >> Portanto, parece um pouco feio, porque não há nenhuma nova linha 292 00:11:55,090 --> 00:11:55,970 em qualquer ponto do programa. 293 00:11:55,970 --> 00:11:57,390 Mas, novamente, isso é apenas um detalhe estético. 294 00:11:57,390 --> 00:11:59,430 E pelo menos se contarmos aqueles fora, devemos 295 00:11:59,430 --> 00:12:01,160 ver agora 10 dessas estrelas. 296 00:12:01,160 --> 00:12:03,260 Bem, que tal este exemplo de aquecimento segundo? 297 00:12:03,260 --> 00:12:07,750 Assim, em buggy2, eu afirmo que essa versão, também, imprimir 298 00:12:07,750 --> 00:12:10,110 10 estrelas, uma por linha. 299 00:12:10,110 --> 00:12:12,340 Então, desta vez, eu tenho um caractere de nova linha, só para fazer 300 00:12:12,340 --> 00:12:13,520 as coisas um pouco mais bonitas. 301 00:12:13,520 --> 00:12:15,410 Mas em vez disso o que eu recebo é esse. 302 00:12:15,410 --> 00:12:19,590 Então deixe-me fazer buggy2.c bumbum, Enter. 303 00:12:19,590 --> 00:12:21,790 Agora é novamente chamado a.out. 304 00:12:21,790 --> 00:12:23,130 Enter. 305 00:12:23,130 --> 00:12:26,900 Eu só vejo uma nova linha, apenas a linha de muito novo que passado 306 00:12:26,900 --> 00:12:29,370 move meu aviso para a próxima linha. 307 00:12:29,370 --> 00:12:32,660 E ainda claramente eu tenho a impressão *, em seguida, uma nova linha, 308 00:12:32,660 --> 00:12:33,990 *, Em seguida, uma nova linha. 309 00:12:33,990 --> 00:12:35,490 Mas o que é o erro aqui? 310 00:12:35,490 --> 00:12:35,974 Sim? 311 00:12:35,974 --> 00:12:37,224 AUDIÊNCIA: [inaudível]. 312 00:12:39,850 --> 00:12:40,470 >> DAVID J. MALAN: Exatamente. 313 00:12:40,470 --> 00:12:44,110 Assim, ao contrário de algumas linguagens, como Python, onde o recuo 314 00:12:44,110 --> 00:12:46,030 na verdade, tem um significado funcional, uma 315 00:12:46,030 --> 00:12:47,150 linguagem como C - 316 00:12:47,150 --> 00:12:49,140 como veremos, PHP, JavaScript - 317 00:12:49,140 --> 00:12:51,940 o recuo é realmente apenas para benefício dos seres humanos. 318 00:12:51,940 --> 00:12:55,690 Então o fato de que eu tenho recuado linha 16 e 17 parece ótimo, 319 00:12:55,690 --> 00:12:57,530 mas não tem significado funcional aqui. 320 00:12:57,530 --> 00:13:00,700 Se eu quiser ambas as linhas para executar como parte do para 321 00:13:00,700 --> 00:13:05,140 loop, então eu tenho que colocá-los em chaves, fazendo isso. 322 00:13:05,140 --> 00:13:08,540 Você só pode cortar aquele canto e omitir as chaves se 323 00:13:08,540 --> 00:13:10,036 qual é o caso? 324 00:13:10,036 --> 00:13:10,410 AUDIÊNCIA: apenas uma linha. 325 00:13:10,410 --> 00:13:11,130 DAVID J. MALAN: apenas uma linha. 326 00:13:11,130 --> 00:13:15,280 Então, isso é apenas uma espécie de uma espécie agradável de detalhe de sintaxe, de modo que 327 00:13:15,280 --> 00:13:17,900 você não perca tempo escrevendo três linhas, duas das quais são 328 00:13:17,900 --> 00:13:20,040 chaves, apenas para escrever uma única linha de código. 329 00:13:20,040 --> 00:13:21,650 Mas se você tiver duas ou mais linhas, 330 00:13:21,650 --> 00:13:22,860 realmente precisa fazer isso. 331 00:13:22,860 --> 00:13:24,210 >> Então, agora deixe-me guardar este. 332 00:13:24,210 --> 00:13:27,140 Deixe-me ir em frente e re-executar Clang. 333 00:13:27,140 --> 00:13:31,375 Então deixe-me reprise a.out, e agora eu pegá-los um por linha. 334 00:13:31,375 --> 00:13:33,670 Agora, a.out novamente é uma espécie de um nome idiota para um programa. 335 00:13:33,670 --> 00:13:37,500 Como posso saber Clang para realmente me dar um nome de arquivo 336 00:13:37,500 --> 00:13:39,820 que é mais user-friendly, como buggy2 si? 337 00:13:43,200 --> 00:13:44,466 Um pouco mais claramente? 338 00:13:44,466 --> 00:13:45,220 AUDIÊNCIA: [inaudível]. 339 00:13:45,220 --> 00:13:47,810 DAVID J. MALAN: OK, para que eu possa realmente tomar o muito 340 00:13:47,810 --> 00:13:51,000 user-friendly de atalho e escrever apenas fazer buggy2. 341 00:13:51,000 --> 00:13:53,840 Eu não especificar. C neste caso, e pressione Enter. 342 00:13:53,840 --> 00:13:58,530 E o que fazem faz é que compila buggy2.c por mim 343 00:13:58,530 --> 00:14:00,260 Clang pedindo para fazer isso. 344 00:14:00,260 --> 00:14:05,100 Especificamente, ele chama Clang, corre Clang usando maneira mais 345 00:14:05,100 --> 00:14:08,540 linha de comando argumentos ou switches do que eu realmente precisa. 346 00:14:08,540 --> 00:14:11,270 Com o tempo, vamos voltar ao que todos esses diferentes 347 00:14:11,270 --> 00:14:13,810 enigmáticas expressões hifenizadas significa. 348 00:14:13,810 --> 00:14:16,910 Mas, por enquanto, isso é apenas poupando-me o trabalho de 349 00:14:16,910 --> 00:14:19,600 ter que se lembrar e ter que digitar todos aqueles 350 00:14:19,600 --> 00:14:21,150 várias expressões hifenizadas. 351 00:14:21,150 --> 00:14:23,240 E a vantagem de que, em última análise é 352 00:14:23,240 --> 00:14:25,900 que agora eu tenho buggy2. 353 00:14:25,900 --> 00:14:27,480 Se eu quiser fazer isso manualmente, porém, eu 354 00:14:27,480 --> 00:14:28,775 pode, em vez fazer isso - 355 00:14:28,775 --> 00:14:34,110 clang-o e, em seguida buggy2 buggy2.c. 356 00:14:34,110 --> 00:14:37,980 E que também irá dar-me um arquivo chamado buggy2. 357 00:14:37,980 --> 00:14:39,710 >> Então, em suma, é o compilador Clang. 358 00:14:39,710 --> 00:14:43,080 Fazer é apenas uma ferramenta de fácil utilização que vamos usar mais 359 00:14:43,080 --> 00:14:44,420 e mais, porque só começa a 360 00:14:44,420 --> 00:14:47,330 simplificar as coisas para nós. 361 00:14:47,330 --> 00:14:49,430 E nós retornar 0, finalmente. 362 00:14:49,430 --> 00:14:51,890 Por agora, apenas porque, mas vamos começar a provocá que parte 363 00:14:51,890 --> 00:14:52,930 hoje e na quarta-feira. 364 00:14:52,930 --> 00:14:55,560 Qualquer dúvida sobre isto? 365 00:14:55,560 --> 00:14:56,450 Sim? 366 00:14:56,450 --> 00:14:58,234 AUDIÊNCIA: [inaudível] 367 00:14:58,234 --> 00:15:00,020 ls entre aspas lá? 368 00:15:00,020 --> 00:15:01,710 DAVID J. MALAN: OK. 369 00:15:01,710 --> 00:15:05,880 Quando eu ls digitado entre aspas, que foi me fazendo um pouco de magia 370 00:15:05,880 --> 00:15:07,160 nos bastidores para corrigir um bug. 371 00:15:07,160 --> 00:15:09,370 Esqueci-me, como temos vindo a dizer que muitos de vocês no 372 00:15:09,370 --> 00:15:11,600 fóruns de discussão, o que fazer - 373 00:15:11,600 --> 00:15:17,220 vamos fazer isso agora - sudo yum-y update appliance50. 374 00:15:17,220 --> 00:15:19,790 Opa, que isso está escrito certo. 375 00:15:19,790 --> 00:15:23,240 Assim, o aparelho é como um sistema operativo. 376 00:15:23,240 --> 00:15:25,650 Está funcionando neste sistema operacional chamado Fedora. 377 00:15:25,650 --> 00:15:27,450 E agora por causa de minha conexão de internet lenta, eu tenho 378 00:15:27,450 --> 00:15:28,260 realmente hosed isso. 379 00:15:28,260 --> 00:15:31,620 Então, correndo yum update sudo, como dizem para fazer na 380 00:15:31,620 --> 00:15:34,080 conjunto de problemas, é, essencialmente, gosto de correr atualizações automáticas 381 00:15:34,080 --> 00:15:35,420 no Mac OS ou Windows. 382 00:15:35,420 --> 00:15:37,280 E a razão para executar esta muito no começo do 383 00:15:37,280 --> 00:15:39,640 conjunto de problemas é porque quando criamos o aparelho, eu 384 00:15:39,640 --> 00:15:42,480 desarrumada, e eu acidentalmente fez todos os seus programas olhar 385 00:15:42,480 --> 00:15:45,210 preto em uma tela preta, que é por isso que você não está vendo-os 386 00:15:45,210 --> 00:15:45,860 por padrão. 387 00:15:45,860 --> 00:15:48,020 Mas a versão mais recente do aparelho corrige isso. 388 00:15:48,020 --> 00:15:50,500 E eu vou consertar isso durante as férias uma vez que tenho Internet 389 00:15:50,500 --> 00:15:51,280 conectividade. 390 00:15:51,280 --> 00:15:54,630 >> Assim, as aspas apenas esconde o meu erro, muito discretamente, 391 00:15:54,630 --> 00:15:55,730 aparentemente. 392 00:15:55,730 --> 00:15:56,980 Outras perguntas? 393 00:15:59,750 --> 00:16:00,668 Sim? 394 00:16:00,668 --> 00:16:02,012 AUDIÊNCIA: Onde faz vem? 395 00:16:02,012 --> 00:16:03,810 [Inaudível] 396 00:16:03,810 --> 00:16:04,280 DAVID J. MALAN: Boa pergunta. 397 00:16:04,280 --> 00:16:05,460 Onde faz vem? 398 00:16:05,460 --> 00:16:09,390 É um programa do Linux que já existe há muitos anos, muito tempo 399 00:16:09,390 --> 00:16:10,570 antes CS50. 400 00:16:10,570 --> 00:16:12,930 E ele vem com um sistema operacional como o Fedora. 401 00:16:12,930 --> 00:16:14,830 Ele não vem da biblioteca CS50. 402 00:16:14,830 --> 00:16:17,560 Na verdade, as únicas coisas que vêm da biblioteca CS50 403 00:16:17,560 --> 00:16:20,470 até agora, que temos visto, são GetString, GetInt, todos 404 00:16:20,470 --> 00:16:25,550 Obter as funções e, a seqüência de palavras e, em certa 405 00:16:25,550 --> 00:16:26,575 extensão, a palavra bool. 406 00:16:26,575 --> 00:16:29,180 Mas vamos brincar que além quando mergulhar no CS50 407 00:16:29,180 --> 00:16:30,580 próprio aparelho. 408 00:16:30,580 --> 00:16:32,820 >> Então, sim, mais uma pergunta aqui. 409 00:16:32,820 --> 00:16:36,636 AUDIÊNCIA: Quando você disse fazer e, em seguida, buggy, como é que o 410 00:16:36,636 --> 00:16:39,980 computador sabe [inaudível]? 411 00:16:39,980 --> 00:16:40,520 DAVID J. MALAN: Boa pergunta. 412 00:16:40,520 --> 00:16:43,830 Então, quando você acabou de executar o make buggy1 ou fazer buggy2, como 413 00:16:43,830 --> 00:16:45,220 faz saber? 414 00:16:45,220 --> 00:16:49,900 Então, por padrão, se você digitar buggy1 fazer, fazer looks para um 415 00:16:49,900 --> 00:16:52,330 arquivo chamado buggy1.c. 416 00:16:52,330 --> 00:16:55,570 E então ele executa os comandos apropriados Clang, 417 00:16:55,570 --> 00:17:00,380 assim, substituindo o arquivo de saída padrão chamado a.out. 418 00:17:00,380 --> 00:17:03,670 Na verdade, se olharmos para o que fazem, o que - 419 00:17:03,670 --> 00:17:04,839 vamos sair desta. 420 00:17:04,839 --> 00:17:09,530 Se olharmos para o que fazem realmente estava fazendo, fazer buggy2, 421 00:17:09,530 --> 00:17:10,470 ele já está atualizado. 422 00:17:10,470 --> 00:17:13,020 Então deixe-me tirar o comando rm, o 423 00:17:13,020 --> 00:17:14,319 programa que eu escrevi antes. 424 00:17:14,319 --> 00:17:17,319 Digitando Y-E-S para confirmar que eu quero removê-lo. 425 00:17:17,319 --> 00:17:20,480 Se eu agora fazem, observe que nesta linha de muito tempo, 426 00:17:20,480 --> 00:17:22,980 há essa última coisa aqui,-o buggy2. 427 00:17:22,980 --> 00:17:26,959 Todos marca está a fazer é passar esse argumento, por assim dizer, a 428 00:17:26,959 --> 00:17:29,665 Clang, de modo que eu não tenho que digitá-lo eu mesmo. 429 00:17:29,665 --> 00:17:32,660 >> Tudo bem, então um par rápido administrativa 430 00:17:32,660 --> 00:17:33,470 anúncios. 431 00:17:33,470 --> 00:17:36,940 Assim, por seções, que começou oficialmente no próximo 432 00:17:36,940 --> 00:17:38,970 Domingo, você sempre quer trazer, se 433 00:17:38,970 --> 00:17:40,120 você tem um, um laptop. 434 00:17:40,120 --> 00:17:42,570 Se você não tiver um laptop, chegam a mim por 435 00:17:42,570 --> 00:17:43,580 deixar-me um e-mail. 436 00:17:43,580 --> 00:17:44,810 E nós vamos descobrir um fluxo de trabalho. 437 00:17:44,810 --> 00:17:47,100 O que geralmente você vai encontrar na seção é que eles são parte 438 00:17:47,100 --> 00:17:48,770 parte conceitual, hands-on. 439 00:17:48,770 --> 00:17:52,190 Nós vamos usar especificamente a seção de perguntas, parte de 440 00:17:52,190 --> 00:17:54,110 conjunto da semana problema, para percorrer algumas das 441 00:17:54,110 --> 00:17:55,820 material conceitual da palestra. 442 00:17:55,820 --> 00:17:57,480 E isso é tudo no conjunto de problemas atuais. 443 00:17:57,480 --> 00:18:00,010 E nós também vamos mergulhar em algumas actividades hands-on, por vezes 444 00:18:00,010 --> 00:18:02,190 de que será necessário para ser apresentado, por vezes de 445 00:18:02,190 --> 00:18:02,830 que não. 446 00:18:02,830 --> 00:18:04,630 Por exemplo, esta primeira semana, eles foram feitos apenas como um 447 00:18:04,630 --> 00:18:05,780 exercício de aquecimento. 448 00:18:05,780 --> 00:18:07,800 E você verá que esses problemas são realmente apenas isso. 449 00:18:07,800 --> 00:18:10,220 Eles foram feitos para ser relativamente pequeno, mas não necessariamente 450 00:18:10,220 --> 00:18:13,100 programas simples de escrever, que não são necessariamente 451 00:18:13,100 --> 00:18:16,230 emocionantes em si mesmos, mas são boas oportunidades para 452 00:18:16,230 --> 00:18:19,620 praticar com a sintaxe, com novas funções, no conforto de um 453 00:18:19,620 --> 00:18:21,900 onde você tem alguns de seus colegas se apresentar como 454 00:18:21,900 --> 00:18:22,870 bem como o seu TF. 455 00:18:22,870 --> 00:18:26,210 >> E o que vamos fazer ao longo do tempo é usar uma ferramenta chamada CS50 Spaces, 456 00:18:26,210 --> 00:18:28,940 em que em vez de apenas utilizar o aparelho CS50, você vai 457 00:18:28,940 --> 00:18:32,450 em vez de ir para uma página Web em um navegador, onde você poderá 458 00:18:32,450 --> 00:18:35,610 escrever código em uma janela do navegador durante a seção. 459 00:18:35,610 --> 00:18:38,240 E então, se você optar, seu companheiro de ensino pode, então, mostrar 460 00:18:38,240 --> 00:18:40,980 tudo o que você está digitando em sua tela em seu navegador 461 00:18:40,980 --> 00:18:43,930 janela-se na frente da classe, seja de forma anónima ou 462 00:18:43,930 --> 00:18:47,250 público, para que ele ou ela pode, então, percorrer com 463 00:18:47,250 --> 00:18:50,080 seus colegas o que você fez bem, o que você não faz bem. 464 00:18:50,080 --> 00:18:52,750 E mais uma vez, a certeza de tudo isso pode ser bem anónimos. 465 00:18:52,750 --> 00:18:54,410 Mas vai ser uma boa oportunidade para muito mais 466 00:18:54,410 --> 00:18:56,810 interatividade do que algo como palestra permite. 467 00:18:56,810 --> 00:18:58,910 >> Enquanto isso, nós vamos ter essas coisas, chamado de super 468 00:18:58,910 --> 00:19:01,610 seções, que são opcionais, mas estão abertos a todos em 469 00:19:01,610 --> 00:19:04,030 a classe, para que você possa fazer isso mais coletivamente para 470 00:19:04,030 --> 00:19:05,190 problema definido. 471 00:19:05,190 --> 00:19:06,010 Aqui está o calendário. 472 00:19:06,010 --> 00:19:08,870 Isso também é publicado na página inicial em cs50.net. 473 00:19:08,870 --> 00:19:10,850 Observe que haverá um hacker específica- 474 00:19:10,850 --> 00:19:12,430 uma tarde de amanhã. 475 00:19:12,430 --> 00:19:15,460 E vamos filmar um hoje e um amanhã e postar os 476 00:19:15,460 --> 00:19:16,720 online dentro de 24 horas. 477 00:19:16,720 --> 00:19:19,370 Portanto, não se você não pode fazer qualquer uma dessas vezes, a se preocupar. 478 00:19:19,370 --> 00:19:22,720 E, novamente, o cronograma está online agora em cs50.net. 479 00:19:22,720 --> 00:19:25,350 >> Em termos de corte em si, você deveria ter obtido uma 480 00:19:25,350 --> 00:19:28,520 enviar e-mail com instruções para ir para a página inicial do curso para encontrar 481 00:19:28,520 --> 00:19:29,610 a sua seção. 482 00:19:29,610 --> 00:19:32,890 Se a vida mudou e você precisa mudar sua seção, 483 00:19:32,890 --> 00:19:33,560 não um problema. 484 00:19:33,560 --> 00:19:37,900 Volte para o mesmo URL, cs50.net/section, singular, 485 00:19:37,900 --> 00:19:40,090 e você vai preencher o formulário semelhante, de modo que você pode 486 00:19:40,090 --> 00:19:41,260 em seguida, dar-nos as suas preferências. 487 00:19:41,260 --> 00:19:43,360 E nós vamos acompanhar até o fim da semana, como o que pudermos 488 00:19:43,360 --> 00:19:44,240 acomodar. 489 00:19:44,240 --> 00:19:49,530 Na semana passada, lembre que propôs usar CS50 discutir, 490 00:19:49,530 --> 00:19:51,370 ferramenta do curso, discussão em aula. 491 00:19:51,370 --> 00:19:53,680 Então, nós tivemos 40 perguntas que foram feitas e 492 00:19:53,680 --> 00:19:54,720 respondidas durante a palestra. 493 00:19:54,720 --> 00:19:56,280 Portanto, pareceu funcionar bem, por isso vamos continuar 494 00:19:56,280 --> 00:19:57,180 tentando fazer isso. 495 00:19:57,180 --> 00:19:59,600 Se, durante a palestra, você não me sinto confortável levantamento 496 00:19:59,600 --> 00:20:00,780 sua mão, não um problema. 497 00:20:00,780 --> 00:20:04,640 Ir para cs50.net/discuss, postar lá, e um de nosso ensino 498 00:20:04,640 --> 00:20:07,270 companheiros vão quer respondê-la eletronicamente ou aumentar a sua 499 00:20:07,270 --> 00:20:10,620 mão em seu nome de forma anônima para pedir, dependendo 500 00:20:10,620 --> 00:20:12,470 sobre a natureza da pergunta. 501 00:20:12,470 --> 00:20:15,000 E em termos de feedback, em geral Série de Exercícios será 502 00:20:15,000 --> 00:20:16,760 devolvidos no prazo de uma semana. 503 00:20:16,760 --> 00:20:19,080 Porque é preciso um pouco de tempo para seções de alcançar 504 00:20:19,080 --> 00:20:22,430 de equilíbrio, o primeiro pset, 0 e 1, será um pouco 505 00:20:22,430 --> 00:20:24,130 atrasadas como as coisas se acalmarem. 506 00:20:24,130 --> 00:20:27,130 Mas fique atento para que nas próximas semanas. 507 00:20:27,130 --> 00:20:29,750 >> Tudo bem, então deixe-me colocar no meu grave 508 00:20:29,750 --> 00:20:31,040 voz por um momento. 509 00:20:31,040 --> 00:20:32,690 Portanto, este é realmente um clima interessante para ser 510 00:20:32,690 --> 00:20:35,210 tendo essa discussão, o que com todas as outras coisas 511 00:20:35,210 --> 00:20:37,310 acontecendo na mesma campus relacionado. 512 00:20:37,310 --> 00:20:40,220 Mas CS50 tem certamente teve sua história deste especial 513 00:20:40,220 --> 00:20:43,360 tema, na medida em que a cada ano, este curso, para muitos 514 00:20:43,360 --> 00:20:46,910 anos, Ad-Boards cerca de 3% da classe. 515 00:20:46,910 --> 00:20:51,620 Este ano, mais recente, de 2011, CS50 Ad-Embarcado de 35 alunos. 516 00:20:51,620 --> 00:20:54,120 Este não é, penso eu, devido à falta de clareza. 517 00:20:54,120 --> 00:20:56,760 Compreender que, no decurso do programa, existe uma página de 518 00:20:56,760 --> 00:20:59,020 declaração explicando onde as linhas são. 519 00:20:59,020 --> 00:21:01,350 Esta afirmação se repete em cada um dos 520 00:21:01,350 --> 00:21:03,070 problema define na primeira página. 521 00:21:03,070 --> 00:21:05,760 >> Então eu falar isso hoje realmente apenas para fazer 522 00:21:05,760 --> 00:21:07,030 pessoas conscientes deste. 523 00:21:07,030 --> 00:21:08,080 E nós tentamos coisas diferentes. 524 00:21:08,080 --> 00:21:10,630 E o que eu pensei que iria fazer hoje é apenas ter um momento para 525 00:21:10,630 --> 00:21:13,830 realmente olhar para alguns dos casos do passado que surgiram. 526 00:21:13,830 --> 00:21:16,160 Ao invés de manter esses segredos tão sujos, na verdade 527 00:21:16,160 --> 00:21:19,170 apontar o que os alunos fizeram e como temos detectado 528 00:21:19,170 --> 00:21:21,630 e realmente o que a motivação principal é para 529 00:21:21,630 --> 00:21:23,950 mesmo tendo essa conversa. 530 00:21:23,950 --> 00:21:27,060 Então, com o que disse, a linha é essencialmente isso - 531 00:21:27,060 --> 00:21:29,200 por o programa, você é bem-vindo, que são incentivados, para 532 00:21:29,200 --> 00:21:30,210 conversar com colegas de classe. 533 00:21:30,210 --> 00:21:31,910 Esse é o propósito de ter estes colaborativo 534 00:21:31,910 --> 00:21:34,470 o horário de expediente em Annenberg e incentivar as pessoas para a 535 00:21:34,470 --> 00:21:35,755 final do projeto para trabalhar juntos. 536 00:21:35,755 --> 00:21:38,590 Mas a linha é desenhada quando chega a hora de realmente escrever 537 00:21:38,590 --> 00:21:39,790 sua solução final. 538 00:21:39,790 --> 00:21:42,590 Falando em Inglês, totalmente bem, falando em código pseudo 539 00:21:42,590 --> 00:21:43,400 totalmente bem. 540 00:21:43,400 --> 00:21:46,340 E-mail para um colega seu pset, deixando-os olhar sobre 541 00:21:46,340 --> 00:21:48,610 a tela como as mãos continua digitando, 542 00:21:48,610 --> 00:21:50,110 ao longo da linha também. 543 00:21:50,110 --> 00:21:52,250 Não olhar para o currículo para as linhas específicas. 544 00:21:52,250 --> 00:21:55,850 >> Mas só para pintar um retrato de como este é, infelizmente, uma 545 00:21:55,850 --> 00:21:58,370 realidade, perceber que existem sites por aí que 546 00:21:58,370 --> 00:22:01,490 ter soluções a partir desta classe e muitas outras classes. 547 00:22:01,490 --> 00:22:04,940 O fato de que você ou cerca de 3% de vocês sabem que isso existe 548 00:22:04,940 --> 00:22:07,240 significa que sabemos que isso existe. 549 00:22:07,240 --> 00:22:09,340 O fato de que existem sites como este onde você 550 00:22:09,340 --> 00:22:11,540 pode pagar alguém para realmente fazer seus conjuntos de problemas - isso foi 551 00:22:11,540 --> 00:22:13,450 um caso real que surgiu no ano passado. 552 00:22:13,450 --> 00:22:15,790 Este é um site chamado odesk.com. 553 00:22:15,790 --> 00:22:20,090 E Tim era o nome da pessoa aqui que estava postando em 554 00:22:20,090 --> 00:22:24,580 este site e pediu a alguém para fazer o seu pset 7 em 555 00:22:24,580 --> 00:22:25,570 Neste caso em particular. 556 00:22:25,570 --> 00:22:28,350 Bem, é muito odesk.com Google-capaz, e nós também somos 557 00:22:28,350 --> 00:22:30,310 muito bom pesquisando. 558 00:22:30,310 --> 00:22:32,360 Aqui, também, existem sites - e este é bastante 559 00:22:32,360 --> 00:22:34,234 atroz, francamente. 560 00:22:34,234 --> 00:22:38,050 [Risos] 561 00:22:38,050 --> 00:22:39,610 DAVID J. MALAN: O engraçado sobre este site é se 562 00:22:39,610 --> 00:22:41,970 você ler a página Sobre, eles falam sobre a sua empresa 563 00:22:41,970 --> 00:22:44,390 cultura e como o serviço ao cliente é o seu número um 564 00:22:44,390 --> 00:22:46,190 prioridade, para certificar-se de que suas atribuições chegar 565 00:22:46,190 --> 00:22:47,890 virou na hora. 566 00:22:47,890 --> 00:22:50,580 >> Mas, falando sério, novamente, o fato de que esses sites 567 00:22:50,580 --> 00:22:52,910 existir, percebemos que, também, estão cientes de 568 00:22:52,910 --> 00:22:53,730 estes tipos de sites. 569 00:22:53,730 --> 00:22:55,890 E para dar uma sensação de que forma isso geralmente 570 00:22:55,890 --> 00:22:58,570 leva, geralmente não tem grandes escândalos, onde as pessoas 571 00:22:58,570 --> 00:23:01,080 estão a colaborar em qualquer tipo de escala, mas sim 572 00:23:01,080 --> 00:23:04,540 É nestes momentos de fim de noite de fraqueza, em que você tem assim 573 00:23:04,540 --> 00:23:07,550 muito a fazer, é 04:00, você está exausto, e você 574 00:23:07,550 --> 00:23:09,770 pensar a si mesmo, bem, deixe-me dar uma olhada no meu 575 00:23:09,770 --> 00:23:11,770 colega de quarto ou o código do meu amigo ou similar. 576 00:23:11,770 --> 00:23:14,800 E as manifestações desta infelizmente envolver Estudante 577 00:23:14,800 --> 00:23:17,640 Um algo a apresentação como esta e apresentação de B Estudante 578 00:23:17,640 --> 00:23:20,370 algo assim, o que certamente, em um computador 579 00:23:20,370 --> 00:23:23,830 ciência de classe, é extremamente fácil para os cientistas da computação 580 00:23:23,830 --> 00:23:25,690 para detectar com software. 581 00:23:25,690 --> 00:23:28,410 Este é um outro paradigma comum, onde tenho a sorte de 582 00:23:28,410 --> 00:23:31,010 vindo a trabalhar ao lado de alguém, talvez falando em 583 00:23:31,010 --> 00:23:32,360 Inglês, bem pseudocódigo. 584 00:23:32,360 --> 00:23:35,080 Mas então chega a hora de realmente apresentar, e os Série de Exercícios 585 00:23:35,080 --> 00:23:37,910 apenas se trocadas via e-mail ou Dropbox ou similar. 586 00:23:37,910 --> 00:23:41,120 Mas, numa tentativa de tornar menos evidente que esta é 587 00:23:41,120 --> 00:23:44,830 o que aconteceu, então é isso que está submetido. 588 00:23:44,830 --> 00:23:47,880 Isto, também, não faz viagem até bem escritos peças de 589 00:23:47,880 --> 00:23:50,360 software como o que temos de realmente detectar 590 00:23:50,360 --> 00:23:51,280 estes tipos de coisas. 591 00:23:51,280 --> 00:23:53,760 E de fato o que fazemos é um software de execução que compara todos 592 00:23:53,760 --> 00:23:55,540 submissões deste ano contra todo o passado ano 593 00:23:55,540 --> 00:23:57,380 submissões, contra tudo o que encontramos na 594 00:23:57,380 --> 00:24:00,060 Internet, contra qualquer site de emprego lá fora. 595 00:24:00,060 --> 00:24:01,710 É tudo muito automatizado. 596 00:24:01,710 --> 00:24:05,665 E, assim, fazer isso muito em justiça grande os 97% que 597 00:24:05,665 --> 00:24:07,760 estão realmente trabalhando suas bundas, neste e em outros 598 00:24:07,760 --> 00:24:11,530 classes e colocando em todos que o esforço para que o trabalho 599 00:24:11,530 --> 00:24:13,030 eles finalmente apresentar é a sua própria. 600 00:24:13,030 --> 00:24:14,220 E eu posso ir para as idades. 601 00:24:14,220 --> 00:24:16,030 >> Estes são apenas um punhado de casos do ano passado. 602 00:24:16,030 --> 00:24:19,350 Alguns alunos submetidos esses arquivos da mesma forma para pset 2, 603 00:24:19,350 --> 00:24:22,460 pset 3, pset 4, pset 5, pset 6, pset 9. 604 00:24:22,460 --> 00:24:26,360 Neste caso, esta foi questionário 0 e no último ano, onde dois 605 00:24:26,360 --> 00:24:29,570 estudantes apresentado esta frase idêntica entre muitos 606 00:24:29,570 --> 00:24:32,210 outros, "A pedido do tipo -" ponto, ponto, ponto. 607 00:24:32,210 --> 00:24:34,530 Assim, mesmo em uma classe de 600 que nós detectar esta 608 00:24:34,530 --> 00:24:36,310 em questionários apresentados. 609 00:24:36,310 --> 00:24:39,080 Assim, em breve, este -, francamente, eu odeio ter esse tipo de 610 00:24:39,080 --> 00:24:41,300 conversa - mas este é realmente um esforço deliberado 611 00:24:41,300 --> 00:24:43,540 este ano para tentar reduzir esse número. 612 00:24:43,540 --> 00:24:45,650 Porque mesmo que dizer que estes tipos de coisas a cada 613 00:24:45,650 --> 00:24:48,100 anos, eu acho que a realidade de ter morado nela para poucos 614 00:24:48,100 --> 00:24:50,800 mais segundos do que o habitual e, na verdade, apenas apontando 615 00:24:50,800 --> 00:24:53,600 que o que pode parecer, não é, não um negócio tão grande, pelo menos 616 00:24:53,600 --> 00:24:56,390 acho que volta a este momento especial, tanto na justiça para 617 00:24:56,390 --> 00:25:00,100 si mesmo e para seus colegas aqui. 618 00:25:00,100 --> 00:25:02,480 Então, se você tiver alguma dúvida a respeito de onde a linha 619 00:25:02,480 --> 00:25:04,290 é, por favor, chegar a mim pessoalmente. 620 00:25:04,290 --> 00:25:07,190 Mas a resposta é sempre, completamente estressado no 621 00:25:07,190 --> 00:25:09,090 último minuto, dinheiro em um dia de atraso. 622 00:25:09,090 --> 00:25:11,080 Ou se é uma questão de não ter nenhum dia de atraso, 623 00:25:11,080 --> 00:25:12,900 honestamente, me e-mail pessoal. 624 00:25:12,900 --> 00:25:14,110 Nós vamos descobrir alguma coisa. 625 00:25:14,110 --> 00:25:17,480 Por favor, não coloque o tempo aqui em Harvard em risco. 626 00:25:17,480 --> 00:25:18,570 >> Agora, eu pensei que deveria aliviar o clima, então eu 627 00:25:18,570 --> 00:25:20,264 incluído este como o próximo slide. 628 00:25:20,264 --> 00:25:22,770 [Risos] 629 00:25:22,770 --> 00:25:23,630 DAVID J. MALAN: Este site foi ótimo. 630 00:25:23,630 --> 00:25:24,820 Eu realmente tenho um pouco distraído. 631 00:25:24,820 --> 00:25:26,330 Há um presente. 632 00:25:26,330 --> 00:25:29,590 E então este foi incrível. 633 00:25:29,590 --> 00:25:35,190 Ok, então pense que gatinho tarde da noite ao fazer 634 00:25:35,190 --> 00:25:36,040 destas decisões. 635 00:25:36,040 --> 00:25:40,110 Todas as coisas, certo modo de volta para mais diversão e menos grave, como 636 00:25:40,110 --> 00:25:40,780 condições. 637 00:25:40,780 --> 00:25:43,900 >> Tudo bem, então nós conversamos um pouco sobre isso. 638 00:25:43,900 --> 00:25:46,080 Isso é algo que provavelmente é bastante familiar a partir de 639 00:25:46,080 --> 00:25:47,260 o mundo do Scratch. 640 00:25:47,260 --> 00:25:49,860 E no mundo do Scratch, temos essa necessidade, por vezes, a 641 00:25:49,860 --> 00:25:51,110 ir fazer garfos na estrada. 642 00:25:51,110 --> 00:25:54,840 Ou isso ou aquilo ou esta outra coisa aqui. 643 00:25:54,840 --> 00:25:58,990 E quando a gente quer fazer isso, podemos usar, em C agora, isso se 644 00:25:58,990 --> 00:26:00,860 outra construção. 645 00:26:00,860 --> 00:26:06,420 E então aqui temos expressões booleanas. 646 00:26:06,420 --> 00:26:09,260 Por exemplo, expressões booleanas aqui, podemos OU 647 00:26:09,260 --> 00:26:12,260 los em conjunto, no sentido de que têm essa condição OR 648 00:26:12,260 --> 00:26:13,200 essa condição. 649 00:26:13,200 --> 00:26:15,100 Podemos e juntos, no sentido de que queremos 650 00:26:15,100 --> 00:26:17,710 verificar essa condição e essa condição. 651 00:26:17,710 --> 00:26:22,440 E aqui temos um switch agora, que não é tão 652 00:26:22,440 --> 00:26:26,040 sintaticamente semelhante a esses tipos de condições, mas 653 00:26:26,040 --> 00:26:30,160 nos permite fazer o equivalente a if, else if, else if, else 654 00:26:30,160 --> 00:26:34,990 se, e semelhantes, bastando enumerando-los, caso a caso 655 00:26:34,990 --> 00:26:36,670 a caso a caso. 656 00:26:36,670 --> 00:26:38,370 Então vimos os da última vez. 657 00:26:38,370 --> 00:26:40,430 E então começamos a tocar em coisas como loops. 658 00:26:40,430 --> 00:26:42,070 Vimos um destes apenas um momento atrás. 659 00:26:42,070 --> 00:26:44,180 Mas há essas outras construções de looping. 660 00:26:44,180 --> 00:26:46,370 >> Por exemplo, este aqui. 661 00:26:46,370 --> 00:26:50,140 Assim, enquanto (condição), fazer esta coisa de novo e de novo. 662 00:26:50,140 --> 00:26:53,070 Então, fundamentalmente, o que parece ser diferente entre esta 663 00:26:53,070 --> 00:26:55,760 loop e este loop enquanto aqui? 664 00:27:00,810 --> 00:27:05,045 Este loop e este loop while. 665 00:27:05,045 --> 00:27:07,840 Sim? 666 00:27:07,840 --> 00:27:08,800 O que é isso? 667 00:27:08,800 --> 00:27:10,050 AUDIÊNCIA: [inaudível]. 668 00:27:14,632 --> 00:27:15,120 DAVID J. MALAN: Ótimo. 669 00:27:15,120 --> 00:27:17,130 Assim, enquanto na condição de loop, há claramente 670 00:27:17,130 --> 00:27:17,940 sintaxe mais. 671 00:27:17,940 --> 00:27:20,560 Há essa inicialização, há essa atualização. 672 00:27:20,560 --> 00:27:23,820 Em um loop enquanto, há apenas essa condição. 673 00:27:23,820 --> 00:27:26,630 Portanto, parece que é um pouco preparados para baixo em relação ao de 674 00:27:26,630 --> 00:27:28,770 loop, o que significa que, se quisermos ter variáveis ​​e queremos 675 00:27:28,770 --> 00:27:30,800 ter incremento, nós realmente temos que 676 00:27:30,800 --> 00:27:32,500 fazer isso nós mesmos. 677 00:27:32,500 --> 00:27:34,420 >> Então deixe-me ir em frente e abrir gedit. 678 00:27:34,420 --> 00:27:36,320 Deixe-me passar para o aparelho. 679 00:27:36,320 --> 00:27:38,110 E vamos fazer um rápido exemplo de que 680 00:27:38,110 --> 00:27:40,550 distingue um destes a partir do outro. 681 00:27:40,550 --> 00:27:42,490 E no fundo da minha mente aqui, devo dizer uma coisa. 682 00:27:42,490 --> 00:27:44,120 Eu especificamente mencionado o nome de Tim. 683 00:27:44,120 --> 00:27:47,740 Tim era, na verdade, alguém que um estudante tentou encontrar para fazer 684 00:27:47,740 --> 00:27:48,680 seu dever de casa para eles. 685 00:27:48,680 --> 00:27:51,280 Nós não tivemos nenhuma Tim que em determinado ponto. 686 00:27:51,280 --> 00:27:53,690 Então percebe, para que eu não divulgado um estudante, que não era um aluno. 687 00:27:53,690 --> 00:27:55,720 Ele era uma pessoa aleatória na internet fazendo coisas 688 00:27:55,720 --> 00:27:57,180 no ano passado proxy. 689 00:27:57,180 --> 00:27:58,670 Então nós achamos que, também. 690 00:27:58,670 --> 00:28:00,630 Portanto, neste caso aqui, deixe-me ir em frente e 691 00:28:00,630 --> 00:28:02,810 abrir um novo arquivo. 692 00:28:02,810 --> 00:28:04,800 Arquivo, Novo. 693 00:28:04,800 --> 00:28:06,050 Isso me dá um guia aqui. 694 00:28:06,050 --> 00:28:09,940 Deixe-me ir em frente e salve-o como loop.c. 695 00:28:09,940 --> 00:28:11,810 Deixe-me ir e clique em Salvar. 696 00:28:11,810 --> 00:28:15,340 E então, aqui, vamos em frente e começar a escrever 697 00:28:15,340 --> 00:28:16,605 # Include. 698 00:28:19,116 --> 00:28:20,520 Deixe-me fazer zoom in 699 00:28:20,520 --> 00:28:23,410 Agora vamos fazer int main (void). 700 00:28:23,410 --> 00:28:30,020 Agora deixe-me ir em frente e fazer para (int i = 0; i < 701 00:28:30,020 --> 00:28:33,480 oh, 10; i + +). 702 00:28:33,480 --> 00:28:36,620 E agora eu estou indo para a frente e não imprimir a estrela que eu 703 00:28:36,620 --> 00:28:37,890 fez anteriormente. 704 00:28:37,890 --> 00:28:39,390 E então, no final deste programa, nós apenas estamos indo para 705 00:28:39,390 --> 00:28:41,130 imprimir uma nova linha, apenas para que meu prompt 706 00:28:41,130 --> 00:28:42,470 não olhar tudo bagunçado. 707 00:28:42,470 --> 00:28:45,170 retornar 0. 708 00:28:45,170 --> 00:28:47,610 Parece sintaticamente corretas? 709 00:28:47,610 --> 00:28:48,040 Até agora. 710 00:28:48,040 --> 00:28:48,560 Então, vamos ver. 711 00:28:48,560 --> 00:28:51,290 >> Então deixe-me afastar, ir para a minha janela de terminal. 712 00:28:51,290 --> 00:28:54,570 E deixe-me ir em frente e executar loop, porque eu chamei esta 713 00:28:54,570 --> 00:28:55,690 loop.c. coisa 714 00:28:55,690 --> 00:28:56,780 Então faça loop. 715 00:28:56,780 --> 00:28:57,840 Parece compilar OK. 716 00:28:57,840 --> 00:29:00,210 Deixa-me correr loop, e agora Enter. 717 00:29:00,210 --> 00:29:01,820 E parece ter impresso 10 estrelas. 718 00:29:01,820 --> 00:29:03,780 Então vamos converter isso em um loop while e ver o que 719 00:29:03,780 --> 00:29:05,220 os tipos de questões que tropeçar. 720 00:29:05,220 --> 00:29:11,290 Então, ao invés disso, deixe-me entrar aqui e dizer enquanto i é 721 00:29:11,290 --> 00:29:12,760 inferior a 10 - 722 00:29:12,760 --> 00:29:14,910 deixe-me livrar do laço for. 723 00:29:14,910 --> 00:29:17,170 OK, então nós temos alguns problemas já. 724 00:29:17,170 --> 00:29:21,110 Assim, a condição é a mesma, mas eu estou, obviamente, falta a 725 00:29:21,110 --> 00:29:21,680 inicialização. 726 00:29:21,680 --> 00:29:23,840 Estou perdendo a incrementação. 727 00:29:23,840 --> 00:29:28,020 Então, o que o compilador provavelmente dizer-me quando tento 728 00:29:28,020 --> 00:29:29,170 compilar este programa? 729 00:29:29,170 --> 00:29:29,666 Sim? 730 00:29:29,666 --> 00:29:31,154 AUDIÊNCIA: [inaudível]. 731 00:29:31,154 --> 00:29:31,650 >> DAVID J. MALAN: Ótimo. 732 00:29:31,650 --> 00:29:34,180 Por isso, vai dizer algo como não declarado - neste 733 00:29:34,180 --> 00:29:35,280 caso, a variável i. 734 00:29:35,280 --> 00:29:37,980 E, de fato, o uso do identificador não declarado i. 735 00:29:37,980 --> 00:29:40,960 E assim, em contraste com linguagens como PHP e 736 00:29:40,960 --> 00:29:43,120 Python e Ruby, com a qual alguns de vocês podem estar familiarizados, 737 00:29:43,120 --> 00:29:44,820 onde você pode apenas uma espécie de início utilizando variáveis 738 00:29:44,820 --> 00:29:47,420 querendo ou não, e não precisa se preocupar com os declarar 739 00:29:47,420 --> 00:29:48,560 explicitamente sempre. 740 00:29:48,560 --> 00:29:51,770 Em C e em linguagens como Java e C + +, você tem que ser 741 00:29:51,770 --> 00:29:53,020 Super explícito. 742 00:29:53,020 --> 00:29:55,760 E se você quiser uma variável chamada i, você tem que me dizer 743 00:29:55,760 --> 00:29:57,360 o tipo de variável que é. 744 00:29:57,360 --> 00:29:59,360 Então nós vamos ter que resolver isso da seguinte forma. 745 00:29:59,360 --> 00:30:05,510 Eu vou ter que ir até aqui e digite int i, portanto, 746 00:30:05,510 --> 00:30:07,860 Tenho declarado uma variável chamada i. 747 00:30:07,860 --> 00:30:09,180 Agora, eu tenho pulado um passo. 748 00:30:09,180 --> 00:30:11,340 Eu, obviamente, não inicializado, mas vamos ver se que em 749 00:30:11,340 --> 00:30:13,650 parada pelo Clang marcas reclamando. 750 00:30:13,650 --> 00:30:15,770 Então deixe-me refazer este programa. 751 00:30:15,770 --> 00:30:16,770 >> Tudo bem, agora é só reclamar 752 00:30:16,770 --> 00:30:17,870 por uma razão diferente. 753 00:30:17,870 --> 00:30:21,130 "Variável" i "não é inicializado quando utilizado aqui." Tudo bem, então 754 00:30:21,130 --> 00:30:22,340 isso é muito explícito. 755 00:30:22,340 --> 00:30:25,510 Inicializada apenas significa defini-lo igual a um valor. 756 00:30:25,510 --> 00:30:30,820 E nós não fizemos isso, então deixe-me tentar igual a 0. 757 00:30:30,820 --> 00:30:35,030 Agora vamos tentar isso de novo e voltar a executar Clang. 758 00:30:35,030 --> 00:30:36,140 Compilados neste momento. 759 00:30:36,140 --> 00:30:37,210 E eu estou prestes a executá-lo. 760 00:30:37,210 --> 00:30:43,120 Mas laço velho grande infinito, porque eu fiz o 761 00:30:43,120 --> 00:30:45,530 inicialização, eu fiz a condição, mas eu nunca fiz 762 00:30:45,530 --> 00:30:47,030 qualquer tipo de incremento. 763 00:30:47,030 --> 00:30:48,780 Então, como posso fazer a incrementação? 764 00:30:48,780 --> 00:30:51,170 Bem, em um loop while, parece que eu vou ter 765 00:30:51,170 --> 00:30:54,180 para fazê-lo dentro do loop, porque assim como o primeiro 766 00:30:54,180 --> 00:30:56,570 exemplos semana de fazer construções de iteração, como com 767 00:30:56,570 --> 00:30:59,040 as meias e com a auto-contagem, nós tivemos que fazer 768 00:30:59,040 --> 00:31:01,550 algo no final, como ir de volta para a linha seguinte. 769 00:31:01,550 --> 00:31:05,040 E se eu ir em frente e fazer isso i + + aqui? 770 00:31:05,040 --> 00:31:06,030 Não vamos nem compilar este. 771 00:31:06,030 --> 00:31:06,890 Apanha-me já. 772 00:31:06,890 --> 00:31:09,704 O que está errado aqui? 773 00:31:09,704 --> 00:31:10,690 AUDIÊNCIA: [inaudível]. 774 00:31:10,690 --> 00:31:11,770 >> DAVID J. MALAN: Então, definitivamente não é int. 775 00:31:11,770 --> 00:31:13,080 É i. 776 00:31:13,080 --> 00:31:15,110 E as chaves, como antes, 777 00:31:15,110 --> 00:31:16,800 recuo não é suficiente. 778 00:31:16,800 --> 00:31:18,410 Então agora eu tenho essa construção. 779 00:31:18,410 --> 00:31:21,780 Então, enquanto eu for menor que 10, imprima uma estrela, 780 00:31:21,780 --> 00:31:23,220 então incrementar i. 781 00:31:23,220 --> 00:31:25,680 E a forma de um tempo obras de laço é que, logo que você apertar o 782 00:31:25,680 --> 00:31:29,630 inferior da alça, o que neste caso se parece com a linha 10, 783 00:31:29,630 --> 00:31:32,880 ele vai voltar para a linha 6, altura em que o 784 00:31:32,880 --> 00:31:34,400 condição será verificada novamente. 785 00:31:34,400 --> 00:31:37,500 E se eu ainda é menor que 10, vamos fazer linhas 8 e 786 00:31:37,500 --> 00:31:41,250 em seguida, 9, depois vamos acertar 10, e voltar a 6, de novo e de 787 00:31:41,250 --> 00:31:45,580 de novo e de novo e de novo, desde que i é menor que 10. 788 00:31:45,580 --> 00:31:47,860 Então vamos voltar a correr fazer aqui. 789 00:31:47,860 --> 00:31:48,940 >> Ok, nós compilamos bem. 790 00:31:48,940 --> 00:31:50,300 Deixe-me re-correr loop. 791 00:31:50,300 --> 00:31:52,620 E agora, na verdade, parece funcionar. 792 00:31:52,620 --> 00:31:55,100 Então prós e contras aqui? 793 00:31:55,100 --> 00:31:58,910 Bem, até agora não há, na verdade, um conjunto de plo - 794 00:31:58,910 --> 00:31:59,420 tão bonito. 795 00:31:59,420 --> 00:32:01,870 Tudo bem, que era um - ah, isso foi um acidente. 796 00:32:01,870 --> 00:32:05,200 Tudo bem, então vamos voltar para o loop. 797 00:32:05,200 --> 00:32:07,530 Assim, para os loops são bons porque eles são super explícito. 798 00:32:07,530 --> 00:32:09,720 E mesmo que eles estão um pouco desajeitado para escrever, é 799 00:32:09,720 --> 00:32:11,500 muito poderosa e permite que você faça 800 00:32:11,500 --> 00:32:12,980 várias coisas ao mesmo tempo. 801 00:32:12,980 --> 00:32:16,240 Enquanto laços não parecem ter uma enorme quantidade de valor apenas 802 00:32:16,240 --> 00:32:18,500 ainda, porque parece que só temos de fazer mais trabalho. 803 00:32:18,500 --> 00:32:20,670 Temos que colocar a inicialização até aqui, o 804 00:32:20,670 --> 00:32:23,480 atualizar aqui, e temos que lembrar de fazer tudo isso. 805 00:32:23,480 --> 00:32:26,260 Então, vamos ver com o tempo que laços, enquanto na verdade emprestar 806 00:32:26,260 --> 00:32:29,380 si para apenas diferentes contextos, dados diferentes 807 00:32:29,380 --> 00:32:33,900 estruturas como listas e tabelas de hash, coisas que nós vamos chegar a 808 00:32:33,900 --> 00:32:34,970 meados semestre. 809 00:32:34,970 --> 00:32:37,900 Mas, por agora, sei que há este terceiro tipo conhecido como um do- 810 00:32:37,900 --> 00:32:38,480 while. 811 00:32:38,480 --> 00:32:39,540 E temos visto isso brevemente. 812 00:32:39,540 --> 00:32:41,830 E isso pode ser super atenciosa com pset 1. 813 00:32:41,830 --> 00:32:45,570 Toda vez que você quer fazer algo e depois verificar se 814 00:32:45,570 --> 00:32:48,940 o utilizador colaborou, e se eles não o fez, faça-o de novo, um do- 815 00:32:48,940 --> 00:32:51,460 while se presta a esse tipo de lógica. 816 00:32:51,460 --> 00:32:55,640 Porque, como a ordenação de cima para baixo aqui sugere, 817 00:32:55,640 --> 00:32:57,750 que significa, literalmente, fazer isso. 818 00:32:57,750 --> 00:32:59,830 E fazer isso de novo e de novo, o que pode ser isso? 819 00:32:59,830 --> 00:33:03,000 Talvez isso signifique GetInt chamada ou GetString e depois 820 00:33:03,000 --> 00:33:05,830 verificar o valor de GetInt ou GetString e gritando 821 00:33:05,830 --> 00:33:08,260 ao usuário se eles não têm cooperado, pedindo-lhes 822 00:33:08,260 --> 00:33:10,100 de novo e de novo e de novo. 823 00:33:10,100 --> 00:33:11,730 Onde você quer fazer algo uma vez, 824 00:33:11,730 --> 00:33:13,210 em seguida, verificar alguma condição. 825 00:33:13,210 --> 00:33:14,110 >> Então, vamos tentar isso. 826 00:33:14,110 --> 00:33:17,130 Deixe-me realmente mudar isto agora para um loop do-while. 827 00:33:17,130 --> 00:33:18,830 E eu estou indo para ir em frente e fazer o seguinte. 828 00:33:18,830 --> 00:33:21,830 Então faça o seguinte. 829 00:33:21,830 --> 00:33:26,870 Vamos fazer int i = GetInt (), mas vamos primeiro dizer que o usuário 830 00:33:26,870 --> 00:33:27,410 o que fazer. 831 00:33:27,410 --> 00:33:29,050 Então, um pouco diferente desta vez. 832 00:33:29,050 --> 00:33:31,270 "Dê-me um int". 833 00:33:31,270 --> 00:33:32,910 Então, eu vou usar printf para isso. 834 00:33:32,910 --> 00:33:35,740 E agora eu vou descer aqui, e eu vou fazer isso 835 00:33:35,740 --> 00:33:41,520 enquanto i é, digamos, maior que - 836 00:33:41,520 --> 00:33:47,540 vamos ver, i é, digamos, menos que 0, ou i é 837 00:33:47,540 --> 00:33:48,730 superior a 10. 838 00:33:48,730 --> 00:33:51,810 Em outras palavras, quer um número de 1 a 9, só 839 00:33:51,810 --> 00:33:52,720 arbitrariamente. 840 00:33:52,720 --> 00:33:55,290 Então, eu estou usando uma expressão combinada Boolean aqui para 841 00:33:55,290 --> 00:33:59,930 certificar-se de que i seja inferior a 0 ou superior a 10, em que 842 00:33:59,930 --> 00:34:02,530 caso, vou fazer este loop aqui novamente. 843 00:34:02,530 --> 00:34:04,400 Então, novamente, fazer isso - 844 00:34:04,400 --> 00:34:08,480 enquanto i é menor que 0 ou i é maior do que 10. 845 00:34:08,480 --> 00:34:11,440 >> Então agora vamos seguir em frente e fazer isso uma vez que fizemos isso. 846 00:34:11,440 --> 00:34:13,270 Vamos fazer um teste de sanidade rápido. 847 00:34:13,270 --> 00:34:18,929 printf ("Obrigado, i é% d", i). 848 00:34:18,929 --> 00:34:21,350 Portanto, este programa simples pede ao usuário para um int, 849 00:34:21,350 --> 00:34:24,000 certifica-se de que é dentro de algum intervalo de 1 a 9, inclusive, 850 00:34:24,000 --> 00:34:26,280 e depois agradece ao usuário, lembrando-lhes o que eles apenas 851 00:34:26,280 --> 00:34:27,940 digitada, assim como um teste de sanidade pouco. 852 00:34:27,940 --> 00:34:30,659 Mas vamos ver se isso funciona como pretendido. 853 00:34:30,659 --> 00:34:34,533 Deixe-me ir de cabeça para baixo aqui e voltar a correr fazer loop. 854 00:34:34,533 --> 00:34:35,350 Hmm. 855 00:34:35,350 --> 00:34:38,600 "O uso de identificador não declarado 'i'". Isso é estranho. 856 00:34:38,600 --> 00:34:41,509 Eu pensei que nós resolvemos isso. 857 00:34:45,489 --> 00:34:47,560 Mesmo sintoma, mas de código diferente. 858 00:34:47,560 --> 00:34:47,899 Sim? 859 00:34:47,899 --> 00:34:50,191 AUDIÊNCIA: [inaudível] dentro de dois, temos que 860 00:34:50,191 --> 00:34:52,639 [Inaudível]. 861 00:34:52,639 --> 00:34:53,260 >> DAVID J. MALAN: Exatamente. 862 00:34:53,260 --> 00:34:55,989 Então, isso realmente nos leva a um tema conhecido como escopo. 863 00:34:55,989 --> 00:34:59,350 Acontece que C, de novo, realmente leva você literalmente. 864 00:34:59,350 --> 00:35:02,970 E se você faz algo como este onde você declarar um int 865 00:35:02,970 --> 00:35:06,120 e depois atribuir-lhe algum valor, mas você faz isso dentro de uma 866 00:35:06,120 --> 00:35:09,840 par de chaves, o que C faz é ele assume que você 867 00:35:09,840 --> 00:35:14,800 só quero os bits 32, conhecidos como i para existir dentro do 868 00:35:14,800 --> 00:35:18,200 contexto dessas chaves, dentro do contexto de linhas 869 00:35:18,200 --> 00:35:22,420 6 a 9. Então eu é declarada, e é atribuído um 870 00:35:22,420 --> 00:35:26,530 valor na linha 8, mas logo que você começa fora de 871 00:35:26,530 --> 00:35:30,270 linha 9 abaixo da chaveta, eu já não está em 872 00:35:30,270 --> 00:35:31,910 escopo, por assim dizer. 873 00:35:31,910 --> 00:35:35,030 S-C-O-P-E. Não é mais no contexto certo. 874 00:35:35,030 --> 00:35:37,940 Portanto, agora não há i, por isso é como se não tivesse mesmo 875 00:35:37,940 --> 00:35:38,770 declarou ele em tudo. 876 00:35:38,770 --> 00:35:41,520 >> Então, o que é uma correção em seguida, para algo como isso, se o 877 00:35:41,520 --> 00:35:44,300 razão é que eu seja declarada dentro das chaves, que 878 00:35:44,300 --> 00:35:45,120 aparentemente é ruim? 879 00:35:45,120 --> 00:35:45,410 Aqui? 880 00:35:45,410 --> 00:35:46,820 AUDIÊNCIA: [inaudível]. 881 00:35:46,820 --> 00:35:47,150 DAVID J. MALAN: Yeah. 882 00:35:47,150 --> 00:35:48,710 Assim, podemos inicializá-lo fora. 883 00:35:48,710 --> 00:35:53,530 Então deixe-me ir em frente e eliminar as partes declaração em que 884 00:35:53,530 --> 00:35:55,820 Eu especificar o tipo, e deixe-me fazê-lo aqui. 885 00:35:55,820 --> 00:36:00,220 Assim, na linha 5, que agora diz "Dê-me um int." Chame-o i. 886 00:36:00,220 --> 00:36:03,400 Observe na linha 9, eu não quero fazer isso, porque eu 887 00:36:03,400 --> 00:36:04,830 já tem os bits 32. 888 00:36:04,830 --> 00:36:06,140 Eu não quero pedir ao computador por um 889 00:36:06,140 --> 00:36:07,630 diferentes de 32 bits. 890 00:36:07,630 --> 00:36:09,850 Eu quero usar esses mesmos 32 bits. 891 00:36:09,850 --> 00:36:13,190 E agora, porque eu é declarado na linha 5, ainda é legítimo 892 00:36:13,190 --> 00:36:16,550 usá-lo na linha 11 e linha 12. 893 00:36:16,550 --> 00:36:19,310 >> Então deixe-me tentar recompilar isso e ver 894 00:36:19,310 --> 00:36:20,490 se Clang pára de gritar. 895 00:36:20,490 --> 00:36:22,380 fazer loop. 896 00:36:22,380 --> 00:36:25,470 Portanto, agora é "declaração implícita da função 897 00:36:25,470 --> 00:36:29,880 'GetInt' é inválida na C99. "O que é isso? 898 00:36:29,880 --> 00:36:30,400 Sim? 899 00:36:30,400 --> 00:36:32,330 AUDIÊNCIA: [inaudível]. 900 00:36:32,330 --> 00:36:32,690 DAVID J. MALAN: Yeah. 901 00:36:32,690 --> 00:36:35,520 Portanto, agora que eu estou realmente usando GetInt, isso não é algo 902 00:36:35,520 --> 00:36:38,190 que só vem com C. Isto vem de CS50. 903 00:36:38,190 --> 00:36:39,890 Então precisamos disso aqui. 904 00:36:39,890 --> 00:36:41,450 E deixe-me voltar para o prompt de baixo 905 00:36:41,450 --> 00:36:43,500 aqui e re-executar o make. 906 00:36:43,500 --> 00:36:44,160 Ok, finalmente. 907 00:36:44,160 --> 00:36:46,270 Agora nós temos que resolver e que o erro dos outros. 908 00:36:46,270 --> 00:36:48,930 Deixa-me correr loop e ver o que acontece. 909 00:36:48,930 --> 00:36:51,740 "Dê-me um int." Eu vou dar-lhe 11. 910 00:36:51,740 --> 00:36:53,100 Eu vou dar -1. 911 00:36:53,100 --> 00:36:54,470 Eu vou dar foo. 912 00:36:54,470 --> 00:36:56,080 Eu vou dar 5. 913 00:36:56,080 --> 00:36:57,450 E agora ele realmente funciona. 914 00:36:57,450 --> 00:36:59,410 Mas o prompt mudou para uma razão aqui. 915 00:36:59,410 --> 00:37:02,800 Porque é que dizem que repetir uma dessas vezes, mas me dê um 916 00:37:02,800 --> 00:37:03,920 int outras três vezes? 917 00:37:03,920 --> 00:37:05,500 Por que é que o comportamento diferente? 918 00:37:05,500 --> 00:37:06,980 AUDIÊNCIA: deu-lhe uma corda. 919 00:37:06,980 --> 00:37:07,830 DAVID J. MALAN: Desculpe? 920 00:37:07,830 --> 00:37:08,570 AUDIÊNCIA: Você deu uma corda. 921 00:37:08,570 --> 00:37:08,990 DAVID J. MALAN: Yeah. 922 00:37:08,990 --> 00:37:11,450 Portanto, deram uma string neste terceira tentativa, 923 00:37:11,450 --> 00:37:12,490 quando eu digitei foo. 924 00:37:12,490 --> 00:37:13,200 Foo é uma string. 925 00:37:13,200 --> 00:37:14,340 Obviamente não é um int. 926 00:37:14,340 --> 00:37:17,500 E da maneira que CS50 implementou GetInt é que 927 00:37:17,500 --> 00:37:20,330 não verificar se algo é menor que 0 ou maior do que 10 928 00:37:20,330 --> 00:37:22,260 para você, porque como sabemos de antemão que tipo de 929 00:37:22,260 --> 00:37:23,130 int que você quer? 930 00:37:23,130 --> 00:37:25,880 Mas podemos minimamente verificar para você, se o usuário pelo menos 931 00:37:25,880 --> 00:37:26,730 digite um número inteiro? 932 00:37:26,730 --> 00:37:30,500 E se não o fez, nós gritar com o usuário digitando "repetir" na 933 00:37:30,500 --> 00:37:31,440 tela. 934 00:37:31,440 --> 00:37:34,210 >> Portanto, agora temos um programa que é looping. Okay. 935 00:37:34,210 --> 00:37:37,070 Agora, qual destes é o melhor tipo de construção? 936 00:37:37,070 --> 00:37:39,060 Então é aqui que as coisas começam a ficar um pouco confuso, o 937 00:37:39,060 --> 00:37:42,360 fato de que você deve se lembrar de declarar uma variável-se aqui 938 00:37:42,360 --> 00:37:44,630 se você quiser usá-lo dentro de alguns 939 00:37:44,630 --> 00:37:46,460 chaves e fora. 940 00:37:46,460 --> 00:37:48,490 Mas mesmo que isso parece um pouco enigmática em primeiro 941 00:37:48,490 --> 00:37:50,750 vista, apenas mais uma vez, lembre-se a lógica simples. 942 00:37:50,750 --> 00:37:54,630 A fim de usar qualquer coisa em C, se é uma função ou 943 00:37:54,630 --> 00:37:57,680 é uma variável, você tem que incluí-lo se é uma função 944 00:37:57,680 --> 00:37:59,770 em alguma biblioteca, ou você precisa declarar. 945 00:37:59,770 --> 00:38:02,405 Mas agora você precisa estar consciente extra do fato de que 946 00:38:02,405 --> 00:38:04,940 você está declarando que no âmbito direita. 947 00:38:04,940 --> 00:38:08,150 Você não está colocando muita força dentro de parênteses. 948 00:38:08,150 --> 00:38:09,410 >> Então deixe-me realmente reverter. 949 00:38:09,410 --> 00:38:12,660 Se voltarmos ao nosso, por exemplo, de mais cedo, e eu vou 950 00:38:12,660 --> 00:38:19,245 de volta para para int, int i = 0; i <10, i + +, e eu 951 00:38:19,245 --> 00:38:26,370 printf fazer estrelas, como este, em seguida, paren perto, e agora 952 00:38:26,370 --> 00:38:30,410 printf i é agora - 953 00:38:30,410 --> 00:38:33,500 de acordo com a mesma lógica, o que vai acontecer quando eu tento 954 00:38:33,500 --> 00:38:35,500 compilar este programa? 955 00:38:35,500 --> 00:38:36,790 AUDIÊNCIA: identificador inválido. 956 00:38:36,790 --> 00:38:38,560 DAVID J. MALAN: Então é outro identificador inválido, 957 00:38:38,560 --> 00:38:39,470 identificador não declarado. 958 00:38:39,470 --> 00:38:41,810 Agora, a razão é um pouco diferente. 959 00:38:41,810 --> 00:38:44,370 Há, obviamente, não há chaves aqui, mas o mesmo 960 00:38:44,370 --> 00:38:46,790 idéia, a mesma história de escopo se aplica. 961 00:38:46,790 --> 00:38:50,340 Se você declarou uma variável como i dentro de uma 962 00:38:50,340 --> 00:38:53,960 loop for, mesmo se você não tiver explicitamente escrito o crespo 963 00:38:53,960 --> 00:38:56,980 chaves, pensar-los mentalmente como ainda estar lá, em que 964 00:38:56,980 --> 00:39:00,310 caso eu só é válido dentro do loop. 965 00:39:00,310 --> 00:39:03,080 Não é válido quando você chegar para a próxima linha, que em 966 00:39:03,080 --> 00:39:05,090 neste caso, é agora 10. 967 00:39:05,090 --> 00:39:09,060 Assim, apenas algumas questões de âmbito e similares. 968 00:39:09,060 --> 00:39:12,620 Tudo bem, alguma dúvida? 969 00:39:12,620 --> 00:39:15,310 >> Tudo bem, então esse é um tipo de programa trivial pouco, 970 00:39:15,310 --> 00:39:17,450 imprimir apenas pequenas estrelas. 971 00:39:17,450 --> 00:39:20,400 Mas vamos ver se você se lembra desta música aqui. 972 00:39:20,400 --> 00:39:22,530 Esta é uma música extremamente irritante as crianças cantavam em 973 00:39:22,530 --> 00:39:23,550 o ônibus escolar e afins. 974 00:39:23,550 --> 00:39:25,990 Mas o que é bom nisso é que ele tem essa ciclicidade, 975 00:39:25,990 --> 00:39:27,910 qual é "99 garrafas de cerveja na parede, 976 00:39:27,910 --> 00:39:28,520 99 garrafas de cerveja. 977 00:39:28,520 --> 00:39:31,030 Tome um para baixo, passe adiante, 98 garrafas de cerveja na 978 00:39:31,030 --> 00:39:34,330 parede. "E então a canção repete a 97, depois 96, depois 979 00:39:34,330 --> 00:39:38,040 95, 94, todo o caminho para 0 se você realmente tem que 980 00:39:38,040 --> 00:39:38,920 agora no ônibus. 981 00:39:38,920 --> 00:39:41,960 Portanto, este é um bom programa para classificar de implemento, porque a minha 982 00:39:41,960 --> 00:39:43,650 Deus, se você poderia apenas implementar isso com alguns 983 00:39:43,650 --> 00:39:46,660 linhas de código, você pode cuspir as letras inteiras para este 984 00:39:46,660 --> 00:39:48,240 canção muito rapidamente. 985 00:39:48,240 --> 00:39:50,420 Mas ao longo do caminho, podemos começar agora desmembrar alguns 986 00:39:50,420 --> 00:39:52,460 dessas construções básicas looping e agora também 987 00:39:52,460 --> 00:39:55,830 introduzir funções que nós escrevemos nós mesmos, retornar valores 988 00:39:55,830 --> 00:39:57,020 que passar ao redor. 989 00:39:57,020 --> 00:39:58,910 Mas, primeiro, por que não ir em frente e ter a nossa cinco minutos 990 00:39:58,910 --> 00:39:59,320 quebrar aqui? 991 00:39:59,320 --> 00:40:01,480 E quando voltarmos, vamos cantar essa música. 992 00:40:05,680 --> 00:40:08,760 >> Tudo bem, então estamos de volta. 993 00:40:08,760 --> 00:40:11,850 E quando eu digo agora vamos cantar essa música, eu quero dizer 994 00:40:11,850 --> 00:40:13,250 programaticamente, não verbalmente. 995 00:40:13,250 --> 00:40:19,370 Portanto, temos aqui beer1.c, que é uma implementação deste 996 00:40:19,370 --> 00:40:20,580 música em particular. 997 00:40:20,580 --> 00:40:23,110 E só para ficar claro, para aqueles não familiarizados com o que 998 00:40:23,110 --> 00:40:24,460 esta coisa parece, deixe-me ir em frente 999 00:40:24,460 --> 00:40:27,070 e fazer beer1, Enter. 1000 00:40:27,070 --> 00:40:30,400 Agora deixe-me correr beer1, eo que vamos ver - quantas garrafas 1001 00:40:30,400 --> 00:40:31,140 de cerveja haverá? 1002 00:40:31,140 --> 00:40:33,240 Eu vou digitar em 99, como diz a canção. 1003 00:40:33,240 --> 00:40:34,040 Enter. 1004 00:40:34,040 --> 00:40:35,650 E agora se percorrer - 1005 00:40:35,650 --> 00:40:38,280 oops - se percorrer tudo isso, nós vamos ver que 1006 00:40:38,280 --> 00:40:41,350 este, de fato, cantar a música inteira. 1007 00:40:44,050 --> 00:40:44,540 Espere um minuto. 1008 00:40:44,540 --> 00:40:46,240 Minha barra de rolagem é um pouco confuso. 1009 00:40:46,240 --> 00:40:47,940 Vamos usar a janela maior. 1010 00:40:47,940 --> 00:40:53,500 Então beer1, 99, lá vamos nós. 1011 00:40:53,500 --> 00:40:56,420 Portanto, temos aqui toda a música, cantada muito mais rápido do 1012 00:40:56,420 --> 00:40:58,450 computador do que poderia ter sido por nós. 1013 00:40:58,450 --> 00:41:00,340 Então, observe, porém, a natureza cíclica aqui. 1014 00:41:00,340 --> 00:41:03,380 Ele diz que 99, então 99, em seguida, "tomar um baixo, passá-lo 1015 00:41:03,380 --> 00:41:04,740 volta ", então 98. 1016 00:41:04,740 --> 00:41:06,640 E agora ele repete uma e outra vez. 1017 00:41:06,640 --> 00:41:08,840 >> Portanto, esta é realmente uma oportunidade perfeita para algum tipo de 1018 00:41:08,840 --> 00:41:10,400 looping construir. 1019 00:41:10,400 --> 00:41:12,950 Repare que eu sou o tipo de corte de um canto aqui. 1020 00:41:12,950 --> 00:41:15,960 Repare que eu estou dizendo "98 garrafas de cerveja na parede, 1021 00:41:15,960 --> 00:41:19,010 97 garrafas de cerveja na parede ", e que era tão 1022 00:41:19,010 --> 00:41:21,640 que quando chegarmos a um garrafas de cerveja, eu não tenho 1023 00:41:21,640 --> 00:41:23,300 se preocupar com a gramática do Inglês. 1024 00:41:23,300 --> 00:41:25,790 Mas também podemos corrigir isso com um pouco mais de um se 1025 00:41:25,790 --> 00:41:26,910 condição, talvez. 1026 00:41:26,910 --> 00:41:30,110 Se esse número é singular, vá em frente e dizer "garrafa", 1027 00:41:30,110 --> 00:41:31,840 caso contrário, se ele é plural, dizer "garrafas". 1028 00:41:31,840 --> 00:41:34,150 Mas, por agora, estou completamente corte que canto. 1029 00:41:34,150 --> 00:41:35,520 Então vamos ver o que temos aqui. 1030 00:41:35,520 --> 00:41:37,150 Então, nós temos alguns comentários no topo. 1031 00:41:37,150 --> 00:41:39,450 Estou incluindo estas duas bibliotecas, como 1032 00:41:39,450 --> 00:41:41,140 temos sido comumente. 1033 00:41:41,140 --> 00:41:43,610 E agora deixe-me rolar para a primeira 1034 00:41:43,610 --> 00:41:44,990 linhas de código. 1035 00:41:44,990 --> 00:41:47,020 Linha 17 começa principal. 1036 00:41:47,020 --> 00:41:50,610 Linha 21 e 20 tem o número de garrafas de cerveja haverá? 1037 00:41:50,610 --> 00:41:52,060 E então eu chamo GetInt. 1038 00:41:52,060 --> 00:41:53,800 E agora eu tenho um pouco de um teste de sanidade. 1039 00:41:53,800 --> 00:41:57,030 >> Portanto, esta é uma convenção que vamos agora começar a adoptar para 1040 00:41:57,030 --> 00:41:59,620 mais rigor verificar a entrada do usuário. 1041 00:41:59,620 --> 00:42:01,710 Às vezes você apenas não quer levá-los novamente 1042 00:42:01,710 --> 00:42:02,630 e de novo e de novo. 1043 00:42:02,630 --> 00:42:05,620 Se o usuário se parafusos e não cooperar, tudo bem. 1044 00:42:05,620 --> 00:42:07,430 Saia e simplesmente não lidar com eles. 1045 00:42:07,430 --> 00:42:08,990 E é isso que eu estou fazendo aqui. 1046 00:42:08,990 --> 00:42:12,520 Se n é menor do que 1, eu estou indo só para gritar com o usuário, 1047 00:42:12,520 --> 00:42:14,330 "Desculpe, isso não faz sentido." E então eu vou 1048 00:42:14,330 --> 00:42:16,650 arbitrariamente retornar 1. 1049 00:42:16,650 --> 00:42:18,550 Então, novamente, esta é apenas uma convenção para se acostumar. 1050 00:42:18,550 --> 00:42:19,850 Por agora, levá-lo na fé. 1051 00:42:19,850 --> 00:42:22,700 Mas, até agora, temos sido sempre retornando 0, porque 1052 00:42:22,700 --> 00:42:25,204 dissemos retornando 0 denota o quê? 1053 00:42:25,204 --> 00:42:26,000 AUDIÊNCIA: Sucesso. 1054 00:42:26,000 --> 00:42:27,320 DAVID J. MALAN: Sucesso, isso é tudo. 1055 00:42:27,320 --> 00:42:29,740 Portanto, agora que finalmente estamos começando a pensar em 1056 00:42:29,740 --> 00:42:31,330 não-sucessos - 1057 00:42:31,330 --> 00:42:33,760 em outras palavras, os casos de canto, as condições de erro - 1058 00:42:33,760 --> 00:42:37,520 agora eu tenho uma fonte infinita, ou pelo menos quatro bilião 1059 00:42:37,520 --> 00:42:39,790 possíveis coisas que podem dar errado em meus programas. 1060 00:42:39,790 --> 00:42:42,300 E eu posso começar a atribuir-lhes números individuais. 1061 00:42:42,300 --> 00:42:44,340 Agora, geralmente basta apenas voltar 1062 00:42:44,340 --> 00:42:45,730 algo diferente de 0. 1063 00:42:45,730 --> 00:42:48,040 Então, nós vamos simplesmente retornar um por agora. 1064 00:42:48,040 --> 00:42:51,440 Mas a razão para retornar 1 é que, logo que você voltar 1065 00:42:51,440 --> 00:42:55,110 1, acho que o que acontece com o resto do programa? 1066 00:42:55,110 --> 00:42:55,720 Que ele pare. 1067 00:42:55,720 --> 00:42:56,560 É isso aí. 1068 00:42:56,560 --> 00:42:59,150 Assim, o fato de que estou retornando 1 é efetivamente 1069 00:42:59,150 --> 00:43:02,950 curto-circuito a execução deste programa, de modo que 1070 00:43:02,950 --> 00:43:06,780 nada abaixo da linha de 27 vai continuar a execução. 1071 00:43:06,780 --> 00:43:09,210 Assim que retorna principais, que é ele. 1072 00:43:09,210 --> 00:43:13,160 >> Tudo bem, por isso, se o usuário faz cooperar e chegar a linha 30 1073 00:43:13,160 --> 00:43:15,680 porque digitaram um número legítimo, aqui é o meu 1074 00:43:15,680 --> 00:43:16,990 implementação desta canção. 1075 00:43:16,990 --> 00:43:19,050 Então eu primeiro imprimir um caractere de nova linha, apenas para 1076 00:43:19,050 --> 00:43:19,880 estética. 1077 00:43:19,880 --> 00:43:21,500 Agora tenho um loop. 1078 00:43:21,500 --> 00:43:22,930 E repare que eu estou fazendo as coisas com um pouco 1079 00:43:22,930 --> 00:43:23,880 de uma direção diferente. 1080 00:43:23,880 --> 00:43:26,210 Eu não tenho que fazer menos do que, eu não tenho que fazer + +. 1081 00:43:26,210 --> 00:43:30,660 Eu posso dizer que em vez inicializar uma variável i, configurá-lo igual a 1082 00:43:30,660 --> 00:43:35,080 n, o número que o usuário digitou, então faça o seguinte, de forma 1083 00:43:35,080 --> 00:43:39,590 enquanto i é maior que 0, então i - 1084 00:43:39,590 --> 00:43:42,070 uma vez que você terminar uma iteração deste loop. 1085 00:43:42,070 --> 00:43:44,310 Assim, podemos contar para baixo, usando um loop também. 1086 00:43:44,310 --> 00:43:47,520 Agora, esta é uma semana bastante coisas agora, com printf. 1087 00:43:47,520 --> 00:43:51,770 Assim impressão "% garrafas d de cerveja na parede." Print "% d 1088 00:43:51,770 --> 00:43:54,990 garrafas de cerveja. "" Tome uma para baixo, passe adiante. "Imprimir 1089 00:43:54,990 --> 00:43:58,880 "% D garrafas de cerveja na parede." Então ainda é d%, mas 1090 00:43:58,880 --> 00:44:02,770 notar que o argumento de printf está mudando. 1091 00:44:02,770 --> 00:44:05,840 Após a vírgula, tenho eu, porque eu quero dizer 99. 1092 00:44:05,840 --> 00:44:08,590 Após esta vírgula, tenho eu, porque eu quero dizer 99. 1093 00:44:08,590 --> 00:44:14,030 Após esta vírgula, tenho i - 1, porque eu quero dizer 98 em 1094 00:44:14,030 --> 00:44:16,260 esta primeira iteração, e assim por diante. 1095 00:44:16,260 --> 00:44:18,520 E agora aqui, eu só tenho uma observação estúpida. 1096 00:44:18,520 --> 00:44:22,270 E depois a linha 42, eu retornar 0, por convenção, o que significa que 1097 00:44:22,270 --> 00:44:23,650 está tudo ok. 1098 00:44:23,650 --> 00:44:24,490 >> Então, o que se eu goofed? 1099 00:44:24,490 --> 00:44:26,350 O que pode um erro comum aqui estar? 1100 00:44:26,350 --> 00:44:29,200 Bem, e se eu acidentalmente disse bem, eu quero contar 1101 00:44:29,200 --> 00:44:31,640 a 0, eu quero 0 garrafas de cerveja na parede? 1102 00:44:31,640 --> 00:44:34,620 Então, digo, i é superior ou igual a 0. 1103 00:44:34,620 --> 00:44:38,920 O que vai ser o sintoma de que agora eu ver se eu recompilar 1104 00:44:38,920 --> 00:44:41,173 beer1 e executá-lo? 1105 00:44:41,173 --> 00:44:42,120 AUDIÊNCIA: Negativo. 1106 00:44:42,120 --> 00:44:43,590 DAVID J. MALAN: Sim, ele vai ir negativo. 1107 00:44:43,590 --> 00:44:45,950 Este é um erro off-by-one, incrivelmente 1108 00:44:45,950 --> 00:44:47,270 erro comum de fazer. 1109 00:44:47,270 --> 00:44:48,960 Vamos realmente voltar para a janela do terminal e fazê-lo 1110 00:44:48,960 --> 00:44:50,620 aqui, para que possamos ver mais de uma vez. 1111 00:44:50,620 --> 00:44:53,280 Enter, 99 garrafas de cerveja. 1112 00:44:53,280 --> 00:44:56,580 Perto, mas fomos sempre tão pouco longe demais. 1113 00:44:56,580 --> 00:45:00,500 Nós cantamos a música muito baixo, de modo que agora atingiu o 1114 00:45:00,500 --> 00:45:01,510 número negativo. 1115 00:45:01,510 --> 00:45:03,680 Por isso, não funciona muito bem. 1116 00:45:03,680 --> 00:45:06,450 >> Tudo bem, então podemos facilmente corrigir isso, indo de volta para a 1117 00:45:06,450 --> 00:45:07,650 jeito que era. 1118 00:45:07,650 --> 00:45:10,360 Mas o que são algumas oportunidades agora para 1119 00:45:10,360 --> 00:45:11,190 melhoria? 1120 00:45:11,190 --> 00:45:17,200 Bem, deixe-me abrir beer2.c e desça aqui e dar uma 1121 00:45:17,200 --> 00:45:19,310 olhar para esta versão. 1122 00:45:19,310 --> 00:45:21,370 Qual é a primeira coisa que salta em você como diferente 1123 00:45:21,370 --> 00:45:23,715 nesta versão aqui? 1124 00:45:23,715 --> 00:45:24,190 AUDIÊNCIA: [inaudível]. 1125 00:45:24,190 --> 00:45:26,510 DAVID J. MALAN: Sim, assim, não mais eu, porque ocorreu a 1126 00:45:26,510 --> 00:45:29,350 mim que você sabe o que eu estou pedindo ao usuário para n, e então eu sou 1127 00:45:29,350 --> 00:45:33,580 definindo i igual a n, e então eu vou mudar eu, mas eu nunca sou 1128 00:45:33,580 --> 00:45:34,590 n tocando novamente. 1129 00:45:34,590 --> 00:45:37,390 Então o que diabos era o ponto de você alocar outro 32 1130 00:45:37,390 --> 00:45:45,210 bits chamado i apenas para que eu possa ter uma variável diferente? 1131 00:45:45,210 --> 00:45:47,960 Portanto, neste caso, eu meio que reconheceu que desnecessária 1132 00:45:47,960 --> 00:45:49,190 característica de projeto. 1133 00:45:49,190 --> 00:45:52,730 E agora vou dizer enquanto n é maior que 0, ir 1134 00:45:52,730 --> 00:45:56,180 frente e imprimir a mesma canção, passando um n para printf como o 1135 00:45:56,180 --> 00:46:00,210 segundo argumento, e n - 1 como o segundo argumento aqui. 1136 00:46:00,210 --> 00:46:02,930 E então, em cada iteração do loop, vá em frente e apenas 1137 00:46:02,930 --> 00:46:05,080 decrementar o próprio n. 1138 00:46:05,080 --> 00:46:06,960 Agora, funcionalmente, este programa 1139 00:46:06,960 --> 00:46:08,010 vai ser idênticas. 1140 00:46:08,010 --> 00:46:10,730 Se eu digitar 99, n começa em 99. 1141 00:46:10,730 --> 00:46:12,890 Eu decremento, decremento, decremento, decremento. 1142 00:46:12,890 --> 00:46:15,875 Eu estou indo para obter todo o caminho para "Uma garrafa de cerveja em 1143 00:46:15,875 --> 00:46:16,740 a parede, uma garrafa de cerveja. 1144 00:46:16,740 --> 00:46:18,020 Tome um para baixo, passe adiante. 1145 00:46:18,020 --> 00:46:21,480 0 garrafas de cerveja na parede. "O fim, porque eu fiz 1146 00:46:21,480 --> 00:46:23,200 obter a condição correta. 1147 00:46:23,200 --> 00:46:24,280 É maior que 0. 1148 00:46:24,280 --> 00:46:26,220 Eu não cometer este erro. 1149 00:46:26,220 --> 00:46:28,470 >> Então, o que é melhor, uma versão ou a versão de dois? 1150 00:46:31,380 --> 00:46:33,480 Então eu ouvi um monte de murmúrios para dois. 1151 00:46:33,480 --> 00:46:34,730 Por que dois? 1152 00:46:37,210 --> 00:46:38,225 O que é isso? 1153 00:46:38,225 --> 00:46:39,215 AUDIÊNCIA: [inaudível]. 1154 00:46:39,215 --> 00:46:40,070 DAVID J. MALAN: Ah, ok. 1155 00:46:40,070 --> 00:46:42,870 Então ele não vai abaixo de 0, mas lembre-se, em uma versão, a 1156 00:46:42,870 --> 00:46:45,870 versão original correto não ir abaixo de 0 também. 1157 00:46:45,870 --> 00:46:48,340 Então lembre-se que esta é a versão correta. 1158 00:46:48,340 --> 00:46:51,630 Então, vamos pelo menos comparar as duas versões corretas. 1159 00:46:51,630 --> 00:46:53,300 O que é um argumento a favor da versão 1160 00:46:53,300 --> 00:46:55,146 dois sendo, mmm, melhor? 1161 00:46:55,146 --> 00:46:55,642 Sim? 1162 00:46:55,642 --> 00:46:57,630 AUDIÊNCIA: Ele usa menos espaço. 1163 00:46:57,630 --> 00:46:59,530 DAVID J. MALAN: Ok, então ele usa menos espaço, certo? 1164 00:46:59,530 --> 00:47:02,900 Considerando uma versão de 32 bits usado para n, e depois outro 1165 00:47:02,900 --> 00:47:07,680 32 bits para i. 1166 00:47:07,680 --> 00:47:10,060 Versão dois apenas usa 32 bits para n, a fim de que 1167 00:47:10,060 --> 00:47:11,700 parece ser uma vantagem. 1168 00:47:11,700 --> 00:47:12,950 Outros pensamentos? 1169 00:47:18,070 --> 00:47:21,520 Alguém quer argumentar em favor de uma? 1170 00:47:21,520 --> 00:47:22,070 Sim? 1171 00:47:22,070 --> 00:47:25,240 AUDIÊNCIA: Você tem que usar linha extra de código para n -. 1172 00:47:25,240 --> 00:47:26,090 >> DAVID J. MALAN: Ok, com certeza. 1173 00:47:26,090 --> 00:47:26,960 Então, isso é justo. 1174 00:47:26,960 --> 00:47:29,040 Portanto, este justo, pelo menos para mim - 1175 00:47:29,040 --> 00:47:31,940 Quer dizer, isso realmente se sente um pouco mais confuso, o fato de que 1176 00:47:31,940 --> 00:47:35,120 Eu não posso classificar de encapsular toda a minha lógica em um 1177 00:47:35,120 --> 00:47:38,030 linha bonita, o loop, como o laço for possível. 1178 00:47:38,030 --> 00:47:40,240 Aqui, eu meio que tenho para alinhavar este n - 1179 00:47:40,240 --> 00:47:41,120 no fim do ciclo, porque 1180 00:47:41,120 --> 00:47:42,550 é logicamente necessário. 1181 00:47:42,550 --> 00:47:45,190 Mas que tipo de esfrega-me o caminho errado, apenas porque 1182 00:47:45,190 --> 00:47:48,260 parece separada da lógica de até aqui, embora, 1183 00:47:48,260 --> 00:47:49,430 mais uma vez, que é necessário. 1184 00:47:49,430 --> 00:47:50,990 Outros pensamentos? 1185 00:47:50,990 --> 00:47:51,490 Sim? 1186 00:47:51,490 --> 00:47:52,740 AUDIÊNCIA: [inaudível]. 1187 00:47:57,990 --> 00:47:58,350 >> DAVID J. MALAN: Yeah. 1188 00:47:58,350 --> 00:48:00,730 Assim que se você em vez disso, no final da canção, queria 1189 00:48:00,730 --> 00:48:02,950 imprimir novamente o nome da música? 1190 00:48:02,950 --> 00:48:05,660 Como "Obrigado por jogar 99 garrafas de cerveja", ou algo assim 1191 00:48:05,660 --> 00:48:06,690 bobagem como essa? 1192 00:48:06,690 --> 00:48:09,750 Mas o ponto é, você queria ter acesso ao valor original. 1193 00:48:09,750 --> 00:48:13,180 O fato de você ter mutado ou mudado em cada n 1194 00:48:13,180 --> 00:48:16,330 iteração e, portanto, ter destruído o seu valor original 1195 00:48:16,330 --> 00:48:18,650 Significa que você não pode fazer isso no final. 1196 00:48:18,650 --> 00:48:20,660 Agora, sem dúvida, nós claramente não quer fazer 1197 00:48:20,660 --> 00:48:21,450 que neste programa. 1198 00:48:21,450 --> 00:48:22,350 Então, quem se importa? 1199 00:48:22,350 --> 00:48:23,630 Mas isso é um ponto muito válido. 1200 00:48:23,630 --> 00:48:25,520 E para ser honesto, realmente não há uma 1201 00:48:25,520 --> 00:48:26,630 direito responder aqui. 1202 00:48:26,630 --> 00:48:28,740 Ambos são igualmente corretas. 1203 00:48:28,740 --> 00:48:30,210 Eu poderia ser convencido de qualquer maneira. 1204 00:48:30,210 --> 00:48:33,310 Posso dizer que, em geral, é um bom princípio, se você 1205 00:48:33,310 --> 00:48:36,030 perguntou o usuário para algum valor e você armazenado em uma variável 1206 00:48:36,030 --> 00:48:38,730 como n, apenas uma espécie de em princípio, é provavelmente bom 1207 00:48:38,730 --> 00:48:40,160 para manter esta situação. 1208 00:48:40,160 --> 00:48:43,400 E todos os dados que você quer se transformar de novo e de novo, apenas 1209 00:48:43,400 --> 00:48:46,030 dar-te uma cópia da variável, apenas para que você 1210 00:48:46,030 --> 00:48:47,830 ter acesso ao original. 1211 00:48:47,830 --> 00:48:51,040 Você está gastando mais de 32 bits, mas a realidade é esta 1212 00:48:51,040 --> 00:48:53,490 computador, como, dois gigabytes de memória RAM estes dias, 1213 00:48:53,490 --> 00:48:55,310 e nós estamos discutindo acerca de 32 bits? 1214 00:48:55,310 --> 00:48:56,320 Realmente não um negócio tão grande. 1215 00:48:56,320 --> 00:48:58,550 E mesmo neste dispositivo aqui, com uma meia de um show ou uma 1216 00:48:58,550 --> 00:49:01,700 gigabyte de memória RAM, 32 bits versus 64 bits, 1217 00:49:01,700 --> 00:49:02,920 não um grande negócio. 1218 00:49:02,920 --> 00:49:05,890 Certamente, hoje, que vai ser muito oprimido pelo tamanho 1219 00:49:05,890 --> 00:49:08,400 do programa em si, que vai ser centenas 1220 00:49:08,400 --> 00:49:10,890 kilobytes, se não alguns megabytes, estes dias. 1221 00:49:10,890 --> 00:49:13,550 >> Então preocupações razoáveis, não uma resposta certa. 1222 00:49:13,550 --> 00:49:15,490 Mas pelo menos esses são os pensamentos que deve começar a 1223 00:49:15,490 --> 00:49:16,790 passar por sua mente? 1224 00:49:16,790 --> 00:49:19,600 Porque em pset 0, mesmo que nós realmente só esperar 1225 00:49:19,600 --> 00:49:22,340 correção, ou pelo menos a renúncia de vários bugs que 1226 00:49:22,340 --> 00:49:25,440 você pode ter encontrado, à medida que avançamos, o design é 1227 00:49:25,440 --> 00:49:27,910 vai ser outro aspecto fundamental, tanto de escrever código 1228 00:49:27,910 --> 00:49:29,770 e também a avaliação de código. 1229 00:49:29,770 --> 00:49:32,310 E assim, pelo menos, reflectir sobre coisas como esta. 1230 00:49:32,310 --> 00:49:35,590 E só porque algo funciona não significa que ele é bom, 1231 00:49:35,590 --> 00:49:37,130 não quer dizer que é bem concebido. 1232 00:49:37,130 --> 00:49:38,820 E isso é uma das coisas que os companheiros de ensino e 1233 00:49:38,820 --> 00:49:41,990 conjuntos de problemas nos ajudará a provocar peça ao longo do tempo. 1234 00:49:41,990 --> 00:49:45,020 >> Bem, o que dizer, vamos dizer, esta versão aqui? 1235 00:49:45,020 --> 00:49:49,090 Deixe-me fazer algo um pouco sexy aqui em um momento. 1236 00:49:49,090 --> 00:49:50,740 Primeiro deixe-me livrar desta. 1237 00:49:50,740 --> 00:49:54,120 E agora vamos corrigir esse problema gramatical. 1238 00:49:54,120 --> 00:49:58,780 Assim, nesta versão, eu quero corrigir a gramática de forma que, 1239 00:49:58,780 --> 00:50:02,460 ao invés de apenas dizer s entre parênteses, como "garrafa" 1240 00:50:02,460 --> 00:50:03,360 ou "garrafas" - 1241 00:50:03,360 --> 00:50:04,900 Eu não quero cortar esse canto - 1242 00:50:04,900 --> 00:50:08,350 Eu também quero imprimir dinamicamente a palavra "garrafas" 1243 00:50:08,350 --> 00:50:12,820 ou "garrafa", assim, usando espaços reservados estes% s hoje. 1244 00:50:12,820 --> 00:50:16,550 Então eu preciso condicionalmente verificar qual é o valor de i. 1245 00:50:16,550 --> 00:50:19,590 E se é um, eu quero dizer "garrafa", e se é qualquer coisa 1246 00:50:19,590 --> 00:50:23,115 outra coisa, eu quero dizer "garrafas". Então, vamos tentar fazer isso. 1247 00:50:23,115 --> 00:50:31,340 Então, se eu == 1, então deixe-me ir em frente e declarar - 1248 00:50:31,340 --> 00:50:34,080 Eu preciso de uma string, então deixe-me fazer string s1, porque é a 1249 00:50:34,080 --> 00:50:36,070 primeira corda que me importa agora. 1250 00:50:36,070 --> 00:50:40,980 Eu vou dizer "garrafa". E então, vamos ver, string 1251 00:50:40,980 --> 00:50:43,110 s2 - e eu vou explicar para onde estou indo em um momento - 1252 00:50:43,110 --> 00:50:47,650 "Garrafas". Então, lembrar que, nesta música, precisamos ser capazes 1253 00:50:47,650 --> 00:50:50,580 para imprimir coisas, duas palavras diferentes potencialmente. 1254 00:50:50,580 --> 00:50:53,590 Então, se olharmos para trás, aqui, notar que quando chegarmos ao 1255 00:50:53,590 --> 00:50:56,440 este exemplo aqui ", duas garrafas de cerveja na parede, 1256 00:50:56,440 --> 00:50:59,490 duas garrafas de cerveja, tomar um para baixo, passe adiante ", eu quero 1257 00:50:59,490 --> 00:51:02,380 esta quarta linha para agora dizer "uma garrafa de cerveja na 1258 00:51:02,380 --> 00:51:04,900 parede ". Então eu preciso decidir, eu quero dizer" garrafas "ou 1259 00:51:04,900 --> 00:51:07,780 "Garrafa"? Então eu vou dizer arbitrariamente, tudo bem, 1260 00:51:07,780 --> 00:51:10,530 Vou agora declarar uma variável chamada s1 string, 1261 00:51:10,530 --> 00:51:13,830 um, que vai ficar ligado aqui e também aqui, 1262 00:51:13,830 --> 00:51:16,070 porque essas palavras são sempre idênticos, apenas por causa da 1263 00:51:16,070 --> 00:51:17,290 natureza da música. 1264 00:51:17,290 --> 00:51:20,100 E eu vou chamar s2 qualquer palavra que eu quero 1265 00:51:20,100 --> 00:51:21,560 eventualmente aparecem por aqui. 1266 00:51:21,560 --> 00:51:25,530 Agora, literalmente, 99 vezes de 100, que vai ser o 1267 00:51:25,530 --> 00:51:28,820 mesmo em ambos os casos, porque 3 é plural, 2 é 1268 00:51:28,820 --> 00:51:30,200 plural, 4 é plural. 1269 00:51:30,200 --> 00:51:34,640 Mas, neste caso, canto, onde se obter a 2 e, em seguida, 1, ou 1270 00:51:34,640 --> 00:51:37,250 mesmo 1 e 0, eu preciso esta lógica. 1271 00:51:37,250 --> 00:51:41,020 Então eu tenho que passar algum tempo no meu código recebendo esse direito. 1272 00:51:41,020 --> 00:51:47,530 Então, se eu fizer isso, se i == 1, então s1 definido igual a "garrafa" 1273 00:51:47,530 --> 00:51:52,010 e s2 igual a "garrafas", porque isso vai ser para um 1274 00:51:52,010 --> 00:51:56,340 garrafa, e isto será por 0 garrafas. 1275 00:51:56,340 --> 00:51:58,250 E este aqui, o que isso representa? 1276 00:51:58,250 --> 00:51:59,780 Só para ficar claro. 1277 00:51:59,780 --> 00:52:00,620 Este é apenas um comentário. 1278 00:52:00,620 --> 00:52:03,730 Assim, o fato de que você pode ter comentários de uma linha significa que você 1279 00:52:03,730 --> 00:52:06,110 pode comentar o seu código como este, mas outro comum 1280 00:52:06,110 --> 00:52:09,050 paradigma, também, é que se você tem uma frase super-curto que 1281 00:52:09,050 --> 00:52:11,410 você quer colocar a si mesmo e que é apenas mais legível para colocar 1282 00:52:11,410 --> 00:52:13,270 que à direita no final da linha de código, você pode 1283 00:52:13,270 --> 00:52:15,230 absolutamente fazer algo assim. 1284 00:52:15,230 --> 00:52:20,150 >> Então agora o que se eu fizer isso? Else if i não é igual a 1. 1285 00:52:20,150 --> 00:52:21,620 Então estrondo iguais - 1286 00:52:21,620 --> 00:52:23,150 ponto de exclamação é conhecido como "bang". 1287 00:52:23,150 --> 00:52:25,080 Então estrondo = 1. 1288 00:52:25,080 --> 00:52:28,530 Então, se eu não for igual a 1, o que eu quero fazer em vez? 1289 00:52:28,530 --> 00:52:31,700 Bem, a primeira palavra que eu quero ser o que? 1290 00:52:34,620 --> 00:52:40,030 Então deve ser uma cadeia de "garrafas" para garrafas plurais, 1291 00:52:40,030 --> 00:52:42,440 e então este será plural "garrafas", bem como, por agora. 1292 00:52:42,440 --> 00:52:43,800 E vamos ver se isso realmente nos leva a 1293 00:52:43,800 --> 00:52:44,870 onde queremos ir. 1294 00:52:44,870 --> 00:52:47,680 Portanto, agora se eu rolar por aqui, perceber que eu estou conectando 1295 00:52:47,680 --> 00:52:50,170 Não só eu, mas S1. 1296 00:52:50,170 --> 00:52:51,860 Estou ligando i e S1. 1297 00:52:51,860 --> 00:52:54,440 E, em seguida, aqui em baixo, sou menos 1, o qual é o mesmo que 1298 00:52:54,440 --> 00:52:55,920 antes, mas s2. 1299 00:52:55,920 --> 00:52:58,730 Em outras palavras, eu quero a palavra Inglês para mudar de acordo 1300 00:52:58,730 --> 00:52:59,930 nessa lógica. 1301 00:52:59,930 --> 00:53:03,310 Agora, já há alguns problemas neste código. 1302 00:53:03,310 --> 00:53:08,460 O que está quebrado já fora do portão aqui? 1303 00:53:08,460 --> 00:53:10,796 Sim? 1304 00:53:10,796 --> 00:53:13,210 AUDIÊNCIA: [inaudível]. 1305 00:53:13,210 --> 00:53:13,800 >> DAVID J. MALAN: Exatamente. 1306 00:53:13,800 --> 00:53:16,030 Então eu já violou a lição de escopo. 1307 00:53:16,030 --> 00:53:19,610 Então eu declarou S1 e S2, mas eu tenho feito isso dentro de 1308 00:53:19,610 --> 00:53:22,980 chaves, o que significa que, sim, esse código irá trabalhar até 1309 00:53:22,980 --> 00:53:27,430 até a linha 42, mas assim que eu bati linha 43, acho que não 1310 00:53:27,430 --> 00:53:28,900 existe mais? 1311 00:53:28,900 --> 00:53:32,600 Bem, acho que já não é de âmbito - nem S1 ou S2. 1312 00:53:32,600 --> 00:53:33,780 Então nós temos que corrigir isso. 1313 00:53:33,780 --> 00:53:36,180 Então deixe-me apagar as declarações. 1314 00:53:36,180 --> 00:53:39,320 E eu vou deixar os nomes das variáveis ​​e apague esta aqui 1315 00:53:39,320 --> 00:53:40,120 e excluir isso aqui. 1316 00:53:40,120 --> 00:53:43,557 E em que linhas devo realmente declarar essas coisas? 1317 00:53:43,557 --> 00:53:44,960 AUDIÊNCIA: [inaudível]. 1318 00:53:44,960 --> 00:53:45,410 DAVID J. MALAN: Sim, então, provavelmente, 1319 00:53:45,410 --> 00:53:46,850 até aqui, 33-ish. 1320 00:53:46,850 --> 00:53:50,670 Assim string s1 e string s2. 1321 00:53:50,670 --> 00:53:51,950 E não é que, eu posso fazer isso. 1322 00:53:51,950 --> 00:53:54,260 Se você está declarando duas variáveis ​​do mesmo tipo, 1323 00:53:54,260 --> 00:53:57,420 você pode realmente usar apenas uma vírgula e fazer isso em C. Todos 1324 00:53:57,420 --> 00:53:58,970 bem, agora eu tenho duas variáveis ​​- 1325 00:53:58,970 --> 00:53:59,860 S1 e S2. 1326 00:53:59,860 --> 00:54:02,000 Estou atribuindo-lhes valores nestes 1327 00:54:02,000 --> 00:54:04,210 condições aqui, ou aqui. 1328 00:54:04,210 --> 00:54:06,690 E então eu estou usando-as abaixo. 1329 00:54:06,690 --> 00:54:10,960 Como está isso agora vai dar certo? 1330 00:54:10,960 --> 00:54:12,740 >> Bem, é ainda um pouco de buggy, mas vamos pelo menos ver 1331 00:54:12,740 --> 00:54:13,730 quão longe chegamos. 1332 00:54:13,730 --> 00:54:16,500 Então deixe-me ir em frente e fazer beer3. 1333 00:54:16,500 --> 00:54:17,695 É este beer3? 1334 00:54:17,695 --> 00:54:19,410 Sim, este é beer3. 1335 00:54:19,410 --> 00:54:21,510 E agora deixe-me ir em frente e correr beer3. 1336 00:54:21,510 --> 00:54:23,820 399 99. 1337 00:54:23,820 --> 00:54:25,840 Provavelmente, podemos ignorar a maioria deles. 1338 00:54:25,840 --> 00:54:29,100 E aqui em baixo, olha isso. 1339 00:54:29,100 --> 00:54:31,110 "Uma garrafa de cerveja na parede, uma garrafa de cerveja, tomar 1340 00:54:31,110 --> 00:54:34,306 um para baixo, passe adiante, 0 garrafas de cerveja na parede. " 1341 00:54:34,306 --> 00:54:37,570 Mas eu estou chamando a sua atenção para apenas metade da solução. 1342 00:54:37,570 --> 00:54:39,620 Tipo de asneira aqui. 1343 00:54:39,620 --> 00:54:43,030 Portanto, parece que os casos de canto surgem quando i é igual o que 1344 00:54:43,030 --> 00:54:44,030 dois valores? 1345 00:54:44,030 --> 00:54:45,020 AUDIÊNCIA: 2, 1. 1346 00:54:45,020 --> 00:54:46,190 DAVID J. MALAN: 2 e 1. 1347 00:54:46,190 --> 00:54:48,180 Não é um e não 1. 1348 00:54:48,180 --> 00:54:51,890 É realmente apenas estas duas últimas estrofes desta música. 1349 00:54:51,890 --> 00:54:53,890 Então o que eu quero fazer em vez? 1350 00:54:53,890 --> 00:54:58,890 Assim, parece-me ter apanhado o caso em que se i é == a 1, 1351 00:54:58,890 --> 00:55:02,240 em seguida, a primeira palavra é "garrafa", mas a segunda palavra 1352 00:55:02,240 --> 00:55:07,230 é "garrafas". Mas aqui, eu quero mudar isso seja == 2. 1353 00:55:07,230 --> 00:55:08,570 E se este for o caso, o que eu quero a 1354 00:55:08,570 --> 00:55:09,620 primeira palavra a ser? 1355 00:55:09,620 --> 00:55:10,430 AUDIÊNCIA: "Garrafas". 1356 00:55:10,430 --> 00:55:12,890 DAVID J. MALAN: "Garrafas", assim para duas garrafas. 1357 00:55:12,890 --> 00:55:14,690 E então esta palavra aqui deve ser - 1358 00:55:14,690 --> 00:55:15,340 AUDIÊNCIA: "Bottle". 1359 00:55:15,340 --> 00:55:17,316 DAVID J. MALAN: "Bottle", no singular. 1360 00:55:20,430 --> 00:55:25,160 >> Tudo bem, vamos diminuir o zoom, voltar aqui, re-executar o make, 1361 00:55:25,160 --> 00:55:28,590 re-run beer3 tipo, 99 novamente. 1362 00:55:28,590 --> 00:55:30,710 Ok, "Falha de segmentação (núcleo)." 1363 00:55:30,710 --> 00:55:32,780 O que eu fiz de errado? 1364 00:55:36,050 --> 00:55:38,722 AUDIÊNCIA: Você não tem um valor [inaudível]. 1365 00:55:38,722 --> 00:55:40,480 DAVID J. MALAN: Ah ponto, excelente. 1366 00:55:40,480 --> 00:55:43,310 Tudo bem, então o que está errado aqui? 1367 00:55:43,310 --> 00:55:45,450 Assim falha de segmentação, e nós estamos indo realmente para ver 1368 00:55:45,450 --> 00:55:49,020 este algumas vezes no futuro, deliberadamente. 1369 00:55:49,020 --> 00:55:51,030 Mas, por agora, o que isso realmente significa? 1370 00:55:51,030 --> 00:55:53,620 Uma falha de segmentação quase sempre significa que você tem 1371 00:55:53,620 --> 00:55:56,760 de alguma forma, tentou acessar memória RAM, em seu computador, 1372 00:55:56,760 --> 00:56:00,600 que você não possui, que você não tenha realmente pediu o 1373 00:56:00,600 --> 00:56:02,050 sistema operacional para. 1374 00:56:02,050 --> 00:56:04,440 Portanto, neste caso, observe o que eu fiz, que é 1375 00:56:04,440 --> 00:56:05,870 falha na minha lógica. 1376 00:56:05,870 --> 00:56:09,500 Eu atribuído S1 e S2 um valor se eu for igual a 1. 1377 00:56:09,500 --> 00:56:11,590 Também fiz que se eu for igual a 2. 1378 00:56:11,590 --> 00:56:13,710 Mas eu não tenho feito isso no número infinito de outros 1379 00:56:13,710 --> 00:56:14,690 possibilidades - 1380 00:56:14,690 --> 00:56:17,940 em particular, 3 ou 4, ou um ponto, ponto, ponto, 99. 1381 00:56:17,940 --> 00:56:20,100 Então, uma correção para isso poderia ser apenas vamos 1382 00:56:20,100 --> 00:56:22,190 ter uma condição mais. 1383 00:56:22,190 --> 00:56:26,780 E deixe-me entrar aqui e dizer s1 iguais - 1384 00:56:26,780 --> 00:56:28,180 o que deveria estar aqui? 1385 00:56:28,180 --> 00:56:28,750 AUDIÊNCIA: [inaudível]. 1386 00:56:28,750 --> 00:56:30,460 >> DAVID J. MALAN: "Garrafas", porque, em casos comuns, 1387 00:56:30,460 --> 00:56:32,020 É exatamente a mesma coisa. 1388 00:56:32,020 --> 00:56:35,580 Então é igual citações, unquote, "garrafas". Então, para o plural 1389 00:56:35,580 --> 00:56:41,010 garrafas, e em seguida, até aqui, para garrafas de plural. 1390 00:56:41,010 --> 00:56:44,580 Ok, então agora deixe-me voltar para a minha janela de terminal, 1391 00:56:44,580 --> 00:56:47,200 recompilar, re-executá-lo. 1392 00:56:47,200 --> 00:56:48,440 99. 1393 00:56:48,440 --> 00:56:49,150 Ufa. 1394 00:56:49,150 --> 00:56:50,610 E vamos fazer um teste de sanidade rápido. 1395 00:56:50,610 --> 00:56:52,400 Tecnicamente, nós queremos ler tudo isso para ter certeza de 1396 00:56:52,400 --> 00:56:53,370 estão corretas, mas vamos olhar para 1397 00:56:53,370 --> 00:56:54,640 menos os culpados conhecidos. 1398 00:56:54,640 --> 00:56:57,370 3 garrafas, 2 garrafas, 2 garrafas, 1 1399 00:56:57,370 --> 00:57:00,380 garrafa, uma garrafa, 0 garrafas. 1400 00:57:00,380 --> 00:57:03,080 Parece que temos, pelo menos, fixa-lo por enquanto. 1401 00:57:03,080 --> 00:57:06,010 Mas a questão aqui é que o que uma bagunça terrível deus este é 1402 00:57:06,010 --> 00:57:07,470 apenas para resolver um estúpido 1403 00:57:07,470 --> 00:57:09,540 um personagem-detalhe gramatical. 1404 00:57:09,540 --> 00:57:11,150 Portanto, há um tipo de razão que eu cortar este canto 1405 00:57:11,150 --> 00:57:14,090 antes, porque é apenas completamente chato ter que 1406 00:57:14,090 --> 00:57:15,020 escrever este código muito. 1407 00:57:15,020 --> 00:57:17,530 Mas acontece que há maneiras ligeiramente mais elegantes de 1408 00:57:17,530 --> 00:57:20,110 expressando exatamente a mesma coisa. 1409 00:57:20,110 --> 00:57:22,040 E nós podemos fazer isso da seguinte forma. 1410 00:57:22,040 --> 00:57:23,890 >> Permita-me deixar isso na tela por um momento e 1411 00:57:23,890 --> 00:57:27,320 introduzir algo conhecido como um operador ternário. 1412 00:57:27,320 --> 00:57:29,600 Este é um tipo de um forro que é apenas a intenção de fazer o nosso 1413 00:57:29,600 --> 00:57:31,880 vive um pouco mais sexy, como prometido. 1414 00:57:31,880 --> 00:57:33,130 E eu vou fazer isso da seguinte forma. 1415 00:57:33,130 --> 00:57:35,810 Dê-me uma string chamada s1, e deixe-me 1416 00:57:35,810 --> 00:57:37,200 atribuí-lo como segue. 1417 00:57:37,200 --> 00:57:39,900 (I == 1)? 1418 00:57:39,900 --> 00:57:47,820 "Garrafa", caso contrário, "garrafas". String s2 recebe (i == 2)? 1419 00:57:47,820 --> 00:57:52,670 "Garrafa", caso contrário, "garrafas". 1420 00:57:52,670 --> 00:57:57,050 Então, o que é então a diferença aqui? 1421 00:57:57,050 --> 00:57:59,370 Estas duas linhas de código, argumentam, pode 1422 00:57:59,370 --> 00:58:02,200 substituir toda esta confusão. 1423 00:58:02,200 --> 00:58:04,280 Então, eu chamo isso de bagunça, só porque é o tipo de esfrega-me o 1424 00:58:04,280 --> 00:58:05,940 maneira errada de que é tantas linhas de código. 1425 00:58:05,940 --> 00:58:06,650 Não é errado. 1426 00:58:06,650 --> 00:58:07,700 Não é má concepção. 1427 00:58:07,700 --> 00:58:10,140 Tipo, isso é perfeitamente correta e perfeitamente bem. 1428 00:58:10,140 --> 00:58:12,970 Mas codificação fica aborrecido se você tem de expressar-se de modo 1429 00:58:12,970 --> 00:58:15,530 caramba especificamente novo e de novo e de novo com um simples 1430 00:58:15,530 --> 00:58:16,620 cenário como este. 1431 00:58:16,620 --> 00:58:19,470 Então C tem alguns atalhos, como este. 1432 00:58:19,470 --> 00:58:24,270 Portanto, este é essencialmente dizendo declarar uma string chamada s1 1433 00:58:24,270 --> 00:58:32,610 atribuir qualquer valor este ou este valor se i é == - 1434 00:58:32,610 --> 00:58:35,290 desculpe, eu deveria dizer isso mais claramente. 1435 00:58:35,290 --> 00:58:41,680 Declare uma variável s1, atribuir este valor se isto é verdade. 1436 00:58:41,680 --> 00:58:44,280 Caso contrário, atribuir-lhe este valor. 1437 00:58:44,280 --> 00:58:47,220 Assim, em outras palavras, este é um tipo de forma de uma linha de 1438 00:58:47,220 --> 00:58:51,490 dizendo que se mais, mas fazendo um trabalho ao longo do caminho. 1439 00:58:51,490 --> 00:58:55,540 Então, se eu for 1, então vá em frente e chamam isso de "garrafa". E 1440 00:58:55,540 --> 00:58:59,830 então essa pessoa, chamá-lo de "garrafas". Enquanto isso, s2, o 1441 00:58:59,830 --> 00:59:04,060 segunda palavra que precisamos definir, se eu for igual a 2, vamos 1442 00:59:04,060 --> 00:59:08,350 s2 definir a "garrafa". Caso contrário, defina-o para "garrafas". E o que 1443 00:59:08,350 --> 00:59:11,460 isso significa que agora é que eu posso passar por isso e apagar todos 1444 00:59:11,460 --> 00:59:12,860 essas linhas de código. 1445 00:59:12,860 --> 00:59:17,220 E quando eu digo, um pouco ridícula, que este é agora 1446 00:59:17,220 --> 00:59:20,060 mais sexy, é mais sexy em um tipo de senso de estilo. 1447 00:59:20,060 --> 00:59:22,660 O fato de que funcionalmente, esse código é realmente vai 1448 00:59:22,660 --> 00:59:24,610 fazer exatamente a mesma coisa. 1449 00:59:24,610 --> 00:59:26,890 E, embora possa parecer um pouco enigmática em primeiro 1450 00:59:26,890 --> 00:59:29,250 olhar, porque não vi essa construção antes, eu 1451 00:59:29,250 --> 00:59:31,850 argumentam que ele é, em última análise vai ser muito mais 1452 00:59:31,850 --> 00:59:34,820 legível e muito mais fácil para nós, humanos, para classificar de 1453 00:59:34,820 --> 00:59:36,830 compreender, porque agora você pode apenas ler o 1454 00:59:36,830 --> 00:59:38,830 código em uma única linha. 1455 00:59:38,830 --> 00:59:41,550 Ainda é semelhante em espírito a um a se, sempre que tal se 1456 00:59:41,550 --> 00:59:44,920 condição e isso é o que está dentro do caso e este 1457 00:59:44,920 --> 00:59:46,480 é o que está dentro da pessoa. 1458 00:59:46,480 --> 00:59:49,450 Mas podemos fazer isso apenas muito mais elegante. 1459 00:59:49,450 --> 00:59:52,650 >> E se eu agora vou voltar para o meu terminal, tendo eliminado todos 1460 00:59:52,650 --> 00:59:55,530 dessas linhas e os substituiu com apenas esses dois, 1461 00:59:55,530 --> 01:00:00,150 recompilar, re-run garrafas de cerveja com 99, aviso que minha 1462 01:00:00,150 --> 01:00:03,350 gramática é, na verdade, ainda está correto. 1463 01:00:03,350 --> 01:00:06,160 Então, novamente, algo para começar. 1464 01:00:06,160 --> 01:00:08,840 2 garrafas de cerveja, uma garrafa de cerveja. 1465 01:00:08,840 --> 01:00:09,370 Parece certo. 1466 01:00:09,370 --> 01:00:10,100 Sim. 1467 01:00:10,100 --> 01:00:13,900 Portanto, temos uma solução muito mais sucinta. 1468 01:00:13,900 --> 01:00:16,020 Portanto, isto também, como você se sentir mais confortável com C, não 1469 01:00:16,020 --> 01:00:18,630 necessariamente com o pset primeiro ou mesmo segundo, mas 1470 01:00:18,630 --> 01:00:21,170 perceber que essas construções podem permitir-nos a fazer coisas que nunca 1471 01:00:21,170 --> 01:00:22,810 mais elegante. 1472 01:00:22,810 --> 01:00:25,200 Agora vamos fazer uma outra coisa aqui. 1473 01:00:25,200 --> 01:00:31,460 Deixe-me ir em frente e abrir return1.c. 1474 01:00:31,460 --> 01:00:34,340 Agora vamos começar a resolver outro problema de uma forma que 1475 01:00:34,340 --> 01:00:37,140 nos permite escrever código mais sofisticado. 1476 01:00:37,140 --> 01:00:39,960 >> Então aqui está um programa simples e pequeno, cujo objetivo na vida 1477 01:00:39,960 --> 01:00:41,870 é incrementar valores. 1478 01:00:41,870 --> 01:00:43,100 E, na verdade, vamos dar um passo para trás. 1479 01:00:43,100 --> 01:00:44,400 Deixe-me fazer isso manualmente. 1480 01:00:44,400 --> 01:00:52,200 Deixe-me fazer incluir e int main (void). 1481 01:00:52,200 --> 01:00:53,450 E deixe-me chamar esta increment.c. 1482 01:00:57,150 --> 01:00:58,570 E o que eu quero fazer? 1483 01:00:58,570 --> 01:01:02,240 Eu estou indo para ir em frente e dizer algo como - 1484 01:01:02,240 --> 01:01:04,280 vamos ligar para os números o mesmo - 1485 01:01:04,280 --> 01:01:04,980 int x. 1486 01:01:04,980 --> 01:01:13,670 Então x int recebe 2; x printf é% d, a nova linha, x. 1487 01:01:13,670 --> 01:01:16,780 Então, eu estou digitando rápido, mas tipo de coisa familiar agora. 1488 01:01:16,780 --> 01:01:18,830 Então eu vou fazer x + +. 1489 01:01:18,830 --> 01:01:21,710 Então eu vou para imprimir essa mesma frase novamente. 1490 01:01:21,710 --> 01:01:24,550 E então eu vou retornar 0 apenas para sair do programa. 1491 01:01:24,550 --> 01:01:25,960 Tudo bem, então este é um programa que 1492 01:01:25,960 --> 01:01:26,960 incrementos de um número. 1493 01:01:26,960 --> 01:01:29,830 É primeiro indo para inicializar algo a dois, e então é 1494 01:01:29,830 --> 01:01:33,470 vai incrementá-lo e imprimi-lo novamente. 1495 01:01:33,470 --> 01:01:36,930 >> Então vamos correr incremento, programa extremamente simples. 1496 01:01:36,930 --> 01:01:40,940 Mas suponho que agora que eu quero cubo o valor, assim como 1497 01:01:40,940 --> 01:01:42,490 algo um tanto arbitrária. 1498 01:01:42,490 --> 01:01:45,140 E eu realmente quero fazer x recebe o cubo da mesma. 1499 01:01:45,140 --> 01:01:47,570 Então eu poderia usar o que é chamado a função pow, mas eu não 1500 01:01:47,570 --> 01:01:48,650 realmente sei onde é ainda. 1501 01:01:48,650 --> 01:01:50,580 Então eu vou fazer isso da maneira old-fashioned. 1502 01:01:50,580 --> 01:01:54,550 x vezes o que equivale a x vezes x vezes x. 1503 01:01:54,550 --> 01:01:56,880 Então, eu estou cubing o valor, multiplicando-se por si mesmo novamente 1504 01:01:56,880 --> 01:02:00,440 e de novo e de novo, para que possamos obter o poder 1505 01:02:00,440 --> 01:02:02,050 de 3 neste caso. 1506 01:02:02,050 --> 01:02:06,000 Portanto, agora os números que eu deveria imprimir deve ser, como veremos 1507 01:02:06,000 --> 01:02:08,450 aqui - fazer incremento, por isso é, na verdade, não é realmente incrementar 1508 01:02:08,450 --> 01:02:10,260 mais, mas vamos deixar o nome sozinho - 1509 01:02:10,260 --> 01:02:11,590 2 e, em seguida, 8. 1510 01:02:11,590 --> 01:02:17,670 Agora, temos o início de uma oportunidade para o refinamento 1511 01:02:17,670 --> 01:02:21,570 aqui, segundo a qual essa coisa cubagem da multiplicação de um número 1512 01:02:21,570 --> 01:02:24,680 por si só, por si só, por si só, se sente como isso pode ser apenas 1513 01:02:24,680 --> 01:02:27,920 útil ter como função, bem como alguém decidiu 1514 01:02:27,920 --> 01:02:30,430 anos - você sabe, tipo de útil se um de nós se senta 1515 01:02:30,430 --> 01:02:33,120 e escreve printf para que o resto do mundo pode usá-lo, 1516 01:02:33,120 --> 01:02:36,160 por que não sentar e escrever uma função chamada cube 1517 01:02:36,160 --> 01:02:39,250 que faz isso cubagem para nós para que não tem que manualmente 1518 01:02:39,250 --> 01:02:41,500 implementar a noção de cubagem valores aqui? 1519 01:02:41,500 --> 01:02:44,040 >> Assim, um exemplo simples, mas vamos em frente e usar isso é como um 1520 01:02:44,040 --> 01:02:46,280 oportunidade de escrever a nossa própria função. 1521 01:02:46,280 --> 01:02:49,110 Então, até agora, só usei principal, e nós usamos outro 1522 01:02:49,110 --> 01:02:51,780 funções das pessoas, mas não ter escrito o nosso. 1523 01:02:51,780 --> 01:02:52,650 Então, vamos lá. 1524 01:02:52,650 --> 01:02:56,330 Eu estou indo para ir em frente e escrever uma função chamada cubo. 1525 01:02:56,330 --> 01:02:58,490 E eu vou ter que tomar uma entrada. 1526 01:02:58,490 --> 01:03:02,070 Portanto, sua entrada vai ser um inteiro. 1527 01:03:02,070 --> 01:03:03,570 E o que é que vai fazer? 1528 01:03:03,570 --> 01:03:08,500 Vai declarar saída int = Entrada de entrada vezes 1529 01:03:08,500 --> 01:03:09,880 input vezes. 1530 01:03:09,880 --> 01:03:12,190 E então ele vai voltar essa saída. 1531 01:03:12,190 --> 01:03:14,500 E então eu tenho que ser específico agora. 1532 01:03:14,500 --> 01:03:16,820 Esta função vai retornar um int. 1533 01:03:16,820 --> 01:03:19,130 Então, aqui, então, é como você escrever suas próprias funções. 1534 01:03:19,130 --> 01:03:20,850 Você primeiro decidir o que é o nome do seu 1535 01:03:20,850 --> 01:03:21,720 função vai ser. 1536 01:03:21,720 --> 01:03:23,964 E, geralmente, algo explicativo é bom, então eu vou 1537 01:03:23,964 --> 01:03:25,060 chamá-lo de cubo. 1538 01:03:25,060 --> 01:03:27,180 Então você tem que especificar o que ele vai voltar, o que é 1539 01:03:27,180 --> 01:03:28,240 sua saída vai ser. 1540 01:03:28,240 --> 01:03:29,595 E não temos opções que muitos ainda. 1541 01:03:29,595 --> 01:03:32,260 Int, char, float, bool, string. 1542 01:03:32,260 --> 01:03:34,260 Por enquanto, eu vou ficar com um int, porque eu quero 1543 01:03:34,260 --> 01:03:35,880 para retornar um inteiro. 1544 01:03:35,880 --> 01:03:38,770 Então você tem que especificar o que suas entradas, se houver, são. 1545 01:03:38,770 --> 01:03:41,570 E se cubo tem um argumento, leva algo entre 1546 01:03:41,570 --> 01:03:44,970 parênteses, você tem que dar esse argumento um nome para que 1547 01:03:44,970 --> 01:03:47,860 você pode chamá-lo de algo como você está implementando ou escrever 1548 01:03:47,860 --> 01:03:50,550 esta função, e você tem que dar um tipo, que neste 1549 01:03:50,550 --> 01:03:51,810 caso vai ser int. 1550 01:03:51,810 --> 01:03:54,690 Assim, em breve, o cubo é uma função que recebe um inteiro 1551 01:03:54,690 --> 01:03:57,560 como entrada e retorna um inteiro como saída. 1552 01:03:57,560 --> 01:03:59,240 >> Então, o que fazer com essa entrada? 1553 01:03:59,240 --> 01:04:03,710 Bem, na linha 14, eu declarar uma variável chamada de saída, e eu 1554 01:04:03,710 --> 01:04:07,410 atribuir-lhe o valor, a entrada de entrada de entrada vezes vezes. 1555 01:04:07,410 --> 01:04:11,490 E então eu retornar a saída. 1556 01:04:11,490 --> 01:04:14,890 Então, como posso usar isso, então? 1557 01:04:14,890 --> 01:04:19,210 O que faço para mudar esses personagens destacados em linha 1558 01:04:19,210 --> 01:04:21,006 7 seja, que você acha? 1559 01:04:21,006 --> 01:04:21,800 AUDIÊNCIA: [inaudível]. 1560 01:04:21,800 --> 01:04:25,570 DAVID J. MALAN: Sim, então cubo de x. 1561 01:04:25,570 --> 01:04:28,290 Então x é uma variável, o que significa que tem algum valor. 1562 01:04:28,290 --> 01:04:30,190 Felizmente, é do tipo inteiro. 1563 01:04:30,190 --> 01:04:34,280 E porque é um int x, o que significa que eu posso passá-lo em cubo. 1564 01:04:34,280 --> 01:04:39,500 E mesmo que eu estou substituindo o valor de x com o valor 1565 01:04:39,500 --> 01:04:42,780 x de cubo, tal como tem sido o caso até agora, qualquer hora 1566 01:04:42,780 --> 01:04:46,150 tem sinal de igual e uma linha de código, o material sobre o direito 1567 01:04:46,150 --> 01:04:49,090 é executado e depois é atribuído ao 1568 01:04:49,090 --> 01:04:50,150 valor do lado esquerdo. 1569 01:04:50,150 --> 01:04:52,950 Portanto, a ordem de operações é como seria de esperar. 1570 01:04:52,950 --> 01:04:56,620 Então, isso funciona? 1571 01:04:56,620 --> 01:04:58,410 Bem, deixe-me ir para baixo aqui. 1572 01:04:58,410 --> 01:04:59,970 Deixe-me abrir a minha janela de terminal. 1573 01:04:59,970 --> 01:05:03,610 Deixe-me faça incremento, Enter. 1574 01:05:03,610 --> 01:05:07,140 "Declaração implícita de 'cubo' função é inválida em 1575 01:05:07,140 --> 01:05:13,700 C99. "Como um aparte, C99 refere-se à linguagem C como era 1576 01:05:13,700 --> 01:05:16,790 definido em 1999, que foi uma atualização sobre a versão de 1577 01:05:16,790 --> 01:05:19,360 1989, que é uma actualização em relação ao original. 1578 01:05:19,360 --> 01:05:21,740 Então, isso é tudo o que isso significa. 1579 01:05:21,740 --> 01:05:24,250 >> Então, o que significa que a declaração "implícita de 1580 01:05:24,250 --> 01:05:26,790 'cubo' função é inválido? "É aqui mesmo. 1581 01:05:26,790 --> 01:05:28,430 É ali na linha 12. 1582 01:05:28,430 --> 01:05:30,460 AUDIÊNCIA: [inaudível]. 1583 01:05:30,460 --> 01:05:30,730 DAVID J. MALAN: O que é isso? 1584 01:05:30,730 --> 01:05:32,470 AUDIÊNCIA: Não é antes. 1585 01:05:32,470 --> 01:05:33,540 DAVID J. MALAN: Não é antes. 1586 01:05:33,540 --> 01:05:34,740 Portanto, esta é a coisa. 1587 01:05:34,740 --> 01:05:38,190 C é uma espécie de idiota, ou compiladores C são uma espécie de estúpida. 1588 01:05:38,190 --> 01:05:41,060 Eles realmente só fazer o que lhes dizem para fazer. 1589 01:05:41,060 --> 01:05:44,770 E eles, em particular, apenas ler seu código topo para a base, 1590 01:05:44,770 --> 01:05:45,620 esquerda para a direita. 1591 01:05:45,620 --> 01:05:49,140 Então, se o compilador, Clang, está lendo o seu código, linha 1, 1592 01:05:49,140 --> 01:05:50,120 descobre como fazer isso. 1593 01:05:50,120 --> 01:05:50,940 Oh, aqui vem principal. 1594 01:05:50,940 --> 01:05:53,000 Ok, deixe-me ir em frente e declarar uma variável x. 1595 01:05:53,000 --> 01:05:54,160 Deixe-me imprimir algo. 1596 01:05:54,160 --> 01:05:55,890 Linha 7, o que diabos é cubo? 1597 01:05:55,890 --> 01:05:58,230 Não é declarada em stdio.h. 1598 01:05:58,230 --> 01:06:00,950 Ele não vem com C. Eu não tenho nenhuma idéia do que fazer. 1599 01:06:00,950 --> 01:06:03,960 E assim Clang apenas socorre e encerra com a mensagem de erro. 1600 01:06:03,960 --> 01:06:05,850 Assim, podemos corrigir isso em um par de formas. 1601 01:06:05,850 --> 01:06:10,530 Podemos ensinar Clang o cubo é apenas movendo onde o 1602 01:06:10,530 --> 01:06:11,820 declaração é. 1603 01:06:11,820 --> 01:06:14,640 Então eu cortei e colei no topo principal. 1604 01:06:14,640 --> 01:06:17,770 Agora percebo que só porque principal já não é primeiro, é 1605 01:06:17,770 --> 01:06:19,150 ainda executado por padrão. 1606 01:06:19,150 --> 01:06:20,060 Principal é principal. 1607 01:06:20,060 --> 01:06:21,022 É o nome da função padrão. 1608 01:06:21,022 --> 01:06:22,930 Não importa onde ele está em um arquivo. 1609 01:06:22,930 --> 01:06:26,910 Mas pelo menos agora Clang viu cubo antes de usá-lo. 1610 01:06:26,910 --> 01:06:28,500 Então, vamos ver se Clang é mais feliz agora. 1611 01:06:28,500 --> 01:06:31,410 Faça incremento, ele fez compilar este tempo. 1612 01:06:31,410 --> 01:06:33,060 >> Deixa-me correr incremento. 1613 01:06:33,060 --> 01:06:34,810 E, de fato, parece estar funcionando. 1614 01:06:34,810 --> 01:06:36,810 Agora, você pode criar cenários onde eventualmente 1615 01:06:36,810 --> 01:06:38,650 não é possível colocar todas as funções 1616 01:06:38,650 --> 01:06:39,740 acima de qualquer outra função. 1617 01:06:39,740 --> 01:06:42,140 Você vai ficar preso neste loop infinito, na realidade, 1618 01:06:42,140 --> 01:06:43,480 onde esse cara quer estar aqui, mas isso 1619 01:06:43,480 --> 01:06:44,390 cara precisa estar lá. 1620 01:06:44,390 --> 01:06:45,830 De modo que nem sempre funciona. 1621 01:06:45,830 --> 01:06:49,020 Então, felizmente, C tem uma solução mais elegante. 1622 01:06:49,020 --> 01:06:50,790 Vou colocar isso de volta onde estava, só porque eu 1623 01:06:50,790 --> 01:06:53,390 preferir, como uma questão de princípio, que principal sempre 1624 01:06:53,390 --> 01:06:55,550 no topo, porque é apenas bom para ver o que este programa 1625 01:06:55,550 --> 01:06:56,920 faz por padrão. 1626 01:06:56,920 --> 01:06:58,950 E o que eu vou fazer aqui é declarar o que é chamado 1627 01:06:58,950 --> 01:07:00,250 um protótipo. 1628 01:07:00,250 --> 01:07:05,730 Eu vou voltar a declarar minha função cubo literalmente 1629 01:07:05,730 --> 01:07:07,180 copiando e colando. 1630 01:07:07,180 --> 01:07:08,290 Na verdade, isso não é literalmente. 1631 01:07:08,290 --> 01:07:13,060 Então, literalmente copiando e colando linha 15 1632 01:07:13,060 --> 01:07:15,160 -se acima da linha 6. 1633 01:07:15,160 --> 01:07:17,010 Não importa o que esta linha acaba em. 1634 01:07:17,010 --> 01:07:18,380 Ele passa a ser na linha 4. 1635 01:07:18,380 --> 01:07:19,950 Mas tem que ser antes de principal. 1636 01:07:19,950 --> 01:07:21,150 Mas note a diferença. 1637 01:07:21,150 --> 01:07:24,100 Linha 4 termina com um ponto e vírgula, o que significa hey, 1638 01:07:24,100 --> 01:07:27,510 Clang, pegue a minha palavra de que existe uma função 1639 01:07:27,510 --> 01:07:31,350 chamado cubo que recebe um int e retorna um int. 1640 01:07:31,350 --> 01:07:33,020 Mas eu não vou dizer o que é ainda. 1641 01:07:33,020 --> 01:07:35,180 Só sei que eu prometo contar eventualmente. 1642 01:07:35,180 --> 01:07:38,490 E, de fato, agora está tudo bem que este é baixo. 1643 01:07:38,490 --> 01:07:41,275 >> Portanto, este é, geralmente, melhor, porque então no topo do 1644 01:07:41,275 --> 01:07:44,240 seu arquivo, você pode simplesmente recitar, rápido-fogo, uma linha 1645 01:07:44,240 --> 01:07:46,470 cada um, o que os nomes de suas funções são, qual o seu 1646 01:07:46,470 --> 01:07:49,120 entradas são, o que os seus resultados são. 1647 01:07:49,120 --> 01:07:52,210 E, para ser mais claro, a entrada geralmente significa argumento ou 1648 01:07:52,210 --> 01:07:54,110 parâmetro, sinônimos. 1649 01:07:54,110 --> 01:07:56,890 Saída significa valor de retorno, o que faz 1650 01:07:56,890 --> 01:07:58,700 mão de volta para mim. 1651 01:07:58,700 --> 01:08:03,420 Portanto, neste caso aqui, o cubo foi declarado no início, mas 1652 01:08:03,420 --> 01:08:06,940 definido, também conhecido como implementado, na parte inferior. 1653 01:08:06,940 --> 01:08:09,620 Então agora vamos voltar aqui e re-executar esta. 1654 01:08:09,620 --> 01:08:13,430 Então, agora deixe-me ir em frente e re-executar o make, re-executar incremento. 1655 01:08:13,430 --> 01:08:16,500 E agora parece estar funcionando muito bem. 1656 01:08:16,500 --> 01:08:19,450 Então agora podemos ir em frente e fatorar algo como o 1657 01:08:19,450 --> 01:08:23,720 cerveja exemplo para esta quarta versão. 1658 01:08:23,720 --> 01:08:25,590 Então deixe-me rolar aqui. 1659 01:08:25,590 --> 01:08:28,149 E notem que eu meio que levou essa lição para o coração agora. 1660 01:08:28,149 --> 01:08:31,140 O fato de que eu estava cantando mesma estrofe novamente e 1661 01:08:31,140 --> 01:08:34,130 uma e outra vez, a linha mesmo coro na música, sentiu 1662 01:08:34,130 --> 01:08:36,439 gosto Porque eu não fator que em uma função? 1663 01:08:36,439 --> 01:08:38,470 E, de fato, esta deve ser uma das motivações. 1664 01:08:38,470 --> 01:08:40,960 Além do fato de que alguém no mundo poderia querer 1665 01:08:40,960 --> 01:08:42,390 usar uma função cubo - 1666 01:08:42,390 --> 01:08:44,560 essa é uma boa razão para o fator algo e escrever o seu 1667 01:08:44,560 --> 01:08:45,720 função personalizada própria - 1668 01:08:45,720 --> 01:08:48,720 se há um pedaço de código em seu programa que só faz 1669 01:08:48,720 --> 01:08:51,370 sentido conceitual, que tipo de querer dar-lhe um 1670 01:08:51,370 --> 01:08:53,740 nome - como neste caso, coro, - 1671 01:08:53,740 --> 01:08:57,380 então você pode igualmente escrever que, como uma função separada. 1672 01:08:57,380 --> 01:08:59,560 Você não tem que escrever tudo em principal, se ele só 1673 01:08:59,560 --> 01:09:02,609 parece mais limpo para separá-lo e dar-lhe um nome. 1674 01:09:02,609 --> 01:09:05,529 >> Portanto, neste caso aqui, perceber que eu tenho um comentário sobre 1675 01:09:05,529 --> 01:09:06,859 esta função que só canta sobre a 1676 01:09:06,859 --> 01:09:08,630 números especificados de garrafas. 1677 01:09:08,630 --> 01:09:10,609 Note aqui que eu não preciso chamar estes 1678 01:09:10,609 --> 01:09:12,520 coisas de entrada e saída. 1679 01:09:12,520 --> 01:09:16,090 Na verdade, desta vez eu chamei meu b entrada para garrafa. 1680 01:09:16,090 --> 01:09:19,960 E notar aqui, nula sugere o que? 1681 01:09:19,960 --> 01:09:21,309 Esse refrão - 1682 01:09:21,309 --> 01:09:22,660 AUDIÊNCIA: Não devolvê-lo. 1683 01:09:22,660 --> 01:09:23,870 DAVID J. MALAN: não retorna um valor. 1684 01:09:23,870 --> 01:09:26,800 E, de fato, não tem funções para retornar valores. 1685 01:09:26,800 --> 01:09:28,060 Eles só podem fazer alguma coisa. 1686 01:09:28,060 --> 01:09:30,270 Eles podem ter o que é chamado de efeitos secundários, o que neste 1687 01:09:30,270 --> 01:09:33,109 caso é apenas um monte de imprimir na tela. 1688 01:09:33,109 --> 01:09:36,580 Então, observe que este código aqui, eu literalmente roubou 1689 01:09:36,580 --> 01:09:37,680 no exemplo anterior. 1690 01:09:37,680 --> 01:09:39,930 A única diferença é, em vez de utilizar como i meu 1691 01:09:39,930 --> 01:09:42,890 variável, agora estou usando b como minha variável. 1692 01:09:42,890 --> 01:09:45,880 Então, eu tenho b aqui, tenho b aqui, tenho b 1693 01:09:45,880 --> 01:09:47,109 menos 1 aqui. 1694 01:09:47,109 --> 01:09:49,279 Mas o código é exatamente o mesmo. 1695 01:09:49,279 --> 01:09:52,529 Mas só para te mostrar agora como podemos usar isso, deixe-me ir 1696 01:09:52,529 --> 01:09:56,780 em frente e realmente mudar este é um loop for. 1697 01:09:56,780 --> 01:10:03,850 for (i = n; i> n; i -). 1698 01:10:03,850 --> 01:10:06,230 >> Então eu roubei isso de nosso exemplo anterior. 1699 01:10:06,230 --> 01:10:08,970 Anteriormente, é na linha 37 que eu teria começado 1700 01:10:08,970 --> 01:10:10,640 cantando essa música irritante. 1701 01:10:10,640 --> 01:10:15,810 Mas em vez disso, eu só vou agora chamar coro de i. 1702 01:10:15,810 --> 01:10:16,870 Concluído. 1703 01:10:16,870 --> 01:10:20,260 Então, agora em cada iteração deste laço, eu chamo este outro 1704 01:10:20,260 --> 01:10:22,220 coro, função, que aconteceu de eu escrever. 1705 01:10:22,220 --> 01:10:24,110 Ele não foi escrito por outra pessoa de anos atrás. 1706 01:10:24,110 --> 01:10:27,930 Mas coro, por sua vez, usa printf para imprimir 1707 01:10:27,930 --> 01:10:29,840 essas quatro linhas. 1708 01:10:29,840 --> 01:10:32,720 Mas o fato de que eu estou chamando refrão novamente e novamente em um 1709 01:10:32,720 --> 01:10:35,900 laço significa que eu estou indo para obter, no final, o 1710 01:10:35,900 --> 01:10:39,310 mesma música exatamente como eu tenho até agora. 1711 01:10:39,310 --> 01:10:42,130 Assim, em breve, agora se eu olhar para trás, o meu código, apesar de 1712 01:10:42,130 --> 01:10:44,240 funcionalmente é equivalente, perceber que é 1713 01:10:44,240 --> 01:10:46,020 começando a ficar ainda mais legível. 1714 01:10:46,020 --> 01:10:48,410 Eu não sei exatamente como GetInt 1715 01:10:48,410 --> 01:10:49,250 é implementado. 1716 01:10:49,250 --> 01:10:52,050 Francamente, eu não sei como refrão é implementado. 1717 01:10:52,050 --> 01:10:52,970 Mas isso não importa para mim. 1718 01:10:52,970 --> 01:10:55,620 Eu não me importo, porque agora eu posso classificar de, como um ser humano, leia 1719 01:10:55,620 --> 01:10:57,050 este, de cima para baixo. 1720 01:10:57,050 --> 01:10:59,950 E porque as funções são nomeados de acordo com o que eles 1721 01:10:59,950 --> 01:11:02,910 fazer, o meu código é cada vez mais legível. 1722 01:11:02,910 --> 01:11:05,190 E como nossos programas de ficar muito mais complexo - 1723 01:11:05,190 --> 01:11:07,220 até o final do semestre, você vai escrever centenas de linhas 1724 01:11:07,220 --> 01:11:10,970 de código em linguagens como PHP e JavaScript e outros - 1725 01:11:10,970 --> 01:11:13,550 você verá que ele é muito mais fácil do que manter o controle de 1726 01:11:13,550 --> 01:11:14,080 o que você fez. 1727 01:11:14,080 --> 01:11:15,810 E quando você começar a colaborar com os amigos ou 1728 01:11:15,810 --> 01:11:19,010 parceiros ou colegas, você vai ser capaz de escrever muito mais 1729 01:11:19,010 --> 01:11:22,910 programas maciços de começar a se exercitar estes básica 1730 01:11:22,910 --> 01:11:23,990 blocos de construção. 1731 01:11:23,990 --> 01:11:25,550 >> Assim, com o que disse, por que não chamá-lo um dia? 1732 01:11:25,550 --> 01:11:27,190 E nós vamos vê-lo na quarta-feira. 1733 01:11:27,190 --> 01:11:33,611 [Aplausos]