>> [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]