[Powered by Google Translate] DAVID J. MALAN: Tudo bem, isso é CS50 e este é o
final da semana 1, cartões etc estudo está eo número total de
colegas que você tem para este ano é 745.
E estamos tão entusiasmados em ter tantos de vocês no curso
este semestre, mas mesmo que este curso é tão grande,
perceber que é essas coisas como almoços sexta-feira, como
as horas de expediente, 15 pessoa-seções e assim por diante que
são realmente significava para criar esta mais íntima
ambiente.
Assim, mesmo que podemos nos reunir uma vez ou duas vezes por semana, aqui em
Sanders, sei que muito de sua experiência neste curso
vai ser muito hands-on em ao lado de seus colegas
e do corpo docente.
>> Então, vamos lá, Fall 2012.
Então, lembro que a última vez que terminou com uma nota de
imprecisão, falando sobre a representação de números.
E nós olhamos uma das falhas que aconteceram, no
mundo real, quando se trata de mal-entendido
como os computadores funcionam.
Bem, hoje nós vamos revisitar mais uma daquelas idéias como
bem como continuar a discussão do cliente CS50
e C eo que significa realmente para o programa.
Mas, primeiro, apenas um par de anúncios de redemoinho.
>> Seções começam neste domingo, e na primeira semana é sempre uma
pouco de um início rápido, porque só tenho em
formas sua seção.
Estamos fazendo o mesmo, agora, com os companheiros de ensino, agora
que eles sabem seus horários, por isso estamos visando, por
Sábado de manhã, para acompanhar com você, com sua seção
atribuição e TF.
Perceba que eles vão começar no dia seguinte, domingo
ou segunda-feira ou terça-feira.
E então vamos acomodar as mudanças de seção que possam surgir
nos dias que virão.
As horas de expediente, entretanto, são, mais uma vez, esta noite, 08:00 a 11, em
Annenberg, bem como amanhã à noite.
Mesmo que os conjuntos de problemas são geralmente devido às quintas-feiras
ao meio-dia, percebe que tem até cinco dias de atraso para gastar,
portanto, a disponibilidade de horário de expediente nas quintas-feiras se
lhe dinheiro em um desses dias de atraso e, assim, apresentar
algo na sexta-feira.
Deixe-me sugerir que Scratch é entre o mais divertido, entre os
mais baixas importantes conjuntos de problemas.
E eu gostaria de pendurar os dias de atraso, estrategicamente, apenas
para o final do semestre, quando a vida começa a ficar no caminho
com exames semestrais e outras classes.
Definir um problema, entretanto, seria publicado no seu curso
site nesta sexta-feira, como será a caminhada do curso
através de vídeo, que será filmado em 02:30 na sexta-feira
e, em seguida, publicado online no dia seguinte.
>> Assim, terminou na segunda-feira.
Eu quero - na verdade, uma nota aqui.
Como as classes - porque Sanders não é exatamente emprestam
se a Q & A ocasional e para trás muito bem, estamos
vai tentar algo um pouco este ano novo, em que
se você não está confortável levantar a mão ou você só
prefere não levantar a mão em uma sala como esta,
vamos ter alguns dos companheiros de ensino e CAs
cs50.net/discuss tripulação durante a palestra.
Então se você tem uma pergunta, porque eu estava completamente
claro sobre algo ou você está curioso sobre alguns
tópico, tente postar lá.
Marcá-lo com um rótulo de Palestra, e nós vamos fazer o nosso melhor
hoje e na próxima semana - nós tentar fazer isso - para área de TI
em suporte electrónico, online, ou se ele se sente como deveríamos
realmente enfrentá-lo em massa, um dos companheiros de ensino ou
CAs vai levantar a mão e pedir
anonimamente em seu nome.
Então, vamos tentar dar um presente e ver como isso funciona bem.
Mas, por todos os meios, continuam a levantar as mãos, como você gostaria.
>> Então última vez que revelou que 10% ou um décimo não é, em
fato, 0,1, como você foi ensinado há muitos anos.
É, de facto, um valor como este.
Mas isso não é totalmente verdadeiro, certo?
Só temos esta restrição em computadores em que, se você
apenas têm uma quantidade finita de memória, a RAM, ou mais
especificamente bits, bem, há apenas um número finito
de coisas que você pode representar.
Por exemplo, se temos o número zero, e queremos
representar em binário, usando oito bits, onde um pouco,
novamente, é um zero ou um um, poderíamos
representá-lo como 00000000.
E isso é um pouco desnecessariamente detalhado.
Assim como no sistema decimal, no mundo real,
Geralmente, se você quiser escrever o número 123, que
seres humanos provavelmente não escrevo 00000123 embora,
funcionalmente, que é exatamente o mesmo número.
Nós apenas uma gota zeros à esquerda, por assim dizer.
>> Em binário, podemos fazer o mesmo.
Binário e zero zero, e binário é apenas zero.
Você só precisa de um único bit.
Mas, de novo, a unidade de medida mais comum no mundo
da computação é bytes, oito bits.
Só porque um pouco, bastante inútil.
Oito bits, não muito útil, mas pelo menos é mais
úteis do que uma única unidade de medida.
Assim, com oito bits, vamos normalmente representam binário.
Portanto, temos aqui os números zero, um, dois, e então, como
Nate fez em nosso vídeo última quarta-feira, podemos continuar
contando até sete, oito.
E então, se usamos mais e mais bits, nós
pode contar até o infinito.
Mas se você só tem um número finito destes bits, como é
o caso de qualquer sistema de computador, ou mesmo de mísseis
sistema, bem, na verdade você só tem um
quantidade finita de precisão.
Então se você quer para representar o número como 0,1, bem, o
computador tem que escolher.
E se ele só tem um número finito de números que pode
representar, pode chegar perto de 0,1 por você, mas não pode
necessariamente dar-lhe exatamente o valor que você deseja.
E este é apenas um dos desafios de computadores,
debaixo do capô, felizmente.
>> À medida que avançamos mais no semestre, o nível mais baixo estes
detalhes tornam-se muito menos interessante, mas certamente o
aplicação dessas idéias pode ter um mundo muito real
ramificações.
Um deles é um pouco diversão.
Como muitos de vocês já viram o Office Space incrível filme?
Se você não tem, que é o seu não-oficial
lição de casa para a semana.
Mas em Office Space, os companheiros em que o filme tome
vantagem de exatamente essa idéia, mas eles realmente roubou
de outro filme que você pode ter
visto, até mesmo anos antes.
Então deixe-me dar-lhe alguns segundos de este trailer de
este filme incrível e isso é muito
academicamente relevante.
>> [JOGOS DE FILME]
Na verdade, estou sendo promovido.
Eu posso programar um vírus que vai rasgar que
coloque grande momento.
Bem, como é que funciona?
Toda vez que há uma transação bancária onde o interesse é
computadorizada, existem milhares por dia, o computador acaba
com essas frações de um centavo.
Mas eu não vou fazer nada ilegal.
Ilegal? Samir, este é a América.
Você tem que jurar a Deus.
Se ninguém sabe sobre isso, mas nós, certo? Nenhum membro da família, não
namoradas, ninguém.
[Inaudível].
Não se preocupe, cara, eu não vou contar pra ninguém quer.
[Filme termina]
>> Tudo bem, então talvez eu encontrei este filme melhor do que a maioria
pessoas aqui, mas em qualquer caso, o vírus que foram
tentando criar -
e no cinema, a qualquer hora que eles chamam algo de um vírus,
geralmente não é realmente um vírus.
É apenas um programa que alguém escreveu para fazer algo.
E, neste caso, os caras estavam tentando escrever um programa
que se aproveitou de sua empresa chamada Innotech de
sistema de computação em que, computadores, também, mesmo quando
trata de dinheiro, pode não necessariamente
representam dinheiro com precisão.
Assim, mesmo que você pode ter $ 0,10 em sua conta bancária,
0,10, bem, o computador pode realmente acho que você tem
este centavos muitos em sua conta bancária.
E então o que esses caras estavam aspirando a fazer - e eles
roubou a idéia, ao que parece de Superman III, onde
Richard Pryor fez a mesma coisa - eles eram essencialmente
escrever programas que aspiram a ocupar toda a fuga
números, todos os pequenos, minúsculos, pequenas frações de
tostões, e siphoning aqueles fora de forma que os seres humanos só
pensamento, oh, é apenas 0,10 dólares lá, mas todos aqueles que
números finais, eventualmente, adicionar-se.
Então, uma idéia maravilhosa e divertida em que saiu pela culatra
filme em particular.
>> Mas no mundo real, também, há muito mais sobre
implicações destes tipos de coisas.
E uma das razões para mergulhar no campo do computador
ciência é, de novo, a sua aplicabilidade não ao
ciências da engenharia sozinho, mas apenas para
outros campos também.
Portanto, este é um olhar menos alegre com o que pode dar errado, mas
também é bastante abertura dos olhos, eu acho que, quando se trata de
entender exatamente como onipresente tecnologias como
computadores e de programação ou nos dias de hoje,
sob a forma de software.
Portanto, este próximo clipe é apenas cerca de seis minutos, continua
onde paramos da última vez, mas nos permite olhar um pouco
mais em profundidade em um tal de estas questões.
Deixe-me ir direto ao ponto em que parou,
que estava bem aqui.
E nós temos a parte dois de dois, por cerca de seis minutos aqui.
>> [MOVIE PLAY]
Atormentado tecnologia de foguetes modernos.
Em 1991, com o início da Guerra do Golfo, o Patriot
míssil experimentou um tipo similar de
problema de conversão de número.
E, como resultado, 20 pessoas, 20 soldados norte-americanos, foram mortos
e cerca de 100 ficaram feridos, quando o Patriot, que deveria
para proteger contra Scuds entrada,
não conseguiu disparar um míssil.
>> Quando o Iraque invadiu o Kuwait e América lançou um deserto
Tempestade no início de 1991, as baterias de mísseis Patriot foram
implantado para proteger a Arábia Saudita e Israel a partir do Iraque
Mísseis Scud ataques.
O Patriot é um EUA de médio alcance do sistema superfície-ar,
fabricado pela empresa Raytheon.
O tamanho do interceptor Patriot em si, é sobre
cerca de 20 metros de comprimento e pesa cerca de 2.000 quilos.
E ele carrega uma ogiva de cerca de - Eu acho que é mais ou menos
150 libras.
E a ogiva em si é um explosivo de alta que tem
fragmentos em torno dele.
A carcaça da ogiva é projetado para agir como chumbo grosso.
Os mísseis são realizadas quatro por recipiente e são
transportado por um semi-reboque.
>> O Patriota sistema anti-míssil remonta pelo menos a
20 anos.
Ele foi originalmente concebido como um míssil de defesa aérea para
derrubar aviões inimigos, na primeira Guerra do Golfo.
Quando a guerra chegou, o Exército queria usá-lo para atirar
Scuds para baixo, e não aviões.
A Força Aérea do Iraque não era tanto de um problema, mas o Exército
estava preocupado com Scuds.
E assim eles tentaram atualizar o Patriot.
Interceptar um míssil inimigo viajando a MACH 5 ia
a ser bastante difícil.
Mas quando o Patriot foi levado em serviço, o Exército
não estava ciente de uma modificação do Iraque, que fez sua
Scuds quase impossível de bater.
>> O que aconteceu é que eram os Scuds
chegando eram instáveis.
Eles estavam balançando.
A razão para isto foi o iraquianos, a fim de obter 600
quilômetros para fora de um míssil faixa de 300 quilômetros, levou
peso fora da ogiva frente e
feita a ogiva isqueiro.
Portanto, agora o Patriot está tentando entrar no Scud, e mais de
o tempo, a esmagadora maioria do tempo, seria
apenas voar pelo Scud.
Uma vez que os operadores do sistema Patriot percebeu o Patriot
errou o alvo, eles detonaram a ogiva Patriota.
Para evitar eventuais sinistros, foi permitido
a cair para o chão.
Isso foi o que a maioria das pessoas viu, como bolas de fogo no céu grandes,
e incompreendido como interceptações de ogivas Scud.
>> Embora, no céu à noite, Patriots parecia ser
Scuds destruído com sucesso, em Dhahran, não poderia haver
erro sobre seu desempenho.
Lá, o sistema Patriot radar perdeu o controle de um
entrada Scud e nunca lançado devido
a uma falha do software.
Foi a israelenses que descobriu que quanto mais tempo
o sistema foi ligado, quanto maior for a diferença de tempo tornou-se,
devido a um relógio incorporado no computador do sistema.
Cerca de duas semanas antes da tragédia em Dhahran, o
Israelenses relataram ao Departamento de Defesa que o
sistema estava perdendo tempo.
Depois de cerca de oito horas de corrida, eles notaram que o
sistema foi se tornando visivelmente menos preciso.
O Departamento de Defesa respondeu dizendo todos
as baterias Patriot não deixar os sistemas
por um tempo longo.
Eles nunca disseram que muito tempo foi - 8 horas, 10
horas, 1.000 horas.
Ninguém sabia.
>> A bateria de mísseis Patriot estacionado no quartel em Dhahran
e o seu relógio interno tinha sido danificado em mais de 100 horas em
na noite de 25 de fevereiro.
É monitorado o tempo com 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 qualquer exactamente
computador digital moderno.
É difícil de acreditar.
Mas usar isso como um exemplo.
>> Vamos pegar o número um terceiro.
Um terceiro não pode ser expressa em decimal, exactamente.
Um terço é 0,333 acontecendo para o infinito.
Não há nenhuma maneira de fazer isso com absoluta precisão em decimal.
Isso é exatamente o mesmo tipo de problema que aconteceu em
o Patriot.
Quanto mais tempo o sistema funcionou, o pior erro o tempo se tornou.
Depois de 100 horas de operação, o erro em tempo foi apenas
cerca de um terço de um segundo.
Mas em termos de alvo um míssil viajando a Mach 5,
que resultou em um erro de rastreamento de mais de 600 metros.
Seria um erro fatal para os soldados em Dhahran.
>> O que aconteceu é um lançamento de Scud foi detectado pelo alerta precoce
satélites e eles sabiam que o Scud estava chegando em sua
direção geral.
Eles não sabiam de onde vinha.
Era agora até o componente radar do Patriot
sistema, defendendo Dhahran, para localizar e acompanhar o
míssil inimigo de entrada.
O radar foi muito inteligente.
Você realmente controlar a posição do Scud e depois
prever onde ele provavelmente seria a próxima vez que o
radar enviou um pulso para fora.
Que foi chamado de o portão alcance.
Então, uma vez que o Patriot decide passou tempo suficiente para ir
para trás e verificar o próximo local para este detectado
objeto, ele vai voltar.
Então, quando ele voltou para o lugar errado, então não vê
objeto, e decidir que não havia objeto.
Foi uma falsa detecção e cai na pista.
>> O Scud entrada desapareceu da tela do radar.
E, segundos depois, ele bateu no 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.
E a falha de software havia sido fixado, fechando um capítulo de
conturbada história do míssil Patriot.
PATRIOT é na verdade um acrônimo para "Tracking Phased Array
Interceptar de Target ".
>> Tudo bem, então um resultado muito mais triste de não muito
compreensão deste mundo.
E o takeaway, realmente, a partir da película é que a solução
lá foi reiniciar o seu sistema de defesa antimísseis
de vez em quando.
E assim, novamente, um dos objectivos deste curso, certamente
em uma escala mais humilde do que estas aplicações, é
olhos de todos realmente aberto para com exatamente como você ir sobre
máquinas de fazer fazer o que você quer fazer e como você ir
sobre fazer isso corretamente, enquanto que ao longo do caminho fazendo isso
assim, de forma elegante, e assim por diante.
E assim, hoje, vamos mergulhar em um pouco mais disso, mas
de modo que nós não vamos muito rápido, principalmente para aqueles menos
confortáveis, mas também para que se possa manter o interesse do
aqueles mais confortável, vamos começar rapidamente com um pouco
de resumo de algumas dessas idéias.
E, novamente, pergunte, tanto em pessoa ou online, se você tiver
perguntas para que possamos manter todos na mesma página.
>> Assim, o aparelho CS50, passo rápido para trás, é
o que, em suas próprias palavras?
Tudo bem se você não tem idéia do que estas palavras podem ser ainda.
[Inaudível]
Ok, então uma interface universal para -
que todos nós podemos compartilhar.
Absolutamente.
Assim, poderíamos, por exemplo, dizer-lhe para ir a algum
site, o download deste software para Mac OS.
Baixe este software para Windows, configurar em
Desta forma, e que.
Mas a realidade é, então, nos deparamos com inúmeros técnico
apoiar questões.
E também nos dias de hoje, muito do que está sendo feito do lado do servidor,
no mundo da computação, especialmente quando se trata de
desenvolvimento web e aplicações web based, é na verdade
muitas vezes feito em computadores Unix ou Linux, ao contrário de
Macs ou PCs com Windows.
>> Assim, entre os prós, então, de usar essa coisa chamada
CS50 Appliance é todos nós vamos ter o mesmo ambiente.
Então, todos estão na mesma página, não importa qual hardware você
chegou ao campus com, mas também vai ser meter em exatamente
o mesmo ambiente que você vai usar para
extremidade semestre, bem como para o desenvolvimento web, bem como no
futuro para aplicações reais do mesmo.
Então, mais concretamente, o aparelho CS50 é uma peça de livre
software que permite que você execute um outro sistema operacional,
Linux, neste caso, no seu próprio computador, de uma janela.
Agora, você não pode apenas baixar o aparelho.
Você precisa de um programa com o qual jogar ou executar o aparelho.
E aquele pedaço de software é geralmente conhecido como um
hypervisor.
Hipervisores vir na forma de produtos como o VMware,
Virtual Box, Parallels.
Todos os tipos de empresas fazem software, livre e
comercial, igualmente.
O que você vai ver no Problema Set 1 são instruções sobre como
obter o software gratuito com o qual a
executar o Appliance CS50.
E uma vez que você faz, você vai ter, em uma janela no seu Mac ou PC,
um ambiente de trabalho que se parece muito como este, onde
ele tem uma coisa-menu Iniciar, como na
canto esquerdo inferior.
Tem uma pasta Home, ou diretório Home, no canto superior esquerdo
ali, uma lata de lixo, e assim por diante.
Então vamos separar os detalhes necessários como vamos nós.
>> Mas agora vamos começar a mergulhar em C.
Então C é a linguagem de programação, semelhantes em espírito à
Zero, mas muito menos gráfica, mas, ironicamente, longe
mais poderosa, uma vez que você começa esclarecido com ele.
Assim, em C, escrevemos programas, escrevendo código fonte, que é
esta sintaxe do Inglês, semelhante às meias
demonstração de que fizemos da última vez que lhe permite
expressar-se com bastante precisão, se
arcanely, para o computador.
>> Então, que tipo de produto de software que você realmente precisa
para escrever programas em uma linguagem como C, com base em nossa
conversa na segunda-feira?
[Inaudível]
OK, você só precisa de um editor de texto.
Você não precisa de nenhum software especial
per se para escrever programas.
Você só precisa de um editor de texto como o Bloco de Notas, no Windows,
TextEdit no Mac, ou algo chamado gedit, no mundo da
Linux, que vamos usar aqui.
E é isso, de escrever os programas.
>> Mas a escrita é apenas metade da equação.
Você precisa então executá-los.
Mas, a fim de executar programas -
você não pode executar código fonte.
Você, em vez de fazer o que a ele primeiro?
Sim.
DAVID J. MALAN: Você precisa
compilá-lo.
E, outra pessoa, a compilação do código-fonte significa -
[Inaudível]
DAVID J. MALAN: Exatamente.
Traduzindo-o para zeros e uns.
Porque todos nós, nestes dias, tem computadores que possuem processadores,
quase todas as quais são feitas por uma companhia chamada Intel, e
Intel Inside, significa que há esta dentro do seu cérebro
computador, conhecido como o CPU.
E uma das coisas que o cérebro faz é, ele sabe
como entender os padrões de zeros e uns.
Ele sabe o padrão de bits representa disso, o que
padrão representa subtrações, o padrão de
bits representam a impressão, e criando um som audível.
>> Assim, em resumo, o processador, juntamente com o sistema operacional,
que é um pedaço de software que roda em cima do CPU,
por assim dizer.
Juntos, esses dois pedaços sabe como executar programas que
nós seres humanos escrever.
>> Então, se eu vou para o Appliance CS50 aqui, eu preciso abrir
um editor de texto e eu posso acessar este
em um par de formas.
I pode ir ao Menu, Programação,
e então eu posso selecionar -
Não, não esse menu.
Eu posso ir para Acessórios / gedit aqui para abrir
meu editor de texto pouco.
Ou, mais simplesmente, que pode clicar neste ícone pouco no fundo
canto esquerdo.
E agora eu tenho esse ambiente aqui.
É muito reminiscente de um editor de texto simples, com apenas
uma ou duas diferenças.
No topo, onde está o cursor piscando agora, este é o lugar onde
Eu posso começar a escrever meu código.
No fundo é essa coisa chamada janela de terminal.
E que tipos de coisas que eu posso fazer neste
o chamado janela de terminal?
[Inaudível]
>> Ok, então eu vou executar comandos.
E alguns dos comandos que decorreu na segunda-feira foram um pouco
enigmáticas no início, mas ls para a lista, cd para o diretório mudança,
rm, para remover.
Então, é uma espécie de caminho-escola velha de navegar no seu
computador, usando apenas o teclado e comandos textuais,
e não, em geral, utilizando um rato.
Mas vamos ver, em pouco tempo, isso realmente nos dá uma
pouco mais de potência e um pouco mais de precisão com a qual
nos expressar.
E então, aqui à esquerda, nós apenas estamos indo para ver,
como iniciar o software de escrita, um pequeno resumo do
programa que temos escrito no canto superior esquerdo.
Mas vamos ver isso de novo antes do tempo.
>> Então, vamos fazer algo bastante simples aqui.
Deixe-me primeiro ir em frente e vá em Arquivo, Salvar, e eu sou apenas
vai clicar em jharvard aqui, mais à esquerda, e
jharvard é, novamente, o nome para a pasta do meu lar, minha
arquivos pessoais, eu, agora sendo John Harvard, como todos vocês
em breve será John Harvard neste ambiente.
Ele tem este diretório Home, Meus Documentos e assim por diante,
que eu quero salvar, agora, este arquivo dentro
Então, eu vou chamá-lo hello.c. Então, eu estou indo para ir
em frente e clique em Salvar e, agora, o que eu tenho aqui é um guia
chamado hello.c, tanto como um outro tipo de editor.
>> Então, agora deixe-me ir em frente e começar a escrever um programa.
int main (void).
E então eu fiz da última vez, printf, para impressão formatado,
("Olá, mundo!"
);.
Quase completa.
Mas eu estou sentindo falta de um par de detalhes.
O que está faltando a partir deste programa que eu realmente preciso para
que ela realmente compilar?
Sim.
[Inaudível]?
>> DAVID J. MALAN: Sim, então eu preciso incluir o padrão
I / O biblioteca.
Então isso precisa ir acima principal, então eu só vou
fazer algum espaço para ele lá.
E eu vou fazer # include.
E observe os colchetes angulares lá.
E como um aparte, gedit é um usuário pouco amigável, se
às vezes, um pouco confuso, em que ele tenta ajudar a sua
olhos perceber o que se alinha com o que.
Assim, o fato de que meu cursor é bem próximo a este ângulo
suporte, observe como está destacando o ângulo outro
suporte mais um presente.
E isso é só para chamar a minha atenção para o fato de que eu
têm simetria.
E simetria na programação geralmente é uma coisa boa.
Da mesma forma, se eu passar meu cursor para o fim, observe como o
chaves de linha para mostrar que, sim, eu tenho um aberto
e um fechado, por assim dizer.
>> Tudo bem, e eu posso fazer outra coisa.
Não é estritamente necessário, mas uma boa prática, para dizer
retornar 0.
E 0 retorno faz o que para nós aqui?
Ou significa o que?
[Inaudível]
DAVID J. MALAN: Mas nada está errado.
E, francamente, é difícil para muito para dar errado em um
programar esse curto.
Então, eu só estou sendo super explícito que está tudo bem.
Eu, o ser humano, quando eu executar este programa, provavelmente nunca
ver que 0.
Geralmente, esses números que estão sendo retornados de principal
apenas elevar suas cabeças para os seres humanos quando
algo der errado.
E você começa um pouco de pop up de erro de sistema dizendo, um,
dois, três, ou qualquer que seja o número que foi
foi realmente devolvido.
Então, qualquer coisa de errado com isso?
[Inaudível]
>> DAVID J. MALAN: Então este não é tanto um erro funcional
mas uma estética.
Eu provavelmente deveria colocar em um caractere de nova linha lá no
final desta cadeia, para que realmente se mover o cursor para
a próxima linha, eo programa só parece um pouco mais bonito.
>> Então, agora deixe-me ir até a minha janela de terminal
e zoom para trás dentro
E essa coisa aqui, é chamado de linha de comando.
É só me lembrar quem eu sou, jharvard @ aparelho, onde
aparelho é o nome do computador em que estou.
Entre parêntesis está presente til, o símbolo rabisco, que
representa o que?
AUDIÊNCIA: diretório Home.
DAVID J. MALAN: diretório Home.
Então, isso é apenas uma notação abreviada para dizer que estão em
sua pasta pessoal onde todos os seus arquivos vão por padrão.
Então, agora, aqui, eu posso digitar ls para a lista.
E a única coisa que eu vejo aqui no momento é hello.c.
E isso é bom, porque eu escrevi isso.
>> Então deixe-me ir em frente e fizer Olá.
E repare que eu não estou escrevendo fazer hello.c.
Em vez disso, eu só estou escrevendo o nome de base do arquivo, Olá.
E fazer, como vimos na segunda-feira, só vai deduzir que eu quero
o. arquivo c.
Então agora eu digitei fazer Olá.
Agora eu vejo este comando bastante longo e vai continuar
vendo isso de novo e de novo.
Mas, para ser bumbum, claro, a palavra que só apareceu,
que é o compilador real.
Fazer é apenas um utilitário de construção.
É apenas um programa mais amigável que me salva, no
longo prazo, de ter que digitar tedioso longo
comandos como esse.
Então você pode executar Clang manualmente.
Você pode digitar tudo isso manualmente.
Assim fica muito tedioso.
E assim que é apenas um programa que simplifica a nossa vida e
executa comandos mais complexos para nós.
>> Tudo bem, então agora o arquivo que eu deveria ter
no meu diretório atual?
Não apenas hello.c, mas também Olá.
Então, se eu quero correr Olá, lembro que eu digo ponto barra,
onde os meios de ponto ir para a pasta atual, onde quer que
são, em seguida, execute o programa chamado Olá, e de fato, agora,
Tenho Olá mundo.
Tudo bem, todas as perguntas sobre o fluxo de trabalho ou a sintaxe de
o que nós fizemos?
>> Tudo bem, então vamos levar as coisas acima de um entalhe novamente.
Portanto, este foi underwhelming apenas para escrever um programa que só
já diz Olá, mundo.
Então, nós mudamos, na segunda-feira, para dizer, Olá, David.
É um pouco mais pessoal, mas tão difícil codificado como o
primeira versão.
Portanto, não tudo o que convincente.
Mas existe, em C, certamente funções além
impressão, funções que permitem obter entrada do usuário.
E a maneira que fizemos isso, no outro dia, foi o seguinte.
Antes que eu realmente imprimir algo, comecei a
algo do usuário.
Então deixe-me fazer isso de novo.
>> String s, onde s é apenas o nome de um arbitrário, aqui, por uma
cadeia, é igual a GetString.
Então, o que foi GetString?
É, obviamente, recebe uma string, com base em seu nome.
Mas o que é, mais tecnicamente?
É uma função.
Portanto, é uma função que não vem com C per se.
CS50 equipe escreveu isso.
E assim, para usar isso, você não pode simplesmente incluir stdio.h,
Você também precisa incluir o que?
Sim.
Então cs50.h, que é apenas um arquivo que escreveu alguns anos atrás.
Nós instalado no aparelho para você ao lado
todos os arquivos padrão.
E assim, essas primeiras semanas de classe, usaremos
isto só para simplificar o processo de fazer muito básico
coisas como a entrada do usuário recebendo.
Porque, como veremos em algumas semanas, a entrada do usuário entrar em um
linguagem como C é surpreendentemente complexo,
especialmente porque você não sabe com antecedência, geralmente, como
muita coisa que o usuário vai digitar dentro
E quando você não sabe a quantidade de dados que esperar, você não
saber quanto de memória para alocar.
E se você realmente tem um usuário que está tentando contraditório
para invadir o seu sistema, travar o computador, bem,
geralmente o primeiro método de ataque é, assim como eu fiz em
Segunda-feira, digite uma seqüência inteira longa de caracteres aleatórios,
aperte Enter, e ver o que quebra.
Porque geralmente, se uma quebra do programa, que aponta para
uma falha de segurança, potencialmente.
Ele certamente aponta para você, programador, tendo feito uma
erro, mas mais perigoso, você poderia ter feito um
relacionadas à segurança erro, e, geralmente, nós vamos ver que
é assim que as máquinas estão comprometidos para este dia, tanto
no mundo da web e programas no
linha de comando, como este.
>> Tudo bem.
Assim string s é igual GetString.
Então, mais concretamente, agora, o que é que a linha 6 fazer aqui?
Assim, a função do lado direito fica string,
leva quantos argumentos?
Okay.
Então nenhum.
A sanidade pouco verificar.
Um argumento, mais uma vez, é apenas uma entrada a uma função de alterar
seu comportamento padrão de alguma forma.
Mas, neste caso, eu não quero alterar
o comportamento dos GetString.
Eu só queria ter uma seqüência.
Então eu coloquei nada nos parênteses, e então eu coloquei um
vírgula demarking o fim da linha de código.
Agora, o sinal de igual não significa igual, per se.
Isso significa atribuição, o que significa colocar o que fica
emitidas no interior direito de tudo o que é do lado esquerdo.
>> Então, à esquerda, dizemos que temos declarado
string chamada s.
E mais especificamente, temos memória alocada dentro de
que nós vamos colocar os bits que representa uma seqüência de
caracteres.
Mas para hoje, nós alocamos
ou declarada uma string.
Tudo bem.
Então, agora, uma vez que eu fiz isso, eu quero ligar o valor de
s não, o valor de David.
Então, isso é errado por quê?
Então, este é apenas literalmente o s hard-coded.
É para dizer "Olá, s", o que não é o que eu quero.
Então, eu posso fazer isso.
O sinal de porcentagem é um espaço reservado, mas agora eu preciso
passar para imprimir um segundo argumento.
Lembre-se que os argumentos para funções são separadas por
vírgulas, de modo a vírgula que vem aqui eu coloquei após esta é a carta.
E, neste contexto, agora, s é a variável, e printf,
ao receber as duas entradas -
a string na esquerda eo nome variável à direita -
que vai ligar o último para a antiga para nós, e
apenas imprimir uma seqüência de caracteres contendo bonita agradável
o que é que nós digitado dentro
>> Então, vamos tentar isso.
Indo para a frente e zoom out, de volta
a minha janela de terminal.
Aumentar o zoom na parte inferior aqui.
Redigite fazer Olá.
Clang parece ter sido reprise.
Eu estou indo para digitar. / Olá, Enter.
Nada parece estar acontecendo ainda, mas é neste prompt
que eu possa digitar algo como Nate, Enter, e agora temos
Olá, Nate.
E eu posso fazê-lo novamente com Rob, e assim por diante.
Portanto, esperamos que agora este programa está se comportando como eu pretendo.
>> Agora não, todo o usuário que amigável.
Eu não tenho idéia o que está sendo esperado de mim.
Então, nós certamente podemos limpar isso um pouco.
Deixe-me voltar até aqui e, em vez de apenas mergulho e
pedindo ao usuário para uma seqüência, deixe-me dizer explicitamente o
usuário o que eu estou esperando.
Então printf ("Digite uma string:"
);
Então não variáveis ​​aqui.
Não há sinais de por cento.
Apenas a frase simples Inglês.
Deixa-me ir para o fundo aqui e execute novamente o meu programa.
Mas nada parece ter mudado.
Por quê?
Eu tenho que recompilar.
Assim erro fácil de cometer.
Mas você tem que não só salvar o arquivo, mas
recompilar o programa.
E assim se eu voltar a correr fazer Olá, agora Clang executado.
Agora eu posso executar. / Olá. E agora eu vejo "Digite uma string:".
Okay.
Agora é um pouco mais user-friendly.
Nate, Enter, Olá, Nate.
>> Bem, vamos tentar de novo e começar a pensar
sobre casos de canto.
Assim como em Scratch, você é encorajado ou estão a ser
encorajados na especificação de tipo de pensar sobre o que poderia ir
errado se você não antecipar tudo o que o usuário pode fazer.
Bugs, portanto, poderia ocorrer.
Então, insira uma seqüência -
o que é um caso de canto aqui?
O que é um cenário que eu, o programador, não pode ter
antecipado?
Sim.
Okay.
Então, o que se eu digitar um número como este?
Tudo bem.
Então, ele ainda funciona.
Gramaticalmente não faz sentido.
Mas pelo menos o programa funciona.
>> O que é outro caso esquina?
Algo que eu não esperava.
Sim?
Okay.
Então, nós poderíamos fazer algo como um número muito, muito grande.
Então, vamos fazer isso aqui.
Deixe-me afastar por um segundo, deixe-me destacar.
Não é possível copiar e colar aqui.
Tudo bem.
Então eu não posso copiar e colar nesta janela de terminal, por isso vamos
apenas simulá-lo.
Deixe-me afastar, vai quebrar.
Eu não vou fazer isso por muito tempo, porque não vai
realmente quebrar neste programa.
Mas poderia.
Enter.
Mas isso não aconteceu.
Tudo bem.
Mas é um caso de canto genuíno.
E a única razão que se comportou corretamente, de modo a
falar, é porque a função GetString CS50 é realmente
concebida sob o capô, como veremos em algumas semanas,
para alocar automaticamente RAM mais e mais, mais e mais
de memória do sistema operacional, quando se percebe, wow,
você realmente digitou algo bastante longo.
Agora, isso é um pouco de mentira.
Se realmente parou por um bom tempo e eu digitei
algo como 5 bilhões de caracteres no teclado
aqui, ou realmente bateu copiar e colar um pouco, que muito possivelmente
poderia fazer com que o programa trave.
Apenas um pouco mais difícil de simular que, com uma finita
quantidade de tempo.
>> O que é outra canto caso poderíamos tentar?
Sim?
Sim.
Então, por que não responder a nada?
Então, nós realmente temos que tomar algumas medidas, porque de outra forma
o programa vai sentar lá piscando durante todo o dia.
Mas se eu apenas pressione Enter -
OK, agora, ainda parece errado.
Não falhar, mas talvez haja agora uma oportunidade de
iniciar a implementação de um programa mais rigoroso
que realmente verifica.
E se a cadeia, a sentença, a palavra que eu
digitou tem comprimento 0, bem, talvez eu deveria gritar com o
usuário, ou dizer-lhe para introduzir uma cadeia de novo, de modo que
realmente conseguir o que se parece com um comportamento correto e não
apenas a supervisão completa da minha parte.
>> Pergunta em volta?
Número decimal.
Portanto pode tentar isso também.
1,10000005.
Parece que vai apenas trabalhar realmente bem.
E que, na verdade, é esperado.
Mesmo que pode ter digitado o número lá, ou um
maior número anterior, percebe que quando estamos digitando usuário
de entrada e estamos usando a função GetString, não
importa se o que eu estou escrevendo parece um número.
Lembre-se que de acordo com ASCII, tudo no seu
teclado possui um valor numérico, que pode ser mapeada para uma
personagem, um char.
Portanto, neste caso, mesmo que eu pode digitar um número, o
computador vai pensar nela, por assim dizer, como uma string -
algo que se parece com um número, mas é
na verdade não um número.
Mas isso é realmente um segue perfeito, porque agora podemos
na verdade, a transição para escrever programas que
utilizar outros tipos de dados.
>> Assim, além de usar caracteres, ou melhor, além de utilizar cordas,
perceber que têm outros tipos de dados em C, bem como na
outros idiomas.
Um char, como o nome sugere, é apenas um personagem único.
A flutuação é um valor de ponto flutuante, e isso é apenas uma fantasia
maneira de dizer um número real - algo que tem um decimal
ponto em que com alguns números à esquerda e / ou direita.
Um int é um inteiro, que é apenas um número como 123.
E agora o mais interessante são coisas como casal.
O que dissemos um duplo foi a última vez?
É 64, certo.
Assim, enquanto normalmente um float é de 32-bit -
por isso é tanto tempo na memória, ele usa 32 zeros e uns para
representam valores - um duplo é, literalmente, o dobro, o que
significa que você pode representar números maiores, ou
você pode representar números mais precisos.
Então você pode ter mais números depois do ponto decimal, mas
como o colega disse no vídeo, até mesmo algo simples
conceptualmente como 1/3 não pode ser representado com precisão por um
computador, porque eventualmente você correr para fora de bits, e
portanto, você só pode fazer .33333333 tantas vezes, em
que ponto você só tenho a dizer que estou fora de representação
espaço, eu tenho que chamá-lo apenas de um dia e representá-la
um tanto imprecisa assim.
E um longo tempo -
nome estúpido, mas é porque não há um tipo de dados conhecido como um
longa em C, que coincidentemente é muitas vezes 32 bits, assim como um
int é de 32 bits, mas um longo tempo é
geralmente 64 bits.
Então, isso significa apenas que você pode representar maior
números do que isso.
>> Tudo bem.
Então, se nós realmente queremos começar a representar as coisas,
pode precisar de tipos mais sofisticados e
é por isso que temos string.
Então, na biblioteca CS50, que arquivo chamado cs50.h, temos
realmente declarado um tipo de dados, por assim dizer, chamado string,
mas cadeia não existe realmente.
Isto é, novamente, uma dessas camadas, vamos descascar
de volta em uma semana ou duas e jogá-lo fora, e realmente
olhar debaixo da capa em que uma seqüência realmente é, e
como ele é representado.
Nós também vamos olhar para valores booleanos.
>> Então, o que era um bool no contexto do Scratch?
É verdadeiro ou falso.
Então é só um valor que é verdadeiro ou falso, ligado ou desligado, 1 ou
0, no entanto você quer ver no mundo.
Assim, em C, graças à biblioteca CS50, que por sua vez
inclui outra biblioteca debaixo do capô, temos
acesso a um tipo de dados que é chamado de bool, que será
literalmente nos permitem atribuir os valores verdadeiro ou falso para
coisas em um programa.
>> Então, vamos em frente aqui e escrever um pequeno programa que
faz algo envolvendo números vez.
Então deixe-me voltar para o Appliance CS50, deixe-me ir em frente e
criar um novo arquivo chamado aqui -
vamos apenas dizer algo simples, como math.c.
Tudo bem.
E agora vá até o topo do meu programa, eu sou
vai fazer o de sempre -
# Include, para que eu possa usar
printf, int main (void) -
vamos voltar, finalmente, o que significa int
aqui, o que significa vazio aqui, mas por enquanto, só sei que
você tem que iniciar programas como este.
Agora eu estou indo para ir em frente e dizer algo um pouco
diferente - printf ("Dê-me um número:"
);.
Então eu vou fazer int n = GetInt, porque
Acontece que GetInt é outra função na biblioteca CS50
além GetString.
E agora eu vou fazer algo estúpido, como "graças
para o% d ", por inteiro decimal, e então n vírgula, e
em seguida, retornar 0.
Então, novamente, retornar 0 não tem nada a ver com o número que eu sou
pedindo ao usuário para.
Apenas significa que, no final de tudo, presumivelmente, está bem.
>> Então deixe-me ir até a minha janela de terminal aqui.
Deixe-me fazer escrever matemática, entrar.
E algo está errado.
Fazer matemática não funcionou.
Aqui está a primeira de nossas mensagens de erro.
Por quê?
A enigmática pouco, mas -
Sim.
Então cs50.h.
Então, novamente, especialmente no início, você vai escrever o seu primeiro
programa para pset 1 em seções, em horário de expediente, e
francamente, vai ser esmagadora, por vezes, o que essas coisas
estão realmente dizendo.
Mas você vai perceber muito rapidamente eles começam a cair
em baldes em que este significa que você já parou um
do # inclui, na parte superior do arquivo.
E Clang, compilador, está informando sobre isso
declaração dizendo, em vez fantasiosamente, implícita de
GetInt função é inválido.
>> Tudo bem.
Então, o que isso significa?
Significa apenas que você implicitamente declarado em GetInt
a sensação de que você não explicitamente declarado.
Para declarar explicitamente int, você tem que ensinar
Clang que ele existe.
E a solução muito simples para isso é ensiná-lo por
incluindo este outro arquivo, cs50.h, no
a parte superior do seu arquivo.
Porque, literalmente, o que não é # include diz Clang
muito bonito para ir encontrar o arquivo chamado cs50.h, cópia,
colá-lo automaticamente no topo do meu programa para mim,
e depois converter o código fonte para zeros e uns.
Mas isso, obviamente, muito tedioso se nós, humanos, teve
ir copiando e colando esses arquivos grandes o tempo todo,
assim # include apenas faz tudo isso automaticamente, sem
turvando o meu código com alguém da biblioteca.
E uma biblioteca é apenas outro arquivo que contém funções e
outras coisas que alguém tenha escrito, que nós somos
alavancagem para o nosso próprio bem.
>> Tudo bem.
Vamos tentar de novo.
Fazer matemática.
Enter.
Bom.
Então, que parece ter funcionado.
Então deixe-me correr matemática;. / Matemática.
Digite me dá um número, 123.
Obrigado pela 123.
Agora vamos tentar um outro caso de canto.
Uma cadeia é bastante generoso, porque um
seqüência pode ser qualquer coisa.
Pode olhar como números, parece
caracteres, parecem palavras.
Mas um int é um int.
Então agora eu sou o usuário difícil, e ele está dizendo "Dê-me
um número, "o que se eu tentar fazer algo como 0,1?
Bem, esse é um número, e é consistente com a
gramática que usei aqui, mas debaixo do capô, eu sou de
curso usando o GetInt função.
>> Então vamos ver o que acontece.
Enter, nova tentativa.
Tudo bem.
Deixe-me ser difícil e apenas pressione Enter novamente.
Enter, Enter.
Então agora parece que GetInt é um pouco mais
poderoso do que GetString.
Nós, a equipe, implementado de tal forma que, se nós observamos
você não tem nos dado um int - e um int é um número decimal
zeros contendo, uns, dois, três, quatro, cinco, seis,
setes, oitos, ou noves.
E é isso.
Sem pontos decimais, sem personagens, sem pontuação.
Parece que temos de cooperar.
Então deixe-me tentar quatro, cinco, seis, e que me deixa completamente.
Então, realmente, ser anal aqui, eu provavelmente deveria dizer "Dê-me
um inteiro ", a fim de transmitir ao usuário
exatamente o que eu pretendo.
>> Agora vamos pensar sobre debaixo do capô.
Nós não vamos olhar como cs50.h é implementado hoje,
essa biblioteca.
Mas se ele continua dizendo que repetir, repetir, repetir, que a programação
construir estou presumivelmente usando debaixo do capô para
implementar isso?
Então, só um loop, certo?
Uma das ideias mais simples que vimos em Scratch.
The Forever construir, a repetição construir.
Presumivelmente, neste programa, debaixo do capô, mesmo
que é escrito em C e não do zero, ele está fazendo
algo chamado equivalente a para sempre, se o usuário não tem
digitado em um número inteiro, digamos repetir, repetir, repetir, repetir, de modo
então, finalmente, quando nós começamos um inteiro, então você
romper com esse ciclo.
>> Então, o que outras funções que podemos usar aqui na biblioteca do CS50?
Bem, mais ou as mais óbvias, pelo menos com base na
tipos de dados que agora sabe que existem.
Implementamos GetString, GetInt, mas em todo o
primeiras semanas do termo, você também pode usar e GetFloat
GetDouble GetLongLong e, a fim de obter exactamente o
tipos de dados que você deseja.
Porque o detalhe chave aqui é que ao contrário de algumas línguas,
como Python e Ruby, onde você não tem que necessariamente
declarar o tipo de dados de uma variável -
Você não tem que dizer ao computador qual o tipo de material
você está indo para colocar na variável -
em C, você tem que ser sempre tão precisas.
Então, se você quer uma variável chamada n, um pedaço de armazenamento
que, neste caso, passa a ser de 32 bits, por convenção, é
tem que dizer ao computador que esses bits são
vai armazenar um número -
não um personagem, e não uma string, não um float.
E este aborda a questão que efetivamente
correu para a semana passada.
Se estamos usando zeros e uns números para representar não apenas
Mas, como números e Bs e Cs, como no mundo é uma
computador vai saber que este padrão de bits, na verdade,
representa o número 65, em vez de representar a
letra A, que por coincidência, de acordo com a
ASCII, lembro, era equivalente a 65?
>> Então, esses tipos de dados fornecem o contexto para o computador, de modo
que se sabe se estes bits devem ser interpretados como uma
int ou como uma string.
Qualquer dúvida, então, sobre este assunto?
Sim?
DAVID J. MALAN: Boa pergunta.
Se nós tirarmos stdio.h, vamos salvar o arquivo -
deixe-me ir até a janela de terminal e executar fazer zoom matemática,
e digitar -
agora eu tenho um erro diferente, porque estou implicitamente
declarando o que funcionar agora?
Printf.
Então agora eu criei um novo problema, cuja solução é
essencialmente a mesma.
Eu preciso colocar isso de volta.
AUDIÊNCIA: [inaudível]
DAVID J. MALAN: Ah.
Então, se eu tirar -
Ok, sim.
Então, se eu remover a inclusão do padrão de E / S biblioteca-se
aqui, e então você está dizendo que se me livrar de printf, obter
livrar de printf?
Sim.
Isso deve funcionar, porque eu não estou mais usando qualquer - gritos.
Acabei de mentir?
Ah, ok.
Isso não vai funcionar por causa de um novo erro que acaba de lançar.
E este é um pouco mais auto-explicativo.
>> Qual é o problema?
Não utilizados n variáveis.
Então, esse erro é o resultado de termos configurado o
aparelho a ser particularmente pedante, para realmente gritar
você por cada erro possível, mesmo que seja o tipo de
um erro não-fatal como este - é realmente como um grande
lidar que eu atribuído um int, colocar um número em que, em seguida,
apenas fiz nada com ele?
Assim, funcionalmente, não.
Isso não vai quebrar o programa.
É apenas uma espécie de idiota, certo?
Não há valor a ter pedido para que o número, armazenado
em uma variável, se você nunca vai fazer nada
com isso, se imprimi-lo ou salvá-lo.
Portanto, neste caso, é Clang reconhecendo tanto, e
ele está dizendo não utilizados n variáveis.
>> Assim, podemos corrigir isso, se realmente queremos.
Mas, novamente, isto não é uma boa programação agora.
Então, eu só poderia fazer isso -
descer aqui, deixe-me limpar a tela, fazer matemática.
Que funciona.
Agora posso correr o meu programa de matemática, tem entrada -
bem, isso foi ruim.
Recebe a entrada, e isso é tudo o que faz, neste caso.
>> Então, na verdade, vamos tentar um outro canto caso que
não acho de mais cedo.
Neste caso - aqui, vamos voltar ao que é um
pouco mais user-friendly.
Deixe-me voltar aqui e fazer executar a matemática novamente.
Opa, o que eu fiz de errado?
Tem que rolar mais para trás.
Okay.
Agora estamos de volta ao estado original, onde todos
é espero que bem.
E agora, se eu correr matemática, 123 parece funcionar.
Mas este não é realmente uma prova eficaz, apenas para dizer
ok, isso funciona.
789, que funciona.
Tempo para apresentar.
Porque há casos de canto outros aqui.
Uma seqüência realmente não nos dão muito problema, digitando em um
monte de caracteres.
Mas e se eu digitar isso?
Bater o número 1 de um monte, muito por aqui -
tudo bem, está ficando um pouco chato, então eu vou
parar por aqui, e eu vou bater Enter.
>> O que diabos aconteceu?
Portanto, esta pode, na verdade, ser explicado.
Então levou-o como binário?
Um bom pensamento, mas não, não é o fato de que ele tomou
como binário, porque de fato, que era apenas uma espécie de
coincidência.
Podemos fazer isso de novo.
Portanto, não há 2 no sistema binário, que é
provavelmente o suficiente de qualquer maneira.
Enter.
De modo que não era o problema.
O que mais?
Exatamente.
>> Então, acho que volta para o que um int realmente é.
É de 32 bits que coletivamente são interpretadas
como um número.
Se tiver de 32 bits, o que significa cada um dos bits pode ser
um 0 ou um 1., 0 ou um 1
Então, isso significa que há duas possibilidades para este bit,
duas possibilidades para isso, duas possibilidades para isso
bit - de modo que é 2 vezes 2 vezes -
de modo que é 2 à potência de 32 é o número total de
permutações de zeros e uns, se você tem 32
espaços reservados, zeros ou uns, na frente de você.
Então, se eu tenho 2 a 32, matematicamente, que é o que?
Então é muito.
É 4 bilhões, mais ou menos.
E 4 bilhões não parece ser o que foi impresso aqui.
Na verdade, isso parece mais perto de 2 bilhões.
Mas isso não é uma coincidência.
O fato de que o computador tenha interpretado mal o meu número enorme,
minha sequência enorme de uns e, em seguida, minha seqüência enorme de duplas,
como cerca de 2 bilhões, é explicada como?
Há um limite para o int.
Há um certamente um valor máximo que você pode representar.
Mas normalmente é 4 bilhões, certo?
Se 2 ao 32 é de aproximadamente 4 bilhões, que parece
esse é o maior número.
Então, não o resto, mas um bom pensamento.
Números negativos.
Então se você tem 4000 milhões coisas que se pode
representar com essas várias permutações de 32 e 0s
1s, bem, é lógico que nós, humanos, pode querer
representam não apenas números inteiros positivos
mas inteiros negativos.
E, de fato, essa é a suposição de que o C faz.
Assim, com 32 bits, você pode representar aproximadamente negativa 2
bilhões de todo o caminho até a positivo 2 bilhões.
E por isso, neste caso, o que estamos realmente vendo é apenas
à margem da capacidade do nosso inteiro, e temos, por isso
para falar, transbordou um inteiro.
Nós tentamos empinar mais bits nele do que pode realmente se encaixam.
Assim, o resultado final é que essencialmente tem todos os bits 1.
Nós capotou todos os nossos bits em, nós tentamos representar
o maior número possível, mas não é claramente quase
grande o suficiente para representar as duas coisas que eu tenho apenas digitou dentro
Sim?
AUDIÊNCIA: [inaudível]
>> DAVID J. MALAN: Boa pergunta.
Por que não podemos simplesmente representar que negativo
assinar como apenas um personagem?
Então, nós absolutamente possível, e então poderíamos salvar
um bit adicional.
Mas você ainda vai ter que representar esse traço e
que vai custar-lhe pelo menos alguma coisa,
presumivelmente um pouco.
Então, sim, nós poderíamos ter 32 bits usados ​​para o nosso número, mas agora
precisamos de outro pouco utilizado para o nosso traço
símbolo, o sinal de menos.
Portanto, agora temos 33 bits valores, o que nós poderíamos fazer, mas é
apenas não é o caminho que é feito.
Fizemos um juízo anos chamada atrás, 32 bits é uma espécie de
unidade de medida aqui.
Então, nós estamos indo para usar um desses bits de forma eficaz para
representam negatividade, e 31 bits para representar o número.
Outras perguntas?
Tudo bem.
Isso é muito.
Por que não vamos ir em frente e ter a nossa pausa de cinco minutos aqui?
>> Tudo bem.
Então, novamente, para não exagerar as aplicações matemáticas
de programação, vamos arrancar fora este exemplo
antes de se mudar para outras construções, apenas porque
irá ilustrar alguns pontos comuns tropeço em alguns dos
o básico quando se trata de programas de escrita.
Neste caso, fazendo expressões aritméticas que têm algum
relevância interessante para a sintaxe.
>> Portanto, esta é apenas uma fórmula com a qual pode converter
temperaturas de Fahrenheit para Celsius.
Se você não lembra, esta é apenas a fórmula.
Então, se ligue em Fahrenheit valor de 32 graus, o que é
congelamento, que vai ser de 32 menos 32 é 0, e, na verdade,
0 em Celsius é também de zero.
Então sanidade rápido check lá - que é a fórmula familiar.
Deixe-me ir para o aparelho, porém, e começar
escrever um programa chamado, como, f2c, "Fahrenheit para
Celsius ponto c ".
E no topo aqui, vou começar com # include
stdio.h, e eu vou fazer int main (void), e
de novo, vamos voltar no futuro, como o que significa int
lá e que vazio significa que há.
E agora deixe-me ir em frente e implementar um programa que
essencialmente faz esta conversão para nós.
>> Então printf, vamos dizer, a temperatura em graus Fahrenheit.
E então deixe-me ir em frente e obter o valor do usuário.
Que tipo de valor que eu deveria receber do usuário, se eu quiser
para me dar uma temperatura em graus Fahrenheit?
Sim?
O que você propõe?
Sim.
Então bóia sente bastante razoável.
Temos, novamente, apenas algumas opções que
temos visto até agora.
Nós temos coisas como char, float, double, int, longo tempo,
bool string,.
Então, destes, bóia sente bastante razoável.
Nós poderíamos usar um direito, duplo, porque, se nós realmente queremos
representam a temperatura de um ser humano -
98,60000 -
poderíamos usar 64 bits para fazer isso, mas parece que
exagero para a temperatura.
Então vamos ir com float.
Agora eu preciso de uma variável.
Apenas para manter as coisas simples, eu vou chamá-lo de f, mas eu
poderia apenas como corretamente chamá-lo de temperatura,
mas ou é bom.
Então flutuar f = GetFloat.
Assim que eu agora tenha decidido usar GetFloat, porém, eu
preciso fazer uma correção.
Sim.
Então, precisamos # include , caso contrário, o compilador é
vai gritar com a gente.
Agora que eu tenho um carro alegórico, deixe-me ir em frente e fazer o
de conversão.
>> Então, primeiro, deixe-me também adquirir o hábito de aqui
comentando o meu código.
Então, novamente, um comentário é apenas uma notação para o ser humano que é
não faz parte do programa em si, mas um, ajuda a
entender o que você fez na manhã seguinte, ou no próximo
mês, ele ajuda o seu companheiro de ensino entender o que você fez
ou o que você pretende fazer, por isso é
prática geralmente muito boa.
A cada poucas linhas de código, escreva um comentário a
você ou seu colega.
Então, aqui, eu vou dizer: "Pergunte ao usuário para a temperatura."
Não tem que ser uma frase completa, apenas uma frase curta.
Mas a idéia por trás comentando em C é que cada um de seus
comentários devem capacitá-lo - ou, digamos, um TF ou um colega -
a roçar o seu programa e saber exatamente o que faz, por não
tanto a leitura do código, mas lendo os comentários, que
deve ser sucinta e clara.
Tudo bem, então agora deixe-me ir em frente e dizer: "Converter
Fahrenheit para Celsius. "Então, eu estou indo para ir em frente e fazer,
digamos, float c.
Vamos manter Celsius como um valor de ponto flutuante.
>> E deixe-me dar uma facada no presente.
A fórmula é, novamente, aqui em cima.
Como 5 / F 9 vezes menos 32.
Então, vamos fazer isso.
Então, 5 dividido por 9, de menos -
Opa, eu estraguei tudo já.
Times.
Então, 5/9 F menos 32 vezes.
Então F menos 32, ponto e vírgula.
E agora, aqui em baixo, eu estou indo para a frente
e dizer, imprimir resultado.
E essa parte é fácil. Printf.
Como eu faço para imprimir esse?
Bem, eu poderia dizer "Esse número em Celsius é% f \ n",
apenas para algumas estética.
E então, qual o valor que eu quero ligar aqui como o printf
segundo argumento?
Okay.
Então, só c.
Então, vamos começar com isso e depois é só retornar 0.
Mais uma vez, não tem nada a ver com a matemática.
Significa apenas que tudo está bem.
>> Agora, isso é correto, este programa?
Tudo bem.
Então eu fiz alguns erros.
Mesmo se você não tem idéia do que é programação, você pode classificar
de inferir de volta para a escola primária o que o
erros aqui poderia ser.
O que é um dos primeiros?
AUDIÊNCIA: [inaudível]
DAVID J. MALAN: Yeah.
Então, nós estamos faltando parênteses.
Foi deliberado que eu fiz parênteses na palestra
deslizar aqui, porque há realmente essa noção de ordem
de operações, ou precedência, em que determinadas operações -
multiplicação -
têm maior ligação, têm maior precedência, do que coisas
como a adição ou subtração.
Então, nós temos feito isso por anos só para deixar claro exatamente
operação matemática que deve ser feito primeiro.
Então eu provavelmente deveria imitar exatamente isso.
Caso contrário, o computador é, presumivelmente, vai tentar fazer
algo como dividir 5 por 9, em seguida, multiplicar F, em seguida, subtrair
32 da coisa toda.
O que não é, de fato, o que queremos fazer.
Então vamos parenthesize.
Vamos adicionar meus parênteses aqui, parênteses aqui.
Vamos colocar isso aqui.
Aqui, eu só notei outro erro que cometi ao longo do caminho.
Sim?
AUDIÊNCIA: [inaudível]
>> DAVID J. MALAN: Ah.
Bom.
Então, temos de fato o mesmo número inteiro
questão da divisão de antes.
Eu corrigir isso, vamos ver o que o sintoma é.
Mas nós vamos ter que corrigir um
outro erro aqui.
Sim?
AUDIÊNCIA: [inaudível]
DAVID J. MALAN: sim.
Então, erro estúpido que eu fiz, mas incrivelmente importante.
O computador não vai só fechar os olhos e deixar
F-me usar capital, quando eu realmente declarado a variável
como um f minúsculas aqui, na linha 8.
Então eu preciso corrigir na linha 11 capitalização meu, que um
pouco, era um F maiúsculo por engano.
E aqui?
Caso isto minúsculas também?
Deveria ser, mas isso é uma coincidência.
Que f% não tem nada a ver com a variável.
Então, só para ser super claro aqui, deixe-me ir em frente e
renomear isso, brevemente, "temperatura". Deixe-me renomear
esta "temperatura". Deixe-me não mudar o nome deste.
Porque, novamente, f% globalmente significa, "flutuando valor do ponto."
Não tem nada a ver com a minha variável.
Mas "temperatura" em todo o lugar é um pouco prolixo,
então eu vou voltar para o meu s "f" minúsculo.
>> Agora, deixe-me ir em frente até a minha janela aqui.
Faça f2c -
que foi, mais uma vez, o nome arbitrário I
deu a este arquivo.
Parece ter compilado.
Deixa-me correr f2c.
Enter.
Temperatura em Fahrenheit - vamos fazer um caminho fácil.
32.
OK, corrigir.
Mas, se eu faço agora 212 para ebulição -
maldita.
Tudo bem.
Então, claramente não corrigir, se o seu TF tenta
pelo menos, dois valores.
Então, qual é o problema aqui?
Bem, você já colocou o dedo sobre o que é o problema.
Mas por que é que o caso?
Até aqui, quando eu estou fazendo a matemática de 5 dividido por 9.
Assim, conceitualmente, é perfeitamente correto.
Totalmente consistente com a fórmula.
Mas os computadores só fazem exatamente o que você
dizer-lhes o que fazer.
E o que estamos efetivamente dizendo o computador aqui é
dividir o inteiro 5 9 pelo número inteiro
e dar-me o resultado.
O problema, porém, é quando você faz a divisão usando dados
tipos, a saída é o mesmo tipo de dados como as entradas.
E por isso, se as duas entradas são ambos inteiros, a saída é ir
ser um int.
E assim 5 dividido por 9 é algo ponto.
Mas o que é o inteiro mais próximo para apontar alguma coisa?
Então, é realmente 0.
Assim como discutimos na segunda-feira tudo, após o decimal
ponto fica truncado.
Ele só fica jogado fora.
Portanto, este é um erro completo, porque eu poderia muito bem apenas
multiplicar tudo por 0 aqui.
>> Agora, eu posso consertar isso em um par de formas.
Eu poderia fazer isso.
5,0 dividido por 9,0.
Tecnicamente, não precisa mesmo de fazer isso.
Ele é suficiente para fazer apenas um dos números de um flutuador -
ou dupla -, colocando o ponto decimal aqui.
Porque o que acontece agora é quando você divide um número inteiro por
um float, ou um casal, o computador vai perceber
oh, um dos que é mais precisa.
Deixe-me errar do lado de lhe dar mais precisão do que
você pretende.
Então ele vai converter o resultado -
ele irá retornar o resultado como um valor de ponto flutuante bem.
Então, que iria trabalhar.
Isso poderia funcionar.
E há um outro mecanismo que veremos na
maior detalhe na próxima semana.
Você pode, na verdade, como o programador, dizer ao computador
para tratar efectivamente um tipo de dados como
se fosse outro.
>> Então, eu poderia realmente fazer isso.
Em parênteses, o que posso dizer algo como (float), aberto
paren, paren perto.
E isso é o que é chamado de "casting". Mais uma vez, mais
na próxima semana.
Mas esta é apenas a maneira programática de dizer
o computador, eu sei 9 é um inteiro ou um longa.
Eu sei que não é um valor de ponto flutuante.
Mas tratá-lo como tal, de qualquer maneira.
Então, para lançar um tipo de dados significa converter
de um para o outro.
Francamente, isso é apenas um pouco feio, por isso gostaria de propor que vamos
volta para a sugestão original de apenas converter
essas coisas para valores de ponto flutuante manualmente.
Porque agora é apenas super claro o que está acontecendo, e
não é tudo o que distrai.
>> Então, vamos agora voltar para a minha janela de terminal.
Faça f2c.
Deixe-me ir em frente e executar isso.
E, como um aparte, você se cansar de digitar os comandos
uma e outra vez, perceber que os computadores, como o Linux aqui,
tendem a ser muito inteligente.
E se eu acertar cima, nós podemos ir pela minha história inteira da
comandos, para cima e para baixo.
Portanto, neste caso aqui, eu posso simplesmente ir até a correr fazer f2c.
Estou sendo gritado, porque eu fiz de que um segundo atrás.
Já é até à data.
Então agora eu posso correr f2c novamente.
Vamos tentar 32 Fahrenheit.
Agora vamos tentar 212 Fahrenheit.
>> Ufa.
Parece funcionar.
Agora, isso é bom, mas ele sente um pouco arbitrária que
Estou mostrando seis números após os pontos decimais.
Certo?
Se você é a pessoa do tempo na TV, você é uma espécie de idiota
se você estiver lendo a temperatura
este grau de precisão.
Então vamos simplificar isso.
Então, vamos realmente ir até aqui, ao meu printf.
E sim, eu quero flutuar.
Mas eu quero agora especificar a precisão.
E eu vou ser um pouco sucinto.
Eu vou dizer, dá-me um ponto depois do ponto decimal.
Então, em vez de dizer f%, eu vou dizer 0,1% f.
E isto significa apenas dar-me uma posição
depois do ponto decimal.
Tudo bem.
Vamos tentar de novo.
Deixe-me voltar a executá-lo depois de compilar.
E agora eu digitar 32, e eu voltar a
valor mais sucinta.
E eu posso digitar, agora, 212, e voltar uma forma mais sucinta
valor também.
E há outras coisas que você pode fazer com printf.
Você pode realmente especificar quão grande o número deve ser.
Se você quiser ter estofo sobre ele, para que você possa alinhar à direita ou
alinhar à esquerda todos os seus números ou
tentar coisas center.
Então percebe que há pequenos truques que você pode fazer lá.
Mas eles só se resumem a códigos de formato,
como nós temos lá.
>> Portanto, em termos de esta questão de precedência.
Este é um quadro muito chato passar por metodicamente.
Mas perceber que os autores do C vêm-se com a
regras que especificam que os operadores têm maior
precedência, mais poder de ligação, do que outros.
Assim, enquanto na escola, geralmente sabia que era
multiplicação e divisão, adição e subtração, em seguida,
em seguida, algumas outras coisas.
Em um mundo de programação, há uma muito
longa lista de coisas.
E isso não é algo que vale a pena memorizar agora.
Você vai se acostumar a ele antes do tempo.
Mas, assim como na escola, geralmente parênteses resolver
as questões de precedência, por tornar super claro para o
computador e humanos que se pretende.
Portanto, considero isso apenas uma folha de fraude pouco ali.
Mas a maioria desses detalhes que não vai conseguir por algum tempo.
>> Tudo bem.
Agora, vamos construir e afastar estes pouco bobo
exemplos matemáticos.
Ainda usam os mesmos fundamentos, mas começar
expressar-nos um pouco mais como Scratch.
Assim, em Scratch, tivemos estas expressões booleanas.
E em Inglês, uma expressão booleana é o quê?
Verdadeiro ou falso.
É algo que é avaliada como verdadeira ou falsa.
1 ou 0.
Ligado ou desligado.
Tudo o que você quiser chamá-lo.
Agora em Scratch, as peças do puzzle olhou como este.
E essa é a combinação, no fundo lá, de três
peças do puzzle.
Uma conjunção -
algo que tem em branco e em branco.
E então duas expressões booleanas dentro dela.
Assim, você pode expressões booleanas ninho de obter mais
complicado expressões booleanas.
Por exemplo, se for sábado, e é bom
tempo, em seguida, ir para fora.
Ou algo arbitrário assim.
Assim, você pode juntar-se expressões booleanas para chegar a um
maior valor de verdade, cuja resposta é baseada
em que os menores.
>> Agora, em C, felizmente, esse mapeamento é
realmente muito simples.
Parênteses ajudar a tornar as coisas claras aqui.
&& É o que significa "e". Então é assim que
vamos converter esses blocos a partir do zero para C.
E para as condições que vimos em Scratch, na mão esquerda
lado lá, pode empilhá-los de forma semelhante em C. Se x é menor
de y, então fazer isso.
Else if x é maior que y, então faça isso.
Else logicamente eles devem ser iguais, por isso digo
que eles são iguais.
Assim, podemos agora começar a construir essas coisas.
>> Então vamos fazer um exemplo.
Deixe-me abrir um arquivo que está no site do curso que
Eu escrevi com antecedência.
Isso é chamado de nonswitch.c.
E vamos ver por que, em apenas um momento.
Portanto, neste arquivo - nonswitch.c -
primeiro perceber que há um monte de
comentários no topo.
Isso é apenas explicando o nome do arquivo, o que
faz, e assim por diante.
E, aparentemente, demonstra o uso de Boolean E-vel -
conjunção de duas expressões.
>> Então vamos ver como esse programa funciona.
Eu incluir meus dois arquivos, cs50.h e stdio.h.
Se eu rolar para baixo, agora, com o programa, que é um pouco mais
do que já escrevi antes, mas muito legível.
Então eu primeiro imprimir para o usuário, na linha 18,
"Dê-me um número inteiro entre 1 e 10." Assim
que está ali.
Agora eu entendo o inteiro.
Mas perceba que GetInt - muito simples.
Ele só vai ter uma int.
Vai garantir que ele não se um int e não um
corda ou uma bóia.
Mas não vai fazer qualquer tipo de verificação de limite.
Não vai para filtrar os números para ser entre um
determinado intervalo.
Portanto, temos de implementar que nós mesmos.
Assim como em Scratch, onde eu poderia fazer um conjunto de
duas expressões, eu posso fazer isso em C da seguinte forma.
Se n for maior do que ou igual a 1, e n é menor do que e
ou igual a 3, eu estou indo muito decreto que arbitrariamente
número para ser um número pequeno.
Só por causa de uma declaração.
Else if n é entre 4 e 6 de impressão "Você escolheu um meio
número. "Else se n é entre 7 e 10, print" Você escolheu um
número grande. "Else imprimir" Você escolhe um número inválido ".
Porque logicamente, que se segue, temos
exaustos nossa gama.
>> Assim que isso não é exatamente como nós escrevemos maior ou
igual ao de uma aula de matemática.
Certo?
Você costuma desenhar-lo assim, com a linha sob ele.
Mas não há nenhuma chave, no meu teclado.
Assim, o símbolo em C para a expressão maior ou
é igual a dois personagens, eo símbolo para menos de
ou é igual a dois caracteres também.
Tudo bem.
Então, se eu executar este programa, você pode imaginar o que é
vai fazer.
Se eu ir em frente e fazer nonswitch, Enter.
E depois executar nonswitch.
Dê-me um número entre 1 e 10.
Eu vou dar-lhe 11.
Eu escolhi um número inválido.
Deixe-me tentar o número 3.
Eu escolhi um número pequeno.
Então há bastante simples.
>> E se eu quiser mudar o comportamento deste programa e
fazer algo um pouco diferente, em vez?
Deixe-me ir em frente e dizer isso.
Deixe-me livrar de tudo isso.
E deixe-me dizer se (n == 42).
E então eu estou indo para ir em frente e dizer print "Você escolheu o
resposta certa. "Else vamos ir em frente e dizer:
printf ("Você escolheu o
resposta errada ");. Okay.
Só porque.
>> Agora, alguns pontos que podemos fazer aqui.
Um, eu não digite o símbolo que você acha que é o
mais razoável.
Quando eu quero verificar a igualdade, acaba por não utilizar o
sinal de igual.
Você, em vez usar o sinal de igual igual.
E por que pode ser, apenas de forma intuitiva?
Sim.
AUDIÊNCIA: [inaudível]
DAVID J. MALAN: Correto.
O sinal de igual já é usado para atribuição.
Alguém realmente não penso nisso.
E agora, quando se trata de testes de igualdade, temos que
ser mais explícito, e dizer iguais iguais.
Um erro muito comum é fazer isso.
E, em caso de expediente ou semanas algures próximo ou no
próximas duas semanas você fazer algo assim e depois
lutar com ele por 10, 20 minutos tentando descobrir
o que o bug maldito seja, perceber que você é uma daquelas pessoas
pessoas que fizeram este erro.
Então, super fácil de fazer.
Mas o objetivo agora é evitar este erro.
Isso pode avaliar, porque o que é isso realmente dizendo?
Se n recebe 42.
Então, as pessoas verbo usar, verbalmente, para expressar a
noção de atribuição é "fica". Então, se n fica 42.
Então isso significa atribuir 42 a n.
Agora eu tenho uma expressão booleana entre parênteses,
dentro desta condição, cujo valor é de 42.
Certo?
Porque se você avaliar isso de dentro para fora, o total
resposta, agora, é de 42.
>> Então, se eu perguntei-lhe a pergunta, "se (42)," o que é
que realmente dizendo?
Bem, expressões booleanas só pode ser verdadeira ou falsa.
1 ou 0.
Ligado ou desligado.
Então, parece que temos um caso de canto aqui, em que todos de uma
repente, eu estou dizendo que "se (42)". Isso não é um valor booleano.
Então, o que os computadores fazem, porém, é essencialmente iguala
qualquer coisa que não é 0 é interpretado para ser verdade.
1.
Ligado.
Eles são todos funcionalmente equivalente.
Apenas o valor 0, ou a palavra-chave falsa, como veremos
eventualmente ver, é realmente falso.
Assim, "se (42)" seria realmente verdadeira, porque é diferente de zero.
Então, para ser mais preciso aqui, um valor booleano não é realmente tão
muito verdadeiro ou falso, mas para isso
dos casos, se for 0 ou não-zero.
Tão falso ou não falso.
E que nos permite abranger ainda mais
possibilidades na expressão entre parênteses.
Então, precisamos, sempre com muito cuidado, dizer isso -
if (n == 42).
Simplesmente porque precisamos especificar um teste de igualdade,
não uma atribuição de um valor.
>> O que mais vale a pena notar aqui?
Estas chaves não são realmente necessárias.
Venho fazendo-os apenas para ser nit-picky aqui.
Mas quando você tem uma condição que só tem uma linha de
código, como uma conveniência, os programadores não precisam usar
as chaves.
Basta apenas travessão, por razões estéticas, e
seguida, escreva a linha de código.
Somente quando você quiser escrever duas linhas de código - para
exemplo, else printf ("Adeus!"). Se você quer fazer
que, esta é quebrada.
Você pode recuar tudo o que quiser, mas o fato de que você tem
digitado duas linhas de código sem usar chaves
significa que este programa não funcionar corretamente ou talvez
nem mesmo compilar corretamente.
Então, por agora, para ser honesto, eu acho que o melhor é apenas hábito
usar as chaves, e você verá que eles fazem
super claro o que está acontecendo.
>> Além disso, como um aparte - especialmente se você está entre aqueles que usam
os livros recomendados ou recursos on-line -
perceber que há esta noção de estilo em
programação.
E algumas pessoas realmente preferem colocar a chaveta
aqui em uma linha.
Algumas pessoas preferem fazer coisas ridículas,
como colocá-los aqui.
Não há resposta errada quando se trata de
estilo, mas isso é errado.
Mas algumas pessoas fazem isso.
[Risos]
DAVID J. MALAN: Então eu falar isso agora, simplesmente porque, como
você ler sobre coisas em livros ou on-line, você está indo para obter
mensagens diferentes de diferentes professores e
diferentes autores.
E só percebe que, funcionalmente, eles são
geralmente equivalente, mas ser consistente.
Portanto, neste caso, vamos padronizar o crespo
chaves alinhando aqui do lado esquerdo.
>> Tudo bem.
Então, vamos em frente agora e correr isto, e ver o que acontece
com este programa.
Faça nonswitch.
Em seguida, execute nonswitch.
Dê-me um número inteiro entre 0 e - de modo que não é relevante
mais, mas eu só vou dizer arbitrariamente 42.
E eu escolhi a resposta certa.
Bem, agora, vamos realmente tomar isso em uma direção diferente.
Acontece que há alguma outra sintaxe que
pode utilizar em um programa.
Aqui está uma nova peça de sintaxe que é funcionalmente o mesmo,
mas apenas introduz uma outra maneira de nos expressar.
Então é isso que é chamado de "switch". E um
switch funciona da seguinte forma.
É preciso, entre parênteses, um valor que você quer
"Switch" em.
Você quer se comportar de forma diferente com base no seu valor.
Assim, isto significa que ligue o valor de n.
E o que isso significa?
Bem, se n é 1 ou 2 ou 3, vá em frente e imprimir "Você
escolheu um número grande "e, em seguida, quebrar.
A razão para a quebra é que o caminho é C funciona como
assim que encontrar um caso que corresponde, que inicia a execução
todo o código abaixo.
Então, se eu tenho uma linha de código, como faço aqui na linha 27, ele
é executado.
Se eu adicionar uma outra linha aqui, ele é executado.
Outra linha aqui, ele é executado.
O único programa pára de executar o que está abaixo da
declaração caso aplicável quando eu explicitamente
dizer "quebrar". Tão errado.
Direita, neste caso, como um resultado.
4 Processo, 5 ou 6, do mesmo modo, vai
para imprimir uma mensagem.
Neste caso, número médio.
Quebrar.
Caso 7, 8, 9, 10, que vai imprimir "Você escolheu um grande
número. "Break.
E depois há uma palavra-chave literalmente chamado de "default"
que é efetivamente como o "outro" construir.
Então nova sintaxe, mas intelectualmente,
nada aqui de novo.
É como o Scratch.
Se, else if, else if, uma espécie de bloco.
>> Então essa é a versão mudou deste programa.
Mas note que nós fizemos com os números aqui.
Deixe-me abrir uma segunda versão, apenas para mostrar
algo um pouco mais concreto.
Portanto, temos aqui os graus vez.
Acontece que você pode usar opções não apenas em números inteiros, mas em
caracteres.
Não em todos os tipos de dados, mas, pelo menos, em caracteres.
Então, aqui, nós poderíamos fazer algo como se o valor de C que
o usuário digitou, na linha 19, usando a função GetChar
Um é o capital ou minúsculas um, vamos interpretá-lo como uma grade,
e dizem que pegou uma nota excelente.
E para baixo ao longo da instrução switch, temos outro
casos de "B" s e "C" s, e assim por diante.
Mas vamos agora completar uma outra coisa.
E, novamente, espécie de voar através de
alguns desses exemplos.
Mas é realmente para que possamos aplicá-los, agora -
ou realmente, apenas traduzi-los agora -
para C.
>> Então deixe-me ir em frente e fazer isso.
Vou abrir um novo arquivo.
E eu vou fazer include.
E então eu vou fazer int main (void).
Deixe-me salvar esse arquivo como um loop.c.
Apenas como um exemplo.
E eu estou indo para ir em frente e fazer o seguinte.
Eu quero escrever um programa muito tedioso.
Então, 10.
Vamos fazer isso.
9.
Tudo bem.
Assim que você começar a fazer isso na programação, você é
provavelmente fazendo algo errado.
Mas vamos começar lá de qualquer maneira.
Oops.
Isso é realmente errado.
7.
6.
5.
4.
Nada vai acontecer quando chegarmos a 0.
3.
2.
1.
Okay.
0.
Excluir.
>> Tudo bem.
Então retorne 0.
Portanto, este programa, obviamente, vai fazer o que muito
tediosamente diz que vai fazer.
Vai imprimir todos os
valores, de cima para baixo.
Então deixe-me fazem loop.
E então - gritos.
Faça loop.
Eu estava no diretório errado.
E agora deixe-me correr loop.
Enter.
Woohoo.
Very nice.
Programa, longa e agradável.
>> Tudo bem, mas agora vamos fazer isso melhor.
Assim como no Scratch, quando você começou a usar um looping
construir, em vez de apenas copiar e colar todo o
peças do puzzle, deixe-me apresentar essa coisa.
Assim, em C, existem várias construções de iteração,
um dos que se parece com isso.
Um laço "for" tem três coisas, separados por dois pontos e vírgula.
E, em seguida, no interior do corpo do laço, por assim dizer - a
coisas dentro das chaves -
nós podemos fazer algo de novo e de novo.
Então, o que eu tenho aqui na tela, este é
literalmente apenas um comentário.
O / / significa aqui vem um comentário.
Este não é um código.
Esta é apenas uma descrição Inglês, para mim, o humano.
>> Inicializações assim, condições, e atualizações.
Bem, vamos ver como isso funciona.
Isto permite-me reescrever este programa como segue.
Para -
Então, aqui vem o meu loop -
int i -
aqui vem uma variável chamada "i" -
fica inicializado a 10.
Portanto, não é a minha inicialização.
Eu quero fazer esse laço tão longa como "i" é maior ou
igual a 0.
E em cada iteração deste laço, eu quero
fazer i -.
Então vimos + + na segunda-feira.
- É o oposto.
Ele diminui o valor em 1.
Dentro deste ciclo, que eu quero realmente fazer alguma coisa.
Então, eu vou dizer algo como printf.
Eu não quero dizer 10 agora, porque isso obviamente é apenas
indo para imprimir o mesmo valor.
O que eu quero para imprimir em vez disso, provavelmente?
Sim.
Assim, "i". Então% d, i.
>> Então eu vou roubar uma daquelas idéias de mais cedo -
esta substituição de códigos de formato -
e depois aqui em baixo, no fundo, eu vou retornar 0, apenas
para uma boa medida.
Mas agora, eu tenho um programa mais sucinto.
É apenas poucas linhas, e não cerca de 10 ou 11 linhas.
Deixe-me ir para a minha rápida aqui.
Laço remake.
Execute novamente loop.
E que parece ser a mesma.
Agora, o programa não é mais interessante.
Mas agora eu posso escrever algo como isto.
Eu posso mudar isso para 100.
Eu posso então recompilar o meu programa.
E então eu posso voltar a executar o meu programa.
E agora ele vai super-rápido em computadores de hoje.
Mas lá eu tenho -
e realmente, a minha memória de retrocesso não
até mesmo ir tão longe.
Lá vamos nós.
Portanto, temos todos os 100.
Mas é fácil cometer erros aqui.
O que vai ser o comportamento esperado se eu
acidentalmente fazer isso?
Então ela se sente como infinito.
Então, vamos ver se o computador se comporta.
>> Então deixe-me ir em frente e fazer loop.
E deixe-me correr loop.
Então, vamos voltar a isso em apenas um momento.
Vamos deixar que a execução.
Porque o que devemos contar até, no mínimo?
Provavelmente, pelo menos, 2 bilhões, se nós temos que muitos bits, e
estamos usando valores positivos.
Então, vamos voltar aqui.
Além desses tipos de loops, temos o que se chama, enquanto
Loops. Então, assim como no Scratch, você tinha sempre
blocos, e você tinha blocos de repetição.
Da mesma forma, em C, você só tem outras maneiras
de se expressar.
Então você tem essa noção de um loop while que lhe permite
expressar-se um pouco diferente.
E então você tem algo chamado um loop do-while,
que opera de forma ligeiramente diferente também.
E nós vamos provocar estes separados ao longo do tempo.
>> Mas vamos dar uma olhada neste último aqui.
Se entrar em -
ainda em execução.
É bem infinito.
Então deixe-me ir para positiva, e mostrar como podemos realmente
governar a entrada do usuário um pouco mais eficaz.
É um programa muito curto.
E aqui temos, em principal, uma declaração int n.
Então me dê uma variável chamada n. Agora, eu literalmente dizer
"Fazer". E então eu tenho aberto encaracolado
cinta, chaveta perto.
E então perceber, logo depois disso, ele diz que enquanto n
é menor do que 1.
Então, observe que estas linhas -
19-24 -
compor coletivamente um laço do-while.
E, novamente, nova sintaxe, não uma idéia nova.
É apenas outra forma de looping, sintaticamente.
Então, o que isso faz?
Faça o seguinte, enquanto n é menor que 1.
Então, o que eu quero fazer?
Eu exijo que você me dê um número inteiro positivo.
Então eu realmente tentar obter um número inteiro do usuário.
Mas em termos de a ordem das operações aqui, porque a
enquanto condição for aqui, então eu estou indo para verificar, é n
menos do que 1?
Então, suponha que o usuário -
depois de ser exigido, desta forma -
tipos no valor 0.
Essa condição vai ser verdadeiro ou falso?
Bem, isso realmente vai ser verdade.
Porque n é 0, e 0 é menor do que 1.
E o que isso implica?
Fazê-lo novamente.
Apenas uma vez que a condição é avaliada como false.
Se eu digitar 42.
Bem não, 42 não é inferior a 1.
Por conseguinte, este laço é feito de execução.
E então, nesse ponto, o programa vai dizer, obrigado por
a 42, no presente caso.
Agora que você tem esse jeito de se expressar -
Não devemos esperar para que isso termine.
Vai levar algum tempo.
Para ser continuado na próxima vez, talvez.
>> Mas agora, você tem a capacidade de espera para entender um
pouco de humor geek.
Desculpas.
Este não é representativo de humor na ciência da computação
mundo, mas que é bonito.
Final [Risos] Vamos com essa nota.
E nós vamos vê-lo na segunda-feira.
[Aplausos]