>> ROB: Tudo bem.
Bem-vindo à primeira seção.
Estou Rob.
>> JOSÉ: Eu sou Joseph.
>> ROB: Então, vamos mergulhar para a direita dentro
A primeira coisa a falar sobre é o Appliance.
Portanto, esperamos que a maioria de vocês tem baixado já.
Mas você pode ver as instruções em cs50.net/appliance.
Oh Deus, agora eu sou auto-consciente.
Eu ainda ouvi-lo.
>> JOSÉ: Wow, parece que é desorientado.
>> ROB: Então, algumas pessoas têm tido problemas com ele, então não espere até
o último minuto do problema definido para tentar resolver o aparelho e
descobrir que ele não está funcionando.
>> JOSÉ: E se algo não está funcionando e você precisar de ajuda, você pode ir para
cs50.net/discussion onde nós tem um fórum onde você
pode postar suas perguntas.
E nós vamos chegar a eles eventualmente.
>> ROB: Tudo bem.
Então, isso é o que o Appliance parece.
Mais uma vez, é apenas uma completamente separada sistema operacional rodando dentro
qualquer sistema operativo que estão funcionando em seu laptop.
E as principais coisas que você estar usando são gedit.
Portanto, esperamos que este já tem tornar-se um local conhecido.
O terminal.
>> E você também pode executar o Chrome dentro do aparelho.
Houve um par de pessoas que relataram internet
não funciona no aparelho.
E alguns deles têm apenas assumi que não é suposto ser
internet no aparelho.
Mas sim, lá é suposto para ser segura.
>> Eu vou dizer isso agora, mas isso não acontece realmente quer dizer nada.
Se a internet não está funcionando, isto é o que você tende a precisar
correr para corrigi-lo.
Se você está tendo problemas de internet, não lembre-se que, apenas publicá-la em
Discutir, e vamos dizer, executar isso.
Mas a internet deve estar funcionando.
>> Assim, a única outra coisa - sim, nada o resto é realmente relevante.
Mas eu só queria salientar que -
ver neste canto inferior direito.
Assim, cada um de seus aparelhos deve tem um endereço de IP.
E no final do semestre, este IP endereço se tornará mais relevante quando
você está trabalhando na web p-set, porque você será capaz de acessar o
site que você está trabalhando a partir de sua Chrome local usando esse endereço IP.
>> Mas o que eu gosto de usar o endereço IP for - e você não tem que fazer isso, eu
só quero indicá-lo -
está aqui.
Portanto, esta é uma janela de terminal em meu Mac, isso não é no
Appliance de todo.
E você pode procurar o que este comando faz.
Mas eu estou indo diretamente para SSH ao meu Appliance.
Eu não sei o que o IP é.
>> JOSÉ: 168 -
>> 168.224.1.0.
>> ROB: Então uma vez que eu sou feito com isso, fazer logon dentro
Agora, basicamente, este é idêntico ao de um janela de terminal dentro do meu Appliance.
Então, eu praticamente nunca realmente funcionou de dentro do próprio aparelho.
Eu sempre tenho que correr no fundo minimizado
e SSHed nele.
>> O problema com isso é que você não vai para ser capaz de utilizar facilmente gedit
directamente a partir deste.
Mas se você quiser ser um verdadeiro legal hackers, então você deve se acostumar a um
linha de comando editor de texto de qualquer maneira.
Então Vim e Emacs e Nano, todos estes diferentes alternativas.
Nano tende a ser o mais fácil.
E eu acho que não tem destaque de sintaxe.
Oh, não, é totalmente faz.
Então você pode usar Nano, porque que um é muito fácil.
>> Você vê todos estes comandos na parte inferior.
Este símbolo pouco de cenoura.
Se você ainda não viu isso antes, você vai provavelmente vê-lo muito agora.
De modo geral, significa a cenoura controle, como o inferior esquerdo do teclado
caractere de controle.
Então, aqui ele está me dizendo aqui -
oh, não é cortado se eu zoom in
Então, de controle, X é como Eu vou sair.
E ele diz que eu posso bater Y para Sim, para a poupança, N para Não.
Então, isso é Nano.
>> Vim e Emacs tendem a ser ligeiramente mais complicado e desgastante.
Mas você pode se acostumar com isso, e então você vai adorar.
Então é isso.
>> JOSÉ: Não há necessidade de fazer isso.
>> ROB: Yeah.
Você é livre para usar para o gedit restante do semestre.
Assim, todas as perguntas relacionadas com o aparelho?
Ou você tem alguma opinião sobre o que mais precisa ser falado sobre
o aparelho?
Sim.
>> COLUNA 1: Quando você SSHed em sua coisa, foi o carmesim senha?
>> ROB: Yeah.
A senha para praticamente tudo no Appliance vai
ser carmesim.
>> COLUNA 2: Instalar como um verdadeiro IDE no aparelho, ele vai trabalhar?
>> ROB: Eu imagino Eclipse tem um Versão Fedora, caso em que, sim,
você pode fazer isso.
Provavelmente não é realmente vale a pena.
>> COLUNA 2: OK.
Por isso, é provavelmente mais fácil se eu queria usar o Eclipse, é só usar o nativo e
em seguida, fazer o upload para -
>> ROB: Oh, que também é provavelmente mais fácil.
Mas você pode fazê-lo funcionar dentro do aparelho.
>> JOSÉ: E para a câmera, a questão foi, você pode instalar outro
IDE dentro do aparelho?
>> ROB: Eclipse sendo um exemplo de uma IDE.
Qualquer outra dúvida aparelho?
Tudo bem.
>> Então, vamos agora avançar para a linha de comando coisas relacionadas com a interface, de modo CLI.
E mais uma vez, eu só estou indo para o trabalho em aqui, porque este é idêntico ao
trabalhando dentro de uma janela de terminal dentro do aparelho.
Como está essa fonte procurando?
É grande o suficiente?
Tudo bem.
>> Então, há uma série de comandos que você deve ficar muito utilizado para
ao longo do semestre.
A grande dois para navegar são ls, lista os arquivos nesse diretório, e
cd, assim que mude de diretório.
Então, eu posso mudar a área de trabalho e, em seguida, um padrão muito comum é a de um cd
diretório e imediatamente ls o que está no diretório.
>> As pessoas também, por vezes, não percebem que Tab conclusão é uma coisa.
Assim como cd, vh, e então eu bati Tab.
Eu quase nunca digitar a coisa toda.
E então se eu continuar batendo Tab novamente, ele vai automaticamente
começar a lista para mim.
Então eu posso cd vhosts, host local.
E isso só vai -
no caso de você não ter ouvido o termo antes, o diretório é apenas outra palavra
para pasta.
Portanto, agora se você vê -
vamos trazer isso para o topo.
>> Portanto, agora se você vê entre parênteses, você ver o pequeno til, barra, vhost,
slash, host local.
Assim, o til, que se refere para o meu diretório home.
É um diretório que você está quando você SSH dentro
É o diretório que você está em quando você abrir um terminal.
É onde você começa.
E assim eu estou dentro do meu diretório home, e eu estou dentro do vhost
diretório dentro do meu diretório home.
E então eu estou dentro do local, diretório hospedar dentro disso.
>> Por isso, algumas outras coisas úteis com cd -
ou bem, em geral, de modo dot sempre refere-se ao diretório atual.
Cd, dot é um comando bastante inútil.
Mas isso está mudando para o diretório atual.
A mais útil em termos de cd é ponto, ponto, que é
basta ir até um diretório.
>> E note que estes -
Eu quero dizer aliases, mas estes símbolos, ponto e ponto, ponto, os trabalhos
para praticamente qualquer comando que você está vai estar pensando em correr.
Assim como cd é provavelmente o lugar onde você vai ser utilizando a maior parte, mas estes não são
coisas que só cd compreende.
É praticamente algo que o seu todo linha de comando compreende.
Um monte de programas entender ponto e ponto, ponto.
>> Assim, os outros úteis - cd, Dash.
Então isso vai me trazer para a último diretório que eu estava dentro
Então, às vezes eu vou fazer algo como: oh, eu estou trabalhando aqui.
E eu vejo algum erro com alguma coisa, e Eu vou investigá-lo, indo para
algum diretório aleatório em algum lugar.
E eu não sei se ele vai deixe-me lá dentro.
Ele o fará.
Então eu faço o que eu quiser neste diretório.
Blá, blá, blá, blá, blá.
E eu estava tipo, tudo bem, eu quero voltar para onde eu estava.
cd, traço, e isso me traz de volta.
>> Então, eu vou jogar um monte destes em você hoje.
Eu não espero que você memorize todos eles.
É uma espécie de apenas saber que eles existem.
E mais tarde, quando você está como, hmm, eu quero voltar para o
diretório que eu estava em, oh, espere, algo parecido com o que existe.
Você não tem que basta digitar em todo o diretório novamente.
>> JOSÉ: E, eventualmente, você será apenas usá-los uma e outra vez, e
ele vai se tornar a memória muscular.
>> ROB: Yeah.
Então, como eu disse antes, que til é o seu diretório home.
Então eu posso cd, til.
Mas não tem sequer a fazer isso se eu -
Eu vou voltar para o diretório assim não é um exemplo inútil.
Mas se eu apenas fazer cd, que também é o mesmo que, ir para o meu diretório home.
Eu faço Comando, K.
>> JOSÉ: Você também pode digitar clara, a palavra, e ele deve limpá-la.
>> ROB: E eu acho que também de controle, L também o faz.
Então muitas maneiras diferentes.
Eu acho que há algumas diferenças onde clara e Controle, L será apenas
realmente empurrá-lo para a parte superior e Eu ainda pode rolar para trás.
Command, K literalmente destrói tudo, e você
não pode rolar de volta.
No mínimo, isso é como ele funciona em iTerm2.
Eu não sei como as outras coisas -
oh.
>> Com sshing, por isso, se você estiver no Windows, você vai ter que baixar PuTTY
a fim de SSH desde o Windows não faz tem como uma ferramenta interna SSH.
De Macs, você pode apenas SSH diretamente a partir de uma janela de terminal.
OK.
Dúvidas?
>> Com ls, assim que algo que se acostumar com com a maioria desses comandos é -
bem, eu vou fazer um.
Ls, traço, l.
Então, traço, l é o que vamos para chamar um sinalizador para ls.
E muitos desses comandos têm bandeiras que você pode passar para eles.
Portanto, neste caso, traço, l é uma bandeira que diz-lhe para me dar um completo
listagem de toda a informação desses arquivos.
>> Assim, vemos aqui que o desktop foi modificado em 30 de julho às 12:54.
De downloads foi modificado em 6 de setembro.
Estes são o tamanho actual e bytes desses diretórios.
Você não tem que entender tudo isto.
>> Este material à esquerda, estas drwx de, que se tornará muito mais relevante
mais tarde, quando você tem que lidar com -
que tem a ver com o que tem permissões olhar para esses arquivos.
E por isso, se você não foi o único usuário em este computador, você seria capaz de
digamos, OK, eu deveria ser o único permissão para olhar para este arquivo ou eu sou
vai permitir que todos de olhar para este arquivo.
Então, alguém no meu computador pode olhar para esse arquivo.
Eu nem sei o que isso - o que isso faz?
>> JOSÉ: Eu não tenho certeza, na verdade.
>> ROB: Não faço ideia.
>> JOSÉ: Mas se você não sabe, não existe um comando útil que você pode usar
para dizer o que significa a saída.
E se você digitar no homem antes do comando -
assim M-A-N. ROB: Homem.
Assim, o homem é mais um que é muito útil.
E o homem, ls.
Assim, as páginas do manual, eles têm tanto comandos que você vai estar usando
na linha de comando, e eles também têm funções que serão relevantes
com C. Assim, pode o homem -
e eu ignorei 3.
Mas man 3 printf vai trazer a versão C do printf.
Mas se eu só faço o homem printf, este é vai abrir o comando printf
que acontece na linha de comando.
>> Assim, o homem, sl.
As páginas de manual pode ser muito avassaladora.
Aqui, porém, você vai ver este anúncio de todas estas bandeiras que ls
entende.
Então, se formos a correr, l, e -
Eu só vou jogar isso em você.
Mas, a fim de pesquisar, você quer ao primeiro hit a questão
botão barra marca ou.
Então Slash.
>> E então eu posso pesquisar para o que eu quero.
Então eu vou cortar para traço, l.
E lá estava ele.
Portanto, use um formato de listagem longa.
Isso não me ajudar a descobrir o que que determinada coluna quis dizer, mas eu
assumir em algum lugar aqui isso explicaria isso.
Portanto, use as páginas man para qualquer comando que você não entende de imediato.
>> Tenho certeza que você pode até mesmo homem, o homem.
Uma interface para o on-line manuais de referência.
Ah, um último um que é talvez um pouco ls relevante é, traço, um.
Então, observe se eu apenas fazer ls, Recebo estes cinco arquivos.
Se eu fizer ls, traço, um, eu obter um lote mais arquivos.
Assim, a coisa em comum entre todos estes novos arquivos é o ponto de antemão.
>> Assim, a convenção é que um arquivo que começa com um ponto está escondido.
Então você não quer ver esse arquivo, você não quero ter que mexer com
sua listagem do diretório.
É só quando você explicitamente perguntar, tudo bem, ls, traço, um, me mostrar.
O um significa todos os arquivos, incluindo as ocultas.
Assim, alguns outros comandos.
Oh, questões em que ponto?
Sim.
>> COLUNA 3: Quando você faz ls, um, qual é o ponto, ponto?
>> ROB: Ah.
Então é isso que eu estava falando.
É a mesma coisa que Eu posso gostar de cd, ponto, ponto.
Então, tecnicamente, ponto e ponto, ponto são arquivos que existem em cada
diretório onde o arquivo ponto refere-se para o diretório atual.
Então, se eu cd, ponto, eu só vou para ficar no diretório.
E ponto, ponto sempre se refere ao anterior diretório um nível acima.
Então, se eu entrar em toras e ls, traço, al, Vou ver ponto, ponto. cd a ponto, ponto
me leva para o diretório anterior.
É.
OK.
>> Assim, uma outra muito importante comando é rm.
Então é isso que nós vamos usar para remover.
E deixe-me realmente fazer outra primeiro comando.
Então mkdir.
Mkdir é como você pode criar diretórios.
E eu vou criar um diretório temporário e ir para o diretório temporário.
E, como esperado, é vazio.
Mas se ls I, traço, um, eu ainda tenho dot e ponto, ponto, porque se refere a ponto
o diretório atual.
E ponto, refere-se ao ponto diretório anterior.
E aqueles sempre vai existir, não importa o diretório que você está dentro
>> E este é um completamente desnecessário comando, mas toque.
Estou apenas usando-o, porque é uma maneira fácil de criar arquivos.
Então tocar um, toque em b, toque em c é apenas vai criar três arquivos chamados um,
b e c que estão completamente vazias.
Assim, o ponto de me criar os do primeiro lugar é apenas para que rm é
como podemos removê-los.
Então, rm, a.
Vai me perguntar, remova regular de um arquivo vazio?
E então eu vou dizer que sim.
>> Então, se eu tenho certeza que eu quero apagar esse arquivo sem ter que ser
solicitado, remova arquivo vazio regular?, em seguida, rm, traço, f vai ser o
bandeira que diz, sem forçar a remoção até me alertando, oh, é você
certeza que deseja excluir o arquivo?
Sim, eu tenho certeza.
Então, rm, traço, fb será apenas fazê-lo sem pedir.
>> Então, vamos fazer mais alguns diretórios.
mkdir, tmp2, cd, tmp2, tocar um, toque em b.
OK.
Então agora eu quero remover tmp2 como um diretório.
Tmp2 Então rm.
Você não pode remover tmp2, é um diretório.
Portanto, a questão aqui é que rm não trabalhar imediatamente em diretórios.
É só significou para arquivos como arquivos não-diretório.
>> E assim, o que podemos fazer aqui é rm, traço, r.
Isso significa de forma recursiva, o que pode não significa nada para você ainda.
Mas quando você começa a recursão, isso vai significar mais.
Então, rm, traço, r, tmp2 vai recursivamente ir para o diretório.
Então descer diretório tmp2?
Sim, vamos a isso.
Queremos remover tmp2 / a?
Sim.
Queremos remover tmp2 / b?
Sim.
Agora queremos remover o tmp2 diretório?
Sim.
E agora o diretório e tudo dentro
de que tenha sido removida.
>> Não é tecnicamente um comando rmdir que você pode usar para remover
diretórios, mas ele só funciona em diretórios vazios de qualquer maneira.
E ver que, vamos apenas fazer mkdir, tmp2 novamente.
Tmp2, toque a.
OK.
Então, se eu tentar remover dirtmp2, vai dizer, o diretório não vazio.
Então, eu praticamente nunca usar o remove comando dir qualquer maneira, porque rm, traço,
r funcionará em diretórios vazios e diretórios não vazios.
>> E também, se eu não quero ter que passar por todo esse processo de
descendo para o diretório e remoção de cada arquivo individual, rm,
traço, rf, tmp2.
E agora ele se foi.
>> Algo que ter cuidado é sobre rm, traço, rf.
E isso me assusta até mesmo escrevê-lo, porque se eu acidentalmente
pressione Enter ou algo assim.
Então, rm, traço, rf, til seria, sem me avisar, o f não solicita
mim, ele irá remover automaticamente meu diretório home inteira e
tudo na mesma.
Assim, você pode pensar que é uma coisa estúpida de se fazer.
E bem, é.
>> Mas isso pode acontecer muito facilmente por acidente se, por exemplo, eu queria remover
minha barra, diretório vhost.
E só na digitação rápida, Eu acidentalmente fazer isso.
Isso irá remover de forma recursiva tanto a minha diretório eo diretório vhost
neste diretório específico que apenas passa a não existir agora.
Mas isso ainda seria remover meu diretório home inteira.
Pelo menos por não ter uma f, ele iria me pedir em primeiro lugar.
E eu seria como, oh, não, eu Não quero fazer isso.
Mas as pessoas, slash, incluindo me tendem a entrar no
hábito de sempre rf-ing.
Mesmo os arquivos regulares que eu posso apenas rm, c, que tendem a apenas rm, traço, rf, c.
Só tome cuidado quando você está rf-ing.
>> COLUNA 4: O que fazer C?
>> ROB: C é que eu estou falando sobre esse arquivo C neste diretório, que rm, c.
>> JOSÉ: E mais perigosamente, se você usar uma estrela, refere-se a tudo em
o diretório.
Então o que eu geralmente tendem a fazer é que eu vou entrar em um diretório e eu quero
remover todos os arquivos lá dentro.
Então, rm, traço, rf, estrela.
>> ROB: Yeah.
Rm, traço, rf, estrela.
>> JOSÉ: E se você não tiver cuidado o que você está no diretório -
Eu não estava em temp, mas eu estava acidentalmente no meu diretório home,
então eu vou remover tudo no meu diretório home.
E eu realmente fiz isso antes, e Eu acho que você já fez isso antes ou
Jay fez isso antes.
>> ROB: Eu removi acidentalmente -
assim ignorar esse comando um pouco.
>> JOSÉ: Não é divertido.
>> ROB: Então, no diretório bin barra é um monte de arquivos binários onde vai
ser os familiares como bumbum.
Bem, bumbum e, basicamente, todos estes as coisas que eu estou rodando ao comando
linha estão neste diretório bin barra.
>> JOSÉ: Como ls está aqui.
>> ROB: Então dot, slash, ls seria listar neste diretório.
>> JOSÉ: Rm também neste diretório.
>> ROB: Eu acidentalmente rm, rf-ed bin, que removeu qualquer comando que pude
possivelmente querer.
Que, em seguida, eu só reinstalar um novo Appliance naquele ponto.
>> JOSÉ: Então, muito cuidado quando você usar este comando.
>> AUDIÊNCIA: [inaudível]?
>> ROB: sim.
Isso também é um mau hábito de entrar.
Se você notar, eu sou agora -
bem, você não pode notar, mas minha zoom-in talvez possa.
Então, eu estou agora root @ aparelho.
Então jharvard é o usuário que queremos você sempre estar usando.
Root é o usuário que tem permissão para não fazer absolutamente nada.
>> Então, observe quando estou jharvard, se eu tentar cd -
o que é um diretório que?
Oh, a raiz é um bom exemplo.
Então cd, raiz.
Permissão negada.
Porque se olharmos para este anúncio -
e, novamente, você não tem que inteiramente entender isso.
Mas esses três traços estão dizendo que não deixe qualquer outro
usuário para este diretório.
E o diretório acontece a ser de propriedade do usuário root.
>> Assim, o fato de que eu sou e não jharvard aquele que não é raiz é permitido em
Neste diretório, isso significa que eu sou vai ficar permissão negada quando eu
tentar cd nele.
Então, quando eu sou raiz, eu tenho permissão para fazer absolutamente qualquer coisa, inclusive
apagar arquivos essenciais para o aparelho e
destruir a coisa toda.
>> Portanto, é um mau hábito de entrar apenas vagando ao redor de sua
sistema operacional como root.
Eu faço isso de qualquer maneira.
Dúvidas?
E eu vou sair da raiz, ficar como jharvard.
OK.
>> Comandos mais relevantes.
Então, voltando ao nosso temp, o mv comando significa movimento.
Você pode mover a.
Agora queremos chamá-lo b, então agora ele é chamado b.
Ou talvez nós deseja mover b-se um diretório.
Então, agora vazio deste diretório.
Eu vou voltar para o meu diretório home, e vemos que b está aqui, porque o
diretório home foi um diretório a partir o diretório que b estava dentro
>> Há também cp.
Então cp é copiar seção super, ponto, o texto.
Posso chamá-lo é, ponto, texto.
Agora temos dois super-seção, ponto, texto, e s, de ponto, o texto.
Isso também funciona em diretórios.
Eu RF-ed um único arquivo.
Assim cp -
bem, primeiro vamos tentar cp, tmp, tmp2.
Assim, omitindo diretório tmp.
Assim, semelhante ao rm, o comportamento padrão é não trabalhar em diretórios.
>> E, novamente, semelhante ao rm, o padrão comportamento - bem, fazê-la funcionar
com diretórios é um, traço-r de distância.
Então copiar recursivamente a temperatura diretório no tmp2.
E agora temos tanto tmp e tmp2, e que não é tão útil desde tmp
estava vazio, em primeiro lugar.
Tmp2.
>> Agora vamos copiar tmp em tmp2.
E vemos que tmp2 também tem o arquivo um, porque o diretório e
tudo dentro do que diretório foi copiado.
E isso pode ser um pouco útil se, digamos que você está trabalhando
em um conjunto de problemas -
ou na verdade, conjuntos de problemas posteriores são ainda mais importante, porque não há
Será um grupo inteiro de arquivos e coisas.
>> Mas você só quer, por uma fração de segundo, você fica tipo, tudo bem, eu sou
vamos tentar algo diferente.
Deixe-me apenas copiar toda a minha pset1 diretório de backup em pset1 de modo que se
Eu acabo estragar as coisas, eu posso voltar para o meu diretório de backup.
Existem maneiras mais adequadas de versionamento fazer backup de seu código, mas
esta é sempre uma maneira rápida de fazer apenas se você tem uma cópia de algo
que você está prestes a modificar.
>> Então eco também é um comando único que tipo de sillily só vai imprimir na
linha de comando exatamente o que você queria fazer eco.
Assim ecoam oi.
Nós vamos apenas imprimir oi.
Eco Olá mundo.
Vamos imprimir Olá mundo.
Isso vem em uso quando você começar a combinar comandos.
>> E mais uma vez, não esperam que você inteiramente entender isso ainda, mas é
algo a ver.
E então, se você está pesquisando para exemplos ou você percebe que você quer fazer
algo, ele pode ser útil.
Então, vamos, como exemplo, ls assim, traço, l.
Então, aqui eu vejo a saída de ls, traço, l.
E eu digo: OK, eu quero armazenar isso em um arquivo.
Tudo isso de saída aqui, eu quero para colocar em um arquivo separado.
>> Então este pequeno símbolo maior que é o que vamos chamar.
Estamos redirecionando o saída para um arquivo.
Vamos chamar o arquivo blá, porque isso é o que eu tendem a chamá-lo sempre.
Então, agora, vemos que temos um arquivar blá aqui.
E se eu abri-lo, eu vou vê-lo é exactamente o resultado do comando
que eu só corri.
E da mesma forma, você pode -
se isso era a saída para um arquivo, este é obter a entrada de um arquivo.
O que é um comando que eu -
>> JOSÉ: Eu acho que você pode usar menos ou mais, provavelmente.
>> ROB: Mas como sobre apenas menos blá?
Eu não sei.
Se você entrar neste cenário, como Série de Exercícios há que ele é útil para.
>> JOSÉ: Você pode canalizar-lo em eco.
Canalize o arquivo em eco para vê-lo.
>> ROB: É pipe.
>> JOSÉ: Desculpe.
>> ROB: Tudo bem.
Portanto, esta é a saída para um arquivo.
Este é obter o texto a partir do arquivo e entregá-lo para o programa.
E você também vai ver esse cara.
Portanto, esta é uma espécie de fazer os dois ao mesmo tempo.
E na verdade, eu vou apresentar dois novos comandos apenas para fazer uso dele.
>> A história é um comando útil que é apenas vai imprimir uma listagem de
qualquer coisa que eu já executar uma linha de comando.
Assim, vemos aqui tudo o que eu tenho corrido esse tempo todo.
Muita ls do.
>> E outro comando útil é grep que o seu objectivo é a pesquisa sobre
texto à procura de padrões, bem, olhando para o que você
quer que ele procurar.
E assim, um uso prático aqui é, digamos queremos agarrar a história.
E eu quero olhar para os comandos onde eu - o que é um
um útil para procurar?
>> JOSÉ: [inaudível]?
>> ROB: Ou vamos apenas olhar para todos toca, por qualquer motivo.
Então é isso que ele vai ficar.
E você não tem que completamente entender isso.
Mas a idéia é aqui, a história está a dar o mesmo resultado que fez aqui
onde está imprimindo a todo história de tudo que eu já executado.
Estamos, então, de passagem, que -
assim, em vez de imprimi-lo para a tela, queremos passar isso para o
comando grep que está procurando todas as ocorrências da palavra toque.
>> E assim, usando essa combinação de ferramentas de história e grep, eu posso ver, OK,
aqui está todos os comandos que eu já correr, e aqui está um pouco comum.
Estamos na parte inferior.
E isso também me dar o comando Eu corri que tinha o
toque palavra nele.
Mas o tubo é uma coisa muito útil para a combinação de vários programas.
E, na verdade, é um atalho para deixar me história saída para o arquivo blá, e
deixe-me usar o grep blá arquivo como o que eu quero olhar.
Assim, o tubo é apenas um atalho para esses dois comandos.
Sim.
>> COLUNA 4: [inaudível]?
>> ROB: sim.
O que é -
Oh.
Vamos testar.
Então, gato, cachorro, peixe.
Então, eu quero grep.
Dash, R, mais uma vez, vai ser recursiva, então eu quero descer para baixo
todos os diretórios.
Quero grep recursivamente para todos - e me deixe temporariamente
esta fora do caminho.
Ignore-me.
OK.
>> Então, eu quero grep temporariamente para todas as ocorrências da palavra peixe.
E aqui o que eu estou fazendo é grepping recursivamente para a palavra peixe.
E estrela significa mais de todos estes arquivos nesse diretório.
E por isso me deu uma permissão negada, porque não está autorizado a ler que
arquivo específico.
Mas ele encontrou peixes no arquivo, teste.
>> Eu também poderia dizer, especificamente, eu só quero olhar no blá arquivo, em
caso em que ele não vai encontrar nada.
Eu só quero olhar no arquivo, teste.
Ele vai encontrar peixes.
Isso é um comando muito útil a saber em geral.
Existem algumas alternativas para grep que é suposto ser mais
programador amigável, mas tendem para ainda voltar a cair grep.
Dúvidas?
OK.
>> Existem outros comandos?
Oh.
Apenas um one-off que eu sempre encontrar para ser divertido é CAL.
Então, observe quando estou nesta linda modo de tela cheia, não tenho como top
barra de ferramentas ou qualquer coisa.
Então cal só me dá um pouco de bom calendário que é certo
agora cortar, eu assumo.
Mas pouco agradável de comando.
>> JOSÉ: É [inaudível].
Outros comandos que você pode ter visto incluem bumbum e fazer.
Nós vamos passar por cima deles em mais detalhes posteriormente.
Mas se você está trabalhando em o PSET, você deve estar
familiarizado com aqueles.
>> ROB: Tudo bem.
Perguntas sobre comando de linha de coisas?
Tudo bem.
Então, vamos passar para alguns Coisas relacionadas-C.
Variáveis ​​de matemática.
OK.
Assim como tivemos matemática em Scratch, você também pode usar a matemática em C.
>> Antes de chegarmos a isso completamente, assim variáveis.
Lembre-se que sempre que você declarar um variável como int x ou y bóia, você
tem que dar antes de digitar o nome da variável.
Assim, os tipos que vimos até agora são int, float, double, long long, que eu
na verdade, não sei se temos visto que, até agora.
>> Existem alguns outros.
Nós ver Char.
Há curto, que é como se fosse o oposto do longa, longa, onde é
menor do que um número inteiro.
Vimos também string.
Então, o que é especial sobre corda?
Por que eu digo que é não é bem como int?
>> COLUNA 4: Realmente não existe.
>> ROB: Yeah.
Assim, a única razão pela qual temos corda é porque quando você faz
hash incluem cs50.h.
E vamos ver exemplos desta tarde - oh, isso não lidar com isso bem -
onde cs50.h está fazendo algo ao longo das linhas de Tipo
def, char estrela, corda.
>> E o que é dizer que nós não sabemos ainda sabe o que uma estrela char é ainda.
Mas isso está dizendo que nós queremos string.
Qualquer lugar que você está usando corda, você poderia ter usado o caractere estrela,
que realmente é um tipo que existe na linguagem C.
Mas nós vamos chegar a isso.
Ah, e ele vai para a direita de volta.
Neat.
>> Assim, mesmo com bool onde o verdadeiro eo falso.
Isso não é realmente um tipo de embutido em C. Em vez disso, é apenas, que isso tem
o valor zero?
Então vamos considerar apenas que ela é falsa.
Isso tem o valor -
bem, isso tem qualquer valor que não é zero?
Então vamos considerar que ela é verdadeira.
Então, é verdade, dois é verdadeiro, qualquer coisa diferente de zero é verdadeiro.
Portanto, estas são esses.
Dúvidas sobre declaração de variáveis ​​e tipos de variáveis ​​e tudo isso?
É.
>> COLUNA 4: Por muito tempo longo, no livro, ele disse que tinha que ser long long int.
Mas vai funcionar muito longo tempo?
>> ROB: Então esses modificadores de tipo.
Assim, int x.
Assim, podemos também dizer unsigned int x.
Podemos dizer short int x.
Podemos dizer long long int x.
Mas praticamente qualquer daquelas coisas que eu apenas disse, int sem sinal, short int,
long long int, você pode se livrar de int e ele vai assumir
que você quis dizer int.
X Então não assinados, que apenas significa -
você sabe como normalmente com um int, você pode dizer que x é igual a 3 negativo?
Com um int sem sinal, você não pode.
>> JOSÉ: E mais uma vez, para a câmara, o pergunta era: qual é a diferença
entre long long int e apenas o tempo?
>> ROB: Yeah.
Então, eu quase nunca escrever long long int.
Vou escrever long long.
>> JOSÉ: Alguma pergunta?
>> ROB: OK.
Pequeno lembrete tão bobo de que é como declaramos uma variável e inicializar
a variável e declarar outra variável e inicializar
tudo isso em uma única etapa.
Assim, a declaração da variável e a variável de inicialização não tem
a, mas pode ser na mesma linha.
>> Portanto, temos os operadores matemáticos padrão que você está acostumado -
mais, menos, dividir os momentos.
Há também modulo, o que vamos ver.
Não existe, pelo menos em C, um built-in potência
operador circunflexo exponenciação.
Bem, há um operador acento circunflexo, mas não é poder.
>> JOSÉ: Mas não é exponenciação, Sim.
>> ROB: Não use o acento circunflexo supor que isso significa
como quadrado ou qualquer outra coisa.
Por isso, algumas coisas para manter em mente sobre divisão.
Eu estarei.
Assim declarou resposta initialize.
Então, nós estamos dizendo resposta flutuador é igual a 1 dividido por 10.
Imprimir resposta para duas casas decimais.
>> E este é o tipo de coisa que eu seria o homem printf para descobrir que
o que diabos%, ponto, 2f significa?
E isso apenas significa que, bem, ignorando a 0,2.
E%, f é o que usamos para imprimir a flutuar.
O 0.2 está dizendo, a impressão que flutuar até duas casas decimais.
Portanto, este programa tem um bug, e você pode já vi isso antes em algum
Naturalmente CS antes.
Mas o que é esse bug?
>> COLUNA 5: Zero.
>> ROB: Yeah.
Assim, quando dizemos, a resposta é igual a 1 dividido por 10, queremos que o
responder a ser 0,1.
Mas 1 dividido por 10, 1 é um número inteiro, 10 é um número inteiro.
E assim, quando fazemos um inteiro dividido por um inteiro, vamos voltar
um inteiro.
Então 1 dividido por 10 é de 0,1.
>> Desde que ele precisa nos dar um inteiro, ele só vai jogar fora que
casa decimal e dizer que a resposta é 0.
E assim, quando nós imprimimos responder aqui, ele vai imprimir 0,00.
>> JOSÉ: E assim como uma nota, ele realmente joga fora o que há depois da
ponto decimal.
Então, se você, em vez tinha 6 dividido por 10, você pode pensar que ele iria dar-lhe
0,6 e então você arredondar para 1.
Mas, na verdade, o que acontece quando se digita tarefas é que ele deixa cair o que é
depois do ponto decimal.
Assim, se torne 0,6 0.
>> ROB: Yeah.
E nós vamos dizer truncada por isso.
Assim, sempre que você converter para um int, o decimal é truncado.
Assim, a correção para que - não há na verdade, dois.
E eu vou fazer isso, segundo, porque esta é uma solução muito mais fácil.
>> Então, uma correção é usar flutuadores na divisão.
E realmente, você só tem que fazer um deles um carro alegórico.
Mas é apenas um pouco mais clara para fazer os dois flutuadores.
Então, 1,0 dividido por 10,0 é divisão de dois carros alegóricos.
Portanto, a resposta vai acabar sendo um float, e assim você vai
corretamente imprimir 0,10 aqui.
>> Algo que não funciona tão bem sobre o que é, bem, com certeza, era fácil
suficiente para converter um a um flutuar, tornando-a 1.0.
Mas e se em vez tivemos dois inteiros como int x é igual a 1 e int y
é igual a 10, e, em seguida, queríamos para que x dividido por y?
Assim, não é fácil de apenas fazer x.0 ou algo assim.
>> Assim, a correção para que está lançando.
Então, lançando é uma maneira em C para converter a partir de um tipo de variável para outro.
Então, aqui, 1 é um inteiro.
E, colocando esta bóia em frente isso, estamos lançando um a um float.
E para que isso irá converter a 1 a 1,0 um.
E isto converterá a 10 para uma média de 10,0.
>> E então as coisas se comportam de forma semelhante ao versão anterior, apenas mostrou
em que, conforme o esperado, obtemos 0,10 e ele vai imprimir isso.
E nós podemos fazer isso com variáveis, também.
Assim, podemos dizer, float x dividido pelo flutuador y.
>> JOSÉ: Alguma pergunta?
>> ROB: Então, assim como na matemática regular, temos precedência do operador.
Então, na aula de matemática, você é mais provável chamá-lo de ordem das operações.
Aqui, o termo oficial é precedência do operador.
Mas a precedência do operador, ou mais operadores, é como seria de esperar.
>> Assim como em matemática, 2 vezes 10 é vai ser agrupados mais perto do que
10 esta dividida por dois e, em seguida, 2.
A ordem das operações, que vai fazer 2 10 vezes, 10 dividido por dois, e depois
ele vai fazer 20 mais 5 mais 2.
Então, é como se esperava, e você pode usar parênteses para agrupar expressões.
Você não pode usar colchetes para agrupar expressões.
Sim?
>> COLUNA 5: Você poderia realmente só voltar um segundo?
Você pode lançar um int em uma string?
>> ROB: Então, em C, você pode lançar qualquer coisa Você quer o que quiser.
Isso não significa que ele é uma boa coisa a fazer.
Então, quando você lançar um int para uma corda, o que significa -
e nós vamos entrar neste muito mais profundamente -
>> JOSÉ: Muito mais tarde.
>> ROB: Eu não quero dizer muito mais tarde, então eu tentei mudar a minha frase.
Nós vamos entrar muito mais minuciosamente mais tarde, onde realmente quando você tem um
variável string -
assim que uma corda pode ser arbitrariamente muito tempo, certo?
E nós temos vindo a dizer que é um int quatro bytes e longo tempo é de oito
bytes e um float é de quatro bytes.
Assim, uma corda, como um int, só tem um certo número de bytes à mesma.
E isso vai ser de quatro bytes.
>> Mas uma série pode ser bastante arbitrariamente longo, certo?
Então Olá mundo já, se é 10 caracteres ou qualquer outra coisa, que já está
vai ser ao longo dos 4 bytes I podem se encaixar em uma string.
E assim como cordas realmente funciona é que eles são, onde na memória essa seqüência
está sendo mantido.
>> E assim por aqui, quando digo corda x Olá mundo é igual, dentro de x é
apenas dizendo, oh, Olá mundo é armazenado neste lugar especial na memória.
Então, se nós tentamos lançar um inteiro para um string, então estamos tentando interpretar
alguma parte aleatória de memória como uma string.
E isso quase sempre quebra as coisas.
>> JOSÉ: Mas se isso confunde você, nós estaremos cobrindo-o
mais em profundidade mais tarde.
>> ROB: Yeah.
Este é o lugar onde você está indo para entrar em ponteiros.
E essa é uma parte significativa de duas semanas de curso.
>> COLUNA 6: Funciona como objetos em outras línguas ou não verdade?
>> ROB: Então, em outras línguas, objetos seria representado usando ponteiros.
Não é a mesma coisa, no entanto.
Quaisquer pensamentos?
>> JOSÉ: Não.
Sem pensamentos.
>> ROB: OK.
>> JOSÉ: Next.
>> ROB: Basta ir com isso.
Tudo bem.
Assim módulo.
Assim como nós temos mais, menos, dividir e multiplicar.
Então modulo é aquele que você pode não tenha visto antes.
E ele apenas diz, dar me o restante.
Assim, 55% 10.
O restante de fazer 55 dividido por 10 seria 5.
Assim, 55% de 10 é 5.
E 3% 5 será de 3.
8% 8 será 0.
16% 15 será 1.
>> JOSÉ: Uma coisa a notar, com isso, também, é que pode não funcionar como esperado
se você usar um número negativo.
Então negativo de 5% 4, algumas pessoas pode pensar que é -
o que você acha negativo 5% 4 seria?
>> COLUNA 5: Uma.
>> JOSÉ: Então, algumas pessoas dizem que um, algumas pessoas dizem que uma negativa.
Mas o que -
>> ROB: Eu não teria sequer , disse um deles.
>> JOSÉ: Dois, desculpe.
Algumas pessoas dizem -
>> ROB: Três.
>> JOSÉ: Três?
>> ROB: Negativo -
qual era o - negativo de cinco -
>> JOSÉ: Três, três, três.
Desculpe.
Porque modulo, em geral, quando você tem vi isso em outro lugar, isso normalmente significa
retornar um número positivo, certo?
>> ROB: Então, quando dizemos em matemática, 10% do, eles tendem a querer dar-lhe -
se mod por 10, então nós esperamos obter um número entre 0 e 9.
Em aqui, que não é o caso que você vai ter números negativos retornado.
>> JOSÉ: Então negativo de 5% 4 seria negativo 1.
>> ROB: Mas é raro que você é mod-ing números negativos, para começar.
Ir isso.
>> JOSÉ: É.
>> ROB: Meh.
OK.
Assim, uma última coisa a salientar sobre flutuadores é que é um comportamento perigoso,
mas carros alegóricos não são uma exata representação.
Então, voltando para bytes de novo, lembre-se que um int é sempre quatro bytes e um
flutuador é sempre quatro bytes.
Assim, o exemplo de Lucas é muito bom.
>> Então, acho que de 1 dividido por 3.
Então 0,3333333.
Se eu só tenho 32 bits, como pode Eu armazenar 0,33333 exatamente?
E talvez, por alguma razão, você diz: tudo bem, bem, vamos apenas dizer que
que este particular 1011001, vamos apenas dizer que deve ser 0.333333.
Bem, você só tem um número finito de esses bits, por isso é impossível
representar cada ponto flutuante valor dado apenas 32 bits.
>> Bem, é impossível representar qualquer valor de ponto flutuante dado infinito -
bem, dado qualquer número finito de bits.
Portanto, a questão aqui é, bem, quando usamos para imprimir em duas casas decimais,
que fizemos corretamente obter a resposta 0,10.
Mas debaixo do capô, é realmente sendo armazenadas tão próximo quanto possível
0,10 como esses bits pode representar.
É este no próximo slide?
Ou não é?
>> JOSÉ: Sim, é isso.
>> ROB: Blegh, blegh.
>> JOSÉ: Sim, você pode apenas puxar as notas para cima um pouco.
>> ROB: Eu só vou para aumentar em no último nisso.
Oh meu Deus, isso é [inaudível].
Assim que o número.
Isso é o que será impresso se executar o programa.
E note que não é realmente um grande negócio se estamos apenas se preocupar como
2-3 casas decimais.
Como nós só originalmente impresso 0,10, e é por isso que não viu nada de errado.
Mas uma vez que começamos a entrar no exato, número exato de que é
representando, vemos que ele não pode exatamente representar 0,1.
>> E parte do problema aqui é como, Tudo bem, tudo bem, mas, bem,
primeiro, o que se tentou fazer, resposta é igual a igual a 0,1?
É isso que vai retornar verdadeiro ou falso?
E por isso é difícil de dizer.
Eu acho que ele realmente pode retornar verdadeiro.
Será que vai em primeiro lugar -
Eu não sei.
A resposta é uma vez que você começar a lidar com valores de ponto flutuante, você muito
muito não deve estar usando a igualdade devido a esta imprecisão.
>> E para tudo o que você sabe, é o centésimo casa decimal que o
ponto flutuante não era capaz para lidar corretamente.
E assim, a igualdade só vai falhar mesmo embora o número - se você tivesse sido
usando números exatos, os números devem ter sido exatamente o mesmo.
É ao longo de uns 50 Cálculos usando estes flutuante
valores de ponto, o erro pode construir cima e para cima e para cima, e
as coisas só ficam mal.
>> JOSÉ: E houve realmente exemplos famosos de isso acontecer.
Como os engenheiros da NASA ter começado esta erradas, causando foguetes para explodir em
o ar depois de terem sido lançados.
E muitas questões como essa.
Então, sim.
>> COLUNA 6: Quando você diz que 0,3 f, ele truncar o resto?
Ou será que arredondar para cima ou para baixo?
>> ROB: Será printf em volta dele?
>> JOSÉ: Eu acho que trunca printf.
>> ROB: OK.
Assim, podemos ir da mesma forma no oposto direcção deste, onde, neste caso,
o mais próximo que poderia representar 0,1 Foi com esse número.
O mais próximo que pode ser capaz de representam 0,2 é o oposto
direção, 0,199999996356 ou algo assim.
Então, se nós fomos nessa direção de coisas, então printf 0,3 f retornaria
1,99 em vez de 2,00.
>> JOSÉ: E eu não estou totalmente certeza sobre isso.
Você pode querer escrever um pequeno, pouco programa para verificar isso.
>> ROB: No entanto, o que temos certeza é de que se você tentou lançar isso para um
int, e lançando para um int vai causar-lhe a truncar o decimal, se
você tentar converter 1.9999999 para um int, você vai ter um.
E assim, você deve geralmente usar o função round na biblioteca matemática.
Dúvidas?
OK.
>> JOSÉ: movendo Assim, para condições e expressões booleanas.
Então, você já viu isso antes.
E, na verdade, deixe-me ter certeza que meu computador está no formato certo aqui.
Espaço.
Desculpe, nós vamos ter que lidar um pouco com corte nas bordas.
>> Mas sim, vocês têm visto isso antes em Scratch.
Então, isso aqui é uma expressão o qual é utilizado em
uma instrução condicional.
Então responda maior que zero vontade dizer verdadeiro ou falso.
E estas são realmente importante, porque eles nos permitem introduzir
lógica em nosso código.
>> Assim, por exemplo, este é um programa escrito em Scratch que pede ao usuário
para um inteiro e diz a eles se o inteiro que eles lhe deram foi uma
número positivo ou negativo.
E a conversão por aqui para ver se imprimir pela primeira vez a declaração,
dê-me um inteiro.
E então você pedir-lhes para um inteiro.
>> E então você usa a lógica condicional sobre aqui para verificar se esse número
foi realmente maior do que zero ou não.
Portanto, temos aqui uma expressão booleana dentro de uma condicional Se comunicado.
Existe alguma dúvida?
Há alguma dúvida sobre isso?
OK.
>> Portanto, não há mais do que apenas maior do que, é claro.
Você pode construir expressões booleanas usando a maioria dos tipos de coisas que você
pensaria em matemática.
Assim superior.
Isso deve ser um menor que.
Desculpe.
E o espaçamento.
>> ROB: Deus não permita que você deixá-lo.
>> JOSÉ: Tudo bem.
Assim, maior que, menor que, maior do que, ou igual a, menos
do que, ou igual a.
Usamos dois iguais para verificar se há igualdade, porque só é igual a meio
atribuição, certo?
Sim.
E então nós podemos também não é igual por usando ponto de exclamação, é igual.
>> E este símbolo ponto de exclamação pode também ser estendido, de modo que, se você quiser
para inverter qualquer tipo de Boolean expressão, você pode fazer isso.
Então, isso vai avaliar a verdade só se a resposta for menos
que ou igual a zero.
Qualquer dúvida sobre isso?
OK.
>> Então, você também pode combiná-las expressões usando lógica E e
Ou lógico.
Portanto, este é apenas o símbolo E, que deve ser Shift 7.
E este é o símbolo pipe, que é não um caso menor L. É a única
isso mesmo acima de sua tecla Enter.
Então você usa dois destes para simbolizar lógico ea lógica Ou.
>> Então, isso só vai retornar true se a resposta é um, dois, três, ou quatro.
E isso só vai retornar true se a resposta está além de que em ambos os lados.
Portanto, não é um, dois, três, ou quatro.
E a maneira que você usaria que em uma expressão -
>> ROB: Ou um zero ou um cinco.
>> JOSÉ: Zero ou um cinco.
Desculpe.
Sim, sim, sim.
OK.
E aqui, agora, da mesma forma que usaria essa expressão, um menor
lado de uma Se condicional expressão declaração, você também usaria o
mesma forma, apenas colocá-lo dentro de dos parênteses da instrução If.
Portanto, este printf só será acionado se a resposta é um, dois, três, ou quatro.
Qualquer dúvida sobre a combinação expressões?
>> Portanto, não há outra condicional construto que chamamos de If / Else.
Então, basicamente, isso significa que agora, ok, se algo que eu queria ver não era
verdade, então vá para o Else e realizar essa outra ação.
Portanto, neste caso particular, eu perguntei o usuário para um número inteiro.
É o número inteiro maior do que zero?
Sim?
Bem, então eles escolheram um número positivo.
Se não, então ele deve ter sido negativo ou zero.
Então você escolheu um número negativo ou um zero neste caso.
Sim.
Ou um zero.
>> E depois também temos If / Else, Se e Else.
Então, isso nos permite executar uma seqüência de coisas só se os primeiros falharem.
Portanto, neste caso, agora nós estamos fazendo o último que você pegar zero.
Então, se eles não escolheram um positivo nem um número negativo, então eles devem
ter escolhido zero.
Então, ele só vai para baixo da cadeia como esta.
>> Assim, um exemplo de como um Se é diferente de -
um If / Else é diferente de apenas uma seqüência de Ifs.
E esta é uma pergunta comum que as pessoas perguntam é, bem, se você começa como um
95 em CS50, o que será este programa de te dizer?
>> COLUNA 5: Você tem um A.
>> JOSÉ: Sim.
Você tem todos os um daqueles direita.
Você tem um A, você tem um B, você tenho um C e um D, certo?
Então, tudo isso se avaliou em ordem.
Assim, enquanto uma 95 é maior do que 90, é também maior do que 80, é também
maior do que 70, e é também maior do que 60.
Então você tem todas essas qualidades.
E eu suponho que você faria só quero o A.
>> A maneira de corrigir isso é substituir aqueles com Else / Se 's.
Portanto, neste cenário, ele vê que 95 é superior a 90, e, em seguida, faz
não avalia o resto das declarações.
Qualquer dúvida sobre isso?
>> Portanto, há um outro tipo de condicional estrutura que nós temos aqui, que nós
chamar uma instrução switch.
Então, isso permite que você verifique basicamente qual é o valor de um número que você colocar
para a instrução switch é.
Portanto, neste cenário, estamos alternando em n, e nós estamos dizendo, oh, se n é
um, em seguida, imprimir essa afirmação.
E, em seguida, romper, o que significa que a saída fora da instrução switch.
>> Se não fosse um, então, bem, apenas eventualmente verificar todos esses casos.
E assim, ele verifica se é um ou dois ou três, e ela imprime em conformidade.
E o que esta palavra-chave default aqui meios é se não entrar em qualquer
desses, em seguida, dizer inválido.
Então, digamos que eu peço e n o usuário dá-me quatro.
Bem, ele corresponde a nenhum desses casos, por isso vai imprimir o que está no
seção padrão.
Sim, questionar?
>> COLUNA 5: Pode-se usar Boolean em vez das expressões
um, dois, ou três?
>> JOSÉ: Então a questão é você pode usar Expressões booleanas em vez de um,
dois e três?
E em C, eu acredito em você Não posso fazer isso.
Mas, em outras línguas, o que você pode encontrar no fim do
semestre como JavaScript, você pode.
Bem, você teria que calcular primeiro esse valor e, em seguida, usá-lo no
instrução switch.
Sim?
>> ROB: Então uma parte do benefício do interruptor declarações é pensar se você fez isso
como If / Else, assim como se n é igual a é igual a um, ou o que seja.
Else / Se n é igual é igual a dois, que seja.
Else / Se n é igual é igual a três.
Assim, a forma como o programa seria executado é se sequencialmente descer essa lista
e verificar, é n um?
Não..
N é dois?
Não..
É n três?
É.
Faça isso.
>> Considerando que, com instruções switch, é realmente capaz de compilá-lo para ser
muito rápido.
E assim que ele diz switch, ele diz, tudo bem, n é dois, eu sou
imediatamente vai pular para onde É que eu vou começar a executar.
Eu não estou indo para a primeira verificação, n é um, é n dois?
Pode começar imediatamente a fazer o que é suposto fazer.
>> E por causa disso, não pode ter condições de booleanos.
Ou então ele teria que fazer o seqüencial, como, tudo bem, é n
maior do que zero?
Else é n superior a 10 ou o que quer.
>> JOSÉ: Neste caso, se você usou If / Else, de Se, em seguida, a chave seria
executar cerca de três vezes mais rápido do que o If / Else, Se.
Podemos organizar o interruptor de tal uma maneira que nós não quebrar
após cada um dos casos.
Portanto, neste caso, eu estou dividindo o números que escolhemos em um e
dois que não números elevados e sendo três um número elevado.
>> Portanto, neste caso, se n é um ou dois, vai bater o caso e, em seguida, ele vai
cair, porque não há ruptura.
E isso vai acabar aqui.
Então, se nós escolher um, ele vai fazer o printf e, em seguida, quebrar, de modo que nenhum dos
este é executado.
E, claro, se eles entram em três ou qualquer outra coisa, então ele vai pular
aqueles e não ir para lá, e executará em vez do
linha correspondente.
Há alguma dúvida sobre isso?
Sim?
>> COLUNA 4: Você obterá um erro se você teve uma pausa depois de um caso, mas
não tinha algo para ele fazer?
>> JOSÉ: Então a questão é que você começa um erro se você tem uma pausa depois
maiúsculas de um, mas não há nada para fazer?
E a resposta é não.
Você não vai realmente obter um erro.
Sim, hmm mm.
>> Então, como uma espécie de uma pequena mudança aqui, Eu vou colocar um printf aqui.
Gritos.
Então, o que este impresso se Eu coloquei um em como entrada?
É.
Ele iria dizer-lhe não demorou um elevado número duas vezes, certo?
Porque ele iria bater aquele primeiro caso, não iria quebrar, e cairia
até o segundo caso.
Qualquer dúvida sobre isso?
>> ROB: Você tem outra pergunta?
>> JOSÉ: OK, esfriar.
Tudo bem.
Portanto, não há outra coisa que chamamos de operador ternário que é basicamente um
sintaxe alternativa para fazer Se e, em seguida, Else.
E isso permite que você faça tudo em uma linha.
Portanto, neste programa especial, Estou pedindo ao usuário para o n.
E se n for maior que 100, eu digo eles escolheram um número alto.
Else Eu digo a eles que eles escolheu um número baixo.
>> Assim, podemos usar este tempo muito longo de sintaxe, corda, S, e em seguida, verificar se n é
maior do que 100 e atribuir lo em conformidade.
Mas podemos fazer isso muito mais concisa usando esta sintaxe operador ternário
que envolve uma questão marca e um cólon.
Assim, o ponto de interrogação é essencialmente fazer uma pergunta, certo?
>> ROB: Talvez ampliar isso.
>> JOSÉ: Sim.
Bom ponto.
Então este é o operador ternário.
A primeira vez que fazer a pergunta, n é maior do que 100?
Se for, então executar o primeiro parte antes dos dois pontos.
Se não for, então eu executar o segunda parte depois dos dois pontos.
Assim, se n for maior do que 100, em seguida, ele pega alta e puts
que em cadeia s.
Se n for menor do que 100, que escolhe baixa e, em seguida, coloca isso em cadeia s.
Assim que condensa este grande pedaço para baixo em apenas que uma linha.
>> COLUNA 5: Isso é popular?
>> JOSÉ: Sim, é bastante popular para coisas onde essencialmente você deseja
não uma atribuição com base em algum tipo de condição.
E, neste caso, nós estávamos tentando para atribuir um valor a cadeia s.
Não é assim -
Eu acho que eu realmente não preferem nos outros casos.
Mas é especialmente útil para esta tarefa.
>> ROB: Isso é um padrão muito comum onde você tem alguma variável que
você vai dizer, se algo, ajuste esta variável para um valor, senão, definir
esta variável para outro valor.
E esse é o cenário onde usar um ternário.
>> JOSÉ: E você está economizando lotes de linhas, certo?
E ele só faz o seu código indiscutivelmente um pouco mais legível.
Sim, questionar?
>> COLUNA 6: Para um ternário, você poderia ir, string s iguais s, ponto de interrogação?
E então você pode ter, por exemplo, cinco opções diferentes.
E, dependendo do que o número de n foi, você deve escolher um desses?
>> JOSÉ: Então a pergunta é, existe um tipo de sintaxe onde você pode fazer corda
s é igual a n, e, em seguida, ter mais do que dois opções depois que ponto de interrogação?
E a resposta simples é não, não há realmente uma boa maneira de fazer isso, a menos
você quer ninho ternário múltipla operadores dentro do outro.
>> Você poderia fazer como n maior que 100, ponto de interrogação, e depois outro
operador ternário, n superior a 50, ponto de interrogação, e aninhar-lo dessa forma.
Mas, nesse cenário, o código é ficando meio ilegível e confuso,
e talvez seja melhor ir apenas para uma instrução If / Else naquele ponto.
>> ROB: E também, como uma nota lateral, PHP incorretamente implementa o ternário
operador tal que ternários aninhadas nem sequer funcionam como deveriam.
>> JOSÉ: É.
Então, ele fica um pouco confuso, especialmente quando você vai
para diferentes idiomas.
>> ROB: É confuso o suficiente para que línguas estão errados sobre isso.
>> JOSÉ: Então, na verdade, só para esclarecer, que todo mundo sabe o que isso
% S faz aqui?
Qualquer dúvida sobre isso?
Eu acho que só para a câmara, o% s basicamente nos permite colocar um espaço reservado
para uma string.
E depois, no final, que especifica que o variável queremos colocar nessa
titular lugar é s.
Assim que, basicamente, tem s e coloca-lo aqui.
E então ele vai imprimir, você escolheu um alto ou você escolheu um número baixo.
OK.
>> Então laços permitem que você execute as coisas em movimentos circulares, certo?
Você pode ter encontrado isso em Raspadinha na forma de laços para sempre
ou repetir até ou Repetir uma especial número de vezes.
Então, por que isso é bom para nós?
Bem, em C, vamos dizer que temos esta canção implementado em Scratch que
canta, esta é a canção que nunca termina.
Ele só vai sobre e sobre e para sempre e para sempre.
Bem, você não pode realmente fazer um programa que tem um número infinito de printf
declarações, certo?
>> Portanto, neste cenário em particular, de uma forma que você poderia fazer este trabalho e
para torná-lo imprimir sempre é em vez usar um loop While.
Assim, um loop While irá executar o que é no corpo das duas cintas que
pertence a ela com base no que é a condição.
Portanto, neste exemplo particular, antes, se queremos imprimir isso para sempre, o que
que podemos fazer?
Bem, com certeza, não é?
>> Portanto, este tipo de combina a idéia de alguma expressão booleana
juntamente com um laço.
E nós aprendemos sobre booleano expressões anteriores.
Assim, sempre que a condição dentro de Enquanto isso continua a ser verdade, este laço
executará sobre e sobre e sobre.
E, neste caso, se nós apenas fornecê-lo com verdade, isso faz com que um infinito
laço que imprime a canção sobre e sobre e sobre como nós desejado antes sem
ter um programa que tem um infinito número de instruções printf, que é
não é possível.
>> Então, mais convincente, porém, você pode usar isso com um
variável e uma condição.
Então, vamos dizer que queremos repetir o frase, totalmente maluco, 10 vezes.
Então o que você pode fazer com um loop While é primeiro você pode inicializar um contador
variável fora do While a 10.
E então, basicamente, cada vez que você vai através do loop While, você imprime
a declaração e, em seguida, você diminui a contador variável até ao final,
em algum momento, uma vez que eu subtrair o suficiente vezes, 1 da I bastante vezes -
e só para esclarecer, eu minus minus Significa que é igual a que eu menos 1.
>> Isso vai trazer basicamente I até o ponto em que uma vez que eu chegar a zero, este
condição não é verdadeira e por isso sai fora do circuito.
Então, totalmente maluco só imprime 10 vezes.
Qualquer dúvida sobre um loop While?
OK.
>> Portanto, há uma maneira de fazer o que acabamos de fez de uma forma mais concisa com
o que chamamos de um loop For.
Então, um circuito para consiste numa inicialização, um estado, e um
atualização, assim como tínhamos antes neste loop While.
Então, vamos dar uma olhada.
Neste loop While, tivemos um inicialização, então nós tivemos um
condição de que fizemos o check.
E então nós tivemos uma atualização pisar no topo.
>> Com um loop For, isso leva basicamente essas três coisas e condensa-lo
para baixo em uma linha.
Então a primeira coisa que ele faz no Para loop é a inicialização.
E então você faz um ponto e vírgula, e, em seguida, você faz a condição, o que é que eu
maior que zero vai para lá, e, em seguida, a etapa de atualização.
Portanto, este fica realizada no final do corpo do laço.
Então, esses dois programas são essencialmente equivalente.
>> Alguma pergunta?
Então, o que é uma diferença entre esses dois?
Alguém pode indicá-lo?
Ele pode ser um pouco sutil.
É apenas uma diferença muito pequena.
Sim?
>> COLUNA 5: Você não seria capaz de usar a variável I, fora do loop For
[Inaudível]?
>> JOSÉ: Exatamente.
Então, isso é algo que nós vamos chegar a mais tarde chamado de escopo de variáveis.
Mas, essencialmente, este int vida I fora desse loop While.
Então, uma vez que este loop While é feito execução, eu vou ser capaz de usar, mais tarde,
em no programa.
>> Considerando que, com este loop, este int I tem como escopo dentro deste loop.
E porque é dentro desta parcela do circuito para, que inicia
nos parênteses e termina com a chaveta lá.
Qualquer coisa que é declarada dentro de aqui não pode ser utilizado no exterior.
Então, se eu tentar usar eu fora, ele vai diga-me, símbolo não declarado.
E, essencialmente, eu não faria ser capaz de usá-lo.
>> ROB: E bem, há 10 anos, em literalmente todos os casos, as chaves são
o que você usou para determinar o escopo de uma variável.
Então, lá dentro, int I é igual a 10 é declarada dentro deste
conjunto de chaves.
E então, enquanto você tentar usar I antes deste chaveta, tudo bem.
Você pode ver quando você digita make, você ver traço, traço, std, iguais, c99.
>> Então, essa é uma versão posterior do C que GCC implementou que também dá
este atalho.
Portanto, este utilizado para não ser permitido em C. E você pode ver por que, porque este int
I está fora deste chaveta mas ainda é considerado no
alcance dessas chaves.
Mas isso é uma coisa muito conveniente, e por isso é uma boa extensão.
>> JOSÉ: Alguma pergunta?
OK.
Então, o que é mais útil é que, por vezes, você quer tipo de dinamismo
seu ciclo, certo?
Você não quer apenas necessariamente imprimir totalmente maluco o tempo todo, você
quero contar para baixo de 10 ou algo assim.
E assim você pode usar a variável do contador dentro desse ciclo também.
E, neste caso, este programa apenas contagem regressiva de 10 todo o caminho.
E o que não imprime?
Não imprimir zero, direito, porque quando -
Sim, ele também não imprime 11.
>> Por isso, não imprimir zero, porque quando Eu é zero, lembre-se, ele avalia
a condição antes de entrar em para executar o corpo do loop.
E quando eu for zero, isso é falso, assim não imprimir em contagem regressiva
zero, ele só imprime contagem queda de 10 todo o caminho até a 1.
Se nós realmente queria para imprimir zero, então poderíamos colocar um sinal de igual
após este sinal de maior que.
OK.
>> Assim, uma maneira de fazer a validação de entrada, que é quando você pede que o usuário faça
alguma coisa, você quer ter certeza de que eles seguir suas instruções, é usar
o loop While, certo?
Portanto, neste caso particular, eu estou perguntando para um número positivo e, em seguida, eu sou
aguardando entrada.
>> E então eu chequei Enquanto a entrada é menor que zero, continuo a perguntar-lhes.
Então, enquanto eles me dão um número que não é positivo, continuo a perguntar,
continuo a perguntar, continuo a perguntar.
Mas o que é uma espécie de estranho sobre isso?
Ou o que não parece ideal sobre esta estrutura aqui?
Qualquer um?
Sim?
>> COLUNA 6: Você está repetindo a instrução de duas vezes.
>> JOSÉ: Certo.
Portanto, temos duas declarações printf aqui, certo?
Portanto, há uma maneira que nós poderíamos conseguir isso apenas até um que faria o nosso
código mais fácil de ler e um pouco mais limpo.
E, então, não teria que Entre em ter duas vezes também.
E uma forma de fazer isso é usando um loop do-while.
>> E um laço do-while é basicamente um forma diferente de um loop While onde
tudo o que está dentro de chaves é executado pelo menos uma vez.
Então, aqui, eu declaro, int de entrada, do lado de fora pela primeira vez.
E então eu acabei de dizer, fazer isso instrução enquanto a entrada
é menor do que zero.
Assim que atinge a fazer primeiro.
Ele sempre irá executar isso pelo menos uma vez, por isso sempre vai pedir o usuário
para a entrada de, pelo menos, uma vez.
E, em seguida, ele avalia que a entrada, e se passa em um círculo.
Sim, questionar?
>> COLUNA 6: Existe uma maneira de fazê-lo [Inaudível] tipos, como se diz,
GetString, e alguém [inaudível]
existe uma maneira de [inaudível]
>> JOSÉ: Então a pergunta é, existe um maneira de fazer a validação de entrada se o usuário
não colocar na direita tipo de variável?
Então, se nós pedimos para um int e eles dá-nos uma corda em seu lugar.
E nas funções que implementam para você, GetInt, GetString em todos
essas funções, eles realmente já fazer esse tipo de entrada de tipo básico
validação sob o capô.
Então, se você estiver usando as funções que lhe deu, você realmente não precisa.
>> Mas se você quiser olhar mais para como você pode realmente fazer isso, você pode olhar
sob o capô o arquivo I/O--
não apresentar, as funções de E / S padrão como uma leitura da entrada padrão e
saída padrão.
E você pode ter uma noção melhor de como você pode fazer isso.
>> ROB: Uma questão, porém, é especificamente com o exemplo que você
disse, você espera uma string e eu entrar em um int.
Como você dizer a diferença entre intencionalmente querendo o
corda 123 contra querendo int 123?
Então corda, é praticamente não há nenhuma validação, é só o que eles
entrou você vai interpretar como uma string.
>> Int é mais fácil, porque não importa o entrada que você tomar a partir do usuário, você é
sempre levando uma corda.
E assim que a seqüência que você pode, então, verificar, são todos estes
dígitos numéricos, na verdade?
>> JOSÉ: OK.
Qualquer dúvida sobre um loop do-while?
>> ROB: Ah, e este é também -
voltando ao escopo, um tanto comum erro está tentando usar alguns locais
variável a partir desta do-while loop dentro desta condição.
E na verdade, se nós apenas se livrou de isso e disse, a entrada é igual a int
GetInt, em seguida, o compilador vai gritar com nos, porque a entrada não existe
fora do âmbito da estas chaves.
>> JOSÉ: E é por isso que preciso essa formação aqui.
OK.
Então, você também pode sair de um malha mais cedo se você quiser.
Portanto, esta é uma forma diferente de implementar o que acabamos implementado.
E em vez de usar a condição dentro dos parênteses, estamos usando um
Se declaração dentro do corpo do loop do-while.
>> E, basicamente, quando a entrada é finalmente maior do que zero, iremos
sair do loop.
E assim vamos todos o caminho até aqui.
E você pode ver que esta seria provavelmente ser preferível neste
cenário, porque é um pouco pouco mais limpo e um pouco
pouco mais fácil de ler.
Considerando isso, você espécie de ter linhas extra na mesma.
É apenas um pouco mais feio, Eu acho que, de certa forma.
Sim, questionar?
>> COLUNA 4: Será que quebrar só começar lo fora de um conjunto de chaves?
>> JOSÉ: Certo.
Então a questão é só quebrar tirá-lo de um loop?
E a resposta é sim.
Então, se você tiver aninhado For loops, para exemplo, se eu tenho para int I é igual a 0
até o dia 10 e, em seguida, para int J é igual a 0 até o dia 10, se eu sair do interior
loop, eu ainda irei para o circuito externo.
Por isso, vou continuar realizando o operações do lado de fora.
Qualquer dúvida sobre isso?
Sim?
>> COLUNA 5: Mas quebrar apenas as funções para chaves, não para o outro
declarações?
[Inaudível]
>> JOSÉ: Então a questão é vai quebrar única função para loops em oposição a
outras declarações, como se?
E sim, esse é o caso, porque você está quebrando fora de um loop, direito,
em um sentido.
>> ROB: Na grande maioria dos casos, é este é o tipo de Se algo,
em seguida, quebrar.
Então você não tem que quebrar a aplicar-se Se o que está envolvendo em torno dele.
E também, isso não é muito de um loop, mas lembre-se de que os interruptores são também
quebrado de por pausas.
Vimos breaks sendo usado com interruptores antes.
>> JOSÉ: E você também pode usá-los em loops while e for loops.
Alguma pergunta?
OK.
Assim, no próximo up é funções.
Assim, você pode ter usado um destes BYOB blocos em seu projeto do zero.
E isto permite basicamente definir um conjunto de
instruções a serem seguidas.
>> E o que quero dizer com isto é, vamos pensar de volta à matemática, à direita, álgebra.
Você tem o que chamamos de uma função de x, alguma variável, e vamos dizer isso
função é f de x é igual a x + 5.
Então você pode pensar f de x como este preto caixa que leva 15 e, em seguida,
produz 20.
>> Assim, mais geralmente, é uma função algo que leva alguns insumos e
em seguida, produz algumas saídas.
E por que são funções bem?
Eles são bons para uma série de razões.
Assim é que alguém quer tomar uma facada o que significa organização?
Em termos da razão pela qual as funções são úteis?
Sim?
>> COLUNA 4: Faz o seu código mais legível.
>> JOSÉ: Certo.
Então, uma das coisas é que faz seu código mais legível, certo?
Em vez de ter como int x é igual a x vezes x vezes x, eu posso ter cubo de x,
que é mais legível e mais compreensível para um leitor.
>> Organização também é em termos de dividindo-se o seu código em gerenciável
porções, de modo que, em vez de tentar implementar isso tudo em uma longa seção
na principal, você pode classificar de dividi-la em como, OK, vamos escrever uma função
ao cubo alguma coisa, vamos escrever um funcionar a quadratura algo.
Dessa forma, você pode dividi-la em minúsculo, pequenas partes que você pode enfrentar
ao contrário de tentar resolver um grande problema de uma só vez.
>> ROB: Ou até mesmo pequenas, pequenas peças que você e um parceiro pode enfrentar.
>> JOSÉ: É.
>> ROB: Então, em vez de ambos Você está tentando implantar um
funcionar ao mesmo tempo.
>> JOSÉ: Simplificação.
Alguém quer dar um palpite?
Sim?
>> COLUNA 5: Mais repetição.
>> JOSÉ: Certo.
Então, uma coisa que você pode fazer com simplificação é que ele é uma espécie de em
no mesmo sentido como reutilização é que uma vez que eu escrever uma função cubo, eu posso
é só usar que mais e mais e mais novamente no meu programa em vez de digitar
x vezes x vezes x mais e uma e outra vez.
E simplificação aqui também só significa que ele faz seu tipo de código
mais fácil de depurar uma vez que você dividir este se em funções.
Porque então você pode localizar onde seus problemas espécie de são.
Alguma pergunta?
>> Assim, uma outra idéia é abstração, certo?
Esta caixa preta.
Como você sabe o que faz GetInt para receber a entrada do usuário?
Nós realmente não disse a você, certo?
Tudo o que disse é GetInt faz exatamente o que diz que faz.
Assim, mesmo que não lhe dizem como ele funciona, você ainda sabe.
>> Portanto, neste caso particular, este é uma função quádruplo que faz
coisas diferentes para uma entrada para produzir uma saída.
E você pode quadruplicar um número pela multiplicação por quatro.
Ou você pode o que nós chamamos bit transferi-lo por dois.
E nós vamos cobrir este um pouco mais tarde.
E não há necessidade de saber como esta função realmente funciona, desde que
funciona como indicado.
>> Assim, sob o capô, que eu poderia ser como, o retorno vezes entrada
oito dividido por dois.
E você não sabe, né?
Tudo o que você precisa saber é ele faz o que diz.
Então essa é a coisa útil cerca de abstração.
>> E outra coisa é uma espécie de esta idéia de localizar o código para um
especial seção.
Então, se você tem um problema, você não tem que ir todo o seu código tentando
para corrigir onde era o problema.
Portanto, neste caso, eu implementei cubo errado.
Pensei cubo foi multiplicando por três.
>> Portanto, neste caso, este é um programa que acaba de multiplicar por três
em todos os lugares.
E há outro programa que tem cubo fatorados em uma função.
E agora, se eu quiser corrigir o meu erro aqui, eu tenho que corrigir cada linha
de código neste programa.
Considerando, por outro lado, se eu usar o função, eu só preciso de mudar
o que estava errado em um só lugar.
>> Assim, em ciência da computação, que chamar entradas e saídas.
As entradas são chamados de parâmetros ou argumentos, e as saídas são chamados
valores de retorno.
E vamos ver como isso nos ajuda a resolver de definir uma função em um segundo.
Portanto, esta é uma definição de função para cubagem.
Por isso, leva uma entrada, e, em seguida, ele retorna esse número vezes
si três vezes.
Então, vamos decompô-lo.
>> Portanto, temos um cabeçalho de função, que consiste basicamente de três coisas.
Portanto, temos os parâmetros, que são, como eu disse antes, o
contributos para esta função.
E então damos a função de um nome.
Neste caso, ele é chamado de cubo.
E, então, especificar qual o tipo de do valor de retorno é.
>> Portanto, neste caso, a minha função cubo toma em um número inteiro e é também
retorna um inteiro.
Então, se eu passar em dois, dois é um número inteiro, ele retorna oito para mim, o que
é um número inteiro.
Então retornar parâmetros nome do tipo.
Perguntas sobre isso?
>> E, em seguida, o valor de retorno é realmente especificado no final dizendo retorno
e, em seguida, retornar o que quer contém o valor de retorno.
Portanto, neste caso, se colocarmos tudo em conjunto, uma função leva em
parâmetros, é chamado de alguma coisa, e ele retorna algo que é do tipo
que dizer que ia ser.
Alguma pergunta?
>> Então, como vamos usar uma função?
Bem, nós escrevemos uma função e, em seguida, podemos usá-lo em nosso programa, certo?
Então eu liguei para ele cubo, e então eu posso usar cubo.
>> Mas o que é importante notar é que as questões de ordem.
Se eu tiver cubo abaixo principal, é indo funcionar em cubo.
E, neste ponto, não há nada chamado cubo no programa, e é
só vai ser assim, eu tenho idéia do que é cubo.
>> Então, ele vai dizer, implícita declaração de função.
Esse é o erro que aparece.
E assim, neste caso, o cubo está abaixo principal, por isso não está acontecendo
para saber sobre ele.
>> COLUNA 5: Assim principal é normalmente a última função definida?
>> JOSÉ: Então a questão é, é o principal geralmente a última
coisa que você definir?
E não.
É porque normalmente temos como principal para estar no topo, certo?
Porque essa é a primeira coisa que você quer abrir o programador a
programa para ver.
E assim, como é que vamos resolver esta questão de nós quer principal para estar no topo, mas o
funções que queremos, queremos que eles ser inferior a principal ainda ser capaz de usar
los dentro de principal?
>> Bem, nós usamos o que chamamos um protótipo de função.
Então, o que um protótipo de função essencialmente se é que primeiro tem que
a assinatura ou a função header do que queremos implementar para baixo
aqui, e vamos colocá-la em o início de um programa.
>> Portanto, neste caso, dizemos que, bem, mais tarde, no nosso programa, nós vamos
fazer uma promessa para implementar esta função chamada int cubo, o que leva
uma entrada inteira.
Então, agora, porque isso está acima de principal, principal, ele vai dizer, oh, bem,
mais tarde no programa, que vai ser lá para que eu possa consultá-la, então eu vou
apenas deixá-lo passar por agora.
>> E, em seguida, na parte inferior, implementamos cubo.
E então principal será apenas dizer, bem, ele irá classificar de ligação
estes dois símbolos em conjunto.
E nós vamos cobrir o que isso significa mais tarde.
E assim vai saber que este é o função cubo que ele deve usar.
>> ROB: O [inaudível] sobre querer principal na parte inferior ou
top, eu vi os dois.
Há coisas que simplesmente gostam colocar principal na parte inferior.
Mas uma vez que um projeto fica particularmente grande, geralmente principal está em um
arquivo próprio.
E nesse ponto, como o linha cubo int seria -
dentro de stdio.h são um bando de linhas apenas como aquele int
linha de entrada cubo int.
>> E para que esses protótipos são coisas que você tendem a colocar em arquivos de cabeçalho, em
Nesse ponto, não importa.
Bem, não importa.
Aqueles sempre ir no topo.
E se principal não é um arquivo próprio, você não precisa se preocupar em colocar
protótipos de funções individuais no arquivo.
>> JOSÉ: E nós vamos chegar a isso um pouco pouco mais tarde, quando Rob começa a falar
sobre a compilação.
E assim também há uma diferença entre parâmetro e argumento.
E parâmetro é apenas o que nós chamamos esses insumos quando
definimos a função.
E chamamos isso de um argumento quando realmente passá-lo para a função.
>> Portanto, neste caso, este é um parâmetro, como dissemos antes.
E quando nós realmente usá-lo de lá, cubo de x, então X em si é
o que chamamos de um argumento ao cubo função.
>> ROB: Então os argumentos de parâmetros são -
há esta distinção, muito confundida alternadamente.
Neste momento, para mim, é como um dos aquelas palavras que, quando eu vê-lo em
o selvagem, eu não posso ajudar, mas imediatamente questão de saber se eles estão usando-o em
no contexto correcto, porque o diferença é sutil o suficiente para que apenas
todos tendem -
Eu quase sempre digo argumento independentemente do que quero dizer.
>> José; e funções também são úteis para o que chamamos de efeitos colaterais.
Assim, uma função pode tomar nenhuma entrada, e ele também pode produzir nenhuma saída.
Portanto, neste caso particular, eu sou definição de uma sub-rotina que não tem nenhuma
valor de retorno.
E, a fim de especificar que, utilizamos o que chamamos de um vazio aqui.
E assim, o efeito colateral dessa função é que ele só imprime o material
para a página.
Na verdade, não tomar qualquer insumos, e isso não acontece
realmente produzir quaisquer saídas.
>> Mas isso pode ser útil no sentido se você quiser, por exemplo, debug
algo em seu programa, se você quiser para escrever um pouco sub-rotina que
imprime, vamos dizer, o conteúdo de memória ou algo assim.
E assim, estes efeitos secundários são, por vezes, útil, fora do contexto
só gostaria de entradas e saídas.
Alguma pergunta?
>> E para terminar este segmento particular, o que este programa faz?
Eu vou dar a vocês um par de segundos para lê-lo.
Em um nível muito básico, o que queremos dizer é que ele troca x e y, certo?
>> Então, como muitos de vocês realmente pensam isso vai trocar x e y?
Levante sua mão.
Ninguém.
OK.
Quem pensa que ele vai não trocar x e y?
E a soma de que era não o quarto inteiro.
Por isso, algumas pessoas não tem certeza.
OK.
Isso é razoável.
>> Então, vamos passar pelo que acontece quando você realmente chamar funções pela primeira vez em
Para responder a esta pergunta.
Então, isso é o que a memória tipo de parece.
Este é mais ou menos como um modelo simplificado memória do que parece quando
você executar um programa.
Portanto, há algo chamado a pilha para baixo aqui e
algo chamado de heap.
E estes crescem em direção o meio de memória.
>> Portanto, neste caso particular, quando você chamar uma função, ele
é colocado na pilha.
E então o que está contido no que função permanece no que chamamos de que
stack frame da função.
E assim, para obter um bom visualização de isso, vamos - por exemplo, tivemos a
programa principal antes.
E dentro do principal, que chamamos de cubo.
Assim principal seria primeiro vão para a pilha enquadrar, porque é a primeira função
que é chamado.
>> E então, quando cubo é chamado dentro de principal, que é colocado no topo da principal
dentro da memória.
Então, o que você vai notar é que cubo tem os seus próprios parâmetros e sua
próprios moradores.
Então, quando você realmente passar alguma coisa para uma função, os parâmetros que ela
se são cópias do que foi passado do principal.
>> E a sorte de explicar isso, vamos caminhar por um programa.
Portanto, temos a pilha, o que é apenas a parte da pilha.
E o que nós fazemos é primeiro inicializar x e y de um e dois.
Portanto, temos essas pequenas caixas.
Eles estão sentados na pilha do principal enquadrar na pilha.
Eles contêm um e dois.
>> Agora chamamos swap.
O que acontece é que passamos x e y em swap, e swap cria suas próprias cópias
dessas variáveis ​​para usar dentro de seu quadro de pilha.
Então agora lá, temos, um que contém o valor que tinha x e b,
que contém o valor que tinha y.
Então, um, dois.
>> E você vai perceber que este é separado de x e y dentro do principal.
Assim, temos agora criar um temporário variável contenha um.
Nós definimos um igual a b, por isso mudanças de um para dois.
E, então, definir b igual a temperatura, o que é um.
>> E então agora vamos sair desta função.
Quando você sair da função, o quadro de pilha fica retirado da pilha.
Chamamos-lhe empurrar.
Você aperta um quadro de pilha para a pilha e você pop se fora da pilha.
E então o que acontece é que tudo o que Foi nesse quadro de pilha tipo de apenas
sobe em chamas.
E para que não mais existe.
>> Mas o que percebemos?
Nós nunca realmente mudou o valores de x e y, certo?
Portanto, aqueles permaneceu local para principal.
E, passando as coisas em troca, nós na verdade nunca mudou esses valores.
E o que nós chamamos isso?
Chamamos isso de passagem por valor.
>> Assim, no C, quando você passa as coisas em funções, passa-los por valor e
faz uma cópia deles para a função de usar.
E nós vamos aprender sobre algo chamado passagem por referência mais tarde, mas isso é
uma maneira que você pode resolver este problema.
Mas não vai se preocupar com que até mais tarde.
>> ROB: E na verdade, esse termo, que passa por referência, então C não tem sequer
passando pela referência.
C exclusivamente tem passagem por valor.
Não importa o que você faz, você está sempre passando uma cópia de algo.
É que, como eu meio que mencionei que antes com ponteiros
e que uma string é realmente apenas quatro bytes apontando para um lugar na memória.
>> Bem, se eu tiver essa string e é me dizendo que é onde a string -
bem, se eu tiver esse ponteiro para este colocar na memória, então eu posso passar um
cópia do ponteiro para uma função e que a função ainda sabe onde em
memória que é.
Então, esses dois ponteiros estão apontando para o mesmo lugar na memória, e
é assim que nós vamos ser capazes para modificar as coisas para além da
quadro de pilha atual.
>> JOSÉ: Você quer fazer a compilação?
>> ROB: Não, é 5:30.
>> JOSÉ: OK.
É 5:30.
OK.
Então, vamos cobrir a compilação eu acho que em a próxima seção, ou a sua seção
líder vontade naquele ponto.
E -
>> ROB: Alguma pergunta?
>> JOSÉ: Alguma pergunta?
Sim?
>> COLUNA 5: Usando cordas de CS50, qualquer funções que deseja usar para
aqueles, que vai ser como funções C.
CS50 não passou e fez qualquer adicional.
>> ROB: Correto.
Qualquer um dos C como [inaudível], você usaria aqueles em nossas cadeias.
>> JOSÉ: E uma última coisa que eu quero menção é que nós temos um guia de estilo
para esta classe.
>> ROB: Ah, sim.
>> JOSÉ: Então, se você veio de um programação fundo antes, você
pode ter certas convenções quando você está escrevendo código como colocar
chaves na mesma linha ou especial formas de recuar
ou nomear suas variáveis.
Nesta classe, queremos seguir um guia de estilo específico, apenas porque,
Bem, se você sair e trabalhar em indústria, você vai ser esperado
a seguir o guia de estilo da empresa em que você vai.
>> Como por exemplo, o Facebook eu acho tem um tipo particular de nomear
convenção.
E há diferenças entre camelo variáveis ​​da carcaça e, assim como
separando-os com sublinhados.
E também, eu acho que o mais importante, como por exemplo, o recuo, certo?
>> Nós chaves começar onde a condição, e eles
estão na linha seguinte.
E nós também colocar chaves em mesmo que seja apenas uma linha.
E um monte de vezes, existem maneiras de fazer lo onde você pode deixar essas chaves
fora se é apenas uma linha sob a instrução If.
Mas nesta classe, queremos seguir um guia de estilo específico apenas para que você obtenha
usado para esse tipo de coisa.
>> ROB: Sim, e estilo dos anos 50 vai fazer cumprir este guia de estilo, e estamos
vai usar estilo dos anos 50 para grau de seu código.
Por isso, faz as coisas mais fáceis para nós e esperemos que não deve fazer coisas que
muito pior para você, dada a estilo padronizado não deve ser tão
irrealista.
>> JOSÉ: E, finalmente, para encontrar o estilo guia, vá para manual.cs50.net/style.
E sim.
>> COLUNA 4: Você vai fazer valer quaisquer caracteres por linha?
>> ROB: sim.
>> JOSÉ: Desculpe, pessoal.
>> ROB: Isso é como um dos únicos.
Neste ponto, estou OK com 120.
Eu estou bem com a dizer 120 caracteres por linha.
Eu entendo que haja algum limite.
Eu acho que 80 é tão pequeno, mas estamos aplicá-la.
>> JOSÉ: Pessoalmente, eu acho que com C, 80 caracteres é mais OK.
Uma vez que você começa a ficar para outro linguagens como JavaScript e PHP, e não
de modo razoável apenas limitar -a 80 caracteres.
OK.
Bem, essa foi a seção de super.
Alguém quer doce?
>> COLUNA 4: Sim.