ROB BOWDEN: Esta é a seção mais confortável, mas isso não quer dizer que se você sentir que não está mais confortável você não vai aprender as coisas aqui. Então, vamos começar. Você tem lâminas indo bem nas coisas. Eu estou a ponto de só ter agora? Mudar laptops. ALLISON: Você não quer apresentar-se, Rob? ROB BOWDEN: Ah, eu sou Rob. Este é o meu quinto ano CS50 TF-ing. GABRIEL: Eu sou Gabriel. Eu sou cabeça TF de CS50. Eu estava TF no ano passado e este ano. ALLISON: E eu sou Alison, e isso é o meu segundo ano CS50 TF-ing. ROB BOWDEN: Tudo bem, então essa coisa do lado esquerdo, espero que você tenha visto antes. Se não, porque você transferi-lo para si mesmo, você deve ter visto em aula. Portanto, este é o aparelho CS50, e ele fez um pouco de uma descrição do mesmo na palestra. Mas, basicamente, é só você está executando uma operação sistema dentro do seu funcionamento sistema, para que possamos dar-lhe programas sem a necessidade de se preocupar, oh é isso vai funcionar no Windows e Mac, ou se alguns de vocês já estão usando Linux, Linux. É só deveria ser um jogo comum campo para que todos tenham a mesmo ambiente exato. Então, se você não tem baixado isso já, você deve baixá-lo, porque você é vai precisar dele para o conjunto de problemas. E é um dois gigabytes baixar, por isso pode levar algum tempo. Na Harvard ele vai rápido. Aparelho para CS50. Agora, no início, vamos falar sobre apenas um monte de linha de comando material, e assim por isso, quero dizer trabalhar neste pequeno ambiente por aqui. E observe todas as coisas Eu digo aqui e agora estão indo para o trabalho, se você estiver dentro de um terminal dentro do aparelho, ou se você estiver dentro de janela do terminal gedit no interior do aparelho. Então, esses ambientes são idênticos. Mas eu estou indo para ir uma terceira via. E note-se aqui esta pouco endereço IP aqui. Então você não tem que fazer isso, mas este IP address-- agora se I-- exceto ele é bloqueado por essa coisa. OK, para que o endereço IP mais em um terminal aqui-- assim este terminal mais aqui é um terminal no meu Mac. Portanto, este não é de forma atualmente associado com o aparelho em tudo. E se você estiver no Windows, então você está indo a necessidade de baixar alguma coisa especificamente para isso, em especial as pessoas tendem usar Putty, P-U-T-T-Y. Então o que eu vou fazer é tipo SSH e, em seguida, que o endereço IP. Bem, jharvard nesse endereço IP. Então 192.168.24.220. Esta mensagem assustador, ignorá-lo. Basta digitar sim. Este é uma caixa em CS50. Ele pede sua senha. E assim, em muitos desses contextos onde ele pede a senha, [inaudível]. Nós temos um monte de perguntas onde ele diz que não é realmente a digitação. Ele não mostra os personagens de a senha enquanto você digita, se alguma coisa, para um recurso de segurança, porque se alguém está olhando por cima do ombro e eles vêem star star star star, então eles saber que sua senha é de quatro caracteres. Assim, a idéia é que vai pedir sua senha, tipo. Ele não vai mostrar os personagens, mas é, na verdade, aceitá-los. Neste caso, a qualquer momento você nunca ver um prompt de senha lidar com o aparelho, o senha vai ser vermelho. Tão carmesim. E agora aqui dentro deste janela que está no meu Mac, Estou basicamente ter a mesma visão exata como no interior de um terminal no aparelho. Então você não tem que fazer isso. Você pode fazer tudo o que você quer no interior do aparelho. Eu quase nunca realmente fazer nada no aparelho. Eu quase sempre minimizar isso e agora Estou SSH trabalhando no aparelho. Se qualquer coisa, se você tem um computador mais lento, você pode notar a diferença. Eu faço isso porque eu prefiro esta janela de terminal. Ele tem algumas características como Eu posso dividir a janela, e agora posso SSH em através do aparelho. Eu tenho dois SSH está acontecendo ao mesmo tempo. Se o seu computador é particularmente lento e você está trabalhando no aparelho, e você percebe isso é realmente vagaroso, que seja. Tende a ser muito mais rápido se você é SSH-ed em. Mas caso contrário, você pode trabalhar de qualquer maneira. AUDIÊNCIA: O que SSH significa? ROB BOWDEN: conchas seguros, algo parecido? O que SSH significa? GABRIEL: shell seguro. ALLISON: É apenas shell seguro. ROB BOWDEN: shell seguro. É um protocolo que é você-- um protocolo seguro, de forma encriptada. As pessoas não podem bisbilhotar a rede e ver o que você está dizendo a nada você está SSH-ed para. E, de fato, no antigo dias de CS50, por isso, em 2009 quando eu era um calouro, a maneira que que trabalhou na série de exercícios CS50, Foi você SSH-ed para algum servidor que deu-lhe acesso a, e em que trabalhou lá. Então você não tem esse aparelho gráfica. Você não tem gedit. Você não tem todas essas coisas que você pode visualmente apontar e clicar. Você teve que trabalhar nesta interface. Prefiro trabalhar nesta interface. Então, parte do que vamos estar indo para mais agora são um bando de comandos que você deve começar a se familiarizar com como você vai ao longo do curso. E honestamente, uma vez que você se acostumar com eles, é muito mais rápido para trabalhar neste ambiente do que é trabalhar com finder, arrastando e clicando as coisas. Então, aqui estamos nós. Agora eu só SSH-ed, e assim o padrão localização-- você vi alguns desses comandos na classe, mas vamos passar por cima de todos eles novamente. O local padrão que estamos em é o diretório home. E diretório, apenas outra palavra para pasta. Então, nós estamos no diretório home. Digite ls, listar os arquivos neste diretório. Evidentemente, eu criei um blah.c anteriormente. Portanto, temos um diretório desktop. Você percebe o destaque de sintaxe? A luz azul indica destaque um diretório e do branco em linha reta indica apenas um arquivo simples. Portanto, não vão ser algumas outras cores que você vê. Um arquivo executável é provavelmente vai ser verde ou algo parecido. OK, então estamos no diretório home. Agora, se eu quero ir para um diferente diretório, cd é o comando que eu quero. Então, altere o diretório, e então você passar o nome do diretório que você quer entrar. Portanto, temos aqui quatro opções. Eu posso entrar em transferências, e agora vemos aqui ele atualizou este parêntesis que dizer que estou em ~ / downloads. Então, qual é til? É uma abreviação para seu diretório home. Assim, quase tudo que você faz vai seja com relação ao seu diretório home, e pwd é apenas um comando Eu uso uma vez em um ano que apenas imprime o diretório atual. E assim que você vê aqui que ~ / Downloads realmente resolve para / home / jharvard / downloads. Então / home / jharvard é o meu diretório home. Assim, podemos cd dot dot. Agora dot dot é um diretório especial que sempre se refere a um diretório para cima. Então, se eu estou em ~ / downloads, então cd dot dot vai me trazer para til. O que pensamos cd dot dot vai me trazer para agora? Ele vai me trazer para / home. Então til por diretório de trabalho de impressão, Estou na empresa / home / jharvard. um diretório a partir disso, Agora diz aqui / home. Agora cd dot dot. Agora estou no diretório raiz, e você não pode fazê-lo novamente. Você só vai ficar no diretório raiz para sempre. O diretório raiz tem um monte de coisas que, se você quiser olhar para, você pode. Por exemplo, se eu for em bin, que contenha todos estes binários, como ls, e cd, e todas essas coisas. Então, esses comandos precisam existe algum ponto do sistema, e é no diretório / bin. Mas quase tudo que você faz é vai ser a partir de seu diretório home. E cd sem nenhum argumento que seja, você poderia dizer cd ~, não precisa. cd vai trazer-lhe de volta para seu diretório home. Um último. cd - vai trazer você de volta para o último diretório que você estava. Então, eu só cd'd duas vezes seguidas, por isso a minha último diretório foi o diretório home. Se eu for para cortar bin, e agora vamos lá para cima e para usuário. Participação do usuário. Vamos para a participação do usuário. Agora eu estou agora em partes usuário. cd -, de volta bin. Então isso fica particularmente útil quando você have-- e ele vai alternar. Então partilha de utilizador, de volta bin, bin partes. Então isso fica útil. Você pode encontrar-se ter muitos, muitos, muitos diretórios aninhados. E você quer fazer algo real rápido em um diretório superior. Você vai para aquele diretório, fazer mudanças e coisas assim, e agora você quer ir de volta para onde você estava. cd -. Estou sempre frustrado quando acontecer de eu ir para esse diretório I queria fazer um trabalho em. Eu sempre ficar frustrado quando eu fiz -la em dois passos em vez de um passo, porque isso significa que cd - vai para pôr em que a localização intermédia em vez de onde eu quero ir. Assim, vemos todos os arquivos da lista. Sabemos como se locomover até o momento. Então, agora vamos falar sobre a edição de arquivos. Portanto, neste curso, você está quase sempre devem usar gedit. Se você quiser, você pode dar o próximo passo e começar a aprender um texto de linha de comando editor. Então, existem várias opções. E os que são, provavelmente, vai ser relevante para você, temos Nano, Vim e Emacs. Então Nano é os novatos linha de comando editor de texto. Então Nano vamos em frente blah.c eu criei anteriormente. É apenas este arquivo C standard. E você vê um monte de coisas acontecendo na parte inferior do ecrã, e, aparentemente, blah.c contém este código C. Portanto, neste editor particular, o que ele está dizendo na bottom-- agora este símbolo de acento circunflexo, vemos isso ^ G, ^ X, ^ O. Assim que, em quase todos contexto que você vê, você pode ver que símbolo de acento circunflexo em outros lugares on-line, no Stack Overflow, algo parecido. Isso quase sempre se refere ao controle. Então, para sair eu quero fazer Controle X. Controle X, sai. E eu posso usar minha flecha teclas para se mover. Repare que eu não posso apontar e clicar prontamente. Você precisa usar sua flecha teclas para se mover. Pode haver uma definição para apontar e clicar. Mas vamos fazer algumas mudanças. Agora controle X para ir sair. Ele vai dizer salvar tampão modificado. Agora o prompt, y para sim, N para não. Controle C para cancelar. Eu só vou dizer que sim. Nome para gravar o arquivo. O padrão é o arquivo que já é. Pressione Enter. Está bem. Agora eu só editado o arquivo, salva-lo, e ele é alterado. Então Nano é o mais fácil editor de texto se acostumar. As alternativas são Vim e Emacs. Esses são os editores de texto de nível superior que tem uma curva de aprendizado muito íngreme. Assim, a minha preferência pessoal é Vim. E tem uma grande variedade de opções. E uma vez que você se acostumar para isso, você nunca quer ir para qualquer outro editor de texto, porque você só tem tantas coisas disponível para você nestes, mas é preciso realmente muito tempo para aprender. Então, talvez você apenas quer forçar si mesmo agora para se acostumar com isso, mas eu diria que vale a pena. Mas é difícil. E então Emacs. Eu sempre luta em Emacs porque Eu sei como fazer absolutamente nada. Aparentemente Emacs não é, por padrão instalado no aparelho. Nós provavelmente irá acrescentar que como uma instalação padrão. Depois que você aprender uma das Vim ou Emacs, há nenhuma razão convincente para sempre aprender o outro, mas é um estilo completamente diferente. OK para que a edição de arquivos de texto. AUDIÊNCIA: Se você estivesse preso no Vim agora, como fazer nós-- ROB BOWDEN: Há vários modos no Vim, e há toda tutoriais sobre Vim aprender. Então, se acontecer de você estar no modo de inserção na ordem para digitar o texto, que pode ser que introduza de várias maneiras, mas eu é como você entrar em modo de inserção. Em ou sair de qualquer especial modo que você está dentro, apenas escapar. E você só bater Escape para obter fora de todos os modos aninhados em seu. Apenas OK, agora eu estou de volta no modo normal. E assim, no modo normal, uma cólon. Você vê que aparecem na parte inferior. E depois q. Assim q vai parar se você tiver feito alterações, I-- que tenho feito mudanças? Fiz alterações aparentemente. Então, se você tiver feito alterações, ele vai dizer que você pode colocar um ponto de exclamação. Vou chamá-lo de um estrondo. Então você pode colocar uma proibição apenas sair sem fazer nada, ou wq cólon irá salvar e sair. Então, w, em geral, é escrever. Então escreva o arquivo. Eu posso escrever e sair. Ou você pode ter apenas Slam qx, q estrondo apenas para sair de lá, independentemente de todas as mudanças que você fez. Tudo bem, então agora vamos vai-- podemos criar arquivos. Vamos começar a remover os arquivos. E eu só vou jogar em um novo comando rápido, toque. Então tocar foo. Bar Touch. Toque Baz. Se eu ls, agora vemos que existem esses arquivos. Eles são completamente vazio. Então toque é apenas um fácil forma de um, [inaudível]. Dois, tecnicamente apenas para o estado isso, ele atualiza a data e hora. Assim, qualquer arquivo que você cria tem um timestamp associado a ele. Então Baz foi criado em 14 de setembro em 16:21. É agora 16:22, então se Eu toco baz novamente, ver que Baz foi mais recentemente modificada em 16:22. Mas por outro lado eu quase nunca olhar para a data e hora em arquivos. Então toque, aqui eu só estou usando lo para criar alguns arquivos rápidos. Tudo bem, então agora é a rm comando que nos preocupamos aqui. E podemos rm boo. Diga remover regularmente boo arquivo vazio. E nós podemos digitar y, e agora é remove. Baz rm. Remover arquivo vazio normal Baz e tipo n para não. Agora ele não é removido. Então, bar e baz ainda existem. Foo está desaparecido. GABRIEL: Continue falando. ROB BOWDEN: Ótimo. Portanto, a mensagem irritante aqui, remova empty-- regulares o que está fazendo lá embaixo? Remover arquivo vazio regular. Então, se nós não queremos ser incomodado por essa mensagem, podemos jogar neste -f bandeira, e por isso é força. E agora, se eu rm -f, ele não vai dizer que você deseja remover este arquivo. Ele só vai fazê-lo. E ls, eu não veja a barra mais lá. Agora que é um potencialmente comando perigoso. Ela tende a não muito ruim. Vamos voltar em um segundo como ele pode ficar muito perigosa. E vamos criar um diretório temporário. mkdir, outro comando. Então, é um comando mkdir que faz com que um diretório. E agora por ls vemos esta luz agradável azul destacou diretório temporário. Eu posso cd em Temp. E eu posso mkdir foo. cd em foo. bar mkdir. cd em bar. Assim, vemos que podemos facilmente chegar em algum assentamento bastante profunda. Agora como faço para remover um diretório? rmdir. Então, se eu apenas em linha reta tentar rm, como fizemos com um arquivo regular, bar rm vai dizer não pode remover a barra. É um diretório. Há um comando especial para remover diretórios, tipo de. Bar Então rmdir. Agora bar está desaparecido. OK, então rmdir eu praticamente nunca uso. A razão being-- agora vamos fazer uma barra de arquivo regular aqui. Boo Então rmdir. rmdir. Falha ao remover foo. Diretório não vazio. Então, você não pode usar remover dir em um diretório que tem coisas nele. Então, você tem algumas opções. Você pode ir para o diretório, remova tudo manualmente, e depois sair e rmdir diretório. Isso, obviamente, soa chato. E se existem milhares de arquivos de lá? Bem, você poderia rm *. Vamos falar sobre * em um segundo. Basicamente, significa todas as coisas. Mas melhor ainda, -r tão rm. Então rm -r-- em um monte de contextos, significa -r recursiva, que nós vamos falar sobre o que meios recursivos em algumas semanas. Mas, basicamente, significa travessia a totalidade deste diretório e remover tudo. Foo -r Então rm vai dizer descer para o diretório foo? Sim. Remover regulares vazio arquivo foo / bar? Sim. Remover diretório foo? Sim. Então agora foo e tudo dentro dele tenha sido removido. Agora que pode ficar particularmente irritante when-- vamos tocar uma, toque 2, toque em 3. Poderia ter um monte de arquivos. Se eu quisesse, eu poderia criar milhares de arquivos em aqui. E foo rm -r vai ser bastante irritante. Sim, sim, sim, sim, sim, sim. Com muito mais arquivos que você ver rapidamente quantas vezes Eu teria que digitar sim. Bem, acabamos de ver antes como podemos livrar-se da necessidade de digitar sim, -f. Então mkdir foo cd foo toque 1 2 3. OK, foo-rf tão rm vai cegamente remover foo inteiramente. Nenhum aviso. Sem nada. Foo está desaparecido. Então, eu tendem a usar esse comando o tempo todo. Dito isto, é uma comando muito perigoso, porque se eu fizer algo como isso, não irá pedir-lhe. Ele vai embora. E isso acontece com bastante freqüência, e até mesmo em nível superior cursos de CS. Às vezes, vamos ver algo em que alguém diz que eu acidentalmente nosso rm rf-ed minha casa diretório e todo o meu conjunto P está desaparecido. E é devastador, mas não há nenhuma lata de lixo. Não há nenhum que não há nada para que você possa recuperar. É apenas desaparecido. Pior ainda seria algo como rm -rf /. Então, nós apenas discutimos que diretório raiz. Ele mantém todas as arquivos em seu sistema. As coisas tendem a ficar muito confuso quando você remove coisas como ls, e cd, e todos aqueles. AUDIÊNCIA: Qual é a diferença entre rm, rf, e rm * ROB BOWDEN: Então rm * - ALLISON: Pergunta era o que é o diferença entre rm, rf, e rm *. ROB BOWDEN: Então rm *. Estrela em meios geral todos o conteúdo deste diretório. Tentando pensar em outra formas de mostrar estrela. Bem, na verdade estrelar geral significa corresponder a qualquer padrão. Então, se eu tenho um arquivo chamado dog1, dog2 tocar, tocar cat1, toque cat2. Então ls * 1 vai imprimir cat1 e dog1, porque essa estrela pode ser preenchido em com-- a pessoa precisa estar lá, mas a estrela pode ser gato ou cachorro. É um wild card. Essa é a palavra que eu estou procurando. Wild card. Ou eu poderia ls cachorro *, e Estou tem que ver dog1, dog2. Portanto, aqueles são listando os arquivos que corresponder ao padrão particular. Você pode usar ls desta forma. Ls * estrelas combina com qualquer coisa. Então, ele vai imprimir todos o conteúdo desse diretório uma vez que todos eles coincidem. Não vai imprimir nada em diretórios de nível superior. Se eu tenho um sub diretório, foo, e toque 1 2 3-- agora se rm * estrela, remover cat1, cat2, dog1, dog2. Não é possível remover foo. É um diretório. Assim estrela se expande para todo o arquivos no diretório. Então, tecnicamente rm * é como dizer cat1 rm, cat2, dog1, dog2, foo. Considerando rm -rf, tecnicamente estrela faria realizar o que queremos, mas rm -rf-- se eu sair dessa diretório, temp rm -rf, que vai entrar em temperatura e recursivamente remover tudo. Assim estrela é separado em que esse Entende por-- assim essa coisa que eu estou correndo, essa coisa que está me levando para comandos e, em seguida, executar e fazer eles, Eu chamo isso de minha concha. E assim esta concha é em si um programa. E se eu quisesse, eu poderia ser executado em / bin / bash. O shell é chamado bash. E agora notamos algo alterou ligeiramente, e isso é porque minhas configurações para o shell são um pouco diferentes. Mas agora eu estou tecnicamente em execução uma concha dentro do meu escudo original, e eu posso sair dessa casca, e agora Estou de volta ao meu shell nível superior. A finalidade de dizer que é-- a estrela. Então, a estrela é algo entendida por bash. Então rm -rf, bandeira rf é compreendido por apenas rm. Ele sabe que, quando você passar um -rf que você quer para remover de forma recursiva todos os arquivos sem avisar. A estrela é algo entendido por bash que quando você diz rm *, bash não vai dizer hey rm *, remova estrela. Bash vai dizer rm * remover cat1, cat2, dog1, dog2. Ele vai automaticamente para expandir todos os arquivos no diretório. E da mesma forma til é outra símbolo que o bash entende. Quando você diz cd ~, o bash expande que, para seu diretório home. Outras perguntas até agora? OK, então vamos começar a ir rápido. Conclusão Tab. Só para jogá-lo lá fora. Um monte de pessoas não perceber isso existe. Então, se eu digito cd dow, I quer ir para downloads. Eu não preciso digitar nloads. Eu só posso bater Tab. Assim, reconhece-se que A Dow é um prefixo que não corresponde a qualquer coisa mais neste diretório, por isso vai concluir que para você. Agora eu posso entrar. Eu também faço isso de forma recursiva. Foo Então mkdir. Vamos entrar em foo. bar mkdir. Então, voltando para a minha casa diretório, eu posso ver downloads. Agora bater guia de novo, vai automaticamente para preencher foo. É o único diretório. Bater guia de novo, automaticamente vai preencher bar. Então agora eu estou em (~ downloads / foo / bar). Portanto, este guia de conclusão, sempre que eu tenho que o horário de expediente, e eu estou de pé sobre ombro de alguém, e eles vão rm -D-O W-N-L-O-A-D-S, estou morrendo. Apenas guia, guia, guia, guia. Então, definitivamente guia utilizada. E da mesma forma-se e para baixo, um monte de gente só que aconteceu com nunca bateu cima e para baixo. Ele vai passar pelo anterior comandos, por isso, se você apenas correu alguma coisa, e você quer executá-lo novamente, apenas segure-se até chegar a ele. Está bem. Tão rápida, algumas outras coisas. Vamos voltar em Temp. Vamos criar alguns arquivos. Então, aqui, eu sou apenas vai listar algumas palavras. cão, gato, meow. Vamos fazer cão, peixe. Então, agora é um representante muito comandos úteis que você usar para pesquisar toda arquivos para um determinado texto, e tecnicamente você pode fazer realmente expressões complexas para que haja coincidência. Então, aqui, se eu grep, eo que eu quero procurar? Vamos dizer que eu estou procurando por gatos, e Quero procurar todos esses arquivos. Então, como é que eu faço todos esses arquivos? Star. Assim, em um arquivo, eu tenho gato. Eu provavelmente poderia ter chamou-lhe algo melhor, porque que parece números de linha ou algo assim. Mas no arquivo que eu tenho uma linha com gato. Em arquivo dois Eu tenho uma linha com o gato. Então agora eu posso olhar para dentro de um arquivo e ver sim, esse arquivo tinha gato. Arquivo aviso prévio de três não foi acompanhado porque o gato não está lá. Eu posso pesquisar por miado. Só arquivar dois tem miado. Portanto, este pode combinar, novamente, com -r, que como eu disse antes freqüentemente significa recursiva. E para que eu possa vir até aqui, grep -r para qualquer instância de-- vamos editar este apenas para jogar um gato lá dentro. Então grep -r para qualquer instância de gato ao longo deste diretório. E ele vai de forma recursiva pesquisar todos os subdiretórios. Assim, em baz, há gato. Em temp / 2, há gato. E em temp / 1 há gato. Então, isso é procurar dentro de arquivos. Agora você também pode usar um achado. E assim que encontrar é especificamente sobre à procura de arquivos com um determinado nome. Então, vamos fazer um pouco mais. Vamos para downloads. Toque dog1. Toque cat2. Toque cat_dog. Toque catcat. Então, eu quero encontrar todos arquivos com cachorro no nome. Assim que encontrar, e para o mais longo vez que nunca se lembrava como encontrar trabalhou, até que eu finalmente ler algo que fez isso de forma clara. Então, encontrar, automaticamente recursiva. Você não precisa passar por um -r. Então, encontrar pontos. Nós não falamos sobre ponto ainda. Considerando dot dot sempre significa um diretório para cima. Dot sempre significa o diretório atual. Assim eu poderia rm -r ponto no mesma maneira que eu posso rm -rf *. Em última análise, eles realizar a mesma coisa. rm -rf ponto vai remover em todo o diretório atual. OK, o que eu não quero fazer lá. Mas encontrar ponto. Assim, de forma recursiva, procure a corrente diretório, e agora tudo após este são um bando de sinalizadores que você usar para excluir coisas do retorno. Então, encontrar dot retorna tudo o que pode encontrar a partir do diretório atual. Esses são todos os arquivos recursivamente procurar. Vamos ver alguns desses em um segundo. Mas, caso você esteja se perguntando como eu faço que, de modo comando K, pelo menos no meu terminal no Mac limpa-lo. Controle L geralmente limpa lo para qualquer tipo de terminal. Você também pode digitar clara. E se você nunca chegar em um scenario-- estranho isso aconteceu comigo um par tempo-- onde as cores de seus prompts são toda desarrumada, ou você não são capazes de ver nada sendo digitado quando você está digitando, porque às vezes, como a cor de fundo é definida a mesma que a cor do primeiro plano e agora você não pode ver as fontes. Repor é algo que apenas repõe você para o fundo padrão preto, frente branco, ou o que quer você configurá-los para. Então, onde estávamos? Encontre ponto. Portanto, agora tudo passado presente ponto restringe os resultados para algo que corresponde o modelo dado. Então, aqui eu quero procurar tudo com o nome do gato. Eu não tenho nada. Por que é esse o caso? Bem, eu estou apenas procurando por algo com exatamente o nome do gato. Se eu quiser pesquisar algo que tem algum padrão, e cat-- as citações tecnicamente não são necessários, mas eu estou jogando-os lá. Então, agora ele encontra catcat porque essa é a única coisa que tem algum arbitrário padrão seguido pelo gato. Eu posso colocar gato *, e agora encontrar catcat, cat_dog, cat2, porque essas são todas as coisas com gato no início seguido por nada. Você pode combinar isso. Se você quiser procurar por todos os arquivos C que você tem, você pode fazer * .c. Temos blah.c aqui. Então, isso é um achado obras. Você pode pesquisar. Tem um monte de bandeiras para outras restrições. E um deles, digamos -d. Então obsoleta. Oh, não é isso que eu quero. Não -d. Tipo d. Então, encontrar dot - tipo d. Então, o que fez é que eu estou procurando para todos os arquivos no diretório atual com a-- d significa tipo de diretório directory--. Isso retorna todos os diretórios no diretório atual. E tipo F é tudo normal arquivos, todos os não diretórios. Então, isso é apenas uma exemplo de outras maneiras que você pode restringir a pesquisa a outra do que apenas o nome do ficheiro. Tem sido 30 minutos. Ainda vai. ALLISON: Eu vou brisa através. Ele vai ficar bem. ROB BOWDEN: Então algumas outras coisas. Agora bater, ponto de exclamação. Assim que geralmente means-- bem, vamos ver um exemplo. Então! F, o que é que vai fazer? Bem, parece ter repetido achado do tipo dot f. Que tal! G? Isso só grep cat -r *. Então atirar você pode usar para repetir um comando recentemente feito. Então, se eu digitar! Gre, que vai re-run os comandos que começaram com gre mais recentemente. E você pode ver tudo isso comandos com a história. Assim, a história. Estes são todos comandos eu correr hoje. E bem, não é literalmente restrito aos dias de hoje, mas eu só tenho usado este aparelho a partir de hoje. É sua totalidade do história de seu shell bash, exceto que corta em algum ponto. AUDIÊNCIA: O que acontece se você fizer histórico de comandos [inaudível] e um erro no resultado ainda será impresso as-- ROB BOWDEN: Sim, se houver um erro em um desses commands-- então vamos dizer, que é um comando de erro não encontrado. Ainda aparece na história. Tudo certo. Outras perguntas sobre qualquer coisa? Então, isso é estrondo. Agora, o comando realmente útil, o homem. Então, que lhe dá a manual para um determinado comando. Então, digamos que man ls, então isso está me mostrando sl. Ele lista o conteúdo do diretório. E é aí que eu vejo que há são essas várias bandeiras que existem. Assim, vemos que existe ls -l se tivéssemos que ler isso. ls -l me dá esta listagem completa do diretório com dono do arquivo, o tamanho do arquivo, o o timestamp modificado. Então ls -a é outro que você pode realmente usar um pouco freqüentemente. -al é minha bandeira mais comum este ls passadas. Assim, -a, perceber que há muito mais arquivos do que apenas ls. ls -a. O que há em comum com todos esses arquivos? Eles começam com um ponto. Portanto, esta é uma convenção em Linux que os arquivos que começam com um ponto estão ocultas. Então, isso significa apenas que quando nós apenas ls retas, ou nós estamos procurando este diretório usando o equivalente finder, ou do Windows Explorador equivalente, que nós não quero ver esses arquivos de pontos. Eles só poluem a visão das coisas. Então, eles estão escondidos a menos que você especificamente solicitá-los com algo como -a. Então eu posso cd em .local, e eu vejo que que é em si mesmo um diretório com um diretório compartilhado, e aplicações, e blá blá blá. Então, dot, arquivos eles estão apenas escondidos. OK, para que outros mais importantes. Eu tenho um par que eu posso pular. Vamos apenas verdadeira conversa rápida sobre as coisas arquivo de redirecionamento. Portanto, há uma complexa série inteira de coisas que você pode fazer com estes, mas só para vê-los, digamos, eco. Outro comando. Comando realmente idiota. Tudo que faz é imprimir o que eu diga a ele. Então eco Olá. Ele apenas repetiu Olá para o ecrã. Olá, mundo. Ecos Olá mundo. Assim, um comando ou um símbolo que o bash entende é maior do que este símbolo, e que é a saída para um símbolo de arquivo. Então, se eu de saída para esta foo, há agora um arquivo chamado foo, dentro de que é Olá mundo. Então, observe que quando eu ecoar Olá tubulação mundo em foo, não ecoam Olá mundo. Em vez disso, foi colocado em arquivo foo. E outro comando apenas jogá-lo para você, gata. Essa é uma maneira fácil de apenas completamente listar o conteúdo do arquivo de modo que eu não tenho para abrir um editor de texto para o visualizar. Assim, o conteúdo do arquivo foo estão Olá mundo. E eu poderia blah.c gato, os conteúdos são isso. Novamente, estes são comandos que, não fazer espero que você tê-los todos memorizado. A idéia é que você já viu-los. Talvez você esteja trabalhando em algo, e você está como eu estou cansado de abrir este arquivo. Eu gostaria de poder apenas olhar no conteúdo real rápido. Você pode fazer isso, então olhar para trás e dizer oh I lembre-se algo como o que existe, e é gato. Então o que está acontecendo em um arquivo. Ora, não há realmente nenhuma boa exemplo de leitura de um arquivo ainda. O que é algo que leva algo do padrão em? Qualquer simples comando Linux? Quando chegarmos a ele, em um casal semana todos os piece-- bem, esta semana você tem um pedaço onde você começar a tomar a entrada do usuário. E assim normalmente você digita que a entrada para o teclado. Em vez de digitar que entrada no teclado, você pode, em vez de tubos de um arquivo de modo que quando você faz Mario, ./mario, tubo a partir de qualquer arquivo dado, e que vai executar o programa de mario. Não esperando a entrada em o teclado, em vez disso, é só vai ler o linhas do arquivo foo. Assim, maior do que foo coloca em o arquivo foo, e menos de foo leva o material a partir do arquivo foo e usa como entrada para este programa. E só para vê-lo, nós também poderia ecoar foo bar baz, e em seguida, em vez de um maior do que, vamos fazer dois em foo. O que isso faz? Ele só acrescenta ao arquivo. Então, ao invés notar se eu echo blá em foo e foo gato, é só blá. Então, quando você saída para um arquivo que, substitui completamente o arquivo. Se você quiser apenas para acrescentar, double [? motoniveladora. ?] E por último, é de tubulação. Tubo se torna muito mais complicado, onde que leva a saída de um comando e alimenta-lo para o próximo comando. Então, uma coisa comum, história. Então, ugh, eu não quero olhar para isso. Mostra-me todos os comandos na minha história onde eu grep-ed para alguma coisa. Não, isso é confuso. Mostra-me todos os comandos que eu encontrar. Tudo encontrar comandos que eu já corri. Assim, a história. Agora saídas de história para o tela esta lista de comandos, mas eu não quero saída para a tela. Em vez disso, eu estou indo para canalizá-lo em grep. Então, vamos pesquisar por todas as instâncias do achado. Então, agora em vez de tomar grep a entrada, em vez de-- grep é capaz de lidar como input-- estamos usando grep um pouco diferente aqui. Então, em vez de digitar a lista de coisas que queria procurar e disse grep está tomando como entrada. Então, se eu apenas grep encontrar, ele espera que eu escreva coisas. Então gato Olá encontrar. Olá. Localizar. Observe cada vez que eu digite encontrar reconhece que eu digitei achado. Então, ao invés disso, vai busca de arquivos para encontrar. Assim, a história vai agora saída de uma lista de todos os comandos. Estamos colocando que a produção, e nós estamos alimentando-o ao grep, e por isso está cuspindo todas as instâncias de encontrar. A razão pela qual eu disse que estaria confundindo é se I-- ainda é confuso. Se eu grep para grep. Observe que é muito bonito sempre mostrando o comando eu só correu porque esse comando si tem grep dentro dele. OK, então qualquer dúvida sobre qualquer coisa? E eu vou transferi-lo mais neste momento. Esperemos que este é um bom visão geral de todos os comandos que você não precisa ter memorizado, mas estes fazem-se um sólido 95% do que eu fazer na linha de comando. Também tenha em mente que a linha de comando em si, bash é uma linguagem de programação, e assim, quando você começar a ele, você pode querer fazer as coisas realmente complexas. E por isso tem coisas como loops e ses, e de todos aqueles que você vai se acostumar com com suas linguagens de programação. Mas isso está além do escopo desta seção. OK, então não há dúvidas? ALLISON: Nenhum? GABRIEL: Você vai a-- ALLISON: Eu posso fazê-lo no meu, se quiser. Podemos ver o que acontece. ROB BOWDEN: Off para Allison. ALLISON: Woo. Você é um ato difícil de seguir, Rob. Você quer me mudar com você? Ou você tem, OK. Eu vou tentar e não bastante ser tão moroso lá. Vamos ver se essa vontade trabalhar do jeito que eu quero. Talvez? Haha! Sim. Então, eu estou indo só para ir muito rapidamente através de variáveis, loops, condicionais, e um pouco sobre o compilador. Se você tem perguntas em qualquer momento, por favor, me parar. Esses caras vão lembrar-me de repetir sua pergunta no caso de eu esquecer, mas não deve ser muito ruim. Então variáveis, sim. Nós não temos um de seus Peças risco aqui. Tenho certeza que a maioria de vocês, se você teve algum tipo de jogo que você criou com o Scratch, você tinha manter o controle de algo como pontuação, ou tempo, ou algo parecido. Portanto, aqueles laranja brilhante peças que vemos lá são apenas a forma do risco de variáveis, e você vai definitivamente estar utilizando variáveis ao longo de seus programas. Se você não for, eu não sou realmente Certifique-se que você está fazendo. Mas de qualquer forma, grande coisa, definição de variáveis. Com C cada variável tem ter um tipo declarado, então eu dei-lhe uma muito uma geral no topo. Então você vai ter o seu digitar e, em seguida, o que quer você decide ligar para a sua variável. Portanto, neste caso, o tipo em sua lista de variáveis. Temos três exemplos. Char de algum grau, de um A, que é o que Tenho certeza de que todos querem para chegar nesta classe. Você pode definir múltiplos variáveis ​​em uma linha contanto que eles são todos do mesmo tipo, que é o nosso segundo exemplo, há onde você tem três variáveis, x, y, e z. Eles são todos os carros alegóricos. E então você também pode, neste último exemplo, com pontuação int e número de equipes, você pode inicializa-la ali mesmo. Assim, no exemplo do meio em que só tem float de x, y, e z aqueles que não são inicializados ainda. Eles não têm nenhum valor. Ou eles têm valores de lixo. E se você tentar usá-los, o compilador irá gritar com você. Você tem que declarar e tanto inicializar suas variáveis. Assim, nesta última, estamos fazendo as duas coisas. Estamos declarando variáveis de pontuação e número de equipes, e estamos inicializando-los, dando lhes os seus valores iniciais de 7 e 4 respectivamente. Legal. Todo mundo bom? Impressionante. OK, então algumas convenções. Se vocês leram através do estilo de 50, estes são apenas coisas que gostaríamos de você implementar no seu estilo. Nomes tão significativo. Se você começar a chamar as coisas apenas x, y, e z, especialmente como você entrar em longas programas, você está provavelmente vai confundem-se e ser como o que é esta variável se referindo. Eu não tenho idéia o que isso significa. Então, se é pra segurar uma pontuação, chamá-lo de marcar. Se significou para manter alguma resposta ou resultar, dar-lhe um nome como esse. Loops, que vamos entrar no próximo slide, variáveis ​​de uma única letra são muito bem. ROB BOWDEN: I, j, k e são apenas convenções para loops que toda a gente espera que eles para ser chamado de i, j, k e. Você pode chamar eles-- vejo linha coluna ou linha de chamada, por vezes, por dois loops aninhados, e que é também uma espécie de padrão. Mas eu e j é completamente compreendido. ALLISON: Sim, eu e j estiver totalmente bem. Por razões de clareza, como em alguns dos seus conjuntos de P, pode fazer sentido ter mais descritivos coisas lá apenas manter o controle do mesmo. Mas eu acho que i, j, k e eu acho que a grande maioria de nós todo o uso. ROB BOWDEN: Com estes convenções, por isso o estilo é importante. É um dos quatro eixos em que você está classificado, e é tão fácil de ir um pouco mais seu P definido no final e certificar-se que não há erros estilísticos. Então certifique-se que você está tabulação corretamente. Certifique-se de suas variáveis ​​são nomeados. Deixe alguns comentários. É muito fácil obter esses pontos. Você não tem que pensar sobre qualquer coisa, a fim de obter os pontos. Você não tem que entender nada. É só tornando-se bonita. ALLISON: Na verdade, nós tem estilo 50, que vai dizer onde você está sujando se se você está atrapalhando em estilo e dizer-lhe exatamente o que você precisa corrigir e como você precisa para corrigi-lo. Também é apenas bom mencionar que é política curso que se você estiver no escritório horas e seu código é uma bagunça, podemos recusar a ajudar você até que parece mais agradável. Então comece a direita, manter um estilo consistente, você também está indo só para fazer sua vida muito mais fácil quando você está tentando passar por depuração. Se você está tentando descobrir onde você está perdendo uma chaveta e eles estão por todo o lugar, você é apenas fazer a sua própria vida mais difícil. Então, ser consistente com estilo. Eu prometo que vai facilitar a sua vida. Isso vai facilitar nossas vidas. Todo mundo vai ser muito mais feliz. E é isso que você quer. GABRIEL: Sua nota será maior. ALLISON: Sim, e sua nota. Se o seu TF É como se você, tende a ser favorável. Tudo bem, e depois é só o segundo ponto aqui. Initializations consistente. Então, como vimos, você pode declarar e inicializar as coisas. Múltiplas variáveis ​​na mesma linha. Uma coisa que gostaria que você não fazer é declarar algumas variáveis e não inicializar-los na mesma linha que você está inicializando outros. Portanto, no caso de que feita qualquer sentido, temos o exemplo aqui onde estamos declarando ints nas variáveis ​​de bairros moedas de dez centavos e moedas de um centavo, mas os quartos e as moedas de um centavo não têm valor inicial. Nós não inicializou-los, mas no meio há já inicializada moedas de dez centavos a 0. Assim, ou fazer trimestres, moedas, moedas de um centavo. Ou trimestres igual a 0. Dimes igual a 0. Tostões igual a 0, ou o que quer estes valores iniciais são. Grande coisa com estilo, ser consistente. Em caso de dúvida, ser consistente. Mas seguir o nosso guia de estilo também. Legal. Todos bom lá? AUDIÊNCIA: Onde está o guia de estilo? ALLISON: O guia de estilo é on-- qual é o site? GABRIEL: Eu acho que é manual.cs50.net/-- ALLISON: Estilo? GABRIEL: Estilo. Yep. ALLISON: Sim. Então, questionar, onde é o estilo 50. manual.cs50.net/style. Sim? AUDIÊNCIA: Se estamos definindo variáveis, é OK se colocarmos como [inaudível] como pontuação int e int objetivo. Então você diria que agora nós temos chegou a defini-los juntos? ALLISON: Então questão, deverão você tem o código redundante quando você está definindo variáveis ​​como int e pontuação na próxima linha int jogo? ROB BOWDEN: Há definitivamente casos em que o código redundante é ruim. Eu não consideraria que o código redundante. Eu quase nunca declarar múltipla variáveis ​​na mesma linha de cada vez. E se alguma coisa, é porque geralmente eu deixar algum tipo de comentário explicando o que a variável é para. Então, eu vou dizer pontuação int barra barra. Mantém o controle de tudo. Na barra total de barra. Por isso, é muito mais grosseiro dessa forma para colocá-los todos na mesma linha. Eu nunca colocá-los na mesma linha. ALLISON: Eu me sinto como se fosse preferência pessoal neste momento. AUDIÊNCIA: Será que vão para loops e outras coisas também? ROB BOWDEN: Como dentro? Como int i é igual a 0 vírgula comprimento é igual a alguma coisa? Que você não tem escolha. Com loops a inicialização part-- para que você possa ter visto apenas int i é igual a 0 ponto e vírgula i menos do que o que quer que ponto e vírgula i plus plus. Isso int i é igual a 0, tecnicamente você também pode fazer o que se viu antes com a sintaxe de vírgula. int i é igual a 0 vírgula j é igual a 3 vírgula k é igual a 5. Você não tem a opção de dividir que se em várias linhas, e isso é normal. Vê-lo há multa. ALLISON: Awesome. Bem, Segue conveniente em loops. Então, sim, aqui temos alguns exemplos de laços que vocês viram no Scratch. E, claro, todos esses pode apenas ser recriada em C. E eles basicamente permitem que você repetir alguns seção de código até que uma determinada condição for cumprida, o que nós vamos entrar à direita depois de falar sobre laços com condicionais. Portanto, temos três tipos principais. Por enquanto, e fazer ao mesmo tempo, que vamos todos passar por agora. Então, primeiro é para loops. Assim, por alguma condição, executar este bloco de código. Temos este pouco fria Diagrama aqui na parte inferior. Mas, basicamente, você tem em seu favor, que a primeira linha, você vai inicializar suas variáveis. Assim como falamos, eu é igual a 0 ou i é igual a 10. Tudo o que você precisa que variável a ser é vai ser inicializado lá, declarada e inicializada com algum valor. Então nós temos alguns condição que está acontecendo para ser verificando a nossa variável contra alguma coisa. Assim, no caso a caso típico em que talvez você quer que essa seção do código para executar cinco vezes. Então nós teríamos int i é igual a 0, e nós quer que seja quando eu for inferior a 5. Então, essa condição é apenas vai verificar que cada vez. Se essa condição avalia a verdade, é vai executar o código, que é exatamente o que este pequeno diagrama está mostrando. E assim ele executa-lo. Ele atualiza uma variável, que é o que nós vemos na última parte do nosso para inicialização de loop lá. Por isso, só vou continuar fazendo isso até que essa condição não for atendida, e, em seguida, ele irá sair o loop e continuar seguir em frente com o resto do seu programa. Todos bom lá? Legal. Então, aqui está um exemplo, muito semelhante a algo que eu acabei de falar sobre. Então, nós apenas deseja imprimir este é o CS50 10 vezes. Então você vê, temos aqui nosso para, em seguida, nós inicializar a variável i para ser igual a 0. Nossa condição é a verificação que é menor do que 10. Assim, avaliar a verdade quando nós primeiro iniciar, e em seguida, atualiza a nossa variável cada vez que ele realmente executa e imprime este é CS50. E terminará após 10 vezes. Legal. Assim, enquanto loops são o próximo. E como você vê aqui, só temos algum tempo a esta pergunta condition--? AUDIÊNCIA: Como posso saltar na verdade, apenas não um número, mas dois números [inaudível] i plus plus plus? ALLISON: Então a questão é como você pode atualizar sua variável por mais de um de cada vez. Então eu plus plus vontade actualização por um de cada vez. Se você quiser atualizá-lo por dois, você poderia fazer mais i é igual a 2. ROB BOWDEN: Você já viu mais iguais em palestra ainda? AUDIÊNCIA: [inaudível]. ALLISON: É efetivamente o mesma coisa que i é igual a i + 2. Então, ele vai levá-la e atualizá-lo por dois de cada vez. Além disso, é igual é apenas algo chamamos açúcar sintático. ROB BOWDEN: Sim, aqueles existem para praticamente todos os operadores aritméticos. Vezes para que eu igual a dobraria o número. j fractura é igual a 3 é a mesma como j é igual a j dividido por 3. ALLISON: ou menos igual a 2 seria diminuir i por dois de cada vez. ROB BOWDEN: Mesmo iguais mod. Você ainda não viu operadores bit a bit, mas acento circunflexo é igual e comercial é igual, todos os que existem. ALLISON: Então, um monte de vezes, especialmente com seu primeiro par de conjuntos P, você vai ser, provavelmente, incrementando por um, então eu plus plus, j plus plus são todas as coisas que você vai para ser tipicamente utilizando. Mas essa condição de atualização é totalmente sob seu controle. Você pode atualizá-lo por qualquer incrementos ou de qualquer maneira que você decidir. Talvez você ainda quer que seja um número aleatório, por vezes. Mas sim, há muitas coisas que você pode fazer com isso. Você não está restrito a i plus plus. ROB BOWDEN: Só para você sabe que ela existe, ela também existe uma outra forma, mais mais eu. Então, se você está sempre em busca on-line e acontecer para ver plus plus i, praticamente significa a mesma coisa. ALLISON: Cool. Boa? Impressionante. Assim, enquanto loops. Muito semelhante. Você tem alguma condição. A principal coisa a se notar aqui é em vez de ter três partes diferentes de configurar, nós temos um. Nós apenas temos alguma condição que está sendo verificado. E, do mesmo modo, enquanto essa condição é avaliada como verdadeira, seu código vai ser executado. E se é falso, terminará, movimento para a próxima parte de seu programa. Portanto, este é o tipo de como-- o que é um bom exemplo de busca por alguma condição normal? GABRIEL: Enquanto verdade. ALLISON: Você poderia fazer enquanto verdadeiro. Bem, 1 é igual a 1. ROB BOWDEN: Você pode fazer while-- apenas em vez de usar um loop for, você sempre pode codificar um loop em um loop while, então eu maior que 0 ou enquanto i menor que 10. ALLISON: Awesome. E então nós fazer enquanto loops, que é ótimo para validação do usuário, onde você deseja obter algo de seu usuário, ver se ele é válido, e, em seguida, continuar a partir daí. Então, uma das coisas que você deve saber é com um fazer enquanto é que ele está indo para executar, e em seguida, ele vai voltar a executar se esta condição for satisfeita. Então, provavelmente a melhor maneira de fazer isso é só para ver um exemplo aqui. Então, como eu mencionei, o usuário validação é realmente useful-- ou fazer whiles são realmente útil com a validação do usuário. Então, isso é só ir para re-solicitar algum usuário até que digite um número positivo, que pode ser útil para o seu conjunto P esta semana. E assim, neste caso, quando inicialmente executar este programa, ele vai imprimir digite um número positivo. Ele vai ficar alguns de entrada a partir do utilizador, e, em seguida, ele vai verificar que a entrada contra a condição que você definiu para ele. Portanto, neste caso ele vai verificar. Ele vai dizer, OK, é a nossa entrada negativa, ou é 0 ou negativo, o que seria inválido. Assim, pois, re-aviso. Pergunta? AUDIÊNCIA: É este o mesmo, em seguida, como um while se você acabou de copiar esse código e colocá-lo [inaudível] enquanto loop? ALLISON: Então pergunta era faria este ser o mesmo que apenas de um tempo loop se fôssemos apenas copiar o loop while acima. Portanto, neste caso, o loop while é indo para verificar a condição de primeira. Portanto, neste caso, se tentássemos escrever apenas como um loop while, diria enquanto entrada for menor do que um. Mas não temos uma entrada para ele. AUDIÊNCIA: Se você [inaudível] while incluindo este código, mas então você lidou o código acima do loop while também. Você só tinha este código [Inaudível] enquanto loop. ALLISON: Seria a mesma coisa, sim. Então, você poderia apenas write-- em vez de ter um sim fazer--. GABRIEL: Mas isso é mais elegante. ALLISON: Sim, isso é mais elegante. Você pode entrar em projeto e outros enfeites, mas sim, você pode fazer isso totalmente. Alguma outra pergunta? OK, legal. Então, nós conversamos muito sobre as condições com todos esses laços que temos, por isso estamos realmente ficando em condições em expressões booleanas. Novamente, você usá-los em C, assim apenas uma espécie de transição a partir de mais de interface gráfica na verdade, a codificação. Cool, tão grande, se. Basicamente só nos permite introduzir alguma lógica em nosso programa e verificação condições SYS. Portanto, neste caso, OK, n é maior que 0? Sim, é, para que possa executar este. É só verificar alguns condição que você tem definido, o que eu acho que todos nós estamos confortável com as condições de verificação. Legal. Então, se o resto é o seu outro, você pode dizer OK, se isso é verdade, fazer isso primeira coisa. Caso contrário, eu quero que você padrão e fazer outra coisa. Como, neste caso, você quer escolher um número positivo ou um número negativo. Você só tem duas opções. Você precisa dele para executar independentemente de que suas entradas do usuário. Então você pode dizer assim, é maior do que 0? Legal. Imprimir um número positivo. Se não for, imprima uma negativa. Todo mundo bom? E então uma coisa a reconhecer é que se o se a condição for cumprida, o outro nunca vai também executar. Apenas uma delas irá executar de cada vez. Portanto, é um trade off. Você não consegue ter tanto. Você quer ter a primeira condição. Você quer ter a se ou a outra pessoa, não ambos. Que, então, pode tornar as coisas ainda mais complicada, porque você pode fazer se, senão ele, e depois o resto. Portanto, neste caso, nós temos três condições. E, novamente, apenas um deles é vai acabar sendo executado. Então você pode estar se perguntando bem, o que se tem algo que pode satisfazer dois destes. Talvez o que você está introduzindo atende tanto a condição para se eo else if. A única coisa que vai funcionar ALLISON: Assim que encontra algo que cumpre a condição para que avalia a verdade, é o que ele vai correr e nada mais. Então, se você teve é ​​esse número entre 0 e 5 para o primeiro, ou é esse número entre 3 e 5 para o outro se parte, e você introduzir o number-- Eu disse 0 e 5 e- 4. Ele vai bater o primeiro. Ele vai dizer OK, este é número entre 0 e 5. Executar e sair. Isso nunca vai bater essa segunda opção. Legal? Impressionante. OK, também temos de switch declarações se você quiser ficar ainda more-- ou muito, interruptor é o próximo. Estou me adiantando aqui. Mais uma vez, se múltiplos blocos onde, como eu acabei de dizer é assim que você encontrar uma condição que conheceu e se uma pessoa se mais, ele deixa. Se você precisa verificar várias coisas, você é vai querer usar isso porque ele irá verificar todos os tempo aqui. Portanto, este será executado através de e se que é maior do que ou igual a 90, que vai imprimir isso. E ele será executado através de e verificar cada uma delas. AUDIÊNCIA: Então isso seria mais bugs do que [inaudível]. Será que isso é como o [inaudível]? ALLISON: A questão é que isso seria buggy ou que isso faz o que quiser. Ela realmente depende do que você quer do seu programa. AUDIÊNCIA: Quero dizer, como se você colocar 90 em. ALLISON: Se você colocar 90-- AUDIÊNCIA: [inaudível]. GABRIEL: Você vai conseguir duas coisas. ALLISON: Você vai conseguir duas coisas. Sim, dois. ROB BOWDEN: Dois? ALLISON: Não. ROB BOWDEN: Four. Se você colocar 90, ele vai dizer que você tenho um A, você tem um B, você tem um C, você tem um D. AUDIÊNCIA: [inaudível]. ALLISON: Certo. Então eu depende do que você quero de você programa. Às vezes você precisa verificar várias coisas. Você vai ter muito mais profunda sobre o que bom design é como você ir para a frente. A coisa importante a perceber é que esta irá verificar todas as quatro condições aqui. Considerando que, se este fosse um caso mais se outra pessoa se mais, ele teria atingido esse primeiro caso, que iria imprimir você tem um A e ser feito. ROB BOWDEN: Mesmo se nós decidiu mudar isso para se e maior do que ou igual a 90, se e maior ou igual a 80, e menos do que ou igual a 89, se n maior do que ou igual a 70, e n menos do que ou igual a 79, de modo que será correta. Isso vai fazer o que queremos, mas ele ainda verifica cada ele. Assim, enquanto no primeiro cenário, se nós introduzir 90 com apenas se else if else if, e entramos 90, então ele vai corrigir. Ele irá verificar a primeira um, de impressão que você tem um A, ignorar tudo, porque já encontrei um que funciona. Todos os casos são mutuamente exclusivos com base em se else if else if. Então, ele vai executar o primeiro caso, então ele é feito. Ele vai até o fim. Considerando que, se mudarmos este é o que eu era dizendo com menos do que ou igual a 89. Ele vai verificar o primeiro. Ele vai imprimir. Ele vai verificar a segunda. Não vai imprimir. Confira o terceiro. Não vai imprimir. Confira o quarto. Agora vai imprimir. Então, nesse caso, o outro se versão, uma vez que estes casos são mutuamente exclusivos, é melhor uso se else if else if, porque isso vai ter menos verificações das condições que esta versão. ALLISON: Awesome. Assim, uma outra coisa que pudermos fazer é instruções switch. Basicamente um switch leva em alguns variável, neste caso é n, e determina que caso a executar. Portanto, este é também um onde seus casos deve ser uma espécie de mutuamente excludentes. Portanto, neste caso, se nós temos um, que é vai coincidir com o que isso variable-- seja qual for o valor de n é um desses casos, de modo 1, 2, ou 3, e imprimir a linha correspondente. E então, se você observar aqui, nós também temos um padrão, que você pode pensar de como o seu mais. Então, se você pegar qualquer outro número além de 1, 2, e 3, neste caso ele só vai imprimir inválido. Decidir quando usar ifs contra se elses contra interruptores vai ser algo que vocês vão Veja o design inteligente como você começar a escrever programas mais complicados, e Não há regras rígidas e rápidas de quando usá-los. Ela realmente depende de seu contexto. ROB BOWDEN: E apenas jogá-lo lá fora uma vez que é a secção mais confortável. Switches, eles tendem a ser-- então você está limitado no número de maneiras que você pode usá-los, porque ifs, a condição pode ser bastante qualquer coisa que você quiser. Com muda os casos têm de ser números, ou tecnicamente eles podem ser caracteres, mas caracteres, como veremos, são números apenas. Então, eles têm de ser números, mas interruptores são realmente mais eficiente do que se else if else if, porque mesmo tomando o exemplo antes-- bem, o exemplo de grau parece bom. Bem, digamos que aqui, nós em vez fazer isso como uma se else if else if cenário. Assim, se n é igual é igual a 1, imprimir você escolheu um número baixo. Se outra pessoa se n é igual a igual a 2, você escolheu um número médio. Else if iguais é igual a 3, de alta. Else inválido. Então, vamos dizer que foi o nosso cenário. Então, digamos que entramos 4, por isso, esperamos inválido. A maneira que se mais se outra pessoa Se abordagem vai funcionar é verifica a primeira condição. Não está satisfeito. Por isso, verifique a segunda condição. Não está satisfeito. Confira a terceira condição. Não satisfeito. Então vamos para a outra pessoa e imprimir inválido. A forma como as obras de switch é ele compila para baixo em que vamos para chamar uma mesa de salto. A idéia principal é que quando você entra 4, ele pode ir imediatamente para o padrão. Ele não precisa verificar am I caso 1? Nope não é isso. Caso 2? Não. Caso 3? Não. Padrão. OK, este deve ser o lugar onde eu quer, e em seguida, executar isso. Não, ele salta imediatamente para o padrão. Ou eu entro 2, é imediatamente indo para ir para o 2 sem a necessidade de passar por um caso. Assim, desta forma, realisticamente hoje em dia isso é Não muito de um ganho de eficiência. Normalmente, os computadores são bastante rápido, e isso não é assim tão grande. Mas é o caso de que interruptores são mais rápidos. Se você está realmente tentando para otimizar, usar um switch. ALLISON: Cool. E depois temos operador ternário. Então eu sei que eu mencionei anteriormente a palavra açúcar sintático. Então é só coisas que fazem seu código muito mais conciso. Portanto, este é um desses casos. Então operador ternário é ponto de interrogação cólon, como vemos na seqüência de linha s é igual a n maior do que 100 ponto de interrogação baixo alto cólon. Então, basicamente, como isso funciona é que é a n maior do que 100 é uma condição. Então eu acho que pode fazer sentido. É como fazer uma pergunta. É dizer oh, é n superior a 100. Quem sabe? E se for avaliado como verdade, ele vai dar-lhe a primeira coisa que é listados lá, que é alta. Caso contrário, ele vai lhe dar baixa. Portanto, este é apenas um realmente simples e maneira eficiente de fazer como uma pessoa se. Isso é tudo o que é isso. E se fôssemos escrever este como se outra pessoa condicional, seria se n for maior de 100, o retorno alto. Caso contrário, retornar baixo. Este é apenas um muito mais forma concisa de escrevê-lo. ROB BOWDEN: Então esse exemplo específico é sempre que você está fazendo algo assim, este é o padrão onde eu uso ternário com muita freqüência. Então, nós não falamos sobre escopo ainda mas eu odeio ver ponto e vírgula string s. Se n superior a 100, s é igual a alta. Else, s é igual a baixo. Assim que o padrão, essas cinco linhas de código, literalmente, 100% do tempo pode ser transferido para o estava lá em cima com um ternário. Assim, o ternário, uma linha de código. O caso mais, cinco. Isso é um exemplo que eu apontar a cada vez. Isso seria ótimo lugar para um operador ternário. É tão limpo. Mas as pessoas tendem a não usá-lo. ALLISON: Leve embora Gabe. GABRIEL: Então agora vocês todos aprendido em aula esta semana que tudo numa computador é binário, certo? Assim como as lâmpadas aqui. Você pode ser ligado e desligado. E por tudo, quero dizer literalmente tudo. Alguns números e caracteres e strings, e até mesmo o código que você escreve quando ele é compilado para máquina código e coisas assim, por isso, tudo se resume a 0 e 1 ". E assim, quando estamos lidando com números inteiros, os quais é algo que é tecnicamente muito simples, que deve ser capaz de fazer coisas como adicioná-los, o que é provavelmente uma das coisas mais simples você pode fazer para dois inteiros, certo? Assim, a adição ea subtração funciona como ele funciona em notação decimal, exceto aqui é binário, certo? Por isso, é na base dois. Então adicione 1 mais 1. Isso dá a 0, e 1 transporta mais. E apenas continuar fazendo isso, então agora vem a pergunta mais interessante. Nós sabemos como representar todos números inteiros positivos, em que o computador mas vamos fazer este exercício. Finja que vocês estão todos em 1960 ou algo tentando criar um computador, e você tem que vir acima de uma maneira de armazenar menos 1, por exemplo, ou qualquer menos inteiro para esse assunto. Como você faria isso? Qualquer idéias? Basta jogar qualquer coisa em mim. Sim? AUDIÊNCIA: [inaudível] designar uma especial se o seu [inaudível]. GABRIEL: Você pode designar uma pouco especial, que irá ser 0 ou 1. Vamos dizer que um se é positivo e 0 se for negativo. E, em seguida, o resto do bit é apenas para armazenar o número. Legal. Então, isso é uma idéia muito boa. Temos, eu não sei, 200. E se o primeiro bit é ligado, então é mais 200. Se ele está desligado, é de menos de 200. Legal. Existe apenas um pequeno com este problema, que é, se tentarmos resumir as coisas. Então, imagine que temos 11111 aqui, e estamos somando isso com 00100 o que quer. Se os dois forem positivos, isso é bom. Mas, então, se um dos eles é negativo, como vamos dizer que este pouco aqui é aquele que é responsável for-- eu vou fazer uma separate-- assim que este significa que este número aqui é positivo. Isto significa que uma esta número aqui é negativo, certo? Mas, então, quando você está indo para somá-los, você precisa de uma instrução if dizendo oh se isso é 0, então meu soma será algo diferente, certo? Portanto, há um pouco mais inteligente maneira de fazer que, o que é chamado de complemento de dois. Então, basicamente o que nós fazer é definirmos menos 1 ser a coisa que se somarmos a 1 nos dá 0. Deixe-me repetir isso. Então, vamos dizer que isso aqui é um. Qual é a coisa que naturalmente em inteiros positivos adicionado ao que nos dá 0? E se a gente tentar adicioná-lo a este número? Nós estamos indo para have-- OK, então vamos adicionar. Nós vamos ter 1 mais 1 é 0, e em seguida, ele carrega. E então nós estamos indo para obter 0 novamente. Estou ficando confuso. E você está indo para obter 0 e 0 e 0 e 0 e 0 e 0. Lotes de 0 do. No último, nós não estamos vai ser capaz de levá-lo mais, porque vamos dizer que estamos lidando apenas com um byte, então apenas 8 bits. Então, o que o computador faz por padrão é apenas se esquece de que [inaudível], Ok? Então é isso que é chamado complemento de dois. Nós simplesmente definir menos 1 para ser o coisa aqui que se você acrescentar que para um lhe daria 0. E isso é muito legal porque nós realmente não precisam tarde para implementar um tipo diferente de soma dependendo se é um negativo ou um número positivo. Será que isso faz sentido? Então, uma coisa que nós fazemos aqui, a fim de converter entre um positivo e um negativo inteiro é então jogarmos tudo, e, então, adicione 1 a esse número. Se você tentar fazer isso sozinho sobre um pedaço de papel, você vai ver que faz sentido. Mas se eu tomar esse número aqui, este é cinco. Então, se eu virar tudo aqui, portanto, 1, 1, 1, 1, 1. Virar, flip, flip. E então eu adiciono um a ele. Eu vou ter exatamente menos 5. Ok? Este tipo de faz sentido, porque se tentar resumir isso com o número de que tínhamos antes, o que foi-- vamos virar isso de novo. Era 101 e muita 0 do. Se você tentar adicioná-los dois números juntos, você vai ter exatamente 0. Está bem. Alguma pergunta? AUDIÊNCIA: [inaudível] GABRIEL: O que você quer dizer? AUDIÊNCIA: Negativo para positivo [inaudível]. GABRIEL: Não, você virar e você adicionar um sempre. Sim. OK, então personagens também codificado binários. Temos a tabela ASCII, como você também viu na aula, certo? Então, é basicamente um mapeamento das coisas. E aqui eu não posso enfatizar o suficiente que, para um computador, e um 65 são literalmente a mesma coisa. Então, se eu escrever algo como carvão c é igual a um, eu poderia ao mesmo tempo basta escrever 65 aqui, e seria exatamente o mesmo, OK? Não há diferença alguma. Nós geralmente tendem a colocar personagens em variáveis ​​do tipo. Char, não porque eles são essencialmente feito para isso, mas porque da convenção humana. Mas você pode apenas lidar com números inteiros em vez de variáveis ​​do tipo char, e você vai ficar bem. A única diferença real entre um char c e um i int é um inteiro que tem quatro bytes de mais sistemas, enquanto um char tem um byte. Eles são, essencialmente, o mesma coisa em termos de dados. Então, o que vai imprimir aqui? Aqui nós estamos imprimindo um dígito usando printf com mais 1, e apenas como números inteiros, caracteres pode ser resumida, de forma caracteres também podem ser somados. Portanto, este é exatamente 65. Portanto, não vai ser 66, e aqui temos 65 mais um pouco menos grande A, que será, eu realmente não sei. Mas vai ser exatamente a diferença entre as letras maiúsculas e as letras mais pequenas e, por isso nós estamos indo para obter um pequeno, certo? Sim. Então, isso vai imprimir uma personagem que é exatamente este. Boa? Alguma pergunta? Aqui nós temos um monte de diferente tipos de variáveis ​​numéricas. Nós já falamos sobre int. Float é apenas uma maneira a-- isto é realmente engraçado, porque quando eu aprendi programar para trás no dia com Python, o primeiro programa que eu já tentei escrever, vi que havia uma Tipo de chamada e um tipo chamado float. E a bóia foi para todos os números reais. Então eu perguntei por que Eu nunca usar um int, então? Porque se eu posso usar tudo números reais com uma bóia, Gostaria apenas de deixar de usar ints, certo? Porque os números reais são bem como mais genérico. Acontece que este é não é o caso em computadores porque eles são essencialmente coisas diferentes. Então, inteiros e floats, o operações que você faz para eles são essencialmente diferentes, porque da maneira que eles são armazenados, OK? Nós vamos falar um pouco pouco mais sobre isso em um segundo. Assim dupla é apenas uma maior flutuação. Normalmente, na maioria dos sistemas, uma bóia é de quatro bytes, como um int. E um casal é de oito bytes. Um longo tempo é, na verdade, apenas um símbolo que você adiciona a um tipo como int. Você diz long long int como este. Longo tempo int x para torná-lo mais tempo. Assim, na maioria dos sistemas, que dará oito bytes em vez dos habituais quatro. E você pode realmente deixar cair a no, por isso pode apenas dizer longo, longo, e que funciona também, OK? Você também pode fazer outras coisas como int sem sinal, ou ainda apenas não assinado também funcionaria. E que faria x ser uma variável como tudo é positivo, então você não pode realmente ter efeitos negativos números na forma que vimos até aqui. Então, seguindo maravilhoso ponto e precisão flutuante. Essa é uma das razões pelas quais você quer usar ints em vez de carros alegóricos, porque ints são 100% precisas, certo? É exatamente esse número. Para pontos flutuantes, se você dizem resposta é igual a 1 sobre 10-- Acontece que eu tenho neste exato aqui programa, float.c. Que imprime até 20 casas decimais. 1 dividido por 10, e que geralmente é de 0,1, certo? Mas aqui se fizermos flutuar e depois executá-lo, vemos que não é exatamente 0,1. É algo 0,149. E por que isso? Porque você não pode realmente representar cada único número real possível na memória porque existem uncountably muitos deles. Então, nós estamos tecnicamente só é capaz de representam uma quantidade finita deles com uma quantidade finita de dados. Mas é realmente interessante. Agora isso levanta a questão de como você faria ir sobre a representação esta com pedaços, certo? Então, como carros alegóricos são armazenados? Com inteiros foi fácil. Mas, com carros alegóricos que você quer para maximizar a gama, e você quer ser capaz de representar números enormes e muito pequenos números como 0.000001, ao mesmo tempo. Então, novamente, mesmo jogo. Alguém tem alguma idéia de como poderíamos ir sobre a representação flutuador na memória? Basta jogar qualquer coisa. Sim, por favor. AUDIÊNCIA: [inaudível] como se fosse dois inteiros e um sendo o [inaudível] e um ser tudo depois do ponto decimal. GABRIEL: OK, legal. Então dois inteiros diferentes. Você pode ter 12,45, de modo que é de 12 e 45. Nice. O que ere você vai dizer? A mesma coisa? Sim? AUDIÊNCIA: [inaudível] notação onde você separar a base. GABRIEL: A notação científica, sim que é geralmente o que acontece. Então é isso que é chamado de mantissa. Isso é o que é realmente o número, e, em seguida, o expoente é apenas onde a vírgula é, certo? Então isso vai ser algo da forma 1, 2, 3, 4, 5 vezes 10 para o 4 menos. Eu só percebi isso-- sim, exatamente. E então este 10 ao menos 4 é vai definir onde a vírgula é, OK? No Brasil, usamos vírgula. Aqui vocês usar um ponto. Assim, um ponto. E isso é legal, porque então você pode concentrar lotes de seus bits sobre esse cara aqui, na mantissa, e então isso é vai ser a sua precisão real. E você pode fazer isso em decimal ou com base no sistema binário. Existem diferentes maneiras de implementar isso. Perguntas? Sim? AUDIÊNCIA: Quantos lugares após o decimal [inaudível]? GABRIEL: Essa é uma questão complicada, porque nunca é realmente 100% preciso, porque como você vê aqui, para alguns números é 100% preciso. Eu acredito que se nós colocamos 0,5 aqui, que vai ser 100% preciso. Vai ser 0,500000. Então, nesse caso, ele é perfeito. Mas em outros casos, é muito menos perfeito. Na minha experiência, como até quatro, cinco casas decimais é bastante preciso. Se você usar um casal, que vai ser muito mais preciso do que isso, OK? ROB BOWDEN: Então, só para jogar mais algum contexto em carros alegóricos, Eu nunca me lembro 100% como o especificação de carros alegóricos realmente funciona, mas eu faço você lembre-se sempre que flutua começa a ficar confuso. Assim, a idéia é que quando você começa realmente, números realmente grandes ou realmente, realmente pequenos números, começamos ficando cada vez pior na diferenciação entre dois carros alegóricos próximos. Então, como eu gosto de pensar é com ponto flutuante imprecisão, existem dois flutuadores que se eu tentar especificá-los em C, apesar do facto eles são números diferentes, eles vão ser interpretado como o mesmo número, porque não podemos armazená-los de forma diferente. Precisamos usar os mesmos bits. E assim, quando nós começamos a realmente, realmente grande número, falando como 10 ao 300 ou alguma coisa, é nesse ponto que de 10 a 300 ou a 5 vezes 10 elevado a 300 não podem ser diferenciados a partir de 7 vezes 10 elevado a 300. Então essa é uma diferença muito grande entre os dois números. Mas então, quando você começa para baixo para as coisas normais de alcance, você tende a ser bastante bom em diferenciação. E então quando você começar realmente pequeno, você também está ficando muito ruim novamente. Assim como um monte de 0.0000, ele fica muito ruim. GABRIEL: Sim, assim que uma nota rápida. Nunca faça isso. Nunca tente comparar flutua usando iguais iguais, porque, mesmo se eles são quase a mesmo, quase o mesmo não é o mesmo. Então, o que você costuma fazer é você subtrai eles, tomar o valor absoluto do que, e ver se isso é menor do que 0,0001, ou algo assim, OK? E legal. Eu conheço um monte de pessoas têm alguma experiência em Java, especialmente aqueles que fizeram AP ciência da computação, né? E Java é uma linguagem de que na sua maior parte com base em C, ele tem um casal muito grandes diferenças. Mas para loops e ifs, e coisas do tipo que, eles são todos a mesma sintaxe. Eu tenho alguns programas aqui para mostrar isso. Assim, por exemplo, um Olá mundo simples. Este é Olá mundo em C, o que você caras são definitivamente familiarizado com, e isso e este é em Java. Assim, em Java, temos esta classe pública, Olá mundo, e public static void args principal, e cordas. Os argumentos de cordas vão a aparecer em C muito em breve. Mas não vamos ir lá ainda. Agora temos vazio aqui, o que significa que o principal não é tomar quaisquer argumentos. E então nós temos System.out.println, e isso é o espécie de equivalente para printf. Aqui nós realmente não precisa a barra invertida n porque impressão ln faz isso para você. Ele acrescenta a barra invertida n no final da linha. Mas se você entrar em algo como um para você pode ver que eles estão praticamente a mesma coisa. Assim inicialização, eo condição ea atualização é-- eu perdi um espaço aqui-- eles são praticamente a mesma coisa, exceto Java tem como mais algumas coisas de alto nível. Aqui podemos fazer mais eu e Java automaticamente fazer isso eu aqui, que é um inteiro, em uma seqüência, e, em seguida, acrescentar o duas cordas juntas. Aqui em C que precisamos fazer o &% d. A linha aqui, o de parece exatamente o mesmo. E se olharmos para se, os ifs também parecem exatamente o mesmo, certo? Assim, os verdadeiros grandes diferenças são nas coisas que você vê aqui. Public static, nula e então classe pública se. Assim Java tem o que é chamado de uma máquina virtual. E isso é muito fortemente com base no que é chamado de programação orientada a objeto, que é muito, muito comum paradigma para a programação de hoje em dia. E essa coisa de classe é o que você vê, algo de orientação a objetos, se você criar uma classe e então você pode derivar de objetos dessa classe. Nós não vamos falar muito muito sobre isso na CS50, mas isso é definitivamente algo realmente legal, especialmente se você quer ir para desenvolvimento web mais sofisticados no fim do curso, como apresentar o seu projeto final e algumas estruturas agradáveis ​​e outras coisas. Então, basicamente, a idéia é que você não quero re-implementar algo, assim você cria algo que é muito genérico, como a forma, e, em seguida, você cria diferentes formas a partir dele, e, em seguida, a partir de cada um dos essas formas, você cria algumas formas mais específicas em cada três dimensões ou algo parecido. E eles têm essa hierarquia que herdar os outros, de modo todas as funções e todas as variáveis ​​que o grande formato tem aqui, todos estes vão ter, e todos estes são vai ter, e assim por diante e assim por diante. Então essa é a idéia básica. C não tem isso, mas C ++ não tem esse tipo de recurso. E Java é fortemente influenciada por orientação a objetos, é por isso que você vê classe aqui o tempo todo. E a outra coisa é esta máquina virtual Java. Então isso, eu acho, é uma idéia muito inteligente. Então, o que as pessoas que java inventou fez é eles não querem compilar seu código duas vezes se tivessem de executá-lo em um ambiente Windows, ou um Mac, ou Linux, então o que eles fazem é que literalmente correr algo como o aparelho, mas você realmente não vejo isso acontecendo. Então eles executar uma máquina virtual dentro do seu computador, o que é basicamente como um mini-sistema operacional. E essa operação O propósito de sistema na vida é apenas para executar o que é chamado de código de byte. Então, ao invés de em C, a forma como o faria compilar este é tornar se, em seguida, execute ./if. Esqueci a barra invertida no. Em Java, você faria primeiro Java C para compilá-lo, if.c. Não é de C. dot java. E então você tem que correr não ./. Você começa este novo arquivo if.class, mas você não pode realmente executar if.class agora apenas como fizemos antes. Este não é um executável. Você tem que correr. Você tem que alimentá-lo em um programa chamado Java, e que o programa é a máquina virtual, e depois você faz if.class, ou se. Sim. E então ele funciona. OK, então este é o tipo de máquina virtual acontecendo. C não tem isso, então se eu fosse colocar este programa em uma máquina Windows, que não iria funcionar em C. Em Java que faz. Perguntas? Legal. Isto é, se a seção super para hoje.