[Música tocando] DAVID J MALAN: Tudo bem, boas-vindas de volta ao CS50. Este é o início de duas semanas. A palavra de um de nossos amigos no campus - se você estiver interessado, possivelmente, seja agora ou em um futuro mandato mesmo, uma vez mais confortável, o ensino alunos do ensino médio um pouco algo sobre ciência da computação, fazer a cabeça para que URL. Eles têm particular necessidade agora de professores, especialmente se você tiver teve alguma exposição à ciência da computação. Então, lembro que da última vez, nós introduzimos alguns tipos de dados, e em C Você pode ter começado a receber o seu mãos sujas com estes, assim, tanto em um conjunto de problemas. E nós tivemos um char. Portanto, em termos um tanto técnicos, o que é um char como você sabe que hoje em dia? Portanto, é um personagem, mas vamos ser mais preciso momento. O que queremos dizer com caráter ou indivíduo de char? Um personagem não-numérico - portanto, não necessariamente. Acontece que os números pares, mesmo pontuação e letras são representado com estes dados tipo conhecido como um char. Portanto, não é necessariamente alfabética. Sim? Portanto, é um caractere ASCII. Então, se você acha que volta para semana zero, quando tivemos o nosso byte de voluntários chegar e quer manter suas mãos para cima ou não é tudo, eles representavam bits. Mas coletivamente como um grupo de oito, que representou um byte. E introduziu a noção de ASCII naquela palestra, que é simplesmente uma mapeamento entre números e letras. E usa ASCII, como os seres humanos implícitas, oito bits para representar um personagem. Então, nesse sentido, se oito bits pode cada um assumir um dos dois valores - zero ou um - Isso significa que há duas possibilidades para essa pessoa - zero ou um - dois para essa pessoa, dois para este pessoa, de dois para um presente. Assim, um total de duas vezes duas vezes duas vezes dois vezes dois - para dois o oitavo lugar no total. Portanto, há um número total de caracteres 256 possível que você puder representar com oito bits. Agora, aqueles de vocês que falam da Ásia línguas pode saber que há mais personagens do mundo do que apenas As e Bs e Cs e Ds. E, de fato, ASCII não é suficiente para um monte de línguas do mundo. Mas mais sobre isso outra hora. Por enquanto, sabemos que em C, se você quiser para representar uma carta, um pedaço de pontuação, ou apenas algo caráter na natureza, nós usamos um char. E é um byte ou oito bits. Como cerca de um int? Bem, um int é um inteiro. Quantos bits, se você se lembra, é um número inteiro tipicamente? Recordação alguém? Por isso, é tipicamente 32. Na verdade, depende do computador que você está usando. Porém, no aparelho e, em muitos computadores, é de 32 bits ou quatro bytes - oito vezes quatro. E ints são apenas utilizados para o armazenamento de números, ou negativas, positivo ou zero. E se você tem 32 bits e você só se preocupam com números positivos, pode qualquer um estádio quantos possível inteiros de um computador pode representar desde zerar em cima? Portanto, seria de dois a 32, o qual é de aproximadamente quatro bilhões. Então, essas potências de dois vão ser temas recorrentes em Ciência da Computação. Como veremos, eles são bastante conveniente para trabalhar com o mesmo, se não é muito fácil de fazer as contas na cabeça de alguém. Então, vamos dizer cerca de quatro bilhões. Agora, um longo - você pode tipo de suposição. É mais do que um int. Quantos bits? Então, 64 bits ou oito bytes. Isto apenas significa que você pode representar até números maiores, maior positivo ou maiores números negativos. E quanto a flutuar? Isso é um ponto flutuante valor de 32 bits. Este é apenas um número real, algo com um ponto decimal. Mas, se em vez precisamos de mais lugares depois do ponto decimal ou você quer representar um número maior com alguns fração depois dele, você pode usar um dupla, que é de 64 bits. Mas há uma interessante takeaway aqui. Então, se ints são limitados por 32 bits e Mesmo muito longos são limitados por 64 pedaços, esse tipo de levanta a questão: E se você realmente quer contar superior a 4 bilhões para um int? Bem, você acabou de usar um longo. Mas e se você quiser contar superior de dois a 64, mais ou menos? Agora, isso é um número enorme. Mas, eventualmente, você pode realmente se preocupam com esses tipos de valores, especialmente se você estiver usando um banco de dados e começando a recolher lotes e lotes e um monte de dados e atribuição exclusiva números para cada pedaço de dados. Então nós meio que temos um problema. E da mesma forma, com ponto flutuante valores - flutuadores ou duplos - Se você só tem um número finito de pedaços, quantos números totais pudeste possivelmente representa? Bem, é menos claro quando você envolver um ponto decimal. Mas é certamente finito. Se você tem um número finito de bits, um número finito de seres humanos, um finito número de lâmpadas, certamente você pode representam apenas um número finito de valores de ponto flutuante. Mas quantos números reais são as suas no mundo? Há um infinito. Então, isso é um tipo de problema, porque nós não tem uma quantidade infinita de memória RAM ou dentro de nossos computadores. Então, algumas coisas difíceis podem acontecer. Então vamos em frente e tentar para expressar isso aqui. Deixe-me ir em frente e abrir gedit. Eu estou indo para ir em frente e salvar um arquivo chamado de "floats0.c" apenas para ser consistente com um exemplo que é disponível on-line, se você gostaria. E eu estou indo para ir em frente e defini-lo como segue - Eu estou indo para ir em frente e dizer, int void main, como costumamos fazer. E então neste programa, eu vou declaro-me uma bóia, para a 32-bit variável chamada f, arbitrariamente. E então eu estou indo para armazenar nele Eu não sei, um décimo, para 0,1. Então eu vou para expressar que, como um dividida por 10, que é perfeitamente legítimo em C. E, em seguida, na segunda linha, simplesmente pretende imprimir esse valor. Então lembro que podemos usar o familiar printf. Nós não queremos usar% i para um int. Queremos usar% f para um float. E então eu vou fazer barra invertida n, próxima citação, vírgula, f, ponto e vírgula. Então aqui está o meu programa. Já existe um bug. Alguém para quem esta clicado já quero apontar pelo menos um bug que eu fiz? Sim? Sim. Esqueci "# include" no topo, eles sintoma de que se eu tentar compilar este vai ser que o compilador vai gritar comigo, dizendo símbolo indefinido ou algo nesse sentido. Ele não entender alguma coisa como printf. Então, eu vou fazer "# include ", Salve o arquivo. E agora está na melhor forma. Mas eu também estou indo para apontar fora um detalhe novo hoje. Além de especificar lugar titulares como%% f i% s, você pode por vezes, influenciar o comportamento desse espaço reservado. Por exemplo, no caso de um flutuante valor do ponto, se eu só quero para exibir uma casa decimal após a período, eu posso realmente fazer 0.1f. Portanto, em outras palavras, separar o f e o sinal de porcentagem com 0,1, apenas dizendo printf, você pode ter um todo monte de números após o decimal apontar para mim. Mas eu só quero ver um deles. Então, eu estou indo para ir em frente agora e salvar Neste programa, entrar em meu terminal janela, e eu estou indo para ir em frente e tipo fazer flutuar 0, entrar. Eu vejo que a linha um tanto enigmática que vai começar a fazer mais sentido como nós provocá-lo para além desta semana e na próxima. Agora eu estou indo para ir em frente e executar folga zero. E, caramba. Portanto, não há outro bug aqui por algum motivo. Tenho certeza de que um décimo ou um dividido por 10, não é 0.0. Talvez eu só não estou procurando em dígitos suficientes. Então, por que não eu digo dois 0,2 ver dois casas decimais em vez de apenas um. Deixe-me voltar para a janela do meu terminal aqui e bater um par de vezes para ver a minha história. Não fazer flutuar a zero novamente, e, em seguida, novamente. E agora entrar. E agora eu tenho certeza que isso é errado. E eu poderia fazer três e quatro, e eu sou provavelmente vai continuar vendo zeros. Então, onde está o erro? Uma dividido por 10 deve ser de 0,1. Alguém quer dar uma facada em que a questão fundamental é? Sim? Eles são ambos inteiros. Então o quê? Assim, com um dividido por 10, que é o que eu faço na aritmética. E eu fico 0,1. Sim. E assim é de fato essa questão. Quando você toma um inteiro em um computador e dividi-lo por outro inteiro, o computador, por padrão vai supor que você quer um inteiro. O problema no entanto, é claro, é 0.1 que não é um número inteiro. É um número real. E assim que o computador faz por default é apenas joga fora tudo depois do ponto decimal. Não arredondar para baixo ou para cima, por si só. Ele só joga fora tudo depois do ponto decimal. E agora que faz sentido. Porque agora estamos claramente deixou com zero. Mas espere um minuto. Eu não estou vendo um zero a int. Na verdade, estou vendo 0,00. Então, como posso conciliar isso agora? Se um dividido por 10 é igual a zero, mas estou vendo 0,00, onde está recebendo convertidos de volta para um número real? Sim. Exatamente. Então, aqui em linha de cinco, quando eu realmente armazenar a 0,1, que é então truncado para zero, para dentro de um flutuador, que é efectivamente equivalentes aos armazená-lo não como um int, mas, de fato, como um float. Além disso, estou em seguida, usando printf para explicitamente imprimir esse número para dois casas decimais, embora não não pode realmente ser qualquer. Portanto, este tipo de merda, né? Aparentemente, você não pode fazer matemática, pelo menos neste nível de precisão, em um computador. Mas, certamente, há uma solução. Qual é a solução mais simples que poderia talvez fazer, mesmo que apenas intuitivamente aqui para resolver isso? Sim? Transforme os números inteiros em - sim. Mesmo se eu não tenho certeza o que é realmente está acontecendo aqui, se fundamentalmente tem a ver com esses dois estar inteiros, bem, por que não eu fazer que 10.0, tornando este 1.0, salve novamente o arquivo. Deixe-me voltar até a inferior e recompilar. Deixe-me agora reprise. E lá - agora, eu tenho o meu de um décimo representada como 0,10. Tudo bem. Então, isso não é ruim. E deixe-me apontar um outro caminho poderíamos ter resolvido isso. Deixe-me realmente rolar de volta no tempo quando tivemos isso como um décimo de um momento atrás. E deixe-me ir em frente e salve este arquivo como um nome de arquivo diferente, só para ter um pouco de checkpoint. Então essa foi uma versão. E agora deixe-me ir em frente e fazer mais uma versão. Vamos chamar esta versão dois zero indexado. E eu vou fazer, em vez isso - você sabe o quê? Adicionando ponto de zero funciona neste caso. Mas suponha que alguém fosse uma variável. Suposto 10 eram uma variável. Em outras palavras, suponha que eu não podia apenas embutir 0,0 no final desta expressão aritmética. Bem, eu posso realmente fazer alguma coisa em parênteses chamada de elenco. Posso lançar esse inteiro 10 para um float, e posso lançar aquele inteiro para um flutuar, bem. Em seguida, a matemática que vai ser feito é efectivamente dividido por 1,0 10.0, cujo resultado vai em f como antes. Então, se eu recompilar este como fazer carros alegóricos 2, e agora flutua dois, fico com a mesma responder, também. Portanto, este é um exemplo bastante artificial, para resolver este problema através da introdução de fundição. Mas, em geral, fundição vai ser uma coisa poderosa, especialmente para problema de definir dois em uma semana, quando você deseja converter um tipo de dados para outro que, no final do dia são representados da mesma maneira. No final do dia, a cada coisa que falamos até agora é apenas inteiros debaixo do capô. Ou se isso é muito baixo nível para você, eles são apenas números debaixo do capô. Mesmo os personagens, mais uma vez, lembre-se de semana zero, são números debaixo do capô. O que quer dizer, podemos converter entre tipos diferentes de números se eles são apenas bits. Podemos converter entre os números e as cartas se eles são apenas bits, e vice-versa. Fundição E desta forma é um mecanismo na programação que permite à força mudar de um tipo de dados para outro. Infelizmente, isto não é tão simples como eu teria gostado. Eu vou voltar em carros alegóricos 1, o que foi o mais simples, um simples, com 0,0 adicionada a cada um. E assim como uma reciclagem rápida, deixe-me ir em frente e recompilar isso, fazer carros alegóricos 2 - desculpe, isso é fazer carros alegóricos 1. E agora vamos executar carros alegóricos 1. E, no fundo, observe que eu realmente obter 0,1. Então, problema resolvido. Mas ainda não. Agora estou indo para obter um pouco curioso, e eu vou voltar para o meu instrução printf e dizer, você sabe o quê? Eu gostaria de confirmar que este é realmente um décimo. E eu vou querer ver isso para, digamos, cinco casas decimais. Não é um problema. Eu mudar os dois para cinco, Eu recompilar com o make. Eu reprise como flutua um. Olhando muito bom. Meus checagens pode acabar ali, mas Estou ficando um pouco mais aventureiros. Eu vou mudar 0,5-0,10. Eu quero ver 10 dígitos depois a casa decimal. E eu estou indo para ir em frente e recompilar isso e uma reprise flutua. Eu tipo de arrependimento de ter testado esta ainda mais porque a minha matemática não é tão corrigir mais, ao que parece. Mas espere um minuto, talvez isso é apenas um acaso. Talvez o computador está agindo um pouco estranho. Deixe-me ir em frente e fazer 20 pontos decimais e tranquilizar-me que eu sei como fazer a matemática. Eu sei como programar. Fazer carros alegóricos 1, recompilar, e dane-se. Isso é realmente, realmente ficando longe da marca. Então o que está acontecendo aqui? Intuitivamente, baseado em nossas suposições anteriormente sobre o tamanho dos tipos de dados, o que deve estar acontecendo aqui debaixo do capô? Sim? Exatamente. Se você quer isso muita precisão, e isso é um pedaço de um monte de precisão - 20 números depois do ponto decimal. Você não pode representar uma número arbitrário, a menos que você tem um um número arbitrário de bits. Mas não o fazemos. Para um float, só temos 32 bits. Então, se apenas 32 bits podem ser permutados numa caminho - tal como os nossos seres humanos em, fase mãos para cima ou para baixo - em um número finito de maneiras, só há um número finito de números reais pode representar com esses bits. E para que o computador eventualmente vai ter que começar a cortar cantos. O computador pode esconder os detalhes de nós por um pouco de tempo. Mas se começarmos a cutucar os números e procurando cada vez mais longe no números de fuga no número inteiro, então começamos a ver que é realmente aproximar a idéia de um décimo. E assim se vê, tragicamente, não há um número infinito de números não pode representar exactamente numa computador, pelo menos, com um número finito número de bits, uma finita quantidade de RAM. Agora, infelizmente, isso às vezes tem consequências no mundo real. Se as pessoas não chegam a apreciar este ou tipo de exame para concedido o fato que seu computador irá apenas fazer o que eles dizem que ele faça e não compreender estes subjacente detalhes de representação - que, francamente, em algumas línguas são escondido do utilizador, ao contrário em C - algumas coisas ruins podem acontecer. E o que eu pensei que iria fazer é dar um passo atrás. E trata-se de um vídeo de oito minutos. Foi ao ar há alguns anos, e dá insights sobre o que realmente pode ir errado quando você subestima estes tipos de detalhes, mesmo no tudo muito mundo real. Se pudéssemos diminuir as luzes por alguns minutos. COLUNA 1: Voltamos agora à engenharia desastres na Modern Marvels. Computadores - todos nós temos vindo a aceitar a problemas, muitas vezes frustrantes que ir com eles. Bugs, vírus e falhas de software são pequenos preços para pagar o conveniência. Mas, na alta tecnologia e de alta velocidade militar e programa espacial aplicações, o menor problema podem ser ampliados em desastre. Em 4 de junho de 1996, os cientistas preparados para lançar um foguete não tripulado Ariane 5. Ele estava transportando satélites científicos concebidos para estabelecer precisamente como o campo magnético da Terra interage com ventos solares. O foguete foi construído para o Europeu Agência Espacial e decolou de sua facilidade na costa da Guiana Francesa. JACK Ganssle: Em cerca de 37 segundo em o vôo, que notou pela primeira vez algo estava errado. Os bicos foram girando em uma maneira que eles realmente não deveria. Cerca de 40 segundos de vôo, claramente que o veículo estava em apuros. E isso é quando eles fizeram uma decisão de destruí-lo. O oficial de segurança gama, com tremenda coragem, apertou o botão, explodiu o foguete antes que ele pudesse tornar-se um perigo para a segurança pública. COLUNA 1: Esta foi a viagem inaugural do Ariane 5, e sua destruição ocorreu por causa de uma falha incorporado no software do foguete. JACK Ganssle: O problema no Ariane foi que havia um número que os 64 bits necessários para expressar. E eles queriam converter para um número de 16 bits. Eles assumido que o número nunca foi vai ser muito grande, que a maioria dos esses dígitos no 64-bit número foram zeros. Eles estavam errados. COLUNA 1: A incapacidade de um software programa para aceitar o tipo de número gerado pelo outro era na raiz da falha. O desenvolvimento de software tornou-se uma muito parte caro da nova tecnologia. O foguete Ariane 4 tinha sido muito bem sucedido, tanto do software criada por ele, também era usado no Ariane 5. PHILIP COYLE: O problema básico era que o Ariane 5 foi mais rápido, acelerados mais rápido. E o software não tinha representaram isso. COLUNA 1: A destruição do foguete foi um enorme desastre financeiro, tudo devido a um erro de software minuto. Mas esta não foi a primeira vez que dados problemas de conversão havia atormentado moderno tecnologia do foguete. JACK Ganssle: Em 1991, com o início da primeira Guerra do Golfo, o Patriot míssil experimentou um tipo semelhante de um problema de conversão de número. Como resultado, 28 soldados americanos foram mortos e cerca de 100 ficaram feridas quando o Patriot, que deveria para proteger contra Scuds entrada, não conseguiu disparar um míssil. COLUNA 1: Quando o Iraque invadiu o Kuwait e America lançou Tempestade no Deserto em início de 1991, as baterias de mísseis Patriot foram destacados para proteger a Arábia Saudita e Israel de Scud iraquiano ataques de mísseis. O Patriot é um de médio alcance EUA sistema superfície-ar fabricados por a empresa Raytheon. Theodore Postol: O tamanho do Patriot próprio interceptor é de aproximadamente 20 metros de comprimento. E pesa cerca de 2000 quilos. E ele carrega uma ogiva de cerca de - Eu acho que é cerca de 150 quilos. E a própria ogiva é um alto explosivo que tem fragmentos em torno dele. O invólucro da ogiva é concebido agir como chumbo grosso. COLUNA 1: Os mísseis são realizadas quatro por recipiente e são transportados por um semi-reboque. PHILIP COYLE: The Patriot anti-míssil sistema volta a menos de 20 anos. Ele foi originalmente concebido como um míssil de defesa aérea para abater aviões inimigos. Na primeira Guerra do Golfo, quando a guerra veio, o Exército queria usá-lo para abater Scuds, e não aviões. A força aérea iraquiana não era tanto de um problema. Mas o Exército estava preocupado com Scuds. E assim eles tentaram atualizar o Patriot. COLUNA 1: Interceptar um míssil inimigo viajando a mach cinco era vai ser bastante difícil. Mas quando o Patriot foi levado às pressas para serviço, o Exército não estava ciente de um Modificação do Iraque, que fez sua Scuds quase impossível de bater. Theodore Postol: O que aconteceu são os que foram Scuds chegando eram instáveis. Eles estavam balançando. A razão para isso era que os iraquianos, em a fim de obter 600 km de uma Míssil de 300 quilômetros de alcance, tomou peso fora da ogiva da frente. Eles fizeram a ogiva mais leve. Portanto, agora o Patriot está tentando para vir ao Scud. E, na maioria das vezes, a esmagadora maior parte do tempo, seria apenas voar pelo Scud. COLUNA 1: Uma vez que o sistema Patriot operadores perceberam o Patriot perdeu seu alvo, eles detonaram os Patriots ogiva, para evitar possíveis baixas se fosse permitido a cair no chão. Theodore Postol: Isso foi o que mais as pessoas viam como grandes bolas de fogo no céu e incompreendido como intercepta Scud de ogivas. COLUNA 1: Embora na noite céus Patriotas parecia ser sucesso destruindo Scuds, em Dhahran lá poderia haver engano quanto à sua desempenho. Lá, o sistema de radar do Patriot perdido o controle de um Scud de entrada e nunca lançado devido a uma falha do software. Foi a israelenses que descobriu que quanto maior for o sistema foi, quanto maior for o tempo de discrepância tornou-se devido a um relógio incorporado no computador do sistema. JACK Ganssle: Cerca de duas semanas antes da tragédia em Dhahran, os israelenses relatado para o Departamento de Defesa que o sistema estava a perder tempo. Depois de cerca de oito horas de funcionamento, eles notaram que o sistema é tornando-se visivelmente menos precisas. O Departamento de Defesa respondeu contando todas as baterias Patriot Para não deixar os sistemas por um longo período de tempo. Eles nunca disseram que há muito tempo era. Oito horas? 10 horas? 1000 horas? Ninguém sabia. COLUNA 1: A bateria Patriot estacionado no quartel em Dhahran e o seu relógio interno tinha sido danificado em mais de 100 horas na noite de 25 de fevereiro. JACK Ganssle: É seguido o tempo para uma precisão de cerca de um décimo de segundo. Agora, um décimo de segundo é um Número interessante, porque ele não pode ser expresso em binário exactamente, o que significa ele não pode ser expressa em exactamente qualquer computador digital moderno. É difícil de acreditar, mas usar isso como um exemplo. Vamos pegar o número de um terço. Um terceiro não pode ser expressa em decimal exatamente. Um terço está indo 0,333 on para o infinito. Não há nenhuma maneira de fazer isso com precisão absoluta em decimal. Isso é exatamente o mesmo tipo de problema que aconteceu no Patriot. Quanto mais tempo o sistema funcionou, o o pior erro de tempo se tornou. COLUNA 1: Depois de 100 horas de funcionamento, o erro em tempo foi apenas cerca de um terço de um segundo. Mas em termos de direcionamento de um míssil viajando a mach cinco, que resultou em um erro de rastreamento de mais de 600 metros. Seria um erro fatal para os soldados em Dhahran. Theodore Postol: O que aconteceu é um Scud lançamento foi detectado no início de satélites de alerta. E eles sabiam que o Scud estava chegando em sua direção geral. Eles não sabiam de onde vinha. COLUNA 1: Era agora ao radar componente do sistema Patriota defender Dhahran para localizar e manter o controle do míssil inimigo de entrada. JACK Ganssle: O radar era muito inteligente. Seria realmente seguir a posição de o Scud e então prever onde seria provavelmente a próxima vez o radar enviou um pulso para fora. Que foi chamado no portão range. Theodore Postol: Então, uma vez que o Patriot decide passou tempo suficiente para ir para trás e verificar o próximo local para este objeto detectado, ele vai voltar. Assim, quando se voltou para o mal lugar, em seguida, vê nenhum objeto. E ele decide que não havia nenhum objeto, era uma detecção falsa, e Gotas da pista. COLUNA 1: O Scud entrada desaparecido da tela do radar, e segundos depois, ele bateu para o quartel. O Scud matou 28 e foi o último demitido durante a primeira Guerra do Golfo. Tragicamente, o software atualizado chegou em Dhahran no dia seguinte. A falha de software tinha sido fixada, fechando um capítulo na conturbada história do míssil Patriot. Patriot é na verdade um acrônimo faseada para rastreamento Matriz Interceptar da meta. DAVID J MALAN: Tudo bem, então um moderando exemplo, para ter certeza. E, felizmente, estes de nível inferior erros não são algo que nós vamos normalmente tem que apreciar, certamente não com as nossas primórdios dos programas. Em vez disso, a maioria dos erros que você vai encontro será lógico na natureza, sintáctica na qual a natureza código simplesmente não funciona direito. E você sabe disso muito rápido. Mas particularmente quando chegarmos ao final do semestre, que vai tornar-se mais e mais de uma possibilidade de pensar muito sobre o projeto dos seus programas e subjacentes representação há, também, dos dados. Por exemplo, vamos apresentar MySQL, que é um motor de banco de dados populares que você pode usar com sites de armazenar dados no back-end. E você vai ter que começar a decidir a o final do semestre, não só o que tipos de dados ao longo destas linhas para usar mas exatamente quantos bits de usar, se deseja ou não que para armazenar datas como as datas e horários como vezes, e também coisas como o tamanho que você deseja que o IDs únicos para ser, digamos, os usuários em seu banco de dados. Na verdade, se algum de vocês já tiveram Facebook é responsável por algum tempo, e você sabe como ter acesso para o seu ID do usuário - que, por vezes, mostra-se em sua URL do perfil a menos que você tenha escolhido um apelido para o URL, ou se você É usado Facebook Graph API, o API disponível publicamente pelo qual você Facebook pode pedir para dados brutos - você pode ver o seu ID é numérico. E há alguns anos, essencialmente Facebook tinha a alteração da utilização o equivalente à utilização de ints longo tempo porque ao longo do tempo que os usuários vêm e vão criar muitas contas de e contas falsas, mesmo que de forma muito fácil foram capazes de esgotar algo como um 4 bilhões possível valor como um int. Então mais sobre esses tipos de questões na estrada, também. Tudo bem, de modo que estava lançando. Essa foi a imprecisão. Um casal de anúncios rápidos. Então seções começar formalmente no próximo Domingo, segunda, terça-feira. Você vai ouvir via e-mail no final desta semana como a sua atribuição seção. E você também aqui nesse ponto como para mudar sua seção se o seu cronograma agora mudou ou o seu nível de conforto agora mudou. Enquanto isso, P-set e um hacker de um são devido esta quinta-feira com a opção de estender esse prazo por o especificações a sexta-feira de uma maneira típica. Perceba que acompanha o problema especificações definidas estão as instruções sobre como usar o aparelho CS50, fazer, bem como algumas ferramentas específicas CS50 como o estilo dos anos 50, o que pode fornecer com feedback dinamicamente no qualidade do seu estilo de código e também verificar 50, que pode fornecer feedback dinâmico quanto à sua correção do código. Perdoe que ainda estamos passando fora algumas dobras com cheque 50. Alguns de seus colegas que se iniciam em torno de quatro horas na sexta-feira à noite, quando a especificação subiu ter notado desde então alguns bugs que estamos trabalhando através de e desculpas para quem experimentou frustrações desnecessárias. A culpa é minha. Mas vamos acompanhar o CS50 discutir quando isso for resolvido. Assim, uma palavra sobre os próprios pontuações. Então vai ser uma semana ou duas antes de você começar a receber feedback sobre conjuntos de problemas porque você ainda não tem um companheiro de ensino. E mesmo assim, vamos começar a avaliar o problema C coloca diante de nós voltar e avaliar zero para que você obtenha mais relevante feedback mais rapidamente. Mas, em geral por o currículo, CS50 conjuntos de problemas são avaliados ao longo do seguindo quatro eixos - escopo, correção, design e estilo. Âmbito vai ser um número tipicamente entre zero e cinco que captura quanto da pedaço que mordeu. Normalmente, você quer que isso seja cinco. Você pelo menos tentou de tudo. E notem que é um fator multiplicativo fazendo de modo que apenas uma parte da conjunto de problemas não é a melhor estratégia. Enquanto isso, o mais evidente é a importância da correção - apenas é o seu programa correto com respeitar a especificação? Este é ponderada mais deliberadamente fortemente do que os outros dois eixos de um fator de três, porque reconhecemos que normalmente você vai gastar muito mais tempo perseguindo alguns bugs, obtenção de seu código para funcionar, então você estão recuando e escolhendo nomes de variáveis ​​adequadas e as procura, que está na outra extremidade do espectro de modelo. Isso não quer dizer que o estilo não é importante, e nós vamos pregar sobre isso tempo, tanto em palestras e seções. Estilo refere à estética do seu código. Já escolheu variáveis ​​bem-nomeados que são curtos, mas pouco descritivo? É o código recuado como você já viu em palestra e de uma forma consistente com estilo dos anos 50? Por último é o projeto certo lá no meio. Design é o mais difícil uma para colocar um dedo sobre porque é muito mais subjetiva. Mas é, talvez, o mais importante de os três eixos, em termos de pedagógico valor ao longo do tempo e que este será oportunidade do companheiro de ensino para fornecer feedback qualitativo. De fato, em CS50, embora nós temos estas fórmulas e pontuações, no final do dia, estes são muito deliberadamente muito pequenos baldes - valores de ponto entre zero e três e zero e cinco. Nós não tente desenhar linhas muito grossas entre conjuntos de problemas ou entre alunos, mas sim focar tanto quanto pudermos sobre qualitativa, longhand feedback, ou digitado ou verbal de seu companheiro de ensino particular, você vai conhecer muito bem. Mas, em geral, são os pesos que os vários eixos terá. Enquanto isso, também, é importante ter em mente que você não deve presumir que uma três em cada cinco é de 60% e portanto, cerca de falhar. Três é deliberadamente feito para ser espécie de meio do caminho bom. Se você estiver recebendo trios no início do semestre, que é na verdade deveria ser uma boa lugar para começar. Se você estiver recebendo twos, feiras, há definitivamente um trabalho para pagar um pouco mais atenção, para tirar proveito de seções e horário de expediente. Se você estiver recebendo fours e cinco anos, ótimo. Mas, realmente, nós esperamos ver trajetórias entre os estudantes - muito individualizada por aluno, mas a partir o semestre aqui em uma espécie de os dois para os três gama mas terminando aqui na faixa de 4-5. Isso é o que estamos realmente procurando. E tenha em mente que o delta você expõe semana entre zero e semana 12 quando eu estou fazendo notas. Não importa para nós absolutamente como você justo no início se o seu trajetória é de fato ascendente e forte. Honestidade acadêmica - então deixe-me colocar no meu voz mais grave por apenas um momento. Portanto, este curso tem a distinção de enviando mais alunos do que qualquer outra na história da placa do anúncio, eu acredito. Temos uma espécie de contagem perdido neste ponto de quantas vezes isso acontece. E isso não é porque os alunos em 50 são mais desonesto do que o seu colegas em outros lugares. Mas perceber, também, que são muito bons em detectar este tipo de coisa. E essa é a vantagem que um aula de ciência da computação tem em que pode e nós comparar todos os alunos problema conjuntos de pares contra todos outro, não só este ano mas todos os anos anteriores. Temos a capacidade, como alunos em a classe, a Google e encontrar o código em sites como o github e fóruns de discussão. Não há absolutamente soluções para o CS50 p-define flutuando por aí. Mas se você pode encontrá-los, nós podemos encontrá-los. E tudo isso é muito automatizado e fácil e triste para nós encontrar. Mas eu quero enfatizar, também, que o política de honestidade acadêmica do curso é muito para ser muito o oposto do que o espírito. Na verdade, este ano temos reformulada coisas no currículo para ser isso, dot dot dot, com mais detalhes no programa. Mas o tema principal do curso realmente deve ser razoável. Reconhecemos que há uma significativa quantidade de pedagógico valor em colaborar, de alguma forma, com os colegas, em que você duas ou três ou mais são situando-se em um quadro branco quadro de comunicações, de modo a falar, suas idéias - escrever pseudocódigo em fotos, diagramação que deve ser Mario se você fosse escrever pela primeira vez em pseudocódigo. Qual deve ser o algoritmo guloso - como deve comportar-se por define um problema? E assim perceber que o comportamento que sugerimos é muito muito nesse sentido. E no programa, você verá uma grupo inteiro de balas sob a categoria razoável e não razoável categoria que ajuda a nos ajudar você envolver sua mente em torno de onde nós desenhar a linha. E, em geral, uma regra de ouro decente é que, se você está lutando para resolver algum bug e seu amigo ou colega está sentado ao seu lado, é razoável para que você possa mostrar-lhe seu código e dizer: ei, você pode ajudar me descobrir o que está acontecendo de errado aqui? Nós não costumam abraçar no lado oposto. Não é a resposta correta para o seu amigo ou colega aqui para dizer, oh, basta olhar para o meu e figura lo a partir daí. Isso é uma espécie de irracional. Mas ter alguém, um outro cérebro, outro par de olhos olhar sua tela ou olhar para o código e dizer, você tem certeza que quer ter um loop aqui? Ou você tem certeza que quer que ponto e vírgula aqui? Ou oh, essa mensagem de erro significa isso. Aqueles que são muito razoáveis ​​e comportamentos incentivado. Os casos a que estava se referindo a mais cedo se resumem a quando os alunos são tarde da noite fazendo mau juízo decisões e e-mail o seu código de alguém ou apenas dizendo, aqui, é no Dropbox ou Pesquisando tarde da noite. E por isso gostaria de incentivar e imploro, se você tem aqueles inevitável momentos de stress, você está esbarrando contra o prazo, você não tem fim dia, uma vez que já é sexta-feira em que ponto, e-mail cabeças do curso ou me diretamente. Dizer, escutar, eu estou no meu ponto de ruptura aqui. Vamos ter uma conversa e descobrir isso. Recorrendo à web ou algum outro não comportamento razoável nunca é o solução, e muitos de seus colegas não estão mais aqui campus por causa dessa falta de bom senso. Mas é muito fácil de contornar essa linha. E aqui está uma pequena imagem para animá lo a partir Reddit modo que agora tudo estará OK. Assim, uma rápida recapitulação, em seguida, de onde paramos. Então, na semana passada, lembro que nós introduzimos condições, não no risco mas desta vez em C. E havia alguma nova sintaxe, mas realmente nenhuma idéia nova, por si só. Tivemos expressões booleanas que pudéssemos ou em conjunto com duas verticais bares ou e junto com dois ampersands, dizendo que tanto a esquerda eo direito deve ser verdade para este a ser executado. Então nós tivemos switches, que olhou em breve, mas eu proponho são realmente apenas sintaxe diferente para alcançar o mesmo tipo de objetivo se você sabe em avançar o que seus casos vão ser. Olhamos para loops. Um loop for é talvez a mais comum, ou, pelo menos, aquele que pessoas geralmente atingem para instintivamente. Mesmo que ele parece um pouco enigmática, você vai ver muitos, muitos exemplos deste em pouco tempo, como você tem já na semana passada. While pode similarmente alcançar a mesma coisa. Mas se você quiser fazer alguma incrementação ou actualização de Os valores da variável, você tem que fazê-lo manualmente mais do que o loop for antes permite. E depois há o do-while, o que nos permite fazer algo em menos uma vez, enquanto algo o resto é verdadeiro. E isto é particularmente bom para programas ou para jogos onde você quer para avisar o usuário para algo pelo menos uma vez. E então, se ele ou ela não cooperar, você pode querer fazê-lo uma e outra vez. Com variáveis, entretanto, tivemos linhas de um código como este, o que poderia ser duas linhas. Você pode declarar um int chamado contador, ponto e vírgula. Ou você pode simplesmente declarar e defini-lo, por assim dizer. Dá-se um valor, ao mesmo tempo. E então, finalmente, falamos sobre as funções. E este foi um bom exemplo de no sentido de que ela ilustra dois tipos de funções. Uma é GetString (), a qual, novamente, recebe uma string do usuário. Mas GetString () é bem interessante, medida em que usei, porque sempre usado com algo sobre o lado esquerdo de um sinal de igual. Isto quer dizer que GetString () retorna um valor. Ele retorna, é claro, uma string. E em seguida, no lado esquerdo, estamos simplesmente salvar essa string dentro de um variável chamada nome. Isto é diferente, em certo sentido, a partir printf printf porque, pelo menos em nosso uso aqui, não retorna nada. Como um aparte, ele faz algo de retorno. Nós simplesmente não ligo para o que ele é. Mas ele tem o que é chamado efeito colateral. E o que é efeito colateral em cada caso que já vimos até agora? O que printf fazer? Ela imprime algo na tela, apresenta texto ou números ou algo no ecrã. E isso é apenas considerado um efeito colateral porque não está realmente entregando lo de volta para mim. Não é uma resposta dentro de uma caixa preta que eu possa, em seguida, chegar em e agarrar. É apenas fazendo isso por conta própria, muito como Colton estava ligado a este caixa-preta, na semana passada, e ele de alguma forma magicamente estava desenhando no quadro sem me realmente envolvidos. Isso seria um efeito colateral. Mas se eu realmente tinha que chegar de volta em aqui e dizer, oh, aqui é a string do utilizador, que faria ser um valor de retorno. E, até agora, temos funções utilizadas apenas que outras pessoas escreveram. Mas podemos realmente fazer estes tipos de coisas que nós mesmos. Então, eu estou indo para ir para o CS50 aparelho novo. Deixe-me fechar a aba que tinha aberto há pouco. E deixe-me ir em frente e criar um novo arquivo. E eu estou indo para ir em frente e chamar isso de uma positive.c. Então, eu quero fazer alguma coisa com números positivos aqui. Então, eu estou indo para ir em frente e fazer int - sorry - # Include. Não vamos fazer o mesmo erro como antes. Int main (void), open encaracolado cinta, cinta fechado encaracolado. E agora eu quero fazer o seguinte. Eu quero escrever um programa que insiste em que o usuário dá me um inteiro positivo. Portanto, não há função GetPositiveInt na biblioteca CS50. Há apenas GetInt (). Mas tudo bem, porque eu tenho a construções com o qual eu posso impor uma pouco mais restrição nesse valor. Eu poderia fazer algo assim. Assim int n - e se você está digitando junto, basta perceber Eu vou voltar e mudar algumas coisas em um instante - assim int n é igual GetInt (). E que vai colocar um int dentro do n. E deixe-me ser uma mais descritivo. Deixe-me dizer algo como exijo que você me dá um inteiro positivo. Tudo bem. Então, basta um pouco de instruções. E agora o que eu posso fazer? Bem, eu já sei da minha simples condições ou ramificações, assim como eu teve em risco, eu poderia dizer algo como se n é inferior ou igual a zero, então eu quero fazer alguma coisa procura, que não é positivo. E então eu poderia fazer - OK, mas eu realmente quero começar esse int. Para que eu pudesse ir até aqui e eu poderia tipo de cópia deste e travessão isso. E, em seguida, OK. Assim, se n é inferior ou igual a zero fazer isso. Agora, se o usuário não cooperar? Bem, então eu vou pedir isso aqui. E então eu entro aqui e aqui e aqui. Assim, este não é claramente a solução, certo? Porque não há fim à vista. Se eu quiser exigir que o usuário dá me um inteiro positivo, eu posso realmente obter o int. Posso, então, verificar que int. Mas, então, eu quero verificá-lo novamente e verificá-lo novamente e verifique novamente. Então, obviamente, o que é o melhor construir estar usando aqui? Tudo bem, então uma espécie de loop. Então, eu estou indo para se livrar de quase toda esta. E eu quero começar este int, pelo menos uma vez. Então, eu vou dizer que fazer - e eu vou voltar para o enquanto em apenas um momento - agora, fazer o quê? Eu vou fazer int n fica GetInt (). OK. Então, isso é muito bom. E agora, como costumam fazer Eu quero fazer isso? Deixe-me colocar o printf dentro do loop para que eu possa exigir uma e outra vez, se for necessário. E o que eu quero isso enquanto condição de fazer? Eu quero continuar fazendo isso enquanto o que é o caso? Sim. N é inferior a ou igual a zero. Então, já, temos significativamente limpo este código para cima. Nós emprestado construir uma forma muito simples - o do-while. Eu roubei apenas as linhas importantes de código que eu comecei a copiar e colar, o que não era sábio. E agora eu vou colar na verdade isso aqui e fazê-lo apenas uma vez. E agora o que eu quero fazer no o fim deste programa? Eu só vou dizer uma coisa simples gosto, obrigado pela - e Farei% i para int - barra invertida n, vírgula e, em seguida, conecte n, ponto e vírgula. Tudo bem. Então vamos ver o que acontece agora quando eu executar este programa. Eu estou indo para ir em frente e fazem positiva. Droga. Alguns erros. Então deixe-me ir de volta para o primeiro. Não trabalhar com eles para trás. Trabalhar com eles de cima para baixo para que não cascata e só uma coisa estar errada. Declaração implícita de função GetInt (). Sim. Então não foi o suficiente. Eu meio que cometeu o mesmo erro, mas um pouco diferente desta vez. Eu preciso não só incluir stdio.h, mas Também cs50.h, que inclui o chamados declarações de obter int, que ensinar o aparelho, ou ensina C que GetInt () é. Então deixe-me salve. Eu vou ignorar os outros erros porque eu vou esperar que eles são de alguma forma relacionado com o erro Eu já fixadas. Então deixe-me ir em frente e recompilar com fazer positivo, Enter. Droga. Três erros, ainda. Deixe-me ir até o primeiro. N variáveis ​​não utilizadas. Não vi isso antes. E isto, também, é um pouco enigmática. Esta é a saída do compilador. E o que essa linha destaque lá - positive.c :9:13 - está dizendo, ele está dizendo na linha nove positive.c, no caráter 13, 13 coluna, cometi este erro. E, em particular, está dizendo me não utilizado n variável. Então vamos ver - linha nove. Estou utilizando n no sentido de que Eu estou dando-lhe um valor. Mas o que o compilador não gosto é que eu não estou aparentemente usá-lo. Mas espere um minuto, eu estou usando ele. Na linha 11, eu estou usando aqui. Mas se eu rolar mais em positive.c :11 - para a linha 11, 12 caracteres, o compilador está me dizendo, o uso de não declarado identificador n. Meios Então não declaradas que tenho não especificados como um variável com um tipo de dados. Mas espere um minuto. Eu fiz exatamente isso em linha de nove. Então, alguém está realmente confuso. É eu ou o compilador porque em linha nove, mais uma vez, eu estou declarando um int n, e eu estou atribuindo-lhe o retornar o valor de GetInt (). Então eu estou usando essa variável n em linha 11 e verificar se o seu valor for inferior que ou igual a zero. Mas isso, aparentemente, é ruim e quebrado por quê? Diga isso de novo? Ah, eu tenho que declarar n antes entrar no circuito. Mas por quê? Quero dizer, nós apenas propôs um pouco atrás, que não há problema em declarar variáveis tudo em uma linha e, em seguida, atribuir-lhes algum valor. Uma variável global - vamos voltar a idéia de que em apenas um momento. Por que você quer me colocar para fora do loop? É. Exatamente. Assim, embora, um pouco contra-intuitivo, deixe-me resumir. Quando você declarar n dentro do bloco de fazer lá - especificamente dentro de essas chaves - essa variável n tem o que é chamado de escopo - alheios ao nosso sistema de pontuação no é claro -, mas tem um escopo que é limita-se às chaves. Em outras palavras, normalmente se você declarar uma variável dentro de um conjunto de chaves, essa variável só existe dentro dessas chaves. Assim, por si só que a lógica, embora Eu tenho declarado n em linha nove, que essencialmente desaparece do escopo, desaparece da memória, por assim dizer, no momento em que eu bati linha 11. Devido linha 11, infelizmente, é fora dessas chaves. Então, eu, infelizmente, não pode corrigir isso voltar para o que eu fiz antes. Você pode fazer isso em primeiro lugar. Mas o que não está você agora fazendo ciclicamente? Você, obviamente, não ficando o int ciclicamente. Assim, podemos deixar o GetInt (), e nós deve deixar o GetInt () dentro do laço, porque isso é o que queremos importunar o usuário para uma e outra vez. Mas isso é suficiente para ir até a linha de, digamos, seis. Int n, ponto e vírgula. Não dê a ela um valor ainda porque você não precisa ainda. Mas agora aqui, o aviso - este Seria um erro muito fácil. Eu não quero que a minha sombra anterior declaração de n. Eu quero usar o que n realmente existe. E agora na linha 10, I atribuir um valor n. Mas, na linha seis, eu declaro n. E assim eu posso ou não posso usá-lo na linha 12 agora? Eu posso, porque, entre os quais encaracolado chaves é n declarou agora? A única aqui na linha cinco. Para um aqui na linha 14. Então, se agora eu diminuir o zoom, salvar esse arquivo, vá voltar para dentro e execute make positivo, compilado neste momento. Então, isso é já o progresso. Slash. . / Positivo, Enter. Eu exijo que você me dá um número inteiro positivo. Negativo 1. Negativo 2. Negativo 3. Zero. Uma. E obrigada por aquele é que está agora impresso. Deixe-me tentar outra coisa, por curiosidade. Estou sendo dito para introduzir um número inteiro. Mas e se eu digitar em vez de cordeiro? Então, agora você ver um prompt diferente - tente novamente. Mas em nenhum lugar no meu código eu escrever tente novamente. Então, onde, presumivelmente, isso é repetir solicitar vindo, você diria? Sim, a partir de GetInt () em si. Então, uma das coisas que o pessoal da CS50 faz para você, pelo menos nestes primeiros semanas, é que nós escrevemos uma certa quantidade de erro de verificação para assegurar que se você chama GetInt (), pelo menos você vai voltar um int do usuário. Você não terá uma string. Você não terá um char. Você não vai conseguir alguma coisa mais completo. Você receberá um int. Agora, ele pode não ser positivo. Pode não ser negativo. Nós não fazemos nenhuma garantia em torno disso. Mas vai incomodar o usuário para tentar novamente, repetir, repetir até que ele ou ela realmente coopera. Da mesma forma, se eu fizer 1,23, que não é um int. Mas se eu digitar, por exemplo, 50 anos, que me dá um valor que eu queria. Tudo bem. Então, não é mau. Qualquer dúvida sobre o que acabou de fazer? O principal argumento a ser, para ser claro, não tanto o circuito, o que temos visto antes mesmo que nós não temos realmente usei, mas a questão do escopo, onde As variáveis ​​podem ser apenas só pode ser usado dentro de algum escopo especificado. Tudo bem, deixe-me abordar a sugestão que você fez anteriormente, a de um variável global. Como um aparte, verifica-se que um outro solução para este problema, mas tipicamente uma solução incorreta ou uma solução mal concebido, é declarar a variável como o que é chamado de uma variável global. Agora eu sou o tipo de violar a minha definição de alcance, porque há há chaves no topo ea parte inferior de um arquivo. Mas a implicação de que que é já em linha de quatro, n é uma variável global. E como o nome indica, é apenas acessível em qualquer lugar. Zero realmente tem estes. Se você usou uma variável, você deve se lembrar você tivesse que escolher se é para esse sprite ou para todos os sprites. Bem, todos os sprites é apenas a mais clara maneira de dizer global. Sim? Ah, muito boa pergunta. Então, lembro que na primeira versão do meu código, quando eu incorretamente n declarados e definidos na linha de nove - Eu declarei-o como uma variável e eu dei-lhe um valor com o operador de atribuição - isso me deu dois erros. Um deles, o facto de n não foi utilizado, e dois, que na linha 11 ele só não foi declarado. Então, o primeiro que eu não fiz endereço na época. Não é estritamente um erro para declarar uma variável, mas não usá-lo. Mas uma das coisas que fizemos em o aparelho CS50, deliberadamente, pedagogicamente, é que já acionei a expectativas do compilador para fazer certeza de que você está fazendo as coisas e não apenas corretamente, mas realmente corretamente. Porque se você está declarando uma variável como n e nunca usá-lo, ou usá-lo corretamente, então o que que ele está fazendo lá? Ele realmente não serve para nada. E é muito fácil com o tempo, se você não configurar o seu próprio computador em Desta forma, apenas para ter um código que tem pequenos remanescentes aqui, restos lá. E, em seguida, meses mais tarde você olhar para trás e você gosta, porque é que esta linha de Código de lá? E se não há nenhuma boa razão, não beneficia você ou seus colegas no caminho para ter a tropeçar então. Como um aparte, onde é que vem? Bem, lembre-se que cada vez que compilar programa, todo este material é sendo impresso. Então, vamos voltar a isso. Mas, novamente, fazer é um utilitário que automatiza o processo de compilação de executar o compilador real chamado bumbum. Essa coisa, vamos finalmente ver, tem a ver com a depuração com uma especial programa chamado o depurador. Isso tem a ver com a otimização do código - mais sobre isso no futuro. Std = c99 - isto significa apenas usar a versão de 1999 de C. C tem sido em torno ainda mais do que isso, mas eles fizeram algum bom mudanças mais 10 anos. E aqui está os relevantes. Estamos dizendo fazer qualquer coisa que anteriormente teria sido um aviso um erro impedindo o estudante de compilação. E os meios de parede fazer isso por um todo monte de coisas, não apenas relacionada a variáveis. E, em seguida, deixe-me ir para no final da linha. E isso, também, que vai finalmente voltar. Isto é, obviamente, o nome o arquivo que estou compilando. Isso lembra o nome do arquivo Estou a saída como o nome do meu programa executável. Este-lcs50 significa apenas usar o CS50 biblioteca, e todos os zeros e uns que o pessoal escreveu e compilou mais cedo este ano, integrar los em meu programa. E ninguém sabe o que-lm é? É a biblioteca de matemática, que é só lá mesmo se você estiver não fazer qualquer matemática. É apenas fornecido automaticamente para nós por fazer. Bem, deixe-me fazer um outro exemplo aqui, abrindo um novo arquivo. E deixe-me salvar esta como string.c. Acontece que, como falamos de dados tipos de hoje, há ainda mais acontecendo debaixo do capô do que vimos até agora. Então deixe-me rapidamente fazer um programa rápido. Incluir stdio.h. E eu vou guardar. E você sabe, não me deixe fazer o mesmo erro outra vez e outra vez. Incluir cs50.h. E deixe-me ir em frente agora e fazer int main (void). E agora eu simplesmente quer fazer um programa que faz isso - declarar uma string chamado s e obter uma string a partir do utilizador. E deixe-me fazer uma pequena instruções aqui - por favor me dê uma string - assim o usuário sabe o que fazer. E então aqui abaixo deste, Eu quero fazer o seguinte - para int i recebe zero. Mais uma vez, os cientistas da computação tipicamente começar a contar do zero, mas poderíamos fazer que um se realmente queria. Agora eu vou fazer i é menos do que o comprimento da corda de s. Então strlen - S-T-R-G-E-N - novamente, é conciso, porque é mais fácil para escrever, mesmo que seja um pouco enigmática. Essa é uma função que não usei antes, mas, literalmente, faz isso - voltará para mim um número que representa o comprimento da corda que o usuário digitou. Se digitou Olá, retornaria cinco, porque há cinco Olá letras. Então, em cada iteração este loop, i plus plus. Então, novamente, um padrão de construção, mesmo se você não está muito confortável demais ou familiarizado com ele ainda. Mas, agora, em cada iteração deste loop, perceber o que eu vou fazer. Eu quero ir em frente e imprimir um único personagem - para% c barra invertida n em uma nova linha. E então, você sabe o que eu quero fazer? Seja qual for a palavra que o usuário digita no, como Olá, eu quero imprimir H-E-L-L-O, um caractere por linha. Em outras palavras, eu quero chegar ao caracteres individuais em uma string, em que até agora tem apenas uma string foi uma seqüência de caracteres. E não é que eu posso fazer s, suporte i, próximo suporte, feche parênteses, ponto e vírgula. E eu tenho que fazer mais uma coisa. É em um arquivo chamado string.h que strlen é declarada. Então, se eu quiser usar essa função, Eu preciso dizer ao compilador, esperar para usá-lo. Agora, deixe-me ir em frente e fazer o programa chamado string. Dot, Slash, string. Por favor me dê uma corda. Eu vou em frente e digitá-lo. Olá, em todas as tampas, Enter. E agora percebe que eu imprimi este um caractere após o outro. Assim, o novo detalhe aqui é que uma string, no fim do dia, pode ser acessado por meio de sua pessoa caracteres através da introdução da praça notação suporte. E isso é porque a corda por baixo a capa é realmente uma seqüência de caracteres. Mas o que é interessante sobre eles é na memória RAM do seu computador - Mac, PC, seja ele qual for - são literalmente de costas para trás - H-E-L-L-S - no individual, adjacente bytes de memória. Então, se você deseja obter na oitava tais byte, que neste circuito seria suporte zero, um suporte, suporte de dois, suporte de três, quatro suporte - que é de zero indexados até cinco - que irá imprimir H-E-L-L-O em sua própria linha. Agora, como um teaser, deixe-me mostrar-lhe o os tipos de coisas que você vai, eventualmente, ser capaz de entender, pelo menos com um pouco de perto olhando. Por um lado, o que incluiu hoje no exemplos, se você quiser, é realmente um dos primeiros jailbreaks para o iPhone. O jailbreak significa quebrar o telefone assim você pode realmente usá-lo em um diferente transportador ou install seu próprio software. E você vai perceber isso parece completamente enigmático, o mais provável. Mas olhe para isso. O iPhone foi aparentemente rachado com um loop for, se um estado, uma pessoa condição, um monte de funções não vi. E mais uma vez, você não vai a primeira vista, provavelmente, entender como isso está funcionando. Mas tudo o que nós meio que tomar para concedido em nossas vidas modernas na verdade tende a reduzir ainda a alguns desses fundamentos que estivemos olhando. Deixe-me ir em frente e abrir uma outro programa, holloway.c. Então, isso também é algo que você realmente não deve saber. Mesmo nenhum dos funcionários ou eu poderia provavelmente descobrir isso olhando porque este era o código de alguém que foi submetido ao que é historicamente conhecido como um ofuscado C concurso, onde você escreve um programa que compila e executa, mas é tão maldita críptica nenhum ser humano pode compreender o que ele vai fazer até eles realmente executá-lo. Então, na verdade, se você olhar para esta código, eu vejo um interruptor. Vejo principal. Eu vejo esses colchetes implicando algum tipo de uma matriz. Alguém quer adivinhar o que este programa realmente faz se eu executar Holloway? Sim. OK. Bem feito. Assim, apenas o pessoal e eu não consigo descobrir o que essas coisas fazem. E agora, por último, deixe-me ir em frente e abrir um outro programa. Este - mais uma vez, nós vamos fazer o código-fonte disponível on-line - este é apenas tipo de bonito de se olhar. Tudo o que eles fizeram é acertar o barra de espaço um pouco. Mas este é o código real. Então, se você acha que é bonito, se nós realmente executar no prompt, eventualmente, você vai ver como nós pode fazer coisas como esta. Então, vamos deixá-lo nessa nota e vê-lo na quarta-feira. [Música tocando] COLUNA 2: Na próxima CS50, o TFS encenar um motim. COLUNA 3: Aqui está ele. Pegue-o! [Música tocando]