>> DAVID MALAN J: Todos direita, de modo que este é CS50.
E esta é claramente uma sexta-feira.
E este é o fim de uma semana.
Então você pode recordar que paramos, última vez, com um cliffhanger das sortes.
Em que expomos essa mentira, que não importa o que você foi ensinado crescente
up, 1 dividido por 10 não é, em fato, 0,1 ou 0,100 ou 0,10 mil.
Na verdade, se nós compilamos esta programa, como fizemos ontem, com,
fazer imprecisão, e, em seguida, fazer dot, slash, imprecisão,
nós aprendemos que isso é o que é 1 dividido por 10 é realmente.
Então isso não é realmente bem o caso.
Mas isso não faz alusão a alguns limitação fundamental de computadores.
E, de fato, entre os coisas que nós vamos fazer
hoje é dar uma olhada porque este tem aconteceu, o que implicações isso tem,
como a humanidade falhou de compreender isso em alguns muito
situations-- sério o resultado de que o
tem sido bastante trágico e e também expensive--
Dê uma olhada em como nós pode realmente defender
contra esses tipos de limitações.
Então intuitivamente, talvez, por isso que é dividido por 1 10,
de acordo com o meu computador aqui, não apenas 1/10, 0,10?
Sim.
O que você acha?
>> PARTICIPANTE: A raiz é diferente?
>> DAVID MALAN J: O que é?
Oh, a raiz é diferente?
Portanto, não é bem assim.
É realmente mais fundamental para o hardware.
Outros pensamentos?
Sim.
PARTICIPANTE: Eles representar números de forma diferente?
DAVID MALAN J: Então they-- direito.
Eles representam números de forma diferente.
Inaccurately, aparentemente.
Assim que é-- Bem, diferentemente do que?
Ou de quem?
De nós?
PARTICIPANTE: Sim.
Eles não usam o decimal sistema para [inaudível].
DAVID MALAN J: OK.
Assim, em certo sentido, eles não usar o sistema decimal.
Debaixo do capô, tudo é, de fato, binário,
e isso é relacionado, na verdade.
Mas é ainda mais simples explicação do que isso.
Sim.
>> PARTICIPANTE: Eles só tem tantas pedaços.
Eles só podem armazenar até um certo extensão, como com os decimais.
>> DAVID MALAN J: Sim.
Isto é o que está realmente ficando para ele.
Acontece que os computadores normalmente, será sempre única
utilizar uma quantidade finita de informações para representar algo.
Certo?
Afinal de contas, nós só temos um fixo quantidade de espaço no disco rígido.
Nós só temos uma quantidade fixa de RAM, ou memória de computador.
E se você só tem um montante fixo de alguma coisa,
certamente você não pode realmente contar-se para o infinito ou qualquer número que você quiser.
Você, tipo, tem que escolher o intervalo
de valores que você vai apoiar.
>> E assim, por exemplo, uma semana ou dois atrás, quando nós falamos sobre ASCII,
e nós conversamos sobre 8 bits, ou um byte, por assim dizer,
o maior número pudéssemos representar com 8 bits foi o quê?
255.
E nós podemos representar 256 valores totais mas não se passarmos um deles
em 0-- Bem, mas se nós passar um deles em 0,
em seguida, o maior número é, é claro, 255.
>> Assim, verifica-se, que este é o caso também, neste contexto.
Começamos a conversar, a última vez, sobre números de ponto flutuante, que
são diferentes dos números inteiros, em que eles têm um ponto decimal
e, esperamos, alguns números Depois disso, mas são demasiado.
Um computador só vai tipicamente usar 32 bits, 64 bits talvez
para representar um valor de ponto flutuante.
Assim, mesmo que nós crescemos aprendizagem da matemática e saber
que você pode absolutamente ter um número infinito de números
depois do ponto decimal, não se você tem memória finita.
Você, tipo, tem que arredondar, ou escolher quais
números que você vai representar.
E assim que você pode pensar, em certo sentido, sendo este o mais próximo do computador
aproximação para o valor que 1/10 ele pode obter, com apenas 32 ou mais pedaços.
E não é apenas 1/10.
>> Por exemplo, se eu mudar isso para 1/3, o que nós pensamos que é ainda mais simples.
Então 1 dividido por três.
Deixe-me salvar o arquivo.
Deixe-me ir em frente e recompilar-lo.
E deixe-me re-executar-lo.
Aqui também, aparentemente, 1/3 não é 0,3 e, em seguida, um número infinito de 3'S
depois disso.
Você tem essa imprecisão no final.
Então, nós, seres humanos estão corretos e que você aprendeu é, de fato, correto,
mas estamos esbarrando contra algumas limitações.
>> E o que eu pensava faríamos hoje, é começar
olhando, francamente, o trágicas consequências desta
às vezes, quando a humanidade não chega a implementar
para esta realidade e estas limitações.
E nós vamos ver uma série de vinhetas do History Channel que leva
Um olhar sobre como as coisas deram errado.
É cerca de 8 minutos de duração, e vamos voltar depois de este
e dar uma olhada em exatamente o que mais pode dar errado.
Se pudéssemos diminuir a intensidade da lights--
>> [REPRODUÇÃO DE VÍDEO]
>> -Computadores, Todos nós temos vindo a aceitar os problemas que muitas vezes frustrante
ir com eles.
Erros, vírus e software glitches são pequenos os preços
a pagar para a conveniência.
Mas, na alta tecnologia e de alta velocidade aplicações militares do programa espacial e,
o menor problema pode ser ampliada em desastre.
Em 04 de junho de 1996, os cientistas preparado para lançar um foguete não tripulado Ariane 5.
Ele estava carregando científica satélites projetados
para estabelecer com precisão a forma como o Interage campo magnético da Terra
com ventos solares.
O foguete foi construído para a Agência Espacial Europeia
e decolou da sua instalação na costa da Guiana Francesa.
>> -e Cerca de 30 segundos em o vôo, eles primeiro
notado que algo estava acontecendo de errado.
Que os bocais foram giratório de uma forma que realmente não deveria.
Cerca de 40 segundos de vôo, claramente o veículo estava em apuros,
e é aí que eles fizeram a decisão de destruí-lo.
A Safety Officer Faixa com coragem tremendas apertou o botão,
explodiu o foguete antes que ele pudesse tornar-se um perigo para a segurança pública.
>> -Esta Foi a donzela viagem do Ariane 5,
e sua destruição levou colocar devido a uma falha
incorporado em software do foguete.
-O Problema na Ariane era que há
foi um número que necessário 64 bits para expressar,
e ele queria converter para um número de 16 bits.
Eles assumiram que o número nunca ia ser muito grande,
que a maioria desses algarismos em o número de 64 bits eram de 0.
Eles estavam errados.
>> -O Incapacidade de um programa de software para aceitar
o tipo de número gerado pela outra estava na origem da falha.
Desenvolvimento de software tornou-se um parte muito cara de nova tecnologia.
O Ariane 4 foguete tinha sido muito bem sucedido, tanto do software
criado por isso também foi usado no Ariane 5.
>> -O Problema básico era que o Ariane 5 foi mais rápido, mais rapidamente acelerada.
E o software não tinha que representaram.
>> -A Destruição do foguete foi um enorme desastre financeiro,
tudo devido a um erro de software minuto.
Mas este não foi o primeiro problemas de conversão de dados de tempos
havia atormentado a tecnologia de foguetes moderna.
>> -Em 1991, com o início da Primeira Guerra do Golfo,
o míssil Patriot experimentaram um tipo semelhante
do problema de conversão de número.
Como resultado, 28 pessoas, 28 soldados norte-americanos
foram mortas e cerca de 100 outras ficaram feridas,
quando o Patriot, que deveria para proteger contra scuds recebidas,
não conseguiu disparar um míssil.
>> -Quando Iraque invadiu o Kuwait e América Desert Storm lançado no início de 1991,
Baterias de mísseis Patriot foram implantados para proteger a Arábia Saudita e Israel
de ataques de mísseis Scud iraquianos.
O Patriot é um norte-americano, de médio alcance superfície-ar do sistema
fabricado pela empresa Raytheon.
>> -O Tamanho do interceptor Patriot, em si, é aproximadamente, cerca de 20 pés de comprimento.
E pesa cerca de 2000 libras.
E ele carrega uma ogiva de about-- Eu acho que é mais ou menos 150 libras.
E a ogiva, em si, é um explosivo,
que tem fragmentos em torno dele.
O invólucro da ogiva é projetado para agir como chumbo grosso.
>> -Os Mísseis são realizado, 4 por contêiner,
e são transportados por um semi-reboque.
>> -O Sistema de mísseis anti Patriot remonta pelo menos 20 anos.
Ele foi originalmente projetado como um míssil de defesa aérea
para abater aviões inimigos.
Na Primeira Guerra do Golfo, quando essa guerra veio junto,
o Exército queria usá-lo para abater scuds, não aviões.
A Força iraquiano não foi tanto de um problema,
mas o Exército estava preocupado sobre scuds.
E assim eles tentaram atualizar o Patriot.
>> -Intercepting Um inimigo míssil viajando a mach cinco
ia ser bastante difícil.
Mas quando o Patriot foi levado às pressas em serviço,
o Exército não tinha conhecimento de um Modificação iraquiana que fez
scuds seus quase impossível de bater.
>> -O Que aconteceu, é que os scuds foram chegando, eram instáveis,
eles estavam balançando.
A razão para isto, era os iraquianos, a fim
para obter 600 quilômetros fora da um míssil gama 300 quilômetros,
levou para fora peso da ogiva frente e fez a ogiva mais leve.
Então, agora, o Patriot está tentando vir no scud, e na maioria das vezes,
a esmagadora maioria da tempo, seria apenas voar pelo scud.
>> -Uma Vez os operadores do sistema Patriot percebeu que o Patriot errou seu alvo,
que detonada ogiva do Patriot, para evitar possíveis acidentes se ele
Deixou-se cair ao chão.
>> -Isso Era o que a maioria das pessoas viu, aqueles grandes bolas de fogo no céu,
e mal interpretado como intercepta de ogivas Scud.
Embora durante a noite céus, Patriots apareceu
para ser com sucesso destruindo scuds, em Dhahran,
não poderia haver engano sobre o seu desempenho.
Lá, sistema de radar do Patriot perdeu o controle de um Scud de entrada,
e nunca lançado, devido a uma falha do software.
Foram os israelenses que descoberto pela primeira vez que quanto mais tempo o sistema foi ligado,
quanto maior for o tempo de discrepância tornou-se, devido a um relógio incorporado
no computador do sistema.
>> -Cerca De duas semanas antes a tragédia em Dhahran,
os israelenses relatado para o Departamento de Defesa,
que o sistema estava perdendo tempo, que após cerca de 8 horas de funcionamento,
eles notaram que o sistema foi 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.
8 horas?
10 horas?
1000 horas?
Ninguém sabia.
-A Bateria Patriot estacionados no quartel
em Dhahran, e sua falha interna relógio, tinha sido em mais de 100 horas
na noite de 25 de fevereiro.
>> -É Rastreados tempo com uma precisão de cerca de 1/10 de um segundo.
Agora 1/10 de um segundo é um número interessante
porque não pode ser expresso em binário, exatamente.
O que significa, não pode ser expresso, exatamente,
em qualquer computador digital moderno.
É difícil de acreditar, mas usar isso como um exemplo.
Vamos dar o número, 1/3.
1/3 não pode ser expressa em decimal, exatamente.
1/3 é 0,333 acontecendo 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 tornou-se pior o erro de tempo.
>> -Depois De 100 horas de funcionamento, o erro no tempo foi apenas cerca de 1/3 de segundo.
Mas em termos de segmentação um míssil viajando a Mach 5,
isto resultou numa rastreamento erro de mais de 600 metros.
Seria um erro fatal para os soldados em Dhahran.
>> -O Que aconteceu, é um lançamento de Scud foi detectados por satélites de alerta precoce,
e eles novo que o Scud foi vindo em sua direção geral.
Eles não sabiam de onde vinha.
>> -Foi Agora ao radar componente do sistema Patriot,
defender Dhahran, para localizar e manter o controle do míssil inimigo de entrada.
>> -O Radar era muito inteligente.
Seria, na verdade, rastrear a posição do Scud
e, em seguida, prever onde provavelmente seria,
da próxima vez, o radar enviou um pulso para fora.
Que foi chamado ao portão intervalo.
>> -Então, Uma vez que o Patriot decide tem tempo suficiente
passado para voltar e verificar o próximo localização para este objeto detectado,
ele vai voltar.
Assim, quando se voltou para o errado lugar, em seguida, vê nenhum objeto
e decide que não houve objeto, que era uma falsa detecção,
e deixa a pista.
A entrada Scud desapareceu da tela do radar,
e segundos depois, se chocou contra o quartel.
O Scud matou 28 e foi a última uma demitido durante a Primeira Guerra do Golfo.
Tragicamente, o software atualizado Dhahran chegou no dia seguinte.
A falha de software teve sido fixado, de fechamento
um capítulo na conturbada história do míssil Patriot.
>> [FIM DE REPRODUÇÃO]
>> DAVID MALAN J: Então vamos dar uma olhada algumas limitações semelhantes em apenas um pouco.
Mas primeiro, vamos transição para alguns FYI é.
Então um-- neste fim de semana, há será seções de super,
que são destinadas a suplantar seções regulares, que
será iniciado uma semana, portanto.
Dê uma olhada no site do CS50 para mais informações sobre aqueles.
Eles também será filmado e transmitido viver para aqueles que não puderem comparecer.
Conjunto de problemas 1 é no o site do curso já,
e vamos dar uma olhada que, em apenas um pouco.
E o horário de expediente também, terá coloque esta segunda-feira a quinta-feira.
>> Portanto, este foi o mais canônico programa nós olhamos última vez.
É como o mais simples programa você pode escrever em C,
e até mesmo que é um pouco de uma afirmação ousada.
Certo?
Porque há um monte de aparente complexidade para esta.
Então, vamos dar uma olhada rápida no o que alguns destes elementos
eram e, em seguida, tentar fornecer um modelo mental de como
estes mais simples de programas trabalhar, e então nós vamos começar
olhar para as coisas cada vez mais complexo.
Então esta linha aqui, destaque agora, em amarelo, o que podemos dizer, da última vez,
que este faz para nós?
Qual é a finalidade a que serve?
Qualquer pessoa de mais para trás?
Sim.
>> PARTICIPANTE: [inaudível]
DAVID MALAN J: Bom.
Por isso, dá-lhe acesso a comandos, ou vamos
chamá-los de funções, que alguém pessoa escreveu, que são declaradas,
por assim dizer, em algum outro arquivo.
Então, vamos ver exatamente o que um arquivo .h é contra um arquivo .c, eventualmente.
Mas, por enquanto, só sei printf que, por exemplo,
está entre as funções que foram declarada em algum outro arquivo, em algum lugar
outra coisa no disco rígido da nuvem que nos permite acessar printf e usá-lo
sem ter que reinventar que nós mesmos roda.
Enquanto isso, a principal.
Qual foi o análogo do principal, na semana passada?
Sim.
>> PARTICIPANTE: Bandeira verde é clicado.
>> DAVID MALAN J: Sim.
Scratch, quando bandeira verde clicado.
É como a peça do puzzle que chuta as coisas fora.
E assim, de forma semelhante, fez o mundo decidiu há alguns anos que em C,
e um monte de outras línguas, se você quiser escrever um programa,
sua primeira função tem de ser chamado, principal.
E tem que olhar como este.
Mas vamos voltar, outra vez, para o que, int,
e, vazio, significa neste contexto.
Por enquanto, as chaves são tipo de como a forma da parte do enigma do zero
que encapsula um determinado número de linhas.
E entre as linhas aqui, é este aqui.
printf é uma função cujo propósito na a vida é para imprimir uma seqüência de caracteres formatada.
E por formatada, quero dizer que você pode ligar o espaço reservado valores,
e você pode especificar quantos decimal pontos, quantos números para imprimir
depois de um ponto decimal e similares.
E printf, é claro, uma toma ou mais argumentos ou parâmetros,
de outro modo conhecido, mais simplesmente, como entradas.
>> Então printf, como um monte de funções, leva entradas.
E essas entradas são abraçados por os dois parêntesis aqui.
E dentro dessas é uma entrada.
É uma cadeia, como já o chamou, que é apenas uma seqüência de caracteres,
como uma palavra ou uma frase, ou um todo ensaio mesmo, entre aspas duplas.
E isso é o que vai influenciar o comportamento de printf porque, obviamente,
é apenas uma função de impressão genérico.
Ele não vai saber o que para imprimir, a menos que você diga a ele.
E, em seguida, algumas minúcias.
O que nós dizemos isto estranho seqüência de símbolos é?
Sim.
>> PARTICIPANTE: Nova linha.
>> DAVID MALAN J: Nova linha.
Assim, verifica-se, você não pode simplesmente bater, entrar, quando você está escrevendo o programa.
Geralmente, o compilador vai ficar um pouco confuso quanto ao que você quer dizer.
Em vez disso, você tem que, literalmente, dizer, dá-me uma nova linha aqui.
E assim / n é o que geralmente chamar um caractere de escape.
Então n, para a nova linha.
E o compilador sabe que, quando se vê / n,
deve, na verdade, induzir o computador, em última análise, ou printf, neste caso,
para imprimir um novo real linha, como bater a, entrar,
tecla no teclado.
E, por último, o que fez dizemos este pedaço de sintaxe é para?
O que isso representa?
Sim.
>> PARTICIPANTE: [inaudível]
>> DAVID MALAN J: É apenas o fim da linha.
É o fim da instrução.
E perceber que nós não colocá-los em todos os lugares.
Nós certamente não colocá-los com os lados de cada linha.
Por exemplo, não há nenhum na primeira linha, não há nada na linha
com, principal, não há nenhum após as chaves,
mas você vai começar a ver e obter familiarizado com o local onde ele é chamado para.
E é quase sempre depois de uma função ligue ou uma declaração, alguma ação
que você realmente está tomando.
>> E sei agora, especialmente se entre aqueles menos confortável,
estes são os tipos de coisas estúpidas que você vai acabar batendo acidentalmente
sua cabeça contra a parede mais.
Porque você vai ser logicamente confiante em algum problema
você resolveu para um problema set, ea maldita coisa apenas
não irá compilar ou até mesmo executar.
E assim, muitas vezes, no início, ele vai ser porque você perdeu um parêntese,
ou você perdeu um ponto e vírgula.
E então apenas estar atento desses tipos de coisas,
e tente não ficar frustrado por eles, porque muito rapidamente faz isso
tornar-se velho chapéu.
Mas é muito fácil chegar frustrado no início, como resultado.
>> Então, agora, vamos dar uma olhada em como esta linha está realmente trabalhando
e depois olhar para um pouco uma mais complicada.
Portanto, temos aqui, o habilidade para desenhar na tela.
E vamos supor que esta é minha tela de computador,
mas eu estou escrevendo o programa Olá,, e eu não ter implementado, printf.
Alguém mais tem implementado, printf.
Quem gostaria de reivindicar Implementamos, printf?
Se nós podemos?
Tudo bem, qual é o seu nome?
>> ESTUDANTE 1: [? Copal. ?]
>> DAVID MALAN J: Copal, vamos lá para cima.
Vamos lá para cima.
Tudo certo.
Portanto, temos, aqui, algumas etiquetas de nome, uma vez que nós vamos fazer um pequeno jogo deste.
E vamos chamá-lo, printf.
E se você quiser vir aqui, o que eu acabei desenhado na tela,
é pura e simplesmente, não sou eu, isso.
>> Tudo bem, então, Olá meu nome é, printf, se você gostaria de colocar isso diante.
Tudo certo.
E se você pode ir estande pela tela do computador
como se você é a função que veio com este sistema de computador.
E o seu propósito na vida é para realmente imprimir algo.
Mas muito parecido com o programa, só tinha na tela, aqui,
nós vamos ter que realmente dar-lhe alguma entrada.
>> E assim, se a minha entrada, aqui, é Aparentemente, o que é passado para printf,
vamos tipo de zombar-lo como este.
Eu vou escrever literalmente em um pedaço de papel, "Olá, mundo"
barra invertida N. E para ficar claro, o que Acabei desenhada sobre este pedaço de papel,
se parece com isso.
Então, quando eu executar este programa, e este linha amarela do código é executado,
é como se eu, o programa Olá, estou entregando alguma entrada fora para uma função
que outra pessoa escreveu.
>> E se você, com o dedo, poderia, na verdade, com o dedo,
desenhar na tela o que quer é você ter sido entregue,
o efeito, em última análise, é a ver exatamente o que, na tela.
E um caso de canto pequeno aqui.
E bom, não devemos ver o, nova linha, neste ponto.
Seria incorreto para você desenhar explicitamente a nova linha.
Mas, se continuasse a escrever palavras na tela, eles acabam abaixo disso.
>> Então, muito obrigado, mas vara por aqui por apenas um momento.
Precisamos agora de um outro voluntário, se pudéssemos,
que vai precisar para desempenhar o papel de-- É só as pessoas na orquestra
agora.
Como about-- OK.
Aqui mesmo.
Vamos lá para cima.
Qual o seu nome?
>> ESTUDANTE 2: [? Ivay. ?]
DAVID MALAN J: Desculpe?
ESTUDANTE 2: [? Ivay. ?]
DAVID MALAN J: Ethan, vamos lá para cima.
Não?
Eu obtive essa errado, mesmo depois que você disse isso duas vezes?
Vamos lá para cima.
É difícil ouvir-se aqui.
ESTÁ BEM.
E eu sinto muito, qual é o seu nome?
>> ESTUDANTE 2: [? Ivay. ?]
>> [? DAVID MALAN J: Ivay. ?] ESTÁ BEM.
Por agora, se você não mente, você está GetString.
>> ESTUDANTE 2: OK.
Legal.
DAVID MALAN J: Então, se você gostaria ficar aqui por apenas um momento,
vamos dar uma olhada em um pouco programa mais complexo, que
agora tem três linhas de código.
Portanto, temos, um, indicar o seu nome usando printf; duas, uma chamada para GetString,
seguido por uma atribuição a uma variável chamada, corda s, ou chamado s;
e, em seguida, outra chamada para, printf, mas desta vez com duas entradas.
>> Então, estado que já fizemos seu nome, ou melhor, nós temos
já feito uma chamada printf.
Então eu vou escrever, Diga seu nome.
E assim, o que eu vou passar, printf, em apenas um momento,
é pura e simplesmente, este.
Então, se você quiser ir em frente e desenhar esse na tela, essa é a sua entrada agora.
Tudo certo.
E esquecer seqüência, temos agora nossa própria linha de código aqui.
Assim, em, GetString, precisamos para realmente chamar, GetString.
Portanto, o seu propósito na vida é apenas andar fora na orquestra, se pudesse,
e obter o nome de alguém.
Mas vamos dar-lhe alguma coisa para colocá-lo.
Se você quiser, vá em frente e obter uma string,
obter o nome de alguém em que pedaço de papel, se pudesse.
>> Tudo certo.
E vamos ver, em apenas um momento, cujo nome estamos recebendo.
Enquanto isso, o que eu vou ter pronto, é uma peça em branco
de papel, no qual, eu vou para armazenar o valor que ele
é que GetString está voltando para mim, Eu, sendo uma variável de cadeia chamado, s.
Tudo certo.
Então o que você tem aqui?
Nik.
Tudo certo.
Então nós temos o nome de Nik aqui.
Então é isso que literalmente foi devolvido
para mim, por assim dizer, por GetString.
>> Eu, agora, vou executar o lado esquerdo
de que a expressão, onde simplesmente copiar para baixo, para fins de hoje, Nik.
Então, agora, eu tenho uma variável chamado, s, armazenando o nome de Nik.
Eu já entregue a printf, um argumento anterior.
Mas em nossa terceira e última linha de código, eu realmente tenho que printf mão
algo um pouco diferente-- "Olá,% s," barra invertida n.
>> E assim a última linha eu vou para send-- a última coisa que eu sou
vai escrever para baixo agora, é esta.
Assim, as duas linhas de código, ou em vez da última linha de código,
chamadas para dois Insumos um, este, e dois, presente.
Então, se a nossa função printf agora pode tomá-los como entrada,
deixe-me limpar a tela para você.
Na verdade não, você pode ir em frente.
Vamos deixá-lo, uma vez que é no mesmo programa.
Devemos ver, Olá, Nik.
Tudo certo.
Portanto, este foi muito poucos aros para saltar através, apenas
para escrever, indicar o seu nome, e, Olá, Nik.
Mas esta simples ideia de passagem de mensagens, da passagem de entrada e saída de recepção,
é exatamente o modelo que nós vamos ter até mesmo para as funções mais complexas.
Então, muito obrigado a vocês dois.
Temos um lindo estresse bola aqui para você.
E obrigado ao nosso GetString e voluntários printf igualmente.
Obrigado.
Tudo certo.
Obrigado a vocês dois.
>> Então, nós temos falado sobre até agora, principalmente sobre strings.
E verifica-se que C pode realmente entender alguns tipos de dados diferentes.
Na verdade, vamos dar um olhar para estes aqui.
Então C, e um monte de línguas, entender as coisas chamados caracteres.
Um char é geralmente um byte único, ou oito bits.
E representa um único caractere, como a letra A, ou a capital
letra A, ou a letra minúscula A, ou um ponto de exclamação,
ou qualquer caractere que você pode digitar em seu teclado, e às vezes até mais.
Nós também acontecerá a ver carros alegóricos.
Um flutuador é, geralmente, uma 32-bit valor, ou quatro bytes
porque mais uma vez, um byte tem oito bits.
>> Assim, um flutuador é um valor de ponto flutuante, algo com um ponto decimal.
E, de fato, é o que o filme estava falando
sobre quando eles falaram sobre flutuante valores de ponto, um número fixo de bits
sendo utilizada para representar um número real.
Mas há também coisas chamadas duplos.
Estes existem em Java, se você tomou APCS,
e um duplo, como o nome felizmente sugere, é duas vezes tão grande como um float.
Ainda é um número real, ele só tem mais bits
com o qual a ser cada vez mais precisa, ou para armazenar um número ainda maior.
int é fácil.
Nós conversamos sobre isso da última vez.
É apenas um número inteiro.
E é geralmente 32 de bits, ou quatro bytes.
>> E assim, se você tem, vamos ver agora, 32 bits-- e fizemos isso na semana 0,
sempre tão briefly-- se você tiver 32 bits, o que é o maior
número pode representar como um número inteiro?
Dar ou pegar?
É como 4 bilhões, e isso é só se estivermos
representando apenas números positivos.
Se você tem 32 bits, e você quer representar números negativos, bem como,
seu alcance é, essencialmente, negativo 2 bilhões para positivo 2 bilhões.
Mas, geralmente, vamos começar a 0 ir até 4 bilhões.
>> Você não tem que saber com precisão, mas podemos ver isso, na verdade, se eu apenas
abrir um pouco calculadora, aqui.
Eu posso fazer 2 a 32, e isso é exatamente o quão grande,
quantos valores você pode representar, com 32 bits.
E é mais ou menos 4 bilhões.
Então, vamos continuar vendo esse número em alguns lugares diferentes.
Mas se você precisar de mais tempo números do que isso,
Acontece que há de algo chamado um longo tempo.
E um longo tempo é geralmente 64 bits, os quais
significa que é uma ordem de magnitude ainda maior do que um int.
>> Então, eu não posso nem pronunciar o maior número que pode representar,
mas é marcadamente maior.
Agora, como um aparte, historicamente, se um int é de 32 bits,
e um longo, longo é de 64 bits, como grande é um longo, não um longo, longo?
Você pensaria que ele é mais do que um int mas talvez menos longo do que um longo, longo,
mas, na verdade, depende.
>> E assim acontece que um das frustrações também,
com a escrita de código em determinados sistemas, é que nem todos estes tipos de dados
têm valores pré-determinados.
Às vezes é isso muitos pedaços.
Às vezes, é que muitos bits.
Então, você realmente tem que saber, às vezes, o hardware
você está executando o seu software on.
Felizmente, outras línguas e outros tipos de dados que já existem,
permitem que você seja mais preciso.
Bem, nós vimos corda, e vimos bool, também,
mas acontece que aqueles vir apenas com a biblioteca de CS50.
Portanto, aqueles não são construídas C. Aqueles em vez disso,
vêm em que arquivo chamado CS50.h, que vamos finalmente
descascar as camadas de.
Mas, por enquanto, são apenas tipos de dados adicionais.
Um bool é um verdadeiro ou falso, e uma string é uma sequência de caracteres,
como uma palavra.
Agora printf, que já vimos, tem espaços reservados,% s é um deles.
E você pode ser capaz, agora, inferir a partir destes exemplos, como outros
você poderia ter um espaço reservado para diferentes tipos de dados.
Por exemplo, dar um palpite, se você queria imprimir um único caractere usando
printf, o espaço reservado é provavelmente% c.
E se você quiser imprimir um integer com o espaço reservado,% i.
% lld é um valor decimal longo, longo, mas long long, de modo que mapeia para isso.
E, em seguida,% f para flutuante valor de ponto ou para um casal,
por isso às vezes eles são reutilizados em diferentes contextos.
Então, vamos ver e usar alguns dos que ao longo do tempo.
E printf e outras funções também seqüências de escape de apoio dos outros,
e, por vezes, estes são necessários.
Assim barra invertida n é uma nova linha.
Barra invertida t, qualquer um quer tomar uma facada?
PARTICIPANTE: Tab.
DAVID MALAN J: Tab.
Então, se você realmente quer para imprimir um guia, não
um número fixo de espaços, mas um real caractere de tabulação, você não acertar o seu,
guia, tecla no teclado, geralmente, você realmente faz barra invertida t.
Citação dupla barra invertida, Por que eu iria querer isso?
Certo?
Por que não posso eu apenas digite um aspas duplas no meu teclado?
PARTICIPANTE: Porque, caso contrário, é
vai pensar que é o fim do gosto de sua impressão [? texto. ?]
>> DAVID MALAN J: Exatamente.
Lembre-se, com a nossa exemplos printf, quando
estavam passando para printf na entrada, no lado esquerdo da cadeia de entrada que
e sobre o direito de que a entrada mola, é claro, foi uma citação de casal.
Se a sua própria entrada tem um duplo Citação no meio do que,
o computador pode potencialmente se confundem, como a,
faz isso aspas duplas pertence no meio?
Pertence com o esquerdo?
Pertence com o caminho certo?
E assim, se você quiser torná-lo super claro, você faz barra invertida aspas duplas,
de modo que ele escapou, por assim dizer, e não é confundida por algo mais.
E há alguns outros aqui, r barra invertida, aspas simples, 0,
para que possamos ver ao longo do tempo, também.
E agora, o que acontece com funções?
>> Assim, as ações que podemos tomar, até agora, nesta língua, C, bem, nós vimos,
printf, é claro, e todos dos outros na tela,
aqui, que vamos usar para o do curso primeiras semanas apenas,
vir quando a biblioteca CS50.
E eles fazem isso muito mais fácil, em C, para realmente obter a entrada do usuário.
Acontece que em C, e francamente em algumas línguas,
é uma dor real no pescoço para fazer algo simples, como alerta o usuário
para o teclado, para a sua entrada.
E assim essas funções torná-lo mais fácil.
>> E também tem erro verificando todo,
de modo que, quando recordar na quarta-feira, nós
viu a, tente novamente, aviso, quando eu não cooperar,
e eu digitei a palavra, em vez de um número?
Nós fizemos o trabalho pesado início para certificar-se de que o usuário coopera.
Mas estes são apenas treinamento rodas que vamos eventualmente,
e rapidamente, decolar.
>> Então, para recapitular, então, vamos dar uma olhada rápida,
muito como fizemos com o Scratch, em algumas construções canônicas em C.
Este destina-se a, tipo de, ser um rápido tour,
apenas para que você tenha uma referência e que você já viu as coisas em primeiro lugar.
Mas, em seguida, vamos olhar para codificação real usar alguns destes blocos de construção.
Tanto como no Scratch, quando tínhamos declarações gosta,
dizer ou, espera, em C, nós temos funções, bem, como printf.
>> Se queremos expressar uma condição em C, é semelhante, em espírito,
para que parte do enigma que olhou como este no Scratch.
Mas em vez disso, literalmente apenas escrever, se.
E, em seguida, entre parênteses, nós colocamos uma condição,
quando essa condição é o que nós vamos chamar, mais uma vez, uma expressão booleana.
E mais uma vez, esta é uma espécie de pseudo-código.
E, na verdade, o // é um comentário.
É apenas palavras em Inglês para mim mesmo.
Mas esta é a geral estrutura de um, se, condição.
Mas vamos ver concreto exemplos em apenas um momento.
>> Se você quiser ter um garfo de duas vias na estrada,
muito como fizemos com o nosso voluntário em Quarta-feira, você pode ter um, else if.
E se você quiser ter uma terceira e condição final, ou situação de incumprimento,
você pode ter apenas um bloco de mais, há.
E da mesma forma, com expressões booleanas, você pode, e,-los juntos.
E vimos na quarta-feira, que não é um único e comercial,
é dois, por razões de nível inferior que vamos finalmente ver e jogar.
Ou-ing coisas juntos é de 2 barras verticais.
Em um teclado dos EUA, esta é geralmente uma tecla
com a tecla Shift acima sua chave tecla Enter ou Return.
>> Depois, há estas coisas que vamos usar talvez uma ou duas vezes.
Eles são funcionalmente equivalentes aos o que você pode fazer com um, if, else se,
else if outra coisa, construir, mas eles são chamados de um interruptor.
Eles parecem muito diferentes, mas vamos ver em alguns dos nosso código de distribuição,
para um conjunto de problemas futuros, provavelmente, que às vezes é apenas uma mais bonita
modo de expressar um inteiro bando de condições,
sem ter um monte de chaves e um lote de parênteses e recuo.
Mas eles não nos dão mais poder do que já temos.
E agora laços.
E este, vamos dar uma olhada em um pouco mais lentamente.
Mas então, nós vamos começar a usá-los, especialmente para quem já está familiarizado.
Esta é a forma canônica, se incrivelmente maneira misteriosa, para escrever um loop em C.
>> Agora um laço no Scratch foi bastante simples.
Você tem um, para sempre, bloco.
Você tem um, repetir, com bloco apenas um número que você tem que digitar.
E com o, por loop, você pode implementar essas duas idéias,
mas é um pouco mais técnico.
Mas, francamente, é também relativamente simples.
Depois de saber a ordem de operações, você literalmente
está indo só para ligar valores e dizer ao computador o que fazer.
Então, aqui está um exemplo.
Este é um circuito que, bastante simplesmente, conta-se a partir de um número
através de um outro.
E apenas pelos olhos para ele, mesmo se você tiver
nenhuma experiência prévia com esta linguagem, que número
ele provavelmente começar a contar a?
OK, 0.
E eu estou supondo que é porque você ver que há um int e um i,
que é uma variável.
É inicializado a 0.
>> E, em seguida, mais tarde, parece que estamos passando printf, um valor.
E, na verdade, eu fiz um pequeno erro de digitação aqui.
Mas isso é facilmente corrigido.
Deixe-me acrescentar, eu aqui.
Temos, agora, ser printf passado esse valor de espaço reservado.
E o que vai contar-se através?
AUDIÊNCIA: 50.
50.
49.
DAVID MALAN J: 49.
Então, 50, à primeira vista, parece certo.
Mas que, ao que parece, vai ser nossa condição que manter a verificação.
E vamos parar uma vez Já não é inferior a 50.
Portanto, este loop, por outro lado, deveria executar, desde que i é inferior a 50.
Mas assim que ele se torna 50, ou 51, ou pior, ele deve parar automaticamente.
Tudo certo.
>> Então, o que realmente acontece aqui?
Então este é o fim de operações para um loop.
Um, você tem a assim-chamada inicialização.
Este pedaço destaque amarelo de código é executado em primeiro lugar,
e tem o efeito de que, por Quarta-feira, você provavelmente imaginar.
Ele cria uma variável denominada i e lojas em que o valor variável 0.
Então i é 0, neste ponto da história.
>> A próxima coisa que acontece nesta construção,
é que a condição checado.
Então eu verificar imediatamente, i é menos de 50?
E, claro, a resposta por enquanto é, com certeza, sim.
Sim, porque i é 0, e isso é certamente inferior a 50.
Então o que acontece, é que este linha de código é executado.
E, de fato, se há múltiplo linhas de código nessas chaves,
todos eles são executados um após o outro.
>> E no efeito aqui, é aparentemente, para imprimir
o número de i, o que vai ser 0, e, em seguida, 1, 2 e, em seguida.
Mas por que?
Por que ele se incrementado?
Bem, a quarta coisa que acontece é que esta sintaxe
é executado, depois do ponto e vírgula.
i ++ é uma forma abreviada de dizer; tomar o valor de i, e adicionar 1 a ela;
e, em seguida, da próxima vez, adicione 1 a ela; e da próxima vez,
adicionar 1 a ela.
>> Então, se esperamos que continue, o que vai acontecer
ao lado é que eu não vou inicializar eu nunca mais.
Se eu continuasse a inicialização I a 0, este exemplo
que nunca iria acabar, porque Gostaria de ser preso a 0.
Mas o que vai acontecer é que a condição será verificada,
a linha de código serão executados, o i será incrementado,
condição será verificada, código serão executados.
E manteve-se andar de bicicleta novamente, e mais uma vez, e novamente,
até i ++ induz a um valor de 50.
>> A condição, em seguida, diz, 50 é inferior a 50?
A resposta, claro, é não, e de modo que o código inteiro pára a execução.
E se você tiver mais código na tela abaixo, isso é o que acontece em seguida.
Ele salta para fora destas chaves e continua a imprimir mais do que depois.
>> Então uma piada agora, a partir de foxtrot, que você talvez agora entender.
É sempre engraçado.
É como as risadas tipo de coar,
e então você percebe que você não deve estar rindo de humor como este.
Mas há alguns takeaway aqui, pedagogicamente, também.
Assim, verifica-se que eu sou faltando um pedaço de sintaxe,
ou FoxTrot de perder uma pedaço de sintaxe aqui.
O que falta, que nós tivemos em todos os outros exemplo, até agora?
Retorno, está lá, então isso é outra coisa,
que vamos voltar a antes do tempo.
O que está faltando, no entanto?
Sim.
>> PARTICIPANTE: O inicialização do [inaudível].
>> DAVID MALAN J: OK.
Então sim.
Então, na verdade, isso é-- Bem, e contagem é inicializado
acima, ou melhor, declarou-se acima.
Portanto, esta é uma outra maneira de fazê-lo.
Mas não em linha recta é válida embora.
E aqui?
>> PARTICIPANTE: É as chaves?
>> DAVID MALAN J: Sim.
Assim, as chaves estão em falta.
Mas este código, eu quero dizer, para seu crédito, é, na verdade, sintaticamente válido.
Acontece, você não precisa das chaves
se você tiver apenas uma linha de código que você quer executar dentro do loop.
Agora, sempre, em classe e na todo o nosso código de distribuição,
incluem as chaves de qualquer maneira, só por uma questão de clareza.
Mas percebo que em livros didáticos e exemplos em linha,
você pode muito bem ver encaracolado cintas faltando algum dia.
E isso é OK, se o que você ter recuado e destinados
é apenas uma única linha de código, e não várias linhas de código, potencialmente.
Tudo certo.
Então, relacionada à questão da imprecisão, é um problema de estouro,
no sentido de que, de forma semelhante, inteiros não têm limites para eles
assim como valores de ponto flutuante?
No mundo de um ponto flutuante valores, só podemos ser tão preciso,
após o que, por vezes, coisas ruins podem acontecer,
e os nossos programas podem ser buggy e erro.
Agora, mesmo com números inteiros, você pode executar em problemas.
Agora um número inteiro não tem um ponto decimal ou números após ele.
É apenas um número natural, normalmente.
Então, o que poderia dar errado com um int?
Se eu estou usando um int para contar, o que poderia dar errado?
Parece muito mais simples.
Sim.
>> PARTICIPANTE: Se o número fica [inaudível]
>> DAVID MALAN J: Sim.
E se você contar tão alto, que você Não posso expressar que realmente grande número.
Certo?
Em algum momento, você vai a exceder os limites
de um valor de 32 bits ou um valor de 64 bits.
Agora, novamente, eu não sei como pronunciar um valor de 64 bits,
mas eu sei que com um inteiro de 32 bits, o maior valor que pode ser,
se é somente positivo valores, é de aproximadamente 4 bilhões.
Então, se eu tentar contar até 5 bilhões, algo que vai acontecer.
Mas vamos ver o que, de fato, pode acontecer.
No mundo de inteiro estouro, onde, em certo sentido,
transbordar a capacidade de um inteiro, o que poderia acontecer?
>> Então aqui está um número binário, é um retrocesso para 0.
É todos os 1 do e os espaços reservados lá, são potências de 2,
por isso este é binário.
Então, essas são 8, os bits 1 na tela.
E se você se lembra ou você rapidamente fazer a matemática,
o valor que está sendo representado aqui com estes oito bits de 1?
255.
E mesmo se você não bem a certeza da matemática, você poderia fazê-lo para fora.
Ou você poderia apenas espécie da razão através dele,
espere um minuto, se eu sou representando um valor de 8 bits,
e eu tenho 256 valores possíveis, mas o primeiro dos quais é 0,
Eu só sei que o maior vai ser 255,
e é isso que este poderia ser.
>> Então suponho que eu tente adicionar 1 a este valor.
O que você faria no grau escola quando adicionar a 1, e
não se encaixa porque você tem que levar o 1?
O que é este número vai para tornar-se quando você adicionar um?
Vai tornar-se 0.
Certo?
Porque se você tivesse mais bits-- e eu vou tentar, tipo de, digite-o para fora aqui--
se tivéssemos mais bits, o que poderia fazer aqui é adicionar a 1,
e então teríamos isso.
Whoops.
Teríamos um 1 bit por todo o caminho até aqui.
>> Mas se este é um finito valor, é apenas 8 bits,
e isso é pré-determinada pelo computador,
1 que é eficaz não existe.
É apenas uma espécie de cai de um penhasco.
E por isso, se você adicionar 1 a 255, o que valor que você aparentemente chegar?
0.
E assim os números acidentalmente, e, talvez, sem querer,
acabar envolvendo em torno de como este.
Então, o que pode ser a implicação disso?
Bem, há algumas coisas diferentes.
Então, um, ele não acabam procurando como 0, sem querer,
mas você pode tipo de ver, mesmo no mundo real,
por bem ou por mal, manifestações dessa idéia de um limite.
Por exemplo, qualquer um de vocês que já jogou Lego Star Wars,
Alguém por acaso sabe o número máximo de moedas
você pode coletar em Lego Star Wars?
Tome um palpite baseado em questões principais de hoje.
É maior do que 256 ou 255.
É 4 bilhões.
Assim, ao que parece, e há algumas pessoas--
alguns googling confirmou última noite-- ter começado 4 bilhões de moedas de ouro,
ou outros enfeites, em Lego Star Wars.
Embora, aparentemente, não há uma maneira de enganar o jogo,
há um bug ou recurso, que permite a você apenas acumular lotes e lotes de pontos.
Mas a maior possível valor, de acordo
a esta captura de tela de alguém que eu encontrados on-line, é de fato, 4 bilhões.
>> Agora, por que é isso?
É precisamente 4 bilhões, provavelmente porque alguém decidiu,
que estava escrevendo este jogo, que eles poderiam fazer 4 bilhões,
alguma coisa, alguma coisa, alguma coisa, como o valor eu coloquei
com o calculador anterior, mas é apenas um pouco mais limpo para os seres humanos
para dizer o número máximo de coins-- ou pregos,
como eles chamam eles-- que você pode coletar é 4 bilhões.
E assim, por que é isso?
Como é o jogo LEGO o contador de execução
que está mantendo o controle da número de moedas que você tem?
Eles estão usando o quê?
PARTICIPANTE: Ele pára contando após 4 bilhões.
DAVID MALAN J: Ele pára contando após 4 bilhões,
que significa que você pode inferir, como um programador,
que eles são, provavelmente, usando um número inteiro de 32 bits.
Como o programador literalmente apenas digitado, int, em seu código,
e esse é o tipo de variável que eles estão usando para armazenar o código de alguém.
Portanto, há outras manifestações desses tipos de limites.
>> Então eu não ter jogado este game-- e eu estava lendo sobre a história
para confirmar como much-- mas no versão original da Civilização, onde
você aparentemente interagem uns com os outros e podem fazer a guerra ou a paz,
Gandhi era suposto ser um dos os personagens mais pacíficos, como eu
compreendê-lo, em primeiro versão de Civilization.
E, de facto, numa escala de 1 a 10, sua agressividade era apenas um 1.
Então, sempre tão levemente agressivo, aparentemente.
>> Mas em algum ponto, você pode, aparentemente, instalar a democracia em sua geografia.
E se você instalar a democracia em sua versão do jogo,
em seguida, o seu nível de agressão vai para baixo.
É uma coisa boa.
As pessoas estão mais tranquilo aparentemente, nessa situação.
Mas, aparentemente, alguém fez não tem uma, se, condição
na versão original do código.
>> Então nível agressão de Gandhi passou de positiva 1, menos 2, para um negativo,
mas o jogo não faz entender os números negativos.
Então, o que aconteceu foi a agressão de Gandhi nível passou de 1 para 0, a 1 negativo,
que teve o efeito de envolvendo em torno de ser
o personagem mais agressivo no jogo, a um valor de 255,
numa escala de 1 a 10.
E, desde então, tem havido mais encarnações deste jogo,
e eles mantiveram-lo como uma espécie de ovo de Páscoa,
Gandhi que é aparentemente tão terrivelmente agressiva.
Mas foi o resultado de um erro de programação muito simples
nessa versão muito inicial do jogo.
>> Agora, mais perturbador, mais recentemente, o Boeing 787
foi documentada como tendo uma bug, não o tipo de dispositivo
você particularmente quero ter um bug.
E os sintomas, que eu vou ler aqui, a partir de um artigo on-line,
Foi este, um modelo 787 aviões que tem sido continuamente alimentado
para 248 dias pode perder tudo corrente alternada, AC,
energia eléctrica, devido as unidades de controle do gerador,
GCUs, simultaneamente entrar em modo de falhas.
Portanto, este foi um aviso emitido quando este problema foi detectado.
Esta condição é causada por um contador de software,
interno para o GCUs, assim um número inteiro ou uma variável,
que transbordam vontade após 248 dias de potência contínua.
Boeing é no processo de desenvolvimento de uma atualização de software que GCU
vai resolver a condição insegura.
>> Tão parecido com o míssil cenário, em que
eles tinham algum tipo de variável que contava, e contando,
e contar, mas transbordando gradualmente os limites da sua capacidade,
fez da mesma forma que o avião de maldição ter um estouro de variável
depois de bastante tempo de execução.
E assim o caminho tongue-in-cheek de trabalhar em torno desta questão
é, na verdade, reiniciar, o avião toda 247 dias, para que a memória é eliminada
ea variável vai para trás a 0.
Mas perceber, este é um muito grande encarnação de software,
mas especialmente porque ouvimos falar sobre a Apple sistemas operacionais de entrar em carros,
e carros de auto-condução do Google, e qualquer número de encarnações de software
Em nossas vidas diárias, TVs e relógios, e muito mais,
perceber foram cercados por software, tudo o que é escrito por nós seres humanos.
>> E, como todos nós vamos descobrir em breve, é muito fácil e muito típico
a cometer erros ao escrever software.
E se você não pegá-los, algumas coisas ruins podem acontecer.
Agora, às vezes, alguns coisas engraçadas podem acontecer,
ou, pelo menos, às vezes nós saber para esperar alguma maldade.
Assim 0 dividido por 0, a partir do grau escola, geralmente é uma coisa ruim.
É indefinida.
E acontece out-- e vamos ver se meu microfone pode escolher este up-- que a Apple
teve algum divertimento com este recentemente.
Então, eu tenho um iPhone aqui.
Eu vou falar com Siri e pedir-lhe para me dar a resposta a 0 dividido por 0.
O que é dividido por 0 0?
>> SIRI: Imagine que você tem 0 cookies, e você dividi-las uniformemente
entre 0 amigos.
Quantos os cookies que cada pessoa recebe?
Vejo?
Não faz sentido.
E Cookie Monster é triste que não existem biscoitos.
E você está triste que você não tem amigos.
DAVID MALAN J: É uma espécie de desagradável.
Portanto, este é apenas o que foi dito lá.
É indeterminado, não é definida, E de fato, muitas linguagens de programação
ou, realmente, compiladores detectar quando, num programa,
tentar dividir 0 por 0.
Mais divertido do que isso, porém, é que, aparentemente, Cookie Monster
está no Twitter estes dias.
E ele respondeu a esta, com isso, que é absolutamente adorável.
Mas vamos dar uma rápida olhada em um par de outras construções,
e em seguida, colocar algumas dessas código de usar, em boas maneiras.
Então não é que, além de loops, há
algo chamado um loop while, que parece diferente e é implementado
um pouco e differently-- vamos finalmente ver examples--
mas, em certo sentido, é mais simples porque
não permite que você para inicializar e actualizar dentro do limite do circuito.
Você ainda pode implementá-lo.
Assim você pode fazer exatamente as mesmas coisas com um loop while, como com um loop for,
mas sua sintaxe, ultimately-- como vamos finalmente
see-- vai ser diferente.
Há até mesmo um loop Do While, que é realmente um pouco diferente,
em que, enquanto um loop e um loop while sempre
verificar a sua condição de primeira, se você ler essa coisa de cima para baixo,
que tipo de parece que vai verificá-lo da condição do último porque é
verdadeiramente a última linha de código.
E, de fato, isso vai ser útil em determinados programas que escrevemos,
se você quiser apenas fazer algo cegamente e, eventualmente, verificar a condição.
Isso não é necessariamente uma coisa ruim.
Se quisermos variáveis, podemos fazer -lo em um par de maneiras diferentes.
E vimos no FoxTrot desenhos animados, uma maneira de fazê-lo,
onde você declarar a variável, como int contador de ponto e vírgula,
e, em seguida, later-- talvez o próximo linha, talvez 10 linhas later--
você realmente inicializar-lo.
Assim estas 2 linhas de código declarar uma variável do tipo int
e chamá-lo de balcão, por isso dá- mim o suficiente bits para realizar um int.
E, em seguida, eventualmente, ele coloca o valor 0 para essa variável.
Ela organiza os 0 e 1 em um de padrão, que sabemos que desde a semana passada,
representa o número que conhecemos como 0.
Ou, francamente, você pode fazer isso muito de forma mais sucinta, como esta.
>> Agora temos também a capacidade de chamar funções.
E, de fato, aqui está uma linha 2 programa, ou um excerto da mesma,
que nos permite, na verdade, escrever algum código que
recebe uma string do user-- muito como o nosso voluntário um momento ago--
armazenando o resultado uma variável chamada nome,
e entăo-- muito parecido com o nosso voluntário com estampas printf-- fora esses valores
passando em dois argumentos, o cadeia, seguida da variável
chamado, nome, em si.
Então, vamos dar uma olhada, antes de queremos voltar a Mario lá,
em um par de agora, exemplos disso.
>> Eu estou indo para ir em frente e aberto até, vamos dizer, a função-0.c.
E como sempre, este código é disponível no site do curso,
para que você possa tocar junto no casa e olhar para ele mais tarde.
Mas aqui está o programa em que é Essencialmente, a partir da linha 17 a 22.
O programa principal é onde o programa é sempre vai começar.
Este programa, aparentemente, vai para imprimir o seu nome, cólon.
É, em seguida, vai chamar GetString, tal como fizemos com nossos voluntários.
E então, isso é interessante, ele vai chamar PrintName.
Acontece que, durante todo esse tempo, não parece ser uma função chamada PrintName.
Que imprime o nome de alguém.
Nós não precisa usar printf de passado, há PrintName.
>> Mas isso é enganoso porque não faz PrintName
vêm com C. As pessoas não inventá-lo cerca de 40 ou 50 anos atrás,
Eu fiz, em vez disso.
E, de fato, se eu rolar ainda mais para baixo, aviso
como eu posso escrever o meu próprio funções em C. vamos finalmente
explicar por que razão continuamos dizendo: vazio, em alguns lugares,
mas para hoje, vamos basta olhar para o nome.
>> Na linha 24, se você quiser criar sua própria função,
você literalmente escrever o nome da função.
Eu escolhi PrintName.
Em parênteses, você em seguida, especificar que tipos
de insumos, e quantos você quer esta função para tirar.
Neste caso, eu quero levá 1 variável chamada, nome,
e que vai ser de Tipo, corda, por isso vai
para ser uma sequência de caracteres.
E então, este program-- bem como no Scratch,
você pode ter quebra-cabeça personalizado pieces-- vai ter esse comportamento personalizado.
Vai chamar printf passando, Olá, espaço reservado,
e, em seguida, ele vai ligá em tudo o que o usuário chamado.
>> Portanto, este é um exemplo do que um cientista da computação seria
abstração chamada ou funcional decomposição, que são apenas
formas extravagantes de dizendo-- é se você gosta dessa idéia de alto nível,
como eu quero funcionalidade que imprime o nome de alguém, absolutamente você
pode literalmente escrever printf e depois passar os argumentos que você quer,
eo programa irá funcionar, como tem sido desde quarta-feira.
Mas você pode começar a abstrair a noção de impressão de um nome.
Você pode dar-lhe um nome, como PrintName, e este
é essa idéia de camadas de semana 0.
>> De agora em diante, eu e você não tem que saber ou se importa como PrintName é implementado.
Sim ele usa printf, talvez seja não, quem sabe o que usa?
Quem se importa?
Agora eu estou falando aqui, em vez de descer aqui.
E, de fato, como nossos programas de obter mais avançada e sofisticada,
vamos continuar a tomar para concedido que existem mais baixas peças do puzzle nível.
Porque nós escrevemos-los ou alguém fez, então
que podemos, então, construir em cima deles.
Vamos dar uma olhada neste variante, funcionar um.
>> Então, este é um pouco mais avançado, mas verifica-se
que na biblioteca de CS50, há apenas uma função GetInt.
Nós não pensamos que, anos atrás, para implementar uma função GetPositiveInt.
E isso é um pouco chato, porque se vocês estão escrevendo um programa em que
Você quer ter um positivo número inteiro de o utilizador,
você pode perfeitamente usar GetInt.
E você pode absolutamente verificar com a condição e talvez um loop
Se é maior que int que 0 e gritar com o usuário
se ele ou ela não dá você um número positivo.
Mas vamos construir este edifício bloquear a nós mesmos, um,
peça Raspadinha costume, se você quiser.
Eu vou ter um programa aqui que, em última análise, Eu
quero ser capaz de chamá- GetPositiveInt, e eu quero ser
capaz de imprimir o que quer que é int.
Mas isso é abstraída agora.
Ele acaba de ser dado um nível elevado nome que diz que ele faz,
que é maravilhoso porque é muito intuitivo agora de ler.
E se eu me importo o que está por baixo o capô, deixe-me rolar para baixo.
E é um pouco intimidante em primeiro lugar, especialmente
se este é o seu primeiro programa, mas vamos dar uma olhada.
>> Eu não estou dizendo, vazio, pois verifica-se funções,
muito parecido com GetString, pode retornar um valor para mim.
Eles não apenas têm para imprimir na tela,
eles realmente podem entregar me algo de volta.
E que antes PrintName, Eu não preciso de nada de volta.
Eu precisava do efeito colateral de algo aparecendo na tela,
mas eu não preciso de um homem me dar algo de volta.
Aqui, com GetPositiveInt, como com GetInt,
Eu quero ser entregue algo de volta.
Então, eu estou dizendo não, vazio, na linha 23, mas int,
que diz, esta função que estou escrevendo,
chamado GetPositiveInt vai entregar-me de volta um inteiro, não nada,
não vazio.
>> Enquanto isso, ele vai tomar nenhuma entradas, então eu, tipo, inverteu-lo.
Eu não estou dando qualquer GetPositiveInt entrada, eu quero que ele me dê a sua saída.
E então o que acontece agora?
Então aqui está como eu pode declarar uma variável.
Já fiz isso fora do loop, por razões vamos finalmente ver,
mas isso só dá me 32 bits chamado, N,
e eu tenho pré-determinação los para armazenar inteiro.
E aqui é que, fazer enquanto construção, e é por isso que ele é útil.
Literalmente fazer isso, enquanto N é inferior a 1.
Então vamos ver o que acontece.
Eu imprimir, por favor dê-me um int positivo.
Eu, então, obter um int, usando de CS50 funcionar e armazenado em N.
>> E então, o que linha de código, provavelmente, é executado próximo, logicamente?
Qual o número da linha?
Sim, então 31.
Você não saberia disso até que você tenha foi dito ou tipo de inferir que,
mas isso é verdade.
Ele vai de cima para baixo e, em seguida, continua a repetir.
Então, se eu ter digitado por exemplo, o número 1 negativo, é n menos de 1 negativo?
Sim.
Porque negativa 1 é inferior a 1.
Então, o que deve acontecer?
Eu vou fazer isso enquanto N é inferior a 1,
então eu vou voltar para a linha 28.
>> E cada um tempo-- e vamos correr isto-- fazer a função de 1 a compilá-lo,
e agora dot cortar função 1.
Se eu digitar um negativo, é vai continuar gritando comigo
até que eu cooperar porque cada das minhas entradas é inferior a 1
e se for inferior a 1, enquanto, Eu vou continuar fazendo isso.
Se eu finalmente dar-lhe um número como 50, felizmente, ele diz que, graças ao 50.
Por quê?
Porque assim que n não seja inferior a 1, eu paro de ficar preso neste loop,
e esta nova palavra-chave hoje, retorno, literalmente faz isso.
Então eu acabei implementado, em uma sentido, o equivalente a GetString,
onde estou devolvendo a quem está me usando, algum valor.
Ele não tem de ser uma corda, é um int.
Assim, um simples, rápido exemplo, mas nós vamos em breve
ver um pouco mais sofisticado versões ainda.
Na verdade, vamos dar uma olhada em um um numérico, que é chamado return.c.
E este é, na verdade, um pouco mais simples.
Assim, o propósito deste programa em vida-- vamos compilar e executá-lo,
por isso certifique-retorno, dot barra, aviso return--
o programa simplesmente cubos o valor 2.
É muito estúpido, é difícil código, não é preciso nenhum entradas,
mas isso demonstra outro função que eu me escrito.
Então aqui, eu tenho declarado variável, chamado x, do tipo int,
igual ao número 2, completamente arbitrária.
Este é apenas alguma impressão fofo.
Diz x é agora, e tal tal, cubing dot dot dot.
E a magia está aparentemente em linha 21.
Eu estou chamando uma função chamada, cubo, Estou entregando-lhe uma folha de papel
com o número 2 escrito nele, e qual o valor que, matematicamente,
eu quero sair dela?
Assim como uma verificação de sanidade?
8.
Certo?
Eu quero dois cubos de volta, 2 a a potência de 3, de modo 8 de volta.
>> Então, onde está cubo implementado?
Bem, a notificação é implementado aqui embaixo.
E, assim como antes, logicamente, embora a sintaxe é provavelmente
muito novo para muitos de vocês, Eu quero essa função
para me devolver uma folha de papel com um int nele.
Então, eu tenho um int, o nome é arbitrariamente,
mas convenientemente denominado cubo.
A entrada para ele, n é de tipo inteiro, o que é
Como eu passar no número 2 numa folha de papel.
E, em seguida, verifica-se suportes C matemática, então você não tem de x para os tempos,
você só usar o asterisco para a multiplicação.
E isso retorna n vezes n vezes n, o qual é simplesmente um valor ao cubo.
>> Então, para onde estamos indo com tudo isso?
Este é definitivamente um tour relâmpago, a certeza,
que as secções de super em e no conjunto de problemas 1,
você vai ser orientado pelo tudo isso ainda mais.
E em um conjunto de problemas, vamos transição do mundo gráfica do Scratch
para algo mais linha de comando em C. Mas vamos inspirar-
a partir deste jogo aqui de outros tempos, em que
usando C e a edição padrão do p set você implementará pirâmide de Mario.
E na edição de hackers do p set, se assim o desejarem eleger,
você implementará um pouco mais desafiando pirâmide com dois picos.
Você também vai implementar um algoritmo, um algoritmo guloso.
Acontece que há alguma lógica interessante
por trás do processo de executando uma estação de cashier
e, na verdade, entregando- alguém mudança de volta.
Existe um algoritmo que é bastante simples, que você pode até
compreender intuitivamente quando li pela primeira vez ele-- percebendo que é o que eu sempre
feito a qualquer momento eu tenho dado a alguém algum traseira-- dinheiro que lhe permite sempre
minimizar o número de notas de papel ou moedas metálicas
que você está entregando de volta para o usuário.
E isso, é claro, é convincente porque se você vai a CVS ou outros enfeites,
você não quer ser handed um monte de os
ou um monte de moedas de um centavo.
Você quer que o menor moedas, provavelmente, possível.
>> Finalmente, você também vai ser desafiados a se envolver no mundo da água
e realmente obter uma valorização para um mapeamento entre as taxas de fluxo,
de gosto, de água em um chuveiro, quanta água é usada.
E a alusão nele, será este clipe aqui,
que vamos acabar por apenas 60 segundos, que
pinta um quadro de cabeças de chuveiro de baixo fluxo.
>> [REPRODUÇÃO DE VÍDEO]
-Tudo certo.
Eu tenho tudo aqui.
Eu tenho o Cyclone F Series, Hydra, Jetflow, Estocolmo
Supersteam, o nome dele.
>> -E O que você recomendaria?
>> -O que você esta procurando?
>> -Power Homem.
Potência.
-Como Silkwood.
-Isso É para a radiação.
-Está certo.
-Agora O que é isso?
-Isso É o Commando 450.
Eu não vendo aquele.
>> -Mas Isso é o que nós queremos.
É um commando 450.
>> -Não Acredite em mim.
Ele só é usado no circo.
É para elefantes.
>> -Vou Pagar nada.
>> -E Jerry?
>> -Ele Não podia lidar com isso.
Ele é delicado.
Oh sim.
[FIM DE REPRODUÇÃO]
DAVID MALAN J: Tudo bem.
Isto é, se para CS50.
Vamos vê-lo na próxima semana.
>> COLUNA 1: [? Scully?], [? Ian,?] na medida em que este projecto Outro,
o que vocês chegar a?
>> COLUNA 2: Bem, nós demos uma variedade de pensamento,
e nós pensamos que a melhor maneira a--
>> COLUNA 3: Posso?
>> COLUNA 2: Sim.
Por todos os meios, na verdade.
>> COLUNA 3: Então eu acho que podemos resumir a nossa idéia
para os Outros, com uma nada word--.
>> DAVID MALAN J: Nada?
COLUNA 3: Nada.
DAVID MALAN J: O que significa isso?
COLUNA 3: Os Outros são sobre nada.
COLUNA 2: Bem, quero dizer, em filosofia, Quero dizer, nada é sempre algo.
COLUNA 1: Então what's-- o que é a premissa?
COLUNA 3: Então é como a vida.
ESTÁ BEM.
O que você fez hoje?
>> DAVID MALAN J: Eu me levantei, tive café da manhã, e veio para trabalhar.
>> COLUNA 3: Isso é uma chamada outro.
COLUNA 2: Mas, quero dizer, não deveria algo acontecer com ele em as--
COLUNA 3: Não, não, não, não.
Nada acontece.
>> COLUNA 1: Então por que estamos assistindo?
>> COLUNA 3: Porque é um Outro para CS50.
>> DAVID MALAN J: Ainda não.